From 952ff5472580eab26300274570aa605ffab37a38 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sun, 22 Feb 2015 23:20:46 +0000 Subject: [PATCH] 0.2.0 --- README.md | 17 +++++++++++++++++ bower.json | 2 +- lib/milo.js | 2 +- milo.bundle.js | 4 ++-- milo.bundle.map | 2 +- package.json | 4 ++-- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3349d8a..9d68013 100644 --- a/README.md +++ b/README.md @@ -344,7 +344,24 @@ http://opensource.org/licenses/BSD-2-Clause Changes log ----------- +###0.2.0 + +- `Messenger` (and related classes), `Model`, `Connector`, `minder`, `util.check` and `util.logger` extracted to [milo-core](https://github.com/milojs/milo-core) that can be used in node.js. They are still bundled with `milo` so `milo-core` doesn't have to be required separately. +- `Model` properties allow '-' symbol in them +- `util.request.file` support for upload progress +- `MLDialog` support for custom initialization +- `MLDate` support for min/max +- `Drag` facet support for additional data types supplied to drag operation +- `util.promise` removed, either native Promise or 3rd party library can be used +- `util.request` returns native promises (if 3rd party library is used, it should define global `window.Promise` with the same API as native Promise) +- `Messenger.prototype.onceSync` method added +- `milo.createComponentClass` added to simplify creation of component classes +- `util.jsonParse` deprecated, _.jsonParse should be used instead +- `util.error` deprecated + + ###0.1.10### + - `Messenger` performance improvement - `MLSuperCombo` support for remote list of options - `TransactionHistory` can emit messages diff --git a/bower.json b/bower.json index 467ed32..2b7b6a9 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "milo", - "version": "0.1.10", + "version": "0.2.0", "homepage": "https://github.com/milojs/milo", "authors": [ "MOL Technical " diff --git a/lib/milo.js b/lib/milo.js index 7115ff7..107a342 100644 --- a/lib/milo.js +++ b/lib/milo.js @@ -63,7 +63,7 @@ _.extend(milo, { Component: require('./components/c_class'), Command: require('./command'), registry: require('./registry'), - milo_version: '0.1.10', + milo_version: '0.2.0', createComponentClass: require('./util/create_component_class'), destroy: destroy }); diff --git a/milo.bundle.js b/milo.bundle.js index 80ff4fc..cbe43dc 100644 --- a/milo.bundle.js +++ b/milo.bundle.js @@ -9190,7 +9190,7 @@ _.extend(milo, { Component: require('./components/c_class'), Command: require('./command'), registry: require('./registry'), - milo_version: '0.1.10', + milo_version: '0.2.0', createComponentClass: require('./util/create_component_class'), destroy: destroy }); @@ -18967,5 +18967,5 @@ function makeFindMethod(eachMethod, findWhat) { } },{}]},{},[66]) -//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYWJzdHJhY3QvZmFjZXQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9hYnN0cmFjdC9yZWdpc3RyeS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2JpbmQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvYV9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2xvYWQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2JpbmRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tbWFuZC9hY3Rpb25zX2hpc3RvcnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbW1hbmQvY21kX3JlZ2lzdHJ5LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19pbmZvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY191dGlscy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19hcGkvZGVfZGF0YS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9tc2dfYXBpL2Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19zcmMvZnJhbWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvc2NvcGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvQnV0dG9uLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9EYXRlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvR3JvdXAuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0ltYWdlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0TGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9MaXN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0xpc3RJdGVtLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvU2VsZWN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvVGV4dC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UZXh0YXJlYS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UaW1lLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1dyYXBwZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb25maWcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2xvYWRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvbWlsby5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RlX2NvbnN0cnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RvbV9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL3dpbmRvdy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXNlX2NvbXBvbmVudHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3VzZV9mYWNldHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY29tcG9uZW50X25hbWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY291bnQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kb20uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZG9tX2xpc3RlbmVycy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kb21yZWFkeS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kcmFnZHJvcC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9lcnJvci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9mcmFnbWVudC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9qc29uX3BhcnNlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3JlcXVlc3QuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvc2VsZWN0aW9uL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3N0b3JhZ2UvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvc3RvcmFnZS9tb2RlbC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9zdG9yYWdlL21zZ19zcmMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3dlYnNvY2tldC9tc2dfYXBpLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3dlYnNvY2tldC9tc2dfc3JjLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9iYXNlMzIvbGliL2Jhc2UzMi5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1idWlsdGlucy9idWlsdGluL2ZzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL2Fic3RyYWN0L21peGluLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL2NsYXNzZXMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvY29uZmlnLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbV9hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL21fYXBpX3J4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tX3NvdXJjZS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbXNuZ3Jfc291cmNlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21pbG8tY29yZS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9taW5kZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvY2hhbmdlX2RhdGEuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvY29ubmVjdG9yLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL21fbXNnX2FwaS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9tX3BhdGguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvbW9kZWxfdXRpbHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvcGF0aF9tc2dfYXBpLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL3BhdGhfdXRpbHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvc3ludGhlc2l6ZS9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2NoZWNrLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL3V0aWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9sb2dnZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9sb2dnZXJfY2xhc3MuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvZG90L2RvVC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9kb3QvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90by5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX2FycmF5LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvcHJvdG9fZnVuY3Rpb24uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19udW1iZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19vYmplY3QuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19wcm90b3R5cGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19zdHJpbmcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b191dGlsLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9tQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3puQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0O1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5GYWNldGBcbiAqIEJhc2UgRmFjZXQgY2xhc3MgaXMgYW4gYW5jZXN0b3Igb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2xhc3MsIHRoZSBtYWluIGJ1aWxkaW5nIGJsb2NrIGluIG1pbG8uXG4gKiBcbiAqIEBwYXJhbSB7RmFjZXRlZE9iamVjdH0gb3duZXIgYW4gaW5zdGFuY2Ugb2YgRmFjZXRlZE9iamVjdCBzdWJjbGFzcyB0aGF0IHN0b3JlcyB0aGUgZmFjZXQgb24gaXRzIHByb3BlcnR5ICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYG5hbWVgIHByb3BlcnR5IG9mIGZhY2V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb24sIHVzZWQgaW4gc3ViY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBGYWNldChvd25lciwgY29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gXy5maXJzdExvd2VyQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIGBpbml0YCBtZXRob2Qgb2Ygc3ViY2xhc3Mgd2lsbCBiZSBjYWxsZWQgYnkgRmFjZXQgY29uc3RydWN0b3IuXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXQsIHtcbiAgICBpbml0OiBmdW5jdGlvbigpIHt9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXQgPSByZXF1aXJlKCcuL2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0ZWRPYmplY3Q7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkZhY2V0ZWRPYmplY3RgXG4gKiBDb21wb25lbnQgY2xhc3MgaXMgYmFzZWQgb24gYW4gYWJzdHJhY3QgYGBgRmFjZXRlZE9iamVjdGBgYCBjbGFzcy4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhbnkgc2l0dWF0aW9uIHdoZXJlIG9iamVjdHMgY2FuIGJlIHJlcHJlc2VudGVkIHZpYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyAoYSBmYWNldCBpcyBhbiBvYmplY3Qgb2YgYSBjZXJ0YWluIGNsYXNzLCBpdCBob2xkcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIG1ldGhvZHMpLlxuICogSW4gYSB3YXksIFwiZmFjZXRzIHBhdHRlcm5cIiBpcyBhbiBpbnZlcnNpb24gb2YgXCJhZGFwdGVyIHBhdHRlcm5cIiAtIHdoaWxlIHRoZSBsYXR0ZXIgYWxsb3dzIGZpbmRpbmcgYSBjbGFzcy9tZXRob2RzIHRoYXQgaGFzIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGZhY2V0ZWQgb2JqZWN0IGlzIHNpbXBseSBjb25zdHJ1Y3RlZCB0byBoYXZlIHRoZXNlIGZ1bmN0aW9uYWxpdGllcy5cbiAqIFdpdGggdGhpcyBhcmNoaXRlY3R1cmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgYnVpbGRpbmcgYmxvY2tzIHdpdGhvdXQgaGF2aW5nIGFueSBoaWVyYXJjaHkgb2YgY2xhc3NlcyAtIGFsbCBjb21wb25lbnRzIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBDb21wb25lbnQgY2xhc3MuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IGFsbCBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yIChpdCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGlmIGEgc3ViY2xhc3MgaXMgY3JlYXRlZCB3aXRoIGBfLmNyZWF0ZVN1YmNsYXNzYCkuXG4gKlxuICogQHJldHVybiB7RmFjZXRlZE9iamVjdH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCgpIHtcbiAgICAvLyB0aGlzLmZhY2V0c0NvbmZpZyBhbmQgdGhpcy5mYWNldHNDbGFzc2VzIHdlcmUgc3RvcmVkIG9uIGEgc3BlY2lmaWMgY2xhc3MgcHJvdG90eXBlXG4gICAgLy8gd2hlbiB0aGUgY2xhc3Mgd2FzIGNyZWF0ZWQgYnkgRmFjZXRlZE9iamVjdC5jcmVhdGVGYWNldGVkQ2xhc3NcbiAgICB2YXIgZmFjZXRzQ29uZmlnID0gdGhpcy5mYWNldHNDb25maWcgfHwge307XG5cbiAgICB2YXIgZmFjZXRzRGVzY3JpcHRvcnMgPSB7fVxuICAgICAgICAsIGZhY2V0cyA9IHt9O1xuXG4gICAgLy8gRmFjZXRlZE9iamVjdCBjbGFzcyBpdHNlbGYgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCAtIGl0IGhhcyBubyBmYWNldHNcbiAgICAvLyBJdCBtYXkgY2hhbmdlLCBhcyBhZGRpbmcgZmFjZXRzIGlzIHBvc3NpYmxlIHRvIGluc3RhbmNlc1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09IEZhY2V0ZWRPYmplY3QpICAgICAgXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFjZXRlZE9iamVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcywgY2FuXFwndCBiZSBpbnN0YW50aWF0ZWQnKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGNsYXNzIGZhY2V0c1xuICAgIGlmICh0aGlzLmZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLmZhY2V0c0NsYXNzZXMsIGluc3RhbnRpYXRlRmFjZXQsIHRoaXMsIHRydWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0cyB0byB0aGUgY2xhc3MgYXMgcHJvcGVydGllcyB1bmRlciB0aGVpciBvd24gbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGZhY2V0c0Rlc2NyaXB0b3JzKTtcblxuICAgIC8vIHN0b3JlIGFsbCBmYWNldHMgb24gYGZhY2V0c2AgcHJvcGVydHkgc28gdGhhdCB0aGV5IGNhbiBiZSBlbnVtZXJhdGVkXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmFjZXRzJywgZmFjZXRzKTsgICBcblxuICAgIC8vIGNhbGwgYGluaXRgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgaW4gc3ViY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGZhY2V0IHdpdGggYSBnaXZlbiBjbGFzcyAoRmFjZXRDbGFzcykgYW5kIG5hbWUgKGZhY2V0TmFtZSlcbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUZhY2V0KEZhY2V0Q2xhc3MsIGZhY2V0TmFtZSkge1xuICAgICAgICAvLyBnZXQgZmFjZXQgY29uZmlndXJhdGlvblxuICAgICAgICB2YXIgZmN0Q29uZmlnID0gZmFjZXRzQ29uZmlnW2ZhY2V0TmFtZV07XG5cbiAgICAgICAgLy8gaW5zdGF0aWF0ZSBmYWNldHNcbiAgICAgICAgZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmY3RDb25maWcpO1xuXG4gICAgICAgIC8vIGFkZCBmYWNldCB0byBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICAgICAgICBmYWNldHNEZXNjcmlwdG9yc1tmYWNldE5hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWNldHNbZmFjZXROYW1lXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbY3JlYXRlRmFjZXRlZENsYXNzXSgjRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKVxuICogLSBbaGFzRmFjZXRdKCNGYWNldGVkT2JqZWN0JCRoYXNGYWNldClcbiAqL1xuXy5leHRlbmQoRmFjZXRlZE9iamVjdCwge1xuICAgIGNyZWF0ZUZhY2V0ZWRDbGFzczogRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzLFxuICAgIGhhc0ZhY2V0OiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldCxcbiAgICBnZXRGYWNldENvbmZpZzogRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWdcbn0pO1xuXG5cbi8qKlxuICogIyMjI0ZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFthZGRGYWNldF0oI0ZhY2V0ZWRPYmplY3QkYWRkRmFjZXQpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXRlZE9iamVjdCwge1xuICAgIGFkZEZhY2V0OiBGYWNldGVkT2JqZWN0JGFkZEZhY2V0XG59KTtcblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBhIGZhY2V0IHRvIHRoZSBpbnN0YW5jZSBvZiBGYWNldGVkT2JqZWN0IHN1YmNsYXNzLlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjZXQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGYWNldENsYXNzIGZhY2V0IGNsYXNzIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZmFjZXRDb25maWcgb3B0aW9uYWwgZmFjZXQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSBvcHRpb25hbCBmYWNldCBuYW1lLCBGYWNldENsYXNzLm5hbWUgd2lsbCBiZSB1c2VkIGlmIGZhY2V0TmFtZSBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGYWNldH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCRhZGRGYWNldChGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgY2hlY2soRmFjZXRDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGZhY2V0TmFtZSwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG5cbiAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgZmFjZXQgbmFtZSBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShmYWNldE5hbWUgfHwgRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIC8vIGdldCBmYWNldHMgZGVmaW5lZCBpbiBjbGFzc1xuICAgIHZhciBwcm90b0ZhY2V0cyA9IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmZhY2V0c0NsYXNzZXM7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZXROYW1lIHdhcyBub3QgYWxyZWFkeSB1c2VkIGluIHRoZSBjbGFzc1xuICAgIGlmIChwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY2xhc3MgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZU5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgZmFjZXRlZCBvYmplY3RcbiAgICBpZiAodGhpc1tmYWNldE5hbWVdKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcHJlc2VudCBpbiBvYmplY3QnO1xuICAgICAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdGYWNldGVkT2JqZWN0IGFkZEZhY2V0OiAnLCBtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBmYWNldFxuICAgIHZhciBuZXdGYWNldCA9IHRoaXMuZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmYWNldENvbmZpZyk7XG5cbiAgICAvLyBhZGQgZmFjZXQgdG8gZmFjZXRlZCBvYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIGZhY2V0TmFtZSwgbmV3RmFjZXQsIF8uRU5VTSk7XG5cbiAgICByZXR1cm4gbmV3RmFjZXQ7XG59XG5cblxuLyoqXG4gKiBGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZFxuICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGZhY2V0IGNsYXNzIGlmIHRoZSBmYWNldCB3aXRoIGBmYWNldE5hbWVgIGlzIHBhcnQgb2YgdGhlIGNsYXNzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuIElmIHN1YmNsYXNzIGlzIGNyZWF0ZWQgdXNpbmcgXy5jcmVhdGVTdWJjbGFzcyAoYXMgaXQgc2hvdWxkIGJlKSBpdCB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZC5cbiAqIFxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWVcbiAqIEByZXR1cm4ge1N1YmNsYXNzKEZhY2V0KXx1bmRlZmluZWR9IFxuICovXG5mdW5jdGlvbiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldChmYWNldE5hbWUpIHtcbiAgICAvLyB0aGlzIHJlZmVycyB0byB0aGUgRmFjZXRlZE9iamVjdCBjbGFzcyAob3Igc3ViY2xhc3MpLCBub3QgaW5zdGFuY2VcbiAgICB2YXIgcHJvdG9GYWNldHMgPSB0aGlzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzO1xuICAgIHJldHVybiBwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdO1xufVxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmYWNldFxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSB0aGUgZmFjZXQgd2hpY2ggY29uZmlnIHNob3VsZCBiZSByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmFjZXRcbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWcoZmFjZXROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRmFjZXQoZmFjZXROYW1lKSA/IHRoaXMucHJvdG90eXBlLmZhY2V0c0NvbmZpZ1tmYWNldE5hbWVdIDogbnVsbDtcbn1cblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBDbGFzcyBmYWN0b3J5IHRoYXQgY3JlYXRlcyBjbGFzc2VzIChjb25zdHJ1Y3RvciBmdW5jdGlvbnMpIGZyb20gdGhlIG1hcHMgb2YgZmFjZXRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAqIENyZWF0ZWQgY2xhc3Mgd2lsbCBiZSBzdWJjbGFzcyBvZiBgRmFjZXRlZE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNsYXNzIG5hbWUgKHdpbGwgYmUgZnVuY3Rpb24gbmFtZSBvZiBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbilcbiAqIEBwYXJhbSB7T2JqZWN0W1N1YmNsYXNzKEZhY2V0KV19IGZhY2V0c0NsYXNzZXMgbWFwIG9mIGNsYXNzZXMgb2YgZmFjZXRzIHRoYXQgd2lsbCBjb25zdGl0dXRlIHRoZSBjcmVhdGVkIGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdfSBmYWNldHNDb25maWcgbWFwIG9mIGZhY2V0cyBjb25maWd1cmF0aW9uLCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBrZXlzIGFzIHRoZSBtYXAgb2YgY2xhc3Nlcy4gU29tZSBmYWNldHMgbWF5IG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBmYWNldHNDbGFzc2VzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJuIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZykge1xuICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gICAgY2hlY2soZmFjZXRzQ2xhc3NlcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5TdWJjbGFzcyhGYWNldCwgdHJ1ZSkpKSk7XG4gICAgY2hlY2soZmFjZXRzQ29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBjb25maWcgcGFzc2VkIGZvciBmYWNldCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY2xhc3NcbiAgICBpZiAoZmFjZXRzQ29uZmlnKVxuICAgICAgICBfLmVhY2hLZXkoZmFjZXRzQ29uZmlnLCBmdW5jdGlvbihmY3RDb25maWcsIGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGlmICghIGZhY2V0c0NsYXNzZXMuaGFzT3duUHJvcGVydHkoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWd1cmF0aW9uIGZvciBmYWNldCAoJyArIGZjdE5hbWUgKyAnKSBwYXNzZWQgdGhhdCBpcyBub3QgaW4gY2xhc3MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MgKHRoaXMgcmVmZXJzIHRvIHRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKVxuICAgIHZhciBGYWNldGVkQ2xhc3MgPSBfLmNyZWF0ZVN1YmNsYXNzKHRoaXMsIG5hbWUsIHRydWUpO1xuXG4gICAgLy8gZ2V0IGZhY2V0cyBjbGFzc2VzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmVudCBjbGFzc1xuICAgIGZhY2V0c0NsYXNzZXMgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ2xhc3NlcywgJ2ZhY2V0c0NsYXNzZXMnKTtcbiAgICBmYWNldHNDb25maWcgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ29uZmlnLCAnZmFjZXRzQ29uZmlnJyk7XG5cbiAgICAvLyBzdG9yZSBmYWNldHMgY2xhc3NlcyBhbmQgY29uZmlndXJhdGlvbnMgb2YgY2xhc3MgcHJvdG90eXBlXG4gICAgXy5leHRlbmRQcm90byhGYWNldGVkQ2xhc3MsIHtcbiAgICAgICAgZmFjZXRzQ2xhc3NlczogZmFjZXRzQ2xhc3NlcyxcbiAgICAgICAgZmFjZXRzQ29uZmlnOiBmYWNldHNDb25maWdcbiAgICB9KTtcblxuICAgIHJldHVybiBGYWNldGVkQ2xhc3M7XG5cblxuICAgIGZ1bmN0aW9uIGFkZEluaGVyaXRlZEZhY2V0cyhzdXBlckNsYXNzLCBmYWNldHNJbmZvLCBmYWNldHNJbmZvTmFtZSkge1xuICAgICAgICB2YXIgaW5oZXJpdGVkRmFjZXRzSW5mbyA9IHN1cGVyQ2xhc3MucHJvdG90eXBlW2ZhY2V0c0luZm9OYW1lXTtcbiAgICAgICAgaWYgKGluaGVyaXRlZEZhY2V0c0luZm8pXG4gICAgICAgICAgICByZXR1cm4gXyhpbmhlcml0ZWRGYWNldHNJbmZvKVxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kKGZhY2V0c0luZm8gfHwge30pLl8oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhY2V0c0luZm87XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsYXNzUmVnaXN0cnk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkNsYXNzUmVnaXN0cnlgIC0gdGhlIHJlZ2lzdHJ5IG9mIGNsYXNzZXMgY2xhc3MuXG4gKiBDb21wb25lbnRzIGFuZCBGYWNldHMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiByZWdpc3RyaWVzLiBJdCBhbGxvd3MgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZW0gZnJvbSBvbmUgbW9kdWxlIGFuZCBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgdGhlIEZvdW5kYXRpb25DbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDbGFzc1JlZ2lzdHJ5IChGb3VuZGF0aW9uQ2xhc3MpIHtcbiAgICBpZiAoRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICB0aGlzLnNldENsYXNzKEZvdW5kYXRpb25DbGFzcyk7XG5cbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn1cblxuXG4vKipcbiAqICMjIyNDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbYWRkXSgjYWRkKVxuICogLSBbZ2V0XSgjZ2V0KVxuICogLSBbcmVtb3ZlXSgjcmVtb3ZlKVxuICogLSBbY2xlYW5dKCNjbGVhbilcbiAqIC0gW3NldENsYXNzXSgjc2V0Q2xhc3MpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ2xhc3NSZWdpc3RyeSwge1xuICAgIGFkZDogYWRkLFxuICAgIGdldDogZ2V0LFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGNsZWFuOiBjbGVhbixcbiAgICBzZXRDbGFzczogc2V0Q2xhc3Ncbn0pO1xuXG5cbi8qKlxuICogQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZWdpc3RlcnMgYSBjbGFzcyBpbiB0aGUgcmVnaXN0cnkuXG4gKiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xhc3MgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lIGFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcy5cbiAqIFRoZSBtZXRob2QgYWxsb3dzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsYXNzIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHNvIGNsYXNzIGFsaWFzZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYUNsYXNzIGNsYXNzIHRvIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RyeS4gU2hvdWxkIGJlIHN1YmNsYXNzIG9mIGB0aGlzLkZvdW5kYXRpb25DbGFzc2AuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBjbGFzcyBuYW1lLiBJZiBjbGFzcyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGFrZW4gZnJvbSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLiBDbGFzcyBuYW1lIHNob3VsZCBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYW5kIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZChhQ2xhc3MsIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBhQ2xhc3MubmFtZTtcblxuICAgIGNoZWNrKG5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcsICdjbGFzcyBuYW1lIG11c3QgYmUgaWRlbnRpZmllciBzdHJpbmcnKTtcblxuICAgIGlmICh0aGlzLkZvdW5kYXRpb25DbGFzcykge1xuICAgICAgICBpZiAoYUNsYXNzICE9IHRoaXMuRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICAgICAgY2hlY2soYUNsYXNzLCBNYXRjaC5TdWJjbGFzcyh0aGlzLkZvdW5kYXRpb25DbGFzcyksICdjbGFzcyBtdXN0IGJlIGEgc3ViKGNsYXNzKSBvZiBhIGZvdW5kYXRpb24gY2xhc3MnKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZGF0aW9uIGNsYXNzIG11c3QgYmUgc2V0IGJlZm9yZSBhZGRpbmcgY2xhc3NlcyB0byByZWdpc3RyeScpO1xuXG4gICAgaWYgKHRoaXMuX19yZWdpc3RlcmVkQ2xhc3Nlc1tuYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBcIicgKyBuYW1lICsgJ1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuXG4gICAgdGhpcy5fX3JlZ2lzdGVyZWRDbGFzc2VzW25hbWVdID0gYUNsYXNzO1xufTtcblxuXG4vKipcbiAqIEdldHMgY2xhc3MgZnJvbSByZWdpc3RyeSBieSBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQ2xhc3MgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgY2hlY2sobmFtZSwgU3RyaW5nLCAnY2xhc3MgbmFtZSBtdXN0IGJlIHN0cmluZycpO1xuICAgIHJldHVybiB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGZyb20gcmVnaXN0cnkgYnkgaXRzIG5hbWUuXG4gKiBJZiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuYW1lT3JDbGFzcyBDbGFzcyBuYW1lLiBJZiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBzdXBwbGllZCwgaXRzIG5hbWUgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiByZW1vdmUobmFtZU9yQ2xhc3MpIHtcbiAgICBjaGVjayhuYW1lT3JDbGFzcywgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbiksICdjbGFzcyBvciBuYW1lIG11c3QgYmUgc3VwcGxpZWQnKTtcblxuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckNsYXNzID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5hbWVPckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWVPckNsYXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoISB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQnKTtcblxuICAgIGRlbGV0ZSB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2xhc3NlcyBmcm9tIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn07XG5cblxuLyoqXG4gKiBTZXRzIGBGb3VuZGF0aW9uQ2xhc3NgIG9mIHRoZSByZWdpc3RyeS4gSXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYW55IGNsYXNzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQW55IGNsYXNzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy4gRm91bmRhdGlvbkNsYXNzIGl0c2VsZiBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5IHRvby5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xhc3MoRm91bmRhdGlvbkNsYXNzKSB7XG4gICAgY2hlY2soRm91bmRhdGlvbkNsYXNzLCBGdW5jdGlvbik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm91bmRhdGlvbkNsYXNzJywgRm91bmRhdGlvbkNsYXNzLCBfLkVOVU0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hX2NsYXNzJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgQVRUUklCVVRFX1JFR0VYUD0gL14oW15cXDpcXFtcXF1dKikoPzpcXFsoW15cXDpcXFtcXF1dKilcXF0pP1xcOj8oW146XSopJC9cbiAgICAsIEZBQ0VUU19TUExJVF9SRUdFWFAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi9cbiAgICAsIEFUVFJJQlVURV9URU1QTEFURSA9ICclY29tcENsYXNzJWNvbXBGYWNldHM6JWNvbXBOYW1lJztcblxuXG4vKipcbiAqIGBtaWxvLmF0dHJpYnV0ZXMuYmluZGBcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgcGFyc2VzL3ZhbGlkYXRlcy9ldGMuIGFuIGF0dHJpYnV0ZSB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBtaWxvIGNvbXBvbmVudHMuXG4gKiBQb3NzaWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXc6bXlWaWV3YCAtIGNsYXNzIGFuZCBjb21wb25lbnQgbmFtZVxuICogLSBgW0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGZhY2V0cyBhbmQgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXdbRXZlbnRzXTpteVZpZXdgIC0gY2xhc3MsIGZhY2V0KHMpIGFuZCBjb21wb25lbnQgbmFtZVxuICpcbiAqIFNlZSBbYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBCaW5kQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdCaW5kQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhCaW5kQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBjbGFzcyBtZXRob2RzXG4gKlxuICogLSBbc2V0SW5mb10oI0JpbmRBdHRyaWJ1dGUkJHNldEluZm8pXG4gKi9cbl8uZXh0ZW5kKEJpbmRBdHRyaWJ1dGUsIHtcbiAgICBzZXRJbmZvOiBCaW5kQXR0cmlidXRlJCRzZXRJbmZvXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpbmRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWJpbmQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBiaW5kIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBiaW5kOiAnY2MtYmluZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWJpbmQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMuYmluZDtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGJpbmQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnRpZXMgYGNvbXBDbGFzc2AsIGBjb21wRmFjZXRzYCBhbmQgYGNvbXBOYW1lYCBvbiBCaW5kQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCaW5kQXR0cmlidXRlfVxuICovXG4gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCEgdGhpcy5ub2RlKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKHZhbHVlKVxuICAgICAgICB2YXIgYmluZFRvID0gdmFsdWUubWF0Y2goQVRUUklCVVRFX1JFR0VYUCk7XG5cbiAgICBpZiAoISBiaW5kVG8pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaW5kIGF0dHJpYnV0ZSAnICsgdmFsdWUpO1xuXG4gICAgdGhpcy5jb21wQ2xhc3MgPSBiaW5kVG9bMV0gfHwgJ0NvbXBvbmVudCc7XG4gICAgdGhpcy5jb21wRmFjZXRzID0gKGJpbmRUb1syXSAmJiBiaW5kVG9bMl0uc3BsaXQoRkFDRVRTX1NQTElUX1JFR0VYUCkpIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXBOYW1lID0gYmluZFRvWzNdIHx8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIGlzIG5vdCBzYW1lIGFzICcnXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgdmFsaWRhdGVzIGJpbmQgYXR0cmlidXRlLCB0aHJvd3MgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm4ge0JpbmRBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgIGNoZWNrKHRoaXMuY29tcE5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgaWYgKCEgdGhpcy5jb21wQ2xhc3MpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgY29tcG9uZW50IGNsYXNzIG5hbWUgJyArIHRoaXMuY29tcENsYXNzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGdpdmVuIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGBjb21wQ2xhc3NgLCBgY29tcE5hbWVgIGFuZCBgY29tcEZhY2V0c2AuXG4gKiBJZiBgdGhpcy5jb21wTmFtZWAgaXMgbm90IHNldCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMuY29tcE5hbWUgPSB0aGlzLmNvbXBOYW1lIHx8IG1pbG8udXRpbC5jb21wb25lbnROYW1lKCk7XG4gICAgcmV0dXJuIEFUVFJJQlVURV9URU1QTEFURVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcENsYXNzJywgdGhpcy5jb21wQ2xhc3MgfHwgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjb21wRmFjZXRzJywgdGhpcy5jb21wRmFjZXRzICYmIHRoaXMuY29tcEZhY2V0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyB0aGlzLmNvbXBGYWNldHMuam9pbignLCAnKSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcE5hbWUnLCB0aGlzLmNvbXBOYW1lKTtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgbWV0aG9kXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50Q2xhc3Mgb3B0aW9uYWwgY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudE5hbWUgb3B0aW9uYWxcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tcG9uZW50RmFjZXRzIG9wdGlvbmFsIGV4dHJhIGZhY2V0IHRvIGFkZCB0byB0aGUgY2xhc3NcbiAqL1xuZnVuY3Rpb24gQmluZEF0dHJpYnV0ZSQkc2V0SW5mbyhlbCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudEZhY2V0cykge1xuICAgIHZhciBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUoZWwpO1xuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY29tcE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBGYWNldHM6IGNvbXBvbmVudEZhY2V0c1xuICAgIH0pO1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRlO1xuXG5cbi8qKlxuICogQW4gYWJzY3RyYWN0IGNsYXNzIGZvciBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIG9mIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBtZXRob2RzIGBhdHRyTmFtZWAsIGBwYXJzZWAsIGB2YWxpZGF0ZWAgYW5kIGByZW5kZXJgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgd2hlcmUgYXR0cmlidXRlIGlzIGF0dGFjaGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgc3VwcGxpZWQgYnkgc3ViY2xhc3MgdmlhIGBhdHRyTmFtZWAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0ZShlbCwgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgdGhpcy5hdHRyTmFtZSgpO1xuICAgIHRoaXMuZWwgPSBlbDtcblxuICAgIC8vIGF0dHJpYnV0ZSBub2RlXG4gICAgdGhpcy5ub2RlID0gZWwuYXR0cmlidXRlc1t0aGlzLm5hbWVdO1xufVxuXG5cbl8uZXh0ZW5kKEF0dHJpYnV0ZSwge1xuICAgIHJlbW92ZTogQXR0cmlidXRlJCRyZW1vdmVcbn0pO1xuXG5cbi8qKlxuICogIyMjI0F0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2dldF0oI0F0dHJpYnV0ZSRnZXQpXG4gKiAtIFtzZXRdKCNBdHRyaWJ1dGUkc2V0KVxuICogLSBbZGVjb3JhdGVdKCNBdHRyaWJ1dGUkZGVjb3JhdGUpXG4gKlxuICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZSBtZXRob2RzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gKlxuICogLSBhdHRyTmFtZSAtIHNob3VsZCByZXR1cm4gYXR0cmlidXRlIG5hbWVcbiAqIC0gcGFyc2UgLSBzaG91bGQgcGFyc2UgYXR0cmlidXRlIHZhbHVlXG4gKiAtIHZhbGlkYXRlIC0gc2hvdWxkIHZhbGlkYXRlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhyb3dpbmcgZXhjZXB0aW9uIGlmIGl0IGlzIGluY29ycmVjdCBcbiAqIC0gcmVuZGVyIC0gc2hvdWxkIHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIHN0YXRlIChvdGhlciBwcm9wZXJ0aWVzLCBhcyBkZWZpbmVkIGluIHN1YmNsYXNzKVxuICovXG5fLmV4dGVuZFByb3RvKEF0dHJpYnV0ZSwge1xuICAgIGdldDogQXR0cmlidXRlJGdldCxcbiAgICBzZXQ6IEF0dHJpYnV0ZSRzZXQsXG4gICAgcmVtb3ZlOiBBdHRyaWJ1dGUkcmVtb3ZlLFxuICAgIGRlY29yYXRlOiBBdHRyaWJ1dGUkZGVjb3JhdGUsXG5cbiAgICBkZXN0cm95OiBBdHRyaWJ1dGUkZGVzdHJveSxcblxuICAgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgYXR0ck5hbWU6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBwYXJzZTogdG9CZUltcGxlbWVudGVkLFxuICAgIHZhbGlkYXRlOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVuZGVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZSQkcmVtb3ZlKGVsLCBkZWVwKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnByb3RvdHlwZS5hdHRyTmFtZSgpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIGlmIChkZWVwKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIG5hbWUgKyAnXSc7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgICAgIGNoaWxkRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBBdHRyaWJ1dGUkcmVtb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm5vZGU7XG59XG5cblxuZnVuY3Rpb24gQXR0cmlidXRlJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMubm9kZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhdHRyaWJ1dGUgdmFsdWUgYXMgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbn1cblxuXG4vKipcbiAqIEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCBzZXRzIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJHNldCh2YWx1ZSkge1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdmFsdWUpO1xufVxuXG5cbi8qKlxuICogQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IGRlY29yYXRlcyBlbGVtZW50IHdpdGggaXRzIHJlbmRlcmVkIHZhbHVlLlxuICogVXNlcyBgcmVuZGVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgZGVmaWVuZCBpbiBzdWJjbGFzcy5cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGRlY29yYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMucmVuZGVyKCkpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYV9jbGFzcycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8uYXR0cmlidXRlcy5sb2FkYFxuICogTG9hZEF0dHJpYnV0ZSBjbGFzcyBwYXJzZXMvdmFsaWRhdGVzL2V0Yy4gYW4gYXR0cmlidXRlIHRoYXQgbG9hZHMgc3ViLXZpZXdzIGludG8gdGhlIHBhZ2UuXG4gKiBBdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkIHN1YnZpZXcgZnJvbS5cbiAqIFNlZSBbbG9hZGVyXSguLi9sb2FkZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBMb2FkQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdMb2FkQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjTG9hZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhMb2FkQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWxvYWQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBsb2FkIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBsb2FkOiAnY2MtbG9hZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWxvYWQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMubG9hZDtcbn1cblxuXG4vKipcbiAqIExvYWRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGxvYWQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnR5IGBsb2FkVXJsYCBvbiBMb2FkQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiBwYXJzZSgpIHtcbiAgICBpZiAoISB0aGlzLm5vZGUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFVybCA9IHRoaXMuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHNob3VsZCB2YWxpZGF0ZSBsb2FkIGF0dHJpYnV0ZSBhbmQgdGhyb3cgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBUT0RPIC0gaW1wbGVtZW50IHVybCB2YWxpZGF0aW9uLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAvLyBUT0RPIHVybCB2YWxpZGF0aW9uXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCAtIHJldHVybnMgVVJMXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdWJjbGFzc2VzIG9mIFtBdHRyaWJ1dGVdKC4vYV9jbGFzcy5qcy5odG1sKSBjbGFzc1xuICpcbiAqIC0gW0JpbmRBdHRyaWJ1dGVdKC4vYV9iaW5kLmpzLmh0bWwpXG4gKiAtIFtMb2FkQXR0cmlidXRlXSguL2FfbG9hZC5qcy5odG1sKVxuICovXG52YXIgYXR0cmlidXRlcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGJpbmQ6IHJlcXVpcmUoJy4vYV9iaW5kJyksXG4gICAgbG9hZDogcmVxdWlyZSgnLi9hX2xvYWQnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoJ0NvbXBvbmVudCcpXG4gICAgLCBDb21wb25lbnRJbmZvID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfaW5mbycpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9zY29wZScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgTWF0Y2ggPSAgY2hlY2suTWF0Y2g7XG5cblxuYmluZGVyLnNjYW4gPSBzY2FuO1xuYmluZGVyLmNyZWF0ZSA9IGNyZWF0ZTtcbmJpbmRlci50d29QYXNzID0gdHdvUGFzcztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRlcjtcblxuXG4vKipcbiAqIGBtaWxvLmJpbmRlcmBcbiAqXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHNjb3BlRWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtYmluZF9fIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBjbGFzcywgYWRkaXRpb25hbCBmYWNldHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogUG9zc2libGUgdmFsdWVzIG9mIF9fbWwtYmluZF9fIGF0dHJpYnV0ZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIENvbXBvbmVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgZmFjZXRzLlxuICogLSBgVmlldzpteVZpZXdgIC0gY2xhc3MgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBWaWV3IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gYFtFdmVudHMsIERhdGFdOm15Vmlld2AgLSBmYWNldHMgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBDb21wb25lbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKiAtIGBWaWV3W0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGNsYXNzLCBmYWNldChzKSBhbmQgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIFZpZXcgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKlxuICogRnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBbYFNjb3BlYF0oLi9jb21wb25lbnRzL3Njb3BlLmpzLmh0bWwpIGNsYXNzIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzY2FubmluZyBET00uXG4gKlxuICogSWYgdGhlIGNvbXBvbmVudCBoYXMgW2BDb250YWluZXJgXSguL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyLmpzKSBmYWNldCwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgc2NvcGVgIG9iamVjdCwgYXZhaWxhYmxlIGFzIHNjb3BlIHByb3BlcnR5IG9uIHRoZSBDb250YWluZXIgZmFjZXQgb2YgdGhpcyBjb21wb25lbnQuIE5hbWVzIG9mIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBzaG91bGQgYmUgdW5pcXVlLCBidXQgdGhleSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWVzIG9mIGNvbXBvbmVudHMgaW4gb3V0ZXIgc2NvcGUgKG9yIHNvbWUgb3RoZXIgc2NvcGUpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2NvcGVFbCByb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgYW5kIGJvdW5kXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgT3B0aW9uYWwgUm9vdCBzY29wZSBvYmplY3Qgd2hlcmUgdG9wIGxldmVsIGNvbXBvbmVudHMgd2lsbCBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluZFJvb3RFbGVtZW50IElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBiaW5kZXIoc2NvcGVFbCwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGUoaW5mbywgdGhyb3dPbkVycm9ycyk7XG4gICAgfSwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIGJpbmQgaW4gdHdvIHBhc3Nlc1xuZnVuY3Rpb24gdHdvUGFzcyhzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY2FuU2NvcGUgPSBiaW5kZXIuc2NhbihzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG4gICAgcmV0dXJuIGJpbmRlci5jcmVhdGUoc2NhblNjb3BlLCB1bmRlZmluZWQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIHNjYW4gRE9NIGZvciBCaW5kQXR0cmlidXRlXG5mdW5jdGlvbiBzY2FuKHNjb3BlRWwsIHJvb3RTY29wZSwgYmluZFJvb3RFbGVtZW50LCB0aHJvd09uRXJyb3JzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJpbmRlclNjb3BlKHNjb3BlRWwsIGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB9LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG59XG5cblxuLy8gY3JlYXRlIGJvdW5kIGNvbXBvbmVudHNcbmZ1bmN0aW9uIGNyZWF0ZShzY2FuU2NvcGUsIGhvc3RPYmplY3QsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgc2NvcGUgPSBuZXcgU2NvcGUoc2NhblNjb3BlLl9yb290RWwsIGhvc3RPYmplY3QpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgc2NhblNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBJbmZvKSB7XG4gICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgICAgIHZhciBpbmZvID0gXy5jbG9uZShjb21wSW5mbylcbiAgICAgICAgaW5mby5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjb21wb25lbnRcbiAgICAgICAgdmFyIGFDb21wb25lbnQgPSBDb21wb25lbnQuY3JlYXRlKGluZm8sIHRocm93T25FcnJvcnMpO1xuXG4gICAgICAgIHNjb3BlW2FkZE1ldGhvZF0oYUNvbXBvbmVudCwgYUNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgaWYgKGFDb21wb25lbnQuY29udGFpbmVyKVxuICAgICAgICAgICAgYUNvbXBvbmVudC5jb250YWluZXIuc2NvcGUgPSBjcmVhdGUoY29tcEluZm8uY29udGFpbmVyLnNjb3BlLCBhQ29tcG9uZW50LmNvbnRhaW5lciwgdGhyb3dPbkVycm9ycyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKlxuICogYGNyZWF0ZUJpbmRlclNjb3BlYFxuICogQHBhcmFtICB7RWxlbWVudH0gc2NvcGVFbCAgICAgICAgICAgICBzY29wZUVsIHJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCBhbmQgYm91bmQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gc2NvcGVPYmplY3RGYWN0b3J5IFNlZSBbYmluZGVyXSgjbWlsby5iaW5kZXIpXG4gKiBAcGFyYW0gIHtTY29wZX0gcm9vdFNjb3BlICAgICAgICAgICAgIE9wdGlvbmFsIFJvb3Qgc2NvcGUgb2JqZWN0IHdoZXJlIHRvcCBsZXZlbCBjb21wb25lbnRzIHdpbGwgYmUgc2F2ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBiaW5kUm9vdEVsZW1lbnQgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSB0aHJvd09uRXJyb3JzICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtTY29wZX0gICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgc2NvcGVPYmplY3RGYWN0b3J5LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY29wZUVsID0gc2NvcGVFbCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgICwgc2NvcGUgPSByb290U2NvcGUgfHwgbmV3IFNjb3BlKHNjb3BlRWwpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgY3JlYXRlU2NvcGVGb3JFbGVtZW50KHNjb3BlLCBzY29wZUVsLCBiaW5kUm9vdEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckVsZW1lbnQoc2NvcGUsIGVsLCBiaW5kUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQncyBiaW5kaW5nIGF0dHJpYnV0ZSAobWwtYmluZCBieSBkZWZhdWx0KVxuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcblxuICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBiaW5kIGF0dHJpYnV0ZSBjcmF0ZSBzY29wZSBvYmplY3QgKENvbXBvbmVudCBvciBDb21wb25lbnRJbmZvKVxuICAgICAgICBpZiAoYXR0ci5ub2RlICYmIGJpbmRSb290RWxlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzY29wZWRPYmplY3QgPSBzY29wZU9iamVjdEZhY3Rvcnkoc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKVxuICAgICAgICAgICAgICAgICwgaXNDb250YWluZXIgPSB0eXBlb2Ygc2NvcGVkT2JqZWN0ICE9ICd1bmRlZmluZWQnICYmIHNjb3BlZE9iamVjdC5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgY2hpbGROb2RlcyBhZGQgY2hpbGRyZW4gdG8gbmV3IHNjb3BlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29tcG9uZW50IHdpdGggQ29udGFpbmVyIGZhY2V0XG4gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgc2NvcGVcbiAgICAgICAgaWYgKGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNjb3BlID0gbmV3IFNjb3BlKGVsKTtcbiAgICAgICAgICAgICAgICBzY29wZWRPYmplY3QuY29udGFpbmVyLnNjb3BlID0gaW5uZXJTY29wZTtcbiAgICAgICAgICAgICAgICBpbm5lclNjb3BlLl9ob3N0T2JqZWN0ID0gc2NvcGVkT2JqZWN0LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU2NvcGVGb3JDaGlsZHJlbihlbCwgaXNDb250YWluZXIgPyBpbm5lclNjb3BlIDogc2NvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2NvcGUgd2Fzbid0IHByZXZpb3VzbHkgY3JlYXRlZCBvbiBjb250YWluZXIgZmFjZXQsIGNyZWF0ZSBlbXB0eSBzY29wZSBhbnl3YXlcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyICYmICEgc2NvcGVkT2JqZWN0LmNvbnRhaW5lci5zY29wZSlcbiAgICAgICAgICAgIHNjb3BlZE9iamVjdC5jb250YWluZXIuc2NvcGUgPSBuZXcgU2NvcGUoZWwpO1xuXG5cbiAgICAgICAgLy8gVE9ETyBjb25kaXRpb24gYWZ0ZXIgJiYgaXMgYSBoYWNrLCBzaG91bGQgbm90IGJlIHVzZWQhXG4gICAgICAgIGlmIChzY29wZWRPYmplY3QpIC8vICYmICEgc2NvcGVbYXR0ci5jb21wTmFtZV0pXG4gICAgICAgICAgICBzY29wZVthZGRNZXRob2RdKHNjb3BlZE9iamVjdCwgYXR0ci5jb21wTmFtZSk7XG5cbiAgICAgICAgLy8gXy5kZWZlcihwb3N0Q2hpbGRyZW5Cb3VuZE1lc3NhZ2UsIGVsKTtcbiAgICAgICAgcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKTtcblxuICAgICAgICByZXR1cm4gc2NvcGVkT2JqZWN0O1xuXG5cbiAgICAgICAgZnVuY3Rpb24gcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKSB7XG4gICAgICAgICAgICB2YXIgZWxDb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbENvbXApXG4gICAgICAgICAgICAgICAgZWxDb21wLnBvc3RNZXNzYWdlU3luYygnY2hpbGRyZW5ib3VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckNoaWxkcmVuKGNvbnRhaW5lckVsLCBzY29wZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB1dGlsRG9tLmNoaWxkcmVuKGNvbnRhaW5lckVsKTtcblxuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVNjb3BlRm9yRWxlbWVudChzY29wZSwgbm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZUNsYXNzZXMgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzIGFuZCBjbGFzcyByZWdpc3RyaWVzLlxuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBGYWNldDogcmVxdWlyZSgnLi9hYnN0cmFjdC9mYWNldCcpLFxuICAgIEZhY2V0ZWRPYmplY3Q6IHJlcXVpcmUoJy4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QnKSxcbiAgICBTY29wZTogcmVxdWlyZSgnLi9jb21wb25lbnRzL3Njb3BlJyksXG4gICAgQ2xhc3NSZWdpc3RyeTogcmVxdWlyZSgnLi9hYnN0cmFjdC9yZWdpc3RyeScpLFxuICAgIE1peGluOiBjb3JlQ2xhc3Nlcy5NaXhpbixcbiAgICBNZXNzYWdlU291cmNlOiBjb3JlQ2xhc3Nlcy5NZXNzYWdlU291cmNlLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IGNvcmVDbGFzc2VzLk1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsXG4gICAgTWVzc2VuZ2VyQVBJOiBjb3JlQ2xhc3Nlcy5NZXNzZW5nZXJBUEksXG4gICAgRE9NRXZlbnRzU291cmNlOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzJyksXG4gICAgVHJhbnNhY3Rpb246IHJlcXVpcmUoJy4vY29tbWFuZC90cmFuc2FjdGlvbicpLFxuICAgIFRyYW5zYWN0aW9uSGlzdG9yeTogcmVxdWlyZSgnLi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnknKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uc0hpc3Rvcnk7XG5cblxuLyoqXG4gKiBTdG9yZXMgbGlzdCBvZiBjb21tYW5kcyBvciB0cmFuc2FjdGlvbnNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMZW5ndGhcbiAqL1xuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQWN0aW9uc0hpc3RvcnksIHtcbiAgICBzdG9yZTogQWN0aW9uc0hpc3Rvcnkkc3RvcmUsXG4gICAgZGVsZXRlTGFzdDogQWN0aW9uc0hpc3RvcnkkZGVsZXRlTGFzdCxcbiAgICB1bmRvOiBBY3Rpb25zSGlzdG9yeSR1bmRvLFxuICAgIHJlZG86IEFjdGlvbnNIaXN0b3J5JHJlZG8sXG4gICAgdW5kb0FsbDogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbCxcbiAgICByZWRvQWxsOiBBY3Rpb25zSGlzdG9yeSRyZWRvQWxsLFxuICAgIHVuZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbEFzeW5jLFxuICAgIHJlZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkcmVkb0FsbEFzeW5jLFxuICAgIGVhY2g6IEFjdGlvbnNIaXN0b3J5JGVhY2gsXG4gICAgZWFjaFJldmVyc2U6IEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlLFxuICAgIGdldExhc3RBY3Rpb246IEFjdGlvbnNIaXN0b3J5JGdldExhc3RBY3Rpb24sXG5cbiAgICBnZXREZXNjcmlwdGlvbjogQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb25cbn0pO1xuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHN0b3JlKGNvbW1hbmQpIHtcbiAgICBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbi5jYWxsKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9ucy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBhY3QuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmFjdGlvbnMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uIC0gMVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGRlbGV0ZUxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5wb3NpdGlvbi0tO1xuICAgIHRoaXMuYWN0aW9ucy5sZW5ndGgtLTtcbn1cblxuXG5mdW5jdGlvbiBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbjsgaSA8IHRoaXMuYWN0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5hY3Rpb25zW2ldLmRlc3Ryb3koKTtcbiAgICB0aGlzLmFjdGlvbnMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvKGNiKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIHVuZG9cbiAgICB2YXIgYWN0ID0gdGhpcy5hY3Rpb25zWy0tdGhpcy5wb3NpdGlvbl07XG4gICAgYWN0LnVuZG8oY2IpO1xuICAgIHJldHVybiBhY3Q7XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkcmVkbyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uID09IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byByZWRvXG4gICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uKytdO1xuICAgIGFjdC5yZWRvKGNiKTtcbiAgICByZXR1cm4gYWN0O1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHVuZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24pIHRoaXMudW5kbygpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSB0aGlzLnJlZG8oKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvQWxsQXN5bmMoY2IpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICd1bmRvQWxsQXN5bmMnLCBjYik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGxBc3luYyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSBcbiAgICAgICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ3JlZG9BbGxBc3luYycsIGNiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZWFjaChmdW5jT3JNZXRob2QsIHRoaXNBcmcpIHtcbiAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2QgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGFjdCkgeyBhY3RbZnVuY09yTWV0aG9kXSgpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2Q7XG5cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChmdW5jLCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlKGZ1bmNPck1ldGhvZCwgdGhpc0FyZykge1xuICAgIHRoaXMuYWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgdGhpcy5lYWNoKGZ1bmNPck1ldGhvZCwgdGhpc0FyZyk7XG4gICAgdGhpcy5hY3Rpb25zLnJldmVyc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSRnZXRMYXN0QWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uICYmIHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uIC0gMV07XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMubWFwKGZ1bmN0aW9uKGFjdCkge1xuICAgICAgICByZXR1cm4gYWN0LmdldERlc2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgIGxlbmd0aDogYWN0aW9ucy5sZW5ndGhcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbW1hbmQgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tbWFuZHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbW1hbmQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbW1hbmRzUmVnaXN0cnkuYWRkKENvbW1hbmQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbW1hbmRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgVU5ET19DT01NQU5EID0gJ191bmRvQ29tbWFuZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21tYW5kO1xuXG5cbi8qKlxuICogQ29tbWFuZCBjbGFzcyB0byBpbXBsZW1lbnQgXCJjb21tYW5kIHBhdHRlcm5cIiAtIHBhY2thZ2luZyBsbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRlbGF5ZWQgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBDb21tYW5kKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb21tYW5kIGluc3RhbmNlIG1ldGhvZHNcbiAqIFxuICogLSBbaW5pdF0oI0NvbW1hbmQkZXhlY3V0ZSkgLSBpbml0aWFsaXplIGNvbW1hbmQsIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gKiAtIFtleGVjdXRlXSgjQ29tbWFuZCRleGVjdXRlKSAtIGV4ZWN1dGUgY29tbWFuZFxuICogLSBbc2V0VW5kb10oI0NvbW1hbmQkc2V0VW5kbykgLSBzZXQgdW5kbyBjb21tYW5kIGZvciB0aGlzIGNvbW1hbmRcbiAqIC0gW2dldFVuZG9dKCNDb21tYW5kJGdldFVuZG8pIC0gZ2V0IHVuZG8gY29tbWFuZCBvZiB0aGlzIGNvbW1hbmRcbiAqIC0gW3NldEFyZ3VtZW50c10oI0NvbW1hbmQkc2V0QXJndW1lbnRzKSAtIHNldCBjb21tYW5kcyBhcmd1bWVudHNcbiAqIC0gW2FkZEFyZ3VtZW50c10oI0NvbW1hbmQkYWRkQXJndW1lbnRzKSAtIGFkZCBhcmd1bWVudHMgdG8gY29tbWFuZFxuICogLSBbZGVzdHJveV0oI0NvbW1hbmQkZGVzdHJveSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21tYW5kLCB7XG4gICAgaW5pdDogQ29tbWFuZCRpbml0LFxuICAgIGV4ZWN1dGU6IENvbW1hbmQkZXhlY3V0ZSxcbiAgICBzZXRVbmRvOiBDb21tYW5kJHNldFVuZG8sXG4gICAgZ2V0VW5kbzogQ29tbWFuZCRnZXRVbmRvLFxuICAgIHVuZG86IENvbW1hbmQkdW5kbyxcbiAgICByZWRvOiBDb21tYW5kJGV4ZWN1dGUsIC8vIHNhbWUgZm9yIGNvbW1hbmQsIGRpZmZlcmVudCBmb3IgdHJhbnNhY3Rpb25cbiAgICBzZXRBcmd1bWVudHM6IENvbW1hbmQkc2V0QXJndW1lbnRzLFxuICAgIGFkZEFyZ3VtZW50czogQ29tbWFuZCRhZGRBcmd1bWVudHMsXG4gICAgZ2V0QXJndW1lbnRzOiBDb21tYW5kJGdldEFyZ3VtZW50cyxcbiAgICBjaGFuZ2VBcmd1bWVudHM6IENvbW1hbmQkY2hhbmdlQXJndW1lbnRzLFxuICAgIGRlc3Ryb3k6IENvbW1hbmQkZGVzdHJveSxcblxuICAgIHNldENvbW1lbnQ6IENvbW1hbmQkc2V0Q29tbWVudCxcbiAgICBnZXREZXNjcmlwdGlvbjogQ29tbWFuZCRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuLyoqXG4gKiBDb21tYW5kIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiAtIFtjcmVhdGVdKCNDb21tYW5kJCRjcmVhdGUpIC0gY29tbWFuZHMgZmFjdG9yeVxuICovXG5fLmV4dGVuZChDb21tYW5kLCB7XG4gICAgY3JlYXRlOiBDb21tYW5kJCRjcmVhdGUsXG4gICAgY3JlYXRlV2l0aFVuZG86IENvbW1hbmQkJGNyZWF0ZVdpdGhVbmRvXG59KTtcblxuXG5mdW5jdGlvbiBDb21tYW5kJGluaXQoZnVuYykgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICBjaGVjayhmdW5jLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuICAgIHRoaXMuZnVuYyA9IGZ1bmMgfHwgZnVuY3Rpb24oKXt9O1xuICAgIHRoaXMuYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTsgICAgXG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGNvbW1hbmQgbWFraW5nIGNvbW1hbmQgb2JqZWN0IGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gcHJvcGVydHkuIFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGV4ZWN1dGUoY2IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mdW5jLmFwcGx5KHRoaXMsIHRoaXMuYXJncyk7XG4gICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogU2V0IHVuZG8gY29tbWFuZCBmb3IgdGhpcyBjb21tYW5kLiBUaGlzIGNvbW1hbmQgYmVjb21lcyB1bmRvIGNvbW1hbmQgZm9yIHVuZG8gY29tbWFuZCAoc28gdW5kbyBjb21tYW5kIGNhbiBjaGFuZ2UgdGhpcyBjb21tYW5kIGR1cmluZyBpdHMgZXhlY3V0aW9uKS5cbiAqIFxuICogQHBhcmFtIHtDb21tYW5kfSB1bmRvQ29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJHNldFVuZG8odW5kb0NvbW1hbmQpIHtcbiAgICBpZiAodGhpc1tVTkRPX0NPTU1BTkRdKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRVbmRvOiB1bmRvIGNvbW1hbmQgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIHRoaXNbVU5ET19DT01NQU5EXSA9IHVuZG9Db21tYW5kO1xuICAgIHVuZG9Db21tYW5kW1VORE9fQ09NTUFORF0gPSB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bmRvIGNvbW1hbmQgb2YgYSBnaXZlbiBjb21tYW5kXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRnZXRVbmRvKCkge1xuICAgIHJldHVybiB0aGlzW1VORE9fQ09NTUFORF07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlcyB1bmRvIGNvbW1hbmQgb2YgY3VycmVudCBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkdW5kbyhjYikge1xuICAgIHZhciB1bmRvQ21kID0gdGhpcy5nZXRVbmRvKCk7XG4gICAgaWYgKCEgdW5kb0NtZCkgcmV0dXJuIGxvZ2dlci5lcnJvcignQ29tbWFuZCB1bmRvIGNhbGxlZCB3aXRob3V0IHVuZG8gY29tbWFuZCBwcmVzZW50Jyk7XG4gICAgdmFyIHJlc3VsdCA9IHVuZG9DbWQuZXhlY3V0ZSgpO1xuICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFNldCBjb21tYW5kJ3MgYXJndW1lbnRzLiBJZiBhcmd1bWVudHMgd2VyZSBzZXQgZHVyaW5nIGNvbW1hbmQncyBjcmVhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgYXJndW1lbnRzIGFuZCBsb2cgd2FybmluZy5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRzZXRBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgaWYgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3MubGVuZ3RoKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRBcmd1bWVudHM6IGNvbW1hbmQgYXJndW1lbnRzIGFyZSBhbHJlYWR5IHNldCcpO1xuICAgIHRoaXMuYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0QXJndW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3M7XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRjaGFuZ2VBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5hcmdzID0gXy50b0FycmF5KGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBBZGQgKGFwcGVuZCkgYXJndW1lbnRzIHRvIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHMgYXJndW1lbnRzIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gY29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGFkZEFyZ3VtZW50cygpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICBpZiAoISB0aGlzLmFyZ3MpIHRoaXMuYXJncyA9IFtdO1xuICAgIF8uYXBwZW5kQXJyYXkodGhpcy5hcmdzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogQ29tbWFuZHMgZmFjdG9yeS4gTGlrZWx5IG90IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIG9mIGNvbW1hbmQgY29uc3RydWN0aW9uXG4gKiBcbiAqIEB0aGlzIHtGdW5jdGlvbn0gQ2xhc3Mgb2YgY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCQkY3JlYXRlKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21tYW5kJCRjcmVhdGVXaXRoVW5kbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdpdGhVbmRvIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJzY2xhc3MnKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY3VycmVudCBjb21tYW5kICh0byBwcmV2ZW50IHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2hlbiBjb21tYW5kcyBwb2ludCB0byBET00gZWxlbWVudHMpXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jO1xuICAgIGRlbGV0ZSB0aGlzLmFyZ3M7XG4gICAgdmFyIHVuZG9DbWQgPSB0aGlzW1VORE9fQ09NTUFORF07XG4gICAgaWYgKHVuZG9DbWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbVU5ET19DT01NQU5EXVtVTkRPX0NPTU1BTkRdO1xuICAgICAgICBkZWxldGUgdGhpc1tVTkRPX0NPTU1BTkRdO1xuICAgICAgICB1bmRvQ21kLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRzZXRDb21tZW50KGNvbW1lbnQpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVuYzogdGhpcy5mdW5jLm5hbWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIEFjdGlvbnNIaXN0b3J5ID0gcmVxdWlyZSgnLi9hY3Rpb25zX2hpc3RvcnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb247XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IG5ldyBBY3Rpb25zSGlzdG9yeTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uLCB7XG4gICAgZXhlY3V0ZTogVHJhbnNhY3Rpb24kZXhlY3V0ZSxcbiAgICB1bmRvOiBUcmFuc2FjdGlvbiR1bmRvLFxuICAgIHJlZG86IFRyYW5zYWN0aW9uJHJlZG8sXG4gICAgZGVzdHJveTogVHJhbnNhY3Rpb24kZGVzdHJveSxcbiAgICBzdG9yZUNvbW1hbmQ6IFRyYW5zYWN0aW9uJHN0b3JlQ29tbWFuZCxcbiAgICBtZXJnZTogVHJhbnNhY3Rpb24kbWVyZ2UsXG5cbiAgICBzZXRDb21tZW50OiBUcmFuc2FjdGlvbiRzZXRDb21tZW50LFxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbiRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2V4ZWN1dGUnKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiR1bmRvKGNiKSB7XG4gICAgdGhpcy5jb21tYW5kcy51bmRvQWxsQXN5bmMoY2IpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJHJlZG8oY2IpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnJlZG9BbGxBc3luYyhjYik7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2Rlc3Ryb3knKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiRzdG9yZUNvbW1hbmQoY29tbWFuZCkge1xuICAgIHRoaXMuY29tbWFuZHMuc3RvcmUoY29tbWFuZCk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kbWVyZ2UodHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5jb21tYW5kcy5lYWNoKGZ1bmN0aW9uKGNtZCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnN0b3JlKGNtZCk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kc2V0Q29tbWVudChjb21tZW50KSB7XG4gICAgdGhpcy5jb21tZW50ID0gY29tbWVudFxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJGdldERlc2NyaXB0aW9uKCkge1xuICAgIHZhciBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMuZ2V0RGVzY3JpcHRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogY29tbWFuZHMuYWN0aW9ucyxcbiAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBY3Rpb25zSGlzdG9yeSA9IHJlcXVpcmUoJy4vYWN0aW9uc19oaXN0b3J5JylcbiAgICAsIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkhpc3Rvcnk7XG5cblxudmFyIFNDSEVEVUxFRCA9ICdfc2NoZWR1bGVkJztcblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBuZXcgQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzW1NDSEVEVUxFRF0gPSBmYWxzZTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uSGlzdG9yeSwge1xuICAgIHN0b3JlQ29tbWFuZDogVHJhbnNhY3Rpb25IaXN0b3J5JHN0b3JlQ29tbWFuZCxcbiAgICBlbmRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGVuZFRyYW5zYWN0aW9uLFxuICAgIHN0b3JlVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uLFxuICAgIGRlbGV0ZUxhc3RUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGRlbGV0ZUxhc3RUcmFuc2FjdGlvbixcbiAgICB1bmRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkdW5kbyxcbiAgICByZWRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyxcbiAgICBpblRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkaW5UcmFuc2FjdGlvbixcblxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkZ2V0RGVzY3JpcHRpb24sXG4gICAgdXNlTWVzc2VuZ2VyOiBUcmFuc2FjdGlvbkhpc3RvcnkkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IFRyYW5zYWN0aW9uSGlzdG9yeSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIFN0b3JlcyBjb21tYW5kIGluIHRoZSBoaXN0b3J5LiBcbiAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZCAgICAgICAgICAgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGVuZFRyYW5zYWN0aW9uIElmIGB0cnVlYCwgYXBwZW5kcyB0byB0aGUgY3VycmVudCBvciBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRyYW5zYWN0aW9uLlxuICovXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3Rvcnkkc3RvcmVDb21tYW5kKGNvbW1hbmQsIGFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKGFwcGVuZFRyYW5zYWN0aW9uICYmICEodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jdXJyZW50QmF0Y2gpKSB7XG4gICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25zLmdldExhc3RBY3Rpb24oKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc3RvcmVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICdhcHBlbmRlZCcsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIHRoaXMuY3VycmVudEJhdGNoKSB0aGlzLmN1cnJlbnRCYXRjaCA9IG5ldyBUcmFuc2FjdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaC5zdG9yZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgaWYgKCEgdGhpc1tTQ0hFRFVMRURdKSB7XG4gICAgICAgIHRoaXNbU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgX3N0b3JlVHJhbnNhY3Rpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVsZXRlTGFzdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRCYXRjaCB8fCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuZGVsZXRlTGFzdCgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc3RvcmVUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgX2FkZEJhdGNoVG9UcmFuc2FjdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsIF9zdG9yZVRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc3RvcmVDdXJyZW50VHJhbnNhY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpc1tTQ0hFRFVMRURdID0gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICBfYWRkQmF0Y2hUb1RyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG4gICAgX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2FkZEJhdGNoVG9UcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5tZXJnZSh0aGlzLmN1cnJlbnRCYXRjaCk7XG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB2YXIgdCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5zdG9yZSh0KTtcbiAgICAgICAgX3Bvc3RUcmFuc2FjdGlvbk1lc3NhZ2UuY2FsbCh0aGlzLCAnc3RvcmVkJywgdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5lbmRUcmFuc2FjdGlvbigpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc3RvcmUodHJhbnNhY3Rpb24pO1xuICAgIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3N0b3JlZCcsIHRyYW5zYWN0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZShtc2csIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcilcbiAgICAgICAgdGhpcy5fbWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1zZywgeyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gfSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JHVuZG8oY2IpIHtcbiAgICB2YXIgdCA9IHRoaXMudHJhbnNhY3Rpb25zLnVuZG8oY2IpO1xuICAgIGlmICh0KSBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICd1bmRvbmUnLCB0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyhjYikge1xuICAgIHZhciB0ID0gdGhpcy50cmFuc2FjdGlvbnMucmVkbyhjYik7XG4gICAgaWYgKHQpIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3JlZG9uZScsIHQpO1xuICAgIHJldHVybiB0O1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRpblRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW1NDSEVEVUxFRF07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5nZXREZXNjcmlwdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSR1c2VNZXNzZW5nZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnRyYW5zYWN0aW9ucztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXRlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnQ29tcG9uZW50RmFjZXQnKVxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi91dGlsL2RvbScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuLi91dGlsL3N0b3JhZ2UnKTtcblxudmFyIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyA9IGNvbXBvbmVudFV0aWxzLl9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYztcblxuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudGBcbiAqIEJhc2UgQ29tcG9uZW50IGNsYXNzLiBTdWJjbGFzcyBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCksIGJ1dCBub25lIG9mIHRoaXMgY2xhc3MgbWV0aG9kcyBzaG91bGQgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGNvbXBvbmVudC5cbiAqIEl0cyBjb25zdHJ1Y3RvciBwYXNzZXMgaXRzIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBpdHMgW3Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLCBET00gZWxlbWVudCBhbmQgbmFtZSB0byBbYGluaXRgXSgjaW5pdCkgbWV0aG9kLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIENvbXBvbmVudCBjbGFzcyByYXJlbHkgbmVlZHMgdG8gYmUgdXNlZCBkaXJlY3RseSwgYXMgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgY3JlYXRlcyBjb21wb25lbnRzIHdoZW4gaXQgc2NhbnMgRE9NIHRyZWUuXG4gKiBbYENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzc2BdKCNjcmVhdGVDb21wb25lbnRDbGFzcykgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgQ29tcG9uZW50IGNsYXNzIHdpdGggY29uZmlndXJlZCBmYWNldHMuXG4gKlxuICpcbiAqICMjIyNDb21wb25lbnQgaW5zdGFuY2UgcHJvcGVydGllcyMjIyNcbiAqXG4gKiAtIGVsIC0gRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG8uIElmIHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB0aGUgd2FybmluZyB3aWxsIGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUbyBnZXQgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIERPTSBlbGVtZW50IHVzZSBbQ29tcG9uZW50LmdldENvbXBvbmVudF0oLi9jX3V0aWxzLmpzLmh0bWwjZ2V0Q29tcG9uZW50KSBjbGFzcyBtZXRob2QuIFRvIGluc3BlY3QgY29tcG9uZW50IHZpYSBlbGVtZW50IGluIGJyb3dzZXIgY2hlY2sgYF9fX21pbG9fY29tcG9uZW50YCBwcm9wZXJ0eSBvZiBlbGVtZW50IChwcm9wZXJ0eSBuYW1lIGJlIGNoYW5nZWQgdXNpbmcgYG1pbG8uY29uZmlnYCkuXG4gKiAtIHNjb3BlIC0gcGFyZW50IHNjb3BlIG9iamVjdCwgYW4gaW5zdGFuY2Ugb2YgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpIGNsYXNzLiBUbyBnZXQgcGFyZW50IGNvbXBvbmVudCB1c2UgW2dldFNjb3BlUGFyZW50XSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KSBpbnN0YW5jZSBtZXRob2Qgb2YgY29tcG9uZW50LiBUaGUgYWN0dWFsIHBhdGggdG8gZ2V0IHBhcmVudCBvZiBjb25wb25lbnQgaXMgYGNvbXBvbmVudC5zY29wZS5faG9zdE9iamVjdC5vd25lcmAsIHdoZXJlIGBfaG9zdE9iamVjdGAgcmVmZXJzIHRvIFtDb250YWluZXJdKGNfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBwYXJlbnQgY29tcG9uZW50IGFuZCBgb3duZXJgIHRvIHRoZSBwYXJlbnQgaXRzZWxmLiBUaGUgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgc2NvcGUgb2YgaXRzIGNvbnRhaW5lciBmYWNldDogYGNvbXBvbmVudC5jb250YWluZXIuc2NvcGVgLiBUaGUgc2NvcGUgaGllcmFyY2h5IGNhbiBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgYXMgdGhlIERPTSBoaWVyYXJjaHkgLSBET00gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjb3BlIGFzIGNvbXBvbmVudCBpZiBpdCBkb2VzIG5vdCBoYXZlIGBDb250YWluZXJgIGZhY2V0IGFuZCBpbiB0aGUgc2NvcGUgb2YgaXRzIENvbnRhaW5lciBmYWNldCBpZiBpdCBoYXMgaXQuIFNlZSBbU2NvcGVdKC4vc2NvcGUuanMuaHRtbCkuXG4gKiAtIG5hbWUgLSB0aGUgbmFtZSBvZiBjb21wb25lbnQsIHNob3VsZCBiZSB1bmlxdWUgZm9yIHRoZSBzY29wZSB3aGVyZSBjb21wb25lbnQgYmVsb25ncy4gVG8gZmluZCBjb21wb25lbnQgaW4gc2NvcGUgdGhlIGNvbXBvbmVudCdzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgcHJvcGVydHkgb2Ygc2NvcGUgb2JqZWN0LiBTZWUgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLlxuICogLSBmYWNldHMgLSBtYXAgb2YgcmVmZXJlbmNlcyBvZiBhbGwgY29tcG9uZW50J3MgZmFjZXRzIChmYWNldCBuYW1lcyBhcmUgbG93ZXJjYXNlIGluIHRoaXMgbWFwKS4gQWxsIGZhY2V0cyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBvZiBjb21wb25lbnQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBmYWNldHMgKGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkgaW4gW2FsbEZhY2V0c10oI0NvbXBvbmVudCRhbGxGYWNldHMpIGNvbXBvbmVudCdzIGluc3RhbmNlIG1ldGhvZCB0aGF0IGFsbG93cyB0byBjYWxsIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgb24gYWxsIGZhY2V0cykuXG4gKiAtIGV4dHJhRmFjZXRzIC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgZmFjZXRzIHRoYXQgYXJlIGFkZGVkIHRvIGNvbXBvbmVudCBhbmQgZG8gbm90IGZvcm0gdGhlIHBhcnQgb2YgY29tcG9uZW50J3MgY2xhc3MuXG4gKiAtIF9tZXNzZW5nZXIgLSB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCdzIFttZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS4gUmFyZWx5IG5lZWRzIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYWxsIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiBtZXNlbmdlciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IG9uIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBldmVudHMjIyMjXG4gKlxuICogLSAnY2hpbGRyZW5ib3VuZCcgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjaGlsZHJlbiBvZiBET00gZWxlbWVudCB3aGljaCBjb21wbmVudCBpcyBjb25uZWN0ZWQgdG8gYXJlIGNvbm5lY3RlZCB0byBjb21wb25lbnRzLiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGVkIHdpdGggYG1pbG8uYmluZGVyYCAoYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwgYXMgYWxsIENvbXBvbmVudCBjbGFzcyBtZXRob2RzIHRoYXQgY3JlYXRlL2NvcHkgY29tcG9uZW50cyB1c2UgYG1pbG8uYmluZGVyYCBpbnRlcm5hbGx5IC0gY29tcG9uZW50IGNvbnN0cnVjdG9yIGFuZCBDb21wb25lbnQuY3JlYXRlIG1ldGhvZHMgYXJlIG5vdCB1c2VkIGluIGZyYW1ld29yayBvdXRzaWRlIG9mIGBtaWxvLmJpbmRlcmAgYW5kIHJhcmVseSBpZiBldmVyIG5lZWQgdG8gYmUgdXNlZCBpbiBhcGxpY2F0aW9uKS5cbiAqIC0gJ2FkZGVkdG9zY29wZScgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gc2NvcGUuXG4gKiAtICdzdGF0ZXJlYWR5JyAtIGF5bmNocm9ub3VzbHkgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCAodG9nZXRoZXIgd2l0aCBpdHMgc2NvcGUgY2hpbGRyZW4pIGlzIGNyZWF0ZWQgd2l0aCBbQ29tcG9uZW50LmNyZWF0ZUZyb21TdGF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlRnJvbVN0YXRlKSAob3IgYGNyZWF0ZUZyb21EYXRhVHJhbnNmZXJgKSBtZXRob2QuIENhbiBiZSBkaXNwYXRjaGVkIGJ5IGFwcGxpY2F0aW9uIGlmIHRoZSBjb21wb25lbnQncyBzdGF0ZSBpcyBzZXQgd2l0aCBzb21lIG90aGVyIG1lY2hhbmlzbS4gVGhpcyBldmVudCBpcyBub3QgdXNlZCBpbiBgbWlsb2AsIGl0IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9uIGluIHBhcnRpY3VsYXIgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQuXG4gKiAtICdnZXRzdGF0ZXN0YXJ0ZWQnIC0gZW1pdHRlZCBzeW5jaHJvbm91c2x5IGp1c3QgYmVmb3JlIGdldFN0YXRlIGV4ZWN1dGVzIHNvIGNvbXBvbmVudHMgYW5kIGZhY2V0cyBjYW4gY2xlYW4gdXAgdGhlaXIgc3RhdGUgZm9yIHNlcmlhbGl6YXRpb24uIFxuICogLSAnZ2V0c3RhdGVjb21wbGV0ZWQnIC0gZW1pdHRlZCBhc3luY2hyb25vdXNseSBhZnRlciBnZXRTdGF0ZSBleGVjdXRlcyBzbyBjb21wb25lbnRzIGFuZCBmYWNldHMgY2FuIHJlc3RvcmUgdGhlaXIgc3RhdGUgYWZ0ZXIgc2VyaWFsaXphdGlvbi5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBcImxpZmVjeWNsZVwiIyMjI1xuICpcbiAqIDEuIENvbXBvbmVudCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIENvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHNpbXBseSBjYWxscyBjb25zdHJ1Y3RvciBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCkgdGhhdCBpcyBhIHN1cGVyY2xhc3Mgb2YgQ29tcG9uZW50LiBTdWJjbGFzc2VzIG9mIENvbXBvbmVudCBzaG91bGQgbm90IGltcGxlbWVudCB0aGVpciBvd24gY29uc3RydWN0b3IsIHRoZXkgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IGBpbml0YCBtZXRob2QsIGJ1dCBtb3N0IGNvbXBvbmVudHMgZG8gbm90IG5lZWQgdG8gZG8gaXQuXG4gKiAyLiBjb25zdHJ1Y3RvcnMgYW5kIGBpbml0YCBtZXRob2RzIG9mIGFsbCBmYWNldHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gU2FtZSBhcyBjb21wb25lbnRzLCBmYWNldCBkbyBub3QgaW1wbGVtZW50IHRoZWlyIGNvbnN0cnVjdG9ycywgdGhleSBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgYGluaXRgIGFuZCBgc3RhcnRgIG1ldGhvZHMgKHNlZSBiZWxvdykuIEluc2lkZSBgaW5pdGAgbWV0aG9kIHRoZXJlIHNob3VsZCBiZSBvbmx5IGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSB3aXRob3V0IGFueSBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBpdHNlbGYgKGl0IGlzIG5vdCByZWFkeSB5ZXQpIGFuZCBvdGhlciBmYWNldHMgKGFzIHRoZXJlIGlzIG5vIHNwZWNpZmljIGZhY2V0cyBjcmVhdGlvbiBvcmRlcikuIElmIGZhY2V0IGltcGxlbWVudHMgYGluaXRgIG1ldGhvZCBpdCBNVVNUIGNhbGwgaW5oZXJpdGVkIGluaXQgd2l0aCBgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWAuXG4gKiAzLiBgaW5pdGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIEF0IHRoaXMgcG9pbnQgYWxsIGZhY2V0cyBhcmUgY3JlYXRlZCBidXQgZmFjZXRzIHN0aWxsIGNhbiBiZSBub3QgcmVhZHkgYXMgdGhleSBjYW4gaGF2ZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIGBzdGFydGAgbWV0aG9kLiBJZiBjb21wb25lbnQgc3ViY2xhc3MgaW1wbGVtZW50cyBgaW5pdGAgbWV0aG9kIGl0IE1VU1QgY2FsbCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggYDxTdXBlcmNsYXNzPi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYCwgd2hlcmUgPFN1cGVyY2xhc3M+IGlzIENvbXBvbmVudCBvciBhbm90aGVyIHN1cGVyY2xhc3MgdGhlIGNvbXBvbmVudCBpcyBhIHN1YmNsYXNzIG9mLlxuICogNC4gYGNoZWNrYCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGFkZHMgZmFjZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wb25lbnQgZGVjbGFyYXRpb24gKGJlaW5nIHBhcnQgb2YgdGhlIGNsYXNzIG9yIGV4cGxpY2l0ZWx5IGxpc3RlZCBpbiBiaW5kIGF0dHJpYnV0ZSkgYnV0IGFyZSByZXF1aXJlZCBieSBmYWNldHMgdGhhdCB0aGUgY29tcG5lbnQgYWxyZWFkeSBoYXMuIFN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbCkgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICogNS4gYHN0YXJ0YCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgYnkgQ29tcG9uZW50RmFjZXQgc3ViY2xhc3NlcyBhbmQgaXQgY2FuIGhhdmUgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIGNvbXBvbmVudCBvciBvbiBvdGhlciBmYWNldHMgdGhhdCBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiBhIGZhY2V0LiBJbmhlcml0ZWQgYHN0YXJ0YCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnQgaGUgc2FtZSB3YXkgYXMgd3JpdHRlbiBhYm92ZS5cbiAqIDYuIGBzdGFydGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIFRoaXMgY29tcG9uZW50IG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBpZiB0aGV5IG5lZWQgdG8gaGF2ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZmFjZXRzIGFuZCByZXF1aXJlcyB0aGF0IHRoZXNlIGZhY2V0cyBhcmUgZnVsbHkgaW5pYWxpemVkLiBPZnRlbiBzdWNoIGNvZGUgYWxzbyBkZXBlbmRzIG9uIGNvbXBvbmVudCdzIHNjb3BlIGNoaWxkcmVuIGFzIHdlbGwgc28gdGhpcyBjb2RlIHNob3VsZCBiZSBpbnNpZGUgYCdjaGlsZHJlbmJvdW5kJ2AgZXZlbnQgc3Vic2NyaWJlci5cbiAqIDcuICdhZGRlZHRvc2NvcGUnIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXRzIHBhcmVudCdzIHNjb3BlIG9yIHRvIHRvcCBsZXZlbCBzY29wZSBjcmVhdGVkIGJ5IGBtaWxvLmJpbmRlcmAuXG4gKiA4LiBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCAoc3RlcHMgMS02IGFib3ZlIGFyZSBmb2xsb3dlZCBmb3IgZWFjaCBjaGlsZCkuXG4gKiA5LiAnY2hpbGRyZW5ib3VuZCcgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGFsbCBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlaXIgc2NvcGUgKHNlZSBldmVudCBkZXNjcmlwdGlvbiBiZWxvdykuXG4gKiAxMC4gJ3N0YXRlcmVhZHknIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGNvbXBvbmVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGUgZnJvbSBzdGF0ZSAoc2VlIGV2ZW50IGRlc2NyaXB0aW9uIGJlbG93KS5cbiAqIDExLiBhdCB0aGlzIHBvaW50IGNvbXBvbmVudCBpcyBpbiB0aGUgXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoZW4gaXQgYW5kIGl0cyBmYWNldHMgd2lsbCBvbmx5IHJlc3BvbmQgdG8gbWVzc2FnZXMvZXZlbnRzIHRoYXQgdGhleSBzdWJzY3JpYmVkIHRvIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmVsb25nLiBJdCBpcyB1c3VhbGx5IGEgdG9wIGxldmVsIHNjb3BlIG9iamVjdCByZXR1cm5lZCBieSBgbWlsby5iaW5kZXJgIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgQ29udGFpbmVyIGZhY2V0LlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHRoYXQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjb21wb25lbnQgbmFtZSwgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGNvbXBvbmVudEluZm8gaW5zdGFuY2Ugb2YgQ29tcG9uZW50SW5mbyBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50XG4gKiAgVE9ETyB0cnkgcmVtb3ZpbmcgaXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIENvbXBvbmVudCA9IF8uY3JlYXRlU3ViY2xhc3MoRmFjZXRlZE9iamVjdCwgJ0NvbXBvbmVudCcsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudDtcblxuX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoJ0NvbXBvbmVudCcpO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBjbGFzcyBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2NyZWF0ZUNvbXBvbmVudENsYXNzXSgjQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcylcbiAqIC0gW2NyZWF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlKVxuICogLSBbY29weV0oI0NvbXBvbmVudCQkY29weSlcbiAqIC0gW2NyZWF0ZU9uRWxlbWVudF0oI0NvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50KVxuICogLSBbaXNDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNpc0NvbXBvbmVudClcbiAqIC0gW2dldENvbXBvbmVudF0oY191dGlscy5qcy5odG1sI2dldENvbXBvbmVudClcbiAqIC0gW2dldENvbnRhaW5pbmdDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNnZXRDb250YWluaW5nQ29tcG9uZW50KVxuICogLSBbY3JlYXRlRnJvbVN0YXRlXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUpXG4gKiAtIFtjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyKVxuICovXG5fLmV4dGVuZChDb21wb25lbnQsIHtcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcyxcbiAgICBjcmVhdGU6IENvbXBvbmVudCQkY3JlYXRlLFxuICAgIGNvcHk6IENvbXBvbmVudCQkY29weSxcbiAgICBjcmVhdGVPbkVsZW1lbnQ6IENvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50LFxuICAgIGlzQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5pc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGNvbXBvbmVudFV0aWxzLmdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5nZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlRnJvbURhdGFUcmFuc2ZlcjogQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXG59KTtcbmRlbGV0ZSBDb21wb25lbnQuY3JlYXRlRmFjZXRlZENsYXNzO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNDb21wb25lbnQkaW5pdClcbiAqIC0gW2NyZWF0ZUVsZW1lbnRdKCNDb21wb25lbnQkY3JlYXRlRWxlbWVudClcbiAqIC0gW2hhc0ZhY2V0XSgjQ29tcG9uZW50JGhhc0ZhY2V0KVxuICogLSBbYWRkRmFjZXRdKCNDb21wb25lbnQkYWRkRmFjZXQpXG4gKiAtIFthbGxGYWNldHNdKCNDb21wb25lbnQkYWxsRmFjZXRzKVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50JHJlbmFtZSlcbiAqIC0gW3JlbW92ZV0oI0NvbXBvbmVudCRyZW1vdmUpXG4gKiAtIFtnZXRTdGF0ZV0oI0NvbXBvbmVudCRnZXRTdGF0ZSlcbiAqIC0gW2dldFRyYW5zZmVyU3RhdGVdKCNDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSlcbiAqIC0gW3NldFN0YXRlXSgjQ29tcG9uZW50JHNldFN0YXRlKVxuICogLSBbZ2V0U2NvcGVQYXJlbnRdKCNDb21wb25lbnQkZ2V0U2NvcGVQYXJlbnQpXG4gKiAtIFtnZXRUb3BTY29wZVBhcmVudF0oI0NvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudClcbiAqIC0gW2dldFNjb3BlUGFyZW50V2l0aENsYXNzXSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKVxuICogLSBbZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3NdKCNDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MpXG4gKiAtIFt3YWxrU2NvcGVUcmVlXSgjQ29tcG9uZW50JHdhbGtTY29wZVRyZWUpXG4gKiAtIFticm9hZGNhc3RdKCNDb21wb25lbnQkYnJvYWRjYXN0KVxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudCRkZXN0cm95KVxuICogLSBbaXNEZXN0cm95ZWRdKCNDb21wb25lbnQkaXNEZXN0cm95ZWQpXG4gKlxuICpcbiAqICMjIyMjW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGNvbXBvbmVudCMjIyMjXG4gKlxuICogLSBbb25dKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvbikgLSBzaW5nbGUgc3Vic2NyaWJlXG4gKiAtIFtvZmZdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvZmYpIC0gc2luZ2xlIHVuc3Vic2NyaWJlXG4gKiAtIFtvbk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb25NZXNzYWdlcykgLSBtdWx0aXBsZSBzdWJzY3JpYmVcbiAqIC0gW29mZk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb2ZmTWVzc2FnZXMpIC0gbXVsdGlwbGUgdW5zdWJzY3JpYmVcbiAqIC0gW3Bvc3RNZXNzYWdlXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkcG9zdE1lc3NhZ2UpIC0gcG9zdCBtZXNzYWdlIG9uIGNvbXBvbmVudFxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRnZXRTdWJzY3JpYmVycykgLSBnZXQgc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudCwge1xuICAgIGluaXQ6IENvbXBvbmVudCRpbml0LFxuICAgIHN0YXJ0OiBDb21wb25lbnQkc3RhcnQsXG4gICAgY3JlYXRlRWxlbWVudDogQ29tcG9uZW50JGNyZWF0ZUVsZW1lbnQsXG4gICAgaGFzRmFjZXQ6IENvbXBvbmVudCRoYXNGYWNldCxcbiAgICBhZGRGYWNldDogQ29tcG9uZW50JGFkZEZhY2V0LFxuICAgIGFsbEZhY2V0czogQ29tcG9uZW50JGFsbEZhY2V0cyxcbiAgICByZW5hbWU6IENvbXBvbmVudCRyZW5hbWUsXG4gICAgcmVtb3ZlOiBDb21wb25lbnQkcmVtb3ZlLFxuICAgIGluc2VydEludG86IENvbXBvbmVudCRpbnNlcnRJbnRvLFxuXG4gICAgZ2V0U3RhdGU6IENvbXBvbmVudCRnZXRTdGF0ZSxcbiAgICBnZXRUcmFuc2ZlclN0YXRlOiBDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSxcbiAgICBfZ2V0U3RhdGU6IENvbXBvbmVudCRfZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IENvbXBvbmVudCRzZXRTdGF0ZSxcbiAgICBcbiAgICBnZXRTY29wZVBhcmVudDogQ29tcG9uZW50JGdldFNjb3BlUGFyZW50LFxuICAgIGdldFRvcFNjb3BlUGFyZW50OiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnQsXG4gICAgZ2V0U2NvcGVQYXJlbnRXaXRoQ2xhc3M6IENvbXBvbmVudCRnZXRTY29wZVBhcmVudFdpdGhDbGFzcyxcbiAgICBnZXRUb3BTY29wZVBhcmVudFdpdGhDbGFzczogQ29tcG9uZW50JGdldFRvcFNjb3BlUGFyZW50V2l0aENsYXNzLFxuXG4gICAgc2V0U2NvcGVQYXJlbnRGcm9tRE9NOiBDb21wb25lbnQkc2V0U2NvcGVQYXJlbnRGcm9tRE9NLFxuXG4gICAgd2Fsa1Njb3BlVHJlZTogQ29tcG9uZW50JHdhbGtTY29wZVRyZWUsXG5cbiAgICB0cmVlUGF0aE9mOiBDb21wb25lbnQkdHJlZVBhdGhPZixcbiAgICBnZXRDb21wb25lbnRBdFRyZWVQYXRoOiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBDb21wb25lbnQkaW5zZXJ0QXRUcmVlUGF0aCxcblxuICAgIGJyb2FkY2FzdDogQ29tcG9uZW50JGJyb2FkY2FzdCxcbiAgICBkZXN0cm95OiBDb21wb25lbnQkZGVzdHJveSxcbiAgICBpc0Rlc3Ryb3llZDogQ29tcG9uZW50JGlzRGVzdHJveWVkXG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBDb21wb25lbnQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChDb21wb25lbnQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9QUkVGSVggPSAneC1hcHBsaWNhdGlvbi9taWxvLWNvbXBvbmVudCc7XG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9SRUdFWCA9IC94LWFwcGxpY2F0aW9uXFwvbWlsby1jb21wb25lbnRcXC8oW2Etel8kXVswLTlhLXpfJF0qKSg/OlxcLygpKS9pO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBjb21wb25lbnQgZnJvbSB0aGUgbWFwIG9mIGNvbmZpZ3VyZWQgZmFjZXRzLlxuICogVGhpcyBtZXRob2Qgd3JhcHMgYW5kIHJlcGxhY2VzIFtgY3JlYXRlRmFjZXRlZENsYXNzYF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCNjcmVhdGVGYWNldGVkQ2xhc3MpIGNsYXNzIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0LlxuICogVW5saWtlIGNyZWF0ZUZhY2V0ZWRDbGFzcywgdGhpcyBtZXRob2QgdGFrZSBmYWNldCBjbGFzc2VzIGZyb20gcmVnaXN0cnkgYnkgdGhlaXIgbmFtZSwgc28gb25seSBtYXAgb2YgZmFjZXRzIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgcGFzc2VkLiBBbGwgZmFjZXRzIGNsYXNzZXMgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdIHwgQXJyYXlbU3RyaW5nXX0gZmFjZXRzQ29uZmlnIG1hcCBvZiBmYWNldHMgY29uZmlndXJhdGlvbi5cbiAqICBJZiBzb21lIGZhY2V0IGRvZXMgbm90IHJlcXVpcmUgY29uZmlndXJhdGlvbiwgYHVuZGVmaW5lZGAgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZhY2V0LlxuICogIElmIG5vIGZhY2V0IHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24sIHRoZSBhcnJheSBvZiBmYWNldHMgbmFtZXMgY2FuIGJlIHBhc3NlZC5cbiAqIEByZXR1cm4ge1N1YmNsYXNzKENvbXBvbmVudCl9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCQkY3JlYXRlQ29tcG9uZW50Q2xhc3MobmFtZSwgZmFjZXRzQ29uZmlnKSB7XG4gICAgLy8gY29udmVydCBhcnJheSBvZiBmYWNldCBuYW1lcyB0byBtYXAgb2YgZW1wdHkgZmFjZXRzIGNvbmZpZ3VyYXRpb25zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzQ29uZmlnKSkge1xuICAgICAgICB2YXIgY29uZmlnTWFwID0ge307XG4gICAgICAgIGZhY2V0c0NvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uKGZjdCkge1xuICAgICAgICAgICAgdmFyIGZjdE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBjb25maWdNYXBbZmN0TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZhY2V0c0NvbmZpZyA9IGNvbmZpZ01hcDtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgbWFwIG9mIGZhY2V0cyBjbGFzc2VzIGZyb20gZmFjZXRSZWdpc3RyeVxuICAgIHZhciBmYWNldHNDbGFzc2VzO1xuICAgIGlmICh0eXBlb2YgZmFjZXRzQ29uZmlnID09ICdvYmplY3QnICYmIF8ua2V5cyhmYWNldHNDb25maWcpLmxlbmd0aCkge1xuICAgICAgICBmYWNldHNDbGFzc2VzID0ge307XG4gICAgICAgIF8uZWFjaEtleShmYWNldHNDb25maWcsIGZ1bmN0aW9uKGZjdENvbmZpZywgZmN0KSB7XG4gICAgICAgICAgICB2YXIgZmN0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoZmN0KTtcbiAgICAgICAgICAgIHZhciBmY3RDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBmYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdENsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzdWJjbGFzcyBvZiBDb21wb25lbnQgdXNpbmcgbWV0aG9kIG9mIEZhY2V0ZWRPYmplY3RcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBGYWNldGVkT2JqZWN0LmNyZWF0ZUZhY2V0ZWRDbGFzcy5jYWxsKHRoaXMsIG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZyk7XG4gICAgXG4gICAgX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UobmFtZSk7XG5cbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoY2xhc3NOYW1lKSB7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKGNsYXNzTmFtZSwgQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBDb21wb25lbnRfZG9tU3RvcmFnZVBhcnNlcik7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyKGNvbXBvbmVudCkge1xuICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0ZSk7ICAgXG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VQYXJzZXIoY29tcFN0ciwgY29tcENsYXNzTmFtZSkge1xuICAgIHZhciBzdGF0ZSA9IF8uanNvblBhcnNlKGNvbXBTdHIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGUoc3RhdGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBjb21wb25lbnQgZnJvbSBbQ29tcG9uZW50SW5mb10oLi9jX2luZm8uanMuaHRtbCkgKHVzZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgYW5kIHRvIGNvcHkgY29tcG9uZW50KVxuICogQ29tcG9uZW50IG9mIGFueSByZWdpc3RlcmVkIGNsYXNzIChzZWUgW2NvbXBvbmVudHNSZWdpc3RyeV0oLi9jX3JlZ2lzdHJ5LmpzLmh0bWwpKSB3aXRoIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVyZWQgZmFjZXRzIChzZWUgW2ZhY2V0c1JlZ2lzdHJ5XSguL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpKSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGluZm9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuIEAgQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZShpbmZvLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gaW5mby5Db21wb25lbnRDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdjcmVhdGU6IGNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgZnVuY3Rpb24sIFwiJyArIHR5cGVvZiBDb21wb25lbnRDbGFzcyArICdcIiBwYXNzZWQnOyBcbiAgICAgICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudCcsIG1lc3NhZ2UsICc7dXNpbmcgYmFzZSBDb21wb25lbnQgY2xhc3MgaW5zdGVhZCcpO1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHZhciBhQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKGluZm8uc2NvcGUsIGluZm8uZWwsIGluZm8ubmFtZSwgaW5mbyk7XG5cbiAgICBpZiAoaW5mby5leHRyYUZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleShpbmZvLmV4dHJhRmFjZXRzQ2xhc3NlcywgZnVuY3Rpb24oRmFjZXRDbGFzcykge1xuICAgICAgICAgICAgaWYgKCEgYUNvbXBvbmVudC5oYXNGYWNldChGYWNldENsYXNzKSlcbiAgICAgICAgICAgICAgICBhQ29tcG9uZW50LmFkZEZhY2V0KEZhY2V0Q2xhc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gYUNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50LCBpbmNsdWRpbmcgYSBjb3B5IG9mIERPTSBlbGVtZW50LiBSZXR1cm5zIGEgY29weSBvZiBgY29tcG9uZW50YCAob2YgdGhlIHNhbWUgY2xhc3MpIHdpdGggbmV3IERPTSBlbGVtZW50IChub3QgaW5zZXJ0ZWQgaW50byBwYWdlKS5cbiAqIENvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3JpZ2luYWwgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50IGNsYXNzIG9yIHN1YmNsYXNzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBDb3B5IG9wdGlvbmFsIGB0cnVlYCB0byBtYWtlIGRlZXAgY29weSBvZiBET00gZWxlbWVudCwgb3RoZXJ3aXNlIG9ubHkgZWxlbWVudCB3aXRob3V0IGNoaWxkcmVuIGlzIGNvcGllZFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNvcHkoY29tcG9uZW50LCBkZWVwQ29weSkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICBjaGVjayhkZWVwQ29weSwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuXG4gICAgaWYgKGRlZXBDb3B5ICYmICFjb21wb25lbnQuY29udGFpbmVyKSBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVlcCBjb3B5IGNvbXBvbmVudCB3aXRob3V0IGNvbnRhaW5lciBmYWNldCcpO1xuXG4gICAgLy8gY29weSBET00gZWxlbWVudCwgdXNpbmcgRG9tIGZhY2V0IGlmIGl0IGlzIGF2YWlsYWJsZVxuICAgIHZhciBuZXdFbCA9IGNvbXBvbmVudC5kb20gXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmRvbS5jb3B5KGRlZXBDb3B5KVxuICAgICAgICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbC5jbG9uZU5vZGUoZGVlcENvcHkpO1xuXG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvbmVudCBvZiB0aGUgc2FtZSBjbGFzcyBvbiB0aGUgZWxlbWVudFxuICAgIHZhciBhQ29tcG9uZW50ID0gQ29tcG9uZW50Q2xhc3MuY3JlYXRlT25FbGVtZW50KG5ld0VsLCB1bmRlZmluZWQsIGNvbXBvbmVudC5zY29wZSwgY29tcG9uZW50LmV4dHJhRmFjZXRzKTtcbiAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuX2dldFN0YXRlKGRlZXBDb3B5IHx8IGZhbHNlKTtcbiAgICBhQ29tcG9uZW50LnNldFN0YXRlKHN0YXRlKTtcbiAgICBfLmRlZmVyTWV0aG9kKGFDb21wb25lbnQsICdicm9hZGNhc3QnLCAnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBjb21wb25lbnQgYXRhY2hlZCB0byBlbGVtZW50LiBBbGwgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQgaW5oZXJpdCB0aGlzIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGUgY2xhc3MgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoICh0aGVjb250ZXh0IG9mIHRoZSBtZXRob2QgY2FsbCkuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBvcHRpb25hbCBlbGVtZW50IHRvIGF0dGFjaCBjb21wb25lbnQgdG8uIElmIGVsZW1lbnQgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5uZXJIVE1MIG9wdGlvbmFsIGlubmVyIGh0bWwgdG8gaW5zZXJ0IGluIGVsZW1lbnQgYmVmb3JlIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgb3B0aW9uYWwgc2NvcGUgdG8gcHV0IGNvbXBvbmVudCBpbi4gSWYgbm90IHBhc3NlZCwgY29tcG9uZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQuIElmIHN1Y2ggc2NvcGUgZG9lcyBub3QgZXhpc3QsIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IGV4dHJhRmFjZXRzIGxpc3Qgb2YgZXh0cmEgZmFjZXQgdG8gYWRkIHRvIGNvbXBvbmVudFxuICogQHJldHVybiB7U3ViY2xhc3MoQ29tcG9uZW50KX1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVPbkVsZW1lbnQoZWwsIGlubmVySFRNTCwgcm9vdFNjb3BlLCBleHRyYUZhY2V0cykge1xuICAgIGNoZWNrKGlubmVySFRNTCwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG4gICAgY2hlY2socm9vdFNjb3BlLCBNYXRjaC5PcHRpb25hbChTY29wZSkpO1xuICAgIGNoZWNrKGV4dHJhRmFjZXRzLCBNYXRjaC5PcHRpb25hbChbU3RyaW5nXSkpO1xuXG4gICAgLy8gXCJ0aGlzXCIgcmVmZXJzIHRvIHRoZSBjbGFzcyBvZiBjb21wb25lbnQgaGVyZSwgYXMgdGhpcyBpcyBhIGNsYXNzIG1ldGhvZFxuICAgIGlmIChlbCAmJiBpbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGlubmVySFRNTDtcbiAgICBlbCA9IGVsIHx8IF9jcmVhdGVDb21wb25lbnRFbGVtZW50LmNhbGwodGhpcywgaW5uZXJIVE1MKTtcbiAgICByb290U2NvcGUgPSByb290U2NvcGUgfHwgX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCk7XG4gICAgdmFyIGFDb21wb25lbnQgPSBfYWRkQXR0cmlidXRlQW5kQmluZENvbXBvbmVudC5jYWxsKHRoaXMsIGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKTtcbiAgICBhQ29tcG9uZW50LmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29tcG9uZW50RWxlbWVudChpbm5lckhUTUwpIHtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgdmFyIERvbSA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnRG9tJylcbiAgICAgICAgLCBkb21GYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ2RvbScpXG4gICAgICAgICwgdGVtcGxhdGVGYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ3RlbXBsYXRlJylcbiAgICAgICAgLCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjZXRDb25maWcgJiYgdGVtcGxhdGVGYWNldENvbmZpZy50ZW1wbGF0ZTtcblxuICAgIHZhciBlbENvbmZpZyA9IHtcbiAgICAgICAgZG9tQ29uZmlnOiBkb21GYWNldENvbmZpZyxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBjb250ZW50OiBpbm5lckhUTUxcbiAgICB9O1xuXG4gICAgcmV0dXJuIERvbS5jcmVhdGVFbGVtZW50KGVsQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCkge1xuICAgIHZhciBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgZmFsc2UsICdDb250YWluZXInKTtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LmNvbnRhaW5lci5zY29wZSA6IG5ldyBTY29wZShlbCk7XG59XG5cbmZ1bmN0aW9uIF9hZGRBdHRyaWJ1dGVBbmRCaW5kQ29tcG9uZW50KGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKSB7XG4gICAgLy8gYWRkIGJpbmQgYXR0cmlidXRlIHRvIGVsZW1lbnRcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgYXR0ci5jb21wQ2xhc3MgPSB0aGlzLm5hbWU7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgLy8gc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcbiAgICBtaWxvQmluZGVyKGVsLCByb290U2NvcGUpO1xuXG4gICAgcmV0dXJuIHJvb3RTY29wZVthdHRyLmNvbXBOYW1lXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGNvbXBvbmVudCBmcm9tIGNvbXBvbmVudCBzdGF0ZSwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2xhc3MsIGV4dHJhIGZhY2V0cywgZmFjZXRzIGRhdGEgYW5kIGFsbCBzY29wZSBjaGlsZHJlbi5cbiAqIFRoaXMgaXMgdXNlZCB0byBzYXZlL2xvYWQsIGNvcHkvcGFzdGUgYW5kIGRyYWcvZHJvcCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgc3RhdGUgZnJvbSB3aGljaCBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmV3VW5pcXVlTmFtZSBvcHRpb25hbCBgdHJ1ZWAgdG8gY3JlYXRlIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIGBGYWxzZWAgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUsIHJvb3RTY29wZSwgbmV3VW5pcXVlTmFtZSwgdGhyb3dPbkVycm9ycykge1xuICAgIGNoZWNrKHN0YXRlLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe1xuICAgICAgICBjb21wTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY29tcENsYXNzOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBleHRyYUZhY2V0czogTWF0Y2guT3B0aW9uYWwoW1N0cmluZ10pLFxuICAgICAgICBmYWNldHNTdGF0ZXM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIG91dGVySFRNTDogU3RyaW5nXG4gICAgfSkpO1xuXG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcblxuICAgIC8vIGNyZWF0ZSB3cmFwcGVyIGVsZW1lbnQgb3B0aW9uYWxseSByZW5hbWluZyBjb21wb25lbnRcbiAgICB2YXIgd3JhcEVsID0gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGFsbCBjb21wb25lbnRzIGZyb20gSFRNTFxuICAgIHZhciBzY29wZSA9IG1pbG9CaW5kZXIod3JhcEVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICAvLyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY29tcG9uZW50LCBjYWxsIHRvIF9hbnkgd2lsbCByZXR1cm4gaXRcbiAgICB2YXIgY29tcG9uZW50ID0gc2NvcGUuX2FueSgpO1xuXG4gICAgLy8gc2V0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgaWYgKHJvb3RTY29wZSkge1xuICAgICAgICBjb21wb25lbnQuc2NvcGUgPSByb290U2NvcGU7XG4gICAgICAgIHJvb3RTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSBjb21wb25lbnQgc3RhdGVcbiAgICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuICAgIF8uZGVmZXJNZXRob2QoY29tcG9uZW50LCAnYnJvYWRjYXN0JywgJ3N0YXRlcmVhZHknKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7ICAgXG59XG5cblxuLy8gdXNlZCBieSBDb21wb25lbnQkJGNyZWF0ZUZyb21TdGF0ZVxuZnVuY3Rpb24gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKSB7XG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBzdGF0ZS5vdXRlckhUTUw7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY3JlYXRlIGNvbXBvbmVudDogaW5jb3JyZWN0IEhUTUwsIGVsZW1lbnRzIG51bWJlcjogJyArIGNoaWxkcmVuLmxlbmd0aCArICcgKHNob3VsZCBiZSAxKScpO1xuICAgIHZhciBjb21wRWwgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGNvbXBFbCk7XG4gICAgYXR0ci5jb21wTmFtZSA9IG5ld1VuaXF1ZU5hbWUgPyBtaWxvQ29tcG9uZW50TmFtZSgpIDogc3RhdGUuY29tcE5hbWU7XG4gICAgYXR0ci5jb21wQ2xhc3MgPSBzdGF0ZS5jb21wQ2xhc3M7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gc3RhdGUuZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgcmV0dXJuIHdyYXBFbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IGZyb20gYSBEYXRhVHJhbnNmZXIgb2JqZWN0IChpZiBwb3NzaWJsZSlcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJcbiAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBkYXRhVHJhbnNmZXIgRGF0YSB0cmFuc2ZlclxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gXy5maW5kKGRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9EQVRBX1RZUEVfUkVHRVgudGVzdCh0eXBlKTtcbiAgICB9KTtcbiAgICBpZiAoIWRhdGFUeXBlKSByZXR1cm47XG5cbiAgICB2YXIgc3RhdGUgPSBfLmpzb25QYXJzZShkYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSkpO1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgIHJldHVybiBDb21wb25lbnQuY3JlYXRlRnJvbVN0YXRlKHN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluaXRpYWxpemVzIGNvbXBvbmVudC4gQXV0b21hdGljYWxseSBjYWxsZWQgYnkgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIG9mIEZhY2V0ZWRPYmplY3QuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaGVyaXRlZCBpbml0IG1ldGhvZHM6XG4gKiBgYGBcbiAqIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSB0byB3aGljaCBjb21wb25lbnQgd2lsbCBiZWxvbmcuIEl0IGlzIHVzdWFsbHkgYSB0b3AgbGV2ZWwgc2NvcGUgb2JqZWN0IHJldHVybmVkIGJ5IGBtaWxvLmJpbmRlcmAgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBDb250YWluZXIgZmFjZXQuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzY29wZSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50SW5mb30gY29tcG9uZW50SW5mbyBpbnN0YW5jZSBvZiBDb21wb25lbnRJbmZvIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiBjb21wb25lbnRcbiAqICBUT0RPIHRyeSByZW1vdmluZyBpdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5pdChzY29wZSwgZWxlbWVudCwgbmFtZSwgY29tcG9uZW50SW5mbykge1xuICAgIC8vIGNyZWF0ZSBET00gZWxlbWVudCBpZiBpdCB3YXNuJ3QgcGFzc2VkIHRvIENvbnN0cnVjdG9yXG4gICAgdGhpcy5lbCA9IGVsZW1lbnQgfHwgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG5cbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gY29tcG9uZW50IG9uIERPTSBlbGVtZW50XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb21wb25lbnQgYWxyZWFkeSBhdGFjaGVkXG4gICAgICAgIHZhciBlbENvbXAgPSB0aGlzLmVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgICAgICBpZiAoZWxDb21wKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvbXBvbmVudCAnICsgbmFtZSArICcgYXR0YWNoZWQgdG8gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGNvbXBvbmVudCAnICsgZWxDb21wLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuZWxbY29uZmlnLmNvbXBvbmVudFJlZl0gPSB0aGlzO1xuICAgIH1cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGNvbXBvbmVudEluZm86IGNvbXBvbmVudEluZm8sXG4gICAgICAgIGV4dHJhRmFjZXRzOiBbXVxuICAgIH0sIF8uRU5VTSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIC8vIGNyZWF0ZSBjb21wb25lbnQgbWVzc2VuZ2VyXG4gICAgdmFyIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1lc3Nlbmdlcik7XG5cbiAgICAvLyBjaGVjayBhbGwgZmFjZXRzIGRlcGVuZGVuY2llcyAocmVxdWlyZWQgZmFjZXRzKVxuICAgIHRoaXMuYWxsRmFjZXRzKCdjaGVjaycpO1xuXG4gICAgLy8gc3RhcnQgYWxsIGZhY2V0c1xuICAgIHRoaXMuYWxsRmFjZXRzKCdzdGFydCcpO1xuXG4gICAgLy8gY2FsbCBzdGFydCBtZXRob2QgaWYgaXQncyBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgaWYgKHRoaXMuc3RhcnQpIHRoaXMuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIFRoaXMgaXMgYSBzdHViIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aGV0aGVyIHRoZSBtZXRob2Qgb2Ygc3VwZXJjbGFzcyBzaG91bGQgYmUgY2FsbGVkIGluIHN1YmNsYXNzZXNcbiAqIFRoZSBzdGFydCBtZXRob2Qgb2Ygc3ViY2xhc3MgaW5zdGFuY2UgaXMgY2FsbGVkIG9uY2UgYWxsIHRoZSBmYWNldHMgYXJlIGNyZWF0ZWQsIGluaXRpYWxpemVkIGFuZCBzdGFydGVkIChzZWUgYWJvdmUpXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzdGFydCgpIHt9XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5pdGlhbGl6ZXMgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBjb21wb25lbnQgaXMgYm91bmQgdG9cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGUgRE9NIGFuZFxuICogd2lsbCBnZW5lcmF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50LlxuICogXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkY3JlYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICB0aGlzLmVsID0gdGhpcy5kb21cbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoKVxuICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICByZXR1cm4gdGhpcy5lbDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgaGFzIGZhY2V0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZhY2V0TmFtZU9yQ2xhc3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRoYXNGYWNldChmYWNldE5hbWVPckNsYXNzKSB7XG4gICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UodHlwZW9mIGZhY2V0TmFtZU9yQ2xhc3MgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZXROYW1lT3JDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWNldE5hbWVPckNsYXNzKTtcblxuICAgIHZhciBmYWNldCA9IHRoaXNbZmFjZXROYW1lXTtcbiAgICBpZiAoISBmYWNldCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY2V0KVxuICAgICAgICBsb2dnZXIud2FybignZXhwZWN0ZWQgZmFjZXQnLCBmYWNldE5hbWUsICdidXQgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlJyk7XG5cbiAgICByZXR1cm4gISEgZmFjZXQ7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBmYWNldCB3aXRoIGdpdmVuIG5hbWUgb3IgY2xhc3MgdG8gdGhlIGluc3RhbmNlIG9mIENvbXBvbmVudCAob3IgaXRzIHN1YmNsYXNzKS5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd8U3ViY2xhc3MoQ29tcG9uZW50KX0gZmFjZXROYW1lT3JDbGFzcyBuYW1lIG9mIGZhY2V0IGNsYXNzIG9yIHRoZSBjbGFzcyBpdHNlbGYuIElmIG5hbWUgaXMgcGFzc2VkLCB0aGUgY2xhc3Mgd2lsbCBiZSByZXRpcmV2ZWQgZnJvbSBmYWNldHNSZWdpc3RyeVxuICogQHBhcmFtIHtPYmplY3R9IGZhY2V0Q29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWUgb3B0aW9uYWwgZmFjZXQgbmFtZS4gQWxsb3dzIHRvIGFkZCBmYWNldCB1bmRlciBhIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGFkZEZhY2V0KGZhY2V0TmFtZU9yQ2xhc3MsIGZhY2V0Q29uZmlnLCBmYWNldE5hbWUsIHRocm93T25FcnJvcnMpIHtcbiAgICBjaGVjayhmYWNldE5hbWVPckNsYXNzLCBNYXRjaC5PbmVPZihTdHJpbmcsIE1hdGNoLlN1YmNsYXNzKENvbXBvbmVudEZhY2V0KSkpO1xuICAgIGNoZWNrKGZhY2V0Q29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgICBjaGVjayhmYWNldE5hbWUsIE1hdGNoLk9wdGlvbmFsKFN0cmluZykpO1xuXG4gICAgdmFyIEZhY2V0Q2xhc3M7XG4gICAgLy8gaWYgb25seSBuYW1lIHBhc3NlZCwgcmV0cmlldmUgZmFjZXQgY2xhc3MgZnJvbSByZWdpc3RyeVxuICAgIGlmICh0eXBlb2YgZmFjZXROYW1lT3JDbGFzcyA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXRDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZU9yQ2xhc3MpO1xuICAgICAgICBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZhY2V0Q2xhc3NOYW1lKTtcbiAgICB9IGVsc2UgXG4gICAgICAgIEZhY2V0Q2xhc3MgPSBmYWNldE5hbWVPckNsYXNzO1xuXG4gICAgaWYgKCFmYWNldE5hbWUpXG4gICAgICAgIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIHRoaXMuZXh0cmFGYWNldHMucHVzaChmYWNldE5hbWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0IHVzaW5nIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0XG4gICAgdmFyIG5ld0ZhY2V0ID0gRmFjZXRlZE9iamVjdC5wcm90b3R5cGUuYWRkRmFjZXQuY2FsbCh0aGlzLCBGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIC8vIGNoZWNrIGRlcGVuZWRlbmNpZXMgYW5kIHN0YXJ0IGZhY2V0XG4gICAgaWYgKG5ld0ZhY2V0LmNoZWNrKSBuZXdGYWNldC5jaGVjaygpO1xuICAgIGlmIChuZXdGYWNldC5zdGFydCkgbmV3RmFjZXQuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2QuXG4gKiBFbnZva2UgZ2l2ZW4gbWV0aG9kIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBvbiBhbGwgZmFjZXRzLlxuICogUmV0dXJucyB0aGUgbWFwIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhbGwgZmFjZXRzLiBJZiB0aGUgZmFjZXQgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QgaXQgaXMgc2ltcGx5IG5vdCBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIHdpbGwgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgbWV0aG9kIG5hbWUgdG8gZW52b2tlIG9uIHRoZSBmYWNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkYWxsRmFjZXRzKG1ldGhvZCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgcmV0dXJuIF8ubWFwS2V5cyh0aGlzLmZhY2V0cywgZnVuY3Rpb24oZmFjZXQsIGZjdE5hbWUpIHtcbiAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldFttZXRob2RdID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXRbbWV0aG9kXS5hcHBseShmYWNldCwgYXJncyk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBuYW1lIG9mIGNvbXBvbmVudCwgXG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG1pbG9Db21wb25lbnROYW1lKCk7XG4gICAgdGhpcy5jb21wb25lbnRJbmZvLnJlbmFtZShuYW1lLCBmYWxzZSk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gaXRzIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlc2VydmVTY29wZVByb3BlcnR5IHRydWUgbm90IHRvIGRlbGV0ZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW1vdmUocHJlc2VydmVTY29wZVByb3BlcnR5LCBxdWlldCkge1xuICAgIGlmICh0aGlzLnNjb3BlKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuX3JlbW92ZSh0aGlzLm5hbWUsIHF1aWV0KTtcbiAgICAgICAgaWYgKCEgcHJlc2VydmVTY29wZVByb3BlcnR5KVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NvcGU7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluc2VydHMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBET00gYW5kIGF0dGVtcHRzIHRvIGFkanVzdCB0aGUgc2NvcGUgdHJlZSBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudEVsICAgIFRoZSBlbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VFbCAob3B0aW9uYWwpIFRoZSByZWZlcmVuY2UgZWxlbWVudCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5zZXJ0SW50byhwYXJlbnRFbCwgcmVmZXJlbmNlRWwpIHtcbiAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUodGhpcy5lbCwgcmVmZXJlbmNlRWwpO1xuICAgIHRoaXMuc2V0U2NvcGVQYXJlbnRGcm9tRE9NKCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIFJldHVybnMgY29tcG9uZW50IHN0YXRlXG4gKlxuICogQHRoaXMge0NvbXBvbmVudH0gY29tcG9uZW50IHdoaWNoIHN0YXRlIHdpbGwgYmUgc2F2ZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFN0YXRlKCkge1xuICAgIHRoaXMuYnJvYWRjYXN0KCdnZXRzdGF0ZXN0YXJ0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICBzdGF0ZS5vdXRlckhUTUwgPSB0aGlzLmVsLm91dGVySFRNTDtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdicm9hZGNhc3QnLCAnZ2V0c3RhdGVjb21wbGV0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGU7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIElmIGNvbXBvbmVudCBoYXMgW1RyYW5zZmVyXSguL2NfZmFjZXRzL1RyYW5zZmVyLmpzLmh0bWwpIGZhY2V0IG9uIGl0LCB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgc3RhdGUgZnJvbSB0aGlzIGZhY2V0XG4gKiBSZXR1cm5zIGNvbXBvbmVudCBzdGF0ZVxuICpcbiAqIEB0aGlzIHtDb21wb25lbnR9IGNvbXBvbmVudCB3aGljaCBzdGF0ZSB3aWxsIGJlIHNhdmVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLiBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFRyYW5zZmVyU3RhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNmZXIuZ2V0U3RhdGUob3B0aW9ucylcbiAgICAgICAgICAgIDogdGhpcy5nZXRTdGF0ZShvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudFxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5nZXRTdGF0ZWAgYW5kIGJ5IFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSBmYWxzZSB0byBnZXQgc2hhbGxvdyBzdGF0ZSBmcm9tIGFsbCBmYWNldHMgKHRydWUgYnkgZGVmYXVsdClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JF9nZXRTdGF0ZShkZWVwU3RhdGUpe1xuXG4gICAgdmFyIGZhY2V0c1N0YXRlcyA9IHRoaXMuYWxsRmFjZXRzKCdnZXRTdGF0ZScsIGRlZXBTdGF0ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpO1xuICAgIGZhY2V0c1N0YXRlcyA9IF8uZmlsdGVyS2V5cyhmYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAhISBmY3RTdGF0ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBleHRyYUZhY2V0czogdGhpcy5leHRyYUZhY2V0cyxcbiAgICAgICAgZmFjZXRzU3RhdGVzOiBmYWNldHNTdGF0ZXNcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgc3RhdGUgb2YgY29tcG9uZW50LlxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGVgIGFuZCBieSBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHN0YXRlIHRvIHNldCB0aGUgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYWNldHNTdGF0ZXMpXG4gICAgICAgIF8uZWFjaEtleShzdGF0ZS5mYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlLCBmY3ROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmFjZXQgPSB0aGlzW2ZjdE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldC5zZXRTdGF0ZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZhY2V0LnNldFN0YXRlKGZjdFN0YXRlKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgc2NvcGUgcGFyZW50IG9mIGEgY29tcG9uZW50LlxuICogSWYgYGNvbmRpdGlvbk9yRmFjZXRgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbiBpbW1lZGlhdGUgcGFyZW50IHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgY2xvc2VzdCBhbmNlc3RvciB3aXRoIGEgc3BlY2lmaWVkIGZhY2V0IG9yIHBhc3NpbmcgY29uZGl0aW9uIHRlc3QuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICByZXR1cm4gX2NhbGxHZXRTY29wZVBhcmVudC5jYWxsKHRoaXMsIF9nZXRTY29wZVBhcmVudCwgY29uZGl0aW9uT3JGYWNldCk7XG59XG5cbmZ1bmN0aW9uIF9jYWxsR2V0U2NvcGVQYXJlbnQoX2dldFNjb3BlUGFyZW50RnVuYywgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBjb21wb25lbnRVdGlscy5fbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgcmV0dXJuIF9nZXRTY29wZVBhcmVudEZ1bmMuY2FsbCh0aGlzLCBjb25kaXRpb25GdW5jKTsgICBcbn1cblxuZnVuY3Rpb24gX2dldFNjb3BlUGFyZW50KGNvbmRpdGlvbkZ1bmMpIHtcbiAgICB2YXIgcGFyZW50O1xuICAgIHRyeSB7IHBhcmVudCA9IHRoaXMuc2NvcGUuX2hvc3RPYmplY3Qub3duZXI7IH0gY2F0Y2goZSkge31cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGNvbXBvbmVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMocGFyZW50KSApXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNjb3BlIHBhcmVudCB3aXRoIGEgZ2l2ZW4gY2xhc3MsIHdpdGggc2FtZSBjbGFzcyBpZiBub3Qgc3BlY2lmaWVkXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBDb21wb25lbnRDbGFzcyBjb21wb25lbnQgY2xhc3MgdGhhdCB0aGUgcGFyZW50IHNob3VsZCBoYXZlLCBzYW1lIGNsYXNzIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKENvbXBvbmVudENsYXNzKSB7XG4gICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnRDbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBfZ2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wIGluc3RhbmNlb2YgQ29tcG9uZW50Q2xhc3M7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBwYXJlbnQgb2YgYSBjb21wb25lbnQuXG4gKiBJZiBgY29uZGl0aW9uT3JGYWNldGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3Btb3N0IHNjb3BlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHRvcG1vc3QgYW5jZXN0b3Igd2l0aCBhIHNwZWNpZmllZCBmYWNldCBvciBwYXNzaW5nIGNvbmRpdGlvbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudChjb25kaXRpb25PckZhY2V0KSB7XG4gICAgcmV0dXJuIF9jYWxsR2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBfZ2V0VG9wU2NvcGVQYXJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VG9wU2NvcGVQYXJlbnQoY29uZGl0aW9uRnVuYykge1xuICAgIHZhciB0b3BQYXJlbnRcbiAgICAgICAgLCBwYXJlbnQgPSB0aGlzO1xuICAgIGRvIHtcbiAgICAgICAgcGFyZW50ID0gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHRvcFBhcmVudCA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRvcFBhcmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2NvcGUgcGFyZW50IHdpdGggYSBnaXZlbiBjbGFzcywgd2l0aCBzYW1lIGNsYXNzIGlmIG5vdCBzcGVjaWZpZWRcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IENvbXBvbmVudENsYXNzIGNvbXBvbmVudCBjbGFzcyB0aGF0IHRoZSBwYXJlbnQgc2hvdWxkIGhhdmUsIHNhbWUgY2xhc3MgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MoQ29tcG9uZW50Q2xhc3MpIHtcbiAgICBDb21wb25lbnRDbGFzcyA9IENvbXBvbmVudENsYXNzIHx8IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIF9nZXRUb3BTY29wZVBhcmVudC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgcmV0dXJuIGNvbXAgaW5zdGFuY2VvZiBDb21wb25lbnRDbGFzcztcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEZpbmRzIHNjb3BlIHBhcmVudCBvZiBjb21wb25lbnQgdXNpbmcgRE9NIHRyZWUgKHVubGlrZSBnZXRTY29wZVBhcmVudCB0aGF0IHNpbXBseSBnb2VzIHVwIHRoZSBzY29wZSB0cmVlKS5cbiAqIFdoaWxlIGdldFNjb3BlUGFyZW50IGlzIGZhc3RlciBpdCBtYXkgZmFpbCBpZiBzY29wZSBjaGFpbiBpcyBub3Qgc2V0dXAgeWV0IChlLmcuLCB3aGVuIGNvbXBvbmVudCBoYXMgYmVlbiBqdXN0IGluc2VydGVkKS5cbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnQgd2lsbCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHNjb3BlIG9iamVjdCBvZiBjb250YWluZXIgZmFjZXQgb2YgdGhhdCBwYXJlbnQuXG4gKiBSZXR1cm5lZCBzY29wZSBwYXJlbnQgb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVuZGVmaW5lZCAoYXMgd2VsbCBhcyBjb21wb25lbnQncyBzY29wZSBwcm9wZXJ0eSkgaWYgbm8gcGFyZW50IGluIHRoZSBET00gdHJlZSBoYXMgY29udGFpbmVyIGZhY2V0LlxuICogVE9ETyBNZXRob2Qgd2lsbCBub3QgYmluZCBET00gY2hpbGRyZW4gY29ycmVjdGx5IGlmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIGZhY2V0LlxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JHNldFNjb3BlUGFyZW50RnJvbURPTSgpIHtcbiAgICB2YXIgcGFyZW50RWwgPSB0aGlzLmVsLnBhcmVudE5vZGU7XG5cbiAgICB2YXIgcGFyZW50LCBmb3VuZFBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50RWwgJiYgISBmb3VuZFBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHBhcmVudEVsKTtcbiAgICAgICAgZm91bmRQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlKCk7IC8vIHJlbW92ZSBjb21wb25lbnQgZnJvbSBpdHMgY3VycmVudCBzY29wZSAoaWYgaXQgaXMgZGVmaW5lZClcbiAgICBpZiAoZm91bmRQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yZW5hbWUodW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHBhcmVudC5jb250YWluZXIuc2NvcGUuX2FkZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9ICAgICAgICBcbn1cblxuXG4vKipcbiAqIFdhbGtzIGNvbXBvbmVudCB0cmVlLCBjYWxsaW5nIHByb3ZpZGVkIGNhbGxiYWNrIG9uIGVhY2ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcGFyYW0gdGhpc0FyZ1xuICovXG5mdW5jdGlvbiBDb21wb25lbnQkd2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcyk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHRoaXMuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnQud2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50JHRyZWVQYXRoT2YoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGRvbVV0aWxzLnRyZWVQYXRoT2YodGhpcy5lbCwgY29tcG9uZW50LmVsKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCh0cmVlUGF0aCwgbmVhcmVzdCkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgodGhpcy5lbCwgdHJlZVBhdGgsIG5lYXJlc3QpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIENvbXBvbmVudCRpbnNlcnRBdFRyZWVQYXRoKHRyZWVQYXRoLCBjb21wb25lbnQsIG5lYXJlc3QpIHtcbiAgICB2YXIgd2FzSW5zZXJ0ZWQgPSBkb21VdGlscy5pbnNlcnRBdFRyZWVQYXRoKHRoaXMuZWwsIHRyZWVQYXRoLCBjb21wb25lbnQuZWwpO1xuICAgIGlmICh3YXNJbnNlcnRlZCkgY29tcG9uZW50LnNldFNjb3BlUGFyZW50RnJvbURPTSgpO1xuICAgIHJldHVybiB3YXNJbnNlcnRlZDtcbn1cblxuXG4vKipcbiAqIEJyb2FkY2FzdCBtZXNzYWdlIHRvIGNvbXBvbmVudCBhbmQgdG8gYWxsIGl0cyBzY29wZSBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbXNnIG1lc3NhZ2UgdG8gYmUgc2VudFxuICogQHBhcmFtIHtbQW55XX0gZGF0YSBvcHRpb25hbCBtZXNzYWdlIGRhdGFcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSBzeW5jaHJvbm91c2x5IGlmIGl0IHNob3VsZCB1c2UgcG9zdE1lc3NhZ2VTeW5jXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRicm9hZGNhc3QobXNnLCBkYXRhLCBjYWxsYmFjaywgc3luY2hyb25vdXNseSkge1xuICAgIHZhciBwb3N0TWV0aG9kID0gc3luY2hyb25vdXNseSA/ICdwb3N0TWVzc2FnZVN5bmMnIDogJ3Bvc3RNZXNzYWdlJztcbiAgICB0aGlzLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudFtwb3N0TWV0aG9kXShtc2csIGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY29tcG9uZW50OiByZW1vdmVzIGNvbXBvbmVudCBmcm9tIERPTSwgcmVtb3ZlcyBpdCBmcm9tIHNjb3BlLCBkZWxldGVzIGFsbCByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYWxsIG1lc3NhZ2VzIGJvdGggY29tcG9uZW50IGFuZCBhbGwgZmFjZXRzXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRkZXN0cm95KHF1aWV0KSB7XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybignQ29tcG9uZW50IGRlc3Ryb3k6IGNvbXBvbmVudCBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKGZhbHNlLCBxdWlldCk7XG4gICAgdGhpcy5hbGxGYWNldHMoJ2Rlc3Ryb3knKTtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgIGRvbVV0aWxzLmRldGFjaENvbXBvbmVudCh0aGlzLmVsKTtcbiAgICAgICAgZG9tVXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50SW5mby5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgd2FzIGRlc3Ryb3llZFxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudC5GYWNldGBcbiAqXG4gKiBUaGUgY2xhc3MgZm90IHRoZSBmYWNldCBvZiBjb21wb25lbnQuIFdoZW4gYSBjb21wb25lbnQgaXMgY3JlYXRlZCwgaXRcbiAqIGNyZWF0ZXMgYWxsIGl0cyBmYWNldHMuXG4gKlxuICogU2VlIEZhY2V0cyBzZWN0aW9uIG9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBmYWNldHMgYW5kIG9uXG4gKiBob3cgdG8gY3JlYXRlIG5ldyBmYWNldHMgY2xhc3Nlcy5cbiAqXG4gKiAtIENvbXBvbmVudCAtIGJhc2ljIGNvbXBwb25lbnQgY2xhc3NcbiAqIC0gQ29tcG9uZW50RmFjZXQgLSBiYXNpY1xuICovXG5cbnZhciBGYWNldCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKEZhY2V0LCAnQ29tcG9uZW50RmFjZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRGYWNldDtcblxuXG4vKipcbiAqIHBvc3REb21QYXJlbnRcbiAqXG4gKiBJZiBmYWNldCBoYXMgRE9NIHBhcmVudCBmYWNldCAoc2VlIGBkb21QYXJlbnRgIG1ldGhvZCksIHBvc3RzIHRoZSBtZXNzYWdlIHRvIHRoaXMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZURhdGFcbiAqL1xudmFyIHBvc3REb21QYXJlbnQgPSBfLnBhcnRpYWwoX3Bvc3RQYXJlbnQsIGRvbVBhcmVudCk7XG5cbi8qKlxuICogcG9zdFNjb3BlUGFyZW50XG4gKlxuICogSWYgZmFjZXQgaGFzIHNjb3BlIHBhcmVudCBmYWNldCAoc2VlIGBzY29wZVBhcmVudGAgbWV0aG9kKSwgcG9zdHMgdGhlIG1lc3NhZ2UgdG8gdGhpcyBmYWNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlRGF0YVxuICovXG52YXIgcG9zdFNjb3BlUGFyZW50ID0gXy5wYXJ0aWFsKF9wb3N0UGFyZW50LCBzY29wZVBhcmVudCk7XG5cblxuXy5leHRlbmRQcm90byhDb21wb25lbnRGYWNldCwge1xuICAgIGluaXQ6IENvbXBvbmVudEZhY2V0JGluaXQsXG4gICAgc3RhcnQ6IENvbXBvbmVudEZhY2V0JHN0YXJ0LFxuICAgIGNoZWNrOiBDb21wb25lbnRGYWNldCRjaGVjayxcbiAgICBkZXN0cm95OiBDb21wb25lbnRGYWNldCRkZXN0cm95LFxuICAgIG9uQ29uZmlnTWVzc2FnZXM6IENvbXBvbmVudEZhY2V0JG9uQ29uZmlnTWVzc2FnZXMsXG4gICAgZG9tUGFyZW50OiBkb21QYXJlbnQsXG4gICAgcG9zdERvbVBhcmVudDogcG9zdERvbVBhcmVudCxcbiAgICBzY29wZVBhcmVudDogc2NvcGVQYXJlbnQsXG4gICAgcG9zdFNjb3BlUGFyZW50OiBwb3N0U2NvcGVQYXJlbnQsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBkaXNwYXRjaFNvdXJjZU1lc3NhZ2U6IGRpc3BhdGNoU291cmNlTWVzc2FnZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY3JlYXRlTWVzc2FnZVNvdXJjZTogX2NyZWF0ZU1lc3NhZ2VTb3VyY2UsXG4gICAgX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJOiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUElcbn0pO1xuXG5fLmV4dGVuZChDb21wb25lbnRGYWNldCwge1xuICAgIHJlcXVpcmVzRmFjZXQ6IHJlcXVpcmVzRmFjZXRcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoQ29tcG9uZW50RmFjZXQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vLyBpbml0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2VuZ2VyKCk7XG59XG5cblxuLy8gc29tZSBzdWJjbGFzc2VzIChlLmcuIE1vZGVsRmFjZXQpIG92ZXJycmlkZSB0aGlzIG1ldGhvZCBhbmQgZG8gbm90IGNyZWF0ZSB0aGVpciBvd24gbWVzc2VuZ2VyXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2VuZ2VyKCl7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG5ldyBNZXNzZW5nZXIodGhpcykpO1xufVxuXG5cbi8vIHN0YXJ0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZXNzYWdlcylcbiAgICAgICAgdGhpcy5vbkNvbmZpZ01lc3NhZ2VzKHRoaXMuY29uZmlnLm1lc3NhZ2VzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnRGYWNldCRvbkNvbmZpZ01lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJUeXBlID0gdHlwZW9mIHN1YnNjcmliZXI7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHRUeXBlID0gdHlwZW9mIHN1YnNjcmliZXIuY29udGV4dDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNvbnRleHQgPT0gdGhpcy5uYW1lIHx8IHN1YnNjcmliZXIuY29udGV4dCA9PSAnZmFjZXQnKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmliZXIuY29udGV4dCA9PSAnb3duZXInKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5vd25lclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCBpbiBjb25maWd1cmF0aW9uOiAnICsgc3Vic2NyaWJlci5jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBjb250ZXh0VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gc3Vic2NyaWJlciB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBzdWJzY3JpYmVyVHlwZSk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vLyBjaGVja0RlcGVuZGVuY2llc1xuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkY2hlY2soKSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZSkge1xuICAgICAgICB0aGlzLnJlcXVpcmUuZm9yRWFjaChmdW5jdGlvbihyZXFGYWNldCkge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5vd25lci5oYXNGYWNldChyZXFGYWNldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vd25lci5hZGRGYWNldChyZXFGYWNldCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBkZXN0cm95cyBmYWNldFxuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldKSB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBkb21QYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgRE9NIGVsZW1lbnQsIHRoYXQgaGFzIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZmFjZXQgY2xhc3MgYXR0YWNoZWQgdG8gaXQuIElmIHN1Y2ggZWxlbWVudCBkb2Vzbid0IGV4aXN0IG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGRvbVBhcmVudCgpIHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID0gY29tcG9uZW50VXRpbHMuZ2V0Q29udGFpbmluZ0NvbXBvbmVudCh0aGlzLm93bmVyLmVsLCBmYWxzZSwgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudFt0aGlzLm5hbWVdO1xufVxuXG5cbi8qKlxuICogc2NvcGVQYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgdGhpc2AgZmFjZXQgb2YgdGhlIGNsb3Nlc3Qgc2NvcGUgcGFyZW50IChpLmUuLCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gaXRzIGNvbnRhaW5lciBmYWNldCkuXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnRbdGhpcy5uYW1lXTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFBhcmVudChnZXRQYXJlbnRNZXRob2QsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgIHZhciBwYXJlbnRGYWNldCA9IGdldFBhcmVudE1ldGhvZC5jYWxsKHRoaXMpO1xuICAgIGlmIChwYXJlbnRGYWNldClcbiAgICAgICAgcGFyZW50RmFjZXQucG9zdE1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5nZXRNZXNzYWdlU291cmNlKCk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlU291cmNlKCkuZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVNZXNzYWdlU291cmNlKE1lc3NhZ2VTb3VyY2VDbGFzcywgb3B0aW9ucykge1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IE1lc3NhZ2VTb3VyY2VDbGFzcyh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoTWVzc2FnZVNvdXJjZUNsYXNzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBvcHRpb25zKSB7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2FnZVNvdXJjZUNsYXNzKHRoaXMsIHVuZGVmaW5lZCwgbWVzc2VuZ2VyQVBJT3JDbGFzcywgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1aXJlc0ZhY2V0KGZhY2V0TmFtZSkge1xuICAgIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIEZhY2V0IENsYXNzXG4gICAgdmFyIGZhY2V0UmVxdWlyZSA9IHRoaXMucHJvdG90eXBlLnJlcXVpcmU7XG5cbiAgICByZXR1cm4gZmFjZXRSZXF1aXJlICYmIChmYWNldFJlcXVpcmUuaW5kZXhPZihfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZSkpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZhY2V0UmVxdWlyZS5pbmRleE9mKF8uZmlyc3RMb3dlckNhc2UoZmFjZXROYW1lKSkgPj0gMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0NvbnRhaW5lcicpYFxuICogQSBzcGVjaWFsIGNvbXBvbmVudCBmYWNldCB0aGF0IG1ha2VzIGNvbXBvbmVudCBjcmVhdGUgaXRzIG93biBpbm5lciBzY29wZS5cbiAqIFdoZW4gW21pbG8uYmluZGVyXSguLi8uLi9iaW5kZXIuanMuaHRtbCkgYmluZHMgRE9NIHRyZWUgYW5kIGNyZWF0ZXMgY29tcG9uZW50cywgaWYgY29tcG9uZW50cyBhcmUgaW5zaWRlIGNvbXBvbmVudCBXSVRIIENvbnRhaW5lciBmYWNldCwgdGhleSBhcmUgcHV0IG9uIHRoZSBgc2NvcGVgIG9mIGl0IChjb21wb25lbnQuY29udGFpbmVyLnNjb3BlIC0gc2VlIFtTY29wZV0oLi4vc2NvcGUuanMuaHRtbCkpLCBvdGhlcndpc2UgdGhleSBhcmUgcHV0IG9uIHRoZSBzYW1lIHNjb3BlIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGRlZXBlciBpbiBET00gdHJlZS5cbiAqIEl0IGFsbG93cyBjcmVhdGluZyBuYW1lc3BhY2VzIGF2b2lkaW5nIGNvbXBvbmVudHMgbmFtZXMgY29uZmxpY3RzLCBhdCB0aGUgc2FtZSB0aW1lIGNyZWF0aW5nIG1vcmUgc2hhbGxvdyBjb21wb25lbnRzIHRyZWUgdGhhbiB0aGUgRE9NIHRyZWUuXG4gKiBUbyBjcmVhdGUgY29tcG9uZW50cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5jb250YWluZXIuYmluZGVyKCk7XG4gKiBgYGBcbiAqIFNlZSBbbWlsby5iaW5kZXJdKC4uLy4uL2JpbmRlci5qcy5odG1sKVxuICovXG52YXIgQ29udGFpbmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0NvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogIyMjI0NvbnRhaW5lciBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2JpbmRlcl0oI0NvbnRhaW5lciRiaW5kZXIpIC0gY3JlYXRlIGNvbXBvbmVudHMgZnJvbSBET00gaW5zaWRlIHRoZSBjdXJyZW50IG9uZVxuICovXG5fLmV4dGVuZFByb3RvKENvbnRhaW5lciwge1xuICAgIHN0YXJ0OiBDb250YWluZXIkc3RhcnQsXG4gICAgcGF0aDogQ29udGFpbmVyJHBhdGgsXG4gICAgZ2V0U3RhdGU6IENvbnRhaW5lciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogQ29udGFpbmVyJHNldFN0YXRlLFxuICAgIGJpbmRlcjogQ29udGFpbmVyJGJpbmRlcixcbiAgICBkZXN0cm95OiBDb250YWluZXIkZGVzdHJveSxcbiAgICB1bndyYXA6IENvbnRhaW5lciR1bndyYXAsXG5cbiAgICBhcHBlbmQ6IENvbnRhaW5lciRhcHBlbmQsXG4gICAgaW5zZXJ0QmVmb3JlOiBDb250YWluZXIkaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZTogQ29udGFpbmVyJHJlbW92ZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb250YWluZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5lcjtcblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTY2FucyBET00sIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgYWRkcyB0byBzY29wZSBjaGlsZHJlbiBvZiBjb21wb25lbnQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGJpbmRlcigpIHtcbiAgICByZXR1cm4gbWlsb0JpbmRlcih0aGlzLm93bmVyLmVsLCB0aGlzLnNjb3BlLCBmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0dXAgZW1wdHkgc2NvcGUgb2JqZWN0IG9uIHN0YXJ0XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMub3duZXIuZWwsIHRoaXMpO1xufVxuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTYWZlbHkgdHJhdmVyc2VzIGNvbXBvbmVudCBzY29wZVxuICogUmV0dXJucyBjb21wb25lbnQgaW4gc2NvcGUgZm9yIGEgZ2l2ZW4gcGF0aFxuICogSWYgcGF0aCBpcyBpbnZhbGlkIHRoZSBtZXRob2Qgd2lsbCB0aHJvdywgaWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IGF0IGEgZ2l2ZW4gcGF0aCBvciBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFsb25nIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgQ29udGFpbmVyIGZhY2V0IHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLCBcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCBvZiBjaGlsZCBjb21wb25lbnQgaW4gc2NvcGUsIGVhY2ggbmFtZSBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLicsIGUuZy46ICcuY2hpbGQuc3ViY2hpbGQnXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRwYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAocGF0aFswXSB8fCBsZW4gPCAyKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYXRoW2ldO1xuICAgICAgICBpZiAoIWFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgICAgIGlmICghY29tcC5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29tcCA9IGNvbXAuY29udGFpbmVyLnNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG5cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQYXRoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggJyArIHBhdGggKyAnIGlzIGludmFsaWQnKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGluIHRoZSBzY29wZVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcENvcHkgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRnZXRTdGF0ZShkZWVwQ29weSkge1xuICAgIHZhciBzdGF0ZSA9IHsgc2NvcGU6IHt9IH07XG4gICAgaWYgKGRlZXBDb3B5ICE9PSBmYWxzZSlcbiAgICAgICAgdGhpcy5zY29wZS5fZWFjaChmdW5jdGlvbihjb21wb25lbnQsIGNvbXBOYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY29wZVtjb21wTmFtZV0gPSBjb21wb25lbnQuX2dldFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNldHMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHNjb3BlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICBfLmVhY2hLZXkoc3RhdGUuc2NvcGUsIGZ1bmN0aW9uKGNvbXBEYXRhLCBjb21wTmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5zY29wZVtjb21wTmFtZV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUoY29tcERhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignY29tcG9uZW50IFwiJyArIGNvbXBOYW1lICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHNjb3BlJyk7XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRkZXN0cm95KCkge1xuICAgIHRoaXMuc2NvcGUuX2VhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY29wZS5fZGV0YWNoRWxlbWVudCgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBNb3ZlcyBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciBpbnRvIHRoZSBwYXJlbnQgc2NvcGVcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBwYXNzIGZhbHNlIHRvIG5vdCByZW5hbWUgc2NvcGUgY2hpbGRyZW4gKGRlZmF1bHQgaXMgdHJ1ZSlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzdHJveSBJZiBub3QgZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCAoZGVmYXVsdCBpcyB0cnVlKS5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJHVud3JhcChyZW5hbWVDaGlsZHJlbiwgZGVzdHJveSkge1xuICAgIGRvbVV0aWxzLnVud3JhcEVsZW1lbnQodGhpcy5vd25lci5lbCk7XG4gICAgdGhpcy5zY29wZSAmJiB0aGlzLnNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuICE9PSBmYWxzZSkgY2hpbGQucmVuYW1lKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLm93bmVyLnNjb3BlICYmIHRoaXMub3duZXIuc2NvcGUuX2FkZChjaGlsZCk7XG4gICAgfSwgdGhpcyk7XG4gICAgaWYgKGRlc3Ryb3kgIT09IGZhbHNlKSB0aGlzLm93bmVyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEFwcGVuZCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXAgY29tcG9uZW50IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkYXBwZW5kKGNvbXApIHtcbiAgICB0aGlzLnNjb3BlLl9hZGQoY29tcCk7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChjb21wLmVsKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZSBiZWZvcmUgYW5vdGhlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzaWJsaW5nIGNvbXBvbmVudCBiZWZvcmUgd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGluc2VydEJlZm9yZShjb21wLCBzaWJsaW5nKSB7XG4gICAgdGhpcy5zY29wZS5fYWRkKGNvbXApO1xuICAgIHRoaXMuZWwuaW5zZXJ0QmVmb3JlKGNvbXAuZWwsIHNpYmxpbmcgJiYgc2libGluZy5lbCk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRyZW1vdmUoY29tcCkge1xuICAgIHRoaXMuc2NvcGUuX3JlbW92ZShjb21wKTtcbiAgICB0aGlzLm93bmVyLmVsLnJlbW92ZUNoaWxkKGNvbXAuZWwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcblxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRGF0YU1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGF0YScpXG4gICAgLCBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGVfZGF0YScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBwYXRoVXRpbHMgPSBNb2RlbC5fdXRpbHMucGF0aFxuICAgICwgbW9kZWxVdGlscyA9IE1vZGVsLl91dGlscy5tb2RlbFxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSBNb2RlbC5fdXRpbHMuY2hhbmdlRGF0YUhhbmRsZXJcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgc2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuc2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEYXRhJylgXG4gKiBGYWNldCB0byBnaXZlIGFjY2VzcyB0byBET00gZGF0YVxuICovXG52YXIgRGF0YSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEYXRhJyk7XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZHNcbiAqXG4gKiAtIFtzdGFydF0oI0RhdGEkc3RhcnQpIC0gc3RhcnQgRGF0YSBmYWNldFxuICogLSBbZ2V0XSgjRGF0YSRnZXQpIC0gZ2V0IERPTSBkYXRhIGZyb20gRE9NIHRyZWVcbiAqIC0gW3NldF0oI0RhdGEkc2V0KSAtIHNldCBET00gZGF0YSB0byBET00gdHJlZVxuICogLSBbcGF0aF0oI0RhdGEkcGF0aCkgLSBnZXQgcmVmZXJlbmNlIHRvIERhdGEgZmFjZXQgYnkgcGF0aFxuICovXG5fLmV4dGVuZFByb3RvKERhdGEsIHtcbiAgICBzdGFydDogRGF0YSRzdGFydCxcbiAgICBnZXRTdGF0ZTogRGF0YSRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogRGF0YSRzZXRTdGF0ZSxcblxuICAgIGdldDogRGF0YSRnZXQsXG4gICAgc2V0OiBEYXRhJHNldCxcbiAgICBkZWw6IERhdGEkZGVsLFxuICAgIHNwbGljZTogRGF0YSRzcGxpY2UsXG4gICAgbGVuOiBEYXRhJGxlbixcbiAgICBwYXRoOiBEYXRhJHBhdGgsXG4gICAgZ2V0UGF0aDogRGF0YSRnZXRQYXRoLFxuICAgIGdldEtleTogRGF0YSRnZXRLZXksXG5cbiAgICBfZ2V0OiBEYXRhJF9nZXQsXG4gICAgX3NldDogRGF0YSRfc2V0LFxuICAgIF9kZWw6IERhdGEkX2RlbCxcbiAgICBfc3BsaWNlOiBEYXRhJF9zcGxpY2UsXG4gICAgX2xlbjogRGF0YSRfbGVuLFxuXG4gICAgX3NldFNjYWxhclZhbHVlOiBEYXRhJF9zZXRTY2FsYXJWYWx1ZSxcbiAgICBfZ2V0U2NhbGFyVmFsdWU6IERhdGEkX2dldFNjYWxhclZhbHVlLFxuICAgIF9idWJibGVVcERhdGFDaGFuZ2U6IERhdGEkX2J1YmJsZVVwRGF0YUNoYW5nZSxcbiAgICBfcXVldWVEYXRhQ2hhbmdlOiBEYXRhJF9xdWV1ZURhdGFDaGFuZ2UsXG4gICAgX3Bvc3REYXRhQ2hhbmdlczogRGF0YSRfcG9zdERhdGFDaGFuZ2VzLFxuICAgIF9wcmVwYXJlTWVzc2FnZVNvdXJjZTogX3ByZXBhcmVNZXNzYWdlU291cmNlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERhdGEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGE7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBEYXRhIHByb3RvdHlwZVxuICovXG5bJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWwuUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShEYXRhLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cblxuLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHdyYXBwZWQgdG8gc3VwcG9ydCBcIipcIiBwYXR0ZXJuIHN1YnNjcmlwdGlvbnNcbnZhciBwcm94eURhdGFTb3VyY2VNZXRob2RzID0ge1xuICAgICAgICAvLyB2YWx1ZTogJ3ZhbHVlJyxcbiAgICAgICAgdHJpZ2dlcjogJ3RyaWdnZXInXG4gICAgfTtcblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgRGF0YSBmYWNldFxuICogQ2FsbGVkIGJ5IGNvbXBvbmVudCBhZnRlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIERhdGEkc3RhcnQoKSB7XG4gICAgLy8gY2hhbmdlIG1lc3NlbmdlciBtZXRob2RzIHRvIHdvcmsgd2l0aCBcIipcIiBzdWJzY3JpcHRpb25zIChsaWtlIE1vZGVsIGNsYXNzKVxuICAgIHBhdGhVdGlscy53cmFwTWVzc2VuZ2VyTWV0aG9kcy5jYWxsKHRoaXMpO1xuXG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBnZXQvc2V0IG1ldGhvZHMgdG8gc2V0IGRhdGEgb2YgZWxlbWVudFxuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3ModGhpcy5vd25lci5lbCk7XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlc1F1ZXVlID0gW107XG5cbiAgICB0aGlzLl9wcmVwYXJlTWVzc2FnZVNvdXJjZSgpO1xuXG4gICAgLy8gc3RvcmUgZmFjZXQgZGF0YSBwYXRoXG4gICAgdGhpcy5fcGF0aCA9ICcuJyArIHRoaXMub3duZXIubmFtZTtcblxuICAgIC8vIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAvLyBwcmVwYXJlIGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzXG4gICAgLy8gdGhpcy5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBET00gZXZlbnQgYW5kIGFjY2Vzc29ycycgbWVzc2FnZXNcbiAgICB0aGlzLm9uU3luYygnJywgb25Pd25EYXRhQ2hhbmdlKTtcblxuICAgIC8vIG1lc3NhZ2UgdG8gbWFyayB0aGUgZW5kIG9mIGJhdGNoIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgdGhpcy5vblN5bmMoJ2RhdGFjaGFuZ2VzZmluaXNoZWQnLCBvbkRhdGFDaGFuZ2VzRmluaXNoZWQpO1xuXG4gICAgLy8gY2hhbmdlcyBpbiBzY29wZSBjaGlsZHJlbiB3aXRoIERhdGEgZmFjZXRcbiAgICB0aGlzLm9uU3luYygnY2hpbGRkYXRhJywgb25DaGlsZERhdGEpO1xuXG4gICAgLy8gdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzIG9mIERhdGEgZmFjZXQuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBEYXRhIGZhY2V0IGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG4vLyBmdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gRGF0YSBmYWNldCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIC8vIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbi8vICAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuLy8gICAgICAgICBfbWVzc2VuZ2VyOiBleHRlcm5hbE1lc3Nlbmdlcixcbi8vICAgICAgICAgX2ludGVybmFsTWVzc2VuZ2VyOiBpbnRlcm5hbE1lc3NlbmdlclxuLy8gICAgIH0pO1xuLy8gfVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIERPTUV2ZW50c1NvdXJjZSBhbmQgY29ubmVjdHMgaXQgdG8gRGF0YSBmYWNldCBtZXNzZW5nZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgdmFyIGRhdGFBUEkgPSBuZXcgRGF0YU1zZ0FQSSh0aGlzLm93bmVyKVxuICAgICAgICAsIGRhdGFFdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHByb3h5RGF0YVNvdXJjZU1ldGhvZHMsIGRhdGFBUEksIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZGF0YUV2ZW50c1NvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZGF0YUV2ZW50c1NvdXJjZScsIGRhdGFFdmVudHNTb3VyY2UpO1xuXG4gICAgLy8gbWFrZSB2YWx1ZSBtZXRob2Qgb2YgRGF0YU1zZ0FQSSBhdmFpbGFibGUgb24gRGF0YSBmYWNldFxuICAgIC8vIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCwgZ2V0KCkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGRhdGEuXG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKGRhdGFBUEksICd2YWx1ZScsICd2YWx1ZScsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnVHlwZSBpbiB0aGlzIGluc3RhbmNlIHdpbGwgYmUgJydcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGRhdGEgY2hhbmdlIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uT3duRGF0YUNoYW5nZShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5fYnViYmxlVXBEYXRhQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMuX3F1ZXVlRGF0YUNoYW5nZShkYXRhKTtcbiAgICBpZiAoZGF0YS5wYXRoID09PSAnJykge1xuICAgICAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhkYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSgnZGF0YWNoYW5nZXNmaW5pc2hlZCcsIHsgdHJhbnNhY3Rpb246IGluVHJhbnNhY3Rpb24gfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNlbmRzIGRhdGEgYG1lc3NhZ2VgIHRvIERPTSBwYXJlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1zZ0RhdGEgZGF0YSBjaGFuZ2UgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBEYXRhJF9idWJibGVVcERhdGFDaGFuZ2UobXNnRGF0YSkge1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgdmFyIHBhcmVudE1zZyA9IF8uY2xvbmUobXNnRGF0YSk7XG4gICAgICAgIHBhcmVudE1zZy5wYXRoID0gKHRoaXMuX3BhdGggfHwgKCcuJyArIHRoaXMub3duZXIubmFtZSkpICArIHBhcmVudE1zZy5wYXRoO1xuICAgICAgICBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdjaGlsZGRhdGEnLCBwYXJlbnRNc2cgfHwgbXNnRGF0YSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFF1ZXVlcyBkYXRhIG1lc3NhZ2VzIHRvIGJlIGRpc3BhdGNoZWQgdG8gY29ubmVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGFuZ2UgZGF0YSBjaGFuZ2UgZGVzY3JpcHRpb25cbiAqL1xuZnVuY3Rpb24gRGF0YSRfcXVldWVEYXRhQ2hhbmdlKGNoYW5nZSkge1xuICAgIHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucHVzaChjaGFuZ2UpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhY2hhbmdlc2ZpbmlzaGVkIGV2ZW50LlxuICogQ2FsbHMgdGhlIG1ldGhvZCB0byBwb3N0IGNoYW5nZXMgYmF0Y2ggYW5kIGJ1YmJsZXMgdXAgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBkYXRhIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb25EYXRhQ2hhbmdlc0ZpbmlzaGVkKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX3Bvc3REYXRhQ2hhbmdlcyhkYXRhLmluVHJhbnNhY3Rpb24pO1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuICAgIGlmIChwYXJlbnREYXRhKSBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdkYXRhY2hhbmdlc2ZpbmlzaGVkJywgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFsbCBjaGFuZ2VzIGNvbGxlY3RlZCBpbiB0aGUgYmF0Y2hcbiAqIFVzZWQgZm9yIGRhdGEgcHJvcGFnYXRpb24gLSBjb25uZWN0b3Igc3Vic2NyaWJlcyB0byB0aGlzIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBEYXRhJF9wb3N0RGF0YUNoYW5nZXMoaW5UcmFuc2FjdGlvbikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucmV2ZXJzZSgpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHtcbiAgICAgICAgY2hhbmdlczogcXVldWUsXG4gICAgICAgIHRyYW5zYWN0aW9uOiBpblRyYW5zYWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXNRdWV1ZSA9IFtdOyAvLyBpdCBjYW4ndCBiZSAubGVuZ3RoID0gMCwgYXMgdGhlIGFjdHVhbCBhcnJheSBtYXkgc3RpbGwgYmUgdXNlZFxufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudCBpbiBjaGlsZCBEYXRhIGZhY2V0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2dUeXBlXG4gKiBAcGFyYW0ge09iZWpjdH0gZGF0YSBkYXRhIGNoYW5nZSBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBvbkNoaWxkRGF0YShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShkYXRhLnBhdGgsIGRhdGEpO1xuICAgIHRoaXMuX2J1YmJsZVVwRGF0YUNoYW5nZShkYXRhKTtcbiAgICB0aGlzLl9xdWV1ZURhdGFDaGFuZ2UoZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBkYXRhIGluIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHkuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhY3R1YWxseSBzZXQgKGNhbiBiZSBkaWZmZXJlbnQsIGlmIGNvbXBvbmVudHMgbWF0Y2hpbmcgc29tZSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuIElmIHRoZSB2YWx1ZSBpZiBzY2FsYXIsIGl0IHdpbGwgYmUgc2V0IG9uIGNvbXBvbmVudCdzIGVsZW1lbnQsIGlmIHRoZSB2YWx1ZSBpcyBvYmplY3QgLSBvbiBET00gdHJlZSBpbnNpZGUgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtPYmplY3R8U3RyaW5nfE51bWJlcn1cbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJHNldCk7XG5cbiAgICB2YXIgY29tcG9uZW50U2V0dGVyID0gdGhpcy5jb25maWcuc2V0O1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50U2V0dGVyID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBvbmVudFNldHRlci5jYWxsKHRoaXMub3duZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodGhpcy5fc2V0LCBpblRyYW5zYWN0aW9uKTtcblxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLl9zZXQodmFsdWUpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zZXQpO1xuXG4gICAgdmFyIHZhbHVlU2V0O1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlU2V0ID0gW107XG5cbiAgICAgICAgICAgIHZhciBsaXN0RmFjZXQgPSB0aGlzLm93bmVyLmxpc3Q7XG4gICAgICAgICAgICBpZiAobGlzdEZhY2V0KXtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdExlbmd0aCA9IGxpc3RGYWNldC5jb3VudCgpXG4gICAgICAgICAgICAgICAgICAgICwgbmV3SXRlbXNDb3VudCA9IHZhbHVlLmxlbmd0aCAtIGxpc3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1zQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX2FkZEl0ZW1zKG5ld0l0ZW1zQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhsaXN0TGVuZ3RoLCBsaXN0RmFjZXQuY291bnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihjaGlsZFZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZERhdGEuY2FsbCh0aGlzLCB2YWx1ZVNldCwgY2hpbGRWYWx1ZSwgaW5kZXgsICdbJCRdJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdENvdW50ID0gbGlzdEZhY2V0LmNvdW50KClcbiAgICAgICAgICAgICAgICAgICAgLCByZW1vdmVDb3VudCA9IGxpc3RDb3VudCAtIHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVDb3VudC0tID4gMClcbiAgICAgICAgICAgICAgICAgICAgbGlzdEZhY2V0Ll9yZW1vdmVJdGVtKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogc2V0dGluZyBhcnJheSBkYXRhIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTZXQgPSB7fTtcbiAgICAgICAgICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oY2hpbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2V0Q2hpbGREYXRhLmNhbGwodGhpcywgdmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgJy4kJCcpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdmFsdWVTZXQgPSB0aGlzLl9zZXRTY2FsYXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlU2V0O1xuXG4gICAgcmV0dXJuIHZhbHVlU2V0O1xuXG5cbiAgICBmdW5jdGlvbiBzZXRDaGlsZERhdGEodmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSk7XG4gICAgICAgIHZhciBjaGlsZERhdGFGYWNldCA9IHRoaXMucGF0aChjaGlsZFBhdGgsIHR5cGVvZiBjaGlsZFZhbHVlICE9ICd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKGNoaWxkRGF0YUZhY2V0KSB7XG4gICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcoY2hpbGREYXRhRmFjZXQuc2V0LCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIHZhbHVlU2V0W2tleV0gPSBjaGlsZERhdGFGYWNldC5zZXQoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyBjb21wb25lbnQgZnJvbSB2aWV3IGFuZCBzY29wZSwgb25seSBpbiBjYXNlIGl0IGhhcyBJdGVtIGZhY2V0IG9uIGl0XG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBzZXQgdG8gRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gRGF0YSRkZWwoKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoRGF0YSRkZWwpO1xuXG4gICAgdmFyIGNvbXBvbmVudERlbGV0ZSA9IHRoaXMuY29uZmlnLmRlbDtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudERlbGV0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjb21wb25lbnREZWxldGUuY2FsbCh0aGlzLm93bmVyKTtcbiAgICAgICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9kZWwsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX2RlbCgpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobXNnLCBpblRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCcnLCBtc2cpO1xufVxuXG5cbmZ1bmN0aW9uIERhdGEkX2RlbCgpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9kZWwpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3NldCgpO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgc2NhbGFyIHZhbHVlIHRvIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIERhdGEkX3NldFNjYWxhclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLnNldCh0aGlzLm93bmVyLmVsLCB2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0IHN0cnVjdHVyZWQgZGF0YSBmcm9tIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHlcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBHZXQgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0KGRlZXBHZXQpIHtcbiAgICB2YXIgY29tcG9uZW50R2V0dGVyID0gdGhpcy5jb25maWcuZ2V0O1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50R2V0dGVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBjb21wb25lbnRHZXR0ZXIuY2FsbCh0aGlzLm93bmVyLCBkZWVwR2V0KTtcblxuICAgIHJldHVybiB0aGlzLl9nZXQoZGVlcEdldCk7XG59XG5cbmZ1bmN0aW9uIERhdGEkX2dldChkZWVwR2V0KSB7XG4gICAgaWYgKGRlZXBHZXQgPT09IGZhbHNlKSAvLyBhIGhhY2sgdG8gZW5hYmxlIGdldHRpbmcgc2hhbGxvdyBzdGF0ZVxuICAgICAgICByZXR1cm47XG5cbiAgICB2YXIgY29tcCA9IHRoaXMub3duZXJcbiAgICAgICAgLCBzY29wZURhdGE7XG5cbiAgICBpZiAoY29tcC5saXN0KSB7XG4gICAgICAgIHNjb3BlRGF0YSA9IFtdO1xuICAgICAgICBjb21wLmxpc3QuZWFjaChmdW5jdGlvbihsaXN0SXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHNjb3BlRGF0YVtpbmRleF0gPSBsaXN0SXRlbS5kYXRhLmdldCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29tcC5jb250YWluZXIpXG4gICAgICAgICAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihzY29wZUl0ZW0sIG5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoISBjb21wLmxpc3QuY29udGFpbnMoc2NvcGVJdGVtKSAmJiBzY29wZUl0ZW0uZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVEYXRhW25hbWVdID0gc2NvcGVJdGVtLmRhdGEuZ2V0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGNvbXAuY29udGFpbmVyKSB7XG4gICAgICAgIHNjb3BlRGF0YSA9IHt9O1xuICAgICAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihzY29wZUl0ZW0sIG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChzY29wZUl0ZW0uZGF0YSlcbiAgICAgICAgICAgICAgICBzY29wZURhdGFbbmFtZV0gPSBzY29wZUl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlXG4gICAgICAgIHNjb3BlRGF0YSA9IHRoaXMuX2dldFNjYWxhclZhbHVlKCk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHNjb3BlRGF0YTtcblxuICAgIHJldHVybiBzY29wZURhdGE7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0cyBzY2FsYXIgZGF0YSBmcm9tIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRGF0YSRfZ2V0U2NhbGFyVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLmdldCh0aGlzLm93bmVyLmVsKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTcGxpY2VzIExpc3QgaXRlbXMuIFJlcXVpcmVzIExpc3QgZmFjZXQgdG8gYmUgcHJlc2VudCBvbiBjb21wb25lbnQuIFdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyBhcnJheSBzcGxpY2UuXG4gKiBSZXR1cm5zIGRhdGEgcmV0cmlldmVkIGZyb20gcmVtb3ZlZCBpdGVtc1xuICpcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3BsaWNlSW5kZXggaW5kZXggdG8gZGVsZXRlL2luc2VydCBhdFxuICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VIb3dNYW55IG51bWJlciBvZiBpdGVtcyB0byBkZWxldGVcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGl0ZW1zIHRvIGluc2VydFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIERhdGEkc3BsaWNlKHNwbGljZUluZGV4LCBzcGxpY2VIb3dNYW55KSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoRGF0YSRzcGxpY2UpO1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB2YXIgY29tcG9uZW50U3BsaWNlID0gdGhpcy5jb25maWcuc3BsaWNlO1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50U3BsaWNlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gY29tcG9uZW50U3BsaWNlLmFwcGx5KHRoaXMub3duZXIsIGFyZ3VtZW50cyk7XG4gICAgICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgaW5UcmFuc2FjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRoaXMuX3NwbGljZSwgaW5UcmFuc2FjdGlvbik7XG4gICAgcmVzdWx0ID0gdGhpcy5fc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgdmFyIG1zZyA9IHsgcGF0aDogJycsIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgICAgICAgICAgIGluZGV4OiByZXN1bHQuc3BsaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZDogcmVzdWx0LnJlbW92ZWQsXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogcmVzdWx0LmFkZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMuX3ZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiByZXN1bHQucmVtb3ZlZDtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zcGxpY2UpO1xuXG4gICAgdmFyIGxpc3RGYWNldCA9IHRoaXMub3duZXIubGlzdDtcbiAgICBpZiAoISBsaXN0RmFjZXQpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignRGF0YTogY2Fubm90IHVzZSBzcGxpY2UgbWV0aG9kIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuXG4gICAgdmFyIHJlbW92ZWQgPSBbXTtcblxuICAgIHZhciBsaXN0TGVuZ3RoID0gbGlzdEZhY2V0LmNvdW50KCk7XG4gICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPVxuICAgICAgICBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsaXN0TGVuZ3RoKTtcblxuICAgIGlmIChzcGxpY2VIb3dNYW55ID4gMCAmJiBsaXN0TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gc3BsaWNlSW5kZXg7IGkgPCBzcGxpY2VJbmRleCArIHNwbGljZUhvd01hbnk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShzcGxpY2VJbmRleCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3JlbW92ZUl0ZW0oc3BsaWNlSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4JywgaSk7XG5cbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChpdGVtRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhzcGxpY2VJbmRleCwgbGlzdEZhY2V0LmNvdW50KCkpO1xuICAgIH1cblxuICAgIHZhciBhZGRlZCA9IFtdO1xuXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICwgYWRkSXRlbXMgPSBhcmdzTGVuID4gMlxuICAgICAgICAsIGFkZGVkQ291bnQgPSBhcmdzTGVuIC0gMjtcbiAgICBpZiAoYWRkSXRlbXMpIHtcbiAgICAgICAgbGlzdEZhY2V0Ll9hZGRJdGVtcyhhZGRlZENvdW50LCBzcGxpY2VJbmRleCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAyLCBqID0gc3BsaWNlSW5kZXg7IGkgPCBhcmdzTGVuOyBpKyssIGorKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShqKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKGl0ZW0uZGF0YS5zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5zZXQoYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBwYXRocyBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgYW5kIGl0ZW1zIGFmdGVyIHRoZW1cbiAgICAgICAgbGlzdEZhY2V0Ll91cGRhdGVEYXRhUGF0aHMoc3BsaWNlSW5kZXgsIGxpc3RGYWNldC5jb3VudCgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAvLyAgICAgXy5wcmVwZW5kQXJyYXkoYWRkZWQsIFtzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueV0pO1xuICAgIC8vICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX3ZhbHVlLCBhZGRlZCk7XG4gICAgLy8gfSBlbHNlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNwbGljZUluZGV4OiBzcGxpY2VJbmRleCxcbiAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhZGRlZENvdW50IDogMFxuICAgIH07XG59XG5cblxuZnVuY3Rpb24gRGF0YSRsZW4oKSB7XG4gICAgdmFyIGNvbXBvbmVudExlbiA9IHRoaXMuY29uZmlnLmxlbjtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudExlbiA9PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gY29tcG9uZW50TGVuLmNhbGwodGhpcy5vd25lcik7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdGhpcy5fbGVuKCk7XG59XG5cblxuZnVuY3Rpb24gRGF0YSRfbGVuKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmxpc3QpIHJldHVybiB0aGlzLm93bmVyLmxpc3QuY291bnQoKTtcbiAgICBlbHNlIGxvZ2dlci5lcnJvcignRGF0YTogbGVuIGNhbGxlZCB3aXRob3V0IGxpc3QgZmFjZXQnKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRhdGEgZmFjZXQgb2YgYSBjaGlsZCBjb21wb25lbnQgKGJ5IHNjb3BlcykgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggZGF0YSBhY2Nlc3MgcGF0aFxuICovXG5mdW5jdGlvbiBEYXRhJHBhdGgoYWNjZXNzUGF0aCwgY3JlYXRlSXRlbSkge1xuICAgIC8vIGNyZWF0ZUl0ZW0gPSB0cnVlOyAvLyB0aGlzIGhhY2sgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lZWRlZC4uLlxuXG4gICAgaWYgKCEgYWNjZXNzUGF0aClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoYWNjZXNzUGF0aCk7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZFBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gcGFyc2VkUGF0aFtpXVxuICAgICAgICAgICAgLCBub2RlS2V5ID0gcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5KHBhdGhOb2RlKTtcbiAgICAgICAgaWYgKHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknICYmIGN1cnJlbnRDb21wb25lbnQubGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1Db21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50Lmxpc3QuaXRlbShub2RlS2V5KTtcbiAgICAgICAgICAgIGlmICghIGl0ZW1Db21wb25lbnQgJiYgY3JlYXRlSXRlbSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5saXN0Ll9hZGRJdGVtKG5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIGl0ZW1Db21wb25lbnQuZGF0YS5fcGF0aCA9IHBhdGhOb2RlLnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGl0ZW1Db21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudC5jb250YWluZXIpXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5jb250YWluZXIuc2NvcGVbbm9kZUtleV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnREYXRhRmFjZXQgPSBjdXJyZW50Q29tcG9uZW50ICYmIGN1cnJlbnRDb21wb25lbnQuZGF0YTtcbiAgICAgICAgaWYgKCEgY3VycmVudERhdGFGYWNldClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RGF0YUZhY2V0O1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgcGF0aCB0byBhY2Nlc3MgdGhpcyBkYXRhIGZhY2V0IGZyb20gcGFyZW50ICh1c2luZyBwYXRoIG1ldGhvZClcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGtleSB0byBhY2Nlc3MgdGhlIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBkYXRhIGZhY2V0IG9uIHRoZSB2YWx1ZSByZWxhdGVkIHRvIHBhcmVudCBkYXRhIGZhY2V0LlxuICogSWYgY29tcG9uZW50IGhhcyBMaXN0IGZhY2V0LCByZXR1cm5zIGluZGV4XG4gKlxuICogQHJldHVybiB7U3RyaW5nfEludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0S2V5KCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5fcGF0aDtcbiAgICByZXR1cm4gcGF0aFswXSA9PSAnWydcbiAgICAgICAgICAgID8gK3BhdGguc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBcIltcIiBhbmQgXCJdXCJcbiAgICAgICAgICAgIDogcGF0aC5zbGljZSgxKSAvLyByZW1vdmUgbGVhZGluZyBcIi5cIlxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0U3RhdGUoZGVlcFN0YXRlKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMuZ2V0KGRlZXBTdGF0ZSkgfTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLnNldChzdGF0ZS5zdGF0ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKSBcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIEJpbmRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuLi8uLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRG9tJylgXG4gKiBGYWNldCB3aXRoIGNvbXBvbmVudCByZWxhdGVkIGRvbSB1dGlsc1xuICovXG52YXIgRG9tID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RvbScpO1xuXG5fLmV4dGVuZChEb20sIHtcbiAgICBjcmVhdGVFbGVtZW50OiBEb20kJGNyZWF0ZUVsZW1lbnRcbn0pO1xuXG5cbi8qKlxuICogRmFjZXQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBhIHBhc3NlZCBjb25maWd1YXRpb24gb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgd2l0aCB0aGUgcHJvcGVydGllcyBgZG9tQ29uZmlnYCwgYGNvbnRlbnRgLCBgdGVtcGxhdGVgXG4gKiBAcmV0dXJuIHtFbGVtZW50fSBhbiBodG1sIGVsZW1lbnQgXG4gKi9cbmZ1bmN0aW9uIERvbSQkY3JlYXRlRWxlbWVudChjb25maWcpIHtcbiAgICB2YXIgZG9tQ29uZmlnID0gY29uZmlnLmRvbUNvbmZpZyB8fCB7fVxuICAgICAgICAsIHRhZ05hbWUgPSBkb21Db25maWcudGFnTmFtZSB8fCAnZGl2J1xuICAgICAgICAsIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICAgICAgICAsIGNvbnRlbnQgPSBjb25maWcuY29udGVudFxuICAgICAgICAsIHRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuXG4gICAgLy8gVE9ETyBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuL2lmIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWRcbiAgICAvLyBTaG91bGQgYmUgc29tZXByb3BlcnR5IG9uIGVsZW1lbnQgdG8gaW5kaWNhdGUgaXQncyBiZWVuIGNhbGxlZD9cbiAgICBfYXBwbHlDb25maWdUb0VsZW1lbnQobmV3RWwsIGRvbUNvbmZpZyk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKVxuICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlKSh7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RWw7XG59XG5cblxuZnVuY3Rpb24gX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCBjb25maWcpIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGNvbmZpZyAmJiBjb25maWcuY2xzXG4gICAgICAgICwgY29uZmlnQXR0cmlidXRlcyA9IGNvbmZpZyAmJiBjb25maWcuYXR0cmlidXRlcztcblxuICAgIGlmIChjb25maWdBdHRyaWJ1dGVzKVxuICAgICAgICBfLmVhY2hLZXkoY29uZmlnQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0clZhbHVlLCBhdHRyTmFtZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgIGlmIChjc3NDbGFzc2VzKVxuICAgICAgICBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgJ2FkZCcsIGNzc0NsYXNzZXMpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRG9tLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIHRvZ2dsZTogdG9nZ2xlLFxuICAgIGRldGFjaDogZGV0YWNoLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgYXBwZW5kQ2hpbGRyZW46IGFwcGVuZENoaWxkcmVuLFxuICAgIHByZXBlbmRDaGlsZHJlbjogcHJlcGVuZENoaWxkcmVuLFxuICAgIGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICBhcHBlbmRUb1Njb3BlUGFyZW50OiBhcHBlbmRUb1Njb3BlUGFyZW50LFxuICAgIGNoaWxkcmVuOiBEb20kY2hpbGRyZW4sXG4gICAgc2V0U3R5bGU6IHNldFN0eWxlLFxuICAgIHNldFN0eWxlczogc2V0U3R5bGVzLFxuICAgIGNvcHk6IGNvcHksXG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgIGFkZENzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ2FkZCcpLFxuICAgIHJlbW92ZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3JlbW92ZScpLFxuICAgIHRvZ2dsZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3RvZ2dsZScpLFxuXG4gICAgZmluZDogZmluZCxcbiAgICBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uOiBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uLFxuICAgIGhhc1RleHRBZnRlclNlbGVjdGlvbjogaGFzVGV4dEFmdGVyU2VsZWN0aW9uLFxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEb20pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcblxuXG4vLyBzdGFydCBEb20gZmFjZXRcbmZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWw7XG4gICAgX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCB0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGN1cnJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVxuICAgIHRoaXMuX3Zpc2libGUgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnO1xufVxuXG4vLyBzaG93IEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG59XG5cbi8vIGhpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8vIHNob3cvaGlkZVxuZnVuY3Rpb24gdG9nZ2xlKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fdmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGRvU2hvdztcbiAgICB2YXIgZWwgPSB0aGlzLm93bmVyLmVsO1xuXG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IGRvU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICByZXR1cm4gZG9TaG93O1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VDc3NDbGFzc2VzKG1ldGhvZE5hbWUsIGNzc0NsYXNzZXMsIGVuZm9yY2UpIHtcbiAgICBfYXR0YWNoQ3NzQ2xhc3Nlcyh0aGlzLm93bmVyLmVsLCBtZXRob2ROYW1lLCBjc3NDbGFzc2VzLCBlbmZvcmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgbWV0aG9kTmFtZSwgY3NzQ2xhc3NlcywgZW5mb3JjZSkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBlbC5jbGFzc0xpc3RcbiAgICAgICAgLCBkb1RvZ2dsZSA9IG1ldGhvZE5hbWUgPT0gJ3RvZ2dsZSc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjc3NDbGFzc2VzKSlcbiAgICAgICAgY3NzQ2xhc3Nlcy5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjc3NDbGFzc2VzID09ICdzdHJpbmcnKVxuICAgICAgICBjYWxsTWV0aG9kKGNzc0NsYXNzZXMpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGUgb2YgQ1NTIGNsYXNzZXMgcGFyYW1ldGVyJyk7XG5cbiAgICBmdW5jdGlvbiBjYWxsTWV0aG9kKGNzc0Nscykge1xuICAgICAgICBkb1RvZ2dsZVxuICAgICAgICAgICAgLy8gT25seSBwYXNzICdlbmZvcmNlJyBpZiBhIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkIChUaGUgJ3RvZ2dsZScgZnVuY3Rpb24gb2YgdGhlIGNsYXNzTGlzdCB3aWxsIHRyZWF0IHVuZGVmaW5lZCA9PT0gZmFsc2UgcmVzdWx0aW5nIGluIG9ubHkgYWxsb3dpbmcgY2xhc3NlcyB0byBiZSByZW1vdmVkKVxuICAgICAgICAgICAgPyBlbmZvcmNlID09PSB1bmRlZmluZWQgPyBjbGFzc0xpc3RbbWV0aG9kTmFtZV0oY3NzQ2xzKSA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMsIGVuZm9yY2UpXG4gICAgICAgICAgICA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpICBcbiAgICAgICAgZG9tVXRpbHMuZGV0YWNoQ29tcG9uZW50KHRoaXMub3duZXIuZWwpO1xufVxuXG5cbmZ1bmN0aW9uIHNldFN0eWxlKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5vd25lci5lbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBzZXRTdHlsZSBvbiBvd25lciB3aXRoIG5vIGVsZW1lbnQ6IFwiICsgdGhpcy5vd25lci5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vd25lci5lbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVzKHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnN0eWxlW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xufVxuXG5cbi8vIGNyZWF0ZSBhIGNvcHkgb2YgRE9NIGVsZW1lbnQgdXNpbmcgZmFjZXQgY29uZmlnIGlmIHNldFxuZnVuY3Rpb24gY29weShpc0RlZXApIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbCAmJiB0aGlzLm93bmVyLmVsLmNsb25lTm9kZShpc0RlZXApO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIG5ld0VsID0gRG9tLmNyZWF0ZUVsZW1lbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiBuZXdFbDtcbn1cblxuXG4vLyByZW1vdmUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGRvbVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5vd25lci5lbCk7XG59XG5cbi8vIGFwcGVuZCBpbnNpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gYXBwZW5kKGVsKSB7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChlbCk7XG59XG5cbi8vIHByZXBlbmQgaW5zaWRlIEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHByZXBlbmQoZWwpIHtcbiAgICB2YXIgdGhpc0VsID0gdGhpcy5vd25lci5lbFxuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzRWwuZmlyc3RDaGlsZDtcbiAgICBpZiAoZmlyc3RDaGlsZClcbiAgICAgICAgdGhpc0VsLmluc2VydEJlZm9yZShlbCwgZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzRWwuYXBwZW5kQ2hpbGQoZWwpO1xufVxuXG4vLyBhcHBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWwpIHtcbiAgICB3aGlsZShlbC5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgdGhpcy5hcHBlbmQoZWwuY2hpbGROb2Rlc1swXSk7XG59XG5cbi8vIHByZXBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gcHJlcGVuZENoaWxkcmVuKGVsKSB7XG4gICAgd2hpbGUoZWwuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgIHRoaXMucHJlcGVuZChlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRBZnRlcihlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7ICAgIFxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIHRoaXNFbC5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgdGhpc0VsKTtcbn1cblxuXG4vLyBhcHBlbmRzIGNvbXBvbmVudCdzIGVsZW1lbnQgdG8gc2NvcGUgcGFyZW50LiBJZiBpdCB3YXMgYWxyZWR5IGluIERPTSBpdCB3aWxsIGJlIG1vdmVkXG5mdW5jdGlvbiBhcHBlbmRUb1Njb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCk7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVsLmFwcGVuZENoaWxkKHRoaXMub3duZXIuZWwpO1xufVxuXG5cbi8qKlxuICogRG9tIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtFbGVtZW50XX1cbiAqL1xuZnVuY3Rpb24gRG9tJGNoaWxkcmVuKCkge1xuICAgIHJldHVybiBkb21VdGlscy5jaGlsZHJlbih0aGlzLm93bmVyLmVsKTtcbn1cblxuXG52YXIgZmluZERpcmVjdGlvbnMgPSB7XG4gICAgJ3VwJzogJ3ByZXZpb3VzTm9kZScsXG4gICAgJ2Rvd24nOiAnbmV4dE5vZGUnXG59O1xuXG4vLyBGaW5kcyBjb21wb25lbnQgcGFzc2luZyBvcHRpb25hbCBpdGVyYXRvcidzIHRlc3Rcbi8vIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBjdXJyZW50IGNvbXBvbmVudCAodGhpcylcbi8vIGJ5IHRyYXZlcnNpbmcgRE9NIHRyZWUgdXB3YXJkcyAoZGlyZWN0aW9uID0gXCJ1cFwiKVxuLy8gb3IgZG93bndhcmRzIChkaXJlY3Rpb24gPSBcImRvd25cIilcbmZ1bmN0aW9uIGZpbmQoZGlyZWN0aW9uLCBpdGVyYXRvcikge1xuICAgIGlmICghIGZpbmREaXJlY3Rpb25zLmhhc093blByb3BlcnR5KGRpcmVjdGlvbikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbmQgZGlyZWN0aW9uOiAnICsgZGlyZWN0aW9uKTtcblxuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWxcbiAgICAgICAgLCBzY29wZSA9IHRoaXMub3duZXIuc2NvcGVcbiAgICAgICAgLCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihzY29wZS5fcm9vdEVsLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZWw7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpXG4gICAgICAgICwgY29tcG9uZW50c05hbWVzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgICwgZm91bmQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChuZXh0Tm9kZSkge1xuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKG5leHROb2RlKTtcbiAgICAgICAgaWYgKGF0dHIubm9kZSkge1xuICAgICAgICAgICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaGFzT3duUHJvcGVydHkoYXR0ci5jb21wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gc2NvcGVbYXR0ci5jb21wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IgfHwgaXRlcmF0b3IoY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gbmV4dE5vZGU7XG4gICAgICAgIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpO1xuICAgIH1cblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG4vLyByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIHRleHQgYmVmb3JlIHNlbGVjdGlvblxuZnVuY3Rpb24gaGFzVGV4dEJlZm9yZVNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgdmFyIHRleHQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlICYmIHNlbGVjdGlvbi5mb2N1c05vZGUudGV4dENvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnICcgPyAxIDogMDtcbiAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBzdGFydFBvcykgcmV0dXJuIHRydWU7XG5cbiAgICAvLyB3YWxrIHVwIHRoZSBET00gdHJlZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgdGV4dCBub2RlcyBiZWZvcmUgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIHByZXZOb2RlID0gdHJlZVdhbGtlci5wcmV2aW91c05vZGUoKTtcblxuICAgIHZhciBpc1RleHQgPSBwcmV2Tm9kZSA/ICFwcmV2Tm9kZS5ub2RlVmFsdWUudHJpbSgpID09ICcnIDogZmFsc2U7XG5cbiAgICByZXR1cm4gaXNUZXh0O1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RleHRBZnRlclNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgdGV4dCA9IHNlbGVjdGlvbi5mb2N1c05vZGUgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZS50ZXh0Q29udGVudDtcbiAgICB2YXIgc3RhcnRQb3MgPSB0ZXh0ICYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoLTEpID09ICcgJyA/IHNlbGVjdGlvbi5hbmNob3JOb2RlLmxlbmd0aC0xIDogc2VsZWN0aW9uLmFuY2hvck5vZGUubGVuZ3RoO1xuICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IDwgc3RhcnRQb3MpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gd2FsayB1cCB0aGUgRE9NIHRyZWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHRleHQgbm9kZXMgYWZ0ZXIgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIFxuICAgIC8vVG8gY2FwdHVyZSB3aGVuIHRyZWV3YWxrZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgdGV4dCBub2RlICh1bmtub3duIHJlYXNvbilcbiAgICB2YXIgaXNUZXh0ID0gbmV4dE5vZGUgPyAhbmV4dE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PSAnJyA6IGZhbHNlO1xuXG4gICAgcmV0dXJuIGlzVGV4dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyYWdcIj48L2E+XG4vLyAjIyNkcmFnIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJhZycpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgZHJhZ2dlZFxuICogRHJhZyBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBtZXRhOiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgIC0gcGFyYW1zOiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW4gdXJsLWxpa2UgcXVlcnkgc3RyaW5nIGluIHRoZSBlbmQgb2YgZGF0YSB0eXBlIGZvciBtZXRhZGF0YSBkYXRhIHR5cGUgKG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGlzIG9iamVjdCkuIFNlZSBjb25maWcuZHJhZ0Ryb3AuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFUZW1wbGF0ZVxuICogICAgICAgICAgYWxsIHZhbHVlcyB3aWxsIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYXMgZGF0YXR5cGUgY2Fubm90IHN0b3JlIHVwcGVyY2FzZSBsZXR0ZXJzLlxuICogICAgICAtIGRhdGE6IGRhdGEgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYWJvdmUgbWV0YSBkYXRhIHR5cGUgKG9yIGZ1bmN0aW9uKVxuICogIC0gYWxsb3dlZEVmZmVjdHM6IHN0cmluZyAob3IgZnVuY3Rpb24pIGFzIHNwZWNpZmllZCBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RyYWdEcm9wL0RyYWdfT3BlcmF0aW9ucyNkcmFnc3RhcnRcbiAqICAtIGRhdGFUeXBlczogbWFwIG9mIGFkZGl0aW9uYWwgZGF0YSB0eXBlcyB0aGUgY29tcG9uZW50IHdpbGwgc3VwcGx5IHRvIGRhdGEgdHJhbnNmZXIgb2JqZWN0LCBrZXkgaXMgZGF0YSB0eXBlLCB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdCwgY29tcG9uZW50IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBjb250ZXh0IHRvIHRoaXMgZnVuY3Rpb25cbiAqXG4gKiBJZiBmdW5jdGlvbiBpcyBzcGVjaWZpZWQgaW4gYW55IHBhcmFtZXRlciBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBjb21wb25lbnQgYXMgdGhlIGNvbnRleHRcbiAqL1xudmFyIERyYWcgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRHJhZycpO1xuXG5fLmV4dGVuZFByb3RvKERyYWcsIHtcbiAgICBpbml0OiBEcmFnJGluaXQsXG4gICAgc3RhcnQ6IERyYWckc3RhcnQsXG4gICAgc2V0SGFuZGxlOiBEcmFnJHNldEhhbmRsZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEcmFnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnO1xuXG5cbmZ1bmN0aW9uIERyYWckaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAgIFxuXG4gICAgdGhpcy5fY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoRE9NRXZlbnRzU291cmNlKTtcbiAgICB0aGlzLl9kcmFnRGF0YSA9IHt9O1xuXG4gICAgdmFyIGRhdGFUeXBlSW5mbyA9IHRoaXMuY29uZmlnLl9kYXRhVHlwZUluZm8gfHwgJyc7XG4gICAgdGhpcy5fZGF0YVR5cGVJbmZvID0gdHlwZW9mIGRhdGFUeXBlSW5mbyA9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhVHlwZUluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZGF0YVR5cGVJbmZvOyB9O1xufVxuXG5cbi8qKlxuICogRHJhZyBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdGhlIGRyYWcgaGFuZGxlIGVsZW1lbnQgb2YgY29tcG9uZW50LiBUaGlzIGVsZW1lbnQgaGFzIHRvIGJlIGRyYWdnZWQgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgZHJhZ2dlZC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGhhbmRsZUVsXG4gKi9cbmZ1bmN0aW9uIERyYWckc2V0SGFuZGxlKGhhbmRsZUVsKSB7XG4gICAgaWYgKCEgdGhpcy5vd25lci5lbC5jb250YWlucyhoYW5kbGVFbCkpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZHJhZyBoYW5kbGUgc2hvdWxkIGJlIGluc2lkZSBlbGVtZW50IHRvIGJlIGRyYWdnZWQnKVxuICAgIHRoaXMuX2RyYWdIYW5kbGUgPSBoYW5kbGVFbDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF9hZGREcmFnQXR0cmlidXRlLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gICAgICAgICdtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlJzogb25Nb3VzZU1vdmVtZW50LFxuICAgICAgICAnZHJhZ3N0YXJ0Jzogb25EcmFnU3RhcnQsXG4gICAgICAgICdkcmFnJzogb25EcmFnZ2luZyxcbiAgICAgICAgJ2RyYWdlbmQnOiBvbkRyYWdFbmRcbiAgICB9KTtcblxuICAgIHRoaXMub3duZXIub25NZXNzYWdlcyh7XG4gICAgICAgICdnZXRzdGF0ZXN0YXJ0ZWQnOlxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfcmVtb3ZlRHJhZ0F0dHJpYnV0ZSwgY29udGV4dDogdGhpcyB9LFxuICAgICAgICAnZ2V0c3RhdGVjb21wbGV0ZWQnOlxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfYWRkRHJhZ0F0dHJpYnV0ZSwgY29udGV4dDogdGhpcyB9XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBBZGRzIGRyYWdnYWJsZSBhdHRyaWJ1dGUgdG8gY29tcG9uZW50J3MgZWxlbWVudFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9hZGREcmFnQXR0cmlidXRlKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmVsKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgdHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZURyYWdBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpXG4gICAgICAgIHRoaXMub3duZXIuZWwucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcbn1cblxuXG5mdW5jdGlvbiBvbk1vdXNlRG93bihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5fX21vdXNlRG93blRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAodGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcykpIHtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbk1vdXNlTW92ZW1lbnQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIHZhciBzaG91bGRCZURyYWdnYWJsZSA9IHRhcmdldEluRHJhZ0hhbmRsZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMub3duZXIuZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCBzaG91bGRCZURyYWdnYWJsZSk7XG4gICAgaWYgKGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWRyYWdFbmFibGVFdmVudCcpICE9ICdmYWxzZScpXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jb25maWcub2ZmIHx8ICEgdGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcykpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IHRoaXMub3duZXI7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcblxuICAgIHRoaXMuX2RyYWdEYXRhID0gZHQuc2V0Q29tcG9uZW50U3RhdGUob3duZXIpO1xuICAgIHNldE1ldGEuY2FsbCh0aGlzKTtcbiAgICBzZXRBZGRpdGlvbmFsRGF0YVR5cGVzLmNhbGwodGhpcyk7XG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xuXG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHZhciBtZXRhQ29uZmlnID0gdGhpcy5jb25maWcubWV0YVxuICAgICAgICAgICAgLCBwYXJhbXNDb25maWcgPSBtZXRhQ29uZmlnICYmIG1ldGFDb25maWcucGFyYW1zXG4gICAgICAgICAgICAsIG1ldGFEYXRhQ29uZmlnID0gbWV0YUNvbmZpZyAmJiBtZXRhQ29uZmlnLmRhdGE7XG5cbiAgICAgICAgdmFyIHBhcmFtcyA9IF8ucmVzdWx0KHBhcmFtc0NvbmZpZywgb3duZXIpXG4gICAgICAgICAgICAsIGRhdGEgPSBfLnJlc3VsdChtZXRhRGF0YUNvbmZpZywgb3duZXIpO1xuXG4gICAgICAgIHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUgPSBkdC5zZXRDb21wb25lbnRNZXRhKG93bmVyLCBwYXJhbXMsIGRhdGEpO1xuICAgICAgICB0aGlzLl9kcmFnTWV0YURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEFkZGl0aW9uYWxEYXRhVHlwZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kYXRhVHlwZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFUeXBlc0RhdGEgPSBfLm1hcEtleXModGhpcy5jb25maWcuZGF0YVR5cGVzLCBmdW5jdGlvbiAoZ2V0RGF0YUZ1bmMsIGRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBnZXREYXRhRnVuYy5jYWxsKHRoaXMub3duZXIsIGRhdGFUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ29iamVjdCcpIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkgZHQuc2V0RGF0YShkYXRhVHlwZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdnaW5nKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoX2RyYWdJc0Rpc2FibGVkLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm47XG5cbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIGR0LnNldENvbXBvbmVudFN0YXRlKHRoaXMub3duZXIsIHRoaXMuX2RyYWdEYXRhKTtcbiAgICBkdC5zZXREYXRhKHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUsIHRoaXMuX2RyYWdNZXRhRGF0YSk7XG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlc0RhdGEpIHtcbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX2RhdGFUeXBlc0RhdGEsIGZ1bmN0aW9uKGRhdGEsIGRhdGFUeXBlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSkgZHQuc2V0RGF0YShkYXRhVHlwZSwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zZXRBbGxvd2VkRWZmZWN0cy5jYWxsKHRoaXMsIGR0KTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdFbmQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChfZHJhZ0lzRGlzYWJsZWQuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2NvbXBsZXRlZHJhZ2Ryb3AnLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2RyYWdlbmQnLFxuICAgICAgICBkcmFnRHJvcDogZHQsXG4gICAgICAgIGRyYWdGYWNldDogdGhpc1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9zZXRBbGxvd2VkRWZmZWN0cyhEcmFnRHJvcCkge1xuICAgIHZhciBlZmZlY3RzID0gXy5yZXN1bHQodGhpcy5jb25maWcuYWxsb3dlZEVmZmVjdHMsIHRoaXMub3duZXIpO1xuICAgIERyYWdEcm9wLnNldEFsbG93ZWRFZmZlY3RzKGVmZmVjdHMpO1xufVxuXG5cbmZ1bmN0aW9uIHRhcmdldEluRHJhZ0hhbmRsZSgpIHtcbiAgICByZXR1cm4gISB0aGlzLl9kcmFnSGFuZGxlIHx8IHRoaXMuX2RyYWdIYW5kbGUuY29udGFpbnModGhpcy5fX21vdXNlRG93blRhcmdldCk7XG59XG5cblxuZnVuY3Rpb24gX2RyYWdJc0Rpc2FibGVkKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9mZikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY29tcG9uZW50cy1mYWNldHMtZHJvcFwiPjwvYT5cbi8vICMjI2Ryb3AgZmFjZXRcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgRE9NRXZlbnRzU291cmNlID0gcmVxdWlyZSgnLi4vbXNnX3NyYy9kb21fZXZlbnRzJylcbiAgICAsIERyb3BNc2dBUEkgPSByZXF1aXJlKCcuLi9tc2dfYXBpL2Ryb3AnKVxuICAgICwgRHJhZ0Ryb3AgPSByZXF1aXJlKCcuLi8uLi91dGlsL2RyYWdkcm9wJylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEcm9wJylgXG4gKiBGYWNldCBmb3IgY29tcG9uZW50cyB0aGF0IGNhbiBhY2NlcHQgZHJvcHNcbiAqIERyb3AgZmFjZXQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gKlxuICogIC0gYWxsb3cgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGRlZmluZSBhbGxvd2VkIGRhdGEgdHlwZXMgZHVyaW5nIGRyYWcgKGBkcmFnZW50ZXJgIGFuZCBgZHJhZ292ZXJgIGV2ZW50cykgd2l0aCB0aGVzZSBwcm9wZXJ0aWVzOlxuICogICAgICAtIGNvbXBvbmVudHM6IGB0cnVlYCBieSBkZWZhdWx0IChhbGwgY29tcG9uZW50cyB3aWxsIGJlIGFjY2VwdGVkKVxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBzdHJpbmcgd2l0aCBhbGxvd2VkIGNvbXBvbmVudCBjbGFzc1xuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBsaXN0IG9mIGFsbG93ZWQgY29tcG9uZW50cyBjbGFzc2VzIChzdHJpbmdzKVxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBtYXAgd2l0aCBhbGxvd2VkIGNsYXNzZXMgaW4ga2V5cyBhbmQgYHRydWVgL3Rlc3QgZnVuY3Rpb25zIGluIHZhbHVlc1xuICogICAgICAgICAgICAgICAgICAgICAgICBPUiB0ZXN0IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBwYXNzZWQgb2JqZWN0IGRlZmluZWQgYmVsb3dcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgYGZhbHNlYCB0byBOT1QgYWNjZXB0IGNvbXBvbmVudHNcbiAqICAgICAgLSBkYXRhVHlwZXM6ICBgZmFsc2VgIGJ5IGRlZmF1bHQgKG5vIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBhY2NlcHRlZClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1Igc3RyaW5nIHdpdGggYWxsb3dlZCBkYXRhIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbGlzdCBvZiBhZGRpdGlvbmFsIGRhdGEgdHlwZXMgdGhhdCBhIGRyb3AgdGFyZ2V0IHdvdWxkIGFjY2VwdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiB0ZXN0IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBwYXNzZWQgRHJhZ0Ryb3Agb2JqZWN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGB0cnVlYCB0byBhY2NlcHQgYWxsIGRhdGEgdHlwZXNcbiAqICAgICAgLSBjaGVja1BhcmVudDogYGZhbHNlYCBieSBkZWZhdWx0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGB0cnVlYCB3aWxsIGNhbGwgcGFyZW50IGNvbXBvbmVudCBkcm9wIGFsbG93IHRvIGNoZWNrIGlmIHBhcmVudCBjb21wb25lbnQgd2lsbCBhY2NlcHQgdGhlIGNvbXBvbmVudFxuICogICAgICBJZiB0ZXN0IGZ1bmN0aW9ucyBhcmUgdXNlZCwgdGhleSBzaG91bGQgcmV0dXJuIGJvb2xlYW4uIEVhY2ggdGVzdCBmdW5jdGlvbiBjYW4gYWxzbyBzZXQgZHJvcCBlZmZlY3QgYXMgZGVmaW5lZCBoZXJlOlxuICogICAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVyI2Ryb3BFZmZlY3QuMjguMjlcbiAqICAgICAgU2V0dGluZyBkcm9wIGVmZmVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIGJ5IGRyYWdnZWQgb2JqZWN0IHdpbGwgcHJldmVudCBkcm9wLlxuICogICAgICBUZXN0IGZ1bmN0aW9ucyBmb3IgY29tcG9uZW50cyB3aWxsIGJlIHBhc3NlZCB0aGUgb3duZXIgb2YgRHJvcCBmYWNldCBhcyBjb250ZXh0LCB0aGUgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBwcm9wZXJ0aWVzIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXI6XG4gKiAgICAgICAgICBjb21wQ2xhc3MgLSBuYW1lIG9mIGNvbXBvbmVudCBjbGFzcyBhcyBzdG9yZWQgaW4gcmVnaXN0cnlcbiAqICAgICAgICAgIGNvbXBOYW1lIC0gbmFtZSBvZiBjb21wb25lbnQgKGFsbCBsb3dlcmNhc2UpXG4gKiAgICAgICAgICBwYXJhbXMgLSBwYXJhbWV0ZXJzIGFzIGVuY29kZWQgaW4gZGF0YVR5cGUsIHBhc3NlZCB0byBgbWlsby51dGlsLmRyYWdEcm9wLnNldENvbXBvbmVudE1ldGFgIGJ5IERyYWcgZmFjZXRcbiAqICAgICAgICAgIG1ldGFEYXRhVHlwZSAtIGRhdGEgdHlwZSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBjb21wQ2xhc3MsIGNvbXBOYW1lIGFuZCBwYXJhbXMgZW5jb2RlZFxuICpcbiAqICAgICAgLi4uIGFuZCBEcmFnRHJvcCBpbnN0YW5jZSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICpcbiAqICAgICAgVGVzdCBmdW5jdGlvbiBmb3Igb3RoZXIgZGF0YSB0eXBlcyB3aWxsIGJlIHBhc3NlZCB0aGUgb3duZXIgb2YgRHJvcCBmYWNldCBhcyBjb250ZXh0IGFuZCBEcmFnRHJvcCBpbnN0YW5jZSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyXG4gKlxuICogIyMjI0V2ZW50cyMjIyNcbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBjb25maWd1cmluZyBhbGxvd2VkIGNvbXBvbmVudHMgYW5kIGRhdGEgdHlwZXMsIGNvbXBvbmVudHMgY2xhc3NlcyBzaG91bGQgc3Vic2NyaWJlIHRvIGV2ZW50cy5cbiAqIEF0IHRoZSB2ZXJ5IGxlYXN0LCB0aGV5IHNob3VsZCBzdWJzY3JpYmUgdG8gYGRyb3BgIGV2ZW50LlxuICpcbiAqIERyb3AgZmFjZXQgZW1pdHMgZHJhZ2luL2RyYWdvdXQgbWVzc2FnZXMgdGhhdCBhcmUgZW1pdHRlZCB3aGVuZXZlciBhY3R1YWwgY29tcG9uZW50IGVsZW1lbnQgaXMgZW50ZXJlZCBvciBsZWZ0XG4gKiAod2hpY2ggaXMgZGlmZmVyZW50IGZyb20gZHJhZ2VudGVyIGFuZCBkcmFnbGVhdmUgbWVzc2FnZXMgdGhhdCBhcmUgZW1pdHRlZCB3aGVuZXZlciBhbnkgY2hpbGQgZWxlbWVudCBpcyBlbnRlcmVkIG9yIGxlZnQsIGFzIGxvbmcgYXMgZXZlbnQgYnViYmxlcyB1cClcbiAqIElmIGNoaWxkIGNvbXBvbmVudCBoYXMgZHJvcCBmYWNldCBhdHRhY2hlZCwgZHJhZ291dCB3aWxsIGJlIGVtaXR0ZWQgb24gdGhlIGN1cnJlbnQgY29tcG9uZW50IHdoZW4gdGhlIGNoaWxkIGlzIGVudGVyZWQuXG4gKlxuICogWW91IGNhbiBzZWUgdGhlIGRlbW9uc3RyYXRpb24gb2Ygd2hlbiBtZXNzYWdlcyBhcmUgZW1pdHRlZCBbaGVyZV0oaHR0cDovL2pzYmluLmNvbS9idXFvdi82KVxuICogXG4gKi9cbnZhciBEcm9wID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0Ryb3AnKTtcblxuXG5fLmV4dGVuZFByb3RvKERyb3AsIHtcbiAgICBpbml0OiBEcm9wJGluaXQsXG4gICAgc3RhcnQ6IERyb3Akc3RhcnRcbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEcm9wKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEcm9wO1xuXG5cbmZ1bmN0aW9uIERyb3AkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJKERPTUV2ZW50c1NvdXJjZSwgbmV3IERyb3BNc2dBUEkpO1xufVxuXG5cbmZ1bmN0aW9uIERyb3Akc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5vd25lci5lbC5jbGFzc0xpc3QuYWRkKCdjYy1tb2R1bGUtcmVsYXRpdmUnKTtcbiAgICB0aGlzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnZHJhZ2VudGVyIGRyYWdvdmVyJzogb25EcmFnZ2luZyxcbiAgICAgICAgJ2Ryb3AnOiBvbkRyb3AsXG4gICAgICAgICdkcmFnZW50ZXIgZHJhZ292ZXIgZHJhZ2xlYXZlIGRyb3AgZHJhZ2luIGRyYWdvdXQnOiBwb3N0VG9TZXJ2aWNlXG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnZ2luZyhldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoISBfaGFuZGxlRHJvcERlcGVuZGVuY3kuY2FsbCh0aGlzLCBkdCkpXG4gICAgICAgIGR0LnNldERyb3BFZmZlY3QoJ25vbmUnKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wY29tcGxldGVkJywge1xuICAgICAgICBldmVudFR5cGU6ICdkcm9wJyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcm9wRmFjZXQ6IHRoaXMsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5vd25lclxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIHBvc3RUb1NlcnZpY2UoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKGV2ZW50VHlwZSwge1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGRyb3BGYWNldDogdGhpcyxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLm93bmVyXG4gICAgfSk7XG59XG5cblxudmFyIF9oYW5kbGVEcm9wRGVwZW5kZW5jeSA9IF8udGhyb3R0bGUoX2hhbmRsZURyb3BEZXBlbmRlbmN5Tm90aHJvdHRsZSwgNTApO1xuZnVuY3Rpb24gX2hhbmRsZURyb3BEZXBlbmRlbmN5Tm90aHJvdHRsZShkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KSB7XG4gICAgdmFyIGFsbG93ID0gdGhpcy5jb25maWcuYWxsb3dcbiAgICAgICAgLCBwYXJlbnRBbGxvd2VkID0gdHJ1ZTtcblxuICAgIG9yaWdpbmFsRHJvcENvbXBvbmVudCA9IG9yaWdpbmFsRHJvcENvbXBvbmVudCB8fCB0aGlzLm93bmVyO1xuXG4gICAgaWYgKGFsbG93ICYmIGFsbG93LmNoZWNrUGFyZW50KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCdEcm9wJyk7XG4gICAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgICAgICBwYXJlbnRBbGxvd2VkID0gX2hhbmRsZURyb3BEZXBlbmRlbmN5Tm90aHJvdHRsZS5jYWxsKHBhcmVudC5kcm9wLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50QWxsb3dlZCAmJiBfaXNEcm9wQWxsb3dlZC5jYWxsKHRoaXMsIGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIGRyb3AgaXMgYWxsb3dlZCBiYXNlZCBvbiBmYWNldCBjb25maWd1cmF0aW9uIChzZWUgYWJvdmUpXG4gKiBcbiAqIEBwYXJhbSB7RHJhZ0Ryb3B9IGR0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfaXNEcm9wQWxsb3dlZChkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KSB7XG4gICAgdmFyIGFsbG93ID0gdGhpcy5jb25maWcuYWxsb3c7XG5cbiAgICBpZiAoZHQuaXNDb21wb25lbnQoKSkge1xuICAgICAgICB2YXIgYWxsb3dDb21wcyA9IGFsbG93ICYmIGFsbG93LmNvbXBvbmVudHNcbiAgICAgICAgICAgICwgbWV0YSA9IGR0LmdldENvbXBvbmVudE1ldGEoKTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhbGxvd0NvbXBzKSB7XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHM7XG4gICAgICAgICAgICAvLyBjb21wb25lbnQgY2xhc3NcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGEgJiYgbWV0YS5jb21wQ2xhc3MgPT0gYWxsb3dDb21wcztcbiAgICAgICAgICAgIC8vIHRlc3QgZnVuY3Rpb25cbiAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dDb21wcy5jYWxsKHRoaXMub3duZXIsIG1ldGEsIGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpO1xuICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbGxvd0NvbXBzKSlcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBhbGxvd2VkIGNsYXNzZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHMuaW5kZXhPZihtZXRhICYmIG1ldGEuY29tcENsYXNzKSA+PSAwO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYXAgb2YgY2xhc3M6IGJvb2xlYW58dGVzdCBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdCA9IGFsbG93Q29tcHNbbWV0YSAmJiBtZXRhLmNvbXBDbGFzc107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhISBfLnJlc3VsdCh0ZXN0LCB0aGlzLm93bmVyLCBtZXRhLCBkdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBhbGxvd2VkIGNvbXBvbmVudHMgaW4gY29uZmlnJyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGF0YVR5cGVzID0gYWxsb3cgJiYgYWxsb3cuZGF0YVR5cGVzXG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGRhdGFUeXBlcykge1xuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkdC50eXBlcy5pbmRleE9mKGRhdGFUeXBlcykgPj0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE8gdGVzdCBmb3Igb3RoZXIgZGF0YSB0eXBlc1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdFdmVudHMnKWBcbiAqIENvbXBvbmVudCBmYWNldCB0aGF0IG1hbmFnZXMgc3Vic2NyaXB0aW9ucyB0byBET00gZXZlbnRzIHVzaW5nIFtNZXNzZW5nZXJdKC4uLy4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSB3aXRoIFtET01FdmVudHNTb3VyY2VdKC4uL21zZ19zcmMvZG9tX2V2ZW50cy5qcy5odG1sKS5cbiAqIEFsbCBwdWJsaWMgbWV0aG9kcyBvZiBNZXNzZW5nZXIgYW5kIGB0cmlnZ2VyYCBtZXRob2Qgb2YgW0RPTUV2ZW50c1NvdXJjZV0oLi4vbXNnX3NyYy9kb21fZXZlbnRzLmpzLmh0bWwpIGFyZSBwcm94aWVkIGRpcmVjdGx5IHRvIHRoaXMgZmFjZXQuXG4gKiBGb3IgZXhhbXBsZSwgdG8gc3Vic2NyaWJlIHRvIGBjbGlja2AgZXZlbnQgdXNlOlxuICogYGBgXG4gKiBjb21wb25lbnQuZnJhbWUub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICogU2VlIFtNZXNzZW5nZXJdKC4uLy4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKVxuICovXG52YXIgRXZlbnRzID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0V2ZW50cycpO1xuXG5cbi8qKlxuICogIyMjI0V2ZW50cyBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNFdmVudHMkaW5pdCkgLSBjYWxsZWQgYnkgY29uc3RydWN0b3IgYXV0b21hdGljYWxseVxuICovXG5fLmV4dGVuZFByb3RvKEV2ZW50cywge1xuICAgIGluaXQ6IEV2ZW50cyRpbml0XG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRXZlbnRzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudHM7XG5cblxuLyoqXG4gKiBFeHBvc2UgRE9NRXZlbnRzU291cmNlIHRyaWdnZXIgbWV0aG9kIG9uIEV2ZW50cyBwcm90b3R5cGVcbiAqL1xudmFyIE1TR19TT1VSQ0VfS0VZID0gJ19kb21FdmVudHNTb3VyY2UnXG5ET01FdmVudHNTb3VyY2UudXNlV2l0aChFdmVudHMsIE1TR19TT1VSQ0VfS0VZLCBbJ3RyaWdnZXInXSk7XG5cblxuLyoqXG4gKiBFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsemVzIGZhY2V0LCBjb25uZWN0cyBET01FdmVudHNTb3VyY2UgdG8gZmFjZXQncyBtZXNzZW5nZXJcbiAqL1xuZnVuY3Rpb24gRXZlbnRzJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHZhciBkb21FdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLm93bmVyKTtcbiAgICB0aGlzLl9zZXRNZXNzYWdlU291cmNlKGRvbUV2ZW50c1NvdXJjZSk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNU0dfU09VUkNFX0tFWSwgZG9tRXZlbnRzU291cmNlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIEZyYW1lTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZnJhbWUnKVxuICAgICwgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0gcmVxdWlyZSgnLi4vLi4vc2VydmljZXMvZGVfY29uc3RycycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdGcmFtZScpYFxuICogQ29tcG9uZW50IGZhY2V0IHRoYXQgc2ltcGxpZmllcyBzZW5kaW5nIHdpbmRvdyBtZXNzYWdlcyB0byBpZnJhbWUgYW5kIHN1YnNjcmliaW5nIHRvIG1lc3NhZ2VzIG9uIGlubmVyIHdpbmRvdyBvZiBpZnJhbWUuXG4gKiBBbGwgcHVibGljIG1ldGhvZHMgb2YgTWVzc2VuZ2VyIGFuZCBgdHJpZ2dlcmAgbWV0aG9kIG9mIFtGcmFtZU1lc3NhZ2VTb3VyY2VdKC4uL21zZ19zcmMvZnJhbWUuanMuaHRtbCkgYXJlIHByb3hpZWQgZGlyZWN0bHkgdG8gdGhpcyBmYWNldC5cbiAqIEZvciBleGFtcGxlLCB0byBzZW5kIGN1c3RvbSBtZXNzYWdlIHRvIGlmcmFtZSB3aW5kb3cgdXNlOlxuICogYGBgXG4gKiBpZnJhbWVDb21wb25lbnQuZnJhbWUudHJpZ2dlcignbXltZXNzYWdlJywgbXlEYXRhKTtcbiAqIGBgYFxuICogVG8gc3Vic2NyaWJlIHRvIHRoaXMgbWVzc2FnZXMgaW5zaWRlIGZyYW1lIHVzZSAod2l0aCBtaWxvIC0gc2VlIFttaWxvLm1haWxdKC4uLy4uL21haWwvaW5kZXguanMuaHRtbCkpOlxuICogYGBgXG4gKiBtaWxvLm1haWwub24oJ21lc3NhZ2U6bXltZXNzYWdlJywgZnVuY3Rpb24obXNnVHlwZSwgbXNnRGF0YSkge1xuICogICAgIC8vIGRhdGEgaXMgaW5zaWRlIG9mIHdpbmRvdyBtZXNzYWdlIGRhdGFcbiAqICAgICAvLyBtc2dUeXBlID09ICdtZXNzYWdlOm15bWVzc2FnZSdcbiAqICAgICB2YXIgbXlEYXRhID0gbXNnRGF0YS5kYXRhO1xuICogICAgIC8vIC4uLiBhcHAgbG9naWMgaGVyZVxuICogfSk7XG4gKiBgYGBcbiAqIG9yIHdpdGhvdXQgbWlsbzpcbiAqIGBgYFxuICogd2luZG93LmF0dGFjaEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihtZXNzYWdlKSB7XG4gKiAgICAgdmFyIG1zZ1R5cGUgPSBtZXNzYWdlLnR5cGU7IC8vIGUuZy4sICdteW1lc3NhZ2UnXG4gKiAgICAgdmFyIG15RGF0YSA9IG1lc3NhZ2UuZGF0YTtcbiAqICAgICAvLyAuLi4gbWVzc2FnZSByb3V0aW5nIGFuZCBjb2RlIGhlcmVcbiAqIH0pO1xuICogYGBgXG4gKiBNaWxvIGRvZXMgcm91dGluZyBiYXNlZCBvbiBzZW50IG1lc3NhZ2UgdHlwZSBhdXRvbWF0aWNhbGx5LlxuICogU2VlIFtNZXNzZW5nZXJdKC4uLy4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSBhbmQgW21pbG8ubWFpbF0oLi4vLi4vbWFpbC9pbmRleC5qcy5odG1sKS5cbiAqL1xuIHZhciBGcmFtZSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdGcmFtZScpO1xuXG5cbi8qKlxuICogQ2FsbHMgcGFzc2VkIGZ1bmN0aW9uIHdoZW4gZnJhbWUgRE9NIGJlY29tZXMgcmVhZHkuIElmIGFscmVhZHkgcmVhZHkgY2FsbHMgaW1tZWRpYXRlbHlcbiAqL1xudmFyIEZyYW1lJHdoZW5SZWFkeSA9IF9tYWtlV2hlblJlYWR5RnVuYyhGcmFtZSRpc1JlYWR5LCAnZG9tcmVhZHknKTtcblxuLyoqXG4gKiBDYWxscyBwYXNzZWQgZnVuY3Rpb24gd2hlbiBmcmFtZSBtaWxvIGJlY29tZXMgcmVhZHkuIElmIGFscmVhZHkgcmVhZHkgY2FsbHMgaW1tZWRpYXRlbHlcbiAqL1xudmFyIEZyYW1lJHdoZW5NaWxvUmVhZHkgPSBfbWFrZVdoZW5SZWFkeUZ1bmMoRnJhbWUkaXNNaWxvUmVhZHksICdtZXNzYWdlOm1pbG9yZWFkeScpO1xuXG5cbi8qKlxuICogIyMjI0V2ZW50cyBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNGcmFtZSRpbml0KSAtIGNhbGxlZCBieSBjb25zdHJ1Y3RvciBhdXRvbWF0aWNhbGx5XG4gKi9cbl8uZXh0ZW5kUHJvdG8oRnJhbWUsIHtcbiAgICBpbml0OiBGcmFtZSRpbml0LFxuICAgIHN0YXJ0OiBGcmFtZSRzdGFydCxcbiAgICBkZXN0cm95OiBGcmFtZSRkZXN0cm95LFxuICAgIGdldFdpbmRvdzogRnJhbWUkZ2V0V2luZG93LFxuICAgIGlzUmVhZHk6IEZyYW1lJGlzUmVhZHksXG4gICAgd2hlblJlYWR5OiBGcmFtZSR3aGVuUmVhZHksXG4gICAgaXNNaWxvUmVhZHk6IEZyYW1lJGlzTWlsb1JlYWR5LFxuICAgIHdoZW5NaWxvUmVhZHk6IEZyYW1lJHdoZW5NaWxvUmVhZHksXG4gICAgbWlsbzogRnJhbWUkbWlsb1xuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuXG5mYWNldHNSZWdpc3RyeS5hZGQoRnJhbWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lO1xuXG5cbi8qKlxuICogRXhwb3NlIEZyYW1lTWVzc2FnZVNvdXJjZSB0cmlnZ2VyIG1ldGhvZCBvbiBFdmVudHMgcHJvdG90eXBlXG4gKi9cbnZhciBNU0dfU09VUkNFX0tFWSA9ICdfbWVzc2FnZVNvdXJjZSc7XG5GcmFtZU1lc3NhZ2VTb3VyY2UudXNlV2l0aChGcmFtZSwgTVNHX1NPVVJDRV9LRVksIFsndHJpZ2dlciddKTtcblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbHplcyBmYWNldCwgY29ubmVjdHMgRnJhbWVNZXNzYWdlU291cmNlIHRvIGZhY2V0J3MgbWVzc2VuZ2VyXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBcbiAgICB2YXIgbWVzc2FnZVNvdXJjZSA9IG5ldyBGcmFtZU1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UobWVzc2FnZVNvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIE1TR19TT1VSQ0VfS0VZLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRW1pdHMgZnJhbWVsb2FkZWQgZXZlbnQgd2hlbiByZWFkeS5cbiAqL1xuZnVuY3Rpb24gRnJhbWUkc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIG1pbG8ocG9zdERvbVJlYWR5KTtcblxuICAgIGZ1bmN0aW9uIHBvc3REb21SZWFkeShldmVudCkge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKCdkb21yZWFkeScsIGV2ZW50KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gRnJhbWUkZGVzdHJveSgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgdGhlIGludGVybmFsIHdpbmRvdyBvZiB0aGUgZnJhbWUgXG4gKlxuICogQHBhcmFtIHtXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbC5jb250ZW50V2luZG93O1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRvY3VtZW50LnJlYWR5U3RhdGUgaWYgZnJhbWUgZG91bWVudCBzdGF0ZSBpcyAnaW50ZXJhY3RpdmUnIG9yICdjb21wbGV0ZScsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEByZXR1cm4ge1N0cmluZ3xCb29sZWFufVxuICovXG5mdW5jdGlvbiBGcmFtZSRpc1JlYWR5KCkge1xuICAgIHZhciByZWFkeVN0YXRlID0gdGhpcy5nZXRXaW5kb3coKS5kb2N1bWVudC5yZWFkeVN0YXRlO1xuICAgIHJldHVybiAgcmVhZHlTdGF0ZSAhPSAnbG9hZGluZycgPyByZWFkeVN0YXRlIDogZmFsc2U7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBtaWxvIGlzIGxvYWRlZCBhbmQgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZyBpbnNpZGUgdGhlIGZyYW1lXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRnJhbWUkaXNNaWxvUmVhZHkoKSB7XG4gICAgdmFyIGZyYW1lTWlsbyA9IHRoaXMuZ2V0V2luZG93KCkubWlsbztcbiAgICByZXR1cm4gdGhpcy5pc1JlYWR5KCkgJiYgZnJhbWVNaWxvICYmIGZyYW1lTWlsby5taWxvX3ZlcnNpb247XG59XG5cblxuLyoqXG4gKiBHaXZlcyBhY2Nlc3MgdG8gbWlsbyBpbiB0aGUgZnJhbWUgKGFzc3VtaW5nIGl0IGlzIGxvYWRlZCB0aGVyZSlcbiAqIENhbGxzIGZ1bmN0aW9uIHdoZW4gYm90aCBtaWxvIGFuZCBET00gYXJlIHJlYWR5IGlmIGZ1bmN0aW9uIGlzIHBhc3NlZC5cbiAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBtaWxvIGluc2lkZSB0aGUgZnJhbWUgaWYgdGhlIHdpbmRvdyBpcyBhbHJlYWR5IGF2YWlsYWJsZS5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBtaWxvIGFuZCBET00gYXJlIHJlYWR5IGluIHRoZSBmcmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259IHJlZmVyZW5jZSB0byBtaWxvIGluIHRoZSBmcmFtZSBcbiAqL1xuZnVuY3Rpb24gRnJhbWUkbWlsbyhmdW5jKSB7XG4gICAgaWYgKHR5cGVvZiBmdW5jID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLndoZW5NaWxvUmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmdldFdpbmRvdygpLm1pbG8oZnVuYylcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHZhciB3aW4gPSB0aGlzLmdldFdpbmRvdygpO1xuICAgIHJldHVybiB3aW4gJiYgd2luLm1pbG87XG59XG5cblxuZnVuY3Rpb24gX21ha2VXaGVuUmVhZHlGdW5jKGlzUmVhZHlGdW5jLCBldmVudCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBGcmFtZV93aGVuUmVhZHlGdW5jKGZ1bmMpIHsgLy8gLCBhcmd1bWVudHNcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgICAgICAsIGFyZ3MgPSBfLnNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGlmIChpc1JlYWR5RnVuYy5jYWxsKHRoaXMpKVxuICAgICAgICAgICAgY2FsbEZ1bmMoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5vbihldmVudCwgY2FsbEZ1bmMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNhbGxGdW5jKCkge1xuICAgICAgICAgICAgZnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIG1pbG9NYWlsID0gcmVxdWlyZSgnLi4vLi4vc2VydmljZXMvbWFpbCcpO1xuXG5cbnZhciBJdGVtRmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnSXRlbScpO1xuXG5fLmV4dGVuZFByb3RvKEl0ZW1GYWNldCwge1xuICAgIGdldFN0YXRlOiBJdGVtRmFjZXQkZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IEl0ZW1GYWNldCRzZXRTdGF0ZSxcbiAgICBnZXRJbmRleDogSXRlbUZhY2V0JGdldEluZGV4LFxuICAgIHNldEluZGV4OiBJdGVtRmFjZXQkc2V0SW5kZXgsXG4gICAgcmVtb3ZlSXRlbTogSXRlbUZhY2V0JHJlbW92ZUl0ZW0sXG4gICAgZXh0cmFjdEl0ZW06IEl0ZW1GYWNldCRleHRyYWN0SXRlbSxcbiAgICByZXF1aXJlOiBbJ0NvbnRhaW5lcicsICdEb20nLCAnRGF0YSddXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKEl0ZW1GYWNldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gSXRlbUZhY2V0O1xuXG5cbmZ1bmN0aW9uIEl0ZW1GYWNldCRnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4geyBzdGF0ZToge1xuICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpXG4gICAgfX07XG59XG5cblxuZnVuY3Rpb24gSXRlbUZhY2V0JHNldFN0YXRlKHN0YXRlKSB7XG4gICAgdGhpcy5zZXRJbmRleChzdGF0ZS5zdGF0ZS5pbmRleCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBvd25lciBjb21wb25lbnQgaW4gaXQncyBwYXJlbnQgbGlzdCBjb21wb25lbnRcbiAqIEByZXR1cm4ge0ludGVnZXJ9IFRoZSBpbmRleFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkZ2V0SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdGhlIGluZGV4IG9mIHRoaXMgY29tcG9uZW50XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JHNldEluZGV4KGluZGV4KSB7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xufVxuXG5cbi8qKlxuICogSXRlbUZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBjb21wb25lbnQgZnJvbSB0aGUgbGlzdCwgY29tcG9uZW50IGdldHMgZGVzdHJveWVkXG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRyZW1vdmVJdGVtKCkge1xuICAgIC8vIHRoaXMubGlzdCBhbmQgdGhpcy5pbmRleCBhcmUgc2V0IGJ5IHRoZSBsaXN0IHdoZW4gdGhlIGl0ZW0gaXMgYWRkZWRcbiAgICB0aGlzLmxpc3QucmVtb3ZlSXRlbSh0aGlzLmluZGV4KTtcbn1cblxuXG4vKipcbiAqIEl0ZW1GYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gdGhlIGxpc3QsIGNvbXBvbmVudCBpcyBOT1QgZGVzdHJveWVkXG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRleHRyYWN0SXRlbSgpIHtcbiAgICB0aGlzLmxpc3QuZXh0cmFjdEl0ZW0odGhpcy5pbmRleCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBtaWxvTWFpbCA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL21haWwnKVxuICAgICwgbWlsb0JpbmRlciA9IHJlcXVpcmUoJy4uLy4uL2JpbmRlcicpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1RcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi8uLi91dGlsL2RvbScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJyk7XG5cblxudmFyIExJU1RfU0FNUExFX0NTU19DTEFTUyA9ICdtbC1saXN0LWl0ZW0tc2FtcGxlJztcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdMaXN0JylgXG4gKiBGYWNldCBlbmFibGluZyBsaXN0IGZ1bmN0aW9uYWxpdHlcbiAqL1xudmFyIExpc3QgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnTGlzdCcpO1xuXG5fLmV4dGVuZFByb3RvKExpc3QsIHtcbiAgICBpbml0OiBMaXN0JGluaXQsXG4gICAgc3RhcnQ6IExpc3Qkc3RhcnQsXG4gICAgZGVzdHJveTogTGlzdCRkZXN0cm95LFxuXG4gICAgcmVxdWlyZTogWydDb250YWluZXInLCAnRG9tJywgJ0RhdGEnXSxcbiAgICBfaXRlbVByZXZpb3VzQ29tcG9uZW50OiBfaXRlbVByZXZpb3VzQ29tcG9uZW50LFxuXG4gICAgaXRlbTogTGlzdCRpdGVtLFxuICAgIGNvdW50OiBMaXN0JGNvdW50LFxuICAgIGNvbnRhaW5zOiBMaXN0JGNvbnRhaW5zLFxuICAgIGFkZEl0ZW06IExpc3QkYWRkSXRlbSxcbiAgICBhZGRJdGVtczogTGlzdCRhZGRJdGVtcyxcbiAgICByZXBsYWNlSXRlbTogTGlzdCRyZXBsYWNlSXRlbSxcbiAgICByZW1vdmVJdGVtOiBMaXN0JHJlbW92ZUl0ZW0sXG4gICAgZXh0cmFjdEl0ZW06IExpc3QkZXh0cmFjdEl0ZW0sXG4gICAgZWFjaDogTGlzdCRlYWNoLFxuICAgIF9zZXRJdGVtOiBMaXN0JF9zZXRJdGVtLFxuICAgIF9yZW1vdmVJdGVtOiBMaXN0JF9yZW1vdmVJdGVtLFxuICAgIF9hZGRJdGVtOiBMaXN0JF9hZGRJdGVtLFxuICAgIF9hZGRJdGVtczogTGlzdCRfYWRkSXRlbXMsXG4gICAgX2NyZWF0ZUNhY2hlVGVtcGxhdGU6IExpc3QkX2NyZWF0ZUNhY2hlVGVtcGxhdGUsXG4gICAgX3VwZGF0ZURhdGFQYXRoczogTGlzdCRfdXBkYXRlRGF0YVBhdGhzXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVkIExpc3QgZmFjZXQgaW5zdGFuY2UgYW5kIHNldHMgdXAgaXRlbSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBMaXN0JGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfbGlzdEl0ZW1zOiBbXSxcbiAgICAgICAgX2xpc3RJdGVtc0hhc2g6IHt9XG4gICAgfSk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXRlbVNhbXBsZScsIG51bGwsIF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFN0YXJ0cyB0aGUgTGlzdCBmYWNldCBpbnN0YW5jZSwgZmluZHMgY2hpbGQgd2l0aCBJdGVtIGZhY2V0LlxuICovXG5mdW5jdGlvbiBMaXN0JHN0YXJ0KCkge1xuICAgIC8vIEZpcmVkIGJ5IF9fYmluZGVyX18gd2hlbiBhbGwgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBib3VuZFxuICAgIHRoaXMub3duZXIub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICAvLyBnZXQgaXRlbXMgYWxyZWFkeSBpbiB0aGUgbGlzdFxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuZG9tLmNoaWxkcmVuKClcbiAgICAgICAgLCBpdGVtcyA9IHRoaXMubGlzdC5fbGlzdEl0ZW1zXG4gICAgICAgICwgaXRlbXNIYXNoID0gdGhpcy5saXN0Ll9saXN0SXRlbXNIYXNoO1xuXG4gICAgY2hpbGRyZW4gJiYgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihjaGlsZEVsKSB7XG4gICAgICAgIHZhciBjb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChjaGlsZEVsKTtcbiAgICAgICAgaWYgKGNvbXAgJiYgY29tcC5pdGVtKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGNvbXApO1xuICAgICAgICAgICAgaXRlbXNIYXNoW2NvbXAubmFtZV0gPSBjb21wO1xuICAgICAgICAgICAgY29tcC5pdGVtLmxpc3QgPSB0aGlzLmxpc3Q7XG4gICAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGZvdW5kSXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMSk7XG4gICAgICAgIGRlbGV0ZSBpdGVtc0hhc2hbZm91bmRJdGVtLm5hbWVdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBpdGVtLml0ZW0uc2V0SW5kZXgoaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29tcG9uZW50IG11c3QgaGF2ZSBvbmUgY2hpbGQgd2l0aCBhbiBJdGVtIGZhY2V0IFxuICAgIGlmICghIGZvdW5kSXRlbSkgdGhyb3cgbmV3IEVycm9yKCdObyBjaGlsZCBjb21wb25lbnQgaGFzIEl0ZW0gZmFjZXQnKTtcblxuICAgIHRoaXMubGlzdC5pdGVtU2FtcGxlID0gZm91bmRJdGVtO1xuXG4gICAgLy8gQWZ0ZXIga2VlcGluZyBhIHJlZmVyZW5jZSB0byB0aGUgaXRlbSBzYW1wbGUsIGl0IG11c3QgYmUgaGlkZGVuIGFuZCByZW1vdmVkIGZyb20gc2NvcGVcbiAgICBmb3VuZEl0ZW0uZG9tLmhpZGUoKTtcbiAgICBmb3VuZEl0ZW0ucmVtb3ZlKHRydWUpO1xuICAgIGZvdW5kSXRlbS5kb20ucmVtb3ZlQ3NzQ2xhc3NlcyhMSVNUX1NBTVBMRV9DU1NfQ0xBU1MpO1xuXG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gY29tcG9uZW50cyBmcm9tIHNhbXBsZSBpdGVtXG4gICAgZm91bmRJdGVtLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcCkge1xuICAgICAgICBkZWxldGUgY29tcC5lbFttaWxvQ29uZmlnLmNvbXBvbmVudFJlZl07XG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3QuX2NyZWF0ZUNhY2hlVGVtcGxhdGUoKTtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JF9jcmVhdGVDYWNoZVRlbXBsYXRlKCkge1xuICAgIGlmICghdGhpcy5pdGVtU2FtcGxlKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgdmFyIGl0ZW1TYW1wbGUgPSB0aGlzLml0ZW1TYW1wbGU7XG5cbiAgICAvLyBjcmVhdGUgaXRlbSB0ZW1wbGF0ZSB0byBpbnNlcnQgbWFueSBpdGVtcyBhdCBvbmNlXG4gICAgdmFyIGl0ZW1FbENvcHkgPSBpdGVtU2FtcGxlLmVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICB2YXIgYXR0ciA9IGl0ZW1TYW1wbGUuY29tcG9uZW50SW5mby5hdHRyO1xuICAgIHZhciBhdHRyQ29weSA9IF8uY2xvbmUoYXR0cik7XG4gICAgYXR0ci5jb21wTmFtZSA9ICd7ez0gaXQuY29tcG9uZW50TmFtZSgpIH19JztcbiAgICBhdHRyLmVsID0gaXRlbUVsQ29weTtcbiAgICBhdHRyLmRlY29yYXRlKCk7XG5cbiAgICB2YXIgaXRlbXNUZW1wbGF0ZVN0ciA9IFxuICAgICAgICAgICd7eyB2YXIgaSA9IGl0LmNvdW50OyB3aGlsZShpLS0pIHsgfX0nXG4gICAgICAgICsgaXRlbUVsQ29weS5vdXRlckhUTUxcbiAgICAgICAgKyAne3sgfSB9fSc7XG5cbiAgICB0aGlzLml0ZW1zVGVtcGxhdGUgPSBkb1QuY29tcGlsZShpdGVtc1RlbXBsYXRlU3RyKTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGNoaWxkIGl0ZW0gYnkgaW5kZXhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBpdGVtIHRvIGdldC5cbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGNvbXBvbmVudCBmb3VuZFxuICovXG5mdW5jdGlvbiBMaXN0JGl0ZW0oaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdEl0ZW1zW2luZGV4XTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoaWxkIGl0ZW1zXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgdG90YWxcbiAqL1xuZnVuY3Rpb24gTGlzdCRjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdEl0ZW1zLmxlbmd0aDtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JF9zZXRJdGVtKGluZGV4LCBjb21wb25lbnQpIHtcbiAgICB0aGlzLl9saXN0SXRlbXMuc3BsaWNlKGluZGV4LCAwLCBjb21wb25lbnQpO1xuICAgIHRoaXMuX2xpc3RJdGVtc0hhc2hbY29tcG9uZW50Lm5hbWVdID0gY29tcG9uZW50O1xuICAgIGNvbXBvbmVudC5pdGVtLmxpc3QgPSB0aGlzO1xuICAgIGNvbXBvbmVudC5pdGVtLnNldEluZGV4KCtpbmRleCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgY2hpbGQgaXRlbSBleGlzdHMgaW4gdGhlIGxpc3RcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBsb29rIGZvci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIExpc3QkY29udGFpbnMoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtc0hhc2hbY29tcG9uZW50Lm5hbWVdID09IGNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBhIG5ldyBjaGlsZCBjb21wb25lbnQgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IGFuZCByZXR1cm5zIHRoZSBuZXcgY29tcG9uZW50LlxuICogVGhpcyBtZXRob2QgdXNlcyBkYXRhIGZhY2V0LCBzbyBub3RpZmljYXRpb24gd2lsbCBiZSBlbWl0dGVkIG9uIGRhdGEgZmFjZXQuXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCB0byBhZGQgYXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIExpc3QkYWRkSXRlbShpbmRleCwgaXRlbURhdGEpIHtcbiAgICBpbmRleCA9IGluZGV4IHx8IHRoaXMuY291bnQoKTtcbiAgICB0aGlzLm93bmVyLmRhdGEuc3BsaWNlKGluZGV4LCAwLCBpdGVtRGF0YSB8fCB7fSk7XG4gICAgcmV0dXJuIHRoaXMuaXRlbShpbmRleCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBuZXcgY2hpbGQgY29tcG9uZW50IGF0IGEgcGFydGljdWxhciBpbmRleCBhbmQgcmV0dXJucyB0aGUgbmV3IGNvbXBvbmVudFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYWRkIGF0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudFxuICovXG5mdW5jdGlvbiBMaXN0JF9hZGRJdGVtKGluZGV4KSB7XG4gICAgaW5kZXggPSBpbmRleCB8fCB0aGlzLmNvdW50KCk7XG4gICAgaWYgKHRoaXMuaXRlbShpbmRleCkpXG4gICAgICAgIHRocm93IEVycm9yKCdhdHRlbXB0IHRvIGNyZWF0ZSBpdGVtIHdpdGggSUQgb2YgZXhpc3RpbmcgaXRlbScpO1xuXG4gICAgLy8gQ29weSBjb21wb25lbnRcbiAgICB2YXIgY29tcG9uZW50ID0gQ29tcG9uZW50LmNvcHkodGhpcy5pdGVtU2FtcGxlLCB0cnVlKTtcbiAgICB2YXIgcHJldkNvbXBvbmVudCA9IHRoaXMuX2l0ZW1QcmV2aW91c0NvbXBvbmVudChpbmRleCk7XG5cbiAgICBpZiAoIXByZXZDb21wb25lbnQuZWwucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdsaXN0IGl0ZW0gc2FtcGxlIHdhcyByZW1vdmVkIGZyb20gRE9NLCBwcm9iYWJseSBjYXVzZWQgYnkgd3JvbmcgZGF0YS4gUmVzZXQgbGlzdCBkYXRhIHdpdGggYXJyYXknKTtcblxuICAgIC8vIEFkZCBpdCB0byB0aGUgRE9NXG4gICAgcHJldkNvbXBvbmVudC5kb20uaW5zZXJ0QWZ0ZXIoY29tcG9uZW50LmVsKTtcblxuICAgIC8vIEFkZCB0byBsaXN0IGl0ZW1zXG4gICAgdGhpcy5fc2V0SXRlbShpbmRleCwgY29tcG9uZW50KTtcblxuICAgIC8vIFNob3cgdGhlIGxpc3QgaXRlbSBjb21wb25lbnRcbiAgICBjb21wb25lbnQuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIGluZGV4ICsgMSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuXG5cbmZ1bmN0aW9uIF91cGRhdGVJdGVtc0luZGV4ZXMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgZnJvbUluZGV4ID0gZnJvbUluZGV4IHx8IDA7XG4gICAgdG9JbmRleCA9IHRvSW5kZXggfHwgdGhpcy5jb3VudCgpO1xuICAgIGZvciAodmFyIGkgPSBmcm9tSW5kZXg7IGkgPCB0b0luZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuX2xpc3RJdGVtc1tpXTtcbiAgICAgICAgaWYgKGNvbXBvbmVudClcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtLnNldEluZGV4KGkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignTGlzdDogbm8gaXRlbSBhdCBwb3NpdGlvbicsIGkpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBMaXN0JGFkZEl0ZW1zKGNvdW50LCBpbmRleCkgeyAvLyAsLi4uIGl0ZW1zIGRhdGFcbiAgICB2YXIgaXRlbXNEYXRhID0gXy5zbGljZShhcmd1bWVudHMsIDIpO1xuICAgIGlmIChpdGVtc0RhdGEubGVuZ3RoIDwgY291bnQpIFxuICAgICAgICBpdGVtc0RhdGEuY29uY2F0KF8ucmVwZWF0KGNvdW50IC0gaXRlbXNEYXRhLmxlbmd0aCwge30pKTtcbiAgICB2YXIgc3BsaWNlQXJncyA9IFtpbmRleCwgMF0uY29uY2F0KGl0ZW1zRGF0YSk7XG4gICAgdmFyIGRhdGFGYWNldCA9IHRoaXMub3duZXIuZGF0YTtcbiAgICBkYXRhRmFjZXQuc3BsaWNlLmFwcGx5KGRhdGFGYWNldCwgc3BsaWNlQXJncyk7XG59XG5cblxuLyoqXG4gKiBMaXN0IGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBhIGdpdmVuIG51bWJlciBvZiBpdGVtcyB1c2luZyB0ZW1wbGF0ZSByZW5kZXJpbmcgcmF0aGVyIHRoYW4gYWRkaW5nIGVsZW1lbnRzIG9uZSBieSBvbmVcbiAqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGNvdW50IG51bWJlciBvZiBpdGVtcyB0byBhZGRcbiAqIEBwYXJhbSB7W0ludGVnZXJdfSBpbmRleCBvcHRpb25hbCBpbmRleCBvZiBpdGVtIGFmdGVyIHdoaWNoIHRvIGFkZFxuICovXG5mdW5jdGlvbiBMaXN0JF9hZGRJdGVtcyhjb3VudCwgaW5kZXgpIHtcbiAgICBjaGVjayhjb3VudCwgTWF0Y2guSW50ZWdlcik7XG4gICAgaWYgKGNvdW50IDwgMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGFkZCBuZWdhdGl2ZSBudW1iZXIgb2YgaXRlbXMnKTtcblxuICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbXNIVE1MID0gdGhpcy5pdGVtc1RlbXBsYXRlKHtcbiAgICAgICAgY29tcG9uZW50TmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgY291bnQ6IGNvdW50XG4gICAgfSk7XG5cbiAgICB2YXIgd3JhcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgd3JhcEVsLmlubmVySFRNTCA9IGl0ZW1zSFRNTDtcblxuICAgIG1pbG9CaW5kZXIod3JhcEVsLCB0aGlzLm93bmVyLmNvbnRhaW5lci5zY29wZSk7XG4gICAgdmFyIGNoaWxkcmVuID0gZG9tVXRpbHMuY2hpbGRyZW4od3JhcEVsKTtcblxuICAgIGlmIChjb3VudCAhPSBjaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgIGxvZ2dlci5lcnJvcignbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIGlzIGRpZmZlcmVudCBmcm9tIHJlcXVlc3RlZCcpO1xuXG4gICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICB2YXIgbGlzdExlbmd0aCA9IHRoaXMuY291bnQoKTtcbiAgICAgICAgdmFyIHNwbGljZUluZGV4ID0gaW5kZXggPCAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2YgaW5kZXggPT0gJ3VuZGVmaW5lZCcgfHwgaW5kZXggPiBsaXN0TGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGlzdExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGluZGV4O1xuXG4gICAgICAgIHZhciBwcmV2Q29tcG9uZW50ID0gc3BsaWNlSW5kZXggPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuaXRlbVNhbXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2xpc3RJdGVtc1tzcGxpY2VJbmRleCAtIDFdO1xuXG4gICAgICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgICAsIG5ld0NvbXBvbmVudHMgPSBbXTtcblxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGVsLCBpKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG4gICAgICAgICAgICBpZiAoISBjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcignTGlzdDogZWxlbWVudCBpbiBuZXcgaXRlbXMgaXMgbm90IGEgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICBuZXdDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEl0ZW0oc3BsaWNlSW5kZXgrKywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICBfdXBkYXRlSXRlbXNJbmRleGVzLmNhbGwodGhpcywgc3BsaWNlSW5kZXgpO1xuXG4gICAgICAgIGlmICghcHJldkNvbXBvbmVudC5lbC5wYXJlbnROb2RlKVxuICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdsaXN0IGl0ZW0gc2FtcGxlIHdhcyByZW1vdmVkIGZyb20gRE9NLCBwcm9iYWJseSBjYXVzZWQgYnkgd3JvbmcgZGF0YS4gUmVzZXQgbGlzdCBkYXRhIHdpdGggYXJyYXknKTtcblxuICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIERPTVxuICAgICAgICBwcmV2Q29tcG9uZW50LmRvbS5pbnNlcnRBZnRlcihmcmFnKTtcblxuICAgICAgICBfLmRlZmVyTWV0aG9kKG5ld0NvbXBvbmVudHMsICdmb3JFYWNoJywgZnVuY3Rpb24oY29tcCkge1xuICAgICAgICAgICAgY29tcC5icm9hZGNhc3QoJ3N0YXRlcmVhZHknKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICogQHJldHVybiB7QXJyYXlbT2JqZWN0XX0gVGhlIHNwbGljZWQgZGF0YVxuICovXG5mdW5jdGlvbiBMaXN0JHJlbW92ZUl0ZW0oaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5kYXRhLnNwbGljZShpbmRleCwgMSk7XG59XG5cblxuLyoqXG4gKiBMaXN0IGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gZXh0cmFjdFxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgZXh0cmFjdGVkIGl0ZW1cbiAqL1xuZnVuY3Rpb24gTGlzdCRleHRyYWN0SXRlbShpbmRleCkge1xuICAgIHZhciBpdGVtQ29tcCA9IHRoaXMuX3JlbW92ZUl0ZW0oaW5kZXgsIGZhbHNlKTtcbiAgICB0aGlzLl91cGRhdGVEYXRhUGF0aHMoaW5kZXgsIHRoaXMuY291bnQoKSk7XG4gICAgcmV0dXJuIGl0ZW1Db21wO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgaXRlbSwgcmV0dXJucyB0aGUgcmVtb3ZlZCBpdGVtIHRoYXQgaXMgZGVzdHJveWVkIGJ5IGRlZmF1bHQuXG4gKiBcbiAqIEBwYXJhbSAge051bWJlcn0gaW5kZXggaXRlbSBpbmRleFxuICogQHBhcmFtICB7Qm9vbGVhbn0gZG9EZXN0cm95SXRlbSBvcHRpb25hbCBmYWxzZSB0byBwcmV2ZW50IGl0ZW0gZGVzdHJ1Y3Rpb24sIHRydWUgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBMaXN0JF9yZW1vdmVJdGVtKGluZGV4LCBkb0Rlc3Ryb3lJdGVtKSB7XG4gICAgdmFyIGNvbXAgPSB0aGlzLml0ZW0oaW5kZXgpO1xuXG4gICAgaWYgKCEgY29tcClcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdhdHRlbXB0IHRvIHJlbW92ZSBsaXN0IGl0ZW0gd2l0aCBpZCB0aGF0IGRvZXMgbm90IGV4aXN0Jyk7XG5cbiAgICB0aGlzLl9saXN0SXRlbXNbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgIGRlbGV0ZSB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXAubmFtZV07XG4gICAgaWYgKGRvRGVzdHJveUl0ZW0gIT09IGZhbHNlKSBjb21wLmRlc3Ryb3koKTtcbiAgICBlbHNlIHtcbiAgICAgICAgY29tcC5yZW1vdmUoKTtcbiAgICAgICAgY29tcC5kb20ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIGluZGV4KTtcblxuICAgIHJldHVybiBjb21wO1xufVxuXG5cbmZ1bmN0aW9uIExpc3QkcmVwbGFjZUl0ZW0oaW5kZXgsIG5ld0l0ZW0pe1xuICAgIHZhciBvbGRJdGVtID0gdGhpcy5pdGVtKGluZGV4KTtcbiAgICBvbGRJdGVtLmRvbS5pbnNlcnRBZnRlcihuZXdJdGVtLmVsKTtcbiAgICB0aGlzLl9yZW1vdmVJdGVtKGluZGV4KTtcbiAgICB0aGlzLl9zZXRJdGVtKGluZGV4LCBuZXdJdGVtKTtcbn1cblxuXG4vLyBSZXR1cm5zIHRoZSBwcmV2aW91cyBpdGVtIGNvbXBvbmVudCBnaXZlbiBhbiBpbmRleFxuZnVuY3Rpb24gX2l0ZW1QcmV2aW91c0NvbXBvbmVudChpbmRleCkge1xuICAgIHdoaWxlIChpbmRleCA+PSAwICYmICEgdGhpcy5fbGlzdEl0ZW1zW2luZGV4XSlcbiAgICAgICAgaW5kZXgtLTtcblxuICAgIHJldHVybiBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9saXN0SXRlbXNbaW5kZXhdXG4gICAgICAgICAgICAgICAgOiB0aGlzLml0ZW1TYW1wbGU7XG59XG5cblxuLy8gdG9JbmRleCBpcyBub3QgaW5jbHVkZWRcbi8vIG5vIHJhbmdlIGNoZWNraW5nIGlzIG1hZGVcbmZ1bmN0aW9uIExpc3QkX3VwZGF0ZURhdGFQYXRocyhmcm9tSW5kZXgsIHRvSW5kZXgpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgdG9JbmRleDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtKGkpO1xuICAgICAgICBpZiAoaXRlbSlcbiAgICAgICAgICAgIGl0ZW0uZGF0YS5fcGF0aCA9ICdbJyArIGkgKyAnXSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2ltaWxhciB0byBmb3JFYWNoIG1ldGhvZCBvZiBBcnJheSwgaXRlcmF0ZXMgZWFjaCBvZiB0aGUgY2hpbGQgaXRlbXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBbiBpdGVyYXRvciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBjaGlsZCBpdGVtLlxuICogQHBhcmFtIHtbdHlwZV19ICAgdGhpc0FyZyAgQ29udGV4dCB0byBzZXQgYHRoaXNgLlxuICovXG5mdW5jdGlvbiBMaXN0JGVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB0aGlzLl9saXN0SXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICBpZiAoaXRlbSkgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gcGFzc2VzIGl0ZW0sIGluZGV4IHRvIGNhbGxiYWNrXG4gICAgICAgIGVsc2UgbG9nZ2VyLndhcm4oJ0xpc3QkZWFjaDogaXRlbScsIGluZGV4LCAnaXMgdW5kZWZpbmVkJyk7XG4gICAgfSwgdGhpc0FyZyB8fCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVzdHJveXMgdGhlIGxpc3RcbiAqL1xuZnVuY3Rpb24gTGlzdCRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLml0ZW1TYW1wbGUpIHRoaXMuaXRlbVNhbXBsZS5kZXN0cm95KHRydWUpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1vZGVsID0gbWlsb0NvcmUuTW9kZWxcbiAgICAsIE1peGluID0gbWlsb0NvcmUuY2xhc3Nlcy5NaXhpblxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8vIGdlbmVyaWMgZHJhZyBoYW5kbGVyLCBzaG91bGQgYmUgb3ZlcnJpZGRlblxudmFyIE1vZGVsRmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnTW9kZWwnKTtcblxuXy5leHRlbmRQcm90byhNb2RlbEZhY2V0LCB7XG4gICAgaW5pdDogTW9kZWxGYWNldCRpbml0LFxuICAgIGdldFN0YXRlOiBNb2RlbEZhY2V0JGdldFN0YXRlLFxuICAgIHNldFN0YXRlOiBNb2RlbEZhY2V0JHNldFN0YXRlLFxuICAgIF9jcmVhdGVNZXNzZW5nZXI6IE1vZGVsRmFjZXQkX2NyZWF0ZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiBNb2RlbEZhY2V0JGRlc3Ryb3lcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoTW9kZWxGYWNldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxGYWNldDtcblxuXG4vKipcbiAqIEV4cG9zZSBNb2RlbCBjbGFzcyBtZXRob2RzIG9uIE1vZGVsRmFjZXRcbiAqL1xuTW9kZWwudXNlV2l0aChNb2RlbEZhY2V0LCAnbScpO1xuXG5cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkaW5pdCgpIHtcbiAgICB0aGlzLm0gPSBuZXcgTW9kZWwodGhpcy5jb25maWcuZGF0YSwgdGhpcyk7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAvLyB0aGlzLm0ucHJveHlNZXRob2RzKHRoaXMpOyAvLyBDcmVhdGVzIG1vZGVsJ3MgbWV0aG9kcyBkaXJlY3RseSBvbiBmYWNldFxufVxuXG5cbi8qKlxuICogTW9kZWxGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNpbXBseSByZXR1cm5zIG1vZGVsIGRhdGFcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkZ2V0U3RhdGUoKSB7XG4gICAgdmFyIG1vZGVsVmFsdWUgPSB0aGlzLm0uZ2V0KCk7XG4gICAgaWYgKHR5cGVvZiBtb2RlbFZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICBtb2RlbFZhbHVlID0gXy5kZWVwQ2xvbmUobW9kZWxWYWx1ZSk7XG4gICAgcmV0dXJuIHsgc3RhdGU6IG1vZGVsVmFsdWUgfTtcbn1cblxuXG4vKipcbiAqIE1vZGVsRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gTW9kZWxGYWNldCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLm0uc2V0KHN0YXRlLnN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JF9jcmVhdGVNZXNzZW5nZXIoKSB7IC8vIENhbGxlZCBieSBpbmhlcml0ZWQgaW5pdFxuICAgIHRoaXMuX21lc3NlbmdlciA9IHRoaXMubS5fbWVzc2VuZ2VyO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkZGVzdHJveSgpIHtcbiAgICB0aGlzLm0uZGVzdHJveSgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1vZGVsID0gbWlsb0NvcmUuTW9kZWxcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyBnZW5lcmljIGRyYWcgaGFuZGxlciwgc2hvdWxkIGJlIG92ZXJyaWRkZW5cbnZhciBPcHRpb25zID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ09wdGlvbnMnKTtcblxuXy5leHRlbmRQcm90byhPcHRpb25zLCB7XG4gICAgaW5pdDogT3B0aW9ucyRpbml0LFxuICAgIGRlc3Ryb3k6IE9wdGlvbnMkZGVzdHJveSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBPcHRpb25zJF9jcmVhdGVNZXNzZW5nZXJcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoT3B0aW9ucyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT3B0aW9ucztcblxuXG5mdW5jdGlvbiBPcHRpb25zJGluaXQoKSB7XG4gICAgdGhpcy5tID0gbmV3IE1vZGVsKHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5tLnByb3h5TWV0aG9kcyh0aGlzKTsgLy8gQ3JlYXRlcyBtb2RlbCdzIG1ldGhvZHMgZGlyZWN0bHkgb24gZmFjZXRcbn1cblxuXG5mdW5jdGlvbiBPcHRpb25zJF9jcmVhdGVNZXNzZW5nZXIoKSB7IC8vIENhbGxlZCBieSBpbmhlcml0ZWQgaW5pdFxuICAgIHRoaXMuX21lc3NlbmdlciA9IHRoaXMubS5fbWVzc2VuZ2VyO1xufVxuXG5cbmZ1bmN0aW9uIE9wdGlvbnMkZGVzdHJveSgpIHtcbiAgICB0aGlzLm0uZGVzdHJveSgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJjb21wb25lbnRzLWZhY2V0cy10ZW1wbGF0ZVwiPjwvYT5cbi8vICMjI3RlbXBsYXRlIGZhY2V0XG5cbi8vIHNpbXBsaWZpZXMgcmVuZGVyaW5nIG9mIGNvbXBvbmVudCBlbGVtZW50IGZyb20gdGVtcGxhdGUuXG4vLyAgIEFueSB0ZW1wbGF0aW5nIGVuZ2luZyBjYW4gYmUgdXNlZCB0aGF0IHN1cHBvcnRzIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG4vLyAgIChvciB5b3UgY2FuIG1vY2sgdGhpcyBjb21waWxhdGlvbiBlYXNpbHkgYnkgY3JlYXRpbmcgY2xvc3VyZSBzdG9yaW5nXG4vLyAgIHRlbXBsYXRlIHN0cmluZyBpbiBjYXNlIHlvdXIgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBjb21waWxhdGlvbikuXG4vLyAgIEJ5IGRlZmF1bHQgbWlsbyB1c2VzIFtkb1RdKCksIHRoZSBtb3N0IHZlcnNhdGlsZSwgY29uc2Npc2UgYW5kIGF0IHRoZVxuLy8gICBzYW1lIHRpbWUgdGhlIGZhc3Rlc3QgdGVtcGxhdGluZyBlbmdpbmUuXG4vLyAgIElmIHlvdSB1c2UgbWlsbyBpbiBicm93c2VyLCBpdCBpcyB0aGUgcGFydCBvZiBtaWxvIGJ1bmRsZSBhbmQgYXZhaWxhYmxlXG4vLyAgIGFzIGdsb2JhbCB2YXJpYWJsZSBgZG9UYC5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBiaW5kZXIgPSByZXF1aXJlKCcuLi8uLi9iaW5kZXInKTtcblxuXG4vLyBkYXRhIG1vZGVsIGNvbm5lY3Rpb24gZmFjZXRcbnZhciBUZW1wbGF0ZSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdUZW1wbGF0ZScpO1xuXG5fLmV4dGVuZFByb3RvKFRlbXBsYXRlLCB7XG4gICAgaW5pdDogVGVtcGxhdGUkaW5pdCxcbiAgICBzdGFydDogVGVtcGxhdGUkc3RhcnQsXG4gICAgc2V0OiBUZW1wbGF0ZSRzZXQsXG4gICAgZ2V0Q29tcGlsZWQ6IFRlbXBsYXRlJGdldENvbXBpbGVkLFxuICAgIHJlbmRlcjogVGVtcGxhdGUkcmVuZGVyLFxuICAgIGJpbmRlcjogVGVtcGxhdGUkYmluZGVyXG5cbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChUZW1wbGF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGVtcGxhdGU7XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gdGVtcGxhdGVzIGFyZSBpbnRlcnBvbGF0ZWQgd2l0aCBkZWZhdWx0IChkb1QpIG9yIGNvbmZpZ3VyZWQgZW5naW5lICh0aGlzLmNvbmZpZy5jb21waWxlKVxuICAgIC8vIHVubGVzcyB0aGlzLmNvbmZpZy5pbnRlcnBvbGF0ZSBpcyBmYWxzZVxuICAgIHZhciBjb21waWxlID0gdGhpcy5jb25maWcuaW50ZXJwb2xhdGUgPT09IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5jb25maWcuY29tcGlsZSB8fCBtaWxvLmNvbmZpZy50ZW1wbGF0ZS5jb21waWxlO1xuXG4gICAgdGhpcy5zZXQodGhpcy5jb25maWcudGVtcGxhdGUgfHwgJycsIGNvbXBpbGUsIHRoaXMuY29uZmlnLmNvbXBpbGVPcHRpb25zKTtcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodGhpcy5jb25maWcuYXV0b1JlbmRlcikge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuYXV0b0JpbmRlcilcbiAgICAgICAgICAgIHRoaXMuYmluZGVyKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGdldENvbXBpbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZTtcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRzZXQodGVtcGxhdGVTdHIsIGNvbXBpbGUsIGNvbXBpbGVPcHRpb25zKSB7XG4gICAgY2hlY2sodGVtcGxhdGVTdHIsIE1hdGNoLk9uZU9mKFN0cmluZywgRnVuY3Rpb24pKTtcbiAgICBjaGVjayhjb21waWxlLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuXG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZVN0ciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IHRlbXBsYXRlU3RyO1xuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl90ZW1wbGF0ZVN0ciA9IHRlbXBsYXRlU3RyO1xuICAgICAgICBpZiAoY29tcGlsZSlcbiAgICAgICAgICAgIHRoaXMuX2NvbXBpbGUgPSBjb21waWxlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb21waWxlID0gdGhpcy5fY29tcGlsZTtcblxuICAgICAgICBpZiAoY29tcGlsZSlcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gY29tcGlsZSh0ZW1wbGF0ZVN0ciwgY29tcGlsZU9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJHJlbmRlcihkYXRhKSB7IC8vIHdlIG5lZWQgZGF0YSBvbmx5IGlmIHVzZSB0ZW1wbGF0aW5nIGVuZ2luZVxuICAgIHRoaXMub3duZXIuZWwuaW5uZXJIVE1MID0gdGhpcy5fdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl90ZW1wbGF0ZShkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX3RlbXBsYXRlU3RyO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkYmluZGVyKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmNvbnRhaW5lcilcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIuY29udGFpbmVyLmJpbmRlcigpO1xuICAgIGVsc2VcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdUZW1wbGF0ZUZhY2V0OiBCaW5kZXIgY2FsbGVkIHdpdGhvdXQgY29udGFpbmVyIGZhY2V0LicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLyoqXG4gKiBUcmFuc2ZlciBmYWNldCBpcyBkZXNpZ25lZCBmb3IgY29tcG9uZW50cyB0byBiZSBhYmxlIHRvIHJlcHJlc2VudCBvdGhlciBjb21wb25lbnRzXG4gKiBJZiBhIFtDb21wb25lbnRdKC4uL2NfY2xhc3MuanMuaHRtbCkgaGFzIFRyYW5zZmVyIGZhY2V0LCB3aGVuIGBDb21wb25lbnQuZ2V0U3RhdGVgIGlzIGNhbGxlZCBmb3IgdGhpcyBjb21wb25ldCBpdCByZXR1cm5zIHByZXZpb3VzbHkgc2F2ZWQgZGF0YSwgcG9zc2libHkgZnJvbSBhbm90aGVyIGNvbXBvbmVudC5cbiAqIEZvciBleGFtcGxlLCBhIGxpc3Qgb2YgZG9jdW1lbnRzIGNhbiB1c2UgdGhpcyBmYWNldCBzbyB0aGF0IGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBjYW4gc3RvcmUgYWN0dWFsIGRvY3VtZW50IGNvbXBvbmVudCBvbiBpdC5cbiAqL1xudmFyIFRyYW5zZmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ1RyYW5zZmVyJyk7XG5cbl8uZXh0ZW5kUHJvdG8oVHJhbnNmZXIsIHtcbiAgICBpbml0OiBUcmFuc2ZlciRpbml0LFxuICAgIGdldFN0YXRlOiBUcmFuc2ZlciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogVHJhbnNmZXIkc2V0U3RhdGUsXG4gICAgc2V0QWN0aXZlU3RhdGU6IFRyYW5zZmVyJHNldEFjdGl2ZVN0YXRlLFxuICAgIHNldFN0YXRlV2l0aEtleTogVHJhbnNmZXIkc2V0U3RhdGVXaXRoS2V5LFxuICAgIGdldFN0YXRlV2l0aEtleTogVHJhbnNmZXIkZ2V0U3RhdGVXaXRoS2V5LFxuICAgIGdldENvbXBvbmVudE1ldGE6IFRyYW5zZmVyJGdldENvbXBvbmVudE1ldGFcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoVHJhbnNmZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZmVyO1xuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9hY3RpdmVTdGF0ZSA9ICcnO1xuICAgIHRoaXMuX2RlZmF1bHRLZXkgPSAnJztcbiAgICB0aGlzLl9zdGF0ZSA9IHt9O1xufVxuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRyYW5zZmVyIHN0YXRlIGZvciBjb21wb25lbnQuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVbdGhpcy5fYWN0aXZlU3RhdGVdIHx8IHRoaXMuX3N0YXRlW3RoaXMuX2RlZmF1bHRLZXldO1xufVxuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRyYW5zZmVyIHN0YXRlIGZvciBjb21wb25lbnQuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldFN0YXRlKHN0YXRlKSB7XG4gICAgdGhpcy5fc3RhdGVbJyddID0gc3RhdGU7XG4gICAgdGhpcy5zZXRBY3RpdmVTdGF0ZSgnJyk7XG59XG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUgKHVzZWQgYnkgZ2V0U3RhdGUpXG4gKiBAcGFyYW0ge1t0eXBlXX0ga2V5IFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkc2V0QWN0aXZlU3RhdGUoa2V5KSB7XG4gICAgdGhpcy5fYWN0aXZlU3RhdGUgPSBrZXk7XG59XG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRyYW5zZmVyIHN0YXRlIGZvciBjb21wb25lbnQgd2l0aG91dCBkZWZhdWx0IGtleS4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYW5vdGhlciBjb21wb25lbnQgYnkgdXNpbmcgYENvbXBvbmVudC5nZXRTdGF0ZWBcbiAqIFdoZW4gdGhlIGFjdGl2ZSBzdGF0ZSBpcyBzZXQgdG8gdGhlIGV4cGVjdGVkIGtleVxuICogQHBhcmFtIHtbdHlwZV19IGtleSAgIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSB7W3R5cGVdfSBzdGF0ZSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzRGVmYXVsdEtleSAoT3B0aW9uYWwpXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldFN0YXRlV2l0aEtleShrZXksIHN0YXRlLCBpc0RlZmF1bHRLZXkpIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2ZlciRzZXRTdGF0ZVdpdGhLZXk6IG5vIGtleScpO1xuXG4gICAgaWYgKGlzRGVmYXVsdEtleSlcbiAgICAgICAgdGhpcy5fZGVmYXVsdEtleSA9IGtleTtcbiAgICBlbHNlXG4gICAgICAgIHRoaXMuX2RlZmF1bHRLZXkgPSB0aGlzLl9kZWZhdWx0S2V5IHx8IGtleTtcblxuICAgIHRoaXMuX3N0YXRlW2tleV0gPSBzdGF0ZTtcbiAgICB0aGlzLnNldEFjdGl2ZVN0YXRlKGtleSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0U3RhdGVXaXRoS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmIHRoaXMuX3N0YXRlW2tleV07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0Q29tcG9uZW50TWV0YSgpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcE5hbWU6IHN0YXRlICYmIHN0YXRlLmNvbXBOYW1lLFxuICAgICAgICBjb21wQ2xhc3M6IHN0YXRlICYmIHN0YXRlLmNvbXBDbGFzc1xuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDbGFzc1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vYWJzdHJhY3QvcmVnaXN0cnknKVxuICAgICwgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0Jyk7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHNgXG4gKiBDb21wb25lbnQgZmFjZXRzIHJlZ2lzdHJ5LiBBbiBpbnN0YW5jZSBvZiBbQ2xhc3NSZWdpc3RyeV0oLi4vLi4vYWJzdHJhY3QvcmVnaXN0cnkuanMuaHRtbCkgY2xhc3MgdGhhdCBpcyB1c2VkIGJ5IG1pbG8gdG8gcmVnaXN0ZXIgYW5kIGZpbmQgZmFjZXRzLlxuICovXG4gdmFyIGZhY2V0c1JlZ2lzdHJ5ID0gbmV3IENsYXNzUmVnaXN0cnkoQ29tcG9uZW50RmFjZXQpO1xuXG5cbi8vIEFkZHMgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBmYWNldHMgb2YgY29tcG9uZW50cyB0byB0aGUgcmVnaXN0cnkuXG5mYWNldHNSZWdpc3RyeS5hZGQoQ29tcG9uZW50RmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY2V0c1JlZ2lzdHJ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudEluZm87XG5cblxuLyoqXG4gKiBTaW1wbGUgY2xhc3MgdG8gaG9sZCBpbmZvcm1hdGlvbiBhbGxvd2luZyB0byBjcmVhdGUvY29weSBjb21wb25lbnQgdXNpbmcgW2BDb21wb25lbnQuY3JlYXRlYF0oLi9jX2NsYXNzLmpzLmh0bWwjY3JlYXRlKSBhbmQgW2BDb21wb25lbnQuY29weWBdKC4vY19jbGFzcy5qcy5odG1sI2NvcHkpLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgb2JqZWN0IHRoZSBjb21wb25lbnQgYmVsb2dzIHRvLCB1c3VhbGx5IGVpdGhlciB0b3AgbGV2ZWwgc2NvcGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IFttaWxvLmJpbmRlcl0oLi4vYmluZGVyLmpzLmh0bWwpIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgW0NvbnRhaW5lcl0oLi9jX2ZhY2V0cy9Db250YWluZXIuanMuaHRtbCkgZmFjZXQgb2YgY29udGFpbmluZyBjb21wb25lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgdGhlIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0b1xuICogQHBhcmFtIHtCaW5kQXR0cmlidXRlfSBhdHRyIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgdGhhdCB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHdpdGhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50SW5mb31cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyhzY29wZSwgZWwsIGF0dHIsIHRocm93T25FcnJvcnMpIHtcbiAgICBhdHRyLnBhcnNlKCkudmFsaWRhdGUoKTtcblxuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICB0aGlzLm5hbWUgPSBhdHRyLmNvbXBOYW1lO1xuICAgIHRoaXMuQ29tcG9uZW50Q2xhc3MgPSBnZXRDb21wb25lbnRDbGFzcyhhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB0aGlzLmV4dHJhRmFjZXRzQ2xhc3NlcyA9IGdldENvbXBvbmVudEV4dHJhRmFjZXRzKHRoaXMuQ29tcG9uZW50Q2xhc3MsIGF0dHIsIHRocm93T25FcnJvcnMpO1xuXG4gICAgaWYgKHRoaXMuQ29tcG9uZW50Q2xhc3NcbiAgICAgICAgICAgICYmIGhhc0NvbnRhaW5lckZhY2V0KHRoaXMuQ29tcG9uZW50Q2xhc3MsIHRoaXMuZXh0cmFGYWNldHNDbGFzc2VzKSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHt9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNDb21wb25lbnRJbmZvIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKiBcbiAqIC0gW2Rlc3Ryb3ldKCNDb21wb25lbnRJbmZvJGRlc3Ryb3kpXG4gKiAtIFtyZW5hbWVdKCNDb21wb25lbnRJbmZvJHJlbmFtZSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21wb25lbnRJbmZvLCB7XG4gICAgZGVzdHJveTogQ29tcG9uZW50SW5mbyRkZXN0cm95LFxuICAgIHJlbmFtZTogQ29tcG9uZW50SW5mbyRyZW5hbWVcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RcbiAqIERlc3Ryb3lzIENvbXBvbmVudEluZm8gYnkgcmVtb3ZpbmcgdGhlIHJlZmVyZW5jZXMgdG8gRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyRkZXN0cm95KCkge1xuICAgIGRlbGV0ZSB0aGlzLmVsO1xuICAgIHRoaXMuYXR0ci5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnRJbmZvIGluc3RhbmNlIG1ldGhvZFxuICogUmVuYW1lcyBDb21wb25lbnRJbmZvIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7W1N0cmluZ119IG5hbWUgb3B0aW9uYWwgbmV3IGNvbXBvbmVudCBuYW1lLCBnZW5lcmF0ZWQgZnJvbSB0aW1lc3RhbXAgYnkgZGVmYXVsdFxuICogQHBhcmFtIHtbQm9vbGVhbl19IHJlbmFtZUluU2NvcGUgb3B0aW9uYWwgZmFsc2UgdG8gbm90IHJlbmFtZSBDb21wb25lbnRJbmZvIG9iamVjdCBpbiBpdHMgc2NvcGUsIHRydWUgYnkgZGVmYXVsdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnRJbmZvJHJlbmFtZShuYW1lLCByZW5hbWVJblNjb3BlKSB7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29tcG9uZW50TmFtZSgpO1xuICAgIFNjb3BlLnJlbmFtZSh0aGlzLCBuYW1lLCByZW5hbWVJblNjb3BlKTtcbiAgICB0aGlzLmF0dHIuY29tcE5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYXR0ci5kZWNvcmF0ZSgpO1xufVxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudENsYXNzKGF0dHIsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRzUmVnaXN0cnkuZ2V0KGF0dHIuY29tcENsYXNzKTtcbiAgICBpZiAoISBDb21wb25lbnRDbGFzcylcbiAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NsYXNzICcgKyBhdHRyLmNvbXBDbGFzcyArICcgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50RXh0cmFGYWNldHMoQ29tcG9uZW50Q2xhc3MsIGF0dHIsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgZmFjZXRzID0gYXR0ci5jb21wRmFjZXRzXG4gICAgICAgICwgZXh0cmFGYWNldHNDbGFzc2VzID0ge307XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmYWNldHMpKVxuICAgICAgICBmYWNldHMuZm9yRWFjaChmdW5jdGlvbihmY3ROYW1lKSB7XG4gICAgICAgICAgICBmY3ROYW1lID0gXy5maXJzdFVwcGVyQ2FzZShmY3ROYW1lKTtcbiAgICAgICAgICAgIGlmIChDb21wb25lbnRDbGFzcy5oYXNGYWNldChmY3ROYW1lKSlcbiAgICAgICAgICAgICAgICByZXBvcnRCaW5kZXJFcnJvcih0aHJvd09uRXJyb3JzLCAnY2xhc3MgJyArIENvbXBvbmVudENsYXNzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGFscmVhZHkgaGFzIGZhY2V0ICcgKyBmY3ROYW1lKTtcbiAgICAgICAgICAgIGlmIChleHRyYUZhY2V0c0NsYXNzZXNbZmN0TmFtZV0pXG4gICAgICAgICAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NvbXBvbmVudCAnICsgYXR0ci5jb21wTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYWxyZWFkeSBoYXMgZmFjZXQgJyArIGZjdE5hbWUpO1xuICAgICAgICAgICAgdmFyIEZhY2V0Q2xhc3MgPSBmYWNldHNSZWdpc3RyeS5nZXQoZmN0TmFtZSk7XG4gICAgICAgICAgICBleHRyYUZhY2V0c0NsYXNzZXNbZmN0TmFtZV0gPSBGYWNldENsYXNzO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBleHRyYUZhY2V0c0NsYXNzZXM7XG59XG5cblxuZnVuY3Rpb24gcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgbWVzc2FnZSkge1xuICAgIGlmICh0aHJvd09uRXJyb3JzID09PSBmYWxzZSlcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdDb21wb25lbnRJbmZvIGJpbmRlciBlcnJvcjonLCBtZXNzYWdlKTtcbiAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn07XG5cblxuZnVuY3Rpb24gaGFzQ29udGFpbmVyRmFjZXQoQ29tcG9uZW50Q2xhc3MsIGV4dHJhRmFjZXRzQ2xhc3Nlcykge1xuICAgIHJldHVybiAoQ29tcG9uZW50Q2xhc3MuaGFzRmFjZXQoJ2NvbnRhaW5lcicpXG4gICAgICAgIHx8ICdDb250YWluZXInIGluIGV4dHJhRmFjZXRzQ2xhc3Nlc1xuICAgICAgICB8fCBfLnNvbWVLZXkoZXh0cmFGYWNldHNDbGFzc2VzLCBmYWNldFJlcXVpcmVzQ29udGFpbmVyKVxuICAgICAgICB8fCBjbGFzc0hhc0ZhY2V0VGhhdFJlcXVpcmVzQ29udGFpbmVyKCkpO1xuXG4gICAgZnVuY3Rpb24gY2xhc3NIYXNGYWNldFRoYXRSZXF1aXJlc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIChDb21wb25lbnRDbGFzcy5wcm90b3R5cGUuZmFjZXRzQ2xhc3Nlc1xuICAgICAgICAgICAgJiYgXy5zb21lS2V5KENvbXBvbmVudENsYXNzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzLCBmYWNldFJlcXVpcmVzQ29udGFpbmVyKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmYWNldFJlcXVpcmVzQ29udGFpbmVyKEZhY2V0Q2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIEZhY2V0Q2xhc3MucmVxdWlyZXNGYWNldCgnY29udGFpbmVyJyk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4vY19jbGFzcycpO1xuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmNvbXBvbmVudHNgXG4gKiBBbiBpbnN0YW5jZSBvZiBbQ2xhc3NSZWdpc3RyeV0oLi4vYWJzdHJhY3QvcmVnaXN0cnkuanMuaHRtbCkgY2xhc3MgdGhhdCBpcyB1c2VkIGJ5IG1pbG8gdG8gcmVnaXN0ZXIgYW5kIGZpbmQgY29tcG9uZW50cy5cbiAqL1xudmFyIGNvbXBvbmVudHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbXBvbmVudCk7XG5cbi8vIGFkZCBjb21tb24gYW5jZXN0b3IgdG8gYWxsIGNvbXBvbmVudHMgdG8gdGhlIHJlZ2lzdHJ5LlxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChDb21wb25lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHNSZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgY29tcG9uZW50VXRpbHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc0NvbXBvbmVudDogaXNDb21wb25lbnQsXG4gICAgZ2V0Q29tcG9uZW50OiBnZXRDb21wb25lbnQsXG4gICAgZ2V0Q29udGFpbmluZ0NvbXBvbmVudDogZ2V0Q29udGFpbmluZ0NvbXBvbmVudCxcbiAgICBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmM6IF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuY1xufTtcblxuXG4vKipcbiAqIGlzQ29tcG9uZW50XG4gKlxuICogQ2hlY2tzIGlmIGVsZW1lbnQgaGFzIGEgY29tcG9uZW50IGF0dGFjaGVkIHRvIGl0IGJ5XG4gKiBjaGVja2luZyB0aGUgcHJlc2VuY2Ugb2YgcHJvcGVydHkgZGlmaW5lZCBpbiBtaWxvLmNvbmZpZ1xuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUsIGlmIGl0IGhhcyBtaWxvIGNvbXBvbmVudCBhdHRhY2hlZCB0byBpdFxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudChlbCkge1xuICAgIHJldHVybiBlbC5oYXNPd25Qcm9wZXJ0eShjb25maWcuY29tcG9uZW50UmVmKTtcbn1cblxuXG4vKipcbiAqIGdldENvbXBvbmVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gY29tcG9uZW50IGF0dGFjaGVkIHRvIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50KGVsKSB7XG4gICAgcmV0dXJuIGVsICYmIGVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2xvc2VzdCBjb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LFxuICogb3B0aW9uYWxseSwgb25seSBjb21wb25lbnQgdGhhdCBwYXNzZXMgYGNvbmRpdGlvbmAgdGVzdCBvciBjb250YWlucyBzcGVjaWZpZWQgZmFjZXRcbiAqXG4gKiBVbmxlc3MgYHJldHVybkN1cnJlbnRgIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBjb21wb25lbnQgb2YgdGhlIGVsZW1lbnQgKHRydWUgYnkgZGVmYXVsdCkuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIERPTSBFbGVtZW50IG9yIHRleHQgTm9kZVxuICogQHBhcmFtIHtCb29sZWFufSByZXR1cm5DdXJyZW50IG9wdGlvbmFsIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb21wb25lbnQgb2YgdGhlIGVsZW1lbnQgY2FuIGJlIHJldHVybmVkLiBUcnVlIGJ5IGRlZmF1bHQsIHNob3VsZCBiZSBmYWxzZSB0byByZXR1cm4gb25seSBhbmNlc3RvcnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gY29uZGl0aW9uT3JGYWNldCBvcHRpb25hbCBjb25kaXRpb24gdGhhdCBjb21wb25lbnQgc2hvdWxkIHBhc3MgKG9yIGZhY2V0IG5hbWUgaXQgc2hvdWxkIGNvbnRhaW4pXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFxuICovXG5mdW5jdGlvbiBnZXRDb250YWluaW5nQ29tcG9uZW50KG5vZGUsIHJldHVybkN1cnJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICAvLyBjaGVjayhub2RlLCBOb2RlKTsgLSBjYW4ndCBjaGVjayB0aXlwZSBoZXJlIGFzIGl0IGlzIG1vc3QgbGlrZWx5IGNvbWluZyBmcm9tIGFub3RoZXIgZnJhbWVcbiAgICBjaGVjayhyZXR1cm5DdXJyZW50LCBNYXRjaC5PcHRpb25hbChCb29sZWFuKSk7XG4gICAgY2hlY2soY29uZGl0aW9uT3JGYWNldCwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIFN0cmluZykpKTtcblxuICAgIHZhciBjb25kaXRpb25GdW5jID0gX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jKGNvbmRpdGlvbk9yRmFjZXQpO1xuXG4gICAgcmV0dXJuIF9nZXRDb250YWluaW5nQ29tcG9uZW50KG5vZGUsIHJldHVybkN1cnJlbnQsIGNvbmRpdGlvbkZ1bmMpO1xufVxuXG5cbmZ1bmN0aW9uIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyhjb25kaXRpb25PckZhY2V0KSB7XG4gICAgaWYgKHR5cGVvZiBjb25kaXRpb25PckZhY2V0ID09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBjb25kaXRpb25PckZhY2V0O1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjb25kaXRpb25PckZhY2V0ID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBmYWNldE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGNvbmRpdGlvbk9yRmFjZXQpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgICAgcmV0dXJuIGNvbXAuaGFzRmFjZXQoZmFjZXROYW1lKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2dldENvbnRhaW5pbmdDb21wb25lbnQoZWwsIHJldHVybkN1cnJlbnQsIGNvbmRpdGlvbkZ1bmMpIHtcbiAgICAvLyBXaGVyZSB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgY29tcG9uZW50IGl0IHNob3VsZCBiZSByZXR1cm5lZFxuICAgIC8vIGlmIHJldHVybkN1cnJlbnQgaXMgdHJ1ZSBvciB1bmRlZmluZWRcbiAgICBpZiAocmV0dXJuQ3VycmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdmFyIGNvbXAgPSBnZXRDb21wb25lbnQoZWwpO1xuICAgICAgICBpZiAoY29tcCAmJiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMoY29tcCkpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG4gICAgfVxuXG4gICAgLy8gV2hlcmUgdGhlcmUgaXMgbm8gcGFyZW50IGVsZW1lbnQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdW5kZWZpbmVkXG4gICAgLy8gVGhlIHBhcmVudCBlbGVtZW50IGlzIGNoZWNrZWQgcmVjdXJzaXZlbHlcbiAgICBpZiAoZWwucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuIF9nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLnBhcmVudE5vZGUsIHRydWUsIGNvbmRpdGlvbkZ1bmMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIFZpZXcgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ1ZpZXcnLCBbJ2NvbnRhaW5lciddKTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChWaWV3KTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWV3O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4vZGVfZGF0YScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXJBUEkgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NlbmdlckFQSVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxuLy8gY2xhc3MgdG8gaGFuZGxlIHN1YnNjcmlidGlvbnMgdG8gY2hhbmdlcyBpbiBET00gZm9yIFVJIChtYXliZSBhbHNvIGNvbnRlbnQgZWRpdGFibGUpIGVsZW1lbnRzXG5cbi8qKlxuICogQSBjbGFzc1xuICovXG52YXIgRGF0YU1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnRGF0YU1zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRGF0YU1zZ0FQSSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IERhdGFNc2dBUEkkaW5pdCxcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxuICAgIGNyZWF0ZUludGVybmFsRGF0YTogY3JlYXRlSW50ZXJuYWxEYXRhLFxuXG4gICAgLy8gY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIHZhbHVlOiBEYXRhTXNnQVBJJHZhbHVlXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhTXNnQVBJO1xuXG5cbmZ1bmN0aW9uIERhdGFNc2dBUEkkaW5pdChjb21wb25lbnQpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3MoY29tcG9uZW50LmVsKTtcbn1cblxuXG4vLyBnZXREb21FbGVtZW50RGF0YVZhbHVlXG5mdW5jdGlvbiBEYXRhTXNnQVBJJHZhbHVlKCkgeyAvLyB2YWx1ZSBtZXRob2RcbiAgICB2YXIgY29tcG9uZW50R2V0dGVyID0gdGhpcy5jb21wb25lbnQuZGF0YS5jb25maWcuZ2V0O1xuICAgIHZhciBuZXdWYWx1ZSA9IHR5cGVvZiBjb21wb25lbnRHZXR0ZXIgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IGNvbXBvbmVudEdldHRlci5jYWxsKHRoaXMuY29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZWxEYXRhLmdldCh0aGlzLmNvbXBvbmVudC5lbCk7XG5cbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhLl92YWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xufVxuXG5cbi8vIFRPRE86IHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiByZWxldmFudCBET00gZXZlbnQgZGVwZW5kZW50IG9uIGVsZW1lbnQgdGFnXG4vLyBDYW4gYWxzbyBpbXBsZW1lbnQgYmVmb3JlZGF0YWNoYW5nZWQgZXZlbnQgdG8gYWxsb3cgcHJldmVudGluZyB0aGUgY2hhbmdlXG4vLyB0cmFuc2xhdGVUb0RvbUV2ZW50XG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBjb21wb25lbnRFdmVudCA9IHRoaXMuY29tcG9uZW50LmRhdGEuY29uZmlnLmV2ZW50O1xuICAgIHZhciBldmVudCA9IGNvbXBvbmVudEV2ZW50IHx8IHRoaXMuZWxEYXRhLmV2ZW50KHRoaXMuY29tcG9uZW50LmVsKTtcblxuICAgIGlmIChtZXNzYWdlID09ICcnICYmIGV2ZW50KVxuICAgICAgICByZXR1cm4gZXZlbnQ7ICAvLyB0aGlzLnRhZ0V2ZW50O1xufVxuXG5cbi8vIGZpbHRlckRhdGFNZXNzYWdlXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5uZXdWYWx1ZSAhPSBkYXRhLm9sZFZhbHVlO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jb21wb25lbnQuZGF0YS5fdmFsdWVcbiAgICAgICAgLCBuZXdWYWx1ZSA9IHRoaXMudmFsdWUoKTtcblxuICAgIHZhciBpbnRlcm5hbERhdGEgPSB7IFxuICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogUmV0dXJucyBkYXRhIGFjY2VzcyBtZXRob2RzIGFuZCBldmVudHMgZm9yIGdpdmVuIERPTSBlbGVtZW50LlxuICogVXNlZCBieSBbRGF0YV0oLi4vY19mYWNldHMvRGF0YS5qcy5odG1sKSBmYWNldCBhbmQgYnkgW0RhdGFNc2dBUEldKC4vZGF0YS5qcy5odG1sKVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIGdldEVsZW1lbnREYXRhQWNjZXNzID0gZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgdGFnTmFtZSA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAsIGVsRGF0YSA9IGRvbUVsZW1lbnRzRGF0YUFjY2Vzc1t0YWdOYW1lXTtcbiAgICByZXR1cm4gZWxEYXRhIHx8IGRvbUVsZW1lbnRzRGF0YUFjY2Vzcy5ieURlZmF1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RWxlbWVudERhdGFBY2Nlc3M7XG5cblxuLyoqXG4gKiBEYXRhIGFjY2VzcyBtZXRob2RzIGFuZCBldmVudHMgZm9yIERPTSBlbGVtZW50cy5cbiAqL1xudmFyIGRvbUVsZW1lbnRzRGF0YUFjY2VzcyA9IHtcbiAgICBieURlZmF1bHQ6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgIH0sXG4gICAgJ2Rpdic6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLCAvLyBoYWNrLCBzaG91bGQgYmUgaW5uZXJIVE1MPyB0byBtYWtlIHdvcmsgd2l0aCBFZGl0YWJsZSBmYWNldFxuICAgICAgICAvLyBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3NwYW4nOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdwJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAnaW5wdXQnOiB7XG4gICAgICAgIHByb3BlcnR5OiBpbnB1dERhdGFQcm9wZXJ0eSxcbiAgICAgICAgZXZlbnQ6IGlucHV0Q2hhbmdlRXZlbnRcbiAgICB9LFxuICAgICd0ZXh0YXJlYSc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAnc2VsZWN0Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAnaW1nJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ3NyYydcbiAgICB9LFxuICAgICdjYXB0aW9uJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAndGhlYWQnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICd0Ym9keSc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3Rmb290Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfVxufTtcblxuXG4vLyBjb252ZXJ0IHN0cmluZ3MgdG8gZnVuY3Rpb25zIGFuZCBjcmVhdGUgZ2V0c2V0IG1ldGhvZHNcbl8uZWFjaEtleShkb21FbGVtZW50c0RhdGFBY2Nlc3MsIGZ1bmN0aW9uKHRhZ0luZm8pIHtcbiAgICB2YXIgcHJvcGVydHkgPSB0YWdJbmZvLnByb3BlcnR5XG4gICAgICAgICwgZXZlbnQgPSB0YWdJbmZvLmV2ZW50O1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGFnSW5mby5wcm9wZXJ0eSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcHJvcGVydHk7IH07XG4gICAgdmFyIHByb3BGdW5jID0gdGFnSW5mby5wcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRhZ0luZm8uZXZlbnQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGV2ZW50OyB9O1xuICAgIGlmICghIHRhZ0luZm8uZ2V0KVxuICAgICAgICB0YWdJbmZvLmdldCA9IGZ1bmN0aW9uKGVsKSB7IHJldHVybiBlbFtwcm9wRnVuYyhlbCldOyB9XG4gICAgaWYgKCEgdGFnSW5mby5zZXQpXG4gICAgICAgIHRhZ0luZm8uc2V0ID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gKGVsW3Byb3BGdW5jKGVsKV0gPSB0eXBlb2YgdmFsdWUgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHZhbHVlKTtcbiAgICAgICAgfVxufSk7XG5cblxuLyoqXG4gKiBUeXBlcyBvZiBpbnB1dCBlbGVtZW50c1xuICovXG52YXIgaW5wdXRFbGVtZW50VHlwZXMgPSB7XG4gICAgYnlEZWZhdWx0OiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ2NoZWNrYm94Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2NoZWNrZWQnLFxuICAgICAgICBldmVudDogJ2NoYW5nZSdcbiAgICB9LFxuICAgICdyYWRpbyc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjaGVja2VkJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAndGV4dCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJuIHByb3BlcnR5IG9mIGlucHV0IGVsZW1lbnQgdG8gZ2V0L3NldCBpdHMgZGF0YVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaW5wdXREYXRhUHJvcGVydHkoZWwpIHtcbiAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXRFbGVtZW50VHlwZXNbZWwudHlwZV07XG4gICAgcmV0dXJuIGlucHV0VHlwZVxuICAgICAgICAgICAgPyBpbnB1dFR5cGUucHJvcGVydHlcbiAgICAgICAgICAgIDogaW5wdXRFbGVtZW50VHlwZXMuYnlEZWZhdWx0LnByb3BlcnR5O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBET00gZXZlbnQgdHlwZSB0byBsaXN0ZW4gdG8gdG8gcmVhY3QgdG8gaW5wdXQgZWxlbWVudCBjaGFuZ2VcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGlucHV0Q2hhbmdlRXZlbnQoZWwpIHtcbiAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXRFbGVtZW50VHlwZXNbZWwudHlwZV07XG4gICAgcmV0dXJuIGlucHV0VHlwZVxuICAgICAgICAgICAgPyBpbnB1dFR5cGUuZXZlbnRcbiAgICAgICAgICAgIDogaW5wdXRFbGVtZW50VHlwZXMuYnlEZWZhdWx0LmV2ZW50O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBNZXNzZW5nZXJBUEkgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzLk1lc3NlbmdlckFQSTtcblxuXG52YXIgRHJvcE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnRHJvcE1zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRHJvcE1zZ0FQSSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERyb3BNc2dBUEk7XG5cblxudmFyIGRyb3BFdmVudHNNYXAgPSB7XG4gICAgJ2RyYWdpbic6ICdkcmFnZW50ZXInLFxuICAgICdkcmFnb3V0JzogJ2RyYWdsZWF2ZSdcbn07XG5cblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gZHJvcEV2ZW50c01hcC5oYXNPd25Qcm9wZXJ0eShtZXNzYWdlKVxuICAgICAgICAgICAgPyBkcm9wRXZlbnRzTWFwW21lc3NhZ2VdXG4gICAgICAgICAgICA6IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlc2V0RmlsdGVyVmFycygpIHtcbiAgICBkZWxldGUgdGhpcy5fY3VycmVudFRhcmdldDtcbiAgICBkZWxldGUgdGhpcy5faW5zaWRlO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGRhdGEpIHsgLy8gZGF0YSBpcyBET00gZXZlbnQgb2JqZWN0XG4gICAgdmFyIG9rID0gdHJ1ZTtcblxuICAgIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcmFnZW50ZXInICYmIG1lc3NhZ2UgPT0gJ2RyYWdpbicpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhcmdldCA9IGRhdGEudGFyZ2V0O1xuICAgICAgICBvayA9ICF0aGlzLl9pbnNpZGU7XG4gICAgICAgIHRoaXMuX2luc2lkZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcmFnbGVhdmUnICYmIG1lc3NhZ2UgPT0gJ2RyYWdvdXQnKSB7XG4gICAgICAgIG9rID0gdGhpcy5fY3VycmVudFRhcmdldCA9PSBkYXRhLnRhcmdldDtcbiAgICAgICAgaWYgKG9rKSByZXNldEZpbHRlclZhcnMuY2FsbCh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ2Ryb3AnKSByZXNldEZpbHRlclZhcnMuY2FsbCh0aGlzKTtcblxuICAgIHJldHVybiBvaztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRE9NRW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL2RvbV9zb3VyY2UnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxudmFyIERPTUV2ZW50c1NvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoRE9NRW1pdHRlclNvdXJjZSwgJ0RPTUV2ZW50c1NvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NRXZlbnRzU291cmNlLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBkZXN0cm95OiBET01FdmVudHNTb3VyY2UkZGVzdHJveSxcbiAgICBlbWl0dGVyOiBlbWl0dGVyXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01FdmVudHNTb3VyY2U7XG5cblxudmFyIHVzZUNhcHR1cmVQYXR0ZXJuID0gL19fY2FwdHVyZSQvXG4gICAgLCB1c2VDYXB0dXJlUG9zdGZpeCA9ICdfX2NhcHR1cmUnO1xuXG5cbi8vIGluaXQgRE9NIGV2ZW50IHNvdXJjZVxuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSU9yQ2xhc3MsIGNvbXBvbmVudCkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gRE9NRXZlbnRzU291cmNlJGRlc3Ryb3koKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudDtcbn1cblxuXG4vLyBnZXQgRE9NIGVsZW1lbnQgb2YgY29tcG9uZW50XG5mdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5lbDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gIyMjY29tcG9uZW50IGlmcmFtZSBzb3VyY2VcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG52YXIgRnJhbWVNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnRnJhbWVNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhGcmFtZU1lc3NhZ2VTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuXG4gICAgLy9jbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgZnJhbWVXaW5kb3c6IGZyYW1lV2luZG93LFxuICAgIGhhbmRsZUV2ZW50OiBoYW5kbGVFdmVudCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWVNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBjb21wb25lbnQpIHtcbiAgICBjaGVjayhjb21wb25lbnQsIENvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG5cbiAgICBpZiAoY29tcG9uZW50LmVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAnaWZyYW1lJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnQgZm9yIEZyYW1lTWVzc2FnZVNvdXJjZSBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBpZnJhbWUgZWxlbWVudCcpO1xuXG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIGZyYW1lV2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5lbC5jb250ZW50V2luZG93O1xufVxuXG5cbi8vIGFkZElGcmFtZU1lc3NhZ2VMaXN0ZW5lclxuZnVuY3Rpb24gYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdmFyIHdpbiA9IHRoaXMuZnJhbWVXaW5kb3coKTtcbiAgICBpZiAod2luKSB3aW4uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMsIGZhbHNlKTtcbiAgICBlbHNlIGxvZ2dlci53YXJuKCdGcmFtZU1lc3NhZ2VTb3VyY2U6IGZyYW1lIHdpbmRvdyBpcyB1bmRlZmluZWQnKTtcbn1cblxuXG4vLyByZW1vdmVJRnJhbWVNZXNzYWdlTGlzdGVuZXJcbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHZhciB3aW4gPSB0aGlzLmZyYW1lV2luZG93KCk7XG4gICAgaWYgKHdpbikgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybignRnJhbWVNZXNzYWdlU291cmNlOiBmcmFtZSB3aW5kb3cgaXMgdW5kZWZpbmVkJyk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gbXNnVHlwZTtcblxuICAgIHRoaXMuZnJhbWVXaW5kb3coKS5wb3N0TWVzc2FnZShkYXRhLCAnKicpO1xufVxuXG5cbi8vIFRPRE8gbWF5YmUgcmVmYWN0b3IgdG8gRnJhbWVNc2dBUEk/XG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LmRhdGEudHlwZSwgZXZlbnQpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogU2NvcGUgY2xhc3MuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoaXMgc2NvcGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IHRoZSBob3N0IFxuICogQHJldHVybiB7U2NvcGV9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlKHJvb3RFbCwgaG9zdE9iamVjdCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9yb290RWw6IHJvb3RFbCxcbiAgICAgICAgX2hvc3RPYmplY3Q6IGhvc3RPYmplY3RcbiAgICB9LCBfLldSSVQpOyAvLyB3cml0YWJsZVxufTtcblxuXy5leHRlbmRQcm90byhTY29wZSwge1xuICAgIF9hZGQ6IFNjb3BlJF9hZGQsXG4gICAgX3NhZmVBZGQ6IFNjb3BlJF9zYWZlQWRkLFxuICAgIF9jb3B5OiBTY29wZSRfY29weSxcbiAgICBfZWFjaDogU2NvcGUkX2VhY2gsXG4gICAgX21vdmU6IFNjb3BlJF9tb3ZlLFxuICAgIF9tZXJnZTogU2NvcGUkX21lcmdlLFxuICAgIF9sZW5ndGg6IFNjb3BlJF9sZW5ndGgsXG4gICAgX2FueTogU2NvcGUkX2FueSxcbiAgICBfcmVtb3ZlOiBTY29wZSRfcmVtb3ZlLFxuICAgIF9jbGVhbjogU2NvcGUkX2NsZWFuLFxuICAgIF9kZXRhY2hFbGVtZW50OiBTY29wZSRfZGV0YWNoRWxlbWVudCxcbiAgICBfaGFzOiBTY29wZSRfaGFzLFxuICAgIF9maWx0ZXI6IFNjb3BlJF9maWx0ZXJcbn0pO1xuXG5cbl8uZXh0ZW5kKFNjb3BlLCB7XG4gICAgcmVuYW1lOiBTY29wZSQkcmVuYW1lXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjb3BlO1xuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG5cblxuLyoqXG4gKiBTY29wZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBBZGRzIG9iamVjdCB0byB0aGUgc2NvcGUsIHRocm93aW5nIGlmIG5hbWUgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtDb21wb25lbnR8Q29tcG9uZW50SW5mb30gb2JqZWN0IGNvbXBvbmVudCBvciBjb21wb25lbnQgaW5mbyB0byBhZGQgdG8gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGFkZFxuICovXG5mdW5jdGlvbiBTY29wZSRfYWRkKG9iamVjdCwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJylcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIGVsc2VcbiAgICAgICAgbmFtZSA9IG9iamVjdC5uYW1lO1xuICAgIFxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KG5hbWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cGxpY2F0ZSBvYmplY3QgbmFtZTogJyArIG5hbWUpO1xuXG4gICAgY2hlY2tOYW1lKG5hbWUpO1xuICAgIF9fYWRkLmNhbGwodGhpcywgb2JqZWN0LCBuYW1lKTtcbn1cblxuXG4vKipcbiAqIFNjb3BlIGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBvYmplY3QgdG8gc2NvcGUgcmVuYW1pbmcgaXQgaWYgbmFtZSBpcyBub3QgdW5pcXVlXG4gKiBAcGFyYW0ge0NvbXBvbmVudHxDb21wb25lbnRJbmZvfSBvYmplY3QgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbmZvIHRvIGFkZCB0byB0aGUgc2NvcGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYWRkXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9zYWZlQWRkKG9iamVjdCwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJylcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIGVsc2VcbiAgICAgICAgbmFtZSA9IG9iamVjdC5uYW1lO1xuXG4gICAgdmFyIHNob3VsZFJlbmFtZSA9IHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgaWYgKHNob3VsZFJlbmFtZSlcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdTY29wZTogZHVwbGljYXRlIG9iamVjdCBuYW1lOiAnICsgbmFtZSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHNob3VsZFJlbmFtZSA9ICEgYWxsb3dlZE5hbWVQYXR0ZXJuLnRlc3QobmFtZSk7XG4gICAgICAgIGlmIChzaG91bGRSZW5hbWUpXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Njb3BlOiBuYW1lIHNob3VsZCBzdGFydCBmcm9tIGxldHRlciwgdGhpcyBuYW1lIGlzIG5vdCBhbGxvd2VkOiAnICsgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlbmFtZSkge1xuICAgICAgICBuYW1lID0gY29tcG9uZW50TmFtZSgpO1xuICAgICAgICBvYmplY3QubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgX19hZGQuY2FsbCh0aGlzLCBvYmplY3QsIG5hbWUpO1xufVxuXG5cbmZ1bmN0aW9uIF9fYWRkKG9iamVjdCwgbmFtZSkge1xuICAgIHRoaXNbbmFtZV0gPSBvYmplY3Q7XG4gICAgb2JqZWN0LnNjb3BlID0gdGhpcztcblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0LnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBvYmplY3QucG9zdE1lc3NhZ2UoJ2FkZGVkdG9zY29wZScpOyBcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIGNvcGllcyBhbGwgb2JqZWN0cyBmcm9tIG9uZSBzY29wZSB0byBhbm90aGVyLFxuICogdGhyb3dpbmcgaWYgc29tZSBvYmplY3QgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtTY29wZX0gYVNjb3BlIHRoZSBzY29wZSB0byBjb3B5XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9jb3B5KGFTY29wZSkge1xuICAgIGNoZWNrKGFTY29wZSwgU2NvcGUpO1xuXG4gICAgYVNjb3BlLl9lYWNoKFNjb3BlJF9hZGQsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogTW92ZXMgYSBjb21wb25lbnQgZnJvbSB0aGlzIHNjb3BlIHRvIGFub3RoZXIgc2NvcGUuXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgdG8gYmUgbW92ZWRcbiAqIEBwYXJhbSB7U2NvcGV9IG90aGVyU2NvcGUgdGhlIHNjb3BlIHRvIGNvcHkgdGhlIGNvbXBvbmVudCB0b1xuICovXG5mdW5jdGlvbiBTY29wZSRfbW92ZShjb21wb25lbnQsIG90aGVyU2NvcGUpIHtcbiAgICBvdGhlclNjb3BlLl9hZGQoY29tcG9uZW50KTtcbiAgICB0aGlzLl9yZW1vdmUoY29tcG9uZW50Lm5hbWUpO1xuICAgIGNvbXBvbmVudC5zY29wZSA9IG90aGVyU2NvcGU7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBNZXJnZXMgb25lIHNjb3BlIGludG8gdGhpcyBzY29wZVxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgdGhlIHNjb3BlIHRvIGFic29yYlxuICovXG5mdW5jdGlvbiBTY29wZSRfbWVyZ2Uoc2NvcGUpIHtcbiAgICBzY29wZS5fZWFjaChmdW5jdGlvbiAoY29tcCkge1xuICAgICAgICB0aGlzLl9hZGQoY29tcCwgY29tcC5uYW1lKTtcbiAgICAgICAgc2NvcGUuX3JlbW92ZShjb21wLm5hbWUpO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogRW51bWVyYXRlcyBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2NvcGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNvbXBvbmVudFxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgdGhlIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2VhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBfLmVhY2hLZXkodGhpcywgY2FsbGJhY2ssIHRoaXNBcmcgfHwgdGhpcywgdHJ1ZSk7IC8vIGVudW1lcmF0ZXMgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHlcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIGNvbXBvbmVudHMgYmFzZWQgb24gYSBjYWxsYmFja1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyB0aGUgY29udGV4dFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9maWx0ZXIoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gXy5maWx0ZXJLZXlzKHRoaXMsIGNhbGxiYWNrLCB0aGlzQXJnIHx8IHRoaXMsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBhIG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gY2hlY2tOYW1lKG5hbWUpIHtcbiAgICBpZiAoISBhbGxvd2VkTmFtZVBhdHRlcm4udGVzdChuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYW1lIHNob3VsZCBzdGFydCBmcm9tIGxldHRlciwgdGhpcyBuYW1lIGlzIG5vdCBhbGxvd2VkOiAnICsgbmFtZSk7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2NvcGVcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2xlbmd0aCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RoO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyBhIGNvbXBvbmVudCBmcm9tIHRoZSBzY29wZS4gSXQgbWF5IGxvb2sgbGlrZSBpdCByZXR1cm5zIHRoZSBmaXJzdCBjb21wb25lbnRcbiAqIGJ1dCBpbiByZWFsaXR5IGdpdmVuIHRoYXQgc2NvcGVzIGFyZSBoYXNoZXMsIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcuXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9hbnkoKSB7XG4gICAgdmFyIGtleSA9IE9iamVjdC5rZXlzKHRoaXMpWzBdO1xuICAgIHJldHVybiBrZXkgJiYgdGhpc1trZXldO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmVtb3ZlcyBhIGNvbXBvbmVudCBmcm9tIHRoZSBzY29wZSBieSBpdCdzIG5hbWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIHJlbW92ZVxuICogQHBhcmFtIHtCb29sZWFufSBxdWlldCBvcHRpb25hbCB0cnVlIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGNvbXBvbmVudCBpcyBub3QgaW4gc2NvcGVcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX3JlbW92ZShuYW1lLCBxdWlldCkge1xuICAgIGlmICghIChuYW1lIGluIHRoaXMpKSB7XG4gICAgICAgIGlmICghcXVpZXQpIGxvZ2dlci53YXJuKCdyZW1vdmluZyBvYmplY3QgdGhhdCBpcyBub3QgaW4gc2NvcGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvYmplY3QgPSB0aGlzW25hbWVdO1xuXG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgb2JqZWN0LnBvc3RNZXNzYWdlKCdyZW1vdmVkZnJvbXNjb3BlJyk7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGFsbCBjb21wb25lbnRzIGZyb20gdGhlIHNjb3BlLlxuICovXG5mdW5jdGlvbiBTY29wZSRfY2xlYW4oKSB7XG4gICAgdGhpcy5fZWFjaChmdW5jdGlvbihvYmplY3QsIG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV0uc2NvcGU7XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIH0sIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBTY29wZSRfZGV0YWNoRWxlbWVudCgpIHtcbiAgICB0aGlzLl9yb290RWwgPSBudWxsO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIHNjb3BlIGhhcyBvYmplY3QgYnkgb2JqZWN0IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9oYXMob2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkob2JqZWN0Lm5hbWUpO1xufVxuXG5cbi8qKlxuICogQ2hhbmdlIG9iamVjdCBuYW1lLCByZW5hbWluZyBpdCBpbiBzY29wZSB1bmxlc3MgcmVuYW1lSW5TY29wZSBpcyBmYWxzZVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmV3IG5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuYW1lSW5TY29wZSB0cnVlIGJ5IGRlZmF1bHRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkJHJlbmFtZShvYmosIG5hbWUsIHJlbmFtZUluU2NvcGUpIHtcbiAgICBpZiAob2JqLnNjb3BlICYmIHJlbmFtZUluU2NvcGUgIT09IGZhbHNlKSB7XG4gICAgICAgIG9iai5zY29wZS5fcmVtb3ZlKG9iai5uYW1lKTtcbiAgICAgICAgb2JqLnNjb3BlLl9hZGQob2JqLCBuYW1lKTtcbiAgICB9IGVsc2VcbiAgICAgICAgb2JqLm5hbWUgPSBuYW1lO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxCdXR0b24gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQnV0dG9uJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1idXR0b24nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxCdXR0b24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQnV0dG9uO1xuXG5fLmV4dGVuZFByb3RvKE1MQnV0dG9uLCB7XG4gICAgZGlzYWJsZTogTUxCdXR0b24kZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTEJ1dHRvbiRpc0Rpc2FibGVkXG59KTtcblxuXG5mdW5jdGlvbiBNTEJ1dHRvbiRkaXNhYmxlKGRpc2FibGUpIHtcbiAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZTtcbn1cblxuZnVuY3Rpb24gTUxCdXR0b24kaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBDT01CT19DSEFOR0VfTUVTU0FHRSA9ICdtbGNvbWJvY2hhbmdlJztcblxudmFyIERBVEFMSVNUX1RFTVBMQVRFID0gJ3t7fiBpdC5jb21ib09wdGlvbnMgOm9wdGlvbiB9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7ez0gb3B0aW9uLmxhYmVsIH19XCI+PC9vcHRpb24+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAge3t+fX0nO1xuXG52YXIgTUxDb21ibyA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxDb21ibycsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxDb21ib19nZXQsXG4gICAgICAgIHNldDogTUxDb21ib19zZXQsXG4gICAgICAgIGRlbDogTUxDb21ib19kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogQ09NQk9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZGF0YWxpc3QnXG4gICAgfSxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZFxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxDb21ibyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxDb21ibztcblxuXG5fLmV4dGVuZFByb3RvKE1MQ29tYm8sIHtcbiAgICBpbml0OiBNTENvbWJvJGluaXRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MQ29tYm8kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICdfY29tYm9JbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2NvbWJvTGlzdCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmRhdGFsaXN0XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb21ib0xpc3QudGVtcGxhdGUuc2V0KERBVEFMSVNUX1RFTVBMQVRFKTtcblxuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5vbignaW5wdXQnLFxuICAgICAgICB7IHN1YnNjcmliZXI6IGRpc3BhdGNoQ2hhbmdlTWVzc2FnZSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib19nZXQoKSB7XG4gICAgaWYgKCEgdGhpcy5fY29tYm9JbnB1dCkgcmV0dXJuO1xuICAgIHJldHVybiB0aGlzLl9jb21ib0lucHV0LmRhdGEuZ2V0KCk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fc2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGNoYW5nZUNvbWJvRGF0YS5jYWxsKHRoaXMsICdzZXQnLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fZGVsKCkge1xuICAgIHJldHVybiBjaGFuZ2VDb21ib0RhdGEuY2FsbCh0aGlzLCAnZGVsJywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VDb21ib0RhdGEobWV0aG9kLCB2YWx1ZSkge1xuICAgIGlmICghIHRoaXMuX2NvbWJvSW5wdXQpIHJldHVybjtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY29tYm9JbnB1dC5kYXRhW21ldGhvZF0odmFsdWUpO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gUG9zdCB0aGUgZGF0YSBjaGFuZ2VcbmZ1bmN0aW9uIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuZnVuY3Rpb24gb25PcHRpb25zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX2NvbWJvTGlzdC50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICBjb21ib09wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KClcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBDT01CT19MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sY29tYm9saXN0Y2hhbmdlJztcblxuXG52YXIgTUxDb21ib0xpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQ29tYm9MaXN0Jywge1xuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1jb21iby1saXN0J1xuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MQ29tYm9MaXN0X2dldCxcbiAgICAgICAgc2V0OiBNTENvbWJvTGlzdF9zZXQsXG4gICAgICAgIGRlbDogTUxDb21ib0xpc3RfZGVsLFxuICAgICAgICBldmVudDogQ09NQk9fTElTVF9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcqKionOiB7IHN1YnNjcmliZXI6IG9uSXRlbXNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcid9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnPGRpdiBtbC1iaW5kPVwiTUxTdXBlckNvbWJvOmNvbWJvXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3Q6bGlzdFwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdEl0ZW06aXRlbVwiIGNsYXNzPVwibGlzdC1pdGVtXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZXZlbnRzXTpkZWxldGVCdG5cIiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+J1xuICAgIH1cbn0pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxDb21ib0xpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQ29tYm9MaXN0O1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxDb21ib0xpc3QsIHtcbiAgICBpbml0OiBNTENvbWJvTGlzdCRpbml0LFxuICAgIHNldE9wdGlvbnM6IE1MQ29tYm9MaXN0JHNldE9wdGlvbnMsXG4gICAgc2V0RGF0YVZhbGlkYXRpb246IE1MQ29tYm9MaXN0JHNldERhdGFWYWxpZGF0aW9uLFxuICAgIHRvZ2dsZUFkZEJ1dHRvbjogTUxDb21ib0xpc3QkdG9nZ2xlQWRkQnV0dG9uLFxuICAgIGRlc3Ryb3k6IE1MQ29tYm9MaXN0JGRlc3Ryb3ksXG4gICAgc2V0QWRkSXRlbVByb21wdDogTUxDb21ib0xpc3Qkc2V0QWRkSXRlbVByb21wdCxcbiAgICBjbGVhckNvbWJvSW5wdXQgOiBNTENvbWJvTGlzdCRjbGVhckNvbWJvSW5wdXRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fZGF0YVZhbGlkYXRpb24gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5vbmNlKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRzZXREYXRhVmFsaWRhdGlvbihkYXRhVmFsaWRhdGlvbikge1xuICAgIGlmICh0eXBlb2YgZGF0YVZhbGlkYXRpb24gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhpcy5fZGF0YVZhbGlkYXRpb24gPSBkYXRhVmFsaWRhdGlvbjtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0T3B0aW9ucyhhcnIpIHtcbiAgICB0aGlzLl9jb21iby5zZXRPcHRpb25zKGFycik7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3QkY2xlYXJDb21ib0lucHV0ICgpIHtcbiAgICB0aGlzLl9jb21iby5jbGVhckNvbWJvSW5wdXQoKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBhZGQgYnV0dG9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dcbiAqL1xuZnVuY3Rpb24gTUxDb21ib0xpc3QkdG9nZ2xlQWRkQnV0dG9uKHNob3cpIHtcbiAgICB0aGlzLl9jb21iby50b2dnbGVBZGRCdXR0b24oc2hvdyk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0QWRkSXRlbVByb21wdChwcm9tcHQpIHtcbiAgIHRoaXMuX2NvbWJvLnNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KTtcbn1cblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoKS5iaW5kZXIoKTtcbiAgICBjb21wb25lbnRTZXR1cC5jYWxsKHRoaXMpO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRTZXR1cCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAnX2NvbWJvJzogdGhpcy5jb250YWluZXIuc2NvcGUuY29tYm8sXG4gICAgICAgICdfbGlzdCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmxpc3RcbiAgICB9KTtcblxuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fY29tYm8uZGF0YS5vbignJywgeyBzdWJzY3JpYmVyOiBvbkNvbWJvQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIHRoaXMuX2NvbWJvLm9uKCdhZGRpdGVtJywgeyBzdWJzY3JpYmVyOiBvbkFkZEl0ZW0sIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbmZ1bmN0aW9uIG9uQ29tYm9DaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgaWYgKGRhdGEubmV3VmFsdWUgJiYgdGhpcy5fZGF0YVZhbGlkYXRpb24obXNnLCBkYXRhLCB0aGlzLl9saXN0Lm1vZGVsLmdldCgpKSlcbiAgICAgICAgdGhpcy5fbGlzdC5tb2RlbC5wdXNoKGRhdGEubmV3VmFsdWUpO1xuICAgIHRoaXMuX2NvbWJvLmRhdGEuZGVsKCk7XG4gICAgLy8gYmVjYXVzZSBvZiBzdXBlcmNvbWJvIGxpc3RlbmVycyBvZmYgeW91IGhhdmUgdG8gc2V0IF92YWx1ZSBleHBsaWNpdGx5XG4gICAgdGhpcy5fY29tYm8uZGF0YS5fdmFsdWUgPSAnJztcbn1cblxuZnVuY3Rpb24gb25JdGVtc0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0xJU1RfQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdF9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Rfc2V0KHZhbHVlKSB7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdF9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuc2V0KFtdKTtcbn1cblxuXG5mdW5jdGlvbiBvbkFkZEl0ZW0obXNnLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnYWRkaXRlbScsIGRhdGEpO1xuICAgIHRoaXMuZXZlbnRzLnBvc3RNZXNzYWdlKCdtaWxvX2NvbWJvbGlzdGFkZGl0ZW0nLCBkYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBNTERhdGUgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRGF0ZScsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxEYXRlX2dldCxcbiAgICAgICAgc2V0OiBNTERhdGVfc2V0LFxuICAgICAgICBkZWw6IE1MRGF0ZV9kZWwsXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZGF0ZSdcbiAgICB9XG59KTtcblxuXy5leHRlbmRQcm90byhNTERhdGUsIHtcbiAgICBnZXRNaW46IE1MRGF0ZSRnZXRNaW4sXG4gICAgc2V0TWluOiBNTERhdGUkc2V0TWluLFxuICAgIGdldE1heDogTUxEYXRlJGdldE1heCxcbiAgICBzZXRNYXg6IE1MRGF0ZSRzZXRNYXhcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRGF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEYXRlO1xuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRnZXRNaW4oKSB7XG4gICAgcmV0dXJuIF8uZGF0ZSh0aGlzLmVsLm1pbik7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJHNldE1pbih2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC5taW4gPSBkYXRlID8gdG9JU084NjAxRm9ybWF0KGRhdGUpIDogJyc7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJGdldE1heCgpIHtcbiAgICByZXR1cm4gXy5kYXRlKHRoaXMuZWwubWF4KTtcbn1cblxuXG5mdW5jdGlvbiBNTERhdGUkc2V0TWF4KHZhbHVlKSB7XG4gICAgdmFyIGRhdGUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLmVsLm1heCA9IGRhdGUgPyB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkgOiAnJztcbn1cblxuXG5mdW5jdGlvbiBNTERhdGVfZ2V0KCkge1xuICAgIHJldHVybiBfLnRvRGF0ZSh0aGlzLmVsLnZhbHVlKTtcbn1cblxuXG5mdW5jdGlvbiBNTERhdGVfc2V0KHZhbHVlKSB7XG4gICAgdmFyIGRhdGUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLmVsLnZhbHVlID0gZGF0ZSA/IHRvSVNPODYwMUZvcm1hdChkYXRlKSA6ICcnO1xuXG4gICAgZGlzcGF0Y2hJbnB1dE1lc3NhZ2UuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gTUxEYXRlX2RlbCgpIHtcbiAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG5cbiAgICBkaXNwYXRjaElucHV0TWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIGRpc3BhdGNoSW5wdXRNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoJ2lucHV0Jyk7IC8vIERpc3BhdGNoIHRoZSAnaW5wdXQnICh1c3VhbGx5IGRpc3BhdGNoZWQgYnkgdGhlIHVuZGVybHlpbmcgPGlucHV0PiBlbGVtZW50KSBldmVudCBzbyB0aGF0IHRoZSBkYXRhIGNoYW5nZSBjYW4gYmUgbGlzdGVuZWQgdG9cbn1cblxuXG5mdW5jdGlvbiB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkge1xuICAgIHZhciBkYXRlQXJyID0gW1xuICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSxcbiAgICAgICAgcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIF07XG5cbiAgICB2YXIgZGF0ZVN0ciA9IGRhdGVBcnIuam9pbignLScpO1xuXG4gICAgcmV0dXJuIGRhdGVTdHI7XG5cbiAgICBmdW5jdGlvbiBwYWQobikgeyByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6IG47IH1cbn0iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTERyb3BUYXJnZXQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRHJvcFRhcmdldCcsIFsnZHJvcCddKTtcblxuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRHJvcFRhcmdldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEcm9wVGFyZ2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZG9UID0gcmVxdWlyZSgnbWlsby1jb3JlJykudXRpbC5kb1RcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBtaWxvQ291bnQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvdW50Jyk7XG5cbnZhciBUUkVFX1RFTVBMQVRFID0gJzx1bCBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWxpc3RcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAge3t+IGl0LmRhdGEuaXRlbXMgOml0ZW06aW5kZXggfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZhciBoYXNTdWJUcmVlID0gaXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aDsgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB7ez8gaGFzU3ViVHJlZSB9fWNsYXNzPVwibWwtdWktZm9sZHRyZWUtLWhhcy1tdWx0aXBsZVwie3s/fX0+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWl0ZW1cIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGhhc1N1YlRyZWUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1idXR0b25cIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s9IGl0Lml0ZW1UZW1wbGF0ZSh7IGl0ZW06IGl0ZW0sIGlkOiBpdC5pdGVtSURzW2luZGV4XSB9KSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBoYXNTdWJUcmVlIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PSBpdC50cmVlVGVtcGxhdGUoaXRlbSkgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXFxuICAgICAgICAgICAgICAgICAgICAgICAge3t+fX1cXFxuICAgICAgICAgICAgICAgICAgICA8L3VsPic7XG5cbnZhciBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUgPSBkb1QuY29tcGlsZSgnXFxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtdWktZm9sZHRyZWUtbGFiZWxcIiBkYXRhLWl0ZW0taWQ9XCJ7ez0gaXQuaWQgfX1cIj5cXFxuICAgICAgICAgICAgICAgIHt7PSBpdC5pdGVtLmxhYmVsIH19XFxcbiAgICAgICAgICAgIDwvc3Bhbj4nKVxuICAgICwgQ09NUElMRURfVFJFRV9URU1QTEFURSA9IGRvVC5jb21waWxlKFRSRUVfVEVNUExBVEUpO1xuXG5cbnZhciBNTEZvbGRUcmVlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEZvbGRUcmVlJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGV2ZW50czoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJ2NsaWNrIGRibGNsaWNrJzogeyBzdWJzY3JpYmVyOiBvbkl0ZW1FdmVudCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1mb2xkdHJlZS1tYWluJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRm9sZFRyZWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRm9sZFRyZWU7XG5cbl8uZXh0ZW5kUHJvdG8oTUxGb2xkVHJlZSwge1xuICAgIHNldEl0ZW1UZW1wbGF0ZTogTUxGb2xkVHJlZSRzZXRJdGVtVGVtcGxhdGUsXG4gICAgcmVuZGVyVHJlZTogTUxGb2xkVHJlZSRyZW5kZXJUcmVlXG59KTtcblxuZnVuY3Rpb24gZm9sZFVuZm9sZChlbCkge1xuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ21sLXVpLWZvbGR0cmVlLS11bmZvbGQnKTtcbn1cblxuZnVuY3Rpb24gaXRlbU1lc3NhZ2UobXNnLCBlbCkge1xuICAgIHZhciBpZCA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pdGVtLWlkJylcbiAgICAgICAgLCBpdGVtID0gdGhpcy5faXRlbXNNYXBbaWRdO1xuXG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnbWxmb2xkdHJlZV8nICsgbXNnLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGVsOiBlbFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1FdmVudChtc2csIGUpIHtcbiAgICB2YXIgZWwgPSBlLnRhcmdldDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtbC11aS1mb2xkdHJlZS1idXR0b24nKSlcbiAgICAgICAgZm9sZFVuZm9sZChlbC5wYXJlbnROb2RlLnBhcmVudE5vZGUpO1xuICAgIGVsc2UgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbWwtdWktZm9sZHRyZWUtbGFiZWwnKSlcbiAgICAgICAgaXRlbU1lc3NhZ2UuY2FsbCh0aGlzLCBtc2csIGVsKTtcbiAgICBlbHNlIHJldHVybjtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5mdW5jdGlvbiBNTEZvbGRUcmVlJHNldEl0ZW1UZW1wbGF0ZSAodGVtcGxhdGVTdHIpIHtcbiAgICB0aGlzLl9pdGVtVGVtcGxhdGUgPSBkb1QuY29tcGlsZSh0ZW1wbGF0ZVN0cik7XG59XG5cbmZ1bmN0aW9uIE1MRm9sZFRyZWUkcmVuZGVyVHJlZSAoZGF0YSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICBzZWxmLl9pdGVtc01hcCA9IHt9O1xuICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gX3JlbmRlclRyZWUoZGF0YSk7XG5cbiAgICBmdW5jdGlvbiBfcmVuZGVyVHJlZSAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5pdGVtcylcbiAgICAgICAgICAgIHZhciBpdGVtc0lEcyA9IF8ubWFwKGRhdGEuaXRlbXMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBtaWxvQ291bnQoKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9pdGVtc01hcFtpZF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDsgXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQ09NUElMRURfVFJFRV9URU1QTEFURSh7XG4gICAgICAgICAgICBpdGVtSURzOiBpdGVtc0lEcyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHNlbGYuX2l0ZW1UZW1wbGF0ZSB8fCBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUsXG4gICAgICAgICAgICB0cmVlVGVtcGxhdGU6IF9yZW5kZXJUcmVlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEdyb3VwID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEdyb3VwJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZ3JvdXAnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxHcm91cCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxHcm91cDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEh5cGVybGluayA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxIeXBlcmxpbmsnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1oeXBlcmxpbmsnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxIeXBlcmxpbmspO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSHlwZXJsaW5rO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgSU1BR0VfQ0hBTkdFX01FU1NBR0UgPSAnbWxpbWFnZWNoYW5nZSc7XG5cbnZhciBNTEltYWdlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEltYWdlJywge1xuICAgIGRhdGE6IHtcbiAgICAgICAgc2V0OiBNTEltYWdlX3NldCxcbiAgICAgICAgZ2V0OiBNTEltYWdlX2dldCxcbiAgICAgICAgZGVsOiBNTEltYWdlX2RlbCxcbiAgICAgICAgc3BsaWNlOiB1bmRlZmluZWQsXG4gICAgICAgIGV2ZW50OiBJTUFHRV9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcuc3JjJzogeyBzdWJzY3JpYmVyOiBvbk1vZGVsQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgICAgICBjbHM6ICdtbC11aS1pbWFnZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEltYWdlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEltYWdlO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxJbWFnZSwge1xuICAgIGluaXQ6IE1MSW1hZ2UkaW5pdFxufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTEltYWdlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBTZXRzIGltYWdlIHZhbHVlXG4gKiBSZXBsYWNlcyB0aGUgZGF0YSBzZXQgb3BlcmF0aW9uIHRvIGRlYWwgd2l0aCByYWRpbyBidXR0b25zXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBNTEltYWdlX3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTEltYWdlX2RlbCgpIHtcbiAgICB0aGlzLm1vZGVsLmRlbCgpO1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShJTUFHRV9DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuZnVuY3Rpb24gb25Nb2RlbENoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy5lbC5zcmMgPSBkYXRhLm5ld1ZhbHVlO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxJbnB1dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbnB1dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWlucHV0J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSW5wdXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXQ7XG5cbl8uZXh0ZW5kUHJvdG8oTUxJbnB1dCwge1xuICAgIGRpc2FibGU6IE1MSW5wdXQkZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTElucHV0JGlzRGlzYWJsZWQsXG4gICAgc2V0TWF4TGVuZ3RoOiBNTElucHV0JHNldE1heExlbmd0aFxufSk7XG5cbmZ1bmN0aW9uIE1MSW5wdXQkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXQkaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0JHNldE1heExlbmd0aChsZW5ndGgpIHtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJywgbGVuZ3RoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21saW5wdXRsaXN0Y2hhbmdlJztcblxudmFyIGFzeW5jSGFuZGxlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY2FsbGJhY2spIHtjYWxsYmFjayh2YWx1ZSk7fTtcblxudmFyIE1MSW5wdXRMaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTElucHV0TGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktaW5wdXQtbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTElucHV0TGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxJbnB1dExpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MSW5wdXRMaXN0X2RlbCxcbiAgICAgICAgc3BsaWNlOiBNTElucHV0TGlzdF9zcGxpY2UsXG4gICAgICAgIGV2ZW50OiBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25JdGVtc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdDpsaXN0XCI+XFxcbiAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltldmVudHNdOmRlbGV0ZUJ0blwiIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmVcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1sLWJpbmQ9XCJNTElucHV0OmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cXFxuICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiTUxCdXR0b246YnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIj5cXFxuICAgICAgICAgICAgICAgIEFkZFxcXG4gICAgICAgICAgICA8L2J1dHRvbj4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxJbnB1dExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXRMaXN0O1xuXG5fLmV4dGVuZFByb3RvKE1MSW5wdXRMaXN0LCB7XG4gICAgaW5pdDogTUxJbnB1dExpc3QkaW5pdCxcbiAgICBzZXRBc3luYzogTUxJbnB1dExpc3Qkc2V0QXN5bmMsXG4gICAgc2V0UGxhY2VIb2xkZXI6IE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyLFxuICAgIGRlc3Ryb3k6IE1MSW5wdXRMaXN0JGRlc3Ryb3lcbn0pO1xuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgcmVuZGVyLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyKHBsYWNlSG9sZGVyKSB7XG4gICAgdGhpcy5faW5wdXQuZWwuc2V0QXR0cmlidXRlKCdwbGFjZUhvbGRlcicsIHBsYWNlSG9sZGVyKTtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Qkc2V0QXN5bmMobmV3SGFuZGxlcikge1xuICAgIGFzeW5jSGFuZGxlciA9IG5ld0hhbmRsZXIgfHwgYXN5bmNIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19pbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2J1dHRvbic6IHRoaXMuY29udGFpbmVyLnNjb3BlLmJ1dHRvbixcbiAgICAgICAgJ19saXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUubGlzdFxuICAgIH0pO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fYnV0dG9uLmV2ZW50cy5vbignY2xpY2snLCB7c3Vic2NyaWJlcjogb25DbGljaywgY29udGV4dDogdGhpcyB9KTsgICBcbn1cblxuZnVuY3Rpb24gb25DbGljayhtc2cpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbnB1dC5kYXRhLmdldCgwKTtcbiAgICBpZiAodGhpcy5faW5wdXQuZGF0YSlcbiAgICAgICAgYXN5bmNIYW5kbGVyKHZhbHVlLCBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0Lm1vZGVsLnB1c2goeyBsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9pbnB1dC5kYXRhLmRlbCgpO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2dldCgpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiBtb2RlbCA/IF8uY2xvbmUobW9kZWwpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zcGxpY2UoKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICB0aGlzLm1vZGVsLnNwbGljZS5hcHBseSh0aGlzLm1vZGVsLCBhcmd1bWVudHMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBMSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGNoYW5nZSdcbiAgICAsIERFTEVURV9CVVRUT05fTkFNRSA9ICdkZWxldGVCdG4nO1xuXG5cbnZhciBNTExpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDogdW5kZWZpbmVkLFxuICAgIGxpc3Q6IHVuZGVmaW5lZFxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MTGlzdCwge1xuICAgIGluaXQ6IE1MTGlzdCRpbml0LFxuICAgIGRlc3Ryb3k6IE1MTGlzdCRkZXN0cm95LFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdCRyZW1vdmVJdGVtLFxuICAgIG1vdmVJdGVtOiBNTExpc3QkbW92ZUl0ZW1cbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkcmVtb3ZlSXRlbShpbmRleCl7XG4gICAgdGhpcy5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRtb3ZlSXRlbShmcm9tLCB0bykge1xuICAgIHZhciBzcGxpY2VkRGF0YSA9IHRoaXMubW9kZWwuc3BsaWNlKGZyb20sIDEpO1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNwbGljZSh0bywgMCwgc3BsaWNlZERhdGFbMF0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbWlsby5taW5kZXIodGhpcy5tb2RlbCwgJzw8PC0nLCB0aGlzLmRhdGEpLmRlZmVyQ2hhbmdlTW9kZSgnPDw8LT4+PicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBEcmFnRHJvcCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZHJhZ2Ryb3AnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGl0ZW1jaGFuZ2UnXG5cbnZhciBNTExpc3RJdGVtID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTExpc3RJdGVtJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbTogdW5kZWZpbmVkLFxuICAgIGRyYWc6IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgcGFyYW1zOiBnZXRNZXRhRGF0YVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnZHJhZ2VudGVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdvdmVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdsZWF2ZSc6IHsgc3Vic2NyaWJlcjogb25EcmFnT3V0LCBjb250ZXh0OiAnb3duZXInIH0sXG4gICAgICAgICAgICAnZHJvcCc6IHsgc3Vic2NyaWJlcjogb25JdGVtRHJvcCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH0sXG4gICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICBjb21wb25lbnRzOiBpc0NvbXBvbmVudEFsbG93ZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MTGlzdEl0ZW1fZ2V0LFxuICAgICAgICBzZXQ6IE1MTGlzdEl0ZW1fc2V0LFxuICAgICAgICBkZWw6IE1MTGlzdEl0ZW1fZGVsLFxuICAgICAgICBldmVudDogTElTVElURU1fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgaXRlbTogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3RJdGVtKTtcblxudmFyIE1MTGlzdEl0ZW0gPSBtb2R1bGUuZXhwb3J0cyA9IE1MTGlzdEl0ZW07XG5cblxuXy5leHRlbmRQcm90byhNTExpc3RJdGVtLCB7XG4gICAgaW5pdDogTUxMaXN0SXRlbSRpbml0LFxuICAgIG1vdmVJdGVtOiBNTExpc3RJdGVtJG1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdEl0ZW0kcmVtb3ZlSXRlbSxcbiAgICBpc0Ryb3BBbGxvd2VkOiBNTExpc3RJdGVtJGlzRHJvcEFsbG93ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdmFyIGRlbGV0ZUJ0biA9IHRoaXMuY29udGFpbmVyLnNjb3BlLmRlbGV0ZUJ0bjtcbiAgICBkZWxldGVCdG4gJiYgZGVsZXRlQnRuLmV2ZW50cy5vbignY2xpY2snLCB7IHN1YnNjcmliZXI6IHRoaXMucmVtb3ZlSXRlbSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJHJlbW92ZUl0ZW0oKSB7XG4gICAgdHJ5IHsgdmFyIGxpc3RPd25lciA9IHRoaXMuaXRlbS5saXN0Lm93bmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgbGlzdE93bmVyICYmIGxpc3RPd25lci5yZW1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbSRtb3ZlSXRlbShpbmRleCkge1xuICAgIHZhciBsaXN0T3duZXIgPSB0aGlzLml0ZW0ubGlzdC5vd25lcjtcbiAgICBsaXN0T3duZXIgJiYgbGlzdE93bmVyLm1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCwgaW5kZXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaXNEcm9wQWxsb3dlZChtZXRhLCBkcmFnRHJvcCl7XG4gICAgcmV0dXJuIG1ldGEucGFyYW1zICYmIG1ldGEucGFyYW1zLmluZGV4ICYmIG1ldGEuY29tcENsYXNzID09ICdNTExpc3RJdGVtJztcbn1cblxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEcm9wQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIG9uSXRlbURyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIG9uRHJhZ091dC5jYWxsKHRoaXMpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgdmFyIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG4gICAgdmFyIHN0YXRlID0gZHQuZ2V0Q29tcG9uZW50U3RhdGUoKTtcbiAgICB2YXIgbGlzdE93bmVyID0gdGhpcy5pdGVtLmxpc3Qub3duZXI7XG4gICAgdmFyIGluZGV4ID0gbWV0YS5wYXJhbXMgJiYgbWV0YS5wYXJhbXMuaW5kZXg7XG5cbiAgICBsaXN0T3duZXIubW92ZUl0ZW0oK2luZGV4LCB0aGlzLml0ZW0uaW5kZXgsIHN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdIb3ZlcihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5kb20uYWRkQ3NzQ2xhc3NlcygnbWwtZHJhZy1vdmVyJyk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnT3V0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmRvbS5yZW1vdmVDc3NDbGFzc2VzKCdtbC1kcmFnLW92ZXInKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRNZXRhRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogdGhpcy5pdGVtLmluZGV4XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW1fZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbV9zZXQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICB0aGlzLmRhdGEuX3NldCh2YWx1ZSk7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xuICAgIF9zZW5kQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtX2RlbCgpIHtcbiAgICB0aGlzLmRhdGEuX2RlbCgpO1xuICAgIHRoaXMubW9kZWwuZGVsKCk7XG4gICAgX3NlbmRDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7ICAgIFxufVxuXG5cbmZ1bmN0aW9uIF9zZW5kQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBtaWxvQ291bnQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvdW50JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgUkFESU9fQ0hBTkdFX01FU1NBR0UgPSAnbWxyYWRpb2dyb3VwY2hhbmdlJ1xuICAgICwgRUxFTUVOVF9OQU1FX1BST1BFUlRZID0gJ19tbFJhZGlvR3JvdXBFbGVtZW50SUQnXG4gICAgLCBFTEVNRU5UX05BTUVfUFJFRklYID0gJ21sLXJhZGlvLWdyb3VwLSc7XG5cbnZhciBNTFJhZGlvR3JvdXAgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MUmFkaW9Hcm91cCcsIHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNldDogTUxSYWRpb0dyb3VwX3NldCxcbiAgICAgICAgZ2V0OiBNTFJhZGlvR3JvdXBfZ2V0LFxuICAgICAgICBkZWw6IE1MUmFkaW9Hcm91cF9kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogUkFESU9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayc6IHsgc3Vic2NyaWJlcjogb25Hcm91cENsaWNrLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXJhZGlvLWdyb3VwJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICd7e34gaXQucmFkaW9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IyNkZWYuZWxJRDp7ez0gaXQuZWxlbWVudE5hbWUgfX0te3s9IG9wdGlvbi52YWx1ZSB9fSN9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7ez0gaXQuX3JlbmRlck9wdGlvbnMub3B0aW9uQ3NzQ2xhc3MgfHwgXCInICsgRUxFTUVOVF9OQU1FX1BSRUZJWCArICdvcHRpb25cIiB9fVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7IyBkZWYuZWxJRCB9fVwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s9IG9wdGlvbi52YWx1ZSB9fVwiIG5hbWU9XCJ7ez0gaXQuZWxlbWVudE5hbWUgfX1cIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3sjIGRlZi5lbElEIH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvbGFiZWw+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxSYWRpb0dyb3VwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFJhZGlvR3JvdXA7XG5cblxuXy5leHRlbmRQcm90byhNTFJhZGlvR3JvdXAsIHtcbiAgICBpbml0OiBNTFJhZGlvR3JvdXAkaW5pdCxcbiAgICBkZXN0cm95OiBNTFJhZGlvR3JvdXAkZGVzdHJveSxcbiAgICBzZXRSZW5kZXJPcHRpb25zOiBNTFJhZGlvR3JvdXAkc2V0UmVuZGVyT3B0aW9uc1xufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXAkaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfcmFkaW9MaXN0JywgW10sIF8uQ09ORik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBFTEVNRU5UX05BTUVfUFJPUEVSVFksIEVMRU1FTlRfTkFNRV9QUkVGSVggKyBtaWxvQ291bnQoKSk7XG4gICAgdGhpcy5fcmVuZGVyT3B0aW9ucyA9IHt9O1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cCRzZXRSZW5kZXJPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB0aGlzLl9yZW5kZXJPcHRpb25zID0gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIFNldHMgZ3JvdXAgdmFsdWVcbiAqIFJlcGxhY2VzIHRoZSBkYXRhIHNldCBvcGVyYXRpb24gdG8gZGVhbCB3aXRoIHJhZGlvIGJ1dHRvbnNcbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cF9zZXQodmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX3JhZGlvTGlzdFxuICAgICAgICAsIHNldFJlc3VsdDtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgICAgICByYWRpby5jaGVja2VkID0gcmFkaW8udmFsdWUgPT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAocmFkaW8uY2hlY2tlZClcbiAgICAgICAgICAgICAgICBzZXRSZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX2dldCgpIHtcbiAgICB2YXIgY2hlY2tlZCA9IF8uZmluZCh0aGlzLl9yYWRpb0xpc3QsIGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgIHJldHVybiByYWRpby5jaGVja2VkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoZWNrZWQgJiYgY2hlY2tlZC52YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBEZWxldGVkIGdyb3VwIHZhbHVlXG4gKiBEZWxldGVzIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXAsIHNldHRpbmcgaXQgdG8gZW1wdHlcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX2RlbCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX3JhZGlvTGlzdDtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihyYWRpbykge1xuICAgICAgICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBNYW5hZ2UgcmFkaW8gY2hpbGRyZW4gY2xpY2tzXG4gKi9cbmZ1bmN0aW9uIG9uR3JvdXBDbGljayhldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09ICdyYWRpbycpXG4gICAgICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuXG4vLyBQb3N0IHRoZSBkYXRhIGNoYW5nZVxuZnVuY3Rpb24gZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoUkFESU9fQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5cbi8vIFNldCByYWRpbyBidXR0b24gY2hpbGRyZW4gb24gbW9kZWwgY2hhbmdlXG5mdW5jdGlvbiBvbk9wdGlvbnNDaGFuZ2UocGF0aCwgZGF0YSkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgcmFkaW9PcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpLFxuICAgICAgICBlbGVtZW50TmFtZTogdGhpc1tFTEVNRU5UX05BTUVfUFJPUEVSVFldLFxuICAgICAgICBfcmVuZGVyT3B0aW9uczogdGhpcy5fcmVuZGVyT3B0aW9uc1xuICAgIH0pO1xuXG4gICAgdmFyIHJhZGlvRWxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl0nKVxuICAgICAgICAsIG9wdGlvbnMgPSBfLnRvQXJyYXkocmFkaW9FbHMpO1xuXG4gICAgdGhpcy5fcmFkaW9MaXN0Lmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fcmFkaW9MaXN0LnNwbGljZS5hcHBseSh0aGlzLl9yYWRpb0xpc3QsIFswLCAwXS5jb25jYXQob3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cCRkZXN0cm95KCkge1xuICAgIGRlbGV0ZSB0aGlzLl9yYWRpb0xpc3Q7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTFNlbGVjdCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxTZWxlY3QnLCB7XG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXNlbGVjdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ3t7fiBpdC5zZWxlY3RPcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7ez0gb3B0aW9uLnZhbHVlIH19XCIge3s/IG9wdGlvbi5zZWxlY3RlZCB9fXNlbGVjdGVke3s/fX0+e3s9IG9wdGlvbi5sYWJlbCB9fTwvb3B0aW9uPiBcXFxuICAgICAgICAgICAgICAgICAgIHt7fn19J1xuICAgIH1cbn0pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxTZWxlY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MU2VsZWN0O1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxTZWxlY3QsIHtcbiAgICBzZXRPcHRpb25zOiBNTFNlbGVjdCRzZXRPcHRpb25zLFxuICAgIGRpc2FibGU6IE1MU2VsZWN0JGRpc2FibGVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MU2VsZWN0JHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIFNldCBvcHRpb25zIHRlbXBvcmFyaWx5IGRpc2FibGVzIG1vZGVsIHN1YnNjcmlwdGlvbnMgKEFzIGEgd29ya2Fyb3VuZCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIHJlbGF0aW5nIHRvIG1vZGVsIHVwZGF0ZXMgLyB0ZW1wbGF0ZSByZS1yZW5kZXJpbmcpXG4gICAgdmFyIG1vZGVsQ2hhbmdlTGlzdGVuZXIgPSB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSB9O1xuXG4gICAgdGhpcy5tb2RlbC5vZmYoJyoqJywgbW9kZWxDaGFuZ2VMaXN0ZW5lcik7XG4gICAgdGhpcy5tb2RlbC5zZXQob3B0aW9ucyk7XG4gICAgdGhpcy5tb2RlbC5vbignKionLCBtb2RlbENoYW5nZUxpc3RlbmVyKTtcblxuICAgIG9uT3B0aW9uc0NoYW5nZS5jYWxsKHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MU2VsZWN0JGRpc2FibGUoZGlzYWJsZSkge1xuICAgIHRoaXMuZWwuZGlzYWJsZWQgPSBkaXNhYmxlO1xufVxuXG5cbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoeyBzZWxlY3RPcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1MU3VwZXJDb21ib1xuICogQSBjb21ibyBzZWxlY3QgbGlzdCB3aXRoIGludGVsbGlnZW50IHNjcm9sbGluZyBvZiBzdXBlciBsYXJnZSBsaXN0cy5cbiAqL1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1RcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG52YXIgQ09NQk9fT1BFTiA9ICdtbC11aS1zdXBlcmNvbWJvLW9wZW4nO1xudmFyIENPTUJPX0NIQU5HRV9NRVNTQUdFID0gJ21sc3VwZXJjb21ib2NoYW5nZSc7XG5cbnZhciBPUFRJT05TX1RFTVBMQVRFID0gJ3t7fiBpdC5jb21ib09wdGlvbnMgOm9wdGlvbjppbmRleCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB7ez8gb3B0aW9uLnNlbGVjdGVkfX1jbGFzcz1cInNlbGVjdGVkXCIge3s/fX1kYXRhLXZhbHVlPVwie3s9IGluZGV4IH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7e359fSc7XG5cbnZhciBNQVhfUkVOREVSRUQgPSAxMDA7XG52YXIgQlVGRkVSID0gMjU7XG52YXIgREVGQVVMVF9FTEVNRU5UX0hFSUdIVCA9IDIwO1xuXG52YXIgTUxTdXBlckNvbWJvID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFN1cGVyQ29tYm8nLCB7XG4gICAgZXZlbnRzOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnbW91c2VsZWF2ZSc6IHtzdWJzY3JpYmVyOiBvbk1vdXNlTGVhdmUsIGNvbnRleHQ6ICdvd25lcid9LFxuICAgICAgICAgICAgJ21vdXNlb3Zlcic6IHtzdWJzY3JpYmVyOiBvbk1vdXNlT3ZlciwgY29udGV4dDogJ293bmVyJ31cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MU3VwZXJDb21ib19nZXQsXG4gICAgICAgIHNldDogTUxTdXBlckNvbWJvX3NldCxcbiAgICAgICAgZGVsOiBNTFN1cGVyQ29tYm9fZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktc3VwZXJjb21ibydcbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnPGlucHV0IG1sLWJpbmQ9XCJbZGF0YSwgZXZlbnRzXTppbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1sLXVpLWlucHV0XCI+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTphZGRJdGVtRGl2XCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLWFkZFwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiOmFkZFByb21wdFwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiW2V2ZW50cywgZG9tXTphZGRCdG5cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBtbC11aS1idXR0b25cIj5BZGQ8L2J1dHRvbj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbSwgZXZlbnRzXTpsaXN0XCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLWRyb3Bkb3duXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbV06YmVmb3JlXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW3RlbXBsYXRlLCBkb20sIGV2ZW50c106b3B0aW9uc1wiIGNsYXNzPVwibWwtdWktc3VwZXJjb21iby1vcHRpb25zXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbV06YWZ0ZXJcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PidcbiAgICB9LFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFN1cGVyQ29tYm8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MU3VwZXJDb21ibztcblxuLyoqXG4gKiBQdWJsaWMgQXBpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTUxTdXBlckNvbWJvLCB7XG4gICAgaW5pdDogTUxTdXBlckNvbWJvJGluaXQsXG4gICAgc2hvd09wdGlvbnM6IE1MU3VwZXJDb21ibyRzaG93T3B0aW9ucyxcbiAgICBoaWRlT3B0aW9uczogTUxTdXBlckNvbWJvJGhpZGVPcHRpb25zLFxuICAgIHRvZ2dsZU9wdGlvbnM6IE1MU3VwZXJDb21ibyR0b2dnbGVPcHRpb25zLFxuICAgIHNldE9wdGlvbnM6IE1MU3VwZXJDb21ibyRzZXRPcHRpb25zLFxuICAgIGluaXRPcHRpb25zVVJMOiBNTFN1cGVyQ29tYm8kaW5pdE9wdGlvbnNVUkwsXG4gICAgc2V0RmlsdGVyZWRPcHRpb25zOiBNTFN1cGVyQ29tYm8kc2V0RmlsdGVyZWRPcHRpb25zLFxuICAgIHVwZGF0ZTogTUxTdXBlckNvbWJvJHVwZGF0ZSxcbiAgICB0b2dnbGVBZGRCdXR0b246IE1MU3VwZXJDb21ibyR0b2dnbGVBZGRCdXR0b24sXG4gICAgc2V0QWRkSXRlbVByb21wdDogTUxTdXBlckNvbWJvJHNldEFkZEl0ZW1Qcm9tcHQsXG4gICAgY2xlYXJDb21ib0lucHV0OiBNTFN1cGVyQ29tYm9fZGVsXG59KTtcblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpc2UgdGhlIGNvbXBvbmVudCwgd2FpdCBmb3IgY2hpbGRyZW5ib3VuZCwgc2V0dXAgZW1wdHkgb3B0aW9ucyBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5vbmNlKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9vcHRpb25zRGF0YTogW10sXG4gICAgICAgIF9maWx0ZXJlZE9wdGlvbnNEYXRhOiBbXVxuICAgIH0sIF8uV1JJVCk7XG59XG5cbi8qKlxuICogSGFuZGxlciBmb3IgaW5pdCBjaGlsZHJlbmJvdW5kIGxpc3RlbmVyLiBSZW5kZXJzIHRlbXBsYXRlLlxuICovXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoKS5iaW5kZXIoKTtcbiAgICBjb21wb25lbnRTZXR1cC5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogRGVmaW5lIGluc3RhbmNlIHByb3BlcnRpZXMsIGdldCBzdWJjb21wb25lbnRzLCBjYWxsIHNldHVwIHN1Yi10YXNrc1xuICovXG5mdW5jdGlvbiBjb21wb25lbnRTZXR1cCgpIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzLmNvbnRhaW5lci5zY29wZTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9jb21ib0lucHV0OiBzY29wZS5pbnB1dCxcbiAgICAgICAgX2NvbWJvTGlzdDogc2NvcGUubGlzdCxcbiAgICAgICAgX2NvbWJvT3B0aW9uczogc2NvcGUub3B0aW9ucyxcbiAgICAgICAgX2NvbWJvQmVmb3JlOiBzY29wZS5iZWZvcmUsXG4gICAgICAgIF9jb21ib0FmdGVyOiBzY29wZS5hZnRlcixcbiAgICAgICAgX2NvbWJvQWRkSXRlbURpdjogc2NvcGUuYWRkSXRlbURpdixcbiAgICAgICAgX2NvbWJvQWRkUHJvbXB0OiBzY29wZS5hZGRQcm9tcHQsXG4gICAgICAgIF9jb21ib0FkZEJ0bjogc2NvcGUuYWRkQnRuLFxuICAgICAgICBfb3B0aW9uVGVtcGxhdGU6IGRvVC5jb21waWxlKE9QVElPTlNfVEVNUExBVEUpXG4gICAgfSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfc3RhcnRJbmRleDogMCxcbiAgICAgICAgX2VuZEluZGV4OiBNQVhfUkVOREVSRUQsXG4gICAgICAgIF9oaWRkZW46IGZhbHNlLFxuICAgICAgICBfZWxlbWVudEhlaWdodDogREVGQVVMVF9FTEVNRU5UX0hFSUdIVCxcbiAgICAgICAgX3RvdGFsOiAwLFxuICAgICAgICBfb3B0aW9uc0hlaWdodDogMjAwLFxuICAgICAgICBfbGFzdFNjcm9sbFBvczogMCxcbiAgICAgICAgX2N1cnJlbnRWYWx1ZTogbnVsbCxcbiAgICAgICAgX3NlbGVjdGVkOiBudWxsLFxuICAgICAgICBfaXNBZGRCdXR0b25TaG93bjogZmFsc2VcbiAgICB9LCBfLldSSVQpO1xuXG4gICAgLy8gQ29tcG9uZW50IFNldHVwXG4gICAgdGhpcy5kb20uc2V0U3R5bGVzKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7XG4gICAgc2V0dXBDb21ib0xpc3QodGhpcy5fY29tYm9MaXN0LCB0aGlzLl9jb21ib09wdGlvbnMsIHRoaXMpO1xuICAgIHNldHVwQ29tYm9JbnB1dCh0aGlzLl9jb21ib0lucHV0LCB0aGlzKTtcbiAgICBzZXR1cENvbWJvQnRuKHRoaXMuX2NvbWJvQWRkQnRuLCB0aGlzKTtcblxuICAgIHRoaXMuZXZlbnRzLm9uKCdrZXlkb3duJywgeyBzdWJzY3JpYmVyOiBjaGFuZ2VTZWxlY3RlZCwgY29udGV4dDogdGhpcyB9KTtcbiAgICAvL3RoaXMuZXZlbnRzLm9uKCdtb3VzZWxlYXZlJywgeyBzdWJzY3JpYmVyOiBNTFN1cGVyQ29tYm8kaGlkZU9wdGlvbnMsIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2hvd3Mgb3IgaGlkZXMgb3B0aW9uIGxpc3QuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBzaG93IHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZVxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kdG9nZ2xlT3B0aW9ucyhzaG93KSB7XG4gICAgdGhpcy5faGlkZGVuID0gIXNob3c7XG4gICAgdGhpcy5fY29tYm9MaXN0LmRvbS50b2dnbGUoc2hvdyk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2hvd3Mgb3B0aW9ucyBsaXN0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzaG93T3B0aW9ucygpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoQ09NQk9fT1BFTik7XG4gICAgdGhpcy5fY29tYm9MaXN0LmRvbS50b2dnbGUodHJ1ZSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgb3B0aW9ucyBsaXN0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRoaWRlT3B0aW9ucygpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZShDT01CT19PUEVOKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgYWRkIGJ1dHRvblxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kdG9nZ2xlQWRkQnV0dG9uKHNob3csIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9jb21ib0FkZEl0ZW1EaXYuZG9tLnRvZ2dsZShzaG93KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByZXNlcnZlU3RhdGUpIHRoaXMuX19zaG93QWRkT25DbGljayA9IHRoaXMuX2lzQWRkQnV0dG9uU2hvd247XG4gICAgdGhpcy5faXNBZGRCdXR0b25TaG93biA9IHNob3c7XG59XG5cblxuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KSB7XG4gICAgdGhpcy5fYWRkSXRlbVByb21wdCA9IHByb21wdDtcbiAgICB0aGlzLl9jb21ib0FkZFByb21wdC5lbC5pbm5lckhUTUwgPSBwcm9tcHQ7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd25cbiAqXG4gKiBAcGFyYW0ge0FycmF5W09iamVjdF19IGFyciB0aGUgb3B0aW9ucyB0byBzZXQgd2l0aCBsYWJlbCBhbmQgdmFsdWUgcGFpcnMuIFZhbHVlIGNhbiBiZSBhbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzZXRPcHRpb25zKGFycikge1xuICAgIHRoaXMuX29wdGlvbnNEYXRhID0gYXJyO1xuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKGFycik7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXNlIHRoZSByZW1vdGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBpbml0aWFsaXNlLlxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kaW5pdE9wdGlvbnNVUkwob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnNVUkwgPSBvcHRpb25zLnVybDtcbiAgICB0aGlzLl9mb3JtYXRPcHRpb25zVVJMID0gb3B0aW9ucy5mb3JtYXRPcHRpb25zIHx8IGZ1bmN0aW9uKGUpe3JldHVybiBlO307XG59XG5cblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZFxuICogU2V0cyB0aGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd24gYmFzZWQgb24gYSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIF9nZXRPcHRpb25zVVJMKGNiKSB7XG4gICAgdmFyIHVybCA9IHRoaXMuX29wdGlvbnNVUkwsXG4gICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY29tYm9JbnB1dC5kYXRhLmdldCgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjYiA9IGNiIHx8IF8ubm9vcDtcbiAgICBtaWxvLnV0aWwucmVxdWVzdC5wb3N0KHVybCwgeyBuYW1lOiBxdWVyeVN0cmluZyB9LCBmdW5jdGlvbiAoZXJyLCByZXNwb25zZSkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NhbiBub3Qgc2VhcmNoIGZvciBcIicgKyBxdWVyeVN0cmluZyArICdcIicpO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignUmVxdWVzdCBlcnJvcicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXNwb25zZURhdGEgPSBfLmpzb25QYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGlmIChyZXNwb25zZURhdGEpIGNiKG51bGwsIHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIGVsc2UgY2IobmV3IEVycm9yKCdEYXRhIGVycm9yJykpO1xuICAgIH0pO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgZmlsdGVyZWQgb3B0aW9ucywgd2hpY2ggaXMgYSBzdWJzZXQgb2Ygbm9ybWFsIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1t0eXBlXX0gYXJyIFRoZSBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kc2V0RmlsdGVyZWRPcHRpb25zKGFycikge1xuICAgIGlmICghIGFycikgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0RmlsdGVyZWRPcHRpb25zOiBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkJyk7XG4gICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YSA9IGFycjtcbiAgICB0aGlzLl90b3RhbCA9IGFyci5sZW5ndGg7XG4gICAgdGhpcy51cGRhdGUoKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBVcGRhdGVzIHRoZSBsaXN0LiBUaGlzIGlzIHVzZWQgb24gc2Nyb2xsLCBhbmQgbWFrZXMgdXNlIG9mIHRoZSBmaWx0ZXJlZE9wdGlvbnMgdG9cbiAqIGludGVsbGlnZW50bHkgc2hvdyBhIHN1YnNldCBvZiB0aGUgZmlsdGVyZWQgbGlzdCBhdCBhIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR1cGRhdGUoKSB7XG4gICAgdmFyIHdhc0hpZGRlbiA9IHRoaXMuX2hpZGRlbjtcblxuICAgIHZhciBhcnJUb1Nob3cgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhLnNsaWNlKHRoaXMuX3N0YXJ0SW5kZXgsIHRoaXMuX2VuZEluZGV4KTtcblxuICAgIHRoaXMuX2NvbWJvT3B0aW9ucy50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICBjb21ib09wdGlvbnM6IGFyclRvU2hvd1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZWxlbWVudEhlaWdodCA9IHRoaXMuX2VsZW1lbnRIZWlnaHQgfHwgREVGQVVMVF9FTEVNRU5UX0hFSUdIVDtcblxuICAgIGlmICh3YXNIaWRkZW4pXG4gICAgICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcblxuICAgIHZhciBiZWZvcmVIZWlnaHQgPSB0aGlzLl9zdGFydEluZGV4ICogdGhpcy5fZWxlbWVudEhlaWdodDtcbiAgICB2YXIgYWZ0ZXJIZWlnaHQgPSAodGhpcy5fdG90YWwgLSB0aGlzLl9lbmRJbmRleCkgKiB0aGlzLl9lbGVtZW50SGVpZ2h0O1xuICAgIHRoaXMuX2NvbWJvQmVmb3JlLmVsLnN0eWxlLmhlaWdodCA9IGJlZm9yZUhlaWdodCArICdweCc7XG4gICAgdGhpcy5fY29tYm9BZnRlci5lbC5zdHlsZS5oZWlnaHQgPSBhZnRlckhlaWdodCA+IDAgPyBhZnRlckhlaWdodCArICdweCcgOiAnMHB4Jztcbn1cblxuLyoqXG4gKiBTZXR1cCB0aGUgY29tYm8gbGlzdFxuICpcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gbGlzdFxuICogQHBhcmFtICB7QXJyYXl9IG9wdGlvbnNcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvTGlzdChsaXN0LCBvcHRpb25zLCBzZWxmKSB7XG4gICAgc2VsZi50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xuICAgIG9wdGlvbnMudGVtcGxhdGUuc2V0KE9QVElPTlNfVEVNUExBVEUpO1xuXG4gICAgbGlzdC5kb20uc2V0U3R5bGVzKHtcbiAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnLFxuICAgICAgICBoZWlnaHQ6IHNlbGYuX29wdGlvbnNIZWlnaHQgKyAncHgnLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgekluZGV4OiAxMFxuICAgICAgICAvLyB0b3A6IHlQb3MgKyAncHgnLFxuICAgICAgICAvLyBsZWZ0OiB4UG9zICsgJ3B4JyxcbiAgICB9KTtcblxuICAgIHNlbGYuaGlkZU9wdGlvbnMoKTtcbiAgICBsaXN0LmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2NsaWNrJzoge3N1YnNjcmliZXI6IG9uTGlzdENsaWNrLCBjb250ZXh0OiBzZWxmfSxcbiAgICAgICAgJ3Njcm9sbCc6IHtzdWJzY3JpYmVyOiBvbkxpc3RTY3JvbGwsIGNvbnRleHQ6IHNlbGZ9XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0dXAgdGhlIGlucHV0IGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gaW5wdXRcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvSW5wdXQoaW5wdXQsIHNlbGYpIHtcbiAgICBpbnB1dC5ldmVudHMub25jZSgnZm9jdXMnLCBmdW5jdGlvbigpe1xuICAgICAgICBpbnB1dC5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uRGF0YUNoYW5nZSwgY29udGV4dDogc2VsZiB9KTtcbiAgICAgICAgaW5wdXQuZXZlbnRzLm9uKCdjbGljaycsIHtzdWJzY3JpYmVyOiBvbklucHV0Q2xpY2ssIGNvbnRleHQ6IHNlbGYgfSk7XG4gICAgICAgIGlucHV0LmV2ZW50cy5vbigna2V5ZG93bicsIHtzdWJzY3JpYmVyOiBvbkVudGVyS2V5LCBjb250ZXh0OiBzZWxmIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFNldHVwIHRoZSBidXR0b25cbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gYnRuXG4gKiBAcGFyYW0gIHtDb21wb25lbnR9IHNlbGZcbiAqL1xuZnVuY3Rpb24gc2V0dXBDb21ib0J0bihidG4sIHNlbGYpIHtcbiAgICBidG4uZXZlbnRzLm9uKCdjbGljaycsIHsgc3Vic2NyaWJlcjogb25BZGRCdG4sIGNvbnRleHQ6IHNlbGYgfSk7XG59XG5cblxuLyoqXG4gKiBDdXN0b20gZGF0YSBmYWNldCBnZXQgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ib19nZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZGF0YSBmYWNldCBzZXQgbWV0aG9kXG4gKiBAcGFyYW0ge1ZhcmlhYmxlfSBvYmpcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX3NldChvYmopIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBvYmo7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLnNldChvYmogJiYgb2JqLmxhYmVsKTtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdoaWRlT3B0aW9ucycpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IGRlbCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX2RlbCgpIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5zZXQoJycpO1xufVxuXG5cbi8qKlxuICogSW5wdXQgZGF0YSBjaGFuZ2UgaGFuZGxlclxuICogV2hlbiB0aGUgaW5wdXQgZGF0YSBjaGFuZ2VzLCB0aGlzIG1ldGhvZCBmaWx0ZXJzIHRoZSBvcHRpb25zRGF0YSwgYW5kIHNldHMgdGhlIGZpcnN0IGVsZW1lbnRcbiAqIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtICB7U3RyaW5nfSBtc2dcbiAqIEBwYXJhbSAge09iamV4dH0gZGF0YVxuICovXG5mdW5jdGlvbiBvbkRhdGFDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdmFyIHRleHQgPSBkYXRhLm5ld1ZhbHVlICYmIGRhdGEubmV3VmFsdWUudHJpbSgpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zVVJMKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgX2dldE9wdGlvbnNVUkwuY2FsbCh0aGlzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlRGF0YSl7XG4gICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXNwb25zZURhdGEpIHJldHVybjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXNwb25zZURhdGEuZGF0YS5tYXAoc2VsZi5fZm9ybWF0T3B0aW9uc1VSTCk7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uLmNhbGwoc2VsZiwgdGV4dCwgc2VsZi5fb3B0aW9uc0RhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdEYXRhIGVycm9yJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWx0ZXJlZERhdGEgPSBfZmlsdGVyRGF0YS5jYWxsKHRoaXMsIHRleHQpO1xuICAgICAgICBfdXBkYXRlT3B0aW9uc0FuZEFkZEJ1dHRvbi5jYWxsKHRoaXMsIHRleHQsIGZpbHRlcmVkRGF0YSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9maWx0ZXJEYXRhKHRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0RhdGEuZmlsdGVyKGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICBkZWxldGUgb3B0aW9uLnNlbGVjdGVkO1xuICAgICAgICBpZiAob3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRleHQudG9Mb3dlckNhc2UoKSkgPT0gMDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uKHRleHQsIGZpbHRlcmVkQXJyKSB7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmxlbmd0aCAmJiBfLmZpbmQoZmlsdGVyZWRBcnIsIGlzRXhhY3RNYXRjaCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYWRkSXRlbVByb21wdCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24odGhpcy5fb3B0aW9uc0RhdGEubGVuZ3RoID4gMSB8fCB0aGlzLl9vcHRpb25zVVJMKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJlZEFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgICAgIGZpbHRlcmVkQXJyWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZmlsdGVyZWRBcnJbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXJlZEFycik7XG4gICAgdGhpcy5fY29tYm9MaXN0LmVsLnNjcm9sbFRvcCA9IDA7XG5cbiAgICBmdW5jdGlvbiBpc0V4YWN0TWF0Y2goaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgbWFwIG9mIGtleUNvZGVzIHRvIGRpcmVjdGlvbnNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBkaXJlY3Rpb25NYXAgPSB7ICc0MCc6IDEsICczOCc6IC0xIH07XG5cbi8qKlxuICogTGlzdCBrZXlkb3duIGhhbmRsZXJcbiAqIENoYW5nZXMgdGhlIHNlbGVjdGVkIGxpc3QgaXRlbSBieSBmaW5kaW5nIHRoZSBhZGphY2VudCBpdGVtIGFuZCBzZXR0aW5nIGl0IHRvIHNlbGVjdGVkLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGNoYW5nZVNlbGVjdGVkKHR5cGUsIGV2ZW50KSB7XG4gICAgLy9UT0RPIHRlc3QgbW9jaGFcbiAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW2V2ZW50LmtleUNvZGVdO1xuXG4gICAgaWYoZGlyZWN0aW9uKVxuICAgICAgICBfY2hhbmdlU2VsZWN0ZWQuY2FsbCh0aGlzLCBkaXJlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBfY2hhbmdlU2VsZWN0ZWQoZGlyZWN0aW9uKSB7XG4gICAgLy8gVE9ETzogcmVmYWN0b3IgYW5kIHRpZHkgdXAsIGxvb2tzIGxpa2Ugc29tZSBjb2RlIGR1cGxpY2F0aW9uLlxuICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJylbMF1cbiAgICAgICAgLCBzY3JvbGxQb3MgPSB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wXG4gICAgICAgICwgc2VsZWN0ZWRQb3MgPSBzZWxlY3RlZCA/IHNlbGVjdGVkLm9mZnNldFRvcCA6IDBcbiAgICAgICAgLCByZWxhdGl2ZVBvcyA9IHNlbGVjdGVkUG9zIC0gc2Nyb2xsUG9zO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHZhciBpbmRleCA9IF9nZXREYXRhVmFsdWVGcm9tRWxlbWVudC5jYWxsKHRoaXMsIHNlbGVjdGVkKVxuICAgICAgICAgICAgLCB0aGlzSXRlbSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXhdXG4gICAgICAgICAgICAsIGFkakl0ZW0gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhW2luZGV4ICsgZGlyZWN0aW9uXTtcblxuICAgICAgICBpZiAoYWRqSXRlbSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXNJdGVtLnNlbGVjdGVkO1xuICAgICAgICAgICAgYWRqSXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGFkakl0ZW07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWxhdGl2ZVBvcyA+IHRoaXMuX29wdGlvbnNIZWlnaHQgLSB0aGlzLl9lbGVtZW50SGVpZ2h0KjIgJiYgZGlyZWN0aW9uID09PSAxKVxuICAgICAgICB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wICs9IHRoaXMuX2VsZW1lbnRIZWlnaHQqZGlyZWN0aW9uKjU7XG5cbiAgICBpZiAocmVsYXRpdmVQb3MgPCB0aGlzLl9lbGVtZW50SGVpZ2h0ICYmIGRpcmVjdGlvbiA9PT0gLTEpXG4gICAgICAgIHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3AgKz0gdGhpcy5fZWxlbWVudEhlaWdodCpkaXJlY3Rpb24qNTtcbn1cblxuXG4vKipcbiAqIE1vdXNlIG92ZXIgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTW91c2VPdmVyKHR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5fbW91c2VJc092ZXIgPSB0cnVlO1xufVxuXG5cbi8qKlxuICogTW91c2UgbGVhdmUgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTW91c2VMZWF2ZSh0eXBlLCBldmVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9tb3VzZUlzT3ZlciA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9tb3VzZU91dFRpbWVyKSBjbGVhckludGVydmFsKHRoaXMuX21vdXNlT3V0VGltZXIpO1xuICAgIHRoaXMuX21vdXNlT3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICghc2VsZi5fbW91c2VJc092ZXIpXG4gICAgICAgICAgICBfb25Nb3VzZUxlYXZlLmNhbGwoc2VsZik7XG4gICAgfSwgNzUwKTtcbn1cblxuZnVuY3Rpb24gX29uTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbn1cblxuXG4vKipcbiAqIElucHV0IGNsaWNrIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbklucHV0Q2xpY2sodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgaWYgKHRoaXMuX19zaG93QWRkT25DbGljaykgdGhpcy50b2dnbGVBZGRCdXR0b24odHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBFbnRlciBrZXkgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uRW50ZXJLZXkodHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpXG4gICAgICAgICAgICBfc2V0RGF0YS5jYWxsKHRoaXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYnV0dG9uIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkFkZEJ0biAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgZGF0YSA9IHsgbGFiZWw6IHRoaXMuX2NvbWJvSW5wdXQuZWwudmFsdWUgfTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCdhZGRpdGVtJywgZGF0YSk7XG4gICAgdGhpcy5ldmVudHMucG9zdE1lc3NhZ2UoJ21pbG9fc3VwZXJjb21ib2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSwgeyBwcmVzZXJ2ZVN0YXRlOiB0cnVlIH0pO1xuXG59XG5cbi8qKlxuICogTGlzdCBjbGljayBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25MaXN0Q2xpY2sgKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIGluZGV4ID0gX2dldERhdGFWYWx1ZUZyb21FbGVtZW50LmNhbGwodGhpcywgZXZlbnQudGFyZ2V0KTtcbiAgICB2YXIgZGF0YSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXhdO1xuXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBkYXRhO1xuICAgIF9zZXREYXRhLmNhbGwodGhpcyk7XG4gICAgdGhpcy51cGRhdGUoKTtcbn1cblxuXG4vKipcbiAqIExpc3Qgc2Nyb2xsIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkxpc3RTY3JvbGwgKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNjcm9sbFBvcyA9IGV2ZW50LnRhcmdldC5zY3JvbGxUb3BcbiAgICAgICAgLCBkaXJlY3Rpb24gPSBzY3JvbGxQb3MgPiB0aGlzLl9sYXN0U2Nyb2xsUG9zID8gJ2Rvd24nIDogJ3VwJ1xuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzLl9jb21ib09wdGlvbnMuZWwubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgICAsIGxhc3RDaGlsZCA9IHRoaXMuX2NvbWJvT3B0aW9ucy5lbC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICAsIGxhc3RFbFBvc2l0aW9uID0gZmlyc3RDaGlsZCA/IGZpcnN0Q2hpbGQub2Zmc2V0VG9wIDogMFxuICAgICAgICAsIGZpcnN0RWxQb3NpdGlvbiA9IGxhc3RDaGlsZCA/IGxhc3RDaGlsZC5vZmZzZXRUb3AgOiAwXG4gICAgICAgICwgZGlzdEZyb21MYXN0RWwgPSBsYXN0RWxQb3NpdGlvbiAtIHNjcm9sbFBvcyAtIHRoaXMuX29wdGlvbnNIZWlnaHQgKyB0aGlzLl9lbGVtZW50SGVpZ2h0XG4gICAgICAgICwgZGlzdEZyb21GaXJzdEVsID0gc2Nyb2xsUG9zIC0gZmlyc3RFbFBvc2l0aW9uXG4gICAgICAgICwgZWxzRnJvbVN0YXJ0ID0gTWF0aC5mbG9vcihkaXN0RnJvbUZpcnN0RWwgLyB0aGlzLl9lbGVtZW50SGVpZ2h0KVxuICAgICAgICAsIGVsc1RvVGhlRW5kID0gTWF0aC5mbG9vcihkaXN0RnJvbUxhc3RFbCAvIHRoaXMuX2VsZW1lbnRIZWlnaHQpXG4gICAgICAgICwgdG90YWxFbGVtZW50c0JlZm9yZSA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gdGhpcy5fZWxlbWVudEhlaWdodCkgLSBCVUZGRVI7XG5cbiAgICBpZiAoKGRpcmVjdGlvbiA9PSAnZG93bicgJiYgZWxzVG9UaGVFbmQgPCBCVUZGRVIpXG4gICAgICAgIHx8IChkaXJlY3Rpb24gPT0gJ3VwJyAmJiBlbHNGcm9tU3RhcnQgPCBCVUZGRVIpKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0SW5kZXggPSB0b3RhbEVsZW1lbnRzQmVmb3JlID4gMCA/IHRvdGFsRWxlbWVudHNCZWZvcmUgOiAwO1xuICAgICAgICB0aGlzLl9lbmRJbmRleCA9IHRvdGFsRWxlbWVudHNCZWZvcmUgKyBNQVhfUkVOREVSRUQ7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRIZWlnaHQgPSBmaXJzdENoaWxkLnN0eWxlLmhlaWdodDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFNjcm9sbFBvcyA9IHNjcm9sbFBvcztcbn1cblxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgdGhlIGRhdGEtdmFsdWUgYXR0cmlidXRlIHZhbHVlIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgaXQgYXMgYW4gaW5kZXggb2ZcbiAqIHRoZSBmaWx0ZXJlZE9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBfZ2V0RGF0YVZhbHVlRnJvbUVsZW1lbnQoZWwpIHtcbiAgICByZXR1cm4gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSArIHRoaXMuX3N0YXJ0SW5kZXg7XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RcbiAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIFN1cGVyQ29tYm8sIHRha2luZyBjYXJlIHRvIHJlc2V0IHNvbWUgdGhpbmdzIGFuZCB0ZW1wb3JhcmlseVxuICogdW5zdWJzY3JpYmUgZGF0YSBsaXN0ZW5lcnMuXG4gKi9cbmZ1bmN0aW9uIF9zZXREYXRhKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zZWxlY3RlZC5zZWxlY3RlZDtcbiAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5vZmYoJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vc3VwZXJjb21ibyBsaXN0ZW5lcnMgb2ZmXG4gICAgdGhpcy5kYXRhLnNldCh0aGlzLl9zZWxlY3RlZCk7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19DSEFOR0VfTUVTU0FHRSk7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uRGF0YUNoYW5nZSwgY29udGV4dDogdGhpcyB9KTtcbiAgICAvL3N1cGVyY29tYm8gbGlzdGVuZXJzIG9uXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKHRoaXMuX29wdGlvbnNEYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTFRleHQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MVGV4dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRleHQnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUZXh0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFRleHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgTUxUZXh0YXJlYSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxUZXh0YXJlYScsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRleHRhcmVhJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MVGV4dGFyZWEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGV4dGFyZWE7XG5cblxudmFyIFNBTVBMRV9BVVRPUkVTSVpFX1RFWFQgPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQsJztcblxuXG5fLmV4dGVuZFByb3RvKE1MVGV4dGFyZWEsIHtcbiAgICBzdGFydEF1dG9yZXNpemU6IE1MVGV4dGFyZWEkc3RhcnRBdXRvcmVzaXplLFxuICAgIHN0b3BBdXRvcmVzaXplOiBNTFRleHRhcmVhJHN0b3BBdXRvcmVzaXplLFxuICAgIGlzQXV0b3Jlc2l6ZWQ6IE1MVGV4dGFyZWEkaXNBdXRvcmVzaXplZCxcbiAgICBkaXNhYmxlOiBNTFRleHRhcmVhJGRpc2FibGVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkc3RhcnRBdXRvcmVzaXplKG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5fYXV0b3Jlc2l6ZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTFRleHRhcmVhIHN0YXJ0QXV0b3Jlc2l6ZTogYXV0b3Jlc2l6ZSBpcyBhbHJlYWR5IG9uJyk7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZSA9IHRydWU7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgX2FkanVzdEFyZWFIZWlnaHQuY2FsbCh0aGlzKTtcbiAgICBfbWFuYWdlU3Vic2NyaXB0aW9ucy5jYWxsKHRoaXMsICdvbicpO1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VTdWJzY3JpcHRpb25zKG9uT2ZmKSB7XG4gICAgdGhpcy5ldmVudHNbb25PZmZdKCdjbGljaycsIHsgc3Vic2NyaWJlcjogX2FkanVzdEFyZWFIZWlnaHQsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgdGhpcy5kYXRhW29uT2ZmXSgnJywgeyBzdWJzY3JpYmVyOiBfYWRqdXN0QXJlYUhlaWdodCwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBfYWRqdXN0QXJlYUhlaWdodCgpIHtcbiAgICB0aGlzLmVsLnN0eWxlLmhlaWdodCA9IDA7XG5cbiAgICB2YXIgbmV3SGVpZ2h0ID0gdGhpcy5lbC5zY3JvbGxIZWlnaHRcbiAgICAgICAgLCBtaW5IZWlnaHQgPSB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucy5taW5IZWlnaHRcbiAgICAgICAgLCBtYXhIZWlnaHQgPSB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucy5tYXhIZWlnaHQ7XG5cbiAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPj0gbWF4SGVpZ2h0XG4gICAgICAgICAgICAgICAgPyBtYXhIZWlnaHRcbiAgICAgICAgICAgICAgICA6IG5ld0hlaWdodCA8PSBtaW5IZWlnaHRcbiAgICAgICAgICAgICAgICA/IG1pbkhlaWdodFxuICAgICAgICAgICAgICAgIDogbmV3SGVpZ2h0O1xuXG4gICAgdGhpcy5lbC5zdHlsZS5oZWlnaHQgPSBuZXdIZWlnaHQgKyAncHgnO1xufVxuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkc3RvcEF1dG9yZXNpemUoKSB7XG4gICAgaWYgKCEgdGhpcy5fYXV0b3Jlc2l6ZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTFRleHRhcmVhIHN0b3BBdXRvcmVzaXplOiBhdXRvcmVzaXplIGlzIG5vdCBvbicpO1xuICAgIHRoaXMuX2F1dG9yZXNpemUgPSBmYWxzZTtcbiAgICBfbWFuYWdlU3Vic2NyaXB0aW9ucy5jYWxsKHRoaXMsICdvZmYnKTtcbn1cblxuXG5mdW5jdGlvbiBNTFRleHRhcmVhJGlzQXV0b3Jlc2l6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9yZXNpemU7XG59XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICB0aGlzLnN0b3BBdXRvcmVzaXplKCk7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxUaW1lID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFRpbWUnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MVGltZV9nZXQsXG4gICAgICAgIHNldDogTUxUaW1lX3NldCxcbiAgICAgICAgZGVsOiBNTFRpbWVfZGVsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRpbWUnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUaW1lKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFRpbWU7XG5cblxudmFyIFRJTUVfUkVHRVggPSAvXihbMC05XXsxLDJ9KSg/OlxcOnxcXC4pKFswLTldezEsMn0pJC9cbiAgICAsIFRJTUVfVEVNUExBVEUgPSAnaGg6bW0nO1xuXG5mdW5jdGlvbiBNTFRpbWVfZ2V0KCkge1xuICAgIHZhciB0aW1lU3RyID0gdGhpcy5lbC52YWx1ZTtcbiAgICB2YXIgbWF0Y2ggPSB0aW1lU3RyLm1hdGNoKFRJTUVfUkVHRVgpO1xuICAgIGlmICghIG1hdGNoKSByZXR1cm47XG4gICAgdmFyIGhvdXJzID0gbWF0Y2hbMV1cbiAgICAgICAgLCBtaW5zID0gbWF0Y2hbMl07XG4gICAgaWYgKGhvdXJzID4gMjMgfHwgbWlucyA+IDU5KSByZXR1cm47XG4gICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgxOTcwLCAwLCAxLCBob3VycywgbWlucyk7XG5cbiAgICByZXR1cm4gXy50b0RhdGUodGltZSk7XG59XG5cblxuZnVuY3Rpb24gTUxUaW1lX3NldCh2YWx1ZSkge1xuICAgIHZhciB0aW1lID0gXy50b0RhdGUodmFsdWUpO1xuICAgIGlmICghIHRpbWUpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRpbWVTdHIgPSBUSU1FX1RFTVBMQVRFXG4gICAgICAgICAgICAucmVwbGFjZSgnaGgnLCBwYWQodGltZS5nZXRIb3VycygpKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCdtbScsIHBhZCh0aW1lLmdldE1pbnV0ZXMoKSkpO1xuXG4gICAgdGhpcy5lbC52YWx1ZSA9IHRpbWVTdHI7XG4gICAgcmV0dXJuIHRpbWVTdHI7XG5cbiAgICBmdW5jdGlvbiBwYWQobikge3JldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsgfVxufVxuXG5cbmZ1bmN0aW9uIE1MVGltZV9kZWwoKSB7XG4gICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MV3JhcHBlciA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxXcmFwcGVyJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktd3JhcHBlcidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFdyYXBwZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MV3JhcHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIEFMRVJUX0NTU19DTEFTU0VTID0ge1xuICAgIHN1Y2Nlc3M6ICdhbGVydC1zdWNjZXNzJyxcbiAgICB3YXJuaW5nOiAnYWxlcnQtd2FybmluZycsXG4gICAgaW5mbzogJ2FsZXJ0LWluZm8nLFxuICAgIGRhbmdlcjogJ2FsZXJ0LWRhbmdlcicsXG4gICAgZml4ZWQ6ICdhbGVydC1maXhlZCdcbn07XG5cblxudmFyIE1MQWxlcnQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQWxlcnQnLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogWydtbC1icy1hbGVydCcsICdhbGVydCcsICdmYWRlJ10sXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdyb2xlJzogJ2FsZXJ0JyxcbiAgICAgICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICB7ez8gaXQuY2xvc2UgfX1cXFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJhbGVydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cXFxuICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAge3s9IGl0Lm1lc3NhZ2V9fSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEFsZXJ0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEFsZXJ0O1xuXG5cbl8uZXh0ZW5kKE1MQWxlcnQsIHtcbiAgICBjcmVhdGVBbGVydDogTUxBbGVydCQkY3JlYXRlQWxlcnQsXG4gICAgb3BlbkFsZXJ0OiBNTEFsZXJ0JCRvcGVuQWxlcnQsXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MQWxlcnQsIHtcbiAgICBvcGVuQWxlcnQ6IE1MQWxlcnQkb3BlbkFsZXJ0LFxuICAgIGNsb3NlQWxlcnQ6IE1MQWxlcnQkY2xvc2VBbGVydFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGFsZXJ0IGluc3RhbmNlLiBUbyBjcmVhdGUgYW5kIG9wZW4gYXQgdGhlIHNhbWUgdGltZSB1c2UgW29wZW5BbGVydF0oI01MQWxlcnQkJG9wZW5BbGVydClcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgICBtZXNzYWdlOiBzdHJpbmcgYWxlcnQgbWVzc2FnZVxuICogICAgICB0eXBlOiAgICBvcHRpb25hbCBzdHJpbmcgdGhlIHR5cGUgb2YgYWxlcnQgbWVzc2FnZSwgb25lIG9mIHN1Y2Nlc3MsIHdhcm5pbmcsIGluZm8sIGRhbmdlciwgZml4ZWRcbiAqICAgICAgICAgICAgICAgZGVmYXVsdCAnaW5mbydcbiAqICAgICAgY2xvc2U6ICAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB1c2VyIGZyb20gY2xvc2luZ1xuICogICAgICAgICAgICAgICBvciB0cnVlIChkZWZhdWx0KSB0byBlbmFibGUgY2xvc2luZyBhbmQgcmVuZGVyIGEgY2xvc2UgYnV0dG9uXG4gKiAgICAgIHRpbWVvdXQ6IG9wdGlvbmFsIHRpbWVyLCBpbiBtaWxsaXNlY29uZHMgdG8gYXV0b21hdGljYWxseSBjbG9zZSB0aGUgYWxlcnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhbGVydCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIE1MQWxlcnQkJGNyZWF0ZUFsZXJ0KG9wdGlvbnMpIHtcbiAgICBjaGVjayhvcHRpb25zLCB7XG4gICAgICAgIG1lc3NhZ2U6IFN0cmluZyxcbiAgICAgICAgdHlwZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLFxuICAgICAgICB0aW1lb3V0OiBNYXRjaC5PcHRpb25hbChOdW1iZXIpXG4gICAgfSk7XG5cbiAgICB2YXIgYWxlcnQgPSBNTEFsZXJ0LmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIHZhciBhbGVydENscyA9IEFMRVJUX0NTU19DTEFTU0VTW29wdGlvbnMudHlwZV07XG4gICAgYWxlcnQuZG9tLmFkZENzc0NsYXNzZXMoYWxlcnRDbHMpO1xuXG4gICAgYWxlcnQuX2FsZXJ0ID0ge1xuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH07XG5cbiAgICBhbGVydC50ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucykuYmluZGVyKCk7XG5cbiAgICB2YXIgYWxlcnRTY29wZSA9IGFsZXJ0LmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlKVxuICAgICAgICBhbGVydFNjb3BlLmNsb3NlQnRuLmV2ZW50cy5vbignY2xpY2snLFxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfb25DbG9zZUJ0bkNsaWNrLCBjb250ZXh0OiBhbGVydCB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQpXG4gICAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKGFsZXJ0Ll9hbGVydC52aXNpYmxlKVxuICAgICAgICAgICAgICAgIGFsZXJ0LmNsb3NlQWxlcnQoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcblxuICAgIHJldHVybiBhbGVydDtcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBhbGVydCBwb3B1cFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9iamVjdCB3aXRoIG1lc3NhZ2UsIHR5cGUsIGNsb3NlIGFuZCB0aW1lb3V0XG4gKiBAcmV0dXJuIHtNTEFsZXJ0fSB0aGUgYWxlcnQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCQkb3BlbkFsZXJ0KG9wdGlvbnMpIHtcbiAgICB2YXIgYWxlcnQgPSBNTEFsZXJ0LmNyZWF0ZUFsZXJ0KG9wdGlvbnMpO1xuICAgIGFsZXJ0Lm9wZW5BbGVydCgpO1xuICAgIHJldHVybiBhbGVydDtcbn1cblxuXG5mdW5jdGlvbiBfb25DbG9zZUJ0bkNsaWNrKHR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5jbG9zZUFsZXJ0KCk7XG59XG5cblxuZnVuY3Rpb24gX3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gXy5jbG9uZShvcHRpb25zKTtcbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPSBNYXRoLmZsb29yKG9wdGlvbnMudGltZW91dCk7XG4gICAgb3B0aW9ucy50eXBlID0gb3B0aW9ucy50eXBlIHx8ICdpbmZvJztcblxuICAgIHJldHVybiBvcHRpb25zO1xufVxuXG5cbi8qKlxuICogT3BlbiB0aGUgYWxlcnRcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCRvcGVuQWxlcnQoKSB7XG4gICAgX3RvZ2dsZUFsZXJ0LmNhbGwodGhpcywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBDbG9zZSB0aGUgYWxlcnRcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCRjbG9zZUFsZXJ0KCkge1xuICAgIF90b2dnbGVBbGVydC5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbn1cblxuXG5mdW5jdGlvbiBfdG9nZ2xlQWxlcnQoZG9TaG93KSB7XG4gICAgZG9TaG93ID0gdHlwZW9mIGRvU2hvdyA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gISB0aGlzLl9hbGVydC52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB2YXIgYWRkUmVtb3ZlID0gZG9TaG93ID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgICAgICAsIGFwcGVuZFJlbW92ZSA9IGRvU2hvdyA/ICdhcHBlbmRDaGlsZCcgOiAncmVtb3ZlQ2hpbGQnO1xuXG4gICAgdGhpcy5fYWxlcnQudmlzaWJsZSA9IGRvU2hvdztcblxuICAgIGRvY3VtZW50LmJvZHlbYXBwZW5kUmVtb3ZlXSh0aGlzLmVsKTtcbiAgICB0aGlzLmRvbS50b2dnbGUoZG9TaG93KTtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAhZG9TaG93KTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdFthZGRSZW1vdmVdKCdpbicpO1xuICAgIHRoaXMuZWxbZG9TaG93ID8gJ2ZvY3VzJyA6ICdibHVyJ10oKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIERFRkFVTFRfQlVUVE9OUyA9IFsgeyB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnT0snLCByZXN1bHQ6ICdPSycgfSBdO1xuXG52YXIgQ0xPU0VfT1BUSU9OUyA9IFsnYmFja2Ryb3AnLCAna2V5Ym9hcmQnLCAnYnV0dG9uJ107XG5cbnZhciBCVVRUT05fQ1NTX0NMQVNTRVMgPSB7IC8vIFRPRE8gLSB1c2UgaW4gdGVtcGxhdGVcbiAgICBkZWZhdWx0OiAnYnRuLWRlZmF1bHQnLFxuICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG4gICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcbiAgICBpbmZvOiAnYnRuLWluZm8nLFxuICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXG4gICAgZGFuZ2VyOiAnYnRuLWRhbmdlcicsXG4gICAgbGluazogJ2J0bi1saW5rJ1xufTtcblxuXG4vKipcbiAqIERpYWxvZyBjbGFzcyB0byBzaG93IGN1c3RvbSBkaWFsb2cgYm94ZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiAtIHNlZSBbY3JlYXRlRGlhbG9nXSgjTUxEaWFsb2ckJGNyZWF0ZURpYWxvZykgbWV0aG9kLlxuICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgYSB0aW1lIC0gdHJ5aW5nIHRvIG9wZW4gYW5vdGhlciB3aWxsIGxvZyBlcnJvciB0byBjb25zb2xlLiBDdXJyZW50bHkgb3BlbmVkIGRpYWxvZyBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIFtnZXRDdXJyZW50RGlhbG9nXSgjTUxEaWFsb2ckJGdldEN1cnJlbnREaWFsb2cpIGNsYXNzIG1ldGhvZC5cbiAqL1xudmFyIE1MRGlhbG9nID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERpYWxvZycsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWRpYWxvZycsICdtb2RhbCcsICdmYWRlJ10sXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdyb2xlJzogJ2RpYWxvZycsXG4gICAgICAgICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZSdcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICdcXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxcXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQudGl0bGUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0LmNsb3NlLmJ1dHRvbiB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIj4mdGltZXM7PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57ez0gaXQudGl0bGUgfX08L2g0PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5odG1sIHx8IGl0LnRleHQgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBtbC1iaW5kPVwiW2NvbnRhaW5lcl06ZGlhbG9nQm9keVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0Lmh0bWwgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQuaHRtbCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3s9IGl0LnRleHQgfX08L3A+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5idXR0b25zICYmIGl0LmJ1dHRvbnMubGVuZ3RoIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5idXR0b25zIDpidG4gfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4te3s9IGJ0bi50eXBlIH19e3s/IGJ0bi5jbHMgfX0ge3s9IGJ0bi5jbHMgfX17ez99fVwiXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLWJpbmQ9XCJbZXZlbnRzXTp7ez0gYnRuLm5hbWUgfX1cIj57ez0gYnRuLmxhYmVsIH19PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e359fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERpYWxvZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEaWFsb2c7XG5cblxuXy5leHRlbmQoTUxEaWFsb2csIHtcbiAgICBjcmVhdGVEaWFsb2c6IE1MRGlhbG9nJCRjcmVhdGVEaWFsb2csXG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckJG9wZW5EaWFsb2csXG4gICAgZ2V0T3BlbmVkRGlhbG9nOiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MRGlhbG9nLCB7XG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckb3BlbkRpYWxvZyxcbiAgICBjbG9zZURpYWxvZzogTUxEaWFsb2ckY2xvc2VEaWFsb2csXG4gICAgZGVzdHJveTogTUxEaWFsb2ckZGVzdHJveVxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGRpYWxvZyBpbnN0YW5jZS4gVG8gY3JlYXRlIGFuZCBvcGVuIGF0IHRoZSBzYW1lIHRpbWUgW29wZW5EaWFsb2ddKCNNTERpYWxvZyQkb3BlbkRpYWxvZylcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgIHRpdGxlOiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcbiAqICAgICBodG1sOiBvcHRpb25hbCBkaWFsb2cgdGV4dCBhcyBodG1sICh3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRleHQgaWYgYm90aCB0ZXh0IG5kIGh0bWwgYXJlIHBhc3NlZClcbiAqICAgICAgIG9yXG4gKiAgICAgdGV4dDogb3B0aW9uYWwgZGlhbG9nIHRleHRcbiAqICAgICBjbG9zZTogb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBiYWNrZHJvcCBhbmQgZXNjIGtleSBmcm9tIGNsb3NpbmcgdGhlIGRpYWxvZyBhbmQgcmVtb3ZpbmcgY2xvc2UgYnV0dG9uIGluIHRvcCByaWdodCBjb3JuZXJcbiAqICAgICAgICAgICAgb3IgdHJ1ZSAoZGVmYXVsdCkgdG8gZW5hYmxlIGFsbCBjbG9zZSBvcHRpb25zXG4gKiAgICAgICAgICAgIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAqICAgICAgICAgYmFja2Ryb3A6IGZhbHNlIG9yIHRydWUgKGRlZmF1bHQpLCBjbG9zZSBkaWFsb2cgd2hlbiBiYWNrZHJvcCBjbGlja2VkXG4gKiAgICAgICAgIGtleWJvYXJkOiBmYWxzZSBvciB0cnVlIChkZWZhdWx0KSwgY2xvc2UgZGlhbG9nIHdoZW4gZXNjIGtleSBpcyBwcmVzc2VkXG4gKiAgICAgICAgIGJ1dHRvbjogZmFsc2Ugb3IgdHJ1ZSAoZGVmYXVsdCksIHNob3cgY2xvc2UgYnV0dG9uIGluIHRoZSBoZWFkZXIgKHdvbid0IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGhlYWRlciB3aGVuIHRpdGxlIGlzIG5vdCBwYXNzZWQpXG4gKiAgICAgYnV0dG9uczogb3B0aW9uYWwgYXJyYXkgb2YgYnV0dG9ucyBjb25maWd1cmF0aW9ucywgd2hlcmUgZWFjaCBidXR0b24gY29uZmlnIGlzIGFuIG9iamVjdFxuICogICAgICAgICBuYW1lOiAgIG9wdGlvbmFsIG5hbWUgb2YgY29tcG9uZW50LCBzaG91bGQgYmUgdW5pcXVlIGFuZCBzaG91bGQgbm90IGJlIGBjbG9zZUJ0bmAsIGlmIG5vdCBwYXNzZWQgYSB0aW1lc3RhbXAgYmFzZWQgbmFtZSB3aWxsIGJlIHVzZWRcbiAqICAgICAgICAgdHlwZTogICBidXR0b24gdHlwZSwgd2lsbCBkZXRlcm1pbmUgYnV0dG9uIENTUyBzdHlsZS4gUG9zc2libGUgdHlwZXMgYXJlOiBkZWZ1bHQsIHByaW1hcnksIHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcsIGRhbmdlciwgbGluayAobWFwIHRvIHJlbGF0ZWQgYm9vdHN0cmFwIGJ1dHRvbiBzdHlsZXMpXG4gKiAgICAgICAgIGxhYmVsOiAgYnV0dG9uIGxhYmVsXG4gKiAgICAgICAgIGNsb3NlOiAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB0aGlzIGJ1dHRvbiBmcm9tIGNsb3NpbmcgZGlhbG9nXG4gKiAgICAgICAgIHJlc3VsdDogc3RyaW5nIHdpdGggZGlhbG9nIGNsb3NlIHJlc3VsdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGRpYWxvZyBzdWJzY3JpYmVyIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAqICAgICAgICAgZGF0YTogICBhbnkgdmFsdWUvb2JqZWN0IG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZGlhbG9nIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gKiAgICAgICAgICAgICAgICAgSWYgZnVuY3Rpb24gaXMgcGFzc2VkIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggZGlhbG9nIGFzIGNvbnRleHQgYW5kIGJ1dHRvbiBvcHRpb25zIGFzIHBhcmFtZXRlci5cbiAqXG4gKiAgICAgSWYgYHRpdGxlYCBpcyBub3QgcGFzc2VkLCBkaWFsb2cgd2lsbCBub3QgaGF2ZSB0aXRsZSBzZWN0aW9uICAgXG4gKiAgICAgSWYgbmVpdGhlciBgdGV4dGAgbm9yIGBodG1sYCBpcyBwYXNzZWQsIGRpYWxvZyB3aWxsIG5vdCBoYXZlIGJvZHkgc2VjdGlvbi5cbiAqICAgICBJZiBgYnV0dG9uc2AgYXJlIG5vdCBwYXNzZWQsIHRoZXJlIHdpbGwgb25seSBiZSBPSyBidXR0b24uXG4gKlxuICogV2hlbiBkaWFsb2cgaXMgY2xvc2VkLCB0aGUgc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCByZWF1bHQgYW5kIG9wdGlvbmFsIGRhdGEgYXMgZGVmaW5lZCBpbiBidXR0b25zIGNvbmZpZ3VyYXRpb25zLlxuICogSWYgYmFja2Ryb3AgaXMgY2xpY2tlZCBvciBFU0Mga2V5IGlzIHByZXNzZWQgdGhlIHJlc3VsdCB3aWxsIGJlICdkaXNtaXNzZWQnXG4gKiBJZiBjbG9zZSBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgaXMgY2xpY2tlZCwgdGhlIHJlc3VsdCB3aWxsIGJlICdjbG9zZWQnIChkZWZhdWx0IHJlc3VsdClcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgZGlhbG9nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXRpYWxpemUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZGlhbG9nXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRjcmVhdGVEaWFsb2cob3B0aW9ucywgaW5pdGlhbGl6ZSkge1xuICAgIGNoZWNrKG9wdGlvbnMsIHtcbiAgICAgICAgdGl0bGU6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIGh0bWw6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIHRleHQ6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIGNsb3NlOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihCb29sZWFuLCB7XG4gICAgICAgICAgICBiYWNrZHJvcDogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgICAgICBrZXlib2FyZDogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgICAgICBidXR0b246IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnV0dG9uczogTWF0Y2guT3B0aW9uYWwoWyB7XG4gICAgICAgICAgICBuYW1lOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgbGFiZWw6IFN0cmluZyxcbiAgICAgICAgICAgIGNsb3NlOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIHJlc3VsdDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgICAgIGRhdGE6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLkFueSksXG4gICAgICAgICAgICBjbHM6IE1hdGNoLk9wdGlvbmFsKFN0cmluZylcbiAgICAgICAgfSBdKVxuICAgIH0pO1xuXG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBkaWFsb2cuX2RpYWxvZyA9IHtcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgZGlhbG9nLnRlbXBsYXRlXG4gICAgICAgIC5yZW5kZXIob3B0aW9ucylcbiAgICAgICAgLmJpbmRlcigpO1xuXG4gICAgdmFyIGRpYWxvZ1Njb3BlID0gZGlhbG9nLmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlLmJhY2tkcm9wKVxuICAgICAgICBkaWFsb2cuZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkJhY2tkcm9wQ2xpY2ssIGNvbnRleHQ6IGRpYWxvZyB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpdGxlICYmIG9wdGlvbnMuY2xvc2UuYnV0dG9uKVxuICAgICAgICBkaWFsb2dTY29wZS5jbG9zZUJ0bi5ldmVudHMub24oJ2NsaWNrJyxcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlcjogX29uQ2xvc2VCdG5DbGljaywgY29udGV4dDogZGlhbG9nIH0pO1xuXG4gICAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIHZhciBidXR0b25TdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcjogXy5wYXJ0aWFsKF9kaWFsb2dCdXR0b25DbGljaywgYnRuKSxcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpYWxvZ1xuICAgICAgICB9O1xuICAgICAgICBkaWFsb2dTY29wZVtidG4ubmFtZV0uZXZlbnRzLm9uKCdjbGljaycsIGJ1dHRvblN1YnNjcmliZXIpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemUoZGlhbG9nKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIF9kaWFsb2dCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBpZiAoYnV0dG9uLmNsb3NlICE9PSBmYWxzZSlcbiAgICAgICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIHZhciBkYXRhID0gXy5yZXN1bHQoYnV0dG9uLmRhdGEsIHRoaXMsIGJ1dHRvbik7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgYnV0dG9uLnJlc3VsdCwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gX2Rpc3BhdGNoUmVzdWx0KHJlc3VsdCwgZGF0YSkge1xuICAgIHZhciBzdWJzY3JpYmVyID0gdGhpcy5fZGlhbG9nLnN1YnNjcmliZXI7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHN1YnNjcmliZXIuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xuICAgIGVsc2VcbiAgICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmVyLmNhbGwoc3Vic2NyaWJlci5jb250ZXh0LCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9vbkJhY2tkcm9wQ2xpY2soZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy5lbClcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygnZGlzbWlzc2VkJyk7XG59XG5cblxuZnVuY3Rpb24gX29uQ2xvc2VCdG5DbGljaygpIHtcbiAgICB0aGlzLmNsb3NlRGlhbG9nKCdjbG9zZWQnKTtcbn1cblxuXG5mdW5jdGlvbiBfb25LZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKG9wZW5lZERpYWxvZ1xuICAgICAgICAgICAgJiYgb3BlbmVkRGlhbG9nLl9kaWFsb2cub3B0aW9ucy5jbG9zZS5rZXlib2FyZFxuICAgICAgICAgICAgJiYgZXZlbnQua2V5Q29kZSA9PSAyNykgLy8gZXNjIGtleVxuICAgICAgICBvcGVuZWREaWFsb2cuY2xvc2VEaWFsb2coJ2Rpc21pc3NlZCcpO1xufVxuXG5cbmZ1bmN0aW9uIF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IF8uY2xvbmUob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5idXR0b25zID0gXy5jbG9uZShvcHRpb25zLmJ1dHRvbnMgfHwgREVGQVVMVF9CVVRUT05TKTtcbiAgICBvcHRpb25zLmJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLm5hbWUgPSBidG4ubmFtZSB8fCBjb21wb25lbnROYW1lKCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLm9iamVjdChDTE9TRV9PUFRJT05TLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXy5tYXBUb09iamVjdChDTE9TRV9PUFRJT05TLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihvcHQpIHsgcmV0dXJuIG9wdGlvbnMuY2xvc2Vbb3B0XSAhPT0gZmFsc2U7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfLm9iamVjdChDTE9TRV9PUFRJT05TLCBmYWxzZSk7XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBkaWFsb2cgcG9wdXBcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHdpdGggdGl0bGUsIHRleHQgYW5kIGJ1dHRvbnMuIFNlZSBbY3JlYXRlRGlhbG9nXSgjTUxEaWFsb2ckJGNyZWF0ZURpYWxvZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBvcHRpb25hbCBzdWJzY3JpYmVyIGZ1bmN0aW9uIG9yIG9iamVjdCB0aGF0IGlzIHBhc3NlZCByZXN1bHQgYW5kIG9wdGlvbmFsIGRhdGEuIFVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQsIGRpYWxvZyB3aWxsIGJlIHRoZSBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBNTERpYWxvZyQkb3BlbkRpYWxvZyhvcHRpb25zLCBzdWJzY3JpYmVyLCBpbml0aWFsaXplKSB7XG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZURpYWxvZyhvcHRpb25zLCBpbml0aWFsaXplKTtcbiAgICBkaWFsb2cub3BlbkRpYWxvZyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cblxuZnVuY3Rpb24gX3RvZ2dsZURpYWxvZyhkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2RpYWxvZy52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB2YXIgYWRkUmVtb3ZlID0gZG9TaG93ID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgICAgICAsIGFwcGVuZFJlbW92ZSA9IGRvU2hvdyA/ICdhcHBlbmRDaGlsZCcgOiAncmVtb3ZlQ2hpbGQnO1xuXG4gICAgdGhpcy5fZGlhbG9nLnZpc2libGUgPSBkb1Nob3c7XG5cbiAgICBpZiAoZG9TaG93ICYmICEgZGlhbG9nc0luaXRpYWxpemVkKVxuICAgICAgICBfaW5pdGlhbGl6ZURpYWxvZ3MoKTtcblxuICAgIGRvY3VtZW50LmJvZHlbYXBwZW5kUmVtb3ZlXSh0aGlzLmVsKTtcbiAgICBpZiAoYmFja2Ryb3BFbClcbiAgICAgICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKGJhY2tkcm9wRWwpO1xuICAgIHRoaXMuZG9tLnRvZ2dsZShkb1Nob3cpO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICFkb1Nob3cpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ21vZGFsLW9wZW4nKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdFthZGRSZW1vdmVdKCdpbicpO1xuXG4gICAgb3BlbmVkRGlhbG9nID0gZG9TaG93ID8gdGhpcyA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVsW2RvU2hvdyA/ICdmb2N1cycgOiAnYmx1ciddKCk7XG59XG5cblxudmFyIGRpYWxvZ3NJbml0aWFsaXplZCwgYmFja2Ryb3BFbDtcblxuZnVuY3Rpb24gX2luaXRpYWxpemVEaWFsb2dzKCkge1xuICAgIGJhY2tkcm9wRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWNrZHJvcEVsLmNsYXNzTmFtZSA9ICdtb2RhbC1iYWNrZHJvcCBmYWRlIGluJztcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX29uS2V5RG93bik7XG4gICAgZGlhbG9nc0luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuXG52YXIgb3BlbmVkRGlhbG9nO1xuXG4vKipcbiAqIE9wZW5zIGRpYWxvZyBpbnN0YW5jZS5cbiAqIFN1YnNjcmliZXIgb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgc3Vic2NyaWJlciBmb3IgdGhlIE1lc3NlbmdlciAoYWx0aG91Z2ggTWVzc2VuZ2VyIGlzIG5vdCB1c2VkKSAtIGVpdGhlciBmdW5jdGlvbiBvciBvYmplY3Qgd2l0aCBzdWJzY3JpYmVyIGFuZCBjb250ZXh0IHByb3BlcnRpZXMuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIHN1YnNjcmliZXIgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJG9wZW5EaWFsb2coc3Vic2NyaWJlcikge1xuICAgIGNoZWNrKHN1YnNjcmliZXIsIE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCB7IHN1YnNjcmliZXI6IEZ1bmN0aW9uLCBjb250ZXh0OiBNYXRjaC5BbnkgfSkpO1xuXG4gICAgaWYgKG9wZW5lZERpYWxvZylcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTERpYWxvZyBvcGVuRGlhbG9nOiBjYW5cXCd0IG9wZW4gZGlhbG9nLCBhbm90aGVyIGRpYWxvZyBpcyBhbHJlYWR5IG9wZW4nKTtcblxuICAgIHRoaXMuX2RpYWxvZy5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICBfdG9nZ2xlRGlhbG9nLmNhbGwodGhpcywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBDbG9zZXMgZGlhbG9nIGluc3RhbmNlLCBvcHRpb25hbGx5IHBhc3NpbmcgcmVzdWx0IGFuZCBkYXRhIHRvIGRpYWxvZyBzdWJzY3JpYmVyLlxuICogSWYgbm8gcmVzdWx0IGlzIHBhc3NlZCwgJ2Nsb3NlZCcgd2lsbCBiZSBwYXNzZWQgdG8gc3Vic2NyaWJlci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVzdWx0IGRpYWxvZyByZXN1bHQsIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHN1YmNzcmliZXJcbiAqIEBwYXJhbSB7QW55fSBkYXRhIG9wdGlvbmFsIGRpYWxvZyBkYXRhLCBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gc3Vic2NyaWJlclxuICovXG5mdW5jdGlvbiBNTERpYWxvZyRjbG9zZURpYWxvZyhyZXN1bHQsIGRhdGEpIHtcbiAgICBpZiAoISBvcGVuZWREaWFsb2cpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignTUxEaWFsb2cgY2xvc2VEaWFsb2c6IGNhblxcJ3QgY2xvc2UgZGlhbG9nLCBubyBkaWFsb2cgb3BlbicpO1xuXG4gICAgcmVzdWx0ID0gcmVzdWx0IHx8ICdjbG9zZWQnO1xuXG4gICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICBfZGlzcGF0Y2hSZXN1bHQuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBjdXJyZW50bHkgb3BlbmVkIGRpYWxvZ1xuICpcbiAqIEByZXR1cm4ge01MRGlhbG9nfVxuICovXG5mdW5jdGlvbiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nKCkge1xuICAgIHJldHVybiBvcGVuZWREaWFsb2c7XG59XG5cblxuZnVuY3Rpb24gTUxEaWFsb2ckZGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX29uS2V5RG93bik7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi8uLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uLy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgRE9NTGlzdGVuZXJzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9kb21fbGlzdGVuZXJzJyk7XG5cblxudmFyIFRPR0dMRV9DU1NfQ0xBU1MgPSAnZHJvcGRvd24tdG9nZ2xlJ1xuICAgICwgTUVOVV9DU1NfQ0xBU1MgPSAnZHJvcGRvd24tbWVudSc7XG5cblxudmFyIE1MRHJvcGRvd24gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRHJvcGRvd24nLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogWydtbC1icy1kcm9wZG93bicsICdkcm9wZG93biddXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxEcm9wZG93bik7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEcm9wZG93bjtcblxuXG5fLmV4dGVuZFByb3RvKE1MRHJvcGRvd24sIHtcbiAgICBzdGFydDogTUxEcm9wZG93biRzdGFydCxcbiAgICBkZXN0cm95OiBNTERyb3Bkb3duJGRlc3Ryb3ksXG4gICAgdG9nZ2xlTWVudTogTUxEcm9wZG93biR0b2dnbGVNZW51LFxuICAgIHNob3dNZW51OiBNTERyb3Bkb3duJHNob3dNZW51LFxuICAgIGhpZGVNZW51OiBNTERyb3Bkb3duJGhpZGVNZW51XG59KTtcblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJHN0YXJ0KCkge1xuICAgIHZhciB0b2dnbGVFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLicgKyBUT0dHTEVfQ1NTX0NMQVNTKVxuICAgICAgICAsIG1lbnVFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLicgKyBNRU5VX0NTU19DTEFTUyk7XG5cbiAgICBpZiAoISAodG9nZ2xlRWwgJiYgbWVudUVsKSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcignTUxEcm9wZG93bjonLCBUT0dHTEVfQ1NTX0NMQVNTLCAnb3InLCBNRU5VX0NTU19DTEFTUywgJ2lzblxcJ3QgZm91bmQnKTtcblxuICAgIHZhciBkb2MgPSB3aW5kb3cuZG9jdW1lbnRcbiAgICAgICAgLCBjbGlja0hhbmRsZXIgPSB0aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzLCB1bmRlZmluZWQpO1xuXG4gICAgdmFyIGxpc3RlbmVycyA9IG5ldyBET01MaXN0ZW5lcnM7XG4gICAgdGhpcy5fZHJvcGRvd24gPSB7XG4gICAgICAgIG1lbnU6IG1lbnVFbCxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfTtcbiAgICB0aGlzLmhpZGVNZW51KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgbGlzdGVuZXJzLmFkZCh0b2dnbGVFbCwgJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcbiAgICAvL21heWJlIG9ubHkgYWRkIHRoaXMgZXZlbnRzIGlmIGlzIG9wZW4/XG4gICAgbGlzdGVuZXJzLmFkZChkb2MsICdtb3VzZW91dCcsIG9uRG9jT3V0KTtcbiAgICBsaXN0ZW5lcnMuYWRkKGRvYywgJ2NsaWNrJywgb25DbGljayk7XG5cblxuICAgIGZ1bmN0aW9uIG9uRG9jT3V0KGV2ZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXRcbiAgICAgICAgICAgICwgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXRcbiAgICAgICAgICAgICwgbGlzdGVuZXJzID0gc2VsZi5fZHJvcGRvd24ubGlzdGVuZXJzO1xuXG4gICAgICAgIGlmIChpc0lmcmFtZSh0YXJnZXQpKVxuICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSh0YXJnZXQuY29udGVudFdpbmRvdy5kb2N1bWVudCwgJ2NsaWNrJywgb25DbGljayk7XG5cbiAgICAgICAgaWYgKGlzSWZyYW1lKHJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChyZWxhdGVkVGFyZ2V0LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsICdjbGljaycsIG9uQ2xpY2spO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmVsLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICBzZWxmLmhpZGVNZW51KCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGlzSWZyYW1lKGVsKSB7XG4gICAgcmV0dXJuIGVsICYmIGVsLnRhZ05hbWUgPT0gJ0lGUkFNRSc7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Ryb3Bkb3duLmxpc3RlbmVycy5yZW1vdmVBbGwoKTtcbiAgICBkZWxldGUgdGhpcy5fZHJvcGRvd247XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRzaG93TWVudSgpIHtcbiAgICB0aGlzLnRvZ2dsZU1lbnUodHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRoaWRlTWVudSgpIHtcbiAgICB0aGlzLnRvZ2dsZU1lbnUoZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kdG9nZ2xlTWVudShkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2Ryb3Bkb3duLnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHRoaXMuX2Ryb3Bkb3duLnZpc2libGUgPSBkb1Nob3c7XG5cbiAgICB2YXIgbWVudSA9IHRoaXMuX2Ryb3Bkb3duLm1lbnU7XG4gICAgbWVudS5zdHlsZS5kaXNwbGF5ID0gZG9TaG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmxvY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnbm9uZSc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuLy8gPGEgbmFtZT1cImNvbmZpZ1wiPjwvYT5cbi8vIG1pbG8uY29uZmlnXG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBJdCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gY2hhbmdlIG1pbG8gY29uZmlndXJhdGlvbnMgYW5kIGFsc29cbi8vIGFjY2VzcyB0aGVtIG9uIGNvbmZpZydzIHByb3BlcnRpZXMuXG5cbi8vIGBgYGphdmFzY3JpcHRcbi8vIG1pbG8uY29uZmlnKHtcbi8vICAgICBhdHRyczoge1xuLy8gICAgICAgICBiaW5kOiAnbWwtYmluZCcsXG4vLyAgICAgICAgIGxvYWQ6ICdtbC1sb2FkJ1xuLy8gICAgIH1cbi8vIH0pO1xuLy8gYGBgXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1Q7XG5cblxudmFyIGNvbmZpZyA9IG1vZHVsZS5leHBvcnRzID0gbWlsb0NvcmUuY29uZmlnO1xuXG5cbmNvbmZpZyh7XG4gICAgYXR0cnM6IHtcbiAgICAgICAgYmluZDogJ21sLWJpbmQnLFxuICAgICAgICBsb2FkOiAnbWwtbG9hZCdcbiAgICB9LFxuICAgIGNvbXBvbmVudFJlZjogJ19fX21pbG9fY29tcG9uZW50JyxcbiAgICBjb21wb25lbnRQcmVmaXg6ICdtaWxvXycsXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgY29tcGlsZTogZG9ULmNvbXBpbGVcbiAgICB9LFxuICAgIGRvbVN0b3JhZ2U6IHtcbiAgICAgICAgdHlwZVN1ZmZpeDogJzpfX19taWxvX2RhdGFfdHlwZScsXG4gICAgICAgIHByZWZpeFNlcGFyYXRvcjogJy8nLFxuICAgICAgICByb290OiAnJyxcbiAgICAgICAgbWVzc2FnZUtleTogJ19fX21pbG9fbWVzc2FnZS8nLFxuICAgICAgICBtZXNzYWdlVGltZXN0YW1wOiAnX19fbWlsb190aW1lc3RhbXAnLFxuICAgICAgICBxdW90YUV4Y2VlZGVkOiB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZmFsc2VcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ0Ryb3A6IHtcbiAgICAgICAgZGF0YVR5cGVzOiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6ICd4LWFwcGxpY2F0aW9uL21pbG8vY29tcG9uZW50JyxcbiAgICAgICAgICAgIGNvbXBvbmVudE1ldGFUZW1wbGF0ZTogJ3gtYXBwbGljYXRpb24vbWlsby9jb21wb25lbnQtbWV0YS8lY2xhc3MvJW5hbWUvJXBhcmFtcycsXG4gICAgICAgICAgICBjb21wb25lbnRNZXRhUmVnZXg6IC9eeFxcLWFwcGxpY2F0aW9uXFwvbWlsb1xcL2NvbXBvbmVudFxcLW1ldGFcXC8oW2EtejAtOV0rKVxcLyhbYS16MC05XSspXFwvKFthLXowLTldKikkLyxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdDoge1xuICAgICAgICBqc29ucFRpbWVvdXQ6IDYwMDAwLFxuICAgICAgICBqc29ucENhbGxiYWNrUHJlZml4OiAnX19fbWlsb19jYWxsYmFja18nLFxuICAgICAgICBvcHRpb25zS2V5OiAnX19fbWlsb19vcHRpb25zJyxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IDYwMDAwXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdlYnNvY2tldDoge1xuICAgICAgICBycGM6IHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IDE1MDAwLFxuICAgICAgICAgICAgcmVzcG9uc2VQcmVmaXg6ICdyZXNwb25zZV8nXG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb01haWwgPSByZXF1aXJlKCcuL3NlcnZpY2VzL21haWwnKVxuICAgICwgcmVxdWVzdCA9IHJlcXVpcmUoJy4vdXRpbC9yZXF1ZXN0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIHV0aWxEb20gPSByZXF1aXJlKCcuL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJylcbiAgICAsIExvYWRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuL2F0dHJpYnV0ZXMvYV9sb2FkJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBsb2FkZXI7XG5cbi8qKlxuICogYG1pbG8ubG9hZGVyYFxuICogXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHJvb3RFbGAgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkgbG9va2luZyBmb3IgX19tbC1sb2FkX18gQGF0dHJpYnV0ZS5cbiAqIE9uZSBsZXZlbCBsb2FkIGlzIGV4ZWN1dGVkLiBObyBhZGRpdGlvbmFsIGxvYWRlciBnZXQgY2FsbGVkIG9uIGluc2lkZSBfX21sLWxvYWRfXyBhdHRyaWJ1dGVzLiBcbiAqXG4gKiBQb3NzaWJsZSB1c2FnZXM6XG4gKiAtIG1pbG8ubG9hZGVyKFtteVJvb3RFbCxdW215UmVtb3ZlQXR0cmlidXRlLF1teUNhbGxiYWNrKVxuICogXG4gKiBAcGFyYW0gIHtFbGVtZW50fSAgcm9vdEVsICAgICAgICAgIFJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCAoZG9jdW1lbnQuYm9keSBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSAge0Jvb2xlYW59ICByZW1vdmVBdHRyaWJ1dGUgSWYgc2V0IHRvIHRydWUsIHRoZW4gdGhlIF9fbWwtbG9hZF9fIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgb25jZSBsb2FkZXIgaGFzIGJlZW4gZXhlY3V0ZWQgKEZhbHNlIGJ5IGRlZmF1bHQpLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrICAgICAgICBDYWxsYmFjayB0byBjYWxsIGFmdGVyIGFsbCBlbGVtZW50cyBnZXQgbG9hZGVkIChSZXF1aXJlZCkuXG4gKi9cbmZ1bmN0aW9uIGxvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBtaWxvKGZ1bmN0aW9uKCkge1xuICAgICAgICBfbG9hZGVyKHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjayk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX2xvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHJvb3RFbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gcm9vdEVsO1xuICAgICAgICByb290RWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVtb3ZlQXR0cmlidXRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSByZW1vdmVBdHRyaWJ1dGU7XG4gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJvb3RFbCA9IHJvb3RFbCB8fCBkb2N1bWVudC5ib2R5O1xuXG4gICAgbWlsb01haWwucG9zdE1lc3NhZ2UoJ2xvYWRlcicsIHsgc3RhdGU6ICdzdGFydGVkJyB9KTtcbiAgICBfbG9hZFZpZXdzSW5FbGVtZW50KHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBmdW5jdGlvbih2aWV3cykge1xuICAgICAgICBtaWxvTWFpbC5wb3N0TWVzc2FnZSgnbG9hZGVyJywgeyBcbiAgICAgICAgICAgIHN0YXRlOiAnZmluaXNoZWQnLFxuICAgICAgICAgICAgdmlld3M6IHZpZXdzXG4gICAgICAgIH0pO1xuICAgICAgICBjYWxsYmFjayh2aWV3cyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX2xvYWRWaWV3c0luRWxlbWVudChyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgbG9hZEVsZW1lbnRzID0gcm9vdEVsLmdldEF0dHJpYnV0ZShjb25maWcuYXR0cnMubG9hZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW3Jvb3RFbF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogcm9vdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgY29uZmlnLmF0dHJzLmxvYWQgKyAnXScpO1xuXG4gICAgdmFyIHZpZXdzID0ge31cbiAgICAgICAgLCB0b3RhbENvdW50ID0gbG9hZEVsZW1lbnRzLmxlbmd0aFxuICAgICAgICAsIGxvYWRlZENvdW50ID0gMDtcblxuICAgIF8uZm9yRWFjaChsb2FkRWxlbWVudHMsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBsb2FkVmlldyhlbCwgcmVtb3ZlQXR0cmlidXRlLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIHZpZXdzW2VsLmlkXSA9IGVyciB8fCBlbDtcbiAgICAgICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgICAgICBpZiAobG9hZGVkQ291bnQgPT0gdG90YWxDb3VudClcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh2aWV3cyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuXG5mdW5jdGlvbiBsb2FkVmlldyhlbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjaykge1xuICAgIGlmICh1dGlsRG9tLmNoaWxkcmVuKGVsKS5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCBsb2FkIGh0bWwgaW50byBlbGVtZW50IHRoYXQgaXMgbm90IGVtcHR5Jyk7XG5cbiAgICB2YXIgYXR0ciA9IG5ldyBMb2FkQXR0cmlidXRlKGVsKTtcblxuICAgIGF0dHIucGFyc2UoKS52YWxpZGF0ZSgpO1xuXG4gICAgcmVxdWVzdC5nZXQoYXR0ci5sb2FkVXJsLCBmdW5jdGlvbihlcnIsIGh0bWwpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZSB8fCAnY2FuXFwndCBsb2FkIGZpbGUgJyArIGF0dHIubG9hZFVybDtcbiAgICAgICAgICAgIC8vIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgaWYgKHJlbW92ZUF0dHJpYnV0ZSkgTG9hZEF0dHJpYnV0ZS5yZW1vdmUoZWwpO1xuICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyByZWdpc3RlciBpbmNsdWRlZCBmYWNldHNcbnJlcXVpcmUoJy4vdXNlX2ZhY2V0cycpO1xuXG4vLyByZWdpc3RlciBpbmNsdWRlZCBjb21wb25lbnRzXG5yZXF1aXJlKCcuL3VzZV9jb21wb25lbnRzJyk7XG5cblxuLyoqXG4gKiBgbWlsb2BcbiAqXG4gKiBBIG1pbmltYWxpc3QgYnJvd3NlciBmcmFtZXdvcmsgdGhhdCBiaW5kcyBET00gZWxlbWVudHMgdG8gSlMgY29tcG9uZW50cyBhbmQgY29tcG9uZW50cyB0byBtb2RlbHMuXG4gKlxuICogYG1pbG9gIGlzIGF2YWlsYWJsZSBhcyBnbG9iYWwgb2JqZWN0IGluIHRoZSBicm93c2VyLlxuICogQXQgdGhlIG1vbWVudCBpdCBpcyBub3QgcG9zc2lpYmxlIHRvIHJlcXVpcmUgaXQgd2l0aCBicm93c2VyaWZ5IHRvIGhhdmUgaXQgYnVuZGxlZCB3aXRoIHRoZSBhcHAgYmVjYXVzZSBvZiB0aGUgd2F5IFticmZzXShodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2svYnJmcykgYnJvd3NlcmlmeSBwbHVnaW4gaXMgaW1wbGVtZW50ZWQuXG4gKiBJdCBpcyBwb3NzaWJsZSB0aG91Z2ggdG8gcmVxdWlyZSBgbWlsb2Agd2l0aCBub2RlIHRvIHVzZSB1bml2ZXJzYWwgcGFydHMgb2YgdGhlIGZyYW1ld29yayAoYWJzdHJhY3QgY2xhc3NlcywgTWVzc2VuZ2VyLCBNb2RlbCwgZXRjLik6XG4gKiBgYGBcbiAqIHZhciBtaWxvID0gcmVxdWlyZSgnbW9sLW1pbG8nKTtcbiAqIGBgYFxuICogXG4gKiBgbWlsb2AgaXRzZWxmIGlzIGEgZnVuY3Rpb24gdGhhdCBpbiB0aGUgYnJvd3NlciBjYW4gYmUgdXNlZCB0byBkZWxheSBleGVjdXRpb24gdW50aWwgRE9NIGlzIHJlYWR5LlxuICovXG5mdW5jdGlvbiBtaWxvKGZ1bmMpIHtcbiAgICBtaWxvLnV0aWwuZG9tUmVhZHkoZnVuYyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFtsb2FkZXJdKC4vbG9hZGVyLmpzLmh0bWwpIC0gbG9hZGluZyBzdWJ2aWV3cyBpbnRvIHBhZ2VcbiAqIC0gW2JpbmRlcl0oLi9iaW5kZXIuanMuaHRtbCkgLSBjb21wb25lbnRzIGluc3RhbnRpYXRpb24gYW5kIGJpbmRpbmcgb2YgRE9NIGVsZW1lbnRzIHRvIHRoZW1cbiAqIC0gW21pbmRlcl0oLi9taW5kZXIuanMuaHRtbCkgLSBkYXRhIHJlYWN0aXZpdHksIG9uZSBvciB0d28gd2F5LCBzaGFsbG93IG9yIGRlZXAsIGFzIHlvdSBsaWtlIGl0XG4gKiAtIFttYWlsXSguL21haWwvaW5kZXguanMuaHRtbCkgLSBhcHBsaWNhaXRvbiBsZXZlbCBtZXNzZW5nZXIsIGFsc28gY29ubmVjdHMgdG8gbWVzc2FnZXMgZnJvbSBvdGhlciB3aW5kb3dzIGRpc3BhdGNoZWQgd2l0aCBgd2luZG93LnBvc3RNZXNzYWdlYC5cbiAqIC0gW2NvbmZpZ10oLi9jb25maWcuanMuaHRtbCkgLSBtaWxvIGNvbmZpZ3VyYXRpb25cbiAqIC0gW3V0aWxdKC4vdXRpbC9pbmRleC5qcy5odG1sKSAtIGxvZ2dlciwgcmVxdWVzdCwgZG9tLCBjaGVjaywgZXJyb3IsIGV0Yy5cbiAqIC0gW2NsYXNzZXNdKC4vY2xhc3Nlcy5qcy5odG1sKSAtIGFic3RyYWN0IGFuZCBiYXNlIGNsYXNzZXNcbiAqIC0gW2F0dHJpYnV0ZXNdKC4vYXR0cmlidXRlcy9pbmRleC5qcy5odG1sKSAtIGNsYXNzZXMgdGhhdCB3cmFwIERPTSBlbGVtZW50cyBhdHRyaWJ1dGVzIHJlY29nbml6ZWQgYnkgbWlsb1xuICogLSBbQ29tcG9uZW50RmFjZXRdKC4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIC0gYmFzZSBjbGFzcyBvZiBDb21wb25lbnQgZmFjZXRcbiAqIC0gW0NvbXBvbmVudF0oLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgLSBiYXNlIENvbXBvbmVudCBjbGFzc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKiAtIFtyZWdpc3RyeV0oLi9yZWdpc3RyeS5qcy5odG1sKSAtIHJlZ2lzdHJpZXMgb2YgZmFzZXRzIGFuZCBjb21wb25lbnRzIGNsYXNzZXNcbiAqL1xuXy5leHRlbmQobWlsbywge1xuICAgIE1lc3NlbmdlcjogbWlsb0NvcmUuTWVzc2VuZ2VyLFxuICAgIE1vZGVsOiBtaWxvQ29yZS5Nb2RlbCxcbiAgICBtaW5kZXI6IG1pbG9Db3JlLm1pbmRlcixcbiAgICBsb2FkZXI6IHJlcXVpcmUoJy4vbG9hZGVyJyksXG4gICAgYmluZGVyOiByZXF1aXJlKCcuL2JpbmRlcicpLFxuICAgIG1haWw6IHJlcXVpcmUoJy4vc2VydmljZXMvbWFpbCcpLFxuICAgIHdpbmRvdzogcmVxdWlyZSgnLi9zZXJ2aWNlcy93aW5kb3cnKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgYXR0cmlidXRlczogcmVxdWlyZSgnLi9hdHRyaWJ1dGVzJyksXG4gICAgQ29tcG9uZW50RmFjZXQ6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0JyksXG4gICAgQ29tcG9uZW50OiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19jbGFzcycpLFxuICAgIENvbW1hbmQ6IHJlcXVpcmUoJy4vY29tbWFuZCcpLFxuICAgIHJlZ2lzdHJ5OiByZXF1aXJlKCcuL3JlZ2lzdHJ5JyksXG4gICAgbWlsb192ZXJzaW9uOiAnMC4xLjEwJyxcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogcmVxdWlyZSgnLi91dGlsL2NyZWF0ZV9jb21wb25lbnRfY2xhc3MnKSxcbiAgICBkZXN0cm95OiBkZXN0cm95XG59KTtcblxuXG4vLyBleHBvcnQgZm9yIG5vZGUvYnJvd3NlcmlmeVxuaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpICAgIFxuICAgIG1vZHVsZS5leHBvcnRzID0gbWlsbztcblxuLy8gZ2xvYmFsIG1pbG8gZm9yIGJyb3dzZXJcbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKSB7XG4gICAgd2luZG93Lm1pbG8gPSBtaWxvO1xuICAgIG1pbG8ubWFpbC50cmlnZ2VyKCdtaWxvcmVhZHknKTtcbn1cblxuXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIG1pbG9Db3JlLmRlc3Ryb3koKTtcbiAgICBtaWxvLm1haWwuZGVzdHJveSgpO1xuICAgIG1pbG8ud2luZG93LmRlc3Ryb3koKTtcbiAgICBtaWxvLnV0aWwuZGVzdHJveSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlZ2lzdHJpZXMgb2YgZmFjZXRzIGFuZCBvZiBjb21wb25lbnRzXG4gKlxuICogLSBbZmFjZXRzXSguL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMuaHRtbClcbiAqIC0gW2NvbXBvbmVudHNdKC4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5LmpzLmh0bWwpXG4gKi9cbnZhciByZWdpc3RyeSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZhY2V0czogcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JyksXG4gICAgY29tcG9uZW50czogcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfcmVnaXN0cnknKSxcbiAgICBjb21tYW5kczogcmVxdWlyZSgnLi9jb21tYW5kL2NtZF9yZWdpc3RyeScpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY29tcG9uZW50cy1kb20tY29uc3RydWN0b3JzXCI+PC9hPlxuLy8gIyMjZG9tIGV2ZW50cyBjb25zdHJ1Y3RvcnNcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1JlZmVyZW5jZS9FdmVudHNcblxudmFyIGV2ZW50VHlwZXMgPSB7XG4gICAgQ2xpcGJvYXJkRXZlbnQ6IFsnY29weScsICdjdXQnLCAncGFzdGUnLCAnYmVmb3JlY29weScsICdiZWZvcmVjdXQnLCAnYmVmb3JlcGFzdGUnXSxcbiAgICBFdmVudDogWydpbnB1dCcsICdyZWFkeXN0YXRlY2hhbmdlJ10sXG4gICAgRm9jdXNFdmVudDogWydmb2N1cycsICdibHVyJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnXSxcbiAgICBLZXlib2FyZEV2ZW50OiBbJ2tleWRvd24nLCAna2V5cHJlc3MnLCAgJ2tleXVwJ10sXG4gICAgTW91c2VFdmVudDogWydjbGljaycsICdjb250ZXh0bWVudScsICdkYmxjbGljaycsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsXG4gICAgICAgICAgICAgICAgICdtb3VzZWVudGVyJywgJ21vdXNlbGVhdmUnLCAnbW91c2Vtb3ZlJywgJ21vdXNlb3V0JywgJ21vdXNlb3ZlcicsXG4gICAgICAgICAgICAgICAgICdzaG93JyAvKiBjb250ZXh0IG1lbnUgKi9dLFxuICAgIFRvdWNoRXZlbnQ6IFsndG91Y2hzdGFydCcsICd0b3VjaGVuZCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbnRlcicsICd0b3VjaGxlYXZlJywgJ3RvdWNoY2FuY2VsJ10sXG59O1xuXG5cbi8vIG1vY2sgd2luZG93IGFuZCBldmVudCBjb25zdHJ1Y3RvcnMgZm9yIHRlc3RpbmdcbmlmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKVxuICAgIHZhciBnbG9iYWwgPSB3aW5kb3c7XG5lbHNlIHtcbiAgICBnbG9iYWwgPSB7fTtcbiAgICBfLmVhY2hLZXkoZXZlbnRUeXBlcywgZnVuY3Rpb24oZVR5cGVzLCBldmVudENvbnN0cnVjdG9yTmFtZSkge1xuICAgICAgICB2YXIgZXZlbnRDb25zdHJ1Y3RvciA9IF8ubWFrZUZ1bmN0aW9uKGV2ZW50Q29uc3RydWN0b3JOYW1lLCAndHlwZScsICdwcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICd0aGlzLnR5cGUgPSB0eXBlOyBfLmV4dGVuZCh0aGlzLCBwcm9wZXJ0aWVzKTsnKTtcbiAgICAgICAgZ2xvYmFsW2V2ZW50Q29uc3RydWN0b3JOYW1lXSA9IGV2ZW50Q29uc3RydWN0b3I7XG4gICAgfSk7XG59XG5cblxudmFyIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHt9O1xuXG5fLmVhY2hLZXkoZXZlbnRUeXBlcywgZnVuY3Rpb24oZVR5cGVzLCBldmVudENvbnN0cnVjdG9yTmFtZSkge1xuICAgIGVUeXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eShkb21FdmVudHNDb25zdHJ1Y3RvcnMsIHR5cGUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXBsaWNhdGUgZXZlbnQgdHlwZSAnICsgdHlwZSk7XG5cbiAgICAgICAgZG9tRXZlbnRzQ29uc3RydWN0b3JzW3R5cGVdID0gZ2xvYmFsW2V2ZW50Q29uc3RydWN0b3JOYW1lXTtcbiAgICB9KTtcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZG9tRXZlbnRzQ29uc3RydWN0b3JzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzYWdlU291cmNlID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzYWdlU291cmNlXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2NfY2xhc3MnKVxuICAgICwgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0gcmVxdWlyZSgnLi9kZV9jb25zdHJzJykgLy8gVE9ETyBtZXJnZSB3aXRoIERPTUV2ZW50U291cmNlID8/XG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxudmFyIERPTUVtaXR0ZXJTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdET01FbWl0dGVyU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhET01FbWl0dGVyU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBkZXN0cm95OiBET01FbWl0dGVyU291cmNlJGRlc3Ryb3ksXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogXy5wYXJ0aWFsKHNvdXJjZVN1YnNjcmliZXJNZXRob2QsICdhZGRFdmVudExpc3RlbmVyJyksXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogXy5wYXJ0aWFsKHNvdXJjZVN1YnNjcmliZXJNZXRob2QsICdyZW1vdmVFdmVudExpc3RlbmVyJyksXG4gICAgcG9zdE1lc3NhZ2U6IERPTUVtaXR0ZXJTb3VyY2UkcG9zdE1lc3NhZ2UsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBlbWl0dGVyOiBlbWl0dGVyLFxuICAgIGhhbmRsZUV2ZW50OiBoYW5kbGVFdmVudCwgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUVtaXR0ZXJTb3VyY2U7XG5cblxudmFyIHVzZUNhcHR1cmVQYXR0ZXJuID0gL19fY2FwdHVyZSQvXG4gICAgLCB1c2VDYXB0dXJlUG9zdGZpeCA9ICdfX2NhcHR1cmUnO1xuXG5cbi8vIGluaXQgRE9NIGV2ZW50IHNvdXJjZVxuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSU9yQ2xhc3MsIGV2ZW50RW1pdHRlcikge1xuICAgIHRoaXMuZXZlbnRFbWl0dGVyID0gZXZlbnRFbWl0dGVyO1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBET01FbWl0dGVyU291cmNlJGRlc3Ryb3koKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGRlbGV0ZSB0aGlzLmV2ZW50RW1pdHRlcjtcbn1cblxuXG4vLyBnZXQgRE9NIGVsZW1lbnQgb2YgY29tcG9uZW50XG5mdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmV2ZW50RW1pdHRlcjtcbn1cblxuXG5mdW5jdGlvbiBzb3VyY2VTdWJzY3JpYmVyTWV0aG9kKG1ldGhvZCwgZXZlbnRUeXBlKSB7XG4gICAgaWYgKCEgKGV2ZW50VHlwZSAmJiB0eXBlb2YgZXZlbnRUeXBlID09ICdzdHJpbmcnKSkgcmV0dXJuO1xuICAgIHZhciBjYXB0dXJlID0gdXNlQ2FwdHVyZVBhdHRlcm4udGVzdChldmVudFR5cGUpO1xuICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZS5yZXBsYWNlKHVzZUNhcHR1cmVQYXR0ZXJuLCAnJyk7XG4gICAgdGhpcy5lbWl0dGVyKClbbWV0aG9kXShldmVudFR5cGUsIHRoaXMsIGNhcHR1cmUpO1xufVxuXG5cbi8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgdmFyIGlzQ2FwdHVyZVBoYXNlO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKVxuICAgICAgICBpc0NhcHR1cmVQaGFzZSA9IGV2ZW50LmV2ZW50UGhhc2UgPT0gd2luZG93LkV2ZW50LkNBUFRVUklOR19QSEFTRTtcblxuICAgIGlmIChpc0NhcHR1cmVQaGFzZSlcbiAgICAgICAgZXZlbnQgKz0gdXNlQ2FwdHVyZVBvc3RmaXg7XG5cbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC50eXBlLCBldmVudCk7XG59XG5cblxuZnVuY3Rpb24gRE9NRW1pdHRlclNvdXJjZSRwb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKSB7XG4gICAgdGhpcy5tZXNzZW5nZXIucG9zdE1lc3NhZ2VTeW5jKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIHRyaWdnZXIoZXZlbnRUeXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgY2hlY2soZXZlbnRUeXBlLCBTdHJpbmcpO1xuICAgIGNoZWNrKHByb3BlcnRpZXMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuXG4gICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlLnJlcGxhY2UodXNlQ2FwdHVyZVBhdHRlcm4sICcnKTtcbiAgICB2YXIgRXZlbnRDb25zdHJ1Y3RvciA9IGRvbUV2ZW50c0NvbnN0cnVjdG9yc1tldmVudFR5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBFdmVudENvbnN0cnVjdG9yICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgZXZlbnQgdHlwZScpO1xuXG4gICAgLy8gY2hlY2sgaWYgaXQgaXMgY29ycmVjdFxuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgcHJvcGVydGllcy50eXBlID0gZXZlbnRUeXBlO1xuXG4gICAgdmFyIGRvbUV2ZW50ID0gbmV3IEV2ZW50Q29uc3RydWN0b3IoZXZlbnRUeXBlLCBwcm9wZXJ0aWVzKTtcbiAgICB2YXIgbm90Q2FuY2VsbGVkID0gdGhpcy5lbWl0dGVyKCkuZGlzcGF0Y2hFdmVudChkb21FdmVudCk7XG4gICAgcmV0dXJuIG5vdENhbmNlbGxlZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby5tYWlsYFxuICogSXQgaXMgYW4gYXBwbGljYXRpb24gbGV2ZWwgbWVzc2VuZ2VyIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyIGNsYXNzLlxuICpcbiAqIEF0IHRoZSBtb21lbnQsIGluIGFkZGl0aW9uIHRvIGFwcGxpY2F0aW9uIG1lc3NhZ2VzIHRoYXQgeW91IGRlZmluZSwgeW91IGNhbiBzdWJzY3JpYmUgdG8gX19kb21yZWFkeV9fIG1lc3NhZ2UgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGZpcmUgb25jZSxcbiAqIGV2ZW4gaWYgRE9NIHdhcyByZWFkeSBhdCB0aGUgdGltZSBvZiB0aGUgc3Vic2NyaXB0aW9uLlxuICpcbiAqIE1lc3NhZ2luZyBiZXR3ZWVuIGZyYW1lcyBpcyBhdmFpbGFibGUgdmlhIG1pbG8ubWFpbC4gU2VlIFtGcmFtZSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9GcmFtZS5qcy5odG1sKS5cbiAqXG4gKiBTZWUgW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpLlxuICogXG4qKi9cblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBNYWlsTXNnQVBJID0gcmVxdWlyZSgnLi9tYWlsX2FwaScpXG4gICAgLCBNYWlsTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4vbWFpbF9zb3VyY2UnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciBtaWxvTWFpbCA9IG5ldyBNZXNzZW5nZXI7XG5cbnZhciBtYWlsTXNnU291cmNlID0gbmV3IE1haWxNZXNzYWdlU291cmNlKG1pbG9NYWlsLCB7IHRyaWdnZXI6ICd0cmlnZ2VyJyB9LCBuZXcgTWFpbE1zZ0FQSSk7XG5cbm1pbG9NYWlsLl9zZXRNZXNzYWdlU291cmNlKG1haWxNc2dTb3VyY2UpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWlsb01haWw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXJBUEkgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NlbmdlckFQSVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxudmFyIE1haWxNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ01haWxNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKE1haWxNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYWlsTXNnQVBJO1xuXG5cbi8vIFRPRE86IHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiByZWxldmFudCBET00gZXZlbnQgZGVwZW5kZW50IG9uIGVsZW1lbnQgdGFnXG4vLyBDYW4gYWxzbyBpbXBsZW1lbnQgYmVmb3JlZGF0YWNoYW5nZWQgZXZlbnQgdG8gYWxsb3cgcHJldmVudGluZyB0aGUgY2hhbmdlXG4vLyB0cmFuc2xhdGVUb0RvbUV2ZW50XG52YXIgd2luZG93TWVzc2FnZVJlZ0V4cCA9IC9ebWVzc2FnZVxcOi9cbiAgICAsIHdpbmRvd01lc3NhZ2VQcmVmaXggPSAnbWVzc2FnZTonO1xuXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGlmIChtZXNzYWdlID09ICdkb21yZWFkeScpXG4gICAgICAgIHJldHVybiAncmVhZHlzdGF0ZWNoYW5nZSc7XG4gICAgZWxzZSBpZiAod2luZG93TWVzc2FnZVJlZ0V4cC50ZXN0KG1lc3NhZ2UpKVxuICAgICAgICByZXR1cm4gJ21lc3NhZ2UnO1xufVxuXG5cbi8vIGZpbHRlckRhdGFNZXNzYWdlXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1zZ1R5cGUsIG1zZ0RhdGEpIHtcbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAncmVhZHlzdGF0ZWNoYW5nZScpIHtcbiAgICAgICAgLy9yZXR1cm4gZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnO1xuICAgICAgICAvLyAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZG9tUmVhZHlGaXJlZCcsIHRydWUsIF8uV1JJVCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScpXG4gICAgICAgIHJldHVybiB3aW5kb3dNZXNzYWdlUHJlZml4ICsgbXNnRGF0YS5kYXRhLnR5cGUgPT0gbXNnVHlwZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzYWdlU291cmNlID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzYWdlU291cmNlXG4gICAgLCBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSByZXF1aXJlKCcuLi9kZV9jb25zdHJzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBNYWlsTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ01haWxNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhNYWlsTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuXG4gICAgLy8gY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIF93aW5kb3dTdWJzY3JpYmVyTWV0aG9kOiBfd2luZG93U3Vic2NyaWJlck1ldGhvZCxcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQsICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1haWxNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIGlmIChpc1JlYWR5U3RhdGVDaGFuZ2Uoc291cmNlTWVzc2FnZSkpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnKVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIHRoaXMsIGZhbHNlKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgRXZlbnRDb25zdHJ1Y3RvciA9IGRvbUV2ZW50c0NvbnN0cnVjdG9ycy5yZWFkeXN0YXRlY2hhbmdlO1xuICAgICAgICAgICAgdmFyIGRvbUV2ZW50ID0gbmV3IEV2ZW50Q29uc3RydWN0b3IoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB7IHRhcmdldDogZG9jdW1lbnQgfSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZSgncmVhZHlzdGF0ZWNoYW5nZScsIGRvbUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZVxuICAgICAgICB0aGlzLl93aW5kb3dTdWJzY3JpYmVyTWV0aG9kKCdhZGRFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgaWYgKGlzUmVhZHlTdGF0ZUNoYW5nZShzb3VyY2VNZXNzYWdlKSlcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIHRoaXMsIGZhbHNlKTtcbiAgICBlbHNlIFxuICAgICAgICB0aGlzLl93aW5kb3dTdWJzY3JpYmVyTWV0aG9kKCdyZW1vdmVFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gaXNSZWFkeVN0YXRlQ2hhbmdlKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc291cmNlTWVzc2FnZSA9PSAncmVhZHlzdGF0ZWNoYW5nZScgJiYgdHlwZW9mIGRvY3VtZW50ID09ICdvYmplY3QnO1xufVxuXG5mdW5jdGlvbiBpc1dpbmRvd01lc3NhZ2Uoc291cmNlTWVzc2FnZSkge1xuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlID09ICdtZXNzYWdlJyAmJiB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnO1xufVxuXG5mdW5jdGlvbiBfd2luZG93U3Vic2NyaWJlck1ldGhvZChtZXRob2QsIHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBpZiAoaXNXaW5kb3dNZXNzYWdlKHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICB3aW5kb3dbbWV0aG9kXSgnbWVzc2FnZScsIHRoaXMsIGZhbHNlKTtcbn1cblxuXG4vLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiB0cmlnZ2VyKG1zZ1R5cGUsIGRhdGEpIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnR5cGUgPSAnbWVzc2FnZTonICsgbXNnVHlwZTtcbiAgICBcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JylcbiAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKGRhdGEsICcqJylcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FbWl0dGVyU291cmNlID0gcmVxdWlyZSgnLi9kb21fc291cmNlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgd2luZG93U2VydmljZSA9IG5ldyBNZXNzZW5nZXI7XG52YXIgZG9tRW1pdHRlclNvdXJjZSA9IG5ldyBET01FbWl0dGVyU291cmNlKHdpbmRvd1NlcnZpY2UsIHsgdHJpZ2dlcjogJ3RyaWdnZXInIH0sIHVuZGVmaW5lZCwgd2luZG93KTtcbndpbmRvd1NlcnZpY2UuX3NldE1lc3NhZ2VTb3VyY2UoZG9tRW1pdHRlclNvdXJjZSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dTZXJ2aWNlO1xuXG5cbl8uZXh0ZW5kKHdpbmRvd1NlcnZpY2UsIHtcbiAgICBpc1RvcDogd2luZG93U2VydmljZV9pc1RvcFxufSk7XG5cblxuZnVuY3Rpb24gd2luZG93U2VydmljZV9pc1RvcCgpIHtcbiAgICByZXR1cm4gd2luZG93LnRvcCA9PSB3aW5kb3cuc2VsZiB8fCB3aW5kb3cuX19rYXJtYV9fO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY2xhc3Nlcy9WaWV3Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvR3JvdXAnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9XcmFwcGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvVGV4dCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1NlbGVjdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0lucHV0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSW5wdXRMaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvVGV4dGFyZWEnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9SYWRpb0dyb3VwJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQnV0dG9uJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvTGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0xpc3RJdGVtJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvVGltZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0RhdGUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Db21ibycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Db21ib0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9JbWFnZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Gb2xkVHJlZScpO1xuXG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duJyk7XG4vLyByZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0RpYWxvZycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRG9tJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRGF0YScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvT3B0aW9ucycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL1RlbXBsYXRlJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvTW9kZWxGYWNldCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RyYWcnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Ecm9wJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9UcmFuc2ZlcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY291bnQgPSByZXF1aXJlKCcuL2NvdW50JylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBwcmVmaXggPSBjb25maWcuY29tcG9uZW50UHJlZml4O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50TmFtZTtcblxuXG5mdW5jdGlvbiBjb21wb25lbnROYW1lKCkge1xuICAgIHJldHVybiBwcmVmaXggKyBjb3VudCgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgICwgY291bnQgPSAnJ1xuICAgICwgdW5pcXVlSUQgPSAnJyArIHRpbWVzdGFtcDtcblxuZnVuY3Rpb24gdW5pcXVlQ291bnQoKSB7XG4gICAgdmFyIG5ld1RpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgdW5pcXVlSUQgPSAnJyArIG5ld1RpbWVzdGFtcDtcbiAgICBpZiAodGltZXN0YW1wID09IG5ld1RpbWVzdGFtcCkge1xuICAgICAgICBjb3VudCA9IGNvdW50ID09PSAnJyA/IDAgOiBjb3VudCArIDE7XG4gICAgICAgIHVuaXF1ZUlEICs9ICdfJyArIGNvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDtcbiAgICAgICAgY291bnQgPSAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlSUQ7XG59XG5cbnVuaXF1ZUNvdW50LmdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB1bmlxdWVJRDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVDb3VudDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbXBvbmVudENsYXNzO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbmQgcmVnaXN0ZXJzIG5ldyBtaWxvIGNvbXBvbmVudC4gIFRoZSBjb21wb25lbnQgY3JlYXRlZCB3aWxsIGhhdmVcbiAqIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBjbGFzcyB1c2VkIGluIGl0cyBjcmVhdGlvbiAoQWNjZXNzYWJsZSB1c2luZyA8Q29tcG9uZW50Q2xhc3M+LnN1cGVyKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLmNsYXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBuZXcgY29tcG9uZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gWydDb21wb25lbnQnXSBjb25maWcuc3VwZXJDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiBhbiBleGlzdGluZyBjb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgbmV3IGNvbXBvbmVudCdzIHN1cGVyIGNsYXNzXG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZy5mYWNldHMgLSBGYWNldCBjb25maWd1cmF0aW9uIChIYXNoIG9mIGZhY2V0IG5hbWUge3N0cmluZ30gdG8gY29uZmlnIHtvYmplY3R9KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcubWV0aG9kcyAtIE1ldGhvZHMgb2YgdGhlIG5ldyBjb21wb25lbnQgKEhhc2ggb2YgZnVuY3Rpb24gbmFtZSB7c3RyaW5nfSB0byBmdW5jdGlvbiB7ZnVuY3Rpb259KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcuc3RhdGljTWV0aG9kcyAtIFN0YXRpYyBtZXRob2RzIG9mIHRoZSBuZXcgY29tcG9uZW50IChIYXNoIG9mIGZ1bmN0aW9uIG5hbWUge3N0cmluZ30gdG8gZnVuY3Rpb24ge2Z1bmN0aW9ufSlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnKSB7XG4gICAgdmFyIGNvbXBvbmVudFJlZ2lzdHJ5ID0gbWlsby5yZWdpc3RyeS5jb21wb25lbnRzO1xuICAgIHZhciBTdXBlckNsYXNzID0gY29tcG9uZW50UmVnaXN0cnkuZ2V0KGNvbmZpZy5zdXBlckNsYXNzTmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gU3VwZXJDbGFzcy5jcmVhdGVDb21wb25lbnRDbGFzcyhjb25maWcuY2xhc3NOYW1lLCBjb25maWcuZmFjZXRzKTtcblxuICAgIGlmKGNvbmZpZy5tZXRob2RzKSB7XG4gICAgICAgIF8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50Q2xhc3MsIGNvbmZpZy5tZXRob2RzKTtcbiAgICB9XG5cbiAgICBpZihjb25maWcuc3RhdGljTWV0aG9kcykge1xuICAgICAgICBpZihjb25maWcuc3RhdGljTWV0aG9kcy5zdXBlciAhPT0gdW5kZWZpbmVkKSB0aHJvdyAnXFwnc3VwZXJcXCcgaXMgYSByZXNlcnZlZCBrZXl3b3JkJztcblxuICAgICAgICBfLmV4dGVuZChDb21wb25lbnRDbGFzcywgY29uZmlnLnN0YXRpY01ldGhvZHMpO1xuICAgIH1cblxuICAgIENvbXBvbmVudENsYXNzLnN1cGVyID0gU3VwZXJDbGFzcy5wcm90b3R5cGU7XG4gICAgXG4gICAgY29tcG9uZW50UmVnaXN0cnkuYWRkKENvbXBvbmVudENsYXNzKTtcblxuICAgIHJldHVybiBDb21wb25lbnRDbGFzcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cbnZhciBkb21VdGlscyA9IHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgZmlsdGVyTm9kZUxpc3RCeVR5cGU6IGZpbHRlck5vZGVMaXN0QnlUeXBlLFxuICAgIGNvbnRhaW5pbmdFbGVtZW50OiBjb250YWluaW5nRWxlbWVudCxcbiAgICBzZWxlY3RFbGVtZW50Q29udGVudHM6IHNlbGVjdEVsZW1lbnRDb250ZW50cyxcbiAgICBzZWxlY3RFbGVtZW50VGV4dDogc2VsZWN0RWxlbWVudFRleHQsXG4gICAgZ2V0RWxlbWVudE9mZnNldDogZ2V0RWxlbWVudE9mZnNldCxcbiAgICBzZXRDYXJldFBvc2l0aW9uOiBzZXRDYXJldFBvc2l0aW9uLFxuICAgIGdldFNlbGVjdGlvbkRpcmVjdGlvbjogZ2V0U2VsZWN0aW9uRGlyZWN0aW9uLFxuICAgIHNldFNlbGVjdGlvbjogc2V0U2VsZWN0aW9uLFxuICAgIGNsZWFyU2VsZWN0aW9uOiBjbGVhclNlbGVjdGlvbixcbiAgICByZW1vdmVFbGVtZW50OiByZW1vdmVFbGVtZW50LFxuICAgIHVud3JhcEVsZW1lbnQ6IHVud3JhcEVsZW1lbnQsXG4gICAgd3JhcEluRWxlbWVudDogd3JhcEluRWxlbWVudCxcbiAgICBkZXRhY2hDb21wb25lbnQ6IGRldGFjaENvbXBvbmVudCxcbiAgICBmaXJzdFRleHROb2RlOiBmaXJzdFRleHROb2RlLFxuICAgIGxhc3RUZXh0Tm9kZTogbGFzdFRleHROb2RlLFxuICAgIHRyaW1Ob2RlUmlnaHQ6IHRyaW1Ob2RlUmlnaHQsXG4gICAgdHJpbU5vZGVMZWZ0OiB0cmltTm9kZUxlZnQsXG4gICAgc3RyaXBIdG1sOiBzdHJpcEh0bWwsXG4gICAgaHRtbEVudGl0aWVzOiBodG1sRW50aXRpZXMsXG4gICAgd2Fsa1RyZWU6IHdhbGtUcmVlLFxuICAgIGNyZWF0ZVRyZWVXYWxrZXI6IGNyZWF0ZVRyZWVXYWxrZXIsXG5cbiAgICB0cmVlUGF0aE9mOiB0cmVlUGF0aE9mLFxuICAgIGdldE5vZGVBdFRyZWVQYXRoOiBnZXROb2RlQXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBpbnNlcnRBdFRyZWVQYXRoLFxuICAgIGlzVHJlZVBhdGhCZWZvcmU6IGlzVHJlZVBhdGhCZWZvcmUsXG5cbiAgICBnZXROb2RlV2luZG93OiBnZXROb2RlV2luZG93LFxuXG4gICAgZ2V0Q29tcG9uZW50c0Zyb21SYW5nZTogZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSxcbiAgICBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzOiBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzLFxuICAgIGZvckVhY2hOb2Rlc0luUmFuZ2U6IGZvckVhY2hOb2Rlc0luUmFuZ2UsXG4gICAgYXJlUmFuZ2VzRXF1YWw6IGFyZVJhbmdlc0VxdWFsLFxuXG4gICAgYWRkRGVidWdQb2ludDogYWRkRGVidWdQb2ludFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBkb21VdGlscztcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBvZiBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgZWxlbWVudCB0byByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIChvbmx5IERPTSBlbGVtZW50cylcbiAqIEByZXR1cm4ge0FycmF5W0VsZW1lbnRdfVxuICovXG4gZnVuY3Rpb24gY2hpbGRyZW4oZWwpIHtcbiAgICByZXR1cm4gZmlsdGVyTm9kZUxpc3RCeVR5cGUoZWwuY2hpbGROb2RlcywgTm9kZS5FTEVNRU5UX05PREUpO1xuIH1cblxuXG4vKipcbiAqIEZpbHRlcnMgdGhlIGxpc3Qgb2Ygbm9kZXMgYnkgdHlwZVxuICpcbiAqIEBwYXJhbSB7Tm9kZUxpc3R9IG5vZGVMaXN0IHRoZSBsaXN0IG9mIG5vZGVzLCBmb3IgZXhhbXBsZSBjaGlsZE5vZGVzIHByb3BlcnR5IG9mIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge0ludGVnZXJ9IG5vZGVUeXBlIGFuIGludGVnZXIgY29uc3RhbnQgW2RlZmluZWQgYnkgRE9NIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUubm9kZVR5cGUpLCBlLmcuIGBOb2RlLkVMRU1FTlRfTk9ERWAgb3IgYE5vZGUuVEVYVF9OT0RFYFxuICogQHJldHVybiB7QXJyYXlbTm9kZV19XG4gKi9cbmZ1bmN0aW9uIGZpbHRlck5vZGVMaXN0QnlUeXBlKG5vZGVMaXN0LCBub2RlVHlwZSkge1xuICAgIHJldHVybiBfLmZpbHRlcihub2RlTGlzdCwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gbm9kZVR5cGU7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBGaW5kIG5lYXJlc3QgcGFyZW50IGVsZW1lbnQgZm9yIG5vZGUuXG4gKiBJZiBub2RlIGlzIGFuIGVsZW1lbnQsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5pbmdFbGVtZW50KG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSlcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIFNlbGVjdHMgaW5uZXIgY29udGVudHMgb2YgRE9NIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNlbGVjdEVsZW1lbnRDb250ZW50cyhlbCkge1xuICAgIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50O1xuICAgIGlmICghIGRvYykgcmV0dXJuIGxvZ2dlci5lcnJvcignc2VsZWN0RWxlbWVudENvbnRlbnRzOiBlbGVtZW50IGhhcyBubyBkb2N1bWVudCcpO1xuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XG4gICAgdmFyIHdpbiA9IGdldE5vZGVXaW5kb3coZWwpXG4gICAgICAgICwgc2VsID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufVxuXG5cbi8qKlxuICogU2VsZWN0cyB0ZXh0IGluc2lkZSBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdEVsZW1lbnRUZXh0KGVsKSB7XG4gICAgdmFyIGZyb21Ob2RlID0gZmlyc3RUZXh0Tm9kZShlbClcbiAgICAgICAgLCB0b05vZGUgPSBsYXN0VGV4dE5vZGUoZWwpO1xuXG4gICAgaWYgKGZyb21Ob2RlICYmIHRvTm9kZSlcbiAgICAgICAgc2V0U2VsZWN0aW9uKGZyb21Ob2RlLCAwLCB0b05vZGUsIHRvTm9kZS50ZXh0Q29udGVudC5sZW5ndGgpO1xufVxuXG5cbi8qKlxuICogU2V0cyB0aGUgY2FyZXQgcG9zaXRpb24gdG8gdGhlIHBvc2l0aW9uIGluIHRoZSBub2RlXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIERPTSBub2RlXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIGNhcmV0IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24obm9kZSwgcG9zKSB7XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICBpZiAoISBkb2MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3NldENhcmV0UG9zaXRpb246IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgcG9zKTtcbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhub2RlKVxuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBvZiBhIHNlbGVjdGlvblxuICpcbiAqIDEgZm9yd2FyZCwgLTEgYmFja3dhcmQsIDAgbm8gZGlyZWN0aW9uLCB1bmRlZmluZWQgb25lIG9mIHRoZSBub2RlIGlzIGRldGFjaGVkIG9yIGluIGEgZGlmZmVyZW50IGZyYW1lXG4gKlxuICogQHBhcmFtIHtzZWx9IGEgc2VsZWN0aW9uIG9iamVjdFxuICogQHJldHVybiB7LTF8MHwxfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uRGlyZWN0aW9uKHNlbCl7XG4gICAgcmV0dXJuIF9nZXREaXJlY3Rpb24oc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQsIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG59XG5cbmZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0LCB0b05vZGUsIGVuZE9mZnNldCl7XG4gICAgdmFyIGRvY1Bvc2l0aW9uID0gZnJvbU5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odG9Ob2RlKTtcbiAgICBpZiAoZG9jUG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyl7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKXtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcm9tTm9kZSA9PSB0b05vZGUpe1xuICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCBlbmRPZmZzZXQpe1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpe1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyBhIHJhbmdlIGluIGEgZG9jdW1lbnRcbiAqXG4gKiBAcGFyYW0ge05vZGV9IGZyb21Ob2RlIERPTSBub2RlIHRvIHN0YXJ0IHNlbGVjdGlvbiBpblxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0T2Zmc2V0XG4gKiBAcGFyYW0ge05vZGV9IHRvTm9kZSBET00gbm9kZSB0byBlbmQgc2VsZWN0aW9uIGluXG4gKiBAcGFyYW0ge051bWJlcn0gZW5kT2Zmc2V0XG4gKi9cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KSB7XG4gICAgdmFyIGRvYyA9IGZyb21Ob2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKCEgZG9jKSByZXR1cm4gbG9nZ2VyKCdzZXRDYXJldFBvc2l0aW9uOiBlbGVtZW50IGhhcyBubyBkb2N1bWVudCcpO1xuICAgIHZhciBiYWNrd2FyZCA9IF9nZXREaXJlY3Rpb24oZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0LCB0b05vZGUsIGVuZE9mZnNldCkgPT0gLTE7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgdmFyIGNvbnRhaW5lciwgb3JpZ2luYWxDb250ZW50RWRpdGFibGU7XG4gICAgLy8gZG9lcyBub3Qgd29yayBpbiBub24gY29udGVudEVkaXRhYmxlIGl0ZW1zXG5cbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhmcm9tTm9kZSlcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGZyb21Ob2RlLCBzdGFydE9mZnNldCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGZyb21Ob2RlLCBzdGFydE9mZnNldCk7XG4gICAgICAgIHJhbmdlLnNldEVuZCh0b05vZGUsIGVuZE9mZnNldCk7XG4gICAgfVxuXG4gICAgY29udGFpbmVyID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIgPT0gTm9kZS5FTEVNRU5UX05PREUgP1xuICAgICAgICByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA6XG4gICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XG5cbiAgICBpZiAoIWNvbnRhaW5lci5pc0NvbnRlbnRFZGl0YWJsZSl7XG4gICAgICAgIG9yaWdpbmFsQ29udGVudEVkaXRhYmxlID0gY29udGFpbmVyLmNvbnRlbnRFZGl0YWJsZTsgLy8gZmFsc2Ugb3IgaW5oZXJpdFxuICAgICAgICBjb250YWluZXIuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgfVxuXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICBpZiAoYmFja3dhcmQpe1xuICAgICAgICBzZWwuZXh0ZW5kKHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBpZiAob3JpZ2luYWxDb250ZW50RWRpdGFibGUpe1xuICAgICAgICAvLyByZXN0b3JpbmcgY29udGVudEVkaXRhYmxlXG4gICAgICAgIGNvbnRhaW5lci5jb250ZW50RWRpdGFibGUgPSBvcmlnaW5hbENvbnRlbnRFZGl0YWJsZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xlYXJzIHNlbGVjdGlvbiBpbiBhIGdpdmVuIHdpbmRvd1xuICogQHBhcmFtIHtXaW5kb3d9IHdpblxuICovXG5mdW5jdGlvbiBjbGVhclNlbGVjdGlvbih3aW4pIHtcbiAgICB3aW4gPSB3aW4gfHwgd2luZG93O1xuICAgIHZhciBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xufVxuXG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhbiBlbGVtZW50J3MgdG90YWwgdG9wIGFuZCBsZWZ0IG9mZnNldCBmcm9tIHRoZSBkb2N1bWVudCBlZGdlLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHBvc2l0aW9uIG5lZWRzIHRvIGJlIHJldHVybmVkXG4gKiBAcGFyYW0ge2luY2x1ZGVCb3JkZXJ9IGlmIGlzIHRvIGluY2x1ZGUgdGhlIGJvcmRlciB3aWR0aFxuICogQHJldHVybiB7T2JqZWN0fSB2ZWN0b3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyB0b3BPZmZzZXQgYW5kIGxlZnRPZmZzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudE9mZnNldChlbCwgaW5jbHVkZUJvcmRlcikge1xuICAgIHZhciB5UG9zLCB4UG9zO1xuXG4gICAgeVBvcyA9IGVsLm9mZnNldFRvcDtcbiAgICB4UG9zID0gZWwub2Zmc2V0TGVmdDtcbiAgICBlbCA9IGVsLm9mZnNldFBhcmVudDtcblxuICAgIHdoaWxlIChlbCkge1xuICAgICAgICB5UG9zICs9IGVsLm9mZnNldFRvcCArIGdldEJvcmRlcihlbCwgJ0hlaWdodCcsIGluY2x1ZGVCb3JkZXIpO1xuICAgICAgICB4UG9zICs9IGVsLm9mZnNldExlZnQgKyBnZXRCb3JkZXIoZWwsICdXaWR0aCcsIGluY2x1ZGVCb3JkZXIpO1xuICAgICAgICBlbCA9IGVsLm9mZnNldFBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0b3BPZmZzZXQ6IHlQb3MsIGxlZnRPZmZzZXQ6IHhQb3MgfTtcbn1cblxuXG5mdW5jdGlvbiBnZXRCb3JkZXIoZWwsIHR5cGUsIGluY2x1ZGVCb3JkZXIpIHtcbiAgICBpZiAoaW5jbHVkZUJvcmRlcikge1xuICAgICAgICB2YXIgc2lkZSA9ICh0eXBlID09ICdIZWlnaHQnKSA/ICd0b3AnIDogJ2xlZnQnLFxuICAgICAgICAgICAgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLFxuICAgICAgICAgICAgc2lkZVZhbHVlID0gcGFyc2VJbnQoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci0nICsgc2lkZSArICctd2lkdGgnKSwgMTApO1xuXG4gICAgICAgIGlmIChzaWRlVmFsdWUpIHJldHVybiBzaWRlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBlbGVtZW50IGZyb20gdGhlIGRvY3VtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCB0byBiZSByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50KXtcbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHRleHQgbm9kZSBvZiBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE5vZGV9IG5vZGUgdGhlIG5vZGUgdG8gYmUgc2VhcmNoZWQsIGlmIHRoZSBub2RlIGlzIHRleHQgbm9kZSB3ZSByZXR1cm4gdGhlIG5vZGUuXG4gKiBAcmV0dXJuIHtUZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gZmlyc3RUZXh0Tm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHJldHVybiBub2RlO1xuICAgIHZhciB0cmVlV2Fsa2VyID0gY3JlYXRlVHJlZVdhbGtlcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgcmV0dXJuIHRyZWVXYWxrZXIuZmlyc3RDaGlsZCgpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBjaGlsZCB0ZXh0IG5vZGUgb2YgYW4gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxOb2RlfSBub2RlIHRoZSBub2RlIHRvIGJlIHNlYXJjaGVkLCBpZiB0aGUgbm9kZSBpcyB0ZXh0IG5vZGUgd2UgcmV0dXJuIHRoZSBub2RlLlxuICogQHJldHVybiB7VGV4dE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGxhc3RUZXh0Tm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHJldHVybiBub2RlO1xuICAgIHZhciB0cmVlV2Fsa2VyID0gY3JlYXRlVHJlZVdhbGtlcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgcmV0dXJuIHRyZWVXYWxrZXIubGFzdENoaWxkKCk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQgcHV0dGluZyBpdHMgY2hpbGRyZW4gaW4gaXRzIHBsYWNlXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCB0byBiZSBcInVud3JhcHBlZFwiXG4gKi9cbmZ1bmN0aW9uIHVud3JhcEVsZW1lbnQoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIC8vIG11c3QgYmUgY29waWVkIHRvIGF2b2lkIGl0ZXJhdGluZyBhIG11dGF0aW5nIGxpc3Qgb2YgY2hpbGROb2Rlc1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBfLnNsaWNlKGVsLmNoaWxkTm9kZXMpO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZyYWcuYXBwZW5kQ2hpbGQsIGZyYWcpO1xuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKGZyYWcsIGVsKTtcbiAgICAgICAgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFdyYXBzIGFuIGVsZW1lbnQgaW4gYW5vdGhlciBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gd3JhcEludG9FbFxuICogQHBhcmFtICB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gd3JhcEluRWxlbWVudCh3cmFwSW50b0VsLCBlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHdyYXBJbnRvRWwsIGVsKTtcbiAgICAgICAgd3JhcEludG9FbC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogVHJpbXMgYSB0ZXh0IG5vZGUgb2YgdHJhaWxpbmcgc3BhY2VzLCBhbmQgcmV0dXJucyB0cnVlIGlmIGEgdHJpbSB3YXMgcGVyZm9ybWVkLlxuICpcbiAqIEBwYXJhbSAge1RleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB0cmltTm9kZVJpZ2h0KG5vZGUpIHtcbiAgICByZXR1cm4gX3RyaW1Ob2RlKG5vZGUsICd0cmltUmlnaHQnKTtcbn1cblxuXG4vKipcbiAqIFRyaW1zIGEgdGV4dCBub2RlIG9mIGxlYWRpbmcgc3BhY2VzLCBhbmQgcmV0dXJucyB0cnVlIGlmIGEgdHJpbSB3YXMgcGVyZm9ybWVkLlxuICpcbiAqIEBwYXJhbSAge1RleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB0cmltTm9kZUxlZnQobm9kZSkge1xuICAgIHJldHVybiBfdHJpbU5vZGUobm9kZSwgJ3RyaW1MZWZ0Jyk7XG59XG5cblxuZnVuY3Rpb24gX3RyaW1Ob2RlKG5vZGUsIG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbGVuID0gbm9kZS5sZW5ndGg7XG4gICAgbm9kZS50ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnRbbWV0aG9kTmFtZV0oKTtcbiAgICByZXR1cm4gbGVuICE9PSBub2RlLmxlbmd0aDtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byBjb21wb25lbnQgZnJvbSBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gZGV0YWNoQ29tcG9uZW50KGVsKSB7XG4gICAgZGVsZXRlIGVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjb250ZW50IG9mIGEgaHRtbCBzdHJpbmdcbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIEFueSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgc3RyaW5nIGNsZWFuZWQgb2YgYW55IGh0bWwgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBIdG1sKHN0cikge1xuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiBkaXYudGV4dENvbnRlbnQgfHwgJyc7XG59XG5cblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBuYXRpdmUgVHJlZVdhbGtlciB0aGF0IGF1dG9tYXRpY2FsbHkgd2Fsa3MgdGhlIHRyZWUgYW5kIGNhbGxzIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICogVGhpcyB3aWxsIG5vdCBpdGVyYXRlIHRoZSByb290IGVsZW1lbnQuXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gcm9vdCBUaGUgY29udGFpbmluZyByb290IGVsZW1lbnQgdG8gYmUgd2Fsa2VkLiBXaWxsIG5vdCBiZSBpdGVyYXRlZC5cbiAqIEBwYXJhbSAge05vZGVGaWxlcn0gZmlsdGVyIEEgTm9kZUZpbHRlciBjb25zdGFudCwgc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0FQSS9UcmVlV2Fsa2VyXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gaXRlcmF0b3IgQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBub2RlLiBSZXR1cm5pbmcgJ2ZhbHNlJyB3aWxsIGJyZWFrLlxuICogQHBhcmFtICB7T2JqZWN0fSBjb250ZXh0IEFuIG9wdGlvbmFsIGNvbnRleHQgdG8gcGFzc2VkLCBkZWZhdWx0cyB0byByb290LlxuICovXG5mdW5jdGlvbiB3YWxrVHJlZShyb290LCBmaWx0ZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIHR3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihyb290LCBmaWx0ZXIpO1xuICAgIHdoaWxlKHR3Lm5leHROb2RlKCkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCByb290LCB0dy5jdXJyZW50Tm9kZSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSBicmVhaztcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGNoaWxkIGluZGV4ZXMgb2YgZWxlbWVudCBwYXRoIGluc2lkZSByb290IGVsZW1lbnQgaW4gRE9NIHRyZWUgdXNpbmcgYnJlYWR0aCBmaXJzdCB0cmVlIHRyYXZlcnNhbC5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbnNpZGUgcm9vdCBlbGVtZW50LCAwIGlmIHRoZSByb290IGVsZW1lbnQgaXRzZWxmIGlzIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSByb290RWwgZWxlbWVudCB0byBzZWFyY2hcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsIGVsZW1lbnQgdG8gZmluZCB0aGUgaW5kZXggb2ZcbiAqIEByZXR1cm4ge0FycmF5W051bWJlcl19XG4gKi9cbmZ1bmN0aW9uIHRyZWVQYXRoT2Yocm9vdEVsLCBlbCkge1xuICAgIGlmICghIChyb290RWwgJiYgcm9vdEVsLmNvbnRhaW5zKGVsKSkpIHJldHVybjtcblxuICAgIHZhciB0cmVlUGF0aCA9IFtdXG4gICAgICAgICwgbm9kZSA9IHJvb3RFbDtcblxuICAgIHdoaWxlIChub2RlICE9IGVsKSB7XG4gICAgICAgIHZhciBub2RlSW5kZXggPSBfLmZpbmRJbmRleChub2RlLmNoaWxkTm9kZXMsIGNvbnRhaW5zRWwpO1xuICAgICAgICB0cmVlUGF0aC5wdXNoKG5vZGVJbmRleCk7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbbm9kZUluZGV4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZVBhdGg7XG5cbiAgICBmdW5jdGlvbiBjb250YWluc0VsKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBjaGlsZC5jb250YWlucyhlbCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyBlbGVtZW50IGF0IGdpdmVuIHRyZWUgcGF0aFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsXG4gKiBAcGFyYW0ge0FycmF5W051bWJlcl19IHRyZWVQYXRoXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG5lYXJlc3QgcmV0dXJuIG5lYXJlc3QgcG9zc2libGUgbm9kZSBpZiBleGFjdCBub2RlIGRvZXMgbm90IGV4aXN0XG4gKiBAcmV0dXJuIHtOb2RlfVxuICovXG5mdW5jdGlvbiBnZXROb2RlQXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLCBuZWFyZXN0KSB7XG4gICAgaWYgKCF0cmVlUGF0aCkgcmV0dXJuO1xuXG4gICAgdmFyIGxlbiA9IHRyZWVQYXRoLmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm4gcm9vdEVsO1xuXG4gICAgdmFyIG5vZGUgPSByb290RWw7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcbiAgICAgICAgaWYgKCEgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghIG5lYXJlc3QpIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRyZWVQYXRoW2ldXG4gICAgICAgICAgICAsIGNoaWxkID0gY2hpbGRyZW5bY2hpbGRJbmRleF07XG4gICAgICAgIGlmICghIGNoaWxkKSB7XG4gICAgICAgICAgICBub2RlID0gbmVhcmVzdFxuICAgICAgICAgICAgICAgICAgICA/IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IGNoaWxkO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xufVxuXG5cbi8qKlxuICogSW5zZXJ0cyBhbiBlbGVtZW50IGluc2lkZSByb290IGF0IGEgZ2l2ZW4gcGF0aCBpbiB0cmVlICh0aGF0IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBpbmRleCByZXR1cm5lZCBieSBgdHJlZVBhdGhPZmAgZnVuY3Rpb24pLiBJZiBlbGVtZW50IGlzIGFscmVhZHkgaW4gdGhlIHJvb3QncyB0cmVlLCBpdCB3aWxsIGJlIHJlbW92ZWQgZmlyc3QgYW5kIHRoZW4gbW92ZWQgdG8gdGhlIHBhc3NlZCB0cmVlSW5kZXhcbiAqIEluc2VydGlvbiBhdCBpbmRleCAwIGlzIG5vdCBwb3NzaWJsZSBhbmQgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGFzIGl0IHdvdWxkIG1lYW4gcmVwbGFjaW5nIHRoZSByb290IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWwgZWxlbWVudCBpbnRvIHdoaWNoIHRvIGluc2VydFxuICogQHBhcmFtIHtOdW1iZXJ9IHRyZWVJbmRleCBpbmRleCBpbiBET00gdHJlZSBpbnNpZGUgcm9vdCBlbGVtZW50IChzZWUgdHJlZVBhdGhPZilcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgZWxlbWVudCB0byBiZSBpbnNlcnRlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB3YXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkXG4gKi9cbmZ1bmN0aW9uIGluc2VydEF0VHJlZVBhdGgocm9vdEVsLCB0cmVlUGF0aCwgZWwsIG5lYXJlc3QpIHtcbiAgICB2YXIgdG9Ob3JtYWxpemUgPSBlbC5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERTtcbiAgICBpZiAocm9vdEVsLmNvbnRhaW5zKGVsKSlcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbCk7IC8vIGNhbid0IHVzZSByZW1vdmVDaGlsZCBhcyByb290RWwgaGVyZSBpcyBub3QgYW4gaW1tZWRpYXRlIHBhcmVudFxuXG4gICAgaWYgKHRyZWVQYXRoLmxlbmd0aCA9PSAwKSByZXR1cm47XG5cbiAgICB2YXIgcGFyZW50ID0gZ2V0Tm9kZUF0VHJlZVBhdGgocm9vdEVsLCB0cmVlUGF0aC5zbGljZSgwLCAtMSksIG5lYXJlc3QpXG4gICAgICAgICwgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcblxuICAgIGlmICghIGNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChuZWFyZXN0KSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIH0gZWxzZSByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkSW5kZXggPSB0cmVlUGF0aFt0cmVlUGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAsIGNoaWxkID0gY2hpbGRyZW5bY2hpbGRJbmRleF07XG5cbiAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgY2hpbGQpO1xuICAgICAgICBpZiAodG9Ob3JtYWxpemUpIHBhcmVudC5ub3JtYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgKGNoaWxkSW5kZXggPT09IDAgfHwgbmVhcmVzdCkpIHtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgaWYgKHRvTm9ybWFsaXplKSBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkID0gY2hpbGRyZW5bY2hpbGRJbmRleCAtIDFdO1xuICAgICAgICBpZiAoY2hpbGQgfHwgbmVhcmVzdCkge1xuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgIGlmICh0b05vcm1hbGl6ZSkgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgdHJlZSBwYXRoIHBvaW50cyB0byBhIG5vZGUgd2hpY2ggaXMgYmVmb3JlIHRoZSBvdGhlciBpbiB0aGUgZG9jdW1lbnQgb3JkZXIuXG4gKiBAcGFyYW0gIHtBcnJheX0gIHBhdGgxICAgQSB0cmVlcGF0aCBhcnJheVxuICogQHBhcmFtICB7QXJyYXl9ICBwYXRoMiAgIEEgdHJlZXBhdGggYXJyYXlcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVHJlZVBhdGhCZWZvcmUocGF0aDEsIHBhdGgyKSB7XG4gICAgdmFyIGkgPSAwXG4gICAgICAgICwgaXNCZWZvcmU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgxKSAmJiBBcnJheS5pc0FycmF5KHBhdGgyKSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcignaXNUcmVlUGF0aEJlZm9yZTogT25lIG9yIGJvdGggcGF0aHMgYXJlIG5vdCB2YWxpZCB0cmVlcGF0aCBhcnJheXMuJyk7XG5cbiAgICBmb3IgKGk7IGkgPCBwYXRoMS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aDFbaV0gPCBwYXRoMltpXSkge1xuICAgICAgICAgICAgaXNCZWZvcmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0aDFbaV0gPiBwYXRoMltpXSkge1xuICAgICAgICAgICAgaXNCZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpc0JlZm9yZSA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgaWYgKHBhdGgxLmxlbmd0aCA8IHBhdGgyLmxlbmd0aClcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdpc1RyZWVQYXRoQmVmb3JlOiBPbmUgbm9kZSBpcyBpbnNpZGUgYW5vdGhlcicpO1xuXG4gICAgcmV0dXJuIGlzQmVmb3JlIHx8IGZhbHNlO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgbm9uIGxhdGluIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdHkgY29kZXMuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgIHRoZSBzdHJpbmcgd2l0aCBodG1sIGVudGl0aWVzXG4gKi9cbmZ1bmN0aW9uIGh0bWxFbnRpdGllcyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXHUwMEEwLVxcdTk5OTk5PD5cXCZdL2dpbSwgZnVuY3Rpb24oaSkge1xuICAgICAgICByZXR1cm4gJyYjJytpLmNoYXJDb2RlQXQoMCkrJzsnO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRyZWVXYWxrZXIoZWwsIHdoYXRUb1Nob3cpIHtcbiAgICB3aGF0VG9TaG93ID0gd2hhdFRvU2hvdyB8fCAoTm9kZUZpbHRlci5TSE9XX1RFWFQgfCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWwsIHdoYXRUb1Nob3cpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB3aW5kb3cgdGhlIG5vZGUgaXMgaW5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge1dpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVdpbmRvdyhub2RlKSB7XG4gICAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gZG9jICYmIChkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdyk7XG59XG5cblxuXG4vKipcbiAqIGRvIHNvbWV0aGluZyBmb3IgZWFjaCBub2RlcyBjb250YWluZWQgaW4gYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGEgcmFuZ2VcbiAqIEBwYXJhbSB7Y2J9IGEgZnVuY3Rpb24gdGFraW5nIGEgbm9kZSBhcyBhcmd1bWVudFxuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hOb2Rlc0luUmFuZ2UocmFuZ2UsIGNiKXtcbiAgICB2YXIgcmFuZ2VDb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgICAgICAsIGRvYyA9IHJhbmdlQ29udGFpbmVyLm93bmVyRG9jdW1lbnQ7XG5cbiAgICBmdW5jdGlvbiBpc05vZGVJbnNpZGVSYW5nZShub2RlKXtcbiAgICAgICAgdmFyIG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHZhciBpc0luc2lkZSA9IGZhbHNlO1xuICAgICAgICBub2RlUmFuZ2Uuc2VsZWN0Tm9kZShub2RlKTtcblxuICAgICAgICBpZiAobm9kZVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIHJhbmdlKSAhPSAtMVxuICAgICAgICAgICAgJiYgbm9kZVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuRU5EX1RPX0VORCwgcmFuZ2UpICE9IDEpe1xuICAgICAgICAgICAgaXNJbnNpZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVSYW5nZS5kZXRhY2goKTtcbiAgICAgICAgcmV0dXJuIGlzSW5zaWRlO1xuICAgIH1cblxuICAgIHZhciB0cmVlV2Fsa2VyID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIocmFuZ2VDb250YWluZXIsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblxuICAgIHZhciBjdXJyZW50Tm9kZTtcbiAgICB3aGlsZSAoY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCkpeyAvLyBzaG91bGQgYmUgYXNzaWdubWVudFxuICAgICAgICBpZiAoaXNOb2RlSW5zaWRlUmFuZ2UoY3VycmVudE5vZGUpKXtcbiAgICAgICAgICAgIGNiKGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBnZXQgYWxsIGNvbXBvbmVudHMgY29udGFpbmVkIGluIGEgcmFuZ2VcbiAqXG4gKiBAcGFyYW0ge3JhbmdlfSBhIERPTSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50c0Zyb21SYW5nZShyYW5nZSkge1xuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KHJhbmdlLnN0YXJ0Q29udGFpbmVyKVxuICAgICAgICAsIENvbXBvbmVudCA9IHdpbi5taWxvLkNvbXBvbmVudDtcblxuICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgZm9yRWFjaE5vZGVzSW5SYW5nZShyYW5nZSwgZnVuY3Rpb24gKG5vZGUpe1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgdmFyIGNvbXAgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xuICAgICAgICAgICAgaWYgKGNvbXApXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuLyoqXG4gKiBkZWxldGUgYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGRlbGV0ZSBhIERPTSByYW5nZSBhbmQgYWxsIHRoZSBjb21wb25lbnRzIGluc2lkZVxuICovXG5mdW5jdGlvbiBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzKHJhbmdlKSB7XG4gICAgdmFyIGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHJhbmdlKTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIGNvbXAuZGVzdHJveSh0cnVlKTtcbiAgICB9KTtcblxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG59XG5cbi8qKlxuICogY2hlY2sgaWYgdHdvIHJhbmdlcyBhcmUgZXF1aXZhbGVudFxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IHJhbmdlMVxuICogQHBhcmFtIHtyYW5nZX0gcmFuZ2UyXG4gKiBAcmV0dXJuIHtCb29sZWFufSBhcmUgdGhlIHR3byByYW5nZXMgZXF1aXZhbGVudFxuICovXG5mdW5jdGlvbiBhcmVSYW5nZXNFcXVhbChyYW5nZTEsIHJhbmdlMil7XG4gICAgcmV0dXJuIHJhbmdlMS5jb21wYXJlQm91bmRhcnlQb2ludHMod2luZG93LlJhbmdlLlNUQVJUX1RPX1NUQVJULCByYW5nZTIpID09IDAgJiYgcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuRU5EX1RPX0VORCwgcmFuZ2UyKSA9PSAwO1xufVxuXG5cbi8qKlxuICogQWRkcyBhIHNpbmdsZSBwaXhlbCBkaXYgdG8gdGhlIGJvZHkgYXQgYSBnaXZlbiB4IGFuZCB5IHBvc2l0aW9uLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBwb3NpdGlvbiBzcGVjaWZpYyBjb2RlLlxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKi9cbmZ1bmN0aW9uIGFkZERlYnVnUG9pbnQoeCwgeSkge1xuICAgIHZhciBkYkVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGJFbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBwb3NpdGlvbjpmaXhlZDsgbGVmdDonK3grJ3B4OyB0b3A6Jyt5KydweDsgYmFja2dyb3VuZC1jb2xvcjpyZWQ7IHotaW5kZXg6IDEwMCcpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkYkVsKTt9LCAyMDApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBET01MaXN0ZW5lcnM7XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzKCkge1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cblxuXy5leHRlbmRQcm90byhET01MaXN0ZW5lcnMsIHtcbiAgICBhZGQ6IERPTUxpc3RlbmVycyRhZGQsXG4gICAgcmVtb3ZlOiBET01MaXN0ZW5lcnMkcmVtb3ZlLFxuICAgIHJlbW92ZUFsbDogRE9NTGlzdGVuZXJzJHJlbW92ZUFsbFxufSk7XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzJGFkZCh0YXJnZXQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUsXG4gICAgICAgIGhhbmRsZXI6IGhhbmRsZXJcbiAgICB9KTtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUxpc3RlbmVycyRyZW1vdmUodGFyZ2V0LCBldmVudFR5cGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgbGlzdGVuZXIgPSB7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlclxuICAgIH07XG4gICAgdmFyIGlkeCA9IF8uZmluZEluZGV4KHRoaXMubGlzdGVuZXJzLCBfLnBhcnRpYWwoXy5pc0VxdWFsLCBsaXN0ZW5lcikpO1xuXG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMkcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goX3JlbW92ZUxpc3RlbmVyKTtcbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW1vdmVMaXN0ZW5lcihsKSB7XG4gICAgbC50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihsLmV2ZW50VHlwZSwgbC5oYW5kbGVyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZG9tUmVhZHk7XG5cblxudmFyIGRvbVJlYWR5RnVuY3MgPSBbXVxuICAgICwgZG9tUmVhZHlTdWJzY3JpYmVkID0gZmFsc2U7XG5cblxuZnVuY3Rpb24gZG9tUmVhZHkoZnVuYykgeyAvLyAsIGFyZ3VtZW50c1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICAsIGFyZ3MgPSBfLnNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgaWYgKGlzUmVhZHkuY2FsbCh0aGlzKSlcbiAgICAgICAgY2FsbEZ1bmMoKTtcbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFkb21SZWFkeVN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbkRvbVJlYWR5KTtcbiAgICAgICAgICAgIGRvbVJlYWR5U3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZG9tUmVhZHlGdW5jcy5wdXNoKGNhbGxGdW5jKTsgLy8gY2xvc3VyZSBpcyBhZGRlZCwgc28gZXZlcnkgdGltZSBkaWZmZXJlbnQgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWRcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxsRnVuYygpIHtcbiAgICAgICAgZnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gb25Eb21SZWFkeSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgb25Eb21SZWFkeSk7XG4gICAgZG9tUmVhZHlGdW5jcy5mb3JFYWNoKGZ1bmN0aW9uKGZ1bmMpIHsgZnVuYygpOyB9KTtcbn1cblxuXG5fLmV4dGVuZChkb21SZWFkeSwge1xuICAgIGlzUmVhZHk6IGlzUmVhZHlcbn0pO1xuXG5cbmZ1bmN0aW9uIGlzUmVhZHkoKSB7XG4gICAgdmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlO1xuICAgIHJldHVybiByZWFkeVN0YXRlID09ICdsb2FkaW5nJyA/IGZhbHNlIDogcmVhZHlTdGF0ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIGRyYWdEcm9wQ29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJykuZHJhZ0Ryb3BcbiAgICAsIGNvbXBvbmVudE1ldGFSZWdleCA9IGRyYWdEcm9wQ29uZmlnLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhUmVnZXhcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgYmFzZTMyID0gcmVxdWlyZSgnYmFzZTMyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnRHJvcDtcblxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIGV2ZW50LmRhdGFUcmFuc2ZlciBvZiBkcmFnLWRyb3AgSFRNTCBBUElcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZXZlbnR9IERPTSBldmVudFxuICogQHJldHVybiB7RHJhZ0Ryb3B9XG4gKi9cbmZ1bmN0aW9uIERyYWdEcm9wKGV2ZW50KSB7XG4gICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgIHRoaXMudHlwZXMgPSBldmVudC5kYXRhVHJhbnNmZXIudHlwZXM7XG59XG5cbi8qKlxuICogVXNhZ2U6XG4gKiB2YXIgdGVzdERUID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcbiAqIHRlc3REVC5zZXRDb21wb25lbnRNZXRhKG5ld0NvbXBvbmVudCwge3Rlc3Q6ICd0ZXN0JywgdGVzdDI6ICd0ZXN0Mid9KTtcbiAqIHRlc3REVC5nZXRDb21wb25lbnRNZXRhKCk7XG4gKi9cblxuXy5leHRlbmQoRHJhZ0Ryb3AsIHtcbiAgICBjb21wb25lbnREYXRhVHlwZTogRHJhZ0Ryb3AkJGNvbXBvbmVudERhdGFUeXBlXG59KTtcblxuXy5leHRlbmRQcm90byhEcmFnRHJvcCwge1xuICAgIGlzQ29tcG9uZW50OiBEcmFnRHJvcCRpc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnRTdGF0ZTogRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50U3RhdGUsXG4gICAgc2V0Q29tcG9uZW50U3RhdGU6IERyYWdEcm9wJHNldENvbXBvbmVudFN0YXRlLFxuICAgIGdldENvbXBvbmVudE1ldGE6IERyYWdEcm9wJGdldENvbXBvbmVudE1ldGEsXG4gICAgc2V0Q29tcG9uZW50TWV0YTogRHJhZ0Ryb3Akc2V0Q29tcG9uZW50TWV0YSxcbiAgICBnZXRBbGxvd2VkRWZmZWN0czogRHJhZ0Ryb3AkZ2V0QWxsb3dlZEVmZmVjdHMsXG4gICAgc2V0QWxsb3dlZEVmZmVjdHM6IERyYWdEcm9wJHNldEFsbG93ZWRFZmZlY3RzLFxuICAgIGdldERyb3BFZmZlY3Q6IERyYWdEcm9wJGdldERyb3BFZmZlY3QsXG4gICAgc2V0RHJvcEVmZmVjdDogRHJhZ0Ryb3Akc2V0RHJvcEVmZmVjdCxcbiAgICBpc0VmZmVjdEFsbG93ZWQ6IERyYWdEcm9wJGlzRWZmZWN0QWxsb3dlZCxcbiAgICBnZXREYXRhOiBEcmFnRHJvcCRnZXREYXRhLFxuICAgIHNldERhdGE6IERyYWdEcm9wJHNldERhdGEsXG4gICAgY2xlYXJEYXRhOiBEcmFnRHJvcCRjbGVhckRhdGFcbn0pO1xuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJCRjb21wb25lbnREYXRhVHlwZSgpIHtcbiAgICByZXR1cm4gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRpc0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMudHlwZXMsIERyYWdEcm9wLmNvbXBvbmVudERhdGFUeXBlKCkpID49IDA7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50U3RhdGUoKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gRHJhZ0Ryb3AuY29tcG9uZW50RGF0YVR5cGUoKVxuICAgICAgICAsIHN0YXRlU3RyID0gdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSlcbiAgICAgICAgLCBzdGF0ZSA9IF8uanNvblBhcnNlKHN0YXRlU3RyKTtcblxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRzZXRDb21wb25lbnRTdGF0ZShjb21wb25lbnQsIHN0YXRlU3RyKXtcbiAgICBpZiAoISBzdGF0ZVN0cikge1xuICAgICAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuZ2V0VHJhbnNmZXJTdGF0ZSh7IHJlcXVlc3RlZEJ5OiAnZHJhZycgfSk7XG4gICAgICAgIHN0YXRlU3RyID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUpO1xuICAgIH1cbiAgICB2YXIgZGF0YVR5cGUgPSBEcmFnRHJvcC5jb21wb25lbnREYXRhVHlwZSgpO1xuXG4gICAgc3RhdGVTdHIgJiYgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YShkYXRhVHlwZSwgc3RhdGVTdHIpO1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvaHRtbCcsIGNvbXBvbmVudC5lbC5vdXRlckhUTUwpO1xuICAgIHJldHVybiBzdGF0ZVN0cjtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRzZXRDb21wb25lbnRNZXRhKGNvbXBvbmVudCwgcGFyYW1zLCBkYXRhKSB7XG4gICAgdmFyIG1ldGEgPSBfY29tcG9uZW50TWV0YShjb21wb25lbnQpO1xuXG4gICAgdmFyIHBhcmFtc1N0ciA9IF8udG9RdWVyeVN0cmluZyhwYXJhbXMpO1xuICAgIHZhciBkYXRhVHlwZSA9IGRyYWdEcm9wQ29uZmlnLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjbGFzcycsIF9lbmNvZGUobWV0YS5jb21wQ2xhc3MgfHwgJycpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJW5hbWUnLCBfZW5jb2RlKG1ldGEuY29tcE5hbWUgfHwgJycpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJXBhcmFtcycsIF9lbmNvZGUocGFyYW1zU3RyIHx8ICcnKSk7XG5cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YShkYXRhVHlwZSwgZGF0YSB8fCAnJyk7XG5cbiAgICByZXR1cm4gZGF0YVR5cGU7XG59XG5cblxuZnVuY3Rpb24gX2VuY29kZShzdHIpIHtcbiAgICByZXR1cm4gYmFzZTMyLmVuY29kZShzdHIpLnRvTG93ZXJDYXNlKCk7XG59XG5cblxuZnVuY3Rpb24gX2NvbXBvbmVudE1ldGEoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudC50cmFuc2ZlclxuICAgICAgICAgICAgPyBjb21wb25lbnQudHJhbnNmZXIuZ2V0Q29tcG9uZW50TWV0YSgpXG4gICAgICAgICAgICA6IHsgXG4gICAgICAgICAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnQuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICBjb21wTmFtZTogY29tcG9uZW50Lm5hbWVcbiAgICAgICAgICAgIH07XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50TWV0YSgpIHtcbiAgICB2YXIgbWF0Y2g7XG4gICAgdmFyIG1ldGFEYXRhVHlwZSA9IF8uZmluZCh0aGlzLnR5cGVzLCBmdW5jdGlvbiAoZFR5cGUpIHtcbiAgICAgICAgbWF0Y2ggPSBkVHlwZS5tYXRjaChjb21wb25lbnRNZXRhUmVnZXgpO1xuICAgICAgICByZXR1cm4gISFtYXRjaDtcbiAgICB9KTtcbiAgICBpZiAoIW1ldGFEYXRhVHlwZSkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaT0xOyBpPDQ7IGkrKylcbiAgICAgICAgbWF0Y2hbaV0gPSBiYXNlMzIuZGVjb2RlKG1hdGNoW2ldKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBDbGFzczogbWF0Y2hbMV0sXG4gICAgICAgIGNvbXBOYW1lOiBtYXRjaFsyXSxcbiAgICAgICAgcGFyYW1zOiBfLmZyb21RdWVyeVN0cmluZyhtYXRjaFszXSksXG4gICAgICAgIG1ldGFEYXRhVHlwZTogbWV0YURhdGFUeXBlLFxuICAgICAgICBtZXRhRGF0YTogXy5qc29uUGFyc2UodGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShtZXRhRGF0YVR5cGUpKSBcbiAgICAgICAgICAgICAgICAgICAgPyBfLmpzb25QYXJzZSh0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKG1ldGFEYXRhVHlwZSkpIFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEobWV0YURhdGFUeXBlKVxuICAgIH07XG59XG5cblxuLy8gYXMgZGVmaW5lZCBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RyYWdEcm9wL0RyYWdfT3BlcmF0aW9ucyNkcmFnc3RhcnRcbmZ1bmN0aW9uIERyYWdEcm9wJGdldEFsbG93ZWRFZmZlY3RzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldEFsbG93ZWRFZmZlY3RzKGVmZmVjdHMpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gZWZmZWN0cztcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXREcm9wRWZmZWN0KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldERyb3BFZmZlY3QoZWZmZWN0KSB7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IGVmZmVjdDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRpc0VmZmVjdEFsbG93ZWQoZWZmZWN0KSB7XG4gICAgdmFyIGFsbG93ZWRFZmZlY3RzID0gdGhpcy5nZXRBbGxvd2VkRWZmZWN0cygpXG4gICAgICAgICwgaXNDb3B5ID0gZWZmZWN0ID09ICdjb3B5J1xuICAgICAgICAsIGlzTW92ZSA9IGVmZmVjdCA9PSAnbW92ZSdcbiAgICAgICAgLCBpc0xpbmsgPSBlZmZlY3QgPT0gJ2xpbmsnXG4gICAgICAgICwgaXNBbGxvd2VkID0gaXNDb3B5IHx8IGlzTGluayB8fCBpc01vdmU7XG5cbiAgICBzd2l0Y2ggKGFsbG93ZWRFZmZlY3RzKSB7XG4gICAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZEVmZmVjdHMgPT0gZWZmZWN0O1xuICAgICAgICBjYXNlICdjb3B5TGluayc6XG4gICAgICAgICAgICByZXR1cm4gaXNDb3B5IHx8IGlzTGluaztcbiAgICAgICAgY2FzZSAnY29weU1vdmUnOlxuICAgICAgICAgICAgcmV0dXJuIGlzQ29weSB8fCBpc01vdmU7XG4gICAgICAgIGNhc2UgJ2xpbmtNb3ZlJzpcbiAgICAgICAgICAgIHJldHVybiBpc0xpbmsgfHwgaXNNb3ZlO1xuICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICBjYXNlICd1bmluaXRpYWxpemVkJzpcbiAgICAgICAgICAgIHJldHVybiBpc0FsbG93ZWQ7XG4gICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXREYXRhKGRhdGFUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEoZGF0YVR5cGUpO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldERhdGEoZGF0YVR5cGUsIGRhdGFTdHIpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBkYXRhU3RyKTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRjbGVhckRhdGEoZGF0YVR5cGUpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5jbGVhckRhdGEoZGF0YVR5cGUpO1xufVxuXG5cbi8qKlxuICogRHJhZyBkcm9wIHNlcnZpY2UgY29tcGVuc2F0aW5nIGZvciB0aGUgbGFjayBvZiBjb21tdW5pY2F0aW9uIGZyb20gZHJvcCB0YXJnZXQgdG8gZHJhZyBzb3VyY2UgaW4gRE9NIEFQSVxuICovXG52YXIgZHJhZ0Ryb3BTZXJ2aWNlID0gbmV3IE1lc3NlbmdlcjtcblxudmFyIF9jdXJyZW50RHJhZ0Ryb3AsIF9jdXJyZW50RHJhZ0ZhY2V0O1xuXG5fLmV4dGVuZChEcmFnRHJvcCwge1xuICAgIHNlcnZpY2U6IGRyYWdEcm9wU2VydmljZSxcbiAgICBkZXN0cm95OiBEcmFnRHJvcF9kZXN0cm95XG59KTtcblxuXG5kcmFnRHJvcFNlcnZpY2Uub25NZXNzYWdlcyh7XG4gICAgLy8gZGF0YSBpcyBEcmFnRHJvcERhdGFUcmFuc2ZlciBpbnN0YW5jZVxuICAgIC8vIGZpcmVkIGJ5IERyYWcgZmFjZXQgb24gXCJkcmFnc3RhcnRcIiBldmVudFxuICAgICdkcmFnZHJvcHN0YXJ0ZWQnOiBvbkRyYWdEcm9wU3RhcnRlZCwgXG4gICAgLy8gZGF0YSBpcyBvYmplY3Qgd2l0aCBhdCBsZWFzdCBkcm9wRWZmZWN0IHByb3BlcnR5XG4gICAgLy8gZmlyZWQgYnkgRHJvcCBmYWNldCBvbiBcImRyb3BcIiBldmVudFxuICAgICdkcmFnZHJvcGNvbXBsZXRlZCc6IG9uRHJhZ0Ryb3BDb21wbGV0ZWQsIFxuICAgIC8vIGZpcmVkIGJ5IERyYWcgZmFjZXQgb24gXCJkcmFnZW5kXCIgZXZlbnQgdG8gY29tcGxldGUgZHJhZ1xuICAgIC8vIGlmIGRyb3AgaGFwcGVuZGVkIGluIGFub3RoZXIgd2luZG93IG9yIGlmIGl0IHdhcyBjYW5jZWxsZWRcbiAgICAnY29tcGxldGVkcmFnZHJvcCc6IG9uQ29tcGxldGVEcmFnRHJvcFxufSk7XG5cblxuXy5leHRlbmQoZHJhZ0Ryb3BTZXJ2aWNlLCB7XG4gICAgZ2V0Q3VycmVudERyYWdEcm9wOiBnZXRDdXJyZW50RHJhZ0Ryb3Bcbn0pO1xuXG5cbmZ1bmN0aW9uIG9uRHJhZ0Ryb3BTdGFydGVkKG1zZywgZGF0YSkge1xuICAgIF9jdXJyZW50RHJhZ0Ryb3AgPSBkYXRhLmRyYWdEcm9wO1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ID0gZGF0YS5kcmFnRmFjZXQ7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnRHJvcENvbXBsZXRlZChtc2csIGRhdGEpIHtcbiAgICBfY3VycmVudERyYWdGYWNldCAmJiBfY3VycmVudERyYWdGYWNldC5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wY29tcGxldGVkJywgZGF0YSk7XG4gICAgX2N1cnJlbnREcmFnRHJvcCA9IHVuZGVmaW5lZDtcbiAgICBfY3VycmVudERyYWdGYWNldCA9IHVuZGVmaW5lZDtcbn1cblxuXG5mdW5jdGlvbiBvbkNvbXBsZXRlRHJhZ0Ryb3AobXNnLCBkYXRhKSB7XG4gICAgaWYgKF9jdXJyZW50RHJhZ0Ryb3ApXG4gICAgICAgIGRyYWdEcm9wU2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wY29tcGxldGVkJywgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gZ2V0Q3VycmVudERyYWdEcm9wKCkge1xuICAgIHJldHVybiBfY3VycmVudERyYWdEcm9wO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wX2Rlc3Ryb3koKSB7XG4gICAgZHJhZ0Ryb3BTZXJ2aWNlLm9mZkFsbCgpO1xufVxuIiwiLy8gPGEgbmFtZT1cInV0aWxzLWVycm9yXCI+PC9hPlxuLy8gbWlsby51dGlscy5lcnJvclxuLy8gLS0tLS0tLS0tLS1cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8vIG1vZHVsZSBleHBvcnRzIGVycm9yIGNsYXNzZXMgZm9yIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoaXMgYXJyYXlcbnZhciBlcnJvckNsYXNzTmFtZXMgPSBbJ0Fic3RyYWN0Q2xhc3MnLCAnTWl4aW4nLCAnTWVzc2VuZ2VyJywgJ0NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICdBdHRyaWJ1dGUnLCAnQmluZGVyJywgJ0xvYWRlcicsICdNYWlsTWVzc2FnZVNvdXJjZScsICdGYWNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICdTY29wZScsICdNb2RlbCcsICdEb21GYWNldCcsICdFZGl0YWJsZUZhY2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0xpc3QnLCAnQ29ubmVjdG9yJywgJ1JlZ2lzdHJ5JywgJ0ZyYW1lTWVzc2FnZVNvdXJjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICdEcm9wJywgJ0FuZ3VsYXInLCAnU3RvcmFnZU1lc3NhZ2VTb3VyY2UnXTtcblxudmFyIGVycm9yID0ge1xuICAgIHRvQmVJbXBsZW1lbnRlZDogZXJyb3IkdG9CZUltcGxlbWVudGVkLFxuICAgIGNyZWF0ZUNsYXNzOiBlcnJvciRjcmVhdGVDbGFzc1xufTtcblxuZXJyb3JDbGFzc05hbWVzLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgIGVycm9yW25hbWVdID0gZXJyb3IkY3JlYXRlQ2xhc3MobmFtZSArICdFcnJvcicpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXJyb3I7XG5cblxuZnVuY3Rpb24gZXJyb3IkY3JlYXRlQ2xhc3MoZXJyb3JDbGFzc05hbWUpIHtcbiAgICB2YXIgRXJyb3JDbGFzcyA9IF8ubWFrZUZ1bmN0aW9uKGVycm9yQ2xhc3NOYW1lLCAnbWVzc2FnZScsXG4gICAgICAgICAgICAndGhpcy5uYW1lID0gXCInICsgZXJyb3JDbGFzc05hbWUgKyAnXCI7IFxcXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwiVGhlcmUgd2FzIGFuICBlcnJvclwiOycpO1xuICAgIF8ubWFrZVN1YmNsYXNzKEVycm9yQ2xhc3MsIEVycm9yKTtcblxuICAgIHJldHVybiBFcnJvckNsYXNzO1xufVxuXG5cbmZ1bmN0aW9uIGVycm9yJHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3IuQWJzdHJhY3RDbGFzcygnY2FsbGluZyB0aGUgbWV0aG9kIG9mIGFuIGFic2N0cmFjdCBjbGFzcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2NfY2xhc3MnKVxuICAgICwgQmluZEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4uL2F0dHJpYnV0ZXMvYV9iaW5kJylcbiAgICAsIGJpbmRlciA9IHJlcXVpcmUoJy4uL2JpbmRlcicpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4vZG9tJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgY3JlYXRlUmFuZ2VQYXRocyA9IF9jcmVhdGVOb2Rlc0FuZFBhdGhzRnVuYyhkb21VdGlscy50cmVlUGF0aE9mKTtcbnZhciBjcmVhdGVSYW5nZU5vZGVzID0gX2NyZWF0ZU5vZGVzQW5kUGF0aHNGdW5jKGRvbVV0aWxzLmdldE5vZGVBdFRyZWVQYXRoKTtcblxuXG52YXIgZnJhZ21lbnRVdGlscyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldFN0YXRlOiBmcmFnbWVudF9nZXRTdGF0ZSxcbiAgICBnZXRTdGF0ZUFzeW5jOiBmcmFnbWVudF9nZXRTdGF0ZUFzeW5jLFxuXG4gICAgZXhwYW5kUmFuZ2VUb1NpYmxpbmdzOiBleHBhbmRSYW5nZVRvU2libGluZ3MsXG4gICAgZ2V0UmFuZ2VTaWJsaW5nczogZ2V0UmFuZ2VTaWJsaW5ncyxcbiAgICBjcmVhdGVSYW5nZUZyb21TaWJsaW5nczogY3JlYXRlUmFuZ2VGcm9tU2libGluZ3MsXG4gICAgY3JlYXRlUmFuZ2VGcm9tTm9kZXM6IGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzLCAvLyBhbGlhc1xuICAgIGNyZWF0ZVJhbmdlUGF0aHM6IGNyZWF0ZVJhbmdlUGF0aHMsXG4gICAgY3JlYXRlUmFuZ2VOb2RlczogY3JlYXRlUmFuZ2VOb2Rlc1xufTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHN0YXRlIG9mIHdyYXBwZWQgcmFuZ2Ugd2l0aCBjb21wb25lbnRzLCBpbmNsdWRpbmcgcGFydGlhbGx5IHNlbGVjdGVkLiBUaGUgcmFuZ2Ugd2lsbCBiZSBjbG9uZWQgYW5kIHdyYXBwZWQgaW4gY29tcG9uZW50IHdpdGggY29udGFpbmVyIGZhY2V0IGJlZm9yZSBnZXR0aW5nIGl0cyBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2cgZXJyb3IgYW5kIHJldHVybiB1bmRlZmluZWQgaWYgcmFuZ2UgaGFzIG5vIGNvbW1vbiBhbmNlc3RvciB0aGF0IGhhcyBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXRcbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2UgRE9NIFJhbmdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUNoaWxkcmVuIG9wdGlvbmFsIHBhcmFtZXRlciwgYHRydWVgIHRvIHJlbmFtZSBmcmFnbWVudCBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gd3JhcHBlckNsYXNzTmFtZSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gd3JhcCBpbiBhIGN1c3RvbSBjb21wb25lbnQgY2xhc3NcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZnJhZ21lbnRfZ2V0U3RhdGUocmFuZ2UsIHJlbmFtZUNoaWxkcmVuLCB3cmFwcGVyQ2xhc3NOYW1lKSB7XG4gICAgdmFyIHJhbmdlQ29udGFpbmVyID0gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKTtcbiAgICBpZiAoISByYW5nZUNvbnRhaW5lcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiByYW5nZSBoYXMgbm8gY29tbW9uIGNvbnRhaW5lcicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGZyYWcgPSByYW5nZS5jbG9uZUNvbnRlbnRzKClcbiAgICAgICAgLCB3cmFwcGVyID0gX3dyYXBGcmFnbWVudEluQ29udGFpbmVyKGZyYWcsIHdyYXBwZXJDbGFzc05hbWUpO1xuXG4gICAgX3RyYW5zZmVyU3RhdGVzKHJhbmdlQ29udGFpbmVyLCB3cmFwcGVyKTtcbiAgICBpZiAocmVuYW1lQ2hpbGRyZW4pIF9yZW5hbWVDaGlsZHJlbih3cmFwcGVyKTtcbiAgICB2YXIgd3JhcHBlclN0YXRlID0gd3JhcHBlci5nZXRTdGF0ZSgpO1xuICAgIF8uZGVmZXJNZXRob2Qod3JhcHBlciwgJ2Rlc3Ryb3knKTtcbiAgICByZXR1cm4gd3JhcHBlclN0YXRlO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgb2Ygd3JhcHBlZCByYW5nZSB3aXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZyBwYXJ0aWFsbHkgc2VsZWN0ZWQuIFRoZSByYW5nZSB3aWxsIGJlIGNsb25lZCBhbmQgd3JhcHBlZCBpbiBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXQgYmVmb3JlIGdldHRpbmcgaXRzIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiByZXN1bHQgYW5kIGFueSBlcnJvciB2aWEgY2FsbGJhY2suXG4gKiBcbiAqIEBwYXJhbSB7UmFuZ2V9IHJhbmdlIERPTSBSYW5nZSBpbnN0YW5jZVxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBvcHRpb25hbCBwYXJhbWV0ZXIsIGB0cnVlYCB0byByZW5hbWUgZnJhZ21lbnQgY2hpbGQgY29tcG9uZW50c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYWx3YXlzIHRoZSBsYXN0IHBhcmFtZXRlciwgb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gYmUgZHJvcHBlZDsgcmVzdWx0IGlzIHBhc3NlZCB2aWEgY2FsbGJhY2sgd2l0aCBhbnkgZXJyb3IgYXMgZmlyc3QgcGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIGZyYWdtZW50X2dldFN0YXRlQXN5bmMocmFuZ2UsIHJlbmFtZUNoaWxkcmVuLCBjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciByYW5nZUNvbnRhaW5lciA9IF9nZXRSYW5nZUNvbnRhaW5lcihyYW5nZSk7XG4gICAgICAgIGlmICghIHJhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiByYW5nZSBoYXMgbm8gY29tbW9uIGNvbnRhaW5lcicpKTtcbiAgICAgICAgICAgIHJldHVybjsgLy8gZG8gTk9UIGNvbm5lY3QgcmV0dXJuIHRvIHByZXZpb3VzIGNhbGxiYWNrLCBnZXRTdGF0ZSBzaG91bGQgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZW5hbWVDaGlsZHJlbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IHJlbmFtZUNoaWxkcmVuO1xuICAgICAgICAgICAgcmVuYW1lQ2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmcmFnID0gcmFuZ2UuY2xvbmVDb250ZW50cygpXG4gICAgICAgICAgICAsIHdyYXBwZXIgPSBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZyk7XG5cbiAgICAgICAgX3RyYW5zZmVyU3RhdGVzKHJhbmdlQ29udGFpbmVyLCB3cmFwcGVyKTtcbiAgICAgICAgXy5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHdyYXBwZXIuYnJvYWRjYXN0KCdzdGF0ZXJlYWR5Jyk7XG4gICAgICAgICAgICBfLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChyZW5hbWVDaGlsZHJlbikgX3JlbmFtZUNoaWxkcmVuKHdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHZhciB3cmFwcGVyU3RhdGUgPSB3cmFwcGVyLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgd3JhcHBlclN0YXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX3dyYXBGcmFnbWVudEluQ29udGFpbmVyKGZyYWcsIHdyYXBwZXJDbGFzc05hbWUpIHtcbiAgICB2YXIgd3JhcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgLCBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUod3JhcEVsKTtcblxuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiB3cmFwcGVyQ2xhc3NOYW1lIHx8ICdDb21wb25lbnQnLFxuICAgICAgICBjb21wRmFjZXRzOiB3cmFwcGVyQ2xhc3NOYW1lID8gW10gOiBbJ2NvbnRhaW5lciddLFxuICAgICAgICBjb21wTmFtZTogJ3dyYXBwZXInXG4gICAgfSk7XG5cbiAgICBhdHRyLmRlY29yYXRlKCk7XG5cbiAgICB3cmFwRWwuYXBwZW5kQ2hpbGQoZnJhZyk7XG4gICAgdmFyIHNjb3BlID0gYmluZGVyKHdyYXBFbCk7XG4gICAgcmV0dXJuIHNjb3BlLndyYXBwZXI7XG59XG5cblxuZnVuY3Rpb24gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKSB7XG4gICAgdmFyIGVsID0gZG9tVXRpbHMuY29udGFpbmluZ0VsZW1lbnQocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgdHJ1ZSwgJ2NvbnRhaW5lcicpO1xufVxuXG5cbmZ1bmN0aW9uIF90cmFuc2ZlclN0YXRlcyhmcm9tQ29tcCwgdG9Db21wKSB7XG4gICAgdmFyIGZyb21TY29wZSA9IGZyb21Db21wLmNvbnRhaW5lci5zY29wZTtcbiAgICB0b0NvbXAuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKHRvQ2hpbGRDb21wLCBuYW1lKSB7XG4gICAgICAgIHZhciBmcm9tQ2hpbGRDb21wID0gZnJvbVNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoISBmcm9tQ2hpbGRDb21wKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdmcmFnbWVudC5nZXRTdGF0ZTogY29ucG9uZW50JywgbmFtZSwgJ25vdCBmb3VuZCBpbiByYW5nZScpO1xuICAgICAgICB2YXIgc3RhdGUgPSBmcm9tQ2hpbGRDb21wLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICAgICAgdG9DaGlsZENvbXAuc2V0U3RhdGUoc3RhdGUpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW5hbWVDaGlsZHJlbihjb21wKSB7XG4gICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgY2hpbGQucmVuYW1lKCk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gZXhwYW5kUmFuZ2VUb1NpYmxpbmdzKHJhbmdlKSB7XG4gICAgdmFyIHNpYmxpbmdzID0gZ2V0UmFuZ2VTaWJsaW5ncyhyYW5nZSk7XG4gICAgcmFuZ2UgPSBjcmVhdGVSYW5nZUZyb21TaWJsaW5ncyhzaWJsaW5ncyk7XG4gICAgcmV0dXJuIHJhbmdlO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzKG5vZGVzKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBpZiAobm9kZXMuc2libGluZ3MpIHtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRCZWZvcmUobm9kZXMuc3RhcnQpO1xuICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihub2Rlcy5lbmQpO1xuICAgIH0gZWxzZVxuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKG5vZGVzLnN0YXJ0KTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5cblxuZnVuY3Rpb24gZ2V0UmFuZ2VTaWJsaW5ncyhyYW5nZSkge1xuICAgIHZhciBjb250YWluZXJOb2RlID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXJcbiAgICAgICAgLCBzdGFydE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lclxuICAgICAgICAsIGVuZE5vZGUgPSByYW5nZS5lbmRDb250YWluZXI7XG5cbiAgICBpZiAoc3RhcnROb2RlID09IGVuZE5vZGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPSBjb250YWluZXJOb2RlKSBsb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlbGVjdGlvbkNvbW1hbmQgbG9naWNhbCBlcnJvcjogc3RhcnQ9PWVuZCwgYnV0IGNvbnRhaW5lciBpcyBkaWZmZXJlbnQnKTtcbiAgICAgICAgcmV0dXJuIHsgc2libGluZ3M6IGZhbHNlLCBzdGFydDogc3RhcnROb2RlIH07XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0Tm9kZSA9PSBjb250YWluZXJOb2RlIHx8IGVuZE5vZGUgPT0gY29udGFpbmVyTm9kZSlcbiAgICAgICAgcmV0dXJuIHsgc2libGluZ3M6IGZhbHNlLCBzdGFydDogY29udGFpbmVyTm9kZSB9O1xuXG4gICAgdmFyIHN0YXJ0U2libGluZyA9IF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIHN0YXJ0Tm9kZSk7XG4gICAgdmFyIGVuZFNpYmxpbmcgPSBfZmluZENvbnRhaW5pbmdDaGlsZChjb250YWluZXJOb2RlLCBlbmROb2RlKTtcblxuICAgIGlmIChzdGFydFNpYmxpbmcgJiYgZW5kU2libGluZykge1xuICAgICAgICBpZiAoc3RhcnRTaWJsaW5nID09IGVuZFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignZGVsZXRlU2VsZWN0aW9uQ29tbWFuZCBsb2dpY2FsIGVycm9yOiBzYW1lIHNpYmxpbmdzJyk7XG4gICAgICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBzdGFydFNpYmxpbmcgfTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4geyBzaWJsaW5nczogdHJ1ZSwgc3RhcnQ6IHN0YXJ0U2libGluZywgZW5kOiBlbmRTaWJsaW5nIH07XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIHNlbE5vZGUpIHtcbiAgICByZXR1cm4gXy5maW5kKGNvbnRhaW5lck5vZGUuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jb250YWlucyhzZWxOb2RlKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTm9kZXNBbmRQYXRoc0Z1bmMoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbihyb290RWwsIGZyb21PYmopIHtcbiAgICAgICAgdmFyIHRvT2JqID0ge1xuICAgICAgICAgICAgc2libGluZ3M6IGZyb21PYmouc2libGluZ3MsXG4gICAgICAgICAgICBzdGFydDogZnVuYyhyb290RWwsIGZyb21PYmouc3RhcnQpXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0b09iai5zaWJsaW5ncylcbiAgICAgICAgICAgIHRvT2JqLmVuZCA9IGZ1bmMocm9vdEVsLCBmcm9tT2JqLmVuZCk7XG4gICAgICAgIHJldHVybiB0b09iajtcbiAgICB9O1xufVxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJyk7XG5cbi8qKlxuICogYG1pbG8udXRpbGBcbiAqL1xudmFyIHV0aWwgPSB7XG4gICAgbG9nZ2VyOiBtaWxvQ29yZS51dGlsLmxvZ2dlcixcbiAgICByZXF1ZXN0OiByZXF1aXJlKCcuL3JlcXVlc3QnKSxcbiAgICB3ZWJzb2NrZXQ6IHJlcXVpcmUoJy4vd2Vic29ja2V0JyksXG4gICAgY2hlY2s6IG1pbG9Db3JlLnV0aWwuY2hlY2ssXG4gICAgZXJyb3I6IHJlcXVpcmUoJy4vZXJyb3InKSwgLy8gZGVwcmVjYXRlZFxuICAgIGNvdW50OiByZXF1aXJlKCcuL2NvdW50JyksIC8vIGRlcHJlY2F0ZWRcbiAgICB1bmlxdWVJZDogcmVxdWlyZSgnLi9jb3VudCcpLFxuICAgIGNvbXBvbmVudE5hbWU6IHJlcXVpcmUoJy4vY29tcG9uZW50X25hbWUnKSxcbiAgICBkb206IHJlcXVpcmUoJy4vZG9tJyksXG4gICAgZG9tTGlzdGVuZXJzOiByZXF1aXJlKCcuL2RvbV9saXN0ZW5lcnMnKSxcbiAgICBzZWxlY3Rpb246IHJlcXVpcmUoJy4vc2VsZWN0aW9uJyksXG4gICAgZnJhZ21lbnQ6IHJlcXVpcmUoJy4vZnJhZ21lbnQnKSxcbiAgICBqc29uUGFyc2U6IHJlcXVpcmUoJy4vanNvbl9wYXJzZScpLCAvLyBkZXByZWNhdGVkXG4gICAgc3RvcmFnZTogcmVxdWlyZSgnLi9zdG9yYWdlJyksXG4gICAgZG9tUmVhZHk6IHJlcXVpcmUoJy4vZG9tcmVhZHknKSxcbiAgICBkcmFnRHJvcDogcmVxdWlyZSgnLi9kcmFnZHJvcCcpLFxuICAgIGRpYWxvZzogcmVxdWlyZSgnLi4vY29tcG9uZW50cy91aS9ib290c3RyYXAvRGlhbG9nJyksIC8vIGRlcHJlY2F0ZWQgLSBzaG91bGQgYmUgdXNlZCBmcm9tIHJlZ2lzdHJ5XG4gICAgYWxlcnQ6IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0JyksIC8vIGRlcHJlY2F0ZWQgLSBzaG91bGQgYmUgdXNlZCBmcm9tIHJlZ2lzdHJ5XG4gICAgZG9UOiBtaWxvQ29yZS51dGlsLmRvVCxcbiAgICBkZXN0cm95OiB1dGlsX2Rlc3Ryb3lcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdXRpbDtcblxuXG5mdW5jdGlvbiB1dGlsX2Rlc3Ryb3koKSB7XG4gICAgdXRpbC5yZXF1ZXN0LmRlc3Ryb3koKTtcbiAgICB1dGlsLmRyYWdEcm9wLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25QYXJzZTtcblxuXG4vKipcbiAqIGBtaWxvLnV0aWwuanNvblBhcnNlYFxuICogU2FmZSBKU09OLnBhcnNlLCByZXR1cm5zIHVuZGVmaW5lZCBpZiBKU09OLnBhcnNlIHRocm93cyBhbiBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIC0gSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0XG4gKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBqc29uUGFyc2Uoc3RyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbiAgICB9IGNhdGNoIChlKSB7fVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBtaWxvLnV0aWxzLnJlcXVlc3Rcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB3cmFwcGluZyBYTUxIVFRQUmVxdWVzdCBmdW5jdGlvbmFsaXR5LlxuXG4vLyBgYGBcbi8vIHZhciByZXF1ZXN0ID0gbWlsby51dGlscy5yZXF1ZXN0XG4vLyAgICAgLCBvcHRzOiB7IG1ldGhvZDogJ0dFVCcgfTtcblxuLy8gcmVxdWVzdCh1cmwsIG9wdHMsIGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuLy8gICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKTtcbi8vIH0pO1xuXG4vLyByZXF1ZXN0LmdldCh1cmwsIGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuLy8gICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKTtcbi8vIH0pO1xuLy8gYGBgXG5cbi8vIE9ubHkgZ2VuZXJpYyByZXF1ZXN0IGFuZCBnZXQsIGpzb24sIHBvc3QgY29udmVuaWVuY2UgbWV0aG9kcyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkLlxuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNvdW50ID0gcmVxdWlyZSgnLi9jb3VudCcpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlcjtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1ZXN0O1xuXG5cbnZhciBfcGVuZGluZ1JlcXVlc3RzID0gW107XG5cbnZhciBwcm9taXNlVGhlbiA9IGNyZWF0ZVByb21pc2VPdmVycmlkZSgndGhlbicpO1xudmFyIHByb21pc2VDYXRjaCA9IGNyZWF0ZVByb21pc2VPdmVycmlkZSgnY2F0Y2gnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBvdmVycmlkZSBzdGFuZGFyZCBwcm9taXNlIGJlaGF2aW91ciBhbmQgYWxsb3cgcHJvbWlzZSBpbnN0YW5jZXMgXG4gKiBjcmVhdGVkIHRvIG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0IG9iamVjdCBubyBtYXR0ZXIgaWYgLnRoZW4oKSBvciAuY2F0Y2goKSBpcyBjYWxsZWQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb21pc2VPdmVycmlkZShmdW5jdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5wcm90b3R5cGVbZnVuY3Rpb25OYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBrZWVwUmVxdWVzdE9iamVjdChwcm9taXNlLCB0aGlzLl9yZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QodXJsLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIG9wdHMudXJsID0gdXJsO1xuICAgIG9wdHMuY29udGVudFR5cGUgPSBvcHRzLmNvbnRlbnRUeXBlIHx8ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnO1xuICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlU3luYygncmVxdWVzdCcsIHsgb3B0aW9uczogb3B0cyB9KTtcblxuICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXEub3BlbihvcHRzLm1ldGhvZCwgb3B0cy51cmwsIHRydWUpO1xuICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBvcHRzLmNvbnRlbnRUeXBlKTtcbiAgICBzZXRSZXF1ZXN0SGVhZGVycyhyZXEsIG9wdHMuaGVhZGVycyk7XG5cbiAgICByZXEudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBjb25maWcucmVxdWVzdC5kZWZhdWx0cy50aW1lb3V0O1xuICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSByZXEub250aW1lb3V0ID0gcmVxLm9uYWJvcnQgPSBvblJlYWR5O1xuXG4gICAgdmFyIHhQcm9taXNlID0gX2NyZWF0ZVhQcm9taXNlKHJlcSk7XG5cbiAgICByZXEuc2VuZChKU09OLnN0cmluZ2lmeShvcHRzLmRhdGEpKTtcbiAgICByZXFbY29uZmlnLnJlcXVlc3Qub3B0aW9uc0tleV0gPSBvcHRzO1xuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHJlcSk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIG9uUmVhZHkoZSkge1xuICAgICAgICBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZS50eXBlKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2NyZWF0ZVhQcm9taXNlKHJlcXVlc3QpIHtcbiAgICB2YXIgcmVzb2x2ZVByb21pc2UsIHJlamVjdFByb21pc2U7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICByZWplY3RQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAga2VlcFJlcXVlc3RPYmplY3QocHJvbWlzZSwgcmVxdWVzdCk7XG4gICAgcHJvbWlzZS5jYXRjaChfLm5vb3ApOyAvLyBTb21ldGltZXMgZXJyb3JzIGFyZSBoYW5kbGVkIHdpdGhpbiBjYWxsYmFja3MsIHNvIHVuY2F1Z2h0IHByb21pc2UgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgc3VwcHJlc3NlZC5cblxuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IHByb21pc2UsXG4gICAgICAgIHJlc29sdmU6IHJlc29sdmVQcm9taXNlLFxuICAgICAgICByZWplY3Q6IHJlamVjdFByb21pc2VcbiAgICB9XG59XG5cbi8vIEVuc3VyZXMgdGhhdCB0aGUgcHJvbWlzZSAoYW5kIGFueSBwcm9taXNlcyBjcmVhdGVkIHdoZW4gY2FsbGluZyAudGhlbi8uY2F0Y2gpIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcmVxdWVzdCBvYmplY3RcbmZ1bmN0aW9uIGtlZXBSZXF1ZXN0T2JqZWN0KHByb21pc2UsIHJlcXVlc3QpIHtcbiAgICBwcm9taXNlLl9yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICBwcm9taXNlLnRoZW4gPSBwcm9taXNlVGhlbjtcbiAgICBwcm9taXNlLmNhdGNoID0gcHJvbWlzZUNhdGNoO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cblxuZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBoZWFkZXJzKSB7XG4gICAgaWYgKGhlYWRlcnMpXG4gICAgICAgIF8uZWFjaEtleShoZWFkZXJzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9vblJlYWR5KHJlcSwgY2FsbGJhY2ssIHhQcm9taXNlLCBldmVudFR5cGUpIHtcbiAgICBpZiAocmVxLnJlYWR5U3RhdGUgIT0gNCkgcmV0dXJuO1xuICAgIGlmICghcmVxLnN0YXR1cyAmJiBldmVudFR5cGUgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnKSByZXR1cm47XG5cbiAgICBfLnNwbGljZUl0ZW0oX3BlbmRpbmdSZXF1ZXN0cywgcmVxKTtcblxuICAgIHZhciBlcnJvcjtcbiAgICB0cnkge1xuICAgICAgICBpZiAoIHJlcS5zdGF0dXMgPj0gMjAwICYmIHJlcS5zdGF0dXMgPCA0MDAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdzdWNjZXNzJyk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbCwgcmVxLnJlc3BvbnNlVGV4dCwgcmVxKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZSkgeyBlcnJvciA9IGU7IH1cbiAgICAgICAgICAgIHhQcm9taXNlLnJlc29sdmUocmVxLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JSZWFzb24gPSByZXEuc3RhdHVzIHx8IGV2ZW50VHlwZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ2Vycm9yJyArIGVycm9yUmVhc29uKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhlcnJvclJlYXNvbiwgcmVxLnJlc3BvbnNlVGV4dCwgcmVxKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZSkgeyBlcnJvciA9IGU7IH1cbiAgICAgICAgICAgIHhQcm9taXNlLnJlamVjdCh7IHJlYXNvbjogZXJyb3JSZWFzb24sIHJlc3BvbnNlOiByZXEucmVzcG9uc2VUZXh0IH0pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGVycm9yID0gZXJyb3IgfHwgZTtcbiAgICB9XG5cbiAgICAvLyBub3QgcmVtb3Zpbmcgc3Vic2NyaXB0aW9uIGNyZWF0ZXMgbWVtb3J5IGxlYWssIGRlbGV0aW5nIHByb3BlcnR5IHdvdWxkIG5vdCByZW1vdmUgc3Vic2NyaXB0aW9uXG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlcS5vbnRpbWVvdXQgPSByZXEub25hYm9ydCA9IHVuZGVmaW5lZDtcblxuICAgIGlmICghX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpXG4gICAgICAgIHBvc3RNZXNzYWdlKCdyZXF1ZXN0c2NvbXBsZXRlZCcpO1xuXG4gICAgaWYgKGVycm9yKSB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VwdGlvbjogJyArIGVycm9yKTtcblxuICAgIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1zZykge1xuICAgICAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZShtc2csXG4gICAgICAgICAgICB7IHN0YXR1czogc3RhdHVzLCByZXNwb25zZTogcmVxLnJlc3BvbnNlVGV4dCB9KTtcbiAgICB9XG59XG5cblxuXy5leHRlbmQocmVxdWVzdCwge1xuICAgIGdldDogcmVxdWVzdCRnZXQsXG4gICAgcG9zdDogcmVxdWVzdCRwb3N0LFxuICAgIGpzb246IHJlcXVlc3QkanNvbixcbiAgICBqc29ucDogcmVxdWVzdCRqc29ucCxcbiAgICBmaWxlOiByZXF1ZXN0JGZpbGUsXG4gICAgdXNlTWVzc2VuZ2VyOiByZXF1ZXN0JHVzZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiByZXF1ZXN0JGRlc3Ryb3ksXG4gICAgd2hlblJlcXVlc3RzQ29tcGxldGVkOiB3aGVuUmVxdWVzdHNDb21wbGV0ZWRcbn0pO1xuXG5cbnZhciBfbWVzc2VuZ2VyO1xuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkdXNlTWVzc2VuZ2VyKCkge1xuICAgIF9tZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHJlcXVlc3QsIFsnb24nLCAnb25jZScsICdvblN5bmMnLCAnb2ZmJywgJ29uTWVzc2FnZXMnLCAnb2ZmTWVzc2FnZXMnLCAncG9zdE1lc3NhZ2UnLCAncG9zdE1lc3NhZ2VTeW5jJ10pO1xufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkZ2V0KHVybCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAnR0VUJyB9LCBjYWxsYmFjayk7XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRwb3N0KHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGRhdGE6IGRhdGEgfSwgY2FsbGJhY2spO1xufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkanNvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHByb21pc2UgPSByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdHRVQnIH0pO1xuXG4gICAgdmFyIGpzb25Qcm9taXNlID0gcHJvbWlzZS50aGVuKEpTT04ucGFyc2UpO1xuXG4gICAgaWYgKGNhbGxiYWNrKVxuICAgICAgICBqc29uUHJvbWlzZVxuICAgICAgICAudGhlbihmdW5jdGlvbihkYXRhKSB7IGNhbGxiYWNrKG51bGwsIGRhdGEpOyB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyRGF0YSkgeyBjYWxsYmFjayhlcnJEYXRhLnJlYXNvbiwgZXJyRGF0YS5yZXNwb25zZSk7IH0pO1xuXG4gICAgcmV0dXJuIGpzb25Qcm9taXNlO1xufVxuXG5cbnZhciBqc29ucE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcsIGpzb25wOiB0cnVlIH07XG5mdW5jdGlvbiByZXF1ZXN0JGpzb25wKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksXG4gICAgICAgIHhQcm9taXNlID0gX2NyZWF0ZVhQcm9taXNlKHNjcmlwdCksXG4gICAgICAgIGhlYWQgPSB3aW5kb3cuZG9jdW1lbnQuaGVhZCxcbiAgICAgICAgdW5pcXVlQ2FsbGJhY2sgPSBjb25maWcucmVxdWVzdC5qc29ucENhbGxiYWNrUHJlZml4ICsgY291bnQoKTtcblxuICAgIHZhciBvcHRzID0gXy5leHRlbmQoeyB1cmw6IHVybCB9LCBqc29ucE9wdGlvbnMpO1xuICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlU3luYygncmVxdWVzdCcsIHsgb3B0aW9uczogb3B0cyB9KTtcblxuICAgIGlmICghIF8uaXNFcXVhbChfLm9taXRLZXlzKG9wdHMsICd1cmwnKSwganNvbnBPcHRpb25zKSlcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yZWQgbm90IGFsbG93ZWQgcmVxdWVzdCBvcHRpb25zIGNoYW5nZSBpbiBKU09OUCByZXF1ZXN0IC0gb25seSBVUkwgY2FuIGJlIGNoYW5nZWQnKTtcblxuICAgIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignTm8gSlNPTlAgcmVzcG9uc2Ugb3Igbm8gY2FsbGJhY2sgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgX29uUmVzdWx0KGVycik7XG4gICAgfSwgY29uZmlnLnJlcXVlc3QuanNvbnBUaW1lb3V0KTtcblxuICAgIHdpbmRvd1t1bmlxdWVDYWxsYmFja10gPSBfLnBhcnRpYWwoX29uUmVzdWx0LCBudWxsKTtcblxuICAgIF9wZW5kaW5nUmVxdWVzdHMucHVzaCh3aW5kb3dbdW5pcXVlQ2FsbGJhY2tdKTtcblxuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgc2NyaXB0LnNyYyA9IG9wdHMudXJsICsgKG9wdHMudXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJykgKyAnY2FsbGJhY2s9JyArIHVuaXF1ZUNhbGxiYWNrO1xuXG4gICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgcmV0dXJuIHhQcm9taXNlLnByb21pc2U7XG5cblxuICAgIGZ1bmN0aW9uIF9vblJlc3VsdChlcnIsIHJlc3VsdCkge1xuICAgICAgICBfLnNwbGljZUl0ZW0oX3BlbmRpbmdSZXF1ZXN0cywgd2luZG93W3VuaXF1ZUNhbGxiYWNrXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZShlcnIgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLCBlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBKU09OUCByZXNwb25zZSBvciB0aW1lb3V0Jyk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ2Vycm9yanNvbnB0aW1lb3V0JywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7IHZhciBlcnJvciA9IGU7IH1cbiAgICAgICAgaWYgKGVycikgeFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgIGVsc2UgeFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgaWYgKCFfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdyZXF1ZXN0c2NvbXBsZXRlZCcpO1xuXG4gICAgICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjbGVhblVwKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgZGVsZXRlIHdpbmRvd1t1bmlxdWVDYWxsYmFja107XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBwb3N0TWVzc2FnZShtc2csIHN0YXR1cywgcmVzdWx0KSB7XG4gICAgICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlKG1zZyxcbiAgICAgICAgICAgIHsgc3RhdHVzOiBzdGF0dXMsIHJlc3BvbnNlOiByZXN1bHQgfSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkZmlsZShvcHRzLCBmaWxlRGF0YSwgY2FsbGJhY2ssIHByb2dyZXNzKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRzID09ICdzdHJpbmcnKVxuICAgICAgICBvcHRzID0geyBtZXRob2Q6ICdQT1NUJywgdXJsOiBvcHRzIH07XG5cbiAgICBvcHRzLm1ldGhvZCA9IG9wdHMubWV0aG9kIHx8ICdQT1NUJztcbiAgICBvcHRzLmZpbGUgPSB0cnVlO1xuXG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmIChwcm9ncmVzcykgcmVxLnVwbG9hZC5vbnByb2dyZXNzID0gcHJvZ3Jlc3M7XG5cbiAgICByZXEub3BlbihvcHRzLm1ldGhvZCwgb3B0cy51cmwsIHRydWUpO1xuICAgIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgb3B0cy5oZWFkZXJzKTtcblxuICAgIHJlcS50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IGNvbmZpZy5yZXF1ZXN0LmRlZmF1bHRzLnRpbWVvdXQ7XG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlcS5vbnRpbWVvdXQgPSByZXEub25hYm9ydCA9IG9uUmVhZHk7XG5cbiAgICB2YXIgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2UocmVxKTtcblxuICAgIGlmIChvcHRzLmJpbmFyeSlcbiAgICAgICAgcmVxLnNlbmQoZmlsZURhdGEpO1xuICAgIGVsc2Uge1xuICAgICAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZURhdGEpO1xuICAgICAgICByZXEuc2VuZChmb3JtRGF0YSk7XG4gICAgfVxuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHJlcSk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIG9uUmVhZHkoZSkge1xuICAgICAgICBpZiAocHJvZ3Jlc3MpIHJlcS51cGxvYWQub25wcm9ncmVzcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGUudHlwZSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkZGVzdHJveSgpIHtcbiAgICBpZiAoX21lc3NlbmdlcikgX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgcmVxdWVzdC5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiB3aGVuUmVxdWVzdHNDb21wbGV0ZWQoY2FsbGJhY2ssIHRpbWVvdXQpIHtcbiAgICBjYWxsYmFjayA9IF8ub25jZShjYWxsYmFjayk7XG4gICAgaWYgKHRpbWVvdXQpXG4gICAgICAgIF8uZGVsYXkoY2FsbGJhY2ssIHRpbWVvdXQsICd0aW1lb3V0Jyk7XG5cbiAgICBpZiAoX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpXG4gICAgICAgIF9tZXNzZW5nZXIub25jZSgncmVxdWVzdHNjb21wbGV0ZWQnLCBjYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyKGNhbGxiYWNrKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi9kb20nKVxuICAgICwgY29udGFpbmluZ0VsZW1lbnQgPSBkb21VdGlscy5jb250YWluaW5nRWxlbWVudFxuICAgICwgc2V0Q2FyZXRQb3NpdGlvbiA9IGRvbVV0aWxzLnNldENhcmV0UG9zaXRpb25cbiAgICAsIGdldENvbXBvbmVudHNGcm9tUmFuZ2UgPSBkb21VdGlscy5nZXRDb21wb25lbnRzRnJvbVJhbmdlXG4gICAgLCBkZWxldGVSYW5nZVdpdGhDb21wb25lbnRzID0gZG9tVXRpbHMuZGVsZXRlUmFuZ2VXaXRoQ29tcG9uZW50c1xuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cbm1vZHVsZS5leHBvcnRzID0gVGV4dFNlbGVjdGlvbjtcblxuXG4vKipcbiAqIFRleHQgc2VsZWN0aW9uIGNsYXNzLlxuICogU2VydmVzIGFzIGEgaGVscGVyIHRvIG1hbmFnZSBjdXJyZW50IHNlbGVjdGlvblxuICogVGhlIG9iamVjdCBjYW5ub3QgYmUgcmV1c2VkLCBpZiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMgc29tZSBvZiBpdHMgcHJvcGVydGllcyBtYXkgY29udGFpbiBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHByZXZpb3VzIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSB7V2luZG93fSB3aW4gd2luZG93IGluIHdoaWNoIHRleHQgc2VsZWN0aW9uIGlzIHByb2Nlc3NlZFxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uKHdpbikge1xuICAgIGlmICghIHRoaXMgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKVxuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24od2luKTtcbiAgICB0aGlzLndpbmRvdyA9IHdpbiB8fCB3aW5kb3c7XG4gICAgdGhpcy5pbml0KCk7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gc3RhcnQgZWxlbWVudFxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kc3RhcnRFbGVtZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRFbGVtZW50LCAnX3N0YXJ0RWxlbWVudCcsICdzdGFydENvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2VsZWN0aW9uIGVuZCBlbGVtZW50XG4gKlxuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRlbmRFbGVtZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRFbGVtZW50LCAnX2VuZEVsZW1lbnQnLCAnZW5kQ29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdFbGVtZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRFbGVtZW50LCAnX2NvbnRhaW5pbmdFbGVtZW50JywgJ2NvbW1vbkFuY2VzdG9yQ29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gc3RhcnQgQ29tcG9uZW50XG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRzdGFydENvbXBvbmVudCA9IFxuICAgIF8ucGFydGlhbChfZ2V0Q29tcG9uZW50LCAnX3N0YXJ0Q29tcG9uZW50JywgJ3N0YXJ0RWxlbWVudCcpO1xuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2VsZWN0aW9uIGVuZCBDb21wb25lbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGVuZENvbXBvbmVudCA9IFxuICAgIF8ucGFydGlhbChfZ2V0Q29tcG9uZW50LCAnX2VuZENvbXBvbmVudCcsICdlbmRFbGVtZW50Jyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIENvbXBvbmVudFxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kY29udGFpbmluZ0NvbXBvbmVudCA9IFxuICAgIF8ucGFydGlhbChfZ2V0Q29tcG9uZW50LCAnX2NvbnRhaW5pbmdDb21wb25lbnQnLCAnY29udGFpbmluZ0VsZW1lbnQnKTtcblxuXG5fLmV4dGVuZFByb3RvKFRleHRTZWxlY3Rpb24sIHtcbiAgICBpbml0OiBUZXh0U2VsZWN0aW9uJGluaXQsXG4gICAgdGV4dDogVGV4dFNlbGVjdGlvbiR0ZXh0LFxuICAgIHRleHROb2RlczogVGV4dFNlbGVjdGlvbiR0ZXh0Tm9kZXMsXG4gICAgY2xlYXI6IFRleHRTZWxlY3Rpb24kY2xlYXIsXG5cbiAgICBzdGFydEVsZW1lbnQ6IFRleHRTZWxlY3Rpb24kc3RhcnRFbGVtZW50LFxuICAgIGVuZEVsZW1lbnQ6IFRleHRTZWxlY3Rpb24kZW5kRWxlbWVudCxcbiAgICBjb250YWluaW5nRWxlbWVudDogVGV4dFNlbGVjdGlvbiRjb250YWluaW5nRWxlbWVudCxcblxuICAgIHN0YXJ0Q29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJHN0YXJ0Q29tcG9uZW50LFxuICAgIGVuZENvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRlbmRDb21wb25lbnQsXG4gICAgY29udGFpbmluZ0NvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRjb250YWluaW5nQ29tcG9uZW50LFxuXG4gICAgY29udGFpbmVkQ29tcG9uZW50czogVGV4dFNlbGVjdGlvbiRjb250YWluZWRDb21wb25lbnRzLFxuICAgIGVhY2hDb250YWluZWRDb21wb25lbnQ6IFRleHRTZWxlY3Rpb24kZWFjaENvbnRhaW5lZENvbXBvbmVudCxcbiAgICBkZWw6IFRleHRTZWxlY3Rpb24kZGVsLFxuICAgIF9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQ6IF9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQsXG4gICAgX3NlbGVjdEFmdGVyRGVsZXRlOiBfc2VsZWN0QWZ0ZXJEZWxldGUsXG5cbiAgICBnZXRSYW5nZTogVGV4dFNlbGVjdGlvbiRnZXRSYW5nZSxcbiAgICBnZXRTdGF0ZTogVGV4dFNlbGVjdGlvbiRnZXRTdGF0ZSxcbiAgICBnZXROb3JtYWxpemVkUmFuZ2U6IFRleHRTZWxlY3Rpb24kJGdldE5vcm1hbGl6ZWRSYW5nZSxcbiAgICBnZXREaXJlY3Rpb246IFRleHRTZWxlY3Rpb24kJGdldERpcmVjdGlvblxufSk7XG5cblxuXy5leHRlbmQoVGV4dFNlbGVjdGlvbiwge1xuICAgIGNyZWF0ZUZyb21SYW5nZTogVGV4dFNlbGVjdGlvbiQkY3JlYXRlRnJvbVJhbmdlLFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogVGV4dFNlbGVjdGlvbiQkY3JlYXRlRnJvbVN0YXRlLFxuICAgIGNyZWF0ZVN0YXRlT2JqZWN0OiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVTdGF0ZU9iamVjdFxufSk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGl6ZXMgVGV4dFNlbGVjdGlvbiBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLndpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24ucmFuZ2VDb3VudClcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IHRoaXMuc2VsZWN0aW9uLmlzQ29sbGFwc2VkO1xufVxuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHJpZXZlcyBhbmQgcmV0dXJucyBzZWxlY3Rpb24gdGV4dFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiR0ZXh0KCkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoISB0aGlzLl90ZXh0KVxuICAgICAgICB0aGlzLl90ZXh0ID0gdGhpcy5yYW5nZS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHNlbGVjdGlvbiB0ZXh0IG5vZGVzXG4gKlxuICogQHJldHVybiB7QXJyYXlbTm9kZV19XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kdGV4dE5vZGVzKCkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoISB0aGlzLl90ZXh0Tm9kZXMpXG4gICAgICAgIHRoaXMuX3RleHROb2RlcyA9IF9nZXRUZXh0Tm9kZXMuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fdGV4dE5vZGVzO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kY2xlYXIoKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGV4dCBhbmQgdGV4dCBub2RlcyBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqL1xuZnVuY3Rpb24gX2dldFRleHROb2RlcygpIHtcbiAgICAvLyBsaXN0IG9mIHNlbGVjdGVkIHRleHQgbm9kZXNcbiAgICB2YXIgdGV4dE5vZGVzID0gW107XG5cbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZClcbiAgICAgICAgcmV0dXJuIHRleHROb2RlcztcblxuICAgIC8vIGNyZWF0ZSBUcmVlV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSB0cmVlIHRvIHNlbGVjdCBhbGwgdGV4dCBub2Rlc1xuICAgIHZhciBzZWxTdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnRDb250YWluZXJcbiAgICAgICAgLCBzZWxFbmQgPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lclxuICAgICAgICAsIHJhbmdlQ29udGFpbmVyID0gdGhpcy5yYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgIHZhciB0cmVlV2Fsa2VyID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihyYW5nZUNvbnRhaW5lciwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgIHZhciBub2RlID0gdHJlZVdhbGtlci5jdXJyZW50Tm9kZSA9IHNlbFN0YXJ0O1xuXG4gICAgLy8gdHJhdmVyc2UgRE9NIHRyZWUgdG8gY29sbGVjdCBhbGwgc2VsZWN0ZWQgdGV4dCBub2Rlc1xuICAgIHdoaWxlIChub2RlICYmICghIGluRW5kIHx8IHNlbEVuZC5jb250YWlucyhub2RlKSkpIHtcbiAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBpbkVuZCA9IGluRW5kIHx8IHNlbEVuZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgbm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHROb2Rlcztcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyBhbmQgcmV0dXJucyBzdGFydC9lbmQgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gX2dldEVsZW1lbnQodGhpc1Byb3BOYW1lLCByYW5nZVByb3BOYW1lKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgdGhpc1t0aGlzUHJvcE5hbWVdID09ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzW3RoaXNQcm9wTmFtZV0gPSBjb250YWluaW5nRWxlbWVudCh0aGlzLnJhbmdlW3JhbmdlUHJvcE5hbWVdKTtcbiAgICByZXR1cm4gdGhpc1t0aGlzUHJvcE5hbWVdO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHN0YXJ0L2VuZCBjb21wb25lbnQgZnJvbSBzZWxlY3Rpb24gc2F2aW5nIHRoZW0gb24gcHJvcGVydGllcyBvZiBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtUZXh0U2VsZWN0aW9ufSB0aGlzXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIF9nZXRDb21wb25lbnQodGhpc1Byb3BOYW1lLCBlbE1ldGhvZE5hbWUpIHtcbiAgICBpZiAoISB0aGlzLnJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzW3RoaXNQcm9wTmFtZV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXNbdGhpc1Byb3BOYW1lXSA9IENvbXBvbmVudC5nZXRDb250YWluaW5nQ29tcG9uZW50KHRoaXNbZWxNZXRob2ROYW1lXSgpKTtcbiAgICByZXR1cm4gdGhpc1t0aGlzUHJvcE5hbWVdO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kY29udGFpbmVkQ29tcG9uZW50cygpIHtcbiAgICBpZiAodGhpcy5fY29udGFpbmVkQ29tcG9uZW50cylcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lZENvbXBvbmVudHM7XG5cbiAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMuX2NvbnRhaW5lZENvbXBvbmVudHMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8ICEgdGhpcy5yYW5nZSkgcmV0dXJuIGNvbXBvbmVudHM7XG5cbiAgICByZXR1cm4gZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSh0aGlzLnJhbmdlKTtcbn1cblxuXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGVhY2hDb250YWluZWRDb21wb25lbnQoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCAhIHRoaXMucmFuZ2UpIHJldHVybjtcblxuICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5jb250YWluZWRDb21wb25lbnRzKCk7XG5cbiAgICBjb21wb25lbnRzLmZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpO1xufVxuXG5cbi8qKlxuICogVGV4dFNlbGVjdGlvbiBpbnN0YW5jZSBtZXRob2RcbiAqIERlbGV0ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBhbGwgY29tcG9uZW50cyBpbiBpdFxuICogXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNlbGVjdEVuZENvbnRhaW5lciBzZXQgdG8gdHJ1ZSBpZiB0aGUgZW5kIGNvbnRhaW5lciBzaG91bGQgYmUgc2VsZWN0ZWQgYWZ0ZXIgZGVsZXRpb25cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRkZWwoc2VsZWN0RW5kQ29udGFpbmVyKSB7XG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgISB0aGlzLnJhbmdlKSByZXR1cm47XG5cbiAgICB2YXIgc2VsUG9pbnQgPSB0aGlzLl9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQoc2VsZWN0RW5kQ29udGFpbmVyKTtcblxuICAgIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHModGhpcy5yYW5nZSk7XG5cbiAgICB0aGlzLl9zZWxlY3RBZnRlckRlbGV0ZShzZWxQb2ludCk7XG4gICAgc2VsUG9pbnQubm9kZS5wYXJlbnROb2RlLm5vcm1hbGl6ZSgpO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRQb3N0RGVsZXRlU2VsZWN0aW9uUG9pbnQoc2VsZWN0RW5kQ29udGFpbmVyKSB7XG4gICAgdmFyIHNlbE5vZGUgPSB0aGlzLnJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgIHZhciBzZWxPZmZzZXQgPSB0aGlzLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgIGlmIChzZWxlY3RFbmRDb250YWluZXIgJiYgdGhpcy5yYW5nZS5zdGFydENvbnRhaW5lciAhPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lcikge1xuICAgICAgICBzZWxOb2RlID0gdGhpcy5yYW5nZS5lbmRDb250YWluZXI7XG4gICAgICAgIHNlbE9mZnNldCA9IDA7XG4gICAgfVxuICAgIHJldHVybiB7IG5vZGU6IHNlbE5vZGUsIG9mZnNldDogc2VsT2Zmc2V0IH07XG59XG5cblxuZnVuY3Rpb24gX3NlbGVjdEFmdGVyRGVsZXRlKHNlbFBvaW50KSB7XG4gICAgdmFyIHNlbE5vZGUgPSBzZWxQb2ludC5ub2RlXG4gICAgICAgICwgc2VsT2Zmc2V0ID0gc2VsUG9pbnQub2Zmc2V0O1xuXG4gICAgaWYgKCFzZWxOb2RlKSByZXR1cm47XG4gICAgaWYgKHNlbE5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpXG4gICAgICAgIHNlbE5vZGUudGV4dENvbnRlbnQgPSBzZWxOb2RlLnRleHRDb250ZW50LnRyaW1SaWdodCgpO1xuICAgIGlmICghc2VsTm9kZS5ub2RlVmFsdWUpXG4gICAgICAgIHNlbE5vZGUubm9kZVZhbHVlID0gJ1xcdTAwQTAnOyAvL25vbi1icmVha2luZyBzcGFjZSwgXFx1MjAwQiBmb3IgemVybyB3aWR0aCBzcGFjZTtcblxuICAgIHZhciBwb3NpdGlvbiA9IHNlbE9mZnNldCA+IHNlbE5vZGUubGVuZ3RoID8gc2VsTm9kZS5sZW5ndGggOiBzZWxPZmZzZXQ7XG4gICAgc2V0Q2FyZXRQb3NpdGlvbihzZWxOb2RlLCBwb3NpdGlvbik7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiByYW5nZVxuICpcbiAqIEByZXR1cm4ge1JhbmdlfVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGdldFJhbmdlKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlO1xufVxuXG5cbi8qKlxuICogU3RvcmVzIHNlbGVjdGlvbiB3aW5kb3csIG5vZGVzIGFuZCBvZmZzZXRzIGluIG9iamVjdFxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGdldFN0YXRlKHJvb3RFbCkge1xuICAgIHZhciByID0gdGhpcy5yYW5nZTtcbiAgICB2YXIgZG9jID0gcm9vdEVsLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICBpZiAoIXIpIHJldHVybiB7IHdpbmRvdzogd2luIH07XG4gICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uY3JlYXRlU3RhdGVPYmplY3Qocm9vdEVsLCByLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0LCByLmVuZENvbnRhaW5lciwgci5lbmRPZmZzZXQpO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZVN0YXRlT2JqZWN0KHJvb3RFbCwgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBlbmRDb250YWluZXIsIGVuZE9mZnNldCkge1xuICAgIGVuZENvbnRhaW5lciA9IGVuZENvbnRhaW5lciB8fCBzdGFydENvbnRhaW5lcjtcbiAgICBlbmRPZmZzZXQgPSBlbmRPZmZzZXQgfHwgc3RhcnRPZmZzZXQ7XG4gICAgdmFyIGRvYyA9IHJvb3RFbC5vd25lckRvY3VtZW50XG4gICAgICAgICwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2luZG93OiB3aW4sXG4gICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICBzdGFydDogX2dldFNlbGVjdGlvblBvaW50U3RhdGUocm9vdEVsLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQpLFxuICAgICAgICBlbmQ6IF9nZXRTZWxlY3Rpb25Qb2ludFN0YXRlKHJvb3RFbCwgZW5kQ29udGFpbmVyLCBlbmRPZmZzZXQpXG4gICAgfTtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2VsZWN0aW9uUG9pbnRTdGF0ZShyb290RWwsIG5vZGUsIG9mZnNldCkge1xuICAgIHZhciB0cmVlUGF0aCA9IGRvbVV0aWxzLnRyZWVQYXRoT2Yocm9vdEVsLCBub2RlKTtcbiAgICBpZiAoISB0cmVlUGF0aCkgbG9nZ2VyLmVycm9yKCdTZWxlY3Rpb24gcG9pbnQgaXMgb3V0c2lkZSBvZiByb290IGVsZW1lbnQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0cmVlUGF0aDogdHJlZVBhdGgsXG4gICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJlc3RvcmVzIGFjdHVhbCBzZWxlY3Rpb24gdG8gdGhlIHN0b3JlZCByYW5nZVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUpIHtcbiAgICB2YXIgZG9tVXRpbHMgPSBzdGF0ZS53aW5kb3cubWlsby51dGlsLmRvbTtcblxuICAgIGlmIChzdGF0ZS5yb290RWwgJiYgc3RhdGUuc3RhcnQgJiYgc3RhdGUuZW5kKSB7XG4gICAgICAgIHZhciBzdGFydE5vZGUgPSBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShzdGF0ZS5yb290RWwsIHN0YXRlLnN0YXJ0KVxuICAgICAgICAgICAgLCBlbmROb2RlID0gX3NlbGVjdGlvbk5vZGVGcm9tU3RhdGUoc3RhdGUucm9vdEVsLCBzdGF0ZS5lbmQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkb21VdGlscy5zZXRTZWxlY3Rpb24oc3RhcnROb2RlLCBzdGF0ZS5zdGFydC5vZmZzZXQsIGVuZE5vZGUsIHN0YXRlLmVuZC5vZmZzZXQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdUZXh0IHNlbGVjdGlvbjogY2FuXFwndCBjcmVhdGUgc2VsZWN0aW9uJywgZSwgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbVV0aWxzLmNsZWFyU2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbihzdGF0ZS53aW5kb3cpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShyb290RWwsIHBvaW50U3RhdGUpIHtcbiAgICB2YXIgbm9kZSA9IGRvbVV0aWxzLmdldE5vZGVBdFRyZWVQYXRoKHJvb3RFbCwgcG9pbnRTdGF0ZS50cmVlUGF0aCk7XG4gICAgaWYgKCEgbm9kZSkgbG9nZ2VyLmVycm9yKCdUZXh0U2VsZWN0aW9uIGNyZWF0ZUZyb21TdGF0ZTogbm8gbm9kZSBhdCB0cmVlUGF0aCcpO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBzZWxlY3Rpb24gZnJvbSBwYXNzZWQgcmFuZ2VcbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmFja3dhcmRcbiAqXG4gKiBAcmV0dXJuIHtUZXh0U2VsZWN0aW9ufVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tUmFuZ2UocmFuZ2UsIGJhY2t3YXJkKSB7XG4gICAgdmFyIHdpbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXdcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgLCBlbmRSYW5nZTtcblxuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIGVuZFJhbmdlID0gcmFuZ2UuY2xvbmVSYW5nZSgpO1xuICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSk7XG5cbiAgICAgICAgc2VsLmFkZFJhbmdlKGVuZFJhbmdlKTtcbiAgICAgICAgc2VsLmV4dGVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpICAgICAgICBcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHdpbik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG5vcm1hbGl6ZWQgY29weSBvZiB0aGUgcmFuZ2VcbiAqIElmIHlvdSB0cmlwbGUgY2xpY2sgYW4gaXRlbSwgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgaXMgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBORVhUIG5vZGUuXG4gKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSByYW5nZSB3aXRoIHRoZSBlbmQgcG9zaXRpb25lZCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHRleHRub2RlIGNvbnRhaW5lZCBcbiAqIGluc2lkZSBhIGNvbXBvbmVudCB3aXRoIHRoZSBcImVkaXRhYmxlXCIgZmFjZXRcbiAqIFxuICogQHJldHVybiB7cmFuZ2V9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGdldE5vcm1hbGl6ZWRSYW5nZSgpe1xuICAgIHZhciBkb2MgPSB0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB0dywgcHJldmlvdXNOb2RlXG4gICAgICAgICwgbmV3UmFuZ2UgPSB0aGlzLnJhbmdlLmNsb25lUmFuZ2UoKTtcblxuICAgIGlmIChuZXdSYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgIHR3ID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIoZG9jLmJvZHksIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICAgICAgdHcuY3VycmVudE5vZGUgPSBuZXdSYW5nZS5lbmRDb250YWluZXI7XG4gICAgICAgIHByZXZpb3VzTm9kZSA9IHR3LnByZXZpb3VzTm9kZSgpO1xuICAgICAgICBuZXdSYW5nZS5zZXRFbmQocHJldmlvdXNOb2RlLCBwcmV2aW91c05vZGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3UmFuZ2U7XG59XG5cbi8qKlxuICogZ2V0IHRoZSBkaXJlY3Rpb24gb2YgYSBzZWxlY3Rpb25cbiAqXG4gKiAxIGZvcndhcmQsIC0xIGJhY2t3YXJkLCAwIG5vIGRpcmVjdGlvbiwgdW5kZWZpbmVkIG9uZSBvZiB0aGUgbm9kZSBpcyBkZXRhY2hlZCBvciBpbiBhIGRpZmZlcmVudCBmcmFtZVxuICpcbiAqIEByZXR1cm4gey0xfDB8MXx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGdldERpcmVjdGlvbigpe1xuICAgIHJldHVybiBkb21VdGlscy5nZXRTZWxlY3Rpb25EaXJlY3Rpb24odGhpcy5zZWxlY3Rpb24pOyAgICBcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIFN0b3JhZ2VNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tc2dfc3JjJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxucmVxdWlyZSgnLi9tb2RlbCcpXG5cbm1vZHVsZS5leHBvcnRzID0gRE9NU3RvcmFnZTtcblxuXG4vLyBzaGFyZWQga2V5cyBzdG9yZWQgYnkgYWxsIGluc3RhbmNlcywgaW5jbHVkZSBrZXkgcHJlZml4ZXNcbnZhciBfc3RvcmVkS2V5cyA9IHtcbiAgICB0cnVlOiB7fSwgLy8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgZmFsc2U6IHt9IC8vIGxvY2FsIHN0b3JhZ2Vcbn07XG5cblxuLyoqXG4gKiBET01TdG9yYWdlIGNsYXNzIHRvIHNpbXBsaWZ5IHN0b3JhZ2UgYW5kIHJldHJpZXZhbCBvZiBtdWx0aXBsZSBpdGVtcyB3aXRoIHR5cGVzIHByZXNlcnZhdGlvbiB0byBET00gc3RvcmFnZSAobG9jYWxTdG9yYWdlIGFuZCBzZXNzaW9uU3RvcmFnZSkuXG4gKiBUeXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUga2V5IGNyZWF0ZWQgZnJvbSB2YWx1ZSBrZXlzIHdpdGggYXBwZW5kZWQgYG1pbG8uY29uZmlnLmRvbVN0b3JhZ2UudHlwZVN1ZmZpeGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5UHJlZml4IHByZWZpeCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gYWxsIGtleXMgZm9sbG93ZWQgYnkgYG1pbG8uY29uZmlnLmRvbVN0b3JhZ2UucHJlZml4U2VwYXJhdG9yYCAoXCIvXCIgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNlc3Npb25Pbmx5IHRydWUgdG8gdXNlIHNlc3Npb25TdG9yYWdlLiBsb2NhbFN0b3JhZ2Ugd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge1dpbmRvd30gd2luIHdpbmRvdyB0byB3b3JrIGluXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2Uoa2V5UHJlZml4LCBzZXNzaW9uT25seSwgd2luKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICB3aW4gPSB3aW4gfHwgd2luZG93O1xuXG4gICAga2V5UHJlZml4ID0gY29uZmlnLmRvbVN0b3JhZ2Uucm9vdCArXG4gICAgICAgICAgICAgICAgKGtleVByZWZpeFxuICAgICAgICAgICAgICAgICAgICA/IGtleVByZWZpeCArIGNvbmZpZy5kb21TdG9yYWdlLnByZWZpeFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICA6ICcnKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGtleVByZWZpeDoga2V5UHJlZml4LFxuICAgICAgICBzZXNzaW9uT25seTogISEgc2Vzc2lvbk9ubHksXG4gICAgICAgIHdpbmRvdzogd2luLFxuICAgICAgICBfc3RvcmFnZTogc2Vzc2lvbk9ubHkgPyB3aW4uc2Vzc2lvblN0b3JhZ2UgOiB3aW4ubG9jYWxTdG9yYWdlLFxuICAgICAgICBfdHlwZVN1ZmZpeDogY29uZmlnLmRvbVN0b3JhZ2UudHlwZVN1ZmZpeCxcbiAgICAgICAgX2tleXM6IHt9XG4gICAgfSwgXy5XUklUKTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKERPTVN0b3JhZ2UsIHtcbiAgICBnZXQ6IERPTVN0b3JhZ2UkZ2V0LFxuICAgIHNldDogRE9NU3RvcmFnZSRzZXQsXG4gICAgcmVtb3ZlOiBET01TdG9yYWdlJHJlbW92ZSxcbiAgICBoYXNJdGVtOiBET01TdG9yYWdlJGhhc0l0ZW0sXG4gICAgZ2V0SXRlbTogRE9NU3RvcmFnZSRnZXRJdGVtLFxuICAgIHNldEl0ZW06IERPTVN0b3JhZ2Ukc2V0SXRlbSxcbiAgICByZW1vdmVJdGVtOiBET01TdG9yYWdlJHJlbW92ZUl0ZW0sXG4gICAgX3N0b3JhZ2VLZXk6IERPTVN0b3JhZ2UkX3N0b3JhZ2VLZXksXG4gICAgX2RvbVN0b3JhZ2VLZXk6IERPTVN0b3JhZ2UkX2RvbVN0b3JhZ2VLZXksXG4gICAgZ2V0QWxsS2V5czogRE9NU3RvcmFnZSRnZXRBbGxLZXlzLFxuICAgIGdldEFsbEl0ZW1zOiBET01TdG9yYWdlJGdldEFsbEl0ZW1zLFxuICAgIGNyZWF0ZU1lc3NlbmdlcjogRE9NU3RvcmFnZSRjcmVhdGVNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogRE9NU3RvcmFnZSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNlbmdlciBhbmQgTWVzc2FnZVNvdXJjZSBtZXRob2RzIG9uIERPTVN0b3JhZ2VcbiAqL1xuTWVzc2VuZ2VyLnVzZVdpdGgoRE9NU3RvcmFnZSwgJ19tZXNzZW5nZXInLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuU3RvcmFnZU1lc3NhZ2VTb3VyY2UudXNlV2l0aChET01TdG9yYWdlLCAnX21lc3NhZ2VTb3VyY2UnLCBbJ3RyaWdnZXInXSk7XG5cblxudmFyIF9zZXNzaW9uU3RvcmFnZSA9IG5ldyBET01TdG9yYWdlKCcnLCB0cnVlKVxuICAgICwgX2xvY2FsU3RvcmFnZSA9IG5ldyBET01TdG9yYWdlKCcnLCBmYWxzZSk7XG5cbnZhciBfZG9tU3RvcmFnZSA9IHtcbiAgICAgICAgdHJ1ZTogX3Nlc3Npb25TdG9yYWdlLFxuICAgICAgICBmYWxzZTogX2xvY2FsU3RvcmFnZVxuICAgIH07XG5cbl8uZXh0ZW5kKERPTVN0b3JhZ2UsIHtcbiAgICByZWdpc3RlckRhdGFUeXBlOiBET01TdG9yYWdlJCRyZWdpc3RlckRhdGFUeXBlLFxuICAgIGxvY2FsOiBfbG9jYWxTdG9yYWdlLFxuICAgIHNlc3Npb246IF9zZXNzaW9uU3RvcmFnZSxcbiAgICBzdG9yYWdlOiBfZG9tU3RvcmFnZSxcbiAgICBfc3RvcmVkS2V5czogX3N0b3JlZEtleXMgLy8gZXhwb3NlZCBmb3IgdGVzdGluZ1xufSk7XG5cblxuLyoqXG4gKiBTZXRzIGRhdGEgdG8gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIGtleXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgc2luZ2xlIG9iamVjdCBjYW4gYmUgcGFzc2VkIGluIHdoaWNoIGNhc2Uga2V5cyB3aWxsIGJlIHVzZWQgYXMga2V5cyBpbiBsb2NhbCBzdG9yYWdlLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWx0ZXJuYXRpdmVseSBqdXN0IHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHdoZXJlIGFyZ3VtZW50cyBjYW4gYmUgc2VxdWVudGlhbGx5IHVzZWQgYXMga2V5cyBhbmQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHNldChkYXRhKSB7IC8vIG9yIGFyZ3VtZW50c1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JylcbiAgICAgICAgXy5lYWNoS2V5KGRhdGEsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFyZ3NMZW4gJSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IERvbVN0b3JhZ2VFcnJvcignRE9NU3RvcmFnZTogc2V0IHNob3VsZCBoYXZlIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyBvciBvYmplY3QnKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICAgICAgICAgICwgdmFsdWUgPSBhcmd1bWVudHNbKytpXTtcblxuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8qKlxuICogR2V0cyBkYXRhIGZyb20gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIHBhc3NlZCBrZXlzLCBidXQgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSBrZXlzIHdpdGhvdXQgcm9vdCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGtleXMgY2FuIGJlIHBhc3NlZCBhcyBzdHJpbmdzIG9yIGFycmF5cyBvZiBzdHJpbmdzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGRhdGEgPSB7fTtcbiAgICBfLmRlZXBGb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGRhdGFba2V5XSA9IHRoaXMuZ2V0SXRlbShrZXkpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBkYXRhO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBrZXlzIGZyb20gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIHBhc3NlZCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGtleXMgY2FuIGJlIHBhc3NlZCBhcyBzdHJpbmdzIG9yIGFycmF5cyBvZiBzdHJpbmdzXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkcmVtb3ZlKCkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIF8uZGVlcEZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGtleSk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDaGVjayBmb3IgcHJlc2VuY2Ugb2Ygc2luZ2xlIGl0ZW0gaW4gRE9NIHN0b3JhZ2UuIGB0aGlzLmtleVByZWZpeGAgaXMgcHJlcGVuZGVkIHRvIHBhc3NlZCBrZXkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRoYXNJdGVtKGtleSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0ocEtleSkgIT0gbnVsbDtcbn1cblxuXG4vKipcbiAqIEdldHMgc2luZ2xlIGl0ZW0gZnJvbSBET00gc3RvcmFnZSBwcmVwZW5kaW5nIGB0aGlzLmtleVByZWZpeGAgdG8gcGFzc2VkIGtleS5cbiAqIFJlYWRzIHR5cGUgb2YgdGhlIG9yaWdpbmFsbHkgc3RvcmVkIHZhbHVlIGZyb20gYGtleSArIHRoaXMuX3R5cGVTdWZmaXhgIGFuZCBjb252ZXJ0cyBkYXRhIHRvIHRoZSBvcmlnaW5hbCB0eXBlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRJdGVtKGtleSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHZhciBkYXRhVHlwZSA9IF9nZXRLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXkpO1xuICAgIHZhciB2YWx1ZVN0ciA9IHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShwS2V5KTtcbiAgICB2YXIgdmFsdWUgPSBfcGFyc2VEYXRhKHZhbHVlU3RyLCBkYXRhVHlwZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbi8qKlxuICogU2V0cyBzaW5nbGUgaXRlbSB0byBET00gc3RvcmFnZSBwcmVwZW5kaW5nIGB0aGlzLmtleVByZWZpeGAgdG8gcGFzc2VkIGtleS5cbiAqIFN0b3JlcyB0eXBlIG9mIHRoZSBzdG9yZWQgdmFsdWUgdG8gYGtleSArIHRoaXMuX3R5cGVTdWZmaXhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRzZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgcEtleSA9IHRoaXMuX3N0b3JhZ2VLZXkoa2V5KTtcbiAgICB2YXIgZGF0YVR5cGUgPSBfc2V0S2V5RGF0YVR5cGUuY2FsbCh0aGlzLCBwS2V5LCB2YWx1ZSk7XG4gICAgdmFyIHZhbHVlU3RyID0gX3NlcmlhbGl6ZURhdGEodmFsdWUsIGRhdGFUeXBlKTtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0ocEtleSwgdmFsdWVTdHIpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBpZiAoZS5uYW1lID09ICdRdW90YUV4Y2VlZGVkRXJyb3InKSB7XG4gICAgICAgICAgICB2YXIgY2ZnID0gY29uZmlnLmRvbVN0b3JhZ2UucXVvdGFFeGNlZWRlZDtcbiAgICAgICAgICAgIGlmIChjZmcubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBtaWxvLm1haWwucG9zdE1lc3NhZ2UoJ3F1b3RhZXhjZWVkZWRlcnJvcicsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjZmcudGhyb3dFcnJvcilcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHRoaXMuX2tleXNba2V5XSA9IHRydWU7XG4gICAgX2RvbVN0b3JhZ2VbdGhpcy5zZXNzaW9uT25seV0uX2tleXNbcEtleV0gPSB0cnVlO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBzaW5nbGUgaXRlbSBmcm9tIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogVHlwZSBvZiB0aGUgc3RvcmVkIHZhbHVlIChpbiBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAga2V5KSBpcyBhbHNvIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHBLZXkpO1xuICAgIF9yZW1vdmVLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXkpXG4gICAgZGVsZXRlIHRoaXMuX2tleXNba2V5XTtcbiAgICBkZWxldGUgX2RvbVN0b3JhZ2VbdGhpcy5zZXNzaW9uT25seV0uX2tleXNbcEtleV07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBhbGwga2V5cyBzdG9yZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkZ2V0QWxsS2V5cygpIHtcbiAgICB2YXIgc3RvcmVkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2tleXMpO1xuICAgIHZhciBrZXlzSW5TdG9yYWdlID0gc3RvcmVkS2V5cy5maWx0ZXIoZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0l0ZW0oa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuX2tleXNba2V5XTtcbiAgICB9LCB0aGlzKTtcbiAgICByZXR1cm4ga2V5c0luU3RvcmFnZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1hcCB3aXRoIGFsbCBrZXlzIGFuZCB2YWx1ZXMgKGRlc2VyaWFsaXplZCkgc3RvcmVkIHVzaW5nIHRoaXMgaW5zdGFuY2Ugb2YgRE9NU3RvcmFnZVxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRBbGxJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5nZXRBbGxLZXlzKCkpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBwcmVmaXhlZCBrZXkgZm9yIERPTSBzdG9yYWdlIGZvciBnaXZlbiB1bnByZWZpeGVkIGtleS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkX3N0b3JhZ2VLZXkoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMua2V5UHJlZml4ICsga2V5O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bnByZWZpeGVkIGtleSB0byBiZSB1c2VkIHdpdGggdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlIGZpciBnaXZlbiBhY3R1YWwga2V5IGluIHN0b3JhZ2VcbiAqIElmIGtleSBoYXMgZGlmZmVyZW50IHByZWZpeCBmcm9tIHRoZSBrZXlQcmVmaXggcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RvcmFnZUtleSBhY3R1YWwga2V5IGluIGxvY2FsL3Nlc3Npb24gc3RvcmFnZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJF9kb21TdG9yYWdlS2V5KHN0b3JhZ2VLZXkpIHtcbiAgICBpZiAoc3RvcmFnZUtleS5pbmRleE9mKHRoaXMuX3R5cGVTdWZmaXgpID49IDApIHJldHVybjtcbiAgICByZXR1cm4gXy51blByZWZpeChzdG9yYWdlS2V5LCB0aGlzLmtleVByZWZpeCk7XG59XG5cblxuLyoqXG4gKiBHZXRzIG9yaWdpbmFsbHkgc3RvcmVkIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBfZ2V0S2V5RGF0YVR5cGUocEtleSkge1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHBLZXkpO1xufVxuXG5cbi8qKlxuICogU3RvcmVzIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YCBhbmQgYHZhbHVlYC5cbiAqIFJldHVybnMgZGF0YSB0eXBlIGZvciBgdmFsdWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwS2V5IHByZWZpeGVkIGtleSBvZiBzdG9yZWQgdmFsdWVcbiAqIEBwYXJhbSB7QW55fSB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBfc2V0S2V5RGF0YVR5cGUocEtleSwgdmFsdWUpIHtcbiAgICB2YXIgZGF0YVR5cGUgPSBfZ2V0VmFsdWVUeXBlKHZhbHVlKTtcbiAgICBwS2V5ID0gX2RhdGFUeXBlS2V5LmNhbGwodGhpcywgcEtleSk7XG4gICAgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHBLZXksIGRhdGFUeXBlKTtcbiAgICByZXR1cm4gZGF0YVR5cGU7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHN0b3JlZCBkYXRhIHR5cGUgZm9yIGdpdmVuIChwcmVmaXhlZCkgYGtleWAuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBwS2V5IHByZWZpeGVkIGtleSBvZiBzdG9yZWQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gX3JlbW92ZUtleURhdGFUeXBlKHBLZXkpIHtcbiAgICBwS2V5ID0gX2RhdGFUeXBlS2V5LmNhbGwodGhpcywgcEtleSk7XG4gICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHBLZXkpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5IHRvIHN0b3JlIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBfZGF0YVR5cGVLZXkocEtleSkge1xuICAgIHJldHVybiBwS2V5ICsgdGhpcy5fdHlwZVN1ZmZpeDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHlwZSBvZiB2YWx1ZSBhcyBzdHJpbmcuIENsYXNzIG5hbWUgcmV0dXJuZWQgZm9yIG9iamVjdHMgKCdudWxsJyBmb3IgbnVsbCkuXG4gKiBAcGFyYW0gIHtBbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRWYWx1ZVR5cGUodmFsdWUpIHtcbiAgICB2YXIgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlXG4gICAgICAgICwgY2xhc3NOYW1lID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IubmFtZVxuICAgICAgICAsIGRhdGFUeXBlID0gdmFsdWVzRGF0YVR5cGVzW2NsYXNzTmFtZV07XG4gICAgcmV0dXJuIGRhdGFUeXBlIHx8IChcbiAgICAgICAgICAgIHZhbHVlVHlwZSAhPSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgID8gdmFsdWVUeXBlXG4gICAgICAgICAgICAgICAgOiB2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gJ251bGwnXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWUuY29uc3RydWN0b3IubmFtZSk7XG59XG52YXIgdmFsdWVzRGF0YVR5cGVzID0ge1xuICAgIC8vIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVyRGF0YVR5cGVgXG59XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHZhbHVlIHRvIGJlIHN0b3JlZCBpbiBET00gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gIHtBbnl9IHZhbHVlIHZhbHVlIHRvIGJlIHNlcmlhbGl6ZWRcbiAqIEBwYXJhbSAge1N0cmluZ30gdmFsdWVUeXBlIG9wdGlvbmFsIGRhdGEgdHlwZSB0byBkZWZpbmUgc2VyaWFsaXplciwgX2dldFZhbHVlVHlwZSBpcyB1c2VkIGlmIG5vdCBwYXNzZWQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9zZXJpYWxpemVEYXRhKHZhbHVlLCB2YWx1ZVR5cGUpIHtcbiAgICB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGUgfHwgX2dldFZhbHVlVHlwZSh2YWx1ZSk7XG4gICAgdmFyIHNlcmlhbGl6ZXIgPSBkYXRhU2VyaWFsaXplcnNbdmFsdWVUeXBlXTtcbiAgICByZXR1cm4gc2VyaWFsaXplclxuICAgICAgICAgICAgPyBzZXJpYWxpemVyKHZhbHVlLCB2YWx1ZVR5cGUpXG4gICAgICAgICAgICA6IHZhbHVlICYmIHZhbHVlLnRvU3RyaW5nID09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbiAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICAgICAgICAgIDogJycgKyB2YWx1ZTtcbn1cbnZhciBkYXRhU2VyaWFsaXplcnMgPSB7XG4gICAgJ0FycmF5JzogSlNPTi5zdHJpbmdpZnlcbn1cblxuXG4vKipcbiAqIFBhcnNlcyBzdHJpbmcgcmV0cmlldmVkIGZyb20gRE9NIHN0b3JhZ2UuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVN0clxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVR5cGUgZGF0YSB0eXBlIHRoYXQgZGVmaW5lcyBwYXJzZXIuIE9yaWdpbmFsIHNyaW5nIHdpbGwgYmUgcmV0dXJuZWQgaWYgcGFyc2VyIGlzIG5vdCBkZWZpbmVkLlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBfcGFyc2VEYXRhKHZhbHVlU3RyLCB2YWx1ZVR5cGUpIHtcbiAgICB2YXIgcGFyc2VyID0gZGF0YVBhcnNlcnNbdmFsdWVUeXBlXTtcbiAgICByZXR1cm4gcGFyc2VyXG4gICAgICAgICAgICA/IHBhcnNlcih2YWx1ZVN0ciwgdmFsdWVUeXBlKVxuICAgICAgICAgICAgOiB2YWx1ZVN0cjtcbn1cbnZhciBkYXRhUGFyc2VycyA9IHtcbiAgICBPYmplY3Q6IF8uanNvblBhcnNlLFxuICAgIEFycmF5OiBfLmpzb25QYXJzZSxcbiAgICBEYXRlOiBmdW5jdGlvbih2YWxTdHIpIHsgcmV0dXJuIG5ldyBEYXRlKHZhbFN0cik7IH0sXG4gICAgYm9vbGVhbjogZnVuY3Rpb24odmFsU3RyKSB7IHJldHVybiB2YWxTdHIgPT0gJ3RydWUnOyB9LFxuICAgIG51bWJlcjogTnVtYmVyLFxuICAgIGZ1bmN0aW9uOiBfLnRvRnVuY3Rpb24sXG4gICAgUmVnRXhwOiBfLnRvUmVnRXhwXG59O1xuXG5cbi8qKlxuICogUmVnaXN0ZXJzIGRhdGEgdHlwZSB0byBiZSBzYXZlZCBpbiBET00gc3RvcmFnZS4gQ2xhc3MgbmFtZSBjYW4gYmUgdXNlZCBvciByZXN1bHQgb2YgYHR5cGVvZmAgb3BlcmF0b3IgZm9yIG5vbi1vYmplY3RzIHRvIG92ZXJyaWRlIGRlZmF1bHQgY29udmVyc2lvbnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlVHlwZSBjbGFzcyAoY29uc3RydWN0b3IpIG5hbWUgb3IgdGhlIHN0cmluZyByZXR1cm5lZCBieSB0eXBlb2YuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXJpYWxpemVyIG9wdGlvbmFsIHNlcmlhbGl6ZXIgZm9yIHRoaXMgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIG9wdGlvbmFsIHBhcnNlciBmb3IgdGhpcyB0eXBlXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBzdG9yZUFzRGF0YVR5cGUgb3B0aW9uYWwgbmFtZSBvZiBzdG9yZWQgZGF0YSB0eXBlIGlmIGRpZmZlcmVudCBmcm9tIHZhbHVlVHlwZVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJCRyZWdpc3RlckRhdGFUeXBlKHZhbHVlVHlwZSwgc2VyaWFsaXplciwgcGFyc2VyLCBzdG9yZUFzRGF0YVR5cGUpIHtcbiAgICBpZiAoc2VyaWFsaXplcikgZGF0YVNlcmlhbGl6ZXJzW3ZhbHVlVHlwZV0gPSBzZXJpYWxpemVyO1xuICAgIGlmIChwYXJzZXIpIGRhdGFQYXJzZXJzW3ZhbHVlVHlwZV0gPSBwYXJzZXI7XG4gICAgdmFsdWVzRGF0YVR5cGVzW3ZhbHVlVHlwZV0gPSBzdG9yZUFzRGF0YVR5cGUgfHwgdmFsdWVUeXBlO1xufVxuXG5cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkY3JlYXRlTWVzc2VuZ2VyKCkge1xuICAgIHZhciBzdG9yYWdlTWVzc2FnZVNvdXJjZSA9IG5ldyBTdG9yYWdlTWVzc2FnZVNvdXJjZSh0aGlzKTtcbiAgICB2YXIgbWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIHN0b3JhZ2VNZXNzYWdlU291cmNlKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfbWVzc2VuZ2VyOiBtZXNzZW5nZXIsXG4gICAgICAgIF9tZXNzYWdlU291cmNlOiBzdG9yYWdlTWVzc2FnZVNvdXJjZVxuICAgIH0sIF8uV1JJVCk7XG59XG5cblxuZnVuY3Rpb24gRE9NU3RvcmFnZSRkZXN0cm95KCkge1xuICAgIHRoaXMuX3N0b3JhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53aW5kb3cgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcikgdGhpcy5fbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5Nb2RlbC5yZWdpc3RlcldpdGhET01TdG9yYWdlID0gTW9kZWwkJHJlZ2lzdGVyV2l0aERPTVN0b3JhZ2U7XG5cblxuZnVuY3Rpb24gTW9kZWwkJHJlZ2lzdGVyV2l0aERPTVN0b3JhZ2UoKSB7XG4gICAgdmFyIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKCdNb2RlbCcsIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBNb2RlbF9kb21TdG9yYWdlUGFyc2VyKTtcbiAgICBET01TdG9yYWdlLnJlZ2lzdGVyRGF0YVR5cGUoJ01vZGVsUGF0aCcsIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBNb2RlbF9kb21TdG9yYWdlUGFyc2VyLCAnTW9kZWwnKTtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbF9kb21TdG9yYWdlU2VyaWFsaXplcih2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gdmFsdWUuZ2V0KCk7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIodmFsdWVTdHIpIHtcbiAgICB2YXIgZGF0YSA9IF8uanNvblBhcnNlKHZhbHVlU3RyKTtcbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzYWdlU291cmNlID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzYWdlU291cmNlXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ291bnQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvdW50Jyk7XG5cbnZhciBTdG9yYWdlTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ1N0b3JhZ2VNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhTdG9yYWdlTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogU3RvcmFnZU1lc3NhZ2VTb3VyY2UkYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRyZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHBvc3RNZXNzYWdlOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRwb3N0TWVzc2FnZSxcbiAgICB0cmlnZ2VyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSR0cmlnZ2VyLFxuXG4gICAgLy9jbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50ICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcykge1xuICAgIGlmIChob3N0T2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgIT0gJ0RPTVN0b3JhZ2UnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RPYmplY3Qgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIERPTVN0b3JhZ2UnKTtcbiAgICB0aGlzLnN0b3JhZ2UgPSBob3N0T2JqZWN0O1xuICAgIHRoaXMubWVzc2FnZUtleSA9IGNvbmZpZy5kb21TdG9yYWdlLm1lc3NhZ2VLZXk7XG4gICAgdGhpcy53aW5kb3cgPSBob3N0T2JqZWN0LndpbmRvdztcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMsIGZhbHNlKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRyZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIFN0b3JhZ2VNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgdmFyIGtleSA9IHRoaXMubWVzc2FnZUtleSArIG1zZ1R5cGU7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YVtjb25maWcuZG9tU3RvcmFnZS5tZXNzYWdlVGltZXN0YW1wXSA9IG1pbG9Db3VudCgpO1xuICAgIF8uZGVmZXJNZXRob2QodGhpcy5zdG9yYWdlLCAnc2V0SXRlbScsIGtleSwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuc3RvcmFnZUFyZWEgIT0gdGhpcy5zdG9yYWdlLl9zdG9yYWdlKSByZXR1cm47XG4gICAgdmFyIGtleSA9IHRoaXMuc3RvcmFnZS5fZG9tU3RvcmFnZUtleShldmVudC5rZXkpOyBpZiAoISBrZXkpIHJldHVybjtcbiAgICB2YXIgbXNnVHlwZSA9IF8udW5QcmVmaXgoa2V5LCB0aGlzLm1lc3NhZ2VLZXkpOyBpZiAoISBtc2dUeXBlKSByZXR1cm47XG4gICAgdmFyIGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpOyBpZiAoISBkYXRhKSByZXR1cm47XG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UobXNnVHlwZSwgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbC53ZWJzb2NrZXRgIFxuKiovXG5cblxudmFyIE1lc3NlbmdlciA9IHJlcXVpcmUoJ21pbG8tY29yZScpLk1lc3NlbmdlclxuICAgICwgV1NNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tc2dfc3JjJylcbiAgICAsIFdTTXNnQVBJID0gcmVxdWlyZSgnLi9tc2dfYXBpJyk7XG5cblxuZnVuY3Rpb24gd2Vic29ja2V0KCkge1xuICAgIHZhciB3c01lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXI7XG4gICAgdmFyIHdzTXNnU291cmNlID0gbmV3IFdTTWVzc2FnZVNvdXJjZSh3c01lc3NlbmdlciwgeyBzZW5kOiAndHJpZ2dlcicsIGNvbm5lY3Q6ICdjb25uZWN0JyB9LCBuZXcgV1NNc2dBUEkpO1xuICAgIHdzTWVzc2VuZ2VyLl9zZXRNZXNzYWdlU291cmNlKHdzTXNnU291cmNlKTtcbiAgICByZXR1cm4gd3NNZXNzZW5nZXI7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB3ZWJzb2NrZXQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXJBUEkgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NlbmdlckFQSVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxudmFyIFdTTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdXU01zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oV1NNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxuICAgIGNyZWF0ZUludGVybmFsRGF0YTogY3JlYXRlSW50ZXJuYWxEYXRhXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBXU01zZ0FQSTtcblxuXG52YXIgU09DS0VUX01FU1NBR0VTID0gWydvcGVuJywgJ2Nsb3NlJywgJ2Vycm9yJywgJ21lc3NhZ2UnXTtcblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gU09DS0VUX01FU1NBR0VTLmluZGV4T2YobWVzc2FnZSkgPj0gMFxuICAgICAgICAgICAgPyBtZXNzYWdlXG4gICAgICAgICAgICA6ICdtZXNzYWdlJztcbn1cblxuXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIG1zZ0RhdGEpIHtcbiAgICBpZiAoU09DS0VUX01FU1NBR0VTLmluZGV4T2YobWVzc2FnZSkgPj0gMCkgcmV0dXJuIHRydWU7IC8vIGludGVybmFsIG1lc3NhZ2UgaXMgb25lIG9mIGV4dGVybmFsIG1lc3NhZ2VzXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgIHZhciBtc2dUeXBlID0gbXNnRGF0YSAmJiBtc2dEYXRhLnR5cGU7XG4gICAgICAgIHJldHVybiBtc2dUeXBlID09IG1lc3NhZ2U7IC8vIHR5cGUgZXF1YWxzIGludGVybmFsIG1lc3NhZ2VcbiAgICB9XG59O1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBldmVudCkge1xuICAgIHZhciBpbnRlcm5hbERhdGEgPSBzb3VyY2VNZXNzYWdlID09ICdtZXNzYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLmpzb25QYXJzZShldmVudC5kYXRhKSB8fCBldmVudC5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGV2ZW50O1xuICAgIHJldHVybiBpbnRlcm5hbERhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jb3VudCcpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi8uLi9jb25maWcnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBXU01lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdXU01lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFdTTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICBcbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgaGFuZGxlRXZlbnQ6IFdTTWVzc2FnZVNvdXJjZSRoYW5kbGVFdmVudCxcbiAgICBjb25uZWN0OiBXU01lc3NhZ2VTb3VyY2UkY29ubmVjdCxcbiAgICB0cmlnZ2VyOiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlclxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBXU01lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGNvbm5lY3Qob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciBob3N0ID0gb3B0aW9ucy5ob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0LnJlcGxhY2UoLzouKi8sICcnKVxuICAgICAgICAsIHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgJzgwODAnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICAgIC8vIFRPRE8gc2hvdWxkIHVuc3Vic2NyaWJlIGRpZmZlcmVudGx5XG4gICAgICAgIHRoaXMuX3dzLm9ub3BlbiA9IHRoaXMud3Mub25tZXNzYWdlID0gdGhpcy53cy5vbmNsb3NlID0gdGhpcy53cy5vbmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl93cy5jbG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3dzID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8nICsgaG9zdCArICc6JyArIHBvcnQpO1xuXG4gICAgLy8gVE9ETyByZWNvbm5lY3Rcbn1cblxuXG5cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIgKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBfd3NTdWJzY3JpYmVyTWV0aG9kLmNhbGwodGhpcywgJ2FkZEV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyIChzb3VyY2VNZXNzYWdlKSB7XG4gICAgX3dzU3Vic2NyaWJlck1ldGhvZC5jYWxsKHRoaXMsICdyZW1vdmVFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gX3dzU3Vic2NyaWJlck1ldGhvZCAobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7ICAgIFxuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuICAgIHRoaXMuX3dzW21ldGhvZF0oc291cmNlTWVzc2FnZSwgdGhpcyk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGhhbmRsZUV2ZW50IChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlciAobXNnLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuXG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gbXNnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBkYXRhLmNhbGxiYWNrQ29ycklkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdmFyIGludGVydmFsID0gXy5kZWxheShvblRpbWVvdXQsIGNvbmZpZy53ZWJzb2NrZXQucnBjLnRpbWVvdXQpO1xuICAgICAgICB0b2dnbGVScGNTdWJzY3JpcHRpb24oJ29uY2UnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICB9ICAgIFxuXG4gICAgdGhpcy5fd3Muc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cblxuICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgdG9nZ2xlUnBjU3Vic2NyaXB0aW9uKCdvZmYnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCd3ZWJzb2NrZXQgcnBjOiB0aW1lb3V0JykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUmVzcG9uc2UobXNnLCBtc2dEYXRhKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICBpZiAodHlwZW9mIG1zZ0RhdGEgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBtc2dEYXRhLmVycm9yID8gbmV3IEVycm9yKG1zZ0RhdGEuZXJyb3IpIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbXNnRGF0YS5kYXRhKVxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignd2Vic29ja2V0IHJwYzogaW52YWxpZCByZXNwb25zZSBkYXRhJyksIG1zZ0RhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZVJwY1N1YnNjcmlwdGlvbihvbk9mZiwgY29ycklkKSB7XG4gICAgICAgIHNlbGYubWVzc2VuZ2VyW29uT2ZmXShjb25maWcud2Vic29ja2V0LnJwYy5yZXNwb25zZVByZWZpeCArIGNvcnJJZCwgb25SZXNwb25zZSk7XG4gICAgfVxufVxuIiwiOyhmdW5jdGlvbigpe1xuXG4vLyBUaGlzIHdvdWxkIGJlIHRoZSBwbGFjZSB0byBlZGl0IGlmIHlvdSB3YW50IGEgZGlmZmVyZW50XG4vLyBCYXNlMzIgaW1wbGVtZW50YXRpb25cblxudmFyIGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWZnaGprbW5wcXJ0dXZ3eHl6J1xudmFyIGFsaWFzID0geyBvOjAsIGk6MSwgbDoxLCBzOjUgfVxuXG4vKipcbiAqIEJ1aWxkIGEgbG9va3VwIHRhYmxlIGFuZCBtZW1vaXplIGl0XG4gKlxuICogUmV0dXJuIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBjaGFyYWN0ZXIgdG8gaXRzXG4gKiBieXRlIHZhbHVlLlxuICovXG5cbnZhciBsb29rdXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGFibGUgPSB7fVxuICAgIC8vIEludmVydCAnYWxwaGFiZXQnXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YWJsZVthbHBoYWJldFtpXV0gPSBpXG4gICAgfVxuICAgIC8vIFNwbGljZSBpbiAnYWxpYXMnXG4gICAgZm9yICh2YXIga2V5IGluIGFsaWFzKSB7XG4gICAgICAgIGlmICghYWxpYXMuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgICAgICAgdGFibGVba2V5XSA9IHRhYmxlWycnICsgYWxpYXNba2V5XV1cbiAgICB9XG4gICAgbG9va3VwID0gZnVuY3Rpb24oKSB7IHJldHVybiB0YWJsZSB9XG4gICAgcmV0dXJuIHRhYmxlXG59XG5cbi8qKlxuICogQSBzdHJlYW1pbmcgZW5jb2RlclxuICpcbiAqICAgICB2YXIgZW5jb2RlciA9IG5ldyBiYXNlMzIuRW5jb2RlcigpXG4gKiAgICAgdmFyIG91dHB1dDEgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDEpXG4gKiAgICAgdmFyIG91dHB1dDIgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDIpXG4gKiAgICAgdmFyIGxhc3RvdXRwdXQgPSBlbmNvZGUudXBkYXRlKGxhc3RpbnB1dCwgdHJ1ZSlcbiAqL1xuXG5mdW5jdGlvbiBFbmNvZGVyKCkge1xuICAgIHZhciBza2lwID0gMCAvLyBob3cgbWFueSBiaXRzIHdlIHdpbGwgc2tpcCBmcm9tIHRoZSBmaXJzdCBieXRlXG4gICAgdmFyIGJpdHMgPSAwIC8vIDUgaGlnaCBiaXRzLCBjYXJyeSBmcm9tIG9uZSBieXRlIHRvIHRoZSBuZXh0XG5cbiAgICB0aGlzLm91dHB1dCA9ICcnXG5cbiAgICAvLyBSZWFkIG9uZSBieXRlIG9mIGlucHV0XG4gICAgLy8gU2hvdWxkIG5vdCByZWFsbHkgYmUgdXNlZCBleGNlcHQgYnkgXCJ1cGRhdGVcIlxuICAgIHRoaXMucmVhZEJ5dGUgPSBmdW5jdGlvbihieXRlKSB7XG4gICAgICAgIC8vIGNvZXJjZSB0aGUgYnl0ZSB0byBhbiBpbnRcbiAgICAgICAgaWYgKHR5cGVvZiBieXRlID09ICdzdHJpbmcnKSBieXRlID0gYnl0ZS5jaGFyQ29kZUF0KDApXG5cbiAgICAgICAgaWYgKHNraXAgPCAwKSB7IC8vIHdlIGhhdmUgYSBjYXJyeSBmcm9tIHRoZSBwcmV2aW91cyBieXRlXG4gICAgICAgICAgICBiaXRzIHw9IChieXRlID4+ICgtc2tpcCkpXG4gICAgICAgIH0gZWxzZSB7IC8vIG5vIGNhcnJ5XG4gICAgICAgICAgICBiaXRzID0gKGJ5dGUgPDwgc2tpcCkgJiAyNDhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChza2lwID4gMykge1xuICAgICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhIHRvIHByb2R1Y2UgYSBjaGFyYWN0ZXIsIGdldCB1cyBhbm90aGVyIG9uZVxuICAgICAgICAgICAgc2tpcCAtPSA4XG4gICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNraXAgPCA0KSB7XG4gICAgICAgICAgICAvLyBwcm9kdWNlIGEgY2hhcmFjdGVyXG4gICAgICAgICAgICB0aGlzLm91dHB1dCArPSBhbHBoYWJldFtiaXRzID4+IDNdXG4gICAgICAgICAgICBza2lwICs9IDVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgLy8gRmx1c2ggYW55IHJlbWFpbmluZyBiaXRzIGxlZnQgaW4gdGhlIHN0cmVhbVxuICAgIHRoaXMuZmluaXNoID0gZnVuY3Rpb24oY2hlY2spIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0ICsgKHNraXAgPCAwID8gYWxwaGFiZXRbYml0cyA+PiAzXSA6ICcnKSArIChjaGVjayA/ICckJyA6ICcnKVxuICAgICAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBhZGRpdGlvbmFsIGlucHV0XG4gKlxuICogaW5wdXQ6IHN0cmluZyBvZiBieXRlcyB0byBjb252ZXJ0XG4gKiBmbHVzaDogYm9vbGVhbiwgc2hvdWxkIHdlIGZsdXNoIGFueSB0cmFpbGluZyBiaXRzIGxlZnRcbiAqICAgICAgICBpbiB0aGUgc3RyZWFtXG4gKiByZXR1cm5zOiBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyAnaW5wdXQnIGluIGJhc2UzMlxuICovXG5cbkVuY29kZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGlucHV0LCBmbHVzaCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICAgICAgaSArPSB0aGlzLnJlYWRCeXRlKGlucHV0W2ldKVxuICAgIH1cbiAgICAvLyBjb25zdW1lIGFsbCBvdXRwdXRcbiAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXRcbiAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgaWYgKGZsdXNoKSB7XG4gICAgICBvdXRwdXQgKz0gdGhpcy5maW5pc2goKVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbi8vIEZ1bmN0aW9ucyBhbmFsb2dvdXNseSB0byBFbmNvZGVyXG5cbmZ1bmN0aW9uIERlY29kZXIoKSB7XG4gICAgdmFyIHNraXAgPSAwIC8vIGhvdyBtYW55IGJpdHMgd2UgaGF2ZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJcbiAgICB2YXIgYnl0ZSA9IDAgLy8gY3VycmVudCBieXRlIHdlJ3JlIHByb2R1Y2luZ1xuXG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuXG4gICAgLy8gQ29uc3VtZSBhIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0sIHN0b3JlXG4gICAgLy8gdGhlIG91dHB1dCBpbiB0aGlzLm91dHB1dC4gQXMgYmVmb3JlLCBiZXR0ZXJcbiAgICAvLyB0byB1c2UgdXBkYXRlKCkuXG4gICAgdGhpcy5yZWFkQ2hhciA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFyICE9ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhciA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hhciA9IGNoYXIudG9Mb3dlckNhc2UoKVxuICAgICAgICB2YXIgdmFsID0gbG9va3VwKClbY2hhcl1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGNoYXJhY3RlciBkb2VzIG5vdCBleGlzdCBpbiBvdXIgbG9va3VwIHRhYmxlXG4gICAgICAgICAgICByZXR1cm4gLy8gc2tpcCBzaWxlbnRseS4gQW4gYWx0ZXJuYXRpdmUgd291bGQgYmU6XG4gICAgICAgICAgICAvLyB0aHJvdyBFcnJvcignQ291bGQgbm90IGZpbmQgY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgaW4gbG9va3VwIHRhYmxlLicpXG4gICAgICAgIH1cbiAgICAgICAgdmFsIDw8PSAzIC8vIG1vdmUgdG8gdGhlIGhpZ2ggYml0c1xuICAgICAgICBieXRlIHw9IHZhbCA+Pj4gc2tpcFxuICAgICAgICBza2lwICs9IDVcbiAgICAgICAgaWYgKHNraXAgPj0gOCkge1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gcHJlZHVjZSBvdXRwdXRcbiAgICAgICAgICAgIHRoaXMub3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcbiAgICAgICAgICAgIHNraXAgLT0gOFxuICAgICAgICAgICAgaWYgKHNraXAgPiAwKSBieXRlID0gKHZhbCA8PCAoNSAtIHNraXApKSAmIDI1NVxuICAgICAgICAgICAgZWxzZSBieXRlID0gMFxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uKGNoZWNrKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dCArIChza2lwIDwgMCA/IGFscGhhYmV0W2JpdHMgPj4gM10gOiAnJykgKyAoY2hlY2sgPyAnJCcgOiAnJylcbiAgICAgICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxufVxuXG5EZWNvZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihpbnB1dCwgZmx1c2gpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVhZENoYXIoaW5wdXRbaV0pXG4gICAgfVxuICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dFxuICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgIG91dHB1dCArPSB0aGlzLmZpbmlzaCgpXG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRcbn1cblxuLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uc1xuICpcbiAqIFRoZXNlIGFyZSB0aGUgb25lcyB0byB1c2UgaWYgeW91IGp1c3QgaGF2ZSBhIHN0cmluZyBhbmRcbiAqIHdhbnQgdG8gY29udmVydCBpdCB3aXRob3V0IGRlYWxpbmcgd2l0aCBzdHJlYW1zIGFuZCB3aGF0bm90LlxuICovXG5cbi8vIFN0cmluZyBvZiBkYXRhIGdvZXMgaW4sIEJhc2UzMi1lbmNvZGVkIHN0cmluZyBjb21lcyBvdXQuXG5mdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcbiAgdmFyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpXG4gIHZhciBvdXRwdXQgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgcmV0dXJuIG91dHB1dFxufVxuXG4vLyBCYXNlMzItZW5jb2RlZCBzdHJpbmcgZ29lcyBpbiwgZGVjb2RlZCBkYXRhIGNvbWVzIG91dC5cbmZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICAgIHZhciBkZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICAgIHZhciBvdXRwdXQgPSBkZWNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbnZhciBiYXNlMzIgPSB7XG4gICAgRGVjb2RlcjogRGVjb2RlcixcbiAgICBFbmNvZGVyOiBFbmNvZGVyLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGRlY29kZTogZGVjb2RlXG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXIgLSBPTUchXG4gIHdpbmRvdy5iYXNlMzIgPSBiYXNlMzJcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIC8vIG5vZGVqcy9icm93c2VyaWZ5XG4gIG1vZHVsZS5leHBvcnRzID0gYmFzZTMyXG59XG59KSgpO1xuIiwiXG4vLyBub3QgaW1wbGVtZW50ZWRcbi8vIFRoZSByZWFzb24gZm9yIGhhdmluZyBhbiBlbXB0eSBmaWxlIGFuZCBub3QgdGhyb3dpbmcgaXMgdG8gYWxsb3dcbi8vIHVudHJhZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1peGluO1xuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWl4aW5gIC0gYW4gYWJzdHJhY3QgTWl4aW4gY2xhc3MuXG4gKiBDYW4gYmUgc3ViY2xhc3NlZCB1c2luZzpcbiAqIGBgYFxuICogdmFyIE15TWl4aW4gPSBfLmNyZWF0ZVN1YmNsYXNzKG1pbG8uY2xhc3Nlcy5NaXhpbiwgJ015TWl4aW4nKTtcbiAqIGBgYFxuICpcbiAqIE1peGluIHBhdHRlcm4gaXMgYWxzbyB1c2VkLCBidXQgTWl4aW4gaW4gbWlsbyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNlcGFyYXRlIG9iamVjdCB0aGF0IGlzIHN0b3JlZCBvbiB0aGUgcHJvcGVydHkgb2YgdGhlIGhvc3Qgb2JqZWN0IGFuZCBjYW4gY3JlYXRlIHByb3h5IG1ldGhvZHMgb24gdGhlIGhvc3Qgb2JqZWN0IGlmIHJlcXVpcmVkLlxuICogQ2xhc3NlcyBbTWVzc2VuZ2VyXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFtNZXNzYWdlU291cmNlXSguLi9tZXNzZW5nZXIvbV9zb3VyY2UuanMuaHRtbCkgYXJlIHN1YmNsYXNzZXMgb2YgTWl4aW4gYWJzdHJhY3QgY2xhc3MuIGB0aGlzYCBpbiBwcm94eSBtZXRob2RzIHJlZmVycyB0byBNaXhpbiBpbnN0YW5jZSwgdGhlIHJlZmVyZW5jZSB0byB0aGUgaG9zdCBvYmplY3QgaXMgYHRoaXMuX2hvc3RPYmplY3RgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB3aGVyZSBhIE1peGluIGluc3RhbmNlIHdpbGwgYmUgc3RvcmVkIG9uLiBJdCBpcyB1c2VkIHRvIHByb3h5IG1ldGhvZHMgYW5kIGFsc28gdG8gZmluZCB0aGUgcmVmZXJlbmNlIHdoZW4gaXQgaXMgbmVlZGVkIGZvciBob3N0IG9iamVjdCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm94eU1ldGhvZHMgT3B0aW9uYWwgbWFwIG9mIHByb3h5IG1ldGhvZCBuYW1lcyBhcyBrZXlzIGFuZCBNaXhpbiBtZXRob2RzIG5hbWVzIGFzIHZhbHVlcywgc28gcHJveGllZCBtZXRob2RzIGNhbiBiZSByZW5hbWVkIHRvIGF2b2lkIG5hbWUtc3BhY2UgY29uZmxpY3RzIGlmIHR3byBkaWZmZXJlbnQgTWl4aW4gaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgbWV0aG9kIG5hbWVzIGFyZSBwdXQgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWxsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBpbml0IG1ldGhvZCBvZiBNaXhpbiBzdWJjbGFzcyB0b2dldGhlciB3aXRoIGhvc3RPYmplY3QgYW5kIHByb3h5TWV0aG9kc1xuICogQHJldHVybiB7TWl4aW59XG4gKi9cbmZ1bmN0aW9uIE1peGluKGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcykgeyAvLyAsIG90aGVyIGFyZ3MgLSBwYXNzZWQgdG8gaW5pdCBtZXRob2RcbiAgICBjaGVjayhob3N0T2JqZWN0LCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihPYmplY3QsIEZ1bmN0aW9uKSkpO1xuXG4gICAgLy8gc3RvcmUgaG9zdE9iamVjdFxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19ob3N0T2JqZWN0JywgaG9zdE9iamVjdCk7XG5cbiAgICAvLyBwcm94eSBtZXRob2RzIHRvIGhvc3RPYmplY3RcbiAgICBpZiAocHJveHlNZXRob2RzKVxuICAgICAgICB0aGlzLl9jcmVhdGVQcm94eU1ldGhvZHMocHJveHlNZXRob2RzKTtcblxuICAgIC8vIGNhbGxpbmcgaW5pdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSBjbGFzc1xuICAgIGlmICh0aGlzLmluaXQpXG4gICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogIyMjI01peGluIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgY29uc3RydWN0b3IsIHRoZXkgYXJlIG5vdCB0byBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLlxuICpcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZF0oI19jcmVhdGVQcm94eU1ldGhvZClcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZHNdKCNfY3JlYXRlUHJveHlNZXRob2RzKVxuICovXG5fLmV4dGVuZFByb3RvKE1peGluLCB7XG4gICAgX2NyZWF0ZVByb3h5TWV0aG9kOiBfY3JlYXRlUHJveHlNZXRob2QsICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBfY3JlYXRlUHJveHlNZXRob2RzOiBfY3JlYXRlUHJveHlNZXRob2RzICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbn0pO1xuXG5cbi8qKlxuICogIyMjI01peGluIGNsYXNzIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiBob3N0IGNsYXNzIGRlY2xhcmF0aW9uLlxuICpcbiAqIC0gW3VzZVdpdGhdKCNNaXhpbiQkdXNlV2l0aClcbiAqL1xuXy5leHRlbmQoTWl4aW4sIHtcbiAgICB1c2VXaXRoOiBNaXhpbiQkdXNlV2l0aFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJveGllZCBtZXRob2Qgb2YgTWl4aW4gc3ViY2xhc3Mgb24gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1peGluTWV0aG9kTmFtZSBuYW1lIG9mIG1ldGhvZCBpbiBNaXhpbiBzdWJjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3h5TWV0aG9kTmFtZSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kKHByb3h5TWV0aG9kTmFtZSwgbWl4aW5NZXRob2ROYW1lLCBob3N0T2JqZWN0KSB7XG4gICAgaG9zdE9iamVjdCA9IGhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcblxuICAgIC8vIE1peGluIGNsYXNzIGRvZXMgbm90IGFsbG93IHNoYWRvd2luZyBtZXRob2RzIHRoYXQgZXhpc3Qgb24gdGhlIGhvc3Qgb2JqZWN0XG4gICAgaWYgKGhvc3RPYmplY3RbcHJveHlNZXRob2ROYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXRob2QgJyArIHByb3h5TWV0aG9kTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFscmVhZHkgZGVmaW5lZCBpbiBob3N0IG9iamVjdCcpO1xuXG4gICAgdmFyIG1ldGhvZCA9IHRoaXNbbWl4aW5NZXRob2ROYW1lXVxuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgLy8gQmluZCBwcm94aWVkIE1peGluJ3MgbWV0aG9kIHRvIE1peGluIGluc3RhbmNlXG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kTmFtZSwgYm91bmRNZXRob2QsIF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHByb3hpZWQgbWV0aG9kcyBvZiBNaXhpbiBzdWJjbGFzcyBvbiBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBwcm94eU1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1peGluIG1ldGhvZCBuYW1lLiBDYW4gYmUgYXJyYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBhbiBvcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kcyhwcm94eU1ldGhvZHMsIGhvc3RPYmplY3QpIHtcbiAgICBjaGVjayhwcm94eU1ldGhvZHMsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKFtTdHJpbmddLCBNYXRjaC5PYmplY3RIYXNoKFN0cmluZykpKSk7XG5cbiAgICAvLyBjcmVhdGluZyBhbmQgYmluZGluZyBwcm94eSBtZXRob2RzIG9uIHRoZSBob3N0IG9iamVjdFxuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3h5TWV0aG9kcykpXG4gICAgICAgIHByb3h5TWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIC8vIG1ldGhvZCBjYWxsZWQgdGhpcyB3YXkgdG8gYWxsb3cgdXNpbmcgX2NyZWF0ZVByb3h5TWV0aG9kcyB3aXRoIG9iamVjdHNcbiAgICAgICAgICAgIC8vIHRoYXQgYXJlIG5vdCBpbmhlcml0aW5nIGZyb20gTWl4aW5cbiAgICAgICAgICAgIF9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKHRoaXMsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGhvc3RPYmplY3QpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZWFjaEtleShwcm94eU1ldGhvZHMsIGZ1bmN0aW9uKG1peGluTWV0aG9kTmFtZSwgcHJveHlNZXRob2ROYW1lKSB7XG4gICAgICAgICAgICAvLyBtZXRob2QgY2FsbGVkIHRoaXMgd2F5IHRvIGFsbG93IHVzaW5nIF9jcmVhdGVQcm94eU1ldGhvZHMgd2l0aCBvYmplY3RzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBub3QgaW5oZXJpdGluZyBmcm9tIE1peGluXG4gICAgICAgICAgICBfY3JlYXRlUHJveHlNZXRob2QuY2FsbCh0aGlzLCBwcm94eU1ldGhvZE5hbWUsIG1peGluTWV0aG9kTmFtZSwgaG9zdE9iamVjdCk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU2V0cyBtaXhpbiBpbnN0YW5jZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBob3N0IGNsYXNzXG4gKiBDYW4gYmUgY2FsbGVkIG9ubHkgb25jZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob3N0Q2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnN0YW5jZUtleVxuICovXG5mdW5jdGlvbiBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpIHtcbiAgICBjaGVjayhob3N0Q2xhc3MsIEZ1bmN0aW9uKTtcbiAgICBjaGVjayhpbnN0YW5jZUtleSwgTWF0Y2guSWRlbnRpZmllclN0cmluZyk7XG5cbiAgICB2YXIgcHJvcCA9IGNvbmZpZy5taXhpbi5pbnN0YW5jZVByb3BlcnRpZXNNYXBcbiAgICAgICAgLCBpbnN0YW5jZUtleXMgPSBob3N0Q2xhc3NbcHJvcF0gPSBob3N0Q2xhc3NbcHJvcF0gfHwge307XG5cbiAgICBpZiAoaW5zdGFuY2VLZXlzW21ldGhvZC5uYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXhpbjogaW5zdGFuY2UgcHJvcGVydHkgZm9yIG1ldGhvZCB3aXRoIG5hbWUgJ1xuICAgICAgICAgICAgKyBtZXRob2QubmFtZSArICcgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIGluc3RhbmNlS2V5c1ttZXRob2QubmFtZV0gPSBpbnN0YW5jZUtleTtcbn1cblxuXG4vKipcbiAqIEFkZHMgbWV0aG9kIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge1N0cmluZ30gbWl4aW5NZXRob2ROYW1lIG5hbWUgb2YgbWV0aG9kIGluIE1peGluIHN1YmNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdE1ldGhvZE5hbWUgKG9wdGlvbmFsKSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0LCBzYW1lIGlmIG5vdCBzcGVjaWZpZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IG9iamVjdCBjbGFzcywgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyICgybmQgb3IgM3JkKVxuICovXG5mdW5jdGlvbiBNaXhpbl9hZGRNZXRob2QoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgIHZhciBtZXRob2QgPSB0aGlzLnByb3RvdHlwZVttaXhpbk1ldGhvZE5hbWVdO1xuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgdmFyIHdyYXBwZWRNZXRob2QgPSBfd3JhcE1peGluTWV0aG9kLmNhbGwodGhpcywgbWV0aG9kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkoaG9zdENsYXNzLnByb3RvdHlwZSwgaG9zdE1ldGhvZE5hbWUsIHdyYXBwZWRNZXRob2QsIF8uV1JJVCk7XG5cbiAgICBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpXG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG1ldGhvZCB0aGF0IHdpbGwgYmUgZXhwb3NlZCBvbiB0aGUgaG9zdCBjbGFzcyBwcm90b3R5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIF93cmFwTWl4aW5NZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgbWl4aW5JbnN0YW5jZSA9IF9nZXRNaXhpbkluc3RhbmNlLmNhbGwodGhpcywgbWV0aG9kLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KG1peGluSW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBtaXhpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBtZXRob2RzIGFyZSBleHBvc2VkIG9uIHRoZSBob3N0IGNsYXNzIHByb3RvdHlwZSAodXNpbmcgYWRkTWVodG9kcykgcmF0aGVyIHRoYW4gb24gaG9zdCBpbnN0YW5jZS5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCB1c2UgdGhpcyBtZXRob2RzIC0gd2hlbmV2ZXIgc3ViY2xhc3MgbWV0aG9kIGlzIGV4cG9zZWQgb24gdGhlIHByb3RvdHlwZSBpdCB3aWxsIGJlIHdyYXBwZWQgdG8gc2V0IGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHN1YmNsYXNzIG1ldGhvZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfZ2V0TWl4aW5JbnN0YW5jZShtZXRob2ROYW1lKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNaXhpbikgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGluc3RhbmNlS2V5cyA9IHRoaXMuY29uc3RydWN0b3JbY29uZmlnLm1peGluLmluc3RhbmNlUHJvcGVydGllc01hcF1cbiAgICByZXR1cm4gdGhpc1tpbnN0YW5jZUtleXNbbWV0aG9kTmFtZV1dO1xufVxuXG5cbi8qKlxuICogQWRkcyBtZXRob2RzIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0Q2xhc3MgaG9zdCBvYmplY3QgY2xhc3M7IG11c3QgYmUgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtTdHJpbmd9IGluc3RhbmNlS2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgaG9zdCBjbGFzcyBpbnN0YW5jZSB3aWxsIHN0b3JlIG1peGluIGluc3RhbmNlIG9uXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBtaXhpbk1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIGhvc3QgbWV0aG9kIG5hbWUsIHZhbHVlIC0gbWl4aW4gbWV0aG9kIG5hbWUuIENhbiBiZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gTWl4aW4kJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgY2hlY2sobWl4aW5NZXRob2RzLCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihbU3RyaW5nXSwgTWF0Y2guT2JqZWN0SGFzaChTdHJpbmcpKSkpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWl4aW5NZXRob2RzKSlcbiAgICAgICAgbWl4aW5NZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIGVsc2VcbiAgICAgICAgXy5lYWNoS2V5KG1peGluTWV0aG9kcywgZnVuY3Rpb24obWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzXG5cbnZhciBjbGFzc2VzID0ge1xuICAgIE1peGluOiByZXF1aXJlKCcuL2Fic3RyYWN0L21peGluJyksXG4gICAgTWVzc2FnZVNvdXJjZTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbV9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJNZXNzYWdlU291cmNlOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tc25ncl9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJBUEk6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21fYXBpJyksXG4gICAgTWVzc2VuZ2VyUmVnZXhwQVBJOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tX2FwaV9yeCcpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbmZpZztcblxuZnVuY3Rpb24gY29uZmlnKG9wdGlvbnMpIHtcbiAgICBfLmRlZXBFeHRlbmQoY29uZmlnLCBvcHRpb25zKTtcbn1cblxuY29uZmlnKHtcbiAgICBtaXhpbjoge1xuICAgICAgICBpbnN0YW5jZVByb3BlcnRpZXNNYXA6ICdfX19taXhpbl9pbnN0YW5jZXMnXG4gICAgfSxcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBkZWJ1ZzogZmFsc2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWl4aW4gPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9taXhpbicpXG4gICAgLCBNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8qKlxuICogYG1pbG8uTWVzc2VuZ2VyYFxuICogQSBnZW5lcmljIE1lc3NlbmdlciBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIGFsbCBraW5kcyBvZiBtZXNzYWdpbmcgaW4gbWlsby4gSXQgaXMgc3ViY2xhc3NlZCBmcm9tIFtNaXhpbl0oLi4vYWJzdHJhY3QvbWl4aW4uanMuaHRtbCkgYW5kIGl0IHByb3hpZXMgaXRzIG1ldGhvZHMgdG8gdGhlIGhvc3Qgb2JqZWN0IGZvciBjb252ZW5pZW5jZS5cbiAqIEFsbCBmYWNldHMgYW5kIGNvbXBvbmVudHMgaGF2ZSBtZXNzZW5nZXIgYXR0YWNoZWQgdG8gdGhlbS4gTWVzc2VuZ2VyIGNsYXNzIGludGVyb3BlcmF0ZXMgd2l0aCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcyB0aGF0IGNvbm5lY3RzIHRoZSBtZXNzZW5nZXIgdG8gc29tZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMgKGUuZy4sIERPTSBldmVudHMpIGFuZCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGNsYXNzIHRoYXQgYWxsb3dzIHRvIGRlZmluZSBoaWdoZXIgbGV2ZWwgbWVzc2FnZXMgdGhhbiBtZXNzYWdlcyB0aGF0IGV4aXN0IG9uIHRoZSBzb3VyY2UuXG4gKiBNZXNzZW5nZXIgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGluIG1pbG8gYW5kIGNhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYW55IG9iamVjdHMvY2xhc3NlcyBpbiB0aGUgYXBwbGljYXRpb24uXG4gKiBtaWxvIGFsc28gZGVmaW5lcyBhIGdsb2JhbCBtZXNzZW5nZXIgW21pbG8ubWFpbF0oLi4vbWFpbC9pbmRleC5qcy5odG1sKSB0aGF0IGRpc3BhdGNoZXMgYGRvbXJlYWR5YCBldmVudCBhbmQgY2FuIGJlIHVzZWQgZm9yIGFueSBhcHBsaWNhdGlvbiB3aWRlIG1lc3NhZ2luZy5cbiAqIFRvIGluaXRpYWxpemUgeW91ciBhcHAgYWZ0ZXIgRE9NIGlzIHJlYWR5IHVzZTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdkb21yZWFkeScsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqIG9yIHRoZSBmb2xsb3dpbmcgc2hvcnRlciBmb3JtIG9mIHRoZSBzYW1lOlxuICogYGBgXG4gKiBtaWxvKGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqL1xudmFyIE1lc3NlbmdlciA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzZW5nZXInKTtcblxudmFyIG1lc3NhZ2VzU3BsaXRSZWdFeHAgPSBNZXNzZW5nZXIubWVzc2FnZXNTcGxpdFJlZ0V4cCA9IC9cXHMqKD86XFwsfFxccylcXHMqLztcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdClcbiAqIC0gW29uXSgjTWVzc2VuZ2VyJG9uKSAoYWxpYXMgLSBvbk1lc3NhZ2UsIGRlcHJlY2F0ZWQpXG4gKiAtIFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSAoYWxpYXMgLSBvZmZNZXNzYWdlLCBkZXByZWNhdGVkKVxuICogLSBbb25NZXNzYWdlc10oI29uTWVzc2FnZXMpXG4gKiAtIFtvZmZNZXNzYWdlc10oI29mZk1lc3NhZ2VzKVxuICogLSBbb25jZV0oI29uY2UpXG4gKiAtIFtvbmNlU3luY10oI29uY2VTeW5jKVxuICogLSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSlcbiAqIC0gW2dldFN1YnNjcmliZXJzXSgjZ2V0U3Vic2NyaWJlcnMpXG4gKlxuICogXCJQcml2YXRlXCIgbWV0aG9kc1xuICpcbiAqIC0gW19jaG9vc2VTdWJzY3JpYmVyc0hhc2hdKCNfY2hvb3NlU3Vic2NyaWJlcnNIYXNoKVxuICogLSBbX3JlZ2lzdGVyU3Vic2NyaWJlcl0oI19yZWdpc3RlclN1YnNjcmliZXIpXG4gKiAtIFtfcmVtb3ZlU3Vic2NyaWJlcl0oI19yZW1vdmVTdWJzY3JpYmVyKVxuICogLSBbX3JlbW92ZUFsbFN1YnNjcmliZXJzXSgjX3JlbW92ZUFsbFN1YnNjcmliZXJzKVxuICogLSBbX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnNdKCNfY2FsbFBhdHRlcm5TdWJzY3JpYmVycylcbiAqIC0gW19jYWxsU3Vic2NyaWJlcnNdKCNfY2FsbFN1YnNjcmliZXJzKVxuICogLSBbX3NldE1lc3NhZ2VTb3VyY2VdKCNfc2V0TWVzc2FnZVNvdXJjZSlcbiAqIC0gW2dldE1lc3NhZ2VTb3VyY2VdKCNnZXRNZXNzYWdlU291cmNlKVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3Nlbmdlciwge1xuICAgIGluaXQ6IGluaXQsIC8vIGNhbGxlZCBieSBNaXhpbiAoc3VwZXJjbGFzcylcbiAgICBkZXN0cm95OiBNZXNzZW5nZXIkZGVzdHJveSxcbiAgICBvbjogTWVzc2VuZ2VyJG9uLFxuICAgIG9uY2U6IE1lc3NlbmdlciRvbmNlLFxuICAgIG9uY2VTeW5jOiBNZXNzZW5nZXIkb25jZVN5bmMsXG4gICAgb25TeW5jOiBNZXNzZW5nZXIkb25TeW5jLFxuICAgIG9uQXN5bmM6IE1lc3NlbmdlciRvbkFzeW5jLFxuICAgIG9uTWVzc2FnZTogTWVzc2VuZ2VyJG9uLCAvLyBkZXByZWNhdGVkXG4gICAgb2ZmOiBNZXNzZW5nZXIkb2ZmLFxuICAgIG9mZk1lc3NhZ2U6IE1lc3NlbmdlciRvZmYsIC8vIGRlcHJlY2F0ZWRcbiAgICBvbk1lc3NhZ2VzOiBvbk1lc3NhZ2VzLFxuICAgIG9mZk1lc3NhZ2VzOiBvZmZNZXNzYWdlcyxcbiAgICBvZmZBbGw6IE1lc3NlbmdlciRvZmZBbGwsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIHBvc3RNZXNzYWdlU3luYzogcG9zdE1lc3NhZ2VTeW5jLFxuICAgIGdldFN1YnNjcmliZXJzOiBnZXRTdWJzY3JpYmVycyxcbiAgICBnZXRNZXNzYWdlU291cmNlOiBnZXRNZXNzYWdlU291cmNlLFxuICAgIF9jaG9vc2VTdWJzY3JpYmVyc0hhc2g6IF9jaG9vc2VTdWJzY3JpYmVyc0hhc2gsXG4gICAgX3JlZ2lzdGVyU3Vic2NyaWJlcjogX3JlZ2lzdGVyU3Vic2NyaWJlcixcbiAgICBfcmVtb3ZlU3Vic2NyaWJlcjogX3JlbW92ZVN1YnNjcmliZXIsXG4gICAgX3JlbW92ZUFsbFN1YnNjcmliZXJzOiBfcmVtb3ZlQWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnM6IF9jYWxsUGF0dGVyblN1YnNjcmliZXJzLFxuICAgIF9jYWxsU3Vic2NyaWJlcnM6IF9jYWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxTdWJzY3JpYmVyOiBfY2FsbFN1YnNjcmliZXIsXG4gICAgX3NldE1lc3NhZ2VTb3VyY2U6IF9zZXRNZXNzYWdlU291cmNlXG59KTtcblxuXG4vKipcbiAqIEEgZGVmYXVsdCBtYXAgb2YgcHJveHkgbWV0aG9kcyB1c2VkIGJ5IENvbXBvbmVudEZhY2V0IGFuZCBDb21wb25lbnQgY2xhc3NlcyB0byBwYXNzIHRvIE1lc3NlbmdlciB3aGVuIGl0IGlzIGluc3RhbnRpYXRlZC5cbiAqIFRoaXMgbWFwIGlzIGZvciBjb252ZW5pZW5jZSBvbmx5LCBpdCBpcyBOT1QgdXNlZCBpbnRlcm5hbGx5IGJ5IE1lc3NlbmdlciwgYSBob3N0IGNsYXNzIHNob3VsZCBwYXNzIGl0IGZvciBtZXRob2RzIHRvIGJlIHByb3hpZWQgdGhpcyB3YXkuXG4gKi9cbk1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyA9IHtcbiAgICBvbjogJ29uJyxcbiAgICBvblN5bmM6ICdvblN5bmMnLFxuICAgIG9uY2U6ICdvbmNlJyxcbiAgICBvbmNlU3luYzogJ29uY2VTeW5jJyxcbiAgICBvZmY6ICdvZmYnLFxuICAgIG9uTWVzc2FnZXM6ICdvbk1lc3NhZ2VzJyxcbiAgICBvZmZNZXNzYWdlczogJ29mZk1lc3NhZ2VzJyxcbiAgICBwb3N0TWVzc2FnZTogJ3Bvc3RNZXNzYWdlJyxcbiAgICBwb3N0TWVzc2FnZVN5bmM6ICdwb3N0TWVzc2FnZVN5bmMnLFxuICAgIGdldFN1YnNjcmliZXJzOiAnZ2V0U3Vic2NyaWJlcnMnXG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyO1xuXG5cbk1lc3Nlbmdlci5zdWJzY3JpcHRpb25zID0gW107XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXIuIE1ldGhvZCBpcyBjYWxsZWQgYnkgTWl4aW4gY2xhc3MgY29uc3RydWN0b3IuXG4gKiBTZWUgW29uXSgjTWVzc2VuZ2VyJG9uKSBtZXRob2QsIFtNZXNzZW5nZXJdKCNNZXNzZW5nZXIpIGNsYXNzIGFib3ZlIGFuZCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIG1lc3NlbmdlciBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBtZXNzZW5nZXIgYW5kIGFsc28gYXMgYSBjb250ZXh0IGZvciBzdWJzY3JpYmVycyB3aGVuIHRoZXkgYXJlIGNhbGxlZCBieSB0aGUgTWVzc2VuZ2VyLiBTZWUgYG9uYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1lc3NlbmdlcidzIG1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIE9wdGlvbmFsIG1lc3NhZ2VTb3VyY2UgbGlua2VkIHRvIHRoZSBtZXNzZW5nZXIuIElmIG1lc3NhZ2VTb3VyY2UgaXMgc3VwcGxpZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciB3aWxsIHN0b3JlZCBvbiBpdHMgJ21lc3NlbmdlcicgcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NhZ2VTb3VyY2UpIHtcbiAgICAvLyBob3N0T2JqZWN0IGFuZCBwcm94eU1ldGhvZHMgYXJlIHVzZWQgaW4gTWl4aW4gYW5kIGNoZWNrZWQgdGhlcmVcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKTtcblxuICAgIF9pbml0aWFsaXplU3Vic2NyaWJlcnMuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZVN1YnNjcmliZXJzKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzYWdlU3Vic2NyaWJlcnM6IHt9LFxuICAgICAgICBfcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyczoge30sXG4gICAgfSwgXy5DT05GKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3Nlbmdlci4gTWF5YmUgbmVlZHMgdG8gdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmliZXJzXG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRkZXN0cm95KCkge1xuICAgIHRoaXMub2ZmQWxsKCk7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSB0aGlzLmdldE1lc3NhZ2VTb3VyY2UoKTtcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgbWVzc2FnZVNvdXJjZS5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogUmVnaXN0ZXJzIGEgc3Vic2NyaWJlciBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIG1lc3NhZ2UocykuXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3Vic2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVsLiBJdCBjYW4gYmUgdW5zdWNjZXNzZnVsIGlmIHRoZSBwYXNzZWQgc3Vic2NyaWJlciBoYXMgYWxyZWFkeSBiZWVuIHN1YnNjcmliZWQgdG8gdGhpcyBtZXNzYWdlIHR5cGUgLSBkb3VibGUgc3Vic2NyaXB0aW9uIG5ldmVyIGhhcHBlbnMgYW5kIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIGFnYWluIC0gbm8gZXJyb3Igb3Igd2FybmluZyBpcyB0aHJvd24gb3IgbG9nZ2VkLlxuICogU3Vic2NyaWJlciBpcyBwYXNzZWQgdHdvIHBhcmFtZXRlcnM6IGBtZXNzYWdlYCAoc3RyaW5nKSBhbmQgYGRhdGFgIChvYmplY3QpLiBEYXRhIG9iamVjdCBpcyBzdXBwbGllZCB3aGVuIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCwgTWVzc2VuZ2VyIGl0c2VsZiBhZGRzIG5vdGhpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBbZXZlbnRzIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cy5qcy5odG1sKSBzZW5kcyBhY3R1YWwgRE9NIGV2ZW50IHdoZW4gaXQgcG9zdHMgbWVzc2FnZS5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiAvLyBzdWJzY3JpYmVzIG9uTW91c2VVcERvd24gdG8gdHdvIERPTSBldmVudHMgb24gY29tcG9uZW50IHZpYSBldmVudHMgZmFjZXQuXG4gKiBteUNvbXAuZXZlbnRzLm9uKCdtb3VzZWRvd24gbW91c2V1cCcsIG9uTW91c2VVcERvd24pO1xuICogZnVuY3Rpb24gb25Nb3VzZVVwRG93bihldmVudFR5cGUsIGV2ZW50KSB7XG4gKiAgICAgLy8gLi4uXG4gKiB9XG4gKlxuICogbXlDb21wLmRhdGEub24oLy4rLywgZnVuY3Rpb24obXNnLCBkYXRhKSB7XG4gKiAgICAgbG9nZ2VyLmRlYnVnKG1zZywgZGF0YSk7XG4gKiB9KTsgLy8gc3Vic2NyaWJlcyBhbm9ueW1vdXMgZnVuY3Rpb24gdG8gYWxsIG5vbi1lbXB0eSBtZXNzYWdlcyBvbiBkYXRhIGZhY2V0XG4gKiAvLyBpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byB1bnN1YnNjcmliZSBhbm9ueW1vdXMgc3Vic2NyaWJlciBzZXBhcmF0ZWx5LFxuICogLy8gYnV0IG15Q29tcC5kYXRhLm9mZigvLisvKSB3aWxsIHVuc3Vic2NyaWJlIGl0XG4gKiBgYGBcbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgYWRkZWQsIHNvIGl0IGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZS5cbiAqIFtDb21wb25lbnRzXSguLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgYW5kIFtmYWNldHNdKC4uL2NvbXBvbmVudHMvY19mYWNldC5qcy5odG1sKSBjaGFuZ2UgdGhpcyBtZXRob2QgbmFtZSB0byBgb25gIHdoZW4gdGhleSBwcm94eSBpdC5cbiAqIFNlZSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlbU3RyaW5nXXxSZWdFeHB9IG1lc3NhZ2VzIE1lc3NhZ2UgdHlwZXMgdGhhdCBzaG91bGQgZW52b2tlIHRoZSBzdWJzY3JpYmVyLlxuICogIElmIHN0cmluZyBpcyBwYXNzZWQsIGl0IGNhbiBiZSBhIHNpZ2xlIG1lc3NhZ2Ugb3IgbXVsdGlwbGUgbWVzc2FnZSB0eXBlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB3aXRoIG9wdGlvbmFsIGNvbW1hcy5cbiAqICBJZiBhbiBhcnJheSBvZiBzdHJpbmdzIGlzIHBhc3NlZCwgZWFjaCBzdHJpbmcgaXMgYSBtZXNzYWdlIHR5cGUgdG8gc3Vic2NyaWJlIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBzdWJzY3JpYmVyIHdpbGwgYmUgZW52b2tlZCB3aGVuIHRoZSBtZXNzYWdlIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NlbmdlciBtYXRjaGVzIHRoZSBwYXR0ZXJuIChvciBJUyB0aGUgUmVnRXhwIHdpdGggaWRlbnRpY2FsIHBhdHRlcm4pLlxuICogIFBhdHRlcm4gc3Vic2NyaWJlciBkb2VzIE5PVCBjYXVzZSBhbnkgc3Vic2NyaXB0aW9uIHRvIE1lc3NhZ2VTb3VyY2UsIGl0IG9ubHkgY2FwdHVyZXMgbWVzc2FnZXMgdGhhdCBhcmUgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHdpdGggcHJlY2lzZSBtZXNzYWdlIHR5cGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgTWVzc2FnZSBzdWJzY3JpYmVyIC0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCBvbiB0aGUgbWVzc2VuZ2VyICh1c3VhbGx5IHZpYSBwcm94aWVkIHBvc3RNZXNzYWdlIG1ldGhvZCBvZiBob3N0IG9iamVjdCkuXG4gKiAgSWYgaG9zdE9iamVjdCB3YXMgc3VwcGxpZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yLCBob3N0T2JqZWN0IHdpbGwgYmUgdGhlIGNvbnRleHQgKHRoZSB2YWx1ZSBvZiB0aGlzKSBmb3IgdGhlIHN1YnNjcmliZXIgZW52b2NhdGlvbi5cbiAqICBTdWJzY3JpYmVyIGNhbiBhbHNvIGJlIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHN1YnNjcmliZXJgIChmdW5jdGlvbikgYW5kIGBjb250ZXh0YCAoXCJ0aGlzXCIgdmFsdWUgd2hlbiBzdWJzY3JpYmVyIGlzIGNhbGxlZClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2UobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgZGlzcGF0Y2hUaW1lczogMSB9KTtcbn1cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2VTeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IGRpc3BhdGNoVGltZXM6IDEsIHN5bmM6IHRydWUgfSk7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uU3luYyhtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBzeW5jOiB0cnVlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbkFzeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IHN5bmM6IGZhbHNlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucyhtZXNzYWdlcywgc3Vic2NyaWJlciwgb3B0aW9ucykge1xuICAgIGNoZWNrKG1lc3NhZ2VzLCBNYXRjaC5PbmVPZihTdHJpbmcsIFtTdHJpbmddLCBSZWdFeHApKTtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwge1xuICAgICAgICBzdWJzY3JpYmVyOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dDogTWF0Y2guQW55LFxuICAgICAgICBvcHRpb25zOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgIH0pKTtcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHN1YnNjcmliZXIgPSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5faG9zdE9iamVjdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMgPSBzdWJzY3JpYmVyLm9wdGlvbnMgfHwge307XG4gICAgICAgIF8uZXh0ZW5kKHN1YnNjcmliZXIub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb24uY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gX01lc3Nlbmdlcl9vbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkoc3Vic2NyaWJlciwgJ19fbWVzc2FnZXMnLCBtZXNzYWdlcyk7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVnaXN0ZXJTdWJzY3JpYmVyJywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9lYWNoTWVzc2FnZShtZXRob2ROYW1lLCBtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZXMgPT0gJ3N0cmluZycpXG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaXQobWVzc2FnZXNTcGxpdFJlZ0V4cCk7XG5cbiAgICB2YXIgc3Vic2NyaWJlcnNIYXNoID0gdGhpcy5fY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2VzKTtcblxuICAgIGlmIChtZXNzYWdlcyBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0oc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb25DaGFuZ2VkID0gdGhpc1ttZXRob2ROYW1lXShzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3Vic2NyaXB0aW9uQ2hhbmdlZDtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSXQgaXMgY2FsbGVkIGJ5IFtvbl0oI01lc3NlbmdlciRvbikgdG8gcmVnaXN0ZXIgc3Vic2NyaWJlciBmb3Igb25lIG1lc3NhZ2UgdHlwZS5cbiAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3Vic2NyaWJlciBpcyBub3QgeWV0IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyBhZGRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29uXSgjTWVzc2VuZ2VyJG9uKSBiYXNlZCBvbiBNZXNzYWdlIHR5cGUsIGNhbiBiZSBgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc2Agb3IgYHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVyc2BcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2UgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgU3Vic2NyaWJlciBmdW5jdGlvbiB0byBiZSBhZGRlZCBvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBzdWJzY3JpYmVyYCAoZnVuY3Rpb24pIGFuZCBgY29udGV4dGAgKHZhbHVlIG9mIFwidGhpc1wiIHdoZW4gc3Vic2NyaWJlciBpcyBjYWxsZWQpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfcmVnaXN0ZXJTdWJzY3JpYmVyKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSwgc3Vic2NyaWJlcikge1xuICAgIGlmICghIChzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0gJiYgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLmxlbmd0aCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdID0gW107XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLnBhdHRlcm4gPSBtZXNzYWdlO1xuICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVNvdXJjZSlcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTb3VyY2Uub25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSk7XG4gICAgICAgIHZhciBub1N1YnNjcmliZXJzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWQgPSBub1N1YnNjcmliZXJzIHx8IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKSA9PSAtMTtcblxuICAgIGlmIChub3RZZXRSZWdpc3RlcmVkKVxuICAgICAgICBtc2dTdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuXG4gICAgcmV0dXJuIG5vdFlldFJlZ2lzdGVyZWQ7XG59XG5cblxuLyoqXG4gKiBGaW5kcyBzdWJzY3JpYmVyIGluZGV4IGluIHRoZSBsaXN0XG4gKlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBsaXN0IGxpc3Qgb2Ygc3Vic2NyaWJlcnNcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyBgc3Vic2NyaWJlcmAgKGZ1bmN0aW9uKSBhbmQgYGNvbnRleHRgIChcInRoaXNcIiBvYmplY3QpXG4gKi9cbmZ1bmN0aW9uIF9pbmRleE9mU3Vic2NyaWJlcihsaXN0LCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBfLmZpbmRJbmRleChsaXN0LCBmdW5jdGlvbihzdWJzY3Ipe1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVyID09IHN1YnNjci5zdWJzY3JpYmVyXG4gICAgICAgICAgICAgICAgJiYgc3Vic2NyaWJlci5jb250ZXh0ID09IHN1YnNjci5jb250ZXh0XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU3Vic2NyaWJlcyB0byBtdWx0aXBsZSBtZXNzYWdlcyBwYXNzZWQgYXMgbWFwIHRvZ2V0aGVyIHdpdGggc3Vic2NyaWJlcnMuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogbXlDb21wLmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXBcbiAqIH0pO1xuICogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnRUeXBlLCBldmVudCkge31cbiAqIGZ1bmN0aW9uIG9uTW91c2VVcChldmVudFR5cGUsIGV2ZW50KSB7fVxuICogYGBgXG4gKiBSZXR1cm5zIG1hcCB3aXRoIHRoZSBzYW1lIGtleXMgKG1lc3NhZ2UgdHlwZXMpIGFuZCBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFydGljdWxhciBzdWJzY3JpYmVyIHdhcyBhZGRlZC5cbiAqIEl0IGlzIE5PVCBwb3NzaWJsZSB0byBhZGQgcGF0dGVybiBzdWJzY3JpYmVyIHVzaW5nIHRoaXMgbWV0aG9kLCBhcyBhbHRob3VnaCB5b3UgY2FuIHVzZSBSZWdFeHAgYXMgdGhlIGtleSwgSmF2YVNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBpdCB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbRnVuY3Rpb25dfSBtZXNzYWdlU3Vic2NyaWJlcnMgTWFwIG9mIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgdG8gYmUgYWRkZWRcbiAqIEByZXR1cm4ge09iamVjdFtCb29sZWFuXX1cbiAqL1xuZnVuY3Rpb24gb25NZXNzYWdlcyhtZXNzYWdlU3Vic2NyaWJlcnMpIHtcbiAgICBjaGVjayhtZXNzYWdlU3Vic2NyaWJlcnMsIE1hdGNoLk9iamVjdEhhc2goTWF0Y2guT25lT2YoRnVuY3Rpb24sIHsgc3Vic2NyaWJlcjogRnVuY3Rpb24sIGNvbnRleHQ6IE1hdGNoLkFueSB9KSkpO1xuXG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWRNYXAgPSBfLm1hcEtleXMobWVzc2FnZVN1YnNjcmliZXJzLCBmdW5jdGlvbihzdWJzY3JpYmVyLCBtZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGEgc3Vic2NyaWJlciBmb3IgbWVzc2FnZShzKS4gUmVtb3ZlcyBhbGwgc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlIGlmIHN1YnNjcmliZXIgaXNuJ3QgcGFzc2VkLlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQuIE5vIGVycm9yIG9yIHdhcm5pbmcgaXMgdGhyb3duIG9yIGxvZ2dlZCBpZiB5b3UgcmVtb3ZlIHN1YnNjcmliZXIgdGhhdCB3YXMgbm90IHJlZ2lzdGVyZWQuXG4gKiBbQ29tcG9uZW50c10oLi4vY29tcG9uZW50cy9jX2NsYXNzLmpzLmh0bWwpIGFuZCBbZmFjZXRzXSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2hhbmdlIHRoaXMgbWV0aG9kIG5hbWUgdG8gYG9mZmAgd2hlbiB0aGV5IHByb3h5IGl0LlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIC8vIHVuc3Vic2NyaWJlcyBvbk1vdXNlVXBEb3duIGZyb20gdHdvIERPTSBldmVudHMuXG4gKiBteUNvbXAuZXZlbnRzLm9mZignbW91c2Vkb3duIG1vdXNldXAnLCBvbk1vdXNlVXBEb3duKTtcbiAqIGBgYFxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheVtTdHJpbmddfFJlZ0V4cH0gbWVzc2FnZXMgTWVzc2FnZSB0eXBlcyB0aGF0IGEgc3Vic2NyaWJlciBzaG91bGQgYmUgcmVtb3ZlZCBmb3IuXG4gKiAgSWYgc3RyaW5nIGlzIHBhc3NlZCwgaXQgY2FuIGJlIGEgc2lnbGUgbWVzc2FnZSBvciBtdWx0aXBsZSBtZXNzYWdlIHR5cGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgY29tbWFzLlxuICogIElmIGFuIGFycmF5IG9mIHN0cmluZ3MgaXMgcGFzc2VkLCBlYWNoIHN0cmluZyBpcyBhIG1lc3NhZ2UgdHlwZSB0byByZW1vdmUgYSBzdWJzY3JpYmVyIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBwYXR0ZXJuIHN1YnNjcmliZXIgd2lsbCBiZSByZW1vdmVkLlxuICogIFJlZ0V4cCBzdWJzY3JpYmVyIGRvZXMgTk9UIGNhdXNlIGFueSBzdWJzY3JpcHRpb24gdG8gTWVzc2FnZVNvdXJjZSwgaXQgb25seSBjYXB0dXJlcyBtZXNzYWdlcyB0aGF0IGFyZSBhbHJlYWR5IHN1YnNjcmliZWQgdG8gd2l0aCBwcmVjaXNlIG1lc3NhZ2UgdHlwZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIE1lc3NhZ2Ugc3Vic2NyaWJlciAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlKHMpLiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBzdXBwbGllZCwgYWxsIHN1YnNjcmliZXJzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbWVzc2FnZShzKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhtZXNzYWdlcywgTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSk7XG4gICAgY2hlY2soc3Vic2NyaWJlciwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIHtcbiAgICAgICAgc3Vic2NyaWJlcjogRnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ6IE1hdGNoLkFueSxcbiAgICAgICAgb3B0aW9uczogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSxcbiAgICAgICAgLy8gX19tZXNzYWdlczogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSlcbiAgICB9KSkpO1xuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb2ZmLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVtb3ZlU3Vic2NyaWJlcicsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEl0IGlzIGNhbGxlZCBieSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgdG8gcmVtb3ZlIHN1YnNjcmliZXIgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIFN1YnNjcmliZXIgZnVuY3Rpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX3JlbW92ZVN1YnNjcmliZXIoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICghIG1zZ1N1YnNjcmliZXJzIHx8ICEgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdGhpbmcgcmVtb3ZlZFxuXG4gICAgaWYgKHN1YnNjcmliZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBzdWJzY3JpYmVyID0geyBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLCBjb250ZXh0OiB0aGlzLl9ob3N0T2JqZWN0IH07XG5cbiAgICAgICAgdmFyIHN1YnNjcmliZXJJbmRleCA9IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCA9PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90aGluZyByZW1vdmVkXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzLnNwbGljZShzdWJzY3JpYmVySW5kZXgsIDEpO1xuICAgICAgICBpZiAoISBtc2dTdWJzY3JpYmVycy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuXG4gICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gc3Vic2NyaWJlcihzKSByZW1vdmVkXG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJdCBpcyBjYWxsZWQgYnkgW19yZW1vdmVTdWJzY3JpYmVyXSgjX3JlbW92ZVN1YnNjcmliZXIpIHRvIHJlbW92ZSBhbGwgc3Vic2NyaWJlcnMgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgdGhhdCBhbGwgbWVzc2FnZSBzdWJzY3JpYmVycyB3ZXJlIHJlbW92ZWQgc28gaXQgY2FuIHVuc3Vic2NyaWJlIGZyb20gdGhlIHNvdXJjZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpIHtcbiAgICBkZWxldGUgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICh0aGlzLl9tZXNzYWdlU291cmNlICYmIHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9tZXNzYWdlU291cmNlLm9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogVW5zdWJzY3JpYmVzIGZyb20gbXVsdGlwbGUgbWVzc2FnZXMgcGFzc2VkIGFzIG1hcCB0b2dldGhlciB3aXRoIHN1YnNjcmliZXJzLlxuICogUmV0dXJucyBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIChtZXNzYWdlIHR5cGVzKSBhbmQgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIHBhcnRpY3VsYXIgc3Vic2NyaWJlciB3YXMgcmVtb3ZlZC5cbiAqIElmIGEgc3Vic2NyaWJlciBmb3Igb25lIG9mIHRoZSBtZXNzYWdlcyBpcyBub3Qgc3VwcGxpZWQsIGFsbCBzdWJzY3JpYmVycyBmb3IgdGhpcyBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZC5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiBteUNvbXAuZXZlbnRzLm9mZk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXAsXG4gKiAgICAgJ2NsaWNrJzogdW5kZWZpbmVkIC8vIGFsbCBzdWJzY3JpYmVycyB0byB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkXG4gKiB9KTtcbiAqIGBgYFxuICogSXQgaXMgTk9UIHBvc3NpYmxlIHRvIHJlbW92ZSBwYXR0ZXJuIHN1YnNjcmliZXIocykgdXNpbmcgdGhpcyBtZXRob2QsIGFzIGFsdGhvdWdoIHlvdSBjYW4gdXNlIFJlZ0V4cCBhcyB0aGUga2V5LCBKYXZhU2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IGl0IHRvIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdFtGdW5jdGlvbl19IG1lc3NhZ2VTdWJzY3JpYmVycyBNYXAgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJuIHtPYmplY3RbQm9vbGVhbl19XG4gKi9cbmZ1bmN0aW9uIG9mZk1lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIGNoZWNrKG1lc3NhZ2VTdWJzY3JpYmVycywgTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKSkpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJSZW1vdmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBzdWJzY3JpYmVyUmVtb3ZlZE1hcDtcbn1cblxuXG4vKipcbiAqIFVuc3Vic2NyaWJlcyBhbGwgc3Vic2NyaWJlcnNcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJG9mZkFsbCgpIHtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzKTtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnMpO1xufVxuXG5cbmZ1bmN0aW9uIF9vZmZBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gpIHtcbiAgICBfLmVhY2hLZXkoc3Vic2NyaWJlcnNIYXNoLCBmdW5jdGlvbihzdWJzY3JpYmVycywgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8vIFRPRE8gLSBzZW5kIGV2ZW50IHRvIG1lc3NhZ2VTb3VyY2VcblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHRoZSBtZXNzYWdlIGNhbGxpbmcgYWxsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbWVzc2FnZSBhbmQsIGlmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCBjYWxsaW5nIGFsbCBwYXR0ZXJuIHN1YnNjcmliZXJzIHdoZW4gbWVzc2FnZSBtYXRjaGVzIHRoZSBwYXR0ZXJuLlxuICogRWFjaCBzdWJzY3JpYmVyIGlzIHBhc3NlZCB0aGUgc2FtZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGVpcyBtZXRob2QuXG4gKiBUaGUgY29udGV4dCBvZiB0aGUgc3Vic2NyaWJlciBlbnZvY2F0aW9uIGlzIHNldCB0byB0aGUgaG9zdCBvYmplY3QgKGB0aGlzLl9ob3N0T2JqZWN0YCkgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBtZXNzZW5nZXIgY29uc3RydWN0b3IuXG4gKiBTdWJzY3JpYmVycyBhcmUgY2FsbGVkIGluIHRoZSBuZXh0IHRpY2sgKFwiYXN5bmNocm9ub3VzbHlcIikgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IHdlcmUgc3Vic2NyaWJlZCB3aXRoIGBvblN5bmNgIChvciB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSB0cnVlYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZFxuICogIElmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBtZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGFuZCBhbHNvIHBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlLlxuICogIElmIHRoZSBtZXNzYWdlIGlzIFJlZ0V4cCwgb25seSB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBwYXR0ZXJuIHdpbGwgYmUgY2FsbGVkLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9zeW5jaHJvbm91cyBpZiB0cnVlIHBhc3NlZCwgc3Vic2NyaWJlcnMgd2lsbCBiZSBlbnZva2VkIHN5bmNocm9ub3VzbHkgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSBmYWxzZWAuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgdXNlZCwgaW5zdGVhZCBwb3N0TWVzc2FnZVN5bmMgc2hvdWxkIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBfc3luY2hyb25vdXMpIHtcbiAgICBjaGVjayhtZXNzYWdlLCBNYXRjaC5PbmVPZihTdHJpbmcsIFJlZ0V4cCkpO1xuICAgIGNoZWNrKGNhbGxiYWNrLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJzSGFzaCA9IHRoaXMuX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKTtcbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG5cbiAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBtc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKTtcbn1cblxuXG4vKipcbiAqIFNhbWUgYXMgcG9zdE1lc3NhZ2UgYXBhcnQgZnJvbSBlbnZva2luZyBzdWJzY3JpYmVycyBzeW5jaHJvbm91c2x5LCBhcGFydCBmcm9tIHRob3NlIHN1YnNjcmliZWQgd2l0aCBgb25Bc3luY2AgKG9yIHdpdGggYG9wdGlvbnMuc3luYyA9PSBmYWxzZWApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZVxuICogQHBhcmFtIHtBbnl9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIHRydWUpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBwYXR0ZXJuIHN1YnNjcmliZXJzIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLlxuICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgYnkgW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpIC0gc2VlIG1vcmUgaW5mb3JtYXRpb24gdGhlcmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZC4gUGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBkaXNwYXRjaGVkIG1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIE1lc3NlbmdlciBkb2VzIG5vdCBtb2RpZnkgdGhpcyBkYXRhIGluIGFueSB3YXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0byBwYXNzIHRvIHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7QXJyYXlbRnVuY3Rpb258T2JqZWN0XX0gY2FsbGVkTXNnU3Vic2NyaWJlcnMgYXJyYXkgb2Ygc3Vic2NyaWJlcnMgYWxyZWFkeSBjYWxsZWQsIHRoZXkgd29uJ3QgYmUgY2FsbGVkIGFnYWluIGlmIHRoZXkgYXJlIGFtb25nIHBhdHRlcm4gc3Vic2NyaWJlcnMuXG4gKi9cbmZ1bmN0aW9uIF9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBjYWxsZWRNc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgIGZ1bmN0aW9uKHBhdHRlcm5TdWJzY3JpYmVycykge1xuICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuU3Vic2NyaWJlcnMucGF0dGVybjtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGVkTXNnU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm5TdWJzY3JpYmVycyA9IHBhdHRlcm5TdWJzY3JpYmVycy5maWx0ZXIoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX2luZGV4T2ZTdWJzY3JpYmVyLmNhbGwodGhpcywgY2FsbGVkTXNnU3Vic2NyaWJlcnMsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBwYXR0ZXJuU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBzdWJzY3JpYmVycyBmcm9tIHRoZSBwYXNzZWQgbGlzdC5cbiAqIFRoZSBtZXRob2QgaXMgY2FsbGVkIGJ5IFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKSBhbmQgW19jYWxsUGF0dGVyblN1YnNjcmliZXJzXSgjX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BhdGNoZWQsIHBhc3NlZCB0byBzdWJzY3JpYmVycyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBtc2dTdWJzY3JpYmVycyB0aGUgYXJyYXkgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSBjYWxsZWQuIEVhY2ggc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCB0aGUgaG9zdCBvYmplY3QgKHNlZSBNZXNzZW5nZXIgY29uc3RydWN0b3IpIGFzIHRoZSBjb250ZXh0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKi9cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpIHtcbiAgICBpZiAobXNnU3Vic2NyaWJlcnMgJiYgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNsb25pbmcgaXMgbmVjZXNzYXJ5IGFzIHNvbWUgb2YgdGhlIHN1YnNjcmliZXJzXG4gICAgICAgIC8vIGNhbiBiZSB1bnN1YnNjcmliZWQgZHVyaW5nIHRoZSBkaXNwYXRjaFxuICAgICAgICAvLyBzbyB0aGlzIGFycmF5IHdvdWxkIGNoYW5nZSBpbiB0aGUgcHJvY2Vzc1xuICAgICAgICBtc2dTdWJzY3JpYmVycyA9IG1zZ1N1YnNjcmliZXJzLnNsaWNlKCk7XG5cbiAgICAgICAgbXNnU3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKSB7XG4gICAgdmFyIHN5bmNTdWJzY3JpYmVyID0gc3Vic2NyaWJlci5vcHRpb25zICYmIHN1YnNjcmliZXIub3B0aW9ucy5zeW5jXG4gICAgICAgICwgc3luY2hybyA9IChfc3luY2hyb25vdXMgJiYgc3luY1N1YnNjcmliZXIgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgfHwgc3luY1N1YnNjcmliZXI7XG5cbiAgICB2YXIgZGlzcGF0Y2hUaW1lcyA9IHN1YnNjcmliZXIub3B0aW9ucyAmJiBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcztcbiAgICBpZiAoZGlzcGF0Y2hUaW1lcykge1xuICAgICAgICBpZiAoZGlzcGF0Y2hUaW1lcyA8PSAxKSB7XG4gICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBzdWJzY3JpYmVyLl9fbWVzc2FnZXM7XG4gICAgICAgICAgICB0aGlzLm9mZihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hUaW1lcyA+IDEpXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcy0tO1xuICAgIH1cblxuICAgIGlmIChzeW5jaHJvKVxuICAgICAgICBzdWJzY3JpYmVyLnN1YnNjcmliZXIuY2FsbChzdWJzY3JpYmVyLmNvbnRleHQsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXJNZXRob2Qoc3Vic2NyaWJlci5zdWJzY3JpYmVyLCAnY2FsbCcsIHN1YnNjcmliZXIuY29udGV4dCwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN1YnNjcmliZXJzIHRoYXQgd291bGQgYmUgY2FsbGVkIGlmIHRoZSBtZXNzYWdlIHdlcmUgZGlzcGF0Y2hlZC5cbiAqIElmIGBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzID09PSBmYWxzZWAsIHBhdHRlcm4gc3Vic2NyaWJlcnMgd2l0aCBtYXRjaGluZyBwYXR0ZXJzIHdpbGwgbm90IGJlIGluY2x1ZGVkIChieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkKS5cbiAqIElmIHRoZXJlIGFyZSBubyBzdWJzY3JpYmVycyB0byB0aGUgbWVzc2FnZSwgYHVuZGVmaW5lZGAgd2lsbCBiZSByZXR1cm5lZCwgbm90IGFuIGVtcHR5IGFycmF5LCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB0aGUgcmVzdWx0IGluIGJvb2xlYW4gdGVzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIE1lc3NhZ2UgdG8gZ2V0IHN1YnNjcmliZXJzIGZvci5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBSZWdFeHAsIG9ubHkgcGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGlzIHBhdHRlcm4gd2lsbCBiZSByZXR1cm5lZC5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBTdHJpbmcsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3RyaW5nIG1lc3NhZ2VzIGFuZCBwYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBtYXRjaGluZyBwYXR0ZXJuIHdpbGwgYmUgcmV0dXJuZWQgKHVubGVzcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMgT3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpbmNsdXNpb24gb2YgcGF0dGVyIHN1YnNjcmliZXJzLCBieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkLlxuICogQHJldHVybiB7QXJyYXl8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTdWJzY3JpYmVycyhtZXNzYWdlLCBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzKSB7XG4gICAgY2hlY2sobWVzc2FnZSwgTWF0Y2guT25lT2YoU3RyaW5nLCBSZWdFeHApKTtcblxuICAgIHZhciBzdWJzY3JpYmVyc0hhc2ggPSB0aGlzLl9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZSk7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXS5jb25jYXQoc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG5cbiAgICAvLyBwYXR0ZXJuIHN1YnNjcmliZXJzIGFyZSBpbmN1ZGVkIGJ5IGRlZmF1bHRcbiAgICBpZiAoaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycyAhPT0gZmFsc2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgICAgICBmdW5jdGlvbihwYXR0ZXJuU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5TdWJzY3JpYmVycy5wYXR0ZXJuO1xuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuU3Vic2NyaWJlcnMgJiYgcGF0dGVyblN1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0dGVybi50ZXN0KG1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICBfLmFwcGVuZEFycmF5KG1zZ1N1YnNjcmliZXJzLCBwYXR0ZXJuU3Vic2NyaWJlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIHN1YnNjcmliZXJzXG4gICAgcmV0dXJuIG1zZ1N1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gbXNnU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIG1hcCBvZiBzdWJzY3JpYmVycyBmb3IgYSBnaXZlbiBtZXNzYWdlIHR5cGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZSBNZXNzYWdlIHRvIGNob29zZSB0aGUgbWFwIG9mIHN1YnNjcmliZXJzIGZvclxuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xuZnVuY3Rpb24gX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHBcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVycztcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgZm9yIHRoZSBtZXNzZW5nZXIgYWxzbyBzZXR0aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciBpbiB0aGUgTWVzc2FnZVNvdXJjZS5cbiAqIE1lc3NhZ2VTb3VyY2UgY2FuIGJlIHBhc3NlZCB0byBtZXNzYWdlIGNvbnN0cnVjdG9yOyB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gc2V0IGl0IGF0IGEgbGF0ZXIgdGltZS4gRm9yIGV4YW1wbGUsIHRoZSBzdWJjbGFzc2VzIG9mIFtDb21wb25lbnRGYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIHVzZSB0aGlzIG1ldGhvZCB0byBzZXQgZGlmZmVyZW50IE1lc3NhZ2VTb3VyY2UnZXMgaW4gdGhlIG1lc3NlbmdlciB0aGF0IGlzIGNyZWF0ZWQgYnkgQ29tcG9uZW50RmFjZXQuXG4gKiBDdXJyZW50bHkgdGhlIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBzdWNoIHdheSB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIC0gTWVzc2FnZVNvdXJjZSBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2xhc3MgdG8gYXR0YWNoIHRvIHRoaXMgbWVzc2VuZ2VyIChhbmQgdG8gaGF2ZSB0aGlzIG1lc3NlbmdlciBhdHRhY2hlZCB0byBpdCB0b28pXG4gKi9cbmZ1bmN0aW9uIF9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpIHtcbiAgICBjaGVjayhtZXNzYWdlU291cmNlLCBNZXNzYWdlU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19tZXNzYWdlU291cmNlJywgbWVzc2FnZVNvdXJjZSk7XG4gICAgbWVzc2FnZVNvdXJjZS5tZXNzZW5nZXIgPSB0aGlzO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBtZXNzZW5nZXIgTWVzc2FnZVNvdXJjZVxuICpcbiAqIEByZXR1cm4ge01lc3NhZ2VTb3VyY2V9XG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTb3VyY2Vcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NlbmdlckFQSTtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2VuZ2VyQVBJYFxuICogQmFzZSBjbGFzcywgc3ViY2xhc3NlcyBvZiB3aGljaCBjYW4gc3VwcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBieSBpbXBsZW1lbnRpbmcgdGhyZWUgbWV0aG9kczpcbiAqXG4gKiAtIGB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VgIHRvIHRyYW5zbGF0ZSBzb3VyY2UgbWVzc2FnZXMgKHJlY2lldmVkIGZyb20gZXh0ZXJuYWwgc291cmNlIHZpYSBgTWVzc2FnZVNPdXJjZWApIHRvIGludGVybmFsIG1lc3NhZ2VzICh0aGF0IGFyZSBkaXNwYXRjaGVkIG9uIE1lc3NlbmdlciksIGFsbG93aW5nIHRvIG1ha2UgaW50ZXJuYWwgbWVzc2FnZXMgbW9yZSBkZXRhaWxlZCB0aGFuIHNvdXJjZSBtZXNzYWdlcy4gRm9yIGV4YW1wbGUsIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgdXNlcyBbRGF0YU1zZ0FQSV0oLi4vY29tcG9uZW50cy9tc2dfYXBpL2RhdGEuanMuaHRtbCkgdG8gZGVmaW5lIHNldmVyYWwgaW50ZXJuYWwgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgY2hhbmdlIG9mIHN0YXRlIGluIGNvbnRlbnRlZGl0YWJsZSBET00gZWxlbWVudC5cbiAqIC0gYGNyZWF0ZUludGVybmFsRGF0YWAgdG8gbW9kaWZ5IG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHNvdXJjZSB0byBzb21lIG1vcmUgbWVhbmluZ2Z1bCBvciBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgZGF0YSB0aGF0IHdpbGwgYmUgZGlzcGF0Y2hlZCBvbiBNZXNzZW5nZXIuIEZvciBleGFtcGxlLCBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIHVzZXMgW0RhdGFNc2dBUEldKC4uL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzLmh0bWwpIChzdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkpIHRvIHRyYW5zbGF0ZSBET00gbWVzc2FnZXMgdG8gZGF0YSBjaGFuZ2UgbWVzc2FnZXMuXG4gKiAtIGBmaWx0ZXJTb3VyY2VNZXNzYWdlYCB0byBlbmFibGUvZGlzYWJsZSBtZXNzYWdlIGRpc3BhdGNoIGJhc2VkIG9uIHNvbWUgY29uZGl0aW9ucyBpbiBkYXRhLlxuICpcbiAqIElmIGBNZXNzYWdlU291cmNlYCBjb25zdHJ1Y3RvciBpcyBub3QgcGFzc2VkIGFuIGluc3RhbmNlIG9mIHNvbWUgc3ViY2xhc3Mgb2YgYE1lc3NlbmdlckFQSWAsIGl0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZXNzZW5nZXJBUEkgdGhhdCBkZWZpbmVzIGFsbCAzIG9mIHRob3NlIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheS4gU2VlIHRoZXNlIG1ldGhvZHMgYmVsb3cgZm9yIHRoZWlyIHNpZ25hdHVyZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAdGhpcyB7TWVzc2VuZ2VyQVBJfVxuICogQHJldHVybiB7TWVzc2VuZ2VyQVBJfVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJBUEkoKSB7XG4gICAgaWYgKHRoaXMuaW5pdClcbiAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgTWVzc2VuZ2VyQVBJXG4gKiAtIFthZGRJbnRlcm5hbE1lc3NhZ2VdKCNhZGRJbnRlcm5hbE1lc3NhZ2UpIC0gYWRkcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtyZW1vdmVJbnRlcm5hbE1lc3NhZ2VdKCNyZW1vdmVJbnRlcm5hbE1lc3NhZ2UpIC0gcmVtb3ZlcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtnZXRJbnRlcm5hbE1lc3NhZ2VzXSgjZ2V0SW50ZXJuYWxNZXNzYWdlcykgLSByZXR1cm5zIHRoZSBsaXN0IG9mIGludGVybmFsIG1lc3NhZ2VzIGZvciBnaXZlbiBzb3VyY2UgbWVzc2FnZVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIHJlZGVmaW5lZCBieSBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VdKCN0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UpIC0gY29udmVydHMgaW50ZXJuYWwgbWVzc2FnZSB0eXBlIHRvIHNvdXJjZSAoZXh0ZXJuYWwpIG1lc3NhZ2UgdHlwZVxuICogLSBbY3JlYXRlSW50ZXJuYWxEYXRhXSgjY3JlYXRlSW50ZXJuYWxEYXRhKSAtIGNvbnZlcnRzIHNvdXJjZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgdmlhIE1lc3NhZ2VTb3VyY2UgdG8gaW50ZXJuYWwgbWVzc2FnZSBkYXRhXG4gKiAtIFtmaWx0ZXJTb3VyY2VNZXNzYWdlXSgjZmlsdGVyU291cmNlTWVzc2FnZSkgLSBmaWx0ZXJzIHNvdXJjZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBkYXRhIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBtZXNzYWdlIHRoYXQgaXMgYWJvdXQgdG8gYmUgc2VudCBvbiBNZXNzZW5nZXJcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzZW5nZXJBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NlbmdlckFQSSRkZXN0cm95LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXMsXG5cbiAgICAvLyBzaG91bGQgYmUgcmVkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGEsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgTWVzc2VuZ2VyQVBJIGNvbnN0cnVjdG9yLiBTdWJjbGFzc2VzIHRoYXQgcmUtaW1wbGVtZW50IGBpbml0YCBtZXRob2Qgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdXNpbmc6IGBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWBcbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfaW50ZXJuYWxNZXNzYWdlcycsIHt9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3NlbmdlciBBUElcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyQVBJJGRlc3Ryb3koKSB7XG5cbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFRyYW5zbGF0ZXMgaW50ZXJuYWwgYG1lc3NhZ2VgIHRvIHNvdXJjZSBtZXNzYWdlLCBhZGRzIGludGVybmFsIGBtZXNzYWdlYCB0byB0aGUgbGlzdCwgbWFraW5nIHN1cmUgdGhlIHNhbWUgYG1lc3NhZ2VgIHdhc24ndCBwYXNzZWQgYmVmb3JlIChpdCB3b3VsZCBpbmRpY2F0ZSBNZXNzZW5nZXIgZXJyb3IpLlxuICogUmV0dXJucyBzb3VyY2UgbWVzc2FnZSBpZiBpdCBpcyB1c2VkIGZpcnN0IHRpbWUgKHNvIHRoYXQgYE1lc3NhZ2VTb3VyY2VgIHN1YmNyaWJlcyB0byB0aGlzIHNvdXJjZSBtZXNzYWdlKSBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIGFkZGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBhZGRJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBpbnRlcm5hbE1zZ3NcbiAgICAgICAgLCBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzLmhhc093blByb3BlcnR5KHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGludGVybmFsTXNncyA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIGlmIChpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKSA9PSAtMSlcbiAgICAgICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRHVwbGljYXRlIGFkZEludGVybmFsTWVzc2FnZSBjYWxsIGZvciBpbnRlcm5hbCBtZXNzYWdlICcgKyBtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gW107XG4gICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGludGVybmFsIGBtZXNzYWdlYCBmcm9tIHRoZSBsaXN0IGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIHNvdXJjZSBtZXNzYWdlIChgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlYCBpcyB1c2VkIGZvciB0cmFuc2xhdGlvbikuXG4gKiBSZXR1cm5zIHNvdXJjZSBtZXNzYWdlLCBpZiB0aGUgbGFzdCBpbnRlcm5hbCBtZXNzYWdlIHdhcyByZW1vdmVkIChzbyB0aGF0IGBNZXNzYWdlU291cmNlYCBjYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIHNvdXJjZSBtZXNzYWdlKSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCByZW1vdmVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIHZhciBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuXG4gICAgaWYgKGludGVybmFsTXNncyAmJiBpbnRlcm5hbE1zZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtZXNzYWdlSW5kZXggPSBpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKTtcbiAgICAgICAgaWYgKG1lc3NhZ2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpbnRlcm5hbE1zZ3Muc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxNc2dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcblxuXG4gICAgZnVuY3Rpb24gdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdub3RpZmljYXRpb24gcmVjZWl2ZWQ6IHVuLXN1YnNjcmliZSBmcm9tIGludGVybmFsIG1lc3NhZ2UgJyArIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICsgJyB3aXRob3V0IHByZXZpb3VzIHN1YnNjcmlwdGlvbiBub3RpZmljYXRpb24nKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBpbnRlcm5hbCBtZXNzYWdlcyB0aGF0IHdlcmUgdHJhbnNsYXRlZCB0byBnaXZlbiBgc291cmNlTWVzc2FnZWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGBNZXNzYWdlU291cmNlYCB0byBkaXNwYXRjaCBzb3VyY2UgbWVzc2FnZSBvbiB0aGUgYE1lc2VuZ2VyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZVxuICogQHJldHVybiB7QXJyYXlbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWxNZXNzYWdlcyhzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBpbnRlcm5hbCBgbWVzc2FnZWAgdG8gc291cmNlIG1lc3NhZ2UuIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgdGhlIHNhbWUgYG1lc3NhZ2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlXG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBzb3VyY2UgbWVzc2FnZSBkYXRhIHRvIGludGVybmFsIG1lc3NhZ2UgZGF0YS4gVGhpcyBjbGFzcyBzaW1wbHkgcmV0dXJucyB0aGUgc2FtZSBgc291cmNlRGF0YWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIFtkaXNwYXRjaE1lc3NhZ2VdKC4vbV9zb3VyY2UuanMuaHRtbCNkaXNwYXRjaE1lc3NhZ2UpIG1ldGhvZCBvZiBgTWVzc2FnZVNvdXJjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBzb3VyY2UgdGhhdCBoYXMgdG8gYmUgdHJhbnNsYXRlZCB0byBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IHRvIGludGVybmFsIE1lc3NlbmdlciBzdWJzY3JpYmVyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgcmV0dXJuIHNvdXJjZURhdGE7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBkaXNwYXRjaCBmaWx0ZXIgZm9yIGludGVybmFsIG1lc3NhZ2VzLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB0cnVlYCB0byBhbGxvdyBhbmQgYGZhbHNlYCB0byBwcmV2ZW50IGludGVybmFsIG1lc3NhZ2UgZGlzcGF0Y2guIFRoaXMgY2xhc3MgYWx3YXlzIHJldHVybnMgYHRydWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBbZGlzcGF0Y2hNZXNzYWdlXSguL21fc291cmNlLmpzLmh0bWwjZGlzcGF0Y2hNZXNzYWdlKSBtZXRob2Qgb2YgYE1lc3NhZ2VTb3VyY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gZmlsdGVyIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnRlcm5hbERhdGEgZGF0YSB0cmFuc2xhdGVkIGJ5IGBjcmVhdGVJbnRlcm5hbERhdGFgIG1ldGhvZCBmcm9tIHNvdXJjZSBkYXRhLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBpbnRlcm5hbERhdGEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogQSBnZW5lcmljIHN1YnNjbGFzcyBvZiBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIHRoYXQgc3VwcG9ydHMgcGF0dGVybiBzdWJzY3JpcHRpb25zIHRvIHNvdXJjZS5cbiAqIENhbiBiZSB1c2VmdWwgaWYgdGhlIHNvdXJjZSBpcyBhbm90aGVyIE1lc3Nlbmdlci5cbiAqL1xuIHZhciBNZXNzZW5nZXJSZWdleHBBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ01lc3NlbmdlclJlZ2V4cEFQSScpO1xuXG4gbW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXJSZWdleHBBUEk7XG5cblxuXy5leHRlbmRQcm90byhNZXNzZW5nZXJSZWdleHBBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXNcbn0pO1xuXG5cbi8qKlxuICogTWVzc2VuZ2VyUmVnZXhwQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlclJlZ2V4cEFQSSBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcGF0dGVybkludGVybmFsTWVzc2FnZXM6IHt9XG4gICAgfSk7XG4gICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHN0b3JpbmcgcmVnZXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIC8vIHN0b3JlIHJlZ2V4cCBpdHNlbGYgaWYgc291cmNlTWVzc2FnZSBpcyByZWdleHBcbiAgICBpZiAoc291cmNlTWVzc2FnZSAmJiBzb3VyY2VNZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV0ucGF0dGVybiA9IHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgaWYgKHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIC8uKi87XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHJlbW92aW5nIHJlZ2V4cCBzdWJzY2lycHRpb25cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLnJlbW92ZUludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgJiYgc291cmNlTWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIHZhciBub1BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzID0gISBPYmplY3Qua2V5cyh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykubGVuZ3RoO1xuICAgICAgICBpZiAobm9QYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykge1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gLy4qLztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQXVnbWVudHMgTWVzc2VuZ2VyQVBJIG1ldGhvZCBieSByZXR1cm5pbmcgbWVzc2FnZXMgc3Vic2NyaWJlZCB3aXRoIHJlZ2V4cFxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBgTWVzc2FnZVNvdXJjZWAgdG8gZGlzcGF0Y2ggc291cmNlIG1lc3NhZ2Ugb24gdGhlIGBNZXNlbmdlcmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbE1lc3NhZ2VzKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgaW50ZXJuYWxNZXNzYWdlcyA9IE1lc3NlbmdlckFQSS5wcm90b3R5cGUuZ2V0SW50ZXJuYWxNZXNzYWdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gYWRkIGludGVybmFsIG1lc3NhZ2VzIGZvciByZWdleHAgc291cmNlIHN1YnNjcmlwdGlvbnNcbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW50ZXJuYWxNZXNzYWdlcyA9IGludGVybmFsTWVzc2FnZXMgfHwgW107XG4gICAgICAgIHZhciBpbnRlcm5hbE1lc3NhZ2VzSGFzaCA9IF8ub2JqZWN0KGludGVybmFsTWVzc2FnZXMsIHRydWUpO1xuXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcywgZnVuY3Rpb24ocGF0dGVybk1lc3NhZ2VzKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlUGF0dGVybiA9IHBhdHRlcm5NZXNzYWdlcy5wYXR0ZXJuO1xuXG4gICAgICAgICAgICBpZiAoc291cmNlUGF0dGVybi50ZXN0KHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgIHBhdHRlcm5NZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZXNIYXNoW21lc3NhZ2VdKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxNZXNzYWdlc0hhc2hbbWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IFxuXG4gICAgcmV0dXJuIGludGVybmFsTWVzc2FnZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNaXhpbiA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L21peGluJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2FnZVNvdXJjZWBcbiAqIEFuIGFic3RyYWN0IGNsYXNzIChzdWJjbGFzcyBvZiBbTWl4aW5dKC4uL2Fic3RyYWN0L21peGluLmpzLmh0bWwpKSBmb3IgY29ubmVjdGluZyBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHRvIGV4dGVybmFsIHNvdXJjZXMgb2YgbWVzc2FnZXMgKGxpa2UgRE9NIGV2ZW50cykgYW5kIGRlZmluaW5nIGhpZ2hlciBsZXZlbCBtZXNzYWdlcy5cbiAqIEFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2FuIGVpdGhlciBiZSBwYXNzZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yIG9yIGxhdGVyIHVzaW5nIGBfc2V0TWVzc2FnZVNvdXJjZWAgbWV0aG9kIG9mIE1lc3Nlbmdlci4gT25jZSBzZXQsIE1lc3NhZ2VTb3VyY2Ugb2YgTWVzc2VuZ2VyIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICovXG52YXIgTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgbWVzc2FnZVNvdXJjZSAtIGNhbGxlZCBieSBNaXhpbiBzdXBlcmNsYXNzXG4gKiAtIFtzZXRNZXNzZW5nZXJdKCNzZXRNZXNzZW5nZXIpIC0gY29ubmVjdHMgTWVzc2VuZ2VyIHRvIE1lc3NhZ2VTb3VyY2UsIGlzIGNhbGxlZCBmcm9tIGBpbml0YCBvciBgX3NldE1lc3NhZ2VTb3VyY2VgIG1ldGhvZHMgb2YgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKS5cbiAqIC0gW29uU3Vic2NyaWJlckFkZGVkXSgjb25TdWJzY3JpYmVyQWRkZWQpIC0gY2FsbGVkIGJ5IE1lc3NlbmdlciB0byBub3RpZnkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgYWRkZWQsIHNvIE1lc3NhZ2VTb3VyY2UgY2FuIHN1YnNjcmliZSB0byBzb3VyY2VcbiAqIC0gW29uU3Vic2NyaWJlclJlbW92ZWRdKCNvblN1YnNjcmliZXJSZW1vdmVkKSAtIGNhbGxlZCBieSBNZXNzZW5nZXIgdG8gbm90aWZ5IHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgcmVtb3ZlZCwgc28gTWVzc2FnZVNvdXJjZSBjYW4gdW5zdWJzY3JpYmUgZnJvbSBzb3VyY2VcbiAqIC0gW2Rpc3BhdGNoTWVzc2FnZV0oI2Rpc3BhdGNoTWVzc2FnZSkgLSBkaXNwYXRjaGVzIHNvdXJjZSBtZXNzYWdlLiBNZXNzYWdlU291cmNlIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgbWVjaGFuaXNtIHdoZW4gb24gYWN0dWFsIHNvdXJjZSBtZXNzYWdlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBNZXRob2RzIGJlbG93IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmlnZ2VyXSgjdHJpZ2dlcikgLSB0cmlnZ2VycyBtZXNzYWdlcyBvbiB0aGUgc291cmNlIChhbiBvcHRpb25hbCBtZXRob2QpXG4gKiAtIFthZGRTb3VyY2VTdWJzY3JpYmVyXSgjYWRkU291cmNlU3Vic2NyaWJlcikgLSBhZGRzIGxpc3RlbmVyL3N1YnNjcmliZXIgdG8gZXh0ZXJuYWwgbWVzc2FnZVxuICogLSBbcmVtb3ZlU291cmNlU3Vic2NyaWJlcl0oI3JlbW92ZVNvdXJjZVN1YnNjcmliZXIpIC0gcmVtb3ZlcyBsaXN0ZW5lci9zdWJzY3JpYmVyIGZyb20gZXh0ZXJuYWwgbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3NhZ2VTb3VyY2UsIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NhZ2VTb3VyY2UkZGVzdHJveSxcbiAgICBzZXRNZXNzZW5nZXI6IHNldE1lc3NlbmdlcixcbiAgICBvblN1YnNjcmliZXJBZGRlZDogb25TdWJzY3JpYmVyQWRkZWQsXG4gICAgb25TdWJzY3JpYmVyUmVtb3ZlZDogb25TdWJzY3JpYmVyUmVtb3ZlZCwgXG4gICAgZGlzcGF0Y2hNZXNzYWdlOiBkaXNwYXRjaE1lc3NhZ2UsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIF9wcmVwYXJlTWVzc2VuZ2VyQVBJOiBfcHJlcGFyZU1lc3NlbmdlckFQSSxcblxuICAgIC8vIE1ldGhvZHMgYmVsb3cgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc1xuICAgIHRyaWdnZXI6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogdG9CZUltcGxlbWVudGVkXG59KTtcblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogQ2FsbGVkIGJ5IE1peGluIGNvbnN0cnVjdG9yLlxuICogTWVzc2FnZVNvdXJjZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgcGFzc2VkIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLlxuICogSWYgYW4gaW5zdGFuY2Ugb2YgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciwgaXQgZXh0ZW5kcyBNZXNzYWdlU291cmNlIGZ1bmN0aW9uYWxpdHkgdG8gYWxsb3cgaXQgdG8gZGVmaW5lIG5ldyBtZXNzYWdlcywgdG8gZmlsdGVyIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZWlyIGRhdGEgYW5kIHRvIGNoYW5nZSBtZXNzYWdlIGRhdGEuIFNlZSBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgTWVzc2FnZVNvdXJjZSBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBNZXNzYWdlU291cmNlLlxuICogQHBhcmFtIHtPYmplY3RbU3RyaW5nXX0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIE1lc3NhZ2VTb3VyY2UncyBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJLlxuICovXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJKSB7XG4gICAgdGhpcy5fcHJlcGFyZU1lc3NlbmdlckFQSShtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogRGVzdHJveXMgbWVzc2FnZSBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gTWVzc2FnZVNvdXJjZSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm1lc3NlbmdlckFQSSlcbiAgICAgICAgdGhpcy5tZXNzZW5nZXJBUEkuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTZXRzIHJlZmVyZW5jZSB0byBNZXNzZW5nZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtNZXNzZW5nZXJ9IG1lc3NlbmdlciByZWZlcmVuY2UgdG8gTWVzc2VuZ2VyIGluc3RhbmNlIGxpbmtlZCB0byB0aGlzIE1lc3NhZ2VTb3VyY2VcbiAqL1xuZnVuY3Rpb24gc2V0TWVzc2VuZ2VyKG1lc3Nlbmdlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NlbmdlcicsIG1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByZXBhcmVzIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgcGFzc2VkIHRvIGNvbnN0cnVjdG9yIGJ5IHByb3h5aW5nIGl0cyBtZXRob2RzIHRvIGl0c2VsZiBvciBpZiBNZXNzZW5nZXJBUEkgd2Fzbid0IHBhc3NlZCBkZWZpbmVzIHR3byBtZXRob2RzIHRvIGF2b2lkIGNoZWNraW5nIHRoZWlyIGF2YWlsYWJpbGl0eSBldmVyeSB0aW1lIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJXG4gKi9cbmZ1bmN0aW9uIF9wcmVwYXJlTWVzc2VuZ2VyQVBJKG1lc3NlbmdlckFQSSkge1xuICAgIGNoZWNrKG1lc3NlbmdlckFQSSwgTWF0Y2guT3B0aW9uYWwoTWVzc2VuZ2VyQVBJKSk7XG5cbiAgICBpZiAoISBtZXNzZW5nZXJBUEkpXG4gICAgICAgIG1lc3NlbmdlckFQSSA9IG5ldyBNZXNzZW5nZXJBUEk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzZW5nZXJBUEknLCBtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTdWJzY3JpYmVzIHRvIGV4dGVybmFsIHNvdXJjZSB1c2luZyBgYWRkU291cmNlU3Vic2NyaWJlcmAgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIGFkZGVkLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBmb3IgdHJhbnNsYXRpb24gb2YgYG1lc3NhZ2VgIHRvIGBzb3VyY2VNZXNzYWdlYC4gYE1lc3NhZ2VBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZWAgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoaXMgYHNvdXJjZU1lc3NhZ2VgIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQgdG8gdG8gcHJldmVudCBkdXBsaWNhdGUgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHN1YnNjcmliZWQgdG8gYXQgdGhlIGV4dGVybmFsIHNvdXJjZSBvZiBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gb25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSkge1xuICAgIHZhciBuZXdTb3VyY2VNZXNzYWdlID0gdGhpcy5tZXNzZW5nZXJBUEkuYWRkSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmICh0eXBlb2YgbmV3U291cmNlTWVzc2FnZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpcy5hZGRTb3VyY2VTdWJzY3JpYmVyKG5ld1NvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBVbnN1YnNjcmliZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgdXNpbmcgYHJlbW92ZVNvdXJjZVN1YnNjcmliZXJgIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIHJlbW92ZWQuXG4gKiBEZWxlZ2F0ZXMgdG8gc3VwcGxpZWQgb3IgZGVmYXVsdCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGZvciB0cmFuc2xhdGlvbiBvZiBgbWVzc2FnZWAgdG8gYHNvdXJjZU1lc3NhZ2VgLiBgTWVzc2FnZUFQSS5wcm90b3R5cGUucmVtb3ZlSW50ZXJuYWxNZXNzYWdlYCB3aWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhpcyBgc291cmNlTWVzc2FnZWAgd2FzIG5vdCB5ZXQgc3Vic2NyaWJlZCB0byB0byBwcmV2ZW50IHVuc3Vic2NyaXB0aW9uIHdpdGhvdXQgcHJldmlvdXMgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHVuc3Vic2NyaWJlZCBmcm9tIGF0IHRoZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIG9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSkge1xuICAgIHZhciByZW1vdmVkU291cmNlTWVzc2FnZSA9IHRoaXMubWVzc2VuZ2VyQVBJLnJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAodHlwZW9mIHJlbW92ZWRTb3VyY2VNZXNzYWdlICE9ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZVN1YnNjcmliZXIocmVtb3ZlZFNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHNvdXJjZU1lc3NhZ2UgdG8gTWVzc2VuZ2VyLlxuICogTWVjaGFuaXNtIHRoYXQgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGUgc291cmNlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIChzZWUgW0RPTUV2ZW50c1NvdXJjZV0oLi4vY29tcG9uZW50cy9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkgZm9yIGV4YW1wbGUpLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSB0byBjcmVhdGUgaW50ZXJuYWwgbWVzc2FnZSBkYXRhIChgY3JlYXRlSW50ZXJuYWxEYXRhYCkgYW5kIHRvIGZpbHRlciB0aGUgbWVzc2FnZSBiYXNlZCBvbiBpdHMgZGF0YSBhbmQvb3IgbWVzc2FnZSAoYGZpbHRlclNvdXJjZU1lc3NhZ2VgKS5cbiAqIEJhc2UgTWVzc2VuZ2VyQVBJIGNsYXNzIGltcGxlbWVudHMgdGhlc2UgdHdvIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheSAoYGNyZWF0ZUludGVybmFsRGF0YWAgc2ltcGx5IHJldHVybnMgZXh0ZXJuYWwgZGF0YSwgYGZpbHRlclNvdXJjZU1lc3NhZ2VgIHJldHVybnMgYHRydWVgKSwgdGhleSBhcmUgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIHNvdXJjZURhdGEpIHtcbiAgICB2YXIgYXBpID0gdGhpcy5tZXNzZW5nZXJBUElcbiAgICAgICAgLCBpbnRlcm5hbE1lc3NhZ2VzID0gYXBpLmdldEludGVybmFsTWVzc2FnZXMoc291cmNlTWVzc2FnZSk7XG5cbiAgICBpZiAoaW50ZXJuYWxNZXNzYWdlcykgXG4gICAgICAgIGludGVybmFsTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGludGVybmFsRGF0YSA9IGFwaS5jcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgc291cmNlRGF0YSk7XG5cbiAgICAgICAgICAgIHZhciBzaG91bGREaXNwYXRjaCA9IGFwaS5maWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGludGVybmFsRGF0YSk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGF0Y2gpIFxuICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgaW50ZXJuYWxEYXRhKTsgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFBvc3RzIG1lc3NhZ2Ugb24gdGhlIG1lc3Nlbmdlci4gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGVkIHNvIHNwZWNpZmljIG1lc3NhZ2Ugc291cmNlcyBjYW4gbWFrZSBtZXNzYWdlIGRpc3BhdGNoIHN5bmNocm9ub3VzIGJ5IHVzaW5nIGBwb3N0TWVzc2FnZVN5bmNgXG4gKiBcbiAqIEBwYXJhbSAge1N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtICB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0b0JlSW1wbGVtZW50ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21fc291cmNlJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzYWdlU291cmNlIHRoYXQgYWxsb3dzIHRvIGNvbm5lY3QgTWVzc2VuZ2VyIHRvIGFub3RoZXIgTWVzc2VuZ2VyIHVzaW5nIGl0IGFzIGV4dGVybmFsIHNvdXJjZS5cbiAqL1xudmFyIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNZXNzZW5nZXJNZXNzYWdlU291cmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXJNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHBvc3RNZXNzYWdlOiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlXG59KTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXJNZXNzYWdlU291cmNlXG4gKiBEZWZpbmVzIG9uZSBwYXJhbWV0ZXIgaW4gYWRkaXRpb24gdG8gW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgcGFyYW1ldGVyc1xuICpcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyfSBzb3VyY2VNZXNzZW5nZXIgbWVzc2VuZ2VyIHRoaXMgbWVzc2FnZSBzb3VyY2UgY29ubmVjdHMgdG9cbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSSwgc291cmNlTWVzc2VuZ2VyKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyID0gc291cmNlTWVzc2VuZ2VyO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byBzb3VyY2UgbWVzc2FnZS4gU2VlIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGRvY3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnZXh9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgdG8gc3Vic2NyaWJlIHRvXG4gKi9cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyLm9uU3luYyhzb3VyY2VNZXNzYWdlLCB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IHRoaXMuZGlzcGF0Y2hNZXNzYWdlIH0pO1xufVxuXG5cbi8qKlxuICogVW5zdWJzY3JpYmVzIGZyb20gc291cmNlIG1lc3NhZ2UuIFNlZSBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBkb2NzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ2V4fSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlIHRvIHVuc3Vic2NyaWJlIGZyb21cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy5zb3VyY2VNZXNzZW5nZXIub2ZmKHNvdXJjZU1lc3NhZ2UsIHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogdGhpcy5kaXNwYXRjaE1lc3NhZ2UgfSk7XG59XG5cblxuLyoqXG4gKiBPdmVycmlkZXMgZGVmYWx1dCBtZXNzYWdlIHNvdXJjZSB0byBkaXNwYXRjaCBtZXNzYWdlcyBzeW5jaHJvbm91c2x5XG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFttaW5kZXJdKC4vbWluZGVyLmpzLmh0bWwpIC0gZGF0YSByZWFjdGl2aXR5LCBvbmUgb3IgdHdvIHdheSwgc2hhbGxvdyBvciBkZWVwLCBhcyB5b3UgbGlrZSBpdFxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKi9cbnZhciBtaWxvID0ge1xuICAgIG1pbmRlcjogcmVxdWlyZSgnLi9taW5kZXInKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgTWVzc2VuZ2VyOiByZXF1aXJlKCcuL21lc3NlbmdlcicpLFxuICAgIE1vZGVsOiByZXF1aXJlKCcuL21vZGVsJyksXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBwcm90bzogX1xufTtcblxuXG4vLyBleHBvcnQgZm9yIG5vZGUvYnJvd3NlcmlmeVxuaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpICAgIFxuICAgIG1vZHVsZS5leHBvcnRzID0gbWlsbztcblxuLy8gZ2xvYmFsIG1pbG8gZm9yIGJyb3dzZXJcbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKVxuICAgIHdpbmRvdy5taWxvID0gbWlsbztcblxuXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIG1pbG8ubWluZGVyLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbm5lY3RvciA9IHJlcXVpcmUoJy4vbW9kZWwvY29ubmVjdG9yJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4vbWVzc2VuZ2VyJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWluZGVyO1xuXG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9uZSBvciBtYW55IENvbm5lY3RvciBvYmplY3RzIHRoYXRcbiAqIGNyZWF0ZSBsaXZlIHJlYWN0aXZlIGNvbm5lY3Rpb24gYmV0d2VlbiBvYmplY3RzIGltcGxlbWVudGluZ1xuICogZGF0YVNvdXJjZSBpbnRlcmZhY2U6XG4gKiBPYmplY3RzIHNob3VsZCBlbWl0IG1lc3NhZ2VzIHdoZW4gYW55IHBhcnQgb2YgdGhlaXIgZGF0YSBjaGFuZ2VzLFxuICogbWV0aG9kcyBgb25gIGFuZCBgb2ZmYCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gc3Vic2NyaWJlL3Vuc3Vic2NyaWJlXG4gKiB0byBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VzLCBtZXRob2RzIGBzZXRgIGFuZCBgZ2V0YCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gZ2V0L3NldCBkYXRhXG4gKiBvbiBwYXRoIG9iamVjdHMsIHBvaW50aW5nIHRvIHBhcnRpY3VsYXIgcGFydHMgb2YgdGhlIG9iamVjdCwgbWV0aG9kIGBwYXRoYFxuICogc2hvdWxkIHJldHVybiBwYXRoIG9iamVjdCBmb3IgYSBnaXZlbiBwYXRoIHN0cmluZyAoc2VlIHBhdGggdXRpbHMgZm9yIHBhdGggc3RyaW5nIHN5bnRheCkuXG4gKiBCb3RoIE1vZGVsIGFuZCBEYXRhIGZhY2V0IGFyZSBzdWNoIGRhdGEgc291cmNlcywgdGhleSBjYW4gYmUgbGlua2VkIGJ5IENvbm5lY3RvciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRzMSB0aGUgZmlyc3QgZGF0YSBzb3VyY2UuIEluc3RlYWQgb2YgdGhlIGZpcnN0IGRhdGEgc291cmNlIGFuIGFycmF5IGNhbiBiZSBwYXNzZWQgd2l0aCBhcnJheXMgb2YgQ29ubmVjdGlvbiBvYmplY3RzIHBhcmFtZXRlcnMgaW4gZWFjaCBhcnJheSBlbGVtZW50LlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKi9cbmZ1bmN0aW9uIG1pbmRlcihkczEsIG1vZGUsIGRzMiwgb3B0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRzMSkpIHtcbiAgICAgICAgdmFyIGNvbm5EZXNjcmlwdGlvbnMgPSBkczE7XG4gICAgICAgIHZhciBjb25uZWN0b3JzID0gY29ubkRlc2NyaXB0aW9ucy5tYXAoZnVuY3Rpb24oZGVzY3IpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdG9yKGRlc2NyWzBdLCBkZXNjclsxXSwgZGVzY3JbMl0sIGRlc2NyWzNdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbm5lY3RvcnMuZm9yRWFjaChfYWRkQ29ubmVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RvcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNuY3QgPSBuZXcgQ29ubmVjdG9yKGRzMSwgbW9kZSwgZHMyLCBvcHRpb25zKTtcbiAgICAgICAgX2FkZENvbm5lY3RvcihjbmN0KTtcbiAgICAgICAgcmV0dXJuIGNuY3Q7XG4gICAgfVxufVxuXG5cbi8qKlxuICogbWVzc2VuZ2VyIG9mIG1pbmRlciB3aGVyZSBpdCBlbWl0cyBldmVudHMgcmVsYXRlZCB0byBhbGwgY29ubmVjdG9yc1xuICogQHR5cGUge01lc3Nlbmdlcn1cbiAqL1xudmFyIF9tZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1pbmRlciwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgX2Nvbm5lY3RvcnMgPSBbXVxuICAgICwgX3JlY2VpdmVkTWVzc2FnZXMgPSBbXVxuICAgICwgX2lzUHJvcGFnYXRpbmcgPSBmYWxzZTtcblxuXG5fLmV4dGVuZChtaW5kZXIsIHtcbiAgICBnZXRDb25uZWN0b3JzOiBtaW5kZXJfZ2V0Q29ubmVjdG9ycyxcbiAgICBnZXRFeHBhbmRlZENvbm5lY3Rpb25zOiBtaW5kZXJfZ2V0RXhwYW5kZWRDb25uZWN0aW9ucyxcbiAgICBpc1Byb3BhZ2F0aW5nOiBtaW5kZXJfaXNQcm9wYWdhdGluZyxcbiAgICB3aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQ6IG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQsXG4gICAgZGVzdHJveUNvbm5lY3RvcjogbWluZGVyX2Rlc3Ryb3lDb25uZWN0b3IsXG4gICAgZGVzdHJveTogbWluZGVyX2Rlc3Ryb3lcbn0pO1xuXG5cbmZ1bmN0aW9uIF9hZGRDb25uZWN0b3IoY25jdCkge1xuICAgIGNuY3QuX19fbWluZGVyX2lkID0gX2Nvbm5lY3RvcnMucHVzaChjbmN0KSAtIDE7XG4gICAgY25jdC5vbigvLiovLCBvbkNvbm5lY3Rvck1lc3NhZ2UpO1xuICAgIG1pbmRlci5wb3N0TWVzc2FnZSgnYWRkZWQnLCB7IGNvbm5lY3RvcjogY25jdCB9KTtcbiAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ3R1cm5lZG9uJywgeyBjb25uZWN0b3I6IGNuY3QgfSk7XG59XG5cblxuZnVuY3Rpb24gb25Db25uZWN0b3JNZXNzYWdlKG1zZywgZGF0YSkge1xuICAgIHZhciBkYXRhID0gZGF0YSA/IF8uY2xvbmUoZGF0YSkgOiB7fTtcbiAgICBfLmV4dGVuZChkYXRhLCB7XG4gICAgICAgIGlkOiB0aGlzLl9fX21pbmRlcl9pZCxcbiAgICAgICAgY29ubmVjdG9yOiB0aGlzXG4gICAgfSk7XG4gICAgbWluZGVyLnBvc3RNZXNzYWdlKG1zZywgZGF0YSk7XG4gICAgaWYgKCEgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoICYmICEgX2lzUHJvcGFnYXRpbmcpIHtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgX2lzUHJvcGFnYXRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIF9yZWNlaXZlZE1lc3NhZ2VzLnB1c2goeyBtc2c6IG1zZywgZGF0YTogZGF0YSB9KTtcbn1cblxuXG5mdW5jdGlvbiBfaWRsZUNoZWNrKCkge1xuICAgIGlmIChfcmVjZWl2ZWRNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgbWluZGVyLnBvc3RNZXNzYWdlKCdwcm9wYWdhdGlvbnRpY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIF9pc1Byb3BhZ2F0aW5nID0gZmFsc2U7XG4gICAgICAgIG1pbmRlci5wb3N0TWVzc2FnZSgncHJvcGFnYXRpb25jb21wbGV0ZWQnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2lzUHJvcGFnYXRpbmcoKSB7XG4gICAgcmV0dXJuIF9pc1Byb3BhZ2F0aW5nO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICBpZiAoX2lzUHJvcGFnYXRpbmcpXG4gICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyKGV4ZWN1dGVDYWxsYmFjayk7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmIChfaXNQcm9wYWdhdGluZylcbiAgICAgICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRDb25uZWN0b3JzKG9uT2ZmKSB7XG4gICAgaWYgKHR5cGVvZiBvbk9mZiA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0b3JzO1xuXG4gICAgcmV0dXJuIF9jb25uZWN0b3JzLmZpbHRlcihmdW5jdGlvbihjbmN0KSB7XG4gICAgICAgIHJldHVybiBjbmN0LmlzT24gPT09IG9uT2ZmO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95Q29ubmVjdG9yKGNuY3QpIHtcbiAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB2YXIgaW5kZXggPSBfY29ubmVjdG9ycy5pbmRleE9mKGNuY3QpO1xuICAgIGlmIChpbmRleCA+PSAwKVxuICAgICAgICBkZWxldGUgX2Nvbm5lY3RvcnNbaW5kZXhdO1xuICAgIGVsc2VcbiAgICAgICAgbG9nZ2VyLndhcm4oJ21pbmRlcjogY29ubmVjdG9yIGRlc3Ryb3llZCB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIG1pbmRlcicpO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRFeHBhbmRlZENvbm5lY3Rpb25zKG9uT2ZmLCBzZWFyY2hTdHIpIHtcbiAgICB2YXIgY29ubmVjdG9ycyA9IG1pbmRlci5nZXRDb25uZWN0b3JzKG9uT2ZmKTtcbiAgICB2YXIgY29ubmVjdGlvbnMgPSAgY29ubmVjdG9ycy5tYXAoZnVuY3Rpb24oY25jdCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIGxlZnRTb3VyY2U6IF9nZXRFeHBhbmRlZFNvdXJjZShjbmN0LmRzMSksXG4gICAgICAgICAgICByaWdodFNvdXJjZTogX2dldEV4cGFuZGVkU291cmNlKGNuY3QuZHMyKSxcbiAgICAgICAgICAgIG1vZGU6IGNuY3QubW9kZSxcbiAgICAgICAgICAgIGlzT246IGNuY3QuaXNPblxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgaWYgKGNuY3Qub3B0aW9ucylcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub3B0aW9ucyA9IGNuY3Qub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcblxuICAgIGlmIChzZWFyY2hTdHIpXG4gICAgICAgIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGNuY3RuKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NvdXJjZU1hdGNoZXNTdHJpbmcoY25jdG4ubGVmdFNvdXJjZSwgc2VhcmNoU3RyKVxuICAgICAgICAgICAgICAgICAgICB8fCBfc291cmNlTWF0Y2hlc1N0cmluZyhjbmN0bi5yaWdodFNvdXJjZSwgc2VhcmNoU3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29ubmVjdGlvbnM7XG59XG5cblxuZnVuY3Rpb24gX2dldEV4cGFuZGVkU291cmNlKGRzKSB7XG4gICAgdmFyIHNvdXJjZSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZHMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoZHMuX21vZGVsICYmIGRzLl9hY2Nlc3NQYXRoKSB7XG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5fYWNjZXNzUGF0aCk7XG4gICAgICAgICAgICBkcyA9IGRzLl9tb2RlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcbiAgICAgICAgZHMgPSBkcy5faG9zdE9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRzID09ICdvYmplY3QnKSB7XG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcblxuICAgICAgICBpZiAoZHMub3duZXIpXG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5vd25lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuXG5mdW5jdGlvbiBfc291cmNlTWF0Y2hlc1N0cmluZyhzb3VyY2UsIG1hdGNoU3RyKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5zb21lKGZ1bmN0aW9uKHNyY05vZGUpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHNyY05vZGUuY29uc3RydWN0b3IgJiYgc3JjTm9kZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICByZXR1cm4gX3N0cmluZ01hdGNoKGNsYXNzTmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUubmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUsIG1hdGNoU3RyKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc3RyaW5nTWF0Y2goc3RyLCBzdWJzdHIpIHtcbiAgICByZXR1cm4gc3RyICYmIHR5cGVvZiBzdHIgPT0gJ3N0cmluZycgJiYgc3RyLmluZGV4T2Yoc3Vic3RyKSA+PSAwO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95KCkge1xuICAgIF9jb25uZWN0b3JzLmZvckVhY2goZnVuY3Rpb24oY25jdCkge1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczEpO1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczIpO1xuICAgICAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICBtaW5kZXIuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95RFMoZHMpIHtcbiAgICAgICAgaWYgKGRzICYmICFkcy5fZGVzdHJveWVkKSBkcy5kZXN0cm95KCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByb2Nlc3MgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMgZW1pdHRlZCBieSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNoYW5nZURhdGFIYW5kbGVyO1xuXG5cbl8uZXh0ZW5kKGNoYW5nZURhdGFIYW5kbGVyLCB7XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnOiBzZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgZ2V0VHJhbnNhY3Rpb25GbGFnOiBnZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgcGFzc1RyYW5zYWN0aW9uRmxhZzogcGFzc1RyYW5zYWN0aW9uRmxhZyxcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZDogcG9zdFRyYW5zYWN0aW9uRmluaXNoZWRcbn0pO1xuXG5cbi8qKlxuICogQ2hhbmdlIGRhdGEgdXNlcyBoaWRkZW4gcHJvcGVydHkgb24gYWNjZXNzb3IgbWV0aG9kcyB0byBwYXNzIGZsYWcgdGhhdCB0aGUgYWNjZXNzb3IgaXMgZXhlY3V0ZWQgYXMgYSBwYXJ0IG9mIGNoYW5nZSB0cmFuc2FjdGlvbi5cbiAqIEFjY2Vzc29yIG1ldGhvZHMgYXJlIHN1cHBvc2VkIHRvIHN0b3JlIHRoaXMgZmxhZyBpbiBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0byBjbGVhciBpdCAoYmVjYXVzZSBhbm90aGVyIGFjY2Vzc29yIGNhbiBiZSBleGVjdXRlZCBpbiBvciBvdXQgb2YgdHJhbnNhY3Rpb24pIHVzaW5nIGBnZXRUcmFuc2FjdGlvbkZsYWdgXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgYWNjZXNzb3IgbWV0aG9kIHJlZmVyZW5jZVxuICogQHBhcmFtIHtCb29sZWFufSBmbGFnIGEgZmxhZyB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gc2V0VHJhbnNhY3Rpb25GbGFnKGZ1bmMsIGZsYWcpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2luQ2hhbmdlVHJhbnNhY3Rpb24nLCBmbGFnLCBfLkNPTkYgfCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCBjbGVhcnMgdHJhbnNhY3Rpb24gZmxhZyBmcm9tIGFjY2Vzc29yIG1ldGhvZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGFjY2Vzc29yIG1ldGhvZCByZWZlcmVuY2VcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRmxhZyhmdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBmdW5jLl9faW5DaGFuZ2VUcmFuc2FjdGlvbjtcbiAgICBkZWxldGUgZnVuYy5fX2luQ2hhbmdlVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIGluVHJhbnNhY3Rpb247XG59XG5cblxuZnVuY3Rpb24gcGFzc1RyYW5zYWN0aW9uRmxhZyhmcm9tRnVuYywgdG9GdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoZnJvbUZ1bmMpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0b0Z1bmMsIGluVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBpblRyYW5zYWN0aW9uO1xufVxuXG5cbi8qKlxuICogUG9zdHMgbWVzc2FnZSBvbiB0aGlzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdW5sZXNzIGBpbkNoYW5nZVRyYW5zYWN0aW9uYCBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkKCkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHsgdHJhbnNhY3Rpb246IGZhbHNlLCBjaGFuZ2VzOiBbXSB9KTtcbn1cblxuXG4vKipcbiAqIHN1YnNjcmliZXIgdG8gXCJjaGFuZ2VkYXRhXCIgZXZlbnQgZW1pdHRlZCBieSBbQ29ubmVjdG9yXSguL2Nvbm5lY3Rvci5qcy5odG1sKSBvYmplY3QgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gKiBVc2VkIGJ5IERhdGEgZmFjZXQsIE1vZGVsIGFuZCBNb2RlbFBhdGguIENhbiBiZSB1c2VkIGJ5IGFueSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGdldC9zZXQvZGVsL3NwbGljZSBhcGkgYW5kIHNldHMgZGF0YSBkZWVwbHkgdG8gdGhlIHdob2xlIHRyZWUuXG4gKiBPYmplY3Qgc2hvdWxkIGNhbGwgYGNoYW5nZURhdGFIYW5kbGVyLmluaXRpYWxpemUuY2FsbCh0aGlzKWAgaW4gaXRzIGNvbnN0cnVjdG9yLlxuICogVE9ETzogb3B0aW1pemUgbWVzc2FnZXMgbGlzdCB0byBhdm9pZCBzZXR0aW5nIGR1cGxpY2F0ZSB2YWx1ZXMgZG93biB0aGUgdHJlZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgc2hvdWxkIGJlIFwiY2hhbmdlZGF0YVwiIGhlcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGJhdGNoIG9mIGRhdGEgY2hhbmdlIGRlc2NpcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGJhY2sgdG8gY2FsbCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkYXRhIGlzIHByb2Nlc3NlZFxuICovXG5mdW5jdGlvbiBjaGFuZ2VEYXRhSGFuZGxlcihtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHByb2Nlc3NDaGFuZ2VzLmNhbGwodGhpcywgZGF0YS5jaGFuZ2VzLCBjYWxsYmFjayk7XG59XG5cblxuLy8gbWFwIG9mIG1lc3NhZ2UgdHlwZXMgdG8gbWV0aG9kc1xudmFyIENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVAgPSB7XG4gICAgJ2FkZGVkJzogICAnc2V0JyxcbiAgICAnY2hhbmdlZCc6ICdzZXQnLFxuICAgICdkZWxldGVkJzogJ2RlbCcsXG4gICAgJ3JlbW92ZWQnOiAnZGVsJ1xufTtcblxuXG4vKipcbiAqIFByb2Nlc3NlcyBxdWV1ZWQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMuXG4gKiBQb3N0cyBcImNoYW5nZXN0YXJ0ZWRcIiBhbmQgXCJjaGFuZ2Vjb21wbGV0ZWRcIiBtZXNzYWdlcyBhbmQgY2FsbHMgY2FsbGJhY2tcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggYChudWxsLCBmYWxzZSlgIHBhcmFtZXRlcnMgYmVmb3JlIGNoYW5nZSBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYChudWxsLCB0cnVlKWAgYWZ0ZXIgaXQncyBmaW5pc2hlZC5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZXModHJhbnNhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgbm90aWZ5LmNhbGwodGhpcywgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICBwcm9jZXNzVHJhbnNhY3Rpb24uY2FsbCh0aGlzLFxuICAgICAgICBwcmVwYXJlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSkpO1xuICAgIG5vdGlmeS5jYWxsKHRoaXMsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBub3RpZnkoY2FsbGJhY2ssIGNoYW5nZUZpbmlzaGVkKSB7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbCwgY2hhbmdlRmluaXNoZWQpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoY2hhbmdlRmluaXNoZWQgPyAnY2hhbmdlY29tcGxldGVkJyA6ICdjaGFuZ2VzdGFydGVkJyk7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gY29tZSBmcm9tIHRoZSBzYW1lIHNvdXJjZS5cbiAqIEhhY2s6IHJldmVyc2VzIHRoZSB0cmFuc2FjdGlvbiBpZiBpdCBjb21lcyBmcm9tIHRoZSBEYXRhIGZhY2V0XG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHRyYW5zYWN0aW9uIChmb3IgY2hhaW5pbmcpXG4gKiBcbiAqIEBwYXJhbSAge0FycmF5fSB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvbiBvZiBkYXRhIGNoYW5nZXNcbiAqIEByZXR1cm4ge0FycmF5fSBcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHZhciBzb3VyY2UgPSB0cmFuc2FjdGlvblswXS5zb3VyY2VcbiAgICAgICAgLCBzYW1lU291cmNlID0gdHJ1ZTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxLCBsZW4gPSB0cmFuc2FjdGlvbi5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbltpXS5zb3VyY2UgIT0gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjaGFuZ2VkYXRhOiBjaGFuZ2VzIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24sIHNvdXJjZXM6JywgdHJhbnNhY3Rpb25baV0uc291cmNlLm5hbWUsIHNvdXJjZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBzYW1lU291cmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc291cmNlID0gdHJhbnNhY3Rpb25baV0uc291cmNlO1xuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBwcmVwYXJlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgdG9kbyA9IFtdXG4gICAgICAgICwgcGF0aHNUb1NwbGljZSA9IFtdXG4gICAgICAgICwgcGF0aHNUb0NoYW5nZSA9IFtdXG4gICAgICAgICwgaGFkU3BsaWNlXG4gICAgICAgICwgZXhpdExvb3AgPSB7fTtcblxuXG4gICAgdHJ5IHsgdHJhbnNhY3Rpb24uZm9yRWFjaChjaGVja0NoYW5nZSk7IH1cbiAgICBjYXRjaCAoZSkgeyBpZiAoZSAhPSBleGl0TG9vcCkgdGhyb3cgZTsgfVxuXG4gICAgcmV0dXJuIHRvZG87XG5cblxuICAgIGZ1bmN0aW9uIGNoZWNrQ2hhbmdlKGRhdGEpIHtcbiAgICAgICAgKGRhdGEudHlwZSA9PSAnc3BsaWNlJyA/IGNoZWNrU3BsaWNlIDogY2hlY2tNZXRob2QpKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tTcGxpY2UoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhDaGFuZ2VkID0gcGF0aHNUb0NoYW5nZS5zb21lKGZ1bmN0aW9uKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRQYXRoLmxlbmd0aCA8IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICB0b2RvLnB1c2goZGF0YSk7XG5cbiAgICAgICAgaWYgKCEgY29uZmlnLmRlYnVnKSB0aHJvdyBleGl0TG9vcDtcbiAgICAgICAgcGF0aHNUb1NwbGljZS5wdXNoKHBhcnNlZFBhdGgpO1xuICAgICAgICBoYWRTcGxpY2UgPSB0cnVlO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tNZXRob2QoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhTcGxpY2VkID0gcGF0aHNUb1NwbGljZSAmJiBwYXRoc1RvU3BsaWNlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoXG4gICAgICAgICAgICAgICAgfHwgcGFyc2VkUGF0aFtwYXJlbnRQYXRoLmxlbmd0aF0uc3ludGF4ICE9ICdhcnJheScpIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJlbnRQYXRoU3BsaWNlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaGFkU3BsaWNlKSBsb2dnZXIuZXJyb3IoJ2NoYW5nZWRhdGE6IGNoaWxkIGNoYW5nZSBpcyBleGVjdXRlZCBhZnRlciBzcGxpY2U7IHByb2JhYmx5IGRhdGEgc291cmNlIGRpZCBub3QgZW1pdCBtZXNzYWdlIHdpdGggZGF0YS50eXBlPT1cImZpbmlzaGVkXCInKTtcblxuICAgICAgICB2YXIgcGFyZW50UGF0aENoYW5nZWQgPSBwYXRoc1RvQ2hhbmdlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICBwYXRoc1RvQ2hhbmdlLnB1c2gocGFyc2VkUGF0aCk7XG5cbiAgICAgICAgdG9kby5wdXNoKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIGNoaWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gcGFyZW50UGF0aC5ldmVyeShmdW5jdGlvbihwYXRoTm9kZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoTm9kZS5wcm9wZXJ0eSA9PSBjaGlsZFBhdGhbaW5kZXhdLnByb3BlcnR5O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcHJvY2Vzc1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdHJhbnNhY3Rpb24uZm9yRWFjaChwcm9jZXNzQ2hhbmdlLCB0aGlzKTtcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZC5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2UoZGF0YSkge1xuICAgICAgICB2YXIgbW9kZWxQYXRoID0gdGhpcy5wYXRoKGRhdGEucGF0aCwgZGF0YS50eXBlICE9ICdyZW1vdmVkJyAmJiBkYXRhLnR5cGUgIT0gJ2RlbGV0ZWQnKTtcbiAgICAgICAgaWYgKCEgbW9kZWxQYXRoKSByZXR1cm47XG4gICAgICAgIChkYXRhLnR5cGUgPT0gJ3NwbGljZScgPyBleGVjdXRlU3BsaWNlIDogZXhlY3V0ZU1ldGhvZCkobW9kZWxQYXRoLCBkYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZVNwbGljZShtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgaW5kZXggPSBkYXRhLmluZGV4XG4gICAgICAgICwgaG93TWFueSA9IGRhdGEucmVtb3ZlZC5sZW5ndGhcbiAgICAgICAgLCBzcGxpY2VBcmdzID0gW2luZGV4LCBob3dNYW55XTtcblxuICAgIHNwbGljZUFyZ3MgPSBzcGxpY2VBcmdzLmNvbmNhdChkYXRhLm5ld1ZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIGRhdGEuYWRkZWRDb3VudCkpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyhtb2RlbFBhdGguc3BsaWNlLCB0cnVlKTtcbiAgICBtb2RlbFBhdGguc3BsaWNlLmFwcGx5KG1vZGVsUGF0aCwgc3BsaWNlQXJncyk7XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZU1ldGhvZChtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVBbZGF0YS50eXBlXTtcbiAgICBpZiAobWV0aG9kTmFtZSkge1xuICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcobW9kZWxQYXRoW21ldGhvZE5hbWVdLCB0cnVlKTtcbiAgICAgICAgbW9kZWxQYXRoW21ldGhvZE5hbWVdKGRhdGEubmV3VmFsdWUpO1xuICAgIH0gZWxzZVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ3Vua25vd24gZGF0YSBjaGFuZ2UgdHlwZScpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb25uZWN0b3I7XG5cblxudmFyIG1vZGVQYXR0ZXJuID0gL14oXFw8KilcXC0rKFxcPiopJC87XG5cblxuLyoqXG4gKiBDb25uZWN0b3JcbiAqIENsYXNzIHRoYXQgY3JlYXRlcyBjb25uZWN0b3Igb2JqZWN0IGZvciBkYXRhIGNvbm5lY3Rpb24gYmV0d2VlblxuICogdHdvIGRhdGEtc291cmNlc1xuICogRGF0YS1zb3VyY2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBBUEk6XG4gKiBnZXQoKSAtIGdldCB2YWx1ZSBmcm9tIGRhdGFzb3VyY2Ugb3IgaXRzIHBhdGhcbiAqIHNldCh2YWx1ZSkgLSBzZXQgdmFsdWUgdG8gZGF0YXNvdXJjZSBvciB0byBpdHMgcGF0aFxuICogb24ocGF0aCwgc3Vic2NyaWJlcikgLSBzdWJzY3JpcHRpb24gdG8gZGF0YSBjaGFuZ2VzIHdpdGggXCIqXCIgc3VwcG9ydFxuICogb2ZmKHBhdGgsIHN1YnNjcmliZXIpXG4gKiBwYXRoKGFjY2Vzc1BhdGgpIC0gdG8gcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBnaXZlcyByZWZlcmVuY2UgdG8gc29tZSBwYXJ0IG9mIGRhdGFzb3VyY2VcbiAqIGFuZCBjb21wbGllcyB3aXRoIHRoYXQgYXBpIHRvby5cbiAqXG4gKiAjIyMjRXZlbnRzIyMjI1xuICpcbiAqIC0gJ3R1cm5lZG9uJyAtIGNvbm5lY3RvciB3YXMgdHVybmVkIG9uXG4gKiAtICd0dXJuZWRvZmYnIC0gY29ubmVjdG9yIHdhcyB0dXJuZWQgb2ZmXG4gKiAtICdjaGFuZ2VzdGFydGVkJyAtIGNoYW5nZSBvbiBjb25uZWN0ZWQgZGF0YXNvdXJjZSBpcyBzdGFydGVkXG4gKiAtICdjaGFuZ2Vjb21wbGV0ZWQnIC0gY2hhbmdlIG9uIGNvbm5lY3RlZCBkYXRhc291cmNlIGlzIGNvbXBsZXRlZFxuICogLSAnZGVzdHJveWVkJyAtIGNvbm5lY3RvciB3YXMgZGVzdHJveWVkXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBkczEgdGhlIGZpcnN0IGRhdGEgc291cmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKiBAcmV0dXJuIHtDb25uZWN0b3J9IHdoZW4gY2FsbGVkIHdpdGggYG5ld2AsIGNyZWF0ZXMgYSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IoZHMxLCBtb2RlLCBkczIsIG9wdGlvbnMpIHtcbiAgICBzZXR1cE1vZGUuY2FsbCh0aGlzLCBtb2RlKTtcblxuICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgZHMxOiBkczEsXG4gICAgICAgIGRzMjogZHMyLFxuICAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgICAgX2NoYW5nZXNRdWV1ZTE6IFtdLFxuICAgICAgICBfY2hhbmdlc1F1ZXVlMjogW10sXG4gICAgICAgIF9tZXNzZW5nZXI6IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB2YXIgcGF0aFRyYW5zbGF0aW9uID0gb3B0aW9ucy5wYXRoVHJhbnNsYXRpb247XG4gICAgICAgIGlmIChwYXRoVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhdGhUcmFuc2xhdGlvbiA9IF8uY2xvbmUocGF0aFRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbik7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGF0aFRyYW5zbGF0aW9uMTogcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocGF0aFRyYW5zbGF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXRoVHJhbnNsYXRpb24yOiBwYXRoVHJhbnNsYXRpb24sXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMTogcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbiksXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMjogcGF0dGVyblRyYW5zbGF0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhVHJhbnNsYXRpb24gPSBvcHRpb25zLmRhdGFUcmFuc2xhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICAgICAgICAgIGRhdGFUcmFuc2xhdGlvbjE6IGRhdGFUcmFuc2xhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNsYXRpb24yOiBkYXRhVHJhbnNsYXRpb25bJy0+J11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGFWYWxpZGF0aW9uID0gb3B0aW9ucy5kYXRhVmFsaWRhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24xOiBkYXRhVmFsaWRhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbjI6IGRhdGFWYWxpZGF0aW9uWyctPiddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudHVybk9uKCk7XG59XG5cblxuZnVuY3Rpb24gc2V0dXBNb2RlKG1vZGUpe1xuICAgIHZhciBwYXJzZWRNb2RlID0gbW9kZS5tYXRjaChtb2RlUGF0dGVybik7XG5cbiAgICBpZiAoISBwYXJzZWRNb2RlKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgdmFyIGRlcHRoMSA9IHBhcnNlZE1vZGVbMV0ubGVuZ3RoXG4gICAgICAgICwgZGVwdGgyID0gcGFyc2VkTW9kZVsyXS5sZW5ndGg7XG5cbiAgICBpZiAoZGVwdGgxICYmIGRlcHRoMiAmJiBkZXB0aDEgIT0gZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgaWYgKCEgZGVwdGgxICYmICEgZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBkZXB0aDE6IGRlcHRoMSxcbiAgICAgICAgZGVwdGgyOiBkZXB0aDIsXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtb2RlUGFyc2VFcnJvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIENvbm5lY3RvciBtb2RlOiAnICsgbW9kZSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQ29ubmVjdG9yLCB7XG4gICAgdHVybk9uOiBDb25uZWN0b3IkdHVybk9uLFxuICAgIHR1cm5PZmY6IENvbm5lY3RvciR0dXJuT2ZmLFxuICAgIGRlc3Ryb3k6IENvbm5lY3RvciRkZXN0cm95LFxuICAgIGNoYW5nZU1vZGU6IENvbm5lY3RvciRjaGFuZ2VNb2RlLFxuICAgIGRlZmVyQ2hhbmdlTW9kZTogQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZVxufSk7XG5cbi8qKlxuICogRnVuY3Rpb24gY2hhbmdlIHRoZSBtb2RlIG9mIHRoZSBjb25uZWN0aW9uXG4gKlxuICogQHBhcmFtIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEByZXR1cm4ge09iamVjdFtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkY2hhbmdlTW9kZShtb2RlKSB7XG4gICAgdGhpcy50dXJuT2ZmKCk7XG4gICAgc2V0dXBNb2RlLmNhbGwodGhpcywgbW9kZSk7XG4gICAgdGhpcy50dXJuT24oKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIGNoYW5nZSB0aGUgbW9kZSBvZiB0aGUgY29ubmVjdGlvblxuICpcbiAqIEBwYXJhbSBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZShtb2RlKSB7XG4gICAgXy5kZWZlck1ldGhvZCh0aGlzLCAnY2hhbmdlTW9kZScsIG1vZGUpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXZlcnNlcyB0cmFuc2xhdGlvbiBydWxlcyBmb3IgcGF0aHMgb2YgY29ubmVjdGVkIG9kYXRhIHNvdXJjZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdFtTdHJpbmddfSBydWxlcyBtYXAgb2YgcGF0aHMgZGVmaW5pbmcgdGhlIHRyYW5zbGF0aW9uIHJ1bGVzXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocnVsZXMpIHtcbiAgICB2YXIgcmV2ZXJzZVJ1bGVzID0ge307XG4gICAgXy5lYWNoS2V5KHJ1bGVzLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHJldmVyc2VSdWxlc1twYXRoMl92YWx1ZV0gPSBwYXRoMV9rZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldmVyc2VSdWxlcztcbn1cblxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbikge1xuICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBbXTtcbiAgICBfLmVhY2hLZXkocGF0aFRyYW5zbGF0aW9uLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHZhciBzdGFySW5kZXgxID0gcGF0aDFfa2V5LmluZGV4T2YoJyonKVxuICAgICAgICAgICAgLCBzdGFySW5kZXgyID0gcGF0aDJfdmFsdWUuaW5kZXhPZignKicpO1xuICAgICAgICBpZiAoc3RhckluZGV4MSA+PSAwICYmIHN0YXJJbmRleDIgPj0gMCkgeyAvLyBwYXR0ZXJuIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBpZiAocGF0aDFfa2V5LnNsaWNlKHN0YXJJbmRleDEpICE9IHBhdGgyX3ZhbHVlLnNsaWNlKHN0YXJJbmRleDIpKVxuICAgICAgICAgICAgICAgIF90aHJvd0ludmFsaWRUcmFuc2xhdGlvbihwYXRoMV9rZXksIHBhdGgyX3ZhbHVlKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXRoVHJhbnNsYXRpb25bcGF0aDFfa2V5XTsgICAgICAgICAgICBcblxuICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uLnB1c2goe1xuICAgICAgICAgICAgICAgIGZyb21QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgxX2tleSksXG4gICAgICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgxX2tleSwgc3RhckluZGV4MSksXG4gICAgICAgICAgICAgICAgdG9QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgyX3ZhbHVlKSxcbiAgICAgICAgICAgICAgICB0b1N0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgyX3ZhbHVlLCBzdGFySW5kZXgyKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhckluZGV4MSA+PSAwIHx8IHN0YXJJbmRleDIgPj0gMCkgLy8gcGF0dGVybiBvbmx5IG9uIG9uZSBzaWRlIG9mIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDFfa2V5LCBwYXRoMl92YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0dGVyblRyYW5zbGF0aW9uO1xuXG5cbiAgICBmdW5jdGlvbiBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDEsIHBhdGgyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXR0ZXJuIHRyYW5zbGF0aW9uOiAnICsgcGF0aDEgKyAnLCAnICsgcGF0aDIpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX2dldFN0YXRpY1BhdGgocGF0aCwgc3RhckluZGV4KSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1tcXC5cXFtdP1xcKi4qJC8sICcnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbikge1xuICAgIHJldHVybiBwYXR0ZXJuVHJhbnNsYXRpb24ubWFwKGZ1bmN0aW9uKHB0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tUGF0dGVybjogcHQudG9QYXR0ZXJuLFxuICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IHB0LnRvU3RhdGljUGF0aCxcbiAgICAgICAgICAgIHRvUGF0dGVybjogcHQuZnJvbVBhdHRlcm4sXG4gICAgICAgICAgICB0b1N0YXRpY1BhdGg6IHB0LmZyb21TdGF0aWNQYXRoXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiB0dXJuT25cbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBlbmFibGVzIGNvbm5lY3Rpb24gKGlmIGl0IHdhcyBwcmV2aW91c2x5IGRpc2FibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9uKCkge1xuICAgIGlmICh0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHN1YnNjcmlwdGlvblBhdGggPSB0aGlzLl9zdWJzY3JpcHRpb25QYXRoID1cbiAgICAgICAgbmV3IEFycmF5KHRoaXMuZGVwdGgxIHx8IHRoaXMuZGVwdGgyKS5qb2luKCcqJyk7XG5cbiAgICB2YXIgc3Vic2NyaXB0aW9uUGF0dGVybiA9IHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgoc3Vic2NyaXB0aW9uUGF0aCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuZGVwdGgxKVxuICAgICAgICB0aGlzLl9saW5rMSA9IGxpbmtEYXRhU291cmNlKCdfbGluazInLCB0aGlzLmRzMiwgdGhpcy5kczEsIHRoaXMuX2NoYW5nZXNRdWV1ZTEsIHRoaXMucGF0aFRyYW5zbGF0aW9uMSwgdGhpcy5wYXR0ZXJuVHJhbnNsYXRpb24xLCB0aGlzLmRhdGFUcmFuc2xhdGlvbjEsIHRoaXMuZGF0YVZhbGlkYXRpb24xKTtcbiAgICBpZiAodGhpcy5kZXB0aDIpXG4gICAgICAgIHRoaXMuX2xpbmsyID0gbGlua0RhdGFTb3VyY2UoJ19saW5rMScsIHRoaXMuZHMxLCB0aGlzLmRzMiwgdGhpcy5fY2hhbmdlc1F1ZXVlMiwgdGhpcy5wYXRoVHJhbnNsYXRpb24yLCB0aGlzLnBhdHRlcm5UcmFuc2xhdGlvbjIsIHRoaXMuZGF0YVRyYW5zbGF0aW9uMiwgdGhpcy5kYXRhVmFsaWRhdGlvbjIpO1xuXG4gICAgdGhpcy5pc09uID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCd0dXJuZWRvbicpO1xuXG5cbiAgICBmdW5jdGlvbiBsaW5rRGF0YVNvdXJjZShyZXZlcnNlTGluaywgZnJvbURTLCB0b0RTLCBjaGFuZ2VzUXVldWUsIHBhdGhUcmFuc2xhdGlvbiwgcGF0dGVyblRyYW5zbGF0aW9uLCBkYXRhVHJhbnNsYXRpb24sIGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgIGZyb21EUy5vblN5bmMoJ2RhdGFjaGFuZ2VzJywgb25EYXRhKTtcbiAgICAgICAgcmV0dXJuIG9uRGF0YTtcblxuICAgICAgICBmdW5jdGlvbiBvbkRhdGEobWVzc2FnZSwgYmF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBzZW5kRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogYmF0Y2gudHJhbnNhY3Rpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmF0Y2guY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2VQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgLCB0YXJnZXRQYXRoID0gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0UGF0aCA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICBfLmV4dGVuZChjaGFuZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmcm9tRFMsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRhcmdldFBhdGhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoISBjaGFuZ2VzUXVldWUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIF8uZGVmZXIocG9zdENoYW5nZURhdGEpO1xuXG4gICAgICAgICAgICBjaGFuZ2VzUXVldWUucHVzaChzZW5kRGF0YSk7XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFBhdGggPSBwYXRoVHJhbnNsYXRpb25bc291cmNlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVkUGF0aCkgcmV0dXJuIHRyYW5zbGF0ZWRQYXRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdHRlcm5UcmFuc2xhdGlvbi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ID0gXy5maW5kKHBhdHRlcm5UcmFuc2xhdGlvbiwgZnVuY3Rpb24ocFRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFRyYW5zbGF0aW9uLmZyb21QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZShwdC5mcm9tU3RhdGljUGF0aCwgcHQudG9TdGF0aWNQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgKChzdWJzY3JpcHRpb25QYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdWJzY3JpcHRpb25QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdWJzY3JpcHRpb25QYXR0ZXJuID09IHNvdXJjZVBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFBhdGggfHwgc291cmNlUGF0aDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IGRhdGFUcmFuc2xhdGlvbltzb3VyY2VQYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZSAmJiB0eXBlb2YgdHJhbnNsYXRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5vbGRWYWx1ZSA9IHRyYW5zbGF0ZShjaGFuZ2Uub2xkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHJhbnNsYXRlKGNoYW5nZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdGVEYXRhKGNoYW5nZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRvcnMgPSBkYXRhVmFsaWRhdGlvbltzb3VyY2VQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXNzZWRDb3VudCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICwgYWxyZWFkeUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5mb3JFYWNoKGNhbGxWYWxpZGF0b3IpOyAgIFxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFZhbGlkYXRvcih2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yKGNoYW5nZS5uZXdWYWx1ZSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhbHJlYWR5RmFpbGVkICYmIChlcnIgfHwgcmVzcG9uc2UudmFsaWQpICYmICsrcGFzc2VkQ291bnQgPT0gdmFsaWRhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRFMucG9zdE1lc3NhZ2UoJ3ZhbGlkYXRlZCcsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISByZXNwb25zZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21EUy5wb3N0TWVzc2FnZSgndmFsaWRhdGVkJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHJvcGFnYXRlRGF0YShjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZW5kRGF0YS5jaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwb3N0Q2hhbmdlRGF0YSgpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGVuZGxlc3MgbG9vcCBvZiB1cGRhdGVzIGZvciAyLXdheSBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHNlbGZbcmV2ZXJzZUxpbmtdKSB2YXIgY2FsbGJhY2sgPSBzdWJzY3JpcHRpb25Td2l0Y2g7XG5cbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gbWVyZ2VUcmFuc2FjdGlvbnMoY2hhbmdlc1F1ZXVlKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzUXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRhdGEgY2hhbmdlIGluc3RydWN0aW9uIGFzIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgdG9EUy5wb3N0TWVzc2FnZVN5bmMoJ2NoYW5nZWRhdGEnLCB7IGNoYW5nZXM6IHRyYW5zYWN0aW9uIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdWJzY3JpcHRpb25Td2l0Y2goZXJyLCBjaGFuZ2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgb25PZmYgPSBjaGFuZ2VGaW5pc2hlZCA/ICdvblN5bmMnIDogJ29mZic7XG4gICAgICAgICAgICAgICAgdG9EU1tvbk9mZl0oJ2RhdGFjaGFuZ2VzJywgc2VsZltyZXZlcnNlTGlua10pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaGFuZ2VGaW5pc2hlZCA/ICdjaGFuZ2Vjb21wbGV0ZWQnIDogJ2NoYW5nZXN0YXJ0ZWQnO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UobWVzc2FnZSwgeyBzb3VyY2U6IGZyb21EUywgdGFyZ2V0OiB0b0RTIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb25zKGJhdGNoZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gW11cbiAgICAgICAgICAgICAgICAgICAgLCBjdXJyZW50VHJhbnNhY3Rpb247XG5cbiAgICAgICAgICAgICAgICBiYXRjaGVzLmZvckVhY2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2gudHJhbnNhY3Rpb24pIGN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2guY2hhbmdlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2gudHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBlbmRBcnJheShjdXJyZW50VHJhbnNhY3Rpb24sIGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uID0gXy5jbG9uZShiYXRjaC5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaChjdXJyZW50VHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIHR1cm5PZmZcbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBkaXNhYmxlcyBjb25uZWN0aW9uIChpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9mZigpIHtcbiAgICBpZiAoISB0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczEsICdfbGluazInLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjIpO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczIsICdfbGluazEnLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjEpO1xuXG4gICAgdGhpcy5pc09uID0gZmFsc2U7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgndHVybmVkb2ZmJyk7XG5cblxuICAgIGZ1bmN0aW9uIHVubGlua0RhdGFTb3VyY2UoZnJvbURTLCBsaW5rTmFtZSwgcGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGlmIChzZWxmW2xpbmtOYW1lXSkge1xuICAgICAgICAgICAgZnJvbURTLm9mZignZGF0YWNoYW5nZXMnLCBzZWxmW2xpbmtOYW1lXSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZltsaW5rTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBjb25uZWN0b3Igb2JqZWN0IGJ5IHR1cm5pbmcgaXQgb2ZmIGFuZCByZW1vdmluZyByZWZlcmVuY2VzIHRvIGNvbm5lY3RlZCBzb3VyY2VzXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciRkZXN0cm95KCkge1xuICAgIHRoaXMudHVybk9mZigpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2Rlc3Ryb3llZCcpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuZHMxO1xuICAgIGRlbGV0ZSB0aGlzLmRzMjtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTW9kZWxQYXRoID0gcmVxdWlyZSgnLi9tX3BhdGgnKVxuICAgICwgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgbW9kZWxVdGlscyA9IHJlcXVpcmUoJy4vbW9kZWxfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBNb2RlbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbV9tc2dfYXBpJylcbiAgICAsIE1peGluID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvbWl4aW4nKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWxgXG4gKiBNb2RlbCBjbGFzcyBpbnN0YW50aWF0ZXMgb2JqZWN0cyB0aGF0IGFsbG93IGRlZXAgZGF0YSBhY2Nlc3Mgd2l0aCBfX3NhZmUgZ2V0dGVyc19fIHRoYXQgcmV0dXJuIHVuZGVmaW5lZCAocmF0aGVyIHRoYW4gdGhyb3dpbmcgZXhjZXB0aW9uKSB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgcmVxdWVzdGVkIGFuZCBfX3NhZmUgc2V0dGVyc19fIHRoYXQgY3JlYXRlIG9iamVjdCB0cmVlcyB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgc2V0IGFuZCBhbHNvIHBvc3QgbWVzc2FnZXMgdG8gYWxsb3cgc3Vic2NyaXB0aW9uIG9uIGNoYW5nZXMgYW5kIGVuYWJsZSBkYXRhIHJlYWN0aXZpdHkuXG4gKiBSZWFjdGl2aXR5IGlzIGltcGxlbWVtbnRlZCB2aWEgW0Nvbm5lY3Rvcl0oLi9jb25uZWN0b3IuanMuaHRtbCkgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkIGVpdGhlciBkaXJlY3RseSBvciB3aXRoIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2Ugb2YgW21pbG8ubWluZGVyXSguLi9taW5kZXIuanMuaHRtbCkuIEF0IHRoZSBtb21lbnQgbW9kZWwgY2FuIGJlIGNvbm5lY3RlZCB0byBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIG9yIHRvIGFub3RoZXIgbW9kZWwgb3IgW01vZGVsUGF0aF0oLi9tX3BhdGguanMuaHRtbCkuXG4gKiBNb2RlbCBjb25zdHJ1Y3RvciByZXR1cm5zIG9iamVjdHMgdGhhdCBhcmUgZnVuY3Rpb25zIGF0IHRoZSBzYW1lIHRpbWU7IHdoZW4gY2FsbGVkIHRoZXkgcmV0dXJuIE1vZGVsUGF0aCBvYmplY3RzIHRoYXQgYWxsb3cgZ2V0L3NldCBhY2Nlc3MgdG8gYW55IHBvaW50IGluIG1vZGVsIGRhdGEuIFNlZSBbTW9kZWxEYXRhXSgjTW9kZWxEYXRhKSBiZWxvdy5cbiAqXG4gKiBZb3UgY2FuIHN1YnNjcmliZSB0byBtb2RlbCBjaGFuZ2VzIHdpdGggYG9uYCBtZXRob2QgYnkgcGFzc2luZyBtb2RlbCBhY2Nlc3MgcGF0aCBpbiBwbGFjZSBvZiBtZXNzYWdlLCBwYXR0ZXJuIG9yIHN0cmluZyB3aXRoIGFueSBudW1iZXIgb2Ygc3RhcnMgdG8gc3Vic2NyaWJlIHRvIGEgY2VydGFpbiBkZXB0aCBpbiBtb2RlbCAoZS5nLiwgYCcqKionYCB0byBzdWJzY3JpYmUgdG8gdGhyZWUgbGV2ZWxzKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhIG9wdGlvbmFsIGluaXRpYWwgYXJyYXkgZGF0YS4gSWYgaXQgaXMgcGxhbm5lZCB0byBjb25uZWN0IG1vZGVsIHRvIHZpZXcgaXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8gaW5zdGFudGlhdGUgYW4gZW1wdHkgTW9kZWwgKGB2YXIgbSA9IG5ldyBNb2RlbGApLCBjb25uZWN0IGl0IHRvIFtDb21wb25lbnRdKC4uL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSdzIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgKGUuZy4sIGBtaWxvLm1pbmRlcihtLCAnPDwtPj4nLCBjLmRhdGEpO2ApIGFuZCB0aGVuIHNldCB0aGUgbW9kZWwgd2l0aCBgbS5zZXQoZGF0YSlgIC0gdGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBvcHRpb25hbCBvYmplY3QgdGhhdCBob3N0cyBtb2RlbCBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIENhbiBiZSB1c2VkIHdoZW4gbW9kZWwgaXRzZWxmIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBtZXNzYWdlIHN1YnNjcmliZXIgYW5kIHlvdSBuZWVkIHRvIHRyYXZlcnMgdG8gdGhpcyBvYmplY3QgKGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBhbnkgY29udGV4dCkuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJveHkgbW9kZWwncyBtZXRob2RzIHRvIHRoZSBob3N0IGxpa2UgW01vZGVsIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQuanMuaHRtbCkgaXMgZG9pbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBwYXNzIHsgcmVhY3RpdmU6IGZhbHNlIH0gdG8gdXNlIG1vZGVsIHdpdGhvdXQgbWVzc2FnaW5nIHdoZW4gaXQgaXMgbm90IG5lZWRlZCAtIGl0IG1ha2VzIGl0IG11Y2ggZmFzdGVyXG4gKiBAcmV0dXJuIHtNb2RlbH1cbiAqL1xuZnVuY3Rpb24gTW9kZWwoZGF0YSwgaG9zdE9iamVjdCwgb3B0aW9ucykge1xuICAgIC8vIGBtb2RlbGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsYFxuICAgIC8vIChgbW9kZWxQYXRoYCBmdW5jdGlvbikgc2hvdWxkIHJldHVybiBhIE1vZGVsUGF0aCBvYmplY3Qgd2l0aCBcInN5bnRoZXNpemVkXCIgbWV0aG9kc1xuICAgIC8vIHRvIGdldC9zZXQgbW9kZWwgcHJvcGVydGllcywgdG8gc3Vic2NyaWJlIHRvIHByb3BlcnR5IGNoYW5nZXMsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiBtb2RlbFBhdGggY2FuIGJlIHVzZWQgaW4gdGhlIHBhdGggdXNpbmcgaW50ZXJwb2xhdGlvbiAtIHNlZSBNb2RlbFBhdGggYmVsb3cuXG4gICAgdmFyIG1vZGVsID0gZnVuY3Rpb24gbW9kZWxQYXRoKGFjY2Vzc1BhdGgpIHsgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICAgICAgcmV0dXJuIE1vZGVsJHBhdGguYXBwbHkobW9kZWwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBtb2RlbC5fX3Byb3RvX18gPSBNb2RlbC5wcm90b3R5cGU7XG5cbiAgICBtb2RlbC5faG9zdE9iamVjdCA9IGhvc3RPYmplY3Q7XG4gICAgbW9kZWwuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKG1vZGVsLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBtb2RlbC5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsLm9uU3luYygnY2hhbmdlZGF0YScsIGNoYW5nZURhdGFIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSkgbW9kZWwuX2RhdGEgPSBkYXRhO1xuXG4gICAgcmV0dXJuIG1vZGVsO1xufVxuXG5Nb2RlbC5wcm90b3R5cGUuX19wcm90b19fID0gTW9kZWwuX19wcm90b19fO1xuXG5cbi8qKlxuICogIyMjI01vZGVsIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbcGF0aF0oI3BhdGgpIC0gcmV0dXJucyBNb2RlbFBhdGggb2JqZWN0IHRoYXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW4gTW9kZWxcbiAqIC0gW2dldF0oI01vZGVsJGdldCkgLSBnZXQgbW9kZWwgZGF0YVxuICogLSBzZXQgLSBzZXQgbW9kZWwgZGF0YSwgc3ludGhlc2l6ZWRcbiAqIC0gc3BsaWNlIC0gc3BsaWNlIG1vZGVsIGRhdGEgKGFzIGFycmF5IG9yIHBzZXVkby1hcnJheSksIHN5bnRoZXNpemVkXG4gKiAtIFtsZW5dKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbCBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRwdXNoKSAtIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFtwb3BdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHBvcCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Vuc2hpZnRdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHVuc2hpZnQpIC0gYWRkIGl0ZW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3NoaWZ0XSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRzaGlmdCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Byb3h5TWVzc2VuZ2VyXSgjcHJveHlNZXNzZW5nZXIpIC0gcHJveHkgbW9kZWwncyBNZXNzZW5nZXIgbWV0aG9kcyB0byBob3N0IG9iamVjdFxuICogLSBbcHJveHlNZXRob2RzXSgjcHJveHlNZXRob2RzKSAtIHByb3h5IG1vZGVsIG1ldGhvZHMgdG8gaG9zdCBvYmplY3RcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbCwge1xuICAgIHBhdGg6IE1vZGVsJHBhdGgsXG4gICAgZ2V0OiBNb2RlbCRnZXQsXG4gICAgcHJveHlNZXNzZW5nZXI6IHByb3h5TWVzc2VuZ2VyLCAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBwcm94eU1ldGhvZHM6IHByb3h5TWV0aG9kcyxcbiAgICBfcHJlcGFyZU1lc3NlbmdlcnM6IF9wcmVwYXJlTWVzc2VuZ2VycyxcbiAgICBfZ2V0SG9zdE9iamVjdDogX2dldEhvc3RPYmplY3QsXG4gICAgZGVzdHJveTogTW9kZWwkZGVzdHJveVxufSk7XG5cbi8vIHNldCwgZGVsLCBzcGxpY2UgYXJlIGFkZGVkIHRvIG1vZGVsXG5fLmV4dGVuZFByb3RvKE1vZGVsLCBzeW50aGVzaXplLm1vZGVsTWV0aG9kcyk7XG5cblxuLyoqXG4gKiAtIFBhdGg6IE1vZGVsUGF0aCBjbGFzcyBhcyBgbWlsby5Nb2RlbC5QYXRoYFxuICovXG5fLmV4dGVuZChNb2RlbCwge1xuICAgIFBhdGg6IE1vZGVsUGF0aCxcbiAgICB1c2VXaXRoOiBNb2RlbCQkdXNlV2l0aCxcbiAgICBfdXRpbHM6IHtcbiAgICAgICAgcGF0aDogcGF0aFV0aWxzLFxuICAgICAgICBtb2RlbDogbW9kZWxVdGlscyxcbiAgICAgICAgY2hhbmdlRGF0YUhhbmRsZXI6IGNoYW5nZURhdGFIYW5kbGVyXG4gICAgfVxufSk7XG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbCwgTUVTU0VOR0VSX1BST1BFUlRZLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoIG1ldGhvZHMgYWRkZWQgdG8gTW9kZWwgcHJvdG90eXBlXG4gKi9cblsnbGVuJywgJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWxQYXRoLnByb3RvdHlwZVttZXRob2ROYW1lXTtcbiAgICBfLmRlZmluZVByb3BlcnR5KE1vZGVsLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogR2V0IG1vZGVsIGRhdGEuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbCRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBzYW1lIEFQSSBhcyBtb2RlbCBidXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW5zaWRlIG1vZGVsIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgLlxuICogU2VlIFtNb2RlbFBhdGhdKC4vbV9wYXRoLmpzLmh0bWwpIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsJHBhdGgoYWNjZXNzUGF0aCkgeyAgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICBpZiAoISBhY2Nlc3NQYXRoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFwibnVsbFwiIGlzIGNvbnRleHQgdG8gcGFzcyB0byBNb2RlbFBhdGgsIGZpcnN0IHBhcmFtZXRlciBvZiBiaW5kXG4gICAgLy8gXCJ0aGlzXCIgKG1vZGVsKSBpcyBhZGRlZCBpbiBmcm9udCBvZiBhbGwgYXJndW1lbnRzXG4gICAgXy5zcGxpY2UoYXJndW1lbnRzLCAwLCAwLCBudWxsLCB0aGlzKTtcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoTW9kZWxQYXRoLCBhcmd1bWVudHMpKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByb3h5IG1vZGVsJ3MgTWVzc2VuZ2VyIG1ldGhvZHMgdG8gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsSG9zdE9iamVjdCBvcHRpb25hbCBob3N0IG9iamVjdC4gSWYgbm90IHBhc3NlZCwgaG9zdE9iamVjdCBwYXNzZWQgdG8gTW9kZWwgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBwcm94eU1lc3Nlbmdlcihtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBtb2RlbEhvc3RPYmplY3QpO1xufVxuXG5cbnZhciBtb2RlbE1ldGhvZHNUb1Byb3h5ID0gWydwYXRoJywgJ2dldCcsICdzZXQnLCAnZGVsJywgJ3NwbGljZScsICdsZW4nLCAncHVzaCcsICdwb3AnLCAndW5zaGlmdCcsICdzaGlmdCddO1xuXG5cbi8qKlxuICogRXhwb3NlIG1vZGVsIG1ldGhvZHMgb25cbiAqIFNlZSBzYW1lIG1ldGhvZCBpbiBNaXhpbiBjbGFzcyBmb3IgcGFyYW1ldGVycyBtZWFuaW5nXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaG9zdENsYXNzXG4gKiBAcGFyYW0ge1t0eXBlXX0gaW5zdGFuY2VLZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBtaXhpbk1ldGhvZHMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTW9kZWwkJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgbWl4aW5NZXRob2RzID0gbWl4aW5NZXRob2RzIHx8IG1vZGVsTWV0aG9kc1RvUHJveHk7XG4gICAgTWl4aW4udXNlV2l0aC5jYWxsKE1vZGVsLCBob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZHMpO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogUHJveHkgbW9kZWwgbWV0aG9kcyB0byBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kZWxIb3N0T2JqZWN0IG9wdGlvbmFsIGhvc3Qgb2JqZWN0LiBJZiBub3QgcGFzc2VkLCBob3N0T2JqZWN0IHBhc3NlZCB0byBNb2RlbCBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3h5TWV0aG9kcyhtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXMsIG1vZGVsTWV0aG9kc1RvUHJveHksIG1vZGVsSG9zdE9iamVjdCk7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBDcmVhdGUgYW5kIGNvbm5lY3QgaW50ZXJuYWwgYW5kIGV4dGVybmFsIG1vZGVsJ3MgbWVzc2VuZ2Vycy5cbiAqIEV4dGVybmFsIG1lc3NlbmdlcidzIG1ldGhvZHMgYXJlIHByb3hpZWQgb24gdGhlIG1vZGVsIGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gbW9kZWwgd2lsbCBwb3N0IGFsbCBpdHMgY2hhbmdlcyBvbiBpbnRlcm5hbCBtZXNzZW5nZXJcbiAgICB2YXIgaW50ZXJuYWxNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgIC8vIG1lc3NhZ2Ugc291cmNlIHRvIGNvbm5lY3QgaW50ZXJuYWwgbWVzc2VuZ2VyIHRvIGV4dGVybmFsXG4gICAgdmFyIGludGVybmFsTWVzc2VuZ2VyU291cmNlID0gbmV3IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCBuZXcgTW9kZWxNc2dBUEksIGludGVybmFsTWVzc2VuZ2VyKTtcblxuICAgIC8vIGV4dGVybmFsIG1lc3NlbmdlciB0byB3aGljaCBhbGwgbW9kZWwgdXNlcnMgd2lsbCBzdWJzY3JpYmUsXG4gICAgLy8gdGhhdCB3aWxsIGFsbG93IFwiKlwiIHN1YnNjcmlwdGlvbnMgYW5kIHN1cHBvcnQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZSBhcGkuXG4gICAgdmFyIGV4dGVybmFsTWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIGludGVybmFsTWVzc2VuZ2VyU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBleHRlcm5hbE1lc3Nlbmdlcik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2ludGVybmFsTWVzc2VuZ2VyJywgaW50ZXJuYWxNZXNzZW5nZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRIb3N0T2JqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0T2JqZWN0O1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pbnRlcm5hbE1lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlclJlZ2V4cEFQSSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tX2FwaV9yeCcpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2YgTWVzc2VuZ2VyUmVnZXhwQVBJIHRoYXQgaXMgdXNlZCB0byB0cmFuc2xhdGUgbWVzc2FnZXMgb2YgZXh0ZXJuYWwgbWVzc2VuZ2VyIG9mIE1vZGVsIHRvIGludGVybmFsIG1lc3NlbmdlciBvZiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJSZWdleHBBUEksICdNb2RlbE1zZ0FQSScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsTXNnQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgc3Vic2NyaXB0aW9uIHBhdGhzIHdpdGggXCIqXCJzIHRvIHJlZ2V4LCBsZWF2aW5nIG90aGVyIHN0cmluZ3MgdW50b3VjaGVkXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHN1YnNjcmlwdGlvbiBwYXRocyB3aXRoIFwiKlwicyB0byByZWdleCwgbGVhdmluZyBvdGhlciBzdHJpbmdzIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCByZWxhdGl2ZSBhY2Nlc3MgcGF0aCB0byBiZSB0cmFuc2xhdGVkXG4gKiBAcmV0dXJuIHtSZWdFeHB8U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UoYWNjZXNzUGF0aCkge1xuICAgIGlmIChhY2Nlc3NQYXRoIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gYWNjZXNzUGF0aDtcblxuICAgIHJldHVybiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKGFjY2Vzc1BhdGgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNb2RlbFBhdGhNc2dBUEkgPSByZXF1aXJlKCcuL3BhdGhfbXNnX2FwaScpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWwuUGF0aGBcbiAqIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIGFueSBwb2ludCBpbnNpZGUgW01vZGVsXSguL2luZGV4LmpzLmh0bWwpIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCBNb2RlbCBpbnN0YW5jZSB0aGF0IE1vZGVsUGF0aCBnaXZlcyBhY2Nlc3MgdG8uXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCBzdHJpbmcgdGhhdCBkZWZpbmVzIHBhdGggdG8gYWNjZXNzIG1vZGVsLlxuICogIFBhdGggc3RyaW5nIGNvbnNpc3RzIG9mIHBhcnRzIHRvIGRlZmluZSBlaXRoZXIgcHJvcGVydHkgYWNjZXNzIChgXCIubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgbmFtZSkgb3IgYXJyYXkgaXRlbSBhY2Nlc3MgKGBcIlsxXVwiYCB0byBhY2Nlc3MgaXRlbSB3aXRoIGluZGV4IDEpLlxuICogIEFjY2VzcyBwYXRoIGNhbiBjb250YWluIGFzIG1hbnkgcGFydHMgYXMgbmVjZXNzYXJ5IChlLmcuIGBcIi5saXN0WzBdLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IGBuYW1lYCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBzdG9yZWQgaW4gcHJvcGVydHkgYGxpc3RgLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWRkaXRpb25hbCBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGludGVycG9sYXRlZCBwYXRocy5cbiAqICBFLmcuIGBtLnBhdGgoXCJbJDFdLiQyXCIsIGlkLCBwcm9wKWAgcmV0dXJucyBNb2RlbFBhdGggdG8gYWNjZXNzIHByb3BlcnR5IHdpdGggbmFtZSBgcHJvcGAgaW4gYXJyYXkgaXRlbSB3aXRoIGluZGV4IGBpZGAuIEFsdGhvdWdoIHRoaXMgTW9kZWxQYXRoIG9iamVjdCB3aWxsIHdvcmsgZXhhY3RseSBhcyBgbShcIltcIiArIGlkICsgXCJdLlwiICsgcHJvcClgLCB0aGUgaW50ZXJwb2xhdGVkIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYXMgTW9kZWxQYXRoIHdpdGggaW50ZXJwb2xhdGlvbiB3aWxsIG5vdCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB3aGlsZSBNb2RlbFBhdGggd2l0aCBjb21wdXRlZCBhY2Nlc3MgcGF0aCB3aWxsIHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFpciBvZiB2YWx1ZXMgb2YgYGlkYCBhbmQgYHByb3BgLlxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgobW9kZWwsIHBhdGgpIHsgLy8gLC4uLiAtIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpbnRlcnBvbGF0aW9uXG4gICAgLy8gY2hlY2sobW9kZWwsIE1vZGVsKTtcbiAgICBjaGVjayhwYXRoLCBTdHJpbmcpO1xuXG4gICAgLy8gYG1vZGVsUGF0aGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsUGF0aGBcbiAgICAvLyAoYG1vZGVsUGF0aF9wYXRoYCBmdW5jdGlvbikgc2hvdWxkIGFsc28gcmV0dXJuIGEgTW9kZWxQYXRoIG9iamVjdCB3aXRoIFwic3ludGhlc2l6ZWRcIiBtZXRob2RzXG4gICAgLy8gdG8gZ2V0L3NldCBtb2RlbCBwcm9wZXJ0aWVzLCB0byBzdWJzY3JpYmUgdG8gcHJvcGVydHkgY2hhbmdlcywgZXRjLlxuICAgIC8vIEFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIG1vZGVsUGF0aCBjYW4gYmUgdXNlZCBpbiB0aGUgcGF0aCB1c2luZyBpbnRlcnBvbGF0aW9uIC0gc2VlIE1vZGVsUGF0aCBiZWxvdy5cbiAgICB2YXIgbW9kZWxQYXRoID0gZnVuY3Rpb24gbW9kZWxQYXRoX3BhdGgoYWNjZXNzUGF0aCkgeyAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgICAgICByZXR1cm4gTW9kZWxQYXRoJHBhdGguYXBwbHkobW9kZWxQYXRoLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgbW9kZWxQYXRoLl9fcHJvdG9fXyA9IE1vZGVsUGF0aC5wcm90b3R5cGU7XG5cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIHtcbiAgICAgICAgX21vZGVsOiBtb2RlbCxcbiAgICAgICAgX3BhdGg6IHBhdGgsXG4gICAgICAgIF9hcmdzOiBfLnNsaWNlKGFyZ3VtZW50cywgMSksIC8vIHBhdGggd2lsbCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5XG4gICAgICAgIF9vcHRpb25zOiBtb2RlbC5fb3B0aW9uc1xuICAgIH0pO1xuXG4gICAgLy8gcGFyc2UgYWNjZXNzIHBhdGhcbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCk7XG5cbiAgICAvLyBjb21wdXRlIGFjY2VzcyBwYXRoIHN0cmluZ1xuICAgIF8uZGVmaW5lUHJvcGVydHkobW9kZWxQYXRoLCAnX2FjY2Vzc1BhdGgnLCBpbnRlcnBvbGF0ZUFjY2Vzc1BhdGgocGFyc2VkUGF0aCwgbW9kZWxQYXRoLl9hcmdzKSk7XG5cbiAgICBpZiAobW9kZWxQYXRoLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAvLyBtZXNzZW5nZXIgZmFpbHMgb24gXCIqXCIgc3Vic2NyaXB0aW9uc1xuICAgICAgICBtb2RlbFBhdGguX3ByZXBhcmVNZXNzZW5nZXIoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsUGF0aC5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsaW5nIGdldHRlciBhbmQgc2V0dGVyXG4gICAgdmFyIG1ldGhvZHMgPSBzeW50aGVzaXplKHBhdGgsIHBhcnNlZFBhdGgpO1xuXG4gICAgLy8gYWRkaW5nIG1ldGhvZHMgdG8gbW9kZWwgcGF0aFxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIG1ldGhvZHMpO1xuXG4gICAgT2JqZWN0LmZyZWV6ZShtb2RlbFBhdGgpO1xuXG4gICAgcmV0dXJuIG1vZGVsUGF0aDtcbn1cblxuTW9kZWxQYXRoLnByb3RvdHlwZS5fX3Byb3RvX18gPSBNb2RlbFBhdGguX19wcm90b19fO1xuXG5cbi8qKlxuICogSW50ZXJwb2xhdGVzIHBhdGggZWxlbWVudHMgdG8gY29tcHV0ZSByZWFsIHBhdGhcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJzZWRQYXRoIHBhcnNlZCBwYXRoIC0gYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHBhcmFtIHtBcnJheX0gYXJncyBwYXRoIGludGVycG9sYXRpb24gYXJndW1lbnRzLCBhcmdzWzBdIGlzIHBhdGggaXRzZWxmXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRlQWNjZXNzUGF0aChwYXJzZWRQYXRoLCBhcmdzKSB7XG4gICAgcmV0dXJuIHBhcnNlZFBhdGgucmVkdWNlKGZ1bmN0aW9uKGFjY2Vzc1BhdGhTdHIsIGN1cnJOb2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaW50ZXJwb2xhdGUgPSBjdXJyTm9kZS5pbnRlcnBvbGF0ZTtcbiAgICAgICAgcmV0dXJuIGFjY2Vzc1BhdGhTdHIgK1xuICAgICAgICAgICAgICAgIChpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IChjdXJyTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyBhcmdzW2ludGVycG9sYXRlXSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnLicgKyBhcmdzW2ludGVycG9sYXRlXSlcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJyTm9kZS5wcm9wZXJ0eSk7XG4gICAgfSwgJycpO1xufVxuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW3BhdGhdKCNNb2RlbFBhdGgkcGF0aCkgLSBnaXZlcyBhY2Nlc3MgdG8gcGF0aCBpbnNpZGUgTW9kZWxQYXRoXG4gKiAtIGdldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNwbGljZSAtIHNwbGljZSBtb2RlbCBkYXRhIChhcyBhcnJheSBvciBwc2V1ZG8tYXJyYXkpLCBzeW50aGVzaXplZFxuICogLSBbbGVuXSgjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSgjTW9kZWxQYXRoJHB1c2gpIC0gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKiAtIFtwb3BdKCNNb2RlbFBhdGgkcG9wKSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3Vuc2hpZnRdKCNNb2RlbFBhdGgkdW5zaGlmdCkgLSBhZGQgaXRlbXMgdG8gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3NoaWZ0XSgjTW9kZWxQYXRoJHNoaWZ0KSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbFBhdGgsIHtcbiAgICBwYXRoOiBNb2RlbFBhdGgkcGF0aCxcbiAgICBsZW46IE1vZGVsUGF0aCRsZW4sXG4gICAgcHVzaDogTW9kZWxQYXRoJHB1c2gsXG4gICAgcG9wOiBNb2RlbFBhdGgkcG9wLFxuICAgIHVuc2hpZnQ6IE1vZGVsUGF0aCR1bnNoaWZ0LFxuICAgIHNoaWZ0OiBNb2RlbFBhdGgkc2hpZnQsXG4gICAgX3ByZXBhcmVNZXNzZW5nZXI6IF9wcmVwYXJlTWVzc2VuZ2VyLFxuICAgIF9nZXREZWZpbml0aW9uOiBfZ2V0RGVmaW5pdGlvbixcbiAgICBkZXN0cm95OiBNb2RlbFBhdGgkZGVzdHJveVxufSk7XG5cblxuXy5leHRlbmQoTW9kZWxQYXRoLCB7XG4gICAgX2NyZWF0ZUZyb21EZWZpbml0aW9uOiBfY3JlYXRlRnJvbURlZmluaXRpb25cbn0pXG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbFBhdGgsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vKipcbiAqIE1vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RcbiAqIEdpdmVzIGFjY2VzcyB0byBwYXRoIGluc2lkZSBNb2RlbFBhdGguIE1ldGhvZCB3b3JrcyBzaW1pbGFybHkgdG8gW3BhdGggbWV0aG9kXSgjTW9kZWwkcGF0aCkgb2YgbW9kZWwsIHVzaW5nIHJlbGF0aXZlIHBhdGhzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRwYXRoKGFjY2Vzc1BhdGgpIHsgIC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgaWYgKCEgYWNjZXNzUGF0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGhpc1BhdGhBcmdzQ291bnQgPSB0aGlzLl9hcmdzLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAodGhpc1BhdGhBcmdzQ291bnQgPiAwKSB7Ly8gdGhpcyBwYXRoIGhhcyBpbnRlcnBvbGF0ZWQgYXJndW1lbnRzIHRvb1xuICAgICAgICBhY2Nlc3NQYXRoID0gYWNjZXNzUGF0aC5yZXBsYWNlKC9cXCRbMS05XVswLTldKi9nLCBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiAnJCcgKyAoK3N0ci5zbGljZSgxKSArIHRoaXNQYXRoQXJnc0NvdW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG5ld1BhdGggPSB0aGlzLl9wYXRoICsgYWNjZXNzUGF0aDtcblxuICAgIC8vIHRoaXMuX21vZGVsIGlzIGFkZGVkIGluIGZyb250IG9mIGFsbCBhcmd1bWVudHMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICAgIC8vIG9mIE1vZGVsUGF0aCBjb25zdHJ1Y3RvclxuICAgIHZhciBhcmdzID0gW3RoaXMuX21vZGVsLCBuZXdQYXRoXVxuICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5fYXJncy5zbGljZSgxKSkgLy8gcmVtb3ZlIG9sZCBwYXRoIGZyb20gX2FyZ3MsIGFzIGl0IGlzIDEgYmFzZWRcbiAgICAgICAgICAgICAgICAuY29uY2F0KF8uc2xpY2UoYXJndW1lbnRzLCAxKSk7IC8vIGFkZCBuZXcgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHNcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkoTW9kZWxQYXRoLCBhcmdzKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGxlbmd0aCBwcm9wZXJ0eSBhbmQgc2V0cyBpdCB0byAwIGlmIGl0IHdhc24ndCBzZXQuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkbGVuKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGgoJy5sZW5ndGgnKS5nZXQoKSB8fCAwO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgaXRlbXMgdG8gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGxpc3Qgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGFycmF5IChwc2V1ZG8gYXJyYXkpXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcHVzaCgpIHsgLy8gYXJndW1lbnRzXG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuKCk7XG4gICAgdmFyIG5ld0xlbmd0aCA9IGxlbmd0aCArIGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICBfLnNwbGljZShhcmd1bWVudHMsIDAsIDAsIGxlbmd0aCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBuZXdMZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyB0aGlzIGl0ZW0uXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcG9wKCkge1xuICAgIHJldHVybiB0aGlzLnNwbGljZSh0aGlzLmxlbigpIC0gMSwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogSW5zZXJ0cyBpdGVtcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGl0ZW1zIHRvIGJlIGluc2VydGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXlcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCR1bnNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW4oKTtcbiAgICBsZW5ndGggKz0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIF8uc3BsaWNlKGFyZ3VtZW50cywgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBsZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkuIFJldHVybnMgdGhpcyBpdGVtLlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICByZXR1cm4gdGhpcy5zcGxpY2UoMCwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNb2RlbFBhdGggbWVzZW5nZXIgd2l0aCBNb2RlbCdzIG1lc3NlbmdlciBhcyBpdHMgc291cmNlIChbTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZV0oLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZS5qcy5odG1sKSkgYW5kIFtNb2RlbFBhdGhNc2dBUEldKC4vcGF0aF9tc2dfYXBpLmpzLmh0bWwpIGFzIFtNZXNzZW5nZXJBUEldKC4uL21lc3Nlbmdlci9tX2FwaS5qcy5odG1sKVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcigpIHtcbiAgICB2YXIgbVBhdGhBUEkgPSBuZXcgTW9kZWxQYXRoTXNnQVBJKHRoaXMuX2FjY2Vzc1BhdGgpO1xuXG4gICAgLy8gY3JlYXRlIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgY29ubmVjdGVkIHRvIE1vZGVsJ3MgbWVzc2VuZ2VyXG4gICAgdmFyIG1vZGVsTWVzc2FnZVNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbVBhdGhBUEksIHRoaXMuX21vZGVsKTtcblxuICAgIC8vIGNyZWF0ZSBtZXNzZW5nZXIgd2l0aCBtb2RlbCBwYXNzZWQgYXMgaG9zdE9iamVjdCAoZGVmYXVsdCBtZXNzYWdlIGRpc3BhdGNoIGNvbnRleHQpXG4gICAgLy8gYW5kIHdpdGhvdXQgcHJveHlpbmcgbWV0aG9kcyAod2UgZG9uJ3Qgd2FudCB0byBwcm94eSB0aGVtIHRvIE1vZGVsKVxuICAgIHZhciBtUGF0aE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgdW5kZWZpbmVkLCBtb2RlbE1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgLy8gc3RvcmUgbWVzc2VuZ2VyIG9uIE1vZGVsUGF0aCBpbnN0YW5jZVxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBtUGF0aE1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3QgYWxsb3dpbmcgdG8gcmVjcmVhdGUgbW9kZWwgcGF0aFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2dldERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsLFxuICAgICAgICBwYXRoOiB0aGlzLl9wYXRoLFxuICAgICAgICBhcmdzOiB0aGlzLl9hcmdzXG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBtb2RlbFBhdGggb2JqZWN0IGZyb20gZGVmaW5pdGlvbiBjcmVhdGVkIGJ5IF9nZXREZWZpbml0aW9uXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZpbml0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVGcm9tRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgY2hlY2soZGVmaW5pdGlvbiwge1xuICAgICAgICBtb2RlbDogRnVuY3Rpb24sIC8vIE1vZGVsXG4gICAgICAgIHBhdGg6IFN0cmluZyxcbiAgICAgICAgYXJnczogQXJyYXlcbiAgICB9KTtcblxuICAgIHZhciBtID0gZGVmaW5pdGlvbi5tb2RlbDtcblxuICAgIHJldHVybiBtLmFwcGx5KG0sIGRlZmluaXRpb24uYXJncyk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxQYXRoJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbW9kZWxVdGlscyA9IHtcbiAgICBub3JtYWxpemVTcGxpY2VJbmRleDogbm9ybWFsaXplU3BsaWNlSW5kZXhcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbW9kZWxVdGlscztcblxuXG5mdW5jdGlvbiBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNwbGljZUluZGV4ID4gbGVuZ3RoXG4gICAgICAgICAgICA/IGxlbmd0aFxuICAgICAgICAgICAgOiBzcGxpY2VJbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyBzcGxpY2VJbmRleFxuICAgICAgICAgICAgICAgIDogc3BsaWNlSW5kZXggKyBsZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gc3BsaWNlSW5kZXggKyBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21fYXBpJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBtZXNzYWdlcyBvZiBNZXNzZW5nZXIgb24gTW9kZWxQYXRoIHRvIE1lc3NlbmdlciBvbiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsUGF0aE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTW9kZWxQYXRoTXNnQVBJJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KSAtIGluaXRpYWxpemVzIE1vZGVsUGF0aE1zZ0FQSVxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgcmVsYXRpdmUgYWNjZXNzIHBhdGhzIG9mIE1vZGVsUGF0aCB0byBmdWxsIHBhdGggb2YgTW9kZWxcbiAqIC0gW2NyZWF0ZUludGVybmFsRGF0YV0oI2NyZWF0ZUludGVybmFsRGF0YSkgLSBjaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxQYXRoTXNnQVBJLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlckFQSSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcm9vdFBhdGggcm9vdCBwYXRoIG9mIG1vZGVsIHBhdGhcbiAqL1xuZnVuY3Rpb24gaW5pdChyb290UGF0aCkge1xuICAgIE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMucm9vdFBhdGggPSByb290UGF0aDtcbn1cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHJlbGF0aXZlIGFjY2VzcyBwYXRocyBvZiBNb2RlbFBhdGggdG8gZnVsbCBwYXRoIG9mIE1vZGVsLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHJlbGF0aXZlIGFjY2VzcyBwYXRoIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAvLyBUT0RPIHNob3VsZCBwcmVwZW5kIFJlZ0V4ZXNcbiAgICAvLyBUT0RPIHNob3VsZCBub3QgcHJlcGVuZCBjaGFuZ2VkYXRhIHRvbz8/P1xuICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5yb290UGF0aCArIG1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIGZ1bGwgYWNjZXNzIHBhdGggb24gTW9kZWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIHJlbGF0aXZlIGFjY2VzcyBwYXRoIG9uIE1vZGVsUGF0aFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZURhdGEgZGF0YSByZWNlaXZlZCBmcm9tIE1vZGVsLCB3aWxsIGJlIHRyYW5zbGF0ZWQgYXMgZGVzY3JpYmVkIHRvIGJlIGRpc3BhdGNoZWQgdG8gTW9kZWxQYXRoXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgLy8gVE9ETyByZXR1cm4gb24gY2hhbmdlZGF0YSB0b28/Pz9cbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKSB7XG4gICAgICAgIHZhciBpbnRlcm5hbENoYW5nZXMgPSBzb3VyY2VEYXRhLmNoYW5nZXNcbiAgICAgICAgICAgIC5tYXAodHJ1bmNhdGVDaGFuZ2VQYXRoLCB0aGlzKVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuIGNoYW5nZTsgfSk7XG4gICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSB7XG4gICAgICAgICAgICBjaGFuZ2VzOiBpbnRlcm5hbENoYW5nZXMsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogc291cmNlRGF0YS50cmFuc2FjdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBpbnRlcm5hbERhdGFcbiAgICB9XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0gdHJ1bmNhdGVDaGFuZ2VQYXRoLmNhbGwodGhpcywgc291cmNlRGF0YSk7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cblxuXG5mdW5jdGlvbiB0cnVuY2F0ZUNoYW5nZVBhdGgoY2hhbmdlKSB7XG4gICAgdmFyIGZ1bGxQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgLCBwYXRoID0gXy51blByZWZpeChmdWxsUGF0aCwgdGhpcy5yb290UGF0aCk7XG5cbiAgICBpZiAodHlwZW9mIHBhdGggPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlLmZ1bGxQYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIGNoYW5nZS5wYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJtb2RlbC1wYXRoXCI+PC9hPlxuLy8gIyMjIG1vZGVsIHBhdGggdXRpbHNcblxudmFyIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cbnZhciBwYXRoVXRpbHMgPSB7XG4gICAgcGFyc2VBY2Nlc3NQYXRoOiBwYXJzZUFjY2Vzc1BhdGgsXG4gICAgY3JlYXRlUmVnZXhQYXRoOiBjcmVhdGVSZWdleFBhdGgsXG4gICAgZ2V0UGF0aE5vZGVLZXk6IGdldFBhdGhOb2RlS2V5LFxuICAgIHdyYXBNZXNzZW5nZXJNZXRob2RzOiB3cmFwTWVzc2VuZ2VyTWV0aG9kc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoVXRpbHM7XG5cblxudmFyIHByb3BlcnR5UGF0aFN5bnRheCA9ICdcXFxcLltBLVphLXpfLV1bQS1aYS16MC05Xy1dKidcbiAgICAsIGFycmF5UGF0aFN5bnRheCA9ICdcXFxcW1swLTldK1xcXFxdJ1xuICAgICwgaW50ZXJwb2xhdGlvblN5bnRheCA9ICdcXFxcJFsxLTldWzAtOV0qJ1xuICAgICwgcHJvcGVydHlJbnRlcnBvbGF0ZVN5bnRheCA9ICdcXFxcLicgKyBpbnRlcnBvbGF0aW9uU3ludGF4XG4gICAgLCBhcnJheUludGVycG9sYXRlU3ludGF4ID0gJ1xcXFxbJyArIGludGVycG9sYXRpb25TeW50YXggKyAnXFxcXF0nXG5cbiAgICAsIHByb3BlcnR5U3RhclN5bnRheCA9ICdcXFxcLlxcXFwqJ1xuICAgICwgYXJyYXlTdGFyU3ludGF4ID0gJ1xcXFxbXFxcXCpcXFxcXSdcbiAgICAsIHN0YXJTeW50YXggPSAnXFxcXConXG5cbiAgICAsIHBhdGhQYXJzZVN5bnRheCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQYXRoU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW50ZXJwb2xhdGVTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlJbnRlcnBvbGF0ZVN5bnRheFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdGhQYXJzZVBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdGhQYXJzZVN5bnRheCwgJ2cnKVxuXG4gICAgLCBwYXR0ZXJuUGF0aFBhcnNlU3ludGF4ID0gIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXJzZVN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJTeW50YXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdHRlcm5QYXRoUGFyc2VQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuUGF0aFBhcnNlU3ludGF4LCAnZycpXG5cbiAgICAvLywgdGFyZ2V0UGF0aFBhcnNlUGF0dGVybiA9IC9cXC5bQS1aYS16XVtBLVphLXowLTlfXSp8XFxbWzAtOV0rXFxdfFxcLlxcJFsxLTldWzAtOV0qfFxcW1xcJFsxLTldWzAtOV0qXFxdfFxcJFsxLTldWzAtOV0vZ1xuICAgICwgcGF0aE5vZGVUeXBlcyA9IHtcbiAgICAgICAgJy4nOiB7IHN5bnRheDogJ29iamVjdCcsIGVtcHR5OiAne30nIH0sXG4gICAgICAgICdbJzogeyBzeW50YXg6ICdhcnJheScsIGVtcHR5OiAnW10nfSxcbiAgICAgICAgJyonOiB7IHN5bnRheDogJ21hdGNoJywgZW1wdHk6ICd7fSd9LFxuICAgIH07XG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXNzUGF0aChwYXRoLCBub2RlUGFyc2VQYXR0ZXJuKSB7XG4gICAgbm9kZVBhcnNlUGF0dGVybiA9IG5vZGVQYXJzZVBhdHRlcm4gfHwgcGF0aFBhcnNlUGF0dGVybjtcblxuICAgIHZhciBwYXJzZWRQYXRoID0gW107XG5cbiAgICBpZiAoISBwYXRoKVxuICAgICAgICByZXR1cm4gcGFyc2VkUGF0aDtcblxuICAgIHZhciB1bnBhcnNlZCA9IHBhdGgucmVwbGFjZShub2RlUGFyc2VQYXR0ZXJuLCBmdW5jdGlvbihub2RlU3RyKSB7XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IHsgcHJvcGVydHk6IG5vZGVTdHIgfTtcbiAgICAgICAgXy5leHRlbmQocGF0aE5vZGUsIHBhdGhOb2RlVHlwZXNbbm9kZVN0clswXV0pO1xuICAgICAgICBpZiAobm9kZVN0clsxXSA9PSAnJCcpXG4gICAgICAgICAgICBwYXRoTm9kZS5pbnRlcnBvbGF0ZSA9IGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCB0cnVlKTtcblxuICAgICAgICBwYXJzZWRQYXRoLnB1c2gocGF0aE5vZGUpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG4gICAgaWYgKHVucGFyc2VkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luY29ycmVjdCBtb2RlbCBwYXRoOiAnICsgcGF0aCk7XG5cbiAgICByZXR1cm4gcGFyc2VkUGF0aDtcbn1cblxuXG52YXIgbm9kZVJlZ2V4ID0ge1xuICAgICcuKic6IHByb3BlcnR5UGF0aFN5bnRheCxcbiAgICAnWypdJzogYXJyYXlQYXRoU3ludGF4XG59O1xubm9kZVJlZ2V4WycqJ10gPSBub2RlUmVnZXhbJy4qJ10gKyAnfCcgKyBub2RlUmVnZXhbJ1sqXSddO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWdleFBhdGgocGF0aCkge1xuICAgIGNoZWNrKHBhdGgsIE1hdGNoLk9uZU9mKFN0cmluZywgUmVnRXhwKSk7XG5cbiAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBwYXRoLmluZGV4T2YoJyonKSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCwgcGF0dGVyblBhdGhQYXJzZVBhdHRlcm4pXG4gICAgICAgICwgcmVnZXhTdHIgPSAnXidcbiAgICAgICAgLy8gLCByZWdleFN0ckVuZCA9ICcnXG4gICAgICAgICwgcGF0dGVybnNTdGFydGVkID0gZmFsc2U7XG5cbiAgICBwYXJzZWRQYXRoLmZvckVhY2goZnVuY3Rpb24ocGF0aE5vZGUpIHtcbiAgICAgICAgdmFyIHByb3AgPSBwYXRoTm9kZS5wcm9wZXJ0eVxuICAgICAgICAgICAgLCByZWdleCA9IG5vZGVSZWdleFtwcm9wXTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZWdleCkge1xuICAgICAgICAgICAgLy8gcmVnZXhTdHIgKz0gJygnICsgcmVnZXg7XG4gICAgICAgICAgICAvLyByZWdleFN0ckVuZCArPSAnfCknO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gJygnICsgcmVnZXggKyAnfCknO1xuICAgICAgICAgICAgLy8gcmVnZXhTdHJFbmQgKz0gJ3wpJztcbiAgICAgICAgICAgIHBhdHRlcm5zU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiAocGF0dGVybnNTdGFydGVkKVxuICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcignXCIqXCIgcGF0aCBzZWdtZW50IGNhbm5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYXRoOiAnICsgcGF0aCk7XG4gICAgICAgICAgICByZWdleFN0ciArPSBwcm9wLnJlcGxhY2UoLyhcXC58XFxbfFxcXSkvZywgJ1xcXFwkMScpOyAvLyBhZGQgc2xhc2ggaW4gZnJvbnQgb2Ygc3ltYm9scyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ2V4XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2V4U3RyICs9IC8qIHJlZ2V4U3RyRW5kICsgKi8gJyQnO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhTdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGNvbnN0cnVjdCByZWdleCBmb3IgcGF0aCBwYXR0ZXJuOiAnICsgcGF0aCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCBpbnRlcnBvbGF0ZWQpIHtcbiAgICB2YXIgcHJvcCA9IHBhdGhOb2RlLnByb3BlcnR5XG4gICAgICAgICwgc3RhcnRJbmRleCA9IGludGVycG9sYXRlZCA/IDIgOiAxO1xuICAgIHJldHVybiBwYXRoTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICA/IHByb3Auc2xpY2Uoc3RhcnRJbmRleCwgcHJvcC5sZW5ndGggLSAxKVxuICAgICAgICA6IHByb3Auc2xpY2Uoc3RhcnRJbmRleCk7XG59XG5cblxuLy8gVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgbWVzc2FnZXMgaW4gYSBzdHJpbmdcbmZ1bmN0aW9uIHdyYXBNZXNzZW5nZXJNZXRob2RzKG1ldGhvZHNOYW1lcykge1xuICAgIG1ldGhvZHNOYW1lcyA9IG1ldGhvZHNOYW1lcyB8fCBbJ29uJywgJ29mZiddO1xuICAgIHZhciB3cmFwcGVkTWV0aG9kcyA9IF8ubWFwVG9PYmplY3QobWV0aG9kc05hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBvcmlnTWV0aG9kID0gdGhpc1ttZXRob2ROYW1lXTtcbiAgICAgICAgLy8gcmVwbGFjaW5nIG1lc3NhZ2Ugc3Vic3JpYmUvdW5zdWJzY3JpYmUvZXRjLiB0byBjb252ZXJ0IFwiKlwiIG1lc3NhZ2UgcGF0dGVybnMgdG8gcmVnZXhwc1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCwgc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHJlZ2V4UGF0aCA9IGNyZWF0ZVJlZ2V4UGF0aChwYXRoKTtcbiAgICAgICAgICAgIG9yaWdNZXRob2QuY2FsbCh0aGlzLCByZWdleFBhdGgsIHN1YnNjcmliZXIpO1xuICAgICAgICB9O1xuICAgIH0sIHRoaXMpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB3cmFwcGVkTWV0aG9kcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoVXRpbHMgPSByZXF1aXJlKCcuLi9wYXRoX3V0aWxzJylcbiAgICAsIG1vZGVsVXRpbHMgPSByZXF1aXJlKCcuLi9tb2RlbF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi8uLi91dGlsL2xvZ2dlcicpXG4gICAgLCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgICAsIGRvVCA9IHJlcXVpcmUoJ2RvdCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoYW5nZURhdGFIYW5kbGVyID0gcmVxdWlyZSgnLi4vY2hhbmdlX2RhdGEnKVxuICAgICwgZ2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuZ2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkO1xuXG5cbi8qKlxuICogVGVtcGxhdGVzIHRvIHN5bnRoZXNpemUgbW9kZWwgZ2V0dGVycyBhbmQgc2V0dGVyc1xuICovXG52YXIgdGVtcGxhdGVzID0ge1xuICAgIGdldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBnZXQoKSB7XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgcmV0dXJuIG0ge3t+IGl0LnBhcnNlZFBhdGggOnBhdGhOb2RlIH19XFxuICAgICAgICB7ez8gcGF0aE5vZGUuaW50ZXJwb2xhdGV9fVxcbiAgICAgICAgICAgICYmIChtID0gbVt0aGlzLl9hcmdzWyB7ez0gcGF0aE5vZGUuaW50ZXJwb2xhdGUgfX0gXV0pXFxuICAgICAgICB7ez8/fX1cXG4gICAgICAgICAgICAmJiAobSA9IG17ez0gcGF0aE5vZGUucHJvcGVydHkgfX0pXFxuICAgICAgICB7ez99fSB7e359fTtcXG59O1xcblwiLFxuICAgIHNldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV9jcmVhdGVfdHJlZSB9fVxcblxcblxcbi8qKlxcbiAqIFRlbXBsYXRlIHRoYXQgc3ludGhlc2l6ZXMgc2V0dGVyIGZvciBNb2RlbCBhbmQgZm9yIE1vZGVsUGF0aFxcbiAqL1xcbm1ldGhvZCA9IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzZXQnIH19XFxuXFxuICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc2V0JyB9fVxcblxcbiAgICB7e1xcbiAgICAgICAgY3Vyck5vZGUgPSBuZXh0Tm9kZTtcXG4gICAgICAgIGN1cnJQcm9wID0gY3Vyck5vZGUgJiYgY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuXFxuICAgIHt7IC8qIGFzc2lnbiB2YWx1ZSB0byB0aGUgbGFzdCBwcm9wZXJ0eSAqLyB9fVxcbiAgICB7ez8gY3VyclByb3AgfX1cXG4gICAgICAgIHdhc0RlZiA9IHt7IyBkZWYud2FzRGVmaW5lZH19O1xcbiAgICAgICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuXFxuICAgICAgICB2YXIgb2xkID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuXFxuICAgICAgICB7eyAvKiBjbG9uZSB2YWx1ZSB0byBwcmV2ZW50IHNhbWUgcmVmZXJlbmNlIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIG17eyMgZGVmLmN1cnJQcm9wIH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAge3s/fX1cXG5cXG4gICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byB0aGUgbGFzdCBwcm9wZXJ0eSBjaGFuZ2UgKi8gfX1cXG4gICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICBpZiAoISB3YXNEZWYpXFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2FkZGVkJyxcXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHZhbHVlIH0pO1xcbiAgICAgICAgZWxzZSBpZiAob2xkICE9IHZhbHVlKVxcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdjaGFuZ2VkJyxcXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9sZCwgbmV3VmFsdWU6IHZhbHVlIH0pO1xcblxcbiAgICAgICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byBjaGFuZ2VzIGluIChzdWIpcHJvcGVydGllcyBpbnNpZGUgcmVtb3ZlZCBhbmQgYXNzaWduZWQgdmFsdWUgKi8gfX1cXG4gICAgICAgIGlmICghIHdhc0RlZiB8fCBvbGQgIT0gdmFsdWUpXFxuICAgICAgICAgICAgYWRkVHJlZUNoYW5nZXNNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLFxcbiAgICAgICAgICAgICAgICBhY2Nlc3NQYXRoLCBvbGQsIHZhbHVlKTsgLyogZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24gdGhhdCBzeW50aGVzaXplcyBNb2RlbFBhdGggc2V0dGVyICovXFxuXFxuICAgICAgICB7eyAvKiBwb3N0IGFsbCBzdG9yZWQgbWVzc2FnZXMgKi8gfX1cXG4gICAgICAgIHt7IyBkZWYucG9zdE1lc3NhZ2VzIH19XFxuICAgIH1cXG59O1xcblwiLFxuICAgIGRlbDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV90cmF2ZXJzZV90cmVlIH19XFxuXFxubWV0aG9kID0gZnVuY3Rpb24gZGVsKCkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidkZWwnIH19XFxuXFxuICAgIHt7PyBpdC5wYXJzZWRQYXRoLmxlbmd0aCB9fVxcbiAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWUgfX1cXG5cXG4gICAgICAgIHt7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gaXQucGFyc2VkUGF0aFtjb3VudF07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7ICAgICAgIFxcbiAgICAgICAgfX1cXG5cXG4gICAgICAgIGlmICghIHRyZWVEb2VzTm90RXhpc3QgJiYgbSAmJiBtLmhhc093blByb3BlcnR5ICYmIHt7IyBkZWYud2FzRGVmaW5lZH19KSB7XFxuICAgICAgICAgICAgdmFyIG9sZCA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAgICAgIGRlbGV0ZSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAgICAgICAgICB2YXIgZGlkRGVsZXRlID0gdHJ1ZTtcXG4gICAgICAgIH1cXG4gICAge3s/P319XFxuICAgICAgICBpZiAodHlwZW9mIG0gIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICB2YXIgb2xkID0gbTtcXG4gICAgICAgICAgICB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIHZhciBkaWREZWxldGUgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICB7ez99fVxcblxcbiAgICBpZiAoZGlkRGVsZXRlICYmIHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnZGVsZXRlZCcsIG9sZFZhbHVlOiBvbGQgfSk7XFxuXFxuICAgICAgICBhZGRUcmVlQ2hhbmdlc01lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsXFxuICAgICAgICAgICAgYWNjZXNzUGF0aCwgb2xkLCB1bmRlZmluZWQpOyAvKiBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbiB0aGF0IHN5bnRoZXNpemVzIE1vZGVsUGF0aCBzZXR0ZXIgKi9cXG5cXG4gICAgICAgIHt7IC8qIHBvc3QgYWxsIHN0b3JlZCBtZXNzYWdlcyAqLyB9fVxcbiAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgfVxcbn07XFxuXCIsXG4gICAgc3BsaWNlOiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbnt7IyBkZWYuaW5jbHVkZV9kZWZpbmVzIH19XFxue3sjIGRlZi5pbmNsdWRlX2NyZWF0ZV90cmVlIH19XFxue3sjIGRlZi5pbmNsdWRlX3RyYXZlcnNlX3RyZWUgfX1cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBzcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLyogLC4uLiAtIGV4dHJhIGFyZ3VtZW50cyB0byBzcGxpY2UgaW50byBhcnJheSAqL1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzcGxpY2UnIH19XFxuXFxuICAgIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcXG4gICAgdmFyIGFkZEl0ZW1zID0gYXJnc0xlbiA+IDI7XFxuXFxuICAgIGlmIChhZGRJdGVtcykge1xcbiAgICAgICAge3sgLyogb25seSBjcmVhdGUgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgaW5zZXJ0ZWQgaW4gYXJyYXkgKi8gfX1cXG5cXG4gICAgICAgIHt7IC8qIGlmIG1vZGVsIGlzIHVuZGVmaW5lZCBpdCB3aWxsIGJlIHNldCB0byBhbiBlbXB0eSBhcnJheSAqLyB9fSAgXFxuICAgICAgICB2YXIgdmFsdWUgPSBbXTtcXG4gICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc3BsaWNlJyB9fVxcblxcbiAgICAgICAge3s/IG5leHROb2RlIH19XFxuICAgICAgICAgICAge3tcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gJ1tdJztcXG4gICAgICAgICAgICB9fVxcblxcbiAgICAgICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZVN0ZXAgfX1cXG4gICAgICAgIHt7P319XFxuXFxuICAgIH0gZWxzZSBpZiAoc3BsaWNlSG93TWFueSA+IDApIHtcXG4gICAgICAgIHt7IC8qIGlmIGl0ZW1zIGFyZSBub3QgaW5zZXJ0ZWQsIG9ubHkgdHJhdmVyc2UgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgZGVsZXRlZCBmcm9tIGFycmF5ICovIH19XFxuICAgICAgICB7ez8gaXQucGFyc2VkUGF0aC5sZW5ndGggfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZSB9fVxcblxcbiAgICAgICAgICAgIHt7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbY291bnRdO1xcbiAgICAgICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTsgICAgICAgXFxuICAgICAgICAgICAgfX1cXG5cXG4gICAgICAgICAgICB7eyAvKiBleHRyYSBicmFjZSBjbG9zZXMgJ2Vsc2UnIGluIGRlZi50cmF2ZXJzZVRyZWVTdGVwICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19IH1cXG4gICAgICAgIHt7P319XFxuICAgIH1cXG5cXG4gICAge3sgLyogc3BsaWNlIGl0ZW1zICovIH19XFxuICAgIGlmIChhZGRJdGVtcyB8fCAoISB0cmVlRG9lc05vdEV4aXN0ICYmIG1cXG4gICAgICAgICAgICAmJiBtLmxlbmd0aCA+IHNwbGljZUluZGV4ICkgKSB7XFxuICAgICAgICB2YXIgb2xkTGVuZ3RoID0gbS5sZW5ndGggPSBtLmxlbmd0aCB8fCAwO1xcblxcbiAgICAgICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPSBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbS5sZW5ndGgpO1xcblxcbiAgICAgICAge3sgLyogY2xvbmUgYWRkZWQgYXJndW1lbnRzIHRvIHByZXZlbnQgc2FtZSByZWZlcmVuY2VzIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIGlmIChhZGRJdGVtcylcXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3NMZW47IGkrKylcXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gY2xvbmVUcmVlKGFyZ3VtZW50c1tpXSk7XFxuXFxuICAgICAgICB7eyAvKiBhY3R1YWwgc3BsaWNlIGNhbGwgKi8gfX1cXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShtLCBhcmd1bWVudHMpO1xcblxcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ3NwbGljZScsXFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogc3BsaWNlSW5kZXgsIHJlbW92ZWQ6IHJlbW92ZWQsIGFkZGVkQ291bnQ6IGFkZEl0ZW1zID8gYXJnc0xlbiAtIDIgOiAwLFxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG0gfSk7XFxuXFxuICAgICAgICAgICAgaWYgKHJlbW92ZWQgJiYgcmVtb3ZlZC5sZW5ndGgpXFxuICAgICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1QYXRoID0gYWNjZXNzUGF0aCArICdbJyArIChzcGxpY2VJbmRleCArIGluZGV4KSArICddJztcXG4gICAgICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGl0ZW1QYXRoLCB0eXBlOiAncmVtb3ZlZCcsIG9sZFZhbHVlOiBpdGVtIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKGl0ZW0pKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIGl0ZW1QYXRoLCBpdGVtLCAncmVtb3ZlZCcsICdvbGRWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBpZiAoYWRkSXRlbXMpXFxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJnc0xlbjsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGFyZ3VtZW50c1tpXTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtUGF0aCA9IGFjY2Vzc1BhdGggKyAnWycgKyAoc3BsaWNlSW5kZXggKyBpIC0gMikgKyAnXSc7XFxuICAgICAgICAgICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBpdGVtUGF0aCwgdHlwZTogJ2FkZGVkJywgbmV3VmFsdWU6IGl0ZW0gfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJc1RyZWUoaXRlbSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgaXRlbVBhdGgsIGl0ZW0sICdhZGRlZCcsICduZXdWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAge3sgLyogcG9zdCBhbGwgc3RvcmVkIG1lc3NhZ2VzICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICByZXR1cm4gcmVtb3ZlZCB8fCBbXTtcXG59XFxuXCJcbn07XG5cbnZhciBpbmNsdWRlX2RlZmluZXMgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgaW5pdGlhbGl6YXRpb24gY29kZVxcbiAqL1xcbiB7eyMjIGRlZi5pbml0VmFyczptZXRob2Q6XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgdmFyIG1lc3NhZ2VzID0gW10sIG1lc3NhZ2VzSGFzaCA9IHt9O1xcbiAgICB2YXIgYWNjZXNzUGF0aCA9ICcnO1xcbiAgICB2YXIgdHJlZURvZXNOb3RFeGlzdDtcXG4gICAgLyogaGFjayB0byBwcmV2ZW50IHNlbmRpbmcgZmluaXNoZWQgZXZlbnRzIHRvIGFsbG93IGZvciBwcm9wYWdhdGlvbiBvZiBiYXRjaGVzIHdpdGhvdXQgc3BsaXR0aW5nIHRoZW0gKi9cXG4gICAgdmFyIGluQ2hhbmdlVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoIHt7PSBtZXRob2QgfX0gKTtcXG4gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGNhbGwgdG8gYWRkIG1lc3NhZ2UgdG8gbGlzdFxcbiAqL1xcbnt7IyMgZGVmLmFkZE1zZzogYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCB7IHBhdGg6ICN9fVxcblxcbi8qKlxcbiAqIEluc2VydHMgY3VycmVudCBwcm9wZXJ0eS9pbmRleCBmb3IgYm90aCBub3JtYWwgYW5kIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzL2luZGV4ZXNcXG4gKi9cXG57eyMjIGRlZi5jdXJyUHJvcDp7ez8gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX1bdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF1de3s/P319e3s9IGN1cnJQcm9wIH19e3s/fX0gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb25kaXRpb24gdG8gdGVzdCB3aGV0aGVyIG5vcm1hbC9pbnRlcnBvbGF0ZWQgcHJvcGVydHkvaW5kZXggZXhpc3RzXFxuICovXFxue3sjIyBkZWYud2FzRGVmaW5lZDogbS5oYXNPd25Qcm9wZXJ0eShcXG4gICAge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXVxcbiAgICB7ez8/fX1cXG4gICAgICAgICd7ez0gaXQuZ2V0UGF0aE5vZGVLZXkoY3Vyck5vZGUpIH19J1xcbiAgICB7ez99fVxcbikgI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHVwZGF0ZSBhY2Nlc3MgcGF0aCBmb3IgY3VycmVudCBwcm9wZXJ0eVxcbiAqIEJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzLCBpdCBjYW4ndCBiZSBjYWxjdWxhdGVkIGluIHRlbXBsYXRlLCBpdCBjYW4gb25seSBiZSBjYWxjdWxhdGVkIGR1cmluZyBhY2Nlc3NvciBjYWxsLlxcbiAqL1xcbnt7IyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGg6XFxuICAgIGFjY2Vzc1BhdGggKz0ge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB7ez8gY3Vyck5vZGUuc3ludGF4ID09ICdhcnJheScgfX1cXG4gICAgICAgICAgICAnWycgKyB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXSArICddJztcXG4gICAgICAgIHt7Pz99fVxcbiAgICAgICAgICAgICcuJyArIHRoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdO1xcbiAgICAgICAge3s/fX1cXG4gICAge3s/P319XFxuICAgICAgICAne3s9IGN1cnJQcm9wIH19JztcXG4gICAge3s/fX1cXG4jfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gcG9zdCBzdG9yZWQgbWVzc2FnZXNcXG4gKi9cXG57eyMjIGRlZi5wb3N0TWVzc2FnZXM6XFxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcXG4gICAgICAgIHt7IyBkZWYubW9kZWxQb3N0QmF0Y2hDb2RlIH19KCdkYXRhY2hhbmdlcycsIHtcXG4gICAgICAgICAgICBjaGFuZ2VzOiBtZXNzYWdlcyxcXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogaW5DaGFuZ2VUcmFuc2FjdGlvblxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1zZykge1xcbiAgICAgICAgICAgIHt7IyBkZWYubW9kZWxQb3N0TWVzc2FnZUNvZGUgfX0obXNnLnBhdGgsIG1zZyk7XFxuICAgICAgICB9LCB0aGlzKTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX2NyZWF0ZV90cmVlID0gXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gY3JlYXRlIG1vZGVsIHRyZWUgYXMgbmVjY2Vzc2FyeSBmb3IgYHNldGAgYW5kIGBzcGxpY2VgIGFjY2Vzc29ycyBhbmQgdG8gYWRkIG1lc3NhZ2VzIHRvIHNlbmQgbGlzdCBpZiB0aGUgdHJlZSBjaGFuZ2VzLlxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWU6bWV0aG9kOlxcbiAgICB2YXIgd2FzRGVmID0gdHJ1ZTtcXG4gICAgdmFyIG9sZCA9IG07XFxuXFxuICAgIHt7IHZhciBlbXB0eVByb3AgPSBpdC5wYXJzZWRQYXRoWzBdICYmIGl0LnBhcnNlZFBhdGhbMF0uZW1wdHk7IH19XFxuICAgIHt7PyBlbXB0eVByb3AgfX1cXG4gICAgICAgIHt7IC8qIGNyZWF0ZSB0b3AgbGV2ZWwgbW9kZWwgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGRlZmluZWQgKi8gfX1cXG4gICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgICAgICBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuICAgICAgICAgICAgd2FzRGVmID0gZmFsc2U7XFxuXFxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19ICcnLCB0eXBlOiAnYWRkZWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIHt7Pz99fVxcbiAgICAgICAge3s/IG1ldGhvZCA9PSAnc3BsaWNlJyB9fVxcbiAgICAgICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgIHt7P319XFxuICAgICAgICAgICAgICAgIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAgICAgICAgICAgICAgd2FzRGVmID0gdHlwZW9mIG9sZCAhPSAndW5kZWZpbmVkJztcXG4gICAgICAgIHt7PyBtZXRob2QgPT0gJ3NwbGljZScgfX1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB7ez99fSAgICAgICBcXG4gICAge3s/fX1cXG5cXG5cXG4gICAge3sgLyogY3JlYXRlIG1vZGVsIHRyZWUgaWYgaXQgZG9lc24ndCBleGlzdCAqLyB9fVxcbiAgICB7eyAgdmFyIG1vZGVsRGF0YVByb3BlcnR5ID0gJyc7XFxuICAgICAgICB2YXIgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoWzBdO1xcbiAgICAgICAgdmFyIGNvdW50ID0gaXQucGFyc2VkUGF0aC5sZW5ndGggLSAxO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgICAgICAgICAgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoW2kgKyAxXTtcXG4gICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gbmV4dE5vZGUgJiYgbmV4dE5vZGUuZW1wdHk7XFxuICAgIH19XFxuXFxuICAgICAgICB7eyMgZGVmLmNyZWF0ZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7ICB9IC8qIGZvciBsb29wICovIH19XFxuI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIGNyZWF0ZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWVTdGVwOlxcbiAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG5cXG4gICAgaWYgKCEge3sjIGRlZi53YXNEZWZpbmVkIH19KSB7IFxcbiAgICAgICAge3sgLyogcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnYWRkZWQnLCBcXG4gICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbXt7IyBkZWYuY3VyclByb3AgfX0gIT0gJ29iamVjdCcpIHtcXG4gICAgICAgIHt7IC8qIHByb3BlcnR5IGlzIG5vdCBvYmplY3QgKi8gfX1cXG4gICAgICAgIHZhciBvbGQgPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnY2hhbmdlZCcsIFxcbiAgICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvbGQsIG5ld1ZhbHVlOiBtIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAge3sgLyogcHJvcGVydHkgZXhpc3RzLCBqdXN0IHRyYXZlcnNlIGRvd24gdGhlIG1vZGVsIHRyZWUgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX3RyYXZlcnNlX3RyZWUgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBtb2RlbCB0cmVlIGZvciBgZGVsZXRlYCBhbmQgYHNwbGljZWAgYWNjZXNzb3JzLlxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZTpcXG4gICAge3sgXFxuICAgICAgICB2YXIgY291bnQgPSBpdC5wYXJzZWRQYXRoLmxlbmd0aC0xO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7IFxcbiAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbaV07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7IH0gLyogZm9yIGxvb3AgKi9cXG5cXG4gICAgICAgIHZhciBpID0gY291bnQ7XFxuICAgICAgICB3aGlsZSAoaS0tKSB7IC8qIGNsb3NpbmcgYnJhY2VzIGZvciBlbHNlJ3MgYWJvdmUgKi9cXG4gICAgfX1cXG4gICAgICAgICAgICB9XFxuICAgIHt7IH0gLyogd2hpbGUgbG9vcCAqLyB9fVxcbiN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZVN0ZXA6XFxuICAgIGlmICghIChtICYmIG0uaGFzT3duUHJvcGVydHkgJiYge3sjIGRlZi53YXNEZWZpbmVkfX0gKSApXFxuICAgICAgICB0cmVlRG9lc05vdEV4aXN0ID0gdHJ1ZTtcXG4gICAgZWxzZSB7XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAge3sgLyogYnJhY2UgZnJvbSBlbHNlIGlzIG5vdCBjbG9zZWQgb24gcHVycG9zZSAtIGFsbCBicmFjZXMgYXJlIGNsb3NlZCBpbiB3aGlsZSBsb29wICovIH19XFxuI319XFxuXCI7XG5cbnZhciBkb3REZWYgPSB7XG4gICAgaW5jbHVkZV9kZWZpbmVzOiBpbmNsdWRlX2RlZmluZXMsXG4gICAgaW5jbHVkZV9jcmVhdGVfdHJlZTogaW5jbHVkZV9jcmVhdGVfdHJlZSxcbiAgICBpbmNsdWRlX3RyYXZlcnNlX3RyZWU6IGluY2x1ZGVfdHJhdmVyc2VfdHJlZSxcbiAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5LFxuICAgIG1vZGVsQWNjZXNzUHJlZml4OiAndGhpcy5fbW9kZWwuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyLnBvc3RNZXNzYWdlJyxcbiAgICBtb2RlbFBvc3RCYXRjaENvZGU6ICd0aGlzLl9tb2RlbC5wb3N0TWVzc2FnZVN5bmMnLFxuICAgIGludGVybmFsTWVzc2VuZ2VyOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyJ1xufTtcblxudmFyIG1vZGVsRG90RGVmID0gXyhkb3REZWYpLmNsb25lKCkuZXh0ZW5kKHtcbiAgICBtb2RlbEFjY2Vzc1ByZWZpeDogJ3RoaXMuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5faW50ZXJuYWxNZXNzZW5nZXIucG9zdE1lc3NhZ2UnLFxuICAgIG1vZGVsUG9zdEJhdGNoQ29kZTogJ3RoaXMucG9zdE1lc3NhZ2VTeW5jJyxcbiAgICBpbnRlcm5hbE1lc3NlbmdlcjogJ3RoaXMuX2ludGVybmFsTWVzc2VuZ2VyJ1xufSkuXygpO1xuXG5cbnZhciBkb3RTZXR0aW5ncyA9IF8uY2xvbmUoZG9ULnRlbXBsYXRlU2V0dGluZ3MpO1xuZG90U2V0dGluZ3Muc3RyaXAgPSBmYWxzZTtcblxudmFyIHN5bnRoZXNpemVycyA9IF8ubWFwS2V5cyh0ZW1wbGF0ZXMsIGZ1bmN0aW9uKHRtcGwpIHtcbiAgICByZXR1cm4gZG9ULnRlbXBsYXRlKHRtcGwsIGRvdFNldHRpbmdzLCBkb3REZWYpOyBcbn0pO1xuXG5cbnZhciBtb2RlbFN5bnRoZXNpemVycyA9IF8ubWFwVG9PYmplY3QoWydzZXQnLCAnZGVsJywgJ3NwbGljZSddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZXNbbWV0aG9kTmFtZV0sIGRvdFNldHRpbmdzLCBtb2RlbERvdERlZik7XG59KTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgc3ludGhlc2l6ZXMgYWNjZXNzb3IgbWV0aG9kcy5cbiAqIEZ1bmN0aW9uIGlzIG1lbW9pemVkIHNvIGFjY2Vzc29ycyBhcmUgY2FjaGVkICh1cCB0byAxMDAwKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBNb2RlbC9Nb2RlbFBhdGggYWNjZXNzIHBhdGhcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnNlZFBhdGggYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xudmFyIHN5bnRoZXNpemVQYXRoTWV0aG9kcyA9IF8ubWVtb2l6ZShfc3ludGhlc2l6ZVBhdGhNZXRob2RzLCB1bmRlZmluZWQsIDEwMDApO1xuXG5mdW5jdGlvbiBfc3ludGhlc2l6ZVBhdGhNZXRob2RzKHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kcyA9IF8ubWFwS2V5cyhzeW50aGVzaXplcnMsIGZ1bmN0aW9uKHN5bnRoc3pyKSB7XG4gICAgICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aHN6ciwgcGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cblxudmFyIG5vcm1hbGl6ZVNwbGljZUluZGV4ID0gbW9kZWxVdGlscy5ub3JtYWxpemVTcGxpY2VJbmRleDsgLy8gdXNlZCBpbiBzcGxpY2UuZG90LmpzXG5cblxuZnVuY3Rpb24gX3N5bnRoZXNpemUoc3ludGhlc2l6ZXIsIHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kXG4gICAgICAgICwgbWV0aG9kQ29kZSA9IHN5bnRoZXNpemVyKHtcbiAgICAgICAgICAgIHBhcnNlZFBhdGg6IHBhcnNlZFBhdGgsXG4gICAgICAgICAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5XG4gICAgICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZXZhbChtZXRob2RDb2RlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IE1vZGVsRXJyb3IoJ01vZGVsUGF0aCBtZXRob2QgY29tcGlsYXRpb24gZXJyb3I7IHBhdGg6ICcgKyBwYXRoICsgJywgY29kZTogJyArIG1ldGhvZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2Q7XG5cblxuICAgIC8vIGZ1bmN0aW9ucyB1c2VkIGJ5IG1ldGhvZHMgYHNldGAsIGBkZWxldGVgIGFuZCBgc3BsaWNlYCAoc3ludGhlc2l6ZWQgYnkgdGVtcGxhdGUpXG4gICAgZnVuY3Rpb24gYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBtc2cpIHtcbiAgICAgICAgbWVzc2FnZXMucHVzaChtc2cpO1xuICAgICAgICBtZXNzYWdlc0hhc2hbbXNnLnBhdGhdID0gbXNnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRyZWVDaGFuZ2VzTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkSXNUcmVlID0gdmFsdWVJc1RyZWUob2xkVmFsdWUpXG4gICAgICAgICAgICAsIG5ld0lzVHJlZSA9IHZhbHVlSXNUcmVlKG5ld1ZhbHVlKTtcblxuICAgICAgICBpZiAobmV3SXNUcmVlKVxuICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG5ld1ZhbHVlLCAnYWRkZWQnLCAnbmV3VmFsdWUnKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChvbGRJc1RyZWUpXG4gICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgb2xkVmFsdWUsICdyZW1vdmVkJywgJ29sZFZhbHVlJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9iaiwgbXNnVHlwZSwgdmFsdWVQcm9wKSB7XG4gICAgICAgIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKTtcblxuXG4gICAgICAgIGZ1bmN0aW9uIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGhTeW50YXggPSByb290UGF0aCArICdbJCRdJztcbiAgICAgICAgICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSwgaW5kZXgsIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aFN5bnRheCA9IHJvb3RQYXRoICsgJy4kJCc7XG4gICAgICAgICAgICAgICAgXy5lYWNoS2V5KG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlKHZhbHVlLCBrZXksIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkTWVzc2FnZSh2YWx1ZSwga2V5LCBwYXRoU3ludGF4KSB7XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHBhdGhTeW50YXgucmVwbGFjZSgnJCQnLCBrZXkpXG4gICAgICAgICAgICAgICAgLCBleGlzdGluZ01zZyA9IG1lc3NhZ2VzSGFzaFtwYXRoXTtcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnLnR5cGUgPT0gbXNnVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdzZXR0ZXIgZXJyb3I6IHNhbWUgbWVzc2FnZSB0eXBlIHBvc3RlZCBvbiB0aGUgc2FtZSBwYXRoJyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnLnR5cGUgPSAnY2hhbmdlZCc7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnW3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSB7IHBhdGg6IHBhdGgsIHR5cGU6IG1zZ1R5cGUgfTtcbiAgICAgICAgICAgICAgICBtc2dbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGFkZENoYW5nZU1lc3NhZ2UobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgbXNnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKHZhbHVlKSlcbiAgICAgICAgICAgICAgICBfYWRkTWVzc2FnZXMocGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVUcmVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gXy5kZWVwQ2xvbmUodmFsdWUpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm90ZWN0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEgdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QuY3JlYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZUlzVHJlZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgICAgICAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQmF0Y2hJZHNUb01lc3NhZ2UobXNnLCBiYXRjaElkLCBtc2dJZCkge1xuICAgICAgICBfLmRlZmluZVByb3BlcnRpZXMobXNnLCB7XG4gICAgICAgICAgICBfX2JhdGNoX2lkOiBiYXRjaElkLFxuICAgICAgICAgICAgX19tc2dfaWQ6IG1zZ0lkXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEV4cG9ydHMgYHN5bnRoZXNpemVgIGZ1bmN0aW9uIHdpdGggdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIC5tb2RlbE1ldGhvZHMuc2V0IC0gYHNldGAgbWV0aG9kIGZvciBNb2RlbFxuICogLSAubW9kZWxNZXRob2RzLmRlbCAtIGBkZWxgIG1ldGhvZCBmb3IgTW9kZWxcbiAqIC0gLm1vZGVsTWV0aG9kcy5zcGxpY2UgLSBgc3BsaWNlYCBtZXRob2QgZm9yIE1vZGVsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gc3ludGhlc2l6ZVBhdGhNZXRob2RzO1xuXG52YXIgbW9kZWxNZXRob2RzID0gXy5tYXBLZXlzKG1vZGVsU3ludGhlc2l6ZXJzLCBmdW5jdGlvbihzeW50aGVzaXplcikge1xuICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aGVzaXplciwgJycsIFtdKTtcbn0pO1xuXG5zeW50aGVzaXplUGF0aE1ldGhvZHMubW9kZWxNZXRob2RzID0gbW9kZWxNZXRob2RzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLnV0aWxzLmNoZWNrYFxuICpcbiAqIENoZWNrIGlzIGEgbW9kdWxlIGZvciBwYXJhbWV0ZXJzIGNoZWNraW5nIGV4dHJhY3RlZCBmcm9tIFtNZXRlb3JdKGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vKSBmcmFtZXdvcmsuXG4gKlxuICogSXQgYWxsb3dzIHRvIGJvdGggZG9jdW1lbnQgYW5kIHRvIGNoZWNrIHBhcmFtZXRlciB0eXBlcyBpbiB5b3VyIGZ1bmN0aW9uXG4gKiBtYWtpbmcgY29kZSBib3RoIHJlYWRhYmxlIGFuZCBzdGFibGUuXG4gKlxuICpcbiAqICMjIyBVc2FnZVxuICpgYGBcbiAqIHZhciBjaGVjayA9IG1pbG8uY2hlY2tcbiAqICAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG4gKlxuICogZnVuY3Rpb24gTXkobmFtZSwgb2JqLCBjYikge1xuICogICAgIC8vIGlmIGFueSBvZiBjaGVja3MgZmFpbCBhbiBlcnJvciB3aWxsIGJlIHRocm93blxuICogICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gKiAgICAgY2hlY2sob2JqLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoeyBvcHRpb25zOiBPYmplY3QgfSkpO1xuICogICAgIGNoZWNrKGNiLCBGdW5jdGlvbik7XG4gKlxuICogICAgIC8vIC4uLiB5b3VyIGNvZGVcbiAqIH1cbiAqYGBgXG4gKiBTZWUgW01ldGVvciBkb2NzXShodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNtYXRjaCkgdG8gc2VlIGhvdyBpdCB3b3Jrc1xuICpcbiAqXG4gKiAjIyMgUGF0dGVybnNcbiAqXG4gKiBBbGwgcGF0dGVybnMgYW5kIGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3Mgd29yay5cbiAqXG4gKiBVbmxpa2UgaW4gTWV0ZW9yLCBPYmplY3QgcGF0dGVybiBtYXRjaGVzIGluc3RhbmNlIG9mIGFueSBjbGFzcyxcbiAqIG5vdCBvbmx5IHBsYWluIG9iamVjdC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBwYXR0ZXJucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3MgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgaW1wbGVtZW50ZWRcbiAqXG4gKiAqIE1hdGNoLl9fT2JqZWN0SGFzaF9fKF9wYXR0ZXJuXylcbiAqXG4gKiAgIE1hdGNoZXMgYW4gb2JqZWN0IHdoZXJlIGFsbCBwcm9wZXJ0aWVzIG1hdGNoIGEgZ2l2ZW4gcGF0dGVyblxuICpcbiAqICogTWF0Y2guX19TdWJjbGFzc19fKF9jb25zdHJ1Y3Rvcl8gWywgX21hdGNoVGhpc0NsYXNzVG9vX10pXG4gKlxuICogICBNYXRjaGVzIGEgY2xhc3MgdGhhdCBpcyBhIHN1YmNsYXNzIG9mIGEgZ2l2ZW4gY2xhc3MuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiAgIGlzIHRydWUsIGl0IHdpbGwgYWxzbyBtYXRjaCB0aGUgY2xhc3MgaXRzZWxmLlxuICpcbiAqICAgV2l0aG91dCB0aGlzIHBhdHRlcm4gdG8gY2hlY2sgaWYgX015U3ViY2xhc3NfIGlzIGEgc3ViY2xhc3Mgb2YgX015Q2xhc3NfXG4gKiAgIHlvdSB3b3VsZCBoYXZlIHRvIHVzZVxuICpcbiAqICAgICAgIGNoZWNrKE15U3ViY2xhc3MsIE1hdGNoLldoZXJlKGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIHJldHVybiBNeVN1YmNsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIE15Q2xhc3M7XG4gKiAgICAgICB9KTtcbiAqXG4gKlxuICogVGhpbmdzIHdlIGV4cGxpY2l0bHkgZG8gTk9UIHN1cHBvcnQ6XG4gKiAgICAtIGhldGVyb2dlbm91cyBhcnJheXNcbioqL1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxudmFyIGNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgaWYgKGNvbmZpZy5jaGVjayA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcblxuICAgIC8vIFJlY29yZCB0aGF0IGNoZWNrIGdvdCBjYWxsZWQsIGlmIHNvbWVib2R5IGNhcmVkLlxuICAgIHRyeSB7XG4gICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICgoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpICYmIGVyci5wYXRoKVxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gXCIgaW4gZmllbGQgXCIgKyBlcnIucGF0aDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2s7XG5cbnZhciBNYXRjaCA9IGNoZWNrLk1hdGNoID0ge1xuICAgIE9wdGlvbmFsOiBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICByZXR1cm4gbmV3IE9wdGlvbmFsKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgT25lT2Y6IGZ1bmN0aW9uICgvKiBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbmVPZihhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgQW55OiBbJ19fYW55X18nXSxcbiAgICBXaGVyZTogZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFdoZXJlKGNvbmRpdGlvbik7XG4gICAgfSxcbiAgICBPYmplY3RJbmNsdWRpbmc6IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SW5jbHVkaW5nKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgLy8gTWF0Y2hlcyBvbmx5IHNpZ25lZCAzMi1iaXQgaW50ZWdlcnNcbiAgICBJbnRlZ2VyOiBbJ19faW50ZWdlcl9fJ10sXG5cbiAgICAvLyBNYXRjaGVzIHN0cmluZyB0aGF0IGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2lsbCBub3QgYWxsb3cgamF2YXNjcmlwdCByZXNlcnZlZCB3b3Jkc1xuICAgIElkZW50aWZpZXJTdHJpbmc6IC9eW2Etel8kXVswLTlhLXpfJF0qJC9pLFxuXG4gICAgLy8gTWF0Y2hlcyBoYXNoIChvYmplY3QpIHdpdGggdmFsdWVzIG1hdGNoaW5nIHBhdHRlcm5cbiAgICBPYmplY3RIYXNoOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SGFzaChwYXR0ZXJuKTtcbiAgICB9LFxuXG4gICAgU3ViY2xhc3M6IGZ1bmN0aW9uKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbykge1xuICAgICAgICByZXR1cm4gbmV3IFN1YmNsYXNzKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbyk7XG4gICAgfSxcblxuICAgIC8vIFhYWCBtYXRjaGVycyBzaG91bGQga25vdyBob3cgdG8gZGVzY3JpYmUgdGhlbXNlbHZlcyBmb3IgZXJyb3JzXG4gICAgRXJyb3I6IFR5cGVFcnJvcixcblxuICAgIC8vIE1ldGVvci5tYWtlRXJyb3JUeXBlKFwiTWF0Y2guRXJyb3JcIiwgZnVuY3Rpb24gKG1zZykge1xuICAgICAgICAvLyB0aGlzLm1lc3NhZ2UgPSBcIk1hdGNoIGVycm9yOiBcIiArIG1zZztcbiAgICAgICAgLy8gVGhlIHBhdGggb2YgdGhlIHZhbHVlIHRoYXQgZmFpbGVkIHRvIG1hdGNoLiBJbml0aWFsbHkgZW1wdHksIHRoaXMgZ2V0c1xuICAgICAgICAvLyBwb3B1bGF0ZWQgYnkgY2F0Y2hpbmcgYW5kIHJldGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiBhcyBpdCBnb2VzIGJhY2sgdXAgdGhlXG4gICAgICAgIC8vIHN0YWNrLlxuICAgICAgICAvLyBFLmcuOiBcInZhbHNbM10uZW50aXR5LmNyZWF0ZWRcIlxuICAgICAgICAvLyB0aGlzLnBhdGggPSBcIlwiO1xuICAgICAgICAvLyBJZiB0aGlzIGdldHMgc2VudCBvdmVyIEREUCwgZG9uJ3QgZ2l2ZSBmdWxsIGludGVybmFsIGRldGFpbHMgYnV0IGF0IGxlYXN0XG4gICAgICAgIC8vIHByb3ZpZGUgc29tZXRoaW5nIGJldHRlciB0aGFuIDUwMCBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuXG4gICAgLy8gICAgIHRoaXMuc2FuaXRpemVkRXJyb3IgPSBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCJNYXRjaCBmYWlsZWRcIik7XG4gICAgLy8gfSksXG5cbiAgICAvLyBUZXN0cyB0byBzZWUgaWYgdmFsdWUgbWF0Y2hlcyBwYXR0ZXJuLiBVbmxpa2UgY2hlY2ssIGl0IG1lcmVseSByZXR1cm5zIHRydWVcbiAgICAvLyBvciBmYWxzZSAodW5sZXNzIGFuIGVycm9yIG90aGVyIHRoYW4gTWF0Y2guRXJyb3Igd2FzIHRocm93bikuXG4gICAgdGVzdDogZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gUmV0aHJvdyBvdGhlciBlcnJvcnMuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gT3B0aW9uYWwocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBPbmVPZihjaG9pY2VzKSB7XG4gICAgaWYgKGNob2ljZXMubGVuZ3RoID09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgY2hvaWNlIHRvIE1hdGNoLk9uZU9mXCIpO1xuICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7XG59O1xuXG5mdW5jdGlvbiBXaGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEluY2x1ZGluZyhwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEhhc2gocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBTdWJjbGFzcyhTdXBlcmNsYXNzLCBtYXRjaFN1cGVyY2xhc3NUb28pIHtcbiAgICB0aGlzLlN1cGVyY2xhc3MgPSBTdXBlcmNsYXNzO1xuICAgIHRoaXMubWF0Y2hTdXBlcmNsYXNzID0gbWF0Y2hTdXBlcmNsYXNzVG9vO1xufTtcblxudmFyIHR5cGVvZkNoZWNrcyA9IFtcbiAgICBbU3RyaW5nLCBcInN0cmluZ1wiXSxcbiAgICBbTnVtYmVyLCBcIm51bWJlclwiXSxcbiAgICBbQm9vbGVhbiwgXCJib29sZWFuXCJdLFxuICAgIFtGdW5jdGlvbiwgXCJmdW5jdGlvblwiXSxcbiAgICAvLyBXaGlsZSB3ZSBkb24ndCBhbGxvdyB1bmRlZmluZWQgaW4gSlNPTiwgdGhpcyBpcyBnb29kIGZvciBvcHRpb25hbFxuICAgIC8vIGFyZ3VtZW50cyB3aXRoIE9uZU9mLlxuICAgIFt1bmRlZmluZWQsIFwidW5kZWZpbmVkXCJdXG5dO1xuXG5mdW5jdGlvbiBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAvLyBNYXRjaCBhbnl0aGluZyFcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guQW55KVxuICAgICAgICByZXR1cm47XG5cbiAgICAvLyBCYXNpYyBhdG9taWMgdHlwZXMuXG4gICAgLy8gRG8gbm90IG1hdGNoIGJveGVkIG9iamVjdHMgKGUuZy4gU3RyaW5nLCBCb29sZWFuKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZW9mQ2hlY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSB0eXBlb2ZDaGVja3NbaV1bMF0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IHR5cGVvZkNoZWNrc1tpXVsxXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHR5cGVvZkNoZWNrc1tpXVsxXSArIFwiLCBnb3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSBudWxsKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgbnVsbCwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBNYXRjaC5JbnRlZ2VyIGlzIHNwZWNpYWwgdHlwZSBlbmNvZGVkIHdpdGggYXJyYXlcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guSW50ZWdlcikge1xuICAgICAgICAvLyBUaGVyZSBpcyBubyBjb25zaXN0ZW50IGFuZCByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgdmFyaWFibGUgaXMgYSA2NC1iaXRcbiAgICAgICAgLy8gaW50ZWdlci4gT25lIG9mIHRoZSBwb3B1bGFyIHNvbHV0aW9ucyBpcyB0byBnZXQgcmVtaW5kZXIgb2YgZGl2aXNpb24gYnkgMVxuICAgICAgICAvLyBidXQgdGhpcyBtZXRob2QgZmFpbHMgb24gcmVhbGx5IGxhcmdlIGZsb2F0cyB3aXRoIGJpZyBwcmVjaXNpb24uXG4gICAgICAgIC8vIEUuZy46IDEuMzQ4MTkyMzA4NDkxODI0ZSsyMyAlIDEgPT09IDAgaW4gVjhcbiAgICAgICAgLy8gQml0d2lzZSBvcGVyYXRvcnMgd29yayBjb25zaXN0YW50bHkgYnV0IGFsd2F5cyBjYXN0IHZhcmlhYmxlIHRvIDMyLWJpdFxuICAgICAgICAvLyBzaWduZWQgaW50ZWdlciBhY2NvcmRpbmcgdG8gSmF2YVNjcmlwdCBzcGVjcy5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgKHZhbHVlIHwgMCkgPT09IHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgSW50ZWdlciwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuID09PSBNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIE1hdGNoLklkZW50aWZpZXJTdHJpbmcudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgPT0gLTEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllciBzdHJpbmcsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBcIk9iamVjdFwiIGlzIHNob3J0aGFuZCBmb3IgTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcbiAgICBpZiAocGF0dGVybiA9PT0gT2JqZWN0KVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcblxuICAgIC8vIEFycmF5IChjaGVja2VkIEFGVEVSIEFueSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYW4gQXJyYXkpLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgcGF0dGVybjogYXJyYXlzIG11c3QgaGF2ZSBvbmUgdHlwZSBlbGVtZW50XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF0dGVybikpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBhcnJheSwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlRWxlbWVudCwgcGF0dGVyblswXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoaW5kZXgsIGVyci5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFyYml0cmFyeSB2YWxpZGF0aW9uIGNoZWNrcy4gVGhlIGNvbmRpdGlvbiBjYW4gcmV0dXJuIGZhbHNlIG9yIHRocm93IGFcbiAgICAvLyBNYXRjaC5FcnJvciAoaWUsIGl0IGNhbiBpbnRlcm5hbGx5IHVzZSBjaGVjaygpKSB0byBmYWlsLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgV2hlcmUpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4uY29uZGl0aW9uKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHRoaXMgZXJyb3IgaXMgdGVycmlibGVcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRmFpbGVkIE1hdGNoLldoZXJlIHZhbGlkYXRpb25cIik7XG4gICAgfVxuXG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT25lT2YodW5kZWZpbmVkLCBwYXR0ZXJuLnBhdHRlcm4pO1xuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPbmVPZikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm4uY2hvaWNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4uY2hvaWNlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTm8gZXJyb3I/IFlheSwgcmV0dXJuLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyIGVycm9ycyBzaG91bGQgYmUgdGhyb3duLiBNYXRjaCBlcnJvcnMganVzdCBtZWFuIHRyeSBhbm90aGVyXG4gICAgICAgICAgICAgICAgLy8gY2hvaWNlLlxuICAgICAgICAgICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFhYWCB0aGlzIGVycm9yIGlzIHRlcnJpYmxlXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkZhaWxlZCBNYXRjaC5PbmVPZiBvciBNYXRjaC5PcHRpb25hbCB2YWxpZGF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIEEgZnVuY3Rpb24gdGhhdCBpc24ndCBzb21ldGhpbmcgd2Ugc3BlY2lhbC1jYXNlIGlzIGFzc3VtZWQgdG8gYmUgYVxuICAgIC8vIGNvbnN0cnVjdG9yLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHdoYXQgaWYgLm5hbWUgaXNuJ3QgZGVmaW5lZFxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25LZXlzQWxsb3dlZCA9IGZhbHNlO1xuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT2JqZWN0SW5jbHVkaW5nKSB7XG4gICAgICAgIHVua25vd25LZXlzQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnBhdHRlcm47XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPYmplY3RIYXNoKSB7XG4gICAgICAgIHZhciBrZXlQYXR0ZXJuID0gcGF0dGVybi5wYXR0ZXJuO1xuICAgICAgICB2YXIgZW1wdHlIYXNoID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBlbXB0eUhhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGNoZWNrKHZhbHVlW2tleV0sIGtleVBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXB0eUhhc2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFN1YmNsYXNzKSB7XG4gICAgICAgIHZhciBTdXBlcmNsYXNzID0gcGF0dGVybi5TdXBlcmNsYXNzO1xuICAgICAgICBpZiAocGF0dGVybi5tYXRjaFN1cGVyY2xhc3MgJiYgdmFsdWUgPT0gU3VwZXJjbGFzcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCEgKHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFN1cGVyY2xhc3MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyBwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBvZiBcIiArIFN1cGVyY2xhc3MubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09IFwib2JqZWN0XCIpXG4gICAgICAgIHRocm93IEVycm9yKFwiQmFkIHBhdHRlcm46IHVua25vd24gcGF0dGVybiB0eXBlXCIpO1xuXG4gICAgLy8gQW4gb2JqZWN0LCB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBrZXlzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBkb1xuICAgIC8vIHN0cnVjdHVyYWwgbWF0Y2hlcyBhZ2FpbnN0IG9iamVjdHMgb2Ygc3BlY2lhbCB0eXBlcyB0aGF0IGhhcHBlbiB0byBtYXRjaFxuICAgIC8vIHRoZSBwYXR0ZXJuOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBhIHBsYWluIG9sZCB7T2JqZWN0fSFcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2YgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgbnVsbFwiKTtcblxuICAgIHZhciByZXF1aXJlZFBhdHRlcm5zID0ge307XG4gICAgdmFyIG9wdGlvbmFsUGF0dGVybnMgPSB7fTtcblxuICAgIF8uZWFjaEtleShwYXR0ZXJuLCBmdW5jdGlvbihzdWJQYXR0ZXJuLCBrZXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5ba2V5XSBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICAgICAgb3B0aW9uYWxQYXR0ZXJuc1trZXldID0gcGF0dGVybltrZXldLnBhdHRlcm47XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlcXVpcmVkUGF0dGVybnNba2V5XSA9IHBhdHRlcm5ba2V5XTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkUGF0dGVybnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZShzdWJWYWx1ZSwgcmVxdWlyZWRQYXR0ZXJuc1trZXldKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZWRQYXR0ZXJuc1trZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbFBhdHRlcm5zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUoc3ViVmFsdWUsIG9wdGlvbmFsUGF0dGVybnNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdW5rbm93bktleXNBbGxvd2VkKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJVbmtub3duIGtleVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoa2V5LCBlcnIucGF0aCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleShyZXF1aXJlZFBhdHRlcm5zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIk1pc3Npbmcga2V5ICdcIiArIGtleSArIFwiJ1wiKTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcbn07XG5cblxudmFyIF9qc0tleXdvcmRzID0gW1wiZG9cIiwgXCJpZlwiLCBcImluXCIsIFwiZm9yXCIsIFwibGV0XCIsIFwibmV3XCIsIFwidHJ5XCIsIFwidmFyXCIsIFwiY2FzZVwiLFxuICAgIFwiZWxzZVwiLCBcImVudW1cIiwgXCJldmFsXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidGhpc1wiLCBcInRydWVcIiwgXCJ2b2lkXCIsIFwid2l0aFwiLFxuICAgIFwiYnJlYWtcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJzdXBlclwiLCBcInRocm93XCIsIFwid2hpbGVcIiwgXCJ5aWVsZFwiLFxuICAgIFwiZGVsZXRlXCIsIFwiZXhwb3J0XCIsIFwiaW1wb3J0XCIsIFwicHVibGljXCIsIFwicmV0dXJuXCIsIFwic3RhdGljXCIsIFwic3dpdGNoXCIsXG4gICAgXCJ0eXBlb2ZcIiwgXCJkZWZhdWx0XCIsIFwiZXh0ZW5kc1wiLCBcImZpbmFsbHlcIiwgXCJwYWNrYWdlXCIsIFwicHJpdmF0ZVwiLCBcImNvbnRpbnVlXCIsXG4gICAgXCJkZWJ1Z2dlclwiLCBcImZ1bmN0aW9uXCIsIFwiYXJndW1lbnRzXCIsIFwiaW50ZXJmYWNlXCIsIFwicHJvdGVjdGVkXCIsIFwiaW1wbGVtZW50c1wiLFxuICAgIFwiaW5zdGFuY2VvZlwiXTtcblxuLy8gQXNzdW1lcyB0aGUgYmFzZSBvZiBwYXRoIGlzIGFscmVhZHkgZXNjYXBlZCBwcm9wZXJseVxuLy8gcmV0dXJucyBrZXkgKyBiYXNlXG5mdW5jdGlvbiBfcHJlcGVuZFBhdGgoa2V5LCBiYXNlKSB7XG4gICAgaWYgKCh0eXBlb2Yga2V5KSA9PT0gXCJudW1iZXJcIiB8fCBrZXkubWF0Y2goL15bMC05XSskLykpXG4gICAgICAgIGtleSA9IFwiW1wiICsga2V5ICsgXCJdXCI7XG4gICAgZWxzZSBpZiAoIWtleS5tYXRjaChNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB8fCBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgIT0gLTEpXG4gICAgICAgIGtleSA9IEpTT04uc3RyaW5naWZ5KFtrZXldKTtcblxuICAgIGlmIChiYXNlICYmIGJhc2VbMF0gIT09IFwiW1wiKVxuICAgICAgICByZXR1cm4ga2V5ICsgJy4nICsgYmFzZTtcbiAgICByZXR1cm4ga2V5ICsgYmFzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbGBcbiAqL1xudmFyIHV0aWwgPSB7XG4gICAgbG9nZ2VyOiByZXF1aXJlKCcuL2xvZ2dlcicpLFxuICAgIGNoZWNrOiByZXF1aXJlKCcuL2NoZWNrJyksXG4gICAgZG9UOiByZXF1aXJlKCdkb3QnKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1dGlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwidXRpbHMtbG9nZ2VyXCI+PC9hPlxuLy8gbWlsby51dGlscy5sb2dnZXJcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIEFwcGxpY2F0aW9uIGxvZ2dlciB0aGF0IGhhcyBlcnJvciwgd2FybiwgaW5mbyBhbmQgZGVidWdcbi8vIG1ldGhvZHMsIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgYnkgc2V0dGluZyBsb2cgbGV2ZWwuXG5cbi8vIFByb3BlcnRpZXM6XG5cbi8vIC0gbGV2ZWxcblxuLy8gICAtIDAgLSBlcnJvclxuLy8gICAtIDEgLSB3YXJuXG4vLyAgIC0gMiAtIGluZm9cbi8vICAgLSAzIC0gZGVidWcgKGRlZmF1bHQpXG5cbi8vIC0gZW5hYmxlZFxuXG4vLyAgIHRydWUgYnkgZGVmYXVsdC4gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgaW4gYnJvd3NlciBjb25zb2xlLlxuXG5cbnZhciBMb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcl9jbGFzcycpO1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IGxldmVsOiAzIH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZ2dlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gIyMjIExvZ2dlciBDbGFzc1xuXG4vLyBQcm9wZXJ0aWVzOlxuXG4vLyAtIGxldmVsXG5cbi8vICAgLSAwIC0gZXJyb3Jcbi8vICAgLSAxIC0gd2FyblxuLy8gICAtIDIgLSBpbmZvXG4vLyAgIC0gMyAtIGRlYnVnIChkZWZhdWx0KVxuXG4vLyAtIGVuYWJsZWRcblxuLy8gICB0cnVlIGJ5IGRlZmF1bHQuIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nIGluIGJyb3dzZXIgY29uc29sZS5cblxuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogTG9nIGxldmVscy5cbiAqL1xuXG52YXIgbGV2ZWxzID0gW1xuICAgICdlcnJvcicsXG4gICAgJ3dhcm4nLFxuICAgICdpbmZvJyxcbiAgICAnZGVidWcnXG5dO1xuXG52YXIgbWF4TGV2ZWxMZW5ndGggPSBNYXRoLm1heC5hcHBseShNYXRoLCBsZXZlbHMubWFwKGZ1bmN0aW9uKGxldmVsKSB7IHJldHVybiBsZXZlbC5sZW5ndGg7IH0pKTtcblxuLyoqXG4gKiBDb2xvcnMgZm9yIGxvZyBsZXZlbHMuXG4gKi9cblxudmFyIGNvbG9ycyA9IFtcbiAgICAzMSxcbiAgICAzMyxcbiAgICAzNixcbiAgICA5MFxuXTtcblxuLyoqXG4gKiBQYWRzIHRoZSBuaWNlIG91dHB1dCB0byB0aGUgbG9uZ2VzdCBsb2cgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhZChzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA8IG1heExldmVsTGVuZ3RoKVxuICAgICAgICByZXR1cm4gc3RyICsgbmV3IEFycmF5KG1heExldmVsTGVuZ3RoIC0gc3RyLmxlbmd0aCArIDEpLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5cbmZ1bmN0aW9uIGNvbG9yZWQoc3RyLCBjb2xvcikge1xuICAgIHJldHVybiAnXFx4MUJbJyArIGNvbG9yICsgJ20nICsgc3RyICsgJyAtXFx4MUJbMzltJztcbn1cblxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIGxldmVsOiAzLFxuICAgIHRocm93TGV2ZWw6IC0xLCAvLyBuZXZlciB0aHJvd1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgbG9nUHJlZml4OiAnJ1xufVxuXG5cbi8qKlxuICogTG9nZ2VyIChjb25zb2xlKS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG52YXIgTG9nZ2VyID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBfLmV4dGVuZCh0aGlzLCBERUZBVUxUX09QVElPTlMpO1xuICAgIF8uZXh0ZW5kKHRoaXMsIG9wdHMgfHwge30pO1xufTtcblxuXG4vKipcbiAqIExvZyBtZXRob2QuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Mb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGluZGV4ID0gbGV2ZWxzLmluZGV4T2YodHlwZSk7XG5cbiAgICBpZiAoISB0aGlzLmVuYWJsZWQgfHwgaW5kZXggPiB0aGlzLmxldmVsKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgaWYgKGluZGV4IDw9IHRoaXMudGhyb3dMZXZlbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFt0aGlzLmxvZ1ByZWZpeCwgdHlwZSArICc6J10uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKSk7XG5cbiAgICBjb25zb2xlLmxvZy5hcHBseShcbiAgICAgICAgICBjb25zb2xlXG4gICAgICAgICwgWyB0aGlzLmxvZ1ByZWZpeENvbG9yXG4gICAgICAgICAgICAgID8gJyAgICcgKyBjb2xvcmVkKHRoaXMubG9nUHJlZml4LCB0aGlzLmxvZ1ByZWZpeENvbG9yKVxuICAgICAgICAgICAgICA6IHRoaXMubG9nUHJlZml4LFxuICAgICAgICAgICAgKHRoaXMuY29sb3JzXG4gICAgICAgICAgICAgID8gJyAnICsgY29sb3JlZChwYWQodHlwZSksIGNvbG9yc1tpbmRleF0pXG4gICAgICAgICAgICAgIDogdHlwZSkgKyAnOidcbiAgICAgICAgICBdLmNvbmNhdChhcmdzKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgbWV0aG9kcy5cbiAqL1xuXG5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIExvZ2dlci5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9nLmFwcGx5KHRoaXMsIFtuYW1lXS5jb25jYXQoXy50b0FycmF5KGFyZ3VtZW50cykpKTtcbiAgICB9O1xufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBMb2dnZXI7XG4iLCIvLyBkb1QuanNcbi8vIDIwMTEtMjAxNCwgTGF1cmEgRG9rdG9yb3ZhLCBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0dmFyIGRvVCA9IHtcblx0XHR2ZXJzaW9uOiBcIjEuMC4zXCIsXG5cdFx0dGVtcGxhdGVTZXR0aW5nczoge1xuXHRcdFx0ZXZhbHVhdGU6ICAgIC9cXHtcXHsoW1xcc1xcU10rPyhcXH0/KSspXFx9XFx9L2csXG5cdFx0XHRpbnRlcnBvbGF0ZTogL1xce1xcez0oW1xcc1xcU10rPylcXH1cXH0vZyxcblx0XHRcdGVuY29kZTogICAgICAvXFx7XFx7IShbXFxzXFxTXSs/KVxcfVxcfS9nLFxuXHRcdFx0dXNlOiAgICAgICAgIC9cXHtcXHsjKFtcXHNcXFNdKz8pXFx9XFx9L2csXG5cdFx0XHR1c2VQYXJhbXM6ICAgLyhefFteXFx3JF0pZGVmKD86XFwufFxcW1tcXCdcXFwiXSkoW1xcdyRcXC5dKykoPzpbXFwnXFxcIl1cXF0pP1xccypcXDpcXHMqKFtcXHckXFwuXSt8XFxcIlteXFxcIl0rXFxcInxcXCdbXlxcJ10rXFwnfFxce1teXFx9XStcXH0pL2csXG5cdFx0XHRkZWZpbmU6ICAgICAgL1xce1xceyMjXFxzKihbXFx3XFwuJF0rKVxccyooXFw6fD0pKFtcXHNcXFNdKz8pI1xcfVxcfS9nLFxuXHRcdFx0ZGVmaW5lUGFyYW1zOi9eXFxzKihbXFx3JF0rKTooW1xcc1xcU10rKS8sXG5cdFx0XHRjb25kaXRpb25hbDogL1xce1xce1xcPyhcXD8pP1xccyooW1xcc1xcU10qPylcXHMqXFx9XFx9L2csXG5cdFx0XHRpdGVyYXRlOiAgICAgL1xce1xce35cXHMqKD86XFx9XFx9fChbXFxzXFxTXSs/KVxccypcXDpcXHMqKFtcXHckXSspXFxzKig/OlxcOlxccyooW1xcdyRdKykpP1xccypcXH1cXH0pL2csXG5cdFx0XHR2YXJuYW1lOlx0XCJpdFwiLFxuXHRcdFx0c3RyaXA6XHRcdHRydWUsXG5cdFx0XHRhcHBlbmQ6XHRcdHRydWUsXG5cdFx0XHRzZWxmY29udGFpbmVkOiBmYWxzZSxcblx0XHRcdGRvTm90U2tpcEVuY29kZWQ6IGZhbHNlXG5cdFx0fSxcblx0XHR0ZW1wbGF0ZTogdW5kZWZpbmVkLCAvL2ZuLCBjb21waWxlIHRlbXBsYXRlXG5cdFx0Y29tcGlsZTogIHVuZGVmaW5lZCAgLy9mbiwgZm9yIGV4cHJlc3Ncblx0fSwgX2dsb2JhbHM7XG5cblx0ZG9ULmVuY29kZUhUTUxTb3VyY2UgPSBmdW5jdGlvbihkb05vdFNraXBFbmNvZGVkKSB7XG5cdFx0dmFyIGVuY29kZUhUTUxSdWxlcyA9IHsgXCImXCI6IFwiJiMzODtcIiwgXCI8XCI6IFwiJiM2MDtcIiwgXCI+XCI6IFwiJiM2MjtcIiwgJ1wiJzogXCImIzM0O1wiLCBcIidcIjogXCImIzM5O1wiLCBcIi9cIjogXCImIzQ3O1wiIH0sXG5cdFx0XHRtYXRjaEhUTUwgPSBkb05vdFNraXBFbmNvZGVkID8gL1smPD5cIidcXC9dL2cgOiAvJig/ISM/XFx3KzspfDx8PnxcInwnfFxcLy9nO1xuXHRcdHJldHVybiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0XHRyZXR1cm4gY29kZSA/IGNvZGUudG9TdHJpbmcoKS5yZXBsYWNlKG1hdGNoSFRNTCwgZnVuY3Rpb24obSkge3JldHVybiBlbmNvZGVIVE1MUnVsZXNbbV0gfHwgbTt9KSA6IFwiXCI7XG5cdFx0fTtcblx0fTtcblxuXHRfZ2xvYmFscyA9IChmdW5jdGlvbigpeyByZXR1cm4gdGhpcyB8fCAoMCxldmFsKShcInRoaXNcIik7IH0oKSk7XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGRvVDtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpe3JldHVybiBkb1Q7fSk7XG5cdH0gZWxzZSB7XG5cdFx0X2dsb2JhbHMuZG9UID0gZG9UO1xuXHR9XG5cblx0dmFyIHN0YXJ0ZW5kID0ge1xuXHRcdGFwcGVuZDogeyBzdGFydDogXCInKyhcIiwgICAgICBlbmQ6IFwiKSsnXCIsICAgICAgc3RhcnRlbmNvZGU6IFwiJytlbmNvZGVIVE1MKFwiIH0sXG5cdFx0c3BsaXQ6ICB7IHN0YXJ0OiBcIic7b3V0Kz0oXCIsIGVuZDogXCIpO291dCs9J1wiLCBzdGFydGVuY29kZTogXCInO291dCs9ZW5jb2RlSFRNTChcIiB9XG5cdH0sIHNraXAgPSAvJF4vO1xuXG5cdGZ1bmN0aW9uIHJlc29sdmVEZWZzKGMsIGJsb2NrLCBkZWYpIHtcblx0XHRyZXR1cm4gKCh0eXBlb2YgYmxvY2sgPT09IFwic3RyaW5nXCIpID8gYmxvY2sgOiBibG9jay50b1N0cmluZygpKVxuXHRcdC5yZXBsYWNlKGMuZGVmaW5lIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUsIGFzc2lnbiwgdmFsdWUpIHtcblx0XHRcdGlmIChjb2RlLmluZGV4T2YoXCJkZWYuXCIpID09PSAwKSB7XG5cdFx0XHRcdGNvZGUgPSBjb2RlLnN1YnN0cmluZyg0KTtcblx0XHRcdH1cblx0XHRcdGlmICghKGNvZGUgaW4gZGVmKSkge1xuXHRcdFx0XHRpZiAoYXNzaWduID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjLmRlZmluZVBhcmFtcykgdmFsdWUucmVwbGFjZShjLmRlZmluZVBhcmFtcywgZnVuY3Rpb24obSwgcGFyYW0sIHYpIHtcblx0XHRcdFx0XHRcdGRlZltjb2RlXSA9IHthcmc6IHBhcmFtLCB0ZXh0OiB2fTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIShjb2RlIGluIGRlZikpIGRlZltjb2RlXT0gdmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwiZGVmWydcIitjb2RlK1wiJ109XCIgKyB2YWx1ZSkoZGVmKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSlcblx0XHQucmVwbGFjZShjLnVzZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRpZiAoYy51c2VQYXJhbXMpIGNvZGUgPSBjb2RlLnJlcGxhY2UoYy51c2VQYXJhbXMsIGZ1bmN0aW9uKG0sIHMsIGQsIHBhcmFtKSB7XG5cdFx0XHRcdGlmIChkZWZbZF0gJiYgZGVmW2RdLmFyZyAmJiBwYXJhbSkge1xuXHRcdFx0XHRcdHZhciBydyA9IChkK1wiOlwiK3BhcmFtKS5yZXBsYWNlKC8nfFxcXFwvZywgXCJfXCIpO1xuXHRcdFx0XHRcdGRlZi5fX2V4cCA9IGRlZi5fX2V4cCB8fCB7fTtcblx0XHRcdFx0XHRkZWYuX19leHBbcnddID0gZGVmW2RdLnRleHQucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58W15cXFxcdyRdKVwiICsgZGVmW2RdLmFyZyArIFwiKFteXFxcXHckXSlcIiwgXCJnXCIpLCBcIiQxXCIgKyBwYXJhbSArIFwiJDJcIik7XG5cdFx0XHRcdFx0cmV0dXJuIHMgKyBcImRlZi5fX2V4cFsnXCIrcncrXCInXVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHZhciB2ID0gbmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwicmV0dXJuIFwiICsgY29kZSkoZGVmKTtcblx0XHRcdHJldHVybiB2ID8gcmVzb2x2ZURlZnMoYywgdiwgZGVmKSA6IHY7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG5cdFx0cmV0dXJuIGNvZGUucmVwbGFjZSgvXFxcXCgnfFxcXFwpL2csIFwiJDFcIikucmVwbGFjZSgvW1xcclxcdFxcbl0vZywgXCIgXCIpO1xuXHR9XG5cblx0ZG9ULnRlbXBsYXRlID0gZnVuY3Rpb24odG1wbCwgYywgZGVmKSB7XG5cdFx0YyA9IGMgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3M7XG5cdFx0dmFyIGNzZSA9IGMuYXBwZW5kID8gc3RhcnRlbmQuYXBwZW5kIDogc3RhcnRlbmQuc3BsaXQsIG5lZWRodG1sZW5jb2RlLCBzaWQgPSAwLCBpbmR2LFxuXHRcdFx0c3RyICA9IChjLnVzZSB8fCBjLmRlZmluZSkgPyByZXNvbHZlRGVmcyhjLCB0bXBsLCBkZWYgfHwge30pIDogdG1wbDtcblxuXHRcdHN0ciA9IChcInZhciBvdXQ9J1wiICsgKGMuc3RyaXAgPyBzdHIucmVwbGFjZSgvKF58XFxyfFxcbilcXHQqICt8ICtcXHQqKFxccnxcXG58JCkvZyxcIiBcIilcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxyfFxcbnxcXHR8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLFwiXCIpOiBzdHIpXG5cdFx0XHQucmVwbGFjZSgvJ3xcXFxcL2csIFwiXFxcXCQmXCIpXG5cdFx0XHQucmVwbGFjZShjLmludGVycG9sYXRlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydCArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmVuY29kZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdG5lZWRodG1sZW5jb2RlID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydGVuY29kZSArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmNvbmRpdGlvbmFsIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGVsc2VjYXNlLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBlbHNlY2FzZSA/XG5cdFx0XHRcdFx0KGNvZGUgPyBcIic7fWVsc2UgaWYoXCIgKyB1bmVzY2FwZShjb2RlKSArIFwiKXtvdXQrPSdcIiA6IFwiJzt9ZWxzZXtvdXQrPSdcIikgOlxuXHRcdFx0XHRcdChjb2RlID8gXCInO2lmKFwiICsgdW5lc2NhcGUoY29kZSkgKyBcIil7b3V0Kz0nXCIgOiBcIic7fW91dCs9J1wiKTtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLml0ZXJhdGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgaXRlcmF0ZSwgdm5hbWUsIGluYW1lKSB7XG5cdFx0XHRcdGlmICghaXRlcmF0ZSkgcmV0dXJuIFwiJzt9IH0gb3V0Kz0nXCI7XG5cdFx0XHRcdHNpZCs9MTsgaW5kdj1pbmFtZSB8fCBcImlcIitzaWQ7IGl0ZXJhdGU9dW5lc2NhcGUoaXRlcmF0ZSk7XG5cdFx0XHRcdHJldHVybiBcIic7dmFyIGFyclwiK3NpZCtcIj1cIitpdGVyYXRlK1wiO2lmKGFyclwiK3NpZCtcIil7dmFyIFwiK3ZuYW1lK1wiLFwiK2luZHYrXCI9LTEsbFwiK3NpZCtcIj1hcnJcIitzaWQrXCIubGVuZ3RoLTE7d2hpbGUoXCIraW5kditcIjxsXCIrc2lkK1wiKXtcIlxuXHRcdFx0XHRcdCt2bmFtZStcIj1hcnJcIitzaWQrXCJbXCIraW5kditcIis9MV07b3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5ldmFsdWF0ZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBcIic7XCIgKyB1bmVzY2FwZShjb2RlKSArIFwib3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0KyBcIic7cmV0dXJuIG91dDtcIilcblx0XHRcdC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKS5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JykucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcblx0XHRcdC5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJzsvZywgJyQxJykucmVwbGFjZSgvXFwrJycvZywgXCJcIik7XG5cdFx0XHQvLy5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJ1xcKy9nLCckMW91dCs9Jyk7XG5cblx0XHRpZiAobmVlZGh0bWxlbmNvZGUpIHtcblx0XHRcdGlmICghYy5zZWxmY29udGFpbmVkICYmIF9nbG9iYWxzICYmICFfZ2xvYmFscy5fZW5jb2RlSFRNTCkgX2dsb2JhbHMuX2VuY29kZUhUTUwgPSBkb1QuZW5jb2RlSFRNTFNvdXJjZShjLmRvTm90U2tpcEVuY29kZWQpO1xuXHRcdFx0c3RyID0gXCJ2YXIgZW5jb2RlSFRNTCA9IHR5cGVvZiBfZW5jb2RlSFRNTCAhPT0gJ3VuZGVmaW5lZCcgPyBfZW5jb2RlSFRNTCA6IChcIlxuXHRcdFx0XHQrIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChjLmRvTm90U2tpcEVuY29kZWQgfHwgJycpICsgXCIpKTtcIlxuXHRcdFx0XHQrIHN0cjtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgRnVuY3Rpb24oYy52YXJuYW1lLCBzdHIpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS5sb2coXCJDb3VsZCBub3QgY3JlYXRlIGEgdGVtcGxhdGUgZnVuY3Rpb246IFwiICsgc3RyKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9O1xuXG5cdGRvVC5jb21waWxlID0gZnVuY3Rpb24odG1wbCwgZGVmKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZSh0bXBsLCBudWxsLCBkZWYpO1xuXHR9O1xufSgpKTtcbiIsIi8qIGRvVCArIGF1dG8tY29tcGlsYXRpb24gb2YgZG9UIHRlbXBsYXRlc1xuICpcbiAqIDIwMTIsIExhdXJhIERva3Rvcm92YSwgaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogQ29tcGlsZXMgLmRlZiwgLmRvdCwgLmpzdCBmaWxlcyBmb3VuZCB1bmRlciB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKiBJdCBpZ25vcmVzIHN1Yi1kaXJlY3Rvcmllcy5cbiAqIFRlbXBsYXRlIGZpbGVzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuc2lvbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqIEZpbGVzIHdpdGggLmRlZiBleHRlbnNpb24gY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIGZpbGVzIHZpYSB7eyNkZWYubmFtZX19XG4gKiBGaWxlcyB3aXRoIC5kb3QgZXh0ZW5zaW9uIGFyZSBjb21waWxlZCBpbnRvIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kXG4gKiBjYW4gYmUgYWNjZXNzZWQgYXMgcmVuZGVyZXIuZmlsZW5hbWVcbiAqIEZpbGVzIHdpdGggLmpzdCBleHRlbnNpb24gYXJlIGNvbXBpbGVkIGludG8gLmpzIGZpbGVzLiBQcm9kdWNlZCAuanMgZmlsZSBjYW4gYmVcbiAqIGxvYWRlZCBhcyBhIGNvbW1vbkpTLCBBTUQgbW9kdWxlLCBvciBqdXN0IGluc3RhbGxlZCBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlXG4gKiAoZGVmYXVsdCBpcyBzZXQgdG8gd2luZG93LnJlbmRlcikuXG4gKiBBbGwgaW5saW5lIGRlZmluZXMgZGVmaW5lZCBpbiB0aGUgLmpzdCBmaWxlIGFyZVxuICogY29tcGlsZWQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMgYW5kIGFyZSBhdmFpbGFibGUgdmlhIF9yZW5kZXIuZmlsZW5hbWUuZGVmaW5lbmFtZVxuICpcbiAqIEJhc2ljIHVzYWdlOlxuICogdmFyIGRvdHMgPSByZXF1aXJlKFwiZG90XCIpLnByb2Nlc3Moe3BhdGg6IFwiLi92aWV3c1wifSk7XG4gKiBkb3RzLm15dGVtcGxhdGUoe2ZvbzpcImhlbGxvIHdvcmxkXCJ9KTtcbiAqXG4gKiBUaGUgYWJvdmUgc25pcHBldCB3aWxsOlxuICogMS4gQ29tcGlsZSBhbGwgdGVtcGxhdGVzIGluIHZpZXdzIGZvbGRlciAoLmRvdCwgLmRlZiwgLmpzdClcbiAqIDIuIFBsYWNlIC5qcyBmaWxlcyBjb21waWxlZCBmcm9tIC5qc3QgdGVtcGxhdGVzIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICogICAgVGhlc2UgZmlsZXMgY2FuIGJlIHVzZWQgd2l0aCByZXF1aXJlLCBpLmUuIHJlcXVpcmUoXCIuL3ZpZXdzL215dGVtcGxhdGVcIikuXG4gKiAzLiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gLmRvdCB0ZW1wbGF0ZXMgYXMgaXRzIHByb3BlcnRpZXMuXG4gKiA0LiBSZW5kZXIgbXl0ZW1wbGF0ZSB0ZW1wbGF0ZS5cbiAqL1xuXG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIiksXG5cdGRvVCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vZG9UXCIpO1xuXG5kb1QucHJvY2VzcyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0Ly9wYXRoLCBkZXN0aW5hdGlvbiwgZ2xvYmFsLCByZW5kZXJtb2R1bGUsIHRlbXBsYXRlU2V0dGluZ3Ncblx0cmV0dXJuIG5ldyBJbnN0YWxsRG90cyhvcHRpb25zKS5jb21waWxlQWxsKCk7XG59O1xuXG5mdW5jdGlvbiBJbnN0YWxsRG90cyhvKSB7XG5cdHRoaXMuX19wYXRoIFx0XHQ9IG8ucGF0aCB8fCBcIi4vXCI7XG5cdGlmICh0aGlzLl9fcGF0aFt0aGlzLl9fcGF0aC5sZW5ndGgtMV0gIT09ICcvJykgdGhpcy5fX3BhdGggKz0gJy8nO1xuXHR0aGlzLl9fZGVzdGluYXRpb25cdD0gby5kZXN0aW5hdGlvbiB8fCB0aGlzLl9fcGF0aDtcblx0aWYgKHRoaXMuX19kZXN0aW5hdGlvblt0aGlzLl9fZGVzdGluYXRpb24ubGVuZ3RoLTFdICE9PSAnLycpIHRoaXMuX19kZXN0aW5hdGlvbiArPSAnLyc7XG5cdHRoaXMuX19nbG9iYWxcdFx0PSBvLmdsb2JhbCB8fCBcIndpbmRvdy5yZW5kZXJcIjtcblx0dGhpcy5fX3JlbmRlcm1vZHVsZVx0PSBvLnJlbmRlcm1vZHVsZSB8fCB7fTtcblx0dGhpcy5fX3NldHRpbmdzIFx0PSBvLnRlbXBsYXRlU2V0dGluZ3MgPyBjb3B5KG8udGVtcGxhdGVTZXR0aW5ncywgY29weShkb1QudGVtcGxhdGVTZXR0aW5ncykpIDogdW5kZWZpbmVkO1xuXHR0aGlzLl9faW5jbHVkZXNcdFx0PSB7fTtcbn1cblxuSW5zdGFsbERvdHMucHJvdG90eXBlLmNvbXBpbGVUb0ZpbGUgPSBmdW5jdGlvbihwYXRoLCB0ZW1wbGF0ZSwgZGVmKSB7XG5cdGRlZiA9IGRlZiB8fCB7fTtcblx0dmFyIG1vZHVsZW5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSsxLCBwYXRoLmxhc3RJbmRleE9mKFwiLlwiKSlcblx0XHQsIGRlZnMgPSBjb3B5KHRoaXMuX19pbmNsdWRlcywgY29weShkZWYpKVxuXHRcdCwgc2V0dGluZ3MgPSB0aGlzLl9fc2V0dGluZ3MgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3Ncblx0XHQsIGNvbXBpbGVvcHRpb25zID0gY29weShzZXR0aW5ncylcblx0XHQsIGRlZmF1bHRjb21waWxlZCA9IGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZSwgc2V0dGluZ3MsIGRlZnMpXG5cdFx0LCBleHBvcnRzID0gW11cblx0XHQsIGNvbXBpbGVkID0gXCJcIlxuXHRcdCwgZm47XG5cblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gZGVmcykge1xuXHRcdGlmIChkZWZzW3Byb3BlcnR5XSAhPT0gZGVmW3Byb3BlcnR5XSAmJiBkZWZzW3Byb3BlcnR5XSAhPT0gdGhpcy5fX2luY2x1ZGVzW3Byb3BlcnR5XSkge1xuXHRcdFx0Zm4gPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodHlwZW9mIGRlZnNbcHJvcGVydHldID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRmbiA9IGRvVC50ZW1wbGF0ZShkZWZzW3Byb3BlcnR5XSwgc2V0dGluZ3MsIGRlZnMpO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGVmc1twcm9wZXJ0eV0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Zm4gPSBkZWZzW3Byb3BlcnR5XTtcblx0XHRcdH0gZWxzZSBpZiAoZGVmc1twcm9wZXJ0eV0uYXJnKSB7XG5cdFx0XHRcdGNvbXBpbGVvcHRpb25zLnZhcm5hbWUgPSBkZWZzW3Byb3BlcnR5XS5hcmc7XG5cdFx0XHRcdGZuID0gZG9ULnRlbXBsYXRlKGRlZnNbcHJvcGVydHldLnRleHQsIGNvbXBpbGVvcHRpb25zLCBkZWZzKTtcblx0XHRcdH1cblx0XHRcdGlmIChmbikge1xuXHRcdFx0XHRjb21waWxlZCArPSBmbi50b1N0cmluZygpLnJlcGxhY2UoJ2Fub255bW91cycsIHByb3BlcnR5KTtcblx0XHRcdFx0ZXhwb3J0cy5wdXNoKHByb3BlcnR5KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29tcGlsZWQgKz0gZGVmYXVsdGNvbXBpbGVkLnRvU3RyaW5nKCkucmVwbGFjZSgnYW5vbnltb3VzJywgbW9kdWxlbmFtZSk7XG5cdGZzLndyaXRlRmlsZVN5bmMocGF0aCwgXCIoZnVuY3Rpb24oKXtcIiArIGNvbXBpbGVkXG5cdFx0KyBcInZhciBpdHNlbGY9XCIgKyBtb2R1bGVuYW1lICsgXCIsIF9lbmNvZGVIVE1MPShcIiArIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChzZXR0aW5ncy5kb05vdFNraXBFbmNvZGVkIHx8ICcnKSArIFwiKSk7XCJcblx0XHQrIGFkZGV4cG9ydHMoZXhwb3J0cylcblx0XHQrIFwiaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cz1pdHNlbGY7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09J2Z1bmN0aW9uJylkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaXRzZWxmO30pO2Vsc2Uge1wiXG5cdFx0KyB0aGlzLl9fZ2xvYmFsICsgXCI9XCIgKyB0aGlzLl9fZ2xvYmFsICsgXCJ8fHt9O1wiICsgdGhpcy5fX2dsb2JhbCArIFwiWydcIiArIG1vZHVsZW5hbWUgKyBcIiddPWl0c2VsZjt9fSgpKTtcIik7XG59O1xuXG5mdW5jdGlvbiBhZGRleHBvcnRzKGV4cG9ydHMpIHtcblx0Zm9yICh2YXIgcmV0ID0nJywgaT0wOyBpPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0cmV0ICs9IFwiaXRzZWxmLlwiICsgZXhwb3J0c1tpXSsgXCI9XCIgKyBleHBvcnRzW2ldK1wiO1wiO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvcHkobywgdG8pIHtcblx0dG8gPSB0byB8fCB7fTtcblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gbykge1xuXHRcdHRvW3Byb3BlcnR5XSA9IG9bcHJvcGVydHldO1xuXHR9XG5cdHJldHVybiB0bztcbn1cblxuZnVuY3Rpb24gcmVhZGRhdGEocGF0aCkge1xuXHR2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoKTtcblx0aWYgKGRhdGEpIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG5cdGNvbnNvbGUubG9nKFwicHJvYmxlbXMgd2l0aCBcIiArIHBhdGgpO1xufVxuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7XG5cdHZhciBkYXRhID0gcmVhZGRhdGEocGF0aCk7XG5cdGlmIChkYXRhKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZShkYXRhLFxuXHRcdFx0XHRcdHRoaXMuX19zZXR0aW5ncyB8fCBkb1QudGVtcGxhdGVTZXR0aW5ncyxcblx0XHRcdFx0XHRjb3B5KHRoaXMuX19pbmNsdWRlcykpO1xuXHR9XG59O1xuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZUFsbCA9IGZ1bmN0aW9uKCkge1xuXHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBhbGwgZG9UIHRlbXBsYXRlcy4uLlwiKTtcblxuXHR2YXIgZGVmRm9sZGVyID0gdGhpcy5fX3BhdGgsXG5cdFx0c291cmNlcyA9IGZzLnJlYWRkaXJTeW5jKGRlZkZvbGRlciksXG5cdFx0aywgbCwgbmFtZTtcblxuXHRmb3IoIGsgPSAwLCBsID0gc291cmNlcy5sZW5ndGg7IGsgPCBsOyBrKyspIHtcblx0XHRuYW1lID0gc291cmNlc1trXTtcblx0XHRpZiAoL1xcLmRlZihcXC5kb3R8XFwuanN0KT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkxvYWRlZCBkZWYgXCIgKyBuYW1lKTtcblx0XHRcdHRoaXMuX19pbmNsdWRlc1tuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJy4nKSldID0gcmVhZGRhdGEoZGVmRm9sZGVyICsgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yKCBrID0gMCwgbCA9IHNvdXJjZXMubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0bmFtZSA9IHNvdXJjZXNba107XG5cdFx0aWYgKC9cXC5kb3QoXFwuZGVmfFxcLmpzdCk/JC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJDb21waWxpbmcgXCIgKyBuYW1lICsgXCIgdG8gZnVuY3Rpb25cIik7XG5cdFx0XHR0aGlzLl9fcmVuZGVybW9kdWxlW25hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKV0gPSB0aGlzLmNvbXBpbGVQYXRoKGRlZkZvbGRlciArIG5hbWUpO1xuXHRcdH1cblx0XHRpZiAoL1xcLmpzdChcXC5kb3R8XFwuZGVmKT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBcIiArIG5hbWUgKyBcIiB0byBmaWxlXCIpO1xuXHRcdFx0dGhpcy5jb21waWxlVG9GaWxlKHRoaXMuX19kZXN0aW5hdGlvbiArIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKSArICcuanMnLFxuXHRcdFx0XHRcdHJlYWRkYXRhKGRlZkZvbGRlciArIG5hbWUpKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoaXMuX19yZW5kZXJtb2R1bGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiBbX19Qcm90b3R5cGUgZnVuY3Rpb25zX19dKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZFByb3RvXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNleHRlbmRQcm90bylcbiAqIC0gW2NyZWF0ZVN1YmNsYXNzXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNjcmVhdGVTdWJjbGFzcylcbiAqIC0gW21ha2VTdWJjbGFzc10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI25ld0FwcGx5KVxuICovXG52YXIgcHJvdG90eXBlTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fcHJvdG90eXBlJyk7XG5cblxuLyoqXG4gKiBbX19PYmplY3QgZnVuY3Rpb25zX19dKHByb3RvX29iamVjdC5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZXh0ZW5kKVxuICogLSBbY2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2Nsb25lKVxuICogLSBbZGVmaW5lUHJvcGVydHldKHByb3RvX29iamVjdC5qcy5odG1sI2RlZmluZVByb3BlcnR5KVxuICogLSBbZGVmaW5lUHJvcGVydGllc10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBFeHRlbmQpXG4gKiAtIFtkZWVwQ2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBDbG9uZSlcbiAqIC0gW2tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2tleXMpXG4gKiAtIFthbGxLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNhbGxLZXlzKVxuICogLSBbdmFsdWVzXShwcm90b19vYmplY3QuanMuaHRtbCN2YWx1ZXMpXG4gKiAtIFtrZXlPZl0ocHJvdG9fb2JqZWN0LmpzLmh0bWwja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKHByb3RvX29iamVjdC5qcy5odG1sI2FsbEtleXNPZilcbiAqIC0gW2VhY2hLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2VhY2hLZXkpXG4gKiAtIFttYXBLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjcmVkdWNlS2V5cylcbiAqIC0gW2ZpbHRlcktleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2ZpbHRlcktleXMpXG4gKiAtIFtzb21lS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2V2ZXJ5S2V5KVxuICogLSBbZmluZFZhbHVlXShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kVmFsdWUpXG4gKiAtIFtmaW5kS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI3BpY2tLZXlzKVxuICogLSBbb21pdEtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI29taXRLZXlzKVxuICogLSBbaXNFcXVhbF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjaXNFcXVhbClcbiAqIC0gW2lzTm90XShwcm90b19vYmplY3QuanMuaHRtbCNpc05vdClcbiAqL1xudmFyIG9iamVjdE1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5cbi8qKlxuICogW19fQXJyYXkgZnVuY3Rpb25zX19dKHByb3RvX2FycmF5LmpzLmh0bWwpXG4gKlxuICogLSBbZmluZF0ocHJvdG9fYXJyYXkuanMuaHRtbCNmaW5kKVxuICogLSBbZmluZEluZGV4XShwcm90b19hcnJheS5qcy5odG1sI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI2FwcGVuZEFycmF5KVxuICogLSBbcHJlcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI3ByZXBlbmRBcnJheSlcbiAqIC0gW3NwbGljZUl0ZW1dKHByb3RvX2FycmF5LmpzLmh0bWwjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKHByb3RvX2FycmF5LmpzLmh0bWwjdG9BcnJheSlcbiAqIC0gW29iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNvYmplY3QpXG4gKiAtIFttYXBUb09iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0ocHJvdG9fYXJyYXkuanMuaHRtbCN1bmlxdWUpXG4gKiAtIFtkZWVwRm9yRWFjaF0ocHJvdG9fYXJyYXkuanMuaHRtbCNkZWVwRm9yRWFjaClcbiAqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGFkZGVkIC0gdGhleSBjYW4gYmUgdXNlZCB3aXRoIGFycmF5LWxpa2Ugb2JqZWN0cyBhbmQgZm9yIGNoYWluaW5nIChuYXRpdmUgZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkKS5cbiAqL1xudmFyIGFycmF5TWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fYXJyYXknKTtcblxuXG4vKipcbiAqIFtfX0Z1bmN0aW9uIGZ1bmN0aW9uc19fXShwcm90b19mdW5jdGlvbi5qcy5odG1sKVxuICpcbiAqIC0gW21ha2VGdW5jdGlvbl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtYWtlRnVuY3Rpb24pXG4gKiAtIFtwYXJ0aWFsXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3BhcnRpYWwpXG4gKiAtIFtwYXJ0aWFsUmlnaHRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtZW1vaXplKVxuICogLSBbZGVsYXldKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXkpXG4gKiAtIFtkZWZlcl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXllZClcbiAqIC0gW2RlZmVycmVkXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVycmVkKVxuICogLSBbZGVmZXJUaWNrc10ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXlNZXRob2QpXG4gKiAtIFtkZWZlck1ldGhvZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlck1ldGhvZClcbiAqIC0gW2RlYm91bmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjdGhyb3R0bGUpXG4gKiAtIFtvbmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI29uY2UpXG4gKiAtIFt3YWl0Rm9yXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3dhaXRGb3IpXG4qL1xudmFyIGZ1bmN0aW9uTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fZnVuY3Rpb24nKTtcblxuXG4vKipcbiAqIFtfX1N0cmluZyBmdW5jdGlvbnNfX10ocHJvdG9fc3RyaW5nLmpzLmh0bWwpXG4gKlxuICogLSBbZmlyc3RVcHBlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0VXBwZXJDYXNlKVxuICogLSBbZmlyc3RMb3dlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKHByb3RvX3N0cmluZy5qcy5odG1sI3RvUmVnRXhwKVxuICogLSBbdG9GdW5jdGlvbl0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9GdW5jdGlvbilcbiAqIC0gW3RvRGF0ZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9RdWVyeVN0cmluZylcbiAqIC0gW2Zyb21RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjZnJvbVF1ZXJ5U3RyaW5nKVxuICogLSBbanNvblBhcnNlXShwcm90b19zdHJpbmcuanMuaHRtbCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjaGFzaENvZGUpXG4gKiAtIFt1blByZWZpeF0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdW5QcmVmaXgpXG4gKi9cbnZhciBzdHJpbmdNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19zdHJpbmcnKTtcblxuXG4vKipcbiAqIFtfX051bWJlciBmdW5jdGlvbnNfX10ocHJvdG9fbnVtYmVyLmpzLmh0bWwpXG4gKlxuICogLSBbaXNOdW1lcmljXShwcm90b19udW1iZXIuanMuaHRtbCNpc051bWVyaWMpXG4gKi9cbnZhciBudW1iZXJNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19udW1iZXInKTtcblxuXG4vKipcbiAqIFtfX1V0aWxpdHkgZnVuY3Rpb25zX19dKHByb3RvX3V0aWwuanMuaHRtbClcbiAqXG4gKiAtIFt0aW1lc10ocHJvdG9fdXRpbC5qcy5odG1sI3RpbWVzKVxuICogLSBbcmVwZWF0XShwcm90b191dGlsLmpzLmh0bWwjcmVwZWF0KVxuICogLSBbdGFwXShwcm90b191dGlsLmpzLmh0bWwjdGFwKVxuICogLSBbcmVzdWx0XShwcm90b191dGlsLmpzLmh0bWwjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKHByb3RvX3V0aWwuanMuaHRtbCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XShwcm90b191dGlsLmpzLmh0bWwjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKHByb3RvX3V0aWwuanMuaHRtbCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXShwcm90b191dGlsLmpzLmh0bWwjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b191dGlsJyk7XG5cblxuLyoqXG4gKiBDaGFpbmluZ1xuICogPT09PT09PT1cbiAqXG4gKiBgX2AgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgd3JhcHBlZCB2YWx1ZSAob2JqZWN0LCBmdW5jdGlvbiwgYXJyYXksIGV0Yy4pIHRvIGFsbG93IGNoYWluaW5nIG9mIFByb3RvIGZ1bmN0aW9ucy5cbiAqIFRvIHVud3JhcCwgYF9gIG1ldGhvZCBvZiBhIHdyYXBwZWQgdmFsdWUgc2hvdWxkIGJlIHVzZWQuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogdmFyIGFyciA9IF8oeyAwOiAzLCAxOiA0LCAyOiA1LCBsZW5ndGg6IDN9KVxuICogICAgICAgICAgICAgIC50b0FycmF5KClcbiAqICAgICAgICAgICAgICAucHJlcGVuZEFycmF5KFsxLCAyXSlcbiAqICAgICAgICAgICAgICAuYXBwZW5kQXJyYXkoWzYsIDcsIDhdKVxuICogICAgICAgICAgICAgIC5fKCk7XG4gKiBgYGBcbiAqIEEgd3JhcHBlZCBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYF9gIChgUHJvdG9gIGNsYXNzKS5cbiAqXG4gKiBDaGFpbmluZyBpcyBpbXBsZW1lbnRlZCBmb3IgZGV2ZWxvcG1lbnQgY29udmVuaWVuY2UsIGJ1dCBpdCBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIG5vdCBvbmx5IHRvIHdyYXAgYW5kIHVud3JhcCB2YWx1ZXMgYnV0IGluIGVhY2ggZnVuY3Rpb24gY2FsbC5cbiAqIEFsdGhvdWdoIGFsbCBQcm90byBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMgb3BlcmF0aW5nIG9uIHRoaXMgYW5kIHRoZSBvdmVyaGVhZCB0byByZWRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucyBpcyB2ZXJ5IHNtYWxsLCB0aGUgb3ZlcmhlYWQgdG8gcmVkZWZpbmUgdGhlbSBhcyBtZXRob2RzIG9mIHdyYXBwZWQgdmFsdWUgaXMgc2xpZ2h0bHkgaGlnaGVyIC0gY2hhaW5pbmcgaXMgMTUtMjUlIHNsb3dlciB0aGFuIHVzaW5nIGZ1bmN0aW9ucyAocHJvcGVydGllcyBvZiBfIHRoYXQgdGFrZSB0aGUgZmlyc3QgcGFyYW1ldGVyKS5cbiAqIEluIGNhc2VzIHdoZW4gcGVyZm9ybWFuY2UgaXMgY3JpdGljYWwsIHlvdSBtYXkgd2FudCB0byBhdm9pZCB1c2luZyBjaGFpbmluZy5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBBIHZhbHVlIHRvIGJlIHdyYXBwZWRcbiAqIEByZXR1cm4ge1Byb3RvfVxuICovXG5mdW5jdGlvbiBQcm90byhzZWxmKSB7XG4gICAgLy8gd3JhcCBwYXNzZWQgcGFyYW1ldGVyIGluIF8gb2JqZWN0XG4gICAgdmFyIHdyYXBwZWQgPSBPYmplY3QuY3JlYXRlKFByb3RvLnByb3RvdHlwZSk7XG4gICAgd3JhcHBlZC5zZWxmID0gc2VsZjtcbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbnZhciBfID0gUHJvdG87XG5cblxuLy8gc3RvcmUgcmF3IG1ldGhvZHMgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcyBpbiBfXyBvYmplY3QgKGRvdWJsZSBcIl9cIilcbnZhciBfXyA9IHt9O1xuXG5vYmplY3RNZXRob2RzLmV4dGVuZC5jYWxsKF9fLCBvYmplY3RNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBwcm90b3R5cGVNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBhcnJheU1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIHN0cmluZ01ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIG51bWJlck1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIGZ1bmN0aW9uTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgdXRpbE1ldGhvZHMpO1xuXG5cbi8vIGFkZCBfXyBhcyBwcm9wZXJ0eSBvZiBQcm90bywgc28gdGhleSBjYW4gYmUgdXNlZCBhcyBtaXhpbnMgaW4gb3RoZXIgY2xhc3Nlc1xuX18uZGVmaW5lUHJvcGVydHkoUHJvdG8sICdfXycsIF9fKTtcblxuXG4vLyBhZGQgXyBtZXRob2QgdG8gdW53cmFwIHdyYXBwZWQgdmFsdWUgKFByb3RvIGluc3RhbmNlKVxuZnVuY3Rpb24gdW53cmFwUHJvdG8oKSB7IHJldHVybiB0aGlzLnNlbGY7IH1cbl9fLmV4dGVuZFByb3RvLmNhbGwoUHJvdG8sIHsgXzogdW53cmFwUHJvdG8gfSk7XG5cbi8vIGFkZCBjb25zdGFudHMgKGZ1bmN0aW9ucyB3aWxsIGJlIG92ZXJ3cml0dGVuKVxuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIG9iamVjdE1ldGhvZHMuX2NvbnN0YW50cyk7XG5cbi8vIGFkZCBmdW5jdGlvbnMgdGhhdCB0YWtlIGZpcnN0IHBhcmFtZXRlciBpbnN0ZWFkIG9mIFwidGhpc1wiIHRvIFByb3RvXG52YXIgcHJvdG9GdW5jcyA9IF9fLm1hcEtleXMuY2FsbChfXywgdXRpbHMubWFrZVByb3RvRnVuY3Rpb24sIHRydWUpO1xuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIHByb3RvRnVuY3MpO1xuXG4vLyBhZGQgUHJvdG8gd3JhcHBlZCB2YWx1ZSBpbnN0YW5jZSBtZXRob2RzIHRvIFByb3RvIHByb3RvdHlwZVxudmFyIHByb3RvSW5zdGFuY2VNZXRob2RzID0gX18ubWFwS2V5cy5jYWxsKF9fLCB1dGlscy5tYWtlUHJvdG9JbnN0YW5jZU1ldGhvZCwgdHJ1ZSk7XG5fXy5leHRlbmRQcm90by5jYWxsKFByb3RvLCBwcm90b0luc3RhbmNlTWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbiB3aW5kb3dzIGVudmlyb25tZW50LCBhIGdsb2JhbCBgX2AgdmFsdWUgaXMgcHJlc2VydmVkIGluIGBfLnVuZGVyc2NvcmVgXG4gKi9cbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKSB7XG4gICAgLy8gcHJlc2VydmUgZXhpc3RpbmcgXyBvYmplY3RcbiAgICBpZiAod2luZG93Ll8pXG4gICAgICAgIFByb3RvLnVuZGVyc2NvcmUgPSB3aW5kb3cuX1xuXG4gICAgLy8gZXhwb3NlIGdsb2JhbCBfIGFuZCBQcm90b1xuICAgIHdpbmRvdy5fID0gUHJvdG87XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKVxuICAgIC8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBQcm90bztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKVxuICAgICwgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiAtIFtmaW5kXSgjZmluZClcbiAqIC0gW2ZpbmRJbmRleF0oI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XSgjYXBwZW5kQXJyYXkpXG4gKiAtIFtwcmVwZW5kQXJyYXldKCNwcmVwZW5kQXJyYXkpXG4gKiAtIFtzcGxpY2VJdGVtXSgjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKCN0b0FycmF5KVxuICogLSBbb2JqZWN0XSgjb2JqZWN0KVxuICogLSBbbWFwVG9PYmplY3RdKCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0oI3VuaXF1ZSlcbiAqIC0gW2RlZXBGb3JFYWNoXSgjZGVlcEZvckVhY2gpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pLlxuICovXG52YXIgYXJyYXlNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLy8gZmluZDogc2VlIGJlbG93XG4gICAgLy8gZmluZEluZGV4OiBzZWUgYmVsb3dcbiAgICBhcHBlbmRBcnJheTogYXBwZW5kQXJyYXksXG4gICAgcHJlcGVuZEFycmF5OiBwcmVwZW5kQXJyYXksXG4gICAgdG9BcnJheTogdG9BcnJheSxcbiAgICBvYmplY3Q6IG9iamVjdCxcbiAgICBtYXBUb09iamVjdDogbWFwVG9PYmplY3QsXG4gICAgdW5pcXVlOiB1bmlxdWUsXG4gICAgZGVlcEZvckVhY2g6IGRlZXBGb3JFYWNoLFxuICAgIHNwbGljZUl0ZW06IHNwbGljZUl0ZW1cbn07XG5cblxuLyoqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGluY2x1ZGVkIGZvciBjb252ZW5pZW5jZSAtIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCBhcnJheS1saWtlIG9iamVjdHMgYW5kIGZvciBjaGFpbmluZyAobmF0aXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCkuXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bykgdG9vLlxuICovXG52YXIgbmF0aXZlQXJyYXlNZXRob2RzTmFtZXMgPSBbICdqb2luJywgJ3BvcCcsICdwdXNoJywgJ2NvbmNhdCcsXG4gICAgJ3JldmVyc2UnLCAnc2hpZnQnLCAndW5zaGlmdCcsICdzbGljZScsICdzcGxpY2UnLFxuICAgICdzb3J0JywgJ2ZpbHRlcicsICdmb3JFYWNoJywgJ3NvbWUnLCAnZXZlcnknLFxuICAgICdtYXAnLCAnaW5kZXhPZicsICdsYXN0SW5kZXhPZicsICdyZWR1Y2UnLCAncmVkdWNlUmlnaHQnXTtcblxudmFyIG5hdGl2ZUFycmF5TWV0aG9kcyA9IG1hcFRvT2JqZWN0LmNhbGwobmF0aXZlQXJyYXlNZXRob2RzTmFtZXMsXG4gICAgICAgIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgICAgIH0pO1xuXG5fXy5leHRlbmQuY2FsbChhcnJheU1ldGhvZHMsIG5hdGl2ZUFycmF5TWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZCkgKG5hdGl2ZSBtZXRob2QgaXMgdXNlZCBpZiBhdmFpbGFibGUpLlxuICogUmV0dXJucyBhcnJheSBlbGVtZW50IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBhcnJheSB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBgaW5kZXhgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmRcbiAgICB8fCB1dGlscy5tYWtlRmluZE1ldGhvZChhcnJheU1ldGhvZHMuZm9yRWFjaCwgJ3ZhbHVlJyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZEluZGV4X18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kSW5kZXgpIChuYXRpdmUgbWV0aG9kIGlzIHVzZWQgaWYgYXZhaWxhYmxlKS5cbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFycmF5IGVsZW1lbnQgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgLTFgIGlmIG5vdCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIGFycmF5IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kSW5kZXggPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gICAgfHwgdXRpbHMubWFrZUZpbmRNZXRob2QoYXJyYXlNZXRob2RzLmZvckVhY2gsICdpbmRleCcpO1xuXG5cbi8qKlxuICogQXBwZW5kcyBgYXJyYXlUb0FwcGVuZGAgdG8gdGhlIGVuZCBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgYXBwZW5kZWRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBhcHBlbmRBcnJheShhcnJheVRvQXBwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb0FwcGVuZC5sZW5ndGgpIHJldHVybiB0aGlzO1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoYXJyYXlUb0FwcGVuZCkpXG4gICAgICAgIGFycmF5VG9BcHBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb0FwcGVuZCk7XG4gICAgXG4gICAgdmFyIGFyZ3MgPSBbdGhpcy5sZW5ndGgsIDBdLmNvbmNhdChhcnJheVRvQXBwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBQcmVwZW5kcyBgYXJyYXlUb1ByZXBlbmRgIHRvIHRoZSBiZWdpbm5pZyBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gcHJlcGVuZEFycmF5KGFycmF5VG9QcmVwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb1ByZXBlbmQubGVuZ3RoKSByZXR1cm4gdGhpcztcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFycmF5VG9QcmVwZW5kKSlcbiAgICAgICAgYXJyYXlUb1ByZXBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb1ByZXBlbmQpO1xuXG4gICAgdmFyIGFyZ3MgPSBbMCwgMF0uY29uY2F0KGFycmF5VG9QcmVwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGl0ZW0gZnJvbSBhcnJheSB0aGF0IGlzIGZvdW5kIHVzaW5nIGluZGV4T2YgKGkuZS4gJz09PScpXG4gKiBNb2RpZmllcyBvcmlnaW5hbCBhcnJheSBhbmQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGl0LlxuICogXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBtb2RpZmllZFxuICogQHBhcmFtICB7QW55fSBpdGVtIGl0ZW0gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHNwbGljZUl0ZW0oaXRlbSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgY3JlYXRlZCBmcm9tIGFycmF5LWxpa2Ugb2JqZWN0IChlLmcuLCBgYXJndW1lbnRzYCBwc2V1ZG8tYXJyYXkpLlxuICpcbiAqIEBwYXJhbSB7QXJyYXktbGlrZX0gc2VsZiBPYmplY3Qgd2l0aCBudW1lcmljIHByb3BlcnR5IGxlbmd0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIGFycmF5TWV0aG9kcy5zbGljZS5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBhcnJheSBvZiBga2V5c2AgYW5kIG9wdGlvbmFsIGFycmF5IG9mIGB2YWx1ZXNgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQXJyYXkgb2Yga2V5c1xuICogQHBhcmFtIHtBcnJheXxhbnl9IHZhbHVlcyBPcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgb3IgdGhlIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG9iamVjdCh2YWx1ZXMpIHtcbiAgICB2YXIgb2JqID0ge31cbiAgICAgICAgLCB2YWx1ZXNJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpO1xuICAgIGFycmF5TWV0aG9kcy5mb3JFYWNoLmNhbGwodGhpcywgZnVuY3Rpb24oa2V5LCBpbmRleCkge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlc0lzQXJyYXkgPyB2YWx1ZXNbaW5kZXhdIDogdmFsdWVzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbn1cblxuXG4vKipcbiAqIE1hcHMgYXJyYXkgdG8gb2JqZWN0LlxuICogQXJyYXkgZWxlbWVudHMgYmVjb21lIGtleXMsIHZhbHVlIGFyZSB0YWtlbiBmcm9tIGBjYWxsYmFja2AuXG4gKiBcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgd2hpY2ggdmFsdWVzIHdpbGwgYmVjb21lIGtleXMgb2YgdGhlIHJlc3VsdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYXBUb09iamVjdChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIHRoaXMpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGhvdXQgZHVwbGljYXRlcy4gRG9lcyBub3QgbW9kaWZ5IG9yaWdpbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgb3JpZ2luYWwgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNvbXBhcmlzb24gZnVuY3Rpb24sIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgZXF1YWwgaXRlbXMsIFwiPT09XCIgaXMgdXNlZCBpZiBub3QgcGFzc2VkLlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZShjYWxsYmFjaykge1xuICAgIHZhciBmaWx0ZXJlZCA9IFtdO1xuICAgIGlmICghIGNhbGxiYWNrKVxuICAgICAgICBpdGVtSW5kZXggPSBpdGVtSW5kZXhPZjtcblxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGl0ZW1JbmRleChpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgZmlsdGVyZWQucHVzaChpdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZDtcblxuXG4gICAgZnVuY3Rpb24gaXRlbUluZGV4KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWV0aG9kcy5maW5kSW5kZXguY2FsbChmaWx0ZXJlZCwgZnVuY3Rpb24oaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhpdGVtLCBpdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGl0ZW1JbmRleE9mKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkLmluZGV4T2YoaXRlbSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogSXRlcmF0ZXMgYXJyYXkgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIGFycmF5cyBjYWxsaW5nIGNhbGxiYWNrIHdpdGggZWFjaCBlbGVtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYXJndW1lbnRzIGxpc3QgdG8gYXZvaWQgY2hlY2tpbmcgd2hldGhlciBhcnJheSBvciBsaXN0IG9mIHBhcmFtZXRlcnMgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gc2VsZiBhcnJheSBvZiBlbGVtZW50cyBhbmQgYXJyYXlzdG8gaXRlcmF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxlZCBmb3IgZWFjaCBpdGVtIHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYWxsYmFjayBpcyBwYXNzZWQgaXRlbSwgaW5kZXggYW5kIG9yaWdpbmFsIGFycmF5IGFzIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge0FueX0gdGhpc0FyZyBvcHRpb25hbCBjYWxsYmFjayBlbnZvY2F0aW9uIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gZGVlcEZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgaW5kZXggPSAwLCBhcnIgPSB0aGlzO1xuICAgIF9kZWVwRm9yRWFjaC5jYWxsKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gX2RlZXBGb3JFYWNoKCkge1xuICAgICAgICBhcnJheU1ldGhvZHMuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgX2RlZXBGb3JFYWNoLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4KyssIGFycik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWFrZVByb3RvRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzJykubWFrZVByb3RvRnVuY3Rpb25cbiAgICAsIHJlcGVhdCA9IHJlcXVpcmUoJy4vcHJvdG9fdXRpbCcpLnJlcGVhdDtcblxuXG4vKipcbiAqIC0gW21ha2VGdW5jdGlvbl0oI21ha2VGdW5jdGlvbilcbiAqIC0gW3BhcnRpYWxdKCNwYXJ0aWFsKVxuICogLSBbcGFydGlhbFJpZ2h0XSgjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0oI21lbW9pemUpXG4gKiAtIFtkZWxheV0oI2RlbGF5KVxuICogLSBbZGVmZXJdKCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKCNkZWxheWVkKVxuICogLSBbZGVmZXJyZWRdKCNkZWZlcnJlZClcbiAqIC0gW2RlZmVyVGlja3NdKCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKCNkZWxheU1ldGhvZClcbiAqIC0gW2RlZmVyTWV0aG9kXSgjZGVmZXJNZXRob2QpXG4gKiAtIFtkZWJvdW5jZV0oI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKCN0aHJvdHRsZSlcbiAqIC0gW29uY2VdKCNvbmNlKVxuICogLSBbd2FpdEZvcl0oI3dhaXRGb3IpXG4gKiAtIFtub3RdKCNub3QpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pXG4gKi9cbnZhciBmdW5jdGlvbk1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYWtlRnVuY3Rpb246IG1ha2VGdW5jdGlvbixcbiAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgIHBhcnRpYWxSaWdodDogcGFydGlhbFJpZ2h0LFxuICAgIG1lbW9pemU6IG1lbW9pemUsXG4gICAgZGVsYXk6IGRlbGF5LFxuICAgIGRlZmVyOiBkZWZlcixcbiAgICBkZWxheWVkOiBkZWxheWVkLFxuICAgIGRlZmVycmVkOiBkZWZlcnJlZCxcbiAgICBkZWZlclRpY2tzOiBkZWZlclRpY2tzLFxuICAgIGRlbGF5TWV0aG9kOiBkZWxheU1ldGhvZCxcbiAgICBkZWZlck1ldGhvZDogZGVmZXJNZXRob2QsXG4gICAgZGVib3VuY2U6IGRlYm91bmNlLFxuICAgIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgICBvbmNlOiBvbmNlLFxuICAgIHdhaXRGb3I6IHdhaXRGb3IsXG4gICAgbm90OiBub3Rcbn07XG5cblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5cbi8qKlxuICogU2ltaWxhcmx5IHRvIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBmdW5jdGlvbiBmcm9tIGNvZGUuXG4gKiBVbmxpa2UgRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIG5hbWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuZXcgZnVuY3Rpb24gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGFyZzEsIGFyZzIsIC4uLiB0aGUgbmFtZXMgb2YgZnVuY3Rpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGZ1bmNCb2R5IGZ1bmN0aW9uIGJvZHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRnVuY3Rpb24oYXJnMSwgYXJnMiwgZnVuY0JvZHkpIHtcbiAgICB2YXIgbmFtZSA9IHRoaXNcbiAgICAgICAgLCBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxXG4gICAgICAgICwgZnVuY0JvZHkgPSBhcmd1bWVudHNbY291bnRdXG4gICAgICAgICwgZnVuY1xuICAgICAgICAsIGNvZGUgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspXG4gICAgICAgIGNvZGUgKz0gJywgJyArIGFyZ3VtZW50c1tpXTtcbiAgICBjb2RlID0gWydmdW5jID0gZnVuY3Rpb24gJywgbmFtZSwgJygnLCBjb2RlLnNsaWNlKDIpLCAnKSB7XFxuJ1xuICAgICAgICAgICAgICAgICwgZnVuY0JvZHksICdcXG59J10uam9pbignJyk7XG4gICAgZXZhbChjb2RlKTtcbiAgICByZXR1cm4gZnVuYztcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLCBidXQgcGFyYW1ldGVycyBhcmUgYXBwZW5kZWQgb24gdGhlIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBhcHBlbmRlZCBvbiB0aGUgcmlnaHQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbFJpZ2h0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykuY29uY2F0KGFyZ3MpKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHVzaW5nIHN1cHBsaWVkIGhhc2ggZnVuY3Rpb24gYXMga2V5LiBJZiB0aGUgaGFzaCBpcyBub3Qgc3VwcGxpZWQsIHVzZXMgaXRzIGZpcnN0IHBhcmFtZXRlciBhcyB0aGUgaGFzaC5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0byBiZSBtZW1vaXplZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzaEZ1bmMgb3B0aW9uYWwgaGFzaCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gbGltaXQgb3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLiAxMDAwIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gbWVtb2l6ZWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShoYXNoRnVuYywgbGltaXQpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGNhY2hlID0ge30sIGtleXNMaXN0ID0gW107XG4gICAgbGltaXQgPSBsaW1pdCB8fCAxMDAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIga2V5ID0gaGFzaEZ1bmMgPyBoYXNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtrZXldO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSBjYWNoZVtrZXldID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBrZXlzTGlzdC5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKGtleXNMaXN0Lmxlbmd0aCA+IGxpbWl0KVxuICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tleXNMaXN0LnNoaWZ0KCldO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIERlbGF5cyBmdW5jdGlvbiBleGVjdXRpb24gYnkgYSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KHdhaXQpIHsgLy8gLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIHdhaXQsIGFyZ3MpO1xufVxuIFxuXG4vKipcbiAqIERlZmVycyBmdW5jdGlvbiBleGVjdXRpb24gKGV4ZWN1dGVzIGFzIHNvb24gYXMgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlKVxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBkZWZlcigpIHsgLy8gLCBhcmd1bWVudHNcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIDEsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9kZWxheShmdW5jLCB3YWl0LCBhcmdzLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuYy5hcHBseS5iaW5kKGZ1bmMsIGNvbnRleHQgfHwgbnVsbCwgYXJncyksIHdhaXQpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgXy5kZWZlciwgdGFrZXMgZmlyc3QgYXJndW1lbnQgYXMgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlZmVycmVkXG4gKi9cbnZhciBkZWZlckZ1bmMgPSBtYWtlUHJvdG9GdW5jdGlvbihkZWZlcik7XG5cbi8qKlxuICogRGVmZXJzIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmb3IgYHRpbWVzYCB0aWNrcyAoZXhlY3V0ZXMgYWZ0ZXIgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlIGB0aW1lc2AgdGltZXMpXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0aWNrcyBudW1iZXIgb2YgdGltZXMgdG8gZGVmZXIgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmZXJUaWNrcyh0aWNrcykgeyAvLyAsIGFyZ3VtZW50c1xuICAgIGlmICh0aWNrcyA8IDIpIHJldHVybiBkZWZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBhcmdzID0gcmVwZWF0LmNhbGwoZGVmZXJGdW5jLCB0aWNrcyAtIDEpO1xuICAgIGFyZ3MgPSBhcmdzLmNvbmNhdCh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyBcbiAgICByZXR1cm4gZGVmZXJGdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG5cbi8qKlxuICogV29ya3MgbGlrZSBfLmRlbGF5IGJ1dCBhbGxvd3MgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2YgYHNlbGZgIHdoaWNoIHdpbGwgYmUgdGhlIGZpcnN0IF8uZGVsYXlNZXRob2QgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIGRlbGF5IG1ldGhvZCBjYWxsIG9mXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gZnVuY09yTWV0aG9kTmFtZSBmdW5jdGlvbiBvciBuYW1lIG9mIG1ldGhvZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFyZ3VtZW50cyB0byBwYXNzIHRvIG1ldGhvZFxuICovXG5mdW5jdGlvbiBkZWxheU1ldGhvZChmdW5jT3JNZXRob2ROYW1lLCB3YWl0KSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBfZGVsYXlNZXRob2QodGhpcywgZnVuY09yTWV0aG9kTmFtZSwgd2FpdCwgYXJncyk7XG59XG5cblxuLyoqXG4gKiBXb3JrcyBsaWtlIF8uZGVmZXIgYnV0IGFsbG93cyB0byBkZWZlciBtZXRob2QgY2FsbCBvZiBgc2VsZmAgd2hpY2ggd2lsbCBiZSB0aGUgZmlyc3QgXy5kZWZlck1ldGhvZCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2ZcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBmdW5jT3JNZXRob2ROYW1lIGZ1bmN0aW9uIG9yIG5hbWUgb2YgbWV0aG9kXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhcmd1bWVudHMgdG8gcGFzcyB0byBtZXRob2RcbiAqL1xuZnVuY3Rpb24gZGVmZXJNZXRob2QoZnVuY09yTWV0aG9kTmFtZSkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5TWV0aG9kKHRoaXMsIGZ1bmNPck1ldGhvZE5hbWUsIDEsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBfZGVsYXlNZXRob2Qob2JqZWN0LCBmdW5jT3JNZXRob2ROYW1lLCB3YWl0LCBhcmdzKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmdW5jID0gdHlwZW9mIGZ1bmNPck1ldGhvZE5hbWUgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBvYmplY3RbZnVuY09yTWV0aG9kTmFtZV1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2ROYW1lO1xuICAgICAgICBmdW5jLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgfSwgd2FpdCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgd2FpdGAgbXMgYWZ0ZXIgaXQgaGFzIGJlZW4gY2FsbGVkXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVsYXllZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVmZXJyZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWxheWVkKHdhaXQpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgLy8gLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgcGFzc0FyZ3MgPSBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gX2RlbGF5KGZ1bmMsIHdhaXQsIHBhc3NBcmdzLCB0aGlzKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb24gdGhlIG5leHQgdGljayBvbmNlIGl0IGhhcyBiZWVuIGNhbGxlZFxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICogQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRlZmVycmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gd2hpY2ggZXhlY3V0aW9uIGhhcyB0byBiZSBkZWZlcnJlZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZGVmZXJyZWQoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICAgICAgdmFyIHBhc3NBcmdzID0gYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgICAgcmV0dXJuIF9kZWxheShmdW5jLCAxLCBwYXNzQXJncywgdGhpcyk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCBvcmlnaW5hbCBmdW5jdGlvbiBvbmNlIGl0IGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGEgc3BlY2lmaWVkIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgdHJ1ZSB0byBpbnZva2UgZnVuY2l0b24gaW1tZWRpYXRlbHkgYW5kIHRoZW4gaWdub3JlIGZvbGxvd2luZyBjYWxscyBmb3Igd2FpdCBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZSh3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7IC8vIGZpcnN0IHBhcmFtZXRlciBvZiBfLmRlYm91bmNlXG4gICAgdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7IC8vIHN0b3JlIG9yaWdpbmFsIGNvbnRleHRcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgISB0aW1lb3V0O1xuICAgICAgICBpZiAoISB0aW1lb3V0KVxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdylcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICAgICAgICB2YXIgbGFzdCA9IERhdGUubm93KCkgLSB0aW1lc3RhbXA7XG4gICAgICAgICAgICBpZiAobGFzdCA8IHdhaXQpXG4gICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghIGltbWVkaWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2UgZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBge2xlYWRpbmc6IGZhbHNlfWAgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZSh3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzOyAvLyBmaXJzdCBwYXJhbWV0ZXIgb2YgXy50aHJvdHRsZVxuICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IERhdGUubm93KCk7XG4gICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIENhbGwgcGFzc2VkIGZ1bmN0aW9uIG9ubHkgb25jZVxuICogQHJldHVybiB7RnVuY3Rpb259IHNlbGZcbiAqL1xuZnVuY3Rpb24gb25jZSgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCByYW4gPSBmYWxzZVxuICAgICAgICAsIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAocmFuKSByZXR1cm4gbWVtbztcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgZnVuYyA9IG51bGw7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2hlbiB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWVcbiAqIGl0IHJ1bnMgdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiBldmVyeSBgY2hlY2tJbnRlcnZhbGAgbWlsbGlzZWNvbmRzIChkZWZhdWx0IDUwKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb246IGlmIGl0IHJldHVybnMgdHJ1ZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHJ1bnMgd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lb3V0IHRpbWVvdXQgYmVmb3JlIGdpdmluZyB1cCAodGltZSBpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lZE91dEZ1bmMgYSBmdW5jdGlvbiBjYWxsZWQgaWYgdGltZW91dCBpcyByZWFjaGVkXG4gKiBAcGFyYW0ge051bWJlcn0gY2hlY2tJbnRlcnZhbCB0aW1lIGludGVydmFsIHdoZW4geW91IHJ1biB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uICh0aW1lIGluIG1pbGxpc2Vjb25kcyksIGRlZmF1bHQgNTAgbXNcbiAqL1xuZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaywgbWF4VGltZW91dCwgdGltZWRPdXRGdW5jLCBjaGVja0ludGVydmFsKXtcbiAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBjb25kaXRpb24gPSB0aGlzO1xuICAgIGNoZWNrSW50ZXJ2YWwgPSBjaGVja0ludGVydmFsIHx8IDUwO1xuICAgIHZhciBpbnRlcnZhbCA9IHNldEludGVydmFsKHRlc3RDb25kaXRpb24sIGNoZWNrSW50ZXJ2YWwpO1xuXG4gICAgZnVuY3Rpb24gdGVzdENvbmRpdGlvbigpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbigpKSBjYWxsYmFjaygpO1xuICAgICAgICBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPj0gbWF4VGltZW91dClcbiAgICAgICAgICAgIHRpbWVkT3V0RnVuYyAmJiB0aW1lZE91dEZ1bmMoKTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgKCEgb3BlcmF0b3IpIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRvIG5lZ2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG5vdCgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gIWZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2lzTnVtZXJpY10oI2lzTnVtZXJpYylcbiAqL1xudmFyIG51bWJlck1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc051bWVyaWM6IGlzTnVtZXJpY1xufTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYSB2YWx1ZSBpcyBudW1lcmljXG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdG8gYmUgdGVzdGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMoKSB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHRoaXMpKSAmJiBpc0Zpbml0ZSh0aGlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5cbi8qKlxuICogLSBbZXh0ZW5kXSgjZXh0ZW5kKVxuICogLSBbY2xvbmVdKCNjbG9uZSlcbiAqIC0gW2RlZmluZVByb3BlcnR5XSgjZGVmaW5lUHJvcGVydHkpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0aWVzXSgjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKCNkZWVwRXh0ZW5kKVxuICogLSBbZGVlcENsb25lXSgjZGVlcENsb25lKVxuICogLSBba2V5c10oI2tleXMpXG4gKiAtIFthbGxLZXlzXSgjYWxsS2V5cylcbiAqIC0gW3ZhbHVlc10oI3ZhbHVlcylcbiAqIC0gW2tleU9mXSgja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKCNhbGxLZXlzT2YpXG4gKiAtIFtlYWNoS2V5XSgjZWFjaEtleSlcbiAqIC0gW21hcEtleXNdKCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10oI3JlZHVjZUtleXMpXG4gKiAtIFtmaWx0ZXJLZXlzXSgjZmlsdGVyS2V5cylcbiAqIC0gW3NvbWVLZXldKCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKCNldmVyeUtleSlcbiAqIC0gW2ZpbmRWYWx1ZV0oI2ZpbmRWYWx1ZSlcbiAqIC0gW2ZpbmRLZXldKCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKCNwaWNrS2V5cylcbiAqIC0gW29taXRLZXlzXSgjb21pdEtleXMpXG4gKiAtIFtpc0VxdWFsXSgjaXNFcXVhbClcbiAqIC0gW2lzTm90XSgjaXNOb3QpXG4gKlxuICogQWxsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKVxuICovXG52YXIgb2JqZWN0TWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIGNsb25lOiBjbG9uZSxcbiAgICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHksXG4gICAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWVwRXh0ZW5kOiBkZWVwRXh0ZW5kLFxuICAgIGRlZXBDbG9uZTogZGVlcENsb25lLFxuICAgIGtleXM6IGtleXMsXG4gICAgYWxsS2V5czogYWxsS2V5cyxcbiAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICBrZXlPZjoga2V5T2YsXG4gICAgYWxsS2V5c09mOiBhbGxLZXlzT2YsXG4gICAgZWFjaEtleTogZWFjaEtleSxcbiAgICBtYXBLZXlzOiBtYXBLZXlzLFxuICAgIHJlZHVjZUtleXM6IHJlZHVjZUtleXMsXG4gICAgZmlsdGVyS2V5czogZmlsdGVyS2V5cyxcbiAgICBzb21lS2V5OiBzb21lS2V5LFxuICAgIGV2ZXJ5S2V5OiBldmVyeUtleSxcbiAgICBwaWNrS2V5czogcGlja0tleXMsXG4gICAgb21pdEtleXM6IG9taXRLZXlzLFxuICAgIGlzRXF1YWw6IGlzRXF1YWwsXG4gICAgaXNOb3Q6IGlzTm90XG59O1xuXG5cbi8qKlxuICogIyMjI1Byb3BlcnR5IGRlc2NyaXB0b3IgY29uc3RhbnRzIyMjI1xuICogVGhlIHN1bSBvZiB0aGVzZSBjb25zdGFudHMgY2FuIGJlIHVzZWQgYXMgbGFzdCBwYXJhbWV0ZXIgb2YgZGVmaW5lUHJvcGVydHkgYW5kIGRlZmluZVByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHR5cGVzIG9mIHByb3BlcnRpZXMuXG4gKi9cbnZhciBjb25zdGFudHMgPSB7XG4gICAgRU5VTUVSQUJMRTogMSxcbiAgICBFTlVNOiAxLFxuICAgIENPTkZJR1VSQUJMRTogMixcbiAgICBDT05GOiAyLFxuICAgIFdSSVRBQkxFOiA0LFxuICAgIFdSSVQ6IDRcbn07XG5cbmRlZmluZVByb3BlcnR5LmNhbGwob2JqZWN0TWV0aG9kcywgJ19jb25zdGFudHMnLCBjb25zdGFudHMpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygb2JqZWN0IHByb3BlcnR5IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7QW55fVxuICovXG5vYmplY3RNZXRob2RzLmZpbmRWYWx1ZSA9IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGVhY2hLZXksICd2YWx1ZScpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRJbmRleF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZEluZGV4KS5cbiAqIFJldHVybnMgdGhlIGtleSBvZiBvYmplY3QgcHJvcGVydHkgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQgKHVubGlrZSBgZmluZEluZGV4YCwgdGhhdCByZXR1cm5zIC0xIGluIHRoaXMgY2FzZSkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xub2JqZWN0TWV0aG9kcy5maW5kS2V5ID0gdXRpbHMubWFrZUZpbmRNZXRob2QoZWFjaEtleSwgJ2tleScpO1xuXG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYHNlbGZgIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBgb2JqYCBjb3B5aW5nIGFsbCBvd24gcHJvcGVydGllcyAobm90IHRob3NlIGluaGVyaXRlZCB2aWEgcHJvdG90eXBlIGNoYWluKSwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgKHVubGVzcyBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkuXG4gKiBDcmVhdGVkIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzIGFzIHRoZSBwcm9wZXJ0aXMgb2YgYG9iamAuXG4gKiBSZXR1cm5zIGBzZWxmYCB0byBhbGxvdyBjaGFpbmluZyB3aXRoIG90aGVyIGZ1bmN0aW9ucy5cbiAqIENhbiBiZSB1c2VkIHdpdGggZnVuY3Rpb25zLCB0byBjb3B5IGNsYXNzIG1ldGhvZHMsIGUuZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gc2VsZlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBPcHRpb25hbCBmbGFnIHRvIHByZXZlbnQgY29weWluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCBgZmFsc2VgIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKG9iaiwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcblxuICAgIGVhY2hLZXkuY2FsbChvYmosIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIGRlc2NyaXB0b3JzW3Byb3BdID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgIH0sIHRoaXMsIG9ubHlFbnVtZXJhYmxlKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRlc2NyaXB0b3JzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIG9iamVjdCBgb2JqYCBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzczsgdGhlIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzLlxuICogVG8gY2xvbmUgYW4gYXJyYXkgdXNlXG4gKiBgYGBcbiAqIHZhciBjbG9uZWRBcnJheSA9IFtdLmNvbmNhdChhcnIpO1xuICogYGBgXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB0byBjbG9uZSBhbiBhcnJheSwgYmVjYXVzZSBpdCBpcyBpbmVmZmljaWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNsb25lKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMpKSByZXR1cm4gdGhpcy5zbGljZSgpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBEYXRlKHRoaXMpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzKTtcbiAgICB2YXIgY2xvbmVkT2JqZWN0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgZXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzKTtcbiAgICByZXR1cm4gY2xvbmVkT2JqZWN0O1xufVxuXG5cbi8qKlxuICogU3ludGF4IHN1Z2FyIHRvIHNob3J0ZW4gdXNhZ2Ugb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5KTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0eShvYmosICdrZXknLCB2YWx1ZSk7XG4gKiBgYGBcbiAqXG4gKiBUbyBkZWZpbmUgc29tZSBvdGhlciBwcm9wZXJ0aWVzIHVzZSBzdW0gb2YgdGhlIGZsYWdzIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYCk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydHkob2JqLCAna2V5JywgdmFsdWUsIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFkZGVkXG4gKiBAcGFyYW0ge0FueX0gdmFsdWUgdGhlIHZhbHVlIG9mIGFkZGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGRlY3JpcHRvckZsYWdzIGJpdCBtYXNrIG9mIHByb3BlcnR5IGRlc2NyaXB0b3IgcHJvcGVydGllcyBjb21wb3NlZCBmcm9tIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLFxuICAgICAgICBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHsgdmFsdWU6IHZhbHVlIH07XG4gICAgaWYgKGRlY3JpcHRvckZsYWdzKVxuICAgICAgICBleHRlbmQuY2FsbChkZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhISAoZGVjcmlwdG9yRmxhZ3MgJiBjb25zdGFudHMuRU5VTUVSQUJMRSksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5DT05GSUdVUkFCTEUpLFxuICAgICAgICAgICAgd3JpdGFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5XUklUQUJMRSlcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuXG4vKipcbiAqIFN5bnRheCBzdWdhciB0byBzaG9ydGVuIHVzYWdlIG9mIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnRpZXMpOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gKiAgICAga2V5MTogdmFsdWUxLFxuICogICAgIGtleTI6IHZhbHVlMlxuICogfSk7XG4gKiBgYGBcbiAqIFRvIGRlZmluZSBzb21lIG90aGVyIHByb3BlcnRpZXMgdXNlIHN1bSBvZiB0aGUgZmxhZ3MgYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICogICAgIGtleTE6IHZhbHVlMSxcbiAqICAgICBrZXkyOiB2YWx1ZTJcbiAqIH0sIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnR5VmFsdWVzIEEgbWFwIG9mIGtleXMgYW5kIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHRoYXR3aWxsIGJlIGFkZGVkLiBUaGUgZGVzY3JpcHRvcnMgb2YgcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtJbnRlZ2VyfSBkZWNyaXB0b3JGbGFncyBiaXQgbWFzayBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yIHByb3BlcnRpZXMgY29tcG9zZWQgZnJvbSBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMocHJvcGVydHlWYWx1ZXMsIGRlY3JpcHRvckZsYWdzKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0gbWFwS2V5cy5jYWxsKHByb3BlcnR5VmFsdWVzLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IodmFsdWUsIGRlY3JpcHRvckZsYWdzKTtcbiAgICB9LCB0cnVlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBgc2VsZmAgd2l0aCBwcm9wZXJ0aWVzIG9mIGBvYmpgIHRvIGFueSBkZXB0aCwgd2l0aG91dCBvdmVyd3J0aXRpbmcgZXhpc3Rpbmcgb2JqZWN0IHByb3BlcnRpZXMgb2YgYHNlbGZgIHdpdGggb2JqZWN0IHByb3BlcnRpZXMgb2YgYG9iamAuXG4gKiBTY2FsYXIgcHJvcGVydGllcyBvZiBgb2JqYCB3aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC4gU2NhbGFyIHBvcnBlcnRpZXMgb2YgYHNlbGZgIHdpbGwgYWxzbyBiZSBvdmVyd3JpdHRlbi5cbiAqIENvcnJlY3RseSB3b3JrcyB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgaW5uZXI6IHtcbiAqICAgICAgICAgYTogMVxuICogICAgIH1cbiAqIH07XG4gKlxuICogXy5kZWVwRXh0ZW5kKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTtcbiAqXG4gKiBhc3NlcnQuZGVlcEVxdWFsKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGE6IDEsXG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTsgLy8gYXNzZXJ0IHBhc3Nlc1xuICogYGBgXG4gKiBSZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byBjb3B5IHRvXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcEV4dGVuZChvYmosIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIF9leHRlbmRUcmVlKHRoaXMsIG9iaiwgb25seUVudW1lcmFibGUsIFtdKTtcbn1cblxuXG5mdW5jdGlvbiBfZXh0ZW5kVHJlZShzZWxmTm9kZSwgb2JqTm9kZSwgb25seUVudW1lcmFibGUsIG9ialRyYXZlcnNlZCkge1xuICAgIGlmIChvYmpUcmF2ZXJzZWQuaW5kZXhPZihvYmpOb2RlKSA+PSAwKSByZXR1cm47IC8vIG5vZGUgYWxyZWFkeSB0cmF2ZXJzZWQsIG9iaiBoYXMgcmVjdXJzaW9uXG5cbiAgICAvLyBzdG9yZSBub2RlIHRvIHJlY29nbmlzZSByZWN1cnNpb25cbiAgICBvYmpUcmF2ZXJzZWQucHVzaChvYmpOb2RlKTtcblxuICAgIHZhciBsb29wID0gQXJyYXkuaXNBcnJheShvYmpOb2RlKSA/IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoIDogZWFjaEtleTtcblxuICAgIGxvb3AuY2FsbChvYmpOb2RlLCBmdW5jdGlvbih2YWx1ZSwgcHJvcCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqTm9kZSwgcHJvcCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbFxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICBpZiAoISAoc2VsZk5vZGUuaGFzT3duUHJvcGVydHkocHJvcClcbiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZW9mIHNlbGZOb2RlW3Byb3BdID09ICdvYmplY3QnICYmIHNlbGZOb2RlW3Byb3BdICE9IG51bGwpKVxuICAgICAgICAgICAgICAgIHNlbGZOb2RlW3Byb3BdID0gKEFycmF5LmlzQXJyYXkodmFsdWUpKSA/IFtdIDoge307XG4gICAgICAgICAgICBfZXh0ZW5kVHJlZShzZWxmTm9kZVtwcm9wXSwgdmFsdWUsIG9ubHlFbnVtZXJhYmxlLCBvYmpUcmF2ZXJzZWQpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmTm9kZSwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgfSwgdGhpcywgb25seUVudW1lcmFibGUpO1xuXG4gICAgcmV0dXJuIHNlbGZOb2RlO1xufVxuXG5cbi8qKlxuICogQ2xvbmVzIGFsbCBvYmplY3QgdHJlZS4gQ2xhc3Mgb2Ygb3JpZ2luYWwgb2JqZWN0IGlzIG5vdCBwcmVzZXJ2ZWQuIFJldHVybnMgYHNlbGZgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcENsb25lKG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUodGhpcyk7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiBuZXcgUmVnRXhwKHRoaXMpO1xuICAgIHZhciBjbG9uZWRPYmplY3QgPSBBcnJheS5pc0FycmF5KHRoaXMpID8gW10gOiB7fTtcbiAgICBkZWVwRXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgcmV0dXJuIGNsb25lZE9iamVjdDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gcmV0dXJuIGtleXMgb2ZcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBrZXlzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBrZXlzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHJldHVybiB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgYWxsIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCBgc2VsZmAgKGluY2x1ZGluZyBub24tZW51bWVyYmFsZSkuXG4gKiBUbyBnZXQgb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIHVzZSBgT2JqZWN0LmtleXMoKWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGdldCBhbGwgcHJvcGVydGllcyBvZi5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG4gZnVuY3Rpb24gYWxsS2V5cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcyk7XG4gfVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgYGluZGV4T2ZgIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBSZXR1cm5zIHRoZSBga2V5YCBvZiBgc2VhcmNoRWxlbWVudGAgaW4gdGhlIG9iamVjdCBgc2VsZmAuXG4gKiBBcyBvYmplY3Qga2V5cyBhcmUgdW5zb3J0ZWQsIGlmIHRoZXJlIGFyZSBzZXZlcmFsIGtleXMgdGhhdCBob2xkIGBzZWFyY2hFbGVtZW50YCBhbnkgb2YgdGhlbSBjYW4gYmUgcmV0dXJuZWQuIFVzZSBgYWxsS2V5c09mYCB0byByZXR1cm4gYWxsIGtleXMuXG4gKiBBbGwgb3duIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIChub3QgdGhvc2UgaW5oZXJpdGVkIHZpYSBwcm90b3R5cGUgY2hhaW4pLCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyAodW5sZXNzIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gc2VhcmNoIGEgdmFsdWUgaW5cbiAqIEBwYXJhbSB7QW55fSBzZWFyY2hFbGVtZW50IEFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBBbiBleGFjdCBlcXVhbGl0eSBpcyB0ZXN0ZWQsIHNvIGAwYCBpcyBub3QgdGhlIHNhbWUgYXMgYCcwJ2AuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIHRydWUgdG8gc2VhcmNoIGFtb25nIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBrZXlPZihzZWFyY2hFbGVtZW50LCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wZXJ0aWVzW2ldXSlcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFdvcmtzIHNpbWlsYXJseSB0byB0aGUgcHJldmlvdXMgZnVuY3Rpb24sIGJ1dCByZXR1cm5zIHRoZSBhcnJheSBvZiBrZXlzIGhvbGRpbmcgYHNlYXJjaEVsZW1lbnRgIGFzIHRoZWlyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBzZWFyY2ggYSB2YWx1ZSBpblxuICogQHBhcmFtIHtBbnl9IHNlYXJjaEVsZW1lbnQgQW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgc2VhcmNoZWQuIEFuIGV4YWN0IGVxdWFsaXR5IGlzIHRlc3RlZCwgc28gYDBgIGlzIG5vdCB0aGUgc2FtZSBhcyBgJzAnYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgdHJ1ZSB0byBzZWFyY2ggYW1vbmcgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBhbGxLZXlzT2Yoc2VhcmNoRWxlbWVudCwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBrZXlzID0gcHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBrZXlzO1xufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW2ZvckVhY2hdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBJdGVyYXRlcyBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpIGNhbGxpbmcgY2FsbGJhY2sgZm9yIGVhY2gga2V5LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYXJyYXlzLCBpdCB3aWxsIGluY2x1ZGUgYGxlbmd0aGAgcHJvcGVydHkgaW4gaXRlcmF0aW9uLlxuICogVG8gaXRlcmF0ZSBhcnJheS1saWtlIG9iamVjdHMgKGUuZy4sIGBhcmd1bWVudHNgIHBzZXVkby1hcnJheSkgdXNlOlxuICogYGBgXG4gKiBfLmZvckVhY2goYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqIEZ1bmN0aW9uIHJldHVybnMgYHNlbGZgIHRvIGFsbG93IFtjaGFpbmluZ10ocHJvdG8uanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCwgaXRzIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqL1xuZnVuY3Rpb24gZWFjaEtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFttYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIGNhbGxiYWNrIHRvIHZhbHVlcyBpbiBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpLlxuICogVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHRoZSBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgc2VsZmAuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGFycmF5cywgaXQgd2lsbCBpbmNsdWRlIGBsZW5ndGhgIHByb3BlcnR5IGluIGl0ZXJhdGlvbi5cbiAqIFRvIG1hcCBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5tYXAoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFwS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgbWFwUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuXG4gICAgZnVuY3Rpb24gbWFwUHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldLnZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbcmVkdWNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9SZWR1Y2UpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBUaGlzIG1ldGhvZCByZWR1Y2VzIHRoZSBvYmplY3QgdG8gYSBzaW5nbGUgdmFsdWUuIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBvc3NpYmxlIHRvIGNvbnRyb2wgd2l0aCBvYmplY3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhcnJheXMsIGl0IHdpbGwgaW5jbHVkZSBgbGVuZ3RoYCBwcm9wZXJ0eSBpbiBpdGVyYXRpb24uXG4gKiBUbyByZWR1Y2UgYXJyYXktbGlrZSBvYmplY3RzIHVzZTpcbiAqIGBgYFxuICogdmFyIHJlc3VsdCA9IF8ucmVkdWNlKGFyZ3VtZW50cywgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHByZXZpb3VzVmFsdWVgLCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFuZCBzaG91bGQgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBgcHJldmlvdXNWYWx1ZWAgZm9yIHRoZSBuZXh0IGBjYWxsYmFja2AgY2FsbC5cbiAqIEBwYXJhbSB7QW55fSBpbml0aWFsVmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb24gdGhlIGZpcnN0IGNhbGwuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUtleXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBtZW1vID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgbWVtbyA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgbWVtbywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbWVtbztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtmaWx0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlcikgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG5ldyBvYmplY3Qgd2l0aCBrZXlzIGZvciB3aGljaCBjYWxsYmFjayByZXR1cm5zIHRydWUuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRvIGZpbHRlciBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5maWx0ZXIoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYC4gSWYgaXQgcmV0dXJucyB0cnV0aHkgdmFsdWUsIHRoZSBrZXkvdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgZmlsdGVyUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpOztcblxuICAgIGZ1bmN0aW9uIGZpbHRlclByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgIH1cbn1cblxuXG52YXIgX3Bhc3NlZCA9IHt9XG4gICAgLCBfZGlkTm90UGFzcyA9IHt9O1xuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtzb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLiBJZiBpdCByZXR1cm5zIHRydXRoeSB2YWx1ZSwgdGhlIGZ1bmN0aW9uIGltbWVhZGl0ZWx5IHJldHVybnMgYHRydWVgLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc29tZUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX3Bhc3NlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgdGhyb3cgdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdGVzdFByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfcGFzc2VkO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtldmVyeV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAuIElmIGl0IHJldHVybnMgZmFsc3kgdmFsdWUsIHRoZSBmdW5jdGlvbiBpbW1lYWRpdGVseSByZXR1cm5zIGBmYWxzZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBldmVyeUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX2RpZE5vdFBhc3MpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB0aHJvdyB0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGZ1bmN0aW9uIHRlc3RQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGlmICghIGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfZGlkTm90UGFzcztcbiAgICB9XG59XG5cblxudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGVcbiAgICAsIGNvbmNhdCA9IEFycmF5UHJvdG8uY29uY2F0O1xuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRoIG9ubHkgc3BlY2lmaWVkIGtleXMsIHRoYXQgYXJlIHBhc3NlZCBhcyBzdHJpbmcgcGFyYW1ldGVycyBvciBhcnJheShzKSBvZiBrZXlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIGFuIG9iamVjdCB0byBwaWNrIGtleXMgZnJvbVxuICogQHBhcmFtIHtMaXN0W1N0cmluZ3xBcnJheV19IGFyZ3VtZW50cyBsaXN0IG9mIGtleXMgKG9yIGFycmF5KHMpIG9mIGtleXMpXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHBpY2tLZXlzKCkgeyAvLyAsIC4uLiBrZXlzXG4gICAgdmFyIGtleXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgYXJndW1lbnRzKVxuICAgICAgICAsIG9iaiA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIG9ialtrZXldID0gdGhpc1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRob3V0IHNwZWNpZmllZCBrZXlzLCB0aGF0IGFyZSBwYXNzZWQgYXMgc3RyaW5nIHBhcmFtZXRlcnMgb3IgYXJyYXkocykgb2Yga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBhbiBvYmplY3QgdG8gb21pdCBrZXlzIGluXG4gKiBAcGFyYW0ge0xpc3RbU3RyaW5nfEFycmF5XX0gYXJndW1lbnRzIGxpc3Qgb2Yga2V5cyAob3IgYXJyYXkocykgb2Yga2V5cylcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gb21pdEtleXMoKSB7IC8vICwgLi4uIGtleXNcbiAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBhcmd1bWVudHMpXG4gICAgICAgICwgb2JqID0gY2xvbmUuY2FsbCh0aGlzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBQZXJmb3JtcyBkZWVwIGVxdWFsaXR5IHRlc3Qgb2YgdGhlIG9iamVjdC4gRG9lcyBub3Qgd29yayB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iaikge1xuICAgIGlmICh0aGlzID09PSBvYmopIHJldHVybiB0aGlzICE9PSAwIHx8IDEvdGhpcyA9PSAxL29iajsgLy8gMCBhbmQgLTAgYXJlIGNvbnNpZGVyZWQgbm90IGVxdWFsLCBhbHRob3VnaCAwID09PSAtMCBpcyB0cnVlXG4gICAgaWYgKHRoaXMgPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKGNsYXNzTmFtZSAhPSBvYmouY29uc3RydWN0b3IubmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBTdHJpbmcob2JqKTtcbiAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzICE9ICt0aGlzID8gb2JqICE9ICtvYmogOiAodGhpcyA9PSAwID8gMS90aGlzID09IDEvb2JqIDogdGhpcyA9PSArb2JqKTtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuICt0aGlzID09ICtvYmo7XG4gICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UgPT0gb2JqLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmdsb2JhbCA9PSBvYmouZ2xvYmFsXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubXVsdGlsaW5lID09IG9iai5tdWx0aWxpbmVcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pZ25vcmVDYXNlID09IG9iai5pZ25vcmVDYXNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMgIT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSBvYmoubGVuZ3RoXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5ldmVyeShmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcXVhbC5jYWxsKGl0ZW0sIG9ialtpbmRleF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxsS2V5cy5jYWxsKHRoaXMpLmxlbmd0aCA9PSBhbGxLZXlzLmNhbGwob2JqKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAmJiBldmVyeUtleS5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXF1YWwuY2FsbCh2YWx1ZSwgb2JqW2tleV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBpc0VxdWFsXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vdChvYmopIHtcbiAgICByZXR1cm4gIWlzRXF1YWwuY2FsbCh0aGlzLCBvYmopO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2V4dGVuZFByb3RvXSgjZXh0ZW5kUHJvdG8pXG4gKiAtIFtjcmVhdGVTdWJjbGFzc10oI2NyZWF0ZVN1YmNsYXNzKVxuICogLSBbbWFrZVN1YmNsYXNzXSgjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKCNuZXdBcHBseSlcbiAqXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bylcbiAqL1xudmFyIHByb3RvdHlwZU1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBleHRlbmRQcm90bzogZXh0ZW5kUHJvdG8sXG4gICAgY3JlYXRlU3ViY2xhc3M6IGNyZWF0ZVN1YmNsYXNzLFxuICAgIG1ha2VTdWJjbGFzczogbWFrZVN1YmNsYXNzLFxuICAgIG5ld0FwcGx5OiBuZXdBcHBseVxufTtcblxuXG52YXIgX18gPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5fXy5leHRlbmQuY2FsbChfXywgcmVxdWlyZSgnLi9wcm90b19mdW5jdGlvbicpKTtcblxuXG4vKipcbiAqIEFkZHMgbm9uLWVudW1lcmFibGUsIG5vbi1jb25maWd1cmFibGUgYW5kIG5vbi13cml0YWJsZSBwcm9wZXJ0aWVzIHRvIHRoZSBwcm90b3R5cGUgb2YgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogZnVuY3Rpb24gTXlDbGFzcygpIHt9XG4gKiBfLmV4dGVuZFByb3RvKE15Q2xhc3MsIHtcbiAqICAgICBtZXRob2QxOiBmdW5jdGlvbigpIHt9LFxuICogICAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkge31cbiAqIH0pO1xuICogYGBgXG4gKiBUbyBleHRlbmQgY2xhc3MgdmlhIG9iamVjdDpcbiAqIGBgYFxuICogXy5leHRlbmRQcm90byhvYmouY29uc3RydWN0b3IsIG1ldGhvZHMpO1xuICogYGBgXG4gKiBSZXR1cm5zIHBhc3NlZCBjb25zdHJ1Y3Rvciwgc28gZnVuY3Rpb25zIF8uZXh0ZW5kUHJvdG8sIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKSBhbmQgXy5tYWtlU3ViY2xhc3MgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKS4gXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgYSBtYXAgb2YgZnVuY3Rpb25zLCBrZXlzIHdpbGwgYmUgaW5zdGFuY2UgbWV0aG9kcyAocHJvcGVydGllcyBvZiB0aGUgY29uc3RydWN0b3IgcHJvdG90eXBlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGV4dGVuZFByb3RvKG1ldGhvZHMpIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3JzID0ge307XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwobWV0aG9kcywgZnVuY3Rpb24obWV0aG9kLCBuYW1lKSB7XG4gICAgICAgIHByb3BEZXNjcmlwdG9yc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXRob2RcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMucHJvdG90eXBlLCBwcm9wRGVzY3JpcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzdWJjbGFzcyBvZiBjbGFzcyBgdGhpc0NsYXNzYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGhhdmUgc3BlY2lmaWVkIGBuYW1lYCBpZiBzdXBwbGllZC5cbiAqIFRoZSBjb25zdHJ1Y3RvciBvZiBzdXBlcmNsYXNzIHdpbGwgYmUgY2FsbGVkIGluIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGJ5IGRlZmF1bHQgdW5sZXNzIGBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZWAgKG5vdCBqdXN0IGZhbHN5KS5cbiAqIENvcGllcyBgdGhpc0NsYXNzYCBjbGFzcyBtZXRob2RzIHRvIGNyZWF0ZWQgc3ViY2xhc3MuIEZvciB0aGVtIHRvIHdvcmsgY29ycmVjdGx5IHRoZXkgc2hvdWxkIHVzZSBgdGhpc2AgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIHJhdGhlciB0aGFuIGV4cGxpY2l0IHN1cGVyY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0byBtYWtlIHN1YmNsYXNzIG9mXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5Q29uc3RydWN0b3IgT3B0aW9uYWwgZmFsc2UgdmFsdWUgKG5vdCBmYWxzeSkgdG8gcHJldmVudCBjYWxsIG9mIGluaGVyaXRlZCBjb25zdHJ1Y3RvciBpbiB0aGUgY29uc3RydWN0b3Igb2Ygc3ViY2xhc3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjcmVhdGVTdWJjbGFzcyhuYW1lLCBhcHBseUNvbnN0cnVjdG9yKSB7XG4gICAgdmFyIHRoaXNDbGFzcyA9IHRoaXM7XG4gICAgdmFyIHN1YmNsYXNzO1xuXG4gICAgLy8gbmFtZSBpcyBvcHRpb25hbFxuICAgIG5hbWUgPSBuYW1lIHx8ICcnO1xuXG4gICAgLy8gYXBwbHkgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvclxuICAgIHZhciBjb25zdHJ1Y3RvckNvZGUgPSBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiAndGhpc0NsYXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7JztcblxuICAgIGV2YWwoJ3N1YmNsYXNzID0gZnVuY3Rpb24gJyArIG5hbWUgKyAnKCl7ICcgKyBjb25zdHJ1Y3RvckNvZGUgKyAnIH0nKTtcblxuICAgIG1ha2VTdWJjbGFzcy5jYWxsKHN1YmNsYXNzLCB0aGlzQ2xhc3MpO1xuXG4gICAgLy8gY29weSBjbGFzcyBtZXRob2RzXG4gICAgLy8gLSBmb3IgdGhlbSB0byB3b3JrIGNvcnJlY3RseSB0aGV5IHNob3VsZCBub3QgZXhwbGljdGx5IHVzZSBzdXBlcmNsYXNzIG5hbWVcbiAgICAvLyBhbmQgdXNlIFwidGhpc1wiIGluc3RlYWRcbiAgICBfXy5kZWVwRXh0ZW5kLmNhbGwoc3ViY2xhc3MsIHRoaXNDbGFzcywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gc3ViY2xhc3M7XG59XG5cblxuLyoqXG4gKiBTZXRzIHVwIHByb3RvdHlwZSBjaGFpbiB0byBjaGFuZ2UgYHRoaXNDbGFzc2AgKGEgY29uc3RydWN0b3IgZnVuY3Rpb24pIHNvIHRoYXQgaXQgYmVjb21lcyBhIHN1YmNsYXNzIG9mIGBTdXBlcmNsYXNzYC5cbiAqIFJldHVybnMgYHRoaXNDbGFzc2Agc28gaXQgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKSB3aXRoIF8uZXh0ZW5kUHJvdG8gYW5kIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0aGF0IHdpbGwgYmVjb21lIGEgc3ViY2xhc3Mgb2YgU3VwZXJjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gU3VwZXJjbGFzcyBBIGNsYXNzIHRoYXQgd2lsbCBiZWNvbWUgYSBzdXBlcmNsYXNzIG9mIHRoaXNDbGFzc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG1ha2VTdWJjbGFzcyhTdXBlcmNsYXNzKSB7XG4gICAgLy8gcHJvdG90eXBlIGNoYWluXG4gICAgdGhpcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyY2xhc3MucHJvdG90eXBlKTtcbiAgICBcbiAgICAvLyBzdWJjbGFzcyBpZGVudGl0eVxuICAgIGV4dGVuZFByb3RvLmNhbGwodGhpcywge1xuICAgICAgICBjb25zdHJ1Y3RvcjogdGhpc1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ2FsbHMgY29uc3RydWN0b3IgYHRoaXNgIHdpdGggYXJndW1lbnRzIHBhc3NlZCBhcyBhcnJheVxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheS1saWtlfSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIG5ld0FwcGx5KGFyZ3MpIHtcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFyZ3MpKVxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7XG4gICAgLy8gXCJudWxsXCIgaXMgY29udGV4dCB0byBwYXNzIHRvIGNsYXNzIGNvbnN0cnVjdG9yLCBmaXJzdCBwYXJhbWV0ZXIgb2YgYmluZFxuICAgIHZhciBhcmdzID0gW251bGxdLmNvbmNhdChhcmdzKTtcbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBhcmdzKSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKTtcblxuXG4vKipcbiAqIC0gW2ZpcnN0VXBwZXJDYXNlXSgjZmlyc3RVcHBlckNhc2UpXG4gKiAtIFtmaXJzdExvd2VyQ2FzZV0oI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKCN0b1JlZ0V4cClcbiAqIC0gW3RvRnVuY3Rpb25dKCN0b0Z1bmN0aW9uKVxuICogLSBbdG9EYXRlXSgjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10oI3RvUXVlcnlTdHJpbmcpXG4gKiAtIFtmcm9tUXVlcnlTdHJpbmddKCNmcm9tUXVlcnlTdHJpbmcpXG4gKiAtIFtqc29uUGFyc2VdKCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0oI2hhc2hDb2RlKVxuICogLSBbdW5QcmVmaXhdKCN1blByZWZpeClcbiAqL1xuIHZhciBzdHJpbmdNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmlyc3RVcHBlckNhc2U6IGZpcnN0VXBwZXJDYXNlLFxuICAgIGZpcnN0TG93ZXJDYXNlOiBmaXJzdExvd2VyQ2FzZSxcbiAgICB0b1JlZ0V4cDogdG9SZWdFeHAsXG4gICAgdG9GdW5jdGlvbjogdG9GdW5jdGlvbixcbiAgICB0b0RhdGU6IHRvRGF0ZSxcbiAgICB0b1F1ZXJ5U3RyaW5nOiB0b1F1ZXJ5U3RyaW5nLFxuICAgIGZyb21RdWVyeVN0cmluZzogZnJvbVF1ZXJ5U3RyaW5nLFxuICAgIGpzb25QYXJzZToganNvblBhcnNlLFxuICAgIGhhc2hDb2RlOiBoYXNoQ29kZSxcbiAgICB1blByZWZpeDogdW5QcmVmaXhcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhbmdlZCB0byB1cHBlciBjYXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIEEgc3RyaW5nIHRoYXQgd2lsbCBoYXZlIGl0cyBmaXJzdCBjaGFyYWN0ZXIgcmVwbGFjZWRcbiAqL1xuZnVuY3Rpb24gZmlyc3RVcHBlckNhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMgPyB0aGlzWzBdLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnNsaWNlKDEpIDogdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgQSBzdHJpbmcgdGhhdCB3aWxsIGhhdmUgaXRzIGZpcnN0IGNoYXJhY3RlciByZXBsYWNlZFxuICovXG5mdW5jdGlvbiBmaXJzdExvd2VyQ2FzZSgpIHtcbiAgICByZXR1cm4gdGhpcyA/IHRoaXNbMF0udG9Mb3dlckNhc2UoKSArIHRoaXMuc2xpY2UoMSkgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgUmVnRXhwIGJhY2sgdG8gUmVnRXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgc3RyaW5nIGNvbnRhaW5pbmcgcmVndWxhciBleHByZXNzaW9uIGluY2x1ZGluZyBlbmNsb3NpbmcgXCIvXCIgc3ltYm9scyBhbmQgZmxhZ3NcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gdG9SZWdFeHAoKSB7XG4gICAgdmFyIHJ4ID0gdGhpcy5tYXRjaChyZWdleHBTdHJpbmdQYXR0ZXJuKTtcbiAgICBpZiAocngpIHJldHVybiBuZXcgUmVnRXhwKHJ4WzFdLCByeFsyXSk7XG59XG52YXIgcmVnZXhwU3RyaW5nUGF0dGVybiA9IC9eXFwvKC4qKVxcLyhbZ2lteV0qKSQvO1xuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgZnVuY3Rpb24gYmFjayB0byBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyBjb250YWluaW5nIGZ1bGwgZnVuY3Rpb24gY29kZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb24oKSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgdmFyIGNvZGUgPSAnZnVuYyA9ICcgKyB0aGlzICsgJzsnO1xuICAgIHRyeSB7XG4gICAgICAgIGV2YWwoY29kZSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIGRhdGUgaW4gYSBzYWZlIHdheSBzbyB0aGF0IHRoZSByZXNpdWx0IGlzIHVuZGVmaW5lZCBpZiBkYXRlIGlzIGludmFsaWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xEYXRlfSBzZWxmIHN0cmluZyBvciBkYXRlIG9iamVjdCB0byBjb252ZXJ0IHRvIFZBTElEIGRhdGVcbiAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgaWYgKCEgdGhpcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUodGhpcyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICBpZiAoZGF0ZSAmJiBkYXRlLmdldFRpbWUgJiYgIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSlcbiAgICAgICAgcmV0dXJuIGRhdGU7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IHBhcmFtcyBvYmplY3QgdG8gYSB1cmwgc3R5bGUgcXVlcnkgc3RyaW5nICh3aXRob3V0IFwiP1wiKVxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBUaGUgb2JqZWN0IGhhc2ggdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGUgb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBlbmNvZGUgZGF0YSwgZW5jb2RlVVJJQ29tcG9uZW50IGlzIHVzZWQgaWYgbm90IHNwZWNpZmllZFxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b1F1ZXJ5U3RyaW5nKGVuY29kZSkge1xuICAgIHZhciBxcyA9ICcnXG4gICAgICAgICwgcGFyYW1zID0gdGhpcyB8fCB7fVxuICAgICAgICAsIGVuY29kZSA9IGVuY29kZSB8fCBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwocGFyYW1zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHFzICs9IGtleSArICc9JyArIGVuY29kZSh2YWx1ZSkgKyAnJic7XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHFzLnNsaWNlKDAsIC0xKTtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgdXJsIHN0eWxlIHF1ZXJ5IHN0cmluZyAod2l0aG91dCBcIj9cIikgaW50byBvYmplY3QgaGFzaFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGVjb2RlIG9wdGlvbmFsIGRlY29kZSBmdW5jdGlvbiwgZGVjb2RlVVJJQ29tcG9uZW50IHdpbGwgYmUgdXNlZCBpZiBub3Qgc3VwcGxpZWRcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyBvYmplY3QgaGFzaFxuICovXG5mdW5jdGlvbiBmcm9tUXVlcnlTdHJpbmcoZGVjb2RlKSB7XG4gICAgdmFyIHBhaXJzID0gdGhpcy5zcGxpdCgnJicpXG4gICAgICAgICwgcmVzdWx0cyA9IHt9XG4gICAgICAgICwgZGVjb2RlID0gZGVjb2RlIHx8IGRlY29kZVVSSUNvbXBvbmVudDtcblxuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgc3BsaXRQYWlyID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgICBpZiAoc3BsaXRQYWlyLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgICAgdmFyIGtleSA9IHNwbGl0UGFpclswXVxuICAgICAgICAgICAgLCB2YWx1ZSA9IGRlY29kZShzcGxpdFBhaXJbMV0gfHwgJycpO1xuICAgICAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgICAgICByZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5cbi8qKlxuICogU2FmZSBKU09OLnBhcnNlLCByZXR1cm5zIHVuZGVmaW5lZCBpZiBKU09OLnBhcnNlIHRocm93cyBhbiBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGpzb25QYXJzZSgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7fVxufVxuXG5cbi8qKlxuICogRGFuIEJlcm5zdGVpbidzIGFsZ29yeXRobSB0byBjcmVhdGUgaGFzaCBmcm9tIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyB0byBjb252ZXJ0IHRvIGhhc2hcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gaGFzaENvZGUoKSB7XG4gICAgdmFyIGhhc2ggPSA1MzgxXG4gICAgICAgICwgc3RyID0gdGhpc1xuICAgICAgICAsIGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyBjaGFyOyAvKiBoYXNoICogMzMgKyBjICovXG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBnaXZlbiBwcmVmaXggZnJvbSB0aGUgc3RyaW5nLiBJZiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gZnJvbSB0aGUgcHJlZml4LCByZXR1cm5zIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB1blByZWZpeChzdHIpIHtcbiAgICBpZiAodGhpcy5pbmRleE9mKHN0cikgPT0gMClcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzdHIsICcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiAtIFt0aW1lc10oI3RpbWVzKVxuICogLSBbcmVwZWF0XSgjcmVwZWF0KVxuICogLSBbdGFwXSgjdGFwKVxuICogLSBbcmVzdWx0XSgjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XSgjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXSgjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgdGltZXM6IHRpbWVzLFxuICAgIHJlcGVhdDogcmVwZWF0LFxuICAgIHRhcDogdGFwLFxuICAgIHJlc3VsdDogcmVzdWx0LFxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgY29tcGFyZVByb3BlcnR5OiBjb21wYXJlUHJvcGVydHksXG4gICAgbm9vcDogbm9vcFxufTtcblxuXG4vKipcbiAqIENhbGxzIGBjYWxsYmFja2AgYHNlbGZgIHRpbWVzIHdpdGggYHRoaXNBcmdgIGFzIGNvbnRleHQuIENhbGxiYWNrIGlzIHBhc3NlZCBpdGVyYXRpb24gaW5kZXggZnJvbSAwIHRvIGBzZWxmLTFgXG4gKiBcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc2VsZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7QW55fSB0aGlzQXJnXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdGltZXMoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gQXJyYXkoTWF0aC5tYXgoMCwgdGhpcykpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpczsgaSsrKVxuICAgICAgICBhcnJbaV0gPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGkpO1xuICAgIHJldHVybiBhcnI7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IHJlcGVhdGVkIGB0aW1lc2AgdGltZXNcbiAqIEBwYXJhbSAge0FueX0gc2VsZlxuICogQHBhcmFtICB7SW50ZWdlcn0gdGltZXNcbiAqIEByZXR1cm4ge0FycmF5W0FueV19XG4gKi9cbmZ1bmN0aW9uIHJlcGVhdCh0aW1lcykge1xuICAgIHZhciBhcnIgPSBBcnJheShNYXRoLm1heCgwLCB0aW1lcykpOztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgIGFycltpXSA9IHRoaXM7XG4gICAgcmV0dXJuIGFycjtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRhcCBpbnRvIGNoYWluZWQgbWV0aG9kcyBhbmQgdG8gaW5zcGVjdCBpbnRlcm1lZGlhcnkgcmVzdWx0XG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdGhhdCdzIHBhc3NlZCBiZXR3ZWVuIGNoYWluZWQgbWV0aG9kc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHZhbHVlIChib3RoIGFzIGNvbnRleHQgYW5kIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIpXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHRhcChmdW5jKSB7XG4gICAgZnVuYy5jYWxsKHRoaXMsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIENhbGxzIGZ1bmN0aW9uIGBzZWxmYCAoZmlyc3QgcGFyYW1ldGVyIG9mIF8ucmVzdWx0KSB3aXRoIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFueX0gc2VsZlxuICogQHBhcmFtIHtBbnl9IHRoaXNBcmcgY29udGV4dFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgZXh0cmEgYXJndW1lbnRzXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlc3VsdCh0aGlzQXJnKSB7IC8vLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGhpcy5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICAgICAgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBzZWxmLiBVc2VmdWwgZm9yIHVzaW5nIGFzIGFuIGl0ZXJhdG9yIGlmIHRoZSBhY3R1YWwgdmFsdWUgbmVlZHMgdG8gYmUgcmV0dXJuZWQuIFVubGlrZSBpbiB1bmRlcnNjb3JlIGFuZCBsb2Rhc2gsIHRoaXMgZnVuY3Rpb24gaXMgTk9UIHVzZWQgYXMgZGVmYXVsdCBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgcGlja3MgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gICAgdmFyIGtleSA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhcnJheSBzb3J0IHRvIHNvcnQgYnkgYSBnaXZlbiBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVByb3BlcnR5KCkge1xuICAgIHZhciBrZXkgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhW2tleV0gPCBiW2tleV1cbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogYVtrZXldID4gYltrZXldXG4gICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZ1xuICovXG5mdW5jdGlvbiBub29wKCkge31cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWFrZVByb3RvSW5zdGFuY2VNZXRob2Q6IG1ha2VQcm90b0luc3RhbmNlTWV0aG9kLFxuICAgIG1ha2VQcm90b0Z1bmN0aW9uOiBtYWtlUHJvdG9GdW5jdGlvbixcbiAgICBtYWtlRmluZE1ldGhvZDogbWFrZUZpbmRNZXRob2Rcbn1cblxuXG5mdW5jdGlvbiBtYWtlUHJvdG9JbnN0YW5jZU1ldGhvZChtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2VsZiA9IG1ldGhvZC5hcHBseSh0aGlzLnNlbGYsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cblxuZnVuY3Rpb24gbWFrZVByb3RvRnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyB3aGVuIHRoZSBtZXRob2QgaXMgZXhlY3V0ZWQsIHRoZSB2YWx1ZSBvZiBcInRoaXNcIiB3aWxsIGJlIGFyZ3VtZW50c1swXSxcbiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHN0YXJ0aW5nIGZyb20gIzEgd2lsbCBwYXNzZWQgdG8gbWV0aG9kIGFzIHBhcmFtZXRlcnMuXG4gICAgICAgIHJldHVybiBtZXRob2QuY2FsbC5hcHBseShtZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuXG52YXIgX2Vycm9yID0gbmV3IEVycm9yO1xuXG4vKipcbiAqIFJldHVybnMgYGZpbmRgIG9yIGBmaW5kSW5kZXhgIG1ldGhvZCwgZGVwZW5kaW5nIG9uIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hNZXRob2QgLSBtZXRob2QgdG8gdXNlIGZvciBpdGVyYXRpb24gKGZvckVhY2ggZm9yIGFycmF5IG9yIGVhY2hLZXkgZm9yIG9iamVjdClcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kV2hhdCAndmFsdWUnIC0gcmV0dXJucyBmaW5kIG1ldGhvZCBvZiBBcnJheSAoaW1wbGVtZW50ZWQgaW4gRVM2KSBvciBmaW5kVmFsdWUgbWV0aG9kIG9mIE9iamVjdCwgYW55dGhpbmcgZWxzZSA9IHJldHVybnMgZmluZEluZGV4L2ZpbmRLZXkgbWV0aG9kcy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRmluZE1ldGhvZChlYWNoTWV0aG9kLCBmaW5kV2hhdCkge1xuICAgIHZhciBhcmdJbmRleCA9IGZpbmRXaGF0ID09ICd2YWx1ZScgPyAwIDogMTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBmaW5kVmFsdWVPckluZGV4KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgICAgICB2YXIgY2F1Z2h0RXJyb3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlYWNoTWV0aG9kLmNhbGwodGhpcywgdGVzdEl0ZW0sIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICAgICAgfSBjYXRjaCAoZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gX2Vycm9yKSB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGxvb2tpbmcgZm9yIGluZGV4IGFuZCBub3QgZm91bmQsIHJldHVybiAtMVxuICAgICAgICBpZiAoYXJnSW5kZXggJiYgZWFjaE1ldGhvZCA9PSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaClcbiAgICAgICAgICAgIHJldHVybiAtMTsgXG5cbiAgICAgICAgZnVuY3Rpb24gdGVzdEl0ZW0odmFsdWUsIGluZGV4LCBzZWxmKSB7XG4gICAgICAgICAgICB2YXIgdGVzdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGVzdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGluZGV4LCBzZWxmKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3QpXG4gICAgICAgICAgICAgICAgdGhyb3cgYXJndW1lbnRzW2FyZ0luZGV4XTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== +//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYWJzdHJhY3QvZmFjZXQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9hYnN0cmFjdC9yZWdpc3RyeS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2JpbmQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvYV9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2xvYWQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2JpbmRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tbWFuZC9hY3Rpb25zX2hpc3RvcnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbW1hbmQvY21kX3JlZ2lzdHJ5LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19pbmZvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY191dGlscy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19hcGkvZGVfZGF0YS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9tc2dfYXBpL2Ryb3AuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19zcmMvZnJhbWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvc2NvcGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvQnV0dG9uLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9EYXRlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvR3JvdXAuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0ltYWdlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0TGlzdC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9MaXN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0xpc3RJdGVtLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvU2VsZWN0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvVGV4dC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UZXh0YXJlYS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UaW1lLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1dyYXBwZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi9jb25maWcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL2xvYWRlci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvbWlsby5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvcmVnaXN0cnkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RlX2NvbnN0cnMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RvbV9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9zb3VyY2UuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL3dpbmRvdy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXNlX2NvbXBvbmVudHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3VzZV9mYWNldHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY29tcG9uZW50X25hbWUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY291bnQuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kb20uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvZG9tX2xpc3RlbmVycy5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kb21yZWFkeS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9kcmFnZHJvcC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9lcnJvci5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9mcmFnbWVudC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9qc29uX3BhcnNlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3JlcXVlc3QuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvc2VsZWN0aW9uL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3N0b3JhZ2UvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvc3RvcmFnZS9tb2RlbC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9saWIvdXRpbC9zdG9yYWdlL21zZ19zcmMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3dlYnNvY2tldC9tc2dfYXBpLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL2xpYi91dGlsL3dlYnNvY2tldC9tc2dfc3JjLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9iYXNlMzIvbGliL2Jhc2UzMi5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1idWlsdGlucy9idWlsdGluL2ZzLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL2Fic3RyYWN0L21peGluLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL2NsYXNzZXMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvY29uZmlnLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbV9hcGkuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL21fYXBpX3J4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tX3NvdXJjZS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbXNuZ3Jfc291cmNlLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21pbG8tY29yZS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9taW5kZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvY2hhbmdlX2RhdGEuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvY29ubmVjdG9yLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL2luZGV4LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL21fbXNnX2FwaS5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9tX3BhdGguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvbW9kZWxfdXRpbHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvcGF0aF9tc2dfYXBpLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL3BhdGhfdXRpbHMuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvc3ludGhlc2l6ZS9pbmRleC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2NoZWNrLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL3V0aWwvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9sb2dnZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9sb2dnZXJfY2xhc3MuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvZG90L2RvVC5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9kb3QvaW5kZXguanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90by5qcyIsIi9Vc2Vycy9ldmdlbnlwb2JlcmV6a2luL1dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX2FycmF5LmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvcHJvdG9fZnVuY3Rpb24uanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19udW1iZXIuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19vYmplY3QuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19wcm90b3R5cGUuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19zdHJpbmcuanMiLCIvVXNlcnMvZXZnZW55cG9iZXJlemtpbi9Xb3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b191dGlsLmpzIiwiL1VzZXJzL2V2Z2VueXBvYmVyZXpraW4vV29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9tQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3puQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0O1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5GYWNldGBcbiAqIEJhc2UgRmFjZXQgY2xhc3MgaXMgYW4gYW5jZXN0b3Igb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2xhc3MsIHRoZSBtYWluIGJ1aWxkaW5nIGJsb2NrIGluIG1pbG8uXG4gKiBcbiAqIEBwYXJhbSB7RmFjZXRlZE9iamVjdH0gb3duZXIgYW4gaW5zdGFuY2Ugb2YgRmFjZXRlZE9iamVjdCBzdWJjbGFzcyB0aGF0IHN0b3JlcyB0aGUgZmFjZXQgb24gaXRzIHByb3BlcnR5ICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYG5hbWVgIHByb3BlcnR5IG9mIGZhY2V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb24sIHVzZWQgaW4gc3ViY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBGYWNldChvd25lciwgY29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gXy5maXJzdExvd2VyQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIGBpbml0YCBtZXRob2Qgb2Ygc3ViY2xhc3Mgd2lsbCBiZSBjYWxsZWQgYnkgRmFjZXQgY29uc3RydWN0b3IuXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXQsIHtcbiAgICBpbml0OiBmdW5jdGlvbigpIHt9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXQgPSByZXF1aXJlKCcuL2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0ZWRPYmplY3Q7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkZhY2V0ZWRPYmplY3RgXG4gKiBDb21wb25lbnQgY2xhc3MgaXMgYmFzZWQgb24gYW4gYWJzdHJhY3QgYGBgRmFjZXRlZE9iamVjdGBgYCBjbGFzcy4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhbnkgc2l0dWF0aW9uIHdoZXJlIG9iamVjdHMgY2FuIGJlIHJlcHJlc2VudGVkIHZpYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyAoYSBmYWNldCBpcyBhbiBvYmplY3Qgb2YgYSBjZXJ0YWluIGNsYXNzLCBpdCBob2xkcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIG1ldGhvZHMpLlxuICogSW4gYSB3YXksIFwiZmFjZXRzIHBhdHRlcm5cIiBpcyBhbiBpbnZlcnNpb24gb2YgXCJhZGFwdGVyIHBhdHRlcm5cIiAtIHdoaWxlIHRoZSBsYXR0ZXIgYWxsb3dzIGZpbmRpbmcgYSBjbGFzcy9tZXRob2RzIHRoYXQgaGFzIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGZhY2V0ZWQgb2JqZWN0IGlzIHNpbXBseSBjb25zdHJ1Y3RlZCB0byBoYXZlIHRoZXNlIGZ1bmN0aW9uYWxpdGllcy5cbiAqIFdpdGggdGhpcyBhcmNoaXRlY3R1cmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgYnVpbGRpbmcgYmxvY2tzIHdpdGhvdXQgaGF2aW5nIGFueSBoaWVyYXJjaHkgb2YgY2xhc3NlcyAtIGFsbCBjb21wb25lbnRzIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBDb21wb25lbnQgY2xhc3MuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IGFsbCBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yIChpdCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGlmIGEgc3ViY2xhc3MgaXMgY3JlYXRlZCB3aXRoIGBfLmNyZWF0ZVN1YmNsYXNzYCkuXG4gKlxuICogQHJldHVybiB7RmFjZXRlZE9iamVjdH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCgpIHtcbiAgICAvLyB0aGlzLmZhY2V0c0NvbmZpZyBhbmQgdGhpcy5mYWNldHNDbGFzc2VzIHdlcmUgc3RvcmVkIG9uIGEgc3BlY2lmaWMgY2xhc3MgcHJvdG90eXBlXG4gICAgLy8gd2hlbiB0aGUgY2xhc3Mgd2FzIGNyZWF0ZWQgYnkgRmFjZXRlZE9iamVjdC5jcmVhdGVGYWNldGVkQ2xhc3NcbiAgICB2YXIgZmFjZXRzQ29uZmlnID0gdGhpcy5mYWNldHNDb25maWcgfHwge307XG5cbiAgICB2YXIgZmFjZXRzRGVzY3JpcHRvcnMgPSB7fVxuICAgICAgICAsIGZhY2V0cyA9IHt9O1xuXG4gICAgLy8gRmFjZXRlZE9iamVjdCBjbGFzcyBpdHNlbGYgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCAtIGl0IGhhcyBubyBmYWNldHNcbiAgICAvLyBJdCBtYXkgY2hhbmdlLCBhcyBhZGRpbmcgZmFjZXRzIGlzIHBvc3NpYmxlIHRvIGluc3RhbmNlc1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09IEZhY2V0ZWRPYmplY3QpICAgICAgXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFjZXRlZE9iamVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcywgY2FuXFwndCBiZSBpbnN0YW50aWF0ZWQnKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGNsYXNzIGZhY2V0c1xuICAgIGlmICh0aGlzLmZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLmZhY2V0c0NsYXNzZXMsIGluc3RhbnRpYXRlRmFjZXQsIHRoaXMsIHRydWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0cyB0byB0aGUgY2xhc3MgYXMgcHJvcGVydGllcyB1bmRlciB0aGVpciBvd24gbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGZhY2V0c0Rlc2NyaXB0b3JzKTtcblxuICAgIC8vIHN0b3JlIGFsbCBmYWNldHMgb24gYGZhY2V0c2AgcHJvcGVydHkgc28gdGhhdCB0aGV5IGNhbiBiZSBlbnVtZXJhdGVkXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmFjZXRzJywgZmFjZXRzKTsgICBcblxuICAgIC8vIGNhbGwgYGluaXRgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgaW4gc3ViY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGZhY2V0IHdpdGggYSBnaXZlbiBjbGFzcyAoRmFjZXRDbGFzcykgYW5kIG5hbWUgKGZhY2V0TmFtZSlcbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUZhY2V0KEZhY2V0Q2xhc3MsIGZhY2V0TmFtZSkge1xuICAgICAgICAvLyBnZXQgZmFjZXQgY29uZmlndXJhdGlvblxuICAgICAgICB2YXIgZmN0Q29uZmlnID0gZmFjZXRzQ29uZmlnW2ZhY2V0TmFtZV07XG5cbiAgICAgICAgLy8gaW5zdGF0aWF0ZSBmYWNldHNcbiAgICAgICAgZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmY3RDb25maWcpO1xuXG4gICAgICAgIC8vIGFkZCBmYWNldCB0byBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICAgICAgICBmYWNldHNEZXNjcmlwdG9yc1tmYWNldE5hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWNldHNbZmFjZXROYW1lXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbY3JlYXRlRmFjZXRlZENsYXNzXSgjRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKVxuICogLSBbaGFzRmFjZXRdKCNGYWNldGVkT2JqZWN0JCRoYXNGYWNldClcbiAqL1xuXy5leHRlbmQoRmFjZXRlZE9iamVjdCwge1xuICAgIGNyZWF0ZUZhY2V0ZWRDbGFzczogRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzLFxuICAgIGhhc0ZhY2V0OiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldCxcbiAgICBnZXRGYWNldENvbmZpZzogRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWdcbn0pO1xuXG5cbi8qKlxuICogIyMjI0ZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFthZGRGYWNldF0oI0ZhY2V0ZWRPYmplY3QkYWRkRmFjZXQpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXRlZE9iamVjdCwge1xuICAgIGFkZEZhY2V0OiBGYWNldGVkT2JqZWN0JGFkZEZhY2V0XG59KTtcblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBhIGZhY2V0IHRvIHRoZSBpbnN0YW5jZSBvZiBGYWNldGVkT2JqZWN0IHN1YmNsYXNzLlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjZXQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGYWNldENsYXNzIGZhY2V0IGNsYXNzIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZmFjZXRDb25maWcgb3B0aW9uYWwgZmFjZXQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSBvcHRpb25hbCBmYWNldCBuYW1lLCBGYWNldENsYXNzLm5hbWUgd2lsbCBiZSB1c2VkIGlmIGZhY2V0TmFtZSBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGYWNldH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCRhZGRGYWNldChGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgY2hlY2soRmFjZXRDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGZhY2V0TmFtZSwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG5cbiAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgZmFjZXQgbmFtZSBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShmYWNldE5hbWUgfHwgRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIC8vIGdldCBmYWNldHMgZGVmaW5lZCBpbiBjbGFzc1xuICAgIHZhciBwcm90b0ZhY2V0cyA9IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmZhY2V0c0NsYXNzZXM7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZXROYW1lIHdhcyBub3QgYWxyZWFkeSB1c2VkIGluIHRoZSBjbGFzc1xuICAgIGlmIChwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY2xhc3MgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZU5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgZmFjZXRlZCBvYmplY3RcbiAgICBpZiAodGhpc1tmYWNldE5hbWVdKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcHJlc2VudCBpbiBvYmplY3QnO1xuICAgICAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdGYWNldGVkT2JqZWN0IGFkZEZhY2V0OiAnLCBtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBmYWNldFxuICAgIHZhciBuZXdGYWNldCA9IHRoaXMuZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmYWNldENvbmZpZyk7XG5cbiAgICAvLyBhZGQgZmFjZXQgdG8gZmFjZXRlZCBvYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIGZhY2V0TmFtZSwgbmV3RmFjZXQsIF8uRU5VTSk7XG5cbiAgICByZXR1cm4gbmV3RmFjZXQ7XG59XG5cblxuLyoqXG4gKiBGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZFxuICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGZhY2V0IGNsYXNzIGlmIHRoZSBmYWNldCB3aXRoIGBmYWNldE5hbWVgIGlzIHBhcnQgb2YgdGhlIGNsYXNzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuIElmIHN1YmNsYXNzIGlzIGNyZWF0ZWQgdXNpbmcgXy5jcmVhdGVTdWJjbGFzcyAoYXMgaXQgc2hvdWxkIGJlKSBpdCB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZC5cbiAqIFxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWVcbiAqIEByZXR1cm4ge1N1YmNsYXNzKEZhY2V0KXx1bmRlZmluZWR9IFxuICovXG5mdW5jdGlvbiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldChmYWNldE5hbWUpIHtcbiAgICAvLyB0aGlzIHJlZmVycyB0byB0aGUgRmFjZXRlZE9iamVjdCBjbGFzcyAob3Igc3ViY2xhc3MpLCBub3QgaW5zdGFuY2VcbiAgICB2YXIgcHJvdG9GYWNldHMgPSB0aGlzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzO1xuICAgIHJldHVybiBwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdO1xufVxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmYWNldFxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSB0aGUgZmFjZXQgd2hpY2ggY29uZmlnIHNob3VsZCBiZSByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmFjZXRcbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWcoZmFjZXROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRmFjZXQoZmFjZXROYW1lKSA/IHRoaXMucHJvdG90eXBlLmZhY2V0c0NvbmZpZ1tmYWNldE5hbWVdIDogbnVsbDtcbn1cblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBDbGFzcyBmYWN0b3J5IHRoYXQgY3JlYXRlcyBjbGFzc2VzIChjb25zdHJ1Y3RvciBmdW5jdGlvbnMpIGZyb20gdGhlIG1hcHMgb2YgZmFjZXRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAqIENyZWF0ZWQgY2xhc3Mgd2lsbCBiZSBzdWJjbGFzcyBvZiBgRmFjZXRlZE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNsYXNzIG5hbWUgKHdpbGwgYmUgZnVuY3Rpb24gbmFtZSBvZiBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbilcbiAqIEBwYXJhbSB7T2JqZWN0W1N1YmNsYXNzKEZhY2V0KV19IGZhY2V0c0NsYXNzZXMgbWFwIG9mIGNsYXNzZXMgb2YgZmFjZXRzIHRoYXQgd2lsbCBjb25zdGl0dXRlIHRoZSBjcmVhdGVkIGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdfSBmYWNldHNDb25maWcgbWFwIG9mIGZhY2V0cyBjb25maWd1cmF0aW9uLCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBrZXlzIGFzIHRoZSBtYXAgb2YgY2xhc3Nlcy4gU29tZSBmYWNldHMgbWF5IG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBmYWNldHNDbGFzc2VzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJuIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZykge1xuICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gICAgY2hlY2soZmFjZXRzQ2xhc3NlcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5TdWJjbGFzcyhGYWNldCwgdHJ1ZSkpKSk7XG4gICAgY2hlY2soZmFjZXRzQ29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBjb25maWcgcGFzc2VkIGZvciBmYWNldCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY2xhc3NcbiAgICBpZiAoZmFjZXRzQ29uZmlnKVxuICAgICAgICBfLmVhY2hLZXkoZmFjZXRzQ29uZmlnLCBmdW5jdGlvbihmY3RDb25maWcsIGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGlmICghIGZhY2V0c0NsYXNzZXMuaGFzT3duUHJvcGVydHkoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWd1cmF0aW9uIGZvciBmYWNldCAoJyArIGZjdE5hbWUgKyAnKSBwYXNzZWQgdGhhdCBpcyBub3QgaW4gY2xhc3MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MgKHRoaXMgcmVmZXJzIHRvIHRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKVxuICAgIHZhciBGYWNldGVkQ2xhc3MgPSBfLmNyZWF0ZVN1YmNsYXNzKHRoaXMsIG5hbWUsIHRydWUpO1xuXG4gICAgLy8gZ2V0IGZhY2V0cyBjbGFzc2VzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmVudCBjbGFzc1xuICAgIGZhY2V0c0NsYXNzZXMgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ2xhc3NlcywgJ2ZhY2V0c0NsYXNzZXMnKTtcbiAgICBmYWNldHNDb25maWcgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ29uZmlnLCAnZmFjZXRzQ29uZmlnJyk7XG5cbiAgICAvLyBzdG9yZSBmYWNldHMgY2xhc3NlcyBhbmQgY29uZmlndXJhdGlvbnMgb2YgY2xhc3MgcHJvdG90eXBlXG4gICAgXy5leHRlbmRQcm90byhGYWNldGVkQ2xhc3MsIHtcbiAgICAgICAgZmFjZXRzQ2xhc3NlczogZmFjZXRzQ2xhc3NlcyxcbiAgICAgICAgZmFjZXRzQ29uZmlnOiBmYWNldHNDb25maWdcbiAgICB9KTtcblxuICAgIHJldHVybiBGYWNldGVkQ2xhc3M7XG5cblxuICAgIGZ1bmN0aW9uIGFkZEluaGVyaXRlZEZhY2V0cyhzdXBlckNsYXNzLCBmYWNldHNJbmZvLCBmYWNldHNJbmZvTmFtZSkge1xuICAgICAgICB2YXIgaW5oZXJpdGVkRmFjZXRzSW5mbyA9IHN1cGVyQ2xhc3MucHJvdG90eXBlW2ZhY2V0c0luZm9OYW1lXTtcbiAgICAgICAgaWYgKGluaGVyaXRlZEZhY2V0c0luZm8pXG4gICAgICAgICAgICByZXR1cm4gXyhpbmhlcml0ZWRGYWNldHNJbmZvKVxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kKGZhY2V0c0luZm8gfHwge30pLl8oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhY2V0c0luZm87XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsYXNzUmVnaXN0cnk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkNsYXNzUmVnaXN0cnlgIC0gdGhlIHJlZ2lzdHJ5IG9mIGNsYXNzZXMgY2xhc3MuXG4gKiBDb21wb25lbnRzIGFuZCBGYWNldHMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiByZWdpc3RyaWVzLiBJdCBhbGxvd3MgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZW0gZnJvbSBvbmUgbW9kdWxlIGFuZCBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgdGhlIEZvdW5kYXRpb25DbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDbGFzc1JlZ2lzdHJ5IChGb3VuZGF0aW9uQ2xhc3MpIHtcbiAgICBpZiAoRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICB0aGlzLnNldENsYXNzKEZvdW5kYXRpb25DbGFzcyk7XG5cbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn1cblxuXG4vKipcbiAqICMjIyNDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbYWRkXSgjYWRkKVxuICogLSBbZ2V0XSgjZ2V0KVxuICogLSBbcmVtb3ZlXSgjcmVtb3ZlKVxuICogLSBbY2xlYW5dKCNjbGVhbilcbiAqIC0gW3NldENsYXNzXSgjc2V0Q2xhc3MpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ2xhc3NSZWdpc3RyeSwge1xuICAgIGFkZDogYWRkLFxuICAgIGdldDogZ2V0LFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGNsZWFuOiBjbGVhbixcbiAgICBzZXRDbGFzczogc2V0Q2xhc3Ncbn0pO1xuXG5cbi8qKlxuICogQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZWdpc3RlcnMgYSBjbGFzcyBpbiB0aGUgcmVnaXN0cnkuXG4gKiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xhc3MgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lIGFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcy5cbiAqIFRoZSBtZXRob2QgYWxsb3dzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsYXNzIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHNvIGNsYXNzIGFsaWFzZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYUNsYXNzIGNsYXNzIHRvIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RyeS4gU2hvdWxkIGJlIHN1YmNsYXNzIG9mIGB0aGlzLkZvdW5kYXRpb25DbGFzc2AuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBjbGFzcyBuYW1lLiBJZiBjbGFzcyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGFrZW4gZnJvbSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLiBDbGFzcyBuYW1lIHNob3VsZCBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYW5kIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZChhQ2xhc3MsIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBhQ2xhc3MubmFtZTtcblxuICAgIGNoZWNrKG5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcsICdjbGFzcyBuYW1lIG11c3QgYmUgaWRlbnRpZmllciBzdHJpbmcnKTtcblxuICAgIGlmICh0aGlzLkZvdW5kYXRpb25DbGFzcykge1xuICAgICAgICBpZiAoYUNsYXNzICE9IHRoaXMuRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICAgICAgY2hlY2soYUNsYXNzLCBNYXRjaC5TdWJjbGFzcyh0aGlzLkZvdW5kYXRpb25DbGFzcyksICdjbGFzcyBtdXN0IGJlIGEgc3ViKGNsYXNzKSBvZiBhIGZvdW5kYXRpb24gY2xhc3MnKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZGF0aW9uIGNsYXNzIG11c3QgYmUgc2V0IGJlZm9yZSBhZGRpbmcgY2xhc3NlcyB0byByZWdpc3RyeScpO1xuXG4gICAgaWYgKHRoaXMuX19yZWdpc3RlcmVkQ2xhc3Nlc1tuYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBcIicgKyBuYW1lICsgJ1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuXG4gICAgdGhpcy5fX3JlZ2lzdGVyZWRDbGFzc2VzW25hbWVdID0gYUNsYXNzO1xufTtcblxuXG4vKipcbiAqIEdldHMgY2xhc3MgZnJvbSByZWdpc3RyeSBieSBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQ2xhc3MgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgY2hlY2sobmFtZSwgU3RyaW5nLCAnY2xhc3MgbmFtZSBtdXN0IGJlIHN0cmluZycpO1xuICAgIHJldHVybiB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGZyb20gcmVnaXN0cnkgYnkgaXRzIG5hbWUuXG4gKiBJZiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuYW1lT3JDbGFzcyBDbGFzcyBuYW1lLiBJZiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBzdXBwbGllZCwgaXRzIG5hbWUgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiByZW1vdmUobmFtZU9yQ2xhc3MpIHtcbiAgICBjaGVjayhuYW1lT3JDbGFzcywgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbiksICdjbGFzcyBvciBuYW1lIG11c3QgYmUgc3VwcGxpZWQnKTtcblxuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckNsYXNzID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5hbWVPckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWVPckNsYXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoISB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQnKTtcblxuICAgIGRlbGV0ZSB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2xhc3NlcyBmcm9tIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn07XG5cblxuLyoqXG4gKiBTZXRzIGBGb3VuZGF0aW9uQ2xhc3NgIG9mIHRoZSByZWdpc3RyeS4gSXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYW55IGNsYXNzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQW55IGNsYXNzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy4gRm91bmRhdGlvbkNsYXNzIGl0c2VsZiBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5IHRvby5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xhc3MoRm91bmRhdGlvbkNsYXNzKSB7XG4gICAgY2hlY2soRm91bmRhdGlvbkNsYXNzLCBGdW5jdGlvbik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm91bmRhdGlvbkNsYXNzJywgRm91bmRhdGlvbkNsYXNzLCBfLkVOVU0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hX2NsYXNzJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgQVRUUklCVVRFX1JFR0VYUD0gL14oW15cXDpcXFtcXF1dKikoPzpcXFsoW15cXDpcXFtcXF1dKilcXF0pP1xcOj8oW146XSopJC9cbiAgICAsIEZBQ0VUU19TUExJVF9SRUdFWFAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi9cbiAgICAsIEFUVFJJQlVURV9URU1QTEFURSA9ICclY29tcENsYXNzJWNvbXBGYWNldHM6JWNvbXBOYW1lJztcblxuXG4vKipcbiAqIGBtaWxvLmF0dHJpYnV0ZXMuYmluZGBcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgcGFyc2VzL3ZhbGlkYXRlcy9ldGMuIGFuIGF0dHJpYnV0ZSB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBtaWxvIGNvbXBvbmVudHMuXG4gKiBQb3NzaWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXc6bXlWaWV3YCAtIGNsYXNzIGFuZCBjb21wb25lbnQgbmFtZVxuICogLSBgW0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGZhY2V0cyBhbmQgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXdbRXZlbnRzXTpteVZpZXdgIC0gY2xhc3MsIGZhY2V0KHMpIGFuZCBjb21wb25lbnQgbmFtZVxuICpcbiAqIFNlZSBbYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBCaW5kQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdCaW5kQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhCaW5kQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBjbGFzcyBtZXRob2RzXG4gKlxuICogLSBbc2V0SW5mb10oI0JpbmRBdHRyaWJ1dGUkJHNldEluZm8pXG4gKi9cbl8uZXh0ZW5kKEJpbmRBdHRyaWJ1dGUsIHtcbiAgICBzZXRJbmZvOiBCaW5kQXR0cmlidXRlJCRzZXRJbmZvXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpbmRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWJpbmQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBiaW5kIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBiaW5kOiAnY2MtYmluZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWJpbmQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMuYmluZDtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGJpbmQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnRpZXMgYGNvbXBDbGFzc2AsIGBjb21wRmFjZXRzYCBhbmQgYGNvbXBOYW1lYCBvbiBCaW5kQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCaW5kQXR0cmlidXRlfVxuICovXG4gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCEgdGhpcy5ub2RlKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKHZhbHVlKVxuICAgICAgICB2YXIgYmluZFRvID0gdmFsdWUubWF0Y2goQVRUUklCVVRFX1JFR0VYUCk7XG5cbiAgICBpZiAoISBiaW5kVG8pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaW5kIGF0dHJpYnV0ZSAnICsgdmFsdWUpO1xuXG4gICAgdGhpcy5jb21wQ2xhc3MgPSBiaW5kVG9bMV0gfHwgJ0NvbXBvbmVudCc7XG4gICAgdGhpcy5jb21wRmFjZXRzID0gKGJpbmRUb1syXSAmJiBiaW5kVG9bMl0uc3BsaXQoRkFDRVRTX1NQTElUX1JFR0VYUCkpIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXBOYW1lID0gYmluZFRvWzNdIHx8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIGlzIG5vdCBzYW1lIGFzICcnXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgdmFsaWRhdGVzIGJpbmQgYXR0cmlidXRlLCB0aHJvd3MgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm4ge0JpbmRBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgIGNoZWNrKHRoaXMuY29tcE5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgaWYgKCEgdGhpcy5jb21wQ2xhc3MpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgY29tcG9uZW50IGNsYXNzIG5hbWUgJyArIHRoaXMuY29tcENsYXNzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGdpdmVuIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGBjb21wQ2xhc3NgLCBgY29tcE5hbWVgIGFuZCBgY29tcEZhY2V0c2AuXG4gKiBJZiBgdGhpcy5jb21wTmFtZWAgaXMgbm90IHNldCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMuY29tcE5hbWUgPSB0aGlzLmNvbXBOYW1lIHx8IG1pbG8udXRpbC5jb21wb25lbnROYW1lKCk7XG4gICAgcmV0dXJuIEFUVFJJQlVURV9URU1QTEFURVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcENsYXNzJywgdGhpcy5jb21wQ2xhc3MgfHwgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjb21wRmFjZXRzJywgdGhpcy5jb21wRmFjZXRzICYmIHRoaXMuY29tcEZhY2V0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyB0aGlzLmNvbXBGYWNldHMuam9pbignLCAnKSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcE5hbWUnLCB0aGlzLmNvbXBOYW1lKTtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgbWV0aG9kXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50Q2xhc3Mgb3B0aW9uYWwgY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudE5hbWUgb3B0aW9uYWxcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tcG9uZW50RmFjZXRzIG9wdGlvbmFsIGV4dHJhIGZhY2V0IHRvIGFkZCB0byB0aGUgY2xhc3NcbiAqL1xuZnVuY3Rpb24gQmluZEF0dHJpYnV0ZSQkc2V0SW5mbyhlbCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudEZhY2V0cykge1xuICAgIHZhciBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUoZWwpO1xuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY29tcE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBGYWNldHM6IGNvbXBvbmVudEZhY2V0c1xuICAgIH0pO1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRlO1xuXG5cbi8qKlxuICogQW4gYWJzY3RyYWN0IGNsYXNzIGZvciBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIG9mIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBtZXRob2RzIGBhdHRyTmFtZWAsIGBwYXJzZWAsIGB2YWxpZGF0ZWAgYW5kIGByZW5kZXJgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgd2hlcmUgYXR0cmlidXRlIGlzIGF0dGFjaGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgc3VwcGxpZWQgYnkgc3ViY2xhc3MgdmlhIGBhdHRyTmFtZWAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0ZShlbCwgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgdGhpcy5hdHRyTmFtZSgpO1xuICAgIHRoaXMuZWwgPSBlbDtcblxuICAgIC8vIGF0dHJpYnV0ZSBub2RlXG4gICAgdGhpcy5ub2RlID0gZWwuYXR0cmlidXRlc1t0aGlzLm5hbWVdO1xufVxuXG5cbl8uZXh0ZW5kKEF0dHJpYnV0ZSwge1xuICAgIHJlbW92ZTogQXR0cmlidXRlJCRyZW1vdmVcbn0pO1xuXG5cbi8qKlxuICogIyMjI0F0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2dldF0oI0F0dHJpYnV0ZSRnZXQpXG4gKiAtIFtzZXRdKCNBdHRyaWJ1dGUkc2V0KVxuICogLSBbZGVjb3JhdGVdKCNBdHRyaWJ1dGUkZGVjb3JhdGUpXG4gKlxuICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZSBtZXRob2RzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gKlxuICogLSBhdHRyTmFtZSAtIHNob3VsZCByZXR1cm4gYXR0cmlidXRlIG5hbWVcbiAqIC0gcGFyc2UgLSBzaG91bGQgcGFyc2UgYXR0cmlidXRlIHZhbHVlXG4gKiAtIHZhbGlkYXRlIC0gc2hvdWxkIHZhbGlkYXRlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhyb3dpbmcgZXhjZXB0aW9uIGlmIGl0IGlzIGluY29ycmVjdCBcbiAqIC0gcmVuZGVyIC0gc2hvdWxkIHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIHN0YXRlIChvdGhlciBwcm9wZXJ0aWVzLCBhcyBkZWZpbmVkIGluIHN1YmNsYXNzKVxuICovXG5fLmV4dGVuZFByb3RvKEF0dHJpYnV0ZSwge1xuICAgIGdldDogQXR0cmlidXRlJGdldCxcbiAgICBzZXQ6IEF0dHJpYnV0ZSRzZXQsXG4gICAgcmVtb3ZlOiBBdHRyaWJ1dGUkcmVtb3ZlLFxuICAgIGRlY29yYXRlOiBBdHRyaWJ1dGUkZGVjb3JhdGUsXG5cbiAgICBkZXN0cm95OiBBdHRyaWJ1dGUkZGVzdHJveSxcblxuICAgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgYXR0ck5hbWU6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBwYXJzZTogdG9CZUltcGxlbWVudGVkLFxuICAgIHZhbGlkYXRlOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVuZGVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZSQkcmVtb3ZlKGVsLCBkZWVwKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnByb3RvdHlwZS5hdHRyTmFtZSgpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIGlmIChkZWVwKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIG5hbWUgKyAnXSc7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgICAgIGNoaWxkRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBBdHRyaWJ1dGUkcmVtb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm5vZGU7XG59XG5cblxuZnVuY3Rpb24gQXR0cmlidXRlJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMubm9kZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhdHRyaWJ1dGUgdmFsdWUgYXMgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbn1cblxuXG4vKipcbiAqIEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCBzZXRzIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJHNldCh2YWx1ZSkge1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdmFsdWUpO1xufVxuXG5cbi8qKlxuICogQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IGRlY29yYXRlcyBlbGVtZW50IHdpdGggaXRzIHJlbmRlcmVkIHZhbHVlLlxuICogVXNlcyBgcmVuZGVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgZGVmaWVuZCBpbiBzdWJjbGFzcy5cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGRlY29yYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMucmVuZGVyKCkpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYV9jbGFzcycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8uYXR0cmlidXRlcy5sb2FkYFxuICogTG9hZEF0dHJpYnV0ZSBjbGFzcyBwYXJzZXMvdmFsaWRhdGVzL2V0Yy4gYW4gYXR0cmlidXRlIHRoYXQgbG9hZHMgc3ViLXZpZXdzIGludG8gdGhlIHBhZ2UuXG4gKiBBdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkIHN1YnZpZXcgZnJvbS5cbiAqIFNlZSBbbG9hZGVyXSguLi9sb2FkZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBMb2FkQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdMb2FkQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjTG9hZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhMb2FkQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWxvYWQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBsb2FkIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBsb2FkOiAnY2MtbG9hZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWxvYWQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMubG9hZDtcbn1cblxuXG4vKipcbiAqIExvYWRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGxvYWQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnR5IGBsb2FkVXJsYCBvbiBMb2FkQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiBwYXJzZSgpIHtcbiAgICBpZiAoISB0aGlzLm5vZGUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFVybCA9IHRoaXMuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHNob3VsZCB2YWxpZGF0ZSBsb2FkIGF0dHJpYnV0ZSBhbmQgdGhyb3cgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBUT0RPIC0gaW1wbGVtZW50IHVybCB2YWxpZGF0aW9uLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAvLyBUT0RPIHVybCB2YWxpZGF0aW9uXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCAtIHJldHVybnMgVVJMXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdWJjbGFzc2VzIG9mIFtBdHRyaWJ1dGVdKC4vYV9jbGFzcy5qcy5odG1sKSBjbGFzc1xuICpcbiAqIC0gW0JpbmRBdHRyaWJ1dGVdKC4vYV9iaW5kLmpzLmh0bWwpXG4gKiAtIFtMb2FkQXR0cmlidXRlXSguL2FfbG9hZC5qcy5odG1sKVxuICovXG52YXIgYXR0cmlidXRlcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGJpbmQ6IHJlcXVpcmUoJy4vYV9iaW5kJyksXG4gICAgbG9hZDogcmVxdWlyZSgnLi9hX2xvYWQnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoJ0NvbXBvbmVudCcpXG4gICAgLCBDb21wb25lbnRJbmZvID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfaW5mbycpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9zY29wZScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgTWF0Y2ggPSAgY2hlY2suTWF0Y2g7XG5cblxuYmluZGVyLnNjYW4gPSBzY2FuO1xuYmluZGVyLmNyZWF0ZSA9IGNyZWF0ZTtcbmJpbmRlci50d29QYXNzID0gdHdvUGFzcztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRlcjtcblxuXG4vKipcbiAqIGBtaWxvLmJpbmRlcmBcbiAqXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHNjb3BlRWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtYmluZF9fIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBjbGFzcywgYWRkaXRpb25hbCBmYWNldHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogUG9zc2libGUgdmFsdWVzIG9mIF9fbWwtYmluZF9fIGF0dHJpYnV0ZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIENvbXBvbmVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgZmFjZXRzLlxuICogLSBgVmlldzpteVZpZXdgIC0gY2xhc3MgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBWaWV3IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gYFtFdmVudHMsIERhdGFdOm15Vmlld2AgLSBmYWNldHMgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBDb21wb25lbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKiAtIGBWaWV3W0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGNsYXNzLCBmYWNldChzKSBhbmQgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIFZpZXcgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKlxuICogRnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBbYFNjb3BlYF0oLi9jb21wb25lbnRzL3Njb3BlLmpzLmh0bWwpIGNsYXNzIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzY2FubmluZyBET00uXG4gKlxuICogSWYgdGhlIGNvbXBvbmVudCBoYXMgW2BDb250YWluZXJgXSguL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyLmpzKSBmYWNldCwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgc2NvcGVgIG9iamVjdCwgYXZhaWxhYmxlIGFzIHNjb3BlIHByb3BlcnR5IG9uIHRoZSBDb250YWluZXIgZmFjZXQgb2YgdGhpcyBjb21wb25lbnQuIE5hbWVzIG9mIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBzaG91bGQgYmUgdW5pcXVlLCBidXQgdGhleSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWVzIG9mIGNvbXBvbmVudHMgaW4gb3V0ZXIgc2NvcGUgKG9yIHNvbWUgb3RoZXIgc2NvcGUpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2NvcGVFbCByb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgYW5kIGJvdW5kXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgT3B0aW9uYWwgUm9vdCBzY29wZSBvYmplY3Qgd2hlcmUgdG9wIGxldmVsIGNvbXBvbmVudHMgd2lsbCBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluZFJvb3RFbGVtZW50IElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBiaW5kZXIoc2NvcGVFbCwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGUoaW5mbywgdGhyb3dPbkVycm9ycyk7XG4gICAgfSwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIGJpbmQgaW4gdHdvIHBhc3Nlc1xuZnVuY3Rpb24gdHdvUGFzcyhzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY2FuU2NvcGUgPSBiaW5kZXIuc2NhbihzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG4gICAgcmV0dXJuIGJpbmRlci5jcmVhdGUoc2NhblNjb3BlLCB1bmRlZmluZWQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIHNjYW4gRE9NIGZvciBCaW5kQXR0cmlidXRlXG5mdW5jdGlvbiBzY2FuKHNjb3BlRWwsIHJvb3RTY29wZSwgYmluZFJvb3RFbGVtZW50LCB0aHJvd09uRXJyb3JzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJpbmRlclNjb3BlKHNjb3BlRWwsIGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB9LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG59XG5cblxuLy8gY3JlYXRlIGJvdW5kIGNvbXBvbmVudHNcbmZ1bmN0aW9uIGNyZWF0ZShzY2FuU2NvcGUsIGhvc3RPYmplY3QsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgc2NvcGUgPSBuZXcgU2NvcGUoc2NhblNjb3BlLl9yb290RWwsIGhvc3RPYmplY3QpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgc2NhblNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBJbmZvKSB7XG4gICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgICAgIHZhciBpbmZvID0gXy5jbG9uZShjb21wSW5mbylcbiAgICAgICAgaW5mby5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjb21wb25lbnRcbiAgICAgICAgdmFyIGFDb21wb25lbnQgPSBDb21wb25lbnQuY3JlYXRlKGluZm8sIHRocm93T25FcnJvcnMpO1xuXG4gICAgICAgIHNjb3BlW2FkZE1ldGhvZF0oYUNvbXBvbmVudCwgYUNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgaWYgKGFDb21wb25lbnQuY29udGFpbmVyKVxuICAgICAgICAgICAgYUNvbXBvbmVudC5jb250YWluZXIuc2NvcGUgPSBjcmVhdGUoY29tcEluZm8uY29udGFpbmVyLnNjb3BlLCBhQ29tcG9uZW50LmNvbnRhaW5lciwgdGhyb3dPbkVycm9ycyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKlxuICogYGNyZWF0ZUJpbmRlclNjb3BlYFxuICogQHBhcmFtICB7RWxlbWVudH0gc2NvcGVFbCAgICAgICAgICAgICBzY29wZUVsIHJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCBhbmQgYm91bmQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gc2NvcGVPYmplY3RGYWN0b3J5IFNlZSBbYmluZGVyXSgjbWlsby5iaW5kZXIpXG4gKiBAcGFyYW0gIHtTY29wZX0gcm9vdFNjb3BlICAgICAgICAgICAgIE9wdGlvbmFsIFJvb3Qgc2NvcGUgb2JqZWN0IHdoZXJlIHRvcCBsZXZlbCBjb21wb25lbnRzIHdpbGwgYmUgc2F2ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBiaW5kUm9vdEVsZW1lbnQgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSB0aHJvd09uRXJyb3JzICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtTY29wZX0gICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgc2NvcGVPYmplY3RGYWN0b3J5LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY29wZUVsID0gc2NvcGVFbCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgICwgc2NvcGUgPSByb290U2NvcGUgfHwgbmV3IFNjb3BlKHNjb3BlRWwpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgY3JlYXRlU2NvcGVGb3JFbGVtZW50KHNjb3BlLCBzY29wZUVsLCBiaW5kUm9vdEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckVsZW1lbnQoc2NvcGUsIGVsLCBiaW5kUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQncyBiaW5kaW5nIGF0dHJpYnV0ZSAobWwtYmluZCBieSBkZWZhdWx0KVxuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcblxuICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBiaW5kIGF0dHJpYnV0ZSBjcmF0ZSBzY29wZSBvYmplY3QgKENvbXBvbmVudCBvciBDb21wb25lbnRJbmZvKVxuICAgICAgICBpZiAoYXR0ci5ub2RlICYmIGJpbmRSb290RWxlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzY29wZWRPYmplY3QgPSBzY29wZU9iamVjdEZhY3Rvcnkoc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKVxuICAgICAgICAgICAgICAgICwgaXNDb250YWluZXIgPSB0eXBlb2Ygc2NvcGVkT2JqZWN0ICE9ICd1bmRlZmluZWQnICYmIHNjb3BlZE9iamVjdC5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgY2hpbGROb2RlcyBhZGQgY2hpbGRyZW4gdG8gbmV3IHNjb3BlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29tcG9uZW50IHdpdGggQ29udGFpbmVyIGZhY2V0XG4gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgc2NvcGVcbiAgICAgICAgaWYgKGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNjb3BlID0gbmV3IFNjb3BlKGVsKTtcbiAgICAgICAgICAgICAgICBzY29wZWRPYmplY3QuY29udGFpbmVyLnNjb3BlID0gaW5uZXJTY29wZTtcbiAgICAgICAgICAgICAgICBpbm5lclNjb3BlLl9ob3N0T2JqZWN0ID0gc2NvcGVkT2JqZWN0LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU2NvcGVGb3JDaGlsZHJlbihlbCwgaXNDb250YWluZXIgPyBpbm5lclNjb3BlIDogc2NvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2NvcGUgd2Fzbid0IHByZXZpb3VzbHkgY3JlYXRlZCBvbiBjb250YWluZXIgZmFjZXQsIGNyZWF0ZSBlbXB0eSBzY29wZSBhbnl3YXlcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyICYmICEgc2NvcGVkT2JqZWN0LmNvbnRhaW5lci5zY29wZSlcbiAgICAgICAgICAgIHNjb3BlZE9iamVjdC5jb250YWluZXIuc2NvcGUgPSBuZXcgU2NvcGUoZWwpO1xuXG5cbiAgICAgICAgLy8gVE9ETyBjb25kaXRpb24gYWZ0ZXIgJiYgaXMgYSBoYWNrLCBzaG91bGQgbm90IGJlIHVzZWQhXG4gICAgICAgIGlmIChzY29wZWRPYmplY3QpIC8vICYmICEgc2NvcGVbYXR0ci5jb21wTmFtZV0pXG4gICAgICAgICAgICBzY29wZVthZGRNZXRob2RdKHNjb3BlZE9iamVjdCwgYXR0ci5jb21wTmFtZSk7XG5cbiAgICAgICAgLy8gXy5kZWZlcihwb3N0Q2hpbGRyZW5Cb3VuZE1lc3NhZ2UsIGVsKTtcbiAgICAgICAgcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKTtcblxuICAgICAgICByZXR1cm4gc2NvcGVkT2JqZWN0O1xuXG5cbiAgICAgICAgZnVuY3Rpb24gcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKSB7XG4gICAgICAgICAgICB2YXIgZWxDb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbENvbXApXG4gICAgICAgICAgICAgICAgZWxDb21wLnBvc3RNZXNzYWdlU3luYygnY2hpbGRyZW5ib3VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckNoaWxkcmVuKGNvbnRhaW5lckVsLCBzY29wZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB1dGlsRG9tLmNoaWxkcmVuKGNvbnRhaW5lckVsKTtcblxuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVNjb3BlRm9yRWxlbWVudChzY29wZSwgbm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZUNsYXNzZXMgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzIGFuZCBjbGFzcyByZWdpc3RyaWVzLlxuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBGYWNldDogcmVxdWlyZSgnLi9hYnN0cmFjdC9mYWNldCcpLFxuICAgIEZhY2V0ZWRPYmplY3Q6IHJlcXVpcmUoJy4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QnKSxcbiAgICBTY29wZTogcmVxdWlyZSgnLi9jb21wb25lbnRzL3Njb3BlJyksXG4gICAgQ2xhc3NSZWdpc3RyeTogcmVxdWlyZSgnLi9hYnN0cmFjdC9yZWdpc3RyeScpLFxuICAgIE1peGluOiBjb3JlQ2xhc3Nlcy5NaXhpbixcbiAgICBNZXNzYWdlU291cmNlOiBjb3JlQ2xhc3Nlcy5NZXNzYWdlU291cmNlLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IGNvcmVDbGFzc2VzLk1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsXG4gICAgTWVzc2VuZ2VyQVBJOiBjb3JlQ2xhc3Nlcy5NZXNzZW5nZXJBUEksXG4gICAgRE9NRXZlbnRzU291cmNlOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzJyksXG4gICAgVHJhbnNhY3Rpb246IHJlcXVpcmUoJy4vY29tbWFuZC90cmFuc2FjdGlvbicpLFxuICAgIFRyYW5zYWN0aW9uSGlzdG9yeTogcmVxdWlyZSgnLi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnknKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uc0hpc3Rvcnk7XG5cblxuLyoqXG4gKiBTdG9yZXMgbGlzdCBvZiBjb21tYW5kcyBvciB0cmFuc2FjdGlvbnNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMZW5ndGhcbiAqL1xuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQWN0aW9uc0hpc3RvcnksIHtcbiAgICBzdG9yZTogQWN0aW9uc0hpc3Rvcnkkc3RvcmUsXG4gICAgZGVsZXRlTGFzdDogQWN0aW9uc0hpc3RvcnkkZGVsZXRlTGFzdCxcbiAgICB1bmRvOiBBY3Rpb25zSGlzdG9yeSR1bmRvLFxuICAgIHJlZG86IEFjdGlvbnNIaXN0b3J5JHJlZG8sXG4gICAgdW5kb0FsbDogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbCxcbiAgICByZWRvQWxsOiBBY3Rpb25zSGlzdG9yeSRyZWRvQWxsLFxuICAgIHVuZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbEFzeW5jLFxuICAgIHJlZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkcmVkb0FsbEFzeW5jLFxuICAgIGVhY2g6IEFjdGlvbnNIaXN0b3J5JGVhY2gsXG4gICAgZWFjaFJldmVyc2U6IEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlLFxuICAgIGdldExhc3RBY3Rpb246IEFjdGlvbnNIaXN0b3J5JGdldExhc3RBY3Rpb24sXG5cbiAgICBnZXREZXNjcmlwdGlvbjogQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb25cbn0pO1xuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHN0b3JlKGNvbW1hbmQpIHtcbiAgICBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbi5jYWxsKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9ucy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBhY3QuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmFjdGlvbnMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uIC0gMVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGRlbGV0ZUxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5wb3NpdGlvbi0tO1xuICAgIHRoaXMuYWN0aW9ucy5sZW5ndGgtLTtcbn1cblxuXG5mdW5jdGlvbiBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbjsgaSA8IHRoaXMuYWN0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5hY3Rpb25zW2ldLmRlc3Ryb3koKTtcbiAgICB0aGlzLmFjdGlvbnMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvKGNiKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIHVuZG9cbiAgICB2YXIgYWN0ID0gdGhpcy5hY3Rpb25zWy0tdGhpcy5wb3NpdGlvbl07XG4gICAgYWN0LnVuZG8oY2IpO1xuICAgIHJldHVybiBhY3Q7XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkcmVkbyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uID09IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byByZWRvXG4gICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uKytdO1xuICAgIGFjdC5yZWRvKGNiKTtcbiAgICByZXR1cm4gYWN0O1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHVuZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24pIHRoaXMudW5kbygpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSB0aGlzLnJlZG8oKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvQWxsQXN5bmMoY2IpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICd1bmRvQWxsQXN5bmMnLCBjYik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGxBc3luYyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSBcbiAgICAgICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ3JlZG9BbGxBc3luYycsIGNiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZWFjaChmdW5jT3JNZXRob2QsIHRoaXNBcmcpIHtcbiAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2QgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGFjdCkgeyBhY3RbZnVuY09yTWV0aG9kXSgpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2Q7XG5cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChmdW5jLCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlKGZ1bmNPck1ldGhvZCwgdGhpc0FyZykge1xuICAgIHRoaXMuYWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgdGhpcy5lYWNoKGZ1bmNPck1ldGhvZCwgdGhpc0FyZyk7XG4gICAgdGhpcy5hY3Rpb25zLnJldmVyc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSRnZXRMYXN0QWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uICYmIHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uIC0gMV07XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMubWFwKGZ1bmN0aW9uKGFjdCkge1xuICAgICAgICByZXR1cm4gYWN0LmdldERlc2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgIGxlbmd0aDogYWN0aW9ucy5sZW5ndGhcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbW1hbmQgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tbWFuZHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbW1hbmQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbW1hbmRzUmVnaXN0cnkuYWRkKENvbW1hbmQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbW1hbmRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgVU5ET19DT01NQU5EID0gJ191bmRvQ29tbWFuZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21tYW5kO1xuXG5cbi8qKlxuICogQ29tbWFuZCBjbGFzcyB0byBpbXBsZW1lbnQgXCJjb21tYW5kIHBhdHRlcm5cIiAtIHBhY2thZ2luZyBsbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRlbGF5ZWQgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBDb21tYW5kKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb21tYW5kIGluc3RhbmNlIG1ldGhvZHNcbiAqIFxuICogLSBbaW5pdF0oI0NvbW1hbmQkZXhlY3V0ZSkgLSBpbml0aWFsaXplIGNvbW1hbmQsIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gKiAtIFtleGVjdXRlXSgjQ29tbWFuZCRleGVjdXRlKSAtIGV4ZWN1dGUgY29tbWFuZFxuICogLSBbc2V0VW5kb10oI0NvbW1hbmQkc2V0VW5kbykgLSBzZXQgdW5kbyBjb21tYW5kIGZvciB0aGlzIGNvbW1hbmRcbiAqIC0gW2dldFVuZG9dKCNDb21tYW5kJGdldFVuZG8pIC0gZ2V0IHVuZG8gY29tbWFuZCBvZiB0aGlzIGNvbW1hbmRcbiAqIC0gW3NldEFyZ3VtZW50c10oI0NvbW1hbmQkc2V0QXJndW1lbnRzKSAtIHNldCBjb21tYW5kcyBhcmd1bWVudHNcbiAqIC0gW2FkZEFyZ3VtZW50c10oI0NvbW1hbmQkYWRkQXJndW1lbnRzKSAtIGFkZCBhcmd1bWVudHMgdG8gY29tbWFuZFxuICogLSBbZGVzdHJveV0oI0NvbW1hbmQkZGVzdHJveSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21tYW5kLCB7XG4gICAgaW5pdDogQ29tbWFuZCRpbml0LFxuICAgIGV4ZWN1dGU6IENvbW1hbmQkZXhlY3V0ZSxcbiAgICBzZXRVbmRvOiBDb21tYW5kJHNldFVuZG8sXG4gICAgZ2V0VW5kbzogQ29tbWFuZCRnZXRVbmRvLFxuICAgIHVuZG86IENvbW1hbmQkdW5kbyxcbiAgICByZWRvOiBDb21tYW5kJGV4ZWN1dGUsIC8vIHNhbWUgZm9yIGNvbW1hbmQsIGRpZmZlcmVudCBmb3IgdHJhbnNhY3Rpb25cbiAgICBzZXRBcmd1bWVudHM6IENvbW1hbmQkc2V0QXJndW1lbnRzLFxuICAgIGFkZEFyZ3VtZW50czogQ29tbWFuZCRhZGRBcmd1bWVudHMsXG4gICAgZ2V0QXJndW1lbnRzOiBDb21tYW5kJGdldEFyZ3VtZW50cyxcbiAgICBjaGFuZ2VBcmd1bWVudHM6IENvbW1hbmQkY2hhbmdlQXJndW1lbnRzLFxuICAgIGRlc3Ryb3k6IENvbW1hbmQkZGVzdHJveSxcblxuICAgIHNldENvbW1lbnQ6IENvbW1hbmQkc2V0Q29tbWVudCxcbiAgICBnZXREZXNjcmlwdGlvbjogQ29tbWFuZCRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuLyoqXG4gKiBDb21tYW5kIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiAtIFtjcmVhdGVdKCNDb21tYW5kJCRjcmVhdGUpIC0gY29tbWFuZHMgZmFjdG9yeVxuICovXG5fLmV4dGVuZChDb21tYW5kLCB7XG4gICAgY3JlYXRlOiBDb21tYW5kJCRjcmVhdGUsXG4gICAgY3JlYXRlV2l0aFVuZG86IENvbW1hbmQkJGNyZWF0ZVdpdGhVbmRvXG59KTtcblxuXG5mdW5jdGlvbiBDb21tYW5kJGluaXQoZnVuYykgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICBjaGVjayhmdW5jLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuICAgIHRoaXMuZnVuYyA9IGZ1bmMgfHwgZnVuY3Rpb24oKXt9O1xuICAgIHRoaXMuYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTsgICAgXG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGNvbW1hbmQgbWFraW5nIGNvbW1hbmQgb2JqZWN0IGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gcHJvcGVydHkuIFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGV4ZWN1dGUoY2IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mdW5jLmFwcGx5KHRoaXMsIHRoaXMuYXJncyk7XG4gICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogU2V0IHVuZG8gY29tbWFuZCBmb3IgdGhpcyBjb21tYW5kLiBUaGlzIGNvbW1hbmQgYmVjb21lcyB1bmRvIGNvbW1hbmQgZm9yIHVuZG8gY29tbWFuZCAoc28gdW5kbyBjb21tYW5kIGNhbiBjaGFuZ2UgdGhpcyBjb21tYW5kIGR1cmluZyBpdHMgZXhlY3V0aW9uKS5cbiAqIFxuICogQHBhcmFtIHtDb21tYW5kfSB1bmRvQ29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJHNldFVuZG8odW5kb0NvbW1hbmQpIHtcbiAgICBpZiAodGhpc1tVTkRPX0NPTU1BTkRdKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRVbmRvOiB1bmRvIGNvbW1hbmQgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIHRoaXNbVU5ET19DT01NQU5EXSA9IHVuZG9Db21tYW5kO1xuICAgIHVuZG9Db21tYW5kW1VORE9fQ09NTUFORF0gPSB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bmRvIGNvbW1hbmQgb2YgYSBnaXZlbiBjb21tYW5kXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRnZXRVbmRvKCkge1xuICAgIHJldHVybiB0aGlzW1VORE9fQ09NTUFORF07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlcyB1bmRvIGNvbW1hbmQgb2YgY3VycmVudCBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkdW5kbyhjYikge1xuICAgIHZhciB1bmRvQ21kID0gdGhpcy5nZXRVbmRvKCk7XG4gICAgaWYgKCEgdW5kb0NtZCkgcmV0dXJuIGxvZ2dlci5lcnJvcignQ29tbWFuZCB1bmRvIGNhbGxlZCB3aXRob3V0IHVuZG8gY29tbWFuZCBwcmVzZW50Jyk7XG4gICAgdmFyIHJlc3VsdCA9IHVuZG9DbWQuZXhlY3V0ZSgpO1xuICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFNldCBjb21tYW5kJ3MgYXJndW1lbnRzLiBJZiBhcmd1bWVudHMgd2VyZSBzZXQgZHVyaW5nIGNvbW1hbmQncyBjcmVhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgYXJndW1lbnRzIGFuZCBsb2cgd2FybmluZy5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRzZXRBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgaWYgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3MubGVuZ3RoKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRBcmd1bWVudHM6IGNvbW1hbmQgYXJndW1lbnRzIGFyZSBhbHJlYWR5IHNldCcpO1xuICAgIHRoaXMuYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0QXJndW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3M7XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRjaGFuZ2VBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5hcmdzID0gXy50b0FycmF5KGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBBZGQgKGFwcGVuZCkgYXJndW1lbnRzIHRvIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHMgYXJndW1lbnRzIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gY29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGFkZEFyZ3VtZW50cygpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICBpZiAoISB0aGlzLmFyZ3MpIHRoaXMuYXJncyA9IFtdO1xuICAgIF8uYXBwZW5kQXJyYXkodGhpcy5hcmdzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogQ29tbWFuZHMgZmFjdG9yeS4gTGlrZWx5IG90IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIG9mIGNvbW1hbmQgY29uc3RydWN0aW9uXG4gKiBcbiAqIEB0aGlzIHtGdW5jdGlvbn0gQ2xhc3Mgb2YgY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCQkY3JlYXRlKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21tYW5kJCRjcmVhdGVXaXRoVW5kbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdpdGhVbmRvIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJzY2xhc3MnKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY3VycmVudCBjb21tYW5kICh0byBwcmV2ZW50IHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2hlbiBjb21tYW5kcyBwb2ludCB0byBET00gZWxlbWVudHMpXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jO1xuICAgIGRlbGV0ZSB0aGlzLmFyZ3M7XG4gICAgdmFyIHVuZG9DbWQgPSB0aGlzW1VORE9fQ09NTUFORF07XG4gICAgaWYgKHVuZG9DbWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbVU5ET19DT01NQU5EXVtVTkRPX0NPTU1BTkRdO1xuICAgICAgICBkZWxldGUgdGhpc1tVTkRPX0NPTU1BTkRdO1xuICAgICAgICB1bmRvQ21kLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRzZXRDb21tZW50KGNvbW1lbnQpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVuYzogdGhpcy5mdW5jLm5hbWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIEFjdGlvbnNIaXN0b3J5ID0gcmVxdWlyZSgnLi9hY3Rpb25zX2hpc3RvcnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb247XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IG5ldyBBY3Rpb25zSGlzdG9yeTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uLCB7XG4gICAgZXhlY3V0ZTogVHJhbnNhY3Rpb24kZXhlY3V0ZSxcbiAgICB1bmRvOiBUcmFuc2FjdGlvbiR1bmRvLFxuICAgIHJlZG86IFRyYW5zYWN0aW9uJHJlZG8sXG4gICAgZGVzdHJveTogVHJhbnNhY3Rpb24kZGVzdHJveSxcbiAgICBzdG9yZUNvbW1hbmQ6IFRyYW5zYWN0aW9uJHN0b3JlQ29tbWFuZCxcbiAgICBtZXJnZTogVHJhbnNhY3Rpb24kbWVyZ2UsXG5cbiAgICBzZXRDb21tZW50OiBUcmFuc2FjdGlvbiRzZXRDb21tZW50LFxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbiRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2V4ZWN1dGUnKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiR1bmRvKGNiKSB7XG4gICAgdGhpcy5jb21tYW5kcy51bmRvQWxsQXN5bmMoY2IpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJHJlZG8oY2IpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnJlZG9BbGxBc3luYyhjYik7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2Rlc3Ryb3knKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiRzdG9yZUNvbW1hbmQoY29tbWFuZCkge1xuICAgIHRoaXMuY29tbWFuZHMuc3RvcmUoY29tbWFuZCk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kbWVyZ2UodHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5jb21tYW5kcy5lYWNoKGZ1bmN0aW9uKGNtZCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnN0b3JlKGNtZCk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kc2V0Q29tbWVudChjb21tZW50KSB7XG4gICAgdGhpcy5jb21tZW50ID0gY29tbWVudFxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJGdldERlc2NyaXB0aW9uKCkge1xuICAgIHZhciBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMuZ2V0RGVzY3JpcHRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogY29tbWFuZHMuYWN0aW9ucyxcbiAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBY3Rpb25zSGlzdG9yeSA9IHJlcXVpcmUoJy4vYWN0aW9uc19oaXN0b3J5JylcbiAgICAsIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkhpc3Rvcnk7XG5cblxudmFyIFNDSEVEVUxFRCA9ICdfc2NoZWR1bGVkJztcblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBuZXcgQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzW1NDSEVEVUxFRF0gPSBmYWxzZTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uSGlzdG9yeSwge1xuICAgIHN0b3JlQ29tbWFuZDogVHJhbnNhY3Rpb25IaXN0b3J5JHN0b3JlQ29tbWFuZCxcbiAgICBlbmRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGVuZFRyYW5zYWN0aW9uLFxuICAgIHN0b3JlVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uLFxuICAgIGRlbGV0ZUxhc3RUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGRlbGV0ZUxhc3RUcmFuc2FjdGlvbixcbiAgICB1bmRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkdW5kbyxcbiAgICByZWRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyxcbiAgICBpblRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkaW5UcmFuc2FjdGlvbixcblxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkZ2V0RGVzY3JpcHRpb24sXG4gICAgdXNlTWVzc2VuZ2VyOiBUcmFuc2FjdGlvbkhpc3RvcnkkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IFRyYW5zYWN0aW9uSGlzdG9yeSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIFN0b3JlcyBjb21tYW5kIGluIHRoZSBoaXN0b3J5LiBcbiAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZCAgICAgICAgICAgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGVuZFRyYW5zYWN0aW9uIElmIGB0cnVlYCwgYXBwZW5kcyB0byB0aGUgY3VycmVudCBvciBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRyYW5zYWN0aW9uLlxuICovXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3Rvcnkkc3RvcmVDb21tYW5kKGNvbW1hbmQsIGFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKGFwcGVuZFRyYW5zYWN0aW9uICYmICEodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jdXJyZW50QmF0Y2gpKSB7XG4gICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25zLmdldExhc3RBY3Rpb24oKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc3RvcmVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICdhcHBlbmRlZCcsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIHRoaXMuY3VycmVudEJhdGNoKSB0aGlzLmN1cnJlbnRCYXRjaCA9IG5ldyBUcmFuc2FjdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaC5zdG9yZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgaWYgKCEgdGhpc1tTQ0hFRFVMRURdKSB7XG4gICAgICAgIHRoaXNbU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgX3N0b3JlVHJhbnNhY3Rpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVsZXRlTGFzdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRCYXRjaCB8fCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuZGVsZXRlTGFzdCgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc3RvcmVUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgX2FkZEJhdGNoVG9UcmFuc2FjdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsIF9zdG9yZVRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc3RvcmVDdXJyZW50VHJhbnNhY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpc1tTQ0hFRFVMRURdID0gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICBfYWRkQmF0Y2hUb1RyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG4gICAgX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2FkZEJhdGNoVG9UcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5tZXJnZSh0aGlzLmN1cnJlbnRCYXRjaCk7XG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB2YXIgdCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5zdG9yZSh0KTtcbiAgICAgICAgX3Bvc3RUcmFuc2FjdGlvbk1lc3NhZ2UuY2FsbCh0aGlzLCAnc3RvcmVkJywgdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5lbmRUcmFuc2FjdGlvbigpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc3RvcmUodHJhbnNhY3Rpb24pO1xuICAgIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3N0b3JlZCcsIHRyYW5zYWN0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZShtc2csIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcilcbiAgICAgICAgdGhpcy5fbWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1zZywgeyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gfSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JHVuZG8oY2IpIHtcbiAgICB2YXIgdCA9IHRoaXMudHJhbnNhY3Rpb25zLnVuZG8oY2IpO1xuICAgIGlmICh0KSBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICd1bmRvbmUnLCB0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyhjYikge1xuICAgIHZhciB0ID0gdGhpcy50cmFuc2FjdGlvbnMucmVkbyhjYik7XG4gICAgaWYgKHQpIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3JlZG9uZScsIHQpO1xuICAgIHJldHVybiB0O1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRpblRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW1NDSEVEVUxFRF07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5nZXREZXNjcmlwdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSR1c2VNZXNzZW5nZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnRyYW5zYWN0aW9ucztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXRlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnQ29tcG9uZW50RmFjZXQnKVxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi91dGlsL2RvbScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuLi91dGlsL3N0b3JhZ2UnKTtcblxudmFyIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyA9IGNvbXBvbmVudFV0aWxzLl9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYztcblxuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudGBcbiAqIEJhc2UgQ29tcG9uZW50IGNsYXNzLiBTdWJjbGFzcyBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCksIGJ1dCBub25lIG9mIHRoaXMgY2xhc3MgbWV0aG9kcyBzaG91bGQgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGNvbXBvbmVudC5cbiAqIEl0cyBjb25zdHJ1Y3RvciBwYXNzZXMgaXRzIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBpdHMgW3Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLCBET00gZWxlbWVudCBhbmQgbmFtZSB0byBbYGluaXRgXSgjaW5pdCkgbWV0aG9kLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIENvbXBvbmVudCBjbGFzcyByYXJlbHkgbmVlZHMgdG8gYmUgdXNlZCBkaXJlY3RseSwgYXMgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgY3JlYXRlcyBjb21wb25lbnRzIHdoZW4gaXQgc2NhbnMgRE9NIHRyZWUuXG4gKiBbYENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzc2BdKCNjcmVhdGVDb21wb25lbnRDbGFzcykgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgQ29tcG9uZW50IGNsYXNzIHdpdGggY29uZmlndXJlZCBmYWNldHMuXG4gKlxuICpcbiAqICMjIyNDb21wb25lbnQgaW5zdGFuY2UgcHJvcGVydGllcyMjIyNcbiAqXG4gKiAtIGVsIC0gRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG8uIElmIHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB0aGUgd2FybmluZyB3aWxsIGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUbyBnZXQgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIERPTSBlbGVtZW50IHVzZSBbQ29tcG9uZW50LmdldENvbXBvbmVudF0oLi9jX3V0aWxzLmpzLmh0bWwjZ2V0Q29tcG9uZW50KSBjbGFzcyBtZXRob2QuIFRvIGluc3BlY3QgY29tcG9uZW50IHZpYSBlbGVtZW50IGluIGJyb3dzZXIgY2hlY2sgYF9fX21pbG9fY29tcG9uZW50YCBwcm9wZXJ0eSBvZiBlbGVtZW50IChwcm9wZXJ0eSBuYW1lIGJlIGNoYW5nZWQgdXNpbmcgYG1pbG8uY29uZmlnYCkuXG4gKiAtIHNjb3BlIC0gcGFyZW50IHNjb3BlIG9iamVjdCwgYW4gaW5zdGFuY2Ugb2YgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpIGNsYXNzLiBUbyBnZXQgcGFyZW50IGNvbXBvbmVudCB1c2UgW2dldFNjb3BlUGFyZW50XSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KSBpbnN0YW5jZSBtZXRob2Qgb2YgY29tcG9uZW50LiBUaGUgYWN0dWFsIHBhdGggdG8gZ2V0IHBhcmVudCBvZiBjb25wb25lbnQgaXMgYGNvbXBvbmVudC5zY29wZS5faG9zdE9iamVjdC5vd25lcmAsIHdoZXJlIGBfaG9zdE9iamVjdGAgcmVmZXJzIHRvIFtDb250YWluZXJdKGNfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBwYXJlbnQgY29tcG9uZW50IGFuZCBgb3duZXJgIHRvIHRoZSBwYXJlbnQgaXRzZWxmLiBUaGUgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgc2NvcGUgb2YgaXRzIGNvbnRhaW5lciBmYWNldDogYGNvbXBvbmVudC5jb250YWluZXIuc2NvcGVgLiBUaGUgc2NvcGUgaGllcmFyY2h5IGNhbiBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgYXMgdGhlIERPTSBoaWVyYXJjaHkgLSBET00gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjb3BlIGFzIGNvbXBvbmVudCBpZiBpdCBkb2VzIG5vdCBoYXZlIGBDb250YWluZXJgIGZhY2V0IGFuZCBpbiB0aGUgc2NvcGUgb2YgaXRzIENvbnRhaW5lciBmYWNldCBpZiBpdCBoYXMgaXQuIFNlZSBbU2NvcGVdKC4vc2NvcGUuanMuaHRtbCkuXG4gKiAtIG5hbWUgLSB0aGUgbmFtZSBvZiBjb21wb25lbnQsIHNob3VsZCBiZSB1bmlxdWUgZm9yIHRoZSBzY29wZSB3aGVyZSBjb21wb25lbnQgYmVsb25ncy4gVG8gZmluZCBjb21wb25lbnQgaW4gc2NvcGUgdGhlIGNvbXBvbmVudCdzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgcHJvcGVydHkgb2Ygc2NvcGUgb2JqZWN0LiBTZWUgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLlxuICogLSBmYWNldHMgLSBtYXAgb2YgcmVmZXJlbmNlcyBvZiBhbGwgY29tcG9uZW50J3MgZmFjZXRzIChmYWNldCBuYW1lcyBhcmUgbG93ZXJjYXNlIGluIHRoaXMgbWFwKS4gQWxsIGZhY2V0cyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBvZiBjb21wb25lbnQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBmYWNldHMgKGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkgaW4gW2FsbEZhY2V0c10oI0NvbXBvbmVudCRhbGxGYWNldHMpIGNvbXBvbmVudCdzIGluc3RhbmNlIG1ldGhvZCB0aGF0IGFsbG93cyB0byBjYWxsIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgb24gYWxsIGZhY2V0cykuXG4gKiAtIGV4dHJhRmFjZXRzIC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgZmFjZXRzIHRoYXQgYXJlIGFkZGVkIHRvIGNvbXBvbmVudCBhbmQgZG8gbm90IGZvcm0gdGhlIHBhcnQgb2YgY29tcG9uZW50J3MgY2xhc3MuXG4gKiAtIF9tZXNzZW5nZXIgLSB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCdzIFttZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS4gUmFyZWx5IG5lZWRzIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYWxsIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiBtZXNlbmdlciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IG9uIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBldmVudHMjIyMjXG4gKlxuICogLSAnY2hpbGRyZW5ib3VuZCcgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjaGlsZHJlbiBvZiBET00gZWxlbWVudCB3aGljaCBjb21wbmVudCBpcyBjb25uZWN0ZWQgdG8gYXJlIGNvbm5lY3RlZCB0byBjb21wb25lbnRzLiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGVkIHdpdGggYG1pbG8uYmluZGVyYCAoYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwgYXMgYWxsIENvbXBvbmVudCBjbGFzcyBtZXRob2RzIHRoYXQgY3JlYXRlL2NvcHkgY29tcG9uZW50cyB1c2UgYG1pbG8uYmluZGVyYCBpbnRlcm5hbGx5IC0gY29tcG9uZW50IGNvbnN0cnVjdG9yIGFuZCBDb21wb25lbnQuY3JlYXRlIG1ldGhvZHMgYXJlIG5vdCB1c2VkIGluIGZyYW1ld29yayBvdXRzaWRlIG9mIGBtaWxvLmJpbmRlcmAgYW5kIHJhcmVseSBpZiBldmVyIG5lZWQgdG8gYmUgdXNlZCBpbiBhcGxpY2F0aW9uKS5cbiAqIC0gJ2FkZGVkdG9zY29wZScgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gc2NvcGUuXG4gKiAtICdzdGF0ZXJlYWR5JyAtIGF5bmNocm9ub3VzbHkgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCAodG9nZXRoZXIgd2l0aCBpdHMgc2NvcGUgY2hpbGRyZW4pIGlzIGNyZWF0ZWQgd2l0aCBbQ29tcG9uZW50LmNyZWF0ZUZyb21TdGF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlRnJvbVN0YXRlKSAob3IgYGNyZWF0ZUZyb21EYXRhVHJhbnNmZXJgKSBtZXRob2QuIENhbiBiZSBkaXNwYXRjaGVkIGJ5IGFwcGxpY2F0aW9uIGlmIHRoZSBjb21wb25lbnQncyBzdGF0ZSBpcyBzZXQgd2l0aCBzb21lIG90aGVyIG1lY2hhbmlzbS4gVGhpcyBldmVudCBpcyBub3QgdXNlZCBpbiBgbWlsb2AsIGl0IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9uIGluIHBhcnRpY3VsYXIgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQuXG4gKiAtICdnZXRzdGF0ZXN0YXJ0ZWQnIC0gZW1pdHRlZCBzeW5jaHJvbm91c2x5IGp1c3QgYmVmb3JlIGdldFN0YXRlIGV4ZWN1dGVzIHNvIGNvbXBvbmVudHMgYW5kIGZhY2V0cyBjYW4gY2xlYW4gdXAgdGhlaXIgc3RhdGUgZm9yIHNlcmlhbGl6YXRpb24uIFxuICogLSAnZ2V0c3RhdGVjb21wbGV0ZWQnIC0gZW1pdHRlZCBhc3luY2hyb25vdXNseSBhZnRlciBnZXRTdGF0ZSBleGVjdXRlcyBzbyBjb21wb25lbnRzIGFuZCBmYWNldHMgY2FuIHJlc3RvcmUgdGhlaXIgc3RhdGUgYWZ0ZXIgc2VyaWFsaXphdGlvbi5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBcImxpZmVjeWNsZVwiIyMjI1xuICpcbiAqIDEuIENvbXBvbmVudCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIENvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHNpbXBseSBjYWxscyBjb25zdHJ1Y3RvciBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCkgdGhhdCBpcyBhIHN1cGVyY2xhc3Mgb2YgQ29tcG9uZW50LiBTdWJjbGFzc2VzIG9mIENvbXBvbmVudCBzaG91bGQgbm90IGltcGxlbWVudCB0aGVpciBvd24gY29uc3RydWN0b3IsIHRoZXkgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IGBpbml0YCBtZXRob2QsIGJ1dCBtb3N0IGNvbXBvbmVudHMgZG8gbm90IG5lZWQgdG8gZG8gaXQuXG4gKiAyLiBjb25zdHJ1Y3RvcnMgYW5kIGBpbml0YCBtZXRob2RzIG9mIGFsbCBmYWNldHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gU2FtZSBhcyBjb21wb25lbnRzLCBmYWNldCBkbyBub3QgaW1wbGVtZW50IHRoZWlyIGNvbnN0cnVjdG9ycywgdGhleSBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgYGluaXRgIGFuZCBgc3RhcnRgIG1ldGhvZHMgKHNlZSBiZWxvdykuIEluc2lkZSBgaW5pdGAgbWV0aG9kIHRoZXJlIHNob3VsZCBiZSBvbmx5IGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSB3aXRob3V0IGFueSBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBpdHNlbGYgKGl0IGlzIG5vdCByZWFkeSB5ZXQpIGFuZCBvdGhlciBmYWNldHMgKGFzIHRoZXJlIGlzIG5vIHNwZWNpZmljIGZhY2V0cyBjcmVhdGlvbiBvcmRlcikuIElmIGZhY2V0IGltcGxlbWVudHMgYGluaXRgIG1ldGhvZCBpdCBNVVNUIGNhbGwgaW5oZXJpdGVkIGluaXQgd2l0aCBgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWAuXG4gKiAzLiBgaW5pdGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIEF0IHRoaXMgcG9pbnQgYWxsIGZhY2V0cyBhcmUgY3JlYXRlZCBidXQgZmFjZXRzIHN0aWxsIGNhbiBiZSBub3QgcmVhZHkgYXMgdGhleSBjYW4gaGF2ZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIGBzdGFydGAgbWV0aG9kLiBJZiBjb21wb25lbnQgc3ViY2xhc3MgaW1wbGVtZW50cyBgaW5pdGAgbWV0aG9kIGl0IE1VU1QgY2FsbCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggYDxTdXBlcmNsYXNzPi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYCwgd2hlcmUgPFN1cGVyY2xhc3M+IGlzIENvbXBvbmVudCBvciBhbm90aGVyIHN1cGVyY2xhc3MgdGhlIGNvbXBvbmVudCBpcyBhIHN1YmNsYXNzIG9mLlxuICogNC4gYGNoZWNrYCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGFkZHMgZmFjZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wb25lbnQgZGVjbGFyYXRpb24gKGJlaW5nIHBhcnQgb2YgdGhlIGNsYXNzIG9yIGV4cGxpY2l0ZWx5IGxpc3RlZCBpbiBiaW5kIGF0dHJpYnV0ZSkgYnV0IGFyZSByZXF1aXJlZCBieSBmYWNldHMgdGhhdCB0aGUgY29tcG5lbnQgYWxyZWFkeSBoYXMuIFN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbCkgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICogNS4gYHN0YXJ0YCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgYnkgQ29tcG9uZW50RmFjZXQgc3ViY2xhc3NlcyBhbmQgaXQgY2FuIGhhdmUgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIGNvbXBvbmVudCBvciBvbiBvdGhlciBmYWNldHMgdGhhdCBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiBhIGZhY2V0LiBJbmhlcml0ZWQgYHN0YXJ0YCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnQgaGUgc2FtZSB3YXkgYXMgd3JpdHRlbiBhYm92ZS5cbiAqIDYuIGBzdGFydGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIFRoaXMgY29tcG9uZW50IG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBpZiB0aGV5IG5lZWQgdG8gaGF2ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZmFjZXRzIGFuZCByZXF1aXJlcyB0aGF0IHRoZXNlIGZhY2V0cyBhcmUgZnVsbHkgaW5pYWxpemVkLiBPZnRlbiBzdWNoIGNvZGUgYWxzbyBkZXBlbmRzIG9uIGNvbXBvbmVudCdzIHNjb3BlIGNoaWxkcmVuIGFzIHdlbGwgc28gdGhpcyBjb2RlIHNob3VsZCBiZSBpbnNpZGUgYCdjaGlsZHJlbmJvdW5kJ2AgZXZlbnQgc3Vic2NyaWJlci5cbiAqIDcuICdhZGRlZHRvc2NvcGUnIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXRzIHBhcmVudCdzIHNjb3BlIG9yIHRvIHRvcCBsZXZlbCBzY29wZSBjcmVhdGVkIGJ5IGBtaWxvLmJpbmRlcmAuXG4gKiA4LiBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCAoc3RlcHMgMS02IGFib3ZlIGFyZSBmb2xsb3dlZCBmb3IgZWFjaCBjaGlsZCkuXG4gKiA5LiAnY2hpbGRyZW5ib3VuZCcgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGFsbCBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlaXIgc2NvcGUgKHNlZSBldmVudCBkZXNjcmlwdGlvbiBiZWxvdykuXG4gKiAxMC4gJ3N0YXRlcmVhZHknIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGNvbXBvbmVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGUgZnJvbSBzdGF0ZSAoc2VlIGV2ZW50IGRlc2NyaXB0aW9uIGJlbG93KS5cbiAqIDExLiBhdCB0aGlzIHBvaW50IGNvbXBvbmVudCBpcyBpbiB0aGUgXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoZW4gaXQgYW5kIGl0cyBmYWNldHMgd2lsbCBvbmx5IHJlc3BvbmQgdG8gbWVzc2FnZXMvZXZlbnRzIHRoYXQgdGhleSBzdWJzY3JpYmVkIHRvIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmVsb25nLiBJdCBpcyB1c3VhbGx5IGEgdG9wIGxldmVsIHNjb3BlIG9iamVjdCByZXR1cm5lZCBieSBgbWlsby5iaW5kZXJgIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgQ29udGFpbmVyIGZhY2V0LlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHRoYXQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjb21wb25lbnQgbmFtZSwgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGNvbXBvbmVudEluZm8gaW5zdGFuY2Ugb2YgQ29tcG9uZW50SW5mbyBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50XG4gKiAgVE9ETyB0cnkgcmVtb3ZpbmcgaXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIENvbXBvbmVudCA9IF8uY3JlYXRlU3ViY2xhc3MoRmFjZXRlZE9iamVjdCwgJ0NvbXBvbmVudCcsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudDtcblxuX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoJ0NvbXBvbmVudCcpO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBjbGFzcyBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2NyZWF0ZUNvbXBvbmVudENsYXNzXSgjQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcylcbiAqIC0gW2NyZWF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlKVxuICogLSBbY29weV0oI0NvbXBvbmVudCQkY29weSlcbiAqIC0gW2NyZWF0ZU9uRWxlbWVudF0oI0NvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50KVxuICogLSBbaXNDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNpc0NvbXBvbmVudClcbiAqIC0gW2dldENvbXBvbmVudF0oY191dGlscy5qcy5odG1sI2dldENvbXBvbmVudClcbiAqIC0gW2dldENvbnRhaW5pbmdDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNnZXRDb250YWluaW5nQ29tcG9uZW50KVxuICogLSBbY3JlYXRlRnJvbVN0YXRlXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUpXG4gKiAtIFtjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyKVxuICovXG5fLmV4dGVuZChDb21wb25lbnQsIHtcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcyxcbiAgICBjcmVhdGU6IENvbXBvbmVudCQkY3JlYXRlLFxuICAgIGNvcHk6IENvbXBvbmVudCQkY29weSxcbiAgICBjcmVhdGVPbkVsZW1lbnQ6IENvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50LFxuICAgIGlzQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5pc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGNvbXBvbmVudFV0aWxzLmdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5nZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlRnJvbURhdGFUcmFuc2ZlcjogQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXG59KTtcbmRlbGV0ZSBDb21wb25lbnQuY3JlYXRlRmFjZXRlZENsYXNzO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNDb21wb25lbnQkaW5pdClcbiAqIC0gW2NyZWF0ZUVsZW1lbnRdKCNDb21wb25lbnQkY3JlYXRlRWxlbWVudClcbiAqIC0gW2hhc0ZhY2V0XSgjQ29tcG9uZW50JGhhc0ZhY2V0KVxuICogLSBbYWRkRmFjZXRdKCNDb21wb25lbnQkYWRkRmFjZXQpXG4gKiAtIFthbGxGYWNldHNdKCNDb21wb25lbnQkYWxsRmFjZXRzKVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50JHJlbmFtZSlcbiAqIC0gW3JlbW92ZV0oI0NvbXBvbmVudCRyZW1vdmUpXG4gKiAtIFtnZXRTdGF0ZV0oI0NvbXBvbmVudCRnZXRTdGF0ZSlcbiAqIC0gW2dldFRyYW5zZmVyU3RhdGVdKCNDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSlcbiAqIC0gW3NldFN0YXRlXSgjQ29tcG9uZW50JHNldFN0YXRlKVxuICogLSBbZ2V0U2NvcGVQYXJlbnRdKCNDb21wb25lbnQkZ2V0U2NvcGVQYXJlbnQpXG4gKiAtIFtnZXRUb3BTY29wZVBhcmVudF0oI0NvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudClcbiAqIC0gW2dldFNjb3BlUGFyZW50V2l0aENsYXNzXSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKVxuICogLSBbZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3NdKCNDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MpXG4gKiAtIFt3YWxrU2NvcGVUcmVlXSgjQ29tcG9uZW50JHdhbGtTY29wZVRyZWUpXG4gKiAtIFticm9hZGNhc3RdKCNDb21wb25lbnQkYnJvYWRjYXN0KVxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudCRkZXN0cm95KVxuICogLSBbaXNEZXN0cm95ZWRdKCNDb21wb25lbnQkaXNEZXN0cm95ZWQpXG4gKlxuICpcbiAqICMjIyMjW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGNvbXBvbmVudCMjIyMjXG4gKlxuICogLSBbb25dKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvbikgLSBzaW5nbGUgc3Vic2NyaWJlXG4gKiAtIFtvZmZdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvZmYpIC0gc2luZ2xlIHVuc3Vic2NyaWJlXG4gKiAtIFtvbk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb25NZXNzYWdlcykgLSBtdWx0aXBsZSBzdWJzY3JpYmVcbiAqIC0gW29mZk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb2ZmTWVzc2FnZXMpIC0gbXVsdGlwbGUgdW5zdWJzY3JpYmVcbiAqIC0gW3Bvc3RNZXNzYWdlXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkcG9zdE1lc3NhZ2UpIC0gcG9zdCBtZXNzYWdlIG9uIGNvbXBvbmVudFxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRnZXRTdWJzY3JpYmVycykgLSBnZXQgc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudCwge1xuICAgIGluaXQ6IENvbXBvbmVudCRpbml0LFxuICAgIHN0YXJ0OiBDb21wb25lbnQkc3RhcnQsXG4gICAgY3JlYXRlRWxlbWVudDogQ29tcG9uZW50JGNyZWF0ZUVsZW1lbnQsXG4gICAgaGFzRmFjZXQ6IENvbXBvbmVudCRoYXNGYWNldCxcbiAgICBhZGRGYWNldDogQ29tcG9uZW50JGFkZEZhY2V0LFxuICAgIGFsbEZhY2V0czogQ29tcG9uZW50JGFsbEZhY2V0cyxcbiAgICByZW5hbWU6IENvbXBvbmVudCRyZW5hbWUsXG4gICAgcmVtb3ZlOiBDb21wb25lbnQkcmVtb3ZlLFxuICAgIGluc2VydEludG86IENvbXBvbmVudCRpbnNlcnRJbnRvLFxuXG4gICAgZ2V0U3RhdGU6IENvbXBvbmVudCRnZXRTdGF0ZSxcbiAgICBnZXRUcmFuc2ZlclN0YXRlOiBDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSxcbiAgICBfZ2V0U3RhdGU6IENvbXBvbmVudCRfZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IENvbXBvbmVudCRzZXRTdGF0ZSxcbiAgICBcbiAgICBnZXRTY29wZVBhcmVudDogQ29tcG9uZW50JGdldFNjb3BlUGFyZW50LFxuICAgIGdldFRvcFNjb3BlUGFyZW50OiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnQsXG4gICAgZ2V0U2NvcGVQYXJlbnRXaXRoQ2xhc3M6IENvbXBvbmVudCRnZXRTY29wZVBhcmVudFdpdGhDbGFzcyxcbiAgICBnZXRUb3BTY29wZVBhcmVudFdpdGhDbGFzczogQ29tcG9uZW50JGdldFRvcFNjb3BlUGFyZW50V2l0aENsYXNzLFxuXG4gICAgc2V0U2NvcGVQYXJlbnRGcm9tRE9NOiBDb21wb25lbnQkc2V0U2NvcGVQYXJlbnRGcm9tRE9NLFxuXG4gICAgd2Fsa1Njb3BlVHJlZTogQ29tcG9uZW50JHdhbGtTY29wZVRyZWUsXG5cbiAgICB0cmVlUGF0aE9mOiBDb21wb25lbnQkdHJlZVBhdGhPZixcbiAgICBnZXRDb21wb25lbnRBdFRyZWVQYXRoOiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBDb21wb25lbnQkaW5zZXJ0QXRUcmVlUGF0aCxcblxuICAgIGJyb2FkY2FzdDogQ29tcG9uZW50JGJyb2FkY2FzdCxcbiAgICBkZXN0cm95OiBDb21wb25lbnQkZGVzdHJveSxcbiAgICBpc0Rlc3Ryb3llZDogQ29tcG9uZW50JGlzRGVzdHJveWVkXG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBDb21wb25lbnQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChDb21wb25lbnQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9QUkVGSVggPSAneC1hcHBsaWNhdGlvbi9taWxvLWNvbXBvbmVudCc7XG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9SRUdFWCA9IC94LWFwcGxpY2F0aW9uXFwvbWlsby1jb21wb25lbnRcXC8oW2Etel8kXVswLTlhLXpfJF0qKSg/OlxcLygpKS9pO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBjb21wb25lbnQgZnJvbSB0aGUgbWFwIG9mIGNvbmZpZ3VyZWQgZmFjZXRzLlxuICogVGhpcyBtZXRob2Qgd3JhcHMgYW5kIHJlcGxhY2VzIFtgY3JlYXRlRmFjZXRlZENsYXNzYF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCNjcmVhdGVGYWNldGVkQ2xhc3MpIGNsYXNzIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0LlxuICogVW5saWtlIGNyZWF0ZUZhY2V0ZWRDbGFzcywgdGhpcyBtZXRob2QgdGFrZSBmYWNldCBjbGFzc2VzIGZyb20gcmVnaXN0cnkgYnkgdGhlaXIgbmFtZSwgc28gb25seSBtYXAgb2YgZmFjZXRzIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgcGFzc2VkLiBBbGwgZmFjZXRzIGNsYXNzZXMgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdIHwgQXJyYXlbU3RyaW5nXX0gZmFjZXRzQ29uZmlnIG1hcCBvZiBmYWNldHMgY29uZmlndXJhdGlvbi5cbiAqICBJZiBzb21lIGZhY2V0IGRvZXMgbm90IHJlcXVpcmUgY29uZmlndXJhdGlvbiwgYHVuZGVmaW5lZGAgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZhY2V0LlxuICogIElmIG5vIGZhY2V0IHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24sIHRoZSBhcnJheSBvZiBmYWNldHMgbmFtZXMgY2FuIGJlIHBhc3NlZC5cbiAqIEByZXR1cm4ge1N1YmNsYXNzKENvbXBvbmVudCl9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCQkY3JlYXRlQ29tcG9uZW50Q2xhc3MobmFtZSwgZmFjZXRzQ29uZmlnKSB7XG4gICAgLy8gY29udmVydCBhcnJheSBvZiBmYWNldCBuYW1lcyB0byBtYXAgb2YgZW1wdHkgZmFjZXRzIGNvbmZpZ3VyYXRpb25zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzQ29uZmlnKSkge1xuICAgICAgICB2YXIgY29uZmlnTWFwID0ge307XG4gICAgICAgIGZhY2V0c0NvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uKGZjdCkge1xuICAgICAgICAgICAgdmFyIGZjdE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBjb25maWdNYXBbZmN0TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZhY2V0c0NvbmZpZyA9IGNvbmZpZ01hcDtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgbWFwIG9mIGZhY2V0cyBjbGFzc2VzIGZyb20gZmFjZXRSZWdpc3RyeVxuICAgIHZhciBmYWNldHNDbGFzc2VzO1xuICAgIGlmICh0eXBlb2YgZmFjZXRzQ29uZmlnID09ICdvYmplY3QnICYmIF8ua2V5cyhmYWNldHNDb25maWcpLmxlbmd0aCkge1xuICAgICAgICBmYWNldHNDbGFzc2VzID0ge307XG4gICAgICAgIF8uZWFjaEtleShmYWNldHNDb25maWcsIGZ1bmN0aW9uKGZjdENvbmZpZywgZmN0KSB7XG4gICAgICAgICAgICB2YXIgZmN0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoZmN0KTtcbiAgICAgICAgICAgIHZhciBmY3RDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBmYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdENsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzdWJjbGFzcyBvZiBDb21wb25lbnQgdXNpbmcgbWV0aG9kIG9mIEZhY2V0ZWRPYmplY3RcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBGYWNldGVkT2JqZWN0LmNyZWF0ZUZhY2V0ZWRDbGFzcy5jYWxsKHRoaXMsIG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZyk7XG4gICAgXG4gICAgX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UobmFtZSk7XG5cbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoY2xhc3NOYW1lKSB7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKGNsYXNzTmFtZSwgQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBDb21wb25lbnRfZG9tU3RvcmFnZVBhcnNlcik7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyKGNvbXBvbmVudCkge1xuICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0ZSk7ICAgXG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VQYXJzZXIoY29tcFN0ciwgY29tcENsYXNzTmFtZSkge1xuICAgIHZhciBzdGF0ZSA9IF8uanNvblBhcnNlKGNvbXBTdHIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGUoc3RhdGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBjb21wb25lbnQgZnJvbSBbQ29tcG9uZW50SW5mb10oLi9jX2luZm8uanMuaHRtbCkgKHVzZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgYW5kIHRvIGNvcHkgY29tcG9uZW50KVxuICogQ29tcG9uZW50IG9mIGFueSByZWdpc3RlcmVkIGNsYXNzIChzZWUgW2NvbXBvbmVudHNSZWdpc3RyeV0oLi9jX3JlZ2lzdHJ5LmpzLmh0bWwpKSB3aXRoIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVyZWQgZmFjZXRzIChzZWUgW2ZhY2V0c1JlZ2lzdHJ5XSguL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpKSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGluZm9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuIEAgQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZShpbmZvLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gaW5mby5Db21wb25lbnRDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdjcmVhdGU6IGNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgZnVuY3Rpb24sIFwiJyArIHR5cGVvZiBDb21wb25lbnRDbGFzcyArICdcIiBwYXNzZWQnOyBcbiAgICAgICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudCcsIG1lc3NhZ2UsICc7dXNpbmcgYmFzZSBDb21wb25lbnQgY2xhc3MgaW5zdGVhZCcpO1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHZhciBhQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKGluZm8uc2NvcGUsIGluZm8uZWwsIGluZm8ubmFtZSwgaW5mbyk7XG5cbiAgICBpZiAoaW5mby5leHRyYUZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleShpbmZvLmV4dHJhRmFjZXRzQ2xhc3NlcywgZnVuY3Rpb24oRmFjZXRDbGFzcykge1xuICAgICAgICAgICAgaWYgKCEgYUNvbXBvbmVudC5oYXNGYWNldChGYWNldENsYXNzKSlcbiAgICAgICAgICAgICAgICBhQ29tcG9uZW50LmFkZEZhY2V0KEZhY2V0Q2xhc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gYUNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50LCBpbmNsdWRpbmcgYSBjb3B5IG9mIERPTSBlbGVtZW50LiBSZXR1cm5zIGEgY29weSBvZiBgY29tcG9uZW50YCAob2YgdGhlIHNhbWUgY2xhc3MpIHdpdGggbmV3IERPTSBlbGVtZW50IChub3QgaW5zZXJ0ZWQgaW50byBwYWdlKS5cbiAqIENvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3JpZ2luYWwgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50IGNsYXNzIG9yIHN1YmNsYXNzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBDb3B5IG9wdGlvbmFsIGB0cnVlYCB0byBtYWtlIGRlZXAgY29weSBvZiBET00gZWxlbWVudCwgb3RoZXJ3aXNlIG9ubHkgZWxlbWVudCB3aXRob3V0IGNoaWxkcmVuIGlzIGNvcGllZFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNvcHkoY29tcG9uZW50LCBkZWVwQ29weSkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICBjaGVjayhkZWVwQ29weSwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuXG4gICAgaWYgKGRlZXBDb3B5ICYmICFjb21wb25lbnQuY29udGFpbmVyKSBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVlcCBjb3B5IGNvbXBvbmVudCB3aXRob3V0IGNvbnRhaW5lciBmYWNldCcpO1xuXG4gICAgLy8gY29weSBET00gZWxlbWVudCwgdXNpbmcgRG9tIGZhY2V0IGlmIGl0IGlzIGF2YWlsYWJsZVxuICAgIHZhciBuZXdFbCA9IGNvbXBvbmVudC5kb20gXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmRvbS5jb3B5KGRlZXBDb3B5KVxuICAgICAgICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbC5jbG9uZU5vZGUoZGVlcENvcHkpO1xuXG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvbmVudCBvZiB0aGUgc2FtZSBjbGFzcyBvbiB0aGUgZWxlbWVudFxuICAgIHZhciBhQ29tcG9uZW50ID0gQ29tcG9uZW50Q2xhc3MuY3JlYXRlT25FbGVtZW50KG5ld0VsLCB1bmRlZmluZWQsIGNvbXBvbmVudC5zY29wZSwgY29tcG9uZW50LmV4dHJhRmFjZXRzKTtcbiAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuX2dldFN0YXRlKGRlZXBDb3B5IHx8IGZhbHNlKTtcbiAgICBhQ29tcG9uZW50LnNldFN0YXRlKHN0YXRlKTtcbiAgICBfLmRlZmVyTWV0aG9kKGFDb21wb25lbnQsICdicm9hZGNhc3QnLCAnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBjb21wb25lbnQgYXRhY2hlZCB0byBlbGVtZW50LiBBbGwgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQgaW5oZXJpdCB0aGlzIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGUgY2xhc3MgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoICh0aGVjb250ZXh0IG9mIHRoZSBtZXRob2QgY2FsbCkuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBvcHRpb25hbCBlbGVtZW50IHRvIGF0dGFjaCBjb21wb25lbnQgdG8uIElmIGVsZW1lbnQgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5uZXJIVE1MIG9wdGlvbmFsIGlubmVyIGh0bWwgdG8gaW5zZXJ0IGluIGVsZW1lbnQgYmVmb3JlIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgb3B0aW9uYWwgc2NvcGUgdG8gcHV0IGNvbXBvbmVudCBpbi4gSWYgbm90IHBhc3NlZCwgY29tcG9uZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQuIElmIHN1Y2ggc2NvcGUgZG9lcyBub3QgZXhpc3QsIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IGV4dHJhRmFjZXRzIGxpc3Qgb2YgZXh0cmEgZmFjZXQgdG8gYWRkIHRvIGNvbXBvbmVudFxuICogQHJldHVybiB7U3ViY2xhc3MoQ29tcG9uZW50KX1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVPbkVsZW1lbnQoZWwsIGlubmVySFRNTCwgcm9vdFNjb3BlLCBleHRyYUZhY2V0cykge1xuICAgIGNoZWNrKGlubmVySFRNTCwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG4gICAgY2hlY2socm9vdFNjb3BlLCBNYXRjaC5PcHRpb25hbChTY29wZSkpO1xuICAgIGNoZWNrKGV4dHJhRmFjZXRzLCBNYXRjaC5PcHRpb25hbChbU3RyaW5nXSkpO1xuXG4gICAgLy8gXCJ0aGlzXCIgcmVmZXJzIHRvIHRoZSBjbGFzcyBvZiBjb21wb25lbnQgaGVyZSwgYXMgdGhpcyBpcyBhIGNsYXNzIG1ldGhvZFxuICAgIGlmIChlbCAmJiBpbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGlubmVySFRNTDtcbiAgICBlbCA9IGVsIHx8IF9jcmVhdGVDb21wb25lbnRFbGVtZW50LmNhbGwodGhpcywgaW5uZXJIVE1MKTtcbiAgICByb290U2NvcGUgPSByb290U2NvcGUgfHwgX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCk7XG4gICAgdmFyIGFDb21wb25lbnQgPSBfYWRkQXR0cmlidXRlQW5kQmluZENvbXBvbmVudC5jYWxsKHRoaXMsIGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKTtcbiAgICBhQ29tcG9uZW50LmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29tcG9uZW50RWxlbWVudChpbm5lckhUTUwpIHtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgdmFyIERvbSA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnRG9tJylcbiAgICAgICAgLCBkb21GYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ2RvbScpXG4gICAgICAgICwgdGVtcGxhdGVGYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ3RlbXBsYXRlJylcbiAgICAgICAgLCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjZXRDb25maWcgJiYgdGVtcGxhdGVGYWNldENvbmZpZy50ZW1wbGF0ZTtcblxuICAgIHZhciBlbENvbmZpZyA9IHtcbiAgICAgICAgZG9tQ29uZmlnOiBkb21GYWNldENvbmZpZyxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBjb250ZW50OiBpbm5lckhUTUxcbiAgICB9O1xuXG4gICAgcmV0dXJuIERvbS5jcmVhdGVFbGVtZW50KGVsQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCkge1xuICAgIHZhciBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgZmFsc2UsICdDb250YWluZXInKTtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LmNvbnRhaW5lci5zY29wZSA6IG5ldyBTY29wZShlbCk7XG59XG5cbmZ1bmN0aW9uIF9hZGRBdHRyaWJ1dGVBbmRCaW5kQ29tcG9uZW50KGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKSB7XG4gICAgLy8gYWRkIGJpbmQgYXR0cmlidXRlIHRvIGVsZW1lbnRcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgYXR0ci5jb21wQ2xhc3MgPSB0aGlzLm5hbWU7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgLy8gc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcbiAgICBtaWxvQmluZGVyKGVsLCByb290U2NvcGUpO1xuXG4gICAgcmV0dXJuIHJvb3RTY29wZVthdHRyLmNvbXBOYW1lXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGNvbXBvbmVudCBmcm9tIGNvbXBvbmVudCBzdGF0ZSwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2xhc3MsIGV4dHJhIGZhY2V0cywgZmFjZXRzIGRhdGEgYW5kIGFsbCBzY29wZSBjaGlsZHJlbi5cbiAqIFRoaXMgaXMgdXNlZCB0byBzYXZlL2xvYWQsIGNvcHkvcGFzdGUgYW5kIGRyYWcvZHJvcCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgc3RhdGUgZnJvbSB3aGljaCBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmV3VW5pcXVlTmFtZSBvcHRpb25hbCBgdHJ1ZWAgdG8gY3JlYXRlIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIGBGYWxzZWAgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUsIHJvb3RTY29wZSwgbmV3VW5pcXVlTmFtZSwgdGhyb3dPbkVycm9ycykge1xuICAgIGNoZWNrKHN0YXRlLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe1xuICAgICAgICBjb21wTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY29tcENsYXNzOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBleHRyYUZhY2V0czogTWF0Y2guT3B0aW9uYWwoW1N0cmluZ10pLFxuICAgICAgICBmYWNldHNTdGF0ZXM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIG91dGVySFRNTDogU3RyaW5nXG4gICAgfSkpO1xuXG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcblxuICAgIC8vIGNyZWF0ZSB3cmFwcGVyIGVsZW1lbnQgb3B0aW9uYWxseSByZW5hbWluZyBjb21wb25lbnRcbiAgICB2YXIgd3JhcEVsID0gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGFsbCBjb21wb25lbnRzIGZyb20gSFRNTFxuICAgIHZhciBzY29wZSA9IG1pbG9CaW5kZXIod3JhcEVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICAvLyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY29tcG9uZW50LCBjYWxsIHRvIF9hbnkgd2lsbCByZXR1cm4gaXRcbiAgICB2YXIgY29tcG9uZW50ID0gc2NvcGUuX2FueSgpO1xuXG4gICAgLy8gc2V0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgaWYgKHJvb3RTY29wZSkge1xuICAgICAgICBjb21wb25lbnQuc2NvcGUgPSByb290U2NvcGU7XG4gICAgICAgIHJvb3RTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSBjb21wb25lbnQgc3RhdGVcbiAgICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuICAgIF8uZGVmZXJNZXRob2QoY29tcG9uZW50LCAnYnJvYWRjYXN0JywgJ3N0YXRlcmVhZHknKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7ICAgXG59XG5cblxuLy8gdXNlZCBieSBDb21wb25lbnQkJGNyZWF0ZUZyb21TdGF0ZVxuZnVuY3Rpb24gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKSB7XG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBzdGF0ZS5vdXRlckhUTUw7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY3JlYXRlIGNvbXBvbmVudDogaW5jb3JyZWN0IEhUTUwsIGVsZW1lbnRzIG51bWJlcjogJyArIGNoaWxkcmVuLmxlbmd0aCArICcgKHNob3VsZCBiZSAxKScpO1xuICAgIHZhciBjb21wRWwgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGNvbXBFbCk7XG4gICAgYXR0ci5jb21wTmFtZSA9IG5ld1VuaXF1ZU5hbWUgPyBtaWxvQ29tcG9uZW50TmFtZSgpIDogc3RhdGUuY29tcE5hbWU7XG4gICAgYXR0ci5jb21wQ2xhc3MgPSBzdGF0ZS5jb21wQ2xhc3M7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gc3RhdGUuZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgcmV0dXJuIHdyYXBFbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IGZyb20gYSBEYXRhVHJhbnNmZXIgb2JqZWN0IChpZiBwb3NzaWJsZSlcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJcbiAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBkYXRhVHJhbnNmZXIgRGF0YSB0cmFuc2ZlclxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gXy5maW5kKGRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9EQVRBX1RZUEVfUkVHRVgudGVzdCh0eXBlKTtcbiAgICB9KTtcbiAgICBpZiAoIWRhdGFUeXBlKSByZXR1cm47XG5cbiAgICB2YXIgc3RhdGUgPSBfLmpzb25QYXJzZShkYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSkpO1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgIHJldHVybiBDb21wb25lbnQuY3JlYXRlRnJvbVN0YXRlKHN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluaXRpYWxpemVzIGNvbXBvbmVudC4gQXV0b21hdGljYWxseSBjYWxsZWQgYnkgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIG9mIEZhY2V0ZWRPYmplY3QuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaGVyaXRlZCBpbml0IG1ldGhvZHM6XG4gKiBgYGBcbiAqIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSB0byB3aGljaCBjb21wb25lbnQgd2lsbCBiZWxvbmcuIEl0IGlzIHVzdWFsbHkgYSB0b3AgbGV2ZWwgc2NvcGUgb2JqZWN0IHJldHVybmVkIGJ5IGBtaWxvLmJpbmRlcmAgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBDb250YWluZXIgZmFjZXQuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzY29wZSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50SW5mb30gY29tcG9uZW50SW5mbyBpbnN0YW5jZSBvZiBDb21wb25lbnRJbmZvIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiBjb21wb25lbnRcbiAqICBUT0RPIHRyeSByZW1vdmluZyBpdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5pdChzY29wZSwgZWxlbWVudCwgbmFtZSwgY29tcG9uZW50SW5mbykge1xuICAgIC8vIGNyZWF0ZSBET00gZWxlbWVudCBpZiBpdCB3YXNuJ3QgcGFzc2VkIHRvIENvbnN0cnVjdG9yXG4gICAgdGhpcy5lbCA9IGVsZW1lbnQgfHwgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG5cbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gY29tcG9uZW50IG9uIERPTSBlbGVtZW50XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb21wb25lbnQgYWxyZWFkeSBhdGFjaGVkXG4gICAgICAgIHZhciBlbENvbXAgPSB0aGlzLmVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgICAgICBpZiAoZWxDb21wKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvbXBvbmVudCAnICsgbmFtZSArICcgYXR0YWNoZWQgdG8gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGNvbXBvbmVudCAnICsgZWxDb21wLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuZWxbY29uZmlnLmNvbXBvbmVudFJlZl0gPSB0aGlzO1xuICAgIH1cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGNvbXBvbmVudEluZm86IGNvbXBvbmVudEluZm8sXG4gICAgICAgIGV4dHJhRmFjZXRzOiBbXVxuICAgIH0sIF8uRU5VTSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIC8vIGNyZWF0ZSBjb21wb25lbnQgbWVzc2VuZ2VyXG4gICAgdmFyIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1lc3Nlbmdlcik7XG5cbiAgICAvLyBjaGVjayBhbGwgZmFjZXRzIGRlcGVuZGVuY2llcyAocmVxdWlyZWQgZmFjZXRzKVxuICAgIHRoaXMuYWxsRmFjZXRzKCdjaGVjaycpO1xuXG4gICAgLy8gc3RhcnQgYWxsIGZhY2V0c1xuICAgIHRoaXMuYWxsRmFjZXRzKCdzdGFydCcpO1xuXG4gICAgLy8gY2FsbCBzdGFydCBtZXRob2QgaWYgaXQncyBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgaWYgKHRoaXMuc3RhcnQpIHRoaXMuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIFRoaXMgaXMgYSBzdHViIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aGV0aGVyIHRoZSBtZXRob2Qgb2Ygc3VwZXJjbGFzcyBzaG91bGQgYmUgY2FsbGVkIGluIHN1YmNsYXNzZXNcbiAqIFRoZSBzdGFydCBtZXRob2Qgb2Ygc3ViY2xhc3MgaW5zdGFuY2UgaXMgY2FsbGVkIG9uY2UgYWxsIHRoZSBmYWNldHMgYXJlIGNyZWF0ZWQsIGluaXRpYWxpemVkIGFuZCBzdGFydGVkIChzZWUgYWJvdmUpXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzdGFydCgpIHt9XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5pdGlhbGl6ZXMgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBjb21wb25lbnQgaXMgYm91bmQgdG9cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGUgRE9NIGFuZFxuICogd2lsbCBnZW5lcmF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50LlxuICogXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkY3JlYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICB0aGlzLmVsID0gdGhpcy5kb21cbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoKVxuICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICByZXR1cm4gdGhpcy5lbDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgaGFzIGZhY2V0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZhY2V0TmFtZU9yQ2xhc3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRoYXNGYWNldChmYWNldE5hbWVPckNsYXNzKSB7XG4gICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UodHlwZW9mIGZhY2V0TmFtZU9yQ2xhc3MgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZXROYW1lT3JDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWNldE5hbWVPckNsYXNzKTtcblxuICAgIHZhciBmYWNldCA9IHRoaXNbZmFjZXROYW1lXTtcbiAgICBpZiAoISBmYWNldCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY2V0KVxuICAgICAgICBsb2dnZXIud2FybignZXhwZWN0ZWQgZmFjZXQnLCBmYWNldE5hbWUsICdidXQgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlJyk7XG5cbiAgICByZXR1cm4gISEgZmFjZXQ7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBmYWNldCB3aXRoIGdpdmVuIG5hbWUgb3IgY2xhc3MgdG8gdGhlIGluc3RhbmNlIG9mIENvbXBvbmVudCAob3IgaXRzIHN1YmNsYXNzKS5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd8U3ViY2xhc3MoQ29tcG9uZW50KX0gZmFjZXROYW1lT3JDbGFzcyBuYW1lIG9mIGZhY2V0IGNsYXNzIG9yIHRoZSBjbGFzcyBpdHNlbGYuIElmIG5hbWUgaXMgcGFzc2VkLCB0aGUgY2xhc3Mgd2lsbCBiZSByZXRpcmV2ZWQgZnJvbSBmYWNldHNSZWdpc3RyeVxuICogQHBhcmFtIHtPYmplY3R9IGZhY2V0Q29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWUgb3B0aW9uYWwgZmFjZXQgbmFtZS4gQWxsb3dzIHRvIGFkZCBmYWNldCB1bmRlciBhIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGFkZEZhY2V0KGZhY2V0TmFtZU9yQ2xhc3MsIGZhY2V0Q29uZmlnLCBmYWNldE5hbWUsIHRocm93T25FcnJvcnMpIHtcbiAgICBjaGVjayhmYWNldE5hbWVPckNsYXNzLCBNYXRjaC5PbmVPZihTdHJpbmcsIE1hdGNoLlN1YmNsYXNzKENvbXBvbmVudEZhY2V0KSkpO1xuICAgIGNoZWNrKGZhY2V0Q29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgICBjaGVjayhmYWNldE5hbWUsIE1hdGNoLk9wdGlvbmFsKFN0cmluZykpO1xuXG4gICAgdmFyIEZhY2V0Q2xhc3M7XG4gICAgLy8gaWYgb25seSBuYW1lIHBhc3NlZCwgcmV0cmlldmUgZmFjZXQgY2xhc3MgZnJvbSByZWdpc3RyeVxuICAgIGlmICh0eXBlb2YgZmFjZXROYW1lT3JDbGFzcyA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXRDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZU9yQ2xhc3MpO1xuICAgICAgICBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZhY2V0Q2xhc3NOYW1lKTtcbiAgICB9IGVsc2UgXG4gICAgICAgIEZhY2V0Q2xhc3MgPSBmYWNldE5hbWVPckNsYXNzO1xuXG4gICAgaWYgKCFmYWNldE5hbWUpXG4gICAgICAgIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIHRoaXMuZXh0cmFGYWNldHMucHVzaChmYWNldE5hbWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0IHVzaW5nIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0XG4gICAgdmFyIG5ld0ZhY2V0ID0gRmFjZXRlZE9iamVjdC5wcm90b3R5cGUuYWRkRmFjZXQuY2FsbCh0aGlzLCBGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIC8vIGNoZWNrIGRlcGVuZWRlbmNpZXMgYW5kIHN0YXJ0IGZhY2V0XG4gICAgaWYgKG5ld0ZhY2V0LmNoZWNrKSBuZXdGYWNldC5jaGVjaygpO1xuICAgIGlmIChuZXdGYWNldC5zdGFydCkgbmV3RmFjZXQuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2QuXG4gKiBFbnZva2UgZ2l2ZW4gbWV0aG9kIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBvbiBhbGwgZmFjZXRzLlxuICogUmV0dXJucyB0aGUgbWFwIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhbGwgZmFjZXRzLiBJZiB0aGUgZmFjZXQgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QgaXQgaXMgc2ltcGx5IG5vdCBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIHdpbGwgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgbWV0aG9kIG5hbWUgdG8gZW52b2tlIG9uIHRoZSBmYWNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkYWxsRmFjZXRzKG1ldGhvZCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgcmV0dXJuIF8ubWFwS2V5cyh0aGlzLmZhY2V0cywgZnVuY3Rpb24oZmFjZXQsIGZjdE5hbWUpIHtcbiAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldFttZXRob2RdID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXRbbWV0aG9kXS5hcHBseShmYWNldCwgYXJncyk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBuYW1lIG9mIGNvbXBvbmVudCwgXG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG1pbG9Db21wb25lbnROYW1lKCk7XG4gICAgdGhpcy5jb21wb25lbnRJbmZvLnJlbmFtZShuYW1lLCBmYWxzZSk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gaXRzIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlc2VydmVTY29wZVByb3BlcnR5IHRydWUgbm90IHRvIGRlbGV0ZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW1vdmUocHJlc2VydmVTY29wZVByb3BlcnR5LCBxdWlldCkge1xuICAgIGlmICh0aGlzLnNjb3BlKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuX3JlbW92ZSh0aGlzLm5hbWUsIHF1aWV0KTtcbiAgICAgICAgaWYgKCEgcHJlc2VydmVTY29wZVByb3BlcnR5KVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NvcGU7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluc2VydHMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBET00gYW5kIGF0dGVtcHRzIHRvIGFkanVzdCB0aGUgc2NvcGUgdHJlZSBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudEVsICAgIFRoZSBlbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VFbCAob3B0aW9uYWwpIFRoZSByZWZlcmVuY2UgZWxlbWVudCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5zZXJ0SW50byhwYXJlbnRFbCwgcmVmZXJlbmNlRWwpIHtcbiAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUodGhpcy5lbCwgcmVmZXJlbmNlRWwpO1xuICAgIHRoaXMuc2V0U2NvcGVQYXJlbnRGcm9tRE9NKCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIFJldHVybnMgY29tcG9uZW50IHN0YXRlXG4gKlxuICogQHRoaXMge0NvbXBvbmVudH0gY29tcG9uZW50IHdoaWNoIHN0YXRlIHdpbGwgYmUgc2F2ZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFN0YXRlKCkge1xuICAgIHRoaXMuYnJvYWRjYXN0KCdnZXRzdGF0ZXN0YXJ0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICBzdGF0ZS5vdXRlckhUTUwgPSB0aGlzLmVsLm91dGVySFRNTDtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdicm9hZGNhc3QnLCAnZ2V0c3RhdGVjb21wbGV0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGU7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIElmIGNvbXBvbmVudCBoYXMgW1RyYW5zZmVyXSguL2NfZmFjZXRzL1RyYW5zZmVyLmpzLmh0bWwpIGZhY2V0IG9uIGl0LCB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgc3RhdGUgZnJvbSB0aGlzIGZhY2V0XG4gKiBSZXR1cm5zIGNvbXBvbmVudCBzdGF0ZVxuICpcbiAqIEB0aGlzIHtDb21wb25lbnR9IGNvbXBvbmVudCB3aGljaCBzdGF0ZSB3aWxsIGJlIHNhdmVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLiBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFRyYW5zZmVyU3RhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNmZXIuZ2V0U3RhdGUob3B0aW9ucylcbiAgICAgICAgICAgIDogdGhpcy5nZXRTdGF0ZShvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudFxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5nZXRTdGF0ZWAgYW5kIGJ5IFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSBmYWxzZSB0byBnZXQgc2hhbGxvdyBzdGF0ZSBmcm9tIGFsbCBmYWNldHMgKHRydWUgYnkgZGVmYXVsdClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JF9nZXRTdGF0ZShkZWVwU3RhdGUpe1xuXG4gICAgdmFyIGZhY2V0c1N0YXRlcyA9IHRoaXMuYWxsRmFjZXRzKCdnZXRTdGF0ZScsIGRlZXBTdGF0ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpO1xuICAgIGZhY2V0c1N0YXRlcyA9IF8uZmlsdGVyS2V5cyhmYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAhISBmY3RTdGF0ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBleHRyYUZhY2V0czogdGhpcy5leHRyYUZhY2V0cyxcbiAgICAgICAgZmFjZXRzU3RhdGVzOiBmYWNldHNTdGF0ZXNcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgc3RhdGUgb2YgY29tcG9uZW50LlxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGVgIGFuZCBieSBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHN0YXRlIHRvIHNldCB0aGUgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYWNldHNTdGF0ZXMpXG4gICAgICAgIF8uZWFjaEtleShzdGF0ZS5mYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlLCBmY3ROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmFjZXQgPSB0aGlzW2ZjdE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldC5zZXRTdGF0ZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZhY2V0LnNldFN0YXRlKGZjdFN0YXRlKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgc2NvcGUgcGFyZW50IG9mIGEgY29tcG9uZW50LlxuICogSWYgYGNvbmRpdGlvbk9yRmFjZXRgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbiBpbW1lZGlhdGUgcGFyZW50IHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgY2xvc2VzdCBhbmNlc3RvciB3aXRoIGEgc3BlY2lmaWVkIGZhY2V0IG9yIHBhc3NpbmcgY29uZGl0aW9uIHRlc3QuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICByZXR1cm4gX2NhbGxHZXRTY29wZVBhcmVudC5jYWxsKHRoaXMsIF9nZXRTY29wZVBhcmVudCwgY29uZGl0aW9uT3JGYWNldCk7XG59XG5cbmZ1bmN0aW9uIF9jYWxsR2V0U2NvcGVQYXJlbnQoX2dldFNjb3BlUGFyZW50RnVuYywgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBjb21wb25lbnRVdGlscy5fbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgcmV0dXJuIF9nZXRTY29wZVBhcmVudEZ1bmMuY2FsbCh0aGlzLCBjb25kaXRpb25GdW5jKTsgICBcbn1cblxuZnVuY3Rpb24gX2dldFNjb3BlUGFyZW50KGNvbmRpdGlvbkZ1bmMpIHtcbiAgICB2YXIgcGFyZW50O1xuICAgIHRyeSB7IHBhcmVudCA9IHRoaXMuc2NvcGUuX2hvc3RPYmplY3Qub3duZXI7IH0gY2F0Y2goZSkge31cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGNvbXBvbmVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMocGFyZW50KSApXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNjb3BlIHBhcmVudCB3aXRoIGEgZ2l2ZW4gY2xhc3MsIHdpdGggc2FtZSBjbGFzcyBpZiBub3Qgc3BlY2lmaWVkXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBDb21wb25lbnRDbGFzcyBjb21wb25lbnQgY2xhc3MgdGhhdCB0aGUgcGFyZW50IHNob3VsZCBoYXZlLCBzYW1lIGNsYXNzIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKENvbXBvbmVudENsYXNzKSB7XG4gICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnRDbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBfZ2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wIGluc3RhbmNlb2YgQ29tcG9uZW50Q2xhc3M7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBwYXJlbnQgb2YgYSBjb21wb25lbnQuXG4gKiBJZiBgY29uZGl0aW9uT3JGYWNldGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3Btb3N0IHNjb3BlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHRvcG1vc3QgYW5jZXN0b3Igd2l0aCBhIHNwZWNpZmllZCBmYWNldCBvciBwYXNzaW5nIGNvbmRpdGlvbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudChjb25kaXRpb25PckZhY2V0KSB7XG4gICAgcmV0dXJuIF9jYWxsR2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBfZ2V0VG9wU2NvcGVQYXJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VG9wU2NvcGVQYXJlbnQoY29uZGl0aW9uRnVuYykge1xuICAgIHZhciB0b3BQYXJlbnRcbiAgICAgICAgLCBwYXJlbnQgPSB0aGlzO1xuICAgIGRvIHtcbiAgICAgICAgcGFyZW50ID0gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHRvcFBhcmVudCA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRvcFBhcmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2NvcGUgcGFyZW50IHdpdGggYSBnaXZlbiBjbGFzcywgd2l0aCBzYW1lIGNsYXNzIGlmIG5vdCBzcGVjaWZpZWRcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IENvbXBvbmVudENsYXNzIGNvbXBvbmVudCBjbGFzcyB0aGF0IHRoZSBwYXJlbnQgc2hvdWxkIGhhdmUsIHNhbWUgY2xhc3MgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MoQ29tcG9uZW50Q2xhc3MpIHtcbiAgICBDb21wb25lbnRDbGFzcyA9IENvbXBvbmVudENsYXNzIHx8IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIF9nZXRUb3BTY29wZVBhcmVudC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgcmV0dXJuIGNvbXAgaW5zdGFuY2VvZiBDb21wb25lbnRDbGFzcztcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEZpbmRzIHNjb3BlIHBhcmVudCBvZiBjb21wb25lbnQgdXNpbmcgRE9NIHRyZWUgKHVubGlrZSBnZXRTY29wZVBhcmVudCB0aGF0IHNpbXBseSBnb2VzIHVwIHRoZSBzY29wZSB0cmVlKS5cbiAqIFdoaWxlIGdldFNjb3BlUGFyZW50IGlzIGZhc3RlciBpdCBtYXkgZmFpbCBpZiBzY29wZSBjaGFpbiBpcyBub3Qgc2V0dXAgeWV0IChlLmcuLCB3aGVuIGNvbXBvbmVudCBoYXMgYmVlbiBqdXN0IGluc2VydGVkKS5cbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnQgd2lsbCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHNjb3BlIG9iamVjdCBvZiBjb250YWluZXIgZmFjZXQgb2YgdGhhdCBwYXJlbnQuXG4gKiBSZXR1cm5lZCBzY29wZSBwYXJlbnQgb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVuZGVmaW5lZCAoYXMgd2VsbCBhcyBjb21wb25lbnQncyBzY29wZSBwcm9wZXJ0eSkgaWYgbm8gcGFyZW50IGluIHRoZSBET00gdHJlZSBoYXMgY29udGFpbmVyIGZhY2V0LlxuICogVE9ETyBNZXRob2Qgd2lsbCBub3QgYmluZCBET00gY2hpbGRyZW4gY29ycmVjdGx5IGlmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIGZhY2V0LlxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JHNldFNjb3BlUGFyZW50RnJvbURPTSgpIHtcbiAgICB2YXIgcGFyZW50RWwgPSB0aGlzLmVsLnBhcmVudE5vZGU7XG5cbiAgICB2YXIgcGFyZW50LCBmb3VuZFBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50RWwgJiYgISBmb3VuZFBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHBhcmVudEVsKTtcbiAgICAgICAgZm91bmRQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlKCk7IC8vIHJlbW92ZSBjb21wb25lbnQgZnJvbSBpdHMgY3VycmVudCBzY29wZSAoaWYgaXQgaXMgZGVmaW5lZClcbiAgICBpZiAoZm91bmRQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yZW5hbWUodW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHBhcmVudC5jb250YWluZXIuc2NvcGUuX2FkZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9ICAgICAgICBcbn1cblxuXG4vKipcbiAqIFdhbGtzIGNvbXBvbmVudCB0cmVlLCBjYWxsaW5nIHByb3ZpZGVkIGNhbGxiYWNrIG9uIGVhY2ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcGFyYW0gdGhpc0FyZ1xuICovXG5mdW5jdGlvbiBDb21wb25lbnQkd2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcyk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHRoaXMuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnQud2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50JHRyZWVQYXRoT2YoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGRvbVV0aWxzLnRyZWVQYXRoT2YodGhpcy5lbCwgY29tcG9uZW50LmVsKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCh0cmVlUGF0aCwgbmVhcmVzdCkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgodGhpcy5lbCwgdHJlZVBhdGgsIG5lYXJlc3QpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIENvbXBvbmVudCRpbnNlcnRBdFRyZWVQYXRoKHRyZWVQYXRoLCBjb21wb25lbnQsIG5lYXJlc3QpIHtcbiAgICB2YXIgd2FzSW5zZXJ0ZWQgPSBkb21VdGlscy5pbnNlcnRBdFRyZWVQYXRoKHRoaXMuZWwsIHRyZWVQYXRoLCBjb21wb25lbnQuZWwpO1xuICAgIGlmICh3YXNJbnNlcnRlZCkgY29tcG9uZW50LnNldFNjb3BlUGFyZW50RnJvbURPTSgpO1xuICAgIHJldHVybiB3YXNJbnNlcnRlZDtcbn1cblxuXG4vKipcbiAqIEJyb2FkY2FzdCBtZXNzYWdlIHRvIGNvbXBvbmVudCBhbmQgdG8gYWxsIGl0cyBzY29wZSBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbXNnIG1lc3NhZ2UgdG8gYmUgc2VudFxuICogQHBhcmFtIHtbQW55XX0gZGF0YSBvcHRpb25hbCBtZXNzYWdlIGRhdGFcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSBzeW5jaHJvbm91c2x5IGlmIGl0IHNob3VsZCB1c2UgcG9zdE1lc3NhZ2VTeW5jXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRicm9hZGNhc3QobXNnLCBkYXRhLCBjYWxsYmFjaywgc3luY2hyb25vdXNseSkge1xuICAgIHZhciBwb3N0TWV0aG9kID0gc3luY2hyb25vdXNseSA/ICdwb3N0TWVzc2FnZVN5bmMnIDogJ3Bvc3RNZXNzYWdlJztcbiAgICB0aGlzLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudFtwb3N0TWV0aG9kXShtc2csIGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY29tcG9uZW50OiByZW1vdmVzIGNvbXBvbmVudCBmcm9tIERPTSwgcmVtb3ZlcyBpdCBmcm9tIHNjb3BlLCBkZWxldGVzIGFsbCByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYWxsIG1lc3NhZ2VzIGJvdGggY29tcG9uZW50IGFuZCBhbGwgZmFjZXRzXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRkZXN0cm95KHF1aWV0KSB7XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybignQ29tcG9uZW50IGRlc3Ryb3k6IGNvbXBvbmVudCBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKGZhbHNlLCBxdWlldCk7XG4gICAgdGhpcy5hbGxGYWNldHMoJ2Rlc3Ryb3knKTtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgIGRvbVV0aWxzLmRldGFjaENvbXBvbmVudCh0aGlzLmVsKTtcbiAgICAgICAgZG9tVXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50SW5mby5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgd2FzIGRlc3Ryb3llZFxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudC5GYWNldGBcbiAqXG4gKiBUaGUgY2xhc3MgZm90IHRoZSBmYWNldCBvZiBjb21wb25lbnQuIFdoZW4gYSBjb21wb25lbnQgaXMgY3JlYXRlZCwgaXRcbiAqIGNyZWF0ZXMgYWxsIGl0cyBmYWNldHMuXG4gKlxuICogU2VlIEZhY2V0cyBzZWN0aW9uIG9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBmYWNldHMgYW5kIG9uXG4gKiBob3cgdG8gY3JlYXRlIG5ldyBmYWNldHMgY2xhc3Nlcy5cbiAqXG4gKiAtIENvbXBvbmVudCAtIGJhc2ljIGNvbXBwb25lbnQgY2xhc3NcbiAqIC0gQ29tcG9uZW50RmFjZXQgLSBiYXNpY1xuICovXG5cbnZhciBGYWNldCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKEZhY2V0LCAnQ29tcG9uZW50RmFjZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRGYWNldDtcblxuXG4vKipcbiAqIHBvc3REb21QYXJlbnRcbiAqXG4gKiBJZiBmYWNldCBoYXMgRE9NIHBhcmVudCBmYWNldCAoc2VlIGBkb21QYXJlbnRgIG1ldGhvZCksIHBvc3RzIHRoZSBtZXNzYWdlIHRvIHRoaXMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZURhdGFcbiAqL1xudmFyIHBvc3REb21QYXJlbnQgPSBfLnBhcnRpYWwoX3Bvc3RQYXJlbnQsIGRvbVBhcmVudCk7XG5cbi8qKlxuICogcG9zdFNjb3BlUGFyZW50XG4gKlxuICogSWYgZmFjZXQgaGFzIHNjb3BlIHBhcmVudCBmYWNldCAoc2VlIGBzY29wZVBhcmVudGAgbWV0aG9kKSwgcG9zdHMgdGhlIG1lc3NhZ2UgdG8gdGhpcyBmYWNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlRGF0YVxuICovXG52YXIgcG9zdFNjb3BlUGFyZW50ID0gXy5wYXJ0aWFsKF9wb3N0UGFyZW50LCBzY29wZVBhcmVudCk7XG5cblxuXy5leHRlbmRQcm90byhDb21wb25lbnRGYWNldCwge1xuICAgIGluaXQ6IENvbXBvbmVudEZhY2V0JGluaXQsXG4gICAgc3RhcnQ6IENvbXBvbmVudEZhY2V0JHN0YXJ0LFxuICAgIGNoZWNrOiBDb21wb25lbnRGYWNldCRjaGVjayxcbiAgICBkZXN0cm95OiBDb21wb25lbnRGYWNldCRkZXN0cm95LFxuICAgIG9uQ29uZmlnTWVzc2FnZXM6IENvbXBvbmVudEZhY2V0JG9uQ29uZmlnTWVzc2FnZXMsXG4gICAgZG9tUGFyZW50OiBkb21QYXJlbnQsXG4gICAgcG9zdERvbVBhcmVudDogcG9zdERvbVBhcmVudCxcbiAgICBzY29wZVBhcmVudDogc2NvcGVQYXJlbnQsXG4gICAgcG9zdFNjb3BlUGFyZW50OiBwb3N0U2NvcGVQYXJlbnQsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBkaXNwYXRjaFNvdXJjZU1lc3NhZ2U6IGRpc3BhdGNoU291cmNlTWVzc2FnZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY3JlYXRlTWVzc2FnZVNvdXJjZTogX2NyZWF0ZU1lc3NhZ2VTb3VyY2UsXG4gICAgX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJOiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUElcbn0pO1xuXG5fLmV4dGVuZChDb21wb25lbnRGYWNldCwge1xuICAgIHJlcXVpcmVzRmFjZXQ6IHJlcXVpcmVzRmFjZXRcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoQ29tcG9uZW50RmFjZXQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vLyBpbml0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2VuZ2VyKCk7XG59XG5cblxuLy8gc29tZSBzdWJjbGFzc2VzIChlLmcuIE1vZGVsRmFjZXQpIG92ZXJycmlkZSB0aGlzIG1ldGhvZCBhbmQgZG8gbm90IGNyZWF0ZSB0aGVpciBvd24gbWVzc2VuZ2VyXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2VuZ2VyKCl7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG5ldyBNZXNzZW5nZXIodGhpcykpO1xufVxuXG5cbi8vIHN0YXJ0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZXNzYWdlcylcbiAgICAgICAgdGhpcy5vbkNvbmZpZ01lc3NhZ2VzKHRoaXMuY29uZmlnLm1lc3NhZ2VzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnRGYWNldCRvbkNvbmZpZ01lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJUeXBlID0gdHlwZW9mIHN1YnNjcmliZXI7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHRUeXBlID0gdHlwZW9mIHN1YnNjcmliZXIuY29udGV4dDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNvbnRleHQgPT0gdGhpcy5uYW1lIHx8IHN1YnNjcmliZXIuY29udGV4dCA9PSAnZmFjZXQnKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmliZXIuY29udGV4dCA9PSAnb3duZXInKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5vd25lclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCBpbiBjb25maWd1cmF0aW9uOiAnICsgc3Vic2NyaWJlci5jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBjb250ZXh0VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gc3Vic2NyaWJlciB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBzdWJzY3JpYmVyVHlwZSk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vLyBjaGVja0RlcGVuZGVuY2llc1xuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkY2hlY2soKSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZSkge1xuICAgICAgICB0aGlzLnJlcXVpcmUuZm9yRWFjaChmdW5jdGlvbihyZXFGYWNldCkge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5vd25lci5oYXNGYWNldChyZXFGYWNldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vd25lci5hZGRGYWNldChyZXFGYWNldCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBkZXN0cm95cyBmYWNldFxuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldKSB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBkb21QYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgRE9NIGVsZW1lbnQsIHRoYXQgaGFzIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZmFjZXQgY2xhc3MgYXR0YWNoZWQgdG8gaXQuIElmIHN1Y2ggZWxlbWVudCBkb2Vzbid0IGV4aXN0IG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGRvbVBhcmVudCgpIHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID0gY29tcG9uZW50VXRpbHMuZ2V0Q29udGFpbmluZ0NvbXBvbmVudCh0aGlzLm93bmVyLmVsLCBmYWxzZSwgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudFt0aGlzLm5hbWVdO1xufVxuXG5cbi8qKlxuICogc2NvcGVQYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgdGhpc2AgZmFjZXQgb2YgdGhlIGNsb3Nlc3Qgc2NvcGUgcGFyZW50IChpLmUuLCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gaXRzIGNvbnRhaW5lciBmYWNldCkuXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnRbdGhpcy5uYW1lXTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFBhcmVudChnZXRQYXJlbnRNZXRob2QsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgIHZhciBwYXJlbnRGYWNldCA9IGdldFBhcmVudE1ldGhvZC5jYWxsKHRoaXMpO1xuICAgIGlmIChwYXJlbnRGYWNldClcbiAgICAgICAgcGFyZW50RmFjZXQucG9zdE1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5nZXRNZXNzYWdlU291cmNlKCk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlU291cmNlKCkuZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVNZXNzYWdlU291cmNlKE1lc3NhZ2VTb3VyY2VDbGFzcywgb3B0aW9ucykge1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IE1lc3NhZ2VTb3VyY2VDbGFzcyh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoTWVzc2FnZVNvdXJjZUNsYXNzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBvcHRpb25zKSB7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2FnZVNvdXJjZUNsYXNzKHRoaXMsIHVuZGVmaW5lZCwgbWVzc2VuZ2VyQVBJT3JDbGFzcywgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1aXJlc0ZhY2V0KGZhY2V0TmFtZSkge1xuICAgIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIEZhY2V0IENsYXNzXG4gICAgdmFyIGZhY2V0UmVxdWlyZSA9IHRoaXMucHJvdG90eXBlLnJlcXVpcmU7XG5cbiAgICByZXR1cm4gZmFjZXRSZXF1aXJlICYmIChmYWNldFJlcXVpcmUuaW5kZXhPZihfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZSkpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZhY2V0UmVxdWlyZS5pbmRleE9mKF8uZmlyc3RMb3dlckNhc2UoZmFjZXROYW1lKSkgPj0gMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0NvbnRhaW5lcicpYFxuICogQSBzcGVjaWFsIGNvbXBvbmVudCBmYWNldCB0aGF0IG1ha2VzIGNvbXBvbmVudCBjcmVhdGUgaXRzIG93biBpbm5lciBzY29wZS5cbiAqIFdoZW4gW21pbG8uYmluZGVyXSguLi8uLi9iaW5kZXIuanMuaHRtbCkgYmluZHMgRE9NIHRyZWUgYW5kIGNyZWF0ZXMgY29tcG9uZW50cywgaWYgY29tcG9uZW50cyBhcmUgaW5zaWRlIGNvbXBvbmVudCBXSVRIIENvbnRhaW5lciBmYWNldCwgdGhleSBhcmUgcHV0IG9uIHRoZSBgc2NvcGVgIG9mIGl0IChjb21wb25lbnQuY29udGFpbmVyLnNjb3BlIC0gc2VlIFtTY29wZV0oLi4vc2NvcGUuanMuaHRtbCkpLCBvdGhlcndpc2UgdGhleSBhcmUgcHV0IG9uIHRoZSBzYW1lIHNjb3BlIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGRlZXBlciBpbiBET00gdHJlZS5cbiAqIEl0IGFsbG93cyBjcmVhdGluZyBuYW1lc3BhY2VzIGF2b2lkaW5nIGNvbXBvbmVudHMgbmFtZXMgY29uZmxpY3RzLCBhdCB0aGUgc2FtZSB0aW1lIGNyZWF0aW5nIG1vcmUgc2hhbGxvdyBjb21wb25lbnRzIHRyZWUgdGhhbiB0aGUgRE9NIHRyZWUuXG4gKiBUbyBjcmVhdGUgY29tcG9uZW50cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5jb250YWluZXIuYmluZGVyKCk7XG4gKiBgYGBcbiAqIFNlZSBbbWlsby5iaW5kZXJdKC4uLy4uL2JpbmRlci5qcy5odG1sKVxuICovXG52YXIgQ29udGFpbmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0NvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogIyMjI0NvbnRhaW5lciBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2JpbmRlcl0oI0NvbnRhaW5lciRiaW5kZXIpIC0gY3JlYXRlIGNvbXBvbmVudHMgZnJvbSBET00gaW5zaWRlIHRoZSBjdXJyZW50IG9uZVxuICovXG5fLmV4dGVuZFByb3RvKENvbnRhaW5lciwge1xuICAgIHN0YXJ0OiBDb250YWluZXIkc3RhcnQsXG4gICAgcGF0aDogQ29udGFpbmVyJHBhdGgsXG4gICAgZ2V0U3RhdGU6IENvbnRhaW5lciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogQ29udGFpbmVyJHNldFN0YXRlLFxuICAgIGJpbmRlcjogQ29udGFpbmVyJGJpbmRlcixcbiAgICBkZXN0cm95OiBDb250YWluZXIkZGVzdHJveSxcbiAgICB1bndyYXA6IENvbnRhaW5lciR1bndyYXAsXG5cbiAgICBhcHBlbmQ6IENvbnRhaW5lciRhcHBlbmQsXG4gICAgaW5zZXJ0QmVmb3JlOiBDb250YWluZXIkaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZTogQ29udGFpbmVyJHJlbW92ZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb250YWluZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5lcjtcblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTY2FucyBET00sIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgYWRkcyB0byBzY29wZSBjaGlsZHJlbiBvZiBjb21wb25lbnQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGJpbmRlcigpIHtcbiAgICByZXR1cm4gbWlsb0JpbmRlcih0aGlzLm93bmVyLmVsLCB0aGlzLnNjb3BlLCBmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0dXAgZW1wdHkgc2NvcGUgb2JqZWN0IG9uIHN0YXJ0XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMub3duZXIuZWwsIHRoaXMpO1xufVxuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTYWZlbHkgdHJhdmVyc2VzIGNvbXBvbmVudCBzY29wZVxuICogUmV0dXJucyBjb21wb25lbnQgaW4gc2NvcGUgZm9yIGEgZ2l2ZW4gcGF0aFxuICogSWYgcGF0aCBpcyBpbnZhbGlkIHRoZSBtZXRob2Qgd2lsbCB0aHJvdywgaWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IGF0IGEgZ2l2ZW4gcGF0aCBvciBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFsb25nIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgQ29udGFpbmVyIGZhY2V0IHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLCBcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCBvZiBjaGlsZCBjb21wb25lbnQgaW4gc2NvcGUsIGVhY2ggbmFtZSBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLicsIGUuZy46ICcuY2hpbGQuc3ViY2hpbGQnXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRwYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAocGF0aFswXSB8fCBsZW4gPCAyKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYXRoW2ldO1xuICAgICAgICBpZiAoIWFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgICAgIGlmICghY29tcC5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29tcCA9IGNvbXAuY29udGFpbmVyLnNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG5cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQYXRoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggJyArIHBhdGggKyAnIGlzIGludmFsaWQnKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGluIHRoZSBzY29wZVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcENvcHkgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRnZXRTdGF0ZShkZWVwQ29weSkge1xuICAgIHZhciBzdGF0ZSA9IHsgc2NvcGU6IHt9IH07XG4gICAgaWYgKGRlZXBDb3B5ICE9PSBmYWxzZSlcbiAgICAgICAgdGhpcy5zY29wZS5fZWFjaChmdW5jdGlvbihjb21wb25lbnQsIGNvbXBOYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY29wZVtjb21wTmFtZV0gPSBjb21wb25lbnQuX2dldFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNldHMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHNjb3BlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICBfLmVhY2hLZXkoc3RhdGUuc2NvcGUsIGZ1bmN0aW9uKGNvbXBEYXRhLCBjb21wTmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5zY29wZVtjb21wTmFtZV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUoY29tcERhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignY29tcG9uZW50IFwiJyArIGNvbXBOYW1lICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHNjb3BlJyk7XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRkZXN0cm95KCkge1xuICAgIHRoaXMuc2NvcGUuX2VhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY29wZS5fZGV0YWNoRWxlbWVudCgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBNb3ZlcyBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciBpbnRvIHRoZSBwYXJlbnQgc2NvcGVcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBwYXNzIGZhbHNlIHRvIG5vdCByZW5hbWUgc2NvcGUgY2hpbGRyZW4gKGRlZmF1bHQgaXMgdHJ1ZSlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzdHJveSBJZiBub3QgZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCAoZGVmYXVsdCBpcyB0cnVlKS5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJHVud3JhcChyZW5hbWVDaGlsZHJlbiwgZGVzdHJveSkge1xuICAgIGRvbVV0aWxzLnVud3JhcEVsZW1lbnQodGhpcy5vd25lci5lbCk7XG4gICAgdGhpcy5zY29wZSAmJiB0aGlzLnNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuICE9PSBmYWxzZSkgY2hpbGQucmVuYW1lKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLm93bmVyLnNjb3BlICYmIHRoaXMub3duZXIuc2NvcGUuX2FkZChjaGlsZCk7XG4gICAgfSwgdGhpcyk7XG4gICAgaWYgKGRlc3Ryb3kgIT09IGZhbHNlKSB0aGlzLm93bmVyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEFwcGVuZCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXAgY29tcG9uZW50IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkYXBwZW5kKGNvbXApIHtcbiAgICB0aGlzLnNjb3BlLl9hZGQoY29tcCk7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChjb21wLmVsKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZSBiZWZvcmUgYW5vdGhlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzaWJsaW5nIGNvbXBvbmVudCBiZWZvcmUgd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGluc2VydEJlZm9yZShjb21wLCBzaWJsaW5nKSB7XG4gICAgdGhpcy5zY29wZS5fYWRkKGNvbXApO1xuICAgIHRoaXMuZWwuaW5zZXJ0QmVmb3JlKGNvbXAuZWwsIHNpYmxpbmcgJiYgc2libGluZy5lbCk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRyZW1vdmUoY29tcCkge1xuICAgIHRoaXMuc2NvcGUuX3JlbW92ZShjb21wKTtcbiAgICB0aGlzLm93bmVyLmVsLnJlbW92ZUNoaWxkKGNvbXAuZWwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcblxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRGF0YU1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGF0YScpXG4gICAgLCBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGVfZGF0YScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBwYXRoVXRpbHMgPSBNb2RlbC5fdXRpbHMucGF0aFxuICAgICwgbW9kZWxVdGlscyA9IE1vZGVsLl91dGlscy5tb2RlbFxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSBNb2RlbC5fdXRpbHMuY2hhbmdlRGF0YUhhbmRsZXJcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgc2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuc2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEYXRhJylgXG4gKiBGYWNldCB0byBnaXZlIGFjY2VzcyB0byBET00gZGF0YVxuICovXG52YXIgRGF0YSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEYXRhJyk7XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZHNcbiAqXG4gKiAtIFtzdGFydF0oI0RhdGEkc3RhcnQpIC0gc3RhcnQgRGF0YSBmYWNldFxuICogLSBbZ2V0XSgjRGF0YSRnZXQpIC0gZ2V0IERPTSBkYXRhIGZyb20gRE9NIHRyZWVcbiAqIC0gW3NldF0oI0RhdGEkc2V0KSAtIHNldCBET00gZGF0YSB0byBET00gdHJlZVxuICogLSBbcGF0aF0oI0RhdGEkcGF0aCkgLSBnZXQgcmVmZXJlbmNlIHRvIERhdGEgZmFjZXQgYnkgcGF0aFxuICovXG5fLmV4dGVuZFByb3RvKERhdGEsIHtcbiAgICBzdGFydDogRGF0YSRzdGFydCxcbiAgICBnZXRTdGF0ZTogRGF0YSRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogRGF0YSRzZXRTdGF0ZSxcblxuICAgIGdldDogRGF0YSRnZXQsXG4gICAgc2V0OiBEYXRhJHNldCxcbiAgICBkZWw6IERhdGEkZGVsLFxuICAgIHNwbGljZTogRGF0YSRzcGxpY2UsXG4gICAgbGVuOiBEYXRhJGxlbixcbiAgICBwYXRoOiBEYXRhJHBhdGgsXG4gICAgZ2V0UGF0aDogRGF0YSRnZXRQYXRoLFxuICAgIGdldEtleTogRGF0YSRnZXRLZXksXG5cbiAgICBfZ2V0OiBEYXRhJF9nZXQsXG4gICAgX3NldDogRGF0YSRfc2V0LFxuICAgIF9kZWw6IERhdGEkX2RlbCxcbiAgICBfc3BsaWNlOiBEYXRhJF9zcGxpY2UsXG4gICAgX2xlbjogRGF0YSRfbGVuLFxuXG4gICAgX3NldFNjYWxhclZhbHVlOiBEYXRhJF9zZXRTY2FsYXJWYWx1ZSxcbiAgICBfZ2V0U2NhbGFyVmFsdWU6IERhdGEkX2dldFNjYWxhclZhbHVlLFxuICAgIF9idWJibGVVcERhdGFDaGFuZ2U6IERhdGEkX2J1YmJsZVVwRGF0YUNoYW5nZSxcbiAgICBfcXVldWVEYXRhQ2hhbmdlOiBEYXRhJF9xdWV1ZURhdGFDaGFuZ2UsXG4gICAgX3Bvc3REYXRhQ2hhbmdlczogRGF0YSRfcG9zdERhdGFDaGFuZ2VzLFxuICAgIF9wcmVwYXJlTWVzc2FnZVNvdXJjZTogX3ByZXBhcmVNZXNzYWdlU291cmNlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERhdGEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGE7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBEYXRhIHByb3RvdHlwZVxuICovXG5bJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWwuUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShEYXRhLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cblxuLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHdyYXBwZWQgdG8gc3VwcG9ydCBcIipcIiBwYXR0ZXJuIHN1YnNjcmlwdGlvbnNcbnZhciBwcm94eURhdGFTb3VyY2VNZXRob2RzID0ge1xuICAgICAgICAvLyB2YWx1ZTogJ3ZhbHVlJyxcbiAgICAgICAgdHJpZ2dlcjogJ3RyaWdnZXInXG4gICAgfTtcblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgRGF0YSBmYWNldFxuICogQ2FsbGVkIGJ5IGNvbXBvbmVudCBhZnRlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIERhdGEkc3RhcnQoKSB7XG4gICAgLy8gY2hhbmdlIG1lc3NlbmdlciBtZXRob2RzIHRvIHdvcmsgd2l0aCBcIipcIiBzdWJzY3JpcHRpb25zIChsaWtlIE1vZGVsIGNsYXNzKVxuICAgIHBhdGhVdGlscy53cmFwTWVzc2VuZ2VyTWV0aG9kcy5jYWxsKHRoaXMpO1xuXG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBnZXQvc2V0IG1ldGhvZHMgdG8gc2V0IGRhdGEgb2YgZWxlbWVudFxuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3ModGhpcy5vd25lci5lbCk7XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlc1F1ZXVlID0gW107XG5cbiAgICB0aGlzLl9wcmVwYXJlTWVzc2FnZVNvdXJjZSgpO1xuXG4gICAgLy8gc3RvcmUgZmFjZXQgZGF0YSBwYXRoXG4gICAgdGhpcy5fcGF0aCA9ICcuJyArIHRoaXMub3duZXIubmFtZTtcblxuICAgIC8vIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAvLyBwcmVwYXJlIGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzXG4gICAgLy8gdGhpcy5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBET00gZXZlbnQgYW5kIGFjY2Vzc29ycycgbWVzc2FnZXNcbiAgICB0aGlzLm9uU3luYygnJywgb25Pd25EYXRhQ2hhbmdlKTtcblxuICAgIC8vIG1lc3NhZ2UgdG8gbWFyayB0aGUgZW5kIG9mIGJhdGNoIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgdGhpcy5vblN5bmMoJ2RhdGFjaGFuZ2VzZmluaXNoZWQnLCBvbkRhdGFDaGFuZ2VzRmluaXNoZWQpO1xuXG4gICAgLy8gY2hhbmdlcyBpbiBzY29wZSBjaGlsZHJlbiB3aXRoIERhdGEgZmFjZXRcbiAgICB0aGlzLm9uU3luYygnY2hpbGRkYXRhJywgb25DaGlsZERhdGEpO1xuXG4gICAgLy8gdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzIG9mIERhdGEgZmFjZXQuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBEYXRhIGZhY2V0IGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG4vLyBmdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gRGF0YSBmYWNldCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIC8vIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbi8vICAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuLy8gICAgICAgICBfbWVzc2VuZ2VyOiBleHRlcm5hbE1lc3Nlbmdlcixcbi8vICAgICAgICAgX2ludGVybmFsTWVzc2VuZ2VyOiBpbnRlcm5hbE1lc3NlbmdlclxuLy8gICAgIH0pO1xuLy8gfVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIERPTUV2ZW50c1NvdXJjZSBhbmQgY29ubmVjdHMgaXQgdG8gRGF0YSBmYWNldCBtZXNzZW5nZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgdmFyIGRhdGFBUEkgPSBuZXcgRGF0YU1zZ0FQSSh0aGlzLm93bmVyKVxuICAgICAgICAsIGRhdGFFdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHByb3h5RGF0YVNvdXJjZU1ldGhvZHMsIGRhdGFBUEksIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZGF0YUV2ZW50c1NvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZGF0YUV2ZW50c1NvdXJjZScsIGRhdGFFdmVudHNTb3VyY2UpO1xuXG4gICAgLy8gbWFrZSB2YWx1ZSBtZXRob2Qgb2YgRGF0YU1zZ0FQSSBhdmFpbGFibGUgb24gRGF0YSBmYWNldFxuICAgIC8vIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCwgZ2V0KCkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGRhdGEuXG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKGRhdGFBUEksICd2YWx1ZScsICd2YWx1ZScsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnVHlwZSBpbiB0aGlzIGluc3RhbmNlIHdpbGwgYmUgJydcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGRhdGEgY2hhbmdlIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uT3duRGF0YUNoYW5nZShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5fYnViYmxlVXBEYXRhQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMuX3F1ZXVlRGF0YUNoYW5nZShkYXRhKTtcbiAgICBpZiAoZGF0YS5wYXRoID09PSAnJykge1xuICAgICAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhkYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSgnZGF0YWNoYW5nZXNmaW5pc2hlZCcsIHsgdHJhbnNhY3Rpb246IGluVHJhbnNhY3Rpb24gfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNlbmRzIGRhdGEgYG1lc3NhZ2VgIHRvIERPTSBwYXJlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1zZ0RhdGEgZGF0YSBjaGFuZ2UgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBEYXRhJF9idWJibGVVcERhdGFDaGFuZ2UobXNnRGF0YSkge1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgdmFyIHBhcmVudE1zZyA9IF8uY2xvbmUobXNnRGF0YSk7XG4gICAgICAgIHBhcmVudE1zZy5wYXRoID0gKHRoaXMuX3BhdGggfHwgKCcuJyArIHRoaXMub3duZXIubmFtZSkpICArIHBhcmVudE1zZy5wYXRoO1xuICAgICAgICBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdjaGlsZGRhdGEnLCBwYXJlbnRNc2cgfHwgbXNnRGF0YSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFF1ZXVlcyBkYXRhIG1lc3NhZ2VzIHRvIGJlIGRpc3BhdGNoZWQgdG8gY29ubmVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGFuZ2UgZGF0YSBjaGFuZ2UgZGVzY3JpcHRpb25cbiAqL1xuZnVuY3Rpb24gRGF0YSRfcXVldWVEYXRhQ2hhbmdlKGNoYW5nZSkge1xuICAgIHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucHVzaChjaGFuZ2UpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhY2hhbmdlc2ZpbmlzaGVkIGV2ZW50LlxuICogQ2FsbHMgdGhlIG1ldGhvZCB0byBwb3N0IGNoYW5nZXMgYmF0Y2ggYW5kIGJ1YmJsZXMgdXAgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBkYXRhIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb25EYXRhQ2hhbmdlc0ZpbmlzaGVkKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX3Bvc3REYXRhQ2hhbmdlcyhkYXRhLmluVHJhbnNhY3Rpb24pO1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuICAgIGlmIChwYXJlbnREYXRhKSBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdkYXRhY2hhbmdlc2ZpbmlzaGVkJywgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFsbCBjaGFuZ2VzIGNvbGxlY3RlZCBpbiB0aGUgYmF0Y2hcbiAqIFVzZWQgZm9yIGRhdGEgcHJvcGFnYXRpb24gLSBjb25uZWN0b3Igc3Vic2NyaWJlcyB0byB0aGlzIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBEYXRhJF9wb3N0RGF0YUNoYW5nZXMoaW5UcmFuc2FjdGlvbikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucmV2ZXJzZSgpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHtcbiAgICAgICAgY2hhbmdlczogcXVldWUsXG4gICAgICAgIHRyYW5zYWN0aW9uOiBpblRyYW5zYWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXNRdWV1ZSA9IFtdOyAvLyBpdCBjYW4ndCBiZSAubGVuZ3RoID0gMCwgYXMgdGhlIGFjdHVhbCBhcnJheSBtYXkgc3RpbGwgYmUgdXNlZFxufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudCBpbiBjaGlsZCBEYXRhIGZhY2V0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2dUeXBlXG4gKiBAcGFyYW0ge09iZWpjdH0gZGF0YSBkYXRhIGNoYW5nZSBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBvbkNoaWxkRGF0YShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShkYXRhLnBhdGgsIGRhdGEpO1xuICAgIHRoaXMuX2J1YmJsZVVwRGF0YUNoYW5nZShkYXRhKTtcbiAgICB0aGlzLl9xdWV1ZURhdGFDaGFuZ2UoZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBkYXRhIGluIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHkuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhY3R1YWxseSBzZXQgKGNhbiBiZSBkaWZmZXJlbnQsIGlmIGNvbXBvbmVudHMgbWF0Y2hpbmcgc29tZSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuIElmIHRoZSB2YWx1ZSBpZiBzY2FsYXIsIGl0IHdpbGwgYmUgc2V0IG9uIGNvbXBvbmVudCdzIGVsZW1lbnQsIGlmIHRoZSB2YWx1ZSBpcyBvYmplY3QgLSBvbiBET00gdHJlZSBpbnNpZGUgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtPYmplY3R8U3RyaW5nfE51bWJlcn1cbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJHNldCk7XG5cbiAgICB2YXIgY29tcG9uZW50U2V0dGVyID0gdGhpcy5jb25maWcuc2V0O1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50U2V0dGVyID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBvbmVudFNldHRlci5jYWxsKHRoaXMub3duZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodGhpcy5fc2V0LCBpblRyYW5zYWN0aW9uKTtcblxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLl9zZXQodmFsdWUpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zZXQpO1xuXG4gICAgdmFyIHZhbHVlU2V0O1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlU2V0ID0gW107XG5cbiAgICAgICAgICAgIHZhciBsaXN0RmFjZXQgPSB0aGlzLm93bmVyLmxpc3Q7XG4gICAgICAgICAgICBpZiAobGlzdEZhY2V0KXtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdExlbmd0aCA9IGxpc3RGYWNldC5jb3VudCgpXG4gICAgICAgICAgICAgICAgICAgICwgbmV3SXRlbXNDb3VudCA9IHZhbHVlLmxlbmd0aCAtIGxpc3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1zQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX2FkZEl0ZW1zKG5ld0l0ZW1zQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhsaXN0TGVuZ3RoLCBsaXN0RmFjZXQuY291bnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihjaGlsZFZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZERhdGEuY2FsbCh0aGlzLCB2YWx1ZVNldCwgY2hpbGRWYWx1ZSwgaW5kZXgsICdbJCRdJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdENvdW50ID0gbGlzdEZhY2V0LmNvdW50KClcbiAgICAgICAgICAgICAgICAgICAgLCByZW1vdmVDb3VudCA9IGxpc3RDb3VudCAtIHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVDb3VudC0tID4gMClcbiAgICAgICAgICAgICAgICAgICAgbGlzdEZhY2V0Ll9yZW1vdmVJdGVtKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogc2V0dGluZyBhcnJheSBkYXRhIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTZXQgPSB7fTtcbiAgICAgICAgICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oY2hpbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2V0Q2hpbGREYXRhLmNhbGwodGhpcywgdmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgJy4kJCcpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdmFsdWVTZXQgPSB0aGlzLl9zZXRTY2FsYXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlU2V0O1xuXG4gICAgcmV0dXJuIHZhbHVlU2V0O1xuXG5cbiAgICBmdW5jdGlvbiBzZXRDaGlsZERhdGEodmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSk7XG4gICAgICAgIHZhciBjaGlsZERhdGFGYWNldCA9IHRoaXMucGF0aChjaGlsZFBhdGgsIHR5cGVvZiBjaGlsZFZhbHVlICE9ICd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKGNoaWxkRGF0YUZhY2V0KSB7XG4gICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcoY2hpbGREYXRhRmFjZXQuc2V0LCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIHZhbHVlU2V0W2tleV0gPSBjaGlsZERhdGFGYWNldC5zZXQoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyBjb21wb25lbnQgZnJvbSB2aWV3IGFuZCBzY29wZSwgb25seSBpbiBjYXNlIGl0IGhhcyBJdGVtIGZhY2V0IG9uIGl0XG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBzZXQgdG8gRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gRGF0YSRkZWwoKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoRGF0YSRkZWwpO1xuXG4gICAgdmFyIGNvbXBvbmVudERlbGV0ZSA9IHRoaXMuY29uZmlnLmRlbDtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudERlbGV0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjb21wb25lbnREZWxldGUuY2FsbCh0aGlzLm93bmVyKTtcbiAgICAgICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9kZWwsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX2RlbCgpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobXNnLCBpblRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCcnLCBtc2cpO1xufVxuXG5cbmZ1bmN0aW9uIERhdGEkX2RlbCgpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9kZWwpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3NldCgpO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgc2NhbGFyIHZhbHVlIHRvIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIERhdGEkX3NldFNjYWxhclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLnNldCh0aGlzLm93bmVyLmVsLCB2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0IHN0cnVjdHVyZWQgZGF0YSBmcm9tIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHlcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBHZXQgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0KGRlZXBHZXQpIHtcbiAgICB2YXIgY29tcG9uZW50R2V0dGVyID0gdGhpcy5jb25maWcuZ2V0O1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50R2V0dGVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBjb21wb25lbnRHZXR0ZXIuY2FsbCh0aGlzLm93bmVyLCBkZWVwR2V0KTtcblxuICAgIHJldHVybiB0aGlzLl9nZXQoZGVlcEdldCk7XG59XG5cbmZ1bmN0aW9uIERhdGEkX2dldChkZWVwR2V0KSB7XG4gICAgaWYgKGRlZXBHZXQgPT09IGZhbHNlKSAvLyBhIGhhY2sgdG8gZW5hYmxlIGdldHRpbmcgc2hhbGxvdyBzdGF0ZVxuICAgICAgICByZXR1cm47XG5cbiAgICB2YXIgY29tcCA9IHRoaXMub3duZXJcbiAgICAgICAgLCBzY29wZURhdGE7XG5cbiAgICBpZiAoY29tcC5saXN0KSB7XG4gICAgICAgIHNjb3BlRGF0YSA9IFtdO1xuICAgICAgICBjb21wLmxpc3QuZWFjaChmdW5jdGlvbihsaXN0SXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHNjb3BlRGF0YVtpbmRleF0gPSBsaXN0SXRlbS5kYXRhLmdldCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29tcC5jb250YWluZXIpXG4gICAgICAgICAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihzY29wZUl0ZW0sIG5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoISBjb21wLmxpc3QuY29udGFpbnMoc2NvcGVJdGVtKSAmJiBzY29wZUl0ZW0uZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVEYXRhW25hbWVdID0gc2NvcGVJdGVtLmRhdGEuZ2V0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGNvbXAuY29udGFpbmVyKSB7XG4gICAgICAgIHNjb3BlRGF0YSA9IHt9O1xuICAgICAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihzY29wZUl0ZW0sIG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChzY29wZUl0ZW0uZGF0YSlcbiAgICAgICAgICAgICAgICBzY29wZURhdGFbbmFtZV0gPSBzY29wZUl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlXG4gICAgICAgIHNjb3BlRGF0YSA9IHRoaXMuX2dldFNjYWxhclZhbHVlKCk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHNjb3BlRGF0YTtcblxuICAgIHJldHVybiBzY29wZURhdGE7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0cyBzY2FsYXIgZGF0YSBmcm9tIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRGF0YSRfZ2V0U2NhbGFyVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLmdldCh0aGlzLm93bmVyLmVsKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTcGxpY2VzIExpc3QgaXRlbXMuIFJlcXVpcmVzIExpc3QgZmFjZXQgdG8gYmUgcHJlc2VudCBvbiBjb21wb25lbnQuIFdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyBhcnJheSBzcGxpY2UuXG4gKiBSZXR1cm5zIGRhdGEgcmV0cmlldmVkIGZyb20gcmVtb3ZlZCBpdGVtc1xuICpcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3BsaWNlSW5kZXggaW5kZXggdG8gZGVsZXRlL2luc2VydCBhdFxuICogQHBhcmFtIHtJbnRlZ2VyfSBzcGxpY2VIb3dNYW55IG51bWJlciBvZiBpdGVtcyB0byBkZWxldGVcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGl0ZW1zIHRvIGluc2VydFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIERhdGEkc3BsaWNlKHNwbGljZUluZGV4LCBzcGxpY2VIb3dNYW55KSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoRGF0YSRzcGxpY2UpO1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB2YXIgY29tcG9uZW50U3BsaWNlID0gdGhpcy5jb25maWcuc3BsaWNlO1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50U3BsaWNlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gY29tcG9uZW50U3BsaWNlLmFwcGx5KHRoaXMub3duZXIsIGFyZ3VtZW50cyk7XG4gICAgICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgaW5UcmFuc2FjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRoaXMuX3NwbGljZSwgaW5UcmFuc2FjdGlvbik7XG4gICAgcmVzdWx0ID0gdGhpcy5fc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgdmFyIG1zZyA9IHsgcGF0aDogJycsIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgICAgICAgICAgIGluZGV4OiByZXN1bHQuc3BsaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZDogcmVzdWx0LnJlbW92ZWQsXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogcmVzdWx0LmFkZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMuX3ZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiByZXN1bHQucmVtb3ZlZDtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zcGxpY2UpO1xuXG4gICAgdmFyIGxpc3RGYWNldCA9IHRoaXMub3duZXIubGlzdDtcbiAgICBpZiAoISBsaXN0RmFjZXQpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignRGF0YTogY2Fubm90IHVzZSBzcGxpY2UgbWV0aG9kIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuXG4gICAgdmFyIHJlbW92ZWQgPSBbXTtcblxuICAgIHZhciBsaXN0TGVuZ3RoID0gbGlzdEZhY2V0LmNvdW50KCk7XG4gICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPVxuICAgICAgICBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsaXN0TGVuZ3RoKTtcblxuICAgIGlmIChzcGxpY2VIb3dNYW55ID4gMCAmJiBsaXN0TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gc3BsaWNlSW5kZXg7IGkgPCBzcGxpY2VJbmRleCArIHNwbGljZUhvd01hbnk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShzcGxpY2VJbmRleCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3JlbW92ZUl0ZW0oc3BsaWNlSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4JywgaSk7XG5cbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChpdGVtRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhzcGxpY2VJbmRleCwgbGlzdEZhY2V0LmNvdW50KCkpO1xuICAgIH1cblxuICAgIHZhciBhZGRlZCA9IFtdO1xuXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICwgYWRkSXRlbXMgPSBhcmdzTGVuID4gMlxuICAgICAgICAsIGFkZGVkQ291bnQgPSBhcmdzTGVuIC0gMjtcbiAgICBpZiAoYWRkSXRlbXMpIHtcbiAgICAgICAgbGlzdEZhY2V0Ll9hZGRJdGVtcyhhZGRlZENvdW50LCBzcGxpY2VJbmRleCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAyLCBqID0gc3BsaWNlSW5kZXg7IGkgPCBhcmdzTGVuOyBpKyssIGorKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShqKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKGl0ZW0uZGF0YS5zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5zZXQoYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBwYXRocyBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgYW5kIGl0ZW1zIGFmdGVyIHRoZW1cbiAgICAgICAgbGlzdEZhY2V0Ll91cGRhdGVEYXRhUGF0aHMoc3BsaWNlSW5kZXgsIGxpc3RGYWNldC5jb3VudCgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAvLyAgICAgXy5wcmVwZW5kQXJyYXkoYWRkZWQsIFtzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueV0pO1xuICAgIC8vICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX3ZhbHVlLCBhZGRlZCk7XG4gICAgLy8gfSBlbHNlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNwbGljZUluZGV4OiBzcGxpY2VJbmRleCxcbiAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhZGRlZENvdW50IDogMFxuICAgIH07XG59XG5cblxuZnVuY3Rpb24gRGF0YSRsZW4oKSB7XG4gICAgdmFyIGNvbXBvbmVudExlbiA9IHRoaXMuY29uZmlnLmxlbjtcbiAgICBpZiAodHlwZW9mIGNvbXBvbmVudExlbiA9PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gY29tcG9uZW50TGVuLmNhbGwodGhpcy5vd25lcik7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdGhpcy5fbGVuKCk7XG59XG5cblxuZnVuY3Rpb24gRGF0YSRfbGVuKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmxpc3QpIHJldHVybiB0aGlzLm93bmVyLmxpc3QuY291bnQoKTtcbiAgICBlbHNlIGxvZ2dlci5lcnJvcignRGF0YTogbGVuIGNhbGxlZCB3aXRob3V0IGxpc3QgZmFjZXQnKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRhdGEgZmFjZXQgb2YgYSBjaGlsZCBjb21wb25lbnQgKGJ5IHNjb3BlcykgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggZGF0YSBhY2Nlc3MgcGF0aFxuICovXG5mdW5jdGlvbiBEYXRhJHBhdGgoYWNjZXNzUGF0aCwgY3JlYXRlSXRlbSkge1xuICAgIC8vIGNyZWF0ZUl0ZW0gPSB0cnVlOyAvLyB0aGlzIGhhY2sgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lZWRlZC4uLlxuXG4gICAgaWYgKCEgYWNjZXNzUGF0aClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoYWNjZXNzUGF0aCk7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZFBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gcGFyc2VkUGF0aFtpXVxuICAgICAgICAgICAgLCBub2RlS2V5ID0gcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5KHBhdGhOb2RlKTtcbiAgICAgICAgaWYgKHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknICYmIGN1cnJlbnRDb21wb25lbnQubGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1Db21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50Lmxpc3QuaXRlbShub2RlS2V5KTtcbiAgICAgICAgICAgIGlmICghIGl0ZW1Db21wb25lbnQgJiYgY3JlYXRlSXRlbSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5saXN0Ll9hZGRJdGVtKG5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIGl0ZW1Db21wb25lbnQuZGF0YS5fcGF0aCA9IHBhdGhOb2RlLnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGl0ZW1Db21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudC5jb250YWluZXIpXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5jb250YWluZXIuc2NvcGVbbm9kZUtleV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnREYXRhRmFjZXQgPSBjdXJyZW50Q29tcG9uZW50ICYmIGN1cnJlbnRDb21wb25lbnQuZGF0YTtcbiAgICAgICAgaWYgKCEgY3VycmVudERhdGFGYWNldClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RGF0YUZhY2V0O1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgcGF0aCB0byBhY2Nlc3MgdGhpcyBkYXRhIGZhY2V0IGZyb20gcGFyZW50ICh1c2luZyBwYXRoIG1ldGhvZClcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGtleSB0byBhY2Nlc3MgdGhlIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBkYXRhIGZhY2V0IG9uIHRoZSB2YWx1ZSByZWxhdGVkIHRvIHBhcmVudCBkYXRhIGZhY2V0LlxuICogSWYgY29tcG9uZW50IGhhcyBMaXN0IGZhY2V0LCByZXR1cm5zIGluZGV4XG4gKlxuICogQHJldHVybiB7U3RyaW5nfEludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0S2V5KCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5fcGF0aDtcbiAgICByZXR1cm4gcGF0aFswXSA9PSAnWydcbiAgICAgICAgICAgID8gK3BhdGguc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBcIltcIiBhbmQgXCJdXCJcbiAgICAgICAgICAgIDogcGF0aC5zbGljZSgxKSAvLyByZW1vdmUgbGVhZGluZyBcIi5cIlxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0U3RhdGUoZGVlcFN0YXRlKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMuZ2V0KGRlZXBTdGF0ZSkgfTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLnNldChzdGF0ZS5zdGF0ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKSBcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIEJpbmRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuLi8uLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRG9tJylgXG4gKiBGYWNldCB3aXRoIGNvbXBvbmVudCByZWxhdGVkIGRvbSB1dGlsc1xuICovXG52YXIgRG9tID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RvbScpO1xuXG5fLmV4dGVuZChEb20sIHtcbiAgICBjcmVhdGVFbGVtZW50OiBEb20kJGNyZWF0ZUVsZW1lbnRcbn0pO1xuXG5cbi8qKlxuICogRmFjZXQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBhIHBhc3NlZCBjb25maWd1YXRpb24gb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgd2l0aCB0aGUgcHJvcGVydGllcyBgZG9tQ29uZmlnYCwgYGNvbnRlbnRgLCBgdGVtcGxhdGVgXG4gKiBAcmV0dXJuIHtFbGVtZW50fSBhbiBodG1sIGVsZW1lbnQgXG4gKi9cbmZ1bmN0aW9uIERvbSQkY3JlYXRlRWxlbWVudChjb25maWcpIHtcbiAgICB2YXIgZG9tQ29uZmlnID0gY29uZmlnLmRvbUNvbmZpZyB8fCB7fVxuICAgICAgICAsIHRhZ05hbWUgPSBkb21Db25maWcudGFnTmFtZSB8fCAnZGl2J1xuICAgICAgICAsIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICAgICAgICAsIGNvbnRlbnQgPSBjb25maWcuY29udGVudFxuICAgICAgICAsIHRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuXG4gICAgLy8gVE9ETyBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuL2lmIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWRcbiAgICAvLyBTaG91bGQgYmUgc29tZXByb3BlcnR5IG9uIGVsZW1lbnQgdG8gaW5kaWNhdGUgaXQncyBiZWVuIGNhbGxlZD9cbiAgICBfYXBwbHlDb25maWdUb0VsZW1lbnQobmV3RWwsIGRvbUNvbmZpZyk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKVxuICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlKSh7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RWw7XG59XG5cblxuZnVuY3Rpb24gX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCBjb25maWcpIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGNvbmZpZyAmJiBjb25maWcuY2xzXG4gICAgICAgICwgY29uZmlnQXR0cmlidXRlcyA9IGNvbmZpZyAmJiBjb25maWcuYXR0cmlidXRlcztcblxuICAgIGlmIChjb25maWdBdHRyaWJ1dGVzKVxuICAgICAgICBfLmVhY2hLZXkoY29uZmlnQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0clZhbHVlLCBhdHRyTmFtZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgIGlmIChjc3NDbGFzc2VzKVxuICAgICAgICBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgJ2FkZCcsIGNzc0NsYXNzZXMpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRG9tLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIHRvZ2dsZTogdG9nZ2xlLFxuICAgIGRldGFjaDogZGV0YWNoLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgYXBwZW5kQ2hpbGRyZW46IGFwcGVuZENoaWxkcmVuLFxuICAgIHByZXBlbmRDaGlsZHJlbjogcHJlcGVuZENoaWxkcmVuLFxuICAgIGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICBhcHBlbmRUb1Njb3BlUGFyZW50OiBhcHBlbmRUb1Njb3BlUGFyZW50LFxuICAgIGNoaWxkcmVuOiBEb20kY2hpbGRyZW4sXG4gICAgc2V0U3R5bGU6IHNldFN0eWxlLFxuICAgIHNldFN0eWxlczogc2V0U3R5bGVzLFxuICAgIGNvcHk6IGNvcHksXG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgIGFkZENzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ2FkZCcpLFxuICAgIHJlbW92ZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3JlbW92ZScpLFxuICAgIHRvZ2dsZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3RvZ2dsZScpLFxuXG4gICAgZmluZDogZmluZCxcbiAgICBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uOiBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uLFxuICAgIGhhc1RleHRBZnRlclNlbGVjdGlvbjogaGFzVGV4dEFmdGVyU2VsZWN0aW9uLFxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEb20pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcblxuXG4vLyBzdGFydCBEb20gZmFjZXRcbmZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWw7XG4gICAgX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCB0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGN1cnJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVxuICAgIHRoaXMuX3Zpc2libGUgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnO1xufVxuXG4vLyBzaG93IEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG59XG5cbi8vIGhpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8vIHNob3cvaGlkZVxuZnVuY3Rpb24gdG9nZ2xlKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fdmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGRvU2hvdztcbiAgICB2YXIgZWwgPSB0aGlzLm93bmVyLmVsO1xuXG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IGRvU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICByZXR1cm4gZG9TaG93O1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VDc3NDbGFzc2VzKG1ldGhvZE5hbWUsIGNzc0NsYXNzZXMsIGVuZm9yY2UpIHtcbiAgICBfYXR0YWNoQ3NzQ2xhc3Nlcyh0aGlzLm93bmVyLmVsLCBtZXRob2ROYW1lLCBjc3NDbGFzc2VzLCBlbmZvcmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgbWV0aG9kTmFtZSwgY3NzQ2xhc3NlcywgZW5mb3JjZSkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBlbC5jbGFzc0xpc3RcbiAgICAgICAgLCBkb1RvZ2dsZSA9IG1ldGhvZE5hbWUgPT0gJ3RvZ2dsZSc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjc3NDbGFzc2VzKSlcbiAgICAgICAgY3NzQ2xhc3Nlcy5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjc3NDbGFzc2VzID09ICdzdHJpbmcnKVxuICAgICAgICBjYWxsTWV0aG9kKGNzc0NsYXNzZXMpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGUgb2YgQ1NTIGNsYXNzZXMgcGFyYW1ldGVyJyk7XG5cbiAgICBmdW5jdGlvbiBjYWxsTWV0aG9kKGNzc0Nscykge1xuICAgICAgICBkb1RvZ2dsZVxuICAgICAgICAgICAgLy8gT25seSBwYXNzICdlbmZvcmNlJyBpZiBhIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkIChUaGUgJ3RvZ2dsZScgZnVuY3Rpb24gb2YgdGhlIGNsYXNzTGlzdCB3aWxsIHRyZWF0IHVuZGVmaW5lZCA9PT0gZmFsc2UgcmVzdWx0aW5nIGluIG9ubHkgYWxsb3dpbmcgY2xhc3NlcyB0byBiZSByZW1vdmVkKVxuICAgICAgICAgICAgPyBlbmZvcmNlID09PSB1bmRlZmluZWQgPyBjbGFzc0xpc3RbbWV0aG9kTmFtZV0oY3NzQ2xzKSA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMsIGVuZm9yY2UpXG4gICAgICAgICAgICA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpICBcbiAgICAgICAgZG9tVXRpbHMuZGV0YWNoQ29tcG9uZW50KHRoaXMub3duZXIuZWwpO1xufVxuXG5cbmZ1bmN0aW9uIHNldFN0eWxlKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5vd25lci5lbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBzZXRTdHlsZSBvbiBvd25lciB3aXRoIG5vIGVsZW1lbnQ6IFwiICsgdGhpcy5vd25lci5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vd25lci5lbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVzKHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnN0eWxlW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xufVxuXG5cbi8vIGNyZWF0ZSBhIGNvcHkgb2YgRE9NIGVsZW1lbnQgdXNpbmcgZmFjZXQgY29uZmlnIGlmIHNldFxuZnVuY3Rpb24gY29weShpc0RlZXApIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbCAmJiB0aGlzLm93bmVyLmVsLmNsb25lTm9kZShpc0RlZXApO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIG5ld0VsID0gRG9tLmNyZWF0ZUVsZW1lbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiBuZXdFbDtcbn1cblxuXG4vLyByZW1vdmUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGRvbVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5vd25lci5lbCk7XG59XG5cbi8vIGFwcGVuZCBpbnNpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gYXBwZW5kKGVsKSB7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChlbCk7XG59XG5cbi8vIHByZXBlbmQgaW5zaWRlIEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHByZXBlbmQoZWwpIHtcbiAgICB2YXIgdGhpc0VsID0gdGhpcy5vd25lci5lbFxuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzRWwuZmlyc3RDaGlsZDtcbiAgICBpZiAoZmlyc3RDaGlsZClcbiAgICAgICAgdGhpc0VsLmluc2VydEJlZm9yZShlbCwgZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzRWwuYXBwZW5kQ2hpbGQoZWwpO1xufVxuXG4vLyBhcHBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWwpIHtcbiAgICB3aGlsZShlbC5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgdGhpcy5hcHBlbmQoZWwuY2hpbGROb2Rlc1swXSk7XG59XG5cbi8vIHByZXBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gcHJlcGVuZENoaWxkcmVuKGVsKSB7XG4gICAgd2hpbGUoZWwuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgIHRoaXMucHJlcGVuZChlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRBZnRlcihlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7ICAgIFxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIHRoaXNFbC5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgdGhpc0VsKTtcbn1cblxuXG4vLyBhcHBlbmRzIGNvbXBvbmVudCdzIGVsZW1lbnQgdG8gc2NvcGUgcGFyZW50LiBJZiBpdCB3YXMgYWxyZWR5IGluIERPTSBpdCB3aWxsIGJlIG1vdmVkXG5mdW5jdGlvbiBhcHBlbmRUb1Njb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCk7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVsLmFwcGVuZENoaWxkKHRoaXMub3duZXIuZWwpO1xufVxuXG5cbi8qKlxuICogRG9tIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtFbGVtZW50XX1cbiAqL1xuZnVuY3Rpb24gRG9tJGNoaWxkcmVuKCkge1xuICAgIHJldHVybiBkb21VdGlscy5jaGlsZHJlbih0aGlzLm93bmVyLmVsKTtcbn1cblxuXG52YXIgZmluZERpcmVjdGlvbnMgPSB7XG4gICAgJ3VwJzogJ3ByZXZpb3VzTm9kZScsXG4gICAgJ2Rvd24nOiAnbmV4dE5vZGUnXG59O1xuXG4vLyBGaW5kcyBjb21wb25lbnQgcGFzc2luZyBvcHRpb25hbCBpdGVyYXRvcidzIHRlc3Rcbi8vIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBjdXJyZW50IGNvbXBvbmVudCAodGhpcylcbi8vIGJ5IHRyYXZlcnNpbmcgRE9NIHRyZWUgdXB3YXJkcyAoZGlyZWN0aW9uID0gXCJ1cFwiKVxuLy8gb3IgZG93bndhcmRzIChkaXJlY3Rpb24gPSBcImRvd25cIilcbmZ1bmN0aW9uIGZpbmQoZGlyZWN0aW9uLCBpdGVyYXRvcikge1xuICAgIGlmICghIGZpbmREaXJlY3Rpb25zLmhhc093blByb3BlcnR5KGRpcmVjdGlvbikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbmQgZGlyZWN0aW9uOiAnICsgZGlyZWN0aW9uKTtcblxuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWxcbiAgICAgICAgLCBzY29wZSA9IHRoaXMub3duZXIuc2NvcGVcbiAgICAgICAgLCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihzY29wZS5fcm9vdEVsLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZWw7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpXG4gICAgICAgICwgY29tcG9uZW50c05hbWVzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgICwgZm91bmQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChuZXh0Tm9kZSkge1xuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKG5leHROb2RlKTtcbiAgICAgICAgaWYgKGF0dHIubm9kZSkge1xuICAgICAgICAgICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaGFzT3duUHJvcGVydHkoYXR0ci5jb21wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gc2NvcGVbYXR0ci5jb21wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IgfHwgaXRlcmF0b3IoY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gbmV4dE5vZGU7XG4gICAgICAgIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpO1xuICAgIH1cblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG4vLyByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIHRleHQgYmVmb3JlIHNlbGVjdGlvblxuZnVuY3Rpb24gaGFzVGV4dEJlZm9yZVNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgdmFyIHRleHQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlICYmIHNlbGVjdGlvbi5mb2N1c05vZGUudGV4dENvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnICcgPyAxIDogMDtcbiAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBzdGFydFBvcykgcmV0dXJuIHRydWU7XG5cbiAgICAvLyB3YWxrIHVwIHRoZSBET00gdHJlZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgdGV4dCBub2RlcyBiZWZvcmUgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIHByZXZOb2RlID0gdHJlZVdhbGtlci5wcmV2aW91c05vZGUoKTtcblxuICAgIHZhciBpc1RleHQgPSBwcmV2Tm9kZSA/ICFwcmV2Tm9kZS5ub2RlVmFsdWUudHJpbSgpID09ICcnIDogZmFsc2U7XG5cbiAgICByZXR1cm4gaXNUZXh0O1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RleHRBZnRlclNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgdGV4dCA9IHNlbGVjdGlvbi5mb2N1c05vZGUgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZS50ZXh0Q29udGVudDtcbiAgICB2YXIgc3RhcnRQb3MgPSB0ZXh0ICYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoLTEpID09ICcgJyA/IHNlbGVjdGlvbi5hbmNob3JOb2RlLmxlbmd0aC0xIDogc2VsZWN0aW9uLmFuY2hvck5vZGUubGVuZ3RoO1xuICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IDwgc3RhcnRQb3MpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gd2FsayB1cCB0aGUgRE9NIHRyZWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHRleHQgbm9kZXMgYWZ0ZXIgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIFxuICAgIC8vVG8gY2FwdHVyZSB3aGVuIHRyZWV3YWxrZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgdGV4dCBub2RlICh1bmtub3duIHJlYXNvbilcbiAgICB2YXIgaXNUZXh0ID0gbmV4dE5vZGUgPyAhbmV4dE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PSAnJyA6IGZhbHNlO1xuXG4gICAgcmV0dXJuIGlzVGV4dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyYWdcIj48L2E+XG4vLyAjIyNkcmFnIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJhZycpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgZHJhZ2dlZFxuICogRHJhZyBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBtZXRhOiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgIC0gcGFyYW1zOiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW4gdXJsLWxpa2UgcXVlcnkgc3RyaW5nIGluIHRoZSBlbmQgb2YgZGF0YSB0eXBlIGZvciBtZXRhZGF0YSBkYXRhIHR5cGUgKG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGlzIG9iamVjdCkuIFNlZSBjb25maWcuZHJhZ0Ryb3AuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFUZW1wbGF0ZVxuICogICAgICAgICAgYWxsIHZhbHVlcyB3aWxsIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYXMgZGF0YXR5cGUgY2Fubm90IHN0b3JlIHVwcGVyY2FzZSBsZXR0ZXJzLlxuICogICAgICAtIGRhdGE6IGRhdGEgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYWJvdmUgbWV0YSBkYXRhIHR5cGUgKG9yIGZ1bmN0aW9uKVxuICogIC0gYWxsb3dlZEVmZmVjdHM6IHN0cmluZyAob3IgZnVuY3Rpb24pIGFzIHNwZWNpZmllZCBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RyYWdEcm9wL0RyYWdfT3BlcmF0aW9ucyNkcmFnc3RhcnRcbiAqICAtIGRhdGFUeXBlczogbWFwIG9mIGFkZGl0aW9uYWwgZGF0YSB0eXBlcyB0aGUgY29tcG9uZW50IHdpbGwgc3VwcGx5IHRvIGRhdGEgdHJhbnNmZXIgb2JqZWN0LCBrZXkgaXMgZGF0YSB0eXBlLCB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdCwgY29tcG9uZW50IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBjb250ZXh0IHRvIHRoaXMgZnVuY3Rpb25cbiAqXG4gKiBJZiBmdW5jdGlvbiBpcyBzcGVjaWZpZWQgaW4gYW55IHBhcmFtZXRlciBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBjb21wb25lbnQgYXMgdGhlIGNvbnRleHRcbiAqL1xudmFyIERyYWcgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRHJhZycpO1xuXG5fLmV4dGVuZFByb3RvKERyYWcsIHtcbiAgICBpbml0OiBEcmFnJGluaXQsXG4gICAgc3RhcnQ6IERyYWckc3RhcnQsXG4gICAgc2V0SGFuZGxlOiBEcmFnJHNldEhhbmRsZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEcmFnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnO1xuXG5cbmZ1bmN0aW9uIERyYWckaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAgIFxuXG4gICAgdGhpcy5fY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoRE9NRXZlbnRzU291cmNlKTtcbiAgICB0aGlzLl9kcmFnRGF0YSA9IHt9O1xuXG4gICAgdmFyIGRhdGFUeXBlSW5mbyA9IHRoaXMuY29uZmlnLl9kYXRhVHlwZUluZm8gfHwgJyc7XG4gICAgdGhpcy5fZGF0YVR5cGVJbmZvID0gdHlwZW9mIGRhdGFUeXBlSW5mbyA9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhVHlwZUluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZGF0YVR5cGVJbmZvOyB9O1xufVxuXG5cbi8qKlxuICogRHJhZyBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdGhlIGRyYWcgaGFuZGxlIGVsZW1lbnQgb2YgY29tcG9uZW50LiBUaGlzIGVsZW1lbnQgaGFzIHRvIGJlIGRyYWdnZWQgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgZHJhZ2dlZC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGhhbmRsZUVsXG4gKi9cbmZ1bmN0aW9uIERyYWckc2V0SGFuZGxlKGhhbmRsZUVsKSB7XG4gICAgaWYgKCEgdGhpcy5vd25lci5lbC5jb250YWlucyhoYW5kbGVFbCkpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZHJhZyBoYW5kbGUgc2hvdWxkIGJlIGluc2lkZSBlbGVtZW50IHRvIGJlIGRyYWdnZWQnKVxuICAgIHRoaXMuX2RyYWdIYW5kbGUgPSBoYW5kbGVFbDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF9hZGREcmFnQXR0cmlidXRlLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gICAgICAgICdtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlJzogb25Nb3VzZU1vdmVtZW50LFxuICAgICAgICAnZHJhZ3N0YXJ0Jzogb25EcmFnU3RhcnQsXG4gICAgICAgICdkcmFnJzogb25EcmFnZ2luZyxcbiAgICAgICAgJ2RyYWdlbmQnOiBvbkRyYWdFbmRcbiAgICB9KTtcblxuICAgIHRoaXMub3duZXIub25NZXNzYWdlcyh7XG4gICAgICAgICdnZXRzdGF0ZXN0YXJ0ZWQnOlxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfcmVtb3ZlRHJhZ0F0dHJpYnV0ZSwgY29udGV4dDogdGhpcyB9LFxuICAgICAgICAnZ2V0c3RhdGVjb21wbGV0ZWQnOlxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfYWRkRHJhZ0F0dHJpYnV0ZSwgY29udGV4dDogdGhpcyB9XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBBZGRzIGRyYWdnYWJsZSBhdHRyaWJ1dGUgdG8gY29tcG9uZW50J3MgZWxlbWVudFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9hZGREcmFnQXR0cmlidXRlKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmVsKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgdHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZURyYWdBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpXG4gICAgICAgIHRoaXMub3duZXIuZWwucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcbn1cblxuXG5mdW5jdGlvbiBvbk1vdXNlRG93bihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5fX21vdXNlRG93blRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAodGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcykpIHtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbk1vdXNlTW92ZW1lbnQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIHZhciBzaG91bGRCZURyYWdnYWJsZSA9IHRhcmdldEluRHJhZ0hhbmRsZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMub3duZXIuZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCBzaG91bGRCZURyYWdnYWJsZSk7XG4gICAgaWYgKGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWRyYWdFbmFibGVFdmVudCcpICE9ICdmYWxzZScpXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jb25maWcub2ZmIHx8ICEgdGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcykpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IHRoaXMub3duZXI7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcblxuICAgIHRoaXMuX2RyYWdEYXRhID0gZHQuc2V0Q29tcG9uZW50U3RhdGUob3duZXIpO1xuICAgIHNldE1ldGEuY2FsbCh0aGlzKTtcbiAgICBzZXRBZGRpdGlvbmFsRGF0YVR5cGVzLmNhbGwodGhpcyk7XG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xuXG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHZhciBtZXRhQ29uZmlnID0gdGhpcy5jb25maWcubWV0YVxuICAgICAgICAgICAgLCBwYXJhbXNDb25maWcgPSBtZXRhQ29uZmlnICYmIG1ldGFDb25maWcucGFyYW1zXG4gICAgICAgICAgICAsIG1ldGFEYXRhQ29uZmlnID0gbWV0YUNvbmZpZyAmJiBtZXRhQ29uZmlnLmRhdGE7XG5cbiAgICAgICAgdmFyIHBhcmFtcyA9IF8ucmVzdWx0KHBhcmFtc0NvbmZpZywgb3duZXIpXG4gICAgICAgICAgICAsIGRhdGEgPSBfLnJlc3VsdChtZXRhRGF0YUNvbmZpZywgb3duZXIpO1xuXG4gICAgICAgIHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUgPSBkdC5zZXRDb21wb25lbnRNZXRhKG93bmVyLCBwYXJhbXMsIGRhdGEpO1xuICAgICAgICB0aGlzLl9kcmFnTWV0YURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEFkZGl0aW9uYWxEYXRhVHlwZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kYXRhVHlwZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFUeXBlc0RhdGEgPSBfLm1hcEtleXModGhpcy5jb25maWcuZGF0YVR5cGVzLCBmdW5jdGlvbiAoZ2V0RGF0YUZ1bmMsIGRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBnZXREYXRhRnVuYy5jYWxsKHRoaXMub3duZXIsIGRhdGFUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ29iamVjdCcpIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkgZHQuc2V0RGF0YShkYXRhVHlwZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdnaW5nKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoX2RyYWdJc0Rpc2FibGVkLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm47XG5cbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIGR0LnNldENvbXBvbmVudFN0YXRlKHRoaXMub3duZXIsIHRoaXMuX2RyYWdEYXRhKTtcbiAgICBkdC5zZXREYXRhKHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUsIHRoaXMuX2RyYWdNZXRhRGF0YSk7XG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlc0RhdGEpIHtcbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX2RhdGFUeXBlc0RhdGEsIGZ1bmN0aW9uKGRhdGEsIGRhdGFUeXBlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSkgZHQuc2V0RGF0YShkYXRhVHlwZSwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zZXRBbGxvd2VkRWZmZWN0cy5jYWxsKHRoaXMsIGR0KTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdFbmQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChfZHJhZ0lzRGlzYWJsZWQuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2NvbXBsZXRlZHJhZ2Ryb3AnLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2RyYWdlbmQnLFxuICAgICAgICBkcmFnRHJvcDogZHQsXG4gICAgICAgIGRyYWdGYWNldDogdGhpc1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9zZXRBbGxvd2VkRWZmZWN0cyhEcmFnRHJvcCkge1xuICAgIHZhciBlZmZlY3RzID0gXy5yZXN1bHQodGhpcy5jb25maWcuYWxsb3dlZEVmZmVjdHMsIHRoaXMub3duZXIpO1xuICAgIERyYWdEcm9wLnNldEFsbG93ZWRFZmZlY3RzKGVmZmVjdHMpO1xufVxuXG5cbmZ1bmN0aW9uIHRhcmdldEluRHJhZ0hhbmRsZSgpIHtcbiAgICByZXR1cm4gISB0aGlzLl9kcmFnSGFuZGxlIHx8IHRoaXMuX2RyYWdIYW5kbGUuY29udGFpbnModGhpcy5fX21vdXNlRG93blRhcmdldCk7XG59XG5cblxuZnVuY3Rpb24gX2RyYWdJc0Rpc2FibGVkKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9mZikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY29tcG9uZW50cy1mYWNldHMtZHJvcFwiPjwvYT5cbi8vICMjI2Ryb3AgZmFjZXRcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgRE9NRXZlbnRzU291cmNlID0gcmVxdWlyZSgnLi4vbXNnX3NyYy9kb21fZXZlbnRzJylcbiAgICAsIERyb3BNc2dBUEkgPSByZXF1aXJlKCcuLi9tc2dfYXBpL2Ryb3AnKVxuICAgICwgRHJhZ0Ryb3AgPSByZXF1aXJlKCcuLi8uLi91dGlsL2RyYWdkcm9wJylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEcm9wJylgXG4gKiBGYWNldCBmb3IgY29tcG9uZW50cyB0aGF0IGNhbiBhY2NlcHQgZHJvcHNcbiAqIERyb3AgZmFjZXQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gKlxuICogIC0gYWxsb3cgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGRlZmluZSBhbGxvd2VkIGRhdGEgdHlwZXMgZHVyaW5nIGRyYWcgKGBkcmFnZW50ZXJgIGFuZCBgZHJhZ292ZXJgIGV2ZW50cykgd2l0aCB0aGVzZSBwcm9wZXJ0aWVzOlxuICogICAgICAtIGNvbXBvbmVudHM6IGB0cnVlYCBieSBkZWZhdWx0IChhbGwgY29tcG9uZW50cyB3aWxsIGJlIGFjY2VwdGVkKVxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBzdHJpbmcgd2l0aCBhbGxvd2VkIGNvbXBvbmVudCBjbGFzc1xuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBsaXN0IG9mIGFsbG93ZWQgY29tcG9uZW50cyBjbGFzc2VzIChzdHJpbmdzKVxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBtYXAgd2l0aCBhbGxvd2VkIGNsYXNzZXMgaW4ga2V5cyBhbmQgYHRydWVgL3Rlc3QgZnVuY3Rpb25zIGluIHZhbHVlc1xuICogICAgICAgICAgICAgICAgICAgICAgICBPUiB0ZXN0IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBwYXNzZWQgb2JqZWN0IGRlZmluZWQgYmVsb3dcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgYGZhbHNlYCB0byBOT1QgYWNjZXB0IGNvbXBvbmVudHNcbiAqICAgICAgLSBkYXRhVHlwZXM6ICBgZmFsc2VgIGJ5IGRlZmF1bHQgKG5vIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBhY2NlcHRlZClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1Igc3RyaW5nIHdpdGggYWxsb3dlZCBkYXRhIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbGlzdCBvZiBhZGRpdGlvbmFsIGRhdGEgdHlwZXMgdGhhdCBhIGRyb3AgdGFyZ2V0IHdvdWxkIGFjY2VwdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiB0ZXN0IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBwYXNzZWQgRHJhZ0Ryb3Agb2JqZWN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGB0cnVlYCB0byBhY2NlcHQgYWxsIGRhdGEgdHlwZXNcbiAqICAgICAgLSBjaGVja1BhcmVudDogYGZhbHNlYCBieSBkZWZhdWx0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGB0cnVlYCB3aWxsIGNhbGwgcGFyZW50IGNvbXBvbmVudCBkcm9wIGFsbG93IHRvIGNoZWNrIGlmIHBhcmVudCBjb21wb25lbnQgd2lsbCBhY2NlcHQgdGhlIGNvbXBvbmVudFxuICogICAgICBJZiB0ZXN0IGZ1bmN0aW9ucyBhcmUgdXNlZCwgdGhleSBzaG91bGQgcmV0dXJuIGJvb2xlYW4uIEVhY2ggdGVzdCBmdW5jdGlvbiBjYW4gYWxzbyBzZXQgZHJvcCBlZmZlY3QgYXMgZGVmaW5lZCBoZXJlOlxuICogICAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVyI2Ryb3BFZmZlY3QuMjguMjlcbiAqICAgICAgU2V0dGluZyBkcm9wIGVmZmVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIGJ5IGRyYWdnZWQgb2JqZWN0IHdpbGwgcHJldmVudCBkcm9wLlxuICogICAgICBUZXN0IGZ1bmN0aW9ucyBmb3IgY29tcG9uZW50cyB3aWxsIGJlIHBhc3NlZCB0aGUgb3duZXIgb2YgRHJvcCBmYWNldCBhcyBjb250ZXh0LCB0aGUgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBwcm9wZXJ0aWVzIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXI6XG4gKiAgICAgICAgICBjb21wQ2xhc3MgLSBuYW1lIG9mIGNvbXBvbmVudCBjbGFzcyBhcyBzdG9yZWQgaW4gcmVnaXN0cnlcbiAqICAgICAgICAgIGNvbXBOYW1lIC0gbmFtZSBvZiBjb21wb25lbnQgKGFsbCBsb3dlcmNhc2UpXG4gKiAgICAgICAgICBwYXJhbXMgLSBwYXJhbWV0ZXJzIGFzIGVuY29kZWQgaW4gZGF0YVR5cGUsIHBhc3NlZCB0byBgbWlsby51dGlsLmRyYWdEcm9wLnNldENvbXBvbmVudE1ldGFgIGJ5IERyYWcgZmFjZXRcbiAqICAgICAgICAgIG1ldGFEYXRhVHlwZSAtIGRhdGEgdHlwZSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBjb21wQ2xhc3MsIGNvbXBOYW1lIGFuZCBwYXJhbXMgZW5jb2RlZFxuICpcbiAqICAgICAgLi4uIGFuZCBEcmFnRHJvcCBpbnN0YW5jZSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICpcbiAqICAgICAgVGVzdCBmdW5jdGlvbiBmb3Igb3RoZXIgZGF0YSB0eXBlcyB3aWxsIGJlIHBhc3NlZCB0aGUgb3duZXIgb2YgRHJvcCBmYWNldCBhcyBjb250ZXh0IGFuZCBEcmFnRHJvcCBpbnN0YW5jZSBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyXG4gKlxuICogIyMjI0V2ZW50cyMjIyNcbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBjb25maWd1cmluZyBhbGxvd2VkIGNvbXBvbmVudHMgYW5kIGRhdGEgdHlwZXMsIGNvbXBvbmVudHMgY2xhc3NlcyBzaG91bGQgc3Vic2NyaWJlIHRvIGV2ZW50cy5cbiAqIEF0IHRoZSB2ZXJ5IGxlYXN0LCB0aGV5IHNob3VsZCBzdWJzY3JpYmUgdG8gYGRyb3BgIGV2ZW50LlxuICpcbiAqIERyb3AgZmFjZXQgZW1pdHMgZHJhZ2luL2RyYWdvdXQgbWVzc2FnZXMgdGhhdCBhcmUgZW1pdHRlZCB3aGVuZXZlciBhY3R1YWwgY29tcG9uZW50IGVsZW1lbnQgaXMgZW50ZXJlZCBvciBsZWZ0XG4gKiAod2hpY2ggaXMgZGlmZmVyZW50IGZyb20gZHJhZ2VudGVyIGFuZCBkcmFnbGVhdmUgbWVzc2FnZXMgdGhhdCBhcmUgZW1pdHRlZCB3aGVuZXZlciBhbnkgY2hpbGQgZWxlbWVudCBpcyBlbnRlcmVkIG9yIGxlZnQsIGFzIGxvbmcgYXMgZXZlbnQgYnViYmxlcyB1cClcbiAqIElmIGNoaWxkIGNvbXBvbmVudCBoYXMgZHJvcCBmYWNldCBhdHRhY2hlZCwgZHJhZ291dCB3aWxsIGJlIGVtaXR0ZWQgb24gdGhlIGN1cnJlbnQgY29tcG9uZW50IHdoZW4gdGhlIGNoaWxkIGlzIGVudGVyZWQuXG4gKlxuICogWW91IGNhbiBzZWUgdGhlIGRlbW9uc3RyYXRpb24gb2Ygd2hlbiBtZXNzYWdlcyBhcmUgZW1pdHRlZCBbaGVyZV0oaHR0cDovL2pzYmluLmNvbS9idXFvdi82KVxuICogXG4gKi9cbnZhciBEcm9wID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0Ryb3AnKTtcblxuXG5fLmV4dGVuZFByb3RvKERyb3AsIHtcbiAgICBpbml0OiBEcm9wJGluaXQsXG4gICAgc3RhcnQ6IERyb3Akc3RhcnRcbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEcm9wKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEcm9wO1xuXG5cbmZ1bmN0aW9uIERyb3AkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJKERPTUV2ZW50c1NvdXJjZSwgbmV3IERyb3BNc2dBUEkpO1xufVxuXG5cbmZ1bmN0aW9uIERyb3Akc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5vd25lci5lbC5jbGFzc0xpc3QuYWRkKCdjYy1tb2R1bGUtcmVsYXRpdmUnKTtcbiAgICB0aGlzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnZHJhZ2VudGVyIGRyYWdvdmVyJzogb25EcmFnZ2luZyxcbiAgICAgICAgJ2Ryb3AnOiBvbkRyb3AsXG4gICAgICAgICdkcmFnZW50ZXIgZHJhZ292ZXIgZHJhZ2xlYXZlIGRyb3AgZHJhZ2luIGRyYWdvdXQnOiBwb3N0VG9TZXJ2aWNlXG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnZ2luZyhldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIGR0ID0gbmV3IERyYWdEcm9wKGV2ZW50KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoISBfaGFuZGxlRHJvcERlcGVuZGVuY3kuY2FsbCh0aGlzLCBkdCkpXG4gICAgICAgIGR0LnNldERyb3BFZmZlY3QoJ25vbmUnKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wY29tcGxldGVkJywge1xuICAgICAgICBldmVudFR5cGU6ICdkcm9wJyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcm9wRmFjZXQ6IHRoaXMsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5vd25lclxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIHBvc3RUb1NlcnZpY2UoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKGV2ZW50VHlwZSwge1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGRyb3BGYWNldDogdGhpcyxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLm93bmVyXG4gICAgfSk7XG59XG5cblxudmFyIF9oYW5kbGVEcm9wRGVwZW5kZW5jeSA9IF8udGhyb3R0bGUoX2hhbmRsZURyb3BEZXBlbmRlbmN5Tm90aHJvdHRsZSwgNTApO1xuZnVuY3Rpb24gX2hhbmRsZURyb3BEZXBlbmRlbmN5Tm90aHJvdHRsZShkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KSB7XG4gICAgdmFyIGFsbG93ID0gdGhpcy5jb25maWcuYWxsb3dcbiAgICAgICAgLCBwYXJlbnRBbGxvd2VkID0gdHJ1ZTtcblxuICAgIG9yaWdpbmFsRHJvcENvbXBvbmVudCA9IG9yaWdpbmFsRHJvcENvbXBvbmVudCB8fCB0aGlzLm93bmVyO1xuXG4gICAgaWYgKGFsbG93ICYmIGFsbG93LmNoZWNrUGFyZW50KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCdEcm9wJyk7XG4gICAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgICAgICBwYXJlbnRBbGxvd2VkID0gX2hhbmRsZURyb3BEZXBlbmRlbmN5Tm90aHJvdHRsZS5jYWxsKHBhcmVudC5kcm9wLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50QWxsb3dlZCAmJiBfaXNEcm9wQWxsb3dlZC5jYWxsKHRoaXMsIGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIGRyb3AgaXMgYWxsb3dlZCBiYXNlZCBvbiBmYWNldCBjb25maWd1cmF0aW9uIChzZWUgYWJvdmUpXG4gKiBcbiAqIEBwYXJhbSB7RHJhZ0Ryb3B9IGR0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfaXNEcm9wQWxsb3dlZChkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KSB7XG4gICAgdmFyIGFsbG93ID0gdGhpcy5jb25maWcuYWxsb3c7XG5cbiAgICBpZiAoZHQuaXNDb21wb25lbnQoKSkge1xuICAgICAgICB2YXIgYWxsb3dDb21wcyA9IGFsbG93ICYmIGFsbG93LmNvbXBvbmVudHNcbiAgICAgICAgICAgICwgbWV0YSA9IGR0LmdldENvbXBvbmVudE1ldGEoKTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhbGxvd0NvbXBzKSB7XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHM7XG4gICAgICAgICAgICAvLyBjb21wb25lbnQgY2xhc3NcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGEgJiYgbWV0YS5jb21wQ2xhc3MgPT0gYWxsb3dDb21wcztcbiAgICAgICAgICAgIC8vIHRlc3QgZnVuY3Rpb25cbiAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dDb21wcy5jYWxsKHRoaXMub3duZXIsIG1ldGEsIGR0LCBvcmlnaW5hbERyb3BDb21wb25lbnQpO1xuICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbGxvd0NvbXBzKSlcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBhbGxvd2VkIGNsYXNzZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHMuaW5kZXhPZihtZXRhICYmIG1ldGEuY29tcENsYXNzKSA+PSAwO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYXAgb2YgY2xhc3M6IGJvb2xlYW58dGVzdCBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdCA9IGFsbG93Q29tcHNbbWV0YSAmJiBtZXRhLmNvbXBDbGFzc107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhISBfLnJlc3VsdCh0ZXN0LCB0aGlzLm93bmVyLCBtZXRhLCBkdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBhbGxvd2VkIGNvbXBvbmVudHMgaW4gY29uZmlnJyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGF0YVR5cGVzID0gYWxsb3cgJiYgYWxsb3cuZGF0YVR5cGVzXG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGRhdGFUeXBlcykge1xuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkdC50eXBlcy5pbmRleE9mKGRhdGFUeXBlcykgPj0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE8gdGVzdCBmb3Igb3RoZXIgZGF0YSB0eXBlc1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdFdmVudHMnKWBcbiAqIENvbXBvbmVudCBmYWNldCB0aGF0IG1hbmFnZXMgc3Vic2NyaXB0aW9ucyB0byBET00gZXZlbnRzIHVzaW5nIFtNZXNzZW5nZXJdKC4uLy4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSB3aXRoIFtET01FdmVudHNTb3VyY2VdKC4uL21zZ19zcmMvZG9tX2V2ZW50cy5qcy5odG1sKS5cbiAqIEFsbCBwdWJsaWMgbWV0aG9kcyBvZiBNZXNzZW5nZXIgYW5kIGB0cmlnZ2VyYCBtZXRob2Qgb2YgW0RPTUV2ZW50c1NvdXJjZV0oLi4vbXNnX3NyYy9kb21fZXZlbnRzLmpzLmh0bWwpIGFyZSBwcm94aWVkIGRpcmVjdGx5IHRvIHRoaXMgZmFjZXQuXG4gKiBGb3IgZXhhbXBsZSwgdG8gc3Vic2NyaWJlIHRvIGBjbGlja2AgZXZlbnQgdXNlOlxuICogYGBgXG4gKiBjb21wb25lbnQuZnJhbWUub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICogU2VlIFtNZXNzZW5nZXJdKC4uLy4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKVxuICovXG52YXIgRXZlbnRzID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0V2ZW50cycpO1xuXG5cbi8qKlxuICogIyMjI0V2ZW50cyBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNFdmVudHMkaW5pdCkgLSBjYWxsZWQgYnkgY29uc3RydWN0b3IgYXV0b21hdGljYWxseVxuICovXG5fLmV4dGVuZFByb3RvKEV2ZW50cywge1xuICAgIGluaXQ6IEV2ZW50cyRpbml0XG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRXZlbnRzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudHM7XG5cblxuLyoqXG4gKiBFeHBvc2UgRE9NRXZlbnRzU291cmNlIHRyaWdnZXIgbWV0aG9kIG9uIEV2ZW50cyBwcm90b3R5cGVcbiAqL1xudmFyIE1TR19TT1VSQ0VfS0VZID0gJ19kb21FdmVudHNTb3VyY2UnXG5ET01FdmVudHNTb3VyY2UudXNlV2l0aChFdmVudHMsIE1TR19TT1VSQ0VfS0VZLCBbJ3RyaWdnZXInXSk7XG5cblxuLyoqXG4gKiBFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsemVzIGZhY2V0LCBjb25uZWN0cyBET01FdmVudHNTb3VyY2UgdG8gZmFjZXQncyBtZXNzZW5nZXJcbiAqL1xuZnVuY3Rpb24gRXZlbnRzJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHZhciBkb21FdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLm93bmVyKTtcbiAgICB0aGlzLl9zZXRNZXNzYWdlU291cmNlKGRvbUV2ZW50c1NvdXJjZSk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNU0dfU09VUkNFX0tFWSwgZG9tRXZlbnRzU291cmNlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIEZyYW1lTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZnJhbWUnKVxuICAgICwgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0gcmVxdWlyZSgnLi4vLi4vc2VydmljZXMvZGVfY29uc3RycycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdGcmFtZScpYFxuICogQ29tcG9uZW50IGZhY2V0IHRoYXQgc2ltcGxpZmllcyBzZW5kaW5nIHdpbmRvdyBtZXNzYWdlcyB0byBpZnJhbWUgYW5kIHN1YnNjcmliaW5nIHRvIG1lc3NhZ2VzIG9uIGlubmVyIHdpbmRvdyBvZiBpZnJhbWUuXG4gKiBBbGwgcHVibGljIG1ldGhvZHMgb2YgTWVzc2VuZ2VyIGFuZCBgdHJpZ2dlcmAgbWV0aG9kIG9mIFtGcmFtZU1lc3NhZ2VTb3VyY2VdKC4uL21zZ19zcmMvZnJhbWUuanMuaHRtbCkgYXJlIHByb3hpZWQgZGlyZWN0bHkgdG8gdGhpcyBmYWNldC5cbiAqIEZvciBleGFtcGxlLCB0byBzZW5kIGN1c3RvbSBtZXNzYWdlIHRvIGlmcmFtZSB3aW5kb3cgdXNlOlxuICogYGBgXG4gKiBpZnJhbWVDb21wb25lbnQuZnJhbWUudHJpZ2dlcignbXltZXNzYWdlJywgbXlEYXRhKTtcbiAqIGBgYFxuICogVG8gc3Vic2NyaWJlIHRvIHRoaXMgbWVzc2FnZXMgaW5zaWRlIGZyYW1lIHVzZSAod2l0aCBtaWxvIC0gc2VlIFttaWxvLm1haWxdKC4uLy4uL21haWwvaW5kZXguanMuaHRtbCkpOlxuICogYGBgXG4gKiBtaWxvLm1haWwub24oJ21lc3NhZ2U6bXltZXNzYWdlJywgZnVuY3Rpb24obXNnVHlwZSwgbXNnRGF0YSkge1xuICogICAgIC8vIGRhdGEgaXMgaW5zaWRlIG9mIHdpbmRvdyBtZXNzYWdlIGRhdGFcbiAqICAgICAvLyBtc2dUeXBlID09ICdtZXNzYWdlOm15bWVzc2FnZSdcbiAqICAgICB2YXIgbXlEYXRhID0gbXNnRGF0YS5kYXRhO1xuICogICAgIC8vIC4uLiBhcHAgbG9naWMgaGVyZVxuICogfSk7XG4gKiBgYGBcbiAqIG9yIHdpdGhvdXQgbWlsbzpcbiAqIGBgYFxuICogd2luZG93LmF0dGFjaEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbihtZXNzYWdlKSB7XG4gKiAgICAgdmFyIG1zZ1R5cGUgPSBtZXNzYWdlLnR5cGU7IC8vIGUuZy4sICdteW1lc3NhZ2UnXG4gKiAgICAgdmFyIG15RGF0YSA9IG1lc3NhZ2UuZGF0YTtcbiAqICAgICAvLyAuLi4gbWVzc2FnZSByb3V0aW5nIGFuZCBjb2RlIGhlcmVcbiAqIH0pO1xuICogYGBgXG4gKiBNaWxvIGRvZXMgcm91dGluZyBiYXNlZCBvbiBzZW50IG1lc3NhZ2UgdHlwZSBhdXRvbWF0aWNhbGx5LlxuICogU2VlIFtNZXNzZW5nZXJdKC4uLy4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSBhbmQgW21pbG8ubWFpbF0oLi4vLi4vbWFpbC9pbmRleC5qcy5odG1sKS5cbiAqL1xuIHZhciBGcmFtZSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdGcmFtZScpO1xuXG5cbi8qKlxuICogQ2FsbHMgcGFzc2VkIGZ1bmN0aW9uIHdoZW4gZnJhbWUgRE9NIGJlY29tZXMgcmVhZHkuIElmIGFscmVhZHkgcmVhZHkgY2FsbHMgaW1tZWRpYXRlbHlcbiAqL1xudmFyIEZyYW1lJHdoZW5SZWFkeSA9IF9tYWtlV2hlblJlYWR5RnVuYyhGcmFtZSRpc1JlYWR5LCAnZG9tcmVhZHknKTtcblxuLyoqXG4gKiBDYWxscyBwYXNzZWQgZnVuY3Rpb24gd2hlbiBmcmFtZSBtaWxvIGJlY29tZXMgcmVhZHkuIElmIGFscmVhZHkgcmVhZHkgY2FsbHMgaW1tZWRpYXRlbHlcbiAqL1xudmFyIEZyYW1lJHdoZW5NaWxvUmVhZHkgPSBfbWFrZVdoZW5SZWFkeUZ1bmMoRnJhbWUkaXNNaWxvUmVhZHksICdtZXNzYWdlOm1pbG9yZWFkeScpO1xuXG5cbi8qKlxuICogIyMjI0V2ZW50cyBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNGcmFtZSRpbml0KSAtIGNhbGxlZCBieSBjb25zdHJ1Y3RvciBhdXRvbWF0aWNhbGx5XG4gKi9cbl8uZXh0ZW5kUHJvdG8oRnJhbWUsIHtcbiAgICBpbml0OiBGcmFtZSRpbml0LFxuICAgIHN0YXJ0OiBGcmFtZSRzdGFydCxcbiAgICBkZXN0cm95OiBGcmFtZSRkZXN0cm95LFxuICAgIGdldFdpbmRvdzogRnJhbWUkZ2V0V2luZG93LFxuICAgIGlzUmVhZHk6IEZyYW1lJGlzUmVhZHksXG4gICAgd2hlblJlYWR5OiBGcmFtZSR3aGVuUmVhZHksXG4gICAgaXNNaWxvUmVhZHk6IEZyYW1lJGlzTWlsb1JlYWR5LFxuICAgIHdoZW5NaWxvUmVhZHk6IEZyYW1lJHdoZW5NaWxvUmVhZHksXG4gICAgbWlsbzogRnJhbWUkbWlsb1xuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuXG5mYWNldHNSZWdpc3RyeS5hZGQoRnJhbWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lO1xuXG5cbi8qKlxuICogRXhwb3NlIEZyYW1lTWVzc2FnZVNvdXJjZSB0cmlnZ2VyIG1ldGhvZCBvbiBFdmVudHMgcHJvdG90eXBlXG4gKi9cbnZhciBNU0dfU09VUkNFX0tFWSA9ICdfbWVzc2FnZVNvdXJjZSc7XG5GcmFtZU1lc3NhZ2VTb3VyY2UudXNlV2l0aChGcmFtZSwgTVNHX1NPVVJDRV9LRVksIFsndHJpZ2dlciddKTtcblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbHplcyBmYWNldCwgY29ubmVjdHMgRnJhbWVNZXNzYWdlU291cmNlIHRvIGZhY2V0J3MgbWVzc2VuZ2VyXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBcbiAgICB2YXIgbWVzc2FnZVNvdXJjZSA9IG5ldyBGcmFtZU1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UobWVzc2FnZVNvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIE1TR19TT1VSQ0VfS0VZLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRW1pdHMgZnJhbWVsb2FkZWQgZXZlbnQgd2hlbiByZWFkeS5cbiAqL1xuZnVuY3Rpb24gRnJhbWUkc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIG1pbG8ocG9zdERvbVJlYWR5KTtcblxuICAgIGZ1bmN0aW9uIHBvc3REb21SZWFkeShldmVudCkge1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKCdkb21yZWFkeScsIGV2ZW50KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gRnJhbWUkZGVzdHJveSgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgdGhlIGludGVybmFsIHdpbmRvdyBvZiB0aGUgZnJhbWUgXG4gKlxuICogQHBhcmFtIHtXaW5kb3d9XG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbC5jb250ZW50V2luZG93O1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRvY3VtZW50LnJlYWR5U3RhdGUgaWYgZnJhbWUgZG91bWVudCBzdGF0ZSBpcyAnaW50ZXJhY3RpdmUnIG9yICdjb21wbGV0ZScsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEByZXR1cm4ge1N0cmluZ3xCb29sZWFufVxuICovXG5mdW5jdGlvbiBGcmFtZSRpc1JlYWR5KCkge1xuICAgIHZhciByZWFkeVN0YXRlID0gdGhpcy5nZXRXaW5kb3coKS5kb2N1bWVudC5yZWFkeVN0YXRlO1xuICAgIHJldHVybiAgcmVhZHlTdGF0ZSAhPSAnbG9hZGluZycgPyByZWFkeVN0YXRlIDogZmFsc2U7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBtaWxvIGlzIGxvYWRlZCBhbmQgaGFzIGZpbmlzaGVkIGluaXRpYWxpemluZyBpbnNpZGUgdGhlIGZyYW1lXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRnJhbWUkaXNNaWxvUmVhZHkoKSB7XG4gICAgdmFyIGZyYW1lTWlsbyA9IHRoaXMuZ2V0V2luZG93KCkubWlsbztcbiAgICByZXR1cm4gdGhpcy5pc1JlYWR5KCkgJiYgZnJhbWVNaWxvICYmIGZyYW1lTWlsby5taWxvX3ZlcnNpb247XG59XG5cblxuLyoqXG4gKiBHaXZlcyBhY2Nlc3MgdG8gbWlsbyBpbiB0aGUgZnJhbWUgKGFzc3VtaW5nIGl0IGlzIGxvYWRlZCB0aGVyZSlcbiAqIENhbGxzIGZ1bmN0aW9uIHdoZW4gYm90aCBtaWxvIGFuZCBET00gYXJlIHJlYWR5IGlmIGZ1bmN0aW9uIGlzIHBhc3NlZC5cbiAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSB0byBtaWxvIGluc2lkZSB0aGUgZnJhbWUgaWYgdGhlIHdpbmRvdyBpcyBhbHJlYWR5IGF2YWlsYWJsZS5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBtaWxvIGFuZCBET00gYXJlIHJlYWR5IGluIHRoZSBmcmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259IHJlZmVyZW5jZSB0byBtaWxvIGluIHRoZSBmcmFtZSBcbiAqL1xuZnVuY3Rpb24gRnJhbWUkbWlsbyhmdW5jKSB7XG4gICAgaWYgKHR5cGVvZiBmdW5jID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLndoZW5NaWxvUmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmdldFdpbmRvdygpLm1pbG8oZnVuYylcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHZhciB3aW4gPSB0aGlzLmdldFdpbmRvdygpO1xuICAgIHJldHVybiB3aW4gJiYgd2luLm1pbG87XG59XG5cblxuZnVuY3Rpb24gX21ha2VXaGVuUmVhZHlGdW5jKGlzUmVhZHlGdW5jLCBldmVudCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBGcmFtZV93aGVuUmVhZHlGdW5jKGZ1bmMpIHsgLy8gLCBhcmd1bWVudHNcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgICAgICAsIGFyZ3MgPSBfLnNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGlmIChpc1JlYWR5RnVuYy5jYWxsKHRoaXMpKVxuICAgICAgICAgICAgY2FsbEZ1bmMoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5vbihldmVudCwgY2FsbEZ1bmMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNhbGxGdW5jKCkge1xuICAgICAgICAgICAgZnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIG1pbG9NYWlsID0gcmVxdWlyZSgnLi4vLi4vc2VydmljZXMvbWFpbCcpO1xuXG5cbnZhciBJdGVtRmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnSXRlbScpO1xuXG5fLmV4dGVuZFByb3RvKEl0ZW1GYWNldCwge1xuICAgIGdldFN0YXRlOiBJdGVtRmFjZXQkZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IEl0ZW1GYWNldCRzZXRTdGF0ZSxcbiAgICBnZXRJbmRleDogSXRlbUZhY2V0JGdldEluZGV4LFxuICAgIHNldEluZGV4OiBJdGVtRmFjZXQkc2V0SW5kZXgsXG4gICAgcmVtb3ZlSXRlbTogSXRlbUZhY2V0JHJlbW92ZUl0ZW0sXG4gICAgZXh0cmFjdEl0ZW06IEl0ZW1GYWNldCRleHRyYWN0SXRlbSxcbiAgICByZXF1aXJlOiBbJ0NvbnRhaW5lcicsICdEb20nLCAnRGF0YSddXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKEl0ZW1GYWNldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gSXRlbUZhY2V0O1xuXG5cbmZ1bmN0aW9uIEl0ZW1GYWNldCRnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4geyBzdGF0ZToge1xuICAgICAgICBpbmRleDogdGhpcy5nZXRJbmRleCgpXG4gICAgfX07XG59XG5cblxuZnVuY3Rpb24gSXRlbUZhY2V0JHNldFN0YXRlKHN0YXRlKSB7XG4gICAgdGhpcy5zZXRJbmRleChzdGF0ZS5zdGF0ZS5pbmRleCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBvd25lciBjb21wb25lbnQgaW4gaXQncyBwYXJlbnQgbGlzdCBjb21wb25lbnRcbiAqIEByZXR1cm4ge0ludGVnZXJ9IFRoZSBpbmRleFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkZ2V0SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXg7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgdGhlIGluZGV4IG9mIHRoaXMgY29tcG9uZW50XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JHNldEluZGV4KGluZGV4KSB7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xufVxuXG5cbi8qKlxuICogSXRlbUZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBjb21wb25lbnQgZnJvbSB0aGUgbGlzdCwgY29tcG9uZW50IGdldHMgZGVzdHJveWVkXG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRyZW1vdmVJdGVtKCkge1xuICAgIC8vIHRoaXMubGlzdCBhbmQgdGhpcy5pbmRleCBhcmUgc2V0IGJ5IHRoZSBsaXN0IHdoZW4gdGhlIGl0ZW0gaXMgYWRkZWRcbiAgICB0aGlzLmxpc3QucmVtb3ZlSXRlbSh0aGlzLmluZGV4KTtcbn1cblxuXG4vKipcbiAqIEl0ZW1GYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gdGhlIGxpc3QsIGNvbXBvbmVudCBpcyBOT1QgZGVzdHJveWVkXG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRleHRyYWN0SXRlbSgpIHtcbiAgICB0aGlzLmxpc3QuZXh0cmFjdEl0ZW0odGhpcy5pbmRleCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBtaWxvTWFpbCA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL21haWwnKVxuICAgICwgbWlsb0JpbmRlciA9IHJlcXVpcmUoJy4uLy4uL2JpbmRlcicpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1RcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi8uLi91dGlsL2RvbScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJyk7XG5cblxudmFyIExJU1RfU0FNUExFX0NTU19DTEFTUyA9ICdtbC1saXN0LWl0ZW0tc2FtcGxlJztcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdMaXN0JylgXG4gKiBGYWNldCBlbmFibGluZyBsaXN0IGZ1bmN0aW9uYWxpdHlcbiAqL1xudmFyIExpc3QgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnTGlzdCcpO1xuXG5fLmV4dGVuZFByb3RvKExpc3QsIHtcbiAgICBpbml0OiBMaXN0JGluaXQsXG4gICAgc3RhcnQ6IExpc3Qkc3RhcnQsXG4gICAgZGVzdHJveTogTGlzdCRkZXN0cm95LFxuXG4gICAgcmVxdWlyZTogWydDb250YWluZXInLCAnRG9tJywgJ0RhdGEnXSxcbiAgICBfaXRlbVByZXZpb3VzQ29tcG9uZW50OiBfaXRlbVByZXZpb3VzQ29tcG9uZW50LFxuXG4gICAgaXRlbTogTGlzdCRpdGVtLFxuICAgIGNvdW50OiBMaXN0JGNvdW50LFxuICAgIGNvbnRhaW5zOiBMaXN0JGNvbnRhaW5zLFxuICAgIGFkZEl0ZW06IExpc3QkYWRkSXRlbSxcbiAgICBhZGRJdGVtczogTGlzdCRhZGRJdGVtcyxcbiAgICByZXBsYWNlSXRlbTogTGlzdCRyZXBsYWNlSXRlbSxcbiAgICByZW1vdmVJdGVtOiBMaXN0JHJlbW92ZUl0ZW0sXG4gICAgZXh0cmFjdEl0ZW06IExpc3QkZXh0cmFjdEl0ZW0sXG4gICAgZWFjaDogTGlzdCRlYWNoLFxuICAgIF9zZXRJdGVtOiBMaXN0JF9zZXRJdGVtLFxuICAgIF9yZW1vdmVJdGVtOiBMaXN0JF9yZW1vdmVJdGVtLFxuICAgIF9hZGRJdGVtOiBMaXN0JF9hZGRJdGVtLFxuICAgIF9hZGRJdGVtczogTGlzdCRfYWRkSXRlbXMsXG4gICAgX2NyZWF0ZUNhY2hlVGVtcGxhdGU6IExpc3QkX2NyZWF0ZUNhY2hlVGVtcGxhdGUsXG4gICAgX3VwZGF0ZURhdGFQYXRoczogTGlzdCRfdXBkYXRlRGF0YVBhdGhzXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVkIExpc3QgZmFjZXQgaW5zdGFuY2UgYW5kIHNldHMgdXAgaXRlbSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBMaXN0JGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfbGlzdEl0ZW1zOiBbXSxcbiAgICAgICAgX2xpc3RJdGVtc0hhc2g6IHt9XG4gICAgfSk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXRlbVNhbXBsZScsIG51bGwsIF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFN0YXJ0cyB0aGUgTGlzdCBmYWNldCBpbnN0YW5jZSwgZmluZHMgY2hpbGQgd2l0aCBJdGVtIGZhY2V0LlxuICovXG5mdW5jdGlvbiBMaXN0JHN0YXJ0KCkge1xuICAgIC8vIEZpcmVkIGJ5IF9fYmluZGVyX18gd2hlbiBhbGwgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBib3VuZFxuICAgIHRoaXMub3duZXIub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICAvLyBnZXQgaXRlbXMgYWxyZWFkeSBpbiB0aGUgbGlzdFxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuZG9tLmNoaWxkcmVuKClcbiAgICAgICAgLCBpdGVtcyA9IHRoaXMubGlzdC5fbGlzdEl0ZW1zXG4gICAgICAgICwgaXRlbXNIYXNoID0gdGhpcy5saXN0Ll9saXN0SXRlbXNIYXNoO1xuXG4gICAgY2hpbGRyZW4gJiYgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihjaGlsZEVsKSB7XG4gICAgICAgIHZhciBjb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChjaGlsZEVsKTtcbiAgICAgICAgaWYgKGNvbXAgJiYgY29tcC5pdGVtKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGNvbXApO1xuICAgICAgICAgICAgaXRlbXNIYXNoW2NvbXAubmFtZV0gPSBjb21wO1xuICAgICAgICAgICAgY29tcC5pdGVtLmxpc3QgPSB0aGlzLmxpc3Q7XG4gICAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGZvdW5kSXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICBpdGVtcy5zcGxpY2UoMCwgMSk7XG4gICAgICAgIGRlbGV0ZSBpdGVtc0hhc2hbZm91bmRJdGVtLm5hbWVdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBpdGVtLml0ZW0uc2V0SW5kZXgoaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29tcG9uZW50IG11c3QgaGF2ZSBvbmUgY2hpbGQgd2l0aCBhbiBJdGVtIGZhY2V0IFxuICAgIGlmICghIGZvdW5kSXRlbSkgdGhyb3cgbmV3IEVycm9yKCdObyBjaGlsZCBjb21wb25lbnQgaGFzIEl0ZW0gZmFjZXQnKTtcblxuICAgIHRoaXMubGlzdC5pdGVtU2FtcGxlID0gZm91bmRJdGVtO1xuXG4gICAgLy8gQWZ0ZXIga2VlcGluZyBhIHJlZmVyZW5jZSB0byB0aGUgaXRlbSBzYW1wbGUsIGl0IG11c3QgYmUgaGlkZGVuIGFuZCByZW1vdmVkIGZyb20gc2NvcGVcbiAgICBmb3VuZEl0ZW0uZG9tLmhpZGUoKTtcbiAgICBmb3VuZEl0ZW0ucmVtb3ZlKHRydWUpO1xuICAgIGZvdW5kSXRlbS5kb20ucmVtb3ZlQ3NzQ2xhc3NlcyhMSVNUX1NBTVBMRV9DU1NfQ0xBU1MpO1xuXG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gY29tcG9uZW50cyBmcm9tIHNhbXBsZSBpdGVtXG4gICAgZm91bmRJdGVtLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcCkge1xuICAgICAgICBkZWxldGUgY29tcC5lbFttaWxvQ29uZmlnLmNvbXBvbmVudFJlZl07XG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3QuX2NyZWF0ZUNhY2hlVGVtcGxhdGUoKTtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JF9jcmVhdGVDYWNoZVRlbXBsYXRlKCkge1xuICAgIGlmICghdGhpcy5pdGVtU2FtcGxlKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgdmFyIGl0ZW1TYW1wbGUgPSB0aGlzLml0ZW1TYW1wbGU7XG5cbiAgICAvLyBjcmVhdGUgaXRlbSB0ZW1wbGF0ZSB0byBpbnNlcnQgbWFueSBpdGVtcyBhdCBvbmNlXG4gICAgdmFyIGl0ZW1FbENvcHkgPSBpdGVtU2FtcGxlLmVsLmNsb25lTm9kZSh0cnVlKTtcbiAgICB2YXIgYXR0ciA9IGl0ZW1TYW1wbGUuY29tcG9uZW50SW5mby5hdHRyO1xuICAgIHZhciBhdHRyQ29weSA9IF8uY2xvbmUoYXR0cik7XG4gICAgYXR0ci5jb21wTmFtZSA9ICd7ez0gaXQuY29tcG9uZW50TmFtZSgpIH19JztcbiAgICBhdHRyLmVsID0gaXRlbUVsQ29weTtcbiAgICBhdHRyLmRlY29yYXRlKCk7XG5cbiAgICB2YXIgaXRlbXNUZW1wbGF0ZVN0ciA9IFxuICAgICAgICAgICd7eyB2YXIgaSA9IGl0LmNvdW50OyB3aGlsZShpLS0pIHsgfX0nXG4gICAgICAgICsgaXRlbUVsQ29weS5vdXRlckhUTUxcbiAgICAgICAgKyAne3sgfSB9fSc7XG5cbiAgICB0aGlzLml0ZW1zVGVtcGxhdGUgPSBkb1QuY29tcGlsZShpdGVtc1RlbXBsYXRlU3RyKTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGNoaWxkIGl0ZW0gYnkgaW5kZXhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBpdGVtIHRvIGdldC5cbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGNvbXBvbmVudCBmb3VuZFxuICovXG5mdW5jdGlvbiBMaXN0JGl0ZW0oaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdEl0ZW1zW2luZGV4XTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoaWxkIGl0ZW1zXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgdG90YWxcbiAqL1xuZnVuY3Rpb24gTGlzdCRjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdEl0ZW1zLmxlbmd0aDtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JF9zZXRJdGVtKGluZGV4LCBjb21wb25lbnQpIHtcbiAgICB0aGlzLl9saXN0SXRlbXMuc3BsaWNlKGluZGV4LCAwLCBjb21wb25lbnQpO1xuICAgIHRoaXMuX2xpc3RJdGVtc0hhc2hbY29tcG9uZW50Lm5hbWVdID0gY29tcG9uZW50O1xuICAgIGNvbXBvbmVudC5pdGVtLmxpc3QgPSB0aGlzO1xuICAgIGNvbXBvbmVudC5pdGVtLnNldEluZGV4KCtpbmRleCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgY2hpbGQgaXRlbSBleGlzdHMgaW4gdGhlIGxpc3RcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBsb29rIGZvci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIExpc3QkY29udGFpbnMoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtc0hhc2hbY29tcG9uZW50Lm5hbWVdID09IGNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBhIG5ldyBjaGlsZCBjb21wb25lbnQgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IGFuZCByZXR1cm5zIHRoZSBuZXcgY29tcG9uZW50LlxuICogVGhpcyBtZXRob2QgdXNlcyBkYXRhIGZhY2V0LCBzbyBub3RpZmljYXRpb24gd2lsbCBiZSBlbWl0dGVkIG9uIGRhdGEgZmFjZXQuXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCB0byBhZGQgYXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIExpc3QkYWRkSXRlbShpbmRleCwgaXRlbURhdGEpIHtcbiAgICBpbmRleCA9IGluZGV4IHx8IHRoaXMuY291bnQoKTtcbiAgICB0aGlzLm93bmVyLmRhdGEuc3BsaWNlKGluZGV4LCAwLCBpdGVtRGF0YSB8fCB7fSk7XG4gICAgcmV0dXJuIHRoaXMuaXRlbShpbmRleCk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBuZXcgY2hpbGQgY29tcG9uZW50IGF0IGEgcGFydGljdWxhciBpbmRleCBhbmQgcmV0dXJucyB0aGUgbmV3IGNvbXBvbmVudFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYWRkIGF0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudFxuICovXG5mdW5jdGlvbiBMaXN0JF9hZGRJdGVtKGluZGV4KSB7XG4gICAgaW5kZXggPSBpbmRleCB8fCB0aGlzLmNvdW50KCk7XG4gICAgaWYgKHRoaXMuaXRlbShpbmRleCkpXG4gICAgICAgIHRocm93IEVycm9yKCdhdHRlbXB0IHRvIGNyZWF0ZSBpdGVtIHdpdGggSUQgb2YgZXhpc3RpbmcgaXRlbScpO1xuXG4gICAgLy8gQ29weSBjb21wb25lbnRcbiAgICB2YXIgY29tcG9uZW50ID0gQ29tcG9uZW50LmNvcHkodGhpcy5pdGVtU2FtcGxlLCB0cnVlKTtcbiAgICB2YXIgcHJldkNvbXBvbmVudCA9IHRoaXMuX2l0ZW1QcmV2aW91c0NvbXBvbmVudChpbmRleCk7XG5cbiAgICBpZiAoIXByZXZDb21wb25lbnQuZWwucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdsaXN0IGl0ZW0gc2FtcGxlIHdhcyByZW1vdmVkIGZyb20gRE9NLCBwcm9iYWJseSBjYXVzZWQgYnkgd3JvbmcgZGF0YS4gUmVzZXQgbGlzdCBkYXRhIHdpdGggYXJyYXknKTtcblxuICAgIC8vIEFkZCBpdCB0byB0aGUgRE9NXG4gICAgcHJldkNvbXBvbmVudC5kb20uaW5zZXJ0QWZ0ZXIoY29tcG9uZW50LmVsKTtcblxuICAgIC8vIEFkZCB0byBsaXN0IGl0ZW1zXG4gICAgdGhpcy5fc2V0SXRlbShpbmRleCwgY29tcG9uZW50KTtcblxuICAgIC8vIFNob3cgdGhlIGxpc3QgaXRlbSBjb21wb25lbnRcbiAgICBjb21wb25lbnQuZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuXG4gICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIGluZGV4ICsgMSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuXG5cbmZ1bmN0aW9uIF91cGRhdGVJdGVtc0luZGV4ZXMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgZnJvbUluZGV4ID0gZnJvbUluZGV4IHx8IDA7XG4gICAgdG9JbmRleCA9IHRvSW5kZXggfHwgdGhpcy5jb3VudCgpO1xuICAgIGZvciAodmFyIGkgPSBmcm9tSW5kZXg7IGkgPCB0b0luZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuX2xpc3RJdGVtc1tpXTtcbiAgICAgICAgaWYgKGNvbXBvbmVudClcbiAgICAgICAgICAgIGNvbXBvbmVudC5pdGVtLnNldEluZGV4KGkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignTGlzdDogbm8gaXRlbSBhdCBwb3NpdGlvbicsIGkpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBMaXN0JGFkZEl0ZW1zKGNvdW50LCBpbmRleCkgeyAvLyAsLi4uIGl0ZW1zIGRhdGFcbiAgICB2YXIgaXRlbXNEYXRhID0gXy5zbGljZShhcmd1bWVudHMsIDIpO1xuICAgIGlmIChpdGVtc0RhdGEubGVuZ3RoIDwgY291bnQpIFxuICAgICAgICBpdGVtc0RhdGEuY29uY2F0KF8ucmVwZWF0KGNvdW50IC0gaXRlbXNEYXRhLmxlbmd0aCwge30pKTtcbiAgICB2YXIgc3BsaWNlQXJncyA9IFtpbmRleCwgMF0uY29uY2F0KGl0ZW1zRGF0YSk7XG4gICAgdmFyIGRhdGFGYWNldCA9IHRoaXMub3duZXIuZGF0YTtcbiAgICBkYXRhRmFjZXQuc3BsaWNlLmFwcGx5KGRhdGFGYWNldCwgc3BsaWNlQXJncyk7XG59XG5cblxuLyoqXG4gKiBMaXN0IGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBhIGdpdmVuIG51bWJlciBvZiBpdGVtcyB1c2luZyB0ZW1wbGF0ZSByZW5kZXJpbmcgcmF0aGVyIHRoYW4gYWRkaW5nIGVsZW1lbnRzIG9uZSBieSBvbmVcbiAqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGNvdW50IG51bWJlciBvZiBpdGVtcyB0byBhZGRcbiAqIEBwYXJhbSB7W0ludGVnZXJdfSBpbmRleCBvcHRpb25hbCBpbmRleCBvZiBpdGVtIGFmdGVyIHdoaWNoIHRvIGFkZFxuICovXG5mdW5jdGlvbiBMaXN0JF9hZGRJdGVtcyhjb3VudCwgaW5kZXgpIHtcbiAgICBjaGVjayhjb3VudCwgTWF0Y2guSW50ZWdlcik7XG4gICAgaWYgKGNvdW50IDwgMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGFkZCBuZWdhdGl2ZSBudW1iZXIgb2YgaXRlbXMnKTtcblxuICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm47XG5cbiAgICB2YXIgaXRlbXNIVE1MID0gdGhpcy5pdGVtc1RlbXBsYXRlKHtcbiAgICAgICAgY29tcG9uZW50TmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgY291bnQ6IGNvdW50XG4gICAgfSk7XG5cbiAgICB2YXIgd3JhcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgd3JhcEVsLmlubmVySFRNTCA9IGl0ZW1zSFRNTDtcblxuICAgIG1pbG9CaW5kZXIod3JhcEVsLCB0aGlzLm93bmVyLmNvbnRhaW5lci5zY29wZSk7XG4gICAgdmFyIGNoaWxkcmVuID0gZG9tVXRpbHMuY2hpbGRyZW4od3JhcEVsKTtcblxuICAgIGlmIChjb3VudCAhPSBjaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgIGxvZ2dlci5lcnJvcignbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIGlzIGRpZmZlcmVudCBmcm9tIHJlcXVlc3RlZCcpO1xuXG4gICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICB2YXIgbGlzdExlbmd0aCA9IHRoaXMuY291bnQoKTtcbiAgICAgICAgdmFyIHNwbGljZUluZGV4ID0gaW5kZXggPCAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2YgaW5kZXggPT0gJ3VuZGVmaW5lZCcgfHwgaW5kZXggPiBsaXN0TGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGlzdExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGluZGV4O1xuXG4gICAgICAgIHZhciBwcmV2Q29tcG9uZW50ID0gc3BsaWNlSW5kZXggPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuaXRlbVNhbXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2xpc3RJdGVtc1tzcGxpY2VJbmRleCAtIDFdO1xuXG4gICAgICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgICAsIG5ld0NvbXBvbmVudHMgPSBbXTtcblxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGVsLCBpKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG4gICAgICAgICAgICBpZiAoISBjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcignTGlzdDogZWxlbWVudCBpbiBuZXcgaXRlbXMgaXMgbm90IGEgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICBuZXdDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEl0ZW0oc3BsaWNlSW5kZXgrKywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICBfdXBkYXRlSXRlbXNJbmRleGVzLmNhbGwodGhpcywgc3BsaWNlSW5kZXgpO1xuXG4gICAgICAgIGlmICghcHJldkNvbXBvbmVudC5lbC5wYXJlbnROb2RlKVxuICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdsaXN0IGl0ZW0gc2FtcGxlIHdhcyByZW1vdmVkIGZyb20gRE9NLCBwcm9iYWJseSBjYXVzZWQgYnkgd3JvbmcgZGF0YS4gUmVzZXQgbGlzdCBkYXRhIHdpdGggYXJyYXknKTtcblxuICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIERPTVxuICAgICAgICBwcmV2Q29tcG9uZW50LmRvbS5pbnNlcnRBZnRlcihmcmFnKTtcblxuICAgICAgICBfLmRlZmVyTWV0aG9kKG5ld0NvbXBvbmVudHMsICdmb3JFYWNoJywgZnVuY3Rpb24oY29tcCkge1xuICAgICAgICAgICAgY29tcC5icm9hZGNhc3QoJ3N0YXRlcmVhZHknKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICogQHJldHVybiB7QXJyYXlbT2JqZWN0XX0gVGhlIHNwbGljZWQgZGF0YVxuICovXG5mdW5jdGlvbiBMaXN0JHJlbW92ZUl0ZW0oaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5kYXRhLnNwbGljZShpbmRleCwgMSk7XG59XG5cblxuLyoqXG4gKiBMaXN0IGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gZXh0cmFjdFxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgZXh0cmFjdGVkIGl0ZW1cbiAqL1xuZnVuY3Rpb24gTGlzdCRleHRyYWN0SXRlbShpbmRleCkge1xuICAgIHZhciBpdGVtQ29tcCA9IHRoaXMuX3JlbW92ZUl0ZW0oaW5kZXgsIGZhbHNlKTtcbiAgICB0aGlzLl91cGRhdGVEYXRhUGF0aHMoaW5kZXgsIHRoaXMuY291bnQoKSk7XG4gICAgcmV0dXJuIGl0ZW1Db21wO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgaXRlbSwgcmV0dXJucyB0aGUgcmVtb3ZlZCBpdGVtIHRoYXQgaXMgZGVzdHJveWVkIGJ5IGRlZmF1bHQuXG4gKiBcbiAqIEBwYXJhbSAge051bWJlcn0gaW5kZXggaXRlbSBpbmRleFxuICogQHBhcmFtICB7Qm9vbGVhbn0gZG9EZXN0cm95SXRlbSBvcHRpb25hbCBmYWxzZSB0byBwcmV2ZW50IGl0ZW0gZGVzdHJ1Y3Rpb24sIHRydWUgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBMaXN0JF9yZW1vdmVJdGVtKGluZGV4LCBkb0Rlc3Ryb3lJdGVtKSB7XG4gICAgdmFyIGNvbXAgPSB0aGlzLml0ZW0oaW5kZXgpO1xuXG4gICAgaWYgKCEgY29tcClcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdhdHRlbXB0IHRvIHJlbW92ZSBsaXN0IGl0ZW0gd2l0aCBpZCB0aGF0IGRvZXMgbm90IGV4aXN0Jyk7XG5cbiAgICB0aGlzLl9saXN0SXRlbXNbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgIGRlbGV0ZSB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXAubmFtZV07XG4gICAgaWYgKGRvRGVzdHJveUl0ZW0gIT09IGZhbHNlKSBjb21wLmRlc3Ryb3koKTtcbiAgICBlbHNlIHtcbiAgICAgICAgY29tcC5yZW1vdmUoKTtcbiAgICAgICAgY29tcC5kb20ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIGluZGV4KTtcblxuICAgIHJldHVybiBjb21wO1xufVxuXG5cbmZ1bmN0aW9uIExpc3QkcmVwbGFjZUl0ZW0oaW5kZXgsIG5ld0l0ZW0pe1xuICAgIHZhciBvbGRJdGVtID0gdGhpcy5pdGVtKGluZGV4KTtcbiAgICBvbGRJdGVtLmRvbS5pbnNlcnRBZnRlcihuZXdJdGVtLmVsKTtcbiAgICB0aGlzLl9yZW1vdmVJdGVtKGluZGV4KTtcbiAgICB0aGlzLl9zZXRJdGVtKGluZGV4LCBuZXdJdGVtKTtcbn1cblxuXG4vLyBSZXR1cm5zIHRoZSBwcmV2aW91cyBpdGVtIGNvbXBvbmVudCBnaXZlbiBhbiBpbmRleFxuZnVuY3Rpb24gX2l0ZW1QcmV2aW91c0NvbXBvbmVudChpbmRleCkge1xuICAgIHdoaWxlIChpbmRleCA+PSAwICYmICEgdGhpcy5fbGlzdEl0ZW1zW2luZGV4XSlcbiAgICAgICAgaW5kZXgtLTtcblxuICAgIHJldHVybiBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9saXN0SXRlbXNbaW5kZXhdXG4gICAgICAgICAgICAgICAgOiB0aGlzLml0ZW1TYW1wbGU7XG59XG5cblxuLy8gdG9JbmRleCBpcyBub3QgaW5jbHVkZWRcbi8vIG5vIHJhbmdlIGNoZWNraW5nIGlzIG1hZGVcbmZ1bmN0aW9uIExpc3QkX3VwZGF0ZURhdGFQYXRocyhmcm9tSW5kZXgsIHRvSW5kZXgpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgdG9JbmRleDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtKGkpO1xuICAgICAgICBpZiAoaXRlbSlcbiAgICAgICAgICAgIGl0ZW0uZGF0YS5fcGF0aCA9ICdbJyArIGkgKyAnXSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2ltaWxhciB0byBmb3JFYWNoIG1ldGhvZCBvZiBBcnJheSwgaXRlcmF0ZXMgZWFjaCBvZiB0aGUgY2hpbGQgaXRlbXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBbiBpdGVyYXRvciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBjaGlsZCBpdGVtLlxuICogQHBhcmFtIHtbdHlwZV19ICAgdGhpc0FyZyAgQ29udGV4dCB0byBzZXQgYHRoaXNgLlxuICovXG5mdW5jdGlvbiBMaXN0JGVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB0aGlzLl9saXN0SXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICBpZiAoaXRlbSkgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gcGFzc2VzIGl0ZW0sIGluZGV4IHRvIGNhbGxiYWNrXG4gICAgICAgIGVsc2UgbG9nZ2VyLndhcm4oJ0xpc3QkZWFjaDogaXRlbScsIGluZGV4LCAnaXMgdW5kZWZpbmVkJyk7XG4gICAgfSwgdGhpc0FyZyB8fCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVzdHJveXMgdGhlIGxpc3RcbiAqL1xuZnVuY3Rpb24gTGlzdCRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLml0ZW1TYW1wbGUpIHRoaXMuaXRlbVNhbXBsZS5kZXN0cm95KHRydWUpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1vZGVsID0gbWlsb0NvcmUuTW9kZWxcbiAgICAsIE1peGluID0gbWlsb0NvcmUuY2xhc3Nlcy5NaXhpblxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8vIGdlbmVyaWMgZHJhZyBoYW5kbGVyLCBzaG91bGQgYmUgb3ZlcnJpZGRlblxudmFyIE1vZGVsRmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnTW9kZWwnKTtcblxuXy5leHRlbmRQcm90byhNb2RlbEZhY2V0LCB7XG4gICAgaW5pdDogTW9kZWxGYWNldCRpbml0LFxuICAgIGdldFN0YXRlOiBNb2RlbEZhY2V0JGdldFN0YXRlLFxuICAgIHNldFN0YXRlOiBNb2RlbEZhY2V0JHNldFN0YXRlLFxuICAgIF9jcmVhdGVNZXNzZW5nZXI6IE1vZGVsRmFjZXQkX2NyZWF0ZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiBNb2RlbEZhY2V0JGRlc3Ryb3lcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoTW9kZWxGYWNldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxGYWNldDtcblxuXG4vKipcbiAqIEV4cG9zZSBNb2RlbCBjbGFzcyBtZXRob2RzIG9uIE1vZGVsRmFjZXRcbiAqL1xuTW9kZWwudXNlV2l0aChNb2RlbEZhY2V0LCAnbScpO1xuXG5cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkaW5pdCgpIHtcbiAgICB0aGlzLm0gPSBuZXcgTW9kZWwodGhpcy5jb25maWcuZGF0YSwgdGhpcyk7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAvLyB0aGlzLm0ucHJveHlNZXRob2RzKHRoaXMpOyAvLyBDcmVhdGVzIG1vZGVsJ3MgbWV0aG9kcyBkaXJlY3RseSBvbiBmYWNldFxufVxuXG5cbi8qKlxuICogTW9kZWxGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNpbXBseSByZXR1cm5zIG1vZGVsIGRhdGFcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkZ2V0U3RhdGUoKSB7XG4gICAgdmFyIG1vZGVsVmFsdWUgPSB0aGlzLm0uZ2V0KCk7XG4gICAgaWYgKHR5cGVvZiBtb2RlbFZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICBtb2RlbFZhbHVlID0gXy5kZWVwQ2xvbmUobW9kZWxWYWx1ZSk7XG4gICAgcmV0dXJuIHsgc3RhdGU6IG1vZGVsVmFsdWUgfTtcbn1cblxuXG4vKipcbiAqIE1vZGVsRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gTW9kZWxGYWNldCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLm0uc2V0KHN0YXRlLnN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JF9jcmVhdGVNZXNzZW5nZXIoKSB7IC8vIENhbGxlZCBieSBpbmhlcml0ZWQgaW5pdFxuICAgIHRoaXMuX21lc3NlbmdlciA9IHRoaXMubS5fbWVzc2VuZ2VyO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkZGVzdHJveSgpIHtcbiAgICB0aGlzLm0uZGVzdHJveSgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1vZGVsID0gbWlsb0NvcmUuTW9kZWxcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyBnZW5lcmljIGRyYWcgaGFuZGxlciwgc2hvdWxkIGJlIG92ZXJyaWRkZW5cbnZhciBPcHRpb25zID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ09wdGlvbnMnKTtcblxuXy5leHRlbmRQcm90byhPcHRpb25zLCB7XG4gICAgaW5pdDogT3B0aW9ucyRpbml0LFxuICAgIGRlc3Ryb3k6IE9wdGlvbnMkZGVzdHJveSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBPcHRpb25zJF9jcmVhdGVNZXNzZW5nZXJcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoT3B0aW9ucyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT3B0aW9ucztcblxuXG5mdW5jdGlvbiBPcHRpb25zJGluaXQoKSB7XG4gICAgdGhpcy5tID0gbmV3IE1vZGVsKHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5tLnByb3h5TWV0aG9kcyh0aGlzKTsgLy8gQ3JlYXRlcyBtb2RlbCdzIG1ldGhvZHMgZGlyZWN0bHkgb24gZmFjZXRcbn1cblxuXG5mdW5jdGlvbiBPcHRpb25zJF9jcmVhdGVNZXNzZW5nZXIoKSB7IC8vIENhbGxlZCBieSBpbmhlcml0ZWQgaW5pdFxuICAgIHRoaXMuX21lc3NlbmdlciA9IHRoaXMubS5fbWVzc2VuZ2VyO1xufVxuXG5cbmZ1bmN0aW9uIE9wdGlvbnMkZGVzdHJveSgpIHtcbiAgICB0aGlzLm0uZGVzdHJveSgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJjb21wb25lbnRzLWZhY2V0cy10ZW1wbGF0ZVwiPjwvYT5cbi8vICMjI3RlbXBsYXRlIGZhY2V0XG5cbi8vIHNpbXBsaWZpZXMgcmVuZGVyaW5nIG9mIGNvbXBvbmVudCBlbGVtZW50IGZyb20gdGVtcGxhdGUuXG4vLyAgIEFueSB0ZW1wbGF0aW5nIGVuZ2luZyBjYW4gYmUgdXNlZCB0aGF0IHN1cHBvcnRzIHRlbXBsYXRlIGNvbXBpbGF0aW9uXG4vLyAgIChvciB5b3UgY2FuIG1vY2sgdGhpcyBjb21waWxhdGlvbiBlYXNpbHkgYnkgY3JlYXRpbmcgY2xvc3VyZSBzdG9yaW5nXG4vLyAgIHRlbXBsYXRlIHN0cmluZyBpbiBjYXNlIHlvdXIgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBjb21waWxhdGlvbikuXG4vLyAgIEJ5IGRlZmF1bHQgbWlsbyB1c2VzIFtkb1RdKCksIHRoZSBtb3N0IHZlcnNhdGlsZSwgY29uc2Npc2UgYW5kIGF0IHRoZVxuLy8gICBzYW1lIHRpbWUgdGhlIGZhc3Rlc3QgdGVtcGxhdGluZyBlbmdpbmUuXG4vLyAgIElmIHlvdSB1c2UgbWlsbyBpbiBicm93c2VyLCBpdCBpcyB0aGUgcGFydCBvZiBtaWxvIGJ1bmRsZSBhbmQgYXZhaWxhYmxlXG4vLyAgIGFzIGdsb2JhbCB2YXJpYWJsZSBgZG9UYC5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBiaW5kZXIgPSByZXF1aXJlKCcuLi8uLi9iaW5kZXInKTtcblxuXG4vLyBkYXRhIG1vZGVsIGNvbm5lY3Rpb24gZmFjZXRcbnZhciBUZW1wbGF0ZSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdUZW1wbGF0ZScpO1xuXG5fLmV4dGVuZFByb3RvKFRlbXBsYXRlLCB7XG4gICAgaW5pdDogVGVtcGxhdGUkaW5pdCxcbiAgICBzdGFydDogVGVtcGxhdGUkc3RhcnQsXG4gICAgc2V0OiBUZW1wbGF0ZSRzZXQsXG4gICAgZ2V0Q29tcGlsZWQ6IFRlbXBsYXRlJGdldENvbXBpbGVkLFxuICAgIHJlbmRlcjogVGVtcGxhdGUkcmVuZGVyLFxuICAgIGJpbmRlcjogVGVtcGxhdGUkYmluZGVyXG5cbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChUZW1wbGF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGVtcGxhdGU7XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkaW5pdCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gdGVtcGxhdGVzIGFyZSBpbnRlcnBvbGF0ZWQgd2l0aCBkZWZhdWx0IChkb1QpIG9yIGNvbmZpZ3VyZWQgZW5naW5lICh0aGlzLmNvbmZpZy5jb21waWxlKVxuICAgIC8vIHVubGVzcyB0aGlzLmNvbmZpZy5pbnRlcnBvbGF0ZSBpcyBmYWxzZVxuICAgIHZhciBjb21waWxlID0gdGhpcy5jb25maWcuaW50ZXJwb2xhdGUgPT09IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5jb25maWcuY29tcGlsZSB8fCBtaWxvLmNvbmZpZy50ZW1wbGF0ZS5jb21waWxlO1xuXG4gICAgdGhpcy5zZXQodGhpcy5jb25maWcudGVtcGxhdGUgfHwgJycsIGNvbXBpbGUsIHRoaXMuY29uZmlnLmNvbXBpbGVPcHRpb25zKTtcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodGhpcy5jb25maWcuYXV0b1JlbmRlcikge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuYXV0b0JpbmRlcilcbiAgICAgICAgICAgIHRoaXMuYmluZGVyKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGdldENvbXBpbGVkKCkge1xuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZTtcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRzZXQodGVtcGxhdGVTdHIsIGNvbXBpbGUsIGNvbXBpbGVPcHRpb25zKSB7XG4gICAgY2hlY2sodGVtcGxhdGVTdHIsIE1hdGNoLk9uZU9mKFN0cmluZywgRnVuY3Rpb24pKTtcbiAgICBjaGVjayhjb21waWxlLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuXG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZVN0ciA9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IHRlbXBsYXRlU3RyO1xuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl90ZW1wbGF0ZVN0ciA9IHRlbXBsYXRlU3RyO1xuICAgICAgICBpZiAoY29tcGlsZSlcbiAgICAgICAgICAgIHRoaXMuX2NvbXBpbGUgPSBjb21waWxlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb21waWxlID0gdGhpcy5fY29tcGlsZTtcblxuICAgICAgICBpZiAoY29tcGlsZSlcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gY29tcGlsZSh0ZW1wbGF0ZVN0ciwgY29tcGlsZU9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJHJlbmRlcihkYXRhKSB7IC8vIHdlIG5lZWQgZGF0YSBvbmx5IGlmIHVzZSB0ZW1wbGF0aW5nIGVuZ2luZVxuICAgIHRoaXMub3duZXIuZWwuaW5uZXJIVE1MID0gdGhpcy5fdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl90ZW1wbGF0ZShkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX3RlbXBsYXRlU3RyO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkYmluZGVyKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmNvbnRhaW5lcilcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIuY29udGFpbmVyLmJpbmRlcigpO1xuICAgIGVsc2VcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdUZW1wbGF0ZUZhY2V0OiBCaW5kZXIgY2FsbGVkIHdpdGhvdXQgY29udGFpbmVyIGZhY2V0LicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLyoqXG4gKiBUcmFuc2ZlciBmYWNldCBpcyBkZXNpZ25lZCBmb3IgY29tcG9uZW50cyB0byBiZSBhYmxlIHRvIHJlcHJlc2VudCBvdGhlciBjb21wb25lbnRzXG4gKiBJZiBhIFtDb21wb25lbnRdKC4uL2NfY2xhc3MuanMuaHRtbCkgaGFzIFRyYW5zZmVyIGZhY2V0LCB3aGVuIGBDb21wb25lbnQuZ2V0U3RhdGVgIGlzIGNhbGxlZCBmb3IgdGhpcyBjb21wb25ldCBpdCByZXR1cm5zIHByZXZpb3VzbHkgc2F2ZWQgZGF0YSwgcG9zc2libHkgZnJvbSBhbm90aGVyIGNvbXBvbmVudC5cbiAqIEZvciBleGFtcGxlLCBhIGxpc3Qgb2YgZG9jdW1lbnRzIGNhbiB1c2UgdGhpcyBmYWNldCBzbyB0aGF0IGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBjYW4gc3RvcmUgYWN0dWFsIGRvY3VtZW50IGNvbXBvbmVudCBvbiBpdC5cbiAqL1xudmFyIFRyYW5zZmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ1RyYW5zZmVyJyk7XG5cbl8uZXh0ZW5kUHJvdG8oVHJhbnNmZXIsIHtcbiAgICBpbml0OiBUcmFuc2ZlciRpbml0LFxuICAgIGdldFN0YXRlOiBUcmFuc2ZlciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogVHJhbnNmZXIkc2V0U3RhdGUsXG4gICAgc2V0QWN0aXZlU3RhdGU6IFRyYW5zZmVyJHNldEFjdGl2ZVN0YXRlLFxuICAgIHNldFN0YXRlV2l0aEtleTogVHJhbnNmZXIkc2V0U3RhdGVXaXRoS2V5LFxuICAgIGdldFN0YXRlV2l0aEtleTogVHJhbnNmZXIkZ2V0U3RhdGVXaXRoS2V5LFxuICAgIGdldENvbXBvbmVudE1ldGE6IFRyYW5zZmVyJGdldENvbXBvbmVudE1ldGFcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoVHJhbnNmZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZmVyO1xuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9hY3RpdmVTdGF0ZSA9ICcnO1xuICAgIHRoaXMuX2RlZmF1bHRLZXkgPSAnJztcbiAgICB0aGlzLl9zdGF0ZSA9IHt9O1xufVxuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRyYW5zZmVyIHN0YXRlIGZvciBjb21wb25lbnQuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVbdGhpcy5fYWN0aXZlU3RhdGVdIHx8IHRoaXMuX3N0YXRlW3RoaXMuX2RlZmF1bHRLZXldO1xufVxuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRyYW5zZmVyIHN0YXRlIGZvciBjb21wb25lbnQuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldFN0YXRlKHN0YXRlKSB7XG4gICAgdGhpcy5fc3RhdGVbJyddID0gc3RhdGU7XG4gICAgdGhpcy5zZXRBY3RpdmVTdGF0ZSgnJyk7XG59XG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBhY3RpdmUgc3RhdGUgKHVzZWQgYnkgZ2V0U3RhdGUpXG4gKiBAcGFyYW0ge1t0eXBlXX0ga2V5IFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkc2V0QWN0aXZlU3RhdGUoa2V5KSB7XG4gICAgdGhpcy5fYWN0aXZlU3RhdGUgPSBrZXk7XG59XG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRyYW5zZmVyIHN0YXRlIGZvciBjb21wb25lbnQgd2l0aG91dCBkZWZhdWx0IGtleS4gQ2FuIGJlIG9idGFpbmVkIGZyb20gYW5vdGhlciBjb21wb25lbnQgYnkgdXNpbmcgYENvbXBvbmVudC5nZXRTdGF0ZWBcbiAqIFdoZW4gdGhlIGFjdGl2ZSBzdGF0ZSBpcyBzZXQgdG8gdGhlIGV4cGVjdGVkIGtleVxuICogQHBhcmFtIHtbdHlwZV19IGtleSAgIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSB7W3R5cGVdfSBzdGF0ZSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzRGVmYXVsdEtleSAoT3B0aW9uYWwpXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldFN0YXRlV2l0aEtleShrZXksIHN0YXRlLCBpc0RlZmF1bHRLZXkpIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2ZlciRzZXRTdGF0ZVdpdGhLZXk6IG5vIGtleScpO1xuXG4gICAgaWYgKGlzRGVmYXVsdEtleSlcbiAgICAgICAgdGhpcy5fZGVmYXVsdEtleSA9IGtleTtcbiAgICBlbHNlXG4gICAgICAgIHRoaXMuX2RlZmF1bHRLZXkgPSB0aGlzLl9kZWZhdWx0S2V5IHx8IGtleTtcblxuICAgIHRoaXMuX3N0YXRlW2tleV0gPSBzdGF0ZTtcbiAgICB0aGlzLnNldEFjdGl2ZVN0YXRlKGtleSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0U3RhdGVXaXRoS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmIHRoaXMuX3N0YXRlW2tleV07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0Q29tcG9uZW50TWV0YSgpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcE5hbWU6IHN0YXRlICYmIHN0YXRlLmNvbXBOYW1lLFxuICAgICAgICBjb21wQ2xhc3M6IHN0YXRlICYmIHN0YXRlLmNvbXBDbGFzc1xuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDbGFzc1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vYWJzdHJhY3QvcmVnaXN0cnknKVxuICAgICwgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0Jyk7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHNgXG4gKiBDb21wb25lbnQgZmFjZXRzIHJlZ2lzdHJ5LiBBbiBpbnN0YW5jZSBvZiBbQ2xhc3NSZWdpc3RyeV0oLi4vLi4vYWJzdHJhY3QvcmVnaXN0cnkuanMuaHRtbCkgY2xhc3MgdGhhdCBpcyB1c2VkIGJ5IG1pbG8gdG8gcmVnaXN0ZXIgYW5kIGZpbmQgZmFjZXRzLlxuICovXG4gdmFyIGZhY2V0c1JlZ2lzdHJ5ID0gbmV3IENsYXNzUmVnaXN0cnkoQ29tcG9uZW50RmFjZXQpO1xuXG5cbi8vIEFkZHMgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBmYWNldHMgb2YgY29tcG9uZW50cyB0byB0aGUgcmVnaXN0cnkuXG5mYWNldHNSZWdpc3RyeS5hZGQoQ29tcG9uZW50RmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY2V0c1JlZ2lzdHJ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudEluZm87XG5cblxuLyoqXG4gKiBTaW1wbGUgY2xhc3MgdG8gaG9sZCBpbmZvcm1hdGlvbiBhbGxvd2luZyB0byBjcmVhdGUvY29weSBjb21wb25lbnQgdXNpbmcgW2BDb21wb25lbnQuY3JlYXRlYF0oLi9jX2NsYXNzLmpzLmh0bWwjY3JlYXRlKSBhbmQgW2BDb21wb25lbnQuY29weWBdKC4vY19jbGFzcy5qcy5odG1sI2NvcHkpLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgb2JqZWN0IHRoZSBjb21wb25lbnQgYmVsb2dzIHRvLCB1c3VhbGx5IGVpdGhlciB0b3AgbGV2ZWwgc2NvcGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IFttaWxvLmJpbmRlcl0oLi4vYmluZGVyLmpzLmh0bWwpIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgW0NvbnRhaW5lcl0oLi9jX2ZhY2V0cy9Db250YWluZXIuanMuaHRtbCkgZmFjZXQgb2YgY29udGFpbmluZyBjb21wb25lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgdGhlIGNvbXBvbmVudCBpcyBhdHRhY2hlZCB0b1xuICogQHBhcmFtIHtCaW5kQXR0cmlidXRlfSBhdHRyIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgdGhhdCB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHdpdGhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50SW5mb31cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyhzY29wZSwgZWwsIGF0dHIsIHRocm93T25FcnJvcnMpIHtcbiAgICBhdHRyLnBhcnNlKCkudmFsaWRhdGUoKTtcblxuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICB0aGlzLm5hbWUgPSBhdHRyLmNvbXBOYW1lO1xuICAgIHRoaXMuQ29tcG9uZW50Q2xhc3MgPSBnZXRDb21wb25lbnRDbGFzcyhhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB0aGlzLmV4dHJhRmFjZXRzQ2xhc3NlcyA9IGdldENvbXBvbmVudEV4dHJhRmFjZXRzKHRoaXMuQ29tcG9uZW50Q2xhc3MsIGF0dHIsIHRocm93T25FcnJvcnMpO1xuXG4gICAgaWYgKHRoaXMuQ29tcG9uZW50Q2xhc3NcbiAgICAgICAgICAgICYmIGhhc0NvbnRhaW5lckZhY2V0KHRoaXMuQ29tcG9uZW50Q2xhc3MsIHRoaXMuZXh0cmFGYWNldHNDbGFzc2VzKSkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHt9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNDb21wb25lbnRJbmZvIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKiBcbiAqIC0gW2Rlc3Ryb3ldKCNDb21wb25lbnRJbmZvJGRlc3Ryb3kpXG4gKiAtIFtyZW5hbWVdKCNDb21wb25lbnRJbmZvJHJlbmFtZSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21wb25lbnRJbmZvLCB7XG4gICAgZGVzdHJveTogQ29tcG9uZW50SW5mbyRkZXN0cm95LFxuICAgIHJlbmFtZTogQ29tcG9uZW50SW5mbyRyZW5hbWVcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RcbiAqIERlc3Ryb3lzIENvbXBvbmVudEluZm8gYnkgcmVtb3ZpbmcgdGhlIHJlZmVyZW5jZXMgdG8gRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyRkZXN0cm95KCkge1xuICAgIGRlbGV0ZSB0aGlzLmVsO1xuICAgIHRoaXMuYXR0ci5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnRJbmZvIGluc3RhbmNlIG1ldGhvZFxuICogUmVuYW1lcyBDb21wb25lbnRJbmZvIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7W1N0cmluZ119IG5hbWUgb3B0aW9uYWwgbmV3IGNvbXBvbmVudCBuYW1lLCBnZW5lcmF0ZWQgZnJvbSB0aW1lc3RhbXAgYnkgZGVmYXVsdFxuICogQHBhcmFtIHtbQm9vbGVhbl19IHJlbmFtZUluU2NvcGUgb3B0aW9uYWwgZmFsc2UgdG8gbm90IHJlbmFtZSBDb21wb25lbnRJbmZvIG9iamVjdCBpbiBpdHMgc2NvcGUsIHRydWUgYnkgZGVmYXVsdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnRJbmZvJHJlbmFtZShuYW1lLCByZW5hbWVJblNjb3BlKSB7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29tcG9uZW50TmFtZSgpO1xuICAgIFNjb3BlLnJlbmFtZSh0aGlzLCBuYW1lLCByZW5hbWVJblNjb3BlKTtcbiAgICB0aGlzLmF0dHIuY29tcE5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYXR0ci5kZWNvcmF0ZSgpO1xufVxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudENsYXNzKGF0dHIsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRzUmVnaXN0cnkuZ2V0KGF0dHIuY29tcENsYXNzKTtcbiAgICBpZiAoISBDb21wb25lbnRDbGFzcylcbiAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NsYXNzICcgKyBhdHRyLmNvbXBDbGFzcyArICcgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50RXh0cmFGYWNldHMoQ29tcG9uZW50Q2xhc3MsIGF0dHIsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgZmFjZXRzID0gYXR0ci5jb21wRmFjZXRzXG4gICAgICAgICwgZXh0cmFGYWNldHNDbGFzc2VzID0ge307XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmYWNldHMpKVxuICAgICAgICBmYWNldHMuZm9yRWFjaChmdW5jdGlvbihmY3ROYW1lKSB7XG4gICAgICAgICAgICBmY3ROYW1lID0gXy5maXJzdFVwcGVyQ2FzZShmY3ROYW1lKTtcbiAgICAgICAgICAgIGlmIChDb21wb25lbnRDbGFzcy5oYXNGYWNldChmY3ROYW1lKSlcbiAgICAgICAgICAgICAgICByZXBvcnRCaW5kZXJFcnJvcih0aHJvd09uRXJyb3JzLCAnY2xhc3MgJyArIENvbXBvbmVudENsYXNzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGFscmVhZHkgaGFzIGZhY2V0ICcgKyBmY3ROYW1lKTtcbiAgICAgICAgICAgIGlmIChleHRyYUZhY2V0c0NsYXNzZXNbZmN0TmFtZV0pXG4gICAgICAgICAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NvbXBvbmVudCAnICsgYXR0ci5jb21wTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYWxyZWFkeSBoYXMgZmFjZXQgJyArIGZjdE5hbWUpO1xuICAgICAgICAgICAgdmFyIEZhY2V0Q2xhc3MgPSBmYWNldHNSZWdpc3RyeS5nZXQoZmN0TmFtZSk7XG4gICAgICAgICAgICBleHRyYUZhY2V0c0NsYXNzZXNbZmN0TmFtZV0gPSBGYWNldENsYXNzO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBleHRyYUZhY2V0c0NsYXNzZXM7XG59XG5cblxuZnVuY3Rpb24gcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgbWVzc2FnZSkge1xuICAgIGlmICh0aHJvd09uRXJyb3JzID09PSBmYWxzZSlcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdDb21wb25lbnRJbmZvIGJpbmRlciBlcnJvcjonLCBtZXNzYWdlKTtcbiAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn07XG5cblxuZnVuY3Rpb24gaGFzQ29udGFpbmVyRmFjZXQoQ29tcG9uZW50Q2xhc3MsIGV4dHJhRmFjZXRzQ2xhc3Nlcykge1xuICAgIHJldHVybiAoQ29tcG9uZW50Q2xhc3MuaGFzRmFjZXQoJ2NvbnRhaW5lcicpXG4gICAgICAgIHx8ICdDb250YWluZXInIGluIGV4dHJhRmFjZXRzQ2xhc3Nlc1xuICAgICAgICB8fCBfLnNvbWVLZXkoZXh0cmFGYWNldHNDbGFzc2VzLCBmYWNldFJlcXVpcmVzQ29udGFpbmVyKVxuICAgICAgICB8fCBjbGFzc0hhc0ZhY2V0VGhhdFJlcXVpcmVzQ29udGFpbmVyKCkpO1xuXG4gICAgZnVuY3Rpb24gY2xhc3NIYXNGYWNldFRoYXRSZXF1aXJlc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIChDb21wb25lbnRDbGFzcy5wcm90b3R5cGUuZmFjZXRzQ2xhc3Nlc1xuICAgICAgICAgICAgJiYgXy5zb21lS2V5KENvbXBvbmVudENsYXNzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzLCBmYWNldFJlcXVpcmVzQ29udGFpbmVyKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmYWNldFJlcXVpcmVzQ29udGFpbmVyKEZhY2V0Q2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIEZhY2V0Q2xhc3MucmVxdWlyZXNGYWNldCgnY29udGFpbmVyJyk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4vY19jbGFzcycpO1xuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmNvbXBvbmVudHNgXG4gKiBBbiBpbnN0YW5jZSBvZiBbQ2xhc3NSZWdpc3RyeV0oLi4vYWJzdHJhY3QvcmVnaXN0cnkuanMuaHRtbCkgY2xhc3MgdGhhdCBpcyB1c2VkIGJ5IG1pbG8gdG8gcmVnaXN0ZXIgYW5kIGZpbmQgY29tcG9uZW50cy5cbiAqL1xudmFyIGNvbXBvbmVudHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbXBvbmVudCk7XG5cbi8vIGFkZCBjb21tb24gYW5jZXN0b3IgdG8gYWxsIGNvbXBvbmVudHMgdG8gdGhlIHJlZ2lzdHJ5LlxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChDb21wb25lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHNSZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgY29tcG9uZW50VXRpbHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc0NvbXBvbmVudDogaXNDb21wb25lbnQsXG4gICAgZ2V0Q29tcG9uZW50OiBnZXRDb21wb25lbnQsXG4gICAgZ2V0Q29udGFpbmluZ0NvbXBvbmVudDogZ2V0Q29udGFpbmluZ0NvbXBvbmVudCxcbiAgICBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmM6IF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuY1xufTtcblxuXG4vKipcbiAqIGlzQ29tcG9uZW50XG4gKlxuICogQ2hlY2tzIGlmIGVsZW1lbnQgaGFzIGEgY29tcG9uZW50IGF0dGFjaGVkIHRvIGl0IGJ5XG4gKiBjaGVja2luZyB0aGUgcHJlc2VuY2Ugb2YgcHJvcGVydHkgZGlmaW5lZCBpbiBtaWxvLmNvbmZpZ1xuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUsIGlmIGl0IGhhcyBtaWxvIGNvbXBvbmVudCBhdHRhY2hlZCB0byBpdFxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudChlbCkge1xuICAgIHJldHVybiBlbC5oYXNPd25Qcm9wZXJ0eShjb25maWcuY29tcG9uZW50UmVmKTtcbn1cblxuXG4vKipcbiAqIGdldENvbXBvbmVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gY29tcG9uZW50IGF0dGFjaGVkIHRvIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50KGVsKSB7XG4gICAgcmV0dXJuIGVsICYmIGVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2xvc2VzdCBjb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LFxuICogb3B0aW9uYWxseSwgb25seSBjb21wb25lbnQgdGhhdCBwYXNzZXMgYGNvbmRpdGlvbmAgdGVzdCBvciBjb250YWlucyBzcGVjaWZpZWQgZmFjZXRcbiAqXG4gKiBVbmxlc3MgYHJldHVybkN1cnJlbnRgIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBjb21wb25lbnQgb2YgdGhlIGVsZW1lbnQgKHRydWUgYnkgZGVmYXVsdCkuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlIERPTSBFbGVtZW50IG9yIHRleHQgTm9kZVxuICogQHBhcmFtIHtCb29sZWFufSByZXR1cm5DdXJyZW50IG9wdGlvbmFsIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb21wb25lbnQgb2YgdGhlIGVsZW1lbnQgY2FuIGJlIHJldHVybmVkLiBUcnVlIGJ5IGRlZmF1bHQsIHNob3VsZCBiZSBmYWxzZSB0byByZXR1cm4gb25seSBhbmNlc3RvcnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gY29uZGl0aW9uT3JGYWNldCBvcHRpb25hbCBjb25kaXRpb24gdGhhdCBjb21wb25lbnQgc2hvdWxkIHBhc3MgKG9yIGZhY2V0IG5hbWUgaXQgc2hvdWxkIGNvbnRhaW4pXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFxuICovXG5mdW5jdGlvbiBnZXRDb250YWluaW5nQ29tcG9uZW50KG5vZGUsIHJldHVybkN1cnJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICAvLyBjaGVjayhub2RlLCBOb2RlKTsgLSBjYW4ndCBjaGVjayB0aXlwZSBoZXJlIGFzIGl0IGlzIG1vc3QgbGlrZWx5IGNvbWluZyBmcm9tIGFub3RoZXIgZnJhbWVcbiAgICBjaGVjayhyZXR1cm5DdXJyZW50LCBNYXRjaC5PcHRpb25hbChCb29sZWFuKSk7XG4gICAgY2hlY2soY29uZGl0aW9uT3JGYWNldCwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIFN0cmluZykpKTtcblxuICAgIHZhciBjb25kaXRpb25GdW5jID0gX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jKGNvbmRpdGlvbk9yRmFjZXQpO1xuXG4gICAgcmV0dXJuIF9nZXRDb250YWluaW5nQ29tcG9uZW50KG5vZGUsIHJldHVybkN1cnJlbnQsIGNvbmRpdGlvbkZ1bmMpO1xufVxuXG5cbmZ1bmN0aW9uIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyhjb25kaXRpb25PckZhY2V0KSB7XG4gICAgaWYgKHR5cGVvZiBjb25kaXRpb25PckZhY2V0ID09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBjb25kaXRpb25PckZhY2V0O1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjb25kaXRpb25PckZhY2V0ID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBmYWNldE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGNvbmRpdGlvbk9yRmFjZXQpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgICAgcmV0dXJuIGNvbXAuaGFzRmFjZXQoZmFjZXROYW1lKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2dldENvbnRhaW5pbmdDb21wb25lbnQoZWwsIHJldHVybkN1cnJlbnQsIGNvbmRpdGlvbkZ1bmMpIHtcbiAgICAvLyBXaGVyZSB0aGUgY3VycmVudCBlbGVtZW50IGlzIGEgY29tcG9uZW50IGl0IHNob3VsZCBiZSByZXR1cm5lZFxuICAgIC8vIGlmIHJldHVybkN1cnJlbnQgaXMgdHJ1ZSBvciB1bmRlZmluZWRcbiAgICBpZiAocmV0dXJuQ3VycmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdmFyIGNvbXAgPSBnZXRDb21wb25lbnQoZWwpO1xuICAgICAgICBpZiAoY29tcCAmJiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMoY29tcCkpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG4gICAgfVxuXG4gICAgLy8gV2hlcmUgdGhlcmUgaXMgbm8gcGFyZW50IGVsZW1lbnQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdW5kZWZpbmVkXG4gICAgLy8gVGhlIHBhcmVudCBlbGVtZW50IGlzIGNoZWNrZWQgcmVjdXJzaXZlbHlcbiAgICBpZiAoZWwucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuIF9nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLnBhcmVudE5vZGUsIHRydWUsIGNvbmRpdGlvbkZ1bmMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIFZpZXcgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ1ZpZXcnLCBbJ2NvbnRhaW5lciddKTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChWaWV3KTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWV3O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4vZGVfZGF0YScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXJBUEkgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NlbmdlckFQSVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxuLy8gY2xhc3MgdG8gaGFuZGxlIHN1YnNjcmlidGlvbnMgdG8gY2hhbmdlcyBpbiBET00gZm9yIFVJIChtYXliZSBhbHNvIGNvbnRlbnQgZWRpdGFibGUpIGVsZW1lbnRzXG5cbi8qKlxuICogQSBjbGFzc1xuICovXG52YXIgRGF0YU1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnRGF0YU1zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRGF0YU1zZ0FQSSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IERhdGFNc2dBUEkkaW5pdCxcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxuICAgIGNyZWF0ZUludGVybmFsRGF0YTogY3JlYXRlSW50ZXJuYWxEYXRhLFxuXG4gICAgLy8gY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIHZhbHVlOiBEYXRhTXNnQVBJJHZhbHVlXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhTXNnQVBJO1xuXG5cbmZ1bmN0aW9uIERhdGFNc2dBUEkkaW5pdChjb21wb25lbnQpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3MoY29tcG9uZW50LmVsKTtcbn1cblxuXG4vLyBnZXREb21FbGVtZW50RGF0YVZhbHVlXG5mdW5jdGlvbiBEYXRhTXNnQVBJJHZhbHVlKCkgeyAvLyB2YWx1ZSBtZXRob2RcbiAgICB2YXIgY29tcG9uZW50R2V0dGVyID0gdGhpcy5jb21wb25lbnQuZGF0YS5jb25maWcuZ2V0O1xuICAgIHZhciBuZXdWYWx1ZSA9IHR5cGVvZiBjb21wb25lbnRHZXR0ZXIgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IGNvbXBvbmVudEdldHRlci5jYWxsKHRoaXMuY29tcG9uZW50KVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZWxEYXRhLmdldCh0aGlzLmNvbXBvbmVudC5lbCk7XG5cbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhLl92YWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xufVxuXG5cbi8vIFRPRE86IHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiByZWxldmFudCBET00gZXZlbnQgZGVwZW5kZW50IG9uIGVsZW1lbnQgdGFnXG4vLyBDYW4gYWxzbyBpbXBsZW1lbnQgYmVmb3JlZGF0YWNoYW5nZWQgZXZlbnQgdG8gYWxsb3cgcHJldmVudGluZyB0aGUgY2hhbmdlXG4vLyB0cmFuc2xhdGVUb0RvbUV2ZW50XG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBjb21wb25lbnRFdmVudCA9IHRoaXMuY29tcG9uZW50LmRhdGEuY29uZmlnLmV2ZW50O1xuICAgIHZhciBldmVudCA9IGNvbXBvbmVudEV2ZW50IHx8IHRoaXMuZWxEYXRhLmV2ZW50KHRoaXMuY29tcG9uZW50LmVsKTtcblxuICAgIGlmIChtZXNzYWdlID09ICcnICYmIGV2ZW50KVxuICAgICAgICByZXR1cm4gZXZlbnQ7ICAvLyB0aGlzLnRhZ0V2ZW50O1xufVxuXG5cbi8vIGZpbHRlckRhdGFNZXNzYWdlXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5uZXdWYWx1ZSAhPSBkYXRhLm9sZFZhbHVlO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jb21wb25lbnQuZGF0YS5fdmFsdWVcbiAgICAgICAgLCBuZXdWYWx1ZSA9IHRoaXMudmFsdWUoKTtcblxuICAgIHZhciBpbnRlcm5hbERhdGEgPSB7IFxuICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogUmV0dXJucyBkYXRhIGFjY2VzcyBtZXRob2RzIGFuZCBldmVudHMgZm9yIGdpdmVuIERPTSBlbGVtZW50LlxuICogVXNlZCBieSBbRGF0YV0oLi4vY19mYWNldHMvRGF0YS5qcy5odG1sKSBmYWNldCBhbmQgYnkgW0RhdGFNc2dBUEldKC4vZGF0YS5qcy5odG1sKVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIGdldEVsZW1lbnREYXRhQWNjZXNzID0gZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgdGFnTmFtZSA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAsIGVsRGF0YSA9IGRvbUVsZW1lbnRzRGF0YUFjY2Vzc1t0YWdOYW1lXTtcbiAgICByZXR1cm4gZWxEYXRhIHx8IGRvbUVsZW1lbnRzRGF0YUFjY2Vzcy5ieURlZmF1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RWxlbWVudERhdGFBY2Nlc3M7XG5cblxuLyoqXG4gKiBEYXRhIGFjY2VzcyBtZXRob2RzIGFuZCBldmVudHMgZm9yIERPTSBlbGVtZW50cy5cbiAqL1xudmFyIGRvbUVsZW1lbnRzRGF0YUFjY2VzcyA9IHtcbiAgICBieURlZmF1bHQ6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgIH0sXG4gICAgJ2Rpdic6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLCAvLyBoYWNrLCBzaG91bGQgYmUgaW5uZXJIVE1MPyB0byBtYWtlIHdvcmsgd2l0aCBFZGl0YWJsZSBmYWNldFxuICAgICAgICAvLyBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3NwYW4nOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdwJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAnaW5wdXQnOiB7XG4gICAgICAgIHByb3BlcnR5OiBpbnB1dERhdGFQcm9wZXJ0eSxcbiAgICAgICAgZXZlbnQ6IGlucHV0Q2hhbmdlRXZlbnRcbiAgICB9LFxuICAgICd0ZXh0YXJlYSc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAnc2VsZWN0Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAnaW1nJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ3NyYydcbiAgICB9LFxuICAgICdjYXB0aW9uJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAndGhlYWQnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICd0Ym9keSc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3Rmb290Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfVxufTtcblxuXG4vLyBjb252ZXJ0IHN0cmluZ3MgdG8gZnVuY3Rpb25zIGFuZCBjcmVhdGUgZ2V0c2V0IG1ldGhvZHNcbl8uZWFjaEtleShkb21FbGVtZW50c0RhdGFBY2Nlc3MsIGZ1bmN0aW9uKHRhZ0luZm8pIHtcbiAgICB2YXIgcHJvcGVydHkgPSB0YWdJbmZvLnByb3BlcnR5XG4gICAgICAgICwgZXZlbnQgPSB0YWdJbmZvLmV2ZW50O1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGFnSW5mby5wcm9wZXJ0eSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcHJvcGVydHk7IH07XG4gICAgdmFyIHByb3BGdW5jID0gdGFnSW5mby5wcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRhZ0luZm8uZXZlbnQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGV2ZW50OyB9O1xuICAgIGlmICghIHRhZ0luZm8uZ2V0KVxuICAgICAgICB0YWdJbmZvLmdldCA9IGZ1bmN0aW9uKGVsKSB7IHJldHVybiBlbFtwcm9wRnVuYyhlbCldOyB9XG4gICAgaWYgKCEgdGFnSW5mby5zZXQpXG4gICAgICAgIHRhZ0luZm8uc2V0ID0gZnVuY3Rpb24oZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gKGVsW3Byb3BGdW5jKGVsKV0gPSB0eXBlb2YgdmFsdWUgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHZhbHVlKTtcbiAgICAgICAgfVxufSk7XG5cblxuLyoqXG4gKiBUeXBlcyBvZiBpbnB1dCBlbGVtZW50c1xuICovXG52YXIgaW5wdXRFbGVtZW50VHlwZXMgPSB7XG4gICAgYnlEZWZhdWx0OiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ2NoZWNrYm94Jzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2NoZWNrZWQnLFxuICAgICAgICBldmVudDogJ2NoYW5nZSdcbiAgICB9LFxuICAgICdyYWRpbyc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjaGVja2VkJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAndGV4dCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJuIHByb3BlcnR5IG9mIGlucHV0IGVsZW1lbnQgdG8gZ2V0L3NldCBpdHMgZGF0YVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaW5wdXREYXRhUHJvcGVydHkoZWwpIHtcbiAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXRFbGVtZW50VHlwZXNbZWwudHlwZV07XG4gICAgcmV0dXJuIGlucHV0VHlwZVxuICAgICAgICAgICAgPyBpbnB1dFR5cGUucHJvcGVydHlcbiAgICAgICAgICAgIDogaW5wdXRFbGVtZW50VHlwZXMuYnlEZWZhdWx0LnByb3BlcnR5O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBET00gZXZlbnQgdHlwZSB0byBsaXN0ZW4gdG8gdG8gcmVhY3QgdG8gaW5wdXQgZWxlbWVudCBjaGFuZ2VcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGlucHV0Q2hhbmdlRXZlbnQoZWwpIHtcbiAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXRFbGVtZW50VHlwZXNbZWwudHlwZV07XG4gICAgcmV0dXJuIGlucHV0VHlwZVxuICAgICAgICAgICAgPyBpbnB1dFR5cGUuZXZlbnRcbiAgICAgICAgICAgIDogaW5wdXRFbGVtZW50VHlwZXMuYnlEZWZhdWx0LmV2ZW50O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBNZXNzZW5nZXJBUEkgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzLk1lc3NlbmdlckFQSTtcblxuXG52YXIgRHJvcE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnRHJvcE1zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRHJvcE1zZ0FQSSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERyb3BNc2dBUEk7XG5cblxudmFyIGRyb3BFdmVudHNNYXAgPSB7XG4gICAgJ2RyYWdpbic6ICdkcmFnZW50ZXInLFxuICAgICdkcmFnb3V0JzogJ2RyYWdsZWF2ZSdcbn07XG5cblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gZHJvcEV2ZW50c01hcC5oYXNPd25Qcm9wZXJ0eShtZXNzYWdlKVxuICAgICAgICAgICAgPyBkcm9wRXZlbnRzTWFwW21lc3NhZ2VdXG4gICAgICAgICAgICA6IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHJlc2V0RmlsdGVyVmFycygpIHtcbiAgICBkZWxldGUgdGhpcy5fY3VycmVudFRhcmdldDtcbiAgICBkZWxldGUgdGhpcy5faW5zaWRlO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGRhdGEpIHsgLy8gZGF0YSBpcyBET00gZXZlbnQgb2JqZWN0XG4gICAgdmFyIG9rID0gdHJ1ZTtcblxuICAgIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcmFnZW50ZXInICYmIG1lc3NhZ2UgPT0gJ2RyYWdpbicpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhcmdldCA9IGRhdGEudGFyZ2V0O1xuICAgICAgICBvayA9ICF0aGlzLl9pbnNpZGU7XG4gICAgICAgIHRoaXMuX2luc2lkZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcmFnbGVhdmUnICYmIG1lc3NhZ2UgPT0gJ2RyYWdvdXQnKSB7XG4gICAgICAgIG9rID0gdGhpcy5fY3VycmVudFRhcmdldCA9PSBkYXRhLnRhcmdldDtcbiAgICAgICAgaWYgKG9rKSByZXNldEZpbHRlclZhcnMuY2FsbCh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ2Ryb3AnKSByZXNldEZpbHRlclZhcnMuY2FsbCh0aGlzKTtcblxuICAgIHJldHVybiBvaztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRE9NRW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL2RvbV9zb3VyY2UnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxudmFyIERPTUV2ZW50c1NvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoRE9NRW1pdHRlclNvdXJjZSwgJ0RPTUV2ZW50c1NvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NRXZlbnRzU291cmNlLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBkZXN0cm95OiBET01FdmVudHNTb3VyY2UkZGVzdHJveSxcbiAgICBlbWl0dGVyOiBlbWl0dGVyXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01FdmVudHNTb3VyY2U7XG5cblxudmFyIHVzZUNhcHR1cmVQYXR0ZXJuID0gL19fY2FwdHVyZSQvXG4gICAgLCB1c2VDYXB0dXJlUG9zdGZpeCA9ICdfX2NhcHR1cmUnO1xuXG5cbi8vIGluaXQgRE9NIGV2ZW50IHNvdXJjZVxuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSU9yQ2xhc3MsIGNvbXBvbmVudCkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gRE9NRXZlbnRzU291cmNlJGRlc3Ryb3koKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudDtcbn1cblxuXG4vLyBnZXQgRE9NIGVsZW1lbnQgb2YgY29tcG9uZW50XG5mdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5lbDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gIyMjY29tcG9uZW50IGlmcmFtZSBzb3VyY2VcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG52YXIgRnJhbWVNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnRnJhbWVNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhGcmFtZU1lc3NhZ2VTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuXG4gICAgLy9jbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgZnJhbWVXaW5kb3c6IGZyYW1lV2luZG93LFxuICAgIGhhbmRsZUV2ZW50OiBoYW5kbGVFdmVudCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWVNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBjb21wb25lbnQpIHtcbiAgICBjaGVjayhjb21wb25lbnQsIENvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG5cbiAgICBpZiAoY29tcG9uZW50LmVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAnaWZyYW1lJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnQgZm9yIEZyYW1lTWVzc2FnZVNvdXJjZSBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBpZnJhbWUgZWxlbWVudCcpO1xuXG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIGZyYW1lV2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5lbC5jb250ZW50V2luZG93O1xufVxuXG5cbi8vIGFkZElGcmFtZU1lc3NhZ2VMaXN0ZW5lclxuZnVuY3Rpb24gYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdmFyIHdpbiA9IHRoaXMuZnJhbWVXaW5kb3coKTtcbiAgICBpZiAod2luKSB3aW4uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMsIGZhbHNlKTtcbiAgICBlbHNlIGxvZ2dlci53YXJuKCdGcmFtZU1lc3NhZ2VTb3VyY2U6IGZyYW1lIHdpbmRvdyBpcyB1bmRlZmluZWQnKTtcbn1cblxuXG4vLyByZW1vdmVJRnJhbWVNZXNzYWdlTGlzdGVuZXJcbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHZhciB3aW4gPSB0aGlzLmZyYW1lV2luZG93KCk7XG4gICAgaWYgKHdpbikgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybignRnJhbWVNZXNzYWdlU291cmNlOiBmcmFtZSB3aW5kb3cgaXMgdW5kZWZpbmVkJyk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gbXNnVHlwZTtcblxuICAgIHRoaXMuZnJhbWVXaW5kb3coKS5wb3N0TWVzc2FnZShkYXRhLCAnKicpO1xufVxuXG5cbi8vIFRPRE8gbWF5YmUgcmVmYWN0b3IgdG8gRnJhbWVNc2dBUEk/XG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LmRhdGEudHlwZSwgZXZlbnQpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogU2NvcGUgY2xhc3MuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoaXMgc2NvcGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IHRoZSBob3N0IFxuICogQHJldHVybiB7U2NvcGV9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlKHJvb3RFbCwgaG9zdE9iamVjdCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9yb290RWw6IHJvb3RFbCxcbiAgICAgICAgX2hvc3RPYmplY3Q6IGhvc3RPYmplY3RcbiAgICB9LCBfLldSSVQpOyAvLyB3cml0YWJsZVxufTtcblxuXy5leHRlbmRQcm90byhTY29wZSwge1xuICAgIF9hZGQ6IFNjb3BlJF9hZGQsXG4gICAgX3NhZmVBZGQ6IFNjb3BlJF9zYWZlQWRkLFxuICAgIF9jb3B5OiBTY29wZSRfY29weSxcbiAgICBfZWFjaDogU2NvcGUkX2VhY2gsXG4gICAgX21vdmU6IFNjb3BlJF9tb3ZlLFxuICAgIF9tZXJnZTogU2NvcGUkX21lcmdlLFxuICAgIF9sZW5ndGg6IFNjb3BlJF9sZW5ndGgsXG4gICAgX2FueTogU2NvcGUkX2FueSxcbiAgICBfcmVtb3ZlOiBTY29wZSRfcmVtb3ZlLFxuICAgIF9jbGVhbjogU2NvcGUkX2NsZWFuLFxuICAgIF9kZXRhY2hFbGVtZW50OiBTY29wZSRfZGV0YWNoRWxlbWVudCxcbiAgICBfaGFzOiBTY29wZSRfaGFzLFxuICAgIF9maWx0ZXI6IFNjb3BlJF9maWx0ZXJcbn0pO1xuXG5cbl8uZXh0ZW5kKFNjb3BlLCB7XG4gICAgcmVuYW1lOiBTY29wZSQkcmVuYW1lXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjb3BlO1xuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG5cblxuLyoqXG4gKiBTY29wZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBBZGRzIG9iamVjdCB0byB0aGUgc2NvcGUsIHRocm93aW5nIGlmIG5hbWUgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtDb21wb25lbnR8Q29tcG9uZW50SW5mb30gb2JqZWN0IGNvbXBvbmVudCBvciBjb21wb25lbnQgaW5mbyB0byBhZGQgdG8gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGFkZFxuICovXG5mdW5jdGlvbiBTY29wZSRfYWRkKG9iamVjdCwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJylcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIGVsc2VcbiAgICAgICAgbmFtZSA9IG9iamVjdC5uYW1lO1xuICAgIFxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KG5hbWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cGxpY2F0ZSBvYmplY3QgbmFtZTogJyArIG5hbWUpO1xuXG4gICAgY2hlY2tOYW1lKG5hbWUpO1xuICAgIF9fYWRkLmNhbGwodGhpcywgb2JqZWN0LCBuYW1lKTtcbn1cblxuXG4vKipcbiAqIFNjb3BlIGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBvYmplY3QgdG8gc2NvcGUgcmVuYW1pbmcgaXQgaWYgbmFtZSBpcyBub3QgdW5pcXVlXG4gKiBAcGFyYW0ge0NvbXBvbmVudHxDb21wb25lbnRJbmZvfSBvYmplY3QgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbmZvIHRvIGFkZCB0byB0aGUgc2NvcGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYWRkXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9zYWZlQWRkKG9iamVjdCwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJylcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIGVsc2VcbiAgICAgICAgbmFtZSA9IG9iamVjdC5uYW1lO1xuXG4gICAgdmFyIHNob3VsZFJlbmFtZSA9IHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgaWYgKHNob3VsZFJlbmFtZSlcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdTY29wZTogZHVwbGljYXRlIG9iamVjdCBuYW1lOiAnICsgbmFtZSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHNob3VsZFJlbmFtZSA9ICEgYWxsb3dlZE5hbWVQYXR0ZXJuLnRlc3QobmFtZSk7XG4gICAgICAgIGlmIChzaG91bGRSZW5hbWUpXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Njb3BlOiBuYW1lIHNob3VsZCBzdGFydCBmcm9tIGxldHRlciwgdGhpcyBuYW1lIGlzIG5vdCBhbGxvd2VkOiAnICsgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlbmFtZSkge1xuICAgICAgICBuYW1lID0gY29tcG9uZW50TmFtZSgpO1xuICAgICAgICBvYmplY3QubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgX19hZGQuY2FsbCh0aGlzLCBvYmplY3QsIG5hbWUpO1xufVxuXG5cbmZ1bmN0aW9uIF9fYWRkKG9iamVjdCwgbmFtZSkge1xuICAgIHRoaXNbbmFtZV0gPSBvYmplY3Q7XG4gICAgb2JqZWN0LnNjb3BlID0gdGhpcztcblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0LnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBvYmplY3QucG9zdE1lc3NhZ2UoJ2FkZGVkdG9zY29wZScpOyBcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIGNvcGllcyBhbGwgb2JqZWN0cyBmcm9tIG9uZSBzY29wZSB0byBhbm90aGVyLFxuICogdGhyb3dpbmcgaWYgc29tZSBvYmplY3QgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtTY29wZX0gYVNjb3BlIHRoZSBzY29wZSB0byBjb3B5XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9jb3B5KGFTY29wZSkge1xuICAgIGNoZWNrKGFTY29wZSwgU2NvcGUpO1xuXG4gICAgYVNjb3BlLl9lYWNoKFNjb3BlJF9hZGQsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogTW92ZXMgYSBjb21wb25lbnQgZnJvbSB0aGlzIHNjb3BlIHRvIGFub3RoZXIgc2NvcGUuXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgdG8gYmUgbW92ZWRcbiAqIEBwYXJhbSB7U2NvcGV9IG90aGVyU2NvcGUgdGhlIHNjb3BlIHRvIGNvcHkgdGhlIGNvbXBvbmVudCB0b1xuICovXG5mdW5jdGlvbiBTY29wZSRfbW92ZShjb21wb25lbnQsIG90aGVyU2NvcGUpIHtcbiAgICBvdGhlclNjb3BlLl9hZGQoY29tcG9uZW50KTtcbiAgICB0aGlzLl9yZW1vdmUoY29tcG9uZW50Lm5hbWUpO1xuICAgIGNvbXBvbmVudC5zY29wZSA9IG90aGVyU2NvcGU7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBNZXJnZXMgb25lIHNjb3BlIGludG8gdGhpcyBzY29wZVxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgdGhlIHNjb3BlIHRvIGFic29yYlxuICovXG5mdW5jdGlvbiBTY29wZSRfbWVyZ2Uoc2NvcGUpIHtcbiAgICBzY29wZS5fZWFjaChmdW5jdGlvbiAoY29tcCkge1xuICAgICAgICB0aGlzLl9hZGQoY29tcCwgY29tcC5uYW1lKTtcbiAgICAgICAgc2NvcGUuX3JlbW92ZShjb21wLm5hbWUpO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogRW51bWVyYXRlcyBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2NvcGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNvbXBvbmVudFxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgdGhlIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2VhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBfLmVhY2hLZXkodGhpcywgY2FsbGJhY2ssIHRoaXNBcmcgfHwgdGhpcywgdHJ1ZSk7IC8vIGVudW1lcmF0ZXMgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHlcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIGNvbXBvbmVudHMgYmFzZWQgb24gYSBjYWxsYmFja1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyB0aGUgY29udGV4dFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9maWx0ZXIoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gXy5maWx0ZXJLZXlzKHRoaXMsIGNhbGxiYWNrLCB0aGlzQXJnIHx8IHRoaXMsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBhIG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gY2hlY2tOYW1lKG5hbWUpIHtcbiAgICBpZiAoISBhbGxvd2VkTmFtZVBhdHRlcm4udGVzdChuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYW1lIHNob3VsZCBzdGFydCBmcm9tIGxldHRlciwgdGhpcyBuYW1lIGlzIG5vdCBhbGxvd2VkOiAnICsgbmFtZSk7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2NvcGVcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2xlbmd0aCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RoO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyBhIGNvbXBvbmVudCBmcm9tIHRoZSBzY29wZS4gSXQgbWF5IGxvb2sgbGlrZSBpdCByZXR1cm5zIHRoZSBmaXJzdCBjb21wb25lbnRcbiAqIGJ1dCBpbiByZWFsaXR5IGdpdmVuIHRoYXQgc2NvcGVzIGFyZSBoYXNoZXMsIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcuXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9hbnkoKSB7XG4gICAgdmFyIGtleSA9IE9iamVjdC5rZXlzKHRoaXMpWzBdO1xuICAgIHJldHVybiBrZXkgJiYgdGhpc1trZXldO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmVtb3ZlcyBhIGNvbXBvbmVudCBmcm9tIHRoZSBzY29wZSBieSBpdCdzIG5hbWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIHJlbW92ZVxuICogQHBhcmFtIHtCb29sZWFufSBxdWlldCBvcHRpb25hbCB0cnVlIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGNvbXBvbmVudCBpcyBub3QgaW4gc2NvcGVcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX3JlbW92ZShuYW1lLCBxdWlldCkge1xuICAgIGlmICghIChuYW1lIGluIHRoaXMpKSB7XG4gICAgICAgIGlmICghcXVpZXQpIGxvZ2dlci53YXJuKCdyZW1vdmluZyBvYmplY3QgdGhhdCBpcyBub3QgaW4gc2NvcGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvYmplY3QgPSB0aGlzW25hbWVdO1xuXG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgb2JqZWN0LnBvc3RNZXNzYWdlKCdyZW1vdmVkZnJvbXNjb3BlJyk7XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGFsbCBjb21wb25lbnRzIGZyb20gdGhlIHNjb3BlLlxuICovXG5mdW5jdGlvbiBTY29wZSRfY2xlYW4oKSB7XG4gICAgdGhpcy5fZWFjaChmdW5jdGlvbihvYmplY3QsIG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV0uc2NvcGU7XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIH0sIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBTY29wZSRfZGV0YWNoRWxlbWVudCgpIHtcbiAgICB0aGlzLl9yb290RWwgPSBudWxsO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIHNjb3BlIGhhcyBvYmplY3QgYnkgb2JqZWN0IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9oYXMob2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkob2JqZWN0Lm5hbWUpO1xufVxuXG5cbi8qKlxuICogQ2hhbmdlIG9iamVjdCBuYW1lLCByZW5hbWluZyBpdCBpbiBzY29wZSB1bmxlc3MgcmVuYW1lSW5TY29wZSBpcyBmYWxzZVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmV3IG5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuYW1lSW5TY29wZSB0cnVlIGJ5IGRlZmF1bHRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkJHJlbmFtZShvYmosIG5hbWUsIHJlbmFtZUluU2NvcGUpIHtcbiAgICBpZiAob2JqLnNjb3BlICYmIHJlbmFtZUluU2NvcGUgIT09IGZhbHNlKSB7XG4gICAgICAgIG9iai5zY29wZS5fcmVtb3ZlKG9iai5uYW1lKTtcbiAgICAgICAgb2JqLnNjb3BlLl9hZGQob2JqLCBuYW1lKTtcbiAgICB9IGVsc2VcbiAgICAgICAgb2JqLm5hbWUgPSBuYW1lO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxCdXR0b24gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQnV0dG9uJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1idXR0b24nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxCdXR0b24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQnV0dG9uO1xuXG5fLmV4dGVuZFByb3RvKE1MQnV0dG9uLCB7XG4gICAgZGlzYWJsZTogTUxCdXR0b24kZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTEJ1dHRvbiRpc0Rpc2FibGVkXG59KTtcblxuXG5mdW5jdGlvbiBNTEJ1dHRvbiRkaXNhYmxlKGRpc2FibGUpIHtcbiAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZTtcbn1cblxuZnVuY3Rpb24gTUxCdXR0b24kaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBDT01CT19DSEFOR0VfTUVTU0FHRSA9ICdtbGNvbWJvY2hhbmdlJztcblxudmFyIERBVEFMSVNUX1RFTVBMQVRFID0gJ3t7fiBpdC5jb21ib09wdGlvbnMgOm9wdGlvbiB9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7ez0gb3B0aW9uLmxhYmVsIH19XCI+PC9vcHRpb24+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAge3t+fX0nO1xuXG52YXIgTUxDb21ibyA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxDb21ibycsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxDb21ib19nZXQsXG4gICAgICAgIHNldDogTUxDb21ib19zZXQsXG4gICAgICAgIGRlbDogTUxDb21ib19kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogQ09NQk9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZGF0YWxpc3QnXG4gICAgfSxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZFxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxDb21ibyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxDb21ibztcblxuXG5fLmV4dGVuZFByb3RvKE1MQ29tYm8sIHtcbiAgICBpbml0OiBNTENvbWJvJGluaXRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MQ29tYm8kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICdfY29tYm9JbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2NvbWJvTGlzdCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmRhdGFsaXN0XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb21ib0xpc3QudGVtcGxhdGUuc2V0KERBVEFMSVNUX1RFTVBMQVRFKTtcblxuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5vbignaW5wdXQnLFxuICAgICAgICB7IHN1YnNjcmliZXI6IGRpc3BhdGNoQ2hhbmdlTWVzc2FnZSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib19nZXQoKSB7XG4gICAgaWYgKCEgdGhpcy5fY29tYm9JbnB1dCkgcmV0dXJuO1xuICAgIHJldHVybiB0aGlzLl9jb21ib0lucHV0LmRhdGEuZ2V0KCk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fc2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGNoYW5nZUNvbWJvRGF0YS5jYWxsKHRoaXMsICdzZXQnLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fZGVsKCkge1xuICAgIHJldHVybiBjaGFuZ2VDb21ib0RhdGEuY2FsbCh0aGlzLCAnZGVsJywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VDb21ib0RhdGEobWV0aG9kLCB2YWx1ZSkge1xuICAgIGlmICghIHRoaXMuX2NvbWJvSW5wdXQpIHJldHVybjtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY29tYm9JbnB1dC5kYXRhW21ldGhvZF0odmFsdWUpO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gUG9zdCB0aGUgZGF0YSBjaGFuZ2VcbmZ1bmN0aW9uIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuZnVuY3Rpb24gb25PcHRpb25zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX2NvbWJvTGlzdC50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICBjb21ib09wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KClcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBDT01CT19MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sY29tYm9saXN0Y2hhbmdlJztcblxuXG52YXIgTUxDb21ib0xpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQ29tYm9MaXN0Jywge1xuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1jb21iby1saXN0J1xuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MQ29tYm9MaXN0X2dldCxcbiAgICAgICAgc2V0OiBNTENvbWJvTGlzdF9zZXQsXG4gICAgICAgIGRlbDogTUxDb21ib0xpc3RfZGVsLFxuICAgICAgICBldmVudDogQ09NQk9fTElTVF9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcqKionOiB7IHN1YnNjcmliZXI6IG9uSXRlbXNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcid9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnPGRpdiBtbC1iaW5kPVwiTUxTdXBlckNvbWJvOmNvbWJvXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3Q6bGlzdFwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdEl0ZW06aXRlbVwiIGNsYXNzPVwibGlzdC1pdGVtXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZXZlbnRzXTpkZWxldGVCdG5cIiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+J1xuICAgIH1cbn0pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxDb21ib0xpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQ29tYm9MaXN0O1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxDb21ib0xpc3QsIHtcbiAgICBpbml0OiBNTENvbWJvTGlzdCRpbml0LFxuICAgIHNldE9wdGlvbnM6IE1MQ29tYm9MaXN0JHNldE9wdGlvbnMsXG4gICAgc2V0RGF0YVZhbGlkYXRpb246IE1MQ29tYm9MaXN0JHNldERhdGFWYWxpZGF0aW9uLFxuICAgIHRvZ2dsZUFkZEJ1dHRvbjogTUxDb21ib0xpc3QkdG9nZ2xlQWRkQnV0dG9uLFxuICAgIGRlc3Ryb3k6IE1MQ29tYm9MaXN0JGRlc3Ryb3ksXG4gICAgc2V0QWRkSXRlbVByb21wdDogTUxDb21ib0xpc3Qkc2V0QWRkSXRlbVByb21wdCxcbiAgICBjbGVhckNvbWJvSW5wdXQgOiBNTENvbWJvTGlzdCRjbGVhckNvbWJvSW5wdXRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fZGF0YVZhbGlkYXRpb24gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5vbmNlKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRzZXREYXRhVmFsaWRhdGlvbihkYXRhVmFsaWRhdGlvbikge1xuICAgIGlmICh0eXBlb2YgZGF0YVZhbGlkYXRpb24gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhpcy5fZGF0YVZhbGlkYXRpb24gPSBkYXRhVmFsaWRhdGlvbjtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0T3B0aW9ucyhhcnIpIHtcbiAgICB0aGlzLl9jb21iby5zZXRPcHRpb25zKGFycik7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3QkY2xlYXJDb21ib0lucHV0ICgpIHtcbiAgICB0aGlzLl9jb21iby5jbGVhckNvbWJvSW5wdXQoKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBhZGQgYnV0dG9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3dcbiAqL1xuZnVuY3Rpb24gTUxDb21ib0xpc3QkdG9nZ2xlQWRkQnV0dG9uKHNob3cpIHtcbiAgICB0aGlzLl9jb21iby50b2dnbGVBZGRCdXR0b24oc2hvdyk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0QWRkSXRlbVByb21wdChwcm9tcHQpIHtcbiAgIHRoaXMuX2NvbWJvLnNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KTtcbn1cblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoKS5iaW5kZXIoKTtcbiAgICBjb21wb25lbnRTZXR1cC5jYWxsKHRoaXMpO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRTZXR1cCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAnX2NvbWJvJzogdGhpcy5jb250YWluZXIuc2NvcGUuY29tYm8sXG4gICAgICAgICdfbGlzdCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmxpc3RcbiAgICB9KTtcblxuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fY29tYm8uZGF0YS5vbignJywgeyBzdWJzY3JpYmVyOiBvbkNvbWJvQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIHRoaXMuX2NvbWJvLm9uKCdhZGRpdGVtJywgeyBzdWJzY3JpYmVyOiBvbkFkZEl0ZW0sIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbmZ1bmN0aW9uIG9uQ29tYm9DaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgaWYgKGRhdGEubmV3VmFsdWUgJiYgdGhpcy5fZGF0YVZhbGlkYXRpb24obXNnLCBkYXRhLCB0aGlzLl9saXN0Lm1vZGVsLmdldCgpKSlcbiAgICAgICAgdGhpcy5fbGlzdC5tb2RlbC5wdXNoKGRhdGEubmV3VmFsdWUpO1xuICAgIHRoaXMuX2NvbWJvLmRhdGEuZGVsKCk7XG4gICAgLy8gYmVjYXVzZSBvZiBzdXBlcmNvbWJvIGxpc3RlbmVycyBvZmYgeW91IGhhdmUgdG8gc2V0IF92YWx1ZSBleHBsaWNpdGx5XG4gICAgdGhpcy5fY29tYm8uZGF0YS5fdmFsdWUgPSAnJztcbn1cblxuZnVuY3Rpb24gb25JdGVtc0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0xJU1RfQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdF9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Rfc2V0KHZhbHVlKSB7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdF9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuc2V0KFtdKTtcbn1cblxuXG5mdW5jdGlvbiBvbkFkZEl0ZW0obXNnLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnYWRkaXRlbScsIGRhdGEpO1xuICAgIHRoaXMuZXZlbnRzLnBvc3RNZXNzYWdlKCdtaWxvX2NvbWJvbGlzdGFkZGl0ZW0nLCBkYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBNTERhdGUgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRGF0ZScsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxEYXRlX2dldCxcbiAgICAgICAgc2V0OiBNTERhdGVfc2V0LFxuICAgICAgICBkZWw6IE1MRGF0ZV9kZWwsXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZGF0ZSdcbiAgICB9XG59KTtcblxuXy5leHRlbmRQcm90byhNTERhdGUsIHtcbiAgICBnZXRNaW46IE1MRGF0ZSRnZXRNaW4sXG4gICAgc2V0TWluOiBNTERhdGUkc2V0TWluLFxuICAgIGdldE1heDogTUxEYXRlJGdldE1heCxcbiAgICBzZXRNYXg6IE1MRGF0ZSRzZXRNYXhcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRGF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEYXRlO1xuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRnZXRNaW4oKSB7XG4gICAgcmV0dXJuIF8uZGF0ZSh0aGlzLmVsLm1pbik7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJHNldE1pbih2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC5taW4gPSBkYXRlID8gdG9JU084NjAxRm9ybWF0KGRhdGUpIDogJyc7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJGdldE1heCgpIHtcbiAgICByZXR1cm4gXy5kYXRlKHRoaXMuZWwubWF4KTtcbn1cblxuXG5mdW5jdGlvbiBNTERhdGUkc2V0TWF4KHZhbHVlKSB7XG4gICAgdmFyIGRhdGUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLmVsLm1heCA9IGRhdGUgPyB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkgOiAnJztcbn1cblxuXG5mdW5jdGlvbiBNTERhdGVfZ2V0KCkge1xuICAgIHJldHVybiBfLnRvRGF0ZSh0aGlzLmVsLnZhbHVlKTtcbn1cblxuXG5mdW5jdGlvbiBNTERhdGVfc2V0KHZhbHVlKSB7XG4gICAgdmFyIGRhdGUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLmVsLnZhbHVlID0gZGF0ZSA/IHRvSVNPODYwMUZvcm1hdChkYXRlKSA6ICcnO1xuXG4gICAgZGlzcGF0Y2hJbnB1dE1lc3NhZ2UuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gTUxEYXRlX2RlbCgpIHtcbiAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG5cbiAgICBkaXNwYXRjaElucHV0TWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIGRpc3BhdGNoSW5wdXRNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoJ2lucHV0Jyk7IC8vIERpc3BhdGNoIHRoZSAnaW5wdXQnICh1c3VhbGx5IGRpc3BhdGNoZWQgYnkgdGhlIHVuZGVybHlpbmcgPGlucHV0PiBlbGVtZW50KSBldmVudCBzbyB0aGF0IHRoZSBkYXRhIGNoYW5nZSBjYW4gYmUgbGlzdGVuZWQgdG9cbn1cblxuXG5mdW5jdGlvbiB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkge1xuICAgIHZhciBkYXRlQXJyID0gW1xuICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSxcbiAgICAgICAgcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIF07XG5cbiAgICB2YXIgZGF0ZVN0ciA9IGRhdGVBcnIuam9pbignLScpO1xuXG4gICAgcmV0dXJuIGRhdGVTdHI7XG5cbiAgICBmdW5jdGlvbiBwYWQobikgeyByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6IG47IH1cbn0iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTERyb3BUYXJnZXQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRHJvcFRhcmdldCcsIFsnZHJvcCddKTtcblxuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRHJvcFRhcmdldCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEcm9wVGFyZ2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZG9UID0gcmVxdWlyZSgnbWlsby1jb3JlJykudXRpbC5kb1RcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBtaWxvQ291bnQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvdW50Jyk7XG5cbnZhciBUUkVFX1RFTVBMQVRFID0gJzx1bCBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWxpc3RcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAge3t+IGl0LmRhdGEuaXRlbXMgOml0ZW06aW5kZXggfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZhciBoYXNTdWJUcmVlID0gaXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aDsgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB7ez8gaGFzU3ViVHJlZSB9fWNsYXNzPVwibWwtdWktZm9sZHRyZWUtLWhhcy1tdWx0aXBsZVwie3s/fX0+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWl0ZW1cIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGhhc1N1YlRyZWUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1idXR0b25cIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s9IGl0Lml0ZW1UZW1wbGF0ZSh7IGl0ZW06IGl0ZW0sIGlkOiBpdC5pdGVtSURzW2luZGV4XSB9KSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBoYXNTdWJUcmVlIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PSBpdC50cmVlVGVtcGxhdGUoaXRlbSkgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXFxuICAgICAgICAgICAgICAgICAgICAgICAge3t+fX1cXFxuICAgICAgICAgICAgICAgICAgICA8L3VsPic7XG5cbnZhciBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUgPSBkb1QuY29tcGlsZSgnXFxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtdWktZm9sZHRyZWUtbGFiZWxcIiBkYXRhLWl0ZW0taWQ9XCJ7ez0gaXQuaWQgfX1cIj5cXFxuICAgICAgICAgICAgICAgIHt7PSBpdC5pdGVtLmxhYmVsIH19XFxcbiAgICAgICAgICAgIDwvc3Bhbj4nKVxuICAgICwgQ09NUElMRURfVFJFRV9URU1QTEFURSA9IGRvVC5jb21waWxlKFRSRUVfVEVNUExBVEUpO1xuXG5cbnZhciBNTEZvbGRUcmVlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEZvbGRUcmVlJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGV2ZW50czoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJ2NsaWNrIGRibGNsaWNrJzogeyBzdWJzY3JpYmVyOiBvbkl0ZW1FdmVudCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1mb2xkdHJlZS1tYWluJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRm9sZFRyZWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRm9sZFRyZWU7XG5cbl8uZXh0ZW5kUHJvdG8oTUxGb2xkVHJlZSwge1xuICAgIHNldEl0ZW1UZW1wbGF0ZTogTUxGb2xkVHJlZSRzZXRJdGVtVGVtcGxhdGUsXG4gICAgcmVuZGVyVHJlZTogTUxGb2xkVHJlZSRyZW5kZXJUcmVlXG59KTtcblxuZnVuY3Rpb24gZm9sZFVuZm9sZChlbCkge1xuICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ21sLXVpLWZvbGR0cmVlLS11bmZvbGQnKTtcbn1cblxuZnVuY3Rpb24gaXRlbU1lc3NhZ2UobXNnLCBlbCkge1xuICAgIHZhciBpZCA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pdGVtLWlkJylcbiAgICAgICAgLCBpdGVtID0gdGhpcy5faXRlbXNNYXBbaWRdO1xuXG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnbWxmb2xkdHJlZV8nICsgbXNnLCB7XG4gICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgIGVsOiBlbFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1FdmVudChtc2csIGUpIHtcbiAgICB2YXIgZWwgPSBlLnRhcmdldDtcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtbC11aS1mb2xkdHJlZS1idXR0b24nKSlcbiAgICAgICAgZm9sZFVuZm9sZChlbC5wYXJlbnROb2RlLnBhcmVudE5vZGUpO1xuICAgIGVsc2UgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbWwtdWktZm9sZHRyZWUtbGFiZWwnKSlcbiAgICAgICAgaXRlbU1lc3NhZ2UuY2FsbCh0aGlzLCBtc2csIGVsKTtcbiAgICBlbHNlIHJldHVybjtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xufVxuXG5mdW5jdGlvbiBNTEZvbGRUcmVlJHNldEl0ZW1UZW1wbGF0ZSAodGVtcGxhdGVTdHIpIHtcbiAgICB0aGlzLl9pdGVtVGVtcGxhdGUgPSBkb1QuY29tcGlsZSh0ZW1wbGF0ZVN0cik7XG59XG5cbmZ1bmN0aW9uIE1MRm9sZFRyZWUkcmVuZGVyVHJlZSAoZGF0YSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICBzZWxmLl9pdGVtc01hcCA9IHt9O1xuICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gX3JlbmRlclRyZWUoZGF0YSk7XG5cbiAgICBmdW5jdGlvbiBfcmVuZGVyVHJlZSAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5pdGVtcylcbiAgICAgICAgICAgIHZhciBpdGVtc0lEcyA9IF8ubWFwKGRhdGEuaXRlbXMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBtaWxvQ291bnQoKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9pdGVtc01hcFtpZF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDsgXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQ09NUElMRURfVFJFRV9URU1QTEFURSh7XG4gICAgICAgICAgICBpdGVtSURzOiBpdGVtc0lEcyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHNlbGYuX2l0ZW1UZW1wbGF0ZSB8fCBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUsXG4gICAgICAgICAgICB0cmVlVGVtcGxhdGU6IF9yZW5kZXJUcmVlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEdyb3VwID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEdyb3VwJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZ3JvdXAnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxHcm91cCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxHcm91cDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEh5cGVybGluayA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxIeXBlcmxpbmsnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1oeXBlcmxpbmsnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxIeXBlcmxpbmspO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSHlwZXJsaW5rO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgSU1BR0VfQ0hBTkdFX01FU1NBR0UgPSAnbWxpbWFnZWNoYW5nZSc7XG5cbnZhciBNTEltYWdlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEltYWdlJywge1xuICAgIGRhdGE6IHtcbiAgICAgICAgc2V0OiBNTEltYWdlX3NldCxcbiAgICAgICAgZ2V0OiBNTEltYWdlX2dldCxcbiAgICAgICAgZGVsOiBNTEltYWdlX2RlbCxcbiAgICAgICAgc3BsaWNlOiB1bmRlZmluZWQsXG4gICAgICAgIGV2ZW50OiBJTUFHRV9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcuc3JjJzogeyBzdWJzY3JpYmVyOiBvbk1vZGVsQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgICAgICBjbHM6ICdtbC11aS1pbWFnZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEltYWdlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEltYWdlO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxJbWFnZSwge1xuICAgIGluaXQ6IE1MSW1hZ2UkaW5pdFxufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTEltYWdlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBTZXRzIGltYWdlIHZhbHVlXG4gKiBSZXBsYWNlcyB0aGUgZGF0YSBzZXQgb3BlcmF0aW9uIHRvIGRlYWwgd2l0aCByYWRpbyBidXR0b25zXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBNTEltYWdlX3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTEltYWdlX2RlbCgpIHtcbiAgICB0aGlzLm1vZGVsLmRlbCgpO1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShJTUFHRV9DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuZnVuY3Rpb24gb25Nb2RlbENoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy5lbC5zcmMgPSBkYXRhLm5ld1ZhbHVlO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxJbnB1dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbnB1dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWlucHV0J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSW5wdXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXQ7XG5cbl8uZXh0ZW5kUHJvdG8oTUxJbnB1dCwge1xuICAgIGRpc2FibGU6IE1MSW5wdXQkZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTElucHV0JGlzRGlzYWJsZWQsXG4gICAgc2V0TWF4TGVuZ3RoOiBNTElucHV0JHNldE1heExlbmd0aFxufSk7XG5cbmZ1bmN0aW9uIE1MSW5wdXQkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXQkaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0JHNldE1heExlbmd0aChsZW5ndGgpIHtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJywgbGVuZ3RoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21saW5wdXRsaXN0Y2hhbmdlJztcblxudmFyIGFzeW5jSGFuZGxlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY2FsbGJhY2spIHtjYWxsYmFjayh2YWx1ZSk7fTtcblxudmFyIE1MSW5wdXRMaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTElucHV0TGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktaW5wdXQtbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTElucHV0TGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxJbnB1dExpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MSW5wdXRMaXN0X2RlbCxcbiAgICAgICAgc3BsaWNlOiBNTElucHV0TGlzdF9zcGxpY2UsXG4gICAgICAgIGV2ZW50OiBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25JdGVtc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdDpsaXN0XCI+XFxcbiAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltldmVudHNdOmRlbGV0ZUJ0blwiIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmVcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1sLWJpbmQ9XCJNTElucHV0OmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cXFxuICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiTUxCdXR0b246YnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIj5cXFxuICAgICAgICAgICAgICAgIEFkZFxcXG4gICAgICAgICAgICA8L2J1dHRvbj4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxJbnB1dExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXRMaXN0O1xuXG5fLmV4dGVuZFByb3RvKE1MSW5wdXRMaXN0LCB7XG4gICAgaW5pdDogTUxJbnB1dExpc3QkaW5pdCxcbiAgICBzZXRBc3luYzogTUxJbnB1dExpc3Qkc2V0QXN5bmMsXG4gICAgc2V0UGxhY2VIb2xkZXI6IE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyLFxuICAgIGRlc3Ryb3k6IE1MSW5wdXRMaXN0JGRlc3Ryb3lcbn0pO1xuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgcmVuZGVyLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyKHBsYWNlSG9sZGVyKSB7XG4gICAgdGhpcy5faW5wdXQuZWwuc2V0QXR0cmlidXRlKCdwbGFjZUhvbGRlcicsIHBsYWNlSG9sZGVyKTtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Qkc2V0QXN5bmMobmV3SGFuZGxlcikge1xuICAgIGFzeW5jSGFuZGxlciA9IG5ld0hhbmRsZXIgfHwgYXN5bmNIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19pbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2J1dHRvbic6IHRoaXMuY29udGFpbmVyLnNjb3BlLmJ1dHRvbixcbiAgICAgICAgJ19saXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUubGlzdFxuICAgIH0pO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fYnV0dG9uLmV2ZW50cy5vbignY2xpY2snLCB7c3Vic2NyaWJlcjogb25DbGljaywgY29udGV4dDogdGhpcyB9KTsgICBcbn1cblxuZnVuY3Rpb24gb25DbGljayhtc2cpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbnB1dC5kYXRhLmdldCgwKTtcbiAgICBpZiAodGhpcy5faW5wdXQuZGF0YSlcbiAgICAgICAgYXN5bmNIYW5kbGVyKHZhbHVlLCBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0Lm1vZGVsLnB1c2goeyBsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9pbnB1dC5kYXRhLmRlbCgpO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2dldCgpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiBtb2RlbCA/IF8uY2xvbmUobW9kZWwpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zcGxpY2UoKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICB0aGlzLm1vZGVsLnNwbGljZS5hcHBseSh0aGlzLm1vZGVsLCBhcmd1bWVudHMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBMSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGNoYW5nZSdcbiAgICAsIERFTEVURV9CVVRUT05fTkFNRSA9ICdkZWxldGVCdG4nO1xuXG5cbnZhciBNTExpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDogdW5kZWZpbmVkLFxuICAgIGxpc3Q6IHVuZGVmaW5lZFxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MTGlzdCwge1xuICAgIGluaXQ6IE1MTGlzdCRpbml0LFxuICAgIGRlc3Ryb3k6IE1MTGlzdCRkZXN0cm95LFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdCRyZW1vdmVJdGVtLFxuICAgIG1vdmVJdGVtOiBNTExpc3QkbW92ZUl0ZW1cbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkcmVtb3ZlSXRlbShpbmRleCl7XG4gICAgdGhpcy5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRtb3ZlSXRlbShmcm9tLCB0bykge1xuICAgIHZhciBzcGxpY2VkRGF0YSA9IHRoaXMubW9kZWwuc3BsaWNlKGZyb20sIDEpO1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNwbGljZSh0bywgMCwgc3BsaWNlZERhdGFbMF0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbWlsby5taW5kZXIodGhpcy5tb2RlbCwgJzw8PC0nLCB0aGlzLmRhdGEpLmRlZmVyQ2hhbmdlTW9kZSgnPDw8LT4+PicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBEcmFnRHJvcCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZHJhZ2Ryb3AnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGl0ZW1jaGFuZ2UnXG5cbnZhciBNTExpc3RJdGVtID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTExpc3RJdGVtJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbTogdW5kZWZpbmVkLFxuICAgIGRyYWc6IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgcGFyYW1zOiBnZXRNZXRhRGF0YVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnZHJhZ2VudGVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdvdmVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdsZWF2ZSc6IHsgc3Vic2NyaWJlcjogb25EcmFnT3V0LCBjb250ZXh0OiAnb3duZXInIH0sXG4gICAgICAgICAgICAnZHJvcCc6IHsgc3Vic2NyaWJlcjogb25JdGVtRHJvcCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH0sXG4gICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICBjb21wb25lbnRzOiBpc0NvbXBvbmVudEFsbG93ZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MTGlzdEl0ZW1fZ2V0LFxuICAgICAgICBzZXQ6IE1MTGlzdEl0ZW1fc2V0LFxuICAgICAgICBkZWw6IE1MTGlzdEl0ZW1fZGVsLFxuICAgICAgICBldmVudDogTElTVElURU1fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgaXRlbTogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3RJdGVtKTtcblxudmFyIE1MTGlzdEl0ZW0gPSBtb2R1bGUuZXhwb3J0cyA9IE1MTGlzdEl0ZW07XG5cblxuXy5leHRlbmRQcm90byhNTExpc3RJdGVtLCB7XG4gICAgaW5pdDogTUxMaXN0SXRlbSRpbml0LFxuICAgIG1vdmVJdGVtOiBNTExpc3RJdGVtJG1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdEl0ZW0kcmVtb3ZlSXRlbSxcbiAgICBpc0Ryb3BBbGxvd2VkOiBNTExpc3RJdGVtJGlzRHJvcEFsbG93ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdmFyIGRlbGV0ZUJ0biA9IHRoaXMuY29udGFpbmVyLnNjb3BlLmRlbGV0ZUJ0bjtcbiAgICBkZWxldGVCdG4gJiYgZGVsZXRlQnRuLmV2ZW50cy5vbignY2xpY2snLCB7IHN1YnNjcmliZXI6IHRoaXMucmVtb3ZlSXRlbSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJHJlbW92ZUl0ZW0oKSB7XG4gICAgdHJ5IHsgdmFyIGxpc3RPd25lciA9IHRoaXMuaXRlbS5saXN0Lm93bmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgbGlzdE93bmVyICYmIGxpc3RPd25lci5yZW1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbSRtb3ZlSXRlbShpbmRleCkge1xuICAgIHZhciBsaXN0T3duZXIgPSB0aGlzLml0ZW0ubGlzdC5vd25lcjtcbiAgICBsaXN0T3duZXIgJiYgbGlzdE93bmVyLm1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCwgaW5kZXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaXNEcm9wQWxsb3dlZChtZXRhLCBkcmFnRHJvcCl7XG4gICAgcmV0dXJuIG1ldGEucGFyYW1zICYmIG1ldGEucGFyYW1zLmluZGV4ICYmIG1ldGEuY29tcENsYXNzID09ICdNTExpc3RJdGVtJztcbn1cblxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEcm9wQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIG9uSXRlbURyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIG9uRHJhZ091dC5jYWxsKHRoaXMpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgdmFyIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG4gICAgdmFyIHN0YXRlID0gZHQuZ2V0Q29tcG9uZW50U3RhdGUoKTtcbiAgICB2YXIgbGlzdE93bmVyID0gdGhpcy5pdGVtLmxpc3Qub3duZXI7XG4gICAgdmFyIGluZGV4ID0gbWV0YS5wYXJhbXMgJiYgbWV0YS5wYXJhbXMuaW5kZXg7XG5cbiAgICBsaXN0T3duZXIubW92ZUl0ZW0oK2luZGV4LCB0aGlzLml0ZW0uaW5kZXgsIHN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdIb3ZlcihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5kb20uYWRkQ3NzQ2xhc3NlcygnbWwtZHJhZy1vdmVyJyk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnT3V0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmRvbS5yZW1vdmVDc3NDbGFzc2VzKCdtbC1kcmFnLW92ZXInKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRNZXRhRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogdGhpcy5pdGVtLmluZGV4XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW1fZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbV9zZXQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICB0aGlzLmRhdGEuX3NldCh2YWx1ZSk7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xuICAgIF9zZW5kQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtX2RlbCgpIHtcbiAgICB0aGlzLmRhdGEuX2RlbCgpO1xuICAgIHRoaXMubW9kZWwuZGVsKCk7XG4gICAgX3NlbmRDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7ICAgIFxufVxuXG5cbmZ1bmN0aW9uIF9zZW5kQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBtaWxvQ291bnQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvdW50JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgUkFESU9fQ0hBTkdFX01FU1NBR0UgPSAnbWxyYWRpb2dyb3VwY2hhbmdlJ1xuICAgICwgRUxFTUVOVF9OQU1FX1BST1BFUlRZID0gJ19tbFJhZGlvR3JvdXBFbGVtZW50SUQnXG4gICAgLCBFTEVNRU5UX05BTUVfUFJFRklYID0gJ21sLXJhZGlvLWdyb3VwLSc7XG5cbnZhciBNTFJhZGlvR3JvdXAgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MUmFkaW9Hcm91cCcsIHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNldDogTUxSYWRpb0dyb3VwX3NldCxcbiAgICAgICAgZ2V0OiBNTFJhZGlvR3JvdXBfZ2V0LFxuICAgICAgICBkZWw6IE1MUmFkaW9Hcm91cF9kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogUkFESU9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayc6IHsgc3Vic2NyaWJlcjogb25Hcm91cENsaWNrLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXJhZGlvLWdyb3VwJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICd7e34gaXQucmFkaW9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IyNkZWYuZWxJRDp7ez0gaXQuZWxlbWVudE5hbWUgfX0te3s9IG9wdGlvbi52YWx1ZSB9fSN9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7ez0gaXQuX3JlbmRlck9wdGlvbnMub3B0aW9uQ3NzQ2xhc3MgfHwgXCInICsgRUxFTUVOVF9OQU1FX1BSRUZJWCArICdvcHRpb25cIiB9fVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7IyBkZWYuZWxJRCB9fVwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s9IG9wdGlvbi52YWx1ZSB9fVwiIG5hbWU9XCJ7ez0gaXQuZWxlbWVudE5hbWUgfX1cIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3sjIGRlZi5lbElEIH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvbGFiZWw+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxSYWRpb0dyb3VwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFJhZGlvR3JvdXA7XG5cblxuXy5leHRlbmRQcm90byhNTFJhZGlvR3JvdXAsIHtcbiAgICBpbml0OiBNTFJhZGlvR3JvdXAkaW5pdCxcbiAgICBkZXN0cm95OiBNTFJhZGlvR3JvdXAkZGVzdHJveSxcbiAgICBzZXRSZW5kZXJPcHRpb25zOiBNTFJhZGlvR3JvdXAkc2V0UmVuZGVyT3B0aW9uc1xufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXAkaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfcmFkaW9MaXN0JywgW10sIF8uQ09ORik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBFTEVNRU5UX05BTUVfUFJPUEVSVFksIEVMRU1FTlRfTkFNRV9QUkVGSVggKyBtaWxvQ291bnQoKSk7XG4gICAgdGhpcy5fcmVuZGVyT3B0aW9ucyA9IHt9O1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cCRzZXRSZW5kZXJPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB0aGlzLl9yZW5kZXJPcHRpb25zID0gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIFNldHMgZ3JvdXAgdmFsdWVcbiAqIFJlcGxhY2VzIHRoZSBkYXRhIHNldCBvcGVyYXRpb24gdG8gZGVhbCB3aXRoIHJhZGlvIGJ1dHRvbnNcbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cF9zZXQodmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX3JhZGlvTGlzdFxuICAgICAgICAsIHNldFJlc3VsdDtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgICAgICByYWRpby5jaGVja2VkID0gcmFkaW8udmFsdWUgPT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAocmFkaW8uY2hlY2tlZClcbiAgICAgICAgICAgICAgICBzZXRSZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX2dldCgpIHtcbiAgICB2YXIgY2hlY2tlZCA9IF8uZmluZCh0aGlzLl9yYWRpb0xpc3QsIGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgIHJldHVybiByYWRpby5jaGVja2VkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoZWNrZWQgJiYgY2hlY2tlZC52YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBEZWxldGVkIGdyb3VwIHZhbHVlXG4gKiBEZWxldGVzIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXAsIHNldHRpbmcgaXQgdG8gZW1wdHlcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX2RlbCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuX3JhZGlvTGlzdDtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihyYWRpbykge1xuICAgICAgICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuLyoqXG4gKiBNYW5hZ2UgcmFkaW8gY2hpbGRyZW4gY2xpY2tzXG4gKi9cbmZ1bmN0aW9uIG9uR3JvdXBDbGljayhldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09ICdyYWRpbycpXG4gICAgICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuXG4vLyBQb3N0IHRoZSBkYXRhIGNoYW5nZVxuZnVuY3Rpb24gZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlKCkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoUkFESU9fQ0hBTkdFX01FU1NBR0UpO1xufVxuXG5cbi8vIFNldCByYWRpbyBidXR0b24gY2hpbGRyZW4gb24gbW9kZWwgY2hhbmdlXG5mdW5jdGlvbiBvbk9wdGlvbnNDaGFuZ2UocGF0aCwgZGF0YSkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgcmFkaW9PcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpLFxuICAgICAgICBlbGVtZW50TmFtZTogdGhpc1tFTEVNRU5UX05BTUVfUFJPUEVSVFldLFxuICAgICAgICBfcmVuZGVyT3B0aW9uczogdGhpcy5fcmVuZGVyT3B0aW9uc1xuICAgIH0pO1xuXG4gICAgdmFyIHJhZGlvRWxzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl0nKVxuICAgICAgICAsIG9wdGlvbnMgPSBfLnRvQXJyYXkocmFkaW9FbHMpO1xuXG4gICAgdGhpcy5fcmFkaW9MaXN0Lmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fcmFkaW9MaXN0LnNwbGljZS5hcHBseSh0aGlzLl9yYWRpb0xpc3QsIFswLCAwXS5jb25jYXQob3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIE1MUmFkaW9Hcm91cCRkZXN0cm95KCkge1xuICAgIGRlbGV0ZSB0aGlzLl9yYWRpb0xpc3Q7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTFNlbGVjdCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxTZWxlY3QnLCB7XG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXNlbGVjdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ3t7fiBpdC5zZWxlY3RPcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7ez0gb3B0aW9uLnZhbHVlIH19XCIge3s/IG9wdGlvbi5zZWxlY3RlZCB9fXNlbGVjdGVke3s/fX0+e3s9IG9wdGlvbi5sYWJlbCB9fTwvb3B0aW9uPiBcXFxuICAgICAgICAgICAgICAgICAgIHt7fn19J1xuICAgIH1cbn0pO1xuXG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxTZWxlY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MU2VsZWN0O1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxTZWxlY3QsIHtcbiAgICBzZXRPcHRpb25zOiBNTFNlbGVjdCRzZXRPcHRpb25zLFxuICAgIGRpc2FibGU6IE1MU2VsZWN0JGRpc2FibGVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MU2VsZWN0JHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIFNldCBvcHRpb25zIHRlbXBvcmFyaWx5IGRpc2FibGVzIG1vZGVsIHN1YnNjcmlwdGlvbnMgKEFzIGEgd29ya2Fyb3VuZCBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzIHJlbGF0aW5nIHRvIG1vZGVsIHVwZGF0ZXMgLyB0ZW1wbGF0ZSByZS1yZW5kZXJpbmcpXG4gICAgdmFyIG1vZGVsQ2hhbmdlTGlzdGVuZXIgPSB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSB9O1xuXG4gICAgdGhpcy5tb2RlbC5vZmYoJyoqJywgbW9kZWxDaGFuZ2VMaXN0ZW5lcik7XG4gICAgdGhpcy5tb2RlbC5zZXQob3B0aW9ucyk7XG4gICAgdGhpcy5tb2RlbC5vbignKionLCBtb2RlbENoYW5nZUxpc3RlbmVyKTtcblxuICAgIG9uT3B0aW9uc0NoYW5nZS5jYWxsKHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MU2VsZWN0JGRpc2FibGUoZGlzYWJsZSkge1xuICAgIHRoaXMuZWwuZGlzYWJsZWQgPSBkaXNhYmxlO1xufVxuXG5cbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoeyBzZWxlY3RPcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1MU3VwZXJDb21ib1xuICogQSBjb21ibyBzZWxlY3QgbGlzdCB3aXRoIGludGVsbGlnZW50IHNjcm9sbGluZyBvZiBzdXBlciBsYXJnZSBsaXN0cy5cbiAqL1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1RcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG52YXIgQ09NQk9fT1BFTiA9ICdtbC11aS1zdXBlcmNvbWJvLW9wZW4nO1xudmFyIENPTUJPX0NIQU5HRV9NRVNTQUdFID0gJ21sc3VwZXJjb21ib2NoYW5nZSc7XG5cbnZhciBPUFRJT05TX1RFTVBMQVRFID0gJ3t7fiBpdC5jb21ib09wdGlvbnMgOm9wdGlvbjppbmRleCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB7ez8gb3B0aW9uLnNlbGVjdGVkfX1jbGFzcz1cInNlbGVjdGVkXCIge3s/fX1kYXRhLXZhbHVlPVwie3s9IGluZGV4IH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICB7e359fSc7XG5cbnZhciBNQVhfUkVOREVSRUQgPSAxMDA7XG52YXIgQlVGRkVSID0gMjU7XG52YXIgREVGQVVMVF9FTEVNRU5UX0hFSUdIVCA9IDIwO1xuXG52YXIgTUxTdXBlckNvbWJvID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFN1cGVyQ29tYm8nLCB7XG4gICAgZXZlbnRzOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnbW91c2VsZWF2ZSc6IHtzdWJzY3JpYmVyOiBvbk1vdXNlTGVhdmUsIGNvbnRleHQ6ICdvd25lcid9LFxuICAgICAgICAgICAgJ21vdXNlb3Zlcic6IHtzdWJzY3JpYmVyOiBvbk1vdXNlT3ZlciwgY29udGV4dDogJ293bmVyJ31cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MU3VwZXJDb21ib19nZXQsXG4gICAgICAgIHNldDogTUxTdXBlckNvbWJvX3NldCxcbiAgICAgICAgZGVsOiBNTFN1cGVyQ29tYm9fZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktc3VwZXJjb21ibydcbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnPGlucHV0IG1sLWJpbmQ9XCJbZGF0YSwgZXZlbnRzXTppbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1sLXVpLWlucHV0XCI+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTphZGRJdGVtRGl2XCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLWFkZFwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiOmFkZFByb21wdFwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiW2V2ZW50cywgZG9tXTphZGRCdG5cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBtbC11aS1idXR0b25cIj5BZGQ8L2J1dHRvbj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbSwgZXZlbnRzXTpsaXN0XCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLWRyb3Bkb3duXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbV06YmVmb3JlXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW3RlbXBsYXRlLCBkb20sIGV2ZW50c106b3B0aW9uc1wiIGNsYXNzPVwibWwtdWktc3VwZXJjb21iby1vcHRpb25zXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiW2RvbV06YWZ0ZXJcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PidcbiAgICB9LFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFN1cGVyQ29tYm8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MU3VwZXJDb21ibztcblxuLyoqXG4gKiBQdWJsaWMgQXBpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTUxTdXBlckNvbWJvLCB7XG4gICAgaW5pdDogTUxTdXBlckNvbWJvJGluaXQsXG4gICAgc2hvd09wdGlvbnM6IE1MU3VwZXJDb21ibyRzaG93T3B0aW9ucyxcbiAgICBoaWRlT3B0aW9uczogTUxTdXBlckNvbWJvJGhpZGVPcHRpb25zLFxuICAgIHRvZ2dsZU9wdGlvbnM6IE1MU3VwZXJDb21ibyR0b2dnbGVPcHRpb25zLFxuICAgIHNldE9wdGlvbnM6IE1MU3VwZXJDb21ibyRzZXRPcHRpb25zLFxuICAgIGluaXRPcHRpb25zVVJMOiBNTFN1cGVyQ29tYm8kaW5pdE9wdGlvbnNVUkwsXG4gICAgc2V0RmlsdGVyZWRPcHRpb25zOiBNTFN1cGVyQ29tYm8kc2V0RmlsdGVyZWRPcHRpb25zLFxuICAgIHVwZGF0ZTogTUxTdXBlckNvbWJvJHVwZGF0ZSxcbiAgICB0b2dnbGVBZGRCdXR0b246IE1MU3VwZXJDb21ibyR0b2dnbGVBZGRCdXR0b24sXG4gICAgc2V0QWRkSXRlbVByb21wdDogTUxTdXBlckNvbWJvJHNldEFkZEl0ZW1Qcm9tcHQsXG4gICAgY2xlYXJDb21ib0lucHV0OiBNTFN1cGVyQ29tYm9fZGVsXG59KTtcblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpc2UgdGhlIGNvbXBvbmVudCwgd2FpdCBmb3IgY2hpbGRyZW5ib3VuZCwgc2V0dXAgZW1wdHkgb3B0aW9ucyBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdGhpcy5vbmNlKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9vcHRpb25zRGF0YTogW10sXG4gICAgICAgIF9maWx0ZXJlZE9wdGlvbnNEYXRhOiBbXVxuICAgIH0sIF8uV1JJVCk7XG59XG5cbi8qKlxuICogSGFuZGxlciBmb3IgaW5pdCBjaGlsZHJlbmJvdW5kIGxpc3RlbmVyLiBSZW5kZXJzIHRlbXBsYXRlLlxuICovXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoKS5iaW5kZXIoKTtcbiAgICBjb21wb25lbnRTZXR1cC5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogRGVmaW5lIGluc3RhbmNlIHByb3BlcnRpZXMsIGdldCBzdWJjb21wb25lbnRzLCBjYWxsIHNldHVwIHN1Yi10YXNrc1xuICovXG5mdW5jdGlvbiBjb21wb25lbnRTZXR1cCgpIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzLmNvbnRhaW5lci5zY29wZTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9jb21ib0lucHV0OiBzY29wZS5pbnB1dCxcbiAgICAgICAgX2NvbWJvTGlzdDogc2NvcGUubGlzdCxcbiAgICAgICAgX2NvbWJvT3B0aW9uczogc2NvcGUub3B0aW9ucyxcbiAgICAgICAgX2NvbWJvQmVmb3JlOiBzY29wZS5iZWZvcmUsXG4gICAgICAgIF9jb21ib0FmdGVyOiBzY29wZS5hZnRlcixcbiAgICAgICAgX2NvbWJvQWRkSXRlbURpdjogc2NvcGUuYWRkSXRlbURpdixcbiAgICAgICAgX2NvbWJvQWRkUHJvbXB0OiBzY29wZS5hZGRQcm9tcHQsXG4gICAgICAgIF9jb21ib0FkZEJ0bjogc2NvcGUuYWRkQnRuLFxuICAgICAgICBfb3B0aW9uVGVtcGxhdGU6IGRvVC5jb21waWxlKE9QVElPTlNfVEVNUExBVEUpXG4gICAgfSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfc3RhcnRJbmRleDogMCxcbiAgICAgICAgX2VuZEluZGV4OiBNQVhfUkVOREVSRUQsXG4gICAgICAgIF9oaWRkZW46IGZhbHNlLFxuICAgICAgICBfZWxlbWVudEhlaWdodDogREVGQVVMVF9FTEVNRU5UX0hFSUdIVCxcbiAgICAgICAgX3RvdGFsOiAwLFxuICAgICAgICBfb3B0aW9uc0hlaWdodDogMjAwLFxuICAgICAgICBfbGFzdFNjcm9sbFBvczogMCxcbiAgICAgICAgX2N1cnJlbnRWYWx1ZTogbnVsbCxcbiAgICAgICAgX3NlbGVjdGVkOiBudWxsLFxuICAgICAgICBfaXNBZGRCdXR0b25TaG93bjogZmFsc2VcbiAgICB9LCBfLldSSVQpO1xuXG4gICAgLy8gQ29tcG9uZW50IFNldHVwXG4gICAgdGhpcy5kb20uc2V0U3R5bGVzKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7XG4gICAgc2V0dXBDb21ib0xpc3QodGhpcy5fY29tYm9MaXN0LCB0aGlzLl9jb21ib09wdGlvbnMsIHRoaXMpO1xuICAgIHNldHVwQ29tYm9JbnB1dCh0aGlzLl9jb21ib0lucHV0LCB0aGlzKTtcbiAgICBzZXR1cENvbWJvQnRuKHRoaXMuX2NvbWJvQWRkQnRuLCB0aGlzKTtcblxuICAgIHRoaXMuZXZlbnRzLm9uKCdrZXlkb3duJywgeyBzdWJzY3JpYmVyOiBjaGFuZ2VTZWxlY3RlZCwgY29udGV4dDogdGhpcyB9KTtcbiAgICAvL3RoaXMuZXZlbnRzLm9uKCdtb3VzZWxlYXZlJywgeyBzdWJzY3JpYmVyOiBNTFN1cGVyQ29tYm8kaGlkZU9wdGlvbnMsIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2hvd3Mgb3IgaGlkZXMgb3B0aW9uIGxpc3QuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBzaG93IHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZVxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kdG9nZ2xlT3B0aW9ucyhzaG93KSB7XG4gICAgdGhpcy5faGlkZGVuID0gIXNob3c7XG4gICAgdGhpcy5fY29tYm9MaXN0LmRvbS50b2dnbGUoc2hvdyk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2hvd3Mgb3B0aW9ucyBsaXN0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzaG93T3B0aW9ucygpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoQ09NQk9fT1BFTik7XG4gICAgdGhpcy5fY29tYm9MaXN0LmRvbS50b2dnbGUodHJ1ZSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgb3B0aW9ucyBsaXN0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRoaWRlT3B0aW9ucygpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZShDT01CT19PUEVOKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgYWRkIGJ1dHRvblxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kdG9nZ2xlQWRkQnV0dG9uKHNob3csIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9jb21ib0FkZEl0ZW1EaXYuZG9tLnRvZ2dsZShzaG93KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByZXNlcnZlU3RhdGUpIHRoaXMuX19zaG93QWRkT25DbGljayA9IHRoaXMuX2lzQWRkQnV0dG9uU2hvd247XG4gICAgdGhpcy5faXNBZGRCdXR0b25TaG93biA9IHNob3c7XG59XG5cblxuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KSB7XG4gICAgdGhpcy5fYWRkSXRlbVByb21wdCA9IHByb21wdDtcbiAgICB0aGlzLl9jb21ib0FkZFByb21wdC5lbC5pbm5lckhUTUwgPSBwcm9tcHQ7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd25cbiAqXG4gKiBAcGFyYW0ge0FycmF5W09iamVjdF19IGFyciB0aGUgb3B0aW9ucyB0byBzZXQgd2l0aCBsYWJlbCBhbmQgdmFsdWUgcGFpcnMuIFZhbHVlIGNhbiBiZSBhbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzZXRPcHRpb25zKGFycikge1xuICAgIHRoaXMuX29wdGlvbnNEYXRhID0gYXJyO1xuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKGFycik7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXNlIHRoZSByZW1vdGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBpbml0aWFsaXNlLlxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kaW5pdE9wdGlvbnNVUkwob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnNVUkwgPSBvcHRpb25zLnVybDtcbiAgICB0aGlzLl9mb3JtYXRPcHRpb25zVVJMID0gb3B0aW9ucy5mb3JtYXRPcHRpb25zIHx8IGZ1bmN0aW9uKGUpe3JldHVybiBlO307XG59XG5cblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZFxuICogU2V0cyB0aGUgb3B0aW9ucyBvZiB0aGUgZHJvcGRvd24gYmFzZWQgb24gYSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIF9nZXRPcHRpb25zVVJMKGNiKSB7XG4gICAgdmFyIHVybCA9IHRoaXMuX29wdGlvbnNVUkwsXG4gICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fY29tYm9JbnB1dC5kYXRhLmdldCgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjYiA9IGNiIHx8IF8ubm9vcDtcbiAgICBtaWxvLnV0aWwucmVxdWVzdC5wb3N0KHVybCwgeyBuYW1lOiBxdWVyeVN0cmluZyB9LCBmdW5jdGlvbiAoZXJyLCByZXNwb25zZSkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NhbiBub3Qgc2VhcmNoIGZvciBcIicgKyBxdWVyeVN0cmluZyArICdcIicpO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignUmVxdWVzdCBlcnJvcicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXNwb25zZURhdGEgPSBfLmpzb25QYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGlmIChyZXNwb25zZURhdGEpIGNiKG51bGwsIHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIGVsc2UgY2IobmV3IEVycm9yKCdEYXRhIGVycm9yJykpO1xuICAgIH0pO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgZmlsdGVyZWQgb3B0aW9ucywgd2hpY2ggaXMgYSBzdWJzZXQgb2Ygbm9ybWFsIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1t0eXBlXX0gYXJyIFRoZSBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kc2V0RmlsdGVyZWRPcHRpb25zKGFycikge1xuICAgIGlmICghIGFycikgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0RmlsdGVyZWRPcHRpb25zOiBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkJyk7XG4gICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YSA9IGFycjtcbiAgICB0aGlzLl90b3RhbCA9IGFyci5sZW5ndGg7XG4gICAgdGhpcy51cGRhdGUoKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBVcGRhdGVzIHRoZSBsaXN0LiBUaGlzIGlzIHVzZWQgb24gc2Nyb2xsLCBhbmQgbWFrZXMgdXNlIG9mIHRoZSBmaWx0ZXJlZE9wdGlvbnMgdG9cbiAqIGludGVsbGlnZW50bHkgc2hvdyBhIHN1YnNldCBvZiB0aGUgZmlsdGVyZWQgbGlzdCBhdCBhIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR1cGRhdGUoKSB7XG4gICAgdmFyIHdhc0hpZGRlbiA9IHRoaXMuX2hpZGRlbjtcblxuICAgIHZhciBhcnJUb1Nob3cgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhLnNsaWNlKHRoaXMuX3N0YXJ0SW5kZXgsIHRoaXMuX2VuZEluZGV4KTtcblxuICAgIHRoaXMuX2NvbWJvT3B0aW9ucy50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICBjb21ib09wdGlvbnM6IGFyclRvU2hvd1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZWxlbWVudEhlaWdodCA9IHRoaXMuX2VsZW1lbnRIZWlnaHQgfHwgREVGQVVMVF9FTEVNRU5UX0hFSUdIVDtcblxuICAgIGlmICh3YXNIaWRkZW4pXG4gICAgICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcblxuICAgIHZhciBiZWZvcmVIZWlnaHQgPSB0aGlzLl9zdGFydEluZGV4ICogdGhpcy5fZWxlbWVudEhlaWdodDtcbiAgICB2YXIgYWZ0ZXJIZWlnaHQgPSAodGhpcy5fdG90YWwgLSB0aGlzLl9lbmRJbmRleCkgKiB0aGlzLl9lbGVtZW50SGVpZ2h0O1xuICAgIHRoaXMuX2NvbWJvQmVmb3JlLmVsLnN0eWxlLmhlaWdodCA9IGJlZm9yZUhlaWdodCArICdweCc7XG4gICAgdGhpcy5fY29tYm9BZnRlci5lbC5zdHlsZS5oZWlnaHQgPSBhZnRlckhlaWdodCA+IDAgPyBhZnRlckhlaWdodCArICdweCcgOiAnMHB4Jztcbn1cblxuLyoqXG4gKiBTZXR1cCB0aGUgY29tYm8gbGlzdFxuICpcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gbGlzdFxuICogQHBhcmFtICB7QXJyYXl9IG9wdGlvbnNcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvTGlzdChsaXN0LCBvcHRpb25zLCBzZWxmKSB7XG4gICAgc2VsZi50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xuICAgIG9wdGlvbnMudGVtcGxhdGUuc2V0KE9QVElPTlNfVEVNUExBVEUpO1xuXG4gICAgbGlzdC5kb20uc2V0U3R5bGVzKHtcbiAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnLFxuICAgICAgICBoZWlnaHQ6IHNlbGYuX29wdGlvbnNIZWlnaHQgKyAncHgnLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgekluZGV4OiAxMFxuICAgICAgICAvLyB0b3A6IHlQb3MgKyAncHgnLFxuICAgICAgICAvLyBsZWZ0OiB4UG9zICsgJ3B4JyxcbiAgICB9KTtcblxuICAgIHNlbGYuaGlkZU9wdGlvbnMoKTtcbiAgICBsaXN0LmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2NsaWNrJzoge3N1YnNjcmliZXI6IG9uTGlzdENsaWNrLCBjb250ZXh0OiBzZWxmfSxcbiAgICAgICAgJ3Njcm9sbCc6IHtzdWJzY3JpYmVyOiBvbkxpc3RTY3JvbGwsIGNvbnRleHQ6IHNlbGZ9XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0dXAgdGhlIGlucHV0IGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gaW5wdXRcbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvSW5wdXQoaW5wdXQsIHNlbGYpIHtcbiAgICBpbnB1dC5ldmVudHMub25jZSgnZm9jdXMnLCBmdW5jdGlvbigpe1xuICAgICAgICBpbnB1dC5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uRGF0YUNoYW5nZSwgY29udGV4dDogc2VsZiB9KTtcbiAgICAgICAgaW5wdXQuZXZlbnRzLm9uKCdjbGljaycsIHtzdWJzY3JpYmVyOiBvbklucHV0Q2xpY2ssIGNvbnRleHQ6IHNlbGYgfSk7XG4gICAgICAgIGlucHV0LmV2ZW50cy5vbigna2V5ZG93bicsIHtzdWJzY3JpYmVyOiBvbkVudGVyS2V5LCBjb250ZXh0OiBzZWxmIH0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFNldHVwIHRoZSBidXR0b25cbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gYnRuXG4gKiBAcGFyYW0gIHtDb21wb25lbnR9IHNlbGZcbiAqL1xuZnVuY3Rpb24gc2V0dXBDb21ib0J0bihidG4sIHNlbGYpIHtcbiAgICBidG4uZXZlbnRzLm9uKCdjbGljaycsIHsgc3Vic2NyaWJlcjogb25BZGRCdG4sIGNvbnRleHQ6IHNlbGYgfSk7XG59XG5cblxuLyoqXG4gKiBDdXN0b20gZGF0YSBmYWNldCBnZXQgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ib19nZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZGF0YSBmYWNldCBzZXQgbWV0aG9kXG4gKiBAcGFyYW0ge1ZhcmlhYmxlfSBvYmpcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX3NldChvYmopIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBvYmo7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLnNldChvYmogJiYgb2JqLmxhYmVsKTtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdoaWRlT3B0aW9ucycpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IGRlbCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX2RlbCgpIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBudWxsO1xuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5zZXQoJycpO1xufVxuXG5cbi8qKlxuICogSW5wdXQgZGF0YSBjaGFuZ2UgaGFuZGxlclxuICogV2hlbiB0aGUgaW5wdXQgZGF0YSBjaGFuZ2VzLCB0aGlzIG1ldGhvZCBmaWx0ZXJzIHRoZSBvcHRpb25zRGF0YSwgYW5kIHNldHMgdGhlIGZpcnN0IGVsZW1lbnRcbiAqIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtICB7U3RyaW5nfSBtc2dcbiAqIEBwYXJhbSAge09iamV4dH0gZGF0YVxuICovXG5mdW5jdGlvbiBvbkRhdGFDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdmFyIHRleHQgPSBkYXRhLm5ld1ZhbHVlICYmIGRhdGEubmV3VmFsdWUudHJpbSgpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zVVJMKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgX2dldE9wdGlvbnNVUkwuY2FsbCh0aGlzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlRGF0YSl7XG4gICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXNwb25zZURhdGEpIHJldHVybjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSByZXNwb25zZURhdGEuZGF0YS5tYXAoc2VsZi5fZm9ybWF0T3B0aW9uc1VSTCk7XG4gICAgICAgICAgICAgICAgc2VsZi5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uLmNhbGwoc2VsZiwgdGV4dCwgc2VsZi5fb3B0aW9uc0RhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdEYXRhIGVycm9yJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmaWx0ZXJlZERhdGEgPSBfZmlsdGVyRGF0YS5jYWxsKHRoaXMsIHRleHQpO1xuICAgICAgICBfdXBkYXRlT3B0aW9uc0FuZEFkZEJ1dHRvbi5jYWxsKHRoaXMsIHRleHQsIGZpbHRlcmVkRGF0YSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9maWx0ZXJEYXRhKHRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0RhdGEuZmlsdGVyKGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICBkZWxldGUgb3B0aW9uLnNlbGVjdGVkO1xuICAgICAgICBpZiAob3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRleHQudG9Mb3dlckNhc2UoKSkgPT0gMDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uKHRleHQsIGZpbHRlcmVkQXJyKSB7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmxlbmd0aCAmJiBfLmZpbmQoZmlsdGVyZWRBcnIsIGlzRXhhY3RNYXRjaCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYWRkSXRlbVByb21wdCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24odGhpcy5fb3B0aW9uc0RhdGEubGVuZ3RoID4gMSB8fCB0aGlzLl9vcHRpb25zVVJMKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJlZEFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgICAgIGZpbHRlcmVkQXJyWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZmlsdGVyZWRBcnJbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXJlZEFycik7XG4gICAgdGhpcy5fY29tYm9MaXN0LmVsLnNjcm9sbFRvcCA9IDA7XG5cbiAgICBmdW5jdGlvbiBpc0V4YWN0TWF0Y2goaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgbWFwIG9mIGtleUNvZGVzIHRvIGRpcmVjdGlvbnNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBkaXJlY3Rpb25NYXAgPSB7ICc0MCc6IDEsICczOCc6IC0xIH07XG5cbi8qKlxuICogTGlzdCBrZXlkb3duIGhhbmRsZXJcbiAqIENoYW5nZXMgdGhlIHNlbGVjdGVkIGxpc3QgaXRlbSBieSBmaW5kaW5nIHRoZSBhZGphY2VudCBpdGVtIGFuZCBzZXR0aW5nIGl0IHRvIHNlbGVjdGVkLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGNoYW5nZVNlbGVjdGVkKHR5cGUsIGV2ZW50KSB7XG4gICAgLy9UT0RPIHRlc3QgbW9jaGFcbiAgICB2YXIgZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW2V2ZW50LmtleUNvZGVdO1xuXG4gICAgaWYoZGlyZWN0aW9uKVxuICAgICAgICBfY2hhbmdlU2VsZWN0ZWQuY2FsbCh0aGlzLCBkaXJlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBfY2hhbmdlU2VsZWN0ZWQoZGlyZWN0aW9uKSB7XG4gICAgLy8gVE9ETzogcmVmYWN0b3IgYW5kIHRpZHkgdXAsIGxvb2tzIGxpa2Ugc29tZSBjb2RlIGR1cGxpY2F0aW9uLlxuICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJylbMF1cbiAgICAgICAgLCBzY3JvbGxQb3MgPSB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wXG4gICAgICAgICwgc2VsZWN0ZWRQb3MgPSBzZWxlY3RlZCA/IHNlbGVjdGVkLm9mZnNldFRvcCA6IDBcbiAgICAgICAgLCByZWxhdGl2ZVBvcyA9IHNlbGVjdGVkUG9zIC0gc2Nyb2xsUG9zO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHZhciBpbmRleCA9IF9nZXREYXRhVmFsdWVGcm9tRWxlbWVudC5jYWxsKHRoaXMsIHNlbGVjdGVkKVxuICAgICAgICAgICAgLCB0aGlzSXRlbSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXhdXG4gICAgICAgICAgICAsIGFkakl0ZW0gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhW2luZGV4ICsgZGlyZWN0aW9uXTtcblxuICAgICAgICBpZiAoYWRqSXRlbSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXNJdGVtLnNlbGVjdGVkO1xuICAgICAgICAgICAgYWRqSXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGFkakl0ZW07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWxhdGl2ZVBvcyA+IHRoaXMuX29wdGlvbnNIZWlnaHQgLSB0aGlzLl9lbGVtZW50SGVpZ2h0KjIgJiYgZGlyZWN0aW9uID09PSAxKVxuICAgICAgICB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wICs9IHRoaXMuX2VsZW1lbnRIZWlnaHQqZGlyZWN0aW9uKjU7XG5cbiAgICBpZiAocmVsYXRpdmVQb3MgPCB0aGlzLl9lbGVtZW50SGVpZ2h0ICYmIGRpcmVjdGlvbiA9PT0gLTEpXG4gICAgICAgIHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3AgKz0gdGhpcy5fZWxlbWVudEhlaWdodCpkaXJlY3Rpb24qNTtcbn1cblxuXG4vKipcbiAqIE1vdXNlIG92ZXIgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTW91c2VPdmVyKHR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5fbW91c2VJc092ZXIgPSB0cnVlO1xufVxuXG5cbi8qKlxuICogTW91c2UgbGVhdmUgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTW91c2VMZWF2ZSh0eXBlLCBldmVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9tb3VzZUlzT3ZlciA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9tb3VzZU91dFRpbWVyKSBjbGVhckludGVydmFsKHRoaXMuX21vdXNlT3V0VGltZXIpO1xuICAgIHRoaXMuX21vdXNlT3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICghc2VsZi5fbW91c2VJc092ZXIpXG4gICAgICAgICAgICBfb25Nb3VzZUxlYXZlLmNhbGwoc2VsZik7XG4gICAgfSwgNzUwKTtcbn1cblxuZnVuY3Rpb24gX29uTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbn1cblxuXG4vKipcbiAqIElucHV0IGNsaWNrIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbklucHV0Q2xpY2sodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgaWYgKHRoaXMuX19zaG93QWRkT25DbGljaykgdGhpcy50b2dnbGVBZGRCdXR0b24odHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBFbnRlciBrZXkgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uRW50ZXJLZXkodHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpXG4gICAgICAgICAgICBfc2V0RGF0YS5jYWxsKHRoaXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZGQgYnV0dG9uIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkFkZEJ0biAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgZGF0YSA9IHsgbGFiZWw6IHRoaXMuX2NvbWJvSW5wdXQuZWwudmFsdWUgfTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCdhZGRpdGVtJywgZGF0YSk7XG4gICAgdGhpcy5ldmVudHMucG9zdE1lc3NhZ2UoJ21pbG9fc3VwZXJjb21ib2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSwgeyBwcmVzZXJ2ZVN0YXRlOiB0cnVlIH0pO1xuXG59XG5cbi8qKlxuICogTGlzdCBjbGljayBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25MaXN0Q2xpY2sgKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIGluZGV4ID0gX2dldERhdGFWYWx1ZUZyb21FbGVtZW50LmNhbGwodGhpcywgZXZlbnQudGFyZ2V0KTtcbiAgICB2YXIgZGF0YSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXhdO1xuXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBkYXRhO1xuICAgIF9zZXREYXRhLmNhbGwodGhpcyk7XG4gICAgdGhpcy51cGRhdGUoKTtcbn1cblxuXG4vKipcbiAqIExpc3Qgc2Nyb2xsIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkxpc3RTY3JvbGwgKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNjcm9sbFBvcyA9IGV2ZW50LnRhcmdldC5zY3JvbGxUb3BcbiAgICAgICAgLCBkaXJlY3Rpb24gPSBzY3JvbGxQb3MgPiB0aGlzLl9sYXN0U2Nyb2xsUG9zID8gJ2Rvd24nIDogJ3VwJ1xuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzLl9jb21ib09wdGlvbnMuZWwubGFzdEVsZW1lbnRDaGlsZFxuICAgICAgICAsIGxhc3RDaGlsZCA9IHRoaXMuX2NvbWJvT3B0aW9ucy5lbC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgICAsIGxhc3RFbFBvc2l0aW9uID0gZmlyc3RDaGlsZCA/IGZpcnN0Q2hpbGQub2Zmc2V0VG9wIDogMFxuICAgICAgICAsIGZpcnN0RWxQb3NpdGlvbiA9IGxhc3RDaGlsZCA/IGxhc3RDaGlsZC5vZmZzZXRUb3AgOiAwXG4gICAgICAgICwgZGlzdEZyb21MYXN0RWwgPSBsYXN0RWxQb3NpdGlvbiAtIHNjcm9sbFBvcyAtIHRoaXMuX29wdGlvbnNIZWlnaHQgKyB0aGlzLl9lbGVtZW50SGVpZ2h0XG4gICAgICAgICwgZGlzdEZyb21GaXJzdEVsID0gc2Nyb2xsUG9zIC0gZmlyc3RFbFBvc2l0aW9uXG4gICAgICAgICwgZWxzRnJvbVN0YXJ0ID0gTWF0aC5mbG9vcihkaXN0RnJvbUZpcnN0RWwgLyB0aGlzLl9lbGVtZW50SGVpZ2h0KVxuICAgICAgICAsIGVsc1RvVGhlRW5kID0gTWF0aC5mbG9vcihkaXN0RnJvbUxhc3RFbCAvIHRoaXMuX2VsZW1lbnRIZWlnaHQpXG4gICAgICAgICwgdG90YWxFbGVtZW50c0JlZm9yZSA9IE1hdGguZmxvb3Ioc2Nyb2xsUG9zIC8gdGhpcy5fZWxlbWVudEhlaWdodCkgLSBCVUZGRVI7XG5cbiAgICBpZiAoKGRpcmVjdGlvbiA9PSAnZG93bicgJiYgZWxzVG9UaGVFbmQgPCBCVUZGRVIpXG4gICAgICAgIHx8IChkaXJlY3Rpb24gPT0gJ3VwJyAmJiBlbHNGcm9tU3RhcnQgPCBCVUZGRVIpKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0SW5kZXggPSB0b3RhbEVsZW1lbnRzQmVmb3JlID4gMCA/IHRvdGFsRWxlbWVudHNCZWZvcmUgOiAwO1xuICAgICAgICB0aGlzLl9lbmRJbmRleCA9IHRvdGFsRWxlbWVudHNCZWZvcmUgKyBNQVhfUkVOREVSRUQ7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRIZWlnaHQgPSBmaXJzdENoaWxkLnN0eWxlLmhlaWdodDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFNjcm9sbFBvcyA9IHNjcm9sbFBvcztcbn1cblxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgdGhlIGRhdGEtdmFsdWUgYXR0cmlidXRlIHZhbHVlIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgaXQgYXMgYW4gaW5kZXggb2ZcbiAqIHRoZSBmaWx0ZXJlZE9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBfZ2V0RGF0YVZhbHVlRnJvbUVsZW1lbnQoZWwpIHtcbiAgICByZXR1cm4gTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSArIHRoaXMuX3N0YXJ0SW5kZXg7XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RcbiAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIFN1cGVyQ29tYm8sIHRha2luZyBjYXJlIHRvIHJlc2V0IHNvbWUgdGhpbmdzIGFuZCB0ZW1wb3JhcmlseVxuICogdW5zdWJzY3JpYmUgZGF0YSBsaXN0ZW5lcnMuXG4gKi9cbmZ1bmN0aW9uIF9zZXREYXRhKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zZWxlY3RlZC5zZWxlY3RlZDtcbiAgICB0aGlzLmhpZGVPcHRpb25zKCk7XG4gICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UpO1xuICAgIHRoaXMuX2NvbWJvSW5wdXQuZGF0YS5vZmYoJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vc3VwZXJjb21ibyBsaXN0ZW5lcnMgb2ZmXG4gICAgdGhpcy5kYXRhLnNldCh0aGlzLl9zZWxlY3RlZCk7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19DSEFOR0VfTUVTU0FHRSk7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9uKCcnLCB7IHN1YnNjcmliZXI6IG9uRGF0YUNoYW5nZSwgY29udGV4dDogdGhpcyB9KTtcbiAgICAvL3N1cGVyY29tYm8gbGlzdGVuZXJzIG9uXG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKHRoaXMuX29wdGlvbnNEYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTFRleHQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MVGV4dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRleHQnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUZXh0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFRleHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgTUxUZXh0YXJlYSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxUZXh0YXJlYScsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRleHRhcmVhJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MVGV4dGFyZWEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGV4dGFyZWE7XG5cblxudmFyIFNBTVBMRV9BVVRPUkVTSVpFX1RFWFQgPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQsJztcblxuXG5fLmV4dGVuZFByb3RvKE1MVGV4dGFyZWEsIHtcbiAgICBzdGFydEF1dG9yZXNpemU6IE1MVGV4dGFyZWEkc3RhcnRBdXRvcmVzaXplLFxuICAgIHN0b3BBdXRvcmVzaXplOiBNTFRleHRhcmVhJHN0b3BBdXRvcmVzaXplLFxuICAgIGlzQXV0b3Jlc2l6ZWQ6IE1MVGV4dGFyZWEkaXNBdXRvcmVzaXplZCxcbiAgICBkaXNhYmxlOiBNTFRleHRhcmVhJGRpc2FibGVcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkc3RhcnRBdXRvcmVzaXplKG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5fYXV0b3Jlc2l6ZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTFRleHRhcmVhIHN0YXJ0QXV0b3Jlc2l6ZTogYXV0b3Jlc2l6ZSBpcyBhbHJlYWR5IG9uJyk7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZSA9IHRydWU7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgX2FkanVzdEFyZWFIZWlnaHQuY2FsbCh0aGlzKTtcbiAgICBfbWFuYWdlU3Vic2NyaXB0aW9ucy5jYWxsKHRoaXMsICdvbicpO1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VTdWJzY3JpcHRpb25zKG9uT2ZmKSB7XG4gICAgdGhpcy5ldmVudHNbb25PZmZdKCdjbGljaycsIHsgc3Vic2NyaWJlcjogX2FkanVzdEFyZWFIZWlnaHQsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgdGhpcy5kYXRhW29uT2ZmXSgnJywgeyBzdWJzY3JpYmVyOiBfYWRqdXN0QXJlYUhlaWdodCwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBfYWRqdXN0QXJlYUhlaWdodCgpIHtcbiAgICB0aGlzLmVsLnN0eWxlLmhlaWdodCA9IDA7XG5cbiAgICB2YXIgbmV3SGVpZ2h0ID0gdGhpcy5lbC5zY3JvbGxIZWlnaHRcbiAgICAgICAgLCBtaW5IZWlnaHQgPSB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucy5taW5IZWlnaHRcbiAgICAgICAgLCBtYXhIZWlnaHQgPSB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucy5tYXhIZWlnaHQ7XG5cbiAgICBuZXdIZWlnaHQgPSBuZXdIZWlnaHQgPj0gbWF4SGVpZ2h0XG4gICAgICAgICAgICAgICAgPyBtYXhIZWlnaHRcbiAgICAgICAgICAgICAgICA6IG5ld0hlaWdodCA8PSBtaW5IZWlnaHRcbiAgICAgICAgICAgICAgICA/IG1pbkhlaWdodFxuICAgICAgICAgICAgICAgIDogbmV3SGVpZ2h0O1xuXG4gICAgdGhpcy5lbC5zdHlsZS5oZWlnaHQgPSBuZXdIZWlnaHQgKyAncHgnO1xufVxuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkc3RvcEF1dG9yZXNpemUoKSB7XG4gICAgaWYgKCEgdGhpcy5fYXV0b3Jlc2l6ZSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTFRleHRhcmVhIHN0b3BBdXRvcmVzaXplOiBhdXRvcmVzaXplIGlzIG5vdCBvbicpO1xuICAgIHRoaXMuX2F1dG9yZXNpemUgPSBmYWxzZTtcbiAgICBfbWFuYWdlU3Vic2NyaXB0aW9ucy5jYWxsKHRoaXMsICdvZmYnKTtcbn1cblxuXG5mdW5jdGlvbiBNTFRleHRhcmVhJGlzQXV0b3Jlc2l6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9yZXNpemU7XG59XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICB0aGlzLnN0b3BBdXRvcmVzaXplKCk7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxUaW1lID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFRpbWUnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MVGltZV9nZXQsXG4gICAgICAgIHNldDogTUxUaW1lX3NldCxcbiAgICAgICAgZGVsOiBNTFRpbWVfZGVsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXRpbWUnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUaW1lKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFRpbWU7XG5cblxudmFyIFRJTUVfUkVHRVggPSAvXihbMC05XXsxLDJ9KSg/OlxcOnxcXC4pKFswLTldezEsMn0pJC9cbiAgICAsIFRJTUVfVEVNUExBVEUgPSAnaGg6bW0nO1xuXG5mdW5jdGlvbiBNTFRpbWVfZ2V0KCkge1xuICAgIHZhciB0aW1lU3RyID0gdGhpcy5lbC52YWx1ZTtcbiAgICB2YXIgbWF0Y2ggPSB0aW1lU3RyLm1hdGNoKFRJTUVfUkVHRVgpO1xuICAgIGlmICghIG1hdGNoKSByZXR1cm47XG4gICAgdmFyIGhvdXJzID0gbWF0Y2hbMV1cbiAgICAgICAgLCBtaW5zID0gbWF0Y2hbMl07XG4gICAgaWYgKGhvdXJzID4gMjMgfHwgbWlucyA+IDU5KSByZXR1cm47XG4gICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgxOTcwLCAwLCAxLCBob3VycywgbWlucyk7XG5cbiAgICByZXR1cm4gXy50b0RhdGUodGltZSk7XG59XG5cblxuZnVuY3Rpb24gTUxUaW1lX3NldCh2YWx1ZSkge1xuICAgIHZhciB0aW1lID0gXy50b0RhdGUodmFsdWUpO1xuICAgIGlmICghIHRpbWUpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRpbWVTdHIgPSBUSU1FX1RFTVBMQVRFXG4gICAgICAgICAgICAucmVwbGFjZSgnaGgnLCBwYWQodGltZS5nZXRIb3VycygpKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCdtbScsIHBhZCh0aW1lLmdldE1pbnV0ZXMoKSkpO1xuXG4gICAgdGhpcy5lbC52YWx1ZSA9IHRpbWVTdHI7XG4gICAgcmV0dXJuIHRpbWVTdHI7XG5cbiAgICBmdW5jdGlvbiBwYWQobikge3JldHVybiBuIDwgMTAgPyAnMCcgKyBuIDogbjsgfVxufVxuXG5cbmZ1bmN0aW9uIE1MVGltZV9kZWwoKSB7XG4gICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MV3JhcHBlciA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxXcmFwcGVyJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktd3JhcHBlcidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFdyYXBwZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MV3JhcHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIEFMRVJUX0NTU19DTEFTU0VTID0ge1xuICAgIHN1Y2Nlc3M6ICdhbGVydC1zdWNjZXNzJyxcbiAgICB3YXJuaW5nOiAnYWxlcnQtd2FybmluZycsXG4gICAgaW5mbzogJ2FsZXJ0LWluZm8nLFxuICAgIGRhbmdlcjogJ2FsZXJ0LWRhbmdlcicsXG4gICAgZml4ZWQ6ICdhbGVydC1maXhlZCdcbn07XG5cblxudmFyIE1MQWxlcnQgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQWxlcnQnLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogWydtbC1icy1hbGVydCcsICdhbGVydCcsICdmYWRlJ10sXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdyb2xlJzogJ2FsZXJ0JyxcbiAgICAgICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICB7ez8gaXQuY2xvc2UgfX1cXFxuICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJhbGVydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cXFxuICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAge3s9IGl0Lm1lc3NhZ2V9fSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEFsZXJ0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEFsZXJ0O1xuXG5cbl8uZXh0ZW5kKE1MQWxlcnQsIHtcbiAgICBjcmVhdGVBbGVydDogTUxBbGVydCQkY3JlYXRlQWxlcnQsXG4gICAgb3BlbkFsZXJ0OiBNTEFsZXJ0JCRvcGVuQWxlcnQsXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MQWxlcnQsIHtcbiAgICBvcGVuQWxlcnQ6IE1MQWxlcnQkb3BlbkFsZXJ0LFxuICAgIGNsb3NlQWxlcnQ6IE1MQWxlcnQkY2xvc2VBbGVydFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGFsZXJ0IGluc3RhbmNlLiBUbyBjcmVhdGUgYW5kIG9wZW4gYXQgdGhlIHNhbWUgdGltZSB1c2UgW29wZW5BbGVydF0oI01MQWxlcnQkJG9wZW5BbGVydClcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgICBtZXNzYWdlOiBzdHJpbmcgYWxlcnQgbWVzc2FnZVxuICogICAgICB0eXBlOiAgICBvcHRpb25hbCBzdHJpbmcgdGhlIHR5cGUgb2YgYWxlcnQgbWVzc2FnZSwgb25lIG9mIHN1Y2Nlc3MsIHdhcm5pbmcsIGluZm8sIGRhbmdlciwgZml4ZWRcbiAqICAgICAgICAgICAgICAgZGVmYXVsdCAnaW5mbydcbiAqICAgICAgY2xvc2U6ICAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB1c2VyIGZyb20gY2xvc2luZ1xuICogICAgICAgICAgICAgICBvciB0cnVlIChkZWZhdWx0KSB0byBlbmFibGUgY2xvc2luZyBhbmQgcmVuZGVyIGEgY2xvc2UgYnV0dG9uXG4gKiAgICAgIHRpbWVvdXQ6IG9wdGlvbmFsIHRpbWVyLCBpbiBtaWxsaXNlY29uZHMgdG8gYXV0b21hdGljYWxseSBjbG9zZSB0aGUgYWxlcnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhbGVydCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIE1MQWxlcnQkJGNyZWF0ZUFsZXJ0KG9wdGlvbnMpIHtcbiAgICBjaGVjayhvcHRpb25zLCB7XG4gICAgICAgIG1lc3NhZ2U6IFN0cmluZyxcbiAgICAgICAgdHlwZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLFxuICAgICAgICB0aW1lb3V0OiBNYXRjaC5PcHRpb25hbChOdW1iZXIpXG4gICAgfSk7XG5cbiAgICB2YXIgYWxlcnQgPSBNTEFsZXJ0LmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIHZhciBhbGVydENscyA9IEFMRVJUX0NTU19DTEFTU0VTW29wdGlvbnMudHlwZV07XG4gICAgYWxlcnQuZG9tLmFkZENzc0NsYXNzZXMoYWxlcnRDbHMpO1xuXG4gICAgYWxlcnQuX2FsZXJ0ID0ge1xuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH07XG5cbiAgICBhbGVydC50ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucykuYmluZGVyKCk7XG5cbiAgICB2YXIgYWxlcnRTY29wZSA9IGFsZXJ0LmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlKVxuICAgICAgICBhbGVydFNjb3BlLmNsb3NlQnRuLmV2ZW50cy5vbignY2xpY2snLFxuICAgICAgICAgICAgeyBzdWJzY3JpYmVyOiBfb25DbG9zZUJ0bkNsaWNrLCBjb250ZXh0OiBhbGVydCB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQpXG4gICAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKGFsZXJ0Ll9hbGVydC52aXNpYmxlKVxuICAgICAgICAgICAgICAgIGFsZXJ0LmNsb3NlQWxlcnQoKTtcbiAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcblxuICAgIHJldHVybiBhbGVydDtcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBhbGVydCBwb3B1cFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG9iamVjdCB3aXRoIG1lc3NhZ2UsIHR5cGUsIGNsb3NlIGFuZCB0aW1lb3V0XG4gKiBAcmV0dXJuIHtNTEFsZXJ0fSB0aGUgYWxlcnQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCQkb3BlbkFsZXJ0KG9wdGlvbnMpIHtcbiAgICB2YXIgYWxlcnQgPSBNTEFsZXJ0LmNyZWF0ZUFsZXJ0KG9wdGlvbnMpO1xuICAgIGFsZXJ0Lm9wZW5BbGVydCgpO1xuICAgIHJldHVybiBhbGVydDtcbn1cblxuXG5mdW5jdGlvbiBfb25DbG9zZUJ0bkNsaWNrKHR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5jbG9zZUFsZXJ0KCk7XG59XG5cblxuZnVuY3Rpb24gX3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gXy5jbG9uZShvcHRpb25zKTtcbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPSBNYXRoLmZsb29yKG9wdGlvbnMudGltZW91dCk7XG4gICAgb3B0aW9ucy50eXBlID0gb3B0aW9ucy50eXBlIHx8ICdpbmZvJztcblxuICAgIHJldHVybiBvcHRpb25zO1xufVxuXG5cbi8qKlxuICogT3BlbiB0aGUgYWxlcnRcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCRvcGVuQWxlcnQoKSB7XG4gICAgX3RvZ2dsZUFsZXJ0LmNhbGwodGhpcywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBDbG9zZSB0aGUgYWxlcnRcbiAqL1xuZnVuY3Rpb24gTUxBbGVydCRjbG9zZUFsZXJ0KCkge1xuICAgIF90b2dnbGVBbGVydC5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbn1cblxuXG5mdW5jdGlvbiBfdG9nZ2xlQWxlcnQoZG9TaG93KSB7XG4gICAgZG9TaG93ID0gdHlwZW9mIGRvU2hvdyA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gISB0aGlzLl9hbGVydC52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB2YXIgYWRkUmVtb3ZlID0gZG9TaG93ID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgICAgICAsIGFwcGVuZFJlbW92ZSA9IGRvU2hvdyA/ICdhcHBlbmRDaGlsZCcgOiAncmVtb3ZlQ2hpbGQnO1xuXG4gICAgdGhpcy5fYWxlcnQudmlzaWJsZSA9IGRvU2hvdztcblxuICAgIGRvY3VtZW50LmJvZHlbYXBwZW5kUmVtb3ZlXSh0aGlzLmVsKTtcbiAgICB0aGlzLmRvbS50b2dnbGUoZG9TaG93KTtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAhZG9TaG93KTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdFthZGRSZW1vdmVdKCdpbicpO1xuICAgIHRoaXMuZWxbZG9TaG93ID8gJ2ZvY3VzJyA6ICdibHVyJ10oKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uLy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vLi4vY19yZWdpc3RyeScpXG4gICAgLCBjb21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIERFRkFVTFRfQlVUVE9OUyA9IFsgeyB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnT0snLCByZXN1bHQ6ICdPSycgfSBdO1xuXG52YXIgQ0xPU0VfT1BUSU9OUyA9IFsnYmFja2Ryb3AnLCAna2V5Ym9hcmQnLCAnYnV0dG9uJ107XG5cbnZhciBCVVRUT05fQ1NTX0NMQVNTRVMgPSB7IC8vIFRPRE8gLSB1c2UgaW4gdGVtcGxhdGVcbiAgICBkZWZhdWx0OiAnYnRuLWRlZmF1bHQnLFxuICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG4gICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcbiAgICBpbmZvOiAnYnRuLWluZm8nLFxuICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXG4gICAgZGFuZ2VyOiAnYnRuLWRhbmdlcicsXG4gICAgbGluazogJ2J0bi1saW5rJ1xufTtcblxuXG4vKipcbiAqIERpYWxvZyBjbGFzcyB0byBzaG93IGN1c3RvbSBkaWFsb2cgYm94ZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiAtIHNlZSBbY3JlYXRlRGlhbG9nXSgjTUxEaWFsb2ckJGNyZWF0ZURpYWxvZykgbWV0aG9kLlxuICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgYSB0aW1lIC0gdHJ5aW5nIHRvIG9wZW4gYW5vdGhlciB3aWxsIGxvZyBlcnJvciB0byBjb25zb2xlLiBDdXJyZW50bHkgb3BlbmVkIGRpYWxvZyBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIFtnZXRDdXJyZW50RGlhbG9nXSgjTUxEaWFsb2ckJGdldEN1cnJlbnREaWFsb2cpIGNsYXNzIG1ldGhvZC5cbiAqL1xudmFyIE1MRGlhbG9nID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERpYWxvZycsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWRpYWxvZycsICdtb2RhbCcsICdmYWRlJ10sXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdyb2xlJzogJ2RpYWxvZycsXG4gICAgICAgICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZSdcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICdcXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxcXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQudGl0bGUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0LmNsb3NlLmJ1dHRvbiB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIj4mdGltZXM7PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57ez0gaXQudGl0bGUgfX08L2g0PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5odG1sIHx8IGl0LnRleHQgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBtbC1iaW5kPVwiW2NvbnRhaW5lcl06ZGlhbG9nQm9keVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0Lmh0bWwgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQuaHRtbCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3s9IGl0LnRleHQgfX08L3A+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5idXR0b25zICYmIGl0LmJ1dHRvbnMubGVuZ3RoIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5idXR0b25zIDpidG4gfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4te3s9IGJ0bi50eXBlIH19e3s/IGJ0bi5jbHMgfX0ge3s9IGJ0bi5jbHMgfX17ez99fVwiXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLWJpbmQ9XCJbZXZlbnRzXTp7ez0gYnRuLm5hbWUgfX1cIj57ez0gYnRuLmxhYmVsIH19PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e359fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERpYWxvZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEaWFsb2c7XG5cblxuXy5leHRlbmQoTUxEaWFsb2csIHtcbiAgICBjcmVhdGVEaWFsb2c6IE1MRGlhbG9nJCRjcmVhdGVEaWFsb2csXG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckJG9wZW5EaWFsb2csXG4gICAgZ2V0T3BlbmVkRGlhbG9nOiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MRGlhbG9nLCB7XG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckb3BlbkRpYWxvZyxcbiAgICBjbG9zZURpYWxvZzogTUxEaWFsb2ckY2xvc2VEaWFsb2csXG4gICAgZGVzdHJveTogTUxEaWFsb2ckZGVzdHJveVxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGRpYWxvZyBpbnN0YW5jZS4gVG8gY3JlYXRlIGFuZCBvcGVuIGF0IHRoZSBzYW1lIHRpbWUgW29wZW5EaWFsb2ddKCNNTERpYWxvZyQkb3BlbkRpYWxvZylcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgIHRpdGxlOiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcbiAqICAgICBodG1sOiBvcHRpb25hbCBkaWFsb2cgdGV4dCBhcyBodG1sICh3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRleHQgaWYgYm90aCB0ZXh0IG5kIGh0bWwgYXJlIHBhc3NlZClcbiAqICAgICAgIG9yXG4gKiAgICAgdGV4dDogb3B0aW9uYWwgZGlhbG9nIHRleHRcbiAqICAgICBjbG9zZTogb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBiYWNrZHJvcCBhbmQgZXNjIGtleSBmcm9tIGNsb3NpbmcgdGhlIGRpYWxvZyBhbmQgcmVtb3ZpbmcgY2xvc2UgYnV0dG9uIGluIHRvcCByaWdodCBjb3JuZXJcbiAqICAgICAgICAgICAgb3IgdHJ1ZSAoZGVmYXVsdCkgdG8gZW5hYmxlIGFsbCBjbG9zZSBvcHRpb25zXG4gKiAgICAgICAgICAgIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAqICAgICAgICAgYmFja2Ryb3A6IGZhbHNlIG9yIHRydWUgKGRlZmF1bHQpLCBjbG9zZSBkaWFsb2cgd2hlbiBiYWNrZHJvcCBjbGlja2VkXG4gKiAgICAgICAgIGtleWJvYXJkOiBmYWxzZSBvciB0cnVlIChkZWZhdWx0KSwgY2xvc2UgZGlhbG9nIHdoZW4gZXNjIGtleSBpcyBwcmVzc2VkXG4gKiAgICAgICAgIGJ1dHRvbjogZmFsc2Ugb3IgdHJ1ZSAoZGVmYXVsdCksIHNob3cgY2xvc2UgYnV0dG9uIGluIHRoZSBoZWFkZXIgKHdvbid0IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGhlYWRlciB3aGVuIHRpdGxlIGlzIG5vdCBwYXNzZWQpXG4gKiAgICAgYnV0dG9uczogb3B0aW9uYWwgYXJyYXkgb2YgYnV0dG9ucyBjb25maWd1cmF0aW9ucywgd2hlcmUgZWFjaCBidXR0b24gY29uZmlnIGlzIGFuIG9iamVjdFxuICogICAgICAgICBuYW1lOiAgIG9wdGlvbmFsIG5hbWUgb2YgY29tcG9uZW50LCBzaG91bGQgYmUgdW5pcXVlIGFuZCBzaG91bGQgbm90IGJlIGBjbG9zZUJ0bmAsIGlmIG5vdCBwYXNzZWQgYSB0aW1lc3RhbXAgYmFzZWQgbmFtZSB3aWxsIGJlIHVzZWRcbiAqICAgICAgICAgdHlwZTogICBidXR0b24gdHlwZSwgd2lsbCBkZXRlcm1pbmUgYnV0dG9uIENTUyBzdHlsZS4gUG9zc2libGUgdHlwZXMgYXJlOiBkZWZ1bHQsIHByaW1hcnksIHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcsIGRhbmdlciwgbGluayAobWFwIHRvIHJlbGF0ZWQgYm9vdHN0cmFwIGJ1dHRvbiBzdHlsZXMpXG4gKiAgICAgICAgIGxhYmVsOiAgYnV0dG9uIGxhYmVsXG4gKiAgICAgICAgIGNsb3NlOiAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB0aGlzIGJ1dHRvbiBmcm9tIGNsb3NpbmcgZGlhbG9nXG4gKiAgICAgICAgIHJlc3VsdDogc3RyaW5nIHdpdGggZGlhbG9nIGNsb3NlIHJlc3VsdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGRpYWxvZyBzdWJzY3JpYmVyIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAqICAgICAgICAgZGF0YTogICBhbnkgdmFsdWUvb2JqZWN0IG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZGlhbG9nIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gKiAgICAgICAgICAgICAgICAgSWYgZnVuY3Rpb24gaXMgcGFzc2VkIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggZGlhbG9nIGFzIGNvbnRleHQgYW5kIGJ1dHRvbiBvcHRpb25zIGFzIHBhcmFtZXRlci5cbiAqXG4gKiAgICAgSWYgYHRpdGxlYCBpcyBub3QgcGFzc2VkLCBkaWFsb2cgd2lsbCBub3QgaGF2ZSB0aXRsZSBzZWN0aW9uICAgXG4gKiAgICAgSWYgbmVpdGhlciBgdGV4dGAgbm9yIGBodG1sYCBpcyBwYXNzZWQsIGRpYWxvZyB3aWxsIG5vdCBoYXZlIGJvZHkgc2VjdGlvbi5cbiAqICAgICBJZiBgYnV0dG9uc2AgYXJlIG5vdCBwYXNzZWQsIHRoZXJlIHdpbGwgb25seSBiZSBPSyBidXR0b24uXG4gKlxuICogV2hlbiBkaWFsb2cgaXMgY2xvc2VkLCB0aGUgc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCByZWF1bHQgYW5kIG9wdGlvbmFsIGRhdGEgYXMgZGVmaW5lZCBpbiBidXR0b25zIGNvbmZpZ3VyYXRpb25zLlxuICogSWYgYmFja2Ryb3AgaXMgY2xpY2tlZCBvciBFU0Mga2V5IGlzIHByZXNzZWQgdGhlIHJlc3VsdCB3aWxsIGJlICdkaXNtaXNzZWQnXG4gKiBJZiBjbG9zZSBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgaXMgY2xpY2tlZCwgdGhlIHJlc3VsdCB3aWxsIGJlICdjbG9zZWQnIChkZWZhdWx0IHJlc3VsdClcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgZGlhbG9nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXRpYWxpemUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZGlhbG9nXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRjcmVhdGVEaWFsb2cob3B0aW9ucywgaW5pdGlhbGl6ZSkge1xuICAgIGNoZWNrKG9wdGlvbnMsIHtcbiAgICAgICAgdGl0bGU6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIGh0bWw6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIHRleHQ6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgIGNsb3NlOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihCb29sZWFuLCB7XG4gICAgICAgICAgICBiYWNrZHJvcDogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgICAgICBrZXlib2FyZDogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgICAgICBidXR0b246IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnV0dG9uczogTWF0Y2guT3B0aW9uYWwoWyB7XG4gICAgICAgICAgICBuYW1lOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgbGFiZWw6IFN0cmluZyxcbiAgICAgICAgICAgIGNsb3NlOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIHJlc3VsdDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgICAgIGRhdGE6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLkFueSksXG4gICAgICAgICAgICBjbHM6IE1hdGNoLk9wdGlvbmFsKFN0cmluZylcbiAgICAgICAgfSBdKVxuICAgIH0pO1xuXG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBkaWFsb2cuX2RpYWxvZyA9IHtcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgZGlhbG9nLnRlbXBsYXRlXG4gICAgICAgIC5yZW5kZXIob3B0aW9ucylcbiAgICAgICAgLmJpbmRlcigpO1xuXG4gICAgdmFyIGRpYWxvZ1Njb3BlID0gZGlhbG9nLmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlLmJhY2tkcm9wKVxuICAgICAgICBkaWFsb2cuZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkJhY2tkcm9wQ2xpY2ssIGNvbnRleHQ6IGRpYWxvZyB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpdGxlICYmIG9wdGlvbnMuY2xvc2UuYnV0dG9uKVxuICAgICAgICBkaWFsb2dTY29wZS5jbG9zZUJ0bi5ldmVudHMub24oJ2NsaWNrJyxcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlcjogX29uQ2xvc2VCdG5DbGljaywgY29udGV4dDogZGlhbG9nIH0pO1xuXG4gICAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIHZhciBidXR0b25TdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcjogXy5wYXJ0aWFsKF9kaWFsb2dCdXR0b25DbGljaywgYnRuKSxcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpYWxvZ1xuICAgICAgICB9O1xuICAgICAgICBkaWFsb2dTY29wZVtidG4ubmFtZV0uZXZlbnRzLm9uKCdjbGljaycsIGJ1dHRvblN1YnNjcmliZXIpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemUoZGlhbG9nKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIF9kaWFsb2dCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBpZiAoYnV0dG9uLmNsb3NlICE9PSBmYWxzZSlcbiAgICAgICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIHZhciBkYXRhID0gXy5yZXN1bHQoYnV0dG9uLmRhdGEsIHRoaXMsIGJ1dHRvbik7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgYnV0dG9uLnJlc3VsdCwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gX2Rpc3BhdGNoUmVzdWx0KHJlc3VsdCwgZGF0YSkge1xuICAgIHZhciBzdWJzY3JpYmVyID0gdGhpcy5fZGlhbG9nLnN1YnNjcmliZXI7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHN1YnNjcmliZXIuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xuICAgIGVsc2VcbiAgICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmVyLmNhbGwoc3Vic2NyaWJlci5jb250ZXh0LCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9vbkJhY2tkcm9wQ2xpY2soZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy5lbClcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygnZGlzbWlzc2VkJyk7XG59XG5cblxuZnVuY3Rpb24gX29uQ2xvc2VCdG5DbGljaygpIHtcbiAgICB0aGlzLmNsb3NlRGlhbG9nKCdjbG9zZWQnKTtcbn1cblxuXG5mdW5jdGlvbiBfb25LZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKG9wZW5lZERpYWxvZ1xuICAgICAgICAgICAgJiYgb3BlbmVkRGlhbG9nLl9kaWFsb2cub3B0aW9ucy5jbG9zZS5rZXlib2FyZFxuICAgICAgICAgICAgJiYgZXZlbnQua2V5Q29kZSA9PSAyNykgLy8gZXNjIGtleVxuICAgICAgICBvcGVuZWREaWFsb2cuY2xvc2VEaWFsb2coJ2Rpc21pc3NlZCcpO1xufVxuXG5cbmZ1bmN0aW9uIF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IF8uY2xvbmUob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5idXR0b25zID0gXy5jbG9uZShvcHRpb25zLmJ1dHRvbnMgfHwgREVGQVVMVF9CVVRUT05TKTtcbiAgICBvcHRpb25zLmJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLm5hbWUgPSBidG4ubmFtZSB8fCBjb21wb25lbnROYW1lKCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLm9iamVjdChDTE9TRV9PUFRJT05TLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXy5tYXBUb09iamVjdChDTE9TRV9PUFRJT05TLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihvcHQpIHsgcmV0dXJuIG9wdGlvbnMuY2xvc2Vbb3B0XSAhPT0gZmFsc2U7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfLm9iamVjdChDTE9TRV9PUFRJT05TLCBmYWxzZSk7XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBkaWFsb2cgcG9wdXBcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHdpdGggdGl0bGUsIHRleHQgYW5kIGJ1dHRvbnMuIFNlZSBbY3JlYXRlRGlhbG9nXSgjTUxEaWFsb2ckJGNyZWF0ZURpYWxvZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBvcHRpb25hbCBzdWJzY3JpYmVyIGZ1bmN0aW9uIG9yIG9iamVjdCB0aGF0IGlzIHBhc3NlZCByZXN1bHQgYW5kIG9wdGlvbmFsIGRhdGEuIFVubGVzcyBjb250ZXh0IGlzIGRlZmluZWQsIGRpYWxvZyB3aWxsIGJlIHRoZSBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBNTERpYWxvZyQkb3BlbkRpYWxvZyhvcHRpb25zLCBzdWJzY3JpYmVyLCBpbml0aWFsaXplKSB7XG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZURpYWxvZyhvcHRpb25zLCBpbml0aWFsaXplKTtcbiAgICBkaWFsb2cub3BlbkRpYWxvZyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cblxuZnVuY3Rpb24gX3RvZ2dsZURpYWxvZyhkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2RpYWxvZy52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB2YXIgYWRkUmVtb3ZlID0gZG9TaG93ID8gJ2FkZCcgOiAncmVtb3ZlJ1xuICAgICAgICAsIGFwcGVuZFJlbW92ZSA9IGRvU2hvdyA/ICdhcHBlbmRDaGlsZCcgOiAncmVtb3ZlQ2hpbGQnO1xuXG4gICAgdGhpcy5fZGlhbG9nLnZpc2libGUgPSBkb1Nob3c7XG5cbiAgICBpZiAoZG9TaG93ICYmICEgZGlhbG9nc0luaXRpYWxpemVkKVxuICAgICAgICBfaW5pdGlhbGl6ZURpYWxvZ3MoKTtcblxuICAgIGRvY3VtZW50LmJvZHlbYXBwZW5kUmVtb3ZlXSh0aGlzLmVsKTtcbiAgICBpZiAoYmFja2Ryb3BFbClcbiAgICAgICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKGJhY2tkcm9wRWwpO1xuICAgIHRoaXMuZG9tLnRvZ2dsZShkb1Nob3cpO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICFkb1Nob3cpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ21vZGFsLW9wZW4nKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdFthZGRSZW1vdmVdKCdpbicpO1xuXG4gICAgb3BlbmVkRGlhbG9nID0gZG9TaG93ID8gdGhpcyA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVsW2RvU2hvdyA/ICdmb2N1cycgOiAnYmx1ciddKCk7XG59XG5cblxudmFyIGRpYWxvZ3NJbml0aWFsaXplZCwgYmFja2Ryb3BFbDtcblxuZnVuY3Rpb24gX2luaXRpYWxpemVEaWFsb2dzKCkge1xuICAgIGJhY2tkcm9wRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWNrZHJvcEVsLmNsYXNzTmFtZSA9ICdtb2RhbC1iYWNrZHJvcCBmYWRlIGluJztcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX29uS2V5RG93bik7XG4gICAgZGlhbG9nc0luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuXG52YXIgb3BlbmVkRGlhbG9nO1xuXG4vKipcbiAqIE9wZW5zIGRpYWxvZyBpbnN0YW5jZS5cbiAqIFN1YnNjcmliZXIgb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgc3Vic2NyaWJlciBmb3IgdGhlIE1lc3NlbmdlciAoYWx0aG91Z2ggTWVzc2VuZ2VyIGlzIG5vdCB1c2VkKSAtIGVpdGhlciBmdW5jdGlvbiBvciBvYmplY3Qgd2l0aCBzdWJzY3JpYmVyIGFuZCBjb250ZXh0IHByb3BlcnRpZXMuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIHN1YnNjcmliZXIgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJG9wZW5EaWFsb2coc3Vic2NyaWJlcikge1xuICAgIGNoZWNrKHN1YnNjcmliZXIsIE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCB7IHN1YnNjcmliZXI6IEZ1bmN0aW9uLCBjb250ZXh0OiBNYXRjaC5BbnkgfSkpO1xuXG4gICAgaWYgKG9wZW5lZERpYWxvZylcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdNTERpYWxvZyBvcGVuRGlhbG9nOiBjYW5cXCd0IG9wZW4gZGlhbG9nLCBhbm90aGVyIGRpYWxvZyBpcyBhbHJlYWR5IG9wZW4nKTtcblxuICAgIHRoaXMuX2RpYWxvZy5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICBfdG9nZ2xlRGlhbG9nLmNhbGwodGhpcywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBDbG9zZXMgZGlhbG9nIGluc3RhbmNlLCBvcHRpb25hbGx5IHBhc3NpbmcgcmVzdWx0IGFuZCBkYXRhIHRvIGRpYWxvZyBzdWJzY3JpYmVyLlxuICogSWYgbm8gcmVzdWx0IGlzIHBhc3NlZCwgJ2Nsb3NlZCcgd2lsbCBiZSBwYXNzZWQgdG8gc3Vic2NyaWJlci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVzdWx0IGRpYWxvZyByZXN1bHQsIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHN1YmNzcmliZXJcbiAqIEBwYXJhbSB7QW55fSBkYXRhIG9wdGlvbmFsIGRpYWxvZyBkYXRhLCBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gc3Vic2NyaWJlclxuICovXG5mdW5jdGlvbiBNTERpYWxvZyRjbG9zZURpYWxvZyhyZXN1bHQsIGRhdGEpIHtcbiAgICBpZiAoISBvcGVuZWREaWFsb2cpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignTUxEaWFsb2cgY2xvc2VEaWFsb2c6IGNhblxcJ3QgY2xvc2UgZGlhbG9nLCBubyBkaWFsb2cgb3BlbicpO1xuXG4gICAgcmVzdWx0ID0gcmVzdWx0IHx8ICdjbG9zZWQnO1xuXG4gICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICBfZGlzcGF0Y2hSZXN1bHQuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBjdXJyZW50bHkgb3BlbmVkIGRpYWxvZ1xuICpcbiAqIEByZXR1cm4ge01MRGlhbG9nfVxuICovXG5mdW5jdGlvbiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nKCkge1xuICAgIHJldHVybiBvcGVuZWREaWFsb2c7XG59XG5cblxuZnVuY3Rpb24gTUxEaWFsb2ckZGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgX29uS2V5RG93bik7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi8uLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uLy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgRE9NTGlzdGVuZXJzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbC9kb21fbGlzdGVuZXJzJyk7XG5cblxudmFyIFRPR0dMRV9DU1NfQ0xBU1MgPSAnZHJvcGRvd24tdG9nZ2xlJ1xuICAgICwgTUVOVV9DU1NfQ0xBU1MgPSAnZHJvcGRvd24tbWVudSc7XG5cblxudmFyIE1MRHJvcGRvd24gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRHJvcGRvd24nLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogWydtbC1icy1kcm9wZG93bicsICdkcm9wZG93biddXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxEcm9wZG93bik7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEcm9wZG93bjtcblxuXG5fLmV4dGVuZFByb3RvKE1MRHJvcGRvd24sIHtcbiAgICBzdGFydDogTUxEcm9wZG93biRzdGFydCxcbiAgICBkZXN0cm95OiBNTERyb3Bkb3duJGRlc3Ryb3ksXG4gICAgdG9nZ2xlTWVudTogTUxEcm9wZG93biR0b2dnbGVNZW51LFxuICAgIHNob3dNZW51OiBNTERyb3Bkb3duJHNob3dNZW51LFxuICAgIGhpZGVNZW51OiBNTERyb3Bkb3duJGhpZGVNZW51XG59KTtcblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJHN0YXJ0KCkge1xuICAgIHZhciB0b2dnbGVFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLicgKyBUT0dHTEVfQ1NTX0NMQVNTKVxuICAgICAgICAsIG1lbnVFbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLicgKyBNRU5VX0NTU19DTEFTUyk7XG5cbiAgICBpZiAoISAodG9nZ2xlRWwgJiYgbWVudUVsKSlcbiAgICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcignTUxEcm9wZG93bjonLCBUT0dHTEVfQ1NTX0NMQVNTLCAnb3InLCBNRU5VX0NTU19DTEFTUywgJ2lzblxcJ3QgZm91bmQnKTtcblxuICAgIHZhciBkb2MgPSB3aW5kb3cuZG9jdW1lbnRcbiAgICAgICAgLCBjbGlja0hhbmRsZXIgPSB0aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzLCB1bmRlZmluZWQpO1xuXG4gICAgdmFyIGxpc3RlbmVycyA9IG5ldyBET01MaXN0ZW5lcnM7XG4gICAgdGhpcy5fZHJvcGRvd24gPSB7XG4gICAgICAgIG1lbnU6IG1lbnVFbCxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfTtcbiAgICB0aGlzLmhpZGVNZW51KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgbGlzdGVuZXJzLmFkZCh0b2dnbGVFbCwgJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcbiAgICAvL21heWJlIG9ubHkgYWRkIHRoaXMgZXZlbnRzIGlmIGlzIG9wZW4/XG4gICAgbGlzdGVuZXJzLmFkZChkb2MsICdtb3VzZW91dCcsIG9uRG9jT3V0KTtcbiAgICBsaXN0ZW5lcnMuYWRkKGRvYywgJ2NsaWNrJywgb25DbGljayk7XG5cblxuICAgIGZ1bmN0aW9uIG9uRG9jT3V0KGV2ZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXRcbiAgICAgICAgICAgICwgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXRcbiAgICAgICAgICAgICwgbGlzdGVuZXJzID0gc2VsZi5fZHJvcGRvd24ubGlzdGVuZXJzO1xuXG4gICAgICAgIGlmIChpc0lmcmFtZSh0YXJnZXQpKVxuICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZSh0YXJnZXQuY29udGVudFdpbmRvdy5kb2N1bWVudCwgJ2NsaWNrJywgb25DbGljayk7XG5cbiAgICAgICAgaWYgKGlzSWZyYW1lKHJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChyZWxhdGVkVGFyZ2V0LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsICdjbGljaycsIG9uQ2xpY2spO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmVsLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICBzZWxmLmhpZGVNZW51KCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGlzSWZyYW1lKGVsKSB7XG4gICAgcmV0dXJuIGVsICYmIGVsLnRhZ05hbWUgPT0gJ0lGUkFNRSc7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Ryb3Bkb3duLmxpc3RlbmVycy5yZW1vdmVBbGwoKTtcbiAgICBkZWxldGUgdGhpcy5fZHJvcGRvd247XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRzaG93TWVudSgpIHtcbiAgICB0aGlzLnRvZ2dsZU1lbnUodHJ1ZSk7XG59XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRoaWRlTWVudSgpIHtcbiAgICB0aGlzLnRvZ2dsZU1lbnUoZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kdG9nZ2xlTWVudShkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2Ryb3Bkb3duLnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHRoaXMuX2Ryb3Bkb3duLnZpc2libGUgPSBkb1Nob3c7XG5cbiAgICB2YXIgbWVudSA9IHRoaXMuX2Ryb3Bkb3duLm1lbnU7XG4gICAgbWVudS5zdHlsZS5kaXNwbGF5ID0gZG9TaG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnYmxvY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnbm9uZSc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxuLy8gPGEgbmFtZT1cImNvbmZpZ1wiPjwvYT5cbi8vIG1pbG8uY29uZmlnXG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBJdCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gY2hhbmdlIG1pbG8gY29uZmlndXJhdGlvbnMgYW5kIGFsc29cbi8vIGFjY2VzcyB0aGVtIG9uIGNvbmZpZydzIHByb3BlcnRpZXMuXG5cbi8vIGBgYGphdmFzY3JpcHRcbi8vIG1pbG8uY29uZmlnKHtcbi8vICAgICBhdHRyczoge1xuLy8gICAgICAgICBiaW5kOiAnbWwtYmluZCcsXG4vLyAgICAgICAgIGxvYWQ6ICdtbC1sb2FkJ1xuLy8gICAgIH1cbi8vIH0pO1xuLy8gYGBgXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgZG9UID0gbWlsb0NvcmUudXRpbC5kb1Q7XG5cblxudmFyIGNvbmZpZyA9IG1vZHVsZS5leHBvcnRzID0gbWlsb0NvcmUuY29uZmlnO1xuXG5cbmNvbmZpZyh7XG4gICAgYXR0cnM6IHtcbiAgICAgICAgYmluZDogJ21sLWJpbmQnLFxuICAgICAgICBsb2FkOiAnbWwtbG9hZCdcbiAgICB9LFxuICAgIGNvbXBvbmVudFJlZjogJ19fX21pbG9fY29tcG9uZW50JyxcbiAgICBjb21wb25lbnRQcmVmaXg6ICdtaWxvXycsXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgY29tcGlsZTogZG9ULmNvbXBpbGVcbiAgICB9LFxuICAgIGRvbVN0b3JhZ2U6IHtcbiAgICAgICAgdHlwZVN1ZmZpeDogJzpfX19taWxvX2RhdGFfdHlwZScsXG4gICAgICAgIHByZWZpeFNlcGFyYXRvcjogJy8nLFxuICAgICAgICByb290OiAnJyxcbiAgICAgICAgbWVzc2FnZUtleTogJ19fX21pbG9fbWVzc2FnZS8nLFxuICAgICAgICBtZXNzYWdlVGltZXN0YW1wOiAnX19fbWlsb190aW1lc3RhbXAnLFxuICAgICAgICBxdW90YUV4Y2VlZGVkOiB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZmFsc2VcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ0Ryb3A6IHtcbiAgICAgICAgZGF0YVR5cGVzOiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6ICd4LWFwcGxpY2F0aW9uL21pbG8vY29tcG9uZW50JyxcbiAgICAgICAgICAgIGNvbXBvbmVudE1ldGFUZW1wbGF0ZTogJ3gtYXBwbGljYXRpb24vbWlsby9jb21wb25lbnQtbWV0YS8lY2xhc3MvJW5hbWUvJXBhcmFtcycsXG4gICAgICAgICAgICBjb21wb25lbnRNZXRhUmVnZXg6IC9eeFxcLWFwcGxpY2F0aW9uXFwvbWlsb1xcL2NvbXBvbmVudFxcLW1ldGFcXC8oW2EtejAtOV0rKVxcLyhbYS16MC05XSspXFwvKFthLXowLTldKikkLyxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWVzdDoge1xuICAgICAgICBqc29ucFRpbWVvdXQ6IDYwMDAwLFxuICAgICAgICBqc29ucENhbGxiYWNrUHJlZml4OiAnX19fbWlsb19jYWxsYmFja18nLFxuICAgICAgICBvcHRpb25zS2V5OiAnX19fbWlsb19vcHRpb25zJyxcbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IDYwMDAwXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdlYnNvY2tldDoge1xuICAgICAgICBycGM6IHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IDE1MDAwLFxuICAgICAgICAgICAgcmVzcG9uc2VQcmVmaXg6ICdyZXNwb25zZV8nXG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb01haWwgPSByZXF1aXJlKCcuL3NlcnZpY2VzL21haWwnKVxuICAgICwgcmVxdWVzdCA9IHJlcXVpcmUoJy4vdXRpbC9yZXF1ZXN0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIHV0aWxEb20gPSByZXF1aXJlKCcuL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJylcbiAgICAsIExvYWRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuL2F0dHJpYnV0ZXMvYV9sb2FkJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBsb2FkZXI7XG5cbi8qKlxuICogYG1pbG8ubG9hZGVyYFxuICogXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHJvb3RFbGAgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkgbG9va2luZyBmb3IgX19tbC1sb2FkX18gQGF0dHJpYnV0ZS5cbiAqIE9uZSBsZXZlbCBsb2FkIGlzIGV4ZWN1dGVkLiBObyBhZGRpdGlvbmFsIGxvYWRlciBnZXQgY2FsbGVkIG9uIGluc2lkZSBfX21sLWxvYWRfXyBhdHRyaWJ1dGVzLiBcbiAqXG4gKiBQb3NzaWJsZSB1c2FnZXM6XG4gKiAtIG1pbG8ubG9hZGVyKFtteVJvb3RFbCxdW215UmVtb3ZlQXR0cmlidXRlLF1teUNhbGxiYWNrKVxuICogXG4gKiBAcGFyYW0gIHtFbGVtZW50fSAgcm9vdEVsICAgICAgICAgIFJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCAoZG9jdW1lbnQuYm9keSBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSAge0Jvb2xlYW59ICByZW1vdmVBdHRyaWJ1dGUgSWYgc2V0IHRvIHRydWUsIHRoZW4gdGhlIF9fbWwtbG9hZF9fIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgb25jZSBsb2FkZXIgaGFzIGJlZW4gZXhlY3V0ZWQgKEZhbHNlIGJ5IGRlZmF1bHQpLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrICAgICAgICBDYWxsYmFjayB0byBjYWxsIGFmdGVyIGFsbCBlbGVtZW50cyBnZXQgbG9hZGVkIChSZXF1aXJlZCkuXG4gKi9cbmZ1bmN0aW9uIGxvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBtaWxvKGZ1bmN0aW9uKCkge1xuICAgICAgICBfbG9hZGVyKHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjayk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX2xvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHJvb3RFbCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gcm9vdEVsO1xuICAgICAgICByb290RWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVtb3ZlQXR0cmlidXRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSByZW1vdmVBdHRyaWJ1dGU7XG4gICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJvb3RFbCA9IHJvb3RFbCB8fCBkb2N1bWVudC5ib2R5O1xuXG4gICAgbWlsb01haWwucG9zdE1lc3NhZ2UoJ2xvYWRlcicsIHsgc3RhdGU6ICdzdGFydGVkJyB9KTtcbiAgICBfbG9hZFZpZXdzSW5FbGVtZW50KHJvb3RFbCwgcmVtb3ZlQXR0cmlidXRlLCBmdW5jdGlvbih2aWV3cykge1xuICAgICAgICBtaWxvTWFpbC5wb3N0TWVzc2FnZSgnbG9hZGVyJywgeyBcbiAgICAgICAgICAgIHN0YXRlOiAnZmluaXNoZWQnLFxuICAgICAgICAgICAgdmlld3M6IHZpZXdzXG4gICAgICAgIH0pO1xuICAgICAgICBjYWxsYmFjayh2aWV3cyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX2xvYWRWaWV3c0luRWxlbWVudChyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgbG9hZEVsZW1lbnRzID0gcm9vdEVsLmdldEF0dHJpYnV0ZShjb25maWcuYXR0cnMubG9hZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW3Jvb3RFbF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogcm9vdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgY29uZmlnLmF0dHJzLmxvYWQgKyAnXScpO1xuXG4gICAgdmFyIHZpZXdzID0ge31cbiAgICAgICAgLCB0b3RhbENvdW50ID0gbG9hZEVsZW1lbnRzLmxlbmd0aFxuICAgICAgICAsIGxvYWRlZENvdW50ID0gMDtcblxuICAgIF8uZm9yRWFjaChsb2FkRWxlbWVudHMsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBsb2FkVmlldyhlbCwgcmVtb3ZlQXR0cmlidXRlLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIHZpZXdzW2VsLmlkXSA9IGVyciB8fCBlbDtcbiAgICAgICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgICAgICBpZiAobG9hZGVkQ291bnQgPT0gdG90YWxDb3VudClcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh2aWV3cyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuXG5mdW5jdGlvbiBsb2FkVmlldyhlbCwgcmVtb3ZlQXR0cmlidXRlLCBjYWxsYmFjaykge1xuICAgIGlmICh1dGlsRG9tLmNoaWxkcmVuKGVsKS5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCBsb2FkIGh0bWwgaW50byBlbGVtZW50IHRoYXQgaXMgbm90IGVtcHR5Jyk7XG5cbiAgICB2YXIgYXR0ciA9IG5ldyBMb2FkQXR0cmlidXRlKGVsKTtcblxuICAgIGF0dHIucGFyc2UoKS52YWxpZGF0ZSgpO1xuXG4gICAgcmVxdWVzdC5nZXQoYXR0ci5sb2FkVXJsLCBmdW5jdGlvbihlcnIsIGh0bWwpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZSB8fCAnY2FuXFwndCBsb2FkIGZpbGUgJyArIGF0dHIubG9hZFVybDtcbiAgICAgICAgICAgIC8vIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZWwuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgaWYgKHJlbW92ZUF0dHJpYnV0ZSkgTG9hZEF0dHJpYnV0ZS5yZW1vdmUoZWwpO1xuICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyByZWdpc3RlciBpbmNsdWRlZCBmYWNldHNcbnJlcXVpcmUoJy4vdXNlX2ZhY2V0cycpO1xuXG4vLyByZWdpc3RlciBpbmNsdWRlZCBjb21wb25lbnRzXG5yZXF1aXJlKCcuL3VzZV9jb21wb25lbnRzJyk7XG5cblxuLyoqXG4gKiBgbWlsb2BcbiAqXG4gKiBBIG1pbmltYWxpc3QgYnJvd3NlciBmcmFtZXdvcmsgdGhhdCBiaW5kcyBET00gZWxlbWVudHMgdG8gSlMgY29tcG9uZW50cyBhbmQgY29tcG9uZW50cyB0byBtb2RlbHMuXG4gKlxuICogYG1pbG9gIGlzIGF2YWlsYWJsZSBhcyBnbG9iYWwgb2JqZWN0IGluIHRoZSBicm93c2VyLlxuICogQXQgdGhlIG1vbWVudCBpdCBpcyBub3QgcG9zc2lpYmxlIHRvIHJlcXVpcmUgaXQgd2l0aCBicm93c2VyaWZ5IHRvIGhhdmUgaXQgYnVuZGxlZCB3aXRoIHRoZSBhcHAgYmVjYXVzZSBvZiB0aGUgd2F5IFticmZzXShodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2svYnJmcykgYnJvd3NlcmlmeSBwbHVnaW4gaXMgaW1wbGVtZW50ZWQuXG4gKiBJdCBpcyBwb3NzaWJsZSB0aG91Z2ggdG8gcmVxdWlyZSBgbWlsb2Agd2l0aCBub2RlIHRvIHVzZSB1bml2ZXJzYWwgcGFydHMgb2YgdGhlIGZyYW1ld29yayAoYWJzdHJhY3QgY2xhc3NlcywgTWVzc2VuZ2VyLCBNb2RlbCwgZXRjLik6XG4gKiBgYGBcbiAqIHZhciBtaWxvID0gcmVxdWlyZSgnbW9sLW1pbG8nKTtcbiAqIGBgYFxuICogXG4gKiBgbWlsb2AgaXRzZWxmIGlzIGEgZnVuY3Rpb24gdGhhdCBpbiB0aGUgYnJvd3NlciBjYW4gYmUgdXNlZCB0byBkZWxheSBleGVjdXRpb24gdW50aWwgRE9NIGlzIHJlYWR5LlxuICovXG5mdW5jdGlvbiBtaWxvKGZ1bmMpIHtcbiAgICBtaWxvLnV0aWwuZG9tUmVhZHkoZnVuYyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFtsb2FkZXJdKC4vbG9hZGVyLmpzLmh0bWwpIC0gbG9hZGluZyBzdWJ2aWV3cyBpbnRvIHBhZ2VcbiAqIC0gW2JpbmRlcl0oLi9iaW5kZXIuanMuaHRtbCkgLSBjb21wb25lbnRzIGluc3RhbnRpYXRpb24gYW5kIGJpbmRpbmcgb2YgRE9NIGVsZW1lbnRzIHRvIHRoZW1cbiAqIC0gW21pbmRlcl0oLi9taW5kZXIuanMuaHRtbCkgLSBkYXRhIHJlYWN0aXZpdHksIG9uZSBvciB0d28gd2F5LCBzaGFsbG93IG9yIGRlZXAsIGFzIHlvdSBsaWtlIGl0XG4gKiAtIFttYWlsXSguL21haWwvaW5kZXguanMuaHRtbCkgLSBhcHBsaWNhaXRvbiBsZXZlbCBtZXNzZW5nZXIsIGFsc28gY29ubmVjdHMgdG8gbWVzc2FnZXMgZnJvbSBvdGhlciB3aW5kb3dzIGRpc3BhdGNoZWQgd2l0aCBgd2luZG93LnBvc3RNZXNzYWdlYC5cbiAqIC0gW2NvbmZpZ10oLi9jb25maWcuanMuaHRtbCkgLSBtaWxvIGNvbmZpZ3VyYXRpb25cbiAqIC0gW3V0aWxdKC4vdXRpbC9pbmRleC5qcy5odG1sKSAtIGxvZ2dlciwgcmVxdWVzdCwgZG9tLCBjaGVjaywgZXJyb3IsIGV0Yy5cbiAqIC0gW2NsYXNzZXNdKC4vY2xhc3Nlcy5qcy5odG1sKSAtIGFic3RyYWN0IGFuZCBiYXNlIGNsYXNzZXNcbiAqIC0gW2F0dHJpYnV0ZXNdKC4vYXR0cmlidXRlcy9pbmRleC5qcy5odG1sKSAtIGNsYXNzZXMgdGhhdCB3cmFwIERPTSBlbGVtZW50cyBhdHRyaWJ1dGVzIHJlY29nbml6ZWQgYnkgbWlsb1xuICogLSBbQ29tcG9uZW50RmFjZXRdKC4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIC0gYmFzZSBjbGFzcyBvZiBDb21wb25lbnQgZmFjZXRcbiAqIC0gW0NvbXBvbmVudF0oLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgLSBiYXNlIENvbXBvbmVudCBjbGFzc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKiAtIFtyZWdpc3RyeV0oLi9yZWdpc3RyeS5qcy5odG1sKSAtIHJlZ2lzdHJpZXMgb2YgZmFzZXRzIGFuZCBjb21wb25lbnRzIGNsYXNzZXNcbiAqL1xuXy5leHRlbmQobWlsbywge1xuICAgIE1lc3NlbmdlcjogbWlsb0NvcmUuTWVzc2VuZ2VyLFxuICAgIE1vZGVsOiBtaWxvQ29yZS5Nb2RlbCxcbiAgICBtaW5kZXI6IG1pbG9Db3JlLm1pbmRlcixcbiAgICBsb2FkZXI6IHJlcXVpcmUoJy4vbG9hZGVyJyksXG4gICAgYmluZGVyOiByZXF1aXJlKCcuL2JpbmRlcicpLFxuICAgIG1haWw6IHJlcXVpcmUoJy4vc2VydmljZXMvbWFpbCcpLFxuICAgIHdpbmRvdzogcmVxdWlyZSgnLi9zZXJ2aWNlcy93aW5kb3cnKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgYXR0cmlidXRlczogcmVxdWlyZSgnLi9hdHRyaWJ1dGVzJyksXG4gICAgQ29tcG9uZW50RmFjZXQ6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0JyksXG4gICAgQ29tcG9uZW50OiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19jbGFzcycpLFxuICAgIENvbW1hbmQ6IHJlcXVpcmUoJy4vY29tbWFuZCcpLFxuICAgIHJlZ2lzdHJ5OiByZXF1aXJlKCcuL3JlZ2lzdHJ5JyksXG4gICAgbWlsb192ZXJzaW9uOiAnMC4yLjAnLFxuICAgIGNyZWF0ZUNvbXBvbmVudENsYXNzOiByZXF1aXJlKCcuL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcycpLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3lcbn0pO1xuXG5cbi8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG5pZiAodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykgICAgXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBtaWxvO1xuXG4vLyBnbG9iYWwgbWlsbyBmb3IgYnJvd3NlclxuaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpIHtcbiAgICB3aW5kb3cubWlsbyA9IG1pbG87XG4gICAgbWlsby5tYWlsLnRyaWdnZXIoJ21pbG9yZWFkeScpO1xufVxuXG5cbmZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgbWlsb0NvcmUuZGVzdHJveSgpO1xuICAgIG1pbG8ubWFpbC5kZXN0cm95KCk7XG4gICAgbWlsby53aW5kb3cuZGVzdHJveSgpO1xuICAgIG1pbG8udXRpbC5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVnaXN0cmllcyBvZiBmYWNldHMgYW5kIG9mIGNvbXBvbmVudHNcbiAqXG4gKiAtIFtmYWNldHNdKC4vY29tcG9uZW50cy9jX2ZhY2V0cy9jZl9yZWdpc3RyeS5qcy5odG1sKVxuICogLSBbY29tcG9uZW50c10oLi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMuaHRtbClcbiAqL1xudmFyIHJlZ2lzdHJ5ID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmFjZXRzOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnknKSxcbiAgICBjb21wb25lbnRzOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvY19yZWdpc3RyeScpLFxuICAgIGNvbW1hbmRzOiByZXF1aXJlKCcuL2NvbW1hbmQvY21kX3JlZ2lzdHJ5Jylcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJjb21wb25lbnRzLWRvbS1jb25zdHJ1Y3RvcnNcIj48L2E+XG4vLyAjIyNkb20gZXZlbnRzIGNvbnN0cnVjdG9yc1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvUmVmZXJlbmNlL0V2ZW50c1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgICBDbGlwYm9hcmRFdmVudDogWydjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdiZWZvcmVjb3B5JywgJ2JlZm9yZWN1dCcsICdiZWZvcmVwYXN0ZSddLFxuICAgIEV2ZW50OiBbJ2lucHV0JywgJ3JlYWR5c3RhdGVjaGFuZ2UnXSxcbiAgICBGb2N1c0V2ZW50OiBbJ2ZvY3VzJywgJ2JsdXInLCAnZm9jdXNpbicsICdmb2N1c291dCddLFxuICAgIEtleWJvYXJkRXZlbnQ6IFsna2V5ZG93bicsICdrZXlwcmVzcycsICAna2V5dXAnXSxcbiAgICBNb3VzZUV2ZW50OiBbJ2NsaWNrJywgJ2NvbnRleHRtZW51JywgJ2RibGNsaWNrJywgJ21vdXNlZG93bicsICdtb3VzZXVwJyxcbiAgICAgICAgICAgICAgICAgJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZScsICdtb3VzZW1vdmUnLCAnbW91c2VvdXQnLCAnbW91c2VvdmVyJyxcbiAgICAgICAgICAgICAgICAgJ3Nob3cnIC8qIGNvbnRleHQgbWVudSAqL10sXG4gICAgVG91Y2hFdmVudDogWyd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJywgJ3RvdWNobW92ZScsICd0b3VjaGVudGVyJywgJ3RvdWNobGVhdmUnLCAndG91Y2hjYW5jZWwnXSxcbn07XG5cblxuLy8gbW9jayB3aW5kb3cgYW5kIGV2ZW50IGNvbnN0cnVjdG9ycyBmb3IgdGVzdGluZ1xuaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpXG4gICAgdmFyIGdsb2JhbCA9IHdpbmRvdztcbmVsc2Uge1xuICAgIGdsb2JhbCA9IHt9O1xuICAgIF8uZWFjaEtleShldmVudFR5cGVzLCBmdW5jdGlvbihlVHlwZXMsIGV2ZW50Q29uc3RydWN0b3JOYW1lKSB7XG4gICAgICAgIHZhciBldmVudENvbnN0cnVjdG9yID0gXy5tYWtlRnVuY3Rpb24oZXZlbnRDb25zdHJ1Y3Rvck5hbWUsICd0eXBlJywgJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgJ3RoaXMudHlwZSA9IHR5cGU7IF8uZXh0ZW5kKHRoaXMsIHByb3BlcnRpZXMpOycpO1xuICAgICAgICBnbG9iYWxbZXZlbnRDb25zdHJ1Y3Rvck5hbWVdID0gZXZlbnRDb25zdHJ1Y3RvcjtcbiAgICB9KTtcbn1cblxuXG52YXIgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0ge307XG5cbl8uZWFjaEtleShldmVudFR5cGVzLCBmdW5jdGlvbihlVHlwZXMsIGV2ZW50Q29uc3RydWN0b3JOYW1lKSB7XG4gICAgZVR5cGVzLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5KGRvbUV2ZW50c0NvbnN0cnVjdG9ycywgdHlwZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cGxpY2F0ZSBldmVudCB0eXBlICcgKyB0eXBlKTtcblxuICAgICAgICBkb21FdmVudHNDb25zdHJ1Y3RvcnNbdHlwZV0gPSBnbG9iYWxbZXZlbnRDb25zdHJ1Y3Rvck5hbWVdO1xuICAgIH0pO1xufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSByZXF1aXJlKCcuL2RlX2NvbnN0cnMnKSAvLyBUT0RPIG1lcmdlIHdpdGggRE9NRXZlbnRTb3VyY2UgPz9cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG52YXIgRE9NRW1pdHRlclNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ0RPTUVtaXR0ZXJTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERPTUVtaXR0ZXJTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IERPTUVtaXR0ZXJTb3VyY2UkZGVzdHJveSxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBfLnBhcnRpYWwoc291cmNlU3Vic2NyaWJlck1ldGhvZCwgJ2FkZEV2ZW50TGlzdGVuZXInKSxcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiBfLnBhcnRpYWwoc291cmNlU3Vic2NyaWJlck1ldGhvZCwgJ3JlbW92ZUV2ZW50TGlzdGVuZXInKSxcbiAgICBwb3N0TWVzc2FnZTogRE9NRW1pdHRlclNvdXJjZSRwb3N0TWVzc2FnZSxcbiAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuXG4gICAgLy8gY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIGVtaXR0ZXI6IGVtaXR0ZXIsXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50LCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NRW1pdHRlclNvdXJjZTtcblxuXG52YXIgdXNlQ2FwdHVyZVBhdHRlcm4gPSAvX19jYXB0dXJlJC9cbiAgICAsIHVzZUNhcHR1cmVQb3N0Zml4ID0gJ19fY2FwdHVyZSc7XG5cblxuLy8gaW5pdCBET00gZXZlbnQgc291cmNlXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcywgZXZlbnRFbWl0dGVyKSB7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXIgPSBldmVudEVtaXR0ZXI7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUVtaXR0ZXJTb3VyY2UkZGVzdHJveSgpIHtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgZGVsZXRlIHRoaXMuZXZlbnRFbWl0dGVyO1xufVxuXG5cbi8vIGdldCBET00gZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyO1xufVxuXG5cbmZ1bmN0aW9uIHNvdXJjZVN1YnNjcmliZXJNZXRob2QobWV0aG9kLCBldmVudFR5cGUpIHtcbiAgICBpZiAoISAoZXZlbnRUeXBlICYmIHR5cGVvZiBldmVudFR5cGUgPT0gJ3N0cmluZycpKSByZXR1cm47XG4gICAgdmFyIGNhcHR1cmUgPSB1c2VDYXB0dXJlUGF0dGVybi50ZXN0KGV2ZW50VHlwZSk7XG4gICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlLnJlcGxhY2UodXNlQ2FwdHVyZVBhdHRlcm4sICcnKTtcbiAgICB0aGlzLmVtaXR0ZXIoKVttZXRob2RdKGV2ZW50VHlwZSwgdGhpcywgY2FwdHVyZSk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB2YXIgaXNDYXB0dXJlUGhhc2U7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIGlzQ2FwdHVyZVBoYXNlID0gZXZlbnQuZXZlbnRQaGFzZSA9PSB3aW5kb3cuRXZlbnQuQ0FQVFVSSU5HX1BIQVNFO1xuXG4gICAgaWYgKGlzQ2FwdHVyZVBoYXNlKVxuICAgICAgICBldmVudCArPSB1c2VDYXB0dXJlUG9zdGZpeDtcblxuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiBET01FbWl0dGVyU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihldmVudFR5cGUsIHByb3BlcnRpZXMpIHtcbiAgICBjaGVjayhldmVudFR5cGUsIFN0cmluZyk7XG4gICAgY2hlY2socHJvcGVydGllcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG5cbiAgICBldmVudFR5cGUgPSBldmVudFR5cGUucmVwbGFjZSh1c2VDYXB0dXJlUGF0dGVybiwgJycpO1xuICAgIHZhciBFdmVudENvbnN0cnVjdG9yID0gZG9tRXZlbnRzQ29uc3RydWN0b3JzW2V2ZW50VHlwZV07XG5cbiAgICBpZiAodHlwZW9mIEV2ZW50Q29uc3RydWN0b3IgIT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBldmVudCB0eXBlJyk7XG5cbiAgICAvLyBjaGVjayBpZiBpdCBpcyBjb3JyZWN0XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzICE9ICd1bmRlZmluZWQnKVxuICAgICAgICBwcm9wZXJ0aWVzLnR5cGUgPSBldmVudFR5cGU7XG5cbiAgICB2YXIgZG9tRXZlbnQgPSBuZXcgRXZlbnRDb25zdHJ1Y3RvcihldmVudFR5cGUsIHByb3BlcnRpZXMpO1xuICAgIHZhciBub3RDYW5jZWxsZWQgPSB0aGlzLmVtaXR0ZXIoKS5kaXNwYXRjaEV2ZW50KGRvbUV2ZW50KTtcbiAgICByZXR1cm4gbm90Q2FuY2VsbGVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLm1haWxgXG4gKiBJdCBpcyBhbiBhcHBsaWNhdGlvbiBsZXZlbCBtZXNzZW5nZXIgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiBNZXNzZW5nZXIgY2xhc3MuXG4gKlxuICogQXQgdGhlIG1vbWVudCwgaW4gYWRkaXRpb24gdG8gYXBwbGljYXRpb24gbWVzc2FnZXMgdGhhdCB5b3UgZGVmaW5lLCB5b3UgY2FuIHN1YnNjcmliZSB0byBfX2RvbXJlYWR5X18gbWVzc2FnZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gZmlyZSBvbmNlLFxuICogZXZlbiBpZiBET00gd2FzIHJlYWR5IGF0IHRoZSB0aW1lIG9mIHRoZSBzdWJzY3JpcHRpb24uXG4gKlxuICogTWVzc2FnaW5nIGJldHdlZW4gZnJhbWVzIGlzIGF2YWlsYWJsZSB2aWEgbWlsby5tYWlsLiBTZWUgW0ZyYW1lIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzLmh0bWwpLlxuICpcbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkuXG4gKiBcbioqL1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIE1haWxNc2dBUEkgPSByZXF1aXJlKCcuL21haWxfYXBpJylcbiAgICAsIE1haWxNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tYWlsX3NvdXJjZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIG1pbG9NYWlsID0gbmV3IE1lc3NlbmdlcjtcblxudmFyIG1haWxNc2dTb3VyY2UgPSBuZXcgTWFpbE1lc3NhZ2VTb3VyY2UobWlsb01haWwsIHsgdHJpZ2dlcjogJ3RyaWdnZXInIH0sIG5ldyBNYWlsTXNnQVBJKTtcblxubWlsb01haWwuX3NldE1lc3NhZ2VTb3VyY2UobWFpbE1zZ1NvdXJjZSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtaWxvTWFpbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgTWFpbE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTWFpbE1zZ0FQSScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTWFpbE1zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2Vcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1haWxNc2dBUEk7XG5cblxuLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHJlbGV2YW50IERPTSBldmVudCBkZXBlbmRlbnQgb24gZWxlbWVudCB0YWdcbi8vIENhbiBhbHNvIGltcGxlbWVudCBiZWZvcmVkYXRhY2hhbmdlZCBldmVudCB0byBhbGxvdyBwcmV2ZW50aW5nIHRoZSBjaGFuZ2Vcbi8vIHRyYW5zbGF0ZVRvRG9tRXZlbnRcbnZhciB3aW5kb3dNZXNzYWdlUmVnRXhwID0gL15tZXNzYWdlXFw6L1xuICAgICwgd2luZG93TWVzc2FnZVByZWZpeCA9ICdtZXNzYWdlOic7XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgaWYgKG1lc3NhZ2UgPT0gJ2RvbXJlYWR5JylcbiAgICAgICAgcmV0dXJuICdyZWFkeXN0YXRlY2hhbmdlJztcbiAgICBlbHNlIGlmICh3aW5kb3dNZXNzYWdlUmVnRXhwLnRlc3QobWVzc2FnZSkpXG4gICAgICAgIHJldHVybiAnbWVzc2FnZSc7XG59XG5cblxuLy8gZmlsdGVyRGF0YU1lc3NhZ2VcbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbXNnVHlwZSwgbXNnRGF0YSkge1xuICAgIGlmIChzb3VyY2VNZXNzYWdlID09ICdyZWFkeXN0YXRlY2hhbmdlJykge1xuICAgICAgICAvL3JldHVybiBkb2N1bWVudC5yZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZSc7XG4gICAgICAgIC8vICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19kb21SZWFkeUZpcmVkJywgdHJ1ZSwgXy5XUklUKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdtZXNzYWdlJylcbiAgICAgICAgcmV0dXJuIHdpbmRvd01lc3NhZ2VQcmVmaXggKyBtc2dEYXRhLmRhdGEudHlwZSA9PSBtc2dUeXBlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4uL2RlX2NvbnN0cnMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxudmFyIE1haWxNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnTWFpbE1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKE1haWxNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG5cbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgX3dpbmRvd1N1YnNjcmliZXJNZXRob2Q6IF93aW5kb3dTdWJzY3JpYmVyTWV0aG9kLFxuICAgIGhhbmRsZUV2ZW50OiBoYW5kbGVFdmVudCwgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbE1lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgaWYgKGlzUmVhZHlTdGF0ZUNoYW5nZShzb3VyY2VNZXNzYWdlKSkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnbG9hZGluZycpXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgdGhpcywgZmFsc2UpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBFdmVudENvbnN0cnVjdG9yID0gZG9tRXZlbnRzQ29uc3RydWN0b3JzLnJlYWR5c3RhdGVjaGFuZ2U7XG4gICAgICAgICAgICB2YXIgZG9tRXZlbnQgPSBuZXcgRXZlbnRDb25zdHJ1Y3RvcigncmVhZHlzdGF0ZWNoYW5nZScsIHsgdGFyZ2V0OiBkb2N1bWVudCB9KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKCdyZWFkeXN0YXRlY2hhbmdlJywgZG9tRXZlbnQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX3dpbmRvd1N1YnNjcmliZXJNZXRob2QoJ2FkZEV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBpZiAoaXNSZWFkeVN0YXRlQ2hhbmdlKHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgdGhpcywgZmFsc2UpO1xuICAgIGVsc2UgXG4gICAgICAgIHRoaXMuX3dpbmRvd1N1YnNjcmliZXJNZXRob2QoJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiBpc1JlYWR5U3RhdGVDaGFuZ2Uoc291cmNlTWVzc2FnZSkge1xuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlID09ICdyZWFkeXN0YXRlY2hhbmdlJyAmJiB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGlzV2luZG93TWVzc2FnZShzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnICYmIHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCc7XG59XG5cbmZ1bmN0aW9uIF93aW5kb3dTdWJzY3JpYmVyTWV0aG9kKG1ldGhvZCwgc291cmNlTWVzc2FnZSkge1xuICAgIGlmIChpc1dpbmRvd01lc3NhZ2Uoc291cmNlTWVzc2FnZSkpXG4gICAgICAgIHdpbmRvd1ttZXRob2RdKCdtZXNzYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbi8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQudHlwZSwgZXZlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIHRyaWdnZXIobXNnVHlwZSwgZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEudHlwZSA9ICdtZXNzYWdlOicgKyBtc2dUeXBlO1xuICAgIFxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKVxuICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoZGF0YSwgJyonKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNZXNzZW5nZXIgPSBtaWxvQ29yZS5NZXNzZW5nZXJcbiAgICAsIERPTUVtaXR0ZXJTb3VyY2UgPSByZXF1aXJlKCcuL2RvbV9zb3VyY2UnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciB3aW5kb3dTZXJ2aWNlID0gbmV3IE1lc3NlbmdlcjtcbnZhciBkb21FbWl0dGVyU291cmNlID0gbmV3IERPTUVtaXR0ZXJTb3VyY2Uod2luZG93U2VydmljZSwgeyB0cmlnZ2VyOiAndHJpZ2dlcicgfSwgdW5kZWZpbmVkLCB3aW5kb3cpO1xud2luZG93U2VydmljZS5fc2V0TWVzc2FnZVNvdXJjZShkb21FbWl0dGVyU291cmNlKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1NlcnZpY2U7XG5cblxuXy5leHRlbmQod2luZG93U2VydmljZSwge1xuICAgIGlzVG9wOiB3aW5kb3dTZXJ2aWNlX2lzVG9wXG59KTtcblxuXG5mdW5jdGlvbiB3aW5kb3dTZXJ2aWNlX2lzVG9wKCkge1xuICAgIHJldHVybiB3aW5kb3cudG9wID09IHdpbmRvdy5zZWxmIHx8IHdpbmRvdy5fX2thcm1hX187XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Hcm91cCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1dyYXBwZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9UZXh0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvU2VsZWN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSW5wdXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9JbnB1dExpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9UZXh0YXJlYScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9CdXR0b24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9IeXBlcmxpbmsnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvTGlzdEl0ZW0nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9UaW1lJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRGF0ZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0NvbWJvJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvU3VwZXJDb21ibycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0ltYWdlJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRHJvcFRhcmdldCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0ZvbGRUcmVlJyk7XG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9ib290c3RyYXAvRHJvcGRvd24nKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9ib290c3RyYXAvRGlhbG9nJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Eb20nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRnJhbWUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9FdmVudHMnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9PcHRpb25zJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Db250YWluZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRHJhZycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvSXRlbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL1RyYW5zZmVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb3VudCA9IHJlcXVpcmUoJy4vY291bnQnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRQcmVmaXg7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnROYW1lO1xuXG5cbmZ1bmN0aW9uIGNvbXBvbmVudE5hbWUoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIGNvdW50KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0aW1lc3RhbXAgPSBEYXRlLm5vdygpXG4gICAgLCBjb3VudCA9ICcnXG4gICAgLCB1bmlxdWVJRCA9ICcnICsgdGltZXN0YW1wO1xuXG5mdW5jdGlvbiB1bmlxdWVDb3VudCgpIHtcbiAgICB2YXIgbmV3VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICB1bmlxdWVJRCA9ICcnICsgbmV3VGltZXN0YW1wO1xuICAgIGlmICh0aW1lc3RhbXAgPT0gbmV3VGltZXN0YW1wKSB7XG4gICAgICAgIGNvdW50ID0gY291bnQgPT09ICcnID8gMCA6IGNvdW50ICsgMTtcbiAgICAgICAgdW5pcXVlSUQgKz0gJ18nICsgY291bnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGltZXN0YW1wID0gbmV3VGltZXN0YW1wO1xuICAgICAgICBjb3VudCA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWVJRDtcbn1cblxudW5pcXVlQ291bnQuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHVuaXF1ZUlEO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaXF1ZUNvdW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQ29tcG9uZW50Q2xhc3M7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB3aGljaCBjcmVhdGVzIGFuZCByZWdpc3RlcnMgbmV3IG1pbG8gY29tcG9uZW50LiAgVGhlIGNvbXBvbmVudCBjcmVhdGVkIHdpbGwgaGF2ZVxuICogYSByZWZlcmVuY2UgdG8gdGhlIHN1cGVyIGNsYXNzIHVzZWQgaW4gaXRzIGNyZWF0aW9uIChBY2Nlc3NhYmxlIHVzaW5nIDxDb21wb25lbnRDbGFzcz4uc3VwZXIpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcuY2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG5ldyBjb21wb25lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbJ0NvbXBvbmVudCddIGNvbmZpZy5zdXBlckNsYXNzTmFtZSAtIFRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGNvbXBvbmVudCB0byBiZSB1c2VkIGFzIHRoZSBuZXcgY29tcG9uZW50J3Mgc3VwZXIgY2xhc3NcbiAqIEBwYXJhbSB7b2JqZWN0PX0gY29uZmlnLmZhY2V0cyAtIEZhY2V0IGNvbmZpZ3VyYXRpb24gKEhhc2ggb2YgZmFjZXQgbmFtZSB7c3RyaW5nfSB0byBjb25maWcge29iamVjdH0pXG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZy5tZXRob2RzIC0gTWV0aG9kcyBvZiB0aGUgbmV3IGNvbXBvbmVudCAoSGFzaCBvZiBmdW5jdGlvbiBuYW1lIHtzdHJpbmd9IHRvIGZ1bmN0aW9uIHtmdW5jdGlvbn0pXG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZy5zdGF0aWNNZXRob2RzIC0gU3RhdGljIG1ldGhvZHMgb2YgdGhlIG5ldyBjb21wb25lbnQgKEhhc2ggb2YgZnVuY3Rpb24gbmFtZSB7c3RyaW5nfSB0byBmdW5jdGlvbiB7ZnVuY3Rpb259KVxuICovXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRDbGFzcyhjb25maWcpIHtcbiAgICB2YXIgY29tcG9uZW50UmVnaXN0cnkgPSBtaWxvLnJlZ2lzdHJ5LmNvbXBvbmVudHM7XG4gICAgdmFyIFN1cGVyQ2xhc3MgPSBjb21wb25lbnRSZWdpc3RyeS5nZXQoY29uZmlnLnN1cGVyQ2xhc3NOYW1lIHx8ICdDb21wb25lbnQnKTtcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBTdXBlckNsYXNzLmNyZWF0ZUNvbXBvbmVudENsYXNzKGNvbmZpZy5jbGFzc05hbWUsIGNvbmZpZy5mYWNldHMpO1xuXG4gICAgaWYoY29uZmlnLm1ldGhvZHMpIHtcbiAgICAgICAgXy5leHRlbmRQcm90byhDb21wb25lbnRDbGFzcywgY29uZmlnLm1ldGhvZHMpO1xuICAgIH1cblxuICAgIGlmKGNvbmZpZy5zdGF0aWNNZXRob2RzKSB7XG4gICAgICAgIGlmKGNvbmZpZy5zdGF0aWNNZXRob2RzLnN1cGVyICE9PSB1bmRlZmluZWQpIHRocm93ICdcXCdzdXBlclxcJyBpcyBhIHJlc2VydmVkIGtleXdvcmQnO1xuXG4gICAgICAgIF8uZXh0ZW5kKENvbXBvbmVudENsYXNzLCBjb25maWcuc3RhdGljTWV0aG9kcyk7XG4gICAgfVxuXG4gICAgQ29tcG9uZW50Q2xhc3Muc3VwZXIgPSBTdXBlckNsYXNzLnByb3RvdHlwZTtcbiAgICBcbiAgICBjb21wb25lbnRSZWdpc3RyeS5hZGQoQ29tcG9uZW50Q2xhc3MpO1xuXG4gICAgcmV0dXJuIENvbXBvbmVudENsYXNzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxudmFyIGRvbVV0aWxzID0ge1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBmaWx0ZXJOb2RlTGlzdEJ5VHlwZTogZmlsdGVyTm9kZUxpc3RCeVR5cGUsXG4gICAgY29udGFpbmluZ0VsZW1lbnQ6IGNvbnRhaW5pbmdFbGVtZW50LFxuICAgIHNlbGVjdEVsZW1lbnRDb250ZW50czogc2VsZWN0RWxlbWVudENvbnRlbnRzLFxuICAgIHNlbGVjdEVsZW1lbnRUZXh0OiBzZWxlY3RFbGVtZW50VGV4dCxcbiAgICBnZXRFbGVtZW50T2Zmc2V0OiBnZXRFbGVtZW50T2Zmc2V0LFxuICAgIHNldENhcmV0UG9zaXRpb246IHNldENhcmV0UG9zaXRpb24sXG4gICAgZ2V0U2VsZWN0aW9uRGlyZWN0aW9uOiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24sXG4gICAgc2V0U2VsZWN0aW9uOiBzZXRTZWxlY3Rpb24sXG4gICAgY2xlYXJTZWxlY3Rpb246IGNsZWFyU2VsZWN0aW9uLFxuICAgIHJlbW92ZUVsZW1lbnQ6IHJlbW92ZUVsZW1lbnQsXG4gICAgdW53cmFwRWxlbWVudDogdW53cmFwRWxlbWVudCxcbiAgICB3cmFwSW5FbGVtZW50OiB3cmFwSW5FbGVtZW50LFxuICAgIGRldGFjaENvbXBvbmVudDogZGV0YWNoQ29tcG9uZW50LFxuICAgIGZpcnN0VGV4dE5vZGU6IGZpcnN0VGV4dE5vZGUsXG4gICAgbGFzdFRleHROb2RlOiBsYXN0VGV4dE5vZGUsXG4gICAgdHJpbU5vZGVSaWdodDogdHJpbU5vZGVSaWdodCxcbiAgICB0cmltTm9kZUxlZnQ6IHRyaW1Ob2RlTGVmdCxcbiAgICBzdHJpcEh0bWw6IHN0cmlwSHRtbCxcbiAgICBodG1sRW50aXRpZXM6IGh0bWxFbnRpdGllcyxcbiAgICB3YWxrVHJlZTogd2Fsa1RyZWUsXG4gICAgY3JlYXRlVHJlZVdhbGtlcjogY3JlYXRlVHJlZVdhbGtlcixcblxuICAgIHRyZWVQYXRoT2Y6IHRyZWVQYXRoT2YsXG4gICAgZ2V0Tm9kZUF0VHJlZVBhdGg6IGdldE5vZGVBdFRyZWVQYXRoLFxuICAgIGluc2VydEF0VHJlZVBhdGg6IGluc2VydEF0VHJlZVBhdGgsXG4gICAgaXNUcmVlUGF0aEJlZm9yZTogaXNUcmVlUGF0aEJlZm9yZSxcblxuICAgIGdldE5vZGVXaW5kb3c6IGdldE5vZGVXaW5kb3csXG5cbiAgICBnZXRDb21wb25lbnRzRnJvbVJhbmdlOiBnZXRDb21wb25lbnRzRnJvbVJhbmdlLFxuICAgIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHM6IGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMsXG4gICAgZm9yRWFjaE5vZGVzSW5SYW5nZTogZm9yRWFjaE5vZGVzSW5SYW5nZSxcbiAgICBhcmVSYW5nZXNFcXVhbDogYXJlUmFuZ2VzRXF1YWwsXG5cbiAgICBhZGREZWJ1Z1BvaW50OiBhZGREZWJ1Z1BvaW50XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbVV0aWxzO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50IGNoaWxkcmVuIG9mIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIHJldHVybiB0aGUgY2hpbGRyZW4gb2YgKG9ubHkgRE9NIGVsZW1lbnRzKVxuICogQHJldHVybiB7QXJyYXlbRWxlbWVudF19XG4gKi9cbiBmdW5jdGlvbiBjaGlsZHJlbihlbCkge1xuICAgIHJldHVybiBmaWx0ZXJOb2RlTGlzdEJ5VHlwZShlbC5jaGlsZE5vZGVzLCBOb2RlLkVMRU1FTlRfTk9ERSk7XG4gfVxuXG5cbi8qKlxuICogRmlsdGVycyB0aGUgbGlzdCBvZiBub2RlcyBieSB0eXBlXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdH0gbm9kZUxpc3QgdGhlIGxpc3Qgb2Ygbm9kZXMsIGZvciBleGFtcGxlIGNoaWxkTm9kZXMgcHJvcGVydHkgb2YgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbm9kZVR5cGUgYW4gaW50ZWdlciBjb25zdGFudCBbZGVmaW5lZCBieSBET00gQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS5ub2RlVHlwZSksIGUuZy4gYE5vZGUuRUxFTUVOVF9OT0RFYCBvciBgTm9kZS5URVhUX05PREVgXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyTm9kZUxpc3RCeVR5cGUobm9kZUxpc3QsIG5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG5vZGVMaXN0LCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSBub2RlVHlwZTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEZpbmQgbmVhcmVzdCBwYXJlbnQgZWxlbWVudCBmb3Igbm9kZS5cbiAqIElmIG5vZGUgaXMgYW4gZWxlbWVudCwgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gY29udGFpbmluZ0VsZW1lbnQobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5cbi8qKlxuICogU2VsZWN0cyBpbm5lciBjb250ZW50cyBvZiBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudENvbnRlbnRzKGVsKSB7XG4gICAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKCEgZG9jKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZWxlY3RFbGVtZW50Q29udGVudHM6IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbClcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG59XG5cblxuLyoqXG4gKiBTZWxlY3RzIHRleHQgaW5zaWRlIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudFRleHQoZWwpIHtcbiAgICB2YXIgZnJvbU5vZGUgPSBmaXJzdFRleHROb2RlKGVsKVxuICAgICAgICAsIHRvTm9kZSA9IGxhc3RUZXh0Tm9kZShlbCk7XG5cbiAgICBpZiAoZnJvbU5vZGUgJiYgdG9Ob2RlKVxuICAgICAgICBzZXRTZWxlY3Rpb24oZnJvbU5vZGUsIDAsIHRvTm9kZSwgdG9Ob2RlLnRleHRDb250ZW50Lmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBTZXRzIHRoZSBjYXJldCBwb3NpdGlvbiB0byB0aGUgcG9zaXRpb24gaW4gdGhlIG5vZGVcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgRE9NIG5vZGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgY2FyZXQgcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gc2V0Q2FyZXRQb3NpdGlvbihub2RlLCBwb3MpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmICghIGRvYykgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0Q2FyZXRQb3NpdGlvbjogZWxlbWVudCBoYXMgbm8gZG9jdW1lbnQnKTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBwb3MpO1xuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KG5vZGUpXG4gICAgICAgICwgc2VsID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIG9mIGEgc2VsZWN0aW9uXG4gKlxuICogMSBmb3J3YXJkLCAtMSBiYWNrd2FyZCwgMCBubyBkaXJlY3Rpb24sIHVuZGVmaW5lZCBvbmUgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQgb3IgaW4gYSBkaWZmZXJlbnQgZnJhbWVcbiAqXG4gKiBAcGFyYW0ge3NlbH0gYSBzZWxlY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJuIHstMXwwfDF8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24oc2VsKXtcbiAgICByZXR1cm4gX2dldERpcmVjdGlvbihzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KXtcbiAgICB2YXIgZG9jUG9zaXRpb24gPSBmcm9tTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0b05vZGUpO1xuICAgIGlmIChkb2NQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKXtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpe1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb21Ob2RlID09IHRvTm9kZSl7XG4gICAgICAgIGlmIChzdGFydE9mZnNldCA8IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgcmFuZ2UgaW4gYSBkb2N1bWVudFxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gZnJvbU5vZGUgRE9NIG5vZGUgdG8gc3RhcnQgc2VsZWN0aW9uIGluXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmZzZXRcbiAqIEBwYXJhbSB7Tm9kZX0gdG9Ob2RlIERPTSBub2RlIHRvIGVuZCBzZWxlY3Rpb24gaW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmZzZXRcbiAqL1xuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZyb21Ob2RlLCBzdGFydE9mZnNldCwgdG9Ob2RlLCBlbmRPZmZzZXQpIHtcbiAgICB2YXIgZG9jID0gZnJvbU5vZGUub3duZXJEb2N1bWVudDtcbiAgICBpZiAoISBkb2MpIHJldHVybiBsb2dnZXIoJ3NldENhcmV0UG9zaXRpb246IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIGJhY2t3YXJkID0gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KSA9PSAtMTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICB2YXIgY29udGFpbmVyLCBvcmlnaW5hbENvbnRlbnRFZGl0YWJsZTtcbiAgICAvLyBkb2VzIG5vdCB3b3JrIGluIG5vbiBjb250ZW50RWRpdGFibGUgaXRlbXNcblxuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KGZyb21Ob2RlKVxuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgICAgICByYW5nZS5zZXRFbmQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9PSBOb2RlLkVMRU1FTlRfTk9ERSA/XG4gICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIDpcbiAgICAgICAgcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIGlmICghY29udGFpbmVyLmlzQ29udGVudEVkaXRhYmxlKXtcbiAgICAgICAgb3JpZ2luYWxDb250ZW50RWRpdGFibGUgPSBjb250YWluZXIuY29udGVudEVkaXRhYmxlOyAvLyBmYWxzZSBvciBpbmhlcml0XG4gICAgICAgIGNvbnRhaW5lci5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB9XG5cbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIHNlbC5leHRlbmQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbENvbnRlbnRFZGl0YWJsZSl7XG4gICAgICAgIC8vIHJlc3RvcmluZyBjb250ZW50RWRpdGFibGVcbiAgICAgICAgY29udGFpbmVyLmNvbnRlbnRFZGl0YWJsZSA9IG9yaWdpbmFsQ29udGVudEVkaXRhYmxlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDbGVhcnMgc2VsZWN0aW9uIGluIGEgZ2l2ZW4gd2luZG93XG4gKiBAcGFyYW0ge1dpbmRvd30gd2luXG4gKi9cbmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKHdpbikge1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG59XG5cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGFuIGVsZW1lbnQncyB0b3RhbCB0b3AgYW5kIGxlZnQgb2Zmc2V0IGZyb20gdGhlIGRvY3VtZW50IGVkZ2UuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggcG9zaXRpb24gbmVlZHMgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSB7aW5jbHVkZUJvcmRlcn0gaWYgaXMgdG8gaW5jbHVkZSB0aGUgYm9yZGVyIHdpZHRoXG4gKiBAcmV0dXJuIHtPYmplY3R9IHZlY3RvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvcE9mZnNldCBhbmQgbGVmdE9mZnNldFxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50T2Zmc2V0KGVsLCBpbmNsdWRlQm9yZGVyKSB7XG4gICAgdmFyIHlQb3MsIHhQb3M7XG5cbiAgICB5UG9zID0gZWwub2Zmc2V0VG9wO1xuICAgIHhQb3MgPSBlbC5vZmZzZXRMZWZ0O1xuICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuXG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICAgIHlQb3MgKz0gZWwub2Zmc2V0VG9wICsgZ2V0Qm9yZGVyKGVsLCAnSGVpZ2h0JywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIHhQb3MgKz0gZWwub2Zmc2V0TGVmdCArIGdldEJvcmRlcihlbCwgJ1dpZHRoJywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRvcE9mZnNldDogeVBvcywgbGVmdE9mZnNldDogeFBvcyB9O1xufVxuXG5cbmZ1bmN0aW9uIGdldEJvcmRlcihlbCwgdHlwZSwgaW5jbHVkZUJvcmRlcikge1xuICAgIGlmIChpbmNsdWRlQm9yZGVyKSB7XG4gICAgICAgIHZhciBzaWRlID0gKHR5cGUgPT0gJ0hlaWdodCcpID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCksXG4gICAgICAgICAgICBzaWRlVmFsdWUgPSBwYXJzZUludChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLScgKyBzaWRlICsgJy13aWR0aCcpLCAxMCk7XG5cbiAgICAgICAgaWYgKHNpZGVWYWx1ZSkgcmV0dXJuIHNpZGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWRcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnQpe1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgdGV4dCBub2RlIG9mIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8Tm9kZX0gbm9kZSB0aGUgbm9kZSB0byBiZSBzZWFyY2hlZCwgaWYgdGhlIG5vZGUgaXMgdGV4dCBub2RlIHdlIHJldHVybiB0aGUgbm9kZS5cbiAqIEByZXR1cm4ge1RleHROb2RlfVxuICovXG5mdW5jdGlvbiBmaXJzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGNoaWxkIHRleHQgbm9kZSBvZiBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE5vZGV9IG5vZGUgdGhlIG5vZGUgdG8gYmUgc2VhcmNoZWQsIGlmIHRoZSBub2RlIGlzIHRleHQgbm9kZSB3ZSByZXR1cm4gdGhlIG5vZGUuXG4gKiBAcmV0dXJuIHtUZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gbGFzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5sYXN0Q2hpbGQoKTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCBwdXR0aW5nIGl0cyBjaGlsZHJlbiBpbiBpdHMgcGxhY2VcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIFwidW53cmFwcGVkXCJcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgLy8gbXVzdCBiZSBjb3BpZWQgdG8gYXZvaWQgaXRlcmF0aW5nIGEgbXV0YXRpbmcgbGlzdCBvZiBjaGlsZE5vZGVzXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF8uc2xpY2UoZWwuY2hpbGROb2Rlcyk7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnJhZy5hcHBlbmRDaGlsZCwgZnJhZyk7XG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoZnJhZywgZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogV3JhcHMgYW4gZWxlbWVudCBpbiBhbm90aGVyIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSB3cmFwSW50b0VsXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiB3cmFwSW5FbGVtZW50KHdyYXBJbnRvRWwsIGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUod3JhcEludG9FbCwgZWwpO1xuICAgICAgICB3cmFwSW50b0VsLmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBUcmltcyBhIHRleHQgbm9kZSBvZiB0cmFpbGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlUmlnaHQobm9kZSkge1xuICAgIHJldHVybiBfdHJpbU5vZGUobm9kZSwgJ3RyaW1SaWdodCcpO1xufVxuXG5cbi8qKlxuICogVHJpbXMgYSB0ZXh0IG5vZGUgb2YgbGVhZGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlTGVmdChub2RlKSB7XG4gICAgcmV0dXJuIF90cmltTm9kZShub2RlLCAndHJpbUxlZnQnKTtcbn1cblxuXG5mdW5jdGlvbiBfdHJpbU5vZGUobm9kZSwgbWV0aG9kTmFtZSkge1xuICAgIHZhciBsZW4gPSBub2RlLmxlbmd0aDtcbiAgICBub2RlLnRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudFttZXRob2ROYW1lXSgpO1xuICAgIHJldHVybiBsZW4gIT09IG5vZGUubGVuZ3RoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCBmcm9tIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiBkZXRhY2hDb21wb25lbnQoZWwpIHtcbiAgICBkZWxldGUgZWxbY29uZmlnLmNvbXBvbmVudFJlZl07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgYSBodG1sIHN0cmluZ1xuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgQW55IHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBzdHJpbmcgY2xlYW5lZCBvZiBhbnkgaHRtbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoc3RyKSB7XG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIG5hdGl2ZSBUcmVlV2Fsa2VyIHRoYXQgYXV0b21hdGljYWxseSB3YWxrcyB0aGUgdHJlZSBhbmQgY2FsbHMgYW4gaXRlcmF0b3IgZnVuY3Rpb24uXG4gKiBUaGlzIHdpbGwgbm90IGl0ZXJhdGUgdGhlIHJvb3QgZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290IFRoZSBjb250YWluaW5nIHJvb3QgZWxlbWVudCB0byBiZSB3YWxrZWQuIFdpbGwgbm90IGJlIGl0ZXJhdGVkLlxuICogQHBhcmFtICB7Tm9kZUZpbGVyfSBmaWx0ZXIgQSBOb2RlRmlsdGVyIGNvbnN0YW50LCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1RyZWVXYWxrZXJcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBpdGVyYXRvciBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIG5vZGUuIFJldHVybmluZyAnZmFsc2UnIHdpbGwgYnJlYWsuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGNvbnRleHQgQW4gb3B0aW9uYWwgY29udGV4dCB0byBwYXNzZWQsIGRlZmF1bHRzIHRvIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHdhbGtUcmVlKHJvb3QsIGZpbHRlciwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgdHcgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJvb3QsIGZpbHRlcik7XG4gICAgd2hpbGUodHcubmV4dE5vZGUoKSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHJvb3QsIHR3LmN1cnJlbnROb2RlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIGJyZWFrO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgY2hpbGQgaW5kZXhlcyBvZiBlbGVtZW50IHBhdGggaW5zaWRlIHJvb3QgZWxlbWVudCBpbiBET00gdHJlZSB1c2luZyBicmVhZHRoIGZpcnN0IHRyZWUgdHJhdmVyc2FsLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluc2lkZSByb290IGVsZW1lbnQsIDAgaWYgdGhlIHJvb3QgZWxlbWVudCBpdHNlbGYgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IHRvIHNlYXJjaFxuICogQHBhcmFtICB7RWxlbWVudH0gZWwgZWxlbWVudCB0byBmaW5kIHRoZSBpbmRleCBvZlxuICogQHJldHVybiB7QXJyYXlbTnVtYmVyXX1cbiAqL1xuZnVuY3Rpb24gdHJlZVBhdGhPZihyb290RWwsIGVsKSB7XG4gICAgaWYgKCEgKHJvb3RFbCAmJiByb290RWwuY29udGFpbnMoZWwpKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyZWVQYXRoID0gW11cbiAgICAgICAgLCBub2RlID0gcm9vdEVsO1xuXG4gICAgd2hpbGUgKG5vZGUgIT0gZWwpIHtcbiAgICAgICAgdmFyIG5vZGVJbmRleCA9IF8uZmluZEluZGV4KG5vZGUuY2hpbGROb2RlcywgY29udGFpbnNFbCk7XG4gICAgICAgIHRyZWVQYXRoLnB1c2gobm9kZUluZGV4KTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tub2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlUGF0aDtcblxuICAgIGZ1bmN0aW9uIGNvbnRhaW5zRWwoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLmNvbnRhaW5zKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGVsZW1lbnQgYXQgZ2l2ZW4gdHJlZSBwYXRoXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWxcbiAqIEBwYXJhbSB7QXJyYXlbTnVtYmVyXX0gdHJlZVBhdGhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVhcmVzdCByZXR1cm4gbmVhcmVzdCBwb3NzaWJsZSBub2RlIGlmIGV4YWN0IG5vZGUgZG9lcyBub3QgZXhpc3RcbiAqIEByZXR1cm4ge05vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVBdFRyZWVQYXRoKHJvb3RFbCwgdHJlZVBhdGgsIG5lYXJlc3QpIHtcbiAgICBpZiAoIXRyZWVQYXRoKSByZXR1cm47XG5cbiAgICB2YXIgbGVuID0gdHJlZVBhdGgubGVuZ3RoO1xuICAgIGlmIChsZW4gPT09IDApIHJldHVybiByb290RWw7XG5cbiAgICB2YXIgbm9kZSA9IHJvb3RFbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBpZiAoISBjaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEgbmVhcmVzdCkgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZEluZGV4ID0gdHJlZVBhdGhbaV1cbiAgICAgICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKCEgY2hpbGQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZWFyZXN0XG4gICAgICAgICAgICAgICAgICAgID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBJbnNlcnRzIGFuIGVsZW1lbnQgaW5zaWRlIHJvb3QgYXQgYSBnaXZlbiBwYXRoIGluIHRyZWUgKHRoYXQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGluZGV4IHJldHVybmVkIGJ5IGB0cmVlUGF0aE9mYCBmdW5jdGlvbikuIElmIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcm9vdCdzIHRyZWUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmaXJzdCBhbmQgdGhlbiBtb3ZlZCB0byB0aGUgcGFzc2VkIHRyZWVJbmRleFxuICogSW5zZXJ0aW9uIGF0IGluZGV4IDAgaXMgbm90IHBvc3NpYmxlIGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQgYXMgaXQgd291bGQgbWVhbiByZXBsYWNpbmcgdGhlIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IGludG8gd2hpY2ggdG8gaW5zZXJ0XG4gKiBAcGFyYW0ge051bWJlcn0gdHJlZUluZGV4IGluZGV4IGluIERPTSB0cmVlIGluc2lkZSByb290IGVsZW1lbnQgKHNlZSB0cmVlUGF0aE9mKVxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIGJlIGluc2VydGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWRcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLCBlbCwgbmVhcmVzdCkge1xuICAgIHZhciB0b05vcm1hbGl6ZSA9IGVsLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFO1xuICAgIGlmIChyb290RWwuY29udGFpbnMoZWwpKVxuICAgICAgICByZW1vdmVFbGVtZW50KGVsKTsgLy8gY2FuJ3QgdXNlIHJlbW92ZUNoaWxkIGFzIHJvb3RFbCBoZXJlIGlzIG5vdCBhbiBpbW1lZGlhdGUgcGFyZW50XG5cbiAgICBpZiAodHJlZVBhdGgubGVuZ3RoID09IDApIHJldHVybjtcblxuICAgIHZhciBwYXJlbnQgPSBnZXROb2RlQXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLnNsaWNlKDAsIC0xKSwgbmVhcmVzdClcbiAgICAgICAgLCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVzO1xuXG4gICAgaWYgKCEgY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKG5lYXJlc3QpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcbiAgICAgICAgfSBlbHNlIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRJbmRleCA9IHRyZWVQYXRoW3RyZWVQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcblxuICAgIGlmIChjaGlsZCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsLCBjaGlsZCk7XG4gICAgICAgIGlmICh0b05vcm1hbGl6ZSkgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAoY2hpbGRJbmRleCA9PT0gMCB8fCBuZWFyZXN0KSkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICBpZiAodG9Ob3JtYWxpemUpIHBhcmVudC5ub3JtYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4IC0gMV07XG4gICAgICAgIGlmIChjaGlsZCB8fCBuZWFyZXN0KSB7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgaWYgKHRvTm9ybWFsaXplKSBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaXJzdCB0cmVlIHBhdGggcG9pbnRzIHRvIGEgbm9kZSB3aGljaCBpcyBiZWZvcmUgdGhlIG90aGVyIGluIHRoZSBkb2N1bWVudCBvcmRlci5cbiAqIEBwYXJhbSAge0FycmF5fSAgcGF0aDEgICBBIHRyZWVwYXRoIGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gIHBhdGgyICAgQSB0cmVlcGF0aCBhcnJheVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNUcmVlUGF0aEJlZm9yZShwYXRoMSwgcGF0aDIpIHtcbiAgICB2YXIgaSA9IDBcbiAgICAgICAgLCBpc0JlZm9yZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aDEpICYmIEFycmF5LmlzQXJyYXkocGF0aDIpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdpc1RyZWVQYXRoQmVmb3JlOiBPbmUgb3IgYm90aCBwYXRocyBhcmUgbm90IHZhbGlkIHRyZWVwYXRoIGFycmF5cy4nKTtcblxuICAgIGZvciAoaTsgaSA8IHBhdGgxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoMVtpXSA8IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChwYXRoMVtpXSA+IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlzQmVmb3JlID09ICd1bmRlZmluZWQnKVxuICAgICAgICBpZiAocGF0aDEubGVuZ3RoIDwgcGF0aDIubGVuZ3RoKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lzVHJlZVBhdGhCZWZvcmU6IE9uZSBub2RlIGlzIGluc2lkZSBhbm90aGVyJyk7XG5cbiAgICByZXR1cm4gaXNCZWZvcmUgfHwgZmFsc2U7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBub24gbGF0aW4gY2hhcmFjdGVycyB0byBIVE1MIGVudGl0eSBjb2Rlcy5cbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgdGhlIHN0cmluZyB3aXRoIGh0bWwgZW50aXRpZXNcbiAqL1xuZnVuY3Rpb24gaHRtbEVudGl0aWVzKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcdTAwQTAtXFx1OTk5OTk8PlxcJl0vZ2ltLCBmdW5jdGlvbihpKSB7XG4gICAgICAgIHJldHVybiAnJiMnK2kuY2hhckNvZGVBdCgwKSsnOyc7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdykge1xuICAgIHdoYXRUb1Nob3cgPSB3aGF0VG9TaG93IHx8IChOb2RlRmlsdGVyLlNIT1dfVEVYVCB8IE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdyB0aGUgbm9kZSBpcyBpblxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHJldHVybiB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXROb2RlV2luZG93KG5vZGUpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBkb2MgJiYgKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93KTtcbn1cblxuXG5cbi8qKlxuICogZG8gc29tZXRoaW5nIGZvciBlYWNoIG5vZGVzIGNvbnRhaW5lZCBpbiBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gYSByYW5nZVxuICogQHBhcmFtIHtjYn0gYSBmdW5jdGlvbiB0YWtpbmcgYSBub2RlIGFzIGFyZ3VtZW50XG5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaE5vZGVzSW5SYW5nZShyYW5nZSwgY2Ipe1xuICAgIHZhciByYW5nZUNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgICAgICwgZG9jID0gcmFuZ2VDb250YWluZXIub3duZXJEb2N1bWVudDtcblxuICAgIGZ1bmN0aW9uIGlzTm9kZUluc2lkZVJhbmdlKG5vZGUpe1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgdmFyIGlzSW5zaWRlID0gZmFsc2U7XG4gICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5TVEFSVF9UT19TVEFSVCwgcmFuZ2UpICE9IC0xXG4gICAgICAgICAgICAmJiBub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZSkgIT0gMSl7XG4gICAgICAgICAgICBpc0luc2lkZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVJhbmdlLmRldGFjaCgpO1xuICAgICAgICByZXR1cm4gaXNJbnNpZGU7XG4gICAgfVxuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihyYW5nZUNvbnRhaW5lcixcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXG4gICAgdmFyIGN1cnJlbnROb2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKSl7IC8vIHNob3VsZCBiZSBhc3NpZ25tZW50XG4gICAgICAgIGlmIChpc05vZGVJbnNpZGVSYW5nZShjdXJyZW50Tm9kZSkpe1xuICAgICAgICAgICAgY2IoY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIGdldCBhbGwgY29tcG9uZW50cyBjb250YWluZWQgaW4gYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGEgRE9NIHJhbmdlLlxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHJhbmdlKSB7XG4gICAgdmFyIHdpbiA9IGdldE5vZGVXaW5kb3cocmFuZ2Uuc3RhcnRDb250YWluZXIpXG4gICAgICAgICwgQ29tcG9uZW50ID0gd2luLm1pbG8uQ29tcG9uZW50O1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICBmb3JFYWNoTm9kZXNJblJhbmdlKHJhbmdlLCBmdW5jdGlvbiAobm9kZSl7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQobm9kZSk7XG4gICAgICAgICAgICBpZiAoY29tcClcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnRzO1xufVxuXG4vKipcbiAqIGRlbGV0ZSBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gZGVsZXRlIGEgRE9NIHJhbmdlIGFuZCBhbGwgdGhlIGNvbXBvbmVudHMgaW5zaWRlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMocmFuZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHNGcm9tUmFuZ2UocmFuZ2UpO1xuXG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgY29tcC5kZXN0cm95KHRydWUpO1xuICAgIH0pO1xuXG4gICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0d28gcmFuZ2VzIGFyZSBlcXVpdmFsZW50XG4gKlxuICogQHBhcmFtIHtyYW5nZX0gcmFuZ2UxXG4gKiBAcGFyYW0ge3JhbmdlfSByYW5nZTJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGFyZSB0aGUgdHdvIHJhbmdlcyBlcXVpdmFsZW50XG4gKi9cbmZ1bmN0aW9uIGFyZVJhbmdlc0VxdWFsKHJhbmdlMSwgcmFuZ2UyKXtcbiAgICByZXR1cm4gcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIHJhbmdlMikgPT0gMCAmJiByYW5nZTEuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZTIpID09IDA7XG59XG5cblxuLyoqXG4gKiBBZGRzIGEgc2luZ2xlIHBpeGVsIGRpdiB0byB0aGUgYm9keSBhdCBhIGdpdmVuIHggYW5kIHkgcG9zaXRpb24uIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHBvc2l0aW9uIHNwZWNpZmljIGNvZGUuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqL1xuZnVuY3Rpb24gYWRkRGVidWdQb2ludCh4LCB5KSB7XG4gICAgdmFyIGRiRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkYkVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOmZpeGVkOyBsZWZ0OicreCsncHg7IHRvcDonK3krJ3B4OyBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsgei1pbmRleDogMTAwJyk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRiRWwpO30sIDIwMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUxpc3RlbmVycztcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKERPTUxpc3RlbmVycywge1xuICAgIGFkZDogRE9NTGlzdGVuZXJzJGFkZCxcbiAgICByZW1vdmU6IERPTUxpc3RlbmVycyRyZW1vdmUsXG4gICAgcmVtb3ZlQWxsOiBET01MaXN0ZW5lcnMkcmVtb3ZlQWxsXG59KTtcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMkYWRkKHRhcmdldCwgZXZlbnRUeXBlLCBoYW5kbGVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlclxuICAgIH0pO1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcik7XG59XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzJHJlbW92ZSh0YXJnZXQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHZhciBsaXN0ZW5lciA9IHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgfTtcbiAgICB2YXIgaWR4ID0gXy5maW5kSW5kZXgodGhpcy5saXN0ZW5lcnMsIF8ucGFydGlhbChfLmlzRXF1YWwsIGxpc3RlbmVyKSk7XG5cbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERPTUxpc3RlbmVycyRyZW1vdmVBbGwoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaChfcmVtb3ZlTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyKGwpIHtcbiAgICBsLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGwuZXZlbnRUeXBlLCBsLmhhbmRsZXIpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkb21SZWFkeTtcblxuXG52YXIgZG9tUmVhZHlGdW5jcyA9IFtdXG4gICAgLCBkb21SZWFkeVN1YnNjcmliZWQgPSBmYWxzZTtcblxuXG5mdW5jdGlvbiBkb21SZWFkeShmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBpZiAoaXNSZWFkeS5jYWxsKHRoaXMpKVxuICAgICAgICBjYWxsRnVuYygpO1xuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWRvbVJlYWR5U3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIG9uRG9tUmVhZHkpO1xuICAgICAgICAgICAgZG9tUmVhZHlTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBkb21SZWFkeUZ1bmNzLnB1c2goY2FsbEZ1bmMpOyAvLyBjbG9zdXJlIGlzIGFkZGVkLCBzbyBldmVyeSB0aW1lIGRpZmZlcmVudCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxGdW5jKCkge1xuICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbkRvbVJlYWR5KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbkRvbVJlYWR5KTtcbiAgICBkb21SZWFkeUZ1bmNzLmZvckVhY2goZnVuY3Rpb24oZnVuYykgeyBmdW5jKCk7IH0pO1xufVxuXG5cbl8uZXh0ZW5kKGRvbVJlYWR5LCB7XG4gICAgaXNSZWFkeTogaXNSZWFkeVxufSk7XG5cblxuZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnID8gZmFsc2UgOiByZWFkeVN0YXRlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgZHJhZ0Ryb3BDb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKS5kcmFnRHJvcFxuICAgICwgY29tcG9uZW50TWV0YVJlZ2V4ID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFSZWdleFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBiYXNlMzIgPSByZXF1aXJlKCdiYXNlMzInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdEcm9wO1xuXG5cbi8qKlxuICogV3JhcHBlciBmb3IgZXZlbnQuZGF0YVRyYW5zZmVyIG9mIGRyYWctZHJvcCBIVE1MIEFQSVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtldmVudH0gRE9NIGV2ZW50XG4gKiBAcmV0dXJuIHtEcmFnRHJvcH1cbiAqL1xuZnVuY3Rpb24gRHJhZ0Ryb3AoZXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXI7XG4gICAgdGhpcy50eXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcztcbn1cblxuLyoqXG4gKiBVc2FnZTpcbiAqIHZhciB0ZXN0RFQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICogdGVzdERULnNldENvbXBvbmVudE1ldGEobmV3Q29tcG9uZW50LCB7dGVzdDogJ3Rlc3QnLCB0ZXN0MjogJ3Rlc3QyJ30pO1xuICogdGVzdERULmdldENvbXBvbmVudE1ldGEoKTtcbiAqL1xuXG5fLmV4dGVuZChEcmFnRHJvcCwge1xuICAgIGNvbXBvbmVudERhdGFUeXBlOiBEcmFnRHJvcCQkY29tcG9uZW50RGF0YVR5cGVcbn0pO1xuXG5fLmV4dGVuZFByb3RvKERyYWdEcm9wLCB7XG4gICAgaXNDb21wb25lbnQ6IERyYWdEcm9wJGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudFN0YXRlOiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSxcbiAgICBzZXRDb21wb25lbnRTdGF0ZTogRHJhZ0Ryb3Akc2V0Q29tcG9uZW50U3RhdGUsXG4gICAgZ2V0Q29tcG9uZW50TWV0YTogRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50TWV0YSxcbiAgICBzZXRDb21wb25lbnRNZXRhOiBEcmFnRHJvcCRzZXRDb21wb25lbnRNZXRhLFxuICAgIGdldEFsbG93ZWRFZmZlY3RzOiBEcmFnRHJvcCRnZXRBbGxvd2VkRWZmZWN0cyxcbiAgICBzZXRBbGxvd2VkRWZmZWN0czogRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMsXG4gICAgZ2V0RHJvcEVmZmVjdDogRHJhZ0Ryb3AkZ2V0RHJvcEVmZmVjdCxcbiAgICBzZXREcm9wRWZmZWN0OiBEcmFnRHJvcCRzZXREcm9wRWZmZWN0LFxuICAgIGlzRWZmZWN0QWxsb3dlZDogRHJhZ0Ryb3AkaXNFZmZlY3RBbGxvd2VkLFxuICAgIGdldERhdGE6IERyYWdEcm9wJGdldERhdGEsXG4gICAgc2V0RGF0YTogRHJhZ0Ryb3Akc2V0RGF0YSxcbiAgICBjbGVhckRhdGE6IERyYWdEcm9wJGNsZWFyRGF0YVxufSk7XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkJGNvbXBvbmVudERhdGFUeXBlKCkge1xuICAgIHJldHVybiBkcmFnRHJvcENvbmZpZy5kYXRhVHlwZXMuY29tcG9uZW50O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBfLmluZGV4T2YodGhpcy50eXBlcywgRHJhZ0Ryb3AuY29tcG9uZW50RGF0YVR5cGUoKSkgPj0gMDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSgpIHtcbiAgICB2YXIgZGF0YVR5cGUgPSBEcmFnRHJvcC5jb21wb25lbnREYXRhVHlwZSgpXG4gICAgICAgICwgc3RhdGVTdHIgPSB0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKGRhdGFUeXBlKVxuICAgICAgICAsIHN0YXRlID0gXy5qc29uUGFyc2Uoc3RhdGVTdHIpO1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudFN0YXRlKGNvbXBvbmVudCwgc3RhdGVTdHIpe1xuICAgIGlmICghIHN0YXRlU3RyKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRUcmFuc2ZlclN0YXRlKHsgcmVxdWVzdGVkQnk6ICdkcmFnJyB9KTtcbiAgICAgICAgc3RhdGVTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZSk7XG4gICAgfVxuICAgIHZhciBkYXRhVHlwZSA9IERyYWdEcm9wLmNvbXBvbmVudERhdGFUeXBlKCk7XG5cbiAgICBzdGF0ZVN0ciAmJiB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBzdGF0ZVN0cik7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9odG1sJywgY29tcG9uZW50LmVsLm91dGVySFRNTCk7XG4gICAgcmV0dXJuIHN0YXRlU3RyO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudE1ldGEoY29tcG9uZW50LCBwYXJhbXMsIGRhdGEpIHtcbiAgICB2YXIgbWV0YSA9IF9jb21wb25lbnRNZXRhKGNvbXBvbmVudCk7XG5cbiAgICB2YXIgcGFyYW1zU3RyID0gXy50b1F1ZXJ5U3RyaW5nKHBhcmFtcyk7XG4gICAgdmFyIGRhdGFUeXBlID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJWNsYXNzJywgX2VuY29kZShtZXRhLmNvbXBDbGFzcyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclbmFtZScsIF9lbmNvZGUobWV0YS5jb21wTmFtZSB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclcGFyYW1zJywgX2VuY29kZShwYXJhbXNTdHIgfHwgJycpKTtcblxuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICdvYmplY3QnKSBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBkYXRhIHx8ICcnKTtcblxuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG5mdW5jdGlvbiBfZW5jb2RlKHN0cikge1xuICAgIHJldHVybiBiYXNlMzIuZW5jb2RlKHN0cikudG9Mb3dlckNhc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBfY29tcG9uZW50TWV0YShjb21wb25lbnQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnRyYW5zZmVyXG4gICAgICAgICAgICA/IGNvbXBvbmVudC50cmFuc2Zlci5nZXRDb21wb25lbnRNZXRhKClcbiAgICAgICAgICAgIDogeyBcbiAgICAgICAgICAgICAgICBjb21wQ2xhc3M6IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgIGNvbXBOYW1lOiBjb21wb25lbnQubmFtZVxuICAgICAgICAgICAgfTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRNZXRhKCkge1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgbWV0YURhdGFUeXBlID0gXy5maW5kKHRoaXMudHlwZXMsIGZ1bmN0aW9uIChkVHlwZSkge1xuICAgICAgICBtYXRjaCA9IGRUeXBlLm1hdGNoKGNvbXBvbmVudE1ldGFSZWdleCk7XG4gICAgICAgIHJldHVybiAhIW1hdGNoO1xuICAgIH0pO1xuICAgIGlmICghbWV0YURhdGFUeXBlKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpPTE7IGk8NDsgaSsrKVxuICAgICAgICBtYXRjaFtpXSA9IGJhc2UzMi5kZWNvZGUobWF0Y2hbaV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcENsYXNzOiBtYXRjaFsxXSxcbiAgICAgICAgY29tcE5hbWU6IG1hdGNoWzJdLFxuICAgICAgICBwYXJhbXM6IF8uZnJvbVF1ZXJ5U3RyaW5nKG1hdGNoWzNdKSxcbiAgICAgICAgbWV0YURhdGFUeXBlOiBtZXRhRGF0YVR5cGUsXG4gICAgICAgIG1ldGFEYXRhOiBfLmpzb25QYXJzZSh0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKG1ldGFEYXRhVHlwZSkpIFxuICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEobWV0YURhdGFUeXBlKSkgXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShtZXRhRGF0YVR5cGUpXG4gICAgfTtcbn1cblxuXG4vLyBhcyBkZWZpbmVkIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRHJhZ0Ryb3AvRHJhZ19PcGVyYXRpb25zI2RyYWdzdGFydFxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0QWxsb3dlZEVmZmVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMoZWZmZWN0cykge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBlZmZlY3RzO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERyb3BFZmZlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RHJvcEVmZmVjdChlZmZlY3QpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gZWZmZWN0O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzRWZmZWN0QWxsb3dlZChlZmZlY3QpIHtcbiAgICB2YXIgYWxsb3dlZEVmZmVjdHMgPSB0aGlzLmdldEFsbG93ZWRFZmZlY3RzKClcbiAgICAgICAgLCBpc0NvcHkgPSBlZmZlY3QgPT0gJ2NvcHknXG4gICAgICAgICwgaXNNb3ZlID0gZWZmZWN0ID09ICdtb3ZlJ1xuICAgICAgICAsIGlzTGluayA9IGVmZmVjdCA9PSAnbGluaydcbiAgICAgICAgLCBpc0FsbG93ZWQgPSBpc0NvcHkgfHwgaXNMaW5rIHx8IGlzTW92ZTtcblxuICAgIHN3aXRjaCAoYWxsb3dlZEVmZmVjdHMpIHtcbiAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBhbGxvd2VkRWZmZWN0cyA9PSBlZmZlY3Q7XG4gICAgICAgIGNhc2UgJ2NvcHlMaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBpc0NvcHkgfHwgaXNMaW5rO1xuICAgICAgICBjYXNlICdjb3B5TW92ZSc6XG4gICAgICAgICAgICByZXR1cm4gaXNDb3B5IHx8IGlzTW92ZTtcbiAgICAgICAgY2FzZSAnbGlua01vdmUnOlxuICAgICAgICAgICAgcmV0dXJuIGlzTGluayB8fCBpc01vdmU7XG4gICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGNhc2UgJ3VuaW5pdGlhbGl6ZWQnOlxuICAgICAgICAgICAgcmV0dXJuIGlzQWxsb3dlZDtcbiAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERhdGEoZGF0YVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSk7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RGF0YShkYXRhVHlwZSwgZGF0YVN0cikge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLnNldERhdGEoZGF0YVR5cGUsIGRhdGFTdHIpO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGNsZWFyRGF0YShkYXRhVHlwZSkge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YShkYXRhVHlwZSk7XG59XG5cblxuLyoqXG4gKiBEcmFnIGRyb3Agc2VydmljZSBjb21wZW5zYXRpbmcgZm9yIHRoZSBsYWNrIG9mIGNvbW11bmljYXRpb24gZnJvbSBkcm9wIHRhcmdldCB0byBkcmFnIHNvdXJjZSBpbiBET00gQVBJXG4gKi9cbnZhciBkcmFnRHJvcFNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgX2N1cnJlbnREcmFnRHJvcCwgX2N1cnJlbnREcmFnRmFjZXQ7XG5cbl8uZXh0ZW5kKERyYWdEcm9wLCB7XG4gICAgc2VydmljZTogZHJhZ0Ryb3BTZXJ2aWNlLFxuICAgIGRlc3Ryb3k6IERyYWdEcm9wX2Rlc3Ryb3lcbn0pO1xuXG5cbmRyYWdEcm9wU2VydmljZS5vbk1lc3NhZ2VzKHtcbiAgICAvLyBkYXRhIGlzIERyYWdEcm9wRGF0YVRyYW5zZmVyIGluc3RhbmNlXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdzdGFydFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wc3RhcnRlZCc6IG9uRHJhZ0Ryb3BTdGFydGVkLCBcbiAgICAvLyBkYXRhIGlzIG9iamVjdCB3aXRoIGF0IGxlYXN0IGRyb3BFZmZlY3QgcHJvcGVydHlcbiAgICAvLyBmaXJlZCBieSBEcm9wIGZhY2V0IG9uIFwiZHJvcFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wY29tcGxldGVkJzogb25EcmFnRHJvcENvbXBsZXRlZCwgXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdlbmRcIiBldmVudCB0byBjb21wbGV0ZSBkcmFnXG4gICAgLy8gaWYgZHJvcCBoYXBwZW5kZWQgaW4gYW5vdGhlciB3aW5kb3cgb3IgaWYgaXQgd2FzIGNhbmNlbGxlZFxuICAgICdjb21wbGV0ZWRyYWdkcm9wJzogb25Db21wbGV0ZURyYWdEcm9wXG59KTtcblxuXG5fLmV4dGVuZChkcmFnRHJvcFNlcnZpY2UsIHtcbiAgICBnZXRDdXJyZW50RHJhZ0Ryb3A6IGdldEN1cnJlbnREcmFnRHJvcFxufSk7XG5cblxuZnVuY3Rpb24gb25EcmFnRHJvcFN0YXJ0ZWQobXNnLCBkYXRhKSB7XG4gICAgX2N1cnJlbnREcmFnRHJvcCA9IGRhdGEuZHJhZ0Ryb3A7XG4gICAgX2N1cnJlbnREcmFnRmFjZXQgPSBkYXRhLmRyYWdGYWNldDtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdEcm9wQ29tcGxldGVkKG1zZywgZGF0YSkge1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ICYmIF9jdXJyZW50RHJhZ0ZhY2V0LnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbiAgICBfY3VycmVudERyYWdEcm9wID0gdW5kZWZpbmVkO1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ID0gdW5kZWZpbmVkO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ29tcGxldGVEcmFnRHJvcChtc2csIGRhdGEpIHtcbiAgICBpZiAoX2N1cnJlbnREcmFnRHJvcClcbiAgICAgICAgZHJhZ0Ryb3BTZXJ2aWNlLnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RHJhZ0Ryb3AoKSB7XG4gICAgcmV0dXJuIF9jdXJyZW50RHJhZ0Ryb3A7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3BfZGVzdHJveSgpIHtcbiAgICBkcmFnRHJvcFNlcnZpY2Uub2ZmQWxsKCk7XG59XG4iLCIvLyA8YSBuYW1lPVwidXRpbHMtZXJyb3JcIj48L2E+XG4vLyBtaWxvLnV0aWxzLmVycm9yXG4vLyAtLS0tLS0tLS0tLVxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLy8gbW9kdWxlIGV4cG9ydHMgZXJyb3IgY2xhc3NlcyBmb3IgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhpcyBhcnJheVxudmFyIGVycm9yQ2xhc3NOYW1lcyA9IFsnQWJzdHJhY3RDbGFzcycsICdNaXhpbicsICdNZXNzZW5nZXInLCAnQ29tcG9uZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0F0dHJpYnV0ZScsICdCaW5kZXInLCAnTG9hZGVyJywgJ01haWxNZXNzYWdlU291cmNlJywgJ0ZhY2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ1Njb3BlJywgJ01vZGVsJywgJ0RvbUZhY2V0JywgJ0VkaXRhYmxlRmFjZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAnTGlzdCcsICdDb25uZWN0b3InLCAnUmVnaXN0cnknLCAnRnJhbWVNZXNzYWdlU291cmNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0Ryb3AnLCAnQW5ndWxhcicsICdTdG9yYWdlTWVzc2FnZVNvdXJjZSddO1xuXG52YXIgZXJyb3IgPSB7XG4gICAgdG9CZUltcGxlbWVudGVkOiBlcnJvciR0b0JlSW1wbGVtZW50ZWQsXG4gICAgY3JlYXRlQ2xhc3M6IGVycm9yJGNyZWF0ZUNsYXNzXG59O1xuXG5lcnJvckNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgZXJyb3JbbmFtZV0gPSBlcnJvciRjcmVhdGVDbGFzcyhuYW1lICsgJ0Vycm9yJyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBlcnJvcjtcblxuXG5mdW5jdGlvbiBlcnJvciRjcmVhdGVDbGFzcyhlcnJvckNsYXNzTmFtZSkge1xuICAgIHZhciBFcnJvckNsYXNzID0gXy5tYWtlRnVuY3Rpb24oZXJyb3JDbGFzc05hbWUsICdtZXNzYWdlJyxcbiAgICAgICAgICAgICd0aGlzLm5hbWUgPSBcIicgKyBlcnJvckNsYXNzTmFtZSArICdcIjsgXFxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJUaGVyZSB3YXMgYW4gIGVycm9yXCI7Jyk7XG4gICAgXy5tYWtlU3ViY2xhc3MoRXJyb3JDbGFzcywgRXJyb3IpO1xuXG4gICAgcmV0dXJuIEVycm9yQ2xhc3M7XG59XG5cblxuZnVuY3Rpb24gZXJyb3IkdG9CZUltcGxlbWVudGVkKCkge1xuICAgIHRocm93IG5ldyBlcnJvci5BYnN0cmFjdENsYXNzKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vYmluZGVyJylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi9kb20nKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciBjcmVhdGVSYW5nZVBhdGhzID0gX2NyZWF0ZU5vZGVzQW5kUGF0aHNGdW5jKGRvbVV0aWxzLnRyZWVQYXRoT2YpO1xudmFyIGNyZWF0ZVJhbmdlTm9kZXMgPSBfY3JlYXRlTm9kZXNBbmRQYXRoc0Z1bmMoZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgpO1xuXG5cbnZhciBmcmFnbWVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0U3RhdGU6IGZyYWdtZW50X2dldFN0YXRlLFxuICAgIGdldFN0YXRlQXN5bmM6IGZyYWdtZW50X2dldFN0YXRlQXN5bmMsXG5cbiAgICBleHBhbmRSYW5nZVRvU2libGluZ3M6IGV4cGFuZFJhbmdlVG9TaWJsaW5ncyxcbiAgICBnZXRSYW5nZVNpYmxpbmdzOiBnZXRSYW5nZVNpYmxpbmdzLFxuICAgIGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzOiBjcmVhdGVSYW5nZUZyb21TaWJsaW5ncyxcbiAgICBjcmVhdGVSYW5nZUZyb21Ob2RlczogY3JlYXRlUmFuZ2VGcm9tU2libGluZ3MsIC8vIGFsaWFzXG4gICAgY3JlYXRlUmFuZ2VQYXRoczogY3JlYXRlUmFuZ2VQYXRocyxcbiAgICBjcmVhdGVSYW5nZU5vZGVzOiBjcmVhdGVSYW5nZU5vZGVzXG59O1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgb2Ygd3JhcHBlZCByYW5nZSB3aXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZyBwYXJ0aWFsbHkgc2VsZWN0ZWQuIFRoZSByYW5nZSB3aWxsIGJlIGNsb25lZCBhbmQgd3JhcHBlZCBpbiBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXQgYmVmb3JlIGdldHRpbmcgaXRzIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGxvZyBlcnJvciBhbmQgcmV0dXJuIHVuZGVmaW5lZCBpZiByYW5nZSBoYXMgbm8gY29tbW9uIGFuY2VzdG9yIHRoYXQgaGFzIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldFxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZSBET00gUmFuZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuYW1lQ2hpbGRyZW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBgdHJ1ZWAgdG8gcmVuYW1lIGZyYWdtZW50IGNoaWxkIGNvbXBvbmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB3cmFwcGVyQ2xhc3NOYW1lIG9wdGlvbmFsIHBhcmFtZXRlciB0byB3cmFwIGluIGEgY3VzdG9tIGNvbXBvbmVudCBjbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBmcmFnbWVudF9nZXRTdGF0ZShyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIHdyYXBwZXJDbGFzc05hbWUpIHtcbiAgICB2YXIgcmFuZ2VDb250YWluZXIgPSBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpO1xuICAgIGlmICghIHJhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZnJhZyA9IHJhbmdlLmNsb25lQ29udGVudHMoKVxuICAgICAgICAsIHdyYXBwZXIgPSBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSk7XG5cbiAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgIGlmIChyZW5hbWVDaGlsZHJlbikgX3JlbmFtZUNoaWxkcmVuKHdyYXBwZXIpO1xuICAgIHZhciB3cmFwcGVyU3RhdGUgPSB3cmFwcGVyLmdldFN0YXRlKCk7XG4gICAgXy5kZWZlck1ldGhvZCh3cmFwcGVyLCAnZGVzdHJveScpO1xuICAgIHJldHVybiB3cmFwcGVyU3RhdGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzdGF0ZSBvZiB3cmFwcGVkIHJhbmdlIHdpdGggY29tcG9uZW50cywgaW5jbHVkaW5nIHBhcnRpYWxseSBzZWxlY3RlZC4gVGhlIHJhbmdlIHdpbGwgYmUgY2xvbmVkIGFuZCB3cmFwcGVkIGluIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldCBiZWZvcmUgZ2V0dGluZyBpdHMgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHJlc3VsdCBhbmQgYW55IGVycm9yIHZpYSBjYWxsYmFjay5cbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2UgRE9NIFJhbmdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUNoaWxkcmVuIG9wdGlvbmFsIHBhcmFtZXRlciwgYHRydWVgIHRvIHJlbmFtZSBmcmFnbWVudCBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhbHdheXMgdGhlIGxhc3QgcGFyYW1ldGVyLCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiBiZSBkcm9wcGVkOyByZXN1bHQgaXMgcGFzc2VkIHZpYSBjYWxsYmFjayB3aXRoIGFueSBlcnJvciBhcyBmaXJzdCBwYXJhbWV0ZXJcbiAqL1xuZnVuY3Rpb24gZnJhZ21lbnRfZ2V0U3RhdGVBc3luYyhyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJhbmdlQ29udGFpbmVyID0gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKTtcbiAgICAgICAgaWYgKCEgcmFuZ2VDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJykpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBOT1QgY29ubmVjdCByZXR1cm4gdG8gcHJldmlvdXMgY2FsbGJhY2ssIGdldFN0YXRlIHNob3VsZCByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlbmFtZUNoaWxkcmVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gcmVuYW1lQ2hpbGRyZW47XG4gICAgICAgICAgICByZW5hbWVDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZyYWcgPSByYW5nZS5jbG9uZUNvbnRlbnRzKClcbiAgICAgICAgICAgICwgd3JhcHBlciA9IF93cmFwRnJhZ21lbnRJbkNvbnRhaW5lcihmcmFnKTtcblxuICAgICAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgICAgICBfLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd3JhcHBlci5icm9hZGNhc3QoJ3N0YXRlcmVhZHknKTtcbiAgICAgICAgICAgIF8uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuKSBfcmVuYW1lQ2hpbGRyZW4od3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZXJTdGF0ZSA9IHdyYXBwZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB3cmFwcGVyU3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSkge1xuICAgIHZhciB3cmFwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICAsIGF0dHIgPSBuZXcgQmluZEF0dHJpYnV0ZSh3cmFwRWwpO1xuXG4gICAgXy5leHRlbmQoYXR0ciwge1xuICAgICAgICBjb21wQ2xhc3M6IHdyYXBwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBGYWNldHM6IHdyYXBwZXJDbGFzc05hbWUgPyBbXSA6IFsnY29udGFpbmVyJ10sXG4gICAgICAgIGNvbXBOYW1lOiAnd3JhcHBlcidcbiAgICB9KTtcblxuICAgIGF0dHIuZGVjb3JhdGUoKTtcblxuICAgIHdyYXBFbC5hcHBlbmRDaGlsZChmcmFnKTtcbiAgICB2YXIgc2NvcGUgPSBiaW5kZXIod3JhcEVsKTtcbiAgICByZXR1cm4gc2NvcGUud3JhcHBlcjtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpIHtcbiAgICB2YXIgZWwgPSBkb21VdGlscy5jb250YWluaW5nRWxlbWVudChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XG4gICAgcmV0dXJuIENvbXBvbmVudC5nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCB0cnVlLCAnY29udGFpbmVyJyk7XG59XG5cblxuZnVuY3Rpb24gX3RyYW5zZmVyU3RhdGVzKGZyb21Db21wLCB0b0NvbXApIHtcbiAgICB2YXIgZnJvbVNjb3BlID0gZnJvbUNvbXAuY29udGFpbmVyLnNjb3BlO1xuICAgIHRvQ29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24odG9DaGlsZENvbXAsIG5hbWUpIHtcbiAgICAgICAgdmFyIGZyb21DaGlsZENvbXAgPSBmcm9tU2NvcGVbbmFtZV07XG4gICAgICAgIGlmICghIGZyb21DaGlsZENvbXApIHJldHVybiBsb2dnZXIuZXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiBjb25wb25lbnQnLCBuYW1lLCAnbm90IGZvdW5kIGluIHJhbmdlJyk7XG4gICAgICAgIHZhciBzdGF0ZSA9IGZyb21DaGlsZENvbXAuX2dldFN0YXRlKHRydWUpO1xuICAgICAgICB0b0NoaWxkQ29tcC5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3JlbmFtZUNoaWxkcmVuKGNvbXApIHtcbiAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW5hbWUoKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBleHBhbmRSYW5nZVRvU2libGluZ3MocmFuZ2UpIHtcbiAgICB2YXIgc2libGluZ3MgPSBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKTtcbiAgICByYW5nZSA9IGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzKHNpYmxpbmdzKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlUmFuZ2VGcm9tU2libGluZ3Mobm9kZXMpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGlmIChub2Rlcy5zaWJsaW5ncykge1xuICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShub2Rlcy5zdGFydCk7XG4gICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKG5vZGVzLmVuZCk7XG4gICAgfSBlbHNlXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZXMuc3RhcnQpO1xuICAgIHJldHVybiByYW5nZTtcbn1cblxuXG5mdW5jdGlvbiBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKSB7XG4gICAgdmFyIGNvbnRhaW5lck5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgICAgICAsIHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gICAgICAgICwgZW5kTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lcjtcblxuICAgIGlmIChzdGFydE5vZGUgPT0gZW5kTm9kZSkge1xuICAgICAgICBpZiAoc3RhcnROb2RlICE9IGNvbnRhaW5lck5vZGUpIGxvZ2dlci5lcnJvcignZGVsZXRlU2VsZWN0aW9uQ29tbWFuZCBsb2dpY2FsIGVycm9yOiBzdGFydD09ZW5kLCBidXQgY29udGFpbmVyIGlzIGRpZmZlcmVudCcpO1xuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBzdGFydE5vZGUgfTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnROb2RlID09IGNvbnRhaW5lck5vZGUgfHwgZW5kTm9kZSA9PSBjb250YWluZXJOb2RlKVxuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBjb250YWluZXJOb2RlIH07XG5cbiAgICB2YXIgc3RhcnRTaWJsaW5nID0gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc3RhcnROb2RlKTtcbiAgICB2YXIgZW5kU2libGluZyA9IF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIGVuZE5vZGUpO1xuXG4gICAgaWYgKHN0YXJ0U2libGluZyAmJiBlbmRTaWJsaW5nKSB7XG4gICAgICAgIGlmIChzdGFydFNpYmxpbmcgPT0gZW5kU2libGluZykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdkZWxldGVTZWxlY3Rpb25Db21tYW5kIGxvZ2ljYWwgZXJyb3I6IHNhbWUgc2libGluZ3MnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiBmYWxzZSwgc3RhcnQ6IHN0YXJ0U2libGluZyB9O1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiB0cnVlLCBzdGFydDogc3RhcnRTaWJsaW5nLCBlbmQ6IGVuZFNpYmxpbmcgfTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc2VsTm9kZSkge1xuICAgIHJldHVybiBfLmZpbmQoY29udGFpbmVyTm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnRhaW5zKHNlbE5vZGUpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVOb2Rlc0FuZFBhdGhzRnVuYyhmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJvb3RFbCwgZnJvbU9iaikge1xuICAgICAgICB2YXIgdG9PYmogPSB7XG4gICAgICAgICAgICBzaWJsaW5nczogZnJvbU9iai5zaWJsaW5ncyxcbiAgICAgICAgICAgIHN0YXJ0OiBmdW5jKHJvb3RFbCwgZnJvbU9iai5zdGFydClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRvT2JqLnNpYmxpbmdzKVxuICAgICAgICAgICAgdG9PYmouZW5kID0gZnVuYyhyb290RWwsIGZyb21PYmouZW5kKTtcbiAgICAgICAgcmV0dXJuIHRvT2JqO1xuICAgIH07XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKTtcblxuLyoqXG4gKiBgbWlsby51dGlsYFxuICovXG52YXIgdXRpbCA9IHtcbiAgICBsb2dnZXI6IG1pbG9Db3JlLnV0aWwubG9nZ2VyLFxuICAgIHJlcXVlc3Q6IHJlcXVpcmUoJy4vcmVxdWVzdCcpLFxuICAgIHdlYnNvY2tldDogcmVxdWlyZSgnLi93ZWJzb2NrZXQnKSxcbiAgICBjaGVjazogbWlsb0NvcmUudXRpbC5jaGVjayxcbiAgICBlcnJvcjogcmVxdWlyZSgnLi9lcnJvcicpLCAvLyBkZXByZWNhdGVkXG4gICAgY291bnQ6IHJlcXVpcmUoJy4vY291bnQnKSwgLy8gZGVwcmVjYXRlZFxuICAgIHVuaXF1ZUlkOiByZXF1aXJlKCcuL2NvdW50JyksXG4gICAgY29tcG9uZW50TmFtZTogcmVxdWlyZSgnLi9jb21wb25lbnRfbmFtZScpLFxuICAgIGRvbTogcmVxdWlyZSgnLi9kb20nKSxcbiAgICBkb21MaXN0ZW5lcnM6IHJlcXVpcmUoJy4vZG9tX2xpc3RlbmVycycpLFxuICAgIHNlbGVjdGlvbjogcmVxdWlyZSgnLi9zZWxlY3Rpb24nKSxcbiAgICBmcmFnbWVudDogcmVxdWlyZSgnLi9mcmFnbWVudCcpLFxuICAgIGpzb25QYXJzZTogcmVxdWlyZSgnLi9qc29uX3BhcnNlJyksIC8vIGRlcHJlY2F0ZWRcbiAgICBzdG9yYWdlOiByZXF1aXJlKCcuL3N0b3JhZ2UnKSxcbiAgICBkb21SZWFkeTogcmVxdWlyZSgnLi9kb21yZWFkeScpLFxuICAgIGRyYWdEcm9wOiByZXF1aXJlKCcuL2RyYWdkcm9wJyksXG4gICAgZGlhbG9nOiByZXF1aXJlKCcuLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKSwgLy8gZGVwcmVjYXRlZCAtIHNob3VsZCBiZSB1c2VkIGZyb20gcmVnaXN0cnlcbiAgICBhbGVydDogcmVxdWlyZSgnLi4vY29tcG9uZW50cy91aS9ib290c3RyYXAvQWxlcnQnKSwgLy8gZGVwcmVjYXRlZCAtIHNob3VsZCBiZSB1c2VkIGZyb20gcmVnaXN0cnlcbiAgICBkb1Q6IG1pbG9Db3JlLnV0aWwuZG9ULFxuICAgIGRlc3Ryb3k6IHV0aWxfZGVzdHJveVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1dGlsO1xuXG5cbmZ1bmN0aW9uIHV0aWxfZGVzdHJveSgpIHtcbiAgICB1dGlsLnJlcXVlc3QuZGVzdHJveSgpO1xuICAgIHV0aWwuZHJhZ0Ryb3AuZGVzdHJveSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ganNvblBhcnNlO1xuXG5cbi8qKlxuICogYG1pbG8udXRpbC5qc29uUGFyc2VgXG4gKiBTYWZlIEpTT04ucGFyc2UsIHJldHVybnMgdW5kZWZpbmVkIGlmIEpTT04ucGFyc2UgdGhyb3dzIGFuIGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgLSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGpzb25QYXJzZShzdHIpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1pbG8udXRpbHMucmVxdWVzdFxuLy8gLS0tLS0tLS0tLS1cblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25zIHdyYXBwaW5nIFhNTEhUVFBSZXF1ZXN0IGZ1bmN0aW9uYWxpdHkuXG5cbi8vIGBgYFxuLy8gdmFyIHJlcXVlc3QgPSBtaWxvLnV0aWxzLnJlcXVlc3Rcbi8vICAgICAsIG9wdHM6IHsgbWV0aG9kOiAnR0VUJyB9O1xuXG4vLyByZXF1ZXN0KHVybCwgb3B0cywgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4vLyAgICAgbG9nZ2VyLmRlYnVnKGRhdGEpO1xuLy8gfSk7XG5cbi8vIHJlcXVlc3QuZ2V0KHVybCwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4vLyAgICAgbG9nZ2VyLmRlYnVnKGRhdGEpO1xuLy8gfSk7XG4vLyBgYGBcblxuLy8gT25seSBnZW5lcmljIHJlcXVlc3QgYW5kIGdldCwganNvbiwgcG9zdCBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY291bnQgPSByZXF1aXJlKCcuL2NvdW50JylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG5cblxudmFyIF9wZW5kaW5nUmVxdWVzdHMgPSBbXTtcblxudmFyIHByb21pc2VUaGVuID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCd0aGVuJyk7XG52YXIgcHJvbWlzZUNhdGNoID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCdjYXRjaCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIG92ZXJyaWRlIHN0YW5kYXJkIHByb21pc2UgYmVoYXZpb3VyIGFuZCBhbGxvdyBwcm9taXNlIGluc3RhbmNlcyBcbiAqIGNyZWF0ZWQgdG8gbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHJlcXVlc3Qgb2JqZWN0IG5vIG1hdHRlciBpZiAudGhlbigpIG9yIC5jYXRjaCgpIGlzIGNhbGxlZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKGZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnByb3RvdHlwZVtmdW5jdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGtlZXBSZXF1ZXN0T2JqZWN0KHByb21pc2UsIHRoaXMuX3JlcXVlc3QpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCh1cmwsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgb3B0cy51cmwgPSB1cmw7XG4gICAgb3B0cy5jb250ZW50VHlwZSA9IG9wdHMuY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCc7XG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHJlcS5vcGVuKG9wdHMubWV0aG9kLCBvcHRzLnVybCwgdHJ1ZSk7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIG9wdHMuY29udGVudFR5cGUpO1xuICAgIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgb3B0cy5oZWFkZXJzKTtcblxuICAgIHJlcS50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IGNvbmZpZy5yZXF1ZXN0LmRlZmF1bHRzLnRpbWVvdXQ7XG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlcS5vbnRpbWVvdXQgPSByZXEub25hYm9ydCA9IG9uUmVhZHk7XG5cbiAgICB2YXIgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2UocmVxKTtcblxuICAgIHJlcS5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMuZGF0YSkpO1xuICAgIHJlcVtjb25maWcucmVxdWVzdC5vcHRpb25zS2V5XSA9IG9wdHM7XG5cbiAgICBfcGVuZGluZ1JlcXVlc3RzLnB1c2gocmVxKTtcblxuICAgIHJldHVybiB4UHJvbWlzZS5wcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gb25SZWFkeShlKSB7XG4gICAgICAgIF9vblJlYWR5KHJlcSwgY2FsbGJhY2ssIHhQcm9taXNlLCBlLnR5cGUpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlWFByb21pc2UocmVxdWVzdCkge1xuICAgIHZhciByZXNvbHZlUHJvbWlzZSwgcmVqZWN0UHJvbWlzZTtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICAgIHJlamVjdFByb21pc2UgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBrZWVwUmVxdWVzdE9iamVjdChwcm9taXNlLCByZXF1ZXN0KTtcbiAgICBwcm9taXNlLmNhdGNoKF8ubm9vcCk7IC8vIFNvbWV0aW1lcyBlcnJvcnMgYXJlIGhhbmRsZWQgd2l0aGluIGNhbGxiYWNrcywgc28gdW5jYXVnaHQgcHJvbWlzZSBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBzdXBwcmVzc2VkLlxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZTogcHJvbWlzZSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVByb21pc2UsXG4gICAgICAgIHJlamVjdDogcmVqZWN0UHJvbWlzZVxuICAgIH1cbn1cblxuLy8gRW5zdXJlcyB0aGF0IHRoZSBwcm9taXNlIChhbmQgYW55IHByb21pc2VzIGNyZWF0ZWQgd2hlbiBjYWxsaW5nIC50aGVuLy5jYXRjaCkgaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0IG9iamVjdFxuZnVuY3Rpb24ga2VlcFJlcXVlc3RPYmplY3QocHJvbWlzZSwgcmVxdWVzdCkge1xuICAgIHByb21pc2UuX3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHByb21pc2UudGhlbiA9IHByb21pc2VUaGVuO1xuICAgIHByb21pc2UuY2F0Y2ggPSBwcm9taXNlQ2F0Y2g7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuXG5mdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVycyhyZXEsIGhlYWRlcnMpIHtcbiAgICBpZiAoaGVhZGVycylcbiAgICAgICAgXy5lYWNoS2V5KGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbn1cblxuZnVuY3Rpb24gX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGV2ZW50VHlwZSkge1xuICAgIGlmIChyZXEucmVhZHlTdGF0ZSAhPSA0KSByZXR1cm47XG4gICAgaWYgKCFyZXEuc3RhdHVzICYmIGV2ZW50VHlwZSA9PSAncmVhZHlzdGF0ZWNoYW5nZScpIHJldHVybjtcblxuICAgIF8uc3BsaWNlSXRlbShfcGVuZGluZ1JlcXVlc3RzLCByZXEpO1xuXG4gICAgdmFyIGVycm9yO1xuICAgIHRyeSB7XG4gICAgICAgIGlmICggcmVxLnN0YXR1cyA+PSAyMDAgJiYgcmVxLnN0YXR1cyA8IDQwMCApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhudWxsLCByZXEucmVzcG9uc2VUZXh0LCByZXEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7IGVycm9yID0gZTsgfVxuICAgICAgICAgICAgeFByb21pc2UucmVzb2x2ZShyZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBlcnJvclJlYXNvbiA9IHJlcS5zdGF0dXMgfHwgZXZlbnRUeXBlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3InKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3InICsgZXJyb3JSZWFzb24pO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVycm9yUmVhc29uLCByZXEucmVzcG9uc2VUZXh0LCByZXEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7IGVycm9yID0gZTsgfVxuICAgICAgICAgICAgeFByb21pc2UucmVqZWN0KHsgcmVhc29uOiBlcnJvclJlYXNvbiwgcmVzcG9uc2U6IHJlcS5yZXNwb25zZVRleHQgfSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvciB8fCBlO1xuICAgIH1cblxuICAgIC8vIG5vdCByZW1vdmluZyBzdWJzY3JpcHRpb24gY3JlYXRlcyBtZW1vcnkgbGVhaywgZGVsZXRpbmcgcHJvcGVydHkgd291bGQgbm90IHJlbW92ZSBzdWJzY3JpcHRpb25cbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgcG9zdE1lc3NhZ2UoJ3JlcXVlc3RzY29tcGxldGVkJyk7XG5cbiAgICBpZiAoZXJyb3IpIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uOiAnICsgZXJyb3IpO1xuXG4gICAgZnVuY3Rpb24gcG9zdE1lc3NhZ2UobXNnKSB7XG4gICAgICAgIGlmIChfbWVzc2VuZ2VyKSByZXF1ZXN0LnBvc3RNZXNzYWdlKG1zZyxcbiAgICAgICAgICAgIHsgc3RhdHVzOiBzdGF0dXMsIHJlc3BvbnNlOiByZXEucmVzcG9uc2VUZXh0IH0pO1xuICAgIH1cbn1cblxuXG5fLmV4dGVuZChyZXF1ZXN0LCB7XG4gICAgZ2V0OiByZXF1ZXN0JGdldCxcbiAgICBwb3N0OiByZXF1ZXN0JHBvc3QsXG4gICAganNvbjogcmVxdWVzdCRqc29uLFxuICAgIGpzb25wOiByZXF1ZXN0JGpzb25wLFxuICAgIGZpbGU6IHJlcXVlc3QkZmlsZSxcbiAgICB1c2VNZXNzZW5nZXI6IHJlcXVlc3QkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IHJlcXVlc3QkZGVzdHJveSxcbiAgICB3aGVuUmVxdWVzdHNDb21wbGV0ZWQ6IHdoZW5SZXF1ZXN0c0NvbXBsZXRlZFxufSk7XG5cblxudmFyIF9tZXNzZW5nZXI7XG5cblxuZnVuY3Rpb24gcmVxdWVzdCR1c2VNZXNzZW5nZXIoKSB7XG4gICAgX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIocmVxdWVzdCwgWydvbicsICdvbmNlJywgJ29uU3luYycsICdvZmYnLCAnb25NZXNzYWdlcycsICdvZmZNZXNzYWdlcycsICdwb3N0TWVzc2FnZScsICdwb3N0TWVzc2FnZVN5bmMnXSk7XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRnZXQodXJsLCBjYWxsYmFjaykge1xuICAgIHJldHVybiByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdHRVQnIH0sIGNhbGxiYWNrKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JHBvc3QodXJsLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHJldHVybiByZXF1ZXN0KHVybCwgeyBtZXRob2Q6ICdQT1NUJywgZGF0YTogZGF0YSB9LCBjYWxsYmFjayk7XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRqc29uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgcHJvbWlzZSA9IHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0dFVCcgfSk7XG5cbiAgICB2YXIganNvblByb21pc2UgPSBwcm9taXNlLnRoZW4oSlNPTi5wYXJzZSk7XG5cbiAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIGpzb25Qcm9taXNlXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGEpIHsgY2FsbGJhY2sobnVsbCwgZGF0YSk7IH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJEYXRhKSB7IGNhbGxiYWNrKGVyckRhdGEucmVhc29uLCBlcnJEYXRhLnJlc3BvbnNlKTsgfSk7XG5cbiAgICByZXR1cm4ganNvblByb21pc2U7XG59XG5cblxudmFyIGpzb25wT3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywganNvbnA6IHRydWUgfTtcbmZ1bmN0aW9uIHJlcXVlc3QkanNvbnAodXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSxcbiAgICAgICAgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2Uoc2NyaXB0KSxcbiAgICAgICAgaGVhZCA9IHdpbmRvdy5kb2N1bWVudC5oZWFkLFxuICAgICAgICB1bmlxdWVDYWxsYmFjayA9IGNvbmZpZy5yZXF1ZXN0Lmpzb25wQ2FsbGJhY2tQcmVmaXggKyBjb3VudCgpO1xuXG4gICAgdmFyIG9wdHMgPSBfLmV4dGVuZCh7IHVybDogdXJsIH0sIGpzb25wT3B0aW9ucyk7XG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgaWYgKCEgXy5pc0VxdWFsKF8ub21pdEtleXMob3B0cywgJ3VybCcpLCBqc29ucE9wdGlvbnMpKVxuICAgICAgICBsb2dnZXIud2FybignSWdub3JlZCBub3QgYWxsb3dlZCByZXF1ZXN0IG9wdGlvbnMgY2hhbmdlIGluIEpTT05QIHJlcXVlc3QgLSBvbmx5IFVSTCBjYW4gYmUgY2hhbmdlZCcpO1xuXG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdObyBKU09OUCByZXNwb25zZSBvciBubyBjYWxsYmFjayBpbiByZXNwb25zZScpO1xuICAgICAgICBfb25SZXN1bHQoZXJyKTtcbiAgICB9LCBjb25maWcucmVxdWVzdC5qc29ucFRpbWVvdXQpO1xuXG4gICAgd2luZG93W3VuaXF1ZUNhbGxiYWNrXSA9IF8ucGFydGlhbChfb25SZXN1bHQsIG51bGwpO1xuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHdpbmRvd1t1bmlxdWVDYWxsYmFja10pO1xuXG4gICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICBzY3JpcHQuc3JjID0gb3B0cy51cmwgKyAob3B0cy51cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICdjYWxsYmFjaz0nICsgdW5pcXVlQ2FsbGJhY2s7XG5cbiAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuXG4gICAgZnVuY3Rpb24gX29uUmVzdWx0KGVyciwgcmVzdWx0KSB7XG4gICAgICAgIF8uc3BsaWNlSXRlbShfcGVuZGluZ1JlcXVlc3RzLCB3aW5kb3dbdW5pcXVlQ2FsbGJhY2tdKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGVyciA/ICdlcnJvcicgOiAnc3VjY2VzcycsIGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIEpTT05QIHJlc3BvbnNlIG9yIHRpbWVvdXQnKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3Jqc29ucHRpbWVvdXQnLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHsgdmFyIGVycm9yID0gZTsgfVxuICAgICAgICBpZiAoZXJyKSB4UHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSB4UHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ3JlcXVlc3RzY29tcGxldGVkJyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICBkZWxldGUgd2luZG93W3VuaXF1ZUNhbGxiYWNrXTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1zZywgc3RhdHVzLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRmaWxlKG9wdHMsIGZpbGVEYXRhLCBjYWxsYmFjaywgcHJvZ3Jlc3MpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpXG4gICAgICAgIG9wdHMgPSB7IG1ldGhvZDogJ1BPU1QnLCB1cmw6IG9wdHMgfTtcblxuICAgIG9wdHMubWV0aG9kID0gb3B0cy5tZXRob2QgfHwgJ1BPU1QnO1xuICAgIG9wdHMuZmlsZSA9IHRydWU7XG5cbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaWYgKHByb2dyZXNzKSByZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBwcm9ncmVzcztcblxuICAgIHJlcS5vcGVuKG9wdHMubWV0aG9kLCBvcHRzLnVybCwgdHJ1ZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgaWYgKG9wdHMuYmluYXJ5KVxuICAgICAgICByZXEuc2VuZChmaWxlRGF0YSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlRGF0YSk7XG4gICAgICAgIHJlcS5zZW5kKGZvcm1EYXRhKTtcbiAgICB9XG5cbiAgICBfcGVuZGluZ1JlcXVlc3RzLnB1c2gocmVxKTtcblxuICAgIHJldHVybiB4UHJvbWlzZS5wcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gb25SZWFkeShlKSB7XG4gICAgICAgIGlmIChwcm9ncmVzcykgcmVxLnVwbG9hZC5vbnByb2dyZXNzID0gdW5kZWZpbmVkO1xuICAgICAgICBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZS50eXBlKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRkZXN0cm95KCkge1xuICAgIGlmIChfbWVzc2VuZ2VyKSBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICByZXF1ZXN0Ll9kZXN0cm95ZWQgPSB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZChjYWxsYmFjaywgdGltZW91dCkge1xuICAgIGNhbGxiYWNrID0gXy5vbmNlKGNhbGxiYWNrKTtcbiAgICBpZiAodGltZW91dClcbiAgICAgICAgXy5kZWxheShjYWxsYmFjaywgdGltZW91dCwgJ3RpbWVvdXQnKTtcblxuICAgIGlmIChfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgX21lc3Nlbmdlci5vbmNlKCdyZXF1ZXN0c2NvbXBsZXRlZCcsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXIoY2FsbGJhY2spO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBkb21VdGlscyA9IHJlcXVpcmUoJy4uL2RvbScpXG4gICAgLCBjb250YWluaW5nRWxlbWVudCA9IGRvbVV0aWxzLmNvbnRhaW5pbmdFbGVtZW50XG4gICAgLCBzZXRDYXJldFBvc2l0aW9uID0gZG9tVXRpbHMuc2V0Q2FyZXRQb3NpdGlvblxuICAgICwgZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSA9IGRvbVV0aWxzLmdldENvbXBvbmVudHNGcm9tUmFuZ2VcbiAgICAsIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMgPSBkb21VdGlscy5kZWxldGVSYW5nZVdpdGhDb21wb25lbnRzXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxubW9kdWxlLmV4cG9ydHMgPSBUZXh0U2VsZWN0aW9uO1xuXG5cbi8qKlxuICogVGV4dCBzZWxlY3Rpb24gY2xhc3MuXG4gKiBTZXJ2ZXMgYXMgYSBoZWxwZXIgdG8gbWFuYWdlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKiBUaGUgb2JqZWN0IGNhbm5vdCBiZSByZXVzZWQsIGlmIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIG1heSBjb250YWluIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcHJldmlvdXMgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtXaW5kb3d9IHdpbiB3aW5kb3cgaW4gd2hpY2ggdGV4dCBzZWxlY3Rpb24gaXMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24od2luKSB7XG4gICAgaWYgKCEgdGhpcyBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pXG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbih3aW4pO1xuICAgIHRoaXMud2luZG93ID0gd2luIHx8IHdpbmRvdztcbiAgICB0aGlzLmluaXQoKTtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBlbGVtZW50XG4gKlxuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfc3RhcnRFbGVtZW50JywgJ3N0YXJ0Q29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGVuZEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfZW5kRWxlbWVudCcsICdlbmRDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgZWxlbWVudFxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kY29udGFpbmluZ0VsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfY29udGFpbmluZ0VsZW1lbnQnLCAnY29tbW9uQW5jZXN0b3JDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBDb21wb25lbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJHN0YXJ0Q29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfc3RhcnRDb21wb25lbnQnLCAnc3RhcnRFbGVtZW50Jyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIENvbXBvbmVudFxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kZW5kQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfZW5kQ29tcG9uZW50JywgJ2VuZEVsZW1lbnQnKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgQ29tcG9uZW50XG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRjb250YWluaW5nQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfY29udGFpbmluZ0NvbXBvbmVudCcsICdjb250YWluaW5nRWxlbWVudCcpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oVGV4dFNlbGVjdGlvbiwge1xuICAgIGluaXQ6IFRleHRTZWxlY3Rpb24kaW5pdCxcbiAgICB0ZXh0OiBUZXh0U2VsZWN0aW9uJHRleHQsXG4gICAgdGV4dE5vZGVzOiBUZXh0U2VsZWN0aW9uJHRleHROb2RlcyxcbiAgICBjbGVhcjogVGV4dFNlbGVjdGlvbiRjbGVhcixcblxuICAgIHN0YXJ0RWxlbWVudDogVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQsXG4gICAgZW5kRWxlbWVudDogVGV4dFNlbGVjdGlvbiRlbmRFbGVtZW50LFxuICAgIGNvbnRhaW5pbmdFbGVtZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdFbGVtZW50LFxuXG4gICAgc3RhcnRDb21wb25lbnQ6IFRleHRTZWxlY3Rpb24kc3RhcnRDb21wb25lbnQsXG4gICAgZW5kQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGVuZENvbXBvbmVudCxcbiAgICBjb250YWluaW5nQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdDb21wb25lbnQsXG5cbiAgICBjb250YWluZWRDb21wb25lbnRzOiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5lZENvbXBvbmVudHMsXG4gICAgZWFjaENvbnRhaW5lZENvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRlYWNoQ29udGFpbmVkQ29tcG9uZW50LFxuICAgIGRlbDogVGV4dFNlbGVjdGlvbiRkZWwsXG4gICAgX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludDogX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludCxcbiAgICBfc2VsZWN0QWZ0ZXJEZWxldGU6IF9zZWxlY3RBZnRlckRlbGV0ZSxcblxuICAgIGdldFJhbmdlOiBUZXh0U2VsZWN0aW9uJGdldFJhbmdlLFxuICAgIGdldFN0YXRlOiBUZXh0U2VsZWN0aW9uJGdldFN0YXRlLFxuICAgIGdldE5vcm1hbGl6ZWRSYW5nZTogVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlLFxuICAgIGdldERpcmVjdGlvbjogVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uXG59KTtcblxuXG5fLmV4dGVuZChUZXh0U2VsZWN0aW9uLCB7XG4gICAgY3JlYXRlRnJvbVJhbmdlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tUmFuZ2UsXG4gICAgY3JlYXRlRnJvbVN0YXRlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlU3RhdGVPYmplY3Q6IFRleHRTZWxlY3Rpb24kJGNyZWF0ZVN0YXRlT2JqZWN0XG59KTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBUZXh0U2VsZWN0aW9uIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kaW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50KVxuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gdGhpcy5zZWxlY3Rpb24uaXNDb2xsYXBzZWQ7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHNlbGVjdGlvbiB0ZXh0XG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJHRleHQoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHQpXG4gICAgICAgIHRoaXMuX3RleHQgPSB0aGlzLnJhbmdlLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc2VsZWN0aW9uIHRleHQgbm9kZXNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiR0ZXh0Tm9kZXMoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHROb2RlcylcbiAgICAgICAgdGhpcy5fdGV4dE5vZGVzID0gX2dldFRleHROb2Rlcy5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl90ZXh0Tm9kZXM7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjbGVhcigpIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyB0ZXh0IGFuZCB0ZXh0IG5vZGVzIGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICovXG5mdW5jdGlvbiBfZ2V0VGV4dE5vZGVzKCkge1xuICAgIC8vIGxpc3Qgb2Ygc2VsZWN0ZWQgdGV4dCBub2Rlc1xuICAgIHZhciB0ZXh0Tm9kZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKVxuICAgICAgICByZXR1cm4gdGV4dE5vZGVzO1xuXG4gICAgLy8gY3JlYXRlIFRyZWVXYWxrZXIgdG8gdHJhdmVyc2UgdGhlIHRyZWUgdG8gc2VsZWN0IGFsbCB0ZXh0IG5vZGVzXG4gICAgdmFyIHNlbFN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydENvbnRhaW5lclxuICAgICAgICAsIHNlbEVuZCA9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyXG4gICAgICAgICwgcmFuZ2VDb250YWluZXIgPSB0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJhbmdlQ29udGFpbmVyLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgdmFyIG5vZGUgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsU3RhcnQ7XG5cbiAgICAvLyB0cmF2ZXJzZSBET00gdHJlZSB0byBjb2xsZWN0IGFsbCBzZWxlY3RlZCB0ZXh0IG5vZGVzXG4gICAgd2hpbGUgKG5vZGUgJiYgKCEgaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpKSkge1xuICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgdmFyIGluRW5kID0gaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpO1xuICAgICAgICBub2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE5vZGVzO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHN0YXJ0L2VuZCBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG5mdW5jdGlvbiBfZ2V0RWxlbWVudCh0aGlzUHJvcE5hbWUsIHJhbmdlUHJvcE5hbWUpIHtcbiAgICBpZiAoISB0aGlzLnJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzW3RoaXNQcm9wTmFtZV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXNbdGhpc1Byb3BOYW1lXSA9IGNvbnRhaW5pbmdFbGVtZW50KHRoaXMucmFuZ2VbcmFuZ2VQcm9wTmFtZV0pO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc3RhcnQvZW5kIGNvbXBvbmVudCBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gX2dldENvbXBvbmVudCh0aGlzUHJvcE5hbWUsIGVsTWV0aG9kTmFtZSkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIHRoaXNbdGhpc1Byb3BOYW1lXSA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpc1t0aGlzUHJvcE5hbWVdID0gQ29tcG9uZW50LmdldENvbnRhaW5pbmdDb21wb25lbnQodGhpc1tlbE1ldGhvZE5hbWVdKCkpO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjb250YWluZWRDb21wb25lbnRzKCkge1xuICAgIGlmICh0aGlzLl9jb250YWluZWRDb21wb25lbnRzKVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cztcblxuICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgISB0aGlzLnJhbmdlKSByZXR1cm4gY29tcG9uZW50cztcblxuICAgIHJldHVybiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHRoaXMucmFuZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZWFjaENvbnRhaW5lZENvbXBvbmVudChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8ICEgdGhpcy5yYW5nZSkgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSB0aGlzLmNvbnRhaW5lZENvbXBvbmVudHMoKTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGFsbCBjb21wb25lbnRzIGluIGl0XG4gKiBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2VsZWN0RW5kQ29udGFpbmVyIHNldCB0byB0cnVlIGlmIHRoZSBlbmQgY29udGFpbmVyIHNob3VsZCBiZSBzZWxlY3RlZCBhZnRlciBkZWxldGlvblxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGRlbChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCAhIHRoaXMucmFuZ2UpIHJldHVybjtcblxuICAgIHZhciBzZWxQb2ludCA9IHRoaXMuX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpO1xuXG4gICAgZGVsZXRlUmFuZ2VXaXRoQ29tcG9uZW50cyh0aGlzLnJhbmdlKTtcblxuICAgIHRoaXMuX3NlbGVjdEFmdGVyRGVsZXRlKHNlbFBvaW50KTtcbiAgICBzZWxQb2ludC5ub2RlLnBhcmVudE5vZGUubm9ybWFsaXplKCk7XG59XG5cblxuZnVuY3Rpb24gX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHRoaXMucmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgdmFyIHNlbE9mZnNldCA9IHRoaXMucmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgaWYgKHNlbGVjdEVuZENvbnRhaW5lciAmJiB0aGlzLnJhbmdlLnN0YXJ0Q29udGFpbmVyICE9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgICAgIHNlbE5vZGUgPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgc2VsT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZTogc2VsTm9kZSwgb2Zmc2V0OiBzZWxPZmZzZXQgfTtcbn1cblxuXG5mdW5jdGlvbiBfc2VsZWN0QWZ0ZXJEZWxldGUoc2VsUG9pbnQpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHNlbFBvaW50Lm5vZGVcbiAgICAgICAgLCBzZWxPZmZzZXQgPSBzZWxQb2ludC5vZmZzZXQ7XG5cbiAgICBpZiAoIXNlbE5vZGUpIHJldHVybjtcbiAgICBpZiAoc2VsTm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSlcbiAgICAgICAgc2VsTm9kZS50ZXh0Q29udGVudCA9IHNlbE5vZGUudGV4dENvbnRlbnQudHJpbVJpZ2h0KCk7XG4gICAgaWYgKCFzZWxOb2RlLm5vZGVWYWx1ZSlcbiAgICAgICAgc2VsTm9kZS5ub2RlVmFsdWUgPSAnXFx1MDBBMCc7IC8vbm9uLWJyZWFraW5nIHNwYWNlLCBcXHUyMDBCIGZvciB6ZXJvIHdpZHRoIHNwYWNlO1xuXG4gICAgdmFyIHBvc2l0aW9uID0gc2VsT2Zmc2V0ID4gc2VsTm9kZS5sZW5ndGggPyBzZWxOb2RlLmxlbmd0aCA6IHNlbE9mZnNldDtcbiAgICBzZXRDYXJldFBvc2l0aW9uKHNlbE5vZGUsIHBvc2l0aW9uKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc2VsZWN0aW9uIHJhbmdlXG4gKlxuICogQHJldHVybiB7UmFuZ2V9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2U7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgc2VsZWN0aW9uIHdpbmRvdywgbm9kZXMgYW5kIG9mZnNldHMgaW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0U3RhdGUocm9vdEVsKSB7XG4gICAgdmFyIHIgPSB0aGlzLnJhbmdlO1xuICAgIHZhciBkb2MgPSByb290RWwub3duZXJEb2N1bWVudFxuICAgICAgICAsIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIGlmICghcikgcmV0dXJuIHsgd2luZG93OiB3aW4gfTtcbiAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGVTdGF0ZU9iamVjdChyb290RWwsIHIuc3RhcnRDb250YWluZXIsIHIuc3RhcnRPZmZzZXQsIHIuZW5kQ29udGFpbmVyLCByLmVuZE9mZnNldCk7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkY3JlYXRlU3RhdGVPYmplY3Qocm9vdEVsLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0KSB7XG4gICAgZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyIHx8IHN0YXJ0Q29udGFpbmVyO1xuICAgIGVuZE9mZnNldCA9IGVuZE9mZnNldCB8fCBzdGFydE9mZnNldDtcbiAgICB2YXIgZG9jID0gcm9vdEVsLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICByZXR1cm4ge1xuICAgICAgICB3aW5kb3c6IHdpbixcbiAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgIHN0YXJ0OiBfZ2V0U2VsZWN0aW9uUG9pbnRTdGF0ZShyb290RWwsIHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCksXG4gICAgICAgIGVuZDogX2dldFNlbGVjdGlvblBvaW50U3RhdGUocm9vdEVsLCBlbmRDb250YWluZXIsIGVuZE9mZnNldClcbiAgICB9O1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3Rpb25Qb2ludFN0YXRlKHJvb3RFbCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHRyZWVQYXRoID0gZG9tVXRpbHMudHJlZVBhdGhPZihyb290RWwsIG5vZGUpO1xuICAgIGlmICghIHRyZWVQYXRoKSBsb2dnZXIuZXJyb3IoJ1NlbGVjdGlvbiBwb2ludCBpcyBvdXRzaWRlIG9mIHJvb3QgZWxlbWVudCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyZWVQYXRoOiB0cmVlUGF0aCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmVzdG9yZXMgYWN0dWFsIHNlbGVjdGlvbiB0byB0aGUgc3RvcmVkIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21TdGF0ZShzdGF0ZSkge1xuICAgIHZhciBkb21VdGlscyA9IHN0YXRlLndpbmRvdy5taWxvLnV0aWwuZG9tO1xuXG4gICAgaWYgKHN0YXRlLnJvb3RFbCAmJiBzdGF0ZS5zdGFydCAmJiBzdGF0ZS5lbmQpIHtcbiAgICAgICAgdmFyIHN0YXJ0Tm9kZSA9IF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHN0YXRlLnJvb3RFbCwgc3RhdGUuc3RhcnQpXG4gICAgICAgICAgICAsIGVuZE5vZGUgPSBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShzdGF0ZS5yb290RWwsIHN0YXRlLmVuZCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvbVV0aWxzLnNldFNlbGVjdGlvbihzdGFydE5vZGUsIHN0YXRlLnN0YXJ0Lm9mZnNldCwgZW5kTm9kZSwgc3RhdGUuZW5kLm9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1RleHQgc2VsZWN0aW9uOiBjYW5cXCd0IGNyZWF0ZSBzZWxlY3Rpb24nLCBlLCBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9tVXRpbHMuY2xlYXJTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHJvb3RFbCwgcG9pbnRTdGF0ZSkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgocm9vdEVsLCBwb2ludFN0YXRlLnRyZWVQYXRoKTtcbiAgICBpZiAoISBub2RlKSBsb2dnZXIuZXJyb3IoJ1RleHRTZWxlY3Rpb24gY3JlYXRlRnJvbVN0YXRlOiBubyBub2RlIGF0IHRyZWVQYXRoJyk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHNlbGVjdGlvbiBmcm9tIHBhc3NlZCByYW5nZVxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZVxuICogQHBhcmFtIHtCb29sZWFufSBiYWNrd2FyZFxuICpcbiAqIEByZXR1cm4ge1RleHRTZWxlY3Rpb259XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21SYW5nZShyYW5nZSwgYmFja3dhcmQpIHtcbiAgICB2YXIgd2luID0gcmFuZ2Uuc3RhcnRDb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld1xuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAsIGVuZFJhbmdlO1xuXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgZW5kUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgICAgICBzZWwuYWRkUmFuZ2UoZW5kUmFuZ2UpO1xuICAgICAgICBzZWwuZXh0ZW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCkgICAgICAgIFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24od2luKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBjb3B5IG9mIHRoZSByYW5nZVxuICogSWYgeW91IHRyaXBsZSBjbGljayBhbiBpdGVtLCB0aGUgZW5kIG9mIHRoZSByYW5nZSBpcyBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE5FWFQgbm9kZS5cbiAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmdlIHdpdGggdGhlIGVuZCBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgdGV4dG5vZGUgY29udGFpbmVkIFxuICogaW5zaWRlIGEgY29tcG9uZW50IHdpdGggdGhlIFwiZWRpdGFibGVcIiBmYWNldFxuICogXG4gKiBAcmV0dXJuIHtyYW5nZX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlKCl7XG4gICAgdmFyIGRvYyA9IHRoaXMucmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIub3duZXJEb2N1bWVudFxuICAgICAgICAsIHR3LCBwcmV2aW91c05vZGVcbiAgICAgICAgLCBuZXdSYW5nZSA9IHRoaXMucmFuZ2UuY2xvbmVSYW5nZSgpO1xuXG4gICAgaWYgKG5ld1JhbmdlLmVuZENvbnRhaW5lci5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgdHcgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICB0dy5jdXJyZW50Tm9kZSA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgcHJldmlvdXNOb2RlID0gdHcucHJldmlvdXNOb2RlKCk7XG4gICAgICAgIG5ld1JhbmdlLnNldEVuZChwcmV2aW91c05vZGUsIHByZXZpb3VzTm9kZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdSYW5nZTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBvZiBhIHNlbGVjdGlvblxuICpcbiAqIDEgZm9yd2FyZCwgLTEgYmFja3dhcmQsIDAgbm8gZGlyZWN0aW9uLCB1bmRlZmluZWQgb25lIG9mIHRoZSBub2RlIGlzIGRldGFjaGVkIG9yIGluIGEgZGlmZmVyZW50IGZyYW1lXG4gKlxuICogQHJldHVybiB7LTF8MHwxfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uKCl7XG4gICAgcmV0dXJuIGRvbVV0aWxzLmdldFNlbGVjdGlvbkRpcmVjdGlvbih0aGlzLnNlbGVjdGlvbik7ICAgIFxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgU3RvcmFnZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5yZXF1aXJlKCcuL21vZGVsJylcblxubW9kdWxlLmV4cG9ydHMgPSBET01TdG9yYWdlO1xuXG5cbi8vIHNoYXJlZCBrZXlzIHN0b3JlZCBieSBhbGwgaW5zdGFuY2VzLCBpbmNsdWRlIGtleSBwcmVmaXhlc1xudmFyIF9zdG9yZWRLZXlzID0ge1xuICAgIHRydWU6IHt9LCAvLyBzZXNzaW9uIHN0b3JhZ2VcbiAgICBmYWxzZToge30gLy8gbG9jYWwgc3RvcmFnZVxufTtcblxuXG4vKipcbiAqIERPTVN0b3JhZ2UgY2xhc3MgdG8gc2ltcGxpZnkgc3RvcmFnZSBhbmQgcmV0cmlldmFsIG9mIG11bHRpcGxlIGl0ZW1zIHdpdGggdHlwZXMgcHJlc2VydmF0aW9uIHRvIERPTSBzdG9yYWdlIChsb2NhbFN0b3JhZ2UgYW5kIHNlc3Npb25TdG9yYWdlKS5cbiAqIFR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBrZXkgY3JlYXRlZCBmcm9tIHZhbHVlIGtleXMgd2l0aCBhcHBlbmRlZCBgbWlsby5jb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4YFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlQcmVmaXggcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byBhbGwga2V5cyBmb2xsb3dlZCBieSBgbWlsby5jb25maWcuZG9tU3RvcmFnZS5wcmVmaXhTZXBhcmF0b3JgIChcIi9cIiBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2Vzc2lvbk9ubHkgdHJ1ZSB0byB1c2Ugc2Vzc2lvblN0b3JhZ2UuIGxvY2FsU3RvcmFnZSB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7V2luZG93fSB3aW4gd2luZG93IHRvIHdvcmsgaW5cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZShrZXlQcmVmaXgsIHNlc3Npb25Pbmx5LCB3aW4pIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG5cbiAgICBrZXlQcmVmaXggPSBjb25maWcuZG9tU3RvcmFnZS5yb290ICtcbiAgICAgICAgICAgICAgICAoa2V5UHJlZml4XG4gICAgICAgICAgICAgICAgICAgID8ga2V5UHJlZml4ICsgY29uZmlnLmRvbVN0b3JhZ2UucHJlZml4U2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgIDogJycpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgIHNlc3Npb25Pbmx5OiAhISBzZXNzaW9uT25seSxcbiAgICAgICAgd2luZG93OiB3aW4sXG4gICAgICAgIF9zdG9yYWdlOiBzZXNzaW9uT25seSA/IHdpbi5zZXNzaW9uU3RvcmFnZSA6IHdpbi5sb2NhbFN0b3JhZ2UsXG4gICAgICAgIF90eXBlU3VmZml4OiBjb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4LFxuICAgICAgICBfa2V5czoge31cbiAgICB9LCBfLldSSVQpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NU3RvcmFnZSwge1xuICAgIGdldDogRE9NU3RvcmFnZSRnZXQsXG4gICAgc2V0OiBET01TdG9yYWdlJHNldCxcbiAgICByZW1vdmU6IERPTVN0b3JhZ2UkcmVtb3ZlLFxuICAgIGhhc0l0ZW06IERPTVN0b3JhZ2UkaGFzSXRlbSxcbiAgICBnZXRJdGVtOiBET01TdG9yYWdlJGdldEl0ZW0sXG4gICAgc2V0SXRlbTogRE9NU3RvcmFnZSRzZXRJdGVtLFxuICAgIHJlbW92ZUl0ZW06IERPTVN0b3JhZ2UkcmVtb3ZlSXRlbSxcbiAgICBfc3RvcmFnZUtleTogRE9NU3RvcmFnZSRfc3RvcmFnZUtleSxcbiAgICBfZG9tU3RvcmFnZUtleTogRE9NU3RvcmFnZSRfZG9tU3RvcmFnZUtleSxcbiAgICBnZXRBbGxLZXlzOiBET01TdG9yYWdlJGdldEFsbEtleXMsXG4gICAgZ2V0QWxsSXRlbXM6IERPTVN0b3JhZ2UkZ2V0QWxsSXRlbXMsXG4gICAgY3JlYXRlTWVzc2VuZ2VyOiBET01TdG9yYWdlJGNyZWF0ZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiBET01TdG9yYWdlJGRlc3Ryb3lcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc2VuZ2VyIGFuZCBNZXNzYWdlU291cmNlIG1ldGhvZHMgb24gRE9NU3RvcmFnZVxuICovXG5NZXNzZW5nZXIudXNlV2l0aChET01TdG9yYWdlLCAnX21lc3NlbmdlcicsIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5TdG9yYWdlTWVzc2FnZVNvdXJjZS51c2VXaXRoKERPTVN0b3JhZ2UsICdfbWVzc2FnZVNvdXJjZScsIFsndHJpZ2dlciddKTtcblxuXG52YXIgX3Nlc3Npb25TdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIHRydWUpXG4gICAgLCBfbG9jYWxTdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIGZhbHNlKTtcblxudmFyIF9kb21TdG9yYWdlID0ge1xuICAgICAgICB0cnVlOiBfc2Vzc2lvblN0b3JhZ2UsXG4gICAgICAgIGZhbHNlOiBfbG9jYWxTdG9yYWdlXG4gICAgfTtcblxuXy5leHRlbmQoRE9NU3RvcmFnZSwge1xuICAgIHJlZ2lzdGVyRGF0YVR5cGU6IERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUsXG4gICAgbG9jYWw6IF9sb2NhbFN0b3JhZ2UsXG4gICAgc2Vzc2lvbjogX3Nlc3Npb25TdG9yYWdlLFxuICAgIHN0b3JhZ2U6IF9kb21TdG9yYWdlLFxuICAgIF9zdG9yZWRLZXlzOiBfc3RvcmVkS2V5cyAvLyBleHBvc2VkIGZvciB0ZXN0aW5nXG59KTtcblxuXG4vKipcbiAqIFNldHMgZGF0YSB0byBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8ga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBzaW5nbGUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW4gd2hpY2ggY2FzZSBrZXlzIHdpbGwgYmUgdXNlZCBhcyBrZXlzIGluIGxvY2FsIHN0b3JhZ2UuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhbHRlcm5hdGl2ZWx5IGp1c3QgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgd2hlcmUgYXJndW1lbnRzIGNhbiBiZSBzZXF1ZW50aWFsbHkgdXNlZCBhcyBrZXlzIGFuZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2Ukc2V0KGRhdGEpIHsgLy8gb3IgYXJndW1lbnRzXG4gICAgaWYgKHR5cGVvZiBkYXRhID09ICdvYmplY3QnKVxuICAgICAgICBfLmVhY2hLZXkoZGF0YSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnc0xlbiAlIDIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRG9tU3RvcmFnZUVycm9yKCdET01TdG9yYWdlOiBzZXQgc2hvdWxkIGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIG9yIG9iamVjdCcpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gYXJndW1lbnRzW2ldXG4gICAgICAgICAgICAgICAgLCB2YWx1ZSA9IGFyZ3VtZW50c1srK2ldO1xuXG4gICAgICAgICAgICB0aGlzLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGRhdGEgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMsIGJ1dCByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIGtleXMgd2l0aG91dCByb290IGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkZ2V0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIF8uZGVlcEZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgZGF0YVtrZXldID0gdGhpcy5nZXRJdGVtKGtleSk7XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGtleXMgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRyZW1vdmUoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgXy5kZWVwRm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIENoZWNrIGZvciBwcmVzZW5jZSBvZiBzaW5nbGUgaXRlbSBpbiBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGhhc0l0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShwS2V5KSAhPSBudWxsO1xufVxuXG5cbi8qKlxuICogR2V0cyBzaW5nbGUgaXRlbSBmcm9tIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogUmVhZHMgdHlwZSBvZiB0aGUgb3JpZ2luYWxseSBzdG9yZWQgdmFsdWUgZnJvbSBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAgYW5kIGNvbnZlcnRzIGRhdGEgdG8gdGhlIG9yaWdpbmFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEl0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgdmFyIGRhdGFUeXBlID0gX2dldEtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSk7XG4gICAgdmFyIHZhbHVlU3RyID0gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHBLZXkpO1xuICAgIHZhciB2YWx1ZSA9IF9wYXJzZURhdGEodmFsdWVTdHIsIGRhdGFUeXBlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBTZXRzIHNpbmdsZSBpdGVtIHRvIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogU3RvcmVzIHR5cGUgb2YgdGhlIHN0b3JlZCB2YWx1ZSB0byBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHZhciBkYXRhVHlwZSA9IF9zZXRLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXksIHZhbHVlKTtcbiAgICB2YXIgdmFsdWVTdHIgPSBfc2VyaWFsaXplRGF0YSh2YWx1ZSwgZGF0YVR5cGUpO1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShwS2V5LCB2YWx1ZVN0cik7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicpIHtcbiAgICAgICAgICAgIHZhciBjZmcgPSBjb25maWcuZG9tU3RvcmFnZS5xdW90YUV4Y2VlZGVkO1xuICAgICAgICAgICAgaWYgKGNmZy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIG1pbG8ubWFpbC5wb3N0TWVzc2FnZSgncXVvdGFleGNlZWRlZGVycm9yJywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNmZy50aHJvd0Vycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdGhpcy5fa2V5c1trZXldID0gdHJ1ZTtcbiAgICBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XSA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHNpbmdsZSBpdGVtIGZyb20gRE9NIHN0b3JhZ2UgcHJlcGVuZGluZyBgdGhpcy5rZXlQcmVmaXhgIHRvIHBhc3NlZCBrZXkuXG4gKiBUeXBlIG9mIHRoZSBzdG9yZWQgdmFsdWUgKGluIGBrZXkgKyB0aGlzLl90eXBlU3VmZml4YCBrZXkpIGlzIGFsc28gcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB2YXIgcEtleSA9IHRoaXMuX3N0b3JhZ2VLZXkoa2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG4gICAgX3JlbW92ZUtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSlcbiAgICBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIGRlbGV0ZSBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGFsbCBrZXlzIHN0b3JlZCBieSB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRBbGxLZXlzKCkge1xuICAgIHZhciBzdG9yZWRLZXlzID0gT2JqZWN0LmtleXModGhpcy5fa2V5cyk7XG4gICAgdmFyIGtleXNJblN0b3JhZ2UgPSBzdG9yZWRLZXlzLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSXRlbShrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBrZXlzSW5TdG9yYWdlO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWFwIHdpdGggYWxsIGtleXMgYW5kIHZhbHVlcyAoZGVzZXJpYWxpemVkKSBzdG9yZWQgdXNpbmcgdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEFsbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmdldEFsbEtleXMoKSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHByZWZpeGVkIGtleSBmb3IgRE9NIHN0b3JhZ2UgZm9yIGdpdmVuIHVucHJlZml4ZWQga2V5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRfc3RvcmFnZUtleShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5rZXlQcmVmaXggKyBrZXk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHVucHJlZml4ZWQga2V5IHRvIGJlIHVzZWQgd2l0aCB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2UgZmlyIGdpdmVuIGFjdHVhbCBrZXkgaW4gc3RvcmFnZVxuICogSWYga2V5IGhhcyBkaWZmZXJlbnQgcHJlZml4IGZyb20gdGhlIGtleVByZWZpeCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdG9yYWdlS2V5IGFjdHVhbCBrZXkgaW4gbG9jYWwvc2Vzc2lvbiBzdG9yYWdlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkX2RvbVN0b3JhZ2VLZXkoc3RvcmFnZUtleSkge1xuICAgIGlmIChzdG9yYWdlS2V5LmluZGV4T2YodGhpcy5fdHlwZVN1ZmZpeCkgPj0gMCkgcmV0dXJuO1xuICAgIHJldHVybiBfLnVuUHJlZml4KHN0b3JhZ2VLZXksIHRoaXMua2V5UHJlZml4KTtcbn1cblxuXG4vKipcbiAqIEdldHMgb3JpZ2luYWxseSBzdG9yZWQgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRLZXlEYXRhVHlwZShwS2V5KSB7XG4gICAgcEtleSA9IF9kYXRhVHlwZUtleS5jYWxsKHRoaXMsIHBLZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgIGFuZCBgdmFsdWVgLlxuICogUmV0dXJucyBkYXRhIHR5cGUgZm9yIGB2YWx1ZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHBhcmFtIHtBbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9zZXRLZXlEYXRhVHlwZShwS2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhVHlwZSA9IF9nZXRWYWx1ZVR5cGUodmFsdWUpO1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0ocEtleSwgZGF0YVR5cGUpO1xuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgc3RvcmVkIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICovXG5mdW5jdGlvbiBfcmVtb3ZlS2V5RGF0YVR5cGUocEtleSkge1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgdG8gc3RvcmUgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9kYXRhVHlwZUtleShwS2V5KSB7XG4gICAgcmV0dXJuIHBLZXkgKyB0aGlzLl90eXBlU3VmZml4O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0eXBlIG9mIHZhbHVlIGFzIHN0cmluZy4gQ2xhc3MgbmFtZSByZXR1cm5lZCBmb3Igb2JqZWN0cyAoJ251bGwnIGZvciBudWxsKS5cbiAqIEBwYXJhbSAge0FueX0gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX2dldFZhbHVlVHlwZSh2YWx1ZSkge1xuICAgIHZhciB2YWx1ZVR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgICAgICAgLCBjbGFzc05hbWUgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgICwgZGF0YVR5cGUgPSB2YWx1ZXNEYXRhVHlwZXNbY2xhc3NOYW1lXTtcbiAgICByZXR1cm4gZGF0YVR5cGUgfHwgKFxuICAgICAgICAgICAgdmFsdWVUeXBlICE9ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyB2YWx1ZVR5cGVcbiAgICAgICAgICAgICAgICA6IHZhbHVlID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyAnbnVsbCdcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKTtcbn1cbnZhciB2YWx1ZXNEYXRhVHlwZXMgPSB7XG4gICAgLy8gY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBgcmVnaXN0ZXJEYXRhVHlwZWBcbn1cblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdmFsdWUgdG8gYmUgc3RvcmVkIGluIERPTSBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSAge0FueX0gdmFsdWUgdmFsdWUgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVR5cGUgb3B0aW9uYWwgZGF0YSB0eXBlIHRvIGRlZmluZSBzZXJpYWxpemVyLCBfZ2V0VmFsdWVUeXBlIGlzIHVzZWQgaWYgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3NlcmlhbGl6ZURhdGEodmFsdWUsIHZhbHVlVHlwZSkge1xuICAgIHZhbHVlVHlwZSA9IHZhbHVlVHlwZSB8fCBfZ2V0VmFsdWVUeXBlKHZhbHVlKTtcbiAgICB2YXIgc2VyaWFsaXplciA9IGRhdGFTZXJpYWxpemVyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBzZXJpYWxpemVyXG4gICAgICAgICAgICA/IHNlcmlhbGl6ZXIodmFsdWUsIHZhbHVlVHlwZSlcbiAgICAgICAgICAgIDogdmFsdWUgJiYgdmFsdWUudG9TdHJpbmcgPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgICAgICAgOiAnJyArIHZhbHVlO1xufVxudmFyIGRhdGFTZXJpYWxpemVycyA9IHtcbiAgICAnQXJyYXknOiBKU09OLnN0cmluZ2lmeVxufVxuXG5cbi8qKlxuICogUGFyc2VzIHN0cmluZyByZXRyaWV2ZWQgZnJvbSBET00gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlU3RyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlVHlwZSBkYXRhIHR5cGUgdGhhdCBkZWZpbmVzIHBhcnNlci4gT3JpZ2luYWwgc3Jpbmcgd2lsbCBiZSByZXR1cm5lZCBpZiBwYXJzZXIgaXMgbm90IGRlZmluZWQuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIF9wYXJzZURhdGEodmFsdWVTdHIsIHZhbHVlVHlwZSkge1xuICAgIHZhciBwYXJzZXIgPSBkYXRhUGFyc2Vyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgICAgID8gcGFyc2VyKHZhbHVlU3RyLCB2YWx1ZVR5cGUpXG4gICAgICAgICAgICA6IHZhbHVlU3RyO1xufVxudmFyIGRhdGFQYXJzZXJzID0ge1xuICAgIE9iamVjdDogXy5qc29uUGFyc2UsXG4gICAgQXJyYXk6IF8uanNvblBhcnNlLFxuICAgIERhdGU6IGZ1bmN0aW9uKHZhbFN0cikgeyByZXR1cm4gbmV3IERhdGUodmFsU3RyKTsgfSxcbiAgICBib29sZWFuOiBmdW5jdGlvbih2YWxTdHIpIHsgcmV0dXJuIHZhbFN0ciA9PSAndHJ1ZSc7IH0sXG4gICAgbnVtYmVyOiBOdW1iZXIsXG4gICAgZnVuY3Rpb246IF8udG9GdW5jdGlvbixcbiAgICBSZWdFeHA6IF8udG9SZWdFeHBcbn07XG5cblxuLyoqXG4gKiBSZWdpc3RlcnMgZGF0YSB0eXBlIHRvIGJlIHNhdmVkIGluIERPTSBzdG9yYWdlLiBDbGFzcyBuYW1lIGNhbiBiZSB1c2VkIG9yIHJlc3VsdCBvZiBgdHlwZW9mYCBvcGVyYXRvciBmb3Igbm9uLW9iamVjdHMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb252ZXJzaW9ucy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVUeXBlIGNsYXNzIChjb25zdHJ1Y3RvcikgbmFtZSBvciB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHR5cGVvZi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlcmlhbGl6ZXIgb3B0aW9uYWwgc2VyaWFsaXplciBmb3IgdGhpcyB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgb3B0aW9uYWwgcGFyc2VyIGZvciB0aGlzIHR5cGVcbiAqIEBwYXJhbSB7W1N0cmluZ119IHN0b3JlQXNEYXRhVHlwZSBvcHRpb25hbCBuYW1lIG9mIHN0b3JlZCBkYXRhIHR5cGUgaWYgZGlmZmVyZW50IGZyb20gdmFsdWVUeXBlXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUodmFsdWVUeXBlLCBzZXJpYWxpemVyLCBwYXJzZXIsIHN0b3JlQXNEYXRhVHlwZSkge1xuICAgIGlmIChzZXJpYWxpemVyKSBkYXRhU2VyaWFsaXplcnNbdmFsdWVUeXBlXSA9IHNlcmlhbGl6ZXI7XG4gICAgaWYgKHBhcnNlcikgZGF0YVBhcnNlcnNbdmFsdWVUeXBlXSA9IHBhcnNlcjtcbiAgICB2YWx1ZXNEYXRhVHlwZXNbdmFsdWVUeXBlXSA9IHN0b3JlQXNEYXRhVHlwZSB8fCB2YWx1ZVR5cGU7XG59XG5cblxuZnVuY3Rpb24gRE9NU3RvcmFnZSRjcmVhdGVNZXNzZW5nZXIoKSB7XG4gICAgdmFyIHN0b3JhZ2VNZXNzYWdlU291cmNlID0gbmV3IFN0b3JhZ2VNZXNzYWdlU291cmNlKHRoaXMpO1xuICAgIHZhciBtZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgc3RvcmFnZU1lc3NhZ2VTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzZW5nZXI6IG1lc3NlbmdlcixcbiAgICAgICAgX21lc3NhZ2VTb3VyY2U6IHN0b3JhZ2VNZXNzYWdlU291cmNlXG4gICAgfSwgXy5XUklUKTtcbn1cblxuXG5mdW5jdGlvbiBET01TdG9yYWdlJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpbmRvdyA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cbk1vZGVsLnJlZ2lzdGVyV2l0aERPTVN0b3JhZ2UgPSBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZTtcblxuXG5mdW5jdGlvbiBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZSgpIHtcbiAgICB2YXIgRE9NU3RvcmFnZSA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbiAgICBET01TdG9yYWdlLnJlZ2lzdGVyRGF0YVR5cGUoJ01vZGVsJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIpO1xuICAgIERPTVN0b3JhZ2UucmVnaXN0ZXJEYXRhVHlwZSgnTW9kZWxQYXRoJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIsICdNb2RlbCcpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyKHZhbHVlKSB7XG4gICAgdmFyIGRhdGEgPSB2YWx1ZS5nZXQoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxfZG9tU3RvcmFnZVBhcnNlcih2YWx1ZVN0cikge1xuICAgIHZhciBkYXRhID0gXy5qc29uUGFyc2UodmFsdWVTdHIpO1xuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db3VudCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvY291bnQnKTtcblxudmFyIFN0b3JhZ2VNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnU3RvcmFnZU1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFN0b3JhZ2VNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgcG9zdE1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHRyaWdnZXIsXG5cbiAgICAvL2NsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzKSB7XG4gICAgaWYgKGhvc3RPYmplY3QuY29uc3RydWN0b3IubmFtZSAhPSAnRE9NU3RvcmFnZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdE9iamVjdCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgRE9NU3RvcmFnZScpO1xuICAgIHRoaXMuc3RvcmFnZSA9IGhvc3RPYmplY3Q7XG4gICAgdGhpcy5tZXNzYWdlS2V5ID0gY29uZmlnLmRvbVN0b3JhZ2UubWVzc2FnZUtleTtcbiAgICB0aGlzLndpbmRvdyA9IGhvc3RPYmplY3Qud2luZG93O1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSR0cmlnZ2VyKG1zZ1R5cGUsIGRhdGEpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5tZXNzYWdlS2V5ICsgbXNnVHlwZTtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhW2NvbmZpZy5kb21TdG9yYWdlLm1lc3NhZ2VUaW1lc3RhbXBdID0gbWlsb0NvdW50KCk7XG4gICAgXy5kZWZlck1ldGhvZCh0aGlzLnN0b3JhZ2UsICdzZXRJdGVtJywga2V5LCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIGlmIChldmVudC5zdG9yYWdlQXJlYSAhPSB0aGlzLnN0b3JhZ2UuX3N0b3JhZ2UpIHJldHVybjtcbiAgICB2YXIga2V5ID0gdGhpcy5zdG9yYWdlLl9kb21TdG9yYWdlS2V5KGV2ZW50LmtleSk7IGlmICghIGtleSkgcmV0dXJuO1xuICAgIHZhciBtc2dUeXBlID0gXy51blByZWZpeChrZXksIHRoaXMubWVzc2FnZUtleSk7IGlmICghIG1zZ1R5cGUpIHJldHVybjtcbiAgICB2YXIgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7IGlmICghIGRhdGEpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShtc2dUeXBlLCBkYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby51dGlsLndlYnNvY2tldGAgXG4qKi9cblxuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnbWlsby1jb3JlJykuTWVzc2VuZ2VyXG4gICAgLCBXU01lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgV1NNc2dBUEkgPSByZXF1aXJlKCcuL21zZ19hcGknKTtcblxuXG5mdW5jdGlvbiB3ZWJzb2NrZXQoKSB7XG4gICAgdmFyIHdzTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcjtcbiAgICB2YXIgd3NNc2dTb3VyY2UgPSBuZXcgV1NNZXNzYWdlU291cmNlKHdzTWVzc2VuZ2VyLCB7IHNlbmQ6ICd0cmlnZ2VyJywgY29ubmVjdDogJ2Nvbm5lY3QnIH0sIG5ldyBXU01zZ0FQSSk7XG4gICAgd3NNZXNzZW5nZXIuX3NldE1lc3NhZ2VTb3VyY2Uod3NNc2dTb3VyY2UpO1xuICAgIHJldHVybiB3c01lc3Nlbmdlcjtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHdlYnNvY2tldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgV1NNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ1dTTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhXU01zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGFcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdTTXNnQVBJO1xuXG5cbnZhciBTT0NLRVRfTUVTU0FHRVMgPSBbJ29wZW4nLCAnY2xvc2UnLCAnZXJyb3InLCAnbWVzc2FnZSddO1xuXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwXG4gICAgICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgICAgIDogJ21lc3NhZ2UnO1xufVxuXG5cbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgbXNnRGF0YSkge1xuICAgIGlmIChTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwKSByZXR1cm4gdHJ1ZTsgLy8gaW50ZXJuYWwgbWVzc2FnZSBpcyBvbmUgb2YgZXh0ZXJuYWwgbWVzc2FnZXNcbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScpIHtcbiAgICAgICAgdmFyIG1zZ1R5cGUgPSBtc2dEYXRhICYmIG1zZ0RhdGEudHlwZTtcbiAgICAgICAgcmV0dXJuIG1zZ1R5cGUgPT0gbWVzc2FnZTsgLy8gdHlwZSBlcXVhbHMgaW50ZXJuYWwgbWVzc2FnZVxuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGV2ZW50KSB7XG4gICAgdmFyIGludGVybmFsRGF0YSA9IHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKGV2ZW50LmRhdGEpIHx8IGV2ZW50LmRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZXZlbnQ7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2NvdW50JylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxudmFyIFdTTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ1dTTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oV1NNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIFxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBoYW5kbGVFdmVudDogV1NNZXNzYWdlU291cmNlJGhhbmRsZUV2ZW50LFxuICAgIGNvbm5lY3Q6IFdTTWVzc2FnZVNvdXJjZSRjb25uZWN0LFxuICAgIHRyaWdnZXI6IFdTTWVzc2FnZVNvdXJjZSR0cmlnZ2VyXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFdTTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBXU01lc3NhZ2VTb3VyY2UkY29ubmVjdChvcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdmFyIGhvc3QgPSBvcHRpb25zLmhvc3QgfHwgd2luZG93LmxvY2F0aW9uLmhvc3QucmVwbGFjZSgvOi4qLywgJycpXG4gICAgICAgICwgcG9ydCA9IG9wdGlvbnMucG9ydCB8fCAnODA4MCc7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5fd3MpIHtcbiAgICAgICAgLy8gVE9ETyBzaG91bGQgdW5zdWJzY3JpYmUgZGlmZmVyZW50bHlcbiAgICAgICAgdGhpcy5fd3Mub25vcGVuID0gdGhpcy53cy5vbm1lc3NhZ2UgPSB0aGlzLndzLm9uY2xvc2UgPSB0aGlzLndzLm9uZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3dzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fd3MgPSBuZXcgV2ViU29ja2V0KCd3czovLycgKyBob3N0ICsgJzonICsgcG9ydCk7XG5cbiAgICAvLyBUT0RPIHJlY29ubmVjdFxufVxuXG5cblxuZnVuY3Rpb24gYWRkU291cmNlU3Vic2NyaWJlciAoc291cmNlTWVzc2FnZSkge1xuICAgIF93c1N1YnNjcmliZXJNZXRob2QuY2FsbCh0aGlzLCAnYWRkRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIgKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBfd3NTdWJzY3JpYmVyTWV0aG9kLmNhbGwodGhpcywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiBfd3NTdWJzY3JpYmVyTWV0aG9kIChtZXRob2QsIHNvdXJjZU1lc3NhZ2UpIHsgICAgXG4gICAgaWYgKCF0aGlzLl93cykgcmV0dXJuIGxvZ2dlci5lcnJvcignd2Vic29ja2V0IGlzIG5vdCBjcmVhdGVkJyk7XG4gICAgdGhpcy5fd3NbbWV0aG9kXShzb3VyY2VNZXNzYWdlLCB0aGlzKTtcbn1cblxuXG4vLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG5mdW5jdGlvbiBXU01lc3NhZ2VTb3VyY2UkaGFuZGxlRXZlbnQgKGV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQudHlwZSwgZXZlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIFdTTWVzc2FnZVNvdXJjZSR0cmlnZ2VyIChtc2csIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl93cykgcmV0dXJuIGxvZ2dlci5lcnJvcignd2Vic29ja2V0IGlzIG5vdCBjcmVhdGVkJyk7XG5cbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnR5cGUgPSBtc2c7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGRhdGEuY2FsbGJhY2tDb3JySWQgPSB1bmlxdWVJZCgpO1xuICAgICAgICB2YXIgaW50ZXJ2YWwgPSBfLmRlbGF5KG9uVGltZW91dCwgY29uZmlnLndlYnNvY2tldC5ycGMudGltZW91dCk7XG4gICAgICAgIHRvZ2dsZVJwY1N1YnNjcmlwdGlvbignb25jZScsIGRhdGEuY2FsbGJhY2tDb3JySWQpO1xuICAgIH0gICAgXG5cbiAgICB0aGlzLl93cy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuXG4gICAgZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgICB0b2dnbGVScGNTdWJzY3JpcHRpb24oJ29mZicsIGRhdGEuY2FsbGJhY2tDb3JySWQpO1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ3dlYnNvY2tldCBycGM6IHRpbWVvdXQnKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25SZXNwb25zZShtc2csIG1zZ0RhdGEpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIGlmICh0eXBlb2YgbXNnRGF0YSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGVyciA9IG1zZ0RhdGEuZXJyb3IgPyBuZXcgRXJyb3IobXNnRGF0YS5lcnJvcikgOiBudWxsO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBtc2dEYXRhLmRhdGEpXG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCd3ZWJzb2NrZXQgcnBjOiBpbnZhbGlkIHJlc3BvbnNlIGRhdGEnKSwgbXNnRGF0YSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9nZ2xlUnBjU3Vic2NyaXB0aW9uKG9uT2ZmLCBjb3JySWQpIHtcbiAgICAgICAgc2VsZi5tZXNzZW5nZXJbb25PZmZdKGNvbmZpZy53ZWJzb2NrZXQucnBjLnJlc3BvbnNlUHJlZml4ICsgY29ycklkLCBvblJlc3BvbnNlKTtcbiAgICB9XG59XG4iLCI7KGZ1bmN0aW9uKCl7XG5cbi8vIFRoaXMgd291bGQgYmUgdGhlIHBsYWNlIHRvIGVkaXQgaWYgeW91IHdhbnQgYSBkaWZmZXJlbnRcbi8vIEJhc2UzMiBpbXBsZW1lbnRhdGlvblxuXG52YXIgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoamttbnBxcnR1dnd4eXonXG52YXIgYWxpYXMgPSB7IG86MCwgaToxLCBsOjEsIHM6NSB9XG5cbi8qKlxuICogQnVpbGQgYSBsb29rdXAgdGFibGUgYW5kIG1lbW9pemUgaXRcbiAqXG4gKiBSZXR1cm4gYW4gb2JqZWN0IHRoYXQgbWFwcyBhIGNoYXJhY3RlciB0byBpdHNcbiAqIGJ5dGUgdmFsdWUuXG4gKi9cblxudmFyIGxvb2t1cCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0YWJsZSA9IHt9XG4gICAgLy8gSW52ZXJ0ICdhbHBoYWJldCdcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRhYmxlW2FscGhhYmV0W2ldXSA9IGlcbiAgICB9XG4gICAgLy8gU3BsaWNlIGluICdhbGlhcydcbiAgICBmb3IgKHZhciBrZXkgaW4gYWxpYXMpIHtcbiAgICAgICAgaWYgKCFhbGlhcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICAgICAgICB0YWJsZVtrZXldID0gdGFibGVbJycgKyBhbGlhc1trZXldXVxuICAgIH1cbiAgICBsb29rdXAgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRhYmxlIH1cbiAgICByZXR1cm4gdGFibGVcbn1cblxuLyoqXG4gKiBBIHN0cmVhbWluZyBlbmNvZGVyXG4gKlxuICogICAgIHZhciBlbmNvZGVyID0gbmV3IGJhc2UzMi5FbmNvZGVyKClcbiAqICAgICB2YXIgb3V0cHV0MSA9IGVuY29kZXIudXBkYXRlKGlucHV0MSlcbiAqICAgICB2YXIgb3V0cHV0MiA9IGVuY29kZXIudXBkYXRlKGlucHV0MilcbiAqICAgICB2YXIgbGFzdG91dHB1dCA9IGVuY29kZS51cGRhdGUobGFzdGlucHV0LCB0cnVlKVxuICovXG5cbmZ1bmN0aW9uIEVuY29kZXIoKSB7XG4gICAgdmFyIHNraXAgPSAwIC8vIGhvdyBtYW55IGJpdHMgd2Ugd2lsbCBza2lwIGZyb20gdGhlIGZpcnN0IGJ5dGVcbiAgICB2YXIgYml0cyA9IDAgLy8gNSBoaWdoIGJpdHMsIGNhcnJ5IGZyb20gb25lIGJ5dGUgdG8gdGhlIG5leHRcblxuICAgIHRoaXMub3V0cHV0ID0gJydcblxuICAgIC8vIFJlYWQgb25lIGJ5dGUgb2YgaW5wdXRcbiAgICAvLyBTaG91bGQgbm90IHJlYWxseSBiZSB1c2VkIGV4Y2VwdCBieSBcInVwZGF0ZVwiXG4gICAgdGhpcy5yZWFkQnl0ZSA9IGZ1bmN0aW9uKGJ5dGUpIHtcbiAgICAgICAgLy8gY29lcmNlIHRoZSBieXRlIHRvIGFuIGludFxuICAgICAgICBpZiAodHlwZW9mIGJ5dGUgPT0gJ3N0cmluZycpIGJ5dGUgPSBieXRlLmNoYXJDb2RlQXQoMClcblxuICAgICAgICBpZiAoc2tpcCA8IDApIHsgLy8gd2UgaGF2ZSBhIGNhcnJ5IGZyb20gdGhlIHByZXZpb3VzIGJ5dGVcbiAgICAgICAgICAgIGJpdHMgfD0gKGJ5dGUgPj4gKC1za2lwKSlcbiAgICAgICAgfSBlbHNlIHsgLy8gbm8gY2FycnlcbiAgICAgICAgICAgIGJpdHMgPSAoYnl0ZSA8PCBza2lwKSAmIDI0OFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNraXAgPiAzKSB7XG4gICAgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEgdG8gcHJvZHVjZSBhIGNoYXJhY3RlciwgZ2V0IHVzIGFub3RoZXIgb25lXG4gICAgICAgICAgICBza2lwIC09IDhcbiAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2tpcCA8IDQpIHtcbiAgICAgICAgICAgIC8vIHByb2R1Y2UgYSBjaGFyYWN0ZXJcbiAgICAgICAgICAgIHRoaXMub3V0cHV0ICs9IGFscGhhYmV0W2JpdHMgPj4gM11cbiAgICAgICAgICAgIHNraXAgKz0gNVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICAvLyBGbHVzaCBhbnkgcmVtYWluaW5nIGJpdHMgbGVmdCBpbiB0aGUgc3RyZWFtXG4gICAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbihjaGVjaykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXQgKyAoc2tpcCA8IDAgPyBhbHBoYWJldFtiaXRzID4+IDNdIDogJycpICsgKGNoZWNrID8gJyQnIDogJycpXG4gICAgICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzIGFkZGl0aW9uYWwgaW5wdXRcbiAqXG4gKiBpbnB1dDogc3RyaW5nIG9mIGJ5dGVzIHRvIGNvbnZlcnRcbiAqIGZsdXNoOiBib29sZWFuLCBzaG91bGQgd2UgZmx1c2ggYW55IHRyYWlsaW5nIGJpdHMgbGVmdFxuICogICAgICAgIGluIHRoZSBzdHJlYW1cbiAqIHJldHVybnM6IGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nICdpbnB1dCcgaW4gYmFzZTMyXG4gKi9cblxuRW5jb2Rlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oaW5wdXQsIGZsdXNoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICkge1xuICAgICAgICBpICs9IHRoaXMucmVhZEJ5dGUoaW5wdXRbaV0pXG4gICAgfVxuICAgIC8vIGNvbnN1bWUgYWxsIG91dHB1dFxuICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dFxuICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgIG91dHB1dCArPSB0aGlzLmZpbmlzaCgpXG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRcbn1cblxuLy8gRnVuY3Rpb25zIGFuYWxvZ291c2x5IHRvIEVuY29kZXJcblxuZnVuY3Rpb24gRGVjb2RlcigpIHtcbiAgICB2YXIgc2tpcCA9IDAgLy8gaG93IG1hbnkgYml0cyB3ZSBoYXZlIGZyb20gdGhlIHByZXZpb3VzIGNoYXJhY3RlclxuICAgIHZhciBieXRlID0gMCAvLyBjdXJyZW50IGJ5dGUgd2UncmUgcHJvZHVjaW5nXG5cbiAgICB0aGlzLm91dHB1dCA9ICcnXG5cbiAgICAvLyBDb25zdW1lIGEgY2hhcmFjdGVyIGZyb20gdGhlIHN0cmVhbSwgc3RvcmVcbiAgICAvLyB0aGUgb3V0cHV0IGluIHRoaXMub3V0cHV0LiBBcyBiZWZvcmUsIGJldHRlclxuICAgIC8vIHRvIHVzZSB1cGRhdGUoKS5cbiAgICB0aGlzLnJlYWRDaGFyID0gZnVuY3Rpb24oY2hhcikge1xuICAgICAgICBpZiAodHlwZW9mIGNoYXIgIT0gJ3N0cmluZycpe1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGFyID09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgY2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGFyID0gY2hhci50b0xvd2VyQ2FzZSgpXG4gICAgICAgIHZhciB2YWwgPSBsb29rdXAoKVtjaGFyXVxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGRvZXMgbm90IGV4aXN0IGluIG91ciBsb29rdXAgdGFibGVcbiAgICAgICAgICAgIHJldHVybiAvLyBza2lwIHNpbGVudGx5LiBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZTpcbiAgICAgICAgICAgIC8vIHRocm93IEVycm9yKCdDb3VsZCBub3QgZmluZCBjaGFyYWN0ZXIgXCInICsgY2hhciArICdcIiBpbiBsb29rdXAgdGFibGUuJylcbiAgICAgICAgfVxuICAgICAgICB2YWwgPDw9IDMgLy8gbW92ZSB0byB0aGUgaGlnaCBiaXRzXG4gICAgICAgIGJ5dGUgfD0gdmFsID4+PiBza2lwXG4gICAgICAgIHNraXAgKz0gNVxuICAgICAgICBpZiAoc2tpcCA+PSA4KSB7XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBwcmVkdWNlIG91dHB1dFxuICAgICAgICAgICAgdGhpcy5vdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKVxuICAgICAgICAgICAgc2tpcCAtPSA4XG4gICAgICAgICAgICBpZiAoc2tpcCA+IDApIGJ5dGUgPSAodmFsIDw8ICg1IC0gc2tpcCkpICYgMjU1XG4gICAgICAgICAgICBlbHNlIGJ5dGUgPSAwXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHRoaXMuZmluaXNoID0gZnVuY3Rpb24oY2hlY2spIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0ICsgKHNraXAgPCAwID8gYWxwaGFiZXRbYml0cyA+PiAzXSA6ICcnKSArIChjaGVjayA/ICckJyA6ICcnKVxuICAgICAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG59XG5cbkRlY29kZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGlucHV0LCBmbHVzaCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZWFkQ2hhcihpbnB1dFtpXSlcbiAgICB9XG4gICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0XG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgIGlmIChmbHVzaCkge1xuICAgICAgb3V0cHV0ICs9IHRoaXMuZmluaXNoKClcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFxufVxuXG4vKiogQ29udmVuaWVuY2UgZnVuY3Rpb25zXG4gKlxuICogVGhlc2UgYXJlIHRoZSBvbmVzIHRvIHVzZSBpZiB5b3UganVzdCBoYXZlIGEgc3RyaW5nIGFuZFxuICogd2FudCB0byBjb252ZXJ0IGl0IHdpdGhvdXQgZGVhbGluZyB3aXRoIHN0cmVhbXMgYW5kIHdoYXRub3QuXG4gKi9cblxuLy8gU3RyaW5nIG9mIGRhdGEgZ29lcyBpbiwgQmFzZTMyLWVuY29kZWQgc3RyaW5nIGNvbWVzIG91dC5cbmZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuICB2YXIgZW5jb2RlciA9IG5ldyBFbmNvZGVyKClcbiAgdmFyIG91dHB1dCA9IGVuY29kZXIudXBkYXRlKGlucHV0LCB0cnVlKVxuICByZXR1cm4gb3V0cHV0XG59XG5cbi8vIEJhc2UzMi1lbmNvZGVkIHN0cmluZyBnb2VzIGluLCBkZWNvZGVkIGRhdGEgY29tZXMgb3V0LlxuZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG4gICAgdmFyIGRlY29kZXIgPSBuZXcgRGVjb2RlcigpXG4gICAgdmFyIG91dHB1dCA9IGRlY29kZXIudXBkYXRlKGlucHV0LCB0cnVlKVxuICAgIHJldHVybiBvdXRwdXRcbn1cblxudmFyIGJhc2UzMiA9IHtcbiAgICBEZWNvZGVyOiBEZWNvZGVyLFxuICAgIEVuY29kZXI6IEVuY29kZXIsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgZGVjb2RlOiBkZWNvZGVcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIHdlJ3JlIGluIGEgYnJvd3NlciAtIE9NRyFcbiAgd2luZG93LmJhc2UzMiA9IGJhc2UzMlxufVxuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgLy8gbm9kZWpzL2Jyb3dzZXJpZnlcbiAgbW9kdWxlLmV4cG9ydHMgPSBiYXNlMzJcbn1cbn0pKCk7XG4iLCJcbi8vIG5vdCBpbXBsZW1lbnRlZFxuLy8gVGhlIHJlYXNvbiBmb3IgaGF2aW5nIGFuIGVtcHR5IGZpbGUgYW5kIG5vdCB0aHJvd2luZyBpcyB0byBhbGxvd1xuLy8gdW50cmFkaXRpb25hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZHVsZS5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJylcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWl4aW47XG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5NaXhpbmAgLSBhbiBhYnN0cmFjdCBNaXhpbiBjbGFzcy5cbiAqIENhbiBiZSBzdWJjbGFzc2VkIHVzaW5nOlxuICogYGBgXG4gKiB2YXIgTXlNaXhpbiA9IF8uY3JlYXRlU3ViY2xhc3MobWlsby5jbGFzc2VzLk1peGluLCAnTXlNaXhpbicpO1xuICogYGBgXG4gKlxuICogTWl4aW4gcGF0dGVybiBpcyBhbHNvIHVzZWQsIGJ1dCBNaXhpbiBpbiBtaWxvIGlzIGltcGxlbWVudGVkIGFzIGEgc2VwYXJhdGUgb2JqZWN0IHRoYXQgaXMgc3RvcmVkIG9uIHRoZSBwcm9wZXJ0eSBvZiB0aGUgaG9zdCBvYmplY3QgYW5kIGNhbiBjcmVhdGUgcHJveHkgbWV0aG9kcyBvbiB0aGUgaG9zdCBvYmplY3QgaWYgcmVxdWlyZWQuXG4gKiBDbGFzc2VzIFtNZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSBhbmQgW01lc3NhZ2VTb3VyY2VdKC4uL21lc3Nlbmdlci9tX3NvdXJjZS5qcy5odG1sKSBhcmUgc3ViY2xhc3NlcyBvZiBNaXhpbiBhYnN0cmFjdCBjbGFzcy4gYHRoaXNgIGluIHByb3h5IG1ldGhvZHMgcmVmZXJzIHRvIE1peGluIGluc3RhbmNlLCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBob3N0IG9iamVjdCBpcyBgdGhpcy5faG9zdE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3QgT3B0aW9uYWwgb2JqZWN0IHdoZXJlIGEgTWl4aW4gaW5zdGFuY2Ugd2lsbCBiZSBzdG9yZWQgb24uIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBhbmQgYWxzbyB0byBmaW5kIHRoZSByZWZlcmVuY2Ugd2hlbiBpdCBpcyBuZWVkZWQgZm9yIGhvc3Qgb2JqZWN0IGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IHByb3h5TWV0aG9kcyBPcHRpb25hbCBtYXAgb2YgcHJveHkgbWV0aG9kIG5hbWVzIGFzIGtleXMgYW5kIE1peGluIG1ldGhvZHMgbmFtZXMgYXMgdmFsdWVzLCBzbyBwcm94aWVkIG1ldGhvZHMgY2FuIGJlIHJlbmFtZWQgdG8gYXZvaWQgbmFtZS1zcGFjZSBjb25mbGljdHMgaWYgdHdvIGRpZmZlcmVudCBNaXhpbiBpbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBtZXRob2QgbmFtZXMgYXJlIHB1dCBvbiB0aGUgb2JqZWN0XG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhbGwgY29uc3RydWN0b3IgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIGluaXQgbWV0aG9kIG9mIE1peGluIHN1YmNsYXNzIHRvZ2V0aGVyIHdpdGggaG9zdE9iamVjdCBhbmQgcHJveHlNZXRob2RzXG4gKiBAcmV0dXJuIHtNaXhpbn1cbiAqL1xuZnVuY3Rpb24gTWl4aW4oaG9zdE9iamVjdCwgcHJveHlNZXRob2RzKSB7IC8vICwgb3RoZXIgYXJncyAtIHBhc3NlZCB0byBpbml0IG1ldGhvZFxuICAgIGNoZWNrKGhvc3RPYmplY3QsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKE9iamVjdCwgRnVuY3Rpb24pKSk7XG5cbiAgICAvLyBzdG9yZSBob3N0T2JqZWN0XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2hvc3RPYmplY3QnLCBob3N0T2JqZWN0KTtcblxuICAgIC8vIHByb3h5IG1ldGhvZHMgdG8gaG9zdE9iamVjdFxuICAgIGlmIChwcm94eU1ldGhvZHMpXG4gICAgICAgIHRoaXMuX2NyZWF0ZVByb3h5TWV0aG9kcyhwcm94eU1ldGhvZHMpO1xuXG4gICAgLy8gY2FsbGluZyBpbml0IGlmIGl0IGlzIGRlZmluZWQgaW4gdGhlIGNsYXNzXG4gICAgaWYgKHRoaXMuaW5pdClcbiAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWl4aW4gaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBjb25zdHJ1Y3RvciwgdGhleSBhcmUgbm90IHRvIGJlIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMuXG4gKlxuICogLSBbX2NyZWF0ZVByb3h5TWV0aG9kXSgjX2NyZWF0ZVByb3h5TWV0aG9kKVxuICogLSBbX2NyZWF0ZVByb3h5TWV0aG9kc10oI19jcmVhdGVQcm94eU1ldGhvZHMpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWl4aW4sIHtcbiAgICBfY3JlYXRlUHJveHlNZXRob2Q6IF9jcmVhdGVQcm94eU1ldGhvZCwgIC8vIGRlcHJlY2F0ZWQsIHNob3VsZCBub3QgYmUgdXNlZFxuICAgIF9jcmVhdGVQcm94eU1ldGhvZHM6IF9jcmVhdGVQcm94eU1ldGhvZHMgIC8vIGRlcHJlY2F0ZWQsIHNob3VsZCBub3QgYmUgdXNlZFxufSk7XG5cblxuLyoqXG4gKiAjIyMjTWl4aW4gY2xhc3MgbWV0aG9kcyMjIyNcbiAqIFRoZXNlIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIGhvc3QgY2xhc3MgZGVjbGFyYXRpb24uXG4gKlxuICogLSBbdXNlV2l0aF0oI01peGluJCR1c2VXaXRoKVxuICovXG5fLmV4dGVuZChNaXhpbiwge1xuICAgIHVzZVdpdGg6IE1peGluJCR1c2VXaXRoXG59KTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm94aWVkIG1ldGhvZCBvZiBNaXhpbiBzdWJjbGFzcyBvbiBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWl4aW5NZXRob2ROYW1lIG5hbWUgb2YgbWV0aG9kIGluIE1peGluIHN1YmNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJveHlNZXRob2ROYW1lIG5hbWUgb2YgY3JlYXRlZCBwcm94eSBtZXRob2Qgb24gaG9zdCBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgaG9zdCBvYmplY3Q7IGlmIG5vdCBzcGVjaWZpZWQgdGhlIGhvc3Qgb2JqZWN0IHBhc3NlZCB0byBjb25zdHJ1Y3RvciB3aWwgYmUgdXNlZC4gSXQgYWxsb3dzIHRvIHVzZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiBNaXhpbiBvbiB0d28gaG9zdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBfY3JlYXRlUHJveHlNZXRob2QocHJveHlNZXRob2ROYW1lLCBtaXhpbk1ldGhvZE5hbWUsIGhvc3RPYmplY3QpIHtcbiAgICBob3N0T2JqZWN0ID0gaG9zdE9iamVjdCB8fCB0aGlzLl9ob3N0T2JqZWN0O1xuXG4gICAgLy8gTWl4aW4gY2xhc3MgZG9lcyBub3QgYWxsb3cgc2hhZG93aW5nIG1ldGhvZHMgdGhhdCBleGlzdCBvbiB0aGUgaG9zdCBvYmplY3RcbiAgICBpZiAoaG9zdE9iamVjdFtwcm94eU1ldGhvZE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21ldGhvZCAnICsgcHJveHlNZXRob2ROYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgYWxyZWFkeSBkZWZpbmVkIGluIGhvc3Qgb2JqZWN0Jyk7XG5cbiAgICB2YXIgbWV0aG9kID0gdGhpc1ttaXhpbk1ldGhvZE5hbWVdXG4gICAgY2hlY2sobWV0aG9kLCBGdW5jdGlvbik7XG5cbiAgICAvLyBCaW5kIHByb3hpZWQgTWl4aW4ncyBtZXRob2QgdG8gTWl4aW4gaW5zdGFuY2VcbiAgICB2YXIgYm91bmRNZXRob2QgPSBtZXRob2QuYmluZCh0aGlzKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkoaG9zdE9iamVjdCwgcHJveHlNZXRob2ROYW1lLCBib3VuZE1ldGhvZCwgXy5XUklUKTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgcHJveGllZCBtZXRob2RzIG9mIE1peGluIHN1YmNsYXNzIG9uIGhvc3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7SGFzaFtTdHJpbmddfEFycmF5W1N0cmluZ119IHByb3h5TWV0aG9kcyBtYXAgb2YgbmFtZXMgb2YgbWV0aG9kcywga2V5IC0gcHJveHkgbWV0aG9kIG5hbWUsIHZhbHVlIC0gbWl4aW4gbWV0aG9kIG5hbWUuIENhbiBiZSBhcnJheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IGFuIG9wdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgaG9zdCBvYmplY3Q7IGlmIG5vdCBzcGVjaWZpZWQgdGhlIGhvc3Qgb2JqZWN0IHBhc3NlZCB0byBjb25zdHJ1Y3RvciB3aWwgYmUgdXNlZC4gSXQgYWxsb3dzIHRvIHVzZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiBNaXhpbiBvbiB0d28gaG9zdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBfY3JlYXRlUHJveHlNZXRob2RzKHByb3h5TWV0aG9kcywgaG9zdE9iamVjdCkge1xuICAgIGNoZWNrKHByb3h5TWV0aG9kcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoW1N0cmluZ10sIE1hdGNoLk9iamVjdEhhc2goU3RyaW5nKSkpKTtcblxuICAgIC8vIGNyZWF0aW5nIGFuZCBiaW5kaW5nIHByb3h5IG1ldGhvZHMgb24gdGhlIGhvc3Qgb2JqZWN0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJveHlNZXRob2RzKSlcbiAgICAgICAgcHJveHlNZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgLy8gbWV0aG9kIGNhbGxlZCB0aGlzIHdheSB0byBhbGxvdyB1c2luZyBfY3JlYXRlUHJveHlNZXRob2RzIHdpdGggb2JqZWN0c1xuICAgICAgICAgICAgLy8gdGhhdCBhcmUgbm90IGluaGVyaXRpbmcgZnJvbSBNaXhpblxuICAgICAgICAgICAgX2NyZWF0ZVByb3h5TWV0aG9kLmNhbGwodGhpcywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgaG9zdE9iamVjdCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIGVsc2VcbiAgICAgICAgXy5lYWNoS2V5KHByb3h5TWV0aG9kcywgZnVuY3Rpb24obWl4aW5NZXRob2ROYW1lLCBwcm94eU1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIC8vIG1ldGhvZCBjYWxsZWQgdGhpcyB3YXkgdG8gYWxsb3cgdXNpbmcgX2NyZWF0ZVByb3h5TWV0aG9kcyB3aXRoIG9iamVjdHNcbiAgICAgICAgICAgIC8vIHRoYXQgYXJlIG5vdCBpbmhlcml0aW5nIGZyb20gTWl4aW5cbiAgICAgICAgICAgIF9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKHRoaXMsIHByb3h5TWV0aG9kTmFtZSwgbWl4aW5NZXRob2ROYW1lLCBob3N0T2JqZWN0KTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBTZXRzIG1peGluIGluc3RhbmNlIHByb3BlcnR5IG5hbWUgb24gdGhlIGhvc3QgY2xhc3NcbiAqIENhbiBiZSBjYWxsZWQgb25seSBvbmNlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhvc3RDbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IGluc3RhbmNlS2V5XG4gKi9cbmZ1bmN0aW9uIE1peGluX3NldEluc3RhbmNlS2V5KGhvc3RDbGFzcywgbWV0aG9kLCBpbnN0YW5jZUtleSkge1xuICAgIGNoZWNrKGhvc3RDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGluc3RhbmNlS2V5LCBNYXRjaC5JZGVudGlmaWVyU3RyaW5nKTtcblxuICAgIHZhciBwcm9wID0gY29uZmlnLm1peGluLmluc3RhbmNlUHJvcGVydGllc01hcFxuICAgICAgICAsIGluc3RhbmNlS2V5cyA9IGhvc3RDbGFzc1twcm9wXSA9IGhvc3RDbGFzc1twcm9wXSB8fCB7fTtcblxuICAgIGlmIChpbnN0YW5jZUtleXNbbWV0aG9kLm5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01peGluOiBpbnN0YW5jZSBwcm9wZXJ0eSBmb3IgbWV0aG9kIHdpdGggbmFtZSAnXG4gICAgICAgICAgICArIG1ldGhvZC5uYW1lICsgJyBpcyBhbHJlYWR5IHNldCcpO1xuXG4gICAgaW5zdGFuY2VLZXlzW21ldGhvZC5uYW1lXSA9IGluc3RhbmNlS2V5O1xufVxuXG5cbi8qKlxuICogQWRkcyBtZXRob2Qgb2YgTWl4aW4gc3ViY2xhc3MgdG8gaG9zdCBjbGFzcyBwcm90b3R5cGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaXhpbk1ldGhvZE5hbWUgbmFtZSBvZiBtZXRob2QgaW4gTWl4aW4gc3ViY2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0TWV0aG9kTmFtZSAob3B0aW9uYWwpIG5hbWUgb2YgY3JlYXRlZCBwcm94eSBtZXRob2Qgb24gaG9zdCBvYmplY3QsIHNhbWUgaWYgbm90IHNwZWNpZmllZFxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3Qgb2JqZWN0IGNsYXNzLCBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIgKDJuZCBvciAzcmQpXG4gKi9cbmZ1bmN0aW9uIE1peGluX2FkZE1ldGhvZChob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZE5hbWUsIGhvc3RNZXRob2ROYW1lKSB7XG4gICAgdmFyIG1ldGhvZCA9IHRoaXMucHJvdG90eXBlW21peGluTWV0aG9kTmFtZV07XG4gICAgY2hlY2sobWV0aG9kLCBGdW5jdGlvbik7XG5cbiAgICB2YXIgd3JhcHBlZE1ldGhvZCA9IF93cmFwTWl4aW5NZXRob2QuY2FsbCh0aGlzLCBtZXRob2QpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eShob3N0Q2xhc3MucHJvdG90eXBlLCBob3N0TWV0aG9kTmFtZSwgd3JhcHBlZE1ldGhvZCwgXy5XUklUKTtcblxuICAgIE1peGluX3NldEluc3RhbmNlS2V5KGhvc3RDbGFzcywgbWV0aG9kLCBpbnN0YW5jZUtleSlcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbWV0aG9kIHRoYXQgd2lsbCBiZSBleHBvc2VkIG9uIHRoZSBob3N0IGNsYXNzIHByb3RvdHlwZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gX3dyYXBNaXhpbk1ldGhvZChtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vICwuLi4gYXJndW1lbnRzXG4gICAgICAgIHZhciBtaXhpbkluc3RhbmNlID0gX2dldE1peGluSW5zdGFuY2UuY2FsbCh0aGlzLCBtZXRob2QubmFtZSk7XG4gICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkobWl4aW5JbnN0YW5jZSwgYXJndW1lbnRzKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIG9mIG1peGluIHN1YmNsYXNzLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIG1ldGhvZHMgYXJlIGV4cG9zZWQgb24gdGhlIGhvc3QgY2xhc3MgcHJvdG90eXBlICh1c2luZyBhZGRNZWh0b2RzKSByYXRoZXIgdGhhbiBvbiBob3N0IGluc3RhbmNlLlxuICogU3ViY2xhc3NlcyBzaG91bGQgbm90IHVzZSB0aGlzIG1ldGhvZHMgLSB3aGVuZXZlciBzdWJjbGFzcyBtZXRob2QgaXMgZXhwb3NlZCBvbiB0aGUgcHJvdG90eXBlIGl0IHdpbGwgYmUgd3JhcHBlZCB0byBzZXQgY29ycmVjdCBjb250ZXh0IGZvciB0aGUgc3ViY2xhc3MgbWV0aG9kLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIF9nZXRNaXhpbkluc3RhbmNlKG1ldGhvZE5hbWUpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE1peGluKSByZXR1cm4gdGhpcztcbiAgICB2YXIgaW5zdGFuY2VLZXlzID0gdGhpcy5jb25zdHJ1Y3Rvcltjb25maWcubWl4aW4uaW5zdGFuY2VQcm9wZXJ0aWVzTWFwXVxuICAgIHJldHVybiB0aGlzW2luc3RhbmNlS2V5c1ttZXRob2ROYW1lXV07XG59XG5cblxuLyoqXG4gKiBBZGRzIG1ldGhvZHMgb2YgTWl4aW4gc3ViY2xhc3MgdG8gaG9zdCBjbGFzcyBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RDbGFzcyBob3N0IG9iamVjdCBjbGFzczsgbXVzdCBiZSBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5zdGFuY2VLZXkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBob3N0IGNsYXNzIGluc3RhbmNlIHdpbGwgc3RvcmUgbWl4aW4gaW5zdGFuY2Ugb25cbiAqIEBwYXJhbSB7SGFzaFtTdHJpbmddfEFycmF5W1N0cmluZ119IG1peGluTWV0aG9kcyBtYXAgb2YgbmFtZXMgb2YgbWV0aG9kcywga2V5IC0gaG9zdCBtZXRob2QgbmFtZSwgdmFsdWUgLSBtaXhpbiBtZXRob2QgbmFtZS4gQ2FuIGJlIGFycmF5LlxuICovXG5mdW5jdGlvbiBNaXhpbiQkdXNlV2l0aChob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZHMpIHtcbiAgICBjaGVjayhtaXhpbk1ldGhvZHMsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKFtTdHJpbmddLCBNYXRjaC5PYmplY3RIYXNoKFN0cmluZykpKSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShtaXhpbk1ldGhvZHMpKVxuICAgICAgICBtaXhpbk1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICBNaXhpbl9hZGRNZXRob2QuY2FsbCh0aGlzLCBob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtZXRob2ROYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgZWxzZVxuICAgICAgICBfLmVhY2hLZXkobWl4aW5NZXRob2RzLCBmdW5jdGlvbihtaXhpbk1ldGhvZE5hbWUsIGhvc3RNZXRob2ROYW1lKSB7XG4gICAgICAgICAgICBNaXhpbl9hZGRNZXRob2QuY2FsbCh0aGlzLCBob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZE5hbWUsIGhvc3RNZXRob2ROYW1lKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJjbGFzc2VzXCI+PC9hPlxuLy8gbWlsby5jbGFzc2VzXG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBUaGlzIG1vZHVsZSBjb250YWlucyBmb3VuZGF0aW9uIGNsYXNzZXNcblxudmFyIGNsYXNzZXMgPSB7XG4gICAgTWl4aW46IHJlcXVpcmUoJy4vYWJzdHJhY3QvbWl4aW4nKSxcbiAgICBNZXNzYWdlU291cmNlOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tX3NvdXJjZScpLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpLFxuICAgIE1lc3NlbmdlckFQSTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbV9hcGknKSxcbiAgICBNZXNzZW5nZXJSZWdleHBBUEk6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21fYXBpX3J4Jylcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3NlcztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gY29uZmlnO1xuXG5mdW5jdGlvbiBjb25maWcob3B0aW9ucykge1xuICAgIF8uZGVlcEV4dGVuZChjb25maWcsIG9wdGlvbnMpO1xufVxuXG5jb25maWcoe1xuICAgIG1peGluOiB7XG4gICAgICAgIGluc3RhbmNlUHJvcGVydGllc01hcDogJ19fX21peGluX2luc3RhbmNlcydcbiAgICB9LFxuICAgIGNoZWNrOiB0cnVlLFxuICAgIGRlYnVnOiBmYWxzZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNaXhpbiA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L21peGluJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21fc291cmNlJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJylcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxuLyoqXG4gKiBgbWlsby5NZXNzZW5nZXJgXG4gKiBBIGdlbmVyaWMgTWVzc2VuZ2VyIGNsYXNzIHRoYXQgaXMgdXNlZCBmb3IgYWxsIGtpbmRzIG9mIG1lc3NhZ2luZyBpbiBtaWxvLiBJdCBpcyBzdWJjbGFzc2VkIGZyb20gW01peGluXSguLi9hYnN0cmFjdC9taXhpbi5qcy5odG1sKSBhbmQgaXQgcHJveGllcyBpdHMgbWV0aG9kcyB0byB0aGUgaG9zdCBvYmplY3QgZm9yIGNvbnZlbmllbmNlLlxuICogQWxsIGZhY2V0cyBhbmQgY29tcG9uZW50cyBoYXZlIG1lc3NlbmdlciBhdHRhY2hlZCB0byB0aGVtLiBNZXNzZW5nZXIgY2xhc3MgaW50ZXJvcGVyYXRlcyB3aXRoIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGNsYXNzIHRoYXQgY29ubmVjdHMgdGhlIG1lc3NlbmdlciB0byBzb21lIGV4dGVybmFsIHNvdXJjZSBvZiBtZXNzYWdlcyAoZS5nLiwgRE9NIGV2ZW50cykgYW5kIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgY2xhc3MgdGhhdCBhbGxvd3MgdG8gZGVmaW5lIGhpZ2hlciBsZXZlbCBtZXNzYWdlcyB0aGFuIG1lc3NhZ2VzIHRoYXQgZXhpc3Qgb24gdGhlIHNvdXJjZS5cbiAqIE1lc3NlbmdlciBjbGFzcyBpcyB1c2VkIGludGVybmFsbHkgaW4gbWlsbyBhbmQgY2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBhbnkgb2JqZWN0cy9jbGFzc2VzIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAqIG1pbG8gYWxzbyBkZWZpbmVzIGEgZ2xvYmFsIG1lc3NlbmdlciBbbWlsby5tYWlsXSguLi9tYWlsL2luZGV4LmpzLmh0bWwpIHRoYXQgZGlzcGF0Y2hlcyBgZG9tcmVhZHlgIGV2ZW50IGFuZCBjYW4gYmUgdXNlZCBmb3IgYW55IGFwcGxpY2F0aW9uIHdpZGUgbWVzc2FnaW5nLlxuICogVG8gaW5pdGlhbGl6ZSB5b3VyIGFwcCBhZnRlciBET00gaXMgcmVhZHkgdXNlOlxuICogYGBgXG4gKiBtaWxvLm1haWwub24oJ2RvbXJlYWR5JywgZnVuY3Rpb24oKSB7XG4gKiAgICAgLy8gYXBwbGljYXRpb24gc3RhcnRzXG4gKiB9KTtcbiAqIGBgYFxuICogb3IgdGhlIGZvbGxvd2luZyBzaG9ydGVyIGZvcm0gb2YgdGhlIHNhbWU6XG4gKiBgYGBcbiAqIG1pbG8oZnVuY3Rpb24oKSB7XG4gKiAgICAgLy8gYXBwbGljYXRpb24gc3RhcnRzXG4gKiB9KTtcbiAqIGBgYFxuICovXG52YXIgTWVzc2VuZ2VyID0gXy5jcmVhdGVTdWJjbGFzcyhNaXhpbiwgJ01lc3NlbmdlcicpO1xuXG52YXIgbWVzc2FnZXNTcGxpdFJlZ0V4cCA9IE1lc3Nlbmdlci5tZXNzYWdlc1NwbGl0UmVnRXhwID0gL1xccyooPzpcXCx8XFxzKVxccyovO1xuXG5cbi8qKlxuICogIyMjI01lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KVxuICogLSBbb25dKCNNZXNzZW5nZXIkb24pIChhbGlhcyAtIG9uTWVzc2FnZSwgZGVwcmVjYXRlZClcbiAqIC0gW29mZl0oI01lc3NlbmdlciRvZmYpIChhbGlhcyAtIG9mZk1lc3NhZ2UsIGRlcHJlY2F0ZWQpXG4gKiAtIFtvbk1lc3NhZ2VzXSgjb25NZXNzYWdlcylcbiAqIC0gW29mZk1lc3NhZ2VzXSgjb2ZmTWVzc2FnZXMpXG4gKiAtIFtvbmNlXSgjb25jZSlcbiAqIC0gW29uY2VTeW5jXSgjb25jZVN5bmMpXG4gKiAtIFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKVxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKCNnZXRTdWJzY3JpYmVycylcbiAqXG4gKiBcIlByaXZhdGVcIiBtZXRob2RzXG4gKlxuICogLSBbX2Nob29zZVN1YnNjcmliZXJzSGFzaF0oI19jaG9vc2VTdWJzY3JpYmVyc0hhc2gpXG4gKiAtIFtfcmVnaXN0ZXJTdWJzY3JpYmVyXSgjX3JlZ2lzdGVyU3Vic2NyaWJlcilcbiAqIC0gW19yZW1vdmVTdWJzY3JpYmVyXSgjX3JlbW92ZVN1YnNjcmliZXIpXG4gKiAtIFtfcmVtb3ZlQWxsU3Vic2NyaWJlcnNdKCNfcmVtb3ZlQWxsU3Vic2NyaWJlcnMpXG4gKiAtIFtfY2FsbFBhdHRlcm5TdWJzY3JpYmVyc10oI19jYWxsUGF0dGVyblN1YnNjcmliZXJzKVxuICogLSBbX2NhbGxTdWJzY3JpYmVyc10oI19jYWxsU3Vic2NyaWJlcnMpXG4gKiAtIFtfc2V0TWVzc2FnZVNvdXJjZV0oI19zZXRNZXNzYWdlU291cmNlKVxuICogLSBbZ2V0TWVzc2FnZVNvdXJjZV0oI2dldE1lc3NhZ2VTb3VyY2UpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyLCB7XG4gICAgaW5pdDogaW5pdCwgLy8gY2FsbGVkIGJ5IE1peGluIChzdXBlcmNsYXNzKVxuICAgIGRlc3Ryb3k6IE1lc3NlbmdlciRkZXN0cm95LFxuICAgIG9uOiBNZXNzZW5nZXIkb24sXG4gICAgb25jZTogTWVzc2VuZ2VyJG9uY2UsXG4gICAgb25jZVN5bmM6IE1lc3NlbmdlciRvbmNlU3luYyxcbiAgICBvblN5bmM6IE1lc3NlbmdlciRvblN5bmMsXG4gICAgb25Bc3luYzogTWVzc2VuZ2VyJG9uQXN5bmMsXG4gICAgb25NZXNzYWdlOiBNZXNzZW5nZXIkb24sIC8vIGRlcHJlY2F0ZWRcbiAgICBvZmY6IE1lc3NlbmdlciRvZmYsXG4gICAgb2ZmTWVzc2FnZTogTWVzc2VuZ2VyJG9mZiwgLy8gZGVwcmVjYXRlZFxuICAgIG9uTWVzc2FnZXM6IG9uTWVzc2FnZXMsXG4gICAgb2ZmTWVzc2FnZXM6IG9mZk1lc3NhZ2VzLFxuICAgIG9mZkFsbDogTWVzc2VuZ2VyJG9mZkFsbCxcbiAgICBwb3N0TWVzc2FnZTogcG9zdE1lc3NhZ2UsXG4gICAgcG9zdE1lc3NhZ2VTeW5jOiBwb3N0TWVzc2FnZVN5bmMsXG4gICAgZ2V0U3Vic2NyaWJlcnM6IGdldFN1YnNjcmliZXJzLFxuICAgIGdldE1lc3NhZ2VTb3VyY2U6IGdldE1lc3NhZ2VTb3VyY2UsXG4gICAgX2Nob29zZVN1YnNjcmliZXJzSGFzaDogX2Nob29zZVN1YnNjcmliZXJzSGFzaCxcbiAgICBfcmVnaXN0ZXJTdWJzY3JpYmVyOiBfcmVnaXN0ZXJTdWJzY3JpYmVyLFxuICAgIF9yZW1vdmVTdWJzY3JpYmVyOiBfcmVtb3ZlU3Vic2NyaWJlcixcbiAgICBfcmVtb3ZlQWxsU3Vic2NyaWJlcnM6IF9yZW1vdmVBbGxTdWJzY3JpYmVycyxcbiAgICBfY2FsbFBhdHRlcm5TdWJzY3JpYmVyczogX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxTdWJzY3JpYmVyczogX2NhbGxTdWJzY3JpYmVycyxcbiAgICBfY2FsbFN1YnNjcmliZXI6IF9jYWxsU3Vic2NyaWJlcixcbiAgICBfc2V0TWVzc2FnZVNvdXJjZTogX3NldE1lc3NhZ2VTb3VyY2Vcbn0pO1xuXG5cbi8qKlxuICogQSBkZWZhdWx0IG1hcCBvZiBwcm94eSBtZXRob2RzIHVzZWQgYnkgQ29tcG9uZW50RmFjZXQgYW5kIENvbXBvbmVudCBjbGFzc2VzIHRvIHBhc3MgdG8gTWVzc2VuZ2VyIHdoZW4gaXQgaXMgaW5zdGFudGlhdGVkLlxuICogVGhpcyBtYXAgaXMgZm9yIGNvbnZlbmllbmNlIG9ubHksIGl0IGlzIE5PVCB1c2VkIGludGVybmFsbHkgYnkgTWVzc2VuZ2VyLCBhIGhvc3QgY2xhc3Mgc2hvdWxkIHBhc3MgaXQgZm9yIG1ldGhvZHMgdG8gYmUgcHJveGllZCB0aGlzIHdheS5cbiAqL1xuTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzID0ge1xuICAgIG9uOiAnb24nLFxuICAgIG9uU3luYzogJ29uU3luYycsXG4gICAgb25jZTogJ29uY2UnLFxuICAgIG9uY2VTeW5jOiAnb25jZVN5bmMnLFxuICAgIG9mZjogJ29mZicsXG4gICAgb25NZXNzYWdlczogJ29uTWVzc2FnZXMnLFxuICAgIG9mZk1lc3NhZ2VzOiAnb2ZmTWVzc2FnZXMnLFxuICAgIHBvc3RNZXNzYWdlOiAncG9zdE1lc3NhZ2UnLFxuICAgIHBvc3RNZXNzYWdlU3luYzogJ3Bvc3RNZXNzYWdlU3luYycsXG4gICAgZ2V0U3Vic2NyaWJlcnM6ICdnZXRTdWJzY3JpYmVycydcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXI7XG5cblxuTWVzc2VuZ2VyLnN1YnNjcmlwdGlvbnMgPSBbXTtcblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIE1lc3Nlbmdlci4gTWV0aG9kIGlzIGNhbGxlZCBieSBNaXhpbiBjbGFzcyBjb25zdHJ1Y3Rvci5cbiAqIFNlZSBbb25dKCNNZXNzZW5nZXIkb24pIG1ldGhvZCwgW01lc3Nlbmdlcl0oI01lc3NlbmdlcikgY2xhc3MgYWJvdmUgYW5kIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgbWVzc2VuZ2VyIG9uIG9uZSBvZiBpdHMgcHJvcGVydGllcy4gSXQgaXMgdXNlZCB0byBwcm94eSBtZXRob2RzIG9mIG1lc3NlbmdlciBhbmQgYWxzbyBhcyBhIGNvbnRleHQgZm9yIHN1YnNjcmliZXJzIHdoZW4gdGhleSBhcmUgY2FsbGVkIGJ5IHRoZSBNZXNzZW5nZXIuIFNlZSBgb25gIG1ldGhvZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm94eU1ldGhvZHMgT3B0aW9uYWwgbWFwIG9mIG1ldGhvZCBuYW1lczsga2V5IC0gcHJveHkgbWV0aG9kIG5hbWUsIHZhbHVlIC0gbWVzc2VuZ2VyJ3MgbWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge01lc3NhZ2VTb3VyY2V9IG1lc3NhZ2VTb3VyY2UgT3B0aW9uYWwgbWVzc2FnZVNvdXJjZSBsaW5rZWQgdG8gdGhlIG1lc3Nlbmdlci4gSWYgbWVzc2FnZVNvdXJjZSBpcyBzdXBwbGllZCwgdGhlIHJlZmVyZW5jZSB0byB0aGUgbWVzc2VuZ2VyIHdpbGwgc3RvcmVkIG9uIGl0cyAnbWVzc2VuZ2VyJyBwcm9wZXJ0eVxuICovXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2FnZVNvdXJjZSkge1xuICAgIC8vIGhvc3RPYmplY3QgYW5kIHByb3h5TWV0aG9kcyBhcmUgdXNlZCBpbiBNaXhpbiBhbmQgY2hlY2tlZCB0aGVyZVxuICAgIGlmIChtZXNzYWdlU291cmNlKVxuICAgICAgICB0aGlzLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgX2luaXRpYWxpemVTdWJzY3JpYmVycy5jYWxsKHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplU3Vic2NyaWJlcnMoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX21lc3NhZ2VTdWJzY3JpYmVyczoge30sXG4gICAgICAgIF9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzOiB7fSxcbiAgICB9LCBfLkNPTkYpO1xufVxuXG5cbi8qKlxuICogRGVzdHJveXMgbWVzc2VuZ2VyLiBNYXliZSBuZWVkcyB0byB1bnN1YnNjcmliZSBhbGwgc3Vic2NyaWJlcnNcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5vZmZBbGwoKTtcbiAgICB2YXIgbWVzc2FnZVNvdXJjZSA9IHRoaXMuZ2V0TWVzc2FnZVNvdXJjZSgpO1xuICAgIGlmIChtZXNzYWdlU291cmNlKVxuICAgICAgICBtZXNzYWdlU291cmNlLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZWdpc3RlcnMgYSBzdWJzY3JpYmVyIGZ1bmN0aW9uIGZvciBhIGNlcnRhaW4gbWVzc2FnZShzKS5cbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGlmIHRoZSBzdWJzY3JpcHRpb24gd2FzIHN1Y2Nlc3NmdWwuIEl0IGNhbiBiZSB1bnN1Y2Nlc3NmdWwgaWYgdGhlIHBhc3NlZCBzdWJzY3JpYmVyIGhhcyBhbHJlYWR5IGJlZW4gc3Vic2NyaWJlZCB0byB0aGlzIG1lc3NhZ2UgdHlwZSAtIGRvdWJsZSBzdWJzY3JpcHRpb24gbmV2ZXIgaGFwcGVucyBhbmQgaXQgaXMgc2FmZSB0byBzdWJzY3JpYmUgYWdhaW4gLSBubyBlcnJvciBvciB3YXJuaW5nIGlzIHRocm93biBvciBsb2dnZWQuXG4gKiBTdWJzY3JpYmVyIGlzIHBhc3NlZCB0d28gcGFyYW1ldGVyczogYG1lc3NhZ2VgIChzdHJpbmcpIGFuZCBgZGF0YWAgKG9iamVjdCkuIERhdGEgb2JqZWN0IGlzIHN1cHBsaWVkIHdoZW4gbWVzc2FnZSBpcyBkaXNwYXRjaGVkLCBNZXNzZW5nZXIgaXRzZWxmIGFkZHMgbm90aGluZyB0byBpdC4gRm9yIGV4YW1wbGUsIFtldmVudHMgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzLmh0bWwpIHNlbmRzIGFjdHVhbCBET00gZXZlbnQgd2hlbiBpdCBwb3N0cyBtZXNzYWdlLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIC8vIHN1YnNjcmliZXMgb25Nb3VzZVVwRG93biB0byB0d28gRE9NIGV2ZW50cyBvbiBjb21wb25lbnQgdmlhIGV2ZW50cyBmYWNldC5cbiAqIG15Q29tcC5ldmVudHMub24oJ21vdXNlZG93biBtb3VzZXVwJywgb25Nb3VzZVVwRG93bik7XG4gKiBmdW5jdGlvbiBvbk1vdXNlVXBEb3duKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAqICAgICAvLyAuLi5cbiAqIH1cbiAqXG4gKiBteUNvbXAuZGF0YS5vbigvLisvLCBmdW5jdGlvbihtc2csIGRhdGEpIHtcbiAqICAgICBsb2dnZXIuZGVidWcobXNnLCBkYXRhKTtcbiAqIH0pOyAvLyBzdWJzY3JpYmVzIGFub255bW91cyBmdW5jdGlvbiB0byBhbGwgbm9uLWVtcHR5IG1lc3NhZ2VzIG9uIGRhdGEgZmFjZXRcbiAqIC8vIGl0IHdpbGwgbm90IGJlIHBvc3NpYmxlIHRvIHVuc3Vic2NyaWJlIGFub255bW91cyBzdWJzY3JpYmVyIHNlcGFyYXRlbHksXG4gKiAvLyBidXQgbXlDb21wLmRhdGEub2ZmKC8uKy8pIHdpbGwgdW5zdWJzY3JpYmUgaXRcbiAqIGBgYFxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyBhZGRlZCwgc28gaXQgY2FuIHN1YnNjcmliZSB0byB0aGUgc291cmNlLlxuICogW0NvbXBvbmVudHNdKC4uL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSBhbmQgW2ZhY2V0c10oLi4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIGNoYW5nZSB0aGlzIG1ldGhvZCBuYW1lIHRvIGBvbmAgd2hlbiB0aGV5IHByb3h5IGl0LlxuICogU2VlIFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheVtTdHJpbmddfFJlZ0V4cH0gbWVzc2FnZXMgTWVzc2FnZSB0eXBlcyB0aGF0IHNob3VsZCBlbnZva2UgdGhlIHN1YnNjcmliZXIuXG4gKiAgSWYgc3RyaW5nIGlzIHBhc3NlZCwgaXQgY2FuIGJlIGEgc2lnbGUgbWVzc2FnZSBvciBtdWx0aXBsZSBtZXNzYWdlIHR5cGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgY29tbWFzLlxuICogIElmIGFuIGFycmF5IG9mIHN0cmluZ3MgaXMgcGFzc2VkLCBlYWNoIHN0cmluZyBpcyBhIG1lc3NhZ2UgdHlwZSB0byBzdWJzY3JpYmUgZm9yLlxuICogIElmIGEgUmVnRXhwIGlzIHBhc3NlZCwgdGhlIHN1YnNjcmliZXIgd2lsbCBiZSBlbnZva2VkIHdoZW4gdGhlIG1lc3NhZ2UgZGlzcGF0Y2hlZCBvbiB0aGUgbWVzc2VuZ2VyIG1hdGNoZXMgdGhlIHBhdHRlcm4gKG9yIElTIHRoZSBSZWdFeHAgd2l0aCBpZGVudGljYWwgcGF0dGVybikuXG4gKiAgUGF0dGVybiBzdWJzY3JpYmVyIGRvZXMgTk9UIGNhdXNlIGFueSBzdWJzY3JpcHRpb24gdG8gTWVzc2FnZVNvdXJjZSwgaXQgb25seSBjYXB0dXJlcyBtZXNzYWdlcyB0aGF0IGFyZSBhbHJlYWR5IHN1YnNjcmliZWQgdG8gd2l0aCBwcmVjaXNlIG1lc3NhZ2UgdHlwZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBNZXNzYWdlIHN1YnNjcmliZXIgLSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyBkaXNwYXRjaGVkIG9uIHRoZSBtZXNzZW5nZXIgKHVzdWFsbHkgdmlhIHByb3hpZWQgcG9zdE1lc3NhZ2UgbWV0aG9kIG9mIGhvc3Qgb2JqZWN0KS5cbiAqICBJZiBob3N0T2JqZWN0IHdhcyBzdXBwbGllZCB0byBNZXNzZW5nZXIgY29uc3RydWN0b3IsIGhvc3RPYmplY3Qgd2lsbCBiZSB0aGUgY29udGV4dCAodGhlIHZhbHVlIG9mIHRoaXMpIGZvciB0aGUgc3Vic2NyaWJlciBlbnZvY2F0aW9uLlxuICogIFN1YnNjcmliZXIgY2FuIGFsc28gYmUgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBgc3Vic2NyaWJlcmAgKGZ1bmN0aW9uKSBhbmQgYGNvbnRleHRgIChcInRoaXNcIiB2YWx1ZSB3aGVuIHN1YnNjcmliZXIgaXMgY2FsbGVkKVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG5mdW5jdGlvbiBNZXNzZW5nZXIkb25jZShtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBkaXNwYXRjaFRpbWVzOiAxIH0pO1xufVxuXG5mdW5jdGlvbiBNZXNzZW5nZXIkb25jZVN5bmMobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgZGlzcGF0Y2hUaW1lczogMSwgc3luYzogdHJ1ZSB9KTtcbn1cblxuXG5mdW5jdGlvbiBNZXNzZW5nZXIkb25TeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IHN5bmM6IHRydWUgfSk7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uQXN5bmMobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgc3luYzogZmFsc2UgfSk7XG59XG5cblxuZnVuY3Rpb24gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zKG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCBvcHRpb25zKSB7XG4gICAgY2hlY2sobWVzc2FnZXMsIE1hdGNoLk9uZU9mKFN0cmluZywgW1N0cmluZ10sIFJlZ0V4cCkpO1xuICAgIGNoZWNrKHN1YnNjcmliZXIsIE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCB7XG4gICAgICAgIHN1YnNjcmliZXI6IEZ1bmN0aW9uLFxuICAgICAgICBjb250ZXh0OiBNYXRjaC5BbnksXG4gICAgICAgIG9wdGlvbnM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgfSkpO1xuXG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc3Vic2NyaWJlciA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXI6IHN1YnNjcmliZXIsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLl9ob3N0T2JqZWN0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZXIub3B0aW9ucyA9IHN1YnNjcmliZXIub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgXy5leHRlbmQoc3Vic2NyaWJlci5vcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbi5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG5mdW5jdGlvbiBfTWVzc2VuZ2VyX29uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShzdWJzY3JpYmVyLCAnX19tZXNzYWdlcycsIG1lc3NhZ2VzKTtcbiAgICByZXR1cm4gX2VhY2hNZXNzYWdlLmNhbGwodGhpcywgJ19yZWdpc3RlclN1YnNjcmliZXInLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gX2VhY2hNZXNzYWdlKG1ldGhvZE5hbWUsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlcyA9PSAnc3RyaW5nJylcbiAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5zcGxpdChtZXNzYWdlc1NwbGl0UmVnRXhwKTtcblxuICAgIHZhciBzdWJzY3JpYmVyc0hhc2ggPSB0aGlzLl9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZXMpO1xuXG4gICAgaWYgKG1lc3NhZ2VzIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXShzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcblxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbkNoYW5nZWQgPSB0aGlzW21ldGhvZE5hbWVdKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSwgc3Vic2NyaWJlcik7XG4gICAgICAgICAgICBjaGFuZ2VkID0gY2hhbmdlZCB8fCBzdWJzY3JpcHRpb25DaGFuZ2VkO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJdCBpcyBjYWxsZWQgYnkgW29uXSgjTWVzc2VuZ2VyJG9uKSB0byByZWdpc3RlciBzdWJzY3JpYmVyIGZvciBvbmUgbWVzc2FnZSB0eXBlLlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzdWJzY3JpYmVyIGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlIG9mIG1lc3NhZ2UuXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIGFkZGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3Vic2NyaWJlcnNIYXNoIFRoZSBtYXAgb2Ygc3Vic2NyaWJlcnMgZGV0ZXJtaW5lZCBieSBbb25dKCNNZXNzZW5nZXIkb24pIGJhc2VkIG9uIE1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBTdWJzY3JpYmVyIGZ1bmN0aW9uIHRvIGJlIGFkZGVkIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHN1YnNjcmliZXJgIChmdW5jdGlvbikgYW5kIGBjb250ZXh0YCAodmFsdWUgb2YgXCJ0aGlzXCIgd2hlbiBzdWJzY3JpYmVyIGlzIGNhbGxlZClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIF9yZWdpc3RlclN1YnNjcmliZXIoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlLCBzdWJzY3JpYmVyKSB7XG4gICAgaWYgKCEgKHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXSAmJiBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0ubGVuZ3RoKSkge1xuICAgICAgICBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0gPSBbXTtcbiAgICAgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgICAgICBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0ucGF0dGVybiA9IG1lc3NhZ2U7XG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlU291cmNlKVxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNvdXJjZS5vblN1YnNjcmliZXJBZGRlZChtZXNzYWdlKTtcbiAgICAgICAgdmFyIG5vU3Vic2NyaWJlcnMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBtc2dTdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXTtcbiAgICB2YXIgbm90WWV0UmVnaXN0ZXJlZCA9IG5vU3Vic2NyaWJlcnMgfHwgX2luZGV4T2ZTdWJzY3JpYmVyLmNhbGwodGhpcywgbXNnU3Vic2NyaWJlcnMsIHN1YnNjcmliZXIpID09IC0xO1xuXG4gICAgaWYgKG5vdFlldFJlZ2lzdGVyZWQpXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZDtcbn1cblxuXG4vKipcbiAqIEZpbmRzIHN1YnNjcmliZXIgaW5kZXggaW4gdGhlIGxpc3RcbiAqXG4gKiBAcGFyYW0ge0FycmF5W0Z1bmN0aW9ufE9iamVjdF19IGxpc3QgbGlzdCBvZiBzdWJzY3JpYmVyc1xuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgc3Vic2NyaWJlciBmdW5jdGlvbiBvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBzdWJzY3JpYmVyYCAoZnVuY3Rpb24pIGFuZCBgY29udGV4dGAgKFwidGhpc1wiIG9iamVjdClcbiAqL1xuZnVuY3Rpb24gX2luZGV4T2ZTdWJzY3JpYmVyKGxpc3QsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIF8uZmluZEluZGV4KGxpc3QsIGZ1bmN0aW9uKHN1YnNjcil7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZXIgPT0gc3Vic2NyLnN1YnNjcmliZXJcbiAgICAgICAgICAgICAgICAmJiBzdWJzY3JpYmVyLmNvbnRleHQgPT0gc3Vic2NyLmNvbnRleHRcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTdWJzY3JpYmVzIHRvIG11bHRpcGxlIG1lc3NhZ2VzIHBhc3NlZCBhcyBtYXAgdG9nZXRoZXIgd2l0aCBzdWJzY3JpYmVycy5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiBteUNvbXAuZXZlbnRzLm9uTWVzc2FnZXMoe1xuICogICAgICdtb3VzZWRvd24nOiBvbk1vdXNlRG93bixcbiAqICAgICAnbW91c2V1cCc6IG9uTW91c2VVcFxuICogfSk7XG4gKiBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudFR5cGUsIGV2ZW50KSB7fVxuICogZnVuY3Rpb24gb25Nb3VzZVVwKGV2ZW50VHlwZSwgZXZlbnQpIHt9XG4gKiBgYGBcbiAqIFJldHVybnMgbWFwIHdpdGggdGhlIHNhbWUga2V5cyAobWVzc2FnZSB0eXBlcykgYW5kIGJvb2xlYW4gdmFsdWVzIGluZGljYXRpbmcgd2hldGhlciBwYXJ0aWN1bGFyIHN1YnNjcmliZXIgd2FzIGFkZGVkLlxuICogSXQgaXMgTk9UIHBvc3NpYmxlIHRvIGFkZCBwYXR0ZXJuIHN1YnNjcmliZXIgdXNpbmcgdGhpcyBtZXRob2QsIGFzIGFsdGhvdWdoIHlvdSBjYW4gdXNlIFJlZ0V4cCBhcyB0aGUga2V5LCBKYXZhU2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IGl0IHRvIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdFtGdW5jdGlvbl19IG1lc3NhZ2VTdWJzY3JpYmVycyBNYXAgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSBhZGRlZFxuICogQHJldHVybiB7T2JqZWN0W0Jvb2xlYW5dfVxuICovXG5mdW5jdGlvbiBvbk1lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIGNoZWNrKG1lc3NhZ2VTdWJzY3JpYmVycywgTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKSk7XG5cbiAgICB2YXIgbm90WWV0UmVnaXN0ZXJlZE1hcCA9IF8ubWFwS2V5cyhtZXNzYWdlU3Vic2NyaWJlcnMsIGZ1bmN0aW9uKHN1YnNjcmliZXIsIG1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBub3RZZXRSZWdpc3RlcmVkTWFwO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgYSBzdWJzY3JpYmVyIGZvciBtZXNzYWdlKHMpLiBSZW1vdmVzIGFsbCBzdWJzY3JpYmVycyBmb3IgdGhlIG1lc3NhZ2UgaWYgc3Vic2NyaWJlciBpc24ndCBwYXNzZWQuXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3Vic2NyaWJlciB3YXMgcmVnaXN0ZXJlZC4gTm8gZXJyb3Igb3Igd2FybmluZyBpcyB0aHJvd24gb3IgbG9nZ2VkIGlmIHlvdSByZW1vdmUgc3Vic2NyaWJlciB0aGF0IHdhcyBub3QgcmVnaXN0ZXJlZC5cbiAqIFtDb21wb25lbnRzXSguLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgYW5kIFtmYWNldHNdKC4uL2NvbXBvbmVudHMvY19mYWNldC5qcy5odG1sKSBjaGFuZ2UgdGhpcyBtZXRob2QgbmFtZSB0byBgb2ZmYCB3aGVuIHRoZXkgcHJveHkgaXQuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogLy8gdW5zdWJzY3JpYmVzIG9uTW91c2VVcERvd24gZnJvbSB0d28gRE9NIGV2ZW50cy5cbiAqIG15Q29tcC5ldmVudHMub2ZmKCdtb3VzZWRvd24gbW91c2V1cCcsIG9uTW91c2VVcERvd24pO1xuICogYGBgXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgbGFzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgcmVtb3ZlZCBhbmQgdGhlcmUgaXMgbm8gbW9yZSBzdWJzY3JpYmVycyBmb3IgdGhpcyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5W1N0cmluZ118UmVnRXhwfSBtZXNzYWdlcyBNZXNzYWdlIHR5cGVzIHRoYXQgYSBzdWJzY3JpYmVyIHNob3VsZCBiZSByZW1vdmVkIGZvci5cbiAqICBJZiBzdHJpbmcgaXMgcGFzc2VkLCBpdCBjYW4gYmUgYSBzaWdsZSBtZXNzYWdlIG9yIG11bHRpcGxlIG1lc3NhZ2UgdHlwZXMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugd2l0aCBvcHRpb25hbCBjb21tYXMuXG4gKiAgSWYgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpcyBwYXNzZWQsIGVhY2ggc3RyaW5nIGlzIGEgbWVzc2FnZSB0eXBlIHRvIHJlbW92ZSBhIHN1YnNjcmliZXIgZm9yLlxuICogIElmIGEgUmVnRXhwIGlzIHBhc3NlZCwgdGhlIHBhdHRlcm4gc3Vic2NyaWJlciB3aWxsIGJlIHJlbW92ZWQuXG4gKiAgUmVnRXhwIHN1YnNjcmliZXIgZG9lcyBOT1QgY2F1c2UgYW55IHN1YnNjcmlwdGlvbiB0byBNZXNzYWdlU291cmNlLCBpdCBvbmx5IGNhcHR1cmVzIG1lc3NhZ2VzIHRoYXQgYXJlIGFscmVhZHkgc3Vic2NyaWJlZCB0byB3aXRoIHByZWNpc2UgbWVzc2FnZSB0eXBlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YnNjcmliZXIgTWVzc2FnZSBzdWJzY3JpYmVyIC0gT3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBzdWJzY3JpYmVycyBmb3IgdGhlIG1lc3NhZ2UocykuIElmIHN1YnNjcmliZXIgaXMgbm90IHN1cHBsaWVkLCBhbGwgc3Vic2NyaWJlcnMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhpcyBtZXNzYWdlKHMpLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJG9mZihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIGNoZWNrKG1lc3NhZ2VzLCBNYXRjaC5PbmVPZihTdHJpbmcsIFtTdHJpbmddLCBSZWdFeHApKTtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwge1xuICAgICAgICBzdWJzY3JpYmVyOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dDogTWF0Y2guQW55LFxuICAgICAgICBvcHRpb25zOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgICAgICAvLyBfX21lc3NhZ2VzOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihTdHJpbmcsIFtTdHJpbmddLCBSZWdFeHApKVxuICAgIH0pKSk7XG5cbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vZmYuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gX01lc3Nlbmdlcl9vZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX2VhY2hNZXNzYWdlLmNhbGwodGhpcywgJ19yZW1vdmVTdWJzY3JpYmVyJywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSXQgaXMgY2FsbGVkIGJ5IFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSB0byByZW1vdmUgc3Vic2NyaWJlciBmb3Igb25lIG1lc3NhZ2UgdHlwZS5cbiAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3Vic2NyaWJlciB3YXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlIG9mIG1lc3NhZ2UuXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgbGFzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgcmVtb3ZlZCBhbmQgdGhlcmUgaXMgbm8gbW9yZSBzdWJzY3JpYmVycyBmb3IgdGhpcyBtZXNzYWdlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3Vic2NyaWJlcnNIYXNoIFRoZSBtYXAgb2Ygc3Vic2NyaWJlcnMgZGV0ZXJtaW5lZCBieSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgYmFzZWQgb24gbWVzc2FnZSB0eXBlLCBjYW4gYmUgYHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNgIG9yIGB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnNgXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBNZXNzYWdlIHR5cGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YnNjcmliZXIgU3Vic2NyaWJlciBmdW5jdGlvbiB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfcmVtb3ZlU3Vic2NyaWJlcihzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG4gICAgaWYgKCEgbXNnU3Vic2NyaWJlcnMgfHwgISBtc2dTdWJzY3JpYmVycy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90aGluZyByZW1vdmVkXG5cbiAgICBpZiAoc3Vic2NyaWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHN1YnNjcmliZXIgPSB7IHN1YnNjcmliZXI6IHN1YnNjcmliZXIsIGNvbnRleHQ6IHRoaXMuX2hvc3RPYmplY3QgfTtcblxuICAgICAgICB2YXIgc3Vic2NyaWJlckluZGV4ID0gX2luZGV4T2ZTdWJzY3JpYmVyLmNhbGwodGhpcywgbXNnU3Vic2NyaWJlcnMsIHN1YnNjcmliZXIpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlckluZGV4ID09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3RoaW5nIHJlbW92ZWRcbiAgICAgICAgbXNnU3Vic2NyaWJlcnMuc3BsaWNlKHN1YnNjcmliZXJJbmRleCwgMSk7XG4gICAgICAgIGlmICghIG1zZ1N1YnNjcmliZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSk7XG5cbiAgICB9IGVsc2VcbiAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU3Vic2NyaWJlcnMoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlKTtcblxuICAgIHJldHVybiB0cnVlOyAvLyBzdWJzY3JpYmVyKHMpIHJlbW92ZWRcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEl0IGlzIGNhbGxlZCBieSBbX3JlbW92ZVN1YnNjcmliZXJdKCNfcmVtb3ZlU3Vic2NyaWJlcikgdG8gcmVtb3ZlIGFsbCBzdWJzY3JpYmVycyBmb3Igb25lIG1lc3NhZ2UgdHlwZS5cbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB0aGF0IGFsbCBtZXNzYWdlIHN1YnNjcmliZXJzIHdlcmUgcmVtb3ZlZCBzbyBpdCBjYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGUgc291cmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3Vic2NyaWJlcnNIYXNoIFRoZSBtYXAgb2Ygc3Vic2NyaWJlcnMgZGV0ZXJtaW5lZCBieSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgYmFzZWQgb24gbWVzc2FnZSB0eXBlLCBjYW4gYmUgYHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNgIG9yIGB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnNgXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBNZXNzYWdlIHR5cGVcbiAqL1xuZnVuY3Rpb24gX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSkge1xuICAgIGRlbGV0ZSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG4gICAgaWYgKHRoaXMuX21lc3NhZ2VTb3VyY2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT0gJ3N0cmluZycpXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTb3VyY2Uub25TdWJzY3JpYmVyUmVtb3ZlZChtZXNzYWdlKTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBVbnN1YnNjcmliZXMgZnJvbSBtdWx0aXBsZSBtZXNzYWdlcyBwYXNzZWQgYXMgbWFwIHRvZ2V0aGVyIHdpdGggc3Vic2NyaWJlcnMuXG4gKiBSZXR1cm5zIG1hcCB3aXRoIHRoZSBzYW1lIGtleXMgKG1lc3NhZ2UgdHlwZXMpIGFuZCBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFydGljdWxhciBzdWJzY3JpYmVyIHdhcyByZW1vdmVkLlxuICogSWYgYSBzdWJzY3JpYmVyIGZvciBvbmUgb2YgdGhlIG1lc3NhZ2VzIGlzIG5vdCBzdXBwbGllZCwgYWxsIHN1YnNjcmliZXJzIGZvciB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIG15Q29tcC5ldmVudHMub2ZmTWVzc2FnZXMoe1xuICogICAgICdtb3VzZWRvd24nOiBvbk1vdXNlRG93bixcbiAqICAgICAnbW91c2V1cCc6IG9uTW91c2VVcCxcbiAqICAgICAnY2xpY2snOiB1bmRlZmluZWQgLy8gYWxsIHN1YnNjcmliZXJzIHRvIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWRcbiAqIH0pO1xuICogYGBgXG4gKiBJdCBpcyBOT1QgcG9zc2libGUgdG8gcmVtb3ZlIHBhdHRlcm4gc3Vic2NyaWJlcihzKSB1c2luZyB0aGlzIG1ldGhvZCwgYXMgYWx0aG91Z2ggeW91IGNhbiB1c2UgUmVnRXhwIGFzIHRoZSBrZXksIEphdmFTY3JpcHQgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgaXQgdG8gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0W0Z1bmN0aW9uXX0gbWVzc2FnZVN1YnNjcmliZXJzIE1hcCBvZiBtZXNzYWdlIHN1YnNjcmliZXJzIHRvIGJlIHJlbW92ZWRcbiAqIEByZXR1cm4ge09iamVjdFtCb29sZWFuXX1cbiAqL1xuZnVuY3Rpb24gb2ZmTWVzc2FnZXMobWVzc2FnZVN1YnNjcmliZXJzKSB7XG4gICAgY2hlY2sobWVzc2FnZVN1YnNjcmliZXJzLCBNYXRjaC5PYmplY3RIYXNoKE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCB7IHN1YnNjcmliZXI6IEZ1bmN0aW9uLCBjb250ZXh0OiBNYXRjaC5BbnkgfSkpKSk7XG5cbiAgICB2YXIgc3Vic2NyaWJlclJlbW92ZWRNYXAgPSBfLm1hcEtleXMobWVzc2FnZVN1YnNjcmliZXJzLCBmdW5jdGlvbihzdWJzY3JpYmVyLCBtZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIHN1YnNjcmliZXJSZW1vdmVkTWFwO1xufVxuXG5cbi8qKlxuICogVW5zdWJzY3JpYmVzIGFsbCBzdWJzY3JpYmVyc1xuICovXG5mdW5jdGlvbiBNZXNzZW5nZXIkb2ZmQWxsKCkge1xuICAgIF9vZmZBbGxTdWJzY3JpYmVycy5jYWxsKHRoaXMsIHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMpO1xuICAgIF9vZmZBbGxTdWJzY3JpYmVycy5jYWxsKHRoaXMsIHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVycyk7XG59XG5cblxuZnVuY3Rpb24gX29mZkFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCkge1xuICAgIF8uZWFjaEtleShzdWJzY3JpYmVyc0hhc2gsIGZ1bmN0aW9uKHN1YnNjcmliZXJzLCBtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuLy8gVE9ETyAtIHNlbmQgZXZlbnQgdG8gbWVzc2FnZVNvdXJjZVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIERpc3BhdGNoZXMgdGhlIG1lc3NhZ2UgY2FsbGluZyBhbGwgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBtZXNzYWdlIGFuZCwgaWYgdGhlIG1lc3NhZ2UgaXMgYSBzdHJpbmcsIGNhbGxpbmcgYWxsIHBhdHRlcm4gc3Vic2NyaWJlcnMgd2hlbiBtZXNzYWdlIG1hdGNoZXMgdGhlIHBhdHRlcm4uXG4gKiBFYWNoIHN1YnNjcmliZXIgaXMgcGFzc2VkIHRoZSBzYW1lIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZWlzIG1ldGhvZC5cbiAqIFRoZSBjb250ZXh0IG9mIHRoZSBzdWJzY3JpYmVyIGVudm9jYXRpb24gaXMgc2V0IHRvIHRoZSBob3N0IG9iamVjdCAoYHRoaXMuX2hvc3RPYmplY3RgKSB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIG1lc3NlbmdlciBjb25zdHJ1Y3Rvci5cbiAqIFN1YnNjcmliZXJzIGFyZSBjYWxsZWQgaW4gdGhlIG5leHQgdGljayAoXCJhc3luY2hyb25vdXNseVwiKSBhcGFydCBmcm9tIHRob3NlIHRoYXQgd2VyZSBzdWJzY3JpYmVkIHdpdGggYG9uU3luY2AgKG9yIHRoYXQgaGF2ZSBgb3B0aW9ucy5zeW5jID09IHRydWVgKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IG1lc3NhZ2UgbWVzc2FnZSB0byBiZSBkaXNwYXRjaGVkXG4gKiAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBzdHJpbmcsIHRoZSBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQgYW5kIGFsc28gcGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBkaXNwYXRjaGVkIG1lc3NhZ2UuXG4gKiAgSWYgdGhlIG1lc3NhZ2UgaXMgUmVnRXhwLCBvbmx5IHRoZSBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGlzIHBhdHRlcm4gd2lsbCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIE1lc3NlbmdlciBkb2VzIG5vdCBtb2RpZnkgdGhpcyBkYXRhIGluIGFueSB3YXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0byBwYXNzIHRvIHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gX3N5bmNocm9ub3VzIGlmIHRydWUgcGFzc2VkLCBzdWJzY3JpYmVycyB3aWxsIGJlIGVudm9rZWQgc3luY2hyb25vdXNseSBhcGFydCBmcm9tIHRob3NlIHRoYXQgaGF2ZSBgb3B0aW9ucy5zeW5jID09IGZhbHNlYC4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSB1c2VkLCBpbnN0ZWFkIHBvc3RNZXNzYWdlU3luYyBzaG91bGQgYmUgdXNlZC5cbiAqL1xuZnVuY3Rpb24gcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIF9zeW5jaHJvbm91cykge1xuICAgIGNoZWNrKG1lc3NhZ2UsIE1hdGNoLk9uZU9mKFN0cmluZywgUmVnRXhwKSk7XG4gICAgY2hlY2soY2FsbGJhY2ssIE1hdGNoLk9wdGlvbmFsKEZ1bmN0aW9uKSk7XG5cbiAgICB2YXIgc3Vic2NyaWJlcnNIYXNoID0gdGhpcy5fY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2UpO1xuICAgIHZhciBtc2dTdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzSGFzaFttZXNzYWdlXTtcblxuICAgIHRoaXMuX2NhbGxTdWJzY3JpYmVycyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgbXNnU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cyk7XG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT0gJ3N0cmluZycpXG4gICAgICAgIHRoaXMuX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpO1xufVxuXG5cbi8qKlxuICogU2FtZSBhcyBwb3N0TWVzc2FnZSBhcGFydCBmcm9tIGVudm9raW5nIHN1YnNjcmliZXJzIHN5bmNocm9ub3VzbHksIGFwYXJ0IGZyb20gdGhvc2Ugc3Vic2NyaWJlZCB3aXRoIGBvbkFzeW5jYCAob3Igd2l0aCBgb3B0aW9ucy5zeW5jID09IGZhbHNlYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlXG4gKiBAcGFyYW0ge0FueX0gZGF0YVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gcG9zdE1lc3NhZ2VTeW5jKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgdHJ1ZSk7XG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBFbnZva2VzIHBhdHRlcm4gc3Vic2NyaWJlcnMgd2l0aCB0aGUgcGF0dGVybiB0aGF0IG1hdGNoZXMgdGhlIG1lc3NhZ2UuXG4gKiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBieSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSkgLSBzZWUgbW9yZSBpbmZvcm1hdGlvbiB0aGVyZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgbWVzc2FnZSB0byBiZSBkaXNwYXRjaGVkLiBQYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcGF0dGVybiB0aGF0IG1hdGNoZXMgdGhlIGRpc3BhdGNoZWQgbWVzc2FnZSB3aWxsIGJlIGNhbGxlZC5cbiAqIEBwYXJhbSB7QW55fSBkYXRhIGRhdGEgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc3Vic2NyaWJlciBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4gTWVzc2VuZ2VyIGRvZXMgbm90IG1vZGlmeSB0aGlzIGRhdGEgaW4gYW55IHdheS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHBhc3MgdG8gc3Vic2NyaWJlclxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBjYWxsZWRNc2dTdWJzY3JpYmVycyBhcnJheSBvZiBzdWJzY3JpYmVycyBhbHJlYWR5IGNhbGxlZCwgdGhleSB3b24ndCBiZSBjYWxsZWQgYWdhaW4gaWYgdGhleSBhcmUgYW1vbmcgcGF0dGVybiBzdWJzY3JpYmVycy5cbiAqL1xuZnVuY3Rpb24gX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIGNhbGxlZE1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpIHtcbiAgICBfLmVhY2hLZXkodGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVycyxcbiAgICAgICAgZnVuY3Rpb24ocGF0dGVyblN1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5TdWJzY3JpYmVycy5wYXR0ZXJuO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4udGVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsZWRNc2dTdWJzY3JpYmVycykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGF0dGVyblN1YnNjcmliZXJzID0gcGF0dGVyblN1YnNjcmliZXJzLmZpbHRlcihmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBfaW5kZXhPZlN1YnNjcmliZXIuY2FsbCh0aGlzLCBjYWxsZWRNc2dTdWJzY3JpYmVycywgc3Vic2NyaWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPT0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIHBhdHRlcm5TdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBFbnZva2VzIHN1YnNjcmliZXJzIGZyb20gdGhlIHBhc3NlZCBsaXN0LlxuICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgYnkgW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpIGFuZCBbX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnNdKCNfY2FsbFBhdHRlcm5TdWJzY3JpYmVycykuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZCwgcGFzc2VkIHRvIHN1YnNjcmliZXJzIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIE1lc3NlbmdlciBkb2VzIG5vdCBtb2RpZnkgdGhpcyBkYXRhIGluIGFueSB3YXkuXG4gKiBAcGFyYW0ge0FycmF5W0Z1bmN0aW9ufE9iamVjdF19IG1zZ1N1YnNjcmliZXJzIHRoZSBhcnJheSBvZiBtZXNzYWdlIHN1YnNjcmliZXJzIHRvIGJlIGNhbGxlZC4gRWFjaCBzdWJzY3JpYmVyIGlzIGNhbGxlZCB3aXRoIHRoZSBob3N0IG9iamVjdCAoc2VlIE1lc3NlbmdlciBjb25zdHJ1Y3RvcikgYXMgdGhlIGNvbnRleHQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0byBwYXNzIHRvIHN1YnNjcmliZXJcbiAqL1xuZnVuY3Rpb24gX2NhbGxTdWJzY3JpYmVycyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgbXNnU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cykge1xuICAgIGlmIChtc2dTdWJzY3JpYmVycyAmJiBtc2dTdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgLy8gY2xvbmluZyBpcyBuZWNlc3NhcnkgYXMgc29tZSBvZiB0aGUgc3Vic2NyaWJlcnNcbiAgICAgICAgLy8gY2FuIGJlIHVuc3Vic2NyaWJlZCBkdXJpbmcgdGhlIGRpc3BhdGNoXG4gICAgICAgIC8vIHNvIHRoaXMgYXJyYXkgd291bGQgY2hhbmdlIGluIHRoZSBwcm9jZXNzXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzID0gbXNnU3Vic2NyaWJlcnMuc2xpY2UoKTtcblxuICAgICAgICBtc2dTdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBfc3luY2hyb25vdXMpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2NhbGxTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBfc3luY2hyb25vdXMpIHtcbiAgICB2YXIgc3luY1N1YnNjcmliZXIgPSBzdWJzY3JpYmVyLm9wdGlvbnMgJiYgc3Vic2NyaWJlci5vcHRpb25zLnN5bmNcbiAgICAgICAgLCBzeW5jaHJvID0gKF9zeW5jaHJvbm91cyAmJiBzeW5jU3Vic2NyaWJlciAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICB8fCBzeW5jU3Vic2NyaWJlcjtcblxuICAgIHZhciBkaXNwYXRjaFRpbWVzID0gc3Vic2NyaWJlci5vcHRpb25zICYmIHN1YnNjcmliZXIub3B0aW9ucy5kaXNwYXRjaFRpbWVzO1xuICAgIGlmIChkaXNwYXRjaFRpbWVzKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaFRpbWVzIDw9IDEpIHtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlcyA9IHN1YnNjcmliZXIuX19tZXNzYWdlcztcbiAgICAgICAgICAgIHRoaXMub2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXNwYXRjaFRpbWVzID4gMSlcbiAgICAgICAgICAgIHN1YnNjcmliZXIub3B0aW9ucy5kaXNwYXRjaFRpbWVzLS07XG4gICAgfVxuXG4gICAgaWYgKHN5bmNocm8pXG4gICAgICAgIHN1YnNjcmliZXIuc3Vic2NyaWJlci5jYWxsKHN1YnNjcmliZXIuY29udGV4dCwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spO1xuICAgIGVsc2VcbiAgICAgICAgXy5kZWZlck1ldGhvZChzdWJzY3JpYmVyLnN1YnNjcmliZXIsICdjYWxsJywgc3Vic2NyaWJlci5jb250ZXh0LCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjayk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3Vic2NyaWJlcnMgdGhhdCB3b3VsZCBiZSBjYWxsZWQgaWYgdGhlIG1lc3NhZ2Ugd2VyZSBkaXNwYXRjaGVkLlxuICogSWYgYGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMgPT09IGZhbHNlYCwgcGF0dGVybiBzdWJzY3JpYmVycyB3aXRoIG1hdGNoaW5nIHBhdHRlcnMgd2lsbCBub3QgYmUgaW5jbHVkZWQgKGJ5IGRlZmF1bHQgdGhleSBhcmUgaW5jbHVkZWQpLlxuICogSWYgdGhlcmUgYXJlIG5vIHN1YnNjcmliZXJzIHRvIHRoZSBtZXNzYWdlLCBgdW5kZWZpbmVkYCB3aWxsIGJlIHJldHVybmVkLCBub3QgYW4gZW1wdHkgYXJyYXksIHNvIGl0IGlzIHNhZmUgdG8gdXNlIHRoZSByZXN1bHQgaW4gYm9vbGVhbiB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IG1lc3NhZ2UgTWVzc2FnZSB0byBnZXQgc3Vic2NyaWJlcnMgZm9yLlxuICogIElmIHRoZSBtZXNzYWdlIGlzIFJlZ0V4cCwgb25seSBwYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBleGFjdGx5IHRoaXMgcGF0dGVybiB3aWxsIGJlIHJldHVybmVkLlxuICogIElmIHRoZSBtZXNzYWdlIGlzIFN0cmluZywgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdHJpbmcgbWVzc2FnZXMgYW5kIHBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIG1hdGNoaW5nIHBhdHRlcm4gd2lsbCBiZSByZXR1cm5lZCAodW5sZXNzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZhbHNlKS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycyBPcHRpb25hbCBmYWxzZSB0byBwcmV2ZW50IGluY2x1c2lvbiBvZiBwYXR0ZXIgc3Vic2NyaWJlcnMsIGJ5IGRlZmF1bHQgdGhleSBhcmUgaW5jbHVkZWQuXG4gKiBAcmV0dXJuIHtBcnJheXx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldFN1YnNjcmliZXJzKG1lc3NhZ2UsIGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMpIHtcbiAgICBjaGVjayhtZXNzYWdlLCBNYXRjaC5PbmVPZihTdHJpbmcsIFJlZ0V4cCkpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJzSGFzaCA9IHRoaXMuX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKTtcbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFtdLmNvbmNhdChzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXTtcblxuICAgIC8vIHBhdHRlcm4gc3Vic2NyaWJlcnMgYXJlIGluY3VkZWQgYnkgZGVmYXVsdFxuICAgIGlmIChpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzICE9PSBmYWxzZSAmJiB0eXBlb2YgbWVzc2FnZSA9PSAnc3RyaW5nJykge1xuICAgICAgICBfLmVhY2hLZXkodGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVycyxcbiAgICAgICAgICAgIGZ1bmN0aW9uKHBhdHRlcm5TdWJzY3JpYmVycykge1xuICAgICAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gcGF0dGVyblN1YnNjcmliZXJzLnBhdHRlcm47XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5TdWJzY3JpYmVycyAmJiBwYXR0ZXJuU3Vic2NyaWJlcnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXR0ZXJuLnRlc3QobWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgIF8uYXBwZW5kQXJyYXkobXNnU3Vic2NyaWJlcnMsIHBhdHRlcm5TdWJzY3JpYmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gc3Vic2NyaWJlcnNcbiAgICByZXR1cm4gbXNnU3Vic2NyaWJlcnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBtc2dTdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbWFwIG9mIHN1YnNjcmliZXJzIGZvciBhIGdpdmVuIG1lc3NhZ2UgdHlwZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIE1lc3NhZ2UgdG8gY2hvb3NlIHRoZSBtYXAgb2Ygc3Vic2NyaWJlcnMgZm9yXG4gKiBAcmV0dXJuIHtPYmplY3RbRnVuY3Rpb25dfVxuICovXG5mdW5jdGlvbiBfY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgICAgID8gdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgIDogdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBmb3IgdGhlIG1lc3NlbmdlciBhbHNvIHNldHRpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGUgbWVzc2VuZ2VyIGluIHRoZSBNZXNzYWdlU291cmNlLlxuICogTWVzc2FnZVNvdXJjZSBjYW4gYmUgcGFzc2VkIHRvIG1lc3NhZ2UgY29uc3RydWN0b3I7IHRoaXMgbWV0aG9kIGFsbG93cyB0byBzZXQgaXQgYXQgYSBsYXRlciB0aW1lLiBGb3IgZXhhbXBsZSwgdGhlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgdXNlIHRoaXMgbWV0aG9kIHRvIHNldCBkaWZmZXJlbnQgTWVzc2FnZVNvdXJjZSdlcyBpbiB0aGUgbWVzc2VuZ2VyIHRoYXQgaXMgY3JlYXRlZCBieSBDb21wb25lbnRGYWNldC5cbiAqIEN1cnJlbnRseSB0aGUgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIHN1Y2ggd2F5IHRoYXQgaXQgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UgLSBNZXNzYWdlU291cmNlIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge01lc3NhZ2VTb3VyY2V9IG1lc3NhZ2VTb3VyY2UgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVNvdXJjZSBjbGFzcyB0byBhdHRhY2ggdG8gdGhpcyBtZXNzZW5nZXIgKGFuZCB0byBoYXZlIHRoaXMgbWVzc2VuZ2VyIGF0dGFjaGVkIHRvIGl0IHRvbylcbiAqL1xuZnVuY3Rpb24gX3NldE1lc3NhZ2VTb3VyY2UobWVzc2FnZVNvdXJjZSkge1xuICAgIGNoZWNrKG1lc3NhZ2VTb3VyY2UsIE1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbiAgICBtZXNzYWdlU291cmNlLm1lc3NlbmdlciA9IHRoaXM7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIG1lc3NlbmdlciBNZXNzYWdlU291cmNlXG4gKlxuICogQHJldHVybiB7TWVzc2FnZVNvdXJjZX1cbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVNvdXJjZVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyQVBJO1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5NZXNzZW5nZXJBUElgXG4gKiBCYXNlIGNsYXNzLCBzdWJjbGFzc2VzIG9mIHdoaWNoIGNhbiBzdXBwbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IG9mIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGJ5IGltcGxlbWVudGluZyB0aHJlZSBtZXRob2RzOlxuICpcbiAqIC0gYHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZWAgdG8gdHJhbnNsYXRlIHNvdXJjZSBtZXNzYWdlcyAocmVjaWV2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2UgdmlhIGBNZXNzYWdlU091cmNlYCkgdG8gaW50ZXJuYWwgbWVzc2FnZXMgKHRoYXQgYXJlIGRpc3BhdGNoZWQgb24gTWVzc2VuZ2VyKSwgYWxsb3dpbmcgdG8gbWFrZSBpbnRlcm5hbCBtZXNzYWdlcyBtb3JlIGRldGFpbGVkIHRoYW4gc291cmNlIG1lc3NhZ2VzLiBGb3IgZXhhbXBsZSwgW0RhdGEgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRGF0YS5qcy5odG1sKSB1c2VzIFtEYXRhTXNnQVBJXSguLi9jb21wb25lbnRzL21zZ19hcGkvZGF0YS5qcy5odG1sKSB0byBkZWZpbmUgc2V2ZXJhbCBpbnRlcm5hbCBtZXNzYWdlcyByZWxhdGVkIHRvIHRoZSBjaGFuZ2Ugb2Ygc3RhdGUgaW4gY29udGVudGVkaXRhYmxlIERPTSBlbGVtZW50LlxuICogLSBgY3JlYXRlSW50ZXJuYWxEYXRhYCB0byBtb2RpZnkgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gc291cmNlIHRvIHNvbWUgbW9yZSBtZWFuaW5nZnVsIG9yIG1vcmUgZGV0YWlsZWQgbWVzc2FnZSBkYXRhIHRoYXQgd2lsbCBiZSBkaXNwYXRjaGVkIG9uIE1lc3Nlbmdlci4gRm9yIGV4YW1wbGUsIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgdXNlcyBbRGF0YU1zZ0FQSV0oLi4vY29tcG9uZW50cy9tc2dfYXBpL2RhdGEuanMuaHRtbCkgKHN1YmNsYXNzIG9mIE1lc3NlbmdlckFQSSkgdG8gdHJhbnNsYXRlIERPTSBtZXNzYWdlcyB0byBkYXRhIGNoYW5nZSBtZXNzYWdlcy5cbiAqIC0gYGZpbHRlclNvdXJjZU1lc3NhZ2VgIHRvIGVuYWJsZS9kaXNhYmxlIG1lc3NhZ2UgZGlzcGF0Y2ggYmFzZWQgb24gc29tZSBjb25kaXRpb25zIGluIGRhdGEuXG4gKlxuICogSWYgYE1lc3NhZ2VTb3VyY2VgIGNvbnN0cnVjdG9yIGlzIG5vdCBwYXNzZWQgYW4gaW5zdGFuY2Ugb2Ygc29tZSBzdWJjbGFzcyBvZiBgTWVzc2VuZ2VyQVBJYCwgaXQgYXV0b21hdGljYWxseSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIE1lc3NlbmdlckFQSSB0aGF0IGRlZmluZXMgYWxsIDMgb2YgdGhvc2UgbWV0aG9kcyBpbiBhIHRyaXZpYWwgd2F5LiBTZWUgdGhlc2UgbWV0aG9kcyBiZWxvdyBmb3IgdGhlaXIgc2lnbmF0dXJlcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEB0aGlzIHtNZXNzZW5nZXJBUEl9XG4gKiBAcmV0dXJuIHtNZXNzZW5nZXJBUEl9XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlckFQSSgpIHtcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdCkgLSBpbml0aWFsaXplcyBNZXNzZW5nZXJBUElcbiAqIC0gW2FkZEludGVybmFsTWVzc2FnZV0oI2FkZEludGVybmFsTWVzc2FnZSkgLSBhZGRzIGludGVybmFsIG1lc3NhZ2VcbiAqIC0gW3JlbW92ZUludGVybmFsTWVzc2FnZV0oI3JlbW92ZUludGVybmFsTWVzc2FnZSkgLSByZW1vdmVzIGludGVybmFsIG1lc3NhZ2VcbiAqIC0gW2dldEludGVybmFsTWVzc2FnZXNdKCNnZXRJbnRlcm5hbE1lc3NhZ2VzKSAtIHJldHVybnMgdGhlIGxpc3Qgb2YgaW50ZXJuYWwgbWVzc2FnZXMgZm9yIGdpdmVuIHNvdXJjZSBtZXNzYWdlXG4gKlxuICogVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgcmVkZWZpbmVkIGJ5IHN1YmNsYXNzOlxuICpcbiAqIC0gW3RyYW5zbGF0ZVRvU291cmNlTWVzc2FnZV0oI3RyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSkgLSBjb252ZXJ0cyBpbnRlcm5hbCBtZXNzYWdlIHR5cGUgdG8gc291cmNlIChleHRlcm5hbCkgbWVzc2FnZSB0eXBlXG4gKiAtIFtjcmVhdGVJbnRlcm5hbERhdGFdKCNjcmVhdGVJbnRlcm5hbERhdGEpIC0gY29udmVydHMgc291cmNlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCB2aWEgTWVzc2FnZVNvdXJjZSB0byBpbnRlcm5hbCBtZXNzYWdlIGRhdGFcbiAqIC0gW2ZpbHRlclNvdXJjZU1lc3NhZ2VdKCNmaWx0ZXJTb3VyY2VNZXNzYWdlKSAtIGZpbHRlcnMgc291cmNlIG1lc3NhZ2UgYmFzZWQgb24gdGhlIGRhdGEgb2YgdGhlIG1lc3NhZ2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGludGVybmFsIG1lc3NhZ2UgdGhhdCBpcyBhYm91dCB0byBiZSBzZW50IG9uIE1lc3NlbmdlclxuICovXG5fLmV4dGVuZFByb3RvKE1lc3NlbmdlckFQSSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogTWVzc2VuZ2VyQVBJJGRlc3Ryb3ksXG4gICAgYWRkSW50ZXJuYWxNZXNzYWdlOiBhZGRJbnRlcm5hbE1lc3NhZ2UsXG4gICAgcmVtb3ZlSW50ZXJuYWxNZXNzYWdlOiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UsXG4gICAgZ2V0SW50ZXJuYWxNZXNzYWdlczogZ2V0SW50ZXJuYWxNZXNzYWdlcyxcblxuICAgIC8vIHNob3VsZCBiZSByZWRlZmluZWQgYnkgc3ViY2xhc3NcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlXG59KTtcblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBNZXNzZW5nZXJBUEkgY29uc3RydWN0b3IuIFN1YmNsYXNzZXMgdGhhdCByZS1pbXBsZW1lbnQgYGluaXRgIG1ldGhvZCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB1c2luZzogYE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYFxuICovXG5mdW5jdGlvbiBpbml0KCkge1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19pbnRlcm5hbE1lc3NhZ2VzJywge30pO1xufVxuXG5cbi8qKlxuICogRGVzdHJveXMgbWVzc2VuZ2VyIEFQSVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJBUEkkZGVzdHJveSgpIHtcblxufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogVHJhbnNsYXRlcyBpbnRlcm5hbCBgbWVzc2FnZWAgdG8gc291cmNlIG1lc3NhZ2UsIGFkZHMgaW50ZXJuYWwgYG1lc3NhZ2VgIHRvIHRoZSBsaXN0LCBtYWtpbmcgc3VyZSB0aGUgc2FtZSBgbWVzc2FnZWAgd2Fzbid0IHBhc3NlZCBiZWZvcmUgKGl0IHdvdWxkIGluZGljYXRlIE1lc3NlbmdlciBlcnJvcikuXG4gKiBSZXR1cm5zIHNvdXJjZSBtZXNzYWdlIGlmIGl0IGlzIHVzZWQgZmlyc3QgdGltZSAoc28gdGhhdCBgTWVzc2FnZVNvdXJjZWAgc3ViY3JpYmVzIHRvIHRoaXMgc291cmNlIG1lc3NhZ2UpIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZCBhbmQgYWRkZWRcbiAqIEByZXR1cm4ge1N0cmluZ3x1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIGludGVybmFsTXNnc1xuICAgICAgICAsIHNvdXJjZU1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlTWVzc2FnZSA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX2ludGVybmFsTWVzc2FnZXMuaGFzT3duUHJvcGVydHkoc291cmNlTWVzc2FnZSkpIHtcbiAgICAgICAgaW50ZXJuYWxNc2dzID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgaWYgKGludGVybmFsTXNncy5pbmRleE9mKG1lc3NhZ2UpID09IC0xKVxuICAgICAgICAgICAgaW50ZXJuYWxNc2dzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEdXBsaWNhdGUgYWRkSW50ZXJuYWxNZXNzYWdlIGNhbGwgZm9yIGludGVybmFsIG1lc3NhZ2UgJyArIG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsTXNncyA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV0gPSBbXTtcbiAgICAgICAgaW50ZXJuYWxNc2dzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgaW50ZXJuYWwgYG1lc3NhZ2VgIGZyb20gdGhlIGxpc3QgY29ubmVjdGVkIHRvIGNvcnJlc3BvbmRpbmcgc291cmNlIG1lc3NhZ2UgKGB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VgIGlzIHVzZWQgZm9yIHRyYW5zbGF0aW9uKS5cbiAqIFJldHVybnMgc291cmNlIG1lc3NhZ2UsIGlmIHRoZSBsYXN0IGludGVybmFsIG1lc3NhZ2Ugd2FzIHJlbW92ZWQgKHNvIHRoYXQgYE1lc3NhZ2VTb3VyY2VgIGNhbiB1bnN1YnNjcmliZSBmcm9tIHRoaXMgc291cmNlIG1lc3NhZ2UpLCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIHJlbW92ZWRcbiAqIEByZXR1cm4ge1N0cmluZ3x1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlTWVzc2FnZSA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgdmFyIGludGVybmFsTXNncyA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG5cbiAgICBpZiAoaW50ZXJuYWxNc2dzICYmIGludGVybmFsTXNncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2VJbmRleCA9IGludGVybmFsTXNncy5pbmRleE9mKG1lc3NhZ2UpO1xuICAgICAgICBpZiAobWVzc2FnZUluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGludGVybmFsTXNncy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbE1zZ3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB1bmV4cGVjdGVkTm90aWZpY2F0aW9uV2FybmluZygpO1xuICAgIH0gZWxzZVxuICAgICAgICB1bmV4cGVjdGVkTm90aWZpY2F0aW9uV2FybmluZygpO1xuXG5cbiAgICBmdW5jdGlvbiB1bmV4cGVjdGVkTm90aWZpY2F0aW9uV2FybmluZygpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ25vdGlmaWNhdGlvbiByZWNlaXZlZDogdW4tc3Vic2NyaWJlIGZyb20gaW50ZXJuYWwgbWVzc2FnZSAnICsgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgKyAnIHdpdGhvdXQgcHJldmlvdXMgc3Vic2NyaXB0aW9uIG5vdGlmaWNhdGlvbicpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGludGVybmFsIG1lc3NhZ2VzIHRoYXQgd2VyZSB0cmFuc2xhdGVkIHRvIGdpdmVuIGBzb3VyY2VNZXNzYWdlYC5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgYE1lc3NhZ2VTb3VyY2VgIHRvIGRpc3BhdGNoIHNvdXJjZSBtZXNzYWdlIG9uIHRoZSBgTWVzZW5nZXJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbE1lc3NhZ2VzKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkZWZpbmUgdGhlIHJ1bGUgZm9yIHRyYW5zbGF0aW9uIG9mIGludGVybmFsIGBtZXNzYWdlYCB0byBzb3VyY2UgbWVzc2FnZS4gVGhpcyBjbGFzcyBzaW1wbHkgcmV0dXJucyB0aGUgc2FtZSBgbWVzc2FnZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2Vcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkZWZpbmUgdGhlIHJ1bGUgZm9yIHRyYW5zbGF0aW9uIG9mIHNvdXJjZSBtZXNzYWdlIGRhdGEgdG8gaW50ZXJuYWwgbWVzc2FnZSBkYXRhLiBUaGlzIGNsYXNzIHNpbXBseSByZXR1cm5zIHRoZSBzYW1lIGBzb3VyY2VEYXRhYC5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gW2Rpc3BhdGNoTWVzc2FnZV0oLi9tX3NvdXJjZS5qcy5odG1sI2Rpc3BhdGNoTWVzc2FnZSkgbWV0aG9kIG9mIGBNZXNzYWdlU291cmNlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gdHJhbnNsYXRpb24gcnVsZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gdHJhbnNsYXRpb24gcnVsZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZURhdGEgZGF0YSByZWNlaXZlZCBmcm9tIHNvdXJjZSB0aGF0IGhhcyB0byBiZSB0cmFuc2xhdGVkIHRvIGRhdGEgdGhhdCB3aWxsIGJlIHNlbnQgdG8gaW50ZXJuYWwgTWVzc2VuZ2VyIHN1YnNjcmliZXJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIHNvdXJjZURhdGEpIHtcbiAgICByZXR1cm4gc291cmNlRGF0YTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHJlLWltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBkZWZpbmUgdGhlIGRpc3BhdGNoIGZpbHRlciBmb3IgaW50ZXJuYWwgbWVzc2FnZXMuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYHRydWVgIHRvIGFsbG93IGFuZCBgZmFsc2VgIHRvIHByZXZlbnQgaW50ZXJuYWwgbWVzc2FnZSBkaXNwYXRjaC4gVGhpcyBjbGFzcyBhbHdheXMgcmV0dXJucyBgdHJ1ZWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIFtkaXNwYXRjaE1lc3NhZ2VdKC4vbV9zb3VyY2UuanMuaHRtbCNkaXNwYXRjaE1lc3NhZ2UpIG1ldGhvZCBvZiBgTWVzc2FnZVNvdXJjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIGZpbHRlciBydWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHBhcmFtIHtPYmplY3R9IGludGVybmFsRGF0YSBkYXRhIHRyYW5zbGF0ZWQgYnkgYGNyZWF0ZUludGVybmFsRGF0YWAgbWV0aG9kIGZyb20gc291cmNlIGRhdGEsIGNhbiBiZSB1c2VkIGluIGZpbHRlciBydWxlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBmaWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGludGVybmFsRGF0YSkge1xuICAgIHJldHVybiB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnLi9tX2FwaScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBBIGdlbmVyaWMgc3Vic2NsYXNzIG9mIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgdGhhdCBzdXBwb3J0cyBwYXR0ZXJuIHN1YnNjcmlwdGlvbnMgdG8gc291cmNlLlxuICogQ2FuIGJlIHVzZWZ1bCBpZiB0aGUgc291cmNlIGlzIGFub3RoZXIgTWVzc2VuZ2VyLlxuICovXG4gdmFyIE1lc3NlbmdlclJlZ2V4cEFQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTWVzc2VuZ2VyUmVnZXhwQVBJJyk7XG5cbiBtb2R1bGUuZXhwb3J0cyA9IE1lc3NlbmdlclJlZ2V4cEFQSTtcblxuXG5fLmV4dGVuZFByb3RvKE1lc3NlbmdlclJlZ2V4cEFQSSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkSW50ZXJuYWxNZXNzYWdlOiBhZGRJbnRlcm5hbE1lc3NhZ2UsXG4gICAgcmVtb3ZlSW50ZXJuYWxNZXNzYWdlOiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UsXG4gICAgZ2V0SW50ZXJuYWxNZXNzYWdlczogZ2V0SW50ZXJuYWxNZXNzYWdlc1xufSk7XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgTWVzc2VuZ2VyUmVnZXhwQVBJIGNvbnN0cnVjdG9yLlxuICovXG5mdW5jdGlvbiBpbml0KCkge1xuICAgIE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlczoge31cbiAgICB9KTtcbiAgICB0aGlzLl9jYXRjaEFsbFN1YnNjcmliZWQgPSBmYWxzZTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlclJlZ2V4cEFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIEF1Z21lbnRzIE1lc3NlbmdlckFQSSBtZXRob2QgYnkgc3RvcmluZyByZWdleHBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIGFkZGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8UmVnRXhwfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gYWRkSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgc291cmNlTWVzc2FnZSA9IE1lc3NlbmdlckFQSS5wcm90b3R5cGUuYWRkSW50ZXJuYWxNZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgXG4gICAgLy8gc3RvcmUgcmVnZXhwIGl0c2VsZiBpZiBzb3VyY2VNZXNzYWdlIGlzIHJlZ2V4cFxuICAgIGlmIChzb3VyY2VNZXNzYWdlICYmIHNvdXJjZU1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXS5wYXR0ZXJuID0gc291cmNlTWVzc2FnZTtcbiAgICAgICAgdGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV0gPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuICAgICAgICBpZiAodGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9jYXRjaEFsbFN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gLy4qLztcbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlclJlZ2V4cEFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIEF1Z21lbnRzIE1lc3NlbmdlckFQSSBtZXRob2QgYnkgcmVtb3ZpbmcgcmVnZXhwIHN1YnNjaXJwdGlvblxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIGFkZGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8UmVnRXhwfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgc291cmNlTWVzc2FnZSA9IE1lc3NlbmdlckFQSS5wcm90b3R5cGUucmVtb3ZlSW50ZXJuYWxNZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoc291cmNlTWVzc2FnZSAmJiBzb3VyY2VNZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgdmFyIG5vUGF0dGVybkludGVybmFsTWVzc2FnZXMgPSAhIE9iamVjdC5rZXlzKHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzKS5sZW5ndGg7XG4gICAgICAgIGlmIChub1BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9jYXRjaEFsbFN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiAvLiovO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHJldHVybmluZyBtZXNzYWdlcyBzdWJzY3JpYmVkIHdpdGggcmVnZXhwXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGBNZXNzYWdlU291cmNlYCB0byBkaXNwYXRjaCBzb3VyY2UgbWVzc2FnZSBvbiB0aGUgYE1lc2VuZ2VyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2VcbiAqIEByZXR1cm4ge0FycmF5W1N0cmluZ119XG4gKi9cbmZ1bmN0aW9uIGdldEludGVybmFsTWVzc2FnZXMoc291cmNlTWVzc2FnZSkge1xuICAgIHZhciBpbnRlcm5hbE1lc3NhZ2VzID0gTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5nZXRJbnRlcm5hbE1lc3NhZ2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBhZGQgaW50ZXJuYWwgbWVzc2FnZXMgZm9yIHJlZ2V4cCBzb3VyY2Ugc3Vic2NyaXB0aW9uc1xuICAgIGlmICh0eXBlb2Ygc291cmNlTWVzc2FnZSA9PSAnc3RyaW5nJykge1xuICAgICAgICBpbnRlcm5hbE1lc3NhZ2VzID0gaW50ZXJuYWxNZXNzYWdlcyB8fCBbXTtcbiAgICAgICAgdmFyIGludGVybmFsTWVzc2FnZXNIYXNoID0gXy5vYmplY3QoaW50ZXJuYWxNZXNzYWdlcywgdHJ1ZSk7XG5cbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzLCBmdW5jdGlvbihwYXR0ZXJuTWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2VQYXR0ZXJuID0gcGF0dGVybk1lc3NhZ2VzLnBhdHRlcm47XG5cbiAgICAgICAgICAgIGlmIChzb3VyY2VQYXR0ZXJuLnRlc3Qoc291cmNlTWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgcGF0dGVybk1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxNZXNzYWdlc0hhc2hbbWVzc2FnZV0pIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbE1lc3NhZ2VzSGFzaFttZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gXG5cbiAgICByZXR1cm4gaW50ZXJuYWxNZXNzYWdlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1peGluID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvbWl4aW4nKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnLi9tX2FwaScpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5NZXNzYWdlU291cmNlYFxuICogQW4gYWJzdHJhY3QgY2xhc3MgKHN1YmNsYXNzIG9mIFtNaXhpbl0oLi4vYWJzdHJhY3QvbWl4aW4uanMuaHRtbCkpIGZvciBjb25uZWN0aW5nIFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkgdG8gZXh0ZXJuYWwgc291cmNlcyBvZiBtZXNzYWdlcyAobGlrZSBET00gZXZlbnRzKSBhbmQgZGVmaW5pbmcgaGlnaGVyIGxldmVsIG1lc3NhZ2VzLlxuICogQW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVNvdXJjZSBjYW4gZWl0aGVyIGJlIHBhc3NlZCB0byBNZXNzZW5nZXIgY29uc3RydWN0b3Igb3IgbGF0ZXIgdXNpbmcgYF9zZXRNZXNzYWdlU291cmNlYCBtZXRob2Qgb2YgTWVzc2VuZ2VyLiBPbmNlIHNldCwgTWVzc2FnZVNvdXJjZSBvZiBNZXNzZW5nZXIgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbnZhciBNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNaXhpbiwgJ01lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZXNzYWdlU291cmNlO1xuXG5cbi8qKlxuICogIyMjI01lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdCkgLSBpbml0aWFsaXplcyBtZXNzYWdlU291cmNlIC0gY2FsbGVkIGJ5IE1peGluIHN1cGVyY2xhc3NcbiAqIC0gW3NldE1lc3Nlbmdlcl0oI3NldE1lc3NlbmdlcikgLSBjb25uZWN0cyBNZXNzZW5nZXIgdG8gTWVzc2FnZVNvdXJjZSwgaXMgY2FsbGVkIGZyb20gYGluaXRgIG9yIGBfc2V0TWVzc2FnZVNvdXJjZWAgbWV0aG9kcyBvZiBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpLlxuICogLSBbb25TdWJzY3JpYmVyQWRkZWRdKCNvblN1YnNjcmliZXJBZGRlZCkgLSBjYWxsZWQgYnkgTWVzc2VuZ2VyIHRvIG5vdGlmeSB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIGZvciBhbiBpbnRlcm5hbCBtZXNzYWdlIHdhcyBhZGRlZCwgc28gTWVzc2FnZVNvdXJjZSBjYW4gc3Vic2NyaWJlIHRvIHNvdXJjZVxuICogLSBbb25TdWJzY3JpYmVyUmVtb3ZlZF0oI29uU3Vic2NyaWJlclJlbW92ZWQpIC0gY2FsbGVkIGJ5IE1lc3NlbmdlciB0byBub3RpZnkgd2hlbiB0aGUgbGFzdCBzdWJzY3JpYmVyIGZvciBhbiBpbnRlcm5hbCBtZXNzYWdlIHdhcyByZW1vdmVkLCBzbyBNZXNzYWdlU291cmNlIGNhbiB1bnN1YnNjcmliZSBmcm9tIHNvdXJjZVxuICogLSBbZGlzcGF0Y2hNZXNzYWdlXSgjZGlzcGF0Y2hNZXNzYWdlKSAtIGRpc3BhdGNoZXMgc291cmNlIG1lc3NhZ2UuIE1lc3NhZ2VTb3VyY2Ugc3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBtZWNoYW5pc20gd2hlbiBvbiBhY3R1YWwgc291cmNlIG1lc3NhZ2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIE1ldGhvZHMgYmVsb3cgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzOlxuICpcbiAqIC0gW3RyaWdnZXJdKCN0cmlnZ2VyKSAtIHRyaWdnZXJzIG1lc3NhZ2VzIG9uIHRoZSBzb3VyY2UgKGFuIG9wdGlvbmFsIG1ldGhvZClcbiAqIC0gW2FkZFNvdXJjZVN1YnNjcmliZXJdKCNhZGRTb3VyY2VTdWJzY3JpYmVyKSAtIGFkZHMgbGlzdGVuZXIvc3Vic2NyaWJlciB0byBleHRlcm5hbCBtZXNzYWdlXG4gKiAtIFtyZW1vdmVTb3VyY2VTdWJzY3JpYmVyXSgjcmVtb3ZlU291cmNlU3Vic2NyaWJlcikgLSByZW1vdmVzIGxpc3RlbmVyL3N1YnNjcmliZXIgZnJvbSBleHRlcm5hbCBtZXNzYWdlXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2FnZVNvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogTWVzc2FnZVNvdXJjZSRkZXN0cm95LFxuICAgIHNldE1lc3Nlbmdlcjogc2V0TWVzc2VuZ2VyLFxuICAgIG9uU3Vic2NyaWJlckFkZGVkOiBvblN1YnNjcmliZXJBZGRlZCxcbiAgICBvblN1YnNjcmliZXJSZW1vdmVkOiBvblN1YnNjcmliZXJSZW1vdmVkLCBcbiAgICBkaXNwYXRjaE1lc3NhZ2U6IGRpc3BhdGNoTWVzc2FnZSxcbiAgICBwb3N0TWVzc2FnZTogcG9zdE1lc3NhZ2UsXG4gICAgX3ByZXBhcmVNZXNzZW5nZXJBUEk6IF9wcmVwYXJlTWVzc2VuZ2VyQVBJLFxuXG4gICAgLy8gTWV0aG9kcyBiZWxvdyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzXG4gICAgdHJpZ2dlcjogdG9CZUltcGxlbWVudGVkLFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBDYWxsZWQgYnkgTWl4aW4gY29uc3RydWN0b3IuXG4gKiBNZXNzYWdlU291cmNlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBwYXNzZWQgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGlzIG1ldGhvZCBzaWduYXR1cmUuXG4gKiBJZiBhbiBpbnN0YW5jZSBvZiBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGlzIHBhc3NlZCBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyLCBpdCBleHRlbmRzIE1lc3NhZ2VTb3VyY2UgZnVuY3Rpb25hbGl0eSB0byBhbGxvdyBpdCB0byBkZWZpbmUgbmV3IG1lc3NhZ2VzLCB0byBmaWx0ZXIgbWVzc2FnZXMgYmFzZWQgb24gdGhlaXIgZGF0YSBhbmQgdG8gY2hhbmdlIG1lc3NhZ2UgZGF0YS4gU2VlIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhvc3RPYmplY3QgT3B0aW9uYWwgb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBNZXNzYWdlU291cmNlIG9uIG9uZSBvZiBpdHMgcHJvcGVydGllcy4gSXQgaXMgdXNlZCB0byBwcm94eSBtZXRob2RzIG9mIE1lc3NhZ2VTb3VyY2UuXG4gKiBAcGFyYW0ge09iamVjdFtTdHJpbmddfSBwcm94eU1ldGhvZHMgT3B0aW9uYWwgbWFwIG9mIG1ldGhvZCBuYW1lczsga2V5IC0gcHJveHkgbWV0aG9kIG5hbWUsIHZhbHVlIC0gTWVzc2FnZVNvdXJjZSdzIG1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtNZXNzZW5nZXJBUEl9IG1lc3NlbmdlckFQSSBPcHRpb25hbCBpbnN0YW5jZSBvZiBNZXNzZW5nZXJBUEkuXG4gKi9cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUEkpIHtcbiAgICB0aGlzLl9wcmVwYXJlTWVzc2VuZ2VyQVBJKG1lc3NlbmdlckFQSSk7XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBtZXNzYWdlIHNvdXJjZVxuICovXG5mdW5jdGlvbiBNZXNzYWdlU291cmNlJGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMubWVzc2VuZ2VyQVBJKVxuICAgICAgICB0aGlzLm1lc3NlbmdlckFQSS5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFNldHMgcmVmZXJlbmNlIHRvIE1lc3NlbmdlciBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge01lc3Nlbmdlcn0gbWVzc2VuZ2VyIHJlZmVyZW5jZSB0byBNZXNzZW5nZXIgaW5zdGFuY2UgbGlua2VkIHRvIHRoaXMgTWVzc2FnZVNvdXJjZVxuICovXG5mdW5jdGlvbiBzZXRNZXNzZW5nZXIobWVzc2VuZ2VyKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWVzc2VuZ2VyJywgbWVzc2VuZ2VyKTtcbn1cblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogUHJlcGFyZXMgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBwYXNzZWQgdG8gY29uc3RydWN0b3IgYnkgcHJveHlpbmcgaXRzIG1ldGhvZHMgdG8gaXRzZWxmIG9yIGlmIE1lc3NlbmdlckFQSSB3YXNuJ3QgcGFzc2VkIGRlZmluZXMgdHdvIG1ldGhvZHMgdG8gYXZvaWQgY2hlY2tpbmcgdGhlaXIgYXZhaWxhYmlsaXR5IGV2ZXJ5IHRpbWUgdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtNZXNzZW5nZXJBUEl9IG1lc3NlbmdlckFQSSBPcHRpb25hbCBpbnN0YW5jZSBvZiBNZXNzZW5nZXJBUElcbiAqL1xuZnVuY3Rpb24gX3ByZXBhcmVNZXNzZW5nZXJBUEkobWVzc2VuZ2VyQVBJKSB7XG4gICAgY2hlY2sobWVzc2VuZ2VyQVBJLCBNYXRjaC5PcHRpb25hbChNZXNzZW5nZXJBUEkpKTtcblxuICAgIGlmICghIG1lc3NlbmdlckFQSSlcbiAgICAgICAgbWVzc2VuZ2VyQVBJID0gbmV3IE1lc3NlbmdlckFQSTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NlbmdlckFQSScsIG1lc3NlbmdlckFQSSk7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFN1YnNjcmliZXMgdG8gZXh0ZXJuYWwgc291cmNlIHVzaW5nIGBhZGRTb3VyY2VTdWJzY3JpYmVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MuXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKSB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIHRvIHRoZSBgbWVzc2FnZWAgaXMgYWRkZWQuXG4gKiBEZWxlZ2F0ZXMgdG8gc3VwcGxpZWQgb3IgZGVmYXVsdCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGZvciB0cmFuc2xhdGlvbiBvZiBgbWVzc2FnZWAgdG8gYHNvdXJjZU1lc3NhZ2VgLiBgTWVzc2FnZUFQSS5wcm90b3R5cGUuYWRkSW50ZXJuYWxNZXNzYWdlYCB3aWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhpcyBgc291cmNlTWVzc2FnZWAgd2FzIGFscmVhZHkgc3Vic2NyaWJlZCB0byB0byBwcmV2ZW50IGR1cGxpY2F0ZSBzdWJzY3JpcHRpb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgTWVzc2VuZ2VyIG1lc3NhZ2UgdGhhdCBoYXMgdG8gYmUgc3Vic2NyaWJlZCB0byBhdCB0aGUgZXh0ZXJuYWwgc291cmNlIG9mIG1lc3NhZ2VzLlxuICovXG5mdW5jdGlvbiBvblN1YnNjcmliZXJBZGRlZChtZXNzYWdlKSB7XG4gICAgdmFyIG5ld1NvdXJjZU1lc3NhZ2UgPSB0aGlzLm1lc3NlbmdlckFQSS5hZGRJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgaWYgKHR5cGVvZiBuZXdTb3VyY2VNZXNzYWdlICE9ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzLmFkZFNvdXJjZVN1YnNjcmliZXIobmV3U291cmNlTWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFVuc3Vic2NyaWJlcyBmcm9tIGV4dGVybmFsIHNvdXJjZSB1c2luZyBgcmVtb3ZlU291cmNlU3Vic2NyaWJlcmAgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkgd2hlbiB0aGUgbGFzdCBzdWJzY3JpYmVyIHRvIHRoZSBgbWVzc2FnZWAgaXMgcmVtb3ZlZC5cbiAqIERlbGVnYXRlcyB0byBzdXBwbGllZCBvciBkZWZhdWx0IFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgZm9yIHRyYW5zbGF0aW9uIG9mIGBtZXNzYWdlYCB0byBgc291cmNlTWVzc2FnZWAuIGBNZXNzYWdlQVBJLnByb3RvdHlwZS5yZW1vdmVJbnRlcm5hbE1lc3NhZ2VgIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGlzIGBzb3VyY2VNZXNzYWdlYCB3YXMgbm90IHlldCBzdWJzY3JpYmVkIHRvIHRvIHByZXZlbnQgdW5zdWJzY3JpcHRpb24gd2l0aG91dCBwcmV2aW91cyBzdWJzY3JpcHRpb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgTWVzc2VuZ2VyIG1lc3NhZ2UgdGhhdCBoYXMgdG8gYmUgdW5zdWJzY3JpYmVkIGZyb20gYXQgdGhlIGV4dGVybmFsIHNvdXJjZSBvZiBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gb25TdWJzY3JpYmVyUmVtb3ZlZChtZXNzYWdlKSB7XG4gICAgdmFyIHJlbW92ZWRTb3VyY2VNZXNzYWdlID0gdGhpcy5tZXNzZW5nZXJBUEkucmVtb3ZlSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmICh0eXBlb2YgcmVtb3ZlZFNvdXJjZU1lc3NhZ2UgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXMucmVtb3ZlU291cmNlU3Vic2NyaWJlcihyZW1vdmVkU291cmNlTWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIERpc3BhdGNoZXMgc291cmNlTWVzc2FnZSB0byBNZXNzZW5nZXIuXG4gKiBNZWNoYW5pc20gdGhhdCBjYWxscyB0aGlzIG1ldGhvZCB3aGVuIHRoZSBzb3VyY2UgbWVzc2FnZSBpcyByZWNlaXZlZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MgKHNlZSBbRE9NRXZlbnRzU291cmNlXSguLi9jb21wb25lbnRzL21zZ19zcmMvZG9tX2V2ZW50cy5qcy5odG1sKSBmb3IgZXhhbXBsZSkuXG4gKiBEZWxlZ2F0ZXMgdG8gc3VwcGxpZWQgb3IgZGVmYXVsdCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIHRvIGNyZWF0ZSBpbnRlcm5hbCBtZXNzYWdlIGRhdGEgKGBjcmVhdGVJbnRlcm5hbERhdGFgKSBhbmQgdG8gZmlsdGVyIHRoZSBtZXNzYWdlIGJhc2VkIG9uIGl0cyBkYXRhIGFuZC9vciBtZXNzYWdlIChgZmlsdGVyU291cmNlTWVzc2FnZWApLlxuICogQmFzZSBNZXNzZW5nZXJBUEkgY2xhc3MgaW1wbGVtZW50cyB0aGVzZSB0d28gbWV0aG9kcyBpbiBhIHRyaXZpYWwgd2F5IChgY3JlYXRlSW50ZXJuYWxEYXRhYCBzaW1wbHkgcmV0dXJucyBleHRlcm5hbCBkYXRhLCBgZmlsdGVyU291cmNlTWVzc2FnZWAgcmV0dXJucyBgdHJ1ZWApLCB0aGV5IGFyZSBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGV4dGVybmFsIHNvdXJjZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZURhdGEgZGF0YSByZWNlaXZlZCBmcm9tIGV4dGVybmFsIHNvdXJjZVxuICovXG5mdW5jdGlvbiBkaXNwYXRjaE1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgc291cmNlRGF0YSkge1xuICAgIHZhciBhcGkgPSB0aGlzLm1lc3NlbmdlckFQSVxuICAgICAgICAsIGludGVybmFsTWVzc2FnZXMgPSBhcGkuZ2V0SW50ZXJuYWxNZXNzYWdlcyhzb3VyY2VNZXNzYWdlKTtcblxuICAgIGlmIChpbnRlcm5hbE1lc3NhZ2VzKSBcbiAgICAgICAgaW50ZXJuYWxNZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB2YXIgaW50ZXJuYWxEYXRhID0gYXBpLmNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKTtcblxuICAgICAgICAgICAgdmFyIHNob3VsZERpc3BhdGNoID0gYXBpLmZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgaW50ZXJuYWxEYXRhKTtcbiAgICAgICAgICAgIGlmIChzaG91bGREaXNwYXRjaCkgXG4gICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShtZXNzYWdlLCBpbnRlcm5hbERhdGEpOyAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogUG9zdHMgbWVzc2FnZSBvbiB0aGUgbWVzc2VuZ2VyLiBUaGlzIG1ldGhvZCBpcyBzZXBhcmF0ZWQgc28gc3BlY2lmaWMgbWVzc2FnZSBzb3VyY2VzIGNhbiBtYWtlIG1lc3NhZ2UgZGlzcGF0Y2ggc3luY2hyb25vdXMgYnkgdXNpbmcgYHBvc3RNZXNzYWdlU3luY2BcbiAqIFxuICogQHBhcmFtICB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgTWVzc2FnZVNvdXJjZSA9IHJlcXVpcmUoJy4vbV9zb3VyY2UnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKTtcblxuXG4vKipcbiAqIFN1YmNsYXNzIG9mIE1lc3NhZ2VTb3VyY2UgdGhhdCBhbGxvd3MgdG8gY29ubmVjdCBNZXNzZW5nZXIgdG8gYW5vdGhlciBNZXNzZW5nZXIgdXNpbmcgaXQgYXMgZXh0ZXJuYWwgc291cmNlLlxuICovXG52YXIgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ01lc3Nlbmdlck1lc3NhZ2VTb3VyY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXJNZXNzYWdlU291cmNlO1xuXG5cbi8qKlxuICogIyMjI01lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzZW5nZXJNZXNzYWdlU291cmNlLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgcG9zdE1lc3NhZ2U6IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UkcG9zdE1lc3NhZ2Vcbn0pO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2VcbiAqIERlZmluZXMgb25lIHBhcmFtZXRlciBpbiBhZGRpdGlvbiB0byBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBwYXJhbWV0ZXJzXG4gKlxuICogQHBhcmFtIHtNZXNzZW5nZXJ9IHNvdXJjZU1lc3NlbmdlciBtZXNzZW5nZXIgdGhpcyBtZXNzYWdlIHNvdXJjZSBjb25uZWN0cyB0b1xuICovXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJLCBzb3VyY2VNZXNzZW5nZXIpIHtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5zb3VyY2VNZXNzZW5nZXIgPSBzb3VyY2VNZXNzZW5nZXI7XG59XG5cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHNvdXJjZSBtZXNzYWdlLiBTZWUgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgZG9jcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdleH0gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZSB0byBzdWJzY3JpYmUgdG9cbiAqL1xuZnVuY3Rpb24gYWRkU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy5zb3VyY2VNZXNzZW5nZXIub25TeW5jKHNvdXJjZU1lc3NhZ2UsIHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogdGhpcy5kaXNwYXRjaE1lc3NhZ2UgfSk7XG59XG5cblxuLyoqXG4gKiBVbnN1YnNjcmliZXMgZnJvbSBzb3VyY2UgbWVzc2FnZS4gU2VlIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGRvY3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnZXh9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgdG8gdW5zdWJzY3JpYmUgZnJvbVxuICovXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLnNvdXJjZU1lc3Nlbmdlci5vZmYoc291cmNlTWVzc2FnZSwgeyBjb250ZXh0OiB0aGlzLCBzdWJzY3JpYmVyOiB0aGlzLmRpc3BhdGNoTWVzc2FnZSB9KTtcbn1cblxuXG4vKipcbiAqIE92ZXJyaWRlcyBkZWZhbHV0IG1lc3NhZ2Ugc291cmNlIHRvIGRpc3BhdGNoIG1lc3NhZ2VzIHN5bmNocm9ub3VzbHlcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG4vKipcbiAqICMjIyNNaWxvIHBhY2thZ2VzIyMjI1xuICpcbiAqIC0gW21pbmRlcl0oLi9taW5kZXIuanMuaHRtbCkgLSBkYXRhIHJlYWN0aXZpdHksIG9uZSBvciB0d28gd2F5LCBzaGFsbG93IG9yIGRlZXAsIGFzIHlvdSBsaWtlIGl0XG4gKiAtIFtjb25maWddKC4vY29uZmlnLmpzLmh0bWwpIC0gbWlsbyBjb25maWd1cmF0aW9uXG4gKiAtIFt1dGlsXSguL3V0aWwvaW5kZXguanMuaHRtbCkgLSBsb2dnZXIsIHJlcXVlc3QsIGRvbSwgY2hlY2ssIGVycm9yLCBldGMuXG4gKiAtIFtjbGFzc2VzXSguL2NsYXNzZXMuanMuaHRtbCkgLSBhYnN0cmFjdCBhbmQgYmFzZSBjbGFzc2VzXG4gKiAtIFtNZXNzZW5nZXJdKC4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIC0gZ2VuZXJpYyBNZXNzZW5nZXIgdXNlZCBpbiBtb3N0IG90aGVyIG1pbG8gY2xhc3NlcywgY2FuIGJlIG1peGVkIGludG8gYXBwIGNsYXNzZXMgdG9vLlxuICogLSBbTW9kZWxdKC4vbW9kZWwvaW5kZXguanMuaHRtbCkgLSBNb2RlbCBjbGFzcyB0aGF0IGVtaXRzIG1lc3NhZ2VzIG9uIGNoYW5nZXMgdG8gYW55IGRlcHRoIHdpdGhvdXQgdGltZXIgYmFzZWQgd2F0Y2hpbmdcbiAqL1xudmFyIG1pbG8gPSB7XG4gICAgbWluZGVyOiByZXF1aXJlKCcuL21pbmRlcicpLFxuICAgIGNvbmZpZzogcmVxdWlyZSgnLi9jb25maWcnKSxcbiAgICB1dGlsOiByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBjbGFzc2VzOiByZXF1aXJlKCcuL2NsYXNzZXMnKSxcbiAgICBNZXNzZW5nZXI6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyJyksXG4gICAgTW9kZWw6IHJlcXVpcmUoJy4vbW9kZWwnKSxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIHByb3RvOiBfXG59O1xuXG5cbi8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG5pZiAodHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykgICAgXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBtaWxvO1xuXG4vLyBnbG9iYWwgbWlsbyBmb3IgYnJvd3NlclxuaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpXG4gICAgd2luZG93Lm1pbG8gPSBtaWxvO1xuXG5cbmZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgbWlsby5taW5kZXIuZGVzdHJveSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29ubmVjdG9yID0gcmVxdWlyZSgnLi9tb2RlbC9jb25uZWN0b3InKVxuICAgICwgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi9tZXNzZW5nZXInKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBtaW5kZXI7XG5cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgb25lIG9yIG1hbnkgQ29ubmVjdG9yIG9iamVjdHMgdGhhdFxuICogY3JlYXRlIGxpdmUgcmVhY3RpdmUgY29ubmVjdGlvbiBiZXR3ZWVuIG9iamVjdHMgaW1wbGVtZW50aW5nXG4gKiBkYXRhU291cmNlIGludGVyZmFjZTpcbiAqIE9iamVjdHMgc2hvdWxkIGVtaXQgbWVzc2FnZXMgd2hlbiBhbnkgcGFydCBvZiB0aGVpciBkYXRhIGNoYW5nZXMsXG4gKiBtZXRob2RzIGBvbmAgYW5kIGBvZmZgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBzdWJzY3JpYmUvdW5zdWJzY3JpYmVcbiAqIHRvIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZXMsIG1ldGhvZHMgYHNldGAgYW5kIGBnZXRgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBnZXQvc2V0IGRhdGFcbiAqIG9uIHBhdGggb2JqZWN0cywgcG9pbnRpbmcgdG8gcGFydGljdWxhciBwYXJ0cyBvZiB0aGUgb2JqZWN0LCBtZXRob2QgYHBhdGhgXG4gKiBzaG91bGQgcmV0dXJuIHBhdGggb2JqZWN0IGZvciBhIGdpdmVuIHBhdGggc3RyaW5nIChzZWUgcGF0aCB1dGlscyBmb3IgcGF0aCBzdHJpbmcgc3ludGF4KS5cbiAqIEJvdGggTW9kZWwgYW5kIERhdGEgZmFjZXQgYXJlIHN1Y2ggZGF0YSBzb3VyY2VzLCB0aGV5IGNhbiBiZSBsaW5rZWQgYnkgQ29ubmVjdG9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZHMxIHRoZSBmaXJzdCBkYXRhIHNvdXJjZS4gSW5zdGVhZCBvZiB0aGUgZmlyc3QgZGF0YSBzb3VyY2UgYW4gYXJyYXkgY2FuIGJlIHBhc3NlZCB3aXRoIGFycmF5cyBvZiBDb25uZWN0aW9uIG9iamVjdHMgcGFyYW1ldGVycyBpbiBlYWNoIGFycmF5IGVsZW1lbnQuXG4gKiBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcGFyYW0ge09iamVjdH0gZHMyIHRoZSBzZWNvbmQgZGF0YSBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAqL1xuZnVuY3Rpb24gbWluZGVyKGRzMSwgbW9kZSwgZHMyLCBvcHRpb25zKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHMxKSkge1xuICAgICAgICB2YXIgY29ubkRlc2NyaXB0aW9ucyA9IGRzMTtcbiAgICAgICAgdmFyIGNvbm5lY3RvcnMgPSBjb25uRGVzY3JpcHRpb25zLm1hcChmdW5jdGlvbihkZXNjcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0b3IoZGVzY3JbMF0sIGRlc2NyWzFdLCBkZXNjclsyXSwgZGVzY3JbM10pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29ubmVjdG9ycy5mb3JFYWNoKF9hZGRDb25uZWN0b3IpO1xuICAgICAgICByZXR1cm4gY29ubmVjdG9ycztcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY25jdCA9IG5ldyBDb25uZWN0b3IoZHMxLCBtb2RlLCBkczIsIG9wdGlvbnMpO1xuICAgICAgICBfYWRkQ29ubmVjdG9yKGNuY3QpO1xuICAgICAgICByZXR1cm4gY25jdDtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBtZXNzZW5nZXIgb2YgbWluZGVyIHdoZXJlIGl0IGVtaXRzIGV2ZW50cyByZWxhdGVkIHRvIGFsbCBjb25uZWN0b3JzXG4gKiBAdHlwZSB7TWVzc2VuZ2VyfVxuICovXG52YXIgX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobWluZGVyLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuXG5cbnZhciBfY29ubmVjdG9ycyA9IFtdXG4gICAgLCBfcmVjZWl2ZWRNZXNzYWdlcyA9IFtdXG4gICAgLCBfaXNQcm9wYWdhdGluZyA9IGZhbHNlO1xuXG5cbl8uZXh0ZW5kKG1pbmRlciwge1xuICAgIGdldENvbm5lY3RvcnM6IG1pbmRlcl9nZXRDb25uZWN0b3JzLFxuICAgIGdldEV4cGFuZGVkQ29ubmVjdGlvbnM6IG1pbmRlcl9nZXRFeHBhbmRlZENvbm5lY3Rpb25zLFxuICAgIGlzUHJvcGFnYXRpbmc6IG1pbmRlcl9pc1Byb3BhZ2F0aW5nLFxuICAgIHdoZW5Qcm9wYWdhdGlvbkNvbXBsZXRlZDogbWluZGVyX3doZW5Qcm9wYWdhdGlvbkNvbXBsZXRlZCxcbiAgICBkZXN0cm95Q29ubmVjdG9yOiBtaW5kZXJfZGVzdHJveUNvbm5lY3RvcixcbiAgICBkZXN0cm95OiBtaW5kZXJfZGVzdHJveVxufSk7XG5cblxuZnVuY3Rpb24gX2FkZENvbm5lY3RvcihjbmN0KSB7XG4gICAgY25jdC5fX19taW5kZXJfaWQgPSBfY29ubmVjdG9ycy5wdXNoKGNuY3QpIC0gMTtcbiAgICBjbmN0Lm9uKC8uKi8sIG9uQ29ubmVjdG9yTWVzc2FnZSk7XG4gICAgbWluZGVyLnBvc3RNZXNzYWdlKCdhZGRlZCcsIHsgY29ubmVjdG9yOiBjbmN0IH0pO1xuICAgIG1pbmRlci5wb3N0TWVzc2FnZSgndHVybmVkb24nLCB7IGNvbm5lY3RvcjogY25jdCB9KTtcbn1cblxuXG5mdW5jdGlvbiBvbkNvbm5lY3Rvck1lc3NhZ2UobXNnLCBkYXRhKSB7XG4gICAgdmFyIGRhdGEgPSBkYXRhID8gXy5jbG9uZShkYXRhKSA6IHt9O1xuICAgIF8uZXh0ZW5kKGRhdGEsIHtcbiAgICAgICAgaWQ6IHRoaXMuX19fbWluZGVyX2lkLFxuICAgICAgICBjb25uZWN0b3I6IHRoaXNcbiAgICB9KTtcbiAgICBtaW5kZXIucG9zdE1lc3NhZ2UobXNnLCBkYXRhKTtcbiAgICBpZiAoISBfcmVjZWl2ZWRNZXNzYWdlcy5sZW5ndGggJiYgISBfaXNQcm9wYWdhdGluZykge1xuICAgICAgICBfLmRlZmVyKF9pZGxlQ2hlY2spO1xuICAgICAgICBfaXNQcm9wYWdhdGluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgX3JlY2VpdmVkTWVzc2FnZXMucHVzaCh7IG1zZzogbXNnLCBkYXRhOiBkYXRhIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9pZGxlQ2hlY2soKSB7XG4gICAgaWYgKF9yZWNlaXZlZE1lc3NhZ2VzLmxlbmd0aCkge1xuICAgICAgICBfcmVjZWl2ZWRNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgICAgICBfLmRlZmVyKF9pZGxlQ2hlY2spO1xuICAgICAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ3Byb3BhZ2F0aW9udGlja2VkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2lzUHJvcGFnYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgbWluZGVyLnBvc3RNZXNzYWdlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBtaW5kZXJfaXNQcm9wYWdhdGluZygpIHtcbiAgICByZXR1cm4gX2lzUHJvcGFnYXRpbmc7XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX3doZW5Qcm9wYWdhdGlvbkNvbXBsZXRlZChjYWxsYmFjaykge1xuICAgIGlmIChfaXNQcm9wYWdhdGluZylcbiAgICAgICAgbWluZGVyLm9uY2UoJ3Byb3BhZ2F0aW9uY29tcGxldGVkJywgZXhlY3V0ZUNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXIoZXhlY3V0ZUNhbGxiYWNrKTtcblxuICAgIGZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjaygpIHtcbiAgICAgICAgaWYgKF9pc1Byb3BhZ2F0aW5nKVxuICAgICAgICAgICAgbWluZGVyLm9uY2UoJ3Byb3BhZ2F0aW9uY29tcGxldGVkJywgZXhlY3V0ZUNhbGxiYWNrKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2dldENvbm5lY3RvcnMob25PZmYpIHtcbiAgICBpZiAodHlwZW9mIG9uT2ZmID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gX2Nvbm5lY3RvcnM7XG5cbiAgICByZXR1cm4gX2Nvbm5lY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKGNuY3QpIHtcbiAgICAgICAgcmV0dXJuIGNuY3QuaXNPbiA9PT0gb25PZmY7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2Rlc3Ryb3lDb25uZWN0b3IoY25jdCkge1xuICAgIGNuY3QuZGVzdHJveSgpO1xuICAgIHZhciBpbmRleCA9IF9jb25uZWN0b3JzLmluZGV4T2YoY25jdCk7XG4gICAgaWYgKGluZGV4ID49IDApXG4gICAgICAgIGRlbGV0ZSBfY29ubmVjdG9yc1tpbmRleF07XG4gICAgZWxzZVxuICAgICAgICBsb2dnZXIud2FybignbWluZGVyOiBjb25uZWN0b3IgZGVzdHJveWVkIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gbWluZGVyJyk7XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2dldEV4cGFuZGVkQ29ubmVjdGlvbnMob25PZmYsIHNlYXJjaFN0cikge1xuICAgIHZhciBjb25uZWN0b3JzID0gbWluZGVyLmdldENvbm5lY3RvcnMob25PZmYpO1xuICAgIHZhciBjb25uZWN0aW9ucyA9ICBjb25uZWN0b3JzLm1hcChmdW5jdGlvbihjbmN0KSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgbGVmdFNvdXJjZTogX2dldEV4cGFuZGVkU291cmNlKGNuY3QuZHMxKSxcbiAgICAgICAgICAgIHJpZ2h0U291cmNlOiBfZ2V0RXhwYW5kZWRTb3VyY2UoY25jdC5kczIpLFxuICAgICAgICAgICAgbW9kZTogY25jdC5tb2RlLFxuICAgICAgICAgICAgaXNPbjogY25jdC5pc09uXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAoY25jdC5vcHRpb25zKVxuICAgICAgICAgICAgY29ubmVjdGlvbi5vcHRpb25zID0gY25jdC5vcHRpb25zO1xuXG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH0pO1xuXG4gICAgaWYgKHNlYXJjaFN0cilcbiAgICAgICAgY29ubmVjdGlvbnMgPSBjb25uZWN0aW9ucy5maWx0ZXIoZnVuY3Rpb24oY25jdG4pIHtcbiAgICAgICAgICAgIHJldHVybiBfc291cmNlTWF0Y2hlc1N0cmluZyhjbmN0bi5sZWZ0U291cmNlLCBzZWFyY2hTdHIpXG4gICAgICAgICAgICAgICAgICAgIHx8IF9zb3VyY2VNYXRjaGVzU3RyaW5nKGNuY3RuLnJpZ2h0U291cmNlLCBzZWFyY2hTdHIpO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb25uZWN0aW9ucztcbn1cblxuXG5mdW5jdGlvbiBfZ2V0RXhwYW5kZWRTb3VyY2UoZHMpIHtcbiAgICB2YXIgc291cmNlID0gW107XG4gICAgaWYgKHR5cGVvZiBkcyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChkcy5fbW9kZWwgJiYgZHMuX2FjY2Vzc1BhdGgpIHtcbiAgICAgICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzLl9hY2Nlc3NQYXRoKTtcbiAgICAgICAgICAgIGRzID0gZHMuX21vZGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlLnVuc2hpZnQoZHMpO1xuICAgICAgICBkcyA9IGRzLl9ob3N0T2JqZWN0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZHMgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgc291cmNlLnVuc2hpZnQoZHMpO1xuXG4gICAgICAgIGlmIChkcy5vd25lcilcbiAgICAgICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzLm93bmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5cbmZ1bmN0aW9uIF9zb3VyY2VNYXRjaGVzU3RyaW5nKHNvdXJjZSwgbWF0Y2hTdHIpIHtcbiAgICByZXR1cm4gc291cmNlLnNvbWUoZnVuY3Rpb24oc3JjTm9kZSkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gc3JjTm9kZS5jb25zdHJ1Y3RvciAmJiBzcmNOb2RlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIHJldHVybiBfc3RyaW5nTWF0Y2goY2xhc3NOYW1lLCBtYXRjaFN0cilcbiAgICAgICAgICAgICAgICB8fCBfc3RyaW5nTWF0Y2goc3JjTm9kZS5uYW1lLCBtYXRjaFN0cilcbiAgICAgICAgICAgICAgICB8fCBfc3RyaW5nTWF0Y2goc3JjTm9kZSwgbWF0Y2hTdHIpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9zdHJpbmdNYXRjaChzdHIsIHN1YnN0cikge1xuICAgIHJldHVybiBzdHIgJiYgdHlwZW9mIHN0ciA9PSAnc3RyaW5nJyAmJiBzdHIuaW5kZXhPZihzdWJzdHIpID49IDA7XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2Rlc3Ryb3koKSB7XG4gICAgX2Nvbm5lY3RvcnMuZm9yRWFjaChmdW5jdGlvbihjbmN0KSB7XG4gICAgICAgIGRlc3Ryb3lEUyhjbmN0LmRzMSk7XG4gICAgICAgIGRlc3Ryb3lEUyhjbmN0LmRzMik7XG4gICAgICAgIGNuY3QuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIF9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIG1pbmRlci5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3lEUyhkcykge1xuICAgICAgICBpZiAoZHMgJiYgIWRzLl9kZXN0cm95ZWQpIGRzLmRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJvY2VzcyBcImNoYW5nZWRhdGFcIiBtZXNzYWdlcyBlbWl0dGVkIGJ5IENvbm5lY3RvciBvYmplY3QuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2hhbmdlRGF0YUhhbmRsZXI7XG5cblxuXy5leHRlbmQoY2hhbmdlRGF0YUhhbmRsZXIsIHtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWc6IHNldFRyYW5zYWN0aW9uRmxhZyxcbiAgICBnZXRUcmFuc2FjdGlvbkZsYWc6IGdldFRyYW5zYWN0aW9uRmxhZyxcbiAgICBwYXNzVHJhbnNhY3Rpb25GbGFnOiBwYXNzVHJhbnNhY3Rpb25GbGFnLFxuICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkOiBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZFxufSk7XG5cblxuLyoqXG4gKiBDaGFuZ2UgZGF0YSB1c2VzIGhpZGRlbiBwcm9wZXJ0eSBvbiBhY2Nlc3NvciBtZXRob2RzIHRvIHBhc3MgZmxhZyB0aGF0IHRoZSBhY2Nlc3NvciBpcyBleGVjdXRlZCBhcyBhIHBhcnQgb2YgY2hhbmdlIHRyYW5zYWN0aW9uLlxuICogQWNjZXNzb3IgbWV0aG9kcyBhcmUgc3VwcG9zZWQgdG8gc3RvcmUgdGhpcyBmbGFnIGluIGEgbG9jYWwgdmFyaWFibGUgYW5kIHRvIGNsZWFyIGl0IChiZWNhdXNlIGFub3RoZXIgYWNjZXNzb3IgY2FuIGJlIGV4ZWN1dGVkIGluIG9yIG91dCBvZiB0cmFuc2FjdGlvbikgdXNpbmcgYGdldFRyYW5zYWN0aW9uRmxhZ2BcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBhY2Nlc3NvciBtZXRob2QgcmVmZXJlbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGZsYWcgYSBmbGFnIHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBzZXRUcmFuc2FjdGlvbkZsYWcoZnVuYywgZmxhZykge1xuICAgIF8uZGVmaW5lUHJvcGVydHkoZnVuYywgJ19faW5DaGFuZ2VUcmFuc2FjdGlvbicsIGZsYWcsIF8uQ09ORiB8IF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIGNsZWFycyB0cmFuc2FjdGlvbiBmbGFnIGZyb20gYWNjZXNzb3IgbWV0aG9kXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgYWNjZXNzb3IgbWV0aG9kIHJlZmVyZW5jZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25GbGFnKGZ1bmMpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGZ1bmMuX19pbkNoYW5nZVRyYW5zYWN0aW9uO1xuICAgIGRlbGV0ZSBmdW5jLl9faW5DaGFuZ2VUcmFuc2FjdGlvbjtcbiAgICByZXR1cm4gaW5UcmFuc2FjdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBwYXNzVHJhbnNhY3Rpb25GbGFnKGZyb21GdW5jLCB0b0Z1bmMpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhmcm9tRnVuYyk7XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRvRnVuYywgaW5UcmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIGluVHJhbnNhY3Rpb247XG59XG5cblxuLyoqXG4gKiBQb3N0cyBtZXNzYWdlIG9uIHRoaXMgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0cmFuc2FjdGlvbiB1bmxlc3MgYGluQ2hhbmdlVHJhbnNhY3Rpb25gIGlzIGB0cnVlYC5cbiAqL1xuZnVuY3Rpb24gcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQoKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZVN5bmMoJ2RhdGFjaGFuZ2VzJywgeyB0cmFuc2FjdGlvbjogZmFsc2UsIGNoYW5nZXM6IFtdIH0pO1xufVxuXG5cbi8qKlxuICogc3Vic2NyaWJlciB0byBcImNoYW5nZWRhdGFcIiBldmVudCBlbWl0dGVkIGJ5IFtDb25uZWN0b3JdKC4vY29ubmVjdG9yLmpzLmh0bWwpIG9iamVjdCB0byBlbmFibGUgcmVhY3RpdmUgY29ubmVjdGlvbnNcbiAqIFVzZWQgYnkgRGF0YSBmYWNldCwgTW9kZWwgYW5kIE1vZGVsUGF0aC4gQ2FuIGJlIHVzZWQgYnkgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgZ2V0L3NldC9kZWwvc3BsaWNlIGFwaSBhbmQgc2V0cyBkYXRhIGRlZXBseSB0byB0aGUgd2hvbGUgdHJlZS5cbiAqIE9iamVjdCBzaG91bGQgY2FsbCBgY2hhbmdlRGF0YUhhbmRsZXIuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpYCBpbiBpdHMgY29uc3RydWN0b3IuXG4gKiBUT0RPOiBvcHRpbWl6ZSBtZXNzYWdlcyBsaXN0IHRvIGF2b2lkIHNldHRpbmcgZHVwbGljYXRlIHZhbHVlcyBkb3duIHRoZSB0cmVlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyBzaG91bGQgYmUgXCJjaGFuZ2VkYXRhXCIgaGVyZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgYmF0Y2ggb2YgZGF0YSBjaGFuZ2UgZGVzY2lwdGlvbiBvYmplY3RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBjYWxsYmFjayB0byBjYWxsIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRhdGEgaXMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIGNoYW5nZURhdGFIYW5kbGVyKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgcHJvY2Vzc0NoYW5nZXMuY2FsbCh0aGlzLCBkYXRhLmNoYW5nZXMsIGNhbGxiYWNrKTtcbn1cblxuXG4vLyBtYXAgb2YgbWVzc2FnZSB0eXBlcyB0byBtZXRob2RzXG52YXIgQ0hBTkdFX1RZUEVfVE9fTUVUSE9EX01BUCA9IHtcbiAgICAnYWRkZWQnOiAgICdzZXQnLFxuICAgICdjaGFuZ2VkJzogJ3NldCcsXG4gICAgJ2RlbGV0ZWQnOiAnZGVsJyxcbiAgICAncmVtb3ZlZCc6ICdkZWwnXG59O1xuXG5cbi8qKlxuICogUHJvY2Vzc2VzIHF1ZXVlZCBcImNoYW5nZWRhdGFcIiBtZXNzYWdlcy5cbiAqIFBvc3RzIFwiY2hhbmdlc3RhcnRlZFwiIGFuZCBcImNoYW5nZWNvbXBsZXRlZFwiIG1lc3NhZ2VzIGFuZCBjYWxscyBjYWxsYmFja1xuICpcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2l0aCBgKG51bGwsIGZhbHNlKWAgcGFyYW1ldGVycyBiZWZvcmUgY2hhbmdlIHByb2Nlc3Npbmcgc3RhcnRzIGFuZCBgKG51bGwsIHRydWUpYCBhZnRlciBpdCdzIGZpbmlzaGVkLlxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2hhbmdlcyh0cmFuc2FjdGlvbiwgY2FsbGJhY2spIHtcbiAgICBub3RpZnkuY2FsbCh0aGlzLCBjYWxsYmFjaywgZmFsc2UpO1xuICAgIHByb2Nlc3NUcmFuc2FjdGlvbi5jYWxsKHRoaXMsXG4gICAgICAgIHByZXBhcmVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pKSk7XG4gICAgbm90aWZ5LmNhbGwodGhpcywgY2FsbGJhY2ssIHRydWUpO1xufVxuXG5cbmZ1bmN0aW9uIG5vdGlmeShjYWxsYmFjaywgY2hhbmdlRmluaXNoZWQpIHtcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhudWxsLCBjaGFuZ2VGaW5pc2hlZCk7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShjaGFuZ2VGaW5pc2hlZCA/ICdjaGFuZ2Vjb21wbGV0ZWQnIDogJ2NoYW5nZXN0YXJ0ZWQnKTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGFsbCBtZXNzYWdlcyBmcm9tIHRoZSB0cmFuc2FjdGlvbiBjb21lIGZyb20gdGhlIHNhbWUgc291cmNlLlxuICogSGFjazogcmV2ZXJzZXMgdGhlIHRyYW5zYWN0aW9uIGlmIGl0IGNvbWVzIGZyb20gdGhlIERhdGEgZmFjZXRcbiAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgdHJhbnNhY3Rpb24gKGZvciBjaGFpbmluZylcbiAqIFxuICogQHBhcmFtICB7QXJyYXl9IHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uIG9mIGRhdGEgY2hhbmdlc1xuICogQHJldHVybiB7QXJyYXl9IFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRyYW5zYWN0aW9uWzBdLnNvdXJjZVxuICAgICAgICAsIHNhbWVTb3VyY2UgPSB0cnVlO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IHRyYW5zYWN0aW9uLmxlbmd0aDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uW2ldLnNvdXJjZSAhPSBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2NoYW5nZWRhdGE6IGNoYW5nZXMgZnJvbSBkaWZmZXJlbnQgc291cmNlcyBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiwgc291cmNlczonLCB0cmFuc2FjdGlvbltpXS5zb3VyY2UubmFtZSwgc291cmNlLm5hbWUpO1xuICAgICAgICAgICAgICAgIHNhbWVTb3VyY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSB0cmFuc2FjdGlvbltpXS5zb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG5cbmZ1bmN0aW9uIHByZXBhcmVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHZhciB0b2RvID0gW11cbiAgICAgICAgLCBwYXRoc1RvU3BsaWNlID0gW11cbiAgICAgICAgLCBwYXRoc1RvQ2hhbmdlID0gW11cbiAgICAgICAgLCBoYWRTcGxpY2VcbiAgICAgICAgLCBleGl0TG9vcCA9IHt9O1xuXG5cbiAgICB0cnkgeyB0cmFuc2FjdGlvbi5mb3JFYWNoKGNoZWNrQ2hhbmdlKTsgfVxuICAgIGNhdGNoIChlKSB7IGlmIChlICE9IGV4aXRMb29wKSB0aHJvdyBlOyB9XG5cbiAgICByZXR1cm4gdG9kbztcblxuXG4gICAgZnVuY3Rpb24gY2hlY2tDaGFuZ2UoZGF0YSkge1xuICAgICAgICAoZGF0YS50eXBlID09ICdzcGxpY2UnID8gY2hlY2tTcGxpY2UgOiBjaGVja01ldGhvZCkoZGF0YSk7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjaGVja1NwbGljZShkYXRhKSB7XG4gICAgICAgIHZhciBwYXJzZWRQYXRoID0gcGF0aFV0aWxzLnBhcnNlQWNjZXNzUGF0aChkYXRhLnBhdGgpO1xuICAgICAgICB2YXIgcGFyZW50UGF0aENoYW5nZWQgPSBwYXRoc1RvQ2hhbmdlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDwgcGFyZW50UGF0aC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJlbnRQYXRoQ2hhbmdlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRvZG8ucHVzaChkYXRhKTtcblxuICAgICAgICBpZiAoISBjb25maWcuZGVidWcpIHRocm93IGV4aXRMb29wO1xuICAgICAgICBwYXRoc1RvU3BsaWNlLnB1c2gocGFyc2VkUGF0aCk7XG4gICAgICAgIGhhZFNwbGljZSA9IHRydWU7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjaGVja01ldGhvZChkYXRhKSB7XG4gICAgICAgIHZhciBwYXJzZWRQYXRoID0gcGF0aFV0aWxzLnBhcnNlQWNjZXNzUGF0aChkYXRhLnBhdGgpO1xuICAgICAgICB2YXIgcGFyZW50UGF0aFNwbGljZWQgPSBwYXRoc1RvU3BsaWNlICYmIHBhdGhzVG9TcGxpY2Uuc29tZShmdW5jdGlvbihwYXJlbnRQYXRoKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkUGF0aC5sZW5ndGggPD0gcGFyZW50UGF0aC5sZW5ndGhcbiAgICAgICAgICAgICAgICB8fCBwYXJzZWRQYXRoW3BhcmVudFBhdGgubGVuZ3RoXS5zeW50YXggIT0gJ2FycmF5JykgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIF9wYXRoSXNQYXJlbnRPZihwYXJlbnRQYXRoLCBwYXJzZWRQYXRoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBhcmVudFBhdGhTcGxpY2VkKSByZXR1cm47XG4gICAgICAgIGlmIChoYWRTcGxpY2UpIGxvZ2dlci5lcnJvcignY2hhbmdlZGF0YTogY2hpbGQgY2hhbmdlIGlzIGV4ZWN1dGVkIGFmdGVyIHNwbGljZTsgcHJvYmFibHkgZGF0YSBzb3VyY2UgZGlkIG5vdCBlbWl0IG1lc3NhZ2Ugd2l0aCBkYXRhLnR5cGU9PVwiZmluaXNoZWRcIicpO1xuXG4gICAgICAgIHZhciBwYXJlbnRQYXRoQ2hhbmdlZCA9IHBhdGhzVG9DaGFuZ2Uuc29tZShmdW5jdGlvbihwYXJlbnRQYXRoKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkUGF0aC5sZW5ndGggPD0gcGFyZW50UGF0aC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJlbnRQYXRoQ2hhbmdlZCkgcmV0dXJuO1xuXG4gICAgICAgIHBhdGhzVG9DaGFuZ2UucHVzaChwYXJzZWRQYXRoKTtcblxuICAgICAgICB0b2RvLnB1c2goZGF0YSk7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgY2hpbGRQYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnRQYXRoLmV2ZXJ5KGZ1bmN0aW9uKHBhdGhOb2RlLCBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGhOb2RlLnByb3BlcnR5ID09IGNoaWxkUGF0aFtpbmRleF0ucHJvcGVydHk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBwcm9jZXNzVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5mb3JFYWNoKHByb2Nlc3NDaGFuZ2UsIHRoaXMpO1xuICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgZmFsc2UpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZShkYXRhKSB7XG4gICAgICAgIHZhciBtb2RlbFBhdGggPSB0aGlzLnBhdGgoZGF0YS5wYXRoLCBkYXRhLnR5cGUgIT0gJ3JlbW92ZWQnICYmIGRhdGEudHlwZSAhPSAnZGVsZXRlZCcpO1xuICAgICAgICBpZiAoISBtb2RlbFBhdGgpIHJldHVybjtcbiAgICAgICAgKGRhdGEudHlwZSA9PSAnc3BsaWNlJyA/IGV4ZWN1dGVTcGxpY2UgOiBleGVjdXRlTWV0aG9kKShtb2RlbFBhdGgsIGRhdGEpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBleGVjdXRlU3BsaWNlKG1vZGVsUGF0aCwgZGF0YSkge1xuICAgIHZhciBpbmRleCA9IGRhdGEuaW5kZXhcbiAgICAgICAgLCBob3dNYW55ID0gZGF0YS5yZW1vdmVkLmxlbmd0aFxuICAgICAgICAsIHNwbGljZUFyZ3MgPSBbaW5kZXgsIGhvd01hbnldO1xuXG4gICAgc3BsaWNlQXJncyA9IHNwbGljZUFyZ3MuY29uY2F0KGRhdGEubmV3VmFsdWUuc2xpY2UoaW5kZXgsIGluZGV4ICsgZGF0YS5hZGRlZENvdW50KSk7XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1vZGVsUGF0aC5zcGxpY2UsIHRydWUpO1xuICAgIG1vZGVsUGF0aC5zcGxpY2UuYXBwbHkobW9kZWxQYXRoLCBzcGxpY2VBcmdzKTtcbn1cblxuXG5mdW5jdGlvbiBleGVjdXRlTWV0aG9kKG1vZGVsUGF0aCwgZGF0YSkge1xuICAgIHZhciBtZXRob2ROYW1lID0gQ0hBTkdFX1RZUEVfVE9fTUVUSE9EX01BUFtkYXRhLnR5cGVdO1xuICAgIGlmIChtZXRob2ROYW1lKSB7XG4gICAgICAgIHNldFRyYW5zYWN0aW9uRmxhZyhtb2RlbFBhdGhbbWV0aG9kTmFtZV0sIHRydWUpO1xuICAgICAgICBtb2RlbFBhdGhbbWV0aG9kTmFtZV0oZGF0YS5uZXdWYWx1ZSk7XG4gICAgfSBlbHNlXG4gICAgICAgIGxvZ2dlci5lcnJvcigndW5rbm93biBkYXRhIGNoYW5nZSB0eXBlJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNZXNzZW5nZXIgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXInKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3RvcjtcblxuXG52YXIgbW9kZVBhdHRlcm4gPSAvXihcXDwqKVxcLSsoXFw+KikkLztcblxuXG4vKipcbiAqIENvbm5lY3RvclxuICogQ2xhc3MgdGhhdCBjcmVhdGVzIGNvbm5lY3RvciBvYmplY3QgZm9yIGRhdGEgY29ubmVjdGlvbiBiZXR3ZWVuXG4gKiB0d28gZGF0YS1zb3VyY2VzXG4gKiBEYXRhLXNvdXJjZXMgc2hvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIEFQSTpcbiAqIGdldCgpIC0gZ2V0IHZhbHVlIGZyb20gZGF0YXNvdXJjZSBvciBpdHMgcGF0aFxuICogc2V0KHZhbHVlKSAtIHNldCB2YWx1ZSB0byBkYXRhc291cmNlIG9yIHRvIGl0cyBwYXRoXG4gKiBvbihwYXRoLCBzdWJzY3JpYmVyKSAtIHN1YnNjcmlwdGlvbiB0byBkYXRhIGNoYW5nZXMgd2l0aCBcIipcIiBzdXBwb3J0XG4gKiBvZmYocGF0aCwgc3Vic2NyaWJlcilcbiAqIHBhdGgoYWNjZXNzUGF0aCkgLSB0byByZXR1cm4gdGhlIG9iamVjdCB0aGF0IGdpdmVzIHJlZmVyZW5jZSB0byBzb21lIHBhcnQgb2YgZGF0YXNvdXJjZVxuICogYW5kIGNvbXBsaWVzIHdpdGggdGhhdCBhcGkgdG9vLlxuICpcbiAqICMjIyNFdmVudHMjIyMjXG4gKlxuICogLSAndHVybmVkb24nIC0gY29ubmVjdG9yIHdhcyB0dXJuZWQgb25cbiAqIC0gJ3R1cm5lZG9mZicgLSBjb25uZWN0b3Igd2FzIHR1cm5lZCBvZmZcbiAqIC0gJ2NoYW5nZXN0YXJ0ZWQnIC0gY2hhbmdlIG9uIGNvbm5lY3RlZCBkYXRhc291cmNlIGlzIHN0YXJ0ZWRcbiAqIC0gJ2NoYW5nZWNvbXBsZXRlZCcgLSBjaGFuZ2Ugb24gY29ubmVjdGVkIGRhdGFzb3VyY2UgaXMgY29tcGxldGVkXG4gKiAtICdkZXN0cm95ZWQnIC0gY29ubmVjdG9yIHdhcyBkZXN0cm95ZWRcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IGRzMSB0aGUgZmlyc3QgZGF0YSBzb3VyY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcGFyYW0ge09iamVjdH0gZHMyIHRoZSBzZWNvbmQgZGF0YSBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAqIEByZXR1cm4ge0Nvbm5lY3Rvcn0gd2hlbiBjYWxsZWQgd2l0aCBgbmV3YCwgY3JlYXRlcyBhIENvbm5lY3RvciBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvcihkczEsIG1vZGUsIGRzMiwgb3B0aW9ucykge1xuICAgIHNldHVwTW9kZS5jYWxsKHRoaXMsIG1vZGUpO1xuXG4gICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICBkczE6IGRzMSxcbiAgICAgICAgZHMyOiBkczIsXG4gICAgICAgIGlzT246IGZhbHNlLFxuICAgICAgICBfY2hhbmdlc1F1ZXVlMTogW10sXG4gICAgICAgIF9jaGFuZ2VzUXVldWUyOiBbXSxcbiAgICAgICAgX21lc3NlbmdlcjogbmV3IE1lc3Nlbmdlcih0aGlzLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpXG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIHZhciBwYXRoVHJhbnNsYXRpb24gPSBvcHRpb25zLnBhdGhUcmFuc2xhdGlvbjtcbiAgICAgICAgaWYgKHBhdGhUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgcGF0aFRyYW5zbGF0aW9uID0gXy5jbG9uZShwYXRoVHJhbnNsYXRpb24pO1xuICAgICAgICAgICAgdmFyIHBhdHRlcm5UcmFuc2xhdGlvbiA9IGdldFBhdHRlcm5UcmFuc2xhdGlvbnMocGF0aFRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwYXRoVHJhbnNsYXRpb24xOiByZXZlcnNlVHJhbnNsYXRpb25SdWxlcyhwYXRoVHJhbnNsYXRpb24pLFxuICAgICAgICAgICAgICAgIHBhdGhUcmFuc2xhdGlvbjI6IHBhdGhUcmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgICBwYXR0ZXJuVHJhbnNsYXRpb24xOiByZXZlcnNlUGF0dGVyblRyYW5zbGF0aW9uUnVsZXMocGF0dGVyblRyYW5zbGF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuVHJhbnNsYXRpb24yOiBwYXR0ZXJuVHJhbnNsYXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGFUcmFuc2xhdGlvbiA9IG9wdGlvbnMuZGF0YVRyYW5zbGF0aW9uO1xuICAgICAgICBpZiAoZGF0YVRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZGF0YVRyYW5zbGF0aW9uMTogZGF0YVRyYW5zbGF0aW9uWyc8LSddLFxuICAgICAgICAgICAgICAgIGRhdGFUcmFuc2xhdGlvbjI6IGRhdGFUcmFuc2xhdGlvblsnLT4nXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YVZhbGlkYXRpb24gPSBvcHRpb25zLmRhdGFWYWxpZGF0aW9uO1xuICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbjE6IGRhdGFWYWxpZGF0aW9uWyc8LSddLFxuICAgICAgICAgICAgICAgIGRhdGFWYWxpZGF0aW9uMjogZGF0YVZhbGlkYXRpb25bJy0+J11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50dXJuT24oKTtcbn1cblxuXG5mdW5jdGlvbiBzZXR1cE1vZGUobW9kZSl7XG4gICAgdmFyIHBhcnNlZE1vZGUgPSBtb2RlLm1hdGNoKG1vZGVQYXR0ZXJuKTtcblxuICAgIGlmICghIHBhcnNlZE1vZGUpXG4gICAgICAgIG1vZGVQYXJzZUVycm9yKCk7XG5cbiAgICB2YXIgZGVwdGgxID0gcGFyc2VkTW9kZVsxXS5sZW5ndGhcbiAgICAgICAgLCBkZXB0aDIgPSBwYXJzZWRNb2RlWzJdLmxlbmd0aDtcblxuICAgIGlmIChkZXB0aDEgJiYgZGVwdGgyICYmIGRlcHRoMSAhPSBkZXB0aDIpXG4gICAgICAgIG1vZGVQYXJzZUVycm9yKCk7XG5cbiAgICBpZiAoISBkZXB0aDEgJiYgISBkZXB0aDIpXG4gICAgICAgIG1vZGVQYXJzZUVycm9yKCk7XG5cbiAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgIGRlcHRoMTogZGVwdGgxLFxuICAgICAgICBkZXB0aDI6IGRlcHRoMixcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1vZGVQYXJzZUVycm9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgQ29ubmVjdG9yIG1vZGU6ICcgKyBtb2RlKTtcbiAgICB9XG59XG5cblxuXy5leHRlbmRQcm90byhDb25uZWN0b3IsIHtcbiAgICB0dXJuT246IENvbm5lY3RvciR0dXJuT24sXG4gICAgdHVybk9mZjogQ29ubmVjdG9yJHR1cm5PZmYsXG4gICAgZGVzdHJveTogQ29ubmVjdG9yJGRlc3Ryb3ksXG4gICAgY2hhbmdlTW9kZTogQ29ubmVjdG9yJGNoYW5nZU1vZGUsXG4gICAgZGVmZXJDaGFuZ2VNb2RlOiBDb25uZWN0b3IkZGVmZXJDaGFuZ2VNb2RlXG59KTtcblxuLyoqXG4gKiBGdW5jdGlvbiBjaGFuZ2UgdGhlIG1vZGUgb2YgdGhlIGNvbm5lY3Rpb25cbiAqXG4gKiBAcGFyYW0gQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHJldHVybiB7T2JqZWN0W1N0cmluZ119XG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciRjaGFuZ2VNb2RlKG1vZGUpIHtcbiAgICB0aGlzLnR1cm5PZmYoKTtcbiAgICBzZXR1cE1vZGUuY2FsbCh0aGlzLCBtb2RlKTtcbiAgICB0aGlzLnR1cm5PbigpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gY2hhbmdlIHRoZSBtb2RlIG9mIHRoZSBjb25uZWN0aW9uXG4gKlxuICogQHBhcmFtIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEByZXR1cm4ge09iamVjdFtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkZGVmZXJDaGFuZ2VNb2RlKG1vZGUpIHtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdjaGFuZ2VNb2RlJywgbW9kZSk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IHJldmVyc2VzIHRyYW5zbGF0aW9uIHJ1bGVzIGZvciBwYXRocyBvZiBjb25uZWN0ZWQgb2RhdGEgc291cmNlc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0W1N0cmluZ119IHJ1bGVzIG1hcCBvZiBwYXRocyBkZWZpbmluZyB0aGUgdHJhbnNsYXRpb24gcnVsZXNcbiAqIEByZXR1cm4ge09iamVjdFtTdHJpbmddfVxuICovXG5mdW5jdGlvbiByZXZlcnNlVHJhbnNsYXRpb25SdWxlcyhydWxlcykge1xuICAgIHZhciByZXZlcnNlUnVsZXMgPSB7fTtcbiAgICBfLmVhY2hLZXkocnVsZXMsIGZ1bmN0aW9uKHBhdGgyX3ZhbHVlLCBwYXRoMV9rZXkpIHtcbiAgICAgICAgcmV2ZXJzZVJ1bGVzW3BhdGgyX3ZhbHVlXSA9IHBhdGgxX2tleTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV2ZXJzZVJ1bGVzO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdHRlcm5UcmFuc2xhdGlvbnMocGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHBhdHRlcm5UcmFuc2xhdGlvbiA9IFtdO1xuICAgIF8uZWFjaEtleShwYXRoVHJhbnNsYXRpb24sIGZ1bmN0aW9uKHBhdGgyX3ZhbHVlLCBwYXRoMV9rZXkpIHtcbiAgICAgICAgdmFyIHN0YXJJbmRleDEgPSBwYXRoMV9rZXkuaW5kZXhPZignKicpXG4gICAgICAgICAgICAsIHN0YXJJbmRleDIgPSBwYXRoMl92YWx1ZS5pbmRleE9mKCcqJyk7XG4gICAgICAgIGlmIChzdGFySW5kZXgxID49IDAgJiYgc3RhckluZGV4MiA+PSAwKSB7IC8vIHBhdHRlcm4gdHJhbnNsYXRpb25cbiAgICAgICAgICAgIGlmIChwYXRoMV9rZXkuc2xpY2Uoc3RhckluZGV4MSkgIT0gcGF0aDJfdmFsdWUuc2xpY2Uoc3RhckluZGV4MikpXG4gICAgICAgICAgICAgICAgX3Rocm93SW52YWxpZFRyYW5zbGF0aW9uKHBhdGgxX2tleSwgcGF0aDJfdmFsdWUpO1xuICAgICAgICAgICAgZGVsZXRlIHBhdGhUcmFuc2xhdGlvbltwYXRoMV9rZXldOyAgICAgICAgICAgIFxuXG4gICAgICAgICAgICBwYXR0ZXJuVHJhbnNsYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgZnJvbVBhdHRlcm46IHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgocGF0aDFfa2V5KSxcbiAgICAgICAgICAgICAgICBmcm9tU3RhdGljUGF0aDogX2dldFN0YXRpY1BhdGgocGF0aDFfa2V5LCBzdGFySW5kZXgxKSxcbiAgICAgICAgICAgICAgICB0b1BhdHRlcm46IHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgocGF0aDJfdmFsdWUpLFxuICAgICAgICAgICAgICAgIHRvU3RhdGljUGF0aDogX2dldFN0YXRpY1BhdGgocGF0aDJfdmFsdWUsIHN0YXJJbmRleDIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGFySW5kZXgxID49IDAgfHwgc3RhckluZGV4MiA+PSAwKSAvLyBwYXR0ZXJuIG9ubHkgb24gb25lIHNpZGUgb2YgdHJhbnNsYXRpb25cbiAgICAgICAgICAgIF90aHJvd0ludmFsaWRUcmFuc2xhdGlvbihwYXRoMV9rZXksIHBhdGgyX3ZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwYXR0ZXJuVHJhbnNsYXRpb247XG5cblxuICAgIGZ1bmN0aW9uIF90aHJvd0ludmFsaWRUcmFuc2xhdGlvbihwYXRoMSwgcGF0aDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhdHRlcm4gdHJhbnNsYXRpb246ICcgKyBwYXRoMSArICcsICcgKyBwYXRoMik7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBfZ2V0U3RhdGljUGF0aChwYXRoLCBzdGFySW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvW1xcLlxcW10/XFwqLiokLywgJycpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiByZXZlcnNlUGF0dGVyblRyYW5zbGF0aW9uUnVsZXMocGF0dGVyblRyYW5zbGF0aW9uKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5UcmFuc2xhdGlvbi5tYXAoZnVuY3Rpb24ocHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZyb21QYXR0ZXJuOiBwdC50b1BhdHRlcm4sXG4gICAgICAgICAgICBmcm9tU3RhdGljUGF0aDogcHQudG9TdGF0aWNQYXRoLFxuICAgICAgICAgICAgdG9QYXR0ZXJuOiBwdC5mcm9tUGF0dGVybixcbiAgICAgICAgICAgIHRvU3RhdGljUGF0aDogcHQuZnJvbVN0YXRpY1BhdGhcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIHR1cm5PblxuICogTWV0aG9kIG9mIENvbm5lY3RvciB0aGF0IGVuYWJsZXMgY29ubmVjdGlvbiAoaWYgaXQgd2FzIHByZXZpb3VzbHkgZGlzYWJsZWQpXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciR0dXJuT24oKSB7XG4gICAgaWYgKHRoaXMuaXNPbilcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdkYXRhIHNvdXJjZXMgYXJlIGFscmVhZHkgY29ubmVjdGVkJyk7XG5cbiAgICB2YXIgc3Vic2NyaXB0aW9uUGF0aCA9IHRoaXMuX3N1YnNjcmlwdGlvblBhdGggPVxuICAgICAgICBuZXcgQXJyYXkodGhpcy5kZXB0aDEgfHwgdGhpcy5kZXB0aDIpLmpvaW4oJyonKTtcblxuICAgIHZhciBzdWJzY3JpcHRpb25QYXR0ZXJuID0gcGF0aFV0aWxzLmNyZWF0ZVJlZ2V4UGF0aChzdWJzY3JpcHRpb25QYXRoKTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5kZXB0aDEpXG4gICAgICAgIHRoaXMuX2xpbmsxID0gbGlua0RhdGFTb3VyY2UoJ19saW5rMicsIHRoaXMuZHMyLCB0aGlzLmRzMSwgdGhpcy5fY2hhbmdlc1F1ZXVlMSwgdGhpcy5wYXRoVHJhbnNsYXRpb24xLCB0aGlzLnBhdHRlcm5UcmFuc2xhdGlvbjEsIHRoaXMuZGF0YVRyYW5zbGF0aW9uMSwgdGhpcy5kYXRhVmFsaWRhdGlvbjEpO1xuICAgIGlmICh0aGlzLmRlcHRoMilcbiAgICAgICAgdGhpcy5fbGluazIgPSBsaW5rRGF0YVNvdXJjZSgnX2xpbmsxJywgdGhpcy5kczEsIHRoaXMuZHMyLCB0aGlzLl9jaGFuZ2VzUXVldWUyLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjIsIHRoaXMucGF0dGVyblRyYW5zbGF0aW9uMiwgdGhpcy5kYXRhVHJhbnNsYXRpb24yLCB0aGlzLmRhdGFWYWxpZGF0aW9uMik7XG5cbiAgICB0aGlzLmlzT24gPSB0cnVlO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ3R1cm5lZG9uJyk7XG5cblxuICAgIGZ1bmN0aW9uIGxpbmtEYXRhU291cmNlKHJldmVyc2VMaW5rLCBmcm9tRFMsIHRvRFMsIGNoYW5nZXNRdWV1ZSwgcGF0aFRyYW5zbGF0aW9uLCBwYXR0ZXJuVHJhbnNsYXRpb24sIGRhdGFUcmFuc2xhdGlvbiwgZGF0YVZhbGlkYXRpb24pIHtcbiAgICAgICAgZnJvbURTLm9uU3luYygnZGF0YWNoYW5nZXMnLCBvbkRhdGEpO1xuICAgICAgICByZXR1cm4gb25EYXRhO1xuXG4gICAgICAgIGZ1bmN0aW9uIG9uRGF0YShtZXNzYWdlLCBiYXRjaCkge1xuICAgICAgICAgICAgdmFyIHNlbmREYXRhID0ge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IFtdLFxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBiYXRjaC50cmFuc2FjdGlvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBiYXRjaC5jaGFuZ2VzLmZvckVhY2goZnVuY3Rpb24oY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZVBhdGggPSBjaGFuZ2UucGF0aFxuICAgICAgICAgICAgICAgICAgICAsIHRhcmdldFBhdGggPSB0cmFuc2xhdGVQYXRoKHNvdXJjZVBhdGgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRQYXRoID09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICB2YXIgY2hhbmdlID0gXy5jbG9uZShjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIF8uZXh0ZW5kKGNoYW5nZSwge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZyb21EUyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogdGFyZ2V0UGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIHZhbGlkYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghIGNoYW5nZXNRdWV1ZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgXy5kZWZlcihwb3N0Q2hhbmdlRGF0YSk7XG5cbiAgICAgICAgICAgIGNoYW5nZXNRdWV1ZS5wdXNoKHNlbmREYXRhKTtcblxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVQYXRoKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUGF0aCA9IHBhdGhUcmFuc2xhdGlvbltzb3VyY2VQYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZWRQYXRoKSByZXR1cm4gdHJhbnNsYXRlZFBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGF0dGVyblRyYW5zbGF0aW9uLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHQgPSBfLmZpbmQocGF0dGVyblRyYW5zbGF0aW9uLCBmdW5jdGlvbihwVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwVHJhbnNsYXRpb24uZnJvbVBhdHRlcm4udGVzdChzb3VyY2VQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZWRQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKHB0LmZyb21TdGF0aWNQYXRoLCBwdC50b1N0YXRpY1BhdGgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISAoKHN1YnNjcmlwdGlvblBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHN1YnNjcmlwdGlvblBhdHRlcm4udGVzdChzb3VyY2VQYXRoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN1YnNjcmlwdGlvblBhdHRlcm4gPT0gc291cmNlUGF0aCkpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkUGF0aCB8fCBzb3VyY2VQYXRoO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlID0gZGF0YVRyYW5zbGF0aW9uW3NvdXJjZVBhdGhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRlICYmIHR5cGVvZiB0cmFuc2xhdGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm9sZFZhbHVlID0gdHJhbnNsYXRlKGNoYW5nZS5vbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UubmV3VmFsdWUgPSB0cmFuc2xhdGUoY2hhbmdlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHByb3BhZ2F0ZURhdGEoY2hhbmdlKTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsaWRhdG9ycyA9IGRhdGFWYWxpZGF0aW9uW3NvdXJjZVBhdGhdXG4gICAgICAgICAgICAgICAgICAgICAgICAsIHBhc3NlZENvdW50ID0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgLCBhbHJlYWR5RmFpbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLmZvckVhY2goY2FsbFZhbGlkYXRvcik7ICAgXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsVmFsaWRhdG9yKHZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IoY2hhbmdlLm5ld1ZhbHVlLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wYXRoID0gc291cmNlUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGFscmVhZHlGYWlsZWQgJiYgKGVyciB8fCByZXNwb25zZS52YWxpZCkgJiYgKytwYXNzZWRDb3VudCA9PSB2YWxpZGF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21EUy5wb3N0TWVzc2FnZSgndmFsaWRhdGVkJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghIHJlc3BvbnNlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbURTLnBvc3RNZXNzYWdlKCd2YWxpZGF0ZWQnLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwcm9wYWdhdGVEYXRhKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHNlbmREYXRhLmNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RDaGFuZ2VEYXRhKCkge1xuICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZW5kbGVzcyBsb29wIG9mIHVwZGF0ZXMgZm9yIDItd2F5IGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICBpZiAoc2VsZltyZXZlcnNlTGlua10pIHZhciBjYWxsYmFjayA9IHN1YnNjcmlwdGlvblN3aXRjaDtcblxuICAgICAgICAgICAgICAgIHZhciB0cmFuc2FjdGlvbnMgPSBtZXJnZVRyYW5zYWN0aW9ucyhjaGFuZ2VzUXVldWUpO1xuICAgICAgICAgICAgICAgIGNoYW5nZXNRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZGF0YSBjaGFuZ2UgaW5zdHJ1Y3Rpb24gYXMgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICB0b0RTLnBvc3RNZXNzYWdlU3luYygnY2hhbmdlZGF0YScsIHsgY2hhbmdlczogdHJhbnNhY3Rpb24gfSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHN1YnNjcmlwdGlvblN3aXRjaChlcnIsIGNoYW5nZUZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZhciBvbk9mZiA9IGNoYW5nZUZpbmlzaGVkID8gJ29uU3luYycgOiAnb2ZmJztcbiAgICAgICAgICAgICAgICB0b0RTW29uT2ZmXSgnZGF0YWNoYW5nZXMnLCBzZWxmW3JldmVyc2VMaW5rXSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGNoYW5nZUZpbmlzaGVkID8gJ2NoYW5nZWNvbXBsZXRlZCcgOiAnY2hhbmdlc3RhcnRlZCc7XG4gICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShtZXNzYWdlLCB7IHNvdXJjZTogZnJvbURTLCB0YXJnZXQ6IHRvRFMgfSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gbWVyZ2VUcmFuc2FjdGlvbnMoYmF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHZhciB0cmFuc2FjdGlvbnMgPSBbXVxuICAgICAgICAgICAgICAgICAgICAsIGN1cnJlbnRUcmFuc2FjdGlvbjtcblxuICAgICAgICAgICAgICAgIGJhdGNoZXMuZm9yRWFjaChmdW5jdGlvbihiYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISBiYXRjaC50cmFuc2FjdGlvbikgY3VycmVudFRyYW5zYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISBiYXRjaC5jaGFuZ2VzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChiYXRjaC50cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUcmFuc2FjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmFwcGVuZEFycmF5KGN1cnJlbnRUcmFuc2FjdGlvbiwgYmF0Y2guY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhbnNhY3Rpb24gPSBfLmNsb25lKGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKGN1cnJlbnRUcmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLnB1c2goYmF0Y2guY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8qKlxuICogdHVybk9mZlxuICogTWV0aG9kIG9mIENvbm5lY3RvciB0aGF0IGRpc2FibGVzIGNvbm5lY3Rpb24gKGlmIGl0IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQpXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciR0dXJuT2ZmKCkge1xuICAgIGlmICghIHRoaXMuaXNPbilcbiAgICAgICAgcmV0dXJuIGxvZ2dlci53YXJuKCdkYXRhIHNvdXJjZXMgYXJlIGFscmVhZHkgZGlzY29ubmVjdGVkJyk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdW5saW5rRGF0YVNvdXJjZSh0aGlzLmRzMSwgJ19saW5rMicsIHRoaXMucGF0aFRyYW5zbGF0aW9uMik7XG4gICAgdW5saW5rRGF0YVNvdXJjZSh0aGlzLmRzMiwgJ19saW5rMScsIHRoaXMucGF0aFRyYW5zbGF0aW9uMSk7XG5cbiAgICB0aGlzLmlzT24gPSBmYWxzZTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCd0dXJuZWRvZmYnKTtcblxuXG4gICAgZnVuY3Rpb24gdW5saW5rRGF0YVNvdXJjZShmcm9tRFMsIGxpbmtOYW1lLCBwYXRoVHJhbnNsYXRpb24pIHtcbiAgICAgICAgaWYgKHNlbGZbbGlua05hbWVdKSB7XG4gICAgICAgICAgICBmcm9tRFMub2ZmKCdkYXRhY2hhbmdlcycsIHNlbGZbbGlua05hbWVdKTtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmW2xpbmtOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIGNvbm5lY3RvciBvYmplY3QgYnkgdHVybmluZyBpdCBvZmYgYW5kIHJlbW92aW5nIHJlZmVyZW5jZXMgdG8gY29ubmVjdGVkIHNvdXJjZXNcbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJGRlc3Ryb3koKSB7XG4gICAgdGhpcy50dXJuT2ZmKCk7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnZGVzdHJveWVkJyk7XG4gICAgdGhpcy5fbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICBkZWxldGUgdGhpcy5kczE7XG4gICAgZGVsZXRlIHRoaXMuZHMyO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNb2RlbFBhdGggPSByZXF1aXJlKCcuL21fcGF0aCcpXG4gICAgLCBzeW50aGVzaXplID0gcmVxdWlyZSgnLi9zeW50aGVzaXplJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBtb2RlbFV0aWxzID0gcmVxdWlyZSgnLi9tb2RlbF91dGlscycpXG4gICAgLCBjaGFuZ2VEYXRhSGFuZGxlciA9IHJlcXVpcmUoJy4vY2hhbmdlX2RhdGEnKVxuICAgICwgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyJylcbiAgICAsIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXIvbXNuZ3Jfc291cmNlJylcbiAgICAsIE1vZGVsTXNnQVBJID0gcmVxdWlyZSgnLi9tX21zZ19hcGknKVxuICAgICwgTWl4aW4gPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9taXhpbicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWw7XG5cblxuLyoqXG4gKiBgbWlsby5Nb2RlbGBcbiAqIE1vZGVsIGNsYXNzIGluc3RhbnRpYXRlcyBvYmplY3RzIHRoYXQgYWxsb3cgZGVlcCBkYXRhIGFjY2VzcyB3aXRoIF9fc2FmZSBnZXR0ZXJzX18gdGhhdCByZXR1cm4gdW5kZWZpbmVkIChyYXRoZXIgdGhhbiB0aHJvd2luZyBleGNlcHRpb24pIHdoZW4gcHJvcGVydGllcy9pdGVtcyBvZiB1bmV4aXN0aW5nIG9iamVjdHMvYXJyYXlzIGFyZSByZXF1ZXN0ZWQgYW5kIF9fc2FmZSBzZXR0ZXJzX18gdGhhdCBjcmVhdGUgb2JqZWN0IHRyZWVzIHdoZW4gcHJvcGVydGllcy9pdGVtcyBvZiB1bmV4aXN0aW5nIG9iamVjdHMvYXJyYXlzIGFyZSBzZXQgYW5kIGFsc28gcG9zdCBtZXNzYWdlcyB0byBhbGxvdyBzdWJzY3JpcHRpb24gb24gY2hhbmdlcyBhbmQgZW5hYmxlIGRhdGEgcmVhY3Rpdml0eS5cbiAqIFJlYWN0aXZpdHkgaXMgaW1wbGVtZW1udGVkIHZpYSBbQ29ubmVjdG9yXSguL2Nvbm5lY3Rvci5qcy5odG1sKSB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgZWl0aGVyIGRpcmVjdGx5IG9yIHdpdGggbW9yZSBjb252ZW5pZW50IGludGVyZmFjZSBvZiBbbWlsby5taW5kZXJdKC4uL21pbmRlci5qcy5odG1sKS4gQXQgdGhlIG1vbWVudCBtb2RlbCBjYW4gYmUgY29ubmVjdGVkIHRvIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgb3IgdG8gYW5vdGhlciBtb2RlbCBvciBbTW9kZWxQYXRoXSguL21fcGF0aC5qcy5odG1sKS5cbiAqIE1vZGVsIGNvbnN0cnVjdG9yIHJldHVybnMgb2JqZWN0cyB0aGF0IGFyZSBmdW5jdGlvbnMgYXQgdGhlIHNhbWUgdGltZTsgd2hlbiBjYWxsZWQgdGhleSByZXR1cm4gTW9kZWxQYXRoIG9iamVjdHMgdGhhdCBhbGxvdyBnZXQvc2V0IGFjY2VzcyB0byBhbnkgcG9pbnQgaW4gbW9kZWwgZGF0YS4gU2VlIFtNb2RlbERhdGFdKCNNb2RlbERhdGEpIGJlbG93LlxuICpcbiAqIFlvdSBjYW4gc3Vic2NyaWJlIHRvIG1vZGVsIGNoYW5nZXMgd2l0aCBgb25gIG1ldGhvZCBieSBwYXNzaW5nIG1vZGVsIGFjY2VzcyBwYXRoIGluIHBsYWNlIG9mIG1lc3NhZ2UsIHBhdHRlcm4gb3Igc3RyaW5nIHdpdGggYW55IG51bWJlciBvZiBzdGFycyB0byBzdWJzY3JpYmUgdG8gYSBjZXJ0YWluIGRlcHRoIGluIG1vZGVsIChlLmcuLCBgJyoqKidgIHRvIHN1YnNjcmliZSB0byB0aHJlZSBsZXZlbHMpLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGRhdGEgb3B0aW9uYWwgaW5pdGlhbCBhcnJheSBkYXRhLiBJZiBpdCBpcyBwbGFubmVkIHRvIGNvbm5lY3QgbW9kZWwgdG8gdmlldyBpdCBpcyB1c3VhbGx5IGJldHRlciB0byBpbnN0YW50aWF0ZSBhbiBlbXB0eSBNb2RlbCAoYHZhciBtID0gbmV3IE1vZGVsYCksIGNvbm5lY3QgaXQgdG8gW0NvbXBvbmVudF0oLi4vY29tcG9uZW50cy9jX2NsYXNzLmpzLmh0bWwpJ3MgW0RhdGEgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRGF0YS5qcy5odG1sKSAoZS5nLiwgYG1pbG8ubWluZGVyKG0sICc8PC0+PicsIGMuZGF0YSk7YCkgYW5kIHRoZW4gc2V0IHRoZSBtb2RlbCB3aXRoIGBtLnNldChkYXRhKWAgLSB0aGUgdmlldyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IG9wdGlvbmFsIG9iamVjdCB0aGF0IGhvc3RzIG1vZGVsIG9uIG9uZSBvZiBpdHMgcHJvcGVydGllcy4gQ2FuIGJlIHVzZWQgd2hlbiBtb2RlbCBpdHNlbGYgaXMgdGhlIGNvbnRleHQgb2YgdGhlIG1lc3NhZ2Ugc3Vic2NyaWJlciBhbmQgeW91IG5lZWQgdG8gdHJhdmVycyB0byB0aGlzIG9iamVjdCAoYWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gc2V0IGFueSBjb250ZXh0KS4gQ2FuIGFsc28gYmUgdXNlZCB0byBwcm94eSBtb2RlbCdzIG1ldGhvZHMgdG8gdGhlIGhvc3QgbGlrZSBbTW9kZWwgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvTW9kZWxGYWNldC5qcy5odG1sKSBpcyBkb2luZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHBhc3MgeyByZWFjdGl2ZTogZmFsc2UgfSB0byB1c2UgbW9kZWwgd2l0aG91dCBtZXNzYWdpbmcgd2hlbiBpdCBpcyBub3QgbmVlZGVkIC0gaXQgbWFrZXMgaXQgbXVjaCBmYXN0ZXJcbiAqIEByZXR1cm4ge01vZGVsfVxuICovXG5mdW5jdGlvbiBNb2RlbChkYXRhLCBob3N0T2JqZWN0LCBvcHRpb25zKSB7XG4gICAgLy8gYG1vZGVsYCB3aWxsIGJlIHJldHVybmVkIGJ5IGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgYHRoaXNgLiBgbW9kZWxgXG4gICAgLy8gKGBtb2RlbFBhdGhgIGZ1bmN0aW9uKSBzaG91bGQgcmV0dXJuIGEgTW9kZWxQYXRoIG9iamVjdCB3aXRoIFwic3ludGhlc2l6ZWRcIiBtZXRob2RzXG4gICAgLy8gdG8gZ2V0L3NldCBtb2RlbCBwcm9wZXJ0aWVzLCB0byBzdWJzY3JpYmUgdG8gcHJvcGVydHkgY2hhbmdlcywgZXRjLlxuICAgIC8vIEFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIG1vZGVsUGF0aCBjYW4gYmUgdXNlZCBpbiB0aGUgcGF0aCB1c2luZyBpbnRlcnBvbGF0aW9uIC0gc2VlIE1vZGVsUGF0aCBiZWxvdy5cbiAgICB2YXIgbW9kZWwgPSBmdW5jdGlvbiBtb2RlbFBhdGgoYWNjZXNzUGF0aCkgeyAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgICAgICByZXR1cm4gTW9kZWwkcGF0aC5hcHBseShtb2RlbCwgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIG1vZGVsLl9fcHJvdG9fXyA9IE1vZGVsLnByb3RvdHlwZTtcblxuICAgIG1vZGVsLl9ob3N0T2JqZWN0ID0gaG9zdE9iamVjdDtcbiAgICBtb2RlbC5fb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAobW9kZWwuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgIG1vZGVsLl9wcmVwYXJlTWVzc2VuZ2VycygpO1xuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZSB0byBlbmFibGUgcmVhY3RpdmUgY29ubmVjdGlvbnNcbiAgICAgICAgbW9kZWwub25TeW5jKCdjaGFuZ2VkYXRhJywgY2hhbmdlRGF0YUhhbmRsZXIpO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSBtb2RlbC5fZGF0YSA9IGRhdGE7XG5cbiAgICByZXR1cm4gbW9kZWw7XG59XG5cbk1vZGVsLnByb3RvdHlwZS5fX3Byb3RvX18gPSBNb2RlbC5fX3Byb3RvX187XG5cblxuLyoqXG4gKiAjIyMjTW9kZWwgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtwYXRoXSgjcGF0aCkgLSByZXR1cm5zIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIGFueSBwb2ludCBpbiBNb2RlbFxuICogLSBbZ2V0XSgjTW9kZWwkZ2V0KSAtIGdldCBtb2RlbCBkYXRhXG4gKiAtIHNldCAtIHNldCBtb2RlbCBkYXRhLCBzeW50aGVzaXplZFxuICogLSBzcGxpY2UgLSBzcGxpY2UgbW9kZWwgZGF0YSAoYXMgYXJyYXkgb3IgcHNldWRvLWFycmF5KSwgc3ludGhlc2l6ZWRcbiAqIC0gW2xlbl0oLi9tX3BhdGguanMuaHRtbCNNb2RlbFBhdGgkbGVuKSAtIHJldHVybnMgbGVuZ3RoIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsIGluIHNhZmUgd2F5LCAwIGlmIG5vIGxlbmd0aCBpcyBzZXRcbiAqIC0gW3B1c2hdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHB1c2gpIC0gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3BvcF0oLi9tX3BhdGguanMuaHRtbCNNb2RlbFBhdGgkcG9wKSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbFxuICogLSBbdW5zaGlmdF0oLi9tX3BhdGguanMuaHRtbCNNb2RlbFBhdGgkdW5zaGlmdCkgLSBhZGQgaXRlbXMgdG8gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbFxuICogLSBbc2hpZnRdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHNoaWZ0KSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbFxuICogLSBbcHJveHlNZXNzZW5nZXJdKCNwcm94eU1lc3NlbmdlcikgLSBwcm94eSBtb2RlbCdzIE1lc3NlbmdlciBtZXRob2RzIHRvIGhvc3Qgb2JqZWN0XG4gKiAtIFtwcm94eU1ldGhvZHNdKCNwcm94eU1ldGhvZHMpIC0gcHJveHkgbW9kZWwgbWV0aG9kcyB0byBob3N0IG9iamVjdFxuICovXG5fLmV4dGVuZFByb3RvKE1vZGVsLCB7XG4gICAgcGF0aDogTW9kZWwkcGF0aCxcbiAgICBnZXQ6IE1vZGVsJGdldCxcbiAgICBwcm94eU1lc3NlbmdlcjogcHJveHlNZXNzZW5nZXIsIC8vIGRlcHJlY2F0ZWQsIHNob3VsZCBub3QgYmUgdXNlZFxuICAgIHByb3h5TWV0aG9kczogcHJveHlNZXRob2RzLFxuICAgIF9wcmVwYXJlTWVzc2VuZ2VyczogX3ByZXBhcmVNZXNzZW5nZXJzLFxuICAgIF9nZXRIb3N0T2JqZWN0OiBfZ2V0SG9zdE9iamVjdCxcbiAgICBkZXN0cm95OiBNb2RlbCRkZXN0cm95XG59KTtcblxuLy8gc2V0LCBkZWwsIHNwbGljZSBhcmUgYWRkZWQgdG8gbW9kZWxcbl8uZXh0ZW5kUHJvdG8oTW9kZWwsIHN5bnRoZXNpemUubW9kZWxNZXRob2RzKTtcblxuXG4vKipcbiAqIC0gUGF0aDogTW9kZWxQYXRoIGNsYXNzIGFzIGBtaWxvLk1vZGVsLlBhdGhgXG4gKi9cbl8uZXh0ZW5kKE1vZGVsLCB7XG4gICAgUGF0aDogTW9kZWxQYXRoLFxuICAgIHVzZVdpdGg6IE1vZGVsJCR1c2VXaXRoLFxuICAgIF91dGlsczoge1xuICAgICAgICBwYXRoOiBwYXRoVXRpbHMsXG4gICAgICAgIG1vZGVsOiBtb2RlbFV0aWxzLFxuICAgICAgICBjaGFuZ2VEYXRhSGFuZGxlcjogY2hhbmdlRGF0YUhhbmRsZXJcbiAgICB9XG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBGYWNldCBwcm90b3R5cGVcbiAqL1xudmFyIE1FU1NFTkdFUl9QUk9QRVJUWSA9ICdfbWVzc2VuZ2VyJztcbk1lc3Nlbmdlci51c2VXaXRoKE1vZGVsLCBNRVNTRU5HRVJfUFJPUEVSVFksIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBNb2RlbCBwcm90b3R5cGVcbiAqL1xuWydsZW4nLCAncHVzaCcsICdwb3AnLCAndW5zaGlmdCcsICdzaGlmdCddLmZvckVhY2goZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBNb2RlbFBhdGgucHJvdG90eXBlW21ldGhvZE5hbWVdO1xuICAgIF8uZGVmaW5lUHJvcGVydHkoTW9kZWwucHJvdG90eXBlLCBtZXRob2ROYW1lLCBtZXRob2QpO1xufSk7XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBHZXQgbW9kZWwgZGF0YS5cbiAqXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgTW9kZWxQYXRoIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIHNhbWUgQVBJIGFzIG1vZGVsIGJ1dCBhbGxvd3MgYWNjZXNzIHRvIGFueSBwb2ludCBpbnNpZGUgbW9kZWwgYXMgZGVmaW5lZCBieSBgYWNjZXNzUGF0aGAuXG4gKiBTZWUgW01vZGVsUGF0aF0oLi9tX3BhdGguanMuaHRtbCkgY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggc3RyaW5nIHRoYXQgZGVmaW5lcyBwYXRoIHRvIGFjY2VzcyBtb2RlbC5cbiAqICBQYXRoIHN0cmluZyBjb25zaXN0cyBvZiBwYXJ0cyB0byBkZWZpbmUgZWl0aGVyIHByb3BlcnR5IGFjY2VzcyAoYFwiLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IG5hbWUpIG9yIGFycmF5IGl0ZW0gYWNjZXNzIChgXCJbMV1cImAgdG8gYWNjZXNzIGl0ZW0gd2l0aCBpbmRleCAxKS5cbiAqICBBY2Nlc3MgcGF0aCBjYW4gY29udGFpbiBhcyBtYW55IHBhcnRzIGFzIG5lY2Vzc2FyeSAoZS5nLiBgXCIubGlzdFswXS5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBgbmFtZWAgaW4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgYXJyYXkgc3RvcmVkIGluIHByb3BlcnR5IGBsaXN0YC5cbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnRlcnBvbGF0ZWQgcGF0aHMuXG4gKiAgRS5nLiBgbS5wYXRoKFwiWyQxXS4kMlwiLCBpZCwgcHJvcClgIHJldHVybnMgTW9kZWxQYXRoIHRvIGFjY2VzcyBwcm9wZXJ0eSB3aXRoIG5hbWUgYHByb3BgIGluIGFycmF5IGl0ZW0gd2l0aCBpbmRleCBgaWRgLiBBbHRob3VnaCB0aGlzIE1vZGVsUGF0aCBvYmplY3Qgd2lsbCB3b3JrIGV4YWN0bHkgYXMgYG0oXCJbXCIgKyBpZCArIFwiXS5cIiArIHByb3ApYCwgdGhlIGludGVycG9sYXRlZCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IGFzIE1vZGVsUGF0aCB3aXRoIGludGVycG9sYXRpb24gd2lsbCBub3Qgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycywgd2hpbGUgTW9kZWxQYXRoIHdpdGggY29tcHV0ZWQgYWNjZXNzIHBhdGggd2lsbCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciBlYWNoIHBhaXIgb2YgdmFsdWVzIG9mIGBpZGAgYW5kIGBwcm9wYC5cbiAqIEByZXR1cm4ge01vZGVsUGF0aH1cbiAqL1xuZnVuY3Rpb24gTW9kZWwkcGF0aChhY2Nlc3NQYXRoKSB7ICAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgIGlmICghIGFjY2Vzc1BhdGgpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gXCJudWxsXCIgaXMgY29udGV4dCB0byBwYXNzIHRvIE1vZGVsUGF0aCwgZmlyc3QgcGFyYW1ldGVyIG9mIGJpbmRcbiAgICAvLyBcInRoaXNcIiAobW9kZWwpIGlzIGFkZGVkIGluIGZyb250IG9mIGFsbCBhcmd1bWVudHNcbiAgICBfLnNwbGljZShhcmd1bWVudHMsIDAsIDAsIG51bGwsIHRoaXMpO1xuXG4gICAgLy8gY2FsbGluZyBNb2RlbFBhdGggY29uc3RydWN0b3Igd2l0aCBuZXcgYW5kIHRoZSBsaXN0IG9mIGFyZ3VtZW50czogdGhpcyAobW9kZWwpLCBhY2Nlc3NQYXRoLCAuLi5cbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShNb2RlbFBhdGgsIGFyZ3VtZW50cykpO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogUHJveHkgbW9kZWwncyBNZXNzZW5nZXIgbWV0aG9kcyB0byBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kZWxIb3N0T2JqZWN0IG9wdGlvbmFsIGhvc3Qgb2JqZWN0LiBJZiBub3QgcGFzc2VkLCBob3N0T2JqZWN0IHBhc3NlZCB0byBNb2RlbCBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3h5TWVzc2VuZ2VyKG1vZGVsSG9zdE9iamVjdCkge1xuICAgIG1vZGVsSG9zdE9iamVjdCA9IG1vZGVsSG9zdE9iamVjdCB8fCB0aGlzLl9ob3N0T2JqZWN0O1xuICAgIE1peGluLnByb3RvdHlwZS5fY3JlYXRlUHJveHlNZXRob2RzLmNhbGwodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMsIG1vZGVsSG9zdE9iamVjdCk7XG59XG5cblxudmFyIG1vZGVsTWV0aG9kc1RvUHJveHkgPSBbJ3BhdGgnLCAnZ2V0JywgJ3NldCcsICdkZWwnLCAnc3BsaWNlJywgJ2xlbicsICdwdXNoJywgJ3BvcCcsICd1bnNoaWZ0JywgJ3NoaWZ0J107XG5cblxuLyoqXG4gKiBFeHBvc2UgbW9kZWwgbWV0aG9kcyBvblxuICogU2VlIHNhbWUgbWV0aG9kIGluIE1peGluIGNsYXNzIGZvciBwYXJhbWV0ZXJzIG1lYW5pbmdcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob3N0Q2xhc3NcbiAqIEBwYXJhbSB7W3R5cGVdfSBpbnN0YW5jZUtleVxuICogQHBhcmFtIHtbdHlwZV19IG1peGluTWV0aG9kcyBvcHRpb25hbFxuICovXG5mdW5jdGlvbiBNb2RlbCQkdXNlV2l0aChob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZHMpIHtcbiAgICBtaXhpbk1ldGhvZHMgPSBtaXhpbk1ldGhvZHMgfHwgbW9kZWxNZXRob2RzVG9Qcm94eTtcbiAgICBNaXhpbi51c2VXaXRoLmNhbGwoTW9kZWwsIGhvc3RDbGFzcywgaW5zdGFuY2VLZXksIG1peGluTWV0aG9kcyk7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBQcm94eSBtb2RlbCBtZXRob2RzIHRvIGhvc3Qgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbEhvc3RPYmplY3Qgb3B0aW9uYWwgaG9zdCBvYmplY3QuIElmIG5vdCBwYXNzZWQsIGhvc3RPYmplY3QgcGFzc2VkIHRvIE1vZGVsIGNvbnN0cnVjdG9yIHdpbGwgYmUgdXNlZC5cbiAqL1xuZnVuY3Rpb24gcHJveHlNZXRob2RzKG1vZGVsSG9zdE9iamVjdCkge1xuICAgIG1vZGVsSG9zdE9iamVjdCA9IG1vZGVsSG9zdE9iamVjdCB8fCB0aGlzLl9ob3N0T2JqZWN0O1xuICAgIE1peGluLnByb3RvdHlwZS5fY3JlYXRlUHJveHlNZXRob2RzLmNhbGwodGhpcywgbW9kZWxNZXRob2RzVG9Qcm94eSwgbW9kZWxIb3N0T2JqZWN0KTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIENyZWF0ZSBhbmQgY29ubmVjdCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgbW9kZWwncyBtZXNzZW5nZXJzLlxuICogRXh0ZXJuYWwgbWVzc2VuZ2VyJ3MgbWV0aG9kcyBhcmUgcHJveGllZCBvbiB0aGUgbW9kZWwgYW5kIHRoZXkgYWxsb3dzIFwiKlwiIHN1YnNjcmlwdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIF9wcmVwYXJlTWVzc2VuZ2VycygpIHtcbiAgICAvLyBtb2RlbCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXG4gICAgLy8gbWVzc2FnZSBzb3VyY2UgdG8gY29ubmVjdCBpbnRlcm5hbCBtZXNzZW5nZXIgdG8gZXh0ZXJuYWxcbiAgICB2YXIgaW50ZXJuYWxNZXNzZW5nZXJTb3VyY2UgPSBuZXcgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSh0aGlzLCB1bmRlZmluZWQsIG5ldyBNb2RlbE1zZ0FQSSwgaW50ZXJuYWxNZXNzZW5nZXIpO1xuXG4gICAgLy8gZXh0ZXJuYWwgbWVzc2VuZ2VyIHRvIHdoaWNoIGFsbCBtb2RlbCB1c2VycyB3aWxsIHN1YnNjcmliZSxcbiAgICAvLyB0aGF0IHdpbGwgYWxsb3cgXCIqXCIgc3Vic2NyaXB0aW9ucyBhbmQgc3VwcG9ydCBcImNoYW5nZWRhdGFcIiBtZXNzYWdlIGFwaS5cbiAgICB2YXIgZXh0ZXJuYWxNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgaW50ZXJuYWxNZXNzZW5nZXJTb3VyY2UpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIGV4dGVybmFsTWVzc2VuZ2VyKTtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfaW50ZXJuYWxNZXNzZW5nZXInLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG59XG5cblxuZnVuY3Rpb24gX2dldEhvc3RPYmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hvc3RPYmplY3Q7XG59XG5cblxuZnVuY3Rpb24gTW9kZWwkZGVzdHJveSgpIHtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2ludGVybmFsTWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyUmVnZXhwQVBJID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21fYXBpX3J4JylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzZW5nZXJSZWdleHBBUEkgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBtZXNzYWdlcyBvZiBleHRlcm5hbCBtZXNzZW5nZXIgb2YgTW9kZWwgdG8gaW50ZXJuYWwgbWVzc2VuZ2VyIG9mIE1vZGVsLlxuICovXG52YXIgTW9kZWxNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlclJlZ2V4cEFQSSwgJ01vZGVsTXNnQVBJJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxNc2dBUEk7XG5cblxuLyoqXG4gKiAjIyMjTW9kZWxNc2dBUEkgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFt0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VdKCN0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UpIC0gdHJhbnNsYXRlcyBzdWJzY3JpcHRpb24gcGF0aHMgd2l0aCBcIipcInMgdG8gcmVnZXgsIGxlYXZpbmcgb3RoZXIgc3RyaW5ncyB1bnRvdWNoZWRcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbE1zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxufSk7XG5cblxuLyoqXG4gKiBNb2RlbE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFRyYW5zbGF0ZXMgc3Vic2NyaXB0aW9uIHBhdGhzIHdpdGggXCIqXCJzIHRvIHJlZ2V4LCBsZWF2aW5nIG90aGVyIHN0cmluZ3MgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHJlbGF0aXZlIGFjY2VzcyBwYXRoIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge1JlZ0V4cHxTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShhY2Nlc3NQYXRoKSB7XG4gICAgaWYgKGFjY2Vzc1BhdGggaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiBhY2Nlc3NQYXRoO1xuXG4gICAgcmV0dXJuIHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgoYWNjZXNzUGF0aCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzeW50aGVzaXplID0gcmVxdWlyZSgnLi9zeW50aGVzaXplJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBjaGFuZ2VEYXRhSGFuZGxlciA9IHJlcXVpcmUoJy4vY2hhbmdlX2RhdGEnKVxuICAgICwgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyJylcbiAgICAsIE1vZGVsUGF0aE1zZ0FQSSA9IHJlcXVpcmUoJy4vcGF0aF9tc2dfYXBpJylcbiAgICAsIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXIvbXNuZ3Jfc291cmNlJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJylcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNb2RlbFBhdGg7XG5cblxuLyoqXG4gKiBgbWlsby5Nb2RlbC5QYXRoYFxuICogTW9kZWxQYXRoIG9iamVjdCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gYW55IHBvaW50IGluc2lkZSBbTW9kZWxdKC4vaW5kZXguanMuaHRtbCkgYXMgZGVmaW5lZCBieSBgYWNjZXNzUGF0aGBcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIE1vZGVsIGluc3RhbmNlIHRoYXQgTW9kZWxQYXRoIGdpdmVzIGFjY2VzcyB0by5cbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aChtb2RlbCwgcGF0aCkgeyAvLyAsLi4uIC0gYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGludGVycG9sYXRpb25cbiAgICAvLyBjaGVjayhtb2RlbCwgTW9kZWwpO1xuICAgIGNoZWNrKHBhdGgsIFN0cmluZyk7XG5cbiAgICAvLyBgbW9kZWxQYXRoYCB3aWxsIGJlIHJldHVybmVkIGJ5IGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgYHRoaXNgLiBgbW9kZWxQYXRoYFxuICAgIC8vIChgbW9kZWxQYXRoX3BhdGhgIGZ1bmN0aW9uKSBzaG91bGQgYWxzbyByZXR1cm4gYSBNb2RlbFBhdGggb2JqZWN0IHdpdGggXCJzeW50aGVzaXplZFwiIG1ldGhvZHNcbiAgICAvLyB0byBnZXQvc2V0IG1vZGVsIHByb3BlcnRpZXMsIHRvIHN1YnNjcmliZSB0byBwcm9wZXJ0eSBjaGFuZ2VzLCBldGMuXG4gICAgLy8gQWRkaXRpb25hbCBhcmd1bWVudHMgb2YgbW9kZWxQYXRoIGNhbiBiZSB1c2VkIGluIHRoZSBwYXRoIHVzaW5nIGludGVycG9sYXRpb24gLSBzZWUgTW9kZWxQYXRoIGJlbG93LlxuICAgIHZhciBtb2RlbFBhdGggPSBmdW5jdGlvbiBtb2RlbFBhdGhfcGF0aChhY2Nlc3NQYXRoKSB7IC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgICAgIHJldHVybiBNb2RlbFBhdGgkcGF0aC5hcHBseShtb2RlbFBhdGgsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBtb2RlbFBhdGguX19wcm90b19fID0gTW9kZWxQYXRoLnByb3RvdHlwZTtcblxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKG1vZGVsUGF0aCwge1xuICAgICAgICBfbW9kZWw6IG1vZGVsLFxuICAgICAgICBfcGF0aDogcGF0aCxcbiAgICAgICAgX2FyZ3M6IF8uc2xpY2UoYXJndW1lbnRzLCAxKSwgLy8gcGF0aCB3aWxsIGJlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgYXJyYXlcbiAgICAgICAgX29wdGlvbnM6IG1vZGVsLl9vcHRpb25zXG4gICAgfSk7XG5cbiAgICAvLyBwYXJzZSBhY2Nlc3MgcGF0aFxuICAgIHZhciBwYXJzZWRQYXRoID0gcGF0aFV0aWxzLnBhcnNlQWNjZXNzUGF0aChwYXRoKTtcblxuICAgIC8vIGNvbXB1dGUgYWNjZXNzIHBhdGggc3RyaW5nXG4gICAgXy5kZWZpbmVQcm9wZXJ0eShtb2RlbFBhdGgsICdfYWNjZXNzUGF0aCcsIGludGVycG9sYXRlQWNjZXNzUGF0aChwYXJzZWRQYXRoLCBtb2RlbFBhdGguX2FyZ3MpKTtcblxuICAgIGlmIChtb2RlbFBhdGguX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIG1lc3NlbmdlciBmYWlscyBvbiBcIipcIiBzdWJzY3JpcHRpb25zXG4gICAgICAgIG1vZGVsUGF0aC5fcHJlcGFyZU1lc3NlbmdlcigpO1xuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZSB0byBlbmFibGUgcmVhY3RpdmUgY29ubmVjdGlvbnNcbiAgICAgICAgbW9kZWxQYXRoLm9uU3luYygnY2hhbmdlZGF0YScsIGNoYW5nZURhdGFIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvLyBjb21waWxpbmcgZ2V0dGVyIGFuZCBzZXR0ZXJcbiAgICB2YXIgbWV0aG9kcyA9IHN5bnRoZXNpemUocGF0aCwgcGFyc2VkUGF0aCk7XG5cbiAgICAvLyBhZGRpbmcgbWV0aG9kcyB0byBtb2RlbCBwYXRoXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKG1vZGVsUGF0aCwgbWV0aG9kcyk7XG5cbiAgICBPYmplY3QuZnJlZXplKG1vZGVsUGF0aCk7XG5cbiAgICByZXR1cm4gbW9kZWxQYXRoO1xufVxuXG5Nb2RlbFBhdGgucHJvdG90eXBlLl9fcHJvdG9fXyA9IE1vZGVsUGF0aC5fX3Byb3RvX187XG5cblxuLyoqXG4gKiBJbnRlcnBvbGF0ZXMgcGF0aCBlbGVtZW50cyB0byBjb21wdXRlIHJlYWwgcGF0aFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnNlZFBhdGggcGFyc2VkIHBhdGggLSBhcnJheSBvZiBwYXRoIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIHBhdGggaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMsIGFyZ3NbMF0gaXMgcGF0aCBpdHNlbGZcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaW50ZXJwb2xhdGVBY2Nlc3NQYXRoKHBhcnNlZFBhdGgsIGFyZ3MpIHtcbiAgICByZXR1cm4gcGFyc2VkUGF0aC5yZWR1Y2UoZnVuY3Rpb24oYWNjZXNzUGF0aFN0ciwgY3Vyck5vZGUsIGluZGV4KSB7XG4gICAgICAgIHZhciBpbnRlcnBvbGF0ZSA9IGN1cnJOb2RlLmludGVycG9sYXRlO1xuICAgICAgICByZXR1cm4gYWNjZXNzUGF0aFN0ciArXG4gICAgICAgICAgICAgICAgKGludGVycG9sYXRlXG4gICAgICAgICAgICAgICAgICAgID8gKGN1cnJOb2RlLnN5bnRheCA9PSAnYXJyYXknXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdbJyArIGFyZ3NbaW50ZXJwb2xhdGVdICsgJ10nXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcuJyArIGFyZ3NbaW50ZXJwb2xhdGVdKVxuICAgICAgICAgICAgICAgICAgICA6IGN1cnJOb2RlLnByb3BlcnR5KTtcbiAgICB9LCAnJyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTW9kZWxQYXRoIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbcGF0aF0oI01vZGVsUGF0aCRwYXRoKSAtIGdpdmVzIGFjY2VzcyB0byBwYXRoIGluc2lkZSBNb2RlbFBhdGhcbiAqIC0gZ2V0IC0gc3ludGhlc2l6ZWRcbiAqIC0gc2V0IC0gc3ludGhlc2l6ZWRcbiAqIC0gc3BsaWNlIC0gc3BsaWNlIG1vZGVsIGRhdGEgKGFzIGFycmF5IG9yIHBzZXVkby1hcnJheSksIHN5bnRoZXNpemVkXG4gKiAtIFtsZW5dKCNNb2RlbFBhdGgkbGVuKSAtIHJldHVybnMgbGVuZ3RoIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIHNhZmUgd2F5LCAwIGlmIG5vIGxlbmd0aCBpcyBzZXRcbiAqIC0gW3B1c2hdKCNNb2RlbFBhdGgkcHVzaCkgLSBhZGQgaXRlbXMgdG8gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3BvcF0oI01vZGVsUGF0aCRwb3ApIC0gcmVtb3ZlIGl0ZW0gZnJvbSB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIE1vZGVsUGF0aFxuICogLSBbdW5zaGlmdF0oI01vZGVsUGF0aCR1bnNoaWZ0KSAtIGFkZCBpdGVtcyB0byB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIE1vZGVsUGF0aFxuICogLSBbc2hpZnRdKCNNb2RlbFBhdGgkc2hpZnQpIC0gcmVtb3ZlIGl0ZW0gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIE1vZGVsUGF0aFxuICovXG5fLmV4dGVuZFByb3RvKE1vZGVsUGF0aCwge1xuICAgIHBhdGg6IE1vZGVsUGF0aCRwYXRoLFxuICAgIGxlbjogTW9kZWxQYXRoJGxlbixcbiAgICBwdXNoOiBNb2RlbFBhdGgkcHVzaCxcbiAgICBwb3A6IE1vZGVsUGF0aCRwb3AsXG4gICAgdW5zaGlmdDogTW9kZWxQYXRoJHVuc2hpZnQsXG4gICAgc2hpZnQ6IE1vZGVsUGF0aCRzaGlmdCxcbiAgICBfcHJlcGFyZU1lc3NlbmdlcjogX3ByZXBhcmVNZXNzZW5nZXIsXG4gICAgX2dldERlZmluaXRpb246IF9nZXREZWZpbml0aW9uLFxuICAgIGRlc3Ryb3k6IE1vZGVsUGF0aCRkZXN0cm95XG59KTtcblxuXG5fLmV4dGVuZChNb2RlbFBhdGgsIHtcbiAgICBfY3JlYXRlRnJvbURlZmluaXRpb246IF9jcmVhdGVGcm9tRGVmaW5pdGlvblxufSlcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBGYWNldCBwcm90b3R5cGVcbiAqL1xudmFyIE1FU1NFTkdFUl9QUk9QRVJUWSA9ICdfbWVzc2VuZ2VyJztcbk1lc3Nlbmdlci51c2VXaXRoKE1vZGVsUGF0aCwgTUVTU0VOR0VSX1BST1BFUlRZLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoIGluc3RhbmNlIG1ldGhvZFxuICogR2l2ZXMgYWNjZXNzIHRvIHBhdGggaW5zaWRlIE1vZGVsUGF0aC4gTWV0aG9kIHdvcmtzIHNpbWlsYXJseSB0byBbcGF0aCBtZXRob2RdKCNNb2RlbCRwYXRoKSBvZiBtb2RlbCwgdXNpbmcgcmVsYXRpdmUgcGF0aHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggc3RyaW5nIHRoYXQgZGVmaW5lcyBwYXRoIHRvIGFjY2VzcyBtb2RlbC5cbiAqICBQYXRoIHN0cmluZyBjb25zaXN0cyBvZiBwYXJ0cyB0byBkZWZpbmUgZWl0aGVyIHByb3BlcnR5IGFjY2VzcyAoYFwiLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IG5hbWUpIG9yIGFycmF5IGl0ZW0gYWNjZXNzIChgXCJbMV1cImAgdG8gYWNjZXNzIGl0ZW0gd2l0aCBpbmRleCAxKS5cbiAqICBBY2Nlc3MgcGF0aCBjYW4gY29udGFpbiBhcyBtYW55IHBhcnRzIGFzIG5lY2Vzc2FyeSAoZS5nLiBgXCIubGlzdFswXS5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBgbmFtZWAgaW4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgYXJyYXkgc3RvcmVkIGluIHByb3BlcnR5IGBsaXN0YC5cbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnRlcnBvbGF0ZWQgcGF0aHMuXG4gKiAgRS5nLiBgbS5wYXRoKFwiWyQxXS4kMlwiLCBpZCwgcHJvcClgIHJldHVybnMgTW9kZWxQYXRoIHRvIGFjY2VzcyBwcm9wZXJ0eSB3aXRoIG5hbWUgYHByb3BgIGluIGFycmF5IGl0ZW0gd2l0aCBpbmRleCBgaWRgLiBBbHRob3VnaCB0aGlzIE1vZGVsUGF0aCBvYmplY3Qgd2lsbCB3b3JrIGV4YWN0bHkgYXMgYG0oXCJbXCIgKyBpZCArIFwiXS5cIiArIHByb3ApYCwgdGhlIGludGVycG9sYXRlZCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IGFzIE1vZGVsUGF0aCB3aXRoIGludGVycG9sYXRpb24gd2lsbCBub3Qgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycywgd2hpbGUgTW9kZWxQYXRoIHdpdGggY29tcHV0ZWQgYWNjZXNzIHBhdGggd2lsbCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciBlYWNoIHBhaXIgb2YgdmFsdWVzIG9mIGBpZGAgYW5kIGBwcm9wYC5cbiAqIEByZXR1cm4ge01vZGVsUGF0aH1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHBhdGgoYWNjZXNzUGF0aCkgeyAgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICBpZiAoISBhY2Nlc3NQYXRoKSByZXR1cm4gdGhpcztcblxuICAgIHZhciB0aGlzUGF0aEFyZ3NDb3VudCA9IHRoaXMuX2FyZ3MubGVuZ3RoIC0gMTtcblxuICAgIGlmICh0aGlzUGF0aEFyZ3NDb3VudCA+IDApIHsvLyB0aGlzIHBhdGggaGFzIGludGVycG9sYXRlZCBhcmd1bWVudHMgdG9vXG4gICAgICAgIGFjY2Vzc1BhdGggPSBhY2Nlc3NQYXRoLnJlcGxhY2UoL1xcJFsxLTldWzAtOV0qL2csIGZ1bmN0aW9uKHN0cikge1xuICAgICAgICAgICAgcmV0dXJuICckJyArICgrc3RyLnNsaWNlKDEpICsgdGhpc1BhdGhBcmdzQ291bnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgbmV3UGF0aCA9IHRoaXMuX3BhdGggKyBhY2Nlc3NQYXRoO1xuXG4gICAgLy8gdGhpcy5fbW9kZWwgaXMgYWRkZWQgaW4gZnJvbnQgb2YgYWxsIGFyZ3VtZW50cyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyXG4gICAgLy8gb2YgTW9kZWxQYXRoIGNvbnN0cnVjdG9yXG4gICAgdmFyIGFyZ3MgPSBbdGhpcy5fbW9kZWwsIG5ld1BhdGhdXG4gICAgICAgICAgICAgICAgLmNvbmNhdCh0aGlzLl9hcmdzLnNsaWNlKDEpKSAvLyByZW1vdmUgb2xkIHBhdGggZnJvbSBfYXJncywgYXMgaXQgaXMgMSBiYXNlZFxuICAgICAgICAgICAgICAgIC5jb25jYXQoXy5zbGljZShhcmd1bWVudHMsIDEpKTsgLy8gYWRkIG5ldyBpbnRlcnBvbGF0aW9uIGFyZ3VtZW50c1xuXG4gICAgLy8gY2FsbGluZyBNb2RlbFBhdGggY29uc3RydWN0b3Igd2l0aCBuZXcgYW5kIHRoZSBsaXN0IG9mIGFyZ3VtZW50czogdGhpcyAobW9kZWwpLCBhY2Nlc3NQYXRoLCAuLi5cbiAgICByZXR1cm4gXy5uZXdBcHBseShNb2RlbFBhdGgsIGFyZ3MpO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgbGVuZ3RoIHByb3BlcnR5IGFuZCBzZXRzIGl0IHRvIDAgaWYgaXQgd2Fzbid0IHNldC5cbiAqXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRsZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aCgnLmxlbmd0aCcpLmdldCgpIHx8IDA7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogQWRkcyBpdGVtcyB0byB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpLiBSZXR1cm5zIG5ldyBsZW5ndGguXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgbGlzdCBvZiBpdGVtcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gYXJyYXkgKHBzZXVkbyBhcnJheSlcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRwdXNoKCkgeyAvLyBhcmd1bWVudHNcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW4oKTtcbiAgICB2YXIgbmV3TGVuZ3RoID0gbGVuZ3RoICsgYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIF8uc3BsaWNlKGFyZ3VtZW50cywgMCwgMCwgbGVuZ3RoLCAwKTtcbiAgICB0aGlzLnNwbGljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgcmV0dXJuIG5ld0xlbmd0aDtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGl0ZW0gZnJvbSB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpLiBSZXR1cm5zIHRoaXMgaXRlbS5cbiAqXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRwb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMubGVuKCkgLSAxLCAxKVswXTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbnNlcnRzIGl0ZW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBSZXR1cm5zIG5ldyBsZW5ndGguXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgaXRlbXMgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGJlZ2lubmluZyBvZiBhcnJheVxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHVuc2hpZnQoKSB7IC8vIGFyZ3VtZW50c1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbigpO1xuICAgIGxlbmd0aCArPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gICAgXy5zcGxpY2UoYXJndW1lbnRzLCAwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnNwbGljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgcmV0dXJuIGxlbmd0aDtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyB0aGlzIGl0ZW0uXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkc2hpZnQoKSB7IC8vIGFyZ3VtZW50c1xuICAgIHJldHVybiB0aGlzLnNwbGljZSgwLCAxKVswXTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIE1vZGVsUGF0aCBtZXNlbmdlciB3aXRoIE1vZGVsJ3MgbWVzc2VuZ2VyIGFzIGl0cyBzb3VyY2UgKFtNZXNzZW5nZXJNZXNzYWdlU291cmNlXSguLi9tZXNzZW5nZXIvbXNuZ3Jfc291cmNlLmpzLmh0bWwpKSBhbmQgW01vZGVsUGF0aE1zZ0FQSV0oLi9wYXRoX21zZ19hcGkuanMuaHRtbCkgYXMgW01lc3NlbmdlckFQSV0oLi4vbWVzc2VuZ2VyL21fYXBpLmpzLmh0bWwpXG4gKi9cbmZ1bmN0aW9uIF9wcmVwYXJlTWVzc2VuZ2VyKCkge1xuICAgIHZhciBtUGF0aEFQSSA9IG5ldyBNb2RlbFBhdGhNc2dBUEkodGhpcy5fYWNjZXNzUGF0aCk7XG5cbiAgICAvLyBjcmVhdGUgTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSBjb25uZWN0ZWQgdG8gTW9kZWwncyBtZXNzZW5nZXJcbiAgICB2YXIgbW9kZWxNZXNzYWdlU291cmNlID0gbmV3IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCBtUGF0aEFQSSwgdGhpcy5fbW9kZWwpO1xuXG4gICAgLy8gY3JlYXRlIG1lc3NlbmdlciB3aXRoIG1vZGVsIHBhc3NlZCBhcyBob3N0T2JqZWN0IChkZWZhdWx0IG1lc3NhZ2UgZGlzcGF0Y2ggY29udGV4dClcbiAgICAvLyBhbmQgd2l0aG91dCBwcm94eWluZyBtZXRob2RzICh3ZSBkb24ndCB3YW50IHRvIHByb3h5IHRoZW0gdG8gTW9kZWwpXG4gICAgdmFyIG1QYXRoTWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIG1vZGVsTWVzc2FnZVNvdXJjZSk7XG5cbiAgICAvLyBzdG9yZSBtZXNzZW5nZXIgb24gTW9kZWxQYXRoIGluc3RhbmNlXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1QYXRoTWVzc2VuZ2VyKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9iamVjdCBhbGxvd2luZyB0byByZWNyZWF0ZSBtb2RlbCBwYXRoXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfZ2V0RGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtb2RlbDogdGhpcy5fbW9kZWwsXG4gICAgICAgIHBhdGg6IHRoaXMuX3BhdGgsXG4gICAgICAgIGFyZ3M6IHRoaXMuX2FyZ3NcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIG1vZGVsUGF0aCBvYmplY3QgZnJvbSBkZWZpbml0aW9uIGNyZWF0ZWQgYnkgX2dldERlZmluaXRpb25cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRlZmluaXRpb25cbiAqIEByZXR1cm4ge01vZGVsUGF0aH1cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUZyb21EZWZpbml0aW9uKGRlZmluaXRpb24pIHtcbiAgICBjaGVjayhkZWZpbml0aW9uLCB7XG4gICAgICAgIG1vZGVsOiBGdW5jdGlvbiwgLy8gTW9kZWxcbiAgICAgICAgcGF0aDogU3RyaW5nLFxuICAgICAgICBhcmdzOiBBcnJheVxuICAgIH0pO1xuXG4gICAgdmFyIG0gPSBkZWZpbml0aW9uLm1vZGVsO1xuXG4gICAgcmV0dXJuIG0uYXBwbHkobSwgZGVmaW5pdGlvbi5hcmdzKTtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbFBhdGgkZGVzdHJveSgpIHtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtb2RlbFV0aWxzID0ge1xuICAgIG5vcm1hbGl6ZVNwbGljZUluZGV4OiBub3JtYWxpemVTcGxpY2VJbmRleFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb2RlbFV0aWxzO1xuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gc3BsaWNlSW5kZXggPiBsZW5ndGhcbiAgICAgICAgICAgID8gbGVuZ3RoXG4gICAgICAgICAgICA6IHNwbGljZUluZGV4ID49IDBcbiAgICAgICAgICAgICAgICA/IHNwbGljZUluZGV4XG4gICAgICAgICAgICAgICAgOiBzcGxpY2VJbmRleCArIGxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyBzcGxpY2VJbmRleCArIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA6IDA7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNZXNzZW5nZXJBUEkgPSByZXF1aXJlKCcuLi9tZXNzZW5nZXIvbV9hcGknKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG4vKipcbiAqIFN1YmNsYXNzIG9mIE1lc3NlbmdlckFQSSB0aGF0IGlzIHVzZWQgdG8gdHJhbnNsYXRlIG1lc3NhZ2VzIG9mIE1lc3NlbmdlciBvbiBNb2RlbFBhdGggdG8gTWVzc2VuZ2VyIG9uIE1vZGVsLlxuICovXG52YXIgTW9kZWxQYXRoTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdNb2RlbFBhdGhNc2dBUEknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNb2RlbFBhdGhNc2dBUEk7XG5cblxuLyoqXG4gKiAjIyMjTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgTW9kZWxQYXRoTXNnQVBJXG4gKiAtIFt0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VdKCN0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UpIC0gdHJhbnNsYXRlcyByZWxhdGl2ZSBhY2Nlc3MgcGF0aHMgb2YgTW9kZWxQYXRoIHRvIGZ1bGwgcGF0aCBvZiBNb2RlbFxuICogLSBbY3JlYXRlSW50ZXJuYWxEYXRhXSgjY3JlYXRlSW50ZXJuYWxEYXRhKSAtIGNoYW5nZXMgcGF0aCBpbiBtZXNzYWdlIG9uIG1vZGVsIHRvIHJlbGF0aXZlIHBhdGggYW5kIGFkZHMgYGZ1bGxQYXRoYCBwcm9wZXJ0eSB0byBtZXNzYWdlIGRhdGFcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbFBhdGhNc2dBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGNyZWF0ZUludGVybmFsRGF0YTogY3JlYXRlSW50ZXJuYWxEYXRhLFxufSk7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgTWVzc2VuZ2VyQVBJIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByb290UGF0aCByb290IHBhdGggb2YgbW9kZWwgcGF0aFxuICovXG5mdW5jdGlvbiBpbml0KHJvb3RQYXRoKSB7XG4gICAgTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5yb290UGF0aCA9IHJvb3RQYXRoO1xufVxuXG4vKipcbiAqIE1vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFRyYW5zbGF0ZXMgcmVsYXRpdmUgYWNjZXNzIHBhdGhzIG9mIE1vZGVsUGF0aCB0byBmdWxsIHBhdGggb2YgTW9kZWwuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggcmVsYXRpdmUgYWNjZXNzIHBhdGggdG8gYmUgdHJhbnNsYXRlZFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIC8vIFRPRE8gc2hvdWxkIHByZXBlbmQgUmVnRXhlc1xuICAgIC8vIFRPRE8gc2hvdWxkIG5vdCBwcmVwZW5kIGNoYW5nZWRhdGEgdG9vPz8/XG4gICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIGlmIChtZXNzYWdlID09ICdkYXRhY2hhbmdlcycpXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIFxuICAgIHJldHVybiB0aGlzLnJvb3RQYXRoICsgbWVzc2FnZTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RcbiAqIENoYW5nZXMgcGF0aCBpbiBtZXNzYWdlIG9uIG1vZGVsIHRvIHJlbGF0aXZlIHBhdGggYW5kIGFkZHMgYGZ1bGxQYXRoYCBwcm9wZXJ0eSB0byBtZXNzYWdlIGRhdGEuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2UgZnVsbCBhY2Nlc3MgcGF0aCBvbiBNb2RlbFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgcmVsYXRpdmUgYWNjZXNzIHBhdGggb24gTW9kZWxQYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlRGF0YSBkYXRhIHJlY2VpdmVkIGZyb20gTW9kZWwsIHdpbGwgYmUgdHJhbnNsYXRlZCBhcyBkZXNjcmliZWQgdG8gYmUgZGlzcGF0Y2hlZCB0byBNb2RlbFBhdGhcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIHNvdXJjZURhdGEpIHtcbiAgICAvLyBUT0RPIHJldHVybiBvbiBjaGFuZ2VkYXRhIHRvbz8/P1xuICAgIGlmIChtZXNzYWdlID09ICdkYXRhY2hhbmdlcycpIHtcbiAgICAgICAgdmFyIGludGVybmFsQ2hhbmdlcyA9IHNvdXJjZURhdGEuY2hhbmdlc1xuICAgICAgICAgICAgLm1hcCh0cnVuY2F0ZUNoYW5nZVBhdGgsIHRoaXMpXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGNoYW5nZSkgeyByZXR1cm4gY2hhbmdlOyB9KTtcbiAgICAgICAgdmFyIGludGVybmFsRGF0YSA9IHtcbiAgICAgICAgICAgIGNoYW5nZXM6IGludGVybmFsQ2hhbmdlcyxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBzb3VyY2VEYXRhLnRyYW5zYWN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGludGVybmFsRGF0YVxuICAgIH1cblxuICAgIHZhciBpbnRlcm5hbERhdGEgPSB0cnVuY2F0ZUNoYW5nZVBhdGguY2FsbCh0aGlzLCBzb3VyY2VEYXRhKTtcbiAgICByZXR1cm4gaW50ZXJuYWxEYXRhO1xufVxuXG5cbmZ1bmN0aW9uIHRydW5jYXRlQ2hhbmdlUGF0aChjaGFuZ2UpIHtcbiAgICB2YXIgZnVsbFBhdGggPSBjaGFuZ2UucGF0aFxuICAgICAgICAsIHBhdGggPSBfLnVuUHJlZml4KGZ1bGxQYXRoLCB0aGlzLnJvb3RQYXRoKTtcblxuICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgY2hhbmdlID0gXy5jbG9uZShjaGFuZ2UpO1xuICAgICAgICBjaGFuZ2UuZnVsbFBhdGggPSBmdWxsUGF0aDtcbiAgICAgICAgY2hhbmdlLnBhdGggPSBwYXRoO1xuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cIm1vZGVsLXBhdGhcIj48L2E+XG4vLyAjIyMgbW9kZWwgcGF0aCB1dGlsc1xuXG52YXIgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJylcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxudmFyIHBhdGhVdGlscyA9IHtcbiAgICBwYXJzZUFjY2Vzc1BhdGg6IHBhcnNlQWNjZXNzUGF0aCxcbiAgICBjcmVhdGVSZWdleFBhdGg6IGNyZWF0ZVJlZ2V4UGF0aCxcbiAgICBnZXRQYXRoTm9kZUtleTogZ2V0UGF0aE5vZGVLZXksXG4gICAgd3JhcE1lc3Nlbmdlck1ldGhvZHM6IHdyYXBNZXNzZW5nZXJNZXRob2RzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGhVdGlscztcblxuXG52YXIgcHJvcGVydHlQYXRoU3ludGF4ID0gJ1xcXFwuW0EtWmEtel8tXVtBLVphLXowLTlfLV0qJ1xuICAgICwgYXJyYXlQYXRoU3ludGF4ID0gJ1xcXFxbWzAtOV0rXFxcXF0nXG4gICAgLCBpbnRlcnBvbGF0aW9uU3ludGF4ID0gJ1xcXFwkWzEtOV1bMC05XSonXG4gICAgLCBwcm9wZXJ0eUludGVycG9sYXRlU3ludGF4ID0gJ1xcXFwuJyArIGludGVycG9sYXRpb25TeW50YXhcbiAgICAsIGFycmF5SW50ZXJwb2xhdGVTeW50YXggPSAnXFxcXFsnICsgaW50ZXJwb2xhdGlvblN5bnRheCArICdcXFxcXSdcblxuICAgICwgcHJvcGVydHlTdGFyU3ludGF4ID0gJ1xcXFwuXFxcXConXG4gICAgLCBhcnJheVN0YXJTeW50YXggPSAnXFxcXFtcXFxcKlxcXFxdJ1xuICAgICwgc3RhclN5bnRheCA9ICdcXFxcKidcblxuICAgICwgcGF0aFBhcnNlU3ludGF4ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aFN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVBhdGhTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbnRlcnBvbGF0ZVN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUludGVycG9sYXRlU3ludGF4XG4gICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICwgcGF0aFBhcnNlUGF0dGVybiA9IG5ldyBSZWdFeHAocGF0aFBhcnNlU3ludGF4LCAnZycpXG5cbiAgICAsIHBhdHRlcm5QYXRoUGFyc2VTeW50YXggPSAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhcnNlU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlTdGFyU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlTdGFyU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhclN5bnRheFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICwgcGF0dGVyblBhdGhQYXJzZVBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdHRlcm5QYXRoUGFyc2VTeW50YXgsICdnJylcblxuICAgIC8vLCB0YXJnZXRQYXRoUGFyc2VQYXR0ZXJuID0gL1xcLltBLVphLXpdW0EtWmEtejAtOV9dKnxcXFtbMC05XStcXF18XFwuXFwkWzEtOV1bMC05XSp8XFxbXFwkWzEtOV1bMC05XSpcXF18XFwkWzEtOV1bMC05XS9nXG4gICAgLCBwYXRoTm9kZVR5cGVzID0ge1xuICAgICAgICAnLic6IHsgc3ludGF4OiAnb2JqZWN0JywgZW1wdHk6ICd7fScgfSxcbiAgICAgICAgJ1snOiB7IHN5bnRheDogJ2FycmF5JywgZW1wdHk6ICdbXSd9LFxuICAgICAgICAnKic6IHsgc3ludGF4OiAnbWF0Y2gnLCBlbXB0eTogJ3t9J30sXG4gICAgfTtcblxuZnVuY3Rpb24gcGFyc2VBY2Nlc3NQYXRoKHBhdGgsIG5vZGVQYXJzZVBhdHRlcm4pIHtcbiAgICBub2RlUGFyc2VQYXR0ZXJuID0gbm9kZVBhcnNlUGF0dGVybiB8fCBwYXRoUGFyc2VQYXR0ZXJuO1xuXG4gICAgdmFyIHBhcnNlZFBhdGggPSBbXTtcblxuICAgIGlmICghIHBhdGgpXG4gICAgICAgIHJldHVybiBwYXJzZWRQYXRoO1xuXG4gICAgdmFyIHVucGFyc2VkID0gcGF0aC5yZXBsYWNlKG5vZGVQYXJzZVBhdHRlcm4sIGZ1bmN0aW9uKG5vZGVTdHIpIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0geyBwcm9wZXJ0eTogbm9kZVN0ciB9O1xuICAgICAgICBfLmV4dGVuZChwYXRoTm9kZSwgcGF0aE5vZGVUeXBlc1tub2RlU3RyWzBdXSk7XG4gICAgICAgIGlmIChub2RlU3RyWzFdID09ICckJylcbiAgICAgICAgICAgIHBhdGhOb2RlLmludGVycG9sYXRlID0gZ2V0UGF0aE5vZGVLZXkocGF0aE5vZGUsIHRydWUpO1xuXG4gICAgICAgIHBhcnNlZFBhdGgucHVzaChwYXRoTm9kZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgICBpZiAodW5wYXJzZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IG1vZGVsIHBhdGg6ICcgKyBwYXRoKTtcblxuICAgIHJldHVybiBwYXJzZWRQYXRoO1xufVxuXG5cbnZhciBub2RlUmVnZXggPSB7XG4gICAgJy4qJzogcHJvcGVydHlQYXRoU3ludGF4LFxuICAgICdbKl0nOiBhcnJheVBhdGhTeW50YXhcbn07XG5ub2RlUmVnZXhbJyonXSA9IG5vZGVSZWdleFsnLionXSArICd8JyArIG5vZGVSZWdleFsnWypdJ107XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlZ2V4UGF0aChwYXRoKSB7XG4gICAgY2hlY2socGF0aCwgTWF0Y2guT25lT2YoU3RyaW5nLCBSZWdFeHApKTtcblxuICAgIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwIHx8IHBhdGguaW5kZXhPZignKicpID09IC0xKVxuICAgICAgICByZXR1cm4gcGF0aDtcblxuICAgIHZhciBwYXJzZWRQYXRoID0gcGF0aFV0aWxzLnBhcnNlQWNjZXNzUGF0aChwYXRoLCBwYXR0ZXJuUGF0aFBhcnNlUGF0dGVybilcbiAgICAgICAgLCByZWdleFN0ciA9ICdeJ1xuICAgICAgICAvLyAsIHJlZ2V4U3RyRW5kID0gJydcbiAgICAgICAgLCBwYXR0ZXJuc1N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHBhcnNlZFBhdGguZm9yRWFjaChmdW5jdGlvbihwYXRoTm9kZSkge1xuICAgICAgICB2YXIgcHJvcCA9IHBhdGhOb2RlLnByb3BlcnR5XG4gICAgICAgICAgICAsIHJlZ2V4ID0gbm9kZVJlZ2V4W3Byb3BdO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJlZ2V4KSB7XG4gICAgICAgICAgICAvLyByZWdleFN0ciArPSAnKCcgKyByZWdleDtcbiAgICAgICAgICAgIC8vIHJlZ2V4U3RyRW5kICs9ICd8KSc7XG4gICAgICAgICAgICByZWdleFN0ciArPSAnKCcgKyByZWdleCArICd8KSc7XG4gICAgICAgICAgICAvLyByZWdleFN0ckVuZCArPSAnfCknO1xuICAgICAgICAgICAgcGF0dGVybnNTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIChwYXR0ZXJuc1N0YXJ0ZWQpXG4gICAgICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKCdcIipcIiBwYXRoIHNlZ21lbnQgY2Fubm90IGJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhdGg6ICcgKyBwYXRoKTtcbiAgICAgICAgICAgIHJlZ2V4U3RyICs9IHByb3AucmVwbGFjZSgvKFxcLnxcXFt8XFxdKS9nLCAnXFxcXCQxJyk7IC8vIGFkZCBzbGFzaCBpbiBmcm9udCBvZiBzeW1ib2xzIHRoYXQgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgaW4gcmVnZXhcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVnZXhTdHIgKz0gLyogcmVnZXhTdHJFbmQgKyAqLyAnJCc7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleFN0cik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgY29uc3RydWN0IHJlZ2V4IGZvciBwYXRoIHBhdHRlcm46ICcgKyBwYXRoKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gZ2V0UGF0aE5vZGVLZXkocGF0aE5vZGUsIGludGVycG9sYXRlZCkge1xuICAgIHZhciBwcm9wID0gcGF0aE5vZGUucHJvcGVydHlcbiAgICAgICAgLCBzdGFydEluZGV4ID0gaW50ZXJwb2xhdGVkID8gMiA6IDE7XG4gICAgcmV0dXJuIHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknXG4gICAgICAgID8gcHJvcC5zbGljZShzdGFydEluZGV4LCBwcm9wLmxlbmd0aCAtIDEpXG4gICAgICAgIDogcHJvcC5zbGljZShzdGFydEluZGV4KTtcbn1cblxuXG4vLyBUT0RPIGFsbG93IGZvciBtdWx0aXBsZSBtZXNzYWdlcyBpbiBhIHN0cmluZ1xuZnVuY3Rpb24gd3JhcE1lc3Nlbmdlck1ldGhvZHMobWV0aG9kc05hbWVzKSB7XG4gICAgbWV0aG9kc05hbWVzID0gbWV0aG9kc05hbWVzIHx8IFsnb24nLCAnb2ZmJ107XG4gICAgdmFyIHdyYXBwZWRNZXRob2RzID0gXy5tYXBUb09iamVjdChtZXRob2RzTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIG9yaWdNZXRob2QgPSB0aGlzW21ldGhvZE5hbWVdO1xuICAgICAgICAvLyByZXBsYWNpbmcgbWVzc2FnZSBzdWJzcmliZS91bnN1YnNjcmliZS9ldGMuIHRvIGNvbnZlcnQgXCIqXCIgbWVzc2FnZSBwYXR0ZXJucyB0byByZWdleHBzXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoLCBzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB2YXIgcmVnZXhQYXRoID0gY3JlYXRlUmVnZXhQYXRoKHBhdGgpO1xuICAgICAgICAgICAgb3JpZ01ldGhvZC5jYWxsKHRoaXMsIHJlZ2V4UGF0aCwgc3Vic2NyaWJlcik7XG4gICAgICAgIH07XG4gICAgfSwgdGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHdyYXBwZWRNZXRob2RzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4uL3BhdGhfdXRpbHMnKVxuICAgICwgbW9kZWxVdGlscyA9IHJlcXVpcmUoJy4uL21vZGVsX3V0aWxzJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvbG9nZ2VyJylcbiAgICAsIGZzID0gcmVxdWlyZSgnZnMnKVxuICAgICwgZG9UID0gcmVxdWlyZSgnZG90JylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuLi9jaGFuZ2VfZGF0YScpXG4gICAgLCBnZXRUcmFuc2FjdGlvbkZsYWcgPSBjaGFuZ2VEYXRhSGFuZGxlci5nZXRUcmFuc2FjdGlvbkZsYWdcbiAgICAsIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkID0gY2hhbmdlRGF0YUhhbmRsZXIucG9zdFRyYW5zYWN0aW9uRmluaXNoZWQ7XG5cblxuLyoqXG4gKiBUZW1wbGF0ZXMgdG8gc3ludGhlc2l6ZSBtb2RlbCBnZXR0ZXJzIGFuZCBzZXR0ZXJzXG4gKi9cbnZhciB0ZW1wbGF0ZXMgPSB7XG4gICAgZ2V0OiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbm1ldGhvZCA9IGZ1bmN0aW9uIGdldCgpIHtcXG4gICAgdmFyIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19O1xcbiAgICByZXR1cm4gbSB7e34gaXQucGFyc2VkUGF0aCA6cGF0aE5vZGUgfX1cXG4gICAgICAgIHt7PyBwYXRoTm9kZS5pbnRlcnBvbGF0ZX19XFxuICAgICAgICAgICAgJiYgKG0gPSBtW3RoaXMuX2FyZ3NbIHt7PSBwYXRoTm9kZS5pbnRlcnBvbGF0ZSB9fSBdXSlcXG4gICAgICAgIHt7Pz99fVxcbiAgICAgICAgICAgICYmIChtID0gbXt7PSBwYXRoTm9kZS5wcm9wZXJ0eSB9fSlcXG4gICAgICAgIHt7P319IHt7fn19O1xcbn07XFxuXCIsXG4gICAgc2V0OiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbnt7IyBkZWYuaW5jbHVkZV9kZWZpbmVzIH19XFxue3sjIGRlZi5pbmNsdWRlX2NyZWF0ZV90cmVlIH19XFxuXFxuXFxuLyoqXFxuICogVGVtcGxhdGUgdGhhdCBzeW50aGVzaXplcyBzZXR0ZXIgZm9yIE1vZGVsIGFuZCBmb3IgTW9kZWxQYXRoXFxuICovXFxubWV0aG9kID0gZnVuY3Rpb24gc2V0KHZhbHVlKSB7XFxuICAgIHt7IyBkZWYuaW5pdFZhcnM6J3NldCcgfX1cXG5cXG4gICAge3sjIGRlZi5jcmVhdGVUcmVlOidzZXQnIH19XFxuXFxuICAgIHt7XFxuICAgICAgICBjdXJyTm9kZSA9IG5leHROb2RlO1xcbiAgICAgICAgY3VyclByb3AgPSBjdXJyTm9kZSAmJiBjdXJyTm9kZS5wcm9wZXJ0eTtcXG4gICAgfX1cXG5cXG4gICAge3sgLyogYXNzaWduIHZhbHVlIHRvIHRoZSBsYXN0IHByb3BlcnR5ICovIH19XFxuICAgIHt7PyBjdXJyUHJvcCB9fVxcbiAgICAgICAgd2FzRGVmID0ge3sjIGRlZi53YXNEZWZpbmVkfX07XFxuICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG5cXG4gICAgICAgIHZhciBvbGQgPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG5cXG4gICAgICAgIHt7IC8qIGNsb25lIHZhbHVlIHRvIHByZXZlbnQgc2FtZSByZWZlcmVuY2UgaW4gbGlua2VkIG1vZGVscyAqLyB9fVxcbiAgICAgICAgbXt7IyBkZWYuY3VyclByb3AgfX0gPSBjbG9uZVRyZWUodmFsdWUpO1xcbiAgICB7ez99fVxcblxcbiAgICB7eyAvKiBhZGQgbWVzc2FnZSByZWxhdGVkIHRvIHRoZSBsYXN0IHByb3BlcnR5IGNoYW5nZSAqLyB9fVxcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgIGlmICghIHdhc0RlZilcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnYWRkZWQnLFxcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZTogdmFsdWUgfSk7XFxuICAgICAgICBlbHNlIGlmIChvbGQgIT0gdmFsdWUpXFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2NoYW5nZWQnLFxcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogb2xkLCBuZXdWYWx1ZTogdmFsdWUgfSk7XFxuXFxuICAgICAgICB7eyAvKiBhZGQgbWVzc2FnZSByZWxhdGVkIHRvIGNoYW5nZXMgaW4gKHN1Yilwcm9wZXJ0aWVzIGluc2lkZSByZW1vdmVkIGFuZCBhc3NpZ25lZCB2YWx1ZSAqLyB9fVxcbiAgICAgICAgaWYgKCEgd2FzRGVmIHx8IG9sZCAhPSB2YWx1ZSlcXG4gICAgICAgICAgICBhZGRUcmVlQ2hhbmdlc01lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsXFxuICAgICAgICAgICAgICAgIGFjY2Vzc1BhdGgsIG9sZCwgdmFsdWUpOyAvKiBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbiB0aGF0IHN5bnRoZXNpemVzIE1vZGVsUGF0aCBzZXR0ZXIgKi9cXG5cXG4gICAgICAgIHt7IC8qIHBvc3QgYWxsIHN0b3JlZCBtZXNzYWdlcyAqLyB9fVxcbiAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgfVxcbn07XFxuXCIsXG4gICAgZGVsOiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbnt7IyBkZWYuaW5jbHVkZV9kZWZpbmVzIH19XFxue3sjIGRlZi5pbmNsdWRlX3RyYXZlcnNlX3RyZWUgfX1cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBkZWwoKSB7XFxuICAgIHt7IyBkZWYuaW5pdFZhcnM6J2RlbCcgfX1cXG5cXG4gICAge3s/IGl0LnBhcnNlZFBhdGgubGVuZ3RoIH19XFxuICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZSB9fVxcblxcbiAgICAgICAge3tcXG4gICAgICAgICAgICB2YXIgY3Vyck5vZGUgPSBpdC5wYXJzZWRQYXRoW2NvdW50XTtcXG4gICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTsgICAgICAgXFxuICAgICAgICB9fVxcblxcbiAgICAgICAgaWYgKCEgdHJlZURvZXNOb3RFeGlzdCAmJiBtICYmIG0uaGFzT3duUHJvcGVydHkgJiYge3sjIGRlZi53YXNEZWZpbmVkfX0pIHtcXG4gICAgICAgICAgICB2YXIgb2xkID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICAgICAgZGVsZXRlIG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAgICAgIHt7IyBkZWYuY2hhbmdlQWNjZXNzUGF0aCB9fVxcbiAgICAgICAgICAgIHZhciBkaWREZWxldGUgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICB7ez8/fX1cXG4gICAgICAgIGlmICh0eXBlb2YgbSAhPSAndW5kZWZpbmVkJykge1xcbiAgICAgICAgICAgIHZhciBvbGQgPSBtO1xcbiAgICAgICAgICAgIHt7IyBkZWYubW9kZWxBY2Nlc3NQcmVmaXggfX0gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgdmFyIGRpZERlbGV0ZSA9IHRydWU7XFxuICAgICAgICB9XFxuICAgIHt7P319XFxuXFxuICAgIGlmIChkaWREZWxldGUgJiYgdGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdkZWxldGVkJywgb2xkVmFsdWU6IG9sZCB9KTtcXG5cXG4gICAgICAgIGFkZFRyZWVDaGFuZ2VzTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCxcXG4gICAgICAgICAgICBhY2Nlc3NQYXRoLCBvbGQsIHVuZGVmaW5lZCk7IC8qIGRlZmluZWQgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgc3ludGhlc2l6ZXMgTW9kZWxQYXRoIHNldHRlciAqL1xcblxcbiAgICAgICAge3sgLyogcG9zdCBhbGwgc3RvcmVkIG1lc3NhZ2VzICovIH19XFxuICAgICAgICB7eyMgZGVmLnBvc3RNZXNzYWdlcyB9fVxcbiAgICB9XFxufTtcXG5cIixcbiAgICBzcGxpY2U6IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxue3sjIGRlZi5pbmNsdWRlX2RlZmluZXMgfX1cXG57eyMgZGVmLmluY2x1ZGVfY3JlYXRlX3RyZWUgfX1cXG57eyMgZGVmLmluY2x1ZGVfdHJhdmVyc2VfdHJlZSB9fVxcblxcbm1ldGhvZCA9IGZ1bmN0aW9uIHNwbGljZShzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueSkgeyAvKiAsLi4uIC0gZXh0cmEgYXJndW1lbnRzIHRvIHNwbGljZSBpbnRvIGFycmF5ICovXFxuICAgIHt7IyBkZWYuaW5pdFZhcnM6J3NwbGljZScgfX1cXG5cXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xcbiAgICB2YXIgYWRkSXRlbXMgPSBhcmdzTGVuID4gMjtcXG5cXG4gICAgaWYgKGFkZEl0ZW1zKSB7XFxuICAgICAgICB7eyAvKiBvbmx5IGNyZWF0ZSBtb2RlbCB0cmVlIGlmIGl0ZW1zIGFyZSBpbnNlcnRlZCBpbiBhcnJheSAqLyB9fVxcblxcbiAgICAgICAge3sgLyogaWYgbW9kZWwgaXMgdW5kZWZpbmVkIGl0IHdpbGwgYmUgc2V0IHRvIGFuIGVtcHR5IGFycmF5ICovIH19ICBcXG4gICAgICAgIHZhciB2YWx1ZSA9IFtdO1xcbiAgICAgICAge3sjIGRlZi5jcmVhdGVUcmVlOidzcGxpY2UnIH19XFxuXFxuICAgICAgICB7ez8gbmV4dE5vZGUgfX1cXG4gICAgICAgICAgICB7e1xcbiAgICAgICAgICAgICAgICB2YXIgY3Vyck5vZGUgPSBuZXh0Tm9kZTtcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgICAgICAgICAgICAgIHZhciBlbXB0eVByb3AgPSAnW10nO1xcbiAgICAgICAgICAgIH19XFxuXFxuICAgICAgICAgICAge3sjIGRlZi5jcmVhdGVUcmVlU3RlcCB9fVxcbiAgICAgICAge3s/fX1cXG5cXG4gICAgfSBlbHNlIGlmIChzcGxpY2VIb3dNYW55ID4gMCkge1xcbiAgICAgICAge3sgLyogaWYgaXRlbXMgYXJlIG5vdCBpbnNlcnRlZCwgb25seSB0cmF2ZXJzZSBtb2RlbCB0cmVlIGlmIGl0ZW1zIGFyZSBkZWxldGVkIGZyb20gYXJyYXkgKi8gfX1cXG4gICAgICAgIHt7PyBpdC5wYXJzZWRQYXRoLmxlbmd0aCB9fVxcbiAgICAgICAgICAgIHt7IyBkZWYudHJhdmVyc2VUcmVlIH19XFxuXFxuICAgICAgICAgICAge3tcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gaXQucGFyc2VkUGF0aFtjb3VudF07XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5OyAgICAgICBcXG4gICAgICAgICAgICB9fVxcblxcbiAgICAgICAgICAgIHt7IC8qIGV4dHJhIGJyYWNlIGNsb3NlcyAnZWxzZScgaW4gZGVmLnRyYXZlcnNlVHJlZVN0ZXAgKi8gfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZVN0ZXAgfX0gfVxcbiAgICAgICAge3s/fX1cXG4gICAgfVxcblxcbiAgICB7eyAvKiBzcGxpY2UgaXRlbXMgKi8gfX1cXG4gICAgaWYgKGFkZEl0ZW1zIHx8ICghIHRyZWVEb2VzTm90RXhpc3QgJiYgbVxcbiAgICAgICAgICAgICYmIG0ubGVuZ3RoID4gc3BsaWNlSW5kZXggKSApIHtcXG4gICAgICAgIHZhciBvbGRMZW5ndGggPSBtLmxlbmd0aCA9IG0ubGVuZ3RoIHx8IDA7XFxuXFxuICAgICAgICBhcmd1bWVudHNbMF0gPSBzcGxpY2VJbmRleCA9IG5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBtLmxlbmd0aCk7XFxuXFxuICAgICAgICB7eyAvKiBjbG9uZSBhZGRlZCBhcmd1bWVudHMgdG8gcHJldmVudCBzYW1lIHJlZmVyZW5jZXMgaW4gbGlua2VkIG1vZGVscyAqLyB9fVxcbiAgICAgICAgaWYgKGFkZEl0ZW1zKVxcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJnc0xlbjsgaSsrKVxcbiAgICAgICAgICAgICAgICBhcmd1bWVudHNbaV0gPSBjbG9uZVRyZWUoYXJndW1lbnRzW2ldKTtcXG5cXG4gICAgICAgIHt7IC8qIGFjdHVhbCBzcGxpY2UgY2FsbCAqLyB9fVxcbiAgICAgICAgdmFyIHJlbW92ZWQgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KG0sIGFyZ3VtZW50cyk7XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnc3BsaWNlJyxcXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBzcGxpY2VJbmRleCwgcmVtb3ZlZDogcmVtb3ZlZCwgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhcmdzTGVuIC0gMiA6IDAsXFxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG5cXG4gICAgICAgICAgICBpZiAocmVtb3ZlZCAmJiByZW1vdmVkLmxlbmd0aClcXG4gICAgICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVBhdGggPSBhY2Nlc3NQYXRoICsgJ1snICsgKHNwbGljZUluZGV4ICsgaW5kZXgpICsgJ10nO1xcbiAgICAgICAgICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gaXRlbVBhdGgsIHR5cGU6ICdyZW1vdmVkJywgb2xkVmFsdWU6IGl0ZW0gfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJc1RyZWUoaXRlbSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgaXRlbVBhdGgsIGl0ZW0sICdyZW1vdmVkJywgJ29sZFZhbHVlJyk7XFxuICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIGlmIChhZGRJdGVtcylcXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmdzTGVuOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gYXJndW1lbnRzW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1QYXRoID0gYWNjZXNzUGF0aCArICdbJyArIChzcGxpY2VJbmRleCArIGkgLSAyKSArICddJztcXG4gICAgICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGl0ZW1QYXRoLCB0eXBlOiAnYWRkZWQnLCBuZXdWYWx1ZTogaXRlbSB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUlzVHJlZShpdGVtKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBpdGVtUGF0aCwgaXRlbSwgJ2FkZGVkJywgJ25ld1ZhbHVlJyk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICB7eyAvKiBwb3N0IGFsbCBzdG9yZWQgbWVzc2FnZXMgKi8gfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnBvc3RNZXNzYWdlcyB9fVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIHJldHVybiByZW1vdmVkIHx8IFtdO1xcbn1cXG5cIlxufTtcblxudmFyIGluY2x1ZGVfZGVmaW5lcyA9IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBpbml0aWFsaXphdGlvbiBjb2RlXFxuICovXFxuIHt7IyMgZGVmLmluaXRWYXJzOm1ldGhvZDpcXG4gICAgdmFyIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19O1xcbiAgICB2YXIgbWVzc2FnZXMgPSBbXSwgbWVzc2FnZXNIYXNoID0ge307XFxuICAgIHZhciBhY2Nlc3NQYXRoID0gJyc7XFxuICAgIHZhciB0cmVlRG9lc05vdEV4aXN0O1xcbiAgICAvKiBoYWNrIHRvIHByZXZlbnQgc2VuZGluZyBmaW5pc2hlZCBldmVudHMgdG8gYWxsb3cgZm9yIHByb3BhZ2F0aW9uIG9mIGJhdGNoZXMgd2l0aG91dCBzcGxpdHRpbmcgdGhlbSAqL1xcbiAgICB2YXIgaW5DaGFuZ2VUcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZygge3s9IG1ldGhvZCB9fSApO1xcbiAjfX1cXG5cXG4vKipcXG4gKiBJbnNlcnRzIHRoZSBiZWdpbm5pbmcgb2YgZnVuY3Rpb24gY2FsbCB0byBhZGQgbWVzc2FnZSB0byBsaXN0XFxuICovXFxue3sjIyBkZWYuYWRkTXNnOiBhZGRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIHsgcGF0aDogI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjdXJyZW50IHByb3BlcnR5L2luZGV4IGZvciBib3RoIG5vcm1hbCBhbmQgaW50ZXJwb2xhdGVkIHByb3BlcnRpZXMvaW5kZXhlc1xcbiAqL1xcbnt7IyMgZGVmLmN1cnJQcm9wOnt7PyBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fVt0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXV17ez8/fX17ez0gY3VyclByb3AgfX17ez99fSAjfX1cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvbmRpdGlvbiB0byB0ZXN0IHdoZXRoZXIgbm9ybWFsL2ludGVycG9sYXRlZCBwcm9wZXJ0eS9pbmRleCBleGlzdHNcXG4gKi9cXG57eyMjIGRlZi53YXNEZWZpbmVkOiBtLmhhc093blByb3BlcnR5KFxcbiAgICB7ez8gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX1cXG4gICAgICAgIHRoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdXFxuICAgIHt7Pz99fVxcbiAgICAgICAgJ3t7PSBpdC5nZXRQYXRoTm9kZUtleShjdXJyTm9kZSkgfX0nXFxuICAgIHt7P319XFxuKSAjfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gdXBkYXRlIGFjY2VzcyBwYXRoIGZvciBjdXJyZW50IHByb3BlcnR5XFxuICogQmVjYXVzZSBvZiB0aGUgcG9zc2liaWxpdHkgb2YgaW50ZXJwb2xhdGVkIHByb3BlcnRpZXMsIGl0IGNhbid0IGJlIGNhbGN1bGF0ZWQgaW4gdGVtcGxhdGUsIGl0IGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgZHVyaW5nIGFjY2Vzc29yIGNhbGwuXFxuICovXFxue3sjIyBkZWYuY2hhbmdlQWNjZXNzUGF0aDpcXG4gICAgYWNjZXNzUGF0aCArPSB7ez8gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX1cXG4gICAgICAgIHt7PyBjdXJyTm9kZS5zeW50YXggPT0gJ2FycmF5JyB9fVxcbiAgICAgICAgICAgICdbJyArIHRoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdICsgJ10nO1xcbiAgICAgICAge3s/P319XFxuICAgICAgICAgICAgJy4nICsgdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF07XFxuICAgICAgICB7ez99fVxcbiAgICB7ez8/fX1cXG4gICAgICAgICd7ez0gY3VyclByb3AgfX0nO1xcbiAgICB7ez99fVxcbiN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byBwb3N0IHN0b3JlZCBtZXNzYWdlc1xcbiAqL1xcbnt7IyMgZGVmLnBvc3RNZXNzYWdlczpcXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCkge1xcbiAgICAgICAge3sjIGRlZi5tb2RlbFBvc3RCYXRjaENvZGUgfX0oJ2RhdGFjaGFuZ2VzJywge1xcbiAgICAgICAgICAgIGNoYW5nZXM6IG1lc3NhZ2VzLFxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBpbkNoYW5nZVRyYW5zYWN0aW9uXFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24obXNnKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5tb2RlbFBvc3RNZXNzYWdlQ29kZSB9fShtc2cucGF0aCwgbXNnKTtcXG4gICAgICAgIH0sIHRoaXMpO1xcbiAgICB9XFxuI319XFxuXCJcbiAgICAsIGluY2x1ZGVfY3JlYXRlX3RyZWUgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byBjcmVhdGUgbW9kZWwgdHJlZSBhcyBuZWNjZXNzYXJ5IGZvciBgc2V0YCBhbmQgYHNwbGljZWAgYWNjZXNzb3JzIGFuZCB0byBhZGQgbWVzc2FnZXMgdG8gc2VuZCBsaXN0IGlmIHRoZSB0cmVlIGNoYW5nZXMuXFxuICovXFxue3sjIyBkZWYuY3JlYXRlVHJlZTptZXRob2Q6XFxuICAgIHZhciB3YXNEZWYgPSB0cnVlO1xcbiAgICB2YXIgb2xkID0gbTtcXG5cXG4gICAge3sgdmFyIGVtcHR5UHJvcCA9IGl0LnBhcnNlZFBhdGhbMF0gJiYgaXQucGFyc2VkUGF0aFswXS5lbXB0eTsgfX1cXG4gICAge3s/IGVtcHR5UHJvcCB9fVxcbiAgICAgICAge3sgLyogY3JlYXRlIHRvcCBsZXZlbCBtb2RlbCBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgZGVmaW5lZCAqLyB9fVxcbiAgICAgICAgaWYgKCEgbSkge1xcbiAgICAgICAgICAgIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0ge3s9IGVtcHR5UHJvcCB9fTtcXG4gICAgICAgICAgICB3YXNEZWYgPSBmYWxzZTtcXG5cXG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gJycsIHR5cGU6ICdhZGRlZCcsXFxuICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBtIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAge3s/P319XFxuICAgICAgICB7ez8gbWV0aG9kID09ICdzcGxpY2UnIH19XFxuICAgICAgICAgICAgaWYgKCEgbSkge1xcbiAgICAgICAge3s/fX1cXG4gICAgICAgICAgICAgICAgbSA9IHt7IyBkZWYubW9kZWxBY2Nlc3NQcmVmaXggfX0gPSBjbG9uZVRyZWUodmFsdWUpO1xcbiAgICAgICAgICAgICAgICB3YXNEZWYgPSB0eXBlb2Ygb2xkICE9ICd1bmRlZmluZWQnO1xcbiAgICAgICAge3s/IG1ldGhvZCA9PSAnc3BsaWNlJyB9fVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIHt7P319ICAgICAgIFxcbiAgICB7ez99fVxcblxcblxcbiAgICB7eyAvKiBjcmVhdGUgbW9kZWwgdHJlZSBpZiBpdCBkb2Vzbid0IGV4aXN0ICovIH19XFxuICAgIHt7ICB2YXIgbW9kZWxEYXRhUHJvcGVydHkgPSAnJztcXG4gICAgICAgIHZhciBuZXh0Tm9kZSA9IGl0LnBhcnNlZFBhdGhbMF07XFxuICAgICAgICB2YXIgY291bnQgPSBpdC5wYXJzZWRQYXRoLmxlbmd0aCAtIDE7XFxuXFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcXG4gICAgICAgICAgICB2YXIgY3Vyck5vZGUgPSBuZXh0Tm9kZTtcXG4gICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTtcXG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGl0LnBhcnNlZFBhdGhbaSArIDFdO1xcbiAgICAgICAgICAgIHZhciBlbXB0eVByb3AgPSBuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5lbXB0eTtcXG4gICAgfX1cXG5cXG4gICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZVN0ZXAgfX1cXG5cXG4gICAge3sgIH0gLyogZm9yIGxvb3AgKi8gfX1cXG4jfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gY3JlYXRlIG9uZSBzdGVwIGluIHRoZSBtb2RlbCB0cmVlXFxuICovXFxue3sjIyBkZWYuY3JlYXRlVHJlZVN0ZXA6XFxuICAgIHt7IyBkZWYuY2hhbmdlQWNjZXNzUGF0aCB9fVxcblxcbiAgICBpZiAoISB7eyMgZGVmLndhc0RlZmluZWQgfX0pIHsgXFxuICAgICAgICB7eyAvKiBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCAqLyB9fVxcbiAgICAgICAgbSA9IG17eyMgZGVmLmN1cnJQcm9wIH19ID0ge3s9IGVtcHR5UHJvcCB9fTtcXG5cXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdhZGRlZCcsIFxcbiAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBtIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBte3sjIGRlZi5jdXJyUHJvcCB9fSAhPSAnb2JqZWN0Jykge1xcbiAgICAgICAge3sgLyogcHJvcGVydHkgaXMgbm90IG9iamVjdCAqLyB9fVxcbiAgICAgICAgdmFyIG9sZCA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAgbSA9IG17eyMgZGVmLmN1cnJQcm9wIH19ID0ge3s9IGVtcHR5UHJvcCB9fTtcXG5cXG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdjaGFuZ2VkJywgXFxuICAgICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9sZCwgbmV3VmFsdWU6IG0gfSk7XFxuICAgICAgICB9XFxuXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB7eyAvKiBwcm9wZXJ0eSBleGlzdHMsIGp1c3QgdHJhdmVyc2UgZG93biB0aGUgbW9kZWwgdHJlZSAqLyB9fVxcbiAgICAgICAgbSA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICB9XFxuI319XFxuXCJcbiAgICAsIGluY2x1ZGVfdHJhdmVyc2VfdHJlZSA9IFwiJ3VzZSBzdHJpY3QnO1xcbi8qIE9ubHkgdXNlIHRoaXMgc3R5bGUgb2YgY29tbWVudHMsIG5vdCBcXFwiLy9cXFwiICovXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHRyYXZlcnNlIG1vZGVsIHRyZWUgZm9yIGBkZWxldGVgIGFuZCBgc3BsaWNlYCBhY2Nlc3NvcnMuXFxuICovXFxue3sjIyBkZWYudHJhdmVyc2VUcmVlOlxcbiAgICB7eyBcXG4gICAgICAgIHZhciBjb3VudCA9IGl0LnBhcnNlZFBhdGgubGVuZ3RoLTE7XFxuXFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsgXFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gaXQucGFyc2VkUGF0aFtpXTtcXG4gICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTtcXG4gICAgfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZVN0ZXAgfX1cXG5cXG4gICAge3sgfSAvKiBmb3IgbG9vcCAqL1xcblxcbiAgICAgICAgdmFyIGkgPSBjb3VudDtcXG4gICAgICAgIHdoaWxlIChpLS0pIHsgLyogY2xvc2luZyBicmFjZXMgZm9yIGVsc2UncyBhYm92ZSAqL1xcbiAgICB9fVxcbiAgICAgICAgICAgIH1cXG4gICAge3sgfSAvKiB3aGlsZSBsb29wICovIH19XFxuI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHRyYXZlcnNlIG9uZSBzdGVwIGluIHRoZSBtb2RlbCB0cmVlXFxuICovXFxue3sjIyBkZWYudHJhdmVyc2VUcmVlU3RlcDpcXG4gICAgaWYgKCEgKG0gJiYgbS5oYXNPd25Qcm9wZXJ0eSAmJiB7eyMgZGVmLndhc0RlZmluZWR9fSApIClcXG4gICAgICAgIHRyZWVEb2VzTm90RXhpc3QgPSB0cnVlO1xcbiAgICBlbHNlIHtcXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgIHt7IyBkZWYuY2hhbmdlQWNjZXNzUGF0aCB9fVxcbiAgICB7eyAvKiBicmFjZSBmcm9tIGVsc2UgaXMgbm90IGNsb3NlZCBvbiBwdXJwb3NlIC0gYWxsIGJyYWNlcyBhcmUgY2xvc2VkIGluIHdoaWxlIGxvb3AgKi8gfX1cXG4jfX1cXG5cIjtcblxudmFyIGRvdERlZiA9IHtcbiAgICBpbmNsdWRlX2RlZmluZXM6IGluY2x1ZGVfZGVmaW5lcyxcbiAgICBpbmNsdWRlX2NyZWF0ZV90cmVlOiBpbmNsdWRlX2NyZWF0ZV90cmVlLFxuICAgIGluY2x1ZGVfdHJhdmVyc2VfdHJlZTogaW5jbHVkZV90cmF2ZXJzZV90cmVlLFxuICAgIGdldFBhdGhOb2RlS2V5OiBwYXRoVXRpbHMuZ2V0UGF0aE5vZGVLZXksXG4gICAgbW9kZWxBY2Nlc3NQcmVmaXg6ICd0aGlzLl9tb2RlbC5fZGF0YScsXG4gICAgbW9kZWxQb3N0TWVzc2FnZUNvZGU6ICd0aGlzLl9tb2RlbC5faW50ZXJuYWxNZXNzZW5nZXIucG9zdE1lc3NhZ2UnLFxuICAgIG1vZGVsUG9zdEJhdGNoQ29kZTogJ3RoaXMuX21vZGVsLnBvc3RNZXNzYWdlU3luYycsXG4gICAgaW50ZXJuYWxNZXNzZW5nZXI6ICd0aGlzLl9tb2RlbC5faW50ZXJuYWxNZXNzZW5nZXInXG59O1xuXG52YXIgbW9kZWxEb3REZWYgPSBfKGRvdERlZikuY2xvbmUoKS5leHRlbmQoe1xuICAgIG1vZGVsQWNjZXNzUHJlZml4OiAndGhpcy5fZGF0YScsXG4gICAgbW9kZWxQb3N0TWVzc2FnZUNvZGU6ICd0aGlzLl9pbnRlcm5hbE1lc3Nlbmdlci5wb3N0TWVzc2FnZScsXG4gICAgbW9kZWxQb3N0QmF0Y2hDb2RlOiAndGhpcy5wb3N0TWVzc2FnZVN5bmMnLFxuICAgIGludGVybmFsTWVzc2VuZ2VyOiAndGhpcy5faW50ZXJuYWxNZXNzZW5nZXInXG59KS5fKCk7XG5cblxudmFyIGRvdFNldHRpbmdzID0gXy5jbG9uZShkb1QudGVtcGxhdGVTZXR0aW5ncyk7XG5kb3RTZXR0aW5ncy5zdHJpcCA9IGZhbHNlO1xuXG52YXIgc3ludGhlc2l6ZXJzID0gXy5tYXBLZXlzKHRlbXBsYXRlcywgZnVuY3Rpb24odG1wbCkge1xuICAgIHJldHVybiBkb1QudGVtcGxhdGUodG1wbCwgZG90U2V0dGluZ3MsIGRvdERlZik7IFxufSk7XG5cblxudmFyIG1vZGVsU3ludGhlc2l6ZXJzID0gXy5tYXBUb09iamVjdChbJ3NldCcsICdkZWwnLCAnc3BsaWNlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4gZG9ULnRlbXBsYXRlKHRlbXBsYXRlc1ttZXRob2ROYW1lXSwgZG90U2V0dGluZ3MsIG1vZGVsRG90RGVmKTtcbn0pO1xuXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCBzeW50aGVzaXplcyBhY2Nlc3NvciBtZXRob2RzLlxuICogRnVuY3Rpb24gaXMgbWVtb2l6ZWQgc28gYWNjZXNzb3JzIGFyZSBjYWNoZWQgKHVwIHRvIDEwMDApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIE1vZGVsL01vZGVsUGF0aCBhY2Nlc3MgcGF0aFxuICogQHBhcmFtIHtBcnJheX0gcGFyc2VkUGF0aCBhcnJheSBvZiBwYXRoIG5vZGVzXG4gKiBAcmV0dXJuIHtPYmplY3RbRnVuY3Rpb25dfVxuICovXG52YXIgc3ludGhlc2l6ZVBhdGhNZXRob2RzID0gXy5tZW1vaXplKF9zeW50aGVzaXplUGF0aE1ldGhvZHMsIHVuZGVmaW5lZCwgMTAwMCk7XG5cbmZ1bmN0aW9uIF9zeW50aGVzaXplUGF0aE1ldGhvZHMocGF0aCwgcGFyc2VkUGF0aCkge1xuICAgIHZhciBtZXRob2RzID0gXy5tYXBLZXlzKHN5bnRoZXNpemVycywgZnVuY3Rpb24oc3ludGhzenIpIHtcbiAgICAgICAgcmV0dXJuIF9zeW50aGVzaXplKHN5bnRoc3pyLCBwYXRoLCBwYXJzZWRQYXRoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWV0aG9kcztcbn1cblxuXG52YXIgbm9ybWFsaXplU3BsaWNlSW5kZXggPSBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4OyAvLyB1c2VkIGluIHNwbGljZS5kb3QuanNcblxuXG5mdW5jdGlvbiBfc3ludGhlc2l6ZShzeW50aGVzaXplciwgcGF0aCwgcGFyc2VkUGF0aCkge1xuICAgIHZhciBtZXRob2RcbiAgICAgICAgLCBtZXRob2RDb2RlID0gc3ludGhlc2l6ZXIoe1xuICAgICAgICAgICAgcGFyc2VkUGF0aDogcGFyc2VkUGF0aCxcbiAgICAgICAgICAgIGdldFBhdGhOb2RlS2V5OiBwYXRoVXRpbHMuZ2V0UGF0aE5vZGVLZXlcbiAgICAgICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgICBldmFsKG1ldGhvZENvZGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgTW9kZWxFcnJvcignTW9kZWxQYXRoIG1ldGhvZCBjb21waWxhdGlvbiBlcnJvcjsgcGF0aDogJyArIHBhdGggKyAnLCBjb2RlOiAnICsgbWV0aG9kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGhvZDtcblxuXG4gICAgLy8gZnVuY3Rpb25zIHVzZWQgYnkgbWV0aG9kcyBgc2V0YCwgYGRlbGV0ZWAgYW5kIGBzcGxpY2VgIChzeW50aGVzaXplZCBieSB0ZW1wbGF0ZSlcbiAgICBmdW5jdGlvbiBhZGRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIG1zZykge1xuICAgICAgICBtZXNzYWdlcy5wdXNoKG1zZyk7XG4gICAgICAgIG1lc3NhZ2VzSGFzaFttc2cucGF0aF0gPSBtc2c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVHJlZUNoYW5nZXNNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIHZhciBvbGRJc1RyZWUgPSB2YWx1ZUlzVHJlZShvbGRWYWx1ZSlcbiAgICAgICAgICAgICwgbmV3SXNUcmVlID0gdmFsdWVJc1RyZWUobmV3VmFsdWUpO1xuXG4gICAgICAgIGlmIChuZXdJc1RyZWUpXG4gICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgbmV3VmFsdWUsICdhZGRlZCcsICduZXdWYWx1ZScpO1xuICAgICAgICBcbiAgICAgICAgaWYgKG9sZElzVHJlZSlcbiAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIHJvb3RQYXRoLCBvbGRWYWx1ZSwgJ3JlbW92ZWQnLCAnb2xkVmFsdWUnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgb2JqLCBtc2dUeXBlLCB2YWx1ZVByb3ApIHtcbiAgICAgICAgX2FkZE1lc3NhZ2VzKHJvb3RQYXRoLCBvYmopO1xuXG5cbiAgICAgICAgZnVuY3Rpb24gX2FkZE1lc3NhZ2VzKHJvb3RQYXRoLCBvYmopIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aFN5bnRheCA9IHJvb3RQYXRoICsgJ1skJF0nO1xuICAgICAgICAgICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlKHZhbHVlLCBpbmRleCwgcGF0aFN5bnRheCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXRoU3ludGF4ID0gcm9vdFBhdGggKyAnLiQkJztcbiAgICAgICAgICAgICAgICBfLmVhY2hLZXkob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2UodmFsdWUsIGtleSwgcGF0aFN5bnRheCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhZGRNZXNzYWdlKHZhbHVlLCBrZXksIHBhdGhTeW50YXgpIHtcbiAgICAgICAgICAgIHZhciBwYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSlcbiAgICAgICAgICAgICAgICAsIGV4aXN0aW5nTXNnID0gbWVzc2FnZXNIYXNoW3BhdGhdO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdNc2cpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdNc2cudHlwZSA9PSBtc2dUeXBlKVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ3NldHRlciBlcnJvcjogc2FtZSBtZXNzYWdlIHR5cGUgcG9zdGVkIG9uIHRoZSBzYW1lIHBhdGgnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNc2cudHlwZSA9ICdjaGFuZ2VkJztcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNc2dbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IHsgcGF0aDogcGF0aCwgdHlwZTogbXNnVHlwZSB9O1xuICAgICAgICAgICAgICAgIG1zZ1t2YWx1ZVByb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBtc2cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWVJc1RyZWUodmFsdWUpKVxuICAgICAgICAgICAgICAgIF9hZGRNZXNzYWdlcyhwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZVRyZWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpXG4gICAgICAgICAgICAgICAgPyBfLmRlZXBDbG9uZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb3RlY3RWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgICAgICA6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUuc2xpY2UoKVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5jcmVhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlSXNUcmVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbFxuICAgICAgICAgICAgICAgICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgJiYgISAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRCYXRjaElkc1RvTWVzc2FnZShtc2csIGJhdGNoSWQsIG1zZ0lkKSB7XG4gICAgICAgIF8uZGVmaW5lUHJvcGVydGllcyhtc2csIHtcbiAgICAgICAgICAgIF9fYmF0Y2hfaWQ6IGJhdGNoSWQsXG4gICAgICAgICAgICBfX21zZ19pZDogbXNnSWRcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRXhwb3J0cyBgc3ludGhlc2l6ZWAgZnVuY3Rpb24gd2l0aCB0aGUgZm9sbG93aW5nOlxuICpcbiAqIC0gLm1vZGVsTWV0aG9kcy5zZXQgLSBgc2V0YCBtZXRob2QgZm9yIE1vZGVsXG4gKiAtIC5tb2RlbE1ldGhvZHMuZGVsIC0gYGRlbGAgbWV0aG9kIGZvciBNb2RlbFxuICogLSAubW9kZWxNZXRob2RzLnNwbGljZSAtIGBzcGxpY2VgIG1ldGhvZCBmb3IgTW9kZWxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBzeW50aGVzaXplUGF0aE1ldGhvZHM7XG5cbnZhciBtb2RlbE1ldGhvZHMgPSBfLm1hcEtleXMobW9kZWxTeW50aGVzaXplcnMsIGZ1bmN0aW9uKHN5bnRoZXNpemVyKSB7XG4gICAgcmV0dXJuIF9zeW50aGVzaXplKHN5bnRoZXNpemVyLCAnJywgW10pO1xufSk7XG5cbnN5bnRoZXNpemVQYXRoTWV0aG9kcy5tb2RlbE1ldGhvZHMgPSBtb2RlbE1ldGhvZHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbHMuY2hlY2tgXG4gKlxuICogQ2hlY2sgaXMgYSBtb2R1bGUgZm9yIHBhcmFtZXRlcnMgY2hlY2tpbmcgZXh0cmFjdGVkIGZyb20gW01ldGVvcl0oaHR0cDovL2RvY3MubWV0ZW9yLmNvbS8pIGZyYW1ld29yay5cbiAqXG4gKiBJdCBhbGxvd3MgdG8gYm90aCBkb2N1bWVudCBhbmQgdG8gY2hlY2sgcGFyYW1ldGVyIHR5cGVzIGluIHlvdXIgZnVuY3Rpb25cbiAqIG1ha2luZyBjb2RlIGJvdGggcmVhZGFibGUgYW5kIHN0YWJsZS5cbiAqXG4gKlxuICogIyMjIFVzYWdlXG4gKmBgYFxuICogdmFyIGNoZWNrID0gbWlsby5jaGVja1xuICogICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcbiAqXG4gKiBmdW5jdGlvbiBNeShuYW1lLCBvYmosIGNiKSB7XG4gKiAgICAgLy8gaWYgYW55IG9mIGNoZWNrcyBmYWlsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duXG4gKiAgICAgY2hlY2sobmFtZSwgU3RyaW5nKTtcbiAqICAgICBjaGVjayhvYmosIE1hdGNoLk9iamVjdEluY2x1ZGluZyh7IG9wdGlvbnM6IE9iamVjdCB9KSk7XG4gKiAgICAgY2hlY2soY2IsIEZ1bmN0aW9uKTtcbiAqXG4gKiAgICAgLy8gLi4uIHlvdXIgY29kZVxuICogfVxuICpgYGBcbiAqIFNlZSBbTWV0ZW9yIGRvY3NdKGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vI21hdGNoKSB0byBzZWUgaG93IGl0IHdvcmtzXG4gKlxuICpcbiAqICMjIyBQYXR0ZXJuc1xuICpcbiAqIEFsbCBwYXR0ZXJucyBhbmQgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiBNZXRlb3IgZG9jcyB3b3JrLlxuICpcbiAqIFVubGlrZSBpbiBNZXRlb3IsIE9iamVjdCBwYXR0ZXJuIG1hdGNoZXMgaW5zdGFuY2Ugb2YgYW55IGNsYXNzLFxuICogbm90IG9ubHkgcGxhaW4gb2JqZWN0LlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHBhdHRlcm5zIGRlc2NyaWJlZCBpbiBNZXRlb3IgZG9jcyB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSBpbXBsZW1lbnRlZFxuICpcbiAqICogTWF0Y2guX19PYmplY3RIYXNoX18oX3BhdHRlcm5fKVxuICpcbiAqICAgTWF0Y2hlcyBhbiBvYmplY3Qgd2hlcmUgYWxsIHByb3BlcnRpZXMgbWF0Y2ggYSBnaXZlbiBwYXR0ZXJuXG4gKlxuICogKiBNYXRjaC5fX1N1YmNsYXNzX18oX2NvbnN0cnVjdG9yXyBbLCBfbWF0Y2hUaGlzQ2xhc3NUb29fXSlcbiAqXG4gKiAgIE1hdGNoZXMgYSBjbGFzcyB0aGF0IGlzIGEgc3ViY2xhc3Mgb2YgYSBnaXZlbiBjbGFzcy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAqICAgaXMgdHJ1ZSwgaXQgd2lsbCBhbHNvIG1hdGNoIHRoZSBjbGFzcyBpdHNlbGYuXG4gKlxuICogICBXaXRob3V0IHRoaXMgcGF0dGVybiB0byBjaGVjayBpZiBfTXlTdWJjbGFzc18gaXMgYSBzdWJjbGFzcyBvZiBfTXlDbGFzc19cbiAqICAgeW91IHdvdWxkIGhhdmUgdG8gdXNlXG4gKlxuICogICAgICAgY2hlY2soTXlTdWJjbGFzcywgTWF0Y2guV2hlcmUoZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIE15U3ViY2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgTXlDbGFzcztcbiAqICAgICAgIH0pO1xuICpcbiAqXG4gKiBUaGluZ3Mgd2UgZXhwbGljaXRseSBkbyBOT1Qgc3VwcG9ydDpcbiAqICAgIC0gaGV0ZXJvZ2Vub3VzIGFycmF5c1xuKiovXG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIHBhdHRlcm4pIHtcbiAgICBpZiAoY29uZmlnLmNoZWNrID09PSBmYWxzZSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgLy8gUmVjb3JkIHRoYXQgY2hlY2sgZ290IGNhbGxlZCwgaWYgc29tZWJvZHkgY2FyZWQuXG4gICAgdHJ5IHtcbiAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlLCBwYXR0ZXJuKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKChlcnIgaW5zdGFuY2VvZiBNYXRjaC5FcnJvcikgJiYgZXJyLnBhdGgpXG4gICAgICAgICAgICBlcnIubWVzc2FnZSArPSBcIiBpbiBmaWVsZCBcIiArIGVyci5wYXRoO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjaGVjaztcblxudmFyIE1hdGNoID0gY2hlY2suTWF0Y2ggPSB7XG4gICAgT3B0aW9uYWw6IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3B0aW9uYWwocGF0dGVybik7XG4gICAgfSxcbiAgICBPbmVPZjogZnVuY3Rpb24gKC8qIGFyZ3VtZW50cyAqLykge1xuICAgICAgICByZXR1cm4gbmV3IE9uZU9mKGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBBbnk6IFsnX19hbnlfXyddLFxuICAgIFdoZXJlOiBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlcmUoY29uZGl0aW9uKTtcbiAgICB9LFxuICAgIE9iamVjdEluY2x1ZGluZzogZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RJbmNsdWRpbmcocGF0dGVybik7XG4gICAgfSxcbiAgICAvLyBNYXRjaGVzIG9ubHkgc2lnbmVkIDMyLWJpdCBpbnRlZ2Vyc1xuICAgIEludGVnZXI6IFsnX19pbnRlZ2VyX18nXSxcblxuICAgIC8vIE1hdGNoZXMgc3RyaW5nIHRoYXQgaXMgYSB2YWxpZCBpZGVudGlmaWVyLCB3aWxsIG5vdCBhbGxvdyBqYXZhc2NyaXB0IHJlc2VydmVkIHdvcmRzXG4gICAgSWRlbnRpZmllclN0cmluZzogL15bYS16XyRdWzAtOWEtel8kXSokL2ksXG5cbiAgICAvLyBNYXRjaGVzIGhhc2ggKG9iamVjdCkgd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgcGF0dGVyblxuICAgIE9iamVjdEhhc2g6IGZ1bmN0aW9uKHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RIYXNoKHBhdHRlcm4pO1xuICAgIH0sXG5cbiAgICBTdWJjbGFzczogZnVuY3Rpb24oU3VwZXJjbGFzcywgbWF0Y2hTdXBlcmNsYXNzVG9vKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3ViY2xhc3MoU3VwZXJjbGFzcywgbWF0Y2hTdXBlcmNsYXNzVG9vKTtcbiAgICB9LFxuXG4gICAgLy8gWFhYIG1hdGNoZXJzIHNob3VsZCBrbm93IGhvdyB0byBkZXNjcmliZSB0aGVtc2VsdmVzIGZvciBlcnJvcnNcbiAgICBFcnJvcjogVHlwZUVycm9yLFxuXG4gICAgLy8gTWV0ZW9yLm1ha2VFcnJvclR5cGUoXCJNYXRjaC5FcnJvclwiLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgIC8vIHRoaXMubWVzc2FnZSA9IFwiTWF0Y2ggZXJyb3I6IFwiICsgbXNnO1xuICAgICAgICAvLyBUaGUgcGF0aCBvZiB0aGUgdmFsdWUgdGhhdCBmYWlsZWQgdG8gbWF0Y2guIEluaXRpYWxseSBlbXB0eSwgdGhpcyBnZXRzXG4gICAgICAgIC8vIHBvcHVsYXRlZCBieSBjYXRjaGluZyBhbmQgcmV0aHJvd2luZyB0aGUgZXhjZXB0aW9uIGFzIGl0IGdvZXMgYmFjayB1cCB0aGVcbiAgICAgICAgLy8gc3RhY2suXG4gICAgICAgIC8vIEUuZy46IFwidmFsc1szXS5lbnRpdHkuY3JlYXRlZFwiXG4gICAgICAgIC8vIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgICAgIC8vIElmIHRoaXMgZ2V0cyBzZW50IG92ZXIgRERQLCBkb24ndCBnaXZlIGZ1bGwgaW50ZXJuYWwgZGV0YWlscyBidXQgYXQgbGVhc3RcbiAgICAgICAgLy8gcHJvdmlkZSBzb21ldGhpbmcgYmV0dGVyIHRoYW4gNTAwIEludGVybmFsIHNlcnZlciBlcnJvci5cbiAgICAvLyAgICAgdGhpcy5zYW5pdGl6ZWRFcnJvciA9IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCBcIk1hdGNoIGZhaWxlZFwiKTtcbiAgICAvLyB9KSxcblxuICAgIC8vIFRlc3RzIHRvIHNlZSBpZiB2YWx1ZSBtYXRjaGVzIHBhdHRlcm4uIFVubGlrZSBjaGVjaywgaXQgbWVyZWx5IHJldHVybnMgdHJ1ZVxuICAgIC8vIG9yIGZhbHNlICh1bmxlc3MgYW4gZXJyb3Igb3RoZXIgdGhhbiBNYXRjaC5FcnJvciB3YXMgdGhyb3duKS5cbiAgICB0ZXN0OiBmdW5jdGlvbiAodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNYXRjaC5FcnJvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBSZXRocm93IG90aGVyIGVycm9ycy5cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBPcHRpb25hbChwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbn07XG5cbmZ1bmN0aW9uIE9uZU9mKGNob2ljZXMpIHtcbiAgICBpZiAoY2hvaWNlcy5sZW5ndGggPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBjaG9pY2UgdG8gTWF0Y2guT25lT2ZcIik7XG4gICAgdGhpcy5jaG9pY2VzID0gY2hvaWNlcztcbn07XG5cbmZ1bmN0aW9uIFdoZXJlKGNvbmRpdGlvbikge1xuICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xufTtcblxuZnVuY3Rpb24gT2JqZWN0SW5jbHVkaW5nKHBhdHRlcm4pIHtcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xufTtcblxuZnVuY3Rpb24gT2JqZWN0SGFzaChwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbn07XG5cbmZ1bmN0aW9uIFN1YmNsYXNzKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbykge1xuICAgIHRoaXMuU3VwZXJjbGFzcyA9IFN1cGVyY2xhc3M7XG4gICAgdGhpcy5tYXRjaFN1cGVyY2xhc3MgPSBtYXRjaFN1cGVyY2xhc3NUb287XG59O1xuXG52YXIgdHlwZW9mQ2hlY2tzID0gW1xuICAgIFtTdHJpbmcsIFwic3RyaW5nXCJdLFxuICAgIFtOdW1iZXIsIFwibnVtYmVyXCJdLFxuICAgIFtCb29sZWFuLCBcImJvb2xlYW5cIl0sXG4gICAgW0Z1bmN0aW9uLCBcImZ1bmN0aW9uXCJdLFxuICAgIC8vIFdoaWxlIHdlIGRvbid0IGFsbG93IHVuZGVmaW5lZCBpbiBKU09OLCB0aGlzIGlzIGdvb2QgZm9yIG9wdGlvbmFsXG4gICAgLy8gYXJndW1lbnRzIHdpdGggT25lT2YuXG4gICAgW3VuZGVmaW5lZCwgXCJ1bmRlZmluZWRcIl1cbl07XG5cbmZ1bmN0aW9uIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybikge1xuICAgIC8vIE1hdGNoIGFueXRoaW5nIVxuICAgIGlmIChwYXR0ZXJuID09PSBNYXRjaC5BbnkpXG4gICAgICAgIHJldHVybjtcblxuICAgIC8vIEJhc2ljIGF0b21pYyB0eXBlcy5cbiAgICAvLyBEbyBub3QgbWF0Y2ggYm94ZWQgb2JqZWN0cyAoZS5nLiBTdHJpbmcsIEJvb2xlYW4pXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlb2ZDaGVja3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IHR5cGVvZkNoZWNrc1tpXVswXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gdHlwZW9mQ2hlY2tzW2ldWzFdKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIFwiICsgdHlwZW9mQ2hlY2tzW2ldWzFdICsgXCIsIGdvdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdHRlcm4gPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBudWxsLCBnb3QgXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8vIE1hdGNoLkludGVnZXIgaXMgc3BlY2lhbCB0eXBlIGVuY29kZWQgd2l0aCBhcnJheVxuICAgIGlmIChwYXR0ZXJuID09PSBNYXRjaC5JbnRlZ2VyKSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIGNvbnNpc3RlbnQgYW5kIHJlbGlhYmxlIHdheSB0byBjaGVjayBpZiB2YXJpYWJsZSBpcyBhIDY0LWJpdFxuICAgICAgICAvLyBpbnRlZ2VyLiBPbmUgb2YgdGhlIHBvcHVsYXIgc29sdXRpb25zIGlzIHRvIGdldCByZW1pbmRlciBvZiBkaXZpc2lvbiBieSAxXG4gICAgICAgIC8vIGJ1dCB0aGlzIG1ldGhvZCBmYWlscyBvbiByZWFsbHkgbGFyZ2UgZmxvYXRzIHdpdGggYmlnIHByZWNpc2lvbi5cbiAgICAgICAgLy8gRS5nLjogMS4zNDgxOTIzMDg0OTE4MjRlKzIzICUgMSA9PT0gMCBpbiBWOFxuICAgICAgICAvLyBCaXR3aXNlIG9wZXJhdG9ycyB3b3JrIGNvbnNpc3RhbnRseSBidXQgYWx3YXlzIGNhc3QgdmFyaWFibGUgdG8gMzItYml0XG4gICAgICAgIC8vIHNpZ25lZCBpbnRlZ2VyIGFjY29yZGluZyB0byBKYXZhU2NyaXB0IHNwZWNzLlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAodmFsdWUgfCAwKSA9PT0gdmFsdWUpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKCdFeHBlY3RlZCBJbnRlZ2VyLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gPT09IE1hdGNoLklkZW50aWZpZXJTdHJpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgTWF0Y2guSWRlbnRpZmllclN0cmluZy50ZXN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICYmIF9qc0tleXdvcmRzLmluZGV4T2Yoa2V5KSA9PSAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKCdFeHBlY3RlZCBpZGVudGlmaWVyIHN0cmluZywgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8vIFwiT2JqZWN0XCIgaXMgc2hvcnRoYW5kIGZvciBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe30pO1xuICAgIGlmIChwYXR0ZXJuID09PSBPYmplY3QpXG4gICAgICAgIHBhdHRlcm4gPSBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe30pO1xuXG4gICAgLy8gQXJyYXkgKGNoZWNrZWQgQUZURVIgQW55LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhbiBBcnJheSkuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBpZiAocGF0dGVybi5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkJhZCBwYXR0ZXJuOiBhcnJheXMgbXVzdCBoYXZlIG9uZSB0eXBlIGVsZW1lbnRcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXR0ZXJuKSk7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIGFycmF5LCBnb3QgXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodmFsdWVFbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWVFbGVtZW50LCBwYXR0ZXJuWzBdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNYXRjaC5FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnIucGF0aCA9IF9wcmVwZW5kUGF0aChpbmRleCwgZXJyLnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXJiaXRyYXJ5IHZhbGlkYXRpb24gY2hlY2tzLiBUaGUgY29uZGl0aW9uIGNhbiByZXR1cm4gZmFsc2Ugb3IgdGhyb3cgYVxuICAgIC8vIE1hdGNoLkVycm9yIChpZSwgaXQgY2FuIGludGVybmFsbHkgdXNlIGNoZWNrKCkpIHRvIGZhaWwuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBXaGVyZSkge1xuICAgICAgICBpZiAocGF0dGVybi5jb25kaXRpb24odmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBYWFggdGhpcyBlcnJvciBpcyB0ZXJyaWJsZVxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJGYWlsZWQgTWF0Y2guV2hlcmUgdmFsaWRhdGlvblwiKTtcbiAgICB9XG5cblxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT3B0aW9uYWwpXG4gICAgICAgIHBhdHRlcm4gPSBNYXRjaC5PbmVPZih1bmRlZmluZWQsIHBhdHRlcm4ucGF0dGVybik7XG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9uZU9mKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0dGVybi5jaG9pY2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybi5jaG9pY2VzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBObyBlcnJvcj8gWWF5LCByZXR1cm4uXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXIgZXJyb3JzIHNob3VsZCBiZSB0aHJvd24uIE1hdGNoIGVycm9ycyBqdXN0IG1lYW4gdHJ5IGFub3RoZXJcbiAgICAgICAgICAgICAgICAvLyBjaG9pY2UuXG4gICAgICAgICAgICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gWFhYIHRoaXMgZXJyb3IgaXMgdGVycmlibGVcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRmFpbGVkIE1hdGNoLk9uZU9mIG9yIE1hdGNoLk9wdGlvbmFsIHZhbGlkYXRpb25cIik7XG4gICAgfVxuXG4gICAgLy8gQSBmdW5jdGlvbiB0aGF0IGlzbid0IHNvbWV0aGluZyB3ZSBzcGVjaWFsLWNhc2UgaXMgYXNzdW1lZCB0byBiZSBhXG4gICAgLy8gY29uc3RydWN0b3IuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBwYXR0ZXJuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBYWFggd2hhdCBpZiAubmFtZSBpc24ndCBkZWZpbmVkXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIFwiICsgcGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgdW5rbm93bktleXNBbGxvd2VkID0gZmFsc2U7XG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPYmplY3RJbmNsdWRpbmcpIHtcbiAgICAgICAgdW5rbm93bktleXNBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucGF0dGVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9iamVjdEhhc2gpIHtcbiAgICAgICAgdmFyIGtleVBhdHRlcm4gPSBwYXR0ZXJuLnBhdHRlcm47XG4gICAgICAgIHZhciBlbXB0eUhhc2ggPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGVtcHR5SGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgY2hlY2sodmFsdWVba2V5XSwga2V5UGF0dGVybik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVtcHR5SGFzaClcbiAgICAgICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkV4cGVjdGVkIFwiICsgcGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgU3ViY2xhc3MpIHtcbiAgICAgICAgdmFyIFN1cGVyY2xhc3MgPSBwYXR0ZXJuLlN1cGVyY2xhc3M7XG4gICAgICAgIGlmIChwYXR0ZXJuLm1hdGNoU3VwZXJjbGFzcyAmJiB2YWx1ZSA9PSBTdXBlcmNsYXNzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoISAodmFsdWUucHJvdG90eXBlIGluc3RhbmNlb2YgU3VwZXJjbGFzcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSArIFwiIG9mIFwiICsgU3VwZXJjbGFzcy5uYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgcGF0dGVybjogdW5rbm93biBwYXR0ZXJuIHR5cGVcIik7XG5cbiAgICAvLyBBbiBvYmplY3QsIHdpdGggcmVxdWlyZWQgYW5kIG9wdGlvbmFsIGtleXMuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGRvXG4gICAgLy8gc3RydWN0dXJhbCBtYXRjaGVzIGFnYWluc3Qgb2JqZWN0cyBvZiBzcGVjaWFsIHR5cGVzIHRoYXQgaGFwcGVuIHRvIG1hdGNoXG4gICAgLy8gdGhlIHBhdHRlcm46IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGEgcGxhaW4gb2xkIHtPYmplY3R9IVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKVxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBvYmplY3QsIGdvdCBcIiArIHR5cGVvZiB2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBvYmplY3QsIGdvdCBudWxsXCIpO1xuXG4gICAgdmFyIHJlcXVpcmVkUGF0dGVybnMgPSB7fTtcbiAgICB2YXIgb3B0aW9uYWxQYXR0ZXJucyA9IHt9O1xuXG4gICAgXy5lYWNoS2V5KHBhdHRlcm4sIGZ1bmN0aW9uKHN1YlBhdHRlcm4sIGtleSkge1xuICAgICAgICBpZiAocGF0dGVybltrZXldIGluc3RhbmNlb2YgT3B0aW9uYWwpXG4gICAgICAgICAgICBvcHRpb25hbFBhdHRlcm5zW2tleV0gPSBwYXR0ZXJuW2tleV0ucGF0dGVybjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVxdWlyZWRQYXR0ZXJuc1trZXldID0gcGF0dGVybltrZXldO1xuICAgIH0sIHRoaXMsIHRydWUpO1xuXG4gICAgXy5lYWNoS2V5KHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgIHZhciBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZWRQYXR0ZXJucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHN1YlZhbHVlLCByZXF1aXJlZFBhdHRlcm5zW2tleV0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByZXF1aXJlZFBhdHRlcm5zW2tleV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsUGF0dGVybnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZShzdWJWYWx1ZSwgb3B0aW9uYWxQYXR0ZXJuc1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bmtub3duS2V5c0FsbG93ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIlVua25vd24ga2V5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNYXRjaC5FcnJvcilcbiAgICAgICAgICAgICAgICBlcnIucGF0aCA9IF9wcmVwZW5kUGF0aChrZXksIGVyci5wYXRoKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH0sIHRoaXMsIHRydWUpO1xuXG4gICAgXy5lYWNoS2V5KHJlcXVpcmVkUGF0dGVybnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiTWlzc2luZyBrZXkgJ1wiICsga2V5ICsgXCInXCIpO1xuICAgIH0sIHRoaXMsIHRydWUpO1xufTtcblxuXG52YXIgX2pzS2V5d29yZHMgPSBbXCJkb1wiLCBcImlmXCIsIFwiaW5cIiwgXCJmb3JcIiwgXCJsZXRcIiwgXCJuZXdcIiwgXCJ0cnlcIiwgXCJ2YXJcIiwgXCJjYXNlXCIsXG4gICAgXCJlbHNlXCIsIFwiZW51bVwiLCBcImV2YWxcIiwgXCJmYWxzZVwiLCBcIm51bGxcIiwgXCJ0aGlzXCIsIFwidHJ1ZVwiLCBcInZvaWRcIiwgXCJ3aXRoXCIsXG4gICAgXCJicmVha1wiLCBcImNhdGNoXCIsIFwiY2xhc3NcIiwgXCJjb25zdFwiLCBcInN1cGVyXCIsIFwidGhyb3dcIiwgXCJ3aGlsZVwiLCBcInlpZWxkXCIsXG4gICAgXCJkZWxldGVcIiwgXCJleHBvcnRcIiwgXCJpbXBvcnRcIiwgXCJwdWJsaWNcIiwgXCJyZXR1cm5cIiwgXCJzdGF0aWNcIiwgXCJzd2l0Y2hcIixcbiAgICBcInR5cGVvZlwiLCBcImRlZmF1bHRcIiwgXCJleHRlbmRzXCIsIFwiZmluYWxseVwiLCBcInBhY2thZ2VcIiwgXCJwcml2YXRlXCIsIFwiY29udGludWVcIixcbiAgICBcImRlYnVnZ2VyXCIsIFwiZnVuY3Rpb25cIiwgXCJhcmd1bWVudHNcIiwgXCJpbnRlcmZhY2VcIiwgXCJwcm90ZWN0ZWRcIiwgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJpbnN0YW5jZW9mXCJdO1xuXG4vLyBBc3N1bWVzIHRoZSBiYXNlIG9mIHBhdGggaXMgYWxyZWFkeSBlc2NhcGVkIHByb3Blcmx5XG4vLyByZXR1cm5zIGtleSArIGJhc2VcbmZ1bmN0aW9uIF9wcmVwZW5kUGF0aChrZXksIGJhc2UpIHtcbiAgICBpZiAoKHR5cGVvZiBrZXkpID09PSBcIm51bWJlclwiIHx8IGtleS5tYXRjaCgvXlswLTldKyQvKSlcbiAgICAgICAga2V5ID0gXCJbXCIgKyBrZXkgKyBcIl1cIjtcbiAgICBlbHNlIGlmICgha2V5Lm1hdGNoKE1hdGNoLklkZW50aWZpZXJTdHJpbmcpIHx8IF9qc0tleXdvcmRzLmluZGV4T2Yoa2V5KSAhPSAtMSlcbiAgICAgICAga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2tleV0pO1xuXG4gICAgaWYgKGJhc2UgJiYgYmFzZVswXSAhPT0gXCJbXCIpXG4gICAgICAgIHJldHVybiBrZXkgKyAnLicgKyBiYXNlO1xuICAgIHJldHVybiBrZXkgKyBiYXNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby51dGlsYFxuICovXG52YXIgdXRpbCA9IHtcbiAgICBsb2dnZXI6IHJlcXVpcmUoJy4vbG9nZ2VyJyksXG4gICAgY2hlY2s6IHJlcXVpcmUoJy4vY2hlY2snKSxcbiAgICBkb1Q6IHJlcXVpcmUoJ2RvdCcpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHV0aWw7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJ1dGlscy1sb2dnZXJcIj48L2E+XG4vLyBtaWxvLnV0aWxzLmxvZ2dlclxuLy8gLS0tLS0tLS0tLS1cblxuLy8gQXBwbGljYXRpb24gbG9nZ2VyIHRoYXQgaGFzIGVycm9yLCB3YXJuLCBpbmZvIGFuZCBkZWJ1Z1xuLy8gbWV0aG9kcywgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBieSBzZXR0aW5nIGxvZyBsZXZlbC5cblxuLy8gUHJvcGVydGllczpcblxuLy8gLSBsZXZlbFxuXG4vLyAgIC0gMCAtIGVycm9yXG4vLyAgIC0gMSAtIHdhcm5cbi8vICAgLSAyIC0gaW5mb1xuLy8gICAtIDMgLSBkZWJ1ZyAoZGVmYXVsdClcblxuLy8gLSBlbmFibGVkXG5cbi8vICAgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZyBpbiBicm93c2VyIGNvbnNvbGUuXG5cblxudmFyIExvZ2dlciA9IHJlcXVpcmUoJy4vbG9nZ2VyX2NsYXNzJyk7XG5cbnZhciBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgbGV2ZWw6IDMgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9nZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAjIyMgTG9nZ2VyIENsYXNzXG5cbi8vIFByb3BlcnRpZXM6XG5cbi8vIC0gbGV2ZWxcblxuLy8gICAtIDAgLSBlcnJvclxuLy8gICAtIDEgLSB3YXJuXG4vLyAgIC0gMiAtIGluZm9cbi8vICAgLSAzIC0gZGVidWcgKGRlZmF1bHQpXG5cbi8vIC0gZW5hYmxlZFxuXG4vLyAgIHRydWUgYnkgZGVmYXVsdC4gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgaW4gYnJvd3NlciBjb25zb2xlLlxuXG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBMb2cgbGV2ZWxzLlxuICovXG5cbnZhciBsZXZlbHMgPSBbXG4gICAgJ2Vycm9yJyxcbiAgICAnd2FybicsXG4gICAgJ2luZm8nLFxuICAgICdkZWJ1Zydcbl07XG5cbnZhciBtYXhMZXZlbExlbmd0aCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGxldmVscy5tYXAoZnVuY3Rpb24obGV2ZWwpIHsgcmV0dXJuIGxldmVsLmxlbmd0aDsgfSkpO1xuXG4vKipcbiAqIENvbG9ycyBmb3IgbG9nIGxldmVscy5cbiAqL1xuXG52YXIgY29sb3JzID0gW1xuICAgIDMxLFxuICAgIDMzLFxuICAgIDM2LFxuICAgIDkwXG5dO1xuXG4vKipcbiAqIFBhZHMgdGhlIG5pY2Ugb3V0cHV0IHRvIHRoZSBsb25nZXN0IGxvZyBsZXZlbC5cbiAqL1xuZnVuY3Rpb24gcGFkKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoIDwgbWF4TGV2ZWxMZW5ndGgpXG4gICAgICAgIHJldHVybiBzdHIgKyBuZXcgQXJyYXkobWF4TGV2ZWxMZW5ndGggLSBzdHIubGVuZ3RoICsgMSkuam9pbignICcpO1xuXG4gICAgcmV0dXJuIHN0cjtcbn07XG5cblxuZnVuY3Rpb24gY29sb3JlZChzdHIsIGNvbG9yKSB7XG4gICAgcmV0dXJuICdcXHgxQlsnICsgY29sb3IgKyAnbScgKyBzdHIgKyAnIC1cXHgxQlszOW0nO1xufVxuXG5cbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gICAgbGV2ZWw6IDMsXG4gICAgdGhyb3dMZXZlbDogLTEsIC8vIG5ldmVyIHRocm93XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBsb2dQcmVmaXg6ICcnXG59XG5cblxuLyoqXG4gKiBMb2dnZXIgKGNvbnNvbGUpLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbnZhciBMb2dnZXIgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIF8uZXh0ZW5kKHRoaXMsIERFRkFVTFRfT1BUSU9OUyk7XG4gICAgXy5leHRlbmQodGhpcywgb3B0cyB8fCB7fSk7XG59O1xuXG5cbi8qKlxuICogTG9nIG1ldGhvZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkxvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICB2YXIgaW5kZXggPSBsZXZlbHMuaW5kZXhPZih0eXBlKTtcblxuICAgIGlmICghIHRoaXMuZW5hYmxlZCB8fCBpbmRleCA+IHRoaXMubGV2ZWwpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgdmFyIGFyZ3MgPSBfLnNsaWNlKGFyZ3VtZW50cywgMSk7XG5cbiAgICBpZiAoaW5kZXggPD0gdGhpcy50aHJvd0xldmVsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoW3RoaXMubG9nUHJlZml4LCB0eXBlICsgJzonXS5jb25jYXQoYXJncykuam9pbignICcpKTtcblxuICAgIGNvbnNvbGUubG9nLmFwcGx5KFxuICAgICAgICAgIGNvbnNvbGVcbiAgICAgICAgLCBbIHRoaXMubG9nUHJlZml4Q29sb3JcbiAgICAgICAgICAgICAgPyAnICAgJyArIGNvbG9yZWQodGhpcy5sb2dQcmVmaXgsIHRoaXMubG9nUHJlZml4Q29sb3IpXG4gICAgICAgICAgICAgIDogdGhpcy5sb2dQcmVmaXgsXG4gICAgICAgICAgICAodGhpcy5jb2xvcnNcbiAgICAgICAgICAgICAgPyAnICcgKyBjb2xvcmVkKHBhZCh0eXBlKSwgY29sb3JzW2luZGV4XSlcbiAgICAgICAgICAgICAgOiB0eXBlKSArICc6J1xuICAgICAgICAgIF0uY29uY2F0KGFyZ3MpXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBtZXRob2RzLlxuICovXG5cbmxldmVscy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgTG9nZ2VyLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2cuYXBwbHkodGhpcywgW25hbWVdLmNvbmNhdChfLnRvQXJyYXkoYXJndW1lbnRzKSkpO1xuICAgIH07XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IExvZ2dlcjtcbiIsIi8vIGRvVC5qc1xuLy8gMjAxMS0yMDE0LCBMYXVyYSBEb2t0b3JvdmEsIGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1Rcbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuKGZ1bmN0aW9uKCkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgZG9UID0ge1xuXHRcdHZlcnNpb246IFwiMS4wLjNcIixcblx0XHR0ZW1wbGF0ZVNldHRpbmdzOiB7XG5cdFx0XHRldmFsdWF0ZTogICAgL1xce1xceyhbXFxzXFxTXSs/KFxcfT8pKylcXH1cXH0vZyxcblx0XHRcdGludGVycG9sYXRlOiAvXFx7XFx7PShbXFxzXFxTXSs/KVxcfVxcfS9nLFxuXHRcdFx0ZW5jb2RlOiAgICAgIC9cXHtcXHshKFtcXHNcXFNdKz8pXFx9XFx9L2csXG5cdFx0XHR1c2U6ICAgICAgICAgL1xce1xceyMoW1xcc1xcU10rPylcXH1cXH0vZyxcblx0XHRcdHVzZVBhcmFtczogICAvKF58W15cXHckXSlkZWYoPzpcXC58XFxbW1xcJ1xcXCJdKShbXFx3JFxcLl0rKSg/OltcXCdcXFwiXVxcXSk/XFxzKlxcOlxccyooW1xcdyRcXC5dK3xcXFwiW15cXFwiXStcXFwifFxcJ1teXFwnXStcXCd8XFx7W15cXH1dK1xcfSkvZyxcblx0XHRcdGRlZmluZTogICAgICAvXFx7XFx7IyNcXHMqKFtcXHdcXC4kXSspXFxzKihcXDp8PSkoW1xcc1xcU10rPykjXFx9XFx9L2csXG5cdFx0XHRkZWZpbmVQYXJhbXM6L15cXHMqKFtcXHckXSspOihbXFxzXFxTXSspLyxcblx0XHRcdGNvbmRpdGlvbmFsOiAvXFx7XFx7XFw/KFxcPyk/XFxzKihbXFxzXFxTXSo/KVxccypcXH1cXH0vZyxcblx0XHRcdGl0ZXJhdGU6ICAgICAvXFx7XFx7flxccyooPzpcXH1cXH18KFtcXHNcXFNdKz8pXFxzKlxcOlxccyooW1xcdyRdKylcXHMqKD86XFw6XFxzKihbXFx3JF0rKSk/XFxzKlxcfVxcfSkvZyxcblx0XHRcdHZhcm5hbWU6XHRcIml0XCIsXG5cdFx0XHRzdHJpcDpcdFx0dHJ1ZSxcblx0XHRcdGFwcGVuZDpcdFx0dHJ1ZSxcblx0XHRcdHNlbGZjb250YWluZWQ6IGZhbHNlLFxuXHRcdFx0ZG9Ob3RTa2lwRW5jb2RlZDogZmFsc2Vcblx0XHR9LFxuXHRcdHRlbXBsYXRlOiB1bmRlZmluZWQsIC8vZm4sIGNvbXBpbGUgdGVtcGxhdGVcblx0XHRjb21waWxlOiAgdW5kZWZpbmVkICAvL2ZuLCBmb3IgZXhwcmVzc1xuXHR9LCBfZ2xvYmFscztcblxuXHRkb1QuZW5jb2RlSFRNTFNvdXJjZSA9IGZ1bmN0aW9uKGRvTm90U2tpcEVuY29kZWQpIHtcblx0XHR2YXIgZW5jb2RlSFRNTFJ1bGVzID0geyBcIiZcIjogXCImIzM4O1wiLCBcIjxcIjogXCImIzYwO1wiLCBcIj5cIjogXCImIzYyO1wiLCAnXCInOiBcIiYjMzQ7XCIsIFwiJ1wiOiBcIiYjMzk7XCIsIFwiL1wiOiBcIiYjNDc7XCIgfSxcblx0XHRcdG1hdGNoSFRNTCA9IGRvTm90U2tpcEVuY29kZWQgPyAvWyY8PlwiJ1xcL10vZyA6IC8mKD8hIz9cXHcrOyl8PHw+fFwifCd8XFwvL2c7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGNvZGUpIHtcblx0XHRcdHJldHVybiBjb2RlID8gY29kZS50b1N0cmluZygpLnJlcGxhY2UobWF0Y2hIVE1MLCBmdW5jdGlvbihtKSB7cmV0dXJuIGVuY29kZUhUTUxSdWxlc1ttXSB8fCBtO30pIDogXCJcIjtcblx0XHR9O1xuXHR9O1xuXG5cdF9nbG9iYWxzID0gKGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzIHx8ICgwLGV2YWwpKFwidGhpc1wiKTsgfSgpKTtcblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZG9UO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIGRvVDt9KTtcblx0fSBlbHNlIHtcblx0XHRfZ2xvYmFscy5kb1QgPSBkb1Q7XG5cdH1cblxuXHR2YXIgc3RhcnRlbmQgPSB7XG5cdFx0YXBwZW5kOiB7IHN0YXJ0OiBcIicrKFwiLCAgICAgIGVuZDogXCIpKydcIiwgICAgICBzdGFydGVuY29kZTogXCInK2VuY29kZUhUTUwoXCIgfSxcblx0XHRzcGxpdDogIHsgc3RhcnQ6IFwiJztvdXQrPShcIiwgZW5kOiBcIik7b3V0Kz0nXCIsIHN0YXJ0ZW5jb2RlOiBcIic7b3V0Kz1lbmNvZGVIVE1MKFwiIH1cblx0fSwgc2tpcCA9IC8kXi87XG5cblx0ZnVuY3Rpb24gcmVzb2x2ZURlZnMoYywgYmxvY2ssIGRlZikge1xuXHRcdHJldHVybiAoKHR5cGVvZiBibG9jayA9PT0gXCJzdHJpbmdcIikgPyBibG9jayA6IGJsb2NrLnRvU3RyaW5nKCkpXG5cdFx0LnJlcGxhY2UoYy5kZWZpbmUgfHwgc2tpcCwgZnVuY3Rpb24obSwgY29kZSwgYXNzaWduLCB2YWx1ZSkge1xuXHRcdFx0aWYgKGNvZGUuaW5kZXhPZihcImRlZi5cIikgPT09IDApIHtcblx0XHRcdFx0Y29kZSA9IGNvZGUuc3Vic3RyaW5nKDQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCEoY29kZSBpbiBkZWYpKSB7XG5cdFx0XHRcdGlmIChhc3NpZ24gPT09IFwiOlwiKSB7XG5cdFx0XHRcdFx0aWYgKGMuZGVmaW5lUGFyYW1zKSB2YWx1ZS5yZXBsYWNlKGMuZGVmaW5lUGFyYW1zLCBmdW5jdGlvbihtLCBwYXJhbSwgdikge1xuXHRcdFx0XHRcdFx0ZGVmW2NvZGVdID0ge2FyZzogcGFyYW0sIHRleHQ6IHZ9O1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmICghKGNvZGUgaW4gZGVmKSkgZGVmW2NvZGVdPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRuZXcgRnVuY3Rpb24oXCJkZWZcIiwgXCJkZWZbJ1wiK2NvZGUrXCInXT1cIiArIHZhbHVlKShkZWYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9KVxuXHRcdC5yZXBsYWNlKGMudXNlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdGlmIChjLnVzZVBhcmFtcykgY29kZSA9IGNvZGUucmVwbGFjZShjLnVzZVBhcmFtcywgZnVuY3Rpb24obSwgcywgZCwgcGFyYW0pIHtcblx0XHRcdFx0aWYgKGRlZltkXSAmJiBkZWZbZF0uYXJnICYmIHBhcmFtKSB7XG5cdFx0XHRcdFx0dmFyIHJ3ID0gKGQrXCI6XCIrcGFyYW0pLnJlcGxhY2UoLyd8XFxcXC9nLCBcIl9cIik7XG5cdFx0XHRcdFx0ZGVmLl9fZXhwID0gZGVmLl9fZXhwIHx8IHt9O1xuXHRcdFx0XHRcdGRlZi5fX2V4cFtyd10gPSBkZWZbZF0udGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxbXlxcXFx3JF0pXCIgKyBkZWZbZF0uYXJnICsgXCIoW15cXFxcdyRdKVwiLCBcImdcIiksIFwiJDFcIiArIHBhcmFtICsgXCIkMlwiKTtcblx0XHRcdFx0XHRyZXR1cm4gcyArIFwiZGVmLl9fZXhwWydcIitydytcIiddXCI7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0dmFyIHYgPSBuZXcgRnVuY3Rpb24oXCJkZWZcIiwgXCJyZXR1cm4gXCIgKyBjb2RlKShkZWYpO1xuXHRcdFx0cmV0dXJuIHYgPyByZXNvbHZlRGVmcyhjLCB2LCBkZWYpIDogdjtcblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHVuZXNjYXBlKGNvZGUpIHtcblx0XHRyZXR1cm4gY29kZS5yZXBsYWNlKC9cXFxcKCd8XFxcXCkvZywgXCIkMVwiKS5yZXBsYWNlKC9bXFxyXFx0XFxuXS9nLCBcIiBcIik7XG5cdH1cblxuXHRkb1QudGVtcGxhdGUgPSBmdW5jdGlvbih0bXBsLCBjLCBkZWYpIHtcblx0XHRjID0gYyB8fCBkb1QudGVtcGxhdGVTZXR0aW5ncztcblx0XHR2YXIgY3NlID0gYy5hcHBlbmQgPyBzdGFydGVuZC5hcHBlbmQgOiBzdGFydGVuZC5zcGxpdCwgbmVlZGh0bWxlbmNvZGUsIHNpZCA9IDAsIGluZHYsXG5cdFx0XHRzdHIgID0gKGMudXNlIHx8IGMuZGVmaW5lKSA/IHJlc29sdmVEZWZzKGMsIHRtcGwsIGRlZiB8fCB7fSkgOiB0bXBsO1xuXG5cdFx0c3RyID0gKFwidmFyIG91dD0nXCIgKyAoYy5zdHJpcCA/IHN0ci5yZXBsYWNlKC8oXnxcXHJ8XFxuKVxcdCogK3wgK1xcdCooXFxyfFxcbnwkKS9nLFwiIFwiKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXHJ8XFxufFxcdHxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csXCJcIik6IHN0cilcblx0XHRcdC5yZXBsYWNlKC8nfFxcXFwvZywgXCJcXFxcJCZcIilcblx0XHRcdC5yZXBsYWNlKGMuaW50ZXJwb2xhdGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgY29kZSkge1xuXHRcdFx0XHRyZXR1cm4gY3NlLnN0YXJ0ICsgdW5lc2NhcGUoY29kZSkgKyBjc2UuZW5kO1xuXHRcdFx0fSlcblx0XHRcdC5yZXBsYWNlKGMuZW5jb2RlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdFx0bmVlZGh0bWxlbmNvZGUgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gY3NlLnN0YXJ0ZW5jb2RlICsgdW5lc2NhcGUoY29kZSkgKyBjc2UuZW5kO1xuXHRcdFx0fSlcblx0XHRcdC5yZXBsYWNlKGMuY29uZGl0aW9uYWwgfHwgc2tpcCwgZnVuY3Rpb24obSwgZWxzZWNhc2UsIGNvZGUpIHtcblx0XHRcdFx0cmV0dXJuIGVsc2VjYXNlID9cblx0XHRcdFx0XHQoY29kZSA/IFwiJzt9ZWxzZSBpZihcIiArIHVuZXNjYXBlKGNvZGUpICsgXCIpe291dCs9J1wiIDogXCInO31lbHNle291dCs9J1wiKSA6XG5cdFx0XHRcdFx0KGNvZGUgPyBcIic7aWYoXCIgKyB1bmVzY2FwZShjb2RlKSArIFwiKXtvdXQrPSdcIiA6IFwiJzt9b3V0Kz0nXCIpO1xuXHRcdFx0fSlcblx0XHRcdC5yZXBsYWNlKGMuaXRlcmF0ZSB8fCBza2lwLCBmdW5jdGlvbihtLCBpdGVyYXRlLCB2bmFtZSwgaW5hbWUpIHtcblx0XHRcdFx0aWYgKCFpdGVyYXRlKSByZXR1cm4gXCInO30gfSBvdXQrPSdcIjtcblx0XHRcdFx0c2lkKz0xOyBpbmR2PWluYW1lIHx8IFwiaVwiK3NpZDsgaXRlcmF0ZT11bmVzY2FwZShpdGVyYXRlKTtcblx0XHRcdFx0cmV0dXJuIFwiJzt2YXIgYXJyXCIrc2lkK1wiPVwiK2l0ZXJhdGUrXCI7aWYoYXJyXCIrc2lkK1wiKXt2YXIgXCIrdm5hbWUrXCIsXCIraW5kditcIj0tMSxsXCIrc2lkK1wiPWFyclwiK3NpZCtcIi5sZW5ndGgtMTt3aGlsZShcIitpbmR2K1wiPGxcIitzaWQrXCIpe1wiXG5cdFx0XHRcdFx0K3ZuYW1lK1wiPWFyclwiK3NpZCtcIltcIitpbmR2K1wiKz0xXTtvdXQrPSdcIjtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmV2YWx1YXRlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdFx0cmV0dXJuIFwiJztcIiArIHVuZXNjYXBlKGNvZGUpICsgXCJvdXQrPSdcIjtcblx0XHRcdH0pXG5cdFx0XHQrIFwiJztyZXR1cm4gb3V0O1wiKVxuXHRcdFx0LnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKS5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKVxuXHRcdFx0LnJlcGxhY2UoLyhcXHN8O3xcXH18XnxcXHspb3V0XFwrPScnOy9nLCAnJDEnKS5yZXBsYWNlKC9cXCsnJy9nLCBcIlwiKTtcblx0XHRcdC8vLnJlcGxhY2UoLyhcXHN8O3xcXH18XnxcXHspb3V0XFwrPScnXFwrL2csJyQxb3V0Kz0nKTtcblxuXHRcdGlmIChuZWVkaHRtbGVuY29kZSkge1xuXHRcdFx0aWYgKCFjLnNlbGZjb250YWluZWQgJiYgX2dsb2JhbHMgJiYgIV9nbG9iYWxzLl9lbmNvZGVIVE1MKSBfZ2xvYmFscy5fZW5jb2RlSFRNTCA9IGRvVC5lbmNvZGVIVE1MU291cmNlKGMuZG9Ob3RTa2lwRW5jb2RlZCk7XG5cdFx0XHRzdHIgPSBcInZhciBlbmNvZGVIVE1MID0gdHlwZW9mIF9lbmNvZGVIVE1MICE9PSAndW5kZWZpbmVkJyA/IF9lbmNvZGVIVE1MIDogKFwiXG5cdFx0XHRcdCsgZG9ULmVuY29kZUhUTUxTb3VyY2UudG9TdHJpbmcoKSArIFwiKFwiICsgKGMuZG9Ob3RTa2lwRW5jb2RlZCB8fCAnJykgKyBcIikpO1wiXG5cdFx0XHRcdCsgc3RyO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIG5ldyBGdW5jdGlvbihjLnZhcm5hbWUsIHN0cik7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiKSBjb25zb2xlLmxvZyhcIkNvdWxkIG5vdCBjcmVhdGUgYSB0ZW1wbGF0ZSBmdW5jdGlvbjogXCIgKyBzdHIpO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdH07XG5cblx0ZG9ULmNvbXBpbGUgPSBmdW5jdGlvbih0bXBsLCBkZWYpIHtcblx0XHRyZXR1cm4gZG9ULnRlbXBsYXRlKHRtcGwsIG51bGwsIGRlZik7XG5cdH07XG59KCkpO1xuIiwiLyogZG9UICsgYXV0by1jb21waWxhdGlvbiBvZiBkb1QgdGVtcGxhdGVzXG4gKlxuICogMjAxMiwgTGF1cmEgRG9rdG9yb3ZhLCBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBDb21waWxlcyAuZGVmLCAuZG90LCAuanN0IGZpbGVzIGZvdW5kIHVuZGVyIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqIEl0IGlnbm9yZXMgc3ViLWRpcmVjdG9yaWVzLlxuICogVGVtcGxhdGUgZmlsZXMgY2FuIGhhdmUgbXVsdGlwbGUgZXh0ZW5zaW9ucyBhdCB0aGUgc2FtZSB0aW1lLlxuICogRmlsZXMgd2l0aCAuZGVmIGV4dGVuc2lvbiBjYW4gYmUgaW5jbHVkZWQgaW4gb3RoZXIgZmlsZXMgdmlhIHt7I2RlZi5uYW1lfX1cbiAqIEZpbGVzIHdpdGggLmRvdCBleHRlbnNpb24gYXJlIGNvbXBpbGVkIGludG8gZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBhbmRcbiAqIGNhbiBiZSBhY2Nlc3NlZCBhcyByZW5kZXJlci5maWxlbmFtZVxuICogRmlsZXMgd2l0aCAuanN0IGV4dGVuc2lvbiBhcmUgY29tcGlsZWQgaW50byAuanMgZmlsZXMuIFByb2R1Y2VkIC5qcyBmaWxlIGNhbiBiZVxuICogbG9hZGVkIGFzIGEgY29tbW9uSlMsIEFNRCBtb2R1bGUsIG9yIGp1c3QgaW5zdGFsbGVkIGludG8gYSBnbG9iYWwgdmFyaWFibGVcbiAqIChkZWZhdWx0IGlzIHNldCB0byB3aW5kb3cucmVuZGVyKS5cbiAqIEFsbCBpbmxpbmUgZGVmaW5lcyBkZWZpbmVkIGluIHRoZSAuanN0IGZpbGUgYXJlXG4gKiBjb21waWxlZCBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucyBhbmQgYXJlIGF2YWlsYWJsZSB2aWEgX3JlbmRlci5maWxlbmFtZS5kZWZpbmVuYW1lXG4gKlxuICogQmFzaWMgdXNhZ2U6XG4gKiB2YXIgZG90cyA9IHJlcXVpcmUoXCJkb3RcIikucHJvY2Vzcyh7cGF0aDogXCIuL3ZpZXdzXCJ9KTtcbiAqIGRvdHMubXl0ZW1wbGF0ZSh7Zm9vOlwiaGVsbG8gd29ybGRcIn0pO1xuICpcbiAqIFRoZSBhYm92ZSBzbmlwcGV0IHdpbGw6XG4gKiAxLiBDb21waWxlIGFsbCB0ZW1wbGF0ZXMgaW4gdmlld3MgZm9sZGVyICguZG90LCAuZGVmLCAuanN0KVxuICogMi4gUGxhY2UgLmpzIGZpbGVzIGNvbXBpbGVkIGZyb20gLmpzdCB0ZW1wbGF0ZXMgaW50byB0aGUgc2FtZSBmb2xkZXIuXG4gKiAgICBUaGVzZSBmaWxlcyBjYW4gYmUgdXNlZCB3aXRoIHJlcXVpcmUsIGkuZS4gcmVxdWlyZShcIi4vdmlld3MvbXl0ZW1wbGF0ZVwiKS5cbiAqIDMuIFJldHVybiBhbiBvYmplY3Qgd2l0aCBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSAuZG90IHRlbXBsYXRlcyBhcyBpdHMgcHJvcGVydGllcy5cbiAqIDQuIFJlbmRlciBteXRlbXBsYXRlIHRlbXBsYXRlLlxuICovXG5cbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKSxcblx0ZG9UID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9kb1RcIik7XG5cbmRvVC5wcm9jZXNzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXHQvL3BhdGgsIGRlc3RpbmF0aW9uLCBnbG9iYWwsIHJlbmRlcm1vZHVsZSwgdGVtcGxhdGVTZXR0aW5nc1xuXHRyZXR1cm4gbmV3IEluc3RhbGxEb3RzKG9wdGlvbnMpLmNvbXBpbGVBbGwoKTtcbn07XG5cbmZ1bmN0aW9uIEluc3RhbGxEb3RzKG8pIHtcblx0dGhpcy5fX3BhdGggXHRcdD0gby5wYXRoIHx8IFwiLi9cIjtcblx0aWYgKHRoaXMuX19wYXRoW3RoaXMuX19wYXRoLmxlbmd0aC0xXSAhPT0gJy8nKSB0aGlzLl9fcGF0aCArPSAnLyc7XG5cdHRoaXMuX19kZXN0aW5hdGlvblx0PSBvLmRlc3RpbmF0aW9uIHx8IHRoaXMuX19wYXRoO1xuXHRpZiAodGhpcy5fX2Rlc3RpbmF0aW9uW3RoaXMuX19kZXN0aW5hdGlvbi5sZW5ndGgtMV0gIT09ICcvJykgdGhpcy5fX2Rlc3RpbmF0aW9uICs9ICcvJztcblx0dGhpcy5fX2dsb2JhbFx0XHQ9IG8uZ2xvYmFsIHx8IFwid2luZG93LnJlbmRlclwiO1xuXHR0aGlzLl9fcmVuZGVybW9kdWxlXHQ9IG8ucmVuZGVybW9kdWxlIHx8IHt9O1xuXHR0aGlzLl9fc2V0dGluZ3MgXHQ9IG8udGVtcGxhdGVTZXR0aW5ncyA/IGNvcHkoby50ZW1wbGF0ZVNldHRpbmdzLCBjb3B5KGRvVC50ZW1wbGF0ZVNldHRpbmdzKSkgOiB1bmRlZmluZWQ7XG5cdHRoaXMuX19pbmNsdWRlc1x0XHQ9IHt9O1xufVxuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZVRvRmlsZSA9IGZ1bmN0aW9uKHBhdGgsIHRlbXBsYXRlLCBkZWYpIHtcblx0ZGVmID0gZGVmIHx8IHt9O1xuXHR2YXIgbW9kdWxlbmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGgubGFzdEluZGV4T2YoXCIvXCIpKzEsIHBhdGgubGFzdEluZGV4T2YoXCIuXCIpKVxuXHRcdCwgZGVmcyA9IGNvcHkodGhpcy5fX2luY2x1ZGVzLCBjb3B5KGRlZikpXG5cdFx0LCBzZXR0aW5ncyA9IHRoaXMuX19zZXR0aW5ncyB8fCBkb1QudGVtcGxhdGVTZXR0aW5nc1xuXHRcdCwgY29tcGlsZW9wdGlvbnMgPSBjb3B5KHNldHRpbmdzKVxuXHRcdCwgZGVmYXVsdGNvbXBpbGVkID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlLCBzZXR0aW5ncywgZGVmcylcblx0XHQsIGV4cG9ydHMgPSBbXVxuXHRcdCwgY29tcGlsZWQgPSBcIlwiXG5cdFx0LCBmbjtcblxuXHRmb3IgKHZhciBwcm9wZXJ0eSBpbiBkZWZzKSB7XG5cdFx0aWYgKGRlZnNbcHJvcGVydHldICE9PSBkZWZbcHJvcGVydHldICYmIGRlZnNbcHJvcGVydHldICE9PSB0aGlzLl9faW5jbHVkZXNbcHJvcGVydHldKSB7XG5cdFx0XHRmbiA9IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0eXBlb2YgZGVmc1twcm9wZXJ0eV0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGZuID0gZG9ULnRlbXBsYXRlKGRlZnNbcHJvcGVydHldLCBzZXR0aW5ncywgZGVmcyk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZzW3Byb3BlcnR5XSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRmbiA9IGRlZnNbcHJvcGVydHldO1xuXHRcdFx0fSBlbHNlIGlmIChkZWZzW3Byb3BlcnR5XS5hcmcpIHtcblx0XHRcdFx0Y29tcGlsZW9wdGlvbnMudmFybmFtZSA9IGRlZnNbcHJvcGVydHldLmFyZztcblx0XHRcdFx0Zm4gPSBkb1QudGVtcGxhdGUoZGVmc1twcm9wZXJ0eV0udGV4dCwgY29tcGlsZW9wdGlvbnMsIGRlZnMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZuKSB7XG5cdFx0XHRcdGNvbXBpbGVkICs9IGZuLnRvU3RyaW5nKCkucmVwbGFjZSgnYW5vbnltb3VzJywgcHJvcGVydHkpO1xuXHRcdFx0XHRleHBvcnRzLnB1c2gocHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRjb21waWxlZCArPSBkZWZhdWx0Y29tcGlsZWQudG9TdHJpbmcoKS5yZXBsYWNlKCdhbm9ueW1vdXMnLCBtb2R1bGVuYW1lKTtcblx0ZnMud3JpdGVGaWxlU3luYyhwYXRoLCBcIihmdW5jdGlvbigpe1wiICsgY29tcGlsZWRcblx0XHQrIFwidmFyIGl0c2VsZj1cIiArIG1vZHVsZW5hbWUgKyBcIiwgX2VuY29kZUhUTUw9KFwiICsgZG9ULmVuY29kZUhUTUxTb3VyY2UudG9TdHJpbmcoKSArIFwiKFwiICsgKHNldHRpbmdzLmRvTm90U2tpcEVuY29kZWQgfHwgJycpICsgXCIpKTtcIlxuXHRcdCsgYWRkZXhwb3J0cyhleHBvcnRzKVxuXHRcdCsgXCJpZih0eXBlb2YgbW9kdWxlIT09J3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzPWl0c2VsZjtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0nZnVuY3Rpb24nKWRlZmluZShmdW5jdGlvbigpe3JldHVybiBpdHNlbGY7fSk7ZWxzZSB7XCJcblx0XHQrIHRoaXMuX19nbG9iYWwgKyBcIj1cIiArIHRoaXMuX19nbG9iYWwgKyBcInx8e307XCIgKyB0aGlzLl9fZ2xvYmFsICsgXCJbJ1wiICsgbW9kdWxlbmFtZSArIFwiJ109aXRzZWxmO319KCkpO1wiKTtcbn07XG5cbmZ1bmN0aW9uIGFkZGV4cG9ydHMoZXhwb3J0cykge1xuXHRmb3IgKHZhciByZXQgPScnLCBpPTA7IGk8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHtcblx0XHRyZXQgKz0gXCJpdHNlbGYuXCIgKyBleHBvcnRzW2ldKyBcIj1cIiArIGV4cG9ydHNbaV0rXCI7XCI7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gY29weShvLCB0bykge1xuXHR0byA9IHRvIHx8IHt9O1xuXHRmb3IgKHZhciBwcm9wZXJ0eSBpbiBvKSB7XG5cdFx0dG9bcHJvcGVydHldID0gb1twcm9wZXJ0eV07XG5cdH1cblx0cmV0dXJuIHRvO1xufVxuXG5mdW5jdGlvbiByZWFkZGF0YShwYXRoKSB7XG5cdHZhciBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGgpO1xuXHRpZiAoZGF0YSkgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcblx0Y29uc29sZS5sb2coXCJwcm9ibGVtcyB3aXRoIFwiICsgcGF0aCk7XG59XG5cbkluc3RhbGxEb3RzLnByb3RvdHlwZS5jb21waWxlUGF0aCA9IGZ1bmN0aW9uKHBhdGgpIHtcblx0dmFyIGRhdGEgPSByZWFkZGF0YShwYXRoKTtcblx0aWYgKGRhdGEpIHtcblx0XHRyZXR1cm4gZG9ULnRlbXBsYXRlKGRhdGEsXG5cdFx0XHRcdFx0dGhpcy5fX3NldHRpbmdzIHx8IGRvVC50ZW1wbGF0ZVNldHRpbmdzLFxuXHRcdFx0XHRcdGNvcHkodGhpcy5fX2luY2x1ZGVzKSk7XG5cdH1cbn07XG5cbkluc3RhbGxEb3RzLnByb3RvdHlwZS5jb21waWxlQWxsID0gZnVuY3Rpb24oKSB7XG5cdGNvbnNvbGUubG9nKFwiQ29tcGlsaW5nIGFsbCBkb1QgdGVtcGxhdGVzLi4uXCIpO1xuXG5cdHZhciBkZWZGb2xkZXIgPSB0aGlzLl9fcGF0aCxcblx0XHRzb3VyY2VzID0gZnMucmVhZGRpclN5bmMoZGVmRm9sZGVyKSxcblx0XHRrLCBsLCBuYW1lO1xuXG5cdGZvciggayA9IDAsIGwgPSBzb3VyY2VzLmxlbmd0aDsgayA8IGw7IGsrKykge1xuXHRcdG5hbWUgPSBzb3VyY2VzW2tdO1xuXHRcdGlmICgvXFwuZGVmKFxcLmRvdHxcXC5qc3QpPyQvLnRlc3QobmFtZSkpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiTG9hZGVkIGRlZiBcIiArIG5hbWUpO1xuXHRcdFx0dGhpcy5fX2luY2x1ZGVzW25hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKV0gPSByZWFkZGF0YShkZWZGb2xkZXIgKyBuYW1lKTtcblx0XHR9XG5cdH1cblxuXHRmb3IoIGsgPSAwLCBsID0gc291cmNlcy5sZW5ndGg7IGsgPCBsOyBrKyspIHtcblx0XHRuYW1lID0gc291cmNlc1trXTtcblx0XHRpZiAoL1xcLmRvdChcXC5kZWZ8XFwuanN0KT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBcIiArIG5hbWUgKyBcIiB0byBmdW5jdGlvblwiKTtcblx0XHRcdHRoaXMuX19yZW5kZXJtb2R1bGVbbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCcuJykpXSA9IHRoaXMuY29tcGlsZVBhdGgoZGVmRm9sZGVyICsgbmFtZSk7XG5cdFx0fVxuXHRcdGlmICgvXFwuanN0KFxcLmRvdHxcXC5kZWYpPyQvLnRlc3QobmFtZSkpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiQ29tcGlsaW5nIFwiICsgbmFtZSArIFwiIHRvIGZpbGVcIik7XG5cdFx0XHR0aGlzLmNvbXBpbGVUb0ZpbGUodGhpcy5fX2Rlc3RpbmF0aW9uICsgbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCcuJykpICsgJy5qcycsXG5cdFx0XHRcdFx0cmVhZGRhdGEoZGVmRm9sZGVyICsgbmFtZSkpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdGhpcy5fX3JlbmRlcm1vZHVsZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG4vKipcbiAqIFtfX1Byb3RvdHlwZSBmdW5jdGlvbnNfX10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwpXG4gKlxuICogLSBbZXh0ZW5kUHJvdG9dKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI2V4dGVuZFByb3RvKVxuICogLSBbY3JlYXRlU3ViY2xhc3NdKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI2NyZWF0ZVN1YmNsYXNzKVxuICogLSBbbWFrZVN1YmNsYXNzXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNtYWtlU3ViY2xhc3MpXG4gKiAtIFtuZXdBcHBseV0ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjbmV3QXBwbHkpXG4gKi9cbnZhciBwcm90b3R5cGVNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19wcm90b3R5cGUnKTtcblxuXG4vKipcbiAqIFtfX09iamVjdCBmdW5jdGlvbnNfX10ocHJvdG9fb2JqZWN0LmpzLmh0bWwpXG4gKlxuICogLSBbZXh0ZW5kXShwcm90b19vYmplY3QuanMuaHRtbCNleHRlbmQpXG4gKiAtIFtjbG9uZV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjY2xvbmUpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0eV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVmaW5lUHJvcGVydHkpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0aWVzXShwcm90b19vYmplY3QuanMuaHRtbCNkZWZpbmVQcm9wZXJ0aWVzKVxuICogLSBbZGVlcEV4dGVuZF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVlcEV4dGVuZClcbiAqIC0gW2RlZXBDbG9uZV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVlcENsb25lKVxuICogLSBba2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwja2V5cylcbiAqIC0gW2FsbEtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2FsbEtleXMpXG4gKiAtIFt2YWx1ZXNdKHByb3RvX29iamVjdC5qcy5odG1sI3ZhbHVlcylcbiAqIC0gW2tleU9mXShwcm90b19vYmplY3QuanMuaHRtbCNrZXlPZilcbiAqIC0gW2FsbEtleXNPZl0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjYWxsS2V5c09mKVxuICogLSBbZWFjaEtleV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZWFjaEtleSlcbiAqIC0gW21hcEtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI21hcEtleXMpXG4gKiAtIFtyZWR1Y2VLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNyZWR1Y2VLZXlzKVxuICogLSBbZmlsdGVyS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZmlsdGVyS2V5cylcbiAqIC0gW3NvbWVLZXldKHByb3RvX29iamVjdC5qcy5odG1sI3NvbWVLZXkpXG4gKiAtIFtldmVyeUtleV0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZXZlcnlLZXkpXG4gKiAtIFtmaW5kVmFsdWVdKHByb3RvX29iamVjdC5qcy5odG1sI2ZpbmRWYWx1ZSlcbiAqIC0gW2ZpbmRLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2ZpbmRLZXkpXG4gKiAtIFtwaWNrS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjcGlja0tleXMpXG4gKiAtIFtvbWl0S2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjb21pdEtleXMpXG4gKiAtIFtpc0VxdWFsXShwcm90b19vYmplY3QuanMuaHRtbCNpc0VxdWFsKVxuICogLSBbaXNOb3RdKHByb3RvX29iamVjdC5qcy5odG1sI2lzTm90KVxuICovXG52YXIgb2JqZWN0TWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fb2JqZWN0Jyk7XG5cblxuLyoqXG4gKiBbX19BcnJheSBmdW5jdGlvbnNfX10ocHJvdG9fYXJyYXkuanMuaHRtbClcbiAqXG4gKiAtIFtmaW5kXShwcm90b19hcnJheS5qcy5odG1sI2ZpbmQpXG4gKiAtIFtmaW5kSW5kZXhdKHByb3RvX2FycmF5LmpzLmh0bWwjZmluZEluZGV4KVxuICogLSBbYXBwZW5kQXJyYXldKHByb3RvX2FycmF5LmpzLmh0bWwjYXBwZW5kQXJyYXkpXG4gKiAtIFtwcmVwZW5kQXJyYXldKHByb3RvX2FycmF5LmpzLmh0bWwjcHJlcGVuZEFycmF5KVxuICogLSBbc3BsaWNlSXRlbV0ocHJvdG9fYXJyYXkuanMuaHRtbCNzcGxpY2VJdGVtKVxuICogLSBbdG9BcnJheV0ocHJvdG9fYXJyYXkuanMuaHRtbCN0b0FycmF5KVxuICogLSBbb2JqZWN0XShwcm90b19hcnJheS5qcy5odG1sI29iamVjdClcbiAqIC0gW21hcFRvT2JqZWN0XShwcm90b19hcnJheS5qcy5odG1sI21hcFRvT2JqZWN0KVxuICogLSBbdW5pcXVlXShwcm90b19hcnJheS5qcy5odG1sI3VuaXF1ZSlcbiAqIC0gW2RlZXBGb3JFYWNoXShwcm90b19hcnJheS5qcy5odG1sI2RlZXBGb3JFYWNoKVxuICpcbiAqIEZ1bmN0aW9ucyB0aGF0IEFycmF5IFtpbXBsZW1lbnRzIG5hdGl2ZWx5XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9wcm90b3R5cGUjTWV0aG9kcykgYXJlIGFsc28gYWRkZWQgLSB0aGV5IGNhbiBiZSB1c2VkIHdpdGggYXJyYXktbGlrZSBvYmplY3RzIGFuZCBmb3IgY2hhaW5pbmcgKG5hdGl2ZSBmdW5jdGlvbnMgYXJlIGFsd2F5cyBjYWxsZWQpLlxuICovXG52YXIgYXJyYXlNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19hcnJheScpO1xuXG5cbi8qKlxuICogW19fRnVuY3Rpb24gZnVuY3Rpb25zX19dKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwpXG4gKlxuICogLSBbbWFrZUZ1bmN0aW9uXShwcm90b19mdW5jdGlvbi5qcy5odG1sI21ha2VGdW5jdGlvbilcbiAqIC0gW3BhcnRpYWxdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjcGFydGlhbClcbiAqIC0gW3BhcnRpYWxSaWdodF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNwYXJ0aWFsUmlnaHQpXG4gKiAtIFttZW1vaXplXShwcm90b19mdW5jdGlvbi5qcy5odG1sI21lbW9pemUpXG4gKiAtIFtkZWxheV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWxheSlcbiAqIC0gW2RlZmVyXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVyKVxuICogLSBbZGVsYXllZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWxheWVkKVxuICogLSBbZGVmZXJyZWRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVmZXJyZWQpXG4gKiAtIFtkZWZlclRpY2tzXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVyVGlja3MpXG4gKiAtIFtkZWxheU1ldGhvZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWxheU1ldGhvZClcbiAqIC0gW2RlZmVyTWV0aG9kXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVyTWV0aG9kKVxuICogLSBbZGVib3VuY2VdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVib3VuY2UpXG4gKiAtIFt0aHJvdHRsZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCN0aHJvdHRsZSlcbiAqIC0gW29uY2VdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjb25jZSlcbiAqIC0gW3dhaXRGb3JdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjd2FpdEZvcilcbiovXG52YXIgZnVuY3Rpb25NZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19mdW5jdGlvbicpO1xuXG5cbi8qKlxuICogW19fU3RyaW5nIGZ1bmN0aW9uc19fXShwcm90b19zdHJpbmcuanMuaHRtbClcbiAqXG4gKiAtIFtmaXJzdFVwcGVyQ2FzZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjZmlyc3RVcHBlckNhc2UpXG4gKiAtIFtmaXJzdExvd2VyQ2FzZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjZmlyc3RMb3dlckNhc2UpXG4gKiAtIFt0b1JlZ0V4cF0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9SZWdFeHApXG4gKiAtIFt0b0Z1bmN0aW9uXShwcm90b19zdHJpbmcuanMuaHRtbCN0b0Z1bmN0aW9uKVxuICogLSBbdG9EYXRlXShwcm90b19zdHJpbmcuanMuaHRtbCN0b0RhdGUpXG4gKiAtIFt0b1F1ZXJ5U3RyaW5nXShwcm90b19zdHJpbmcuanMuaHRtbCN0b1F1ZXJ5U3RyaW5nKVxuICogLSBbZnJvbVF1ZXJ5U3RyaW5nXShwcm90b19zdHJpbmcuanMuaHRtbCNmcm9tUXVlcnlTdHJpbmcpXG4gKiAtIFtqc29uUGFyc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2pzb25QYXJzZSlcbiAqIC0gW2hhc2hDb2RlXShwcm90b19zdHJpbmcuanMuaHRtbCNoYXNoQ29kZSlcbiAqIC0gW3VuUHJlZml4XShwcm90b19zdHJpbmcuanMuaHRtbCN1blByZWZpeClcbiAqL1xudmFyIHN0cmluZ01ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX3N0cmluZycpO1xuXG5cbi8qKlxuICogW19fTnVtYmVyIGZ1bmN0aW9uc19fXShwcm90b19udW1iZXIuanMuaHRtbClcbiAqXG4gKiAtIFtpc051bWVyaWNdKHByb3RvX251bWJlci5qcy5odG1sI2lzTnVtZXJpYylcbiAqL1xudmFyIG51bWJlck1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX251bWJlcicpO1xuXG5cbi8qKlxuICogW19fVXRpbGl0eSBmdW5jdGlvbnNfX10ocHJvdG9fdXRpbC5qcy5odG1sKVxuICpcbiAqIC0gW3RpbWVzXShwcm90b191dGlsLmpzLmh0bWwjdGltZXMpXG4gKiAtIFtyZXBlYXRdKHByb3RvX3V0aWwuanMuaHRtbCNyZXBlYXQpXG4gKiAtIFt0YXBdKHByb3RvX3V0aWwuanMuaHRtbCN0YXApXG4gKiAtIFtyZXN1bHRdKHByb3RvX3V0aWwuanMuaHRtbCNyZXN1bHQpXG4gKiAtIFtpZGVudGl0eV0ocHJvdG9fdXRpbC5qcy5odG1sI2lkZW50aXR5KVxuICogLSBbcHJvcGVydHldKHByb3RvX3V0aWwuanMuaHRtbCNwcm9wZXJ0eSlcbiAqIC0gW2NvbXBhcmVQcm9wZXJ0eV0ocHJvdG9fdXRpbC5qcy5odG1sI2NvbXBhcmVQcm9wZXJ0eSlcbiAqIC0gW25vb3BdKHByb3RvX3V0aWwuanMuaHRtbCNub29wKVxuICovXG52YXIgdXRpbE1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX3V0aWwnKTtcblxuXG4vKipcbiAqIENoYWluaW5nXG4gKiA9PT09PT09PVxuICpcbiAqIGBfYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB3cmFwcGVkIHZhbHVlIChvYmplY3QsIGZ1bmN0aW9uLCBhcnJheSwgZXRjLikgdG8gYWxsb3cgY2hhaW5pbmcgb2YgUHJvdG8gZnVuY3Rpb25zLlxuICogVG8gdW53cmFwLCBgX2AgbWV0aG9kIG9mIGEgd3JhcHBlZCB2YWx1ZSBzaG91bGQgYmUgdXNlZC5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiB2YXIgYXJyID0gXyh7IDA6IDMsIDE6IDQsIDI6IDUsIGxlbmd0aDogM30pXG4gKiAgICAgICAgICAgICAgLnRvQXJyYXkoKVxuICogICAgICAgICAgICAgIC5wcmVwZW5kQXJyYXkoWzEsIDJdKVxuICogICAgICAgICAgICAgIC5hcHBlbmRBcnJheShbNiwgNywgOF0pXG4gKiAgICAgICAgICAgICAgLl8oKTtcbiAqIGBgYFxuICogQSB3cmFwcGVkIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBgX2AgKGBQcm90b2AgY2xhc3MpLlxuICpcbiAqIENoYWluaW5nIGlzIGltcGxlbWVudGVkIGZvciBkZXZlbG9wbWVudCBjb252ZW5pZW5jZSwgYnV0IGl0IGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgbm90IG9ubHkgdG8gd3JhcCBhbmQgdW53cmFwIHZhbHVlcyBidXQgaW4gZWFjaCBmdW5jdGlvbiBjYWxsLlxuICogQWx0aG91Z2ggYWxsIFByb3RvIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgbWV0aG9kcyBvcGVyYXRpbmcgb24gdGhpcyBhbmQgdGhlIG92ZXJoZWFkIHRvIHJlZGVmaW5lIHRoZW0gYXMgZnVuY3Rpb25zIGlzIHZlcnkgc21hbGwsIHRoZSBvdmVyaGVhZCB0byByZWRlZmluZSB0aGVtIGFzIG1ldGhvZHMgb2Ygd3JhcHBlZCB2YWx1ZSBpcyBzbGlnaHRseSBoaWdoZXIgLSBjaGFpbmluZyBpcyAxNS0yNSUgc2xvd2VyIHRoYW4gdXNpbmcgZnVuY3Rpb25zIChwcm9wZXJ0aWVzIG9mIF8gdGhhdCB0YWtlIHRoZSBmaXJzdCBwYXJhbWV0ZXIpLlxuICogSW4gY2FzZXMgd2hlbiBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCwgeW91IG1heSB3YW50IHRvIGF2b2lkIHVzaW5nIGNoYWluaW5nLlxuICpcbiAqIEBwYXJhbSB7QW55fSBzZWxmIEEgdmFsdWUgdG8gYmUgd3JhcHBlZFxuICogQHJldHVybiB7UHJvdG99XG4gKi9cbmZ1bmN0aW9uIFByb3RvKHNlbGYpIHtcbiAgICAvLyB3cmFwIHBhc3NlZCBwYXJhbWV0ZXIgaW4gXyBvYmplY3RcbiAgICB2YXIgd3JhcHBlZCA9IE9iamVjdC5jcmVhdGUoUHJvdG8ucHJvdG90eXBlKTtcbiAgICB3cmFwcGVkLnNlbGYgPSBzZWxmO1xuICAgIHJldHVybiB3cmFwcGVkO1xufTtcblxudmFyIF8gPSBQcm90bztcblxuXG4vLyBzdG9yZSByYXcgbWV0aG9kcyBmcm9tIGRpZmZlcmVudCBtb2R1bGVzIGluIF9fIG9iamVjdCAoZG91YmxlIFwiX1wiKVxudmFyIF9fID0ge307XG5cbm9iamVjdE1ldGhvZHMuZXh0ZW5kLmNhbGwoX18sIG9iamVjdE1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIHByb3RvdHlwZU1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIGFycmF5TWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgc3RyaW5nTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgbnVtYmVyTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgZnVuY3Rpb25NZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCB1dGlsTWV0aG9kcyk7XG5cblxuLy8gYWRkIF9fIGFzIHByb3BlcnR5IG9mIFByb3RvLCBzbyB0aGV5IGNhbiBiZSB1c2VkIGFzIG1peGlucyBpbiBvdGhlciBjbGFzc2VzXG5fXy5kZWZpbmVQcm9wZXJ0eShQcm90bywgJ19fJywgX18pO1xuXG5cbi8vIGFkZCBfIG1ldGhvZCB0byB1bndyYXAgd3JhcHBlZCB2YWx1ZSAoUHJvdG8gaW5zdGFuY2UpXG5mdW5jdGlvbiB1bndyYXBQcm90bygpIHsgcmV0dXJuIHRoaXMuc2VsZjsgfVxuX18uZXh0ZW5kUHJvdG8uY2FsbChQcm90bywgeyBfOiB1bndyYXBQcm90byB9KTtcblxuLy8gYWRkIGNvbnN0YW50cyAoZnVuY3Rpb25zIHdpbGwgYmUgb3ZlcndyaXR0ZW4pXG5fXy5leHRlbmQuY2FsbChQcm90bywgb2JqZWN0TWV0aG9kcy5fY29uc3RhbnRzKTtcblxuLy8gYWRkIGZ1bmN0aW9ucyB0aGF0IHRha2UgZmlyc3QgcGFyYW1ldGVyIGluc3RlYWQgb2YgXCJ0aGlzXCIgdG8gUHJvdG9cbnZhciBwcm90b0Z1bmNzID0gX18ubWFwS2V5cy5jYWxsKF9fLCB1dGlscy5tYWtlUHJvdG9GdW5jdGlvbiwgdHJ1ZSk7XG5fXy5leHRlbmQuY2FsbChQcm90bywgcHJvdG9GdW5jcyk7XG5cbi8vIGFkZCBQcm90byB3cmFwcGVkIHZhbHVlIGluc3RhbmNlIG1ldGhvZHMgdG8gUHJvdG8gcHJvdG90eXBlXG52YXIgcHJvdG9JbnN0YW5jZU1ldGhvZHMgPSBfXy5tYXBLZXlzLmNhbGwoX18sIHV0aWxzLm1ha2VQcm90b0luc3RhbmNlTWV0aG9kLCB0cnVlKTtcbl9fLmV4dGVuZFByb3RvLmNhbGwoUHJvdG8sIHByb3RvSW5zdGFuY2VNZXRob2RzKTtcblxuXG4vKipcbiAqIEluIHdpbmRvd3MgZW52aXJvbm1lbnQsIGEgZ2xvYmFsIGBfYCB2YWx1ZSBpcyBwcmVzZXJ2ZWQgaW4gYF8udW5kZXJzY29yZWBcbiAqL1xuaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpIHtcbiAgICAvLyBwcmVzZXJ2ZSBleGlzdGluZyBfIG9iamVjdFxuICAgIGlmICh3aW5kb3cuXylcbiAgICAgICAgUHJvdG8udW5kZXJzY29yZSA9IHdpbmRvdy5fXG5cbiAgICAvLyBleHBvc2UgZ2xvYmFsIF8gYW5kIFByb3RvXG4gICAgd2luZG93Ll8gPSBQcm90bztcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpXG4gICAgLy8gZXhwb3J0IGZvciBub2RlL2Jyb3dzZXJpZnlcbiAgICBtb2R1bGUuZXhwb3J0cyA9IFByb3RvO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX18gPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpXG4gICAgLCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG4vKipcbiAqIC0gW2ZpbmRdKCNmaW5kKVxuICogLSBbZmluZEluZGV4XSgjZmluZEluZGV4KVxuICogLSBbYXBwZW5kQXJyYXldKCNhcHBlbmRBcnJheSlcbiAqIC0gW3ByZXBlbmRBcnJheV0oI3ByZXBlbmRBcnJheSlcbiAqIC0gW3NwbGljZUl0ZW1dKCNzcGxpY2VJdGVtKVxuICogLSBbdG9BcnJheV0oI3RvQXJyYXkpXG4gKiAtIFtvYmplY3RdKCNvYmplY3QpXG4gKiAtIFttYXBUb09iamVjdF0oI21hcFRvT2JqZWN0KVxuICogLSBbdW5pcXVlXSgjdW5pcXVlKVxuICogLSBbZGVlcEZvckVhY2hdKCNkZWVwRm9yRWFjaClcbiAqXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bykuXG4gKi9cbnZhciBhcnJheU1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvLyBmaW5kOiBzZWUgYmVsb3dcbiAgICAvLyBmaW5kSW5kZXg6IHNlZSBiZWxvd1xuICAgIGFwcGVuZEFycmF5OiBhcHBlbmRBcnJheSxcbiAgICBwcmVwZW5kQXJyYXk6IHByZXBlbmRBcnJheSxcbiAgICB0b0FycmF5OiB0b0FycmF5LFxuICAgIG9iamVjdDogb2JqZWN0LFxuICAgIG1hcFRvT2JqZWN0OiBtYXBUb09iamVjdCxcbiAgICB1bmlxdWU6IHVuaXF1ZSxcbiAgICBkZWVwRm9yRWFjaDogZGVlcEZvckVhY2gsXG4gICAgc3BsaWNlSXRlbTogc3BsaWNlSXRlbVxufTtcblxuXG4vKipcbiAqIEZ1bmN0aW9ucyB0aGF0IEFycmF5IFtpbXBsZW1lbnRzIG5hdGl2ZWx5XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9wcm90b3R5cGUjTWV0aG9kcykgYXJlIGFsc28gaW5jbHVkZWQgZm9yIGNvbnZlbmllbmNlIC0gdGhleSBjYW4gYmUgdXNlZCB3aXRoIGFycmF5LWxpa2Ugb2JqZWN0cyBhbmQgZm9yIGNoYWluaW5nIChuYXRpdmUgZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkKS5cbiAqIFRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKSB0b28uXG4gKi9cbnZhciBuYXRpdmVBcnJheU1ldGhvZHNOYW1lcyA9IFsgJ2pvaW4nLCAncG9wJywgJ3B1c2gnLCAnY29uY2F0JyxcbiAgICAncmV2ZXJzZScsICdzaGlmdCcsICd1bnNoaWZ0JywgJ3NsaWNlJywgJ3NwbGljZScsXG4gICAgJ3NvcnQnLCAnZmlsdGVyJywgJ2ZvckVhY2gnLCAnc29tZScsICdldmVyeScsXG4gICAgJ21hcCcsICdpbmRleE9mJywgJ2xhc3RJbmRleE9mJywgJ3JlZHVjZScsICdyZWR1Y2VSaWdodCddO1xuXG52YXIgbmF0aXZlQXJyYXlNZXRob2RzID0gbWFwVG9PYmplY3QuY2FsbChuYXRpdmVBcnJheU1ldGhvZHNOYW1lcyxcbiAgICAgICAgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZVttZXRob2ROYW1lXTtcbiAgICAgICAgfSk7XG5cbl9fLmV4dGVuZC5jYWxsKGFycmF5TWV0aG9kcywgbmF0aXZlQXJyYXlNZXRob2RzKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIEVTNiBbQXJyYXkgX19maW5kX18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kKSAobmF0aXZlIG1ldGhvZCBpcyB1c2VkIGlmIGF2YWlsYWJsZSkuXG4gKiBSZXR1cm5zIGFycmF5IGVsZW1lbnQgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIGFycmF5IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuYXJyYXlNZXRob2RzLmZpbmQgPSBBcnJheS5wcm90b3R5cGUuZmluZFxuICAgIHx8IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGFycmF5TWV0aG9kcy5mb3JFYWNoLCAndmFsdWUnKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIEVTNiBbQXJyYXkgX19maW5kSW5kZXhfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmRJbmRleCkgKG5hdGl2ZSBtZXRob2QgaXMgdXNlZCBpZiBhdmFpbGFibGUpLlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgYXJyYXkgZWxlbWVudCB0aGF0IHBhc3NlcyBjYWxsYmFjayB0ZXN0LiBSZXR1cm5zIGAtMWAgaWYgbm90IGZvdW5kLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgYXJyYXkgdG8gc2VhcmNoIGluXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGB0cnVlYCBmb3IgaXRlbSB0byBwYXNzIHRoZSB0ZXN0LCBwYXNzZWQgYHZhbHVlYCwgYGluZGV4YCBhbmQgYHNlbGZgIGFzIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIG9wdGlvbmFsIGNvbnRleHQgKGB0aGlzYCkgb2YgY2FsbGJhY2sgY2FsbFxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xuYXJyYXlNZXRob2RzLmZpbmRJbmRleCA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgICB8fCB1dGlscy5tYWtlRmluZE1ldGhvZChhcnJheU1ldGhvZHMuZm9yRWFjaCwgJ2luZGV4Jyk7XG5cblxuLyoqXG4gKiBBcHBlbmRzIGBhcnJheVRvQXBwZW5kYCB0byB0aGUgZW5kIG9mIGFycmF5IGBzZWxmYCBpbiBwbGFjZSAoY2FuIGJlIGFuIGluc3RhbmNlIG9mIEFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0KS5cbiAqIENoYW5nZXMgdGhlIHZhbHVlIG9mIGBzZWxmYCAoaXQgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWApIGFuZCByZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBtb2RpZmllZFxuICogQHBhcmFtIHtBcnJheXxBcnJheS1saWtlfSBhcnJheVRvQXBwZW5kIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEFycmF5KGFycmF5VG9BcHBlbmQpIHtcbiAgICBpZiAoISBhcnJheVRvQXBwZW5kLmxlbmd0aCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCEgQXJyYXkuaXNBcnJheShhcnJheVRvQXBwZW5kKSlcbiAgICAgICAgYXJyYXlUb0FwcGVuZCA9IHRvQXJyYXkuY2FsbChhcnJheVRvQXBwZW5kKTtcbiAgICBcbiAgICB2YXIgYXJncyA9IFt0aGlzLmxlbmd0aCwgMF0uY29uY2F0KGFycmF5VG9BcHBlbmQpO1xuICAgIGFycmF5TWV0aG9kcy5zcGxpY2UuYXBwbHkodGhpcywgYXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFByZXBlbmRzIGBhcnJheVRvUHJlcGVuZGAgdG8gdGhlIGJlZ2lubmlnIG9mIGFycmF5IGBzZWxmYCBpbiBwbGFjZSAoY2FuIGJlIGFuIGluc3RhbmNlIG9mIEFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0KS5cbiAqIENoYW5nZXMgdGhlIHZhbHVlIG9mIGBzZWxmYCAoaXQgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWApIGFuZCByZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBtb2RpZmllZFxuICogQHBhcmFtIHtBcnJheXxBcnJheS1saWtlfSBhcnJheVRvQXBwZW5kIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBwcmVwZW5kZWRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBwcmVwZW5kQXJyYXkoYXJyYXlUb1ByZXBlbmQpIHtcbiAgICBpZiAoISBhcnJheVRvUHJlcGVuZC5sZW5ndGgpIHJldHVybiB0aGlzO1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoYXJyYXlUb1ByZXBlbmQpKVxuICAgICAgICBhcnJheVRvUHJlcGVuZCA9IHRvQXJyYXkuY2FsbChhcnJheVRvUHJlcGVuZCk7XG5cbiAgICB2YXIgYXJncyA9IFswLCAwXS5jb25jYXQoYXJyYXlUb1ByZXBlbmQpO1xuICAgIGFycmF5TWV0aG9kcy5zcGxpY2UuYXBwbHkodGhpcywgYXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgaXRlbSBmcm9tIGFycmF5IHRoYXQgaXMgZm91bmQgdXNpbmcgaW5kZXhPZiAoaS5lLiAnPT09JylcbiAqIE1vZGlmaWVzIG9yaWdpbmFsIGFycmF5IGFuZCByZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gaXQuXG4gKiBcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgdGhhdCB3aWxsIGJlIG1vZGlmaWVkXG4gKiBAcGFyYW0gIHtBbnl9IGl0ZW0gaXRlbSB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gc3BsaWNlSXRlbShpdGVtKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA+PSAwKSB0aGlzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG5ldyBhcnJheSBjcmVhdGVkIGZyb20gYXJyYXktbGlrZSBvYmplY3QgKGUuZy4sIGBhcmd1bWVudHNgIHBzZXVkby1hcnJheSkuXG4gKlxuICogQHBhcmFtIHtBcnJheS1saWtlfSBzZWxmIE9iamVjdCB3aXRoIG51bWVyaWMgcHJvcGVydHkgbGVuZ3RoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICByZXR1cm4gYXJyYXlNZXRob2RzLnNsaWNlLmNhbGwodGhpcyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIGFycmF5IG9mIGBrZXlzYCBhbmQgb3B0aW9uYWwgYXJyYXkgb2YgYHZhbHVlc2AuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBcnJheSBvZiBrZXlzXG4gKiBAcGFyYW0ge0FycmF5fGFueX0gdmFsdWVzIE9wdGlvbmFsIGFycmF5IG9mIHZhbHVlcyBvciB0aGUgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gZWFjaCBwcm9wZXJ0eS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gb2JqZWN0KHZhbHVlcykge1xuICAgIHZhciBvYmogPSB7fVxuICAgICAgICAsIHZhbHVlc0lzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlcyk7XG4gICAgYXJyYXlNZXRob2RzLmZvckVhY2guY2FsbCh0aGlzLCBmdW5jdGlvbihrZXksIGluZGV4KSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWVzSXNBcnJheSA/IHZhbHVlc1tpbmRleF0gOiB2YWx1ZXM7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xufVxuXG5cbi8qKlxuICogTWFwcyBhcnJheSB0byBvYmplY3QuXG4gKiBBcnJheSBlbGVtZW50cyBiZWNvbWUga2V5cywgdmFsdWUgYXJlIHRha2VuIGZyb20gYGNhbGxiYWNrYC5cbiAqIFxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB3aGljaCB2YWx1ZXMgd2lsbCBiZWNvbWUga2V5cyBvZiB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGluZGV4YCBhbmQgYHNlbGZgIGFuZCBzaG91bGQgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG1hcFRvT2JqZWN0KGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGhpcywgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgd2l0aG91dCBkdXBsaWNhdGVzLiBEb2VzIG5vdCBtb2RpZnkgb3JpZ2luYWwgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBvcmlnaW5hbCBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgY29tcGFyaXNvbiBmdW5jdGlvbiwgc2hvdWxkIHJldHVybiB0cnVlIGZvciBlcXVhbCBpdGVtcywgXCI9PT1cIiBpcyB1c2VkIGlmIG5vdCBwYXNzZWQuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdW5pcXVlKGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpbHRlcmVkID0gW107XG4gICAgaWYgKCEgY2FsbGJhY2spXG4gICAgICAgIGl0ZW1JbmRleCA9IGl0ZW1JbmRleE9mO1xuXG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaXRlbUluZGV4KGl0ZW0pO1xuICAgICAgICBpZiAoaW5kZXggPT0gLTEpXG4gICAgICAgICAgICBmaWx0ZXJlZC5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuXG5cbiAgICBmdW5jdGlvbiBpdGVtSW5kZXgoaXRlbSkge1xuICAgICAgICByZXR1cm4gYXJyYXlNZXRob2RzLmZpbmRJbmRleC5jYWxsKGZpbHRlcmVkLCBmdW5jdGlvbihpdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGl0ZW0sIGl0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXRlbUluZGV4T2YoaXRlbSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyZWQuaW5kZXhPZihpdGVtKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBJdGVyYXRlcyBhcnJheSBhbmQgZWxlbWVudHMgdGhhdCBhcmUgYXJyYXlzIGNhbGxpbmcgY2FsbGJhY2sgd2l0aCBlYWNoIGVsZW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkuIENhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBhcmd1bWVudHMgbGlzdCB0byBhdm9pZCBjaGVja2luZyB3aGV0aGVyIGFycmF5IG9yIGxpc3Qgb2YgcGFyYW1ldGVycyBpcyBwYXNzZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheXxBcnJheS1saWtlfSBzZWxmIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBhcnJheXN0byBpdGVyYXRlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGVkIGZvciBlYWNoIGl0ZW0gdGhhdCBpcyBub3QgYW4gYXJyYXkuIENhbGxiYWNrIGlzIHBhc3NlZCBpdGVtLCBpbmRleCBhbmQgb3JpZ2luYWwgYXJyYXkgYXMgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7QW55fSB0aGlzQXJnIG9wdGlvbmFsIGNhbGxiYWNrIGVudm9jYXRpb24gY29udGV4dFxuICovXG5mdW5jdGlvbiBkZWVwRm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHZhciBpbmRleCA9IDAsIGFyciA9IHRoaXM7XG4gICAgX2RlZXBGb3JFYWNoLmNhbGwodGhpcyk7XG5cbiAgICBmdW5jdGlvbiBfZGVlcEZvckVhY2goKSB7XG4gICAgICAgIGFycmF5TWV0aG9kcy5mb3JFYWNoLmNhbGwodGhpcywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgICAgICBfZGVlcEZvckVhY2guY2FsbCh2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgrKywgYXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtYWtlUHJvdG9GdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMnKS5tYWtlUHJvdG9GdW5jdGlvblxuICAgICwgcmVwZWF0ID0gcmVxdWlyZSgnLi9wcm90b191dGlsJykucmVwZWF0O1xuXG5cbi8qKlxuICogLSBbbWFrZUZ1bmN0aW9uXSgjbWFrZUZ1bmN0aW9uKVxuICogLSBbcGFydGlhbF0oI3BhcnRpYWwpXG4gKiAtIFtwYXJ0aWFsUmlnaHRdKCNwYXJ0aWFsUmlnaHQpXG4gKiAtIFttZW1vaXplXSgjbWVtb2l6ZSlcbiAqIC0gW2RlbGF5XSgjZGVsYXkpXG4gKiAtIFtkZWZlcl0oI2RlZmVyKVxuICogLSBbZGVsYXllZF0oI2RlbGF5ZWQpXG4gKiAtIFtkZWZlcnJlZF0oI2RlZmVycmVkKVxuICogLSBbZGVmZXJUaWNrc10oI2RlZmVyVGlja3MpXG4gKiAtIFtkZWxheU1ldGhvZF0oI2RlbGF5TWV0aG9kKVxuICogLSBbZGVmZXJNZXRob2RdKCNkZWZlck1ldGhvZClcbiAqIC0gW2RlYm91bmNlXSgjZGVib3VuY2UpXG4gKiAtIFt0aHJvdHRsZV0oI3Rocm90dGxlKVxuICogLSBbb25jZV0oI29uY2UpXG4gKiAtIFt3YWl0Rm9yXSgjd2FpdEZvcilcbiAqIC0gW25vdF0oI25vdClcbiAqXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bylcbiAqL1xudmFyIGZ1bmN0aW9uTWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1ha2VGdW5jdGlvbjogbWFrZUZ1bmN0aW9uLFxuICAgIHBhcnRpYWw6IHBhcnRpYWwsXG4gICAgcGFydGlhbFJpZ2h0OiBwYXJ0aWFsUmlnaHQsXG4gICAgbWVtb2l6ZTogbWVtb2l6ZSxcbiAgICBkZWxheTogZGVsYXksXG4gICAgZGVmZXI6IGRlZmVyLFxuICAgIGRlbGF5ZWQ6IGRlbGF5ZWQsXG4gICAgZGVmZXJyZWQ6IGRlZmVycmVkLFxuICAgIGRlZmVyVGlja3M6IGRlZmVyVGlja3MsXG4gICAgZGVsYXlNZXRob2Q6IGRlbGF5TWV0aG9kLFxuICAgIGRlZmVyTWV0aG9kOiBkZWZlck1ldGhvZCxcbiAgICBkZWJvdW5jZTogZGVib3VuY2UsXG4gICAgdGhyb3R0bGU6IHRocm90dGxlLFxuICAgIG9uY2U6IG9uY2UsXG4gICAgd2FpdEZvcjogd2FpdEZvcixcbiAgICBub3Q6IG5vdFxufTtcblxuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cblxuLyoqXG4gKiBTaW1pbGFybHkgdG8gRnVuY3Rpb24gY29uc3RydWN0b3IgY3JlYXRlcyBhIGZ1bmN0aW9uIGZyb20gY29kZS5cbiAqIFVubGlrZSBGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gbmFtZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG5ldyBmdW5jdGlvbiBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gYXJnMSwgYXJnMiwgLi4uIHRoZSBuYW1lcyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gZnVuY0JvZHkgZnVuY3Rpb24gYm9keVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG1ha2VGdW5jdGlvbihhcmcxLCBhcmcyLCBmdW5jQm9keSkge1xuICAgIHZhciBuYW1lID0gdGhpc1xuICAgICAgICAsIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDFcbiAgICAgICAgLCBmdW5jQm9keSA9IGFyZ3VtZW50c1tjb3VudF1cbiAgICAgICAgLCBmdW5jXG4gICAgICAgICwgY29kZSA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKylcbiAgICAgICAgY29kZSArPSAnLCAnICsgYXJndW1lbnRzW2ldO1xuICAgIGNvZGUgPSBbJ2Z1bmMgPSBmdW5jdGlvbiAnLCBuYW1lLCAnKCcsIGNvZGUuc2xpY2UoMiksICcpIHtcXG4nXG4gICAgICAgICAgICAgICAgLCBmdW5jQm9keSwgJ1xcbn0nXS5qb2luKCcnKTtcbiAgICBldmFsKGNvZGUpO1xuICAgIHJldHVybiBmdW5jO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGFzIGEgcmVzdWx0IG9mIHBhcnRpYWwgZnVuY3Rpb24gYXBwbGljYXRpb24gd2l0aCB0aGUgcGFzc2VkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBGdW5jdGlvbiB0byBiZSBhcHBsaWVkXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBBcmd1bWVudHMgYWZ0ZXIgc2VsZiB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gY2FsbCB3aGVuIHRoZSBwYXJ0aWFsIGZ1bmN0aW9uIGlzIGNhbGxlZC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBwYXJ0aWFsKCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGFzIGEgcmVzdWx0IG9mIHBhcnRpYWwgZnVuY3Rpb24gYXBwbGljYXRpb24gd2l0aCB0aGUgcGFzc2VkIHBhcmFtZXRlcnMsIGJ1dCBwYXJhbWV0ZXJzIGFyZSBhcHBlbmRlZCBvbiB0aGUgcmlnaHQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBGdW5jdGlvbiB0byBiZSBhcHBsaWVkXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBBcmd1bWVudHMgYWZ0ZXIgc2VsZiB3aWxsIGJlIGFwcGVuZGVkIG9uIHRoZSByaWdodCB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gY2FsbCB3aGVuIHRoZSBwYXJ0aWFsIGZ1bmN0aW9uIGlzIGNhbGxlZC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBwYXJ0aWFsUmlnaHQoKSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBmdW5jID0gdGhpcztcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzKS5jb25jYXQoYXJncykpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gdXNpbmcgc3VwcGxpZWQgaGFzaCBmdW5jdGlvbiBhcyBrZXkuIElmIHRoZSBoYXNoIGlzIG5vdCBzdXBwbGllZCwgdXNlcyBpdHMgZmlyc3QgcGFyYW1ldGVyIGFzIHRoZSBoYXNoLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRvIGJlIG1lbW9pemVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNoRnVuYyBvcHRpb25hbCBoYXNoIGZ1bmN0aW9uIHRoYXQgaXMgcGFzc2VkIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIHNob3VsZCByZXR1cm4gY2FjaGUga2V5LlxuICogQHBhcmFtIHtJbnRlZ2VyfSBsaW1pdCBvcHRpb25hbCBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUuIDEwMDAgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBtZW1vaXplZCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBtZW1vaXplKGhhc2hGdW5jLCBsaW1pdCkge1xuICAgIHZhciBmdW5jID0gdGhpcztcbiAgICB2YXIgY2FjaGUgPSB7fSwga2V5c0xpc3QgPSBbXTtcbiAgICBsaW1pdCA9IGxpbWl0IHx8IDEwMDA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBrZXkgPSBoYXNoRnVuYyA/IGhhc2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBhcmd1bWVudHNbMF07XG4gICAgICAgIGlmIChjYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlW2tleV07XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IGNhY2hlW2tleV0gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGtleXNMaXN0LnB1c2goa2V5KTtcblxuICAgICAgICBpZiAoa2V5c0xpc3QubGVuZ3RoID4gbGltaXQpXG4gICAgICAgICAgICBkZWxldGUgY2FjaGVba2V5c0xpc3Quc2hpZnQoKV07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogRGVsYXlzIGZ1bmN0aW9uIGV4ZWN1dGlvbiBieSBhIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVsYXkod2FpdCkgeyAvLyAsIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBfZGVsYXkodGhpcywgd2FpdCwgYXJncyk7XG59XG4gXG5cbi8qKlxuICogRGVmZXJzIGZ1bmN0aW9uIGV4ZWN1dGlvbiAoZXhlY3V0ZXMgYXMgc29vbiBhcyBleGVjdXRpb24gbG9vcCBiZWNvbWVzIGZyZWUpXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlZmVyKCkgeyAvLyAsIGFyZ3VtZW50c1xuICAgIHJldHVybiBfZGVsYXkodGhpcywgMSwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2RlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jLmFwcGx5LmJpbmQoZnVuYywgY29udGV4dCB8fCBudWxsLCBhcmdzKSwgd2FpdCk7XG59XG5cbi8qKlxuICogU2FtZSBhcyBfLmRlZmVyLCB0YWtlcyBmaXJzdCBhcmd1bWVudCBhcyB0aGUgZnVuY3Rpb24gdG8gYmUgZGVmZXJyZWRcbiAqL1xudmFyIGRlZmVyRnVuYyA9IG1ha2VQcm90b0Z1bmN0aW9uKGRlZmVyKTtcblxuLyoqXG4gKiBEZWZlcnMgZnVuY3Rpb24gZXhlY3V0aW9uIGZvciBgdGltZXNgIHRpY2tzIChleGVjdXRlcyBhZnRlciBleGVjdXRpb24gbG9vcCBiZWNvbWVzIGZyZWUgYHRpbWVzYCB0aW1lcylcbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHRpY2tzIG51bWJlciBvZiB0aW1lcyB0byBkZWZlciBleGVjdXRpb25cbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBkZWZlclRpY2tzKHRpY2tzKSB7IC8vICwgYXJndW1lbnRzXG4gICAgaWYgKHRpY2tzIDwgMikgcmV0dXJuIGRlZmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGFyZ3MgPSByZXBlYXQuY2FsbChkZWZlckZ1bmMsIHRpY2tzIC0gMSk7XG4gICAgYXJncyA9IGFyZ3MuY29uY2F0KHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IFxuICAgIHJldHVybiBkZWZlckZ1bmMuYXBwbHkobnVsbCwgYXJncyk7XG59XG5cblxuLyoqXG4gKiBXb3JrcyBsaWtlIF8uZGVsYXkgYnV0IGFsbG93cyB0byBkZWZlciBtZXRob2QgY2FsbCBvZiBgc2VsZmAgd2hpY2ggd2lsbCBiZSB0aGUgZmlyc3QgXy5kZWxheU1ldGhvZCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gZGVsYXkgbWV0aG9kIGNhbGwgb2ZcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBmdW5jT3JNZXRob2ROYW1lIGZ1bmN0aW9uIG9yIG5hbWUgb2YgbWV0aG9kXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYXJndW1lbnRzIHRvIHBhc3MgdG8gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGRlbGF5TWV0aG9kKGZ1bmNPck1ldGhvZE5hbWUsIHdhaXQpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgcmV0dXJuIF9kZWxheU1ldGhvZCh0aGlzLCBmdW5jT3JNZXRob2ROYW1lLCB3YWl0LCBhcmdzKTtcbn1cblxuXG4vKipcbiAqIFdvcmtzIGxpa2UgXy5kZWZlciBidXQgYWxsb3dzIHRvIGRlZmVyIG1ldGhvZCBjYWxsIG9mIGBzZWxmYCB3aGljaCB3aWxsIGJlIHRoZSBmaXJzdCBfLmRlZmVyTWV0aG9kIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIG9iamVjdCB0byBkZWZlciBtZXRob2QgY2FsbCBvZlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZ1bmNPck1ldGhvZE5hbWUgZnVuY3Rpb24gb3IgbmFtZSBvZiBtZXRob2RcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFyZ3VtZW50cyB0byBwYXNzIHRvIG1ldGhvZFxuICovXG5mdW5jdGlvbiBkZWZlck1ldGhvZChmdW5jT3JNZXRob2ROYW1lKSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBfZGVsYXlNZXRob2QodGhpcywgZnVuY09yTWV0aG9kTmFtZSwgMSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIF9kZWxheU1ldGhvZChvYmplY3QsIGZ1bmNPck1ldGhvZE5hbWUsIHdhaXQsIGFyZ3MpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSB0eXBlb2YgZnVuY09yTWV0aG9kTmFtZSA9PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IG9iamVjdFtmdW5jT3JNZXRob2ROYW1lXVxuICAgICAgICAgICAgICAgICAgICA6IGZ1bmNPck1ldGhvZE5hbWU7XG4gICAgICAgIGZ1bmMuYXBwbHkob2JqZWN0LCBhcmdzKTtcbiAgICB9LCB3YWl0KTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGB3YWl0YCBtcyBhZnRlciBpdCBoYXMgYmVlbiBjYWxsZWRcbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBkZWxheWVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gd2hpY2ggZXhlY3V0aW9uIGhhcyB0byBiZSBkZWZlcnJlZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGRlbGF5ZWQod2FpdCkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBmdW5jID0gdGhpc1xuICAgICAgICAsIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAvLyAuLi4gYXJndW1lbnRzXG4gICAgICAgIHZhciBwYXNzQXJncyA9IGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgICAgIHJldHVybiBfZGVsYXkoZnVuYywgd2FpdCwgcGFzc0FyZ3MsIHRoaXMpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBvbiB0aGUgbmV4dCB0aWNrIG9uY2UgaXQgaGFzIGJlZW4gY2FsbGVkXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVmZXJyZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB3aGljaCBleGVjdXRpb24gaGFzIHRvIGJlIGRlZmVycmVkXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWZlcnJlZCgpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgLy8gLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgcGFzc0FyZ3MgPSBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gX2RlbGF5KGZ1bmMsIDEsIHBhc3NBcmdzLCB0aGlzKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIG9yaWdpbmFsIGZ1bmN0aW9uIG9uY2UgaXQgaGFzIG5vdCBiZWVuIGNhbGxlZCBmb3IgYSBzcGVjaWZpZWQgdGltZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGltbWVkaWF0ZSB0cnVlIHRvIGludm9rZSBmdW5jaXRvbiBpbW1lZGlhdGVseSBhbmQgdGhlbiBpZ25vcmUgZm9sbG93aW5nIGNhbGxzIGZvciB3YWl0IG1pbGxpc2Vjb25kc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKHdhaXQsIGltbWVkaWF0ZSkge1xuICAgIHZhciBmdW5jID0gdGhpczsgLy8gZmlyc3QgcGFyYW1ldGVyIG9mIF8uZGVib3VuY2VcbiAgICB2YXIgdGltZW91dCwgYXJncywgY29udGV4dCwgdGltZXN0YW1wLCByZXN1bHQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBjb250ZXh0ID0gdGhpczsgLy8gc3RvcmUgb3JpZ2luYWwgY29udGV4dFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhIHRpbWVvdXQ7XG4gICAgICAgIGlmICghIHRpbWVvdXQpXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChjYWxsTm93KVxuICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgICAgIHZhciBsYXN0ID0gRGF0ZS5ub3coKSAtIHRpbWVzdGFtcDtcbiAgICAgICAgICAgIGlmIChsYXN0IDwgd2FpdClcbiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCAtIGxhc3QpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCEgaW1tZWRpYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgd2hlbiBpbnZva2VkLCB3aWxsIG9ubHkgYmUgdHJpZ2dlcmVkIGF0IG1vc3Qgb25jZSBkdXJpbmcgYSBnaXZlbiB3aW5kb3cgb2YgdGltZS4gXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGB7bGVhZGluZzogZmFsc2V9YCB0byBkaXNhYmxlIHRoZSBleGVjdXRpb24gb24gdGhlIGxlYWRpbmcgZWRnZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKHdhaXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7IC8vIGZpcnN0IHBhcmFtZXRlciBvZiBfLnRocm90dGxlXG4gICAgdmFyIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgICB2YXIgdGltZW91dCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzID0gMDtcbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxhdGVyKCkge1xuICAgICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ2FsbCBwYXNzZWQgZnVuY3Rpb24gb25seSBvbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gc2VsZlxuICovXG5mdW5jdGlvbiBvbmNlKCkge1xuICAgIHZhciBmdW5jID0gdGhpc1xuICAgICAgICAsIHJhbiA9IGZhbHNlXG4gICAgICAgICwgbWVtbztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChyYW4pIHJldHVybiBtZW1vO1xuICAgICAgICByYW4gPSB0cnVlO1xuICAgICAgICBtZW1vID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBmdW5jID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIHRoZSBjb25kaXRpb24gZnVuY3Rpb24gcmV0dXJucyBhIHRydXRoeSB2YWx1ZVxuICogaXQgcnVucyB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uIGV2ZXJ5IGBjaGVja0ludGVydmFsYCBtaWxsaXNlY29uZHMgKGRlZmF1bHQgNTApXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbjogaWYgaXQgcmV0dXJucyB0cnVlIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgcnVucyB3aGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZVxuICogQHBhcmFtIHtOdW1iZXJ9IG1heFRpbWVvdXQgdGltZW91dCBiZWZvcmUgZ2l2aW5nIHVwICh0aW1lIGluIG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRpbWVkT3V0RnVuYyBhIGZ1bmN0aW9uIGNhbGxlZCBpZiB0aW1lb3V0IGlzIHJlYWNoZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBjaGVja0ludGVydmFsIHRpbWUgaW50ZXJ2YWwgd2hlbiB5b3UgcnVuIHRoZSBjb25kaXRpb24gZnVuY3Rpb24gKHRpbWUgaW4gbWlsbGlzZWNvbmRzKSwgZGVmYXVsdCA1MCBtc1xuICovXG5mdW5jdGlvbiB3YWl0Rm9yKGNhbGxiYWNrLCBtYXhUaW1lb3V0LCB0aW1lZE91dEZ1bmMsIGNoZWNrSW50ZXJ2YWwpe1xuICAgIHZhciBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdmFyIGNvbmRpdGlvbiA9IHRoaXM7XG4gICAgY2hlY2tJbnRlcnZhbCA9IGNoZWNrSW50ZXJ2YWwgfHwgNTA7XG4gICAgdmFyIGludGVydmFsID0gc2V0SW50ZXJ2YWwodGVzdENvbmRpdGlvbiwgY2hlY2tJbnRlcnZhbCk7XG5cbiAgICBmdW5jdGlvbiB0ZXN0Q29uZGl0aW9uKCkge1xuICAgICAgICBpZiAoY29uZGl0aW9uKCkpIGNhbGxiYWNrKCk7XG4gICAgICAgIGVsc2UgaWYgKERhdGUubm93KCkgLSBzdGFydCA+PSBtYXhUaW1lb3V0KVxuICAgICAgICAgICAgdGltZWRPdXRGdW5jICYmIHRpbWVkT3V0RnVuYygpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIHJldHVybnMgdGhlIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyAoISBvcGVyYXRvcikgdGhlIHJlc3VsdCBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdG8gbmVnYXRlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbm90KCkge1xuICAgIHZhciBmdW5jID0gdGhpcztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogLSBbaXNOdW1lcmljXSgjaXNOdW1lcmljKVxuICovXG52YXIgbnVtYmVyTWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGlzTnVtZXJpYzogaXNOdW1lcmljXG59O1xuXG5cbi8qKlxuICogRnVuY3Rpb24gdG8gdGVzdCBpZiBhIHZhbHVlIGlzIG51bWVyaWNcbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiB2YWx1ZSB0byBiZSB0ZXN0ZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSBudW1lcmljIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtZXJpYygpIHtcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodGhpcykpICYmIGlzRmluaXRlKHRoaXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiAtIFtleHRlbmRdKCNleHRlbmQpXG4gKiAtIFtjbG9uZV0oI2Nsb25lKVxuICogLSBbZGVmaW5lUHJvcGVydHldKCNkZWZpbmVQcm9wZXJ0eSlcbiAqIC0gW2RlZmluZVByb3BlcnRpZXNdKCNkZWZpbmVQcm9wZXJ0aWVzKVxuICogLSBbZGVlcEV4dGVuZF0oI2RlZXBFeHRlbmQpXG4gKiAtIFtkZWVwQ2xvbmVdKCNkZWVwQ2xvbmUpXG4gKiAtIFtrZXlzXSgja2V5cylcbiAqIC0gW2FsbEtleXNdKCNhbGxLZXlzKVxuICogLSBbdmFsdWVzXSgjdmFsdWVzKVxuICogLSBba2V5T2ZdKCNrZXlPZilcbiAqIC0gW2FsbEtleXNPZl0oI2FsbEtleXNPZilcbiAqIC0gW2VhY2hLZXldKCNlYWNoS2V5KVxuICogLSBbbWFwS2V5c10oI21hcEtleXMpXG4gKiAtIFtyZWR1Y2VLZXlzXSgjcmVkdWNlS2V5cylcbiAqIC0gW2ZpbHRlcktleXNdKCNmaWx0ZXJLZXlzKVxuICogLSBbc29tZUtleV0oI3NvbWVLZXkpXG4gKiAtIFtldmVyeUtleV0oI2V2ZXJ5S2V5KVxuICogLSBbZmluZFZhbHVlXSgjZmluZFZhbHVlKVxuICogLSBbZmluZEtleV0oI2ZpbmRLZXkpXG4gKiAtIFtwaWNrS2V5c10oI3BpY2tLZXlzKVxuICogLSBbb21pdEtleXNdKCNvbWl0S2V5cylcbiAqIC0gW2lzRXF1YWxdKCNpc0VxdWFsKVxuICogLSBbaXNOb3RdKCNpc05vdClcbiAqXG4gKiBBbGwgdGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pXG4gKi9cbnZhciBvYmplY3RNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZXh0ZW5kOiBleHRlbmQsXG4gICAgY2xvbmU6IGNsb25lLFxuICAgIGRlZmluZVByb3BlcnR5OiBkZWZpbmVQcm9wZXJ0eSxcbiAgICBkZWZpbmVQcm9wZXJ0aWVzOiBkZWZpbmVQcm9wZXJ0aWVzLFxuICAgIGRlZXBFeHRlbmQ6IGRlZXBFeHRlbmQsXG4gICAgZGVlcENsb25lOiBkZWVwQ2xvbmUsXG4gICAga2V5czoga2V5cyxcbiAgICBhbGxLZXlzOiBhbGxLZXlzLFxuICAgIHZhbHVlczogdmFsdWVzLFxuICAgIGtleU9mOiBrZXlPZixcbiAgICBhbGxLZXlzT2Y6IGFsbEtleXNPZixcbiAgICBlYWNoS2V5OiBlYWNoS2V5LFxuICAgIG1hcEtleXM6IG1hcEtleXMsXG4gICAgcmVkdWNlS2V5czogcmVkdWNlS2V5cyxcbiAgICBmaWx0ZXJLZXlzOiBmaWx0ZXJLZXlzLFxuICAgIHNvbWVLZXk6IHNvbWVLZXksXG4gICAgZXZlcnlLZXk6IGV2ZXJ5S2V5LFxuICAgIHBpY2tLZXlzOiBwaWNrS2V5cyxcbiAgICBvbWl0S2V5czogb21pdEtleXMsXG4gICAgaXNFcXVhbDogaXNFcXVhbCxcbiAgICBpc05vdDogaXNOb3Rcbn07XG5cblxuLyoqXG4gKiAjIyMjUHJvcGVydHkgZGVzY3JpcHRvciBjb25zdGFudHMjIyMjXG4gKiBUaGUgc3VtIG9mIHRoZXNlIGNvbnN0YW50cyBjYW4gYmUgdXNlZCBhcyBsYXN0IHBhcmFtZXRlciBvZiBkZWZpbmVQcm9wZXJ0eSBhbmQgZGVmaW5lUHJvcGVydGllcyB0byBkZXRlcm1pbmUgdHlwZXMgb2YgcHJvcGVydGllcy5cbiAqL1xudmFyIGNvbnN0YW50cyA9IHtcbiAgICBFTlVNRVJBQkxFOiAxLFxuICAgIEVOVU06IDEsXG4gICAgQ09ORklHVVJBQkxFOiAyLFxuICAgIENPTkY6IDIsXG4gICAgV1JJVEFCTEU6IDQsXG4gICAgV1JJVDogNFxufTtcblxuZGVmaW5lUHJvcGVydHkuY2FsbChvYmplY3RNZXRob2RzLCAnX2NvbnN0YW50cycsIGNvbnN0YW50cyk7XG5cblxuLyoqXG4gKiBBbmFsb2d1ZSBvZiBFUzYgW0FycmF5IF9fZmluZF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBvYmplY3QgcHJvcGVydHkgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gc2VhcmNoIGluXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGB0cnVlYCBmb3IgaXRlbSB0byBwYXNzIHRoZSB0ZXN0LCBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbm9iamVjdE1ldGhvZHMuZmluZFZhbHVlID0gdXRpbHMubWFrZUZpbmRNZXRob2QoZWFjaEtleSwgJ3ZhbHVlJyk7XG5cblxuLyoqXG4gKiBBbmFsb2d1ZSBvZiBFUzYgW0FycmF5IF9fZmluZEluZGV4X18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kSW5kZXgpLlxuICogUmV0dXJucyB0aGUga2V5IG9mIG9iamVjdCBwcm9wZXJ0eSB0aGF0IHBhc3NlcyBjYWxsYmFjayB0ZXN0LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZCAodW5saWtlIGBmaW5kSW5kZXhgLCB0aGF0IHJldHVybnMgLTEgaW4gdGhpcyBjYXNlKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gc2VhcmNoIGluXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGB0cnVlYCBmb3IgaXRlbSB0byBwYXNzIHRoZSB0ZXN0LCBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5vYmplY3RNZXRob2RzLmZpbmRLZXkgPSB1dGlscy5tYWtlRmluZE1ldGhvZChlYWNoS2V5LCAna2V5Jyk7XG5cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBgc2VsZmAgd2l0aCB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGBvYmpgIGNvcHlpbmcgYWxsIG93biBwcm9wZXJ0aWVzIChub3QgdGhvc2UgaW5oZXJpdGVkIHZpYSBwcm90b3R5cGUgY2hhaW4pLCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyAodW5sZXNzIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KS5cbiAqIENyZWF0ZWQgcHJvcGVydGllcyB3aWxsIGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvcnMgYXMgdGhlIHByb3BlcnRpcyBvZiBgb2JqYC5cbiAqIFJldHVybnMgYHNlbGZgIHRvIGFsbG93IGNoYWluaW5nIHdpdGggb3RoZXIgZnVuY3Rpb25zLlxuICogQ2FuIGJlIHVzZWQgd2l0aCBmdW5jdGlvbnMsIHRvIGNvcHkgY2xhc3MgbWV0aG9kcywgZS5nLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGNvcGllZCB0byBzZWxmXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGZsYWcgdG8gcHJldmVudCBjb3B5aW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMsIGBmYWxzZWAgYnkgZGVmYXVsdFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBleHRlbmQob2JqLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IHt9O1xuXG4gICAgZWFjaEtleS5jYWxsKG9iaiwgZnVuY3Rpb24odmFsdWUsIHByb3ApIHtcbiAgICAgICAgZGVzY3JpcHRvcnNbcHJvcF0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgfSwgdGhpcywgb25seUVudW1lcmFibGUpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgZGVzY3JpcHRvcnMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2Ygb2JqZWN0IGBvYmpgIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzOyB0aGUgcHJvcGVydGllcyB3aWxsIGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvcnMuXG4gKiBUbyBjbG9uZSBhbiBhcnJheSB1c2VcbiAqIGBgYFxuICogdmFyIGNsb25lZEFycmF5ID0gW10uY29uY2F0KGFycik7XG4gKiBgYGBcbiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGNsb25lIGFuIGFycmF5LCBiZWNhdXNlIGl0IGlzIGluZWZmaWNpZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBiZSBjbG9uZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcykpIHJldHVybiB0aGlzLnNsaWNlKCk7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUodGhpcyk7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiBuZXcgUmVnRXhwKHRoaXMpO1xuICAgIHZhciBjbG9uZWRPYmplY3QgPSBPYmplY3QuY3JlYXRlKHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlKTtcbiAgICBleHRlbmQuY2FsbChjbG9uZWRPYmplY3QsIHRoaXMpO1xuICAgIHJldHVybiBjbG9uZWRPYmplY3Q7XG59XG5cblxuLyoqXG4gKiBTeW50YXggc3VnYXIgdG8gc2hvcnRlbiB1c2FnZSBvZiBgT2JqZWN0LmRlZmluZVByb3BlcnR5YC5cbiAqIFRoZSBzaW1wbGVzdCB1c2FnZSAodG8gYWRkIG5vbi1lbnVtZXJhYmxlLCBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUgcHJvcGVydHkpOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnR5KG9iaiwgJ2tleScsIHZhbHVlKTtcbiAqIGBgYFxuICpcbiAqIFRvIGRlZmluZSBzb21lIG90aGVyIHByb3BlcnRpZXMgdXNlIHN1bSBvZiB0aGUgZmxhZ3MgYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0eShvYmosICdrZXknLCB2YWx1ZSwgXy5FTlVNICsgXy5XUklUKTtcbiAqIGBgYFxuICogUmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGFkZCBhIHByb3BlcnR5IHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7QW55fSB2YWx1ZSB0aGUgdmFsdWUgb2YgYWRkZWQgcHJvcGVydHlcbiAqIEBwYXJhbSB7SW50ZWdlcn0gZGVjcmlwdG9yRmxhZ3MgYml0IG1hc2sgb2YgcHJvcGVydHkgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIGNvbXBvc2VkIGZyb20gYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlLCBkZWNyaXB0b3JGbGFncykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIF9nZXREZXNjcmlwdG9yKHZhbHVlLCBkZWNyaXB0b3JGbGFncykpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXREZXNjcmlwdG9yKHZhbHVlLCBkZWNyaXB0b3JGbGFncykge1xuICAgIHZhciBkZXNjcmlwdG9yID0geyB2YWx1ZTogdmFsdWUgfTtcbiAgICBpZiAoZGVjcmlwdG9yRmxhZ3MpXG4gICAgICAgIGV4dGVuZC5jYWxsKGRlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5FTlVNRVJBQkxFKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISEgKGRlY3JpcHRvckZsYWdzICYgY29uc3RhbnRzLkNPTkZJR1VSQUJMRSksXG4gICAgICAgICAgICB3cml0YWJsZTogISEgKGRlY3JpcHRvckZsYWdzICYgY29uc3RhbnRzLldSSVRBQkxFKVxuICAgICAgICB9KTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xufVxuXG5cbi8qKlxuICogU3ludGF4IHN1Z2FyIHRvIHNob3J0ZW4gdXNhZ2Ugb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYC5cbiAqIFRoZSBzaW1wbGVzdCB1c2FnZSAodG8gYWRkIG5vbi1lbnVtZXJhYmxlLCBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUgcHJvcGVydGllcyk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydGllcyhvYmosIHtcbiAqICAgICBrZXkxOiB2YWx1ZTEsXG4gKiAgICAga2V5MjogdmFsdWUyXG4gKiB9KTtcbiAqIGBgYFxuICogVG8gZGVmaW5lIHNvbWUgb3RoZXIgcHJvcGVydGllcyB1c2Ugc3VtIG9mIHRoZSBmbGFncyBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gKiAgICAga2V5MTogdmFsdWUxLFxuICogICAgIGtleTI6IHZhbHVlMlxuICogfSwgXy5FTlVNICsgXy5XUklUKTtcbiAqIGBgYFxuICogUmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGFkZCBhIHByb3BlcnR5IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydHlWYWx1ZXMgQSBtYXAgb2Yga2V5cyBhbmQgdmFsdWVzIG9mIHByb3BlcnRpZXMgdGhhdHdpbGwgYmUgYWRkZWQuIFRoZSBkZXNjcmlwdG9ycyBvZiBwcm9wZXJ0aWVzIHdpbGwgYmUgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGRlY3JpcHRvckZsYWdzIGJpdCBtYXNrIG9mIHByb3BlcnR5IGRlc2NyaXB0b3IgcHJvcGVydGllcyBjb21wb3NlZCBmcm9tIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhwcm9wZXJ0eVZhbHVlcywgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSBtYXBLZXlzLmNhbGwocHJvcGVydHlWYWx1ZXMsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpO1xuICAgIH0sIHRydWUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRlc2NyaXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGBzZWxmYCB3aXRoIHByb3BlcnRpZXMgb2YgYG9iamAgdG8gYW55IGRlcHRoLCB3aXRob3V0IG92ZXJ3cnRpdGluZyBleGlzdGluZyBvYmplY3QgcHJvcGVydGllcyBvZiBgc2VsZmAgd2l0aCBvYmplY3QgcHJvcGVydGllcyBvZiBgb2JqYC5cbiAqIFNjYWxhciBwcm9wZXJ0aWVzIG9mIGBvYmpgIHdpbGwgb3ZlcndyaXRlIHByb3BlcnRpZXMgb2YgYHNlbGZgLiBTY2FsYXIgcG9ycGVydGllcyBvZiBgc2VsZmAgd2lsbCBhbHNvIGJlIG92ZXJ3cml0dGVuLlxuICogQ29ycmVjdGx5IHdvcmtzIHdpdGggcmVjdXJzaXZlIG9iamVjdHMuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogdmFyIG9iaiA9IHtcbiAqICAgICBpbm5lcjoge1xuICogICAgICAgICBhOiAxXG4gKiAgICAgfVxuICogfTtcbiAqXG4gKiBfLmRlZXBFeHRlbmQob2JqLCB7XG4gKiAgICAgaW5uZXI6IHtcbiAqICAgICAgICAgYjogMlxuICogICAgIH1cbiAqIH0pO1xuICpcbiAqIGFzc2VydC5kZWVwRXF1YWwob2JqLCB7XG4gKiAgICAgaW5uZXI6IHtcbiAqICAgICAgICAgYTogMSxcbiAqICAgICAgICAgYjogMlxuICogICAgIH1cbiAqIH0pOyAvLyBhc3NlcnQgcGFzc2VzXG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBBbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIGNvcHkgdG9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgT3B0aW9uYWwgYHRydWVgIHRvIHVzZSBvbmx5IGVudW1lcmFibGUgcHJvcGVydGllc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBkZWVwRXh0ZW5kKG9iaiwgb25seUVudW1lcmFibGUpIHtcbiAgICByZXR1cm4gX2V4dGVuZFRyZWUodGhpcywgb2JqLCBvbmx5RW51bWVyYWJsZSwgW10pO1xufVxuXG5cbmZ1bmN0aW9uIF9leHRlbmRUcmVlKHNlbGZOb2RlLCBvYmpOb2RlLCBvbmx5RW51bWVyYWJsZSwgb2JqVHJhdmVyc2VkKSB7XG4gICAgaWYgKG9ialRyYXZlcnNlZC5pbmRleE9mKG9iak5vZGUpID49IDApIHJldHVybjsgLy8gbm9kZSBhbHJlYWR5IHRyYXZlcnNlZCwgb2JqIGhhcyByZWN1cnNpb25cblxuICAgIC8vIHN0b3JlIG5vZGUgdG8gcmVjb2duaXNlIHJlY3Vyc2lvblxuICAgIG9ialRyYXZlcnNlZC5wdXNoKG9iak5vZGUpO1xuXG4gICAgdmFyIGxvb3AgPSBBcnJheS5pc0FycmF5KG9iak5vZGUpID8gQXJyYXkucHJvdG90eXBlLmZvckVhY2ggOiBlYWNoS2V5O1xuXG4gICAgbG9vcC5jYWxsKG9iak5vZGUsIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmpOb2RlLCBwcm9wKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgICAgICAgJiYgISAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmICEgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIGlmICghIChzZWxmTm9kZS5oYXNPd25Qcm9wZXJ0eShwcm9wKVxuICAgICAgICAgICAgICAgICAgICAmJiB0eXBlb2Ygc2VsZk5vZGVbcHJvcF0gPT0gJ29iamVjdCcgJiYgc2VsZk5vZGVbcHJvcF0gIT0gbnVsbCkpXG4gICAgICAgICAgICAgICAgc2VsZk5vZGVbcHJvcF0gPSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpID8gW10gOiB7fTtcbiAgICAgICAgICAgIF9leHRlbmRUcmVlKHNlbGZOb2RlW3Byb3BdLCB2YWx1ZSwgb25seUVudW1lcmFibGUsIG9ialRyYXZlcnNlZCk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGZOb2RlLCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgICB9LCB0aGlzLCBvbmx5RW51bWVyYWJsZSk7XG5cbiAgICByZXR1cm4gc2VsZk5vZGU7XG59XG5cblxuLyoqXG4gKiBDbG9uZXMgYWxsIG9iamVjdCB0cmVlLiBDbGFzcyBvZiBvcmlnaW5hbCBvYmplY3QgaXMgbm90IHByZXNlcnZlZC4gUmV0dXJucyBgc2VsZmBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgT3B0aW9uYWwgYHRydWVgIHRvIHVzZSBvbmx5IGVudW1lcmFibGUgcHJvcGVydGllc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBkZWVwQ2xvbmUob25seUVudW1lcmFibGUpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZSh0aGlzKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFJlZ0V4cCkgcmV0dXJuIG5ldyBSZWdFeHAodGhpcyk7XG4gICAgdmFyIGNsb25lZE9iamVjdCA9IEFycmF5LmlzQXJyYXkodGhpcykgPyBbXSA6IHt9O1xuICAgIGRlZXBFeHRlbmQuY2FsbChjbG9uZWRPYmplY3QsIHRoaXMsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gY2xvbmVkT2JqZWN0O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIG9iamVjdCB0byByZXR1cm4ga2V5cyBvZlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiB2YWx1ZXMgb2YgdGhlIG9iamVjdCdzIGtleXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gcmV0dXJuIHZhbHVlcyBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBvbmx5RW51bWVyYWJsZVxuICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHJldHVybiBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiB0aGlzW3Byb3BdO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiBhbGwgcHJvcGVydHkgbmFtZXMgb2YgYW4gb2JqZWN0IGBzZWxmYCAoaW5jbHVkaW5nIG5vbi1lbnVtZXJiYWxlKS5cbiAqIFRvIGdldCBvbmx5IGVudW1lcmFibGUgcHJvcGVydGllcywgdXNlIGBPYmplY3Qua2V5cygpYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gZ2V0IGFsbCBwcm9wZXJ0aWVzIG9mLlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbiBmdW5jdGlvbiBhbGxLZXlzKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKTtcbiB9XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBgaW5kZXhPZmAgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIGBrZXlgIG9mIGBzZWFyY2hFbGVtZW50YCBpbiB0aGUgb2JqZWN0IGBzZWxmYC5cbiAqIEFzIG9iamVjdCBrZXlzIGFyZSB1bnNvcnRlZCwgaWYgdGhlcmUgYXJlIHNldmVyYWwga2V5cyB0aGF0IGhvbGQgYHNlYXJjaEVsZW1lbnRgIGFueSBvZiB0aGVtIGNhbiBiZSByZXR1cm5lZC4gVXNlIGBhbGxLZXlzT2ZgIHRvIHJldHVybiBhbGwga2V5cy5cbiAqIEFsbCBvd24gcHJvcGVydGllcyBhcmUgc2VhcmNoZWQgKG5vdCB0aG9zZSBpbmhlcml0ZWQgdmlhIHByb3RvdHlwZSBjaGFpbiksIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzICh1bmxlc3MgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBzZWFyY2ggYSB2YWx1ZSBpblxuICogQHBhcmFtIHtBbnl9IHNlYXJjaEVsZW1lbnQgQW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgc2VhcmNoZWQuIEFuIGV4YWN0IGVxdWFsaXR5IGlzIHRlc3RlZCwgc28gYDBgIGlzIG5vdCB0aGUgc2FtZSBhcyBgJzAnYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgdHJ1ZSB0byBzZWFyY2ggYW1vbmcgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGtleU9mKHNlYXJjaEVsZW1lbnQsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBvbmx5RW51bWVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChzZWFyY2hFbGVtZW50ID09PSB0aGlzW3Byb3BlcnRpZXNbaV1dKVxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNbaV07XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5cbi8qKlxuICogV29ya3Mgc2ltaWxhcmx5IHRvIHRoZSBwcmV2aW91cyBmdW5jdGlvbiwgYnV0IHJldHVybnMgdGhlIGFycmF5IG9mIGtleXMgaG9sZGluZyBgc2VhcmNoRWxlbWVudGAgYXMgdGhlaXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIHNlYXJjaCBhIHZhbHVlIGluXG4gKiBAcGFyYW0ge0FueX0gc2VhcmNoRWxlbWVudCBBbiBlbGVtZW50IHRoYXQgd2lsbCBiZSBzZWFyY2hlZC4gQW4gZXhhY3QgZXF1YWxpdHkgaXMgdGVzdGVkLCBzbyBgMGAgaXMgbm90IHRoZSBzYW1lIGFzIGAnMCdgLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCB0cnVlIHRvIHNlYXJjaCBhbW9uZyBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge0FycmF5W1N0cmluZ119XG4gKi9cbmZ1bmN0aW9uIGFsbEtleXNPZihzZWFyY2hFbGVtZW50LCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIGtleXMgPSBwcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBzZWFyY2hFbGVtZW50ID09PSB0aGlzW3Byb3BdO1xuICAgIH0sIHRoaXMpO1xuXG4gICAgcmV0dXJuIGtleXM7XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbZm9yRWFjaF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZm9yRWFjaCkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIEl0ZXJhdGVzIGFsbCBvd24gcHJvcGVydGllcyBvZiBgc2VsZmAgKG9yIG9ubHkgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBpZiBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkgY2FsbGluZyBjYWxsYmFjayBmb3IgZWFjaCBrZXkuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhcnJheXMsIGl0IHdpbGwgaW5jbHVkZSBgbGVuZ3RoYCBwcm9wZXJ0eSBpbiBpdGVyYXRpb24uXG4gKiBUbyBpdGVyYXRlIGFycmF5LWxpa2Ugb2JqZWN0cyAoZS5nLiwgYGFyZ3VtZW50c2AgcHNldWRvLWFycmF5KSB1c2U6XG4gKiBgYGBcbiAqIF8uZm9yRWFjaChhcmd1bWVudHMsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAqIGBgYFxuICogRnVuY3Rpb24gcmV0dXJucyBgc2VsZmAgdG8gYWxsb3cgW2NoYWluaW5nXShwcm90by5qcy5odG1sKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLCBpdHMgcmV0dXJuIHZhbHVlIGlzIG5vdCB1c2VkLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICovXG5mdW5jdGlvbiBlYWNoS2V5KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzW3Byb3BdLCBwcm9wLCB0aGlzKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW21hcF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvbWFwKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICogUmV0dXJucyB0aGUgb2JqZWN0IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiB0aGUgYXBwbGljYXRpb24gb2YgY2FsbGJhY2sgdG8gdmFsdWVzIGluIGFsbCBvd24gcHJvcGVydGllcyBvZiBgc2VsZmAgKG9yIG9ubHkgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBpZiBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkuXG4gKiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgdGhlIGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzIGFzIGBzZWxmYC5cbiAqIFByb3BlcnR5IGRlc2NyaXB0b3JzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIHRoZSBzYW1lIGBlbnVtZXJhYmxlYCwgYGNvbmZpZ3VyYWJsZWAgYW5kIGB3cml0YWJsZWAgc2V0dGluZ3MgYXMgdGhlIHByb3BlcnRpZXMgb2YgYHNlbGZgLlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYXJyYXlzLCBpdCB3aWxsIGluY2x1ZGUgYGxlbmd0aGAgcHJvcGVydHkgaW4gaXRlcmF0aW9uLlxuICogVG8gbWFwIGFycmF5LWxpa2Ugb2JqZWN0cyB1c2U6XG4gKiBgYGBcbiAqIHZhciByZXN1bHQgPSBfLm1hcChhcmd1bWVudHMsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFuZCBzaG91bGQgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFwLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYXBLZXlzKGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IHt9O1xuICAgIGVhY2hLZXkuY2FsbCh0aGlzLCBtYXBQcm9wZXJ0eSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpO1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG5cbiAgICBmdW5jdGlvbiBtYXBQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGRlc2NyaXB0b3JzW2tleV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbGYsIGtleSk7XG4gICAgICAgIGRlc2NyaXB0b3JzW2tleV0udmFsdWUgPSBjYWxsYmFjay5jYWxsKHRoaXMsIHZhbHVlLCBrZXksIHNlbGYpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtyZWR1Y2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L1JlZHVjZSkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFRoaXMgbWV0aG9kIHJlZHVjZXMgdGhlIG9iamVjdCB0byBhIHNpbmdsZSB2YWx1ZS4gSXRlcmF0aW9uIG9yZGVyIGlzIGltcG9zc2libGUgdG8gY29udHJvbCB3aXRoIG9iamVjdC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGFycmF5cywgaXQgd2lsbCBpbmNsdWRlIGBsZW5ndGhgIHByb3BlcnR5IGluIGl0ZXJhdGlvbi5cbiAqIFRvIHJlZHVjZSBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5yZWR1Y2UoYXJndW1lbnRzLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCB0aGlzQXJnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgcHJldmlvdXNWYWx1ZWAsIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYW5kIHNob3VsZCByZXR1cm4gdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGBwcmV2aW91c1ZhbHVlYCBmb3IgdGhlIG5leHQgYGNhbGxiYWNrYCBjYWxsLlxuICogQHBhcmFtIHtBbnl9IGluaXRpYWxWYWx1ZSBUaGUgaW5pdGlhbCB2YWx1ZSBwYXNzZWQgdG8gY2FsbGJhY2sgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBvbiB0aGUgZmlyc3QgY2FsbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gcmVkdWNlS2V5cyhjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIG1lbW8gPSBpbml0aWFsVmFsdWU7XG5cbiAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBtZW1vID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCBtZW1vLCB0aGlzW3Byb3BdLCBwcm9wLCB0aGlzKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBtZW1vO1xufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW2ZpbHRlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmlsdGVyKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICogUmV0dXJucyB0aGUgbmV3IG9iamVjdCB3aXRoIGtleXMgZm9yIHdoaWNoIGNhbGxiYWNrIHJldHVybnMgdHJ1ZS5cbiAqIFByb3BlcnR5IGRlc2NyaXB0b3JzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIHRoZSBzYW1lIGBlbnVtZXJhYmxlYCwgYGNvbmZpZ3VyYWJsZWAgYW5kIGB3cml0YWJsZWAgc2V0dGluZ3MgYXMgdGhlIHByb3BlcnRpZXMgb2YgYHNlbGZgLlxuICogVG8gZmlsdGVyIGFycmF5LWxpa2Ugb2JqZWN0cyB1c2U6XG4gKiBgYGBcbiAqIHZhciByZXN1bHQgPSBfLmZpbHRlcihhcmd1bWVudHMsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLiBJZiBpdCByZXR1cm5zIHRydXRoeSB2YWx1ZSwgdGhlIGtleS92YWx1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBmaWx0ZXJLZXlzKGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBkZXNjcmlwdG9ycyA9IHt9O1xuICAgIGVhY2hLZXkuY2FsbCh0aGlzLCBmaWx0ZXJQcm9wZXJ0eSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpO1xuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7O1xuXG4gICAgZnVuY3Rpb24gZmlsdGVyUHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBpZiAoY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKSlcbiAgICAgICAgICAgIGRlc2NyaXB0b3JzW2tleV0gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbGYsIGtleSk7XG4gICAgfVxufVxuXG5cbnZhciBfcGFzc2VkID0ge31cbiAgICAsIF9kaWROb3RQYXNzID0ge307XG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW3NvbWVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NvbWUpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAuIElmIGl0IHJldHVybnMgdHJ1dGh5IHZhbHVlLCB0aGUgZnVuY3Rpb24gaW1tZWFkaXRlbHkgcmV0dXJucyBgdHJ1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBzb21lS2V5KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGVhY2hLZXkuY2FsbCh0aGlzLCB0ZXN0UHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICB9IGNhdGNoICh0ZXN0KSB7XG4gICAgICAgIGlmICh0ZXN0ID09PSBfcGFzc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSB0aHJvdyB0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBpZiAoY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKSlcbiAgICAgICAgICAgIHRocm93IF9wYXNzZWQ7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW2V2ZXJ5XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeSkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYC4gSWYgaXQgcmV0dXJucyBmYWxzeSB2YWx1ZSwgdGhlIGZ1bmN0aW9uIGltbWVhZGl0ZWx5IHJldHVybnMgYGZhbHNlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGV2ZXJ5S2V5KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGVhY2hLZXkuY2FsbCh0aGlzLCB0ZXN0UHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICB9IGNhdGNoICh0ZXN0KSB7XG4gICAgICAgIGlmICh0ZXN0ID09PSBfZGlkTm90UGFzcykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbHNlIHRocm93IHRlc3Q7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuXG4gICAgZnVuY3Rpb24gdGVzdFByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKCEgY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKSlcbiAgICAgICAgICAgIHRocm93IF9kaWROb3RQYXNzO1xuICAgIH1cbn1cblxuXG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZVxuICAgICwgY29uY2F0ID0gQXJyYXlQcm90by5jb25jYXQ7XG4vKipcbiAqIFJldHVybnMgb2JqZWN0IG9mIHRoZSBzYW1lIGNsYXNzIHdpdGggb25seSBzcGVjaWZpZWQga2V5cywgdGhhdCBhcmUgcGFzc2VkIGFzIHN0cmluZyBwYXJhbWV0ZXJzIG9yIGFycmF5KHMpIG9mIGtleXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgYW4gb2JqZWN0IHRvIHBpY2sga2V5cyBmcm9tXG4gKiBAcGFyYW0ge0xpc3RbU3RyaW5nfEFycmF5XX0gYXJndW1lbnRzIGxpc3Qgb2Yga2V5cyAob3IgYXJyYXkocykgb2Yga2V5cylcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gcGlja0tleXMoKSB7IC8vICwgLi4uIGtleXNcbiAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBhcmd1bWVudHMpXG4gICAgICAgICwgb2JqID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICAgICAgb2JqW2tleV0gPSB0aGlzW2tleV07XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIG9iajtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgb2JqZWN0IG9mIHRoZSBzYW1lIGNsYXNzIHdpdGhvdXQgc3BlY2lmaWVkIGtleXMsIHRoYXQgYXJlIHBhc3NlZCBhcyBzdHJpbmcgcGFyYW1ldGVycyBvciBhcnJheShzKSBvZiBrZXlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIGFuIG9iamVjdCB0byBvbWl0IGtleXMgaW5cbiAqIEBwYXJhbSB7TGlzdFtTdHJpbmd8QXJyYXldfSBhcmd1bWVudHMgbGlzdCBvZiBrZXlzIChvciBhcnJheShzKSBvZiBrZXlzKVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBvbWl0S2V5cygpIHsgLy8gLCAuLi4ga2V5c1xuICAgIHZhciBrZXlzID0gY29uY2F0LmFwcGx5KEFycmF5UHJvdG8sIGFyZ3VtZW50cylcbiAgICAgICAgLCBvYmogPSBjbG9uZS5jYWxsKHRoaXMpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe1xuICAgICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIG9iajtcbn1cblxuXG4vKipcbiAqIFBlcmZvcm1zIGRlZXAgZXF1YWxpdHkgdGVzdCBvZiB0aGUgb2JqZWN0LiBEb2VzIG5vdCB3b3JrIHdpdGggcmVjdXJzaXZlIG9iamVjdHNcbiAqIEBwYXJhbSAge0FueX0gc2VsZiBvYmplY3QgdG8gY29tcGFyZVxuICogQHBhcmFtICB7QW55fSBvYmogb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwob2JqKSB7XG4gICAgaWYgKHRoaXMgPT09IG9iaikgcmV0dXJuIHRoaXMgIT09IDAgfHwgMS90aGlzID09IDEvb2JqOyAvLyAwIGFuZCAtMCBhcmUgY29uc2lkZXJlZCBub3QgZXF1YWwsIGFsdGhvdWdoIDAgPT09IC0wIGlzIHRydWVcbiAgICBpZiAodGhpcyA9PSBudWxsIHx8IG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICBpZiAoY2xhc3NOYW1lICE9IG9iai5jb25zdHJ1Y3Rvci5uYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzID09IFN0cmluZyhvYmopO1xuICAgICAgICBjYXNlICdOdW1iZXInOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMgIT0gK3RoaXMgPyBvYmogIT0gK29iaiA6ICh0aGlzID09IDAgPyAxL3RoaXMgPT0gMS9vYmogOiB0aGlzID09ICtvYmopO1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICAgICAgICByZXR1cm4gK3RoaXMgPT0gK29iajtcbiAgICAgICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZSA9PSBvYmouc291cmNlXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZ2xvYmFsID09IG9iai5nbG9iYWxcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5tdWx0aWxpbmUgPT0gb2JqLm11bHRpbGluZVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmlnbm9yZUNhc2UgPT0gb2JqLmlnbm9yZUNhc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcyAhPSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqICE9ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzKSlcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09IG9iai5sZW5ndGhcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0VxdWFsLmNhbGwoaXRlbSwgb2JqW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBhbGxLZXlzLmNhbGwodGhpcykubGVuZ3RoID09IGFsbEtleXMuY2FsbChvYmopLmxlbmd0aFxuICAgICAgICAgICAgICAgICYmIGV2ZXJ5S2V5LmNhbGwodGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcXVhbC5jYWxsKHZhbHVlLCBvYmpba2V5XSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogVGhlIG9wcG9zaXRlIG9mIGlzRXF1YWxcbiAqIEBwYXJhbSAge0FueX0gc2VsZiBvYmplY3QgdG8gY29tcGFyZVxuICogQHBhcmFtICB7QW55fSBvYmogb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTm90KG9iaikge1xuICAgIHJldHVybiAhaXNFcXVhbC5jYWxsKHRoaXMsIG9iaik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogLSBbZXh0ZW5kUHJvdG9dKCNleHRlbmRQcm90bylcbiAqIC0gW2NyZWF0ZVN1YmNsYXNzXSgjY3JlYXRlU3ViY2xhc3MpXG4gKiAtIFttYWtlU3ViY2xhc3NdKCNtYWtlU3ViY2xhc3MpXG4gKiAtIFtuZXdBcHBseV0oI25ld0FwcGx5KVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKVxuICovXG52YXIgcHJvdG90eXBlTWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGV4dGVuZFByb3RvOiBleHRlbmRQcm90byxcbiAgICBjcmVhdGVTdWJjbGFzczogY3JlYXRlU3ViY2xhc3MsXG4gICAgbWFrZVN1YmNsYXNzOiBtYWtlU3ViY2xhc3MsXG4gICAgbmV3QXBwbHk6IG5ld0FwcGx5XG59O1xuXG5cbnZhciBfXyA9IHJlcXVpcmUoJy4vcHJvdG9fb2JqZWN0Jyk7XG5cbl9fLmV4dGVuZC5jYWxsKF9fLCByZXF1aXJlKCcuL3Byb3RvX2Z1bmN0aW9uJykpO1xuXG5cbi8qKlxuICogQWRkcyBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSBhbmQgbm9uLXdyaXRhYmxlIHByb3BlcnRpZXMgdG8gdGhlIHByb3RvdHlwZSBvZiBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiBmdW5jdGlvbiBNeUNsYXNzKCkge31cbiAqIF8uZXh0ZW5kUHJvdG8oTXlDbGFzcywge1xuICogICAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkge30sXG4gKiAgICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7fVxuICogfSk7XG4gKiBgYGBcbiAqIFRvIGV4dGVuZCBjbGFzcyB2aWEgb2JqZWN0OlxuICogYGBgXG4gKiBfLmV4dGVuZFByb3RvKG9iai5jb25zdHJ1Y3RvciwgbWV0aG9kcyk7XG4gKiBgYGBcbiAqIFJldHVybnMgcGFzc2VkIGNvbnN0cnVjdG9yLCBzbyBmdW5jdGlvbnMgXy5leHRlbmRQcm90bywgW18uZXh0ZW5kXShvYmplY3QuanMuaHRtbCNleHRlbmQpIGFuZCBfLm1ha2VTdWJjbGFzcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwpLiBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gbWV0aG9kcyBhIG1hcCBvZiBmdW5jdGlvbnMsIGtleXMgd2lsbCBiZSBpbnN0YW5jZSBtZXRob2RzIChwcm9wZXJ0aWVzIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm90b3R5cGUpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kUHJvdG8obWV0aG9kcykge1xuICAgIHZhciBwcm9wRGVzY3JpcHRvcnMgPSB7fTtcblxuICAgIF9fLmVhY2hLZXkuY2FsbChtZXRob2RzLCBmdW5jdGlvbihtZXRob2QsIG5hbWUpIHtcbiAgICAgICAgcHJvcERlc2NyaXB0b3JzW25hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG1ldGhvZFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5wcm90b3R5cGUsIHByb3BEZXNjcmlwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBNYWtlcyBhIHN1YmNsYXNzIG9mIGNsYXNzIGB0aGlzQ2xhc3NgLlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHdpbGwgaGF2ZSBzcGVjaWZpZWQgYG5hbWVgIGlmIHN1cHBsaWVkLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIHN1cGVyY2xhc3Mgd2lsbCBiZSBjYWxsZWQgaW4gc3ViY2xhc3MgY29uc3RydWN0b3IgYnkgZGVmYXVsdCB1bmxlc3MgYGFwcGx5Q29uc3RydWN0b3IgPT09IGZhbHNlYCAobm90IGp1c3QgZmFsc3kpLlxuICogQ29waWVzIGB0aGlzQ2xhc3NgIGNsYXNzIG1ldGhvZHMgdG8gY3JlYXRlZCBzdWJjbGFzcy4gRm9yIHRoZW0gdG8gd29yayBjb3JyZWN0bHkgdGhleSBzaG91bGQgdXNlIGB0aGlzYCB0byByZWZlciB0byB0aGUgY2xhc3MgcmF0aGVyIHRoYW4gZXhwbGljaXQgc3VwZXJjbGFzcyBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXNDbGFzcyBBIGNsYXNzIHRvIG1ha2Ugc3ViY2xhc3Mgb2ZcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE9wdGlvbmFsIG5hbWUgb2Ygc3ViY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYXBwbHlDb25zdHJ1Y3RvciBPcHRpb25hbCBmYWxzZSB2YWx1ZSAobm90IGZhbHN5KSB0byBwcmV2ZW50IGNhbGwgb2YgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBzdWJjbGFzc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN1YmNsYXNzKG5hbWUsIGFwcGx5Q29uc3RydWN0b3IpIHtcbiAgICB2YXIgdGhpc0NsYXNzID0gdGhpcztcbiAgICB2YXIgc3ViY2xhc3M7XG5cbiAgICAvLyBuYW1lIGlzIG9wdGlvbmFsXG4gICAgbmFtZSA9IG5hbWUgfHwgJyc7XG5cbiAgICAvLyBhcHBseSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yXG4gICAgdmFyIGNvbnN0cnVjdG9yQ29kZSA9IGFwcGx5Q29uc3RydWN0b3IgPT09IGZhbHNlXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6ICd0aGlzQ2xhc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsnO1xuXG4gICAgZXZhbCgnc3ViY2xhc3MgPSBmdW5jdGlvbiAnICsgbmFtZSArICcoKXsgJyArIGNvbnN0cnVjdG9yQ29kZSArICcgfScpO1xuXG4gICAgbWFrZVN1YmNsYXNzLmNhbGwoc3ViY2xhc3MsIHRoaXNDbGFzcyk7XG5cbiAgICAvLyBjb3B5IGNsYXNzIG1ldGhvZHNcbiAgICAvLyAtIGZvciB0aGVtIHRvIHdvcmsgY29ycmVjdGx5IHRoZXkgc2hvdWxkIG5vdCBleHBsaWN0bHkgdXNlIHN1cGVyY2xhc3MgbmFtZVxuICAgIC8vIGFuZCB1c2UgXCJ0aGlzXCIgaW5zdGVhZFxuICAgIF9fLmRlZXBFeHRlbmQuY2FsbChzdWJjbGFzcywgdGhpc0NsYXNzLCB0cnVlKTtcblxuICAgIHJldHVybiBzdWJjbGFzcztcbn1cblxuXG4vKipcbiAqIFNldHMgdXAgcHJvdG90eXBlIGNoYWluIHRvIGNoYW5nZSBgdGhpc0NsYXNzYCAoYSBjb25zdHJ1Y3RvciBmdW5jdGlvbikgc28gdGhhdCBpdCBiZWNvbWVzIGEgc3ViY2xhc3Mgb2YgYFN1cGVyY2xhc3NgLlxuICogUmV0dXJucyBgdGhpc0NsYXNzYCBzbyBpdCBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwpIHdpdGggXy5leHRlbmRQcm90byBhbmQgW18uZXh0ZW5kXShvYmplY3QuanMuaHRtbCNleHRlbmQpLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXNDbGFzcyBBIGNsYXNzIHRoYXQgd2lsbCBiZWNvbWUgYSBzdWJjbGFzcyBvZiBTdXBlcmNsYXNzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBTdXBlcmNsYXNzIEEgY2xhc3MgdGhhdCB3aWxsIGJlY29tZSBhIHN1cGVyY2xhc3Mgb2YgdGhpc0NsYXNzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbWFrZVN1YmNsYXNzKFN1cGVyY2xhc3MpIHtcbiAgICAvLyBwcm90b3R5cGUgY2hhaW5cbiAgICB0aGlzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXJjbGFzcy5wcm90b3R5cGUpO1xuICAgIFxuICAgIC8vIHN1YmNsYXNzIGlkZW50aXR5XG4gICAgZXh0ZW5kUHJvdG8uY2FsbCh0aGlzLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB0aGlzXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBDYWxscyBjb25zdHJ1Y3RvciBgdGhpc2Agd2l0aCBhcmd1bWVudHMgcGFzc2VkIGFzIGFycmF5XG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXNDbGFzcyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWRcbiAqIEByZXR1cm4ge0FycmF5fEFycmF5LWxpa2V9IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gbmV3QXBwbHkoYXJncykge1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoYXJncykpXG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKTtcbiAgICAvLyBcIm51bGxcIiBpcyBjb250ZXh0IHRvIHBhc3MgdG8gY2xhc3MgY29uc3RydWN0b3IsIGZpcnN0IHBhcmFtZXRlciBvZiBiaW5kXG4gICAgdmFyIGFyZ3MgPSBbbnVsbF0uY29uY2F0KGFyZ3MpO1xuICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgX18gPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5cbi8qKlxuICogLSBbZmlyc3RVcHBlckNhc2VdKCNmaXJzdFVwcGVyQ2FzZSlcbiAqIC0gW2ZpcnN0TG93ZXJDYXNlXSgjZmlyc3RMb3dlckNhc2UpXG4gKiAtIFt0b1JlZ0V4cF0oI3RvUmVnRXhwKVxuICogLSBbdG9GdW5jdGlvbl0oI3RvRnVuY3Rpb24pXG4gKiAtIFt0b0RhdGVdKCN0b0RhdGUpXG4gKiAtIFt0b1F1ZXJ5U3RyaW5nXSgjdG9RdWVyeVN0cmluZylcbiAqIC0gW2Zyb21RdWVyeVN0cmluZ10oI2Zyb21RdWVyeVN0cmluZylcbiAqIC0gW2pzb25QYXJzZV0oI2pzb25QYXJzZSlcbiAqIC0gW2hhc2hDb2RlXSgjaGFzaENvZGUpXG4gKiAtIFt1blByZWZpeF0oI3VuUHJlZml4KVxuICovXG4gdmFyIHN0cmluZ01ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmaXJzdFVwcGVyQ2FzZTogZmlyc3RVcHBlckNhc2UsXG4gICAgZmlyc3RMb3dlckNhc2U6IGZpcnN0TG93ZXJDYXNlLFxuICAgIHRvUmVnRXhwOiB0b1JlZ0V4cCxcbiAgICB0b0Z1bmN0aW9uOiB0b0Z1bmN0aW9uLFxuICAgIHRvRGF0ZTogdG9EYXRlLFxuICAgIHRvUXVlcnlTdHJpbmc6IHRvUXVlcnlTdHJpbmcsXG4gICAgZnJvbVF1ZXJ5U3RyaW5nOiBmcm9tUXVlcnlTdHJpbmcsXG4gICAganNvblBhcnNlOiBqc29uUGFyc2UsXG4gICAgaGFzaENvZGU6IGhhc2hDb2RlLFxuICAgIHVuUHJlZml4OiB1blByZWZpeFxufTtcblxuXG4vKipcbiAqIFJldHVybnMgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFuZ2VkIHRvIHVwcGVyIGNhc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgQSBzdHJpbmcgdGhhdCB3aWxsIGhhdmUgaXRzIGZpcnN0IGNoYXJhY3RlciByZXBsYWNlZFxuICovXG5mdW5jdGlvbiBmaXJzdFVwcGVyQ2FzZSgpIHtcbiAgICByZXR1cm4gdGhpcyA/IHRoaXNbMF0udG9VcHBlckNhc2UoKSArIHRoaXMuc2xpY2UoMSkgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIGNoYW5nZWQgdG8gbG93ZXIgY2FzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBBIHN0cmluZyB0aGF0IHdpbGwgaGF2ZSBpdHMgZmlyc3QgY2hhcmFjdGVyIHJlcGxhY2VkXG4gKi9cbmZ1bmN0aW9uIGZpcnN0TG93ZXJDYXNlKCkge1xuICAgIHJldHVybiB0aGlzID8gdGhpc1swXS50b0xvd2VyQ2FzZSgpICsgdGhpcy5zbGljZSgxKSA6IHRoaXM7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgY3JlYXRlZCBieSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBSZWdFeHAgYmFjayB0byBSZWdFeHBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBzdHJpbmcgY29udGFpbmluZyByZWd1bGFyIGV4cHJlc3Npb24gaW5jbHVkaW5nIGVuY2xvc2luZyBcIi9cIiBzeW1ib2xzIGFuZCBmbGFnc1xuICogQHJldHVybiB7UmVnRXhwfVxuICovXG5mdW5jdGlvbiB0b1JlZ0V4cCgpIHtcbiAgICB2YXIgcnggPSB0aGlzLm1hdGNoKHJlZ2V4cFN0cmluZ1BhdHRlcm4pO1xuICAgIGlmIChyeCkgcmV0dXJuIG5ldyBSZWdFeHAocnhbMV0sIHJ4WzJdKTtcbn1cbnZhciByZWdleHBTdHJpbmdQYXR0ZXJuID0gL15cXC8oLiopXFwvKFtnaW15XSopJC87XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgY3JlYXRlZCBieSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBmdW5jdGlvbiBiYWNrIHRvIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBmdW5jdGlvbiBjb2RlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdG9GdW5jdGlvbigpIHtcbiAgICB2YXIgZnVuYztcbiAgICB2YXIgY29kZSA9ICdmdW5jID0gJyArIHRoaXMgKyAnOyc7XG4gICAgdHJ5IHtcbiAgICAgICAgZXZhbChjb2RlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gZGF0ZSBpbiBhIHNhZmUgd2F5IHNvIHRoYXQgdGhlIHJlc2l1bHQgaXMgdW5kZWZpbmVkIGlmIGRhdGUgaXMgaW52YWxpZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfERhdGV9IHNlbGYgc3RyaW5nIG9yIGRhdGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gVkFMSUQgZGF0ZVxuICogQHJldHVybiB7W3R5cGVdfSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIHRvRGF0ZSgpIHtcbiAgICBpZiAoISB0aGlzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGlmIChkYXRlICYmIGRhdGUuZ2V0VGltZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKVxuICAgICAgICByZXR1cm4gZGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgcGFyYW1zIG9iamVjdCB0byBhIHVybCBzdHlsZSBxdWVyeSBzdHJpbmcgKHdpdGhvdXQgXCI/XCIpXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIFRoZSBvYmplY3QgaGFzaCB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZSBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIGVuY29kZSBkYXRhLCBlbmNvZGVVUklDb21wb25lbnQgaXMgdXNlZCBpZiBub3Qgc3BlY2lmaWVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHRpbmcgcXVlcnkgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHRvUXVlcnlTdHJpbmcoZW5jb2RlKSB7XG4gICAgdmFyIHFzID0gJydcbiAgICAgICAgLCBwYXJhbXMgPSB0aGlzIHx8IHt9XG4gICAgICAgICwgZW5jb2RlID0gZW5jb2RlIHx8IGVuY29kZVVSSUNvbXBvbmVudDtcblxuICAgIF9fLmVhY2hLZXkuY2FsbChwYXJhbXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcXMgKz0ga2V5ICsgJz0nICsgZW5jb2RlKHZhbHVlKSArICcmJztcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcXMuc2xpY2UoMCwgLTEpO1xufVxuXG5cbi8qKlxuICogQ29udmVydCB1cmwgc3R5bGUgcXVlcnkgc3RyaW5nICh3aXRob3V0IFwiP1wiKSBpbnRvIG9iamVjdCBoYXNoXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkZWNvZGUgb3B0aW9uYWwgZGVjb2RlIGZ1bmN0aW9uLCBkZWNvZGVVUklDb21wb25lbnQgd2lsbCBiZSB1c2VkIGlmIG5vdCBzdXBwbGllZFxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIG9iamVjdCBoYXNoXG4gKi9cbmZ1bmN0aW9uIGZyb21RdWVyeVN0cmluZyhkZWNvZGUpIHtcbiAgICB2YXIgcGFpcnMgPSB0aGlzLnNwbGl0KCcmJylcbiAgICAgICAgLCByZXN1bHRzID0ge31cbiAgICAgICAgLCBkZWNvZGUgPSBkZWNvZGUgfHwgZGVjb2RlVVJJQ29tcG9uZW50O1xuXG4gICAgcGFpcnMuZm9yRWFjaChmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIHZhciBzcGxpdFBhaXIgPSBwYWlyLnNwbGl0KCc9Jyk7XG4gICAgICAgIGlmIChzcGxpdFBhaXIubGVuZ3RoIDwgMikgcmV0dXJuO1xuICAgICAgICB2YXIga2V5ID0gc3BsaXRQYWlyWzBdXG4gICAgICAgICAgICAsIHZhbHVlID0gZGVjb2RlKHNwbGl0UGFpclsxXSB8fCAnJyk7XG4gICAgICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgICAgIHJlc3VsdHNba2V5XSA9IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cblxuLyoqXG4gKiBTYWZlIEpTT04ucGFyc2UsIHJldHVybnMgdW5kZWZpbmVkIGlmIEpTT04ucGFyc2UgdGhyb3dzIGFuIGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24ganNvblBhcnNlKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG59XG5cblxuLyoqXG4gKiBEYW4gQmVybnN0ZWluJ3MgYWxnb3J5dGhtIHRvIGNyZWF0ZSBoYXNoIGZyb20gc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgc3RyaW5nIHRvIGNvbnZlcnQgdG8gaGFzaFxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBoYXNoQ29kZSgpIHtcbiAgICB2YXIgaGFzaCA9IDUzODFcbiAgICAgICAgLCBzdHIgPSB0aGlzXG4gICAgICAgICwgbGVuID0gc3RyLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgKyBoYXNoKSArIGNoYXI7IC8qIGhhc2ggKiAzMyArIGMgKi9cbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGdpdmVuIHByZWZpeCBmcm9tIHRoZSBzdHJpbmcuIElmIHN0cmluZyBkb2VzIG5vdCBiZWdpbiBmcm9tIHRoZSBwcmVmaXgsIHJldHVybnMgdW5kZWZpbmVkXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHVuUHJlZml4KHN0cikge1xuICAgIGlmICh0aGlzLmluZGV4T2Yoc3RyKSA9PSAwKVxuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKHN0ciwgJycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW3RpbWVzXSgjdGltZXMpXG4gKiAtIFtyZXBlYXRdKCNyZXBlYXQpXG4gKiAtIFt0YXBdKCN0YXApXG4gKiAtIFtyZXN1bHRdKCNyZXN1bHQpXG4gKiAtIFtpZGVudGl0eV0oI2lkZW50aXR5KVxuICogLSBbcHJvcGVydHldKCNwcm9wZXJ0eSlcbiAqIC0gW2NvbXBhcmVQcm9wZXJ0eV0oI2NvbXBhcmVQcm9wZXJ0eSlcbiAqIC0gW25vb3BdKCNub29wKVxuICovXG52YXIgdXRpbE1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICB0aW1lczogdGltZXMsXG4gICAgcmVwZWF0OiByZXBlYXQsXG4gICAgdGFwOiB0YXAsXG4gICAgcmVzdWx0OiByZXN1bHQsXG4gICAgaWRlbnRpdHk6IGlkZW50aXR5LFxuICAgIHByb3BlcnR5OiBwcm9wZXJ0eSxcbiAgICBjb21wYXJlUHJvcGVydHk6IGNvbXBhcmVQcm9wZXJ0eSxcbiAgICBub29wOiBub29wXG59O1xuXG5cbi8qKlxuICogQ2FsbHMgYGNhbGxiYWNrYCBgc2VsZmAgdGltZXMgd2l0aCBgdGhpc0FyZ2AgYXMgY29udGV4dC4gQ2FsbGJhY2sgaXMgcGFzc2VkIGl0ZXJhdGlvbiBpbmRleCBmcm9tIDAgdG8gYHNlbGYtMWBcbiAqIFxuICogQHBhcmFtIHtJbnRlZ2VyfSBzZWxmXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHBhcmFtIHtBbnl9IHRoaXNBcmdcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiB0aW1lcyhjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHZhciBhcnIgPSBBcnJheShNYXRoLm1heCgwLCB0aGlzKSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzOyBpKyspXG4gICAgICAgIGFycltpXSA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgaSk7XG4gICAgcmV0dXJuIGFycjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgd2l0aCB0aGUgZmlyc3QgYXJndW1lbnQgcmVwZWF0ZWQgYHRpbWVzYCB0aW1lc1xuICogQHBhcmFtICB7QW55fSBzZWxmXG4gKiBAcGFyYW0gIHtJbnRlZ2VyfSB0aW1lc1xuICogQHJldHVybiB7QXJyYXlbQW55XX1cbiAqL1xuZnVuY3Rpb24gcmVwZWF0KHRpbWVzKSB7XG4gICAgdmFyIGFyciA9IEFycmF5KE1hdGgubWF4KDAsIHRpbWVzKSk7O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGltZXM7IGkrKylcbiAgICAgICAgYXJyW2ldID0gdGhpcztcbiAgICByZXR1cm4gYXJyO1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gdG8gdGFwIGludG8gY2hhaW5lZCBtZXRob2RzIGFuZCB0byBpbnNwZWN0IGludGVybWVkaWFyeSByZXN1bHRcbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiB2YWx1ZSB0aGF0J3MgcGFzc2VkIGJldHdlZW4gY2hhaW5lZCBtZXRob2RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdmFsdWUgKGJvdGggYXMgY29udGV4dCBhbmQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlcilcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gdGFwKGZ1bmMpIHtcbiAgICBmdW5jLmNhbGwodGhpcywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKlxuICogQ2FsbHMgZnVuY3Rpb24gYHNlbGZgIChmaXJzdCBwYXJhbWV0ZXIgb2YgXy5yZXN1bHQpIHdpdGggZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb258QW55fSBzZWxmXG4gKiBAcGFyYW0ge0FueX0gdGhpc0FyZyBjb250ZXh0XG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBleHRyYSBhcmd1bWVudHNcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gcmVzdWx0KHRoaXNBcmcpIHsgLy8sIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB0aGlzLmFwcGx5KHRoaXNBcmcsIGFyZ3MpXG4gICAgICAgICAgICA6IHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHNlbGYuIFVzZWZ1bCBmb3IgdXNpbmcgYXMgYW4gaXRlcmF0b3IgaWYgdGhlIGFjdHVhbCB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZC4gVW5saWtlIGluIHVuZGVyc2NvcmUgYW5kIGxvZGFzaCwgdGhpcyBmdW5jdGlvbiBpcyBOT1QgdXNlZCBhcyBkZWZhdWx0IGl0ZXJhdG9yLlxuICpcbiAqIEBwYXJhbSB7QW55fSBzZWxmIFxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCBwaWNrcyB0aGUgcHJvcGVydHkgZnJvbSB0aGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGZcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eSgpIHtcbiAgICB2YXIga2V5ID0gdGhpcztcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmpba2V5XTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGFycmF5IHNvcnQgdG8gc29ydCBieSBhIGdpdmVuIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGZcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjb21wYXJlUHJvcGVydHkoKSB7XG4gICAgdmFyIGtleSA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGFba2V5XSA8IGJba2V5XVxuICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgOiBhW2tleV0gPiBiW2tleV1cbiAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICA6IDA7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYWtlUHJvdG9JbnN0YW5jZU1ldGhvZDogbWFrZVByb3RvSW5zdGFuY2VNZXRob2QsXG4gICAgbWFrZVByb3RvRnVuY3Rpb246IG1ha2VQcm90b0Z1bmN0aW9uLFxuICAgIG1ha2VGaW5kTWV0aG9kOiBtYWtlRmluZE1ldGhvZFxufVxuXG5cbmZ1bmN0aW9uIG1ha2VQcm90b0luc3RhbmNlTWV0aG9kKG1ldGhvZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZWxmID0gbWV0aG9kLmFwcGx5KHRoaXMuc2VsZiwgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbn1cblxuXG5mdW5jdGlvbiBtYWtlUHJvdG9GdW5jdGlvbihtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIHdoZW4gdGhlIG1ldGhvZCBpcyBleGVjdXRlZCwgdGhlIHZhbHVlIG9mIFwidGhpc1wiIHdpbGwgYmUgYXJndW1lbnRzWzBdLFxuICAgICAgICAvLyBvdGhlciBhcmd1bWVudHMgc3RhcnRpbmcgZnJvbSAjMSB3aWxsIHBhc3NlZCB0byBtZXRob2QgYXMgcGFyYW1ldGVycy5cbiAgICAgICAgcmV0dXJuIG1ldGhvZC5jYWxsLmFwcGx5KG1ldGhvZCwgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG5cbnZhciBfZXJyb3IgPSBuZXcgRXJyb3I7XG5cbi8qKlxuICogUmV0dXJucyBgZmluZGAgb3IgYGZpbmRJbmRleGAgbWV0aG9kLCBkZXBlbmRpbmcgb24gcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaE1ldGhvZCAtIG1ldGhvZCB0byB1c2UgZm9yIGl0ZXJhdGlvbiAoZm9yRWFjaCBmb3IgYXJyYXkgb3IgZWFjaEtleSBmb3Igb2JqZWN0KVxuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRXaGF0ICd2YWx1ZScgLSByZXR1cm5zIGZpbmQgbWV0aG9kIG9mIEFycmF5IChpbXBsZW1lbnRlZCBpbiBFUzYpIG9yIGZpbmRWYWx1ZSBtZXRob2Qgb2YgT2JqZWN0LCBhbnl0aGluZyBlbHNlID0gcmV0dXJucyBmaW5kSW5kZXgvZmluZEtleSBtZXRob2RzLlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG1ha2VGaW5kTWV0aG9kKGVhY2hNZXRob2QsIGZpbmRXaGF0KSB7XG4gICAgdmFyIGFyZ0luZGV4ID0gZmluZFdoYXQgPT0gJ3ZhbHVlJyA/IDAgOiAxO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGZpbmRWYWx1ZU9ySW5kZXgoY2FsbGJhY2ssIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgICAgIHZhciBjYXVnaHRFcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVhY2hNZXRob2QuY2FsbCh0aGlzLCB0ZXN0SXRlbSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpO1xuICAgICAgICB9IGNhdGNoIChmb3VuZCkge1xuICAgICAgICAgICAgaWYgKGZvdW5kID09PSBfZXJyb3IpIHRocm93IGNhdWdodEVycm9yO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgbG9va2luZyBmb3IgaW5kZXggYW5kIG5vdCBmb3VuZCwgcmV0dXJuIC0xXG4gICAgICAgIGlmIChhcmdJbmRleCAmJiBlYWNoTWV0aG9kID09IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKVxuICAgICAgICAgICAgcmV0dXJuIC0xOyBcblxuICAgICAgICBmdW5jdGlvbiB0ZXN0SXRlbSh2YWx1ZSwgaW5kZXgsIHNlbGYpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0ZXN0ID0gY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwgaW5kZXgsIHNlbGYpO1xuICAgICAgICAgICAgfSBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYXVnaHRFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICB0aHJvdyBfZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGVzdClcbiAgICAgICAgICAgICAgICB0aHJvdyBhcmd1bWVudHNbYXJnSW5kZXhdO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19 ; \ No newline at end of file diff --git a/milo.bundle.map b/milo.bundle.map index d2ec26a..e20416f 100644 --- a/milo.bundle.map +++ b/milo.bundle.map @@ -175,7 +175,7 @@ "'use strict';\n\n\nvar _ = require('milo-core').proto;\n\n\n/**\n * Returns data access methods and events for given DOM element.\n * Used by [Data](../c_facets/Data.js.html) facet and by [DataMsgAPI](./data.js.html)\n *\n * @param {Element} el\n * @return {Object}\n */\nvar getElementDataAccess = function(el) {\n var tagName = el.tagName.toLowerCase()\n , elData = domElementsDataAccess[tagName];\n return elData || domElementsDataAccess.byDefault;\n}\n\nmodule.exports = getElementDataAccess;\n\n\n/**\n * Data access methods and events for DOM elements.\n */\nvar domElementsDataAccess = {\n byDefault: {\n property: 'innerHTML',\n },\n 'div': {\n property: 'innerHTML', // hack, should be innerHTML? to make work with Editable facet\n // event: 'input'\n },\n 'span': {\n property: 'innerHTML',\n event: 'input'\n },\n 'p': {\n property: 'innerHTML',\n event: 'input'\n },\n 'input': {\n property: inputDataProperty,\n event: inputChangeEvent\n },\n 'textarea': {\n property: 'value',\n event: 'input'\n },\n 'select': {\n property: 'value',\n event: 'change'\n },\n 'img': {\n property: 'src'\n },\n 'caption': {\n property: 'innerHTML',\n event: 'input'\n },\n 'thead': {\n property: 'innerHTML',\n event: 'input'\n },\n 'tbody': {\n property: 'innerHTML',\n event: 'input'\n },\n 'tfoot': {\n property: 'innerHTML',\n event: 'input'\n }\n};\n\n\n// convert strings to functions and create getset methods\n_.eachKey(domElementsDataAccess, function(tagInfo) {\n var property = tagInfo.property\n , event = tagInfo.event;\n if (typeof property != 'function')\n tagInfo.property = function() { return property; };\n var propFunc = tagInfo.property;\n if (typeof event != 'function')\n tagInfo.event = function() { return event; };\n if (! tagInfo.get)\n tagInfo.get = function(el) { return el[propFunc(el)]; }\n if (! tagInfo.set)\n tagInfo.set = function(el, value) {\n return (el[propFunc(el)] = typeof value == 'undefined' ? '' : value);\n }\n});\n\n\n/**\n * Types of input elements\n */\nvar inputElementTypes = {\n byDefault: {\n property: 'value',\n event: 'input'\n },\n 'checkbox': {\n property: 'checked',\n event: 'change'\n },\n 'radio': {\n property: 'checked',\n event: 'change'\n },\n 'text': {\n property: 'value',\n event: 'input'\n }\n}\n\n\n/**\n * Return property of input element to get/set its data\n *\n * @param {Element} el\n * @return {String}\n */\nfunction inputDataProperty(el) {\n var inputType = inputElementTypes[el.type];\n return inputType\n ? inputType.property\n : inputElementTypes.byDefault.property;\n}\n\n\n/**\n * Returns DOM event type to listen to to react to input element change\n *\n * @param {Element} el\n * @return {String}\n */\nfunction inputChangeEvent(el) {\n var inputType = inputElementTypes[el.type];\n return inputType\n ? inputType.event\n : inputElementTypes.byDefault.event;\n}\n", "'use strict';\n\n\nvar MessengerAPI = require('milo-core').classes.MessengerAPI;\n\n\nvar DropMsgAPI = _.createSubclass(MessengerAPI, 'DropMsgAPI', true);\n\n\n_.extendProto(DropMsgAPI, {\n // implementing MessageSource interface\n translateToSourceMessage: translateToSourceMessage,\n filterSourceMessage: filterSourceMessage,\n});\n\n\nmodule.exports = DropMsgAPI;\n\n\nvar dropEventsMap = {\n 'dragin': 'dragenter',\n 'dragout': 'dragleave'\n};\n\n\nfunction translateToSourceMessage(message) {\n return dropEventsMap.hasOwnProperty(message)\n ? dropEventsMap[message]\n : message;\n}\n\nfunction resetFilterVars() {\n delete this._currentTarget;\n delete this._inside;\n}\n\nfunction filterSourceMessage(sourceMessage, message, data) { // data is DOM event object\n var ok = true;\n\n if (sourceMessage == 'dragenter' && message == 'dragin') {\n this._currentTarget = data.target;\n ok = !this._inside;\n this._inside = true;\n } else if (sourceMessage == 'dragleave' && message == 'dragout') {\n ok = this._currentTarget == data.target;\n if (ok) resetFilterVars.call(this);\n } else if (sourceMessage == 'drop') resetFilterVars.call(this);\n\n return ok;\n}\n", "'use strict';\n\n\nvar DOMEmitterSource = require('../../services/dom_source')\n , miloCore = require('milo-core')\n , MessageSource = miloCore.classes.MessageSource\n , Component = require('../c_class')\n , _ = miloCore.proto\n , check = miloCore.util.check\n , Match = check.Match;\n\nvar DOMEventsSource = _.createSubclass(DOMEmitterSource, 'DOMEventsSource', true);\n\n\n_.extendProto(DOMEventsSource, {\n init: init,\n destroy: DOMEventsSource$destroy,\n emitter: emitter\n});\n\nmodule.exports = DOMEventsSource;\n\n\nvar useCapturePattern = /__capture$/\n , useCapturePostfix = '__capture';\n\n\n// init DOM event source\nfunction init(hostObject, proxyMethods, messengerAPIOrClass, component) {\n check(component, Component);\n this.component = component;\n MessageSource.prototype.init.apply(this, arguments);\n}\n\n\nfunction DOMEventsSource$destroy() {\n MessageSource.prototype.destroy.apply(this, arguments);\n delete this.component;\n}\n\n\n// get DOM element of component\nfunction emitter() {\n return this.component.el;\n}\n", - "'use strict';\n\n// ###component iframe source\n\nvar Component = require('../c_class')\n , miloCore = require('milo-core')\n , MessageSource = miloCore.MessageSource\n , _ = miloCore.proto\n , check = miloCore.util.check\n , logger = miloCore.util.logger\n , Match = check.Match;\n\nvar FrameMessageSource = _.createSubclass(MessageSource, 'FrameMessageSource', true);\n\n\n_.extendProto(FrameMessageSource, {\n // implementing MessageSource interface\n init: init,\n addSourceSubscriber: addSourceSubscriber,\n removeSourceSubscriber: removeSourceSubscriber,\n trigger: trigger,\n\n //class specific methods\n frameWindow: frameWindow,\n handleEvent: handleEvent // event dispatcher - as defined by Event DOM API\n});\n\nmodule.exports = FrameMessageSource;\n\n\nfunction init(hostObject, proxyMethods, messengerAPIOrClass, component) {\n check(component, Component);\n this.component = component;\n\n if (component.el.tagName.toLowerCase() != 'iframe')\n throw new Error('component for FrameMessageSource can only be attached to iframe element');\n\n MessageSource.prototype.init.apply(this, arguments);\n}\n\n\nfunction frameWindow() {\n return this.component.el.contentWindow;\n}\n\n\n// addIFrameMessageListener\nfunction addSourceSubscriber(sourceMessage) {\n var win = this.frameWindow();\n if (win) win.addEventListener('message', this, false);\n else logger.warn('FrameMessageSource: frame window is undefined');\n}\n\n\n// removeIFrameMessageListener\nfunction removeSourceSubscriber(sourceMessage) {\n var win = this.frameWindow();\n if (win) win.removeEventListener('message', this, false);\n else logger.warn('FrameMessageSource: frame window is undefined');\n}\n\n\nfunction trigger(msgType, data) {\n data = data || {};\n data.type = msgType;\n\n this.frameWindow().postMessage(data, '*');\n}\n\n\n// TODO maybe refactor to FrameMsgAPI?\nfunction handleEvent(event) {\n this.dispatchMessage(event.data.type, event);\n}\n", + "'use strict';\n\n// ###component iframe source\n\nvar Component = require('../c_class')\n , miloCore = require('milo-core')\n , MessageSource = miloCore.classes.MessageSource\n , _ = miloCore.proto\n , check = miloCore.util.check\n , logger = miloCore.util.logger\n , Match = check.Match;\n\nvar FrameMessageSource = _.createSubclass(MessageSource, 'FrameMessageSource', true);\n\n\n_.extendProto(FrameMessageSource, {\n // implementing MessageSource interface\n init: init,\n addSourceSubscriber: addSourceSubscriber,\n removeSourceSubscriber: removeSourceSubscriber,\n trigger: trigger,\n\n //class specific methods\n frameWindow: frameWindow,\n handleEvent: handleEvent // event dispatcher - as defined by Event DOM API\n});\n\nmodule.exports = FrameMessageSource;\n\n\nfunction init(hostObject, proxyMethods, messengerAPIOrClass, component) {\n check(component, Component);\n this.component = component;\n\n if (component.el.tagName.toLowerCase() != 'iframe')\n throw new Error('component for FrameMessageSource can only be attached to iframe element');\n\n MessageSource.prototype.init.apply(this, arguments);\n}\n\n\nfunction frameWindow() {\n return this.component.el.contentWindow;\n}\n\n\n// addIFrameMessageListener\nfunction addSourceSubscriber(sourceMessage) {\n var win = this.frameWindow();\n if (win) win.addEventListener('message', this, false);\n else logger.warn('FrameMessageSource: frame window is undefined');\n}\n\n\n// removeIFrameMessageListener\nfunction removeSourceSubscriber(sourceMessage) {\n var win = this.frameWindow();\n if (win) win.removeEventListener('message', this, false);\n else logger.warn('FrameMessageSource: frame window is undefined');\n}\n\n\nfunction trigger(msgType, data) {\n data = data || {};\n data.type = msgType;\n\n this.frameWindow().postMessage(data, '*');\n}\n\n\n// TODO maybe refactor to FrameMsgAPI?\nfunction handleEvent(event) {\n this.dispatchMessage(event.data.type, event);\n}\n", "'use strict';\n\nvar miloCore = require('milo-core')\n , _ = miloCore.proto\n , componentName = require('../util/component_name')\n , check = miloCore.util.check\n , Match = check.Match\n , logger = miloCore.util.logger;\n\n\n/**\n * Scope class.\n * @param {Element} rootEl the root element of this scope\n * @param {Object} hostObject the host \n * @return {Scope}\n */\nfunction Scope(rootEl, hostObject) {\n _.defineProperties(this, {\n _rootEl: rootEl,\n _hostObject: hostObject\n }, _.WRIT); // writable\n};\n\n_.extendProto(Scope, {\n _add: Scope$_add,\n _safeAdd: Scope$_safeAdd,\n _copy: Scope$_copy,\n _each: Scope$_each,\n _move: Scope$_move,\n _merge: Scope$_merge,\n _length: Scope$_length,\n _any: Scope$_any,\n _remove: Scope$_remove,\n _clean: Scope$_clean,\n _detachElement: Scope$_detachElement,\n _has: Scope$_has,\n _filter: Scope$_filter\n});\n\n\n_.extend(Scope, {\n rename: Scope$$rename\n});\n\n\nmodule.exports = Scope;\n\n\nvar allowedNamePattern = /^[A-Za-z][A-Za-z0-9\\_\\$]*$/;\n\n\n/**\n * Scope instance method.\n * Adds object to the scope, throwing if name is not unique\n * @param {Component|ComponentInfo} object component or component info to add to the scope\n * @param {String} name the name of the component to add\n */\nfunction Scope$_add(object, name) {\n if (typeof name == 'string')\n object.name = name;\n else\n name = object.name;\n \n if (this.hasOwnProperty(name))\n throw new Error('duplicate object name: ' + name);\n\n checkName(name);\n __add.call(this, object, name);\n}\n\n\n/**\n * Scope instance method\n * Adds object to scope renaming it if name is not unique\n * @param {Component|ComponentInfo} object component or component info to add to the scope\n * @param {String} name the name of the component to add\n */\nfunction Scope$_safeAdd(object, name) {\n if (typeof name == 'string')\n object.name = name;\n else\n name = object.name;\n\n var shouldRename = this.hasOwnProperty(name);\n if (shouldRename)\n logger.error('Scope: duplicate object name: ' + name);\n else {\n shouldRename = ! allowedNamePattern.test(name);\n if (shouldRename)\n logger.error('Scope: name should start from letter, this name is not allowed: ' + name);\n }\n\n if (shouldRename) {\n name = componentName();\n object.name = name;\n }\n\n __add.call(this, object, name);\n}\n\n\nfunction __add(object, name) {\n this[name] = object;\n object.scope = this;\n\n if (typeof object.postMessage === 'function')\n object.postMessage('addedtoscope'); \n}\n\n\n/**\n * Instance method.\n * copies all objects from one scope to another,\n * throwing if some object is not unique\n * @param {Scope} aScope the scope to copy\n */\nfunction Scope$_copy(aScope) {\n check(aScope, Scope);\n\n aScope._each(Scope$_add, this);\n}\n\n\n/**\n * Instance method.\n * Moves a component from this scope to another scope.\n * @param {Component} component the component to be moved\n * @param {Scope} otherScope the scope to copy the component to\n */\nfunction Scope$_move(component, otherScope) {\n otherScope._add(component);\n this._remove(component.name);\n component.scope = otherScope;\n}\n\n\n/**\n * Instance method.\n * Merges one scope into this scope\n * @param {Scope} scope the scope to absorb\n */\nfunction Scope$_merge(scope) {\n scope._each(function (comp) {\n this._add(comp, comp.name);\n scope._remove(comp.name);\n }, this);\n}\n\n\n/**\n * Instance method.\n * Enumerates each component in the scope\n * @param {Function} callback the function to execute for each component\n * @param {Object} thisArg the context\n */\nfunction Scope$_each(callback, thisArg) {\n _.eachKey(this, callback, thisArg || this, true); // enumerates enumerable properties only\n}\n\n\n/**\n * Instance method.\n * Returns a filtered list of components based on a callback\n * @param {Function} callback the function to execute for each component\n * @param {Object} thisArg the context\n * @return {Array}\n */\nfunction Scope$_filter(callback, thisArg) {\n return _.filterKeys(this, callback, thisArg || this, true);\n}\n\n\n/**\n * Checks the validity of a name.\n * @param {Function} callback the function to execute for each component\n */\nfunction checkName(name) {\n if (! allowedNamePattern.test(name))\n throw new Error('name should start from letter, this name is not allowed: ' + name);\n}\n\n\n/**\n * Instance method.\n * Returns the number of objects in the scope\n * @return {Number}\n */\nfunction Scope$_length() {\n return Object.keys(this).length;\n}\n\n\n/**\n * Instance method.\n * Returns a component from the scope. It may look like it returns the first component\n * but in reality given that scopes are hashes, there is no such thing.\n * @return {Component}\n */\nfunction Scope$_any() {\n var key = Object.keys(this)[0];\n return key && this[key];\n}\n\n\n/**\n * Instance method.\n * Removes a component from the scope by it's name.\n * @param {String} name the name of the component to remove\n * @param {Boolean} quiet optional true to suppress the warning message if the component is not in scope\n */\nfunction Scope$_remove(name, quiet) {\n if (! (name in this)) {\n if (!quiet) logger.warn('removing object that is not in scope');\n return;\n }\n\n var object = this[name];\n\n delete this[name];\n\n if (typeof object.postMessage === 'function')\n object.postMessage('removedfromscope');\n}\n\n\n/**\n * Instance method.\n * Removes all components from the scope.\n */\nfunction Scope$_clean() {\n this._each(function(object, name) {\n delete this[name].scope;\n delete this[name];\n }, this);\n}\n\nfunction Scope$_detachElement() {\n this._rootEl = null;\n}\n\n\n/**\n * Checks if scope has object by object name\n * @param {Object} object\n * @return {Boolean}\n */\nfunction Scope$_has(object) {\n return this.hasOwnProperty(object.name);\n}\n\n\n/**\n * Change object name, renaming it in scope unless renameInScope is false\n * @param {Object} obj\n * @param {String} name new name\n * @param {Boolean} renameInScope true by default\n */\nfunction Scope$$rename(obj, name, renameInScope) {\n if (obj.scope && renameInScope !== false) {\n obj.scope._remove(obj.name);\n obj.scope._add(obj, name);\n } else\n obj.name = name;\n}\n", "'use strict';\n\nvar Component = require('../c_class')\n , componentsRegistry = require('../c_registry')\n , _ = require('milo-core').proto;\n\n\nvar MLButton = Component.createComponentClass('MLButton', {\n events: undefined,\n dom: {\n cls: 'ml-ui-button'\n }\n});\n\ncomponentsRegistry.add(MLButton);\n\nmodule.exports = MLButton;\n\n_.extendProto(MLButton, {\n disable: MLButton$disable,\n isDisabled: MLButton$isDisabled\n});\n\n\nfunction MLButton$disable(disable) {\n this.el.disabled = disable;\n}\n\nfunction MLButton$isDisabled() {\n return !!this.el.disabled;\n}\n\n", "'use strict';\n\nvar Component = require('../c_class')\n , componentsRegistry = require('../c_registry')\n , _ = require('milo-core').proto;\n\n\nvar COMBO_CHANGE_MESSAGE = 'mlcombochange';\n\nvar DATALIST_TEMPLATE = '{{~ it.comboOptions :option }} \\\n \\\n {{~}}';\n\nvar MLCombo = Component.createComponentClass('MLCombo', {\n events: undefined,\n data: {\n get: MLCombo_get,\n set: MLCombo_set,\n del: MLCombo_del,\n splice: undefined,\n event: COMBO_CHANGE_MESSAGE\n },\n model: {\n messages: {\n '***': { subscriber: onOptionsChange, context: 'owner' }\n }\n },\n dom: {\n cls: 'ml-ui-datalist'\n },\n container: undefined\n});\n\ncomponentsRegistry.add(MLCombo);\n\nmodule.exports = MLCombo;\n\n\n_.extendProto(MLCombo, {\n init: MLCombo$init\n});\n\n\nfunction MLCombo$init() {\n Component.prototype.init.apply(this, arguments);\n this.on('childrenbound', onChildrenBound);\n}\n\nfunction onChildrenBound() {\n _.defineProperties(this, {\n '_comboInput': this.container.scope.input,\n '_comboList': this.container.scope.datalist\n });\n\n this._comboList.template.set(DATALIST_TEMPLATE);\n\n this._comboInput.data.on('input',\n { subscriber: dispatchChangeMessage, context: this });\n}\n\nfunction MLCombo_get() {\n if (! this._comboInput) return;\n return this._comboInput.data.get();\n}\n\nfunction MLCombo_set(value) {\n return changeComboData.call(this, 'set', value);\n}\n\nfunction MLCombo_del() {\n return changeComboData.call(this, 'del', value);\n}\n\nfunction changeComboData(method, value) {\n if (! this._comboInput) return;\n var result = this._comboInput.data[method](value);\n dispatchChangeMessage.call(this);\n return result;\n}\n\n\n// Post the data change\nfunction dispatchChangeMessage() {\n this.data.dispatchSourceMessage(COMBO_CHANGE_MESSAGE);\n}\n\nfunction onOptionsChange(msg, data) {\n this._comboList.template.render({\n comboOptions: this.model.get()\n });\n}\n", diff --git a/package.json b/package.json index ea2adcb..a5ef977 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mol-milo", - "version": "0.1.10", + "version": "0.2.0", "description": "Browser/nodejs reactive programming and data driven DOM manipulation with modular components.", "main": "lib/milo.js", "scripts": { @@ -17,7 +17,7 @@ }, "dependencies": { "base32": "git://github.com/milojs/base32-js.git", - "milo-core": "^0.1.13" + "milo-core": "^0.1.14" }, "devDependencies": { "async": "~0.2.9",