survey-pdf 1.12.21 → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/survey.pdf.d.ts +1 -1
- package/survey.pdf.fonts.js +2 -2
- package/survey.pdf.fonts.min.js +1 -1
- package/survey.pdf.js +4 -4
- package/survey.pdf.min.js +2 -2
package/survey.pdf.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* surveyjs - SurveyJS PDF library
|
|
2
|
+
* surveyjs - SurveyJS PDF library v2.0.0-rc.1
|
|
3
3
|
* Copyright (c) 2015-2025 Devsoft Baltic OÜ - http://surveyjs.io/
|
|
4
4
|
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
5
5
|
*/
|
|
@@ -2607,7 +2607,7 @@ var FlatSurvey = /** @class */ (function () {
|
|
|
2607
2607
|
switch (_a.label) {
|
|
2608
2608
|
case 0:
|
|
2609
2609
|
logoUrl = __WEBPACK_IMPORTED_MODULE_4__helper_survey__["a" /* SurveyHelper */].getLocString(survey.locLogo);
|
|
2610
|
-
return [4 /*yield*/, __WEBPACK_IMPORTED_MODULE_4__helper_survey__["a" /* SurveyHelper */].getCorrectedImageSize(controller, { imageLink: logoUrl, imageHeight: survey.logoHeight, imageWidth: survey.logoWidth })];
|
|
2610
|
+
return [4 /*yield*/, __WEBPACK_IMPORTED_MODULE_4__helper_survey__["a" /* SurveyHelper */].getCorrectedImageSize(controller, { imageLink: logoUrl, imageHeight: survey.logoHeight, imageWidth: survey.logoWidth, defaultImageWidth: '300px', defaultImageHeight: '200px' })];
|
|
2611
2611
|
case 1:
|
|
2612
2612
|
logoSize = _a.sent();
|
|
2613
2613
|
return [4 /*yield*/, __WEBPACK_IMPORTED_MODULE_4__helper_survey__["a" /* SurveyHelper */].createImageFlat(point, null, controller, { link: logoUrl,
|
|
@@ -3095,7 +3095,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
|
|
|
3095
3095
|
|
|
3096
3096
|
|
|
3097
3097
|
|
|
3098
|
-
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_51_survey_core__["checkLibraryVersion"])("".concat("
|
|
3098
|
+
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_51_survey_core__["checkLibraryVersion"])("".concat("2.0.0-rc.1"), 'survey-pdf');
|
|
3099
3099
|
|
|
3100
3100
|
|
|
3101
3101
|
/***/ }),
|
|
@@ -12193,4 +12193,4 @@ var jspdf = __webpack_require__(18);
|
|
|
12193
12193
|
/***/ })
|
|
12194
12194
|
/******/ ]);
|
|
12195
12195
|
});
|
|
12196
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA4ODdkZjBjODA0OTU2Y2E3MDM2MiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcGRmLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFB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SUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFLENBQUMsQ0FBQztRQUNuRyxTQUFTLElBQUksQ0FBQyxNQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBUztJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQU8sRUFBRSxFQUFFLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTSxDQUFDO0lBQy9JLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnQ0FBZ0M7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix5QkFBeUI7QUFDeEQ7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7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O0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7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LFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EseUpBQXlKO0FBQ3pKO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHlGQUF5RjtBQUN6RjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLDZSQUE2UjtBQUM3UjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxxRzs7Ozs7OztBQzUyRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNB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QUFPO0FBQ3hCLHdCQUF3QixPQUFPO0FBQy9CLGlCQUFpQixPQUFPO0FBQ3hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHIiwiZmlsZSI6Ii4vcGFja2FnZXMvc3VydmV5LXBkZi9zdXJ2ZXkucGRmLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleVBERlwiLCBbXCJzdXJ2ZXktY29yZVwiLCBcImpzcGRmXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVBERlwiXSA9IGZhY3RvcnkocmVxdWlyZShcInN1cnZleS1jb3JlXCIpLCByZXF1aXJlKFwianNwZGZcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleVBERlwiXSA9IGZhY3Rvcnkocm9vdFtcIlN1cnZleVwiXSwgcm9vdFtcImpzcGRmXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNl9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzE4X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDg4N2RmMGM4MDQ5NTZjYTcwMzYyIiwiZGVjbGFyZSB2YXIgUmVmbGVjdDogYW55O1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQ6IGFueSwgYjogYW55KTogYW55IHtcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQ6IGFueSwgYjogYW55KSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSAnZnVuY3Rpb24nICYmIGIgIT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NsYXNzIGV4dGVuZHMgdmFsdWUgJyArIFN0cmluZyhiKSArICcgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCcpO1xuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgICBfX2Fzc2lnbiA9ICg8YW55Pk9iamVjdCkuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQ6IGFueSkge1xuICAgICAgICBmb3IgKHZhciBzOiBhbnksIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QoczogYW55LCBlOiBhbnkpIHtcbiAgICB2YXIgdDogYW55ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBxID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocVtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBxW2ldKSlcbiAgICAgICAgICAgICAgICB0W3FbaV1dID0gc1txW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzOiBhbnksIHRhcmdldDogYW55LCBrZXk6IGFueSwgZGVzYzogYW55KSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAnZnVuY3Rpb24nKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmc6IGFueSwgX2FyZ3VtZW50czogYW55LCBQOiBhbnksIGdlbmVyYXRvcjogYW55KSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWU6IGFueSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZTogYW55KSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlOiBhbnkpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlOiBhbnkpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbJ3Rocm93J10odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdDogYW55KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmc6IGFueSwgYm9keTogYW55KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogPGFueT5bXSwgb3BzOiA8YW55PltdIH0sIGY6IGFueSwgeTogYW55LCB0OiBhbnksIGc6IGFueTtcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgJ3Rocm93JzogdmVyYigxKSwgJ3JldHVybic6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG46IGFueSkgeyByZXR1cm4gZnVuY3Rpb24gKHY6IGFueSkgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcDogYW55KSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuJyk7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsncmV0dXJuJ10gOiBvcFswXSA/IHlbJ3Rocm93J10gfHwgKCh0ID0geVsncmV0dXJuJ10pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyAoPGFueT5fKSA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkgKHRvOiBhbnksIGZyb206IGFueSwgcGFjazogYW55KSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI6IGFueTsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2hlbHBlcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsLCBRdWVzdGlvbkZpbGVNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uU2VsZWN0QmFzZSwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBzZXR0aW5ncyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuL2VudHJpZXMvcGRmJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbic7XG5pbXBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuaW1wb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmltcG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5pbXBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuXG5leHBvcnQgdHlwZSBJQm9yZGVyRGVzY3JpcHRpb24gPSBJUmVjdCAmIElTaXplICYgUGljazxQZGZCcmljaywgJ2Zvcm1Cb3JkZXJDb2xvcic+ICYgeyByb3VuZGVkPzogYm9vbGVhbiwgZGFzaFN0eWxlPzogeyBkYXNoQXJyYXk6IFtudW1iZXIsIG51bWJlcl0gfCBbbnVtYmVyXSwgZGFzaFBoYXNlOiBudW1iZXIgfSwgb3V0c2lkZT86IGJvb2xlYW4gfTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUhlbHBlciB7XG4gICAgcHVibGljIHN0YXRpYyBFUFNJTE9OOiBudW1iZXIgPSAyLjIyMDQ0NjA0OTI1MDMxMzA4MDg0NzI2MzMzNjE4MTZlLTE1O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS43O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAyLjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBPVEhFUl9ST1dTX0NPVU5UOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9XSURUSDogbnVtYmVyID0gMztcbiAgICBwdWJsaWMgc3RhdGljIFJBVElOR19NSU5fSEVJR0hUOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIE1BVFJJWF9DT0xVTU5fV0lEVEg6IG51bWJlciA9IDU7XG4gICAgcHVibGljIHN0YXRpYyBJTUFHRVBJQ0tFUl9DT1VOVDogbnVtYmVyID0gNDtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX1JBVElPOiBudW1iZXIgPSA0LjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBNVUxUSVBMRVRFWFRfVEVYVF9QRVJTOiBudW1iZXIgPSBNYXRoLkUgLyAxMC4wO1xuICAgIHB1YmxpYyBzdGF0aWMgSFRNTF9UQUlMX1RFWFRfU0NBTEU6IG51bWJlciA9IDAuMjQ7XG4gICAgcHVibGljIHN0YXRpYyBTRUxFQ1RfSVRFTV9GTEFUX1NDQUxFOiBudW1iZXIgPSAwLjk1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0NPTFVNTlM6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0lURU1fVEVYVDogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX1ZJU0lCTEU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjE7XG4gICAgcHVibGljIHN0YXRpYyBWSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC44O1xuICAgIHB1YmxpYyBzdGF0aWMgVU5WSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC4yO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFESVVTX1NDQUxFOiBudW1iZXIgPSAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9GT05UX1NDQUxFOiBudW1iZXIgPSAxLjE7XG4gICAgcHVibGljIHN0YXRpYyBWQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFOiBudW1iZXIgPSAwLjM7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RPX0lNQUdFX1FVQUxJVFk6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX0NPTE9SOiBzdHJpbmcgPSAnIzlmOWY5Zic7XG4gICAgcHVibGljIHN0YXRpYyBURVhUX0NPTE9SOiBzdHJpbmcgPSAnIzQwNDA0MCc7XG4gICAgcHVibGljIHN0YXRpYyBCQUNLR1JPVU5EX0NPTE9SOiBzdHJpbmcgPSAnI0ZGRkZGRic7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9MT0NBVElPTl9NQVRSSVg6IHN0cmluZyA9ICdtYXRyaXgnO1xuICAgIHB1YmxpYyBzdGF0aWMgU1RBTkRBUkRfRk9OVDogc3RyaW5nID0gJ2hlbHZldGljYSc7XG4gICAgcHVibGljIHN0YXRpYyBDVVNUT01fRk9OVF9FTkNPRElORzogc3RyaW5nID0gJ0lkZW50aXR5LUgnO1xuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZVdpZHRoKHdpZHRoOiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgIGNvbHVtbnNDb3VudDogbnVtYmVyID0gMSwgZGVmYXVsdFVuaXQ/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBpZiAod2lkdGguaW5kZXhPZignY2FsYycpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF4V2lkdGggLyBjb2x1bW5zQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWU6IG51bWJlciA9IHBhcnNlRmxvYXQod2lkdGgpO1xuICAgICAgICBjb25zdCB1bml0OiBzdHJpbmcgPSB3aWR0aC5yZXBsYWNlKC9bXkEtWmEteiVdL2csICcnKSB8fCBkZWZhdWx0VW5pdDtcbiAgICAgICAgbGV0IGs6IG51bWJlcjtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgayA9IDEuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDI1LjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyLjU0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gOTYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BjJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V4JzpcbiAgICAgICAgICAgICAgICBrID0gNi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGsgPSBtYXhXaWR0aCAvIDEwMC4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIGssIG1heFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBweFRvUHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYoIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh2YWx1ZSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlICogNzIuMCAvIDk2LjA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VSZWN0cyguLi5yZWN0czogSVJlY3RbXSk6IElSZWN0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0UmVjdDogSVJlY3QgPSB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdHNbMF0ueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHJlY3RzWzBdLnhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHJlY3RzWzBdLnlUb3AsXG4gICAgICAgICAgICB5Qm90OiByZWN0c1swXS55Qm90XG4gICAgICAgIH07XG4gICAgICAgIHJlY3RzLmZvckVhY2goKHJlY3Q6IElSZWN0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRSZWN0LnhMZWZ0ID0gTWF0aC5taW4ocmVzdWx0UmVjdC54TGVmdCwgcmVjdC54TGVmdCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnhSaWdodCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueFJpZ2h0LCByZWN0LnhSaWdodCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlUb3AgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnlUb3AsIHJlY3QueVRvcCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlCb3QgPSBNYXRoLm1heChyZXN1bHRSZWN0LnlCb3QsIHJlY3QueUJvdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0UmVjdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQb2ludChyZWN0OiBJUmVjdCwgaXNMZWZ0OiBib29sZWFuID0gdHJ1ZSwgaXNUb3A6IGJvb2xlYW4gPSBmYWxzZSk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogaXNMZWZ0ID8gcmVjdC54TGVmdCA6IHJlY3QueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogaXNUb3AgPyByZWN0LnlUb3AgOiByZWN0LnlCb3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSZWN0KHBvaW50OiBJUG9pbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIHdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiAwLjAsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRm9vdGVyUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IDAuMCxcbiAgICAgICAgICAgIHhSaWdodDogY29udHJvbGxlci5wYXBlcldpZHRoLFxuICAgICAgICAgICAgeVRvcDogY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLnBhcGVySGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hvb3NlSHRtbEZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwgPyBjb250cm9sbGVyLmZvbnROYW1lIDogdGhpcy5TVEFOREFSRF9GT05UO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ3NzVGV4dFJ1bGUoZm9udFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFwiZm9udC1zaXplOiAke2ZvbnRTaXplfXB0OyBmb250LXdlaWdodDogJHtmb250U3R5bGV9OyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGNvbG9yOiAke3RoaXMuVEVYVF9DT0xPUn07XCJgO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhodG1sOiBzdHJpbmcsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb250ID0gdGhpcy5jaG9vc2VIdG1sRm9udChjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiX19zdXJ2ZXlwZGZfaHRtbFwiIHN0eWxlPSR7dGhpcy5nZW5lcmF0ZUNzc1RleHRSdWxlKFxuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSwgY29udHJvbGxlci5mb250U3R5bGUsIGZvbnQpfT5gICtcbiAgICAgICAgICAgIGA8c3R5bGU+Ll9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogMDsgbGluZS1oZWlnaHQ6ICR7Y29udHJvbGxlci5mb250U2l6ZX1wdCB9IGJvZHkgeyBtYXJnaW46IDA7IH08L3N0eWxlPiR7aHRtbH08L2Rpdj5gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNwbGl0SHRtbFJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaHRtbEJyaWNrOiBJUGRmQnJpY2spOiBJUGRmQnJpY2sge1xuICAgICAgICBjb25zdCBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGh0bWxIZWlnaHQ6IG51bWJlciA9IGh0bWxCcmljay5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG1pbkhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgaHRtbEJyaWNrLnlCb3QgPSBodG1sQnJpY2sueVRvcCArIG1pbkhlaWdodDtcbiAgICAgICAgY29uc3QgZW1wdHlCcmlja0NvdW50OiBudW1iZXIgPSBNYXRoLmZsb29yKGh0bWxIZWlnaHQgLyBtaW5IZWlnaHQpIC0gMTtcbiAgICAgICAgYnJpY2tzLnB1c2goaHRtbEJyaWNrKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGh0bWxCcmljayk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBlbXB0eUJyaWNrQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgYnJpY2tzLnB1c2gobmV3IEVtcHR5QnJpY2sodGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgaHRtbEJyaWNrLndpZHRoLCBtaW5IZWlnaHQpKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBtaW5IZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nSGVpZ2h0OiBudW1iZXIgPSBodG1sSGVpZ2h0IC0gKGVtcHR5QnJpY2tDb3VudCArIDEpICogbWluSGVpZ2h0O1xuICAgICAgICBpZiAocmVtYWluaW5nSGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgYnJpY2tzLnB1c2gobmV3IEVtcHR5QnJpY2sodGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgaHRtbEJyaWNrLndpZHRoLCByZW1haW5pbmdIZWlnaHQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayguLi5icmlja3MpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBsYWluVGV4dEZsYXQ8VCBleHRlbmRzIElQZGZCcmljaz4ocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBmYWJyaWM6IG5ldyAocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpID0+IFQpOiBDb21wb3NpdGVCcmljayB7XG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IGNvbnRyb2xsZXIuZG9jLnNwbGl0VGV4dFRvU2l6ZSh0ZXh0LFxuICAgICAgICAgICAgY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZTogSVNpemUgPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KGxpbmUpO1xuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKG5ldyBmYWJyaWMocXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLCBsaW5lKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBzaXplLmhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGV4dEZsYXQ8VCBleHRlbmRzIElQZGZCcmljaz4ocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgfHwgIXRoaXMuaGFzSHRtbCh0ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGxhaW5UZXh0RmxhdChwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgdGV4dCA6IHRoaXMuZ2V0TG9jU3RyaW5nKDxMb2NhbGl6YWJsZVN0cmluZz50ZXh0KSwgZmFicmljKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0SHRtbFJlY3QoY29udHJvbGxlciwgYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChwb2ludCwgPFF1ZXN0aW9uPnF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKHRoaXMuZ2V0TG9jU3RyaW5nKHRleHQpLCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGhhc0h0bWwodGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGF0dGVybjogUmVnRXhwID0gLzxcXC8/W2Etel1bXFxzXFxTXSo+L2k7XG4gICAgICAgIHJldHVybiB0ZXh0Lmhhc0h0bWwgJiYgKHBhdHRlcm4udGVzdCgoPGFueT50ZXh0KS5yZW5kZXJlZFRleHQpIHx8IHBhdHRlcm4udGVzdCh0ZXh0LnJlbmRlcmVkSHRtbCkpO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwb2ludDogSVBvaW50KTogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSB7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogY29udHJvbGxlci5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA+IGNvbnRyb2xsZXIudW5pdFdpZHRoID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRXaWR0aFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSFRNTFJlY3QocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSwgcmVzdWx0WTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVQYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCAtIGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gKGNvbnRyb2xsZXIuaGVscGVyRG9jLmdldE51bWJlck9mUGFnZXMoKSAtIDEpICpcbiAgICAgICAgICAgIChjb250cm9sbGVyLmZvbnRTaXplICogTWF0aC5mbG9vcihhdmFpbGFibGVQYWdlSGVpZ2h0IC8gY29udHJvbGxlci5mb250U2l6ZSkpXG4gICAgICAgICAgICArIHJlc3VsdFkgLSBtYXJnaW5zLnRvcCArIFN1cnZleUhlbHBlci5IVE1MX1RBSUxfVEVYVF9TQ0FMRSAqIGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUGFnZXM6IG51bWJlciA9IGNvbnRyb2xsZXIuaGVscGVyRG9jLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuYWRkUGFnZSgpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbnVtYmVyT2ZQYWdlczsgaSsrKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgbWFyZ2lucy53aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUhUTUxGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaHRtbDogc3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSA9IHRoaXMuZ2V0SHRtbE1hcmdpbnMoY29udHJvbGxlciwgcG9pbnQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8SVBkZkJyaWNrPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuZnJvbUhUTUwoaHRtbCwgcG9pbnQueExlZnQsIG1hcmdpbnMudG9wLCB7XG4gICAgICAgICAgICAgICAgcGFnZXNwbGl0OiB0cnVlLCB3aWR0aDogbWFyZ2lucy53aWR0aFxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTFJlY3QocG9pbnQsIGNvbnRyb2xsZXIsIG1hcmdpbnMsIHJlc3VsdC55KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGh0bWwpKTtcbiAgICAgICAgICAgIH0sIG1hcmdpbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUZvbnRGYWNlKGZvbnROYW1lOiBzdHJpbmcsIGZvbnRCYXNlNjQ6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgYCArXG4gICAgICAgICAgICBgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsJHtmb250QmFzZTY0fSkgZm9ybWF0KCd3b2ZmJyk7IGAgK1xuICAgICAgICAgICAgYGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9OyB9YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUZvbnRGYWNlV2l0aEl0YWxpY1N0eWxlKGZvbnROYW1lOiBzdHJpbmcsIGZvbnRCYXNlNjQ6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgYCArXG4gICAgICAgICAgICBgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsJHtmb250QmFzZTY0fSkgZm9ybWF0KCd3b2ZmJyk7IGAgK1xuICAgICAgICAgICAgYGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9OyBmb250LXN0eWxlOiBpdGFsaWN9YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBodG1sVG9YbWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaHRtbERvYzogRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpO1xuICAgICAgICBodG1sRG9jLndyaXRlKGh0bWwucmVwbGFjZSgvXFwjL2csICclMjMnKSk7XG4gICAgICAgIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgneG1sbnMnLCBodG1sRG9jLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpO1xuICAgICAgICBodG1sRG9jLmJvZHkuc3R5bGUubWFyZ2luID0gJ3Vuc2V0JztcbiAgICAgICAgcmV0dXJuIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyhodG1sRG9jLmJvZHkpLnJlcGxhY2UoLyUyMy9nLCAnIycpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z0NvbnRlbnQoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gJy5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfSBib2R5IHsgbWFyZ2luOiB1bnNldDsgfSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICBjb25zdCBkaXY6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnX19zdXJ2ZXlwZGZfaHRtbCc7XG4gICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgZGl2LnN0eWxlLnRvcCA9ICctMTAwMDBweCc7XG4gICAgICAgIGRpdi5zdHlsZS5sZWZ0ID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gKHdpZHRoIC8gNzIuMCAqIDk2LjApICsgJ3B4JztcbiAgICAgICAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmNvbG9yID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udEZhbWlseSA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmZvbnQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5saW5lSGVpZ2h0ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICBjb25zdCBkaXZXaWR0aDogbnVtYmVyID0gZGl2Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBkaXZIZWlnaHQ6IG51bWJlciA9IGRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgICAgc3R5bGUucmVtb3ZlKCk7XG4gICAgICAgIGxldCBkZWZzOiBzdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIudXNlQ3VzdG9tRm9udEluSHRtbCkge1xuICAgICAgICAgICAgZGVmcyA9IGA8ZGVmcz48c3R5bGU+JHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjROb3JtYWwsICdub3JtYWwnKX1gICtcbiAgICAgICAgICAgICAgICBgICR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGNvbnRyb2xsZXIuZm9udE5hbWUsIGNvbnRyb2xsZXIuYmFzZTY0Qm9sZCwgJ2JvbGQnKX08L3N0eWxlPjwvZGVmcz5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoRG9jQ29udHJvbGxlci5jdXN0b21Gb250cykuZm9yRWFjaChmb250TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZvbnQpLmZvckVhY2goKGZvbnRTdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgfCAnaXRhbGljJyB8ICdib2xkaXRhbGljJykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFN0eWxlID09PSAnbm9ybWFsJyB8fCBmb250U3R5bGUgPT09ICdib2xkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmcyArPSBgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWUsIGZvbnRbZm9udFN0eWxlXSwgZm9udFN0eWxlKX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmcyArPSBgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWUsIGZvbnRbZm9udFN0eWxlXSwgZm9udFN0eWxlID09PSAnaXRhbGljJyA/ICdub3JtYWwnIDogJ2JvbGQnKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVmcyA9ICc8ZGVmcz48c3R5bGU+JyArIGRlZnMgKyAnPC9zdHlsZT48L2RlZnM+JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN2Zzogc3RyaW5nID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArIGRlZnMgK1xuICAgICAgICAgICAgJzxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH08L3N0eWxlPicgK1xuICAgICAgICAgICAgYDxmb3JlaWduT2JqZWN0IHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArXG4gICAgICAgICAgICB0aGlzLmh0bWxUb1htbChodG1sKSArICc8L2ZvcmVpZ25PYmplY3Q+PC9zdmc+JztcbiAgICAgICAgcmV0dXJuIHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH07XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHNldENhbnZhcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBkaXZXaWR0aDogbnVtYmVyLCBkaXZIZWlnaHQ6IG51bWJlciwgaW1nOiBIVE1MSW1hZ2VFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGRpdldpZHRoICogU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWTtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGRpdkhlaWdodCAqIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb250ZXh0LnNjYWxlKFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFksIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SO1xuICAgICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGh0bWxUb0ltYWdlKGh0bWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8eyB1cmw6IHN0cmluZywgYXNwZWN0OiBudW1iZXIgfT4ge1xuICAgICAgICBjb25zdCB7IHN2ZywgZGl2V2lkdGgsIGRpdkhlaWdodCB9ID0gU3VydmV5SGVscGVyLmNyZWF0ZVN2Z0NvbnRlbnQoaHRtbCwgd2lkdGgsIGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCBkYXRhOiBzdHJpbmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3ZnKSkpO1xuICAgICAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luPSdhbm9ueW1vdXMnO1xuICAgICAgICBpbWcuc3JjID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q2FudmFzKGNhbnZhcywgZGl2V2lkdGgsIGRpdkhlaWdodCwgaW1nKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmw6IHN0cmluZyA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBTdXJ2ZXlIZWxwZXIuSFRNTF9UT19JTUFHRV9RVUFMSVRZKTtcbiAgICAgICAgICAgICAgICBjYW52YXMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogdXJsLCBhc3BlY3Q6IGRpdldpZHRoIC8gZGl2SGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1cmw6ICdkYXRhOiwnLCBhc3BlY3Q6IHdpZHRoIC8gdGhpcy5FUFNJTE9OIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0Qm9sZEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZUZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgKj0gdGhpcy5USVRMRV9GT05UX1NDQUxFO1xuICAgICAgICBpZiAocXVlc3Rpb24ubm8pIHtcbiAgICAgICAgICAgIGNvbnN0IG5vVGV4dDogc3RyaW5nID0gcXVlc3Rpb24ubm8gKyAnICc7XG4gICAgICAgICAgICBsZXQgbm9GbGF0OiBJUGRmQnJpY2s7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWVhc3VyZVRleHQobm9UZXh0LCAnYm9sZCcpLndpZHRoO1xuICAgICAgICAgICAgICAgIG5vRmxhdCA9IGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sobm9UZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vRmxhdCA9IGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIG5vVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IG5vRmxhdC54UmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gPENvbXBvc2l0ZUJyaWNrPmF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KFxuICAgICAgICAgICAgY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgcXVlc3Rpb24ubG9jVGl0bGUpO1xuICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sodGV4dEZsYXQpO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkVGV4dDogc3RyaW5nID0gcXVlc3Rpb24ucmVxdWlyZWRUZXh0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzSHRtbChxdWVzdGlvbi5sb2NUaXRsZSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpWzBdLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWVhc3VyZVRleHQocmVxdWlyZWRUZXh0LCAnYm9sZCcpLndpZHRoO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKHJlcXVpcmVkVGV4dCwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gdGhpcy5jcmVhdGVQb2ludCh0ZXh0RmxhdC51bmZvbGQoKS5wb3AoKSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZXF1aXJlZFRleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBmb250U2l6ZVNjYWxlOiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogZm9udFNpemVTY2FsZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChwb2ludCwgbnVsbCwgY29udHJvbGxlciwgdGV4dCwgVGl0bGVQYW5lbEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gdGl0bGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlU3VydmV5RmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50LCBjb250cm9sbGVyLCB0ZXh0LCB0aGlzLlRJVExFX1NVUlZFWV9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlUGFuZWxGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBpc1BhZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50LCBjb250cm9sbGVyLCB0ZXh0LFxuICAgICAgICAgICAgaXNQYWdlID8gdGhpcy5USVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRSA6IHRoaXMuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVEZXNjRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiB0aGlzLkRFU0NSSVBUSU9OX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBEZXNjcmlwdGlvbkJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlYWRvbmx5UmVuZGVyQXMocXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcyA9PT0gJ2F1dG8nID8gY29udHJvbGxlci5yZWFkb25seVJlbmRlckFzIDogKDxhbnk+cXVlc3Rpb24pLnJlYWRvbmx5UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlQ29tbWVudEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpc1F1ZXN0aW9uOiBib29sZWFuLCBvcHRpb25zOiB7IHJvd3M/OiBudW1iZXIsIGluZGV4PzogbnVtYmVyLCB2YWx1ZT86IHN0cmluZywgcmVhZE9ubHk/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gdGhpcy5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCBjb250cm9sbGVyLCBvcHRpb25zLnJvd3MgPz8gMSk7XG4gICAgICAgIGxldCB0ZXh0RmxhdDtcbiAgICAgICAgaWYgKG9wdGlvbnMucmVhZE9ubHkgPz8gU3VydmV5SGVscGVyLnNob3VsZFJlbmRlclJlYWRPbmx5KHF1ZXN0aW9uLCBjb250cm9sbGVyKSkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRWYWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gdGhpcy5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uLCBpc1F1ZXN0aW9uKTtcbiAgICAgICAgICAgIHRleHRGbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBxdWVzdGlvbiwgcmVuZGVyZWRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICBpZiAodGV4dEZsYXQueUJvdCArIHBhZGRpbmcgPiByZWN0LnlCb3QpIHJlY3QueUJvdCA9IHRleHRGbGF0LnlCb3QgKyBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSBuZXcgQ29tbWVudEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLCBvcHRpb25zLmluZGV4KTtcbiAgICAgICAgaWYob3B0aW9ucy5yZWFkT25seSAhPT0gbnVsbCAmJiBvcHRpb25zLnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbW1lbnQuaXNSZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGV4dEZsYXQpIHtcbiAgICAgICAgICAgIGNvbW1lbnQudGV4dEJyaWNrID0gdGV4dEZsYXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyAocXVlc3Rpb24udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPT0gbnVsbCA/IHF1ZXN0aW9uLnZhbHVlIDogJycpIDpcbiAgICAgICAgICAgIChxdWVzdGlvbi5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgcXVlc3Rpb24uY29tbWVudCAhPT0gbnVsbCA/IHF1ZXN0aW9uLmNvbW1lbnQgOiAnJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnREaXNwbGF5VmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uLCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpc1F1ZXN0aW9uID8gcXVlc3Rpb24uZGlzcGxheVZhbHVlIDogU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGluQnJvd3NlciA9IHR5cGVvZiBJbWFnZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGhhc0RvY3VtZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlQmFzZTY0KGltYWdlTGluazogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVVybCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBpbWFnZUxpbms7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZENvbnZlcnRJbWFnZVRvUG5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlTGluayhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2JqZWN0Rml0Pzogc3RyaW5nIH0sIGFwcGx5SW1hZ2VGaXQ6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwdFRvUHg6IG51bWJlciA9IDk2LjAgLyA3Mi4wO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zaG91bGRDb252ZXJ0SW1hZ2VUb1BuZyA/IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZUJhc2U2NChpbWFnZU9wdGlvbnMubGluaykgOiBpbWFnZU9wdGlvbnMubGluaztcbiAgICAgICAgaWYodHlwZW9mIFhNTFNlcmlhbGl6ZXIgPT09ICdmdW5jdGlvbicgJiYgYXBwbHlJbWFnZUZpdCkge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzSHRtbDogc3RyaW5nID1cbiAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogJHtpbWFnZU9wdGlvbnMud2lkdGggKiBwdFRvUHh9cHg7IGhlaWdodDogJHtpbWFnZU9wdGlvbnMuaGVpZ2h0ICogcHRUb1B4fXB4Oyc+XG4gICAgICAgICAgICAgICAgICAgPGltZyBzcmM9JyR7dXJsfScgc3R5bGU9J29iamVjdC1maXQ6ICR7aW1hZ2VPcHRpb25zLm9iamVjdEZpdH07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Jy8+XG4gICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgdXJsID0gKGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShjYW52YXNIdG1sLCBpbWFnZU9wdGlvbnMud2lkdGgsIGNvbnRyb2xsZXIpKS51cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVJbWFnZUZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IGFueSxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaW1hZ2VPcHRpb25zOiB7IGxpbms6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9iamVjdEZpdD86IHN0cmluZyB9LCBhcHBseUltYWdlRml0PzogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMub2JqZWN0Rml0ID0gISFxdWVzdGlvbiAmJiAhIXF1ZXN0aW9uLmltYWdlRml0ID8gcXVlc3Rpb24uaW1hZ2VGaXQgOiAoaW1hZ2VPcHRpb25zLm9iamVjdEZpdCB8fCAnY29udGFpbicpO1xuICAgICAgICAgICAgaWYgKGFwcGx5SW1hZ2VGaXQgPz8gY29udHJvbGxlci5hcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlT3B0aW9ucy53aWR0aCA+IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCAqPSBuZXdXaWR0aCAvIGltYWdlT3B0aW9ucy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPcHRpb25zLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gYDxpbWcgc3JjPScke2F3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZUxpbmsoY29udHJvbGxlciwgaW1hZ2VPcHRpb25zLCBhcHBseUltYWdlRml0ID8/IGNvbnRyb2xsZXIuYXBwbHlJbWFnZUZpdCl9JyB3aWR0aD0nJHtpbWFnZU9wdGlvbnMud2lkdGh9JyBoZWlnaHQ9JyR7aW1hZ2VPcHRpb25zLmhlaWdodH0nLz5gO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgaW1hZ2VPcHRpb25zLndpZHRoLCBpbWFnZU9wdGlvbnMuaGVpZ2h0KSwgaHRtbCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCBpbWFnZU9wdGlvbnMubGluaywgcG9pbnQsIGltYWdlT3B0aW9ucy53aWR0aCwgaW1hZ2VPcHRpb25zLmhlaWdodCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2FuUHJldmlld0ltYWdlKHF1ZXN0aW9uOiBRdWVzdGlvbkZpbGVNb2RlbCwgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0sIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5jYW5QcmV2aWV3SW1hZ2UoaXRlbSk7XG4gICAgICAgIC8vICAmJiAgYXdhaXQgdGhpcy5nZXRJbWFnZVNpemUodXJsKSAhPT0gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZXRJbWFnZVNpemUodXJsOiBzdHJpbmcpOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIGlmICghU3VydmV5SGVscGVyLmluQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogdW5kZWZpbmVkLCBoZWlnaHQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2U6IGFueSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZShudWxsKTsgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUm93bGluZUZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgd2lkdGg/OiBudW1iZXIsIGNvbG9yPzogc3RyaW5nKTogSVBkZkJyaWNrIHtcbiAgICAgICAgbGV0IHhSaWdodDogbnVtYmVyID0gdHlwZW9mIHdpZHRoID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgOlxuICAgICAgICAgICAgcG9pbnQueExlZnQgKyB3aWR0aDtcbiAgICAgICAgeFJpZ2h0ID0geFJpZ2h0ID4gcG9pbnQueExlZnQgPyB4UmlnaHQgOiBwb2ludC54TGVmdCArIHRoaXMuRVBTSUxPTjtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3dsaW5lQnJpY2soY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiB4UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIHRoaXMuRVBTSUxPTlxuICAgICAgICB9LCB0eXBlb2YgY29sb3IgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGNvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVMaW5rRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZywgbGluazogc3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlVGV4dDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5cbiAgICAgICAgICAgIGNyZWF0ZVRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlTGluazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29tcG9zaXRlVGV4dC51bmZvbGQoKS5mb3JFYWNoKCh0ZXh0OiBUZXh0QnJpY2spID0+IHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sobmV3IExpbmtCcmljayh0ZXh0LCBsaW5rKSk7XG4gICAgICAgICAgICBjb25zdCBsaW5lUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoY29tcG9zaXRlTGluayk7XG4gICAgICAgICAgICBjb21wb3NpdGVMaW5rLmFkZEJyaWNrKHRoaXMuY3JlYXRlUm93bGluZUZsYXQobGluZVBvaW50LFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbXBvc2l0ZUxpbmsud2lkdGgsIExpbmtCcmljay5DT0xPUikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUxpbms7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3Q6IElSZWN0KTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHJlY3QueVRvcCxcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0IC0gcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHJlY3QueUJvdCAtIHJlY3QueVRvcFxuICAgICAgICBdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgbGluZXM6IG51bWJlciA9IDEpOiBJUmVjdCB7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gcG9pbnQueExlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBsaW5lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChwb2ludDogSVBvaW50LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgcG9pbnQueVRvcCArPSBwYWRkaW5nO1xuICAgICAgICBwb2ludC54TGVmdCArPSBwYWRkaW5nO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKHBvaW50LnhMZWZ0LCBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHZhbHVlLnRvU3RyaW5nKCksIFRleHRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gdGV4dEZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgYm9yZGVyT3B0aW9uczogSUJvcmRlckRlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5GT1JNX0JPUkRFUl9WSVNJQkxFKSByZXR1cm47XG4gICAgICAgIGJvcmRlck9wdGlvbnMucm91bmRlZCA9IGJvcmRlck9wdGlvbnMucm91bmRlZCA/PyB0cnVlO1xuICAgICAgICBib3JkZXJPcHRpb25zLm91dHNpZGUgPSBib3JkZXJPcHRpb25zLm91dHNpZGUgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pblNpZGU6IG51bWJlciA9IE1hdGgubWluKGJvcmRlck9wdGlvbnMud2lkdGgsIGJvcmRlck9wdGlvbnMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSB0aGlzLmdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCB2aXNpYmxlV2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNjYWxlOiBudW1iZXIgPSBib3JkZXJPcHRpb25zLm91dHNpZGUgPyAobWluU2lkZSArIGJvcmRlcldpZHRoKSAvIG1pblNpZGUgLSB2aXNpYmxlV2lkdGggLyBtaW5TaWRlIDogKG1pblNpZGUgLSBib3JkZXJXaWR0aCkgLyBtaW5TaWRlICsgdmlzaWJsZVdpZHRoIC8gbWluU2lkZTtcbiAgICAgICAgY29uc3Qgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSBjb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKGJvcmRlck9wdGlvbnMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0TGluZVdpZHRoKHZpc2libGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHNjYWxlZFJlY3QgPSB0aGlzLnNjYWxlUmVjdChib3JkZXJPcHRpb25zLCB2aXNpYmxlU2NhbGUpO1xuICAgICAgICBpZihib3JkZXJPcHRpb25zLmRhc2hTdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGFzaFN0eWxlID0gYm9yZGVyT3B0aW9ucy5kYXNoU3R5bGU7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJMZW5ndGggPSAoTWF0aC5hYnMoc2NhbGVkUmVjdC55VG9wIC0gc2NhbGVkUmVjdC55Qm90KSArIE1hdGguYWJzKHNjYWxlZFJlY3QueExlZnQgLSBzY2FsZWRSZWN0LnhSaWdodCkpICogMjtcbiAgICAgICAgICAgIGNvbnN0IGRhc2hXaXRoU3BhY2VTaXplID0gZGFzaFN0eWxlLmRhc2hBcnJheVswXSArIChkYXNoU3R5bGUuZGFzaEFycmF5WzFdID8/IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF0pO1xuICAgICAgICAgICAgY29uc3QgZGFzaFNpemUgPSBkYXNoU3R5bGUuZGFzaEFycmF5WzBdICsgKGJvcmRlckxlbmd0aCAlIGRhc2hXaXRoU3BhY2VTaXplKSAvIE1hdGguZmxvb3IoYm9yZGVyTGVuZ3RoIC8gZGFzaFdpdGhTcGFjZVNpemUpO1xuXG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lRGFzaFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgW2Rhc2hTaXplLCBkYXNoU3R5bGUuZGFzaEFycmF5WzFdID8/IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF1dLFxuICAgICAgICAgICAgICAgIGRhc2hTdHlsZS5kYXNoUGhhc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sbGVyLmRvYy5yZWN0KC4uLnRoaXMuY3JlYXRlQWNyb2Zvcm1SZWN0KHNjYWxlZFJlY3QpKTtcbiAgICAgICAgaWYoYm9yZGVyT3B0aW9ucy5yb3VuZGVkKSB7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5VTlZJU0lCTEVfQk9SREVSX1NDQUxFICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVTY2FsZTogbnVtYmVyID0gMS4wIC0gdW52aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICAgICAgY29uc3QgdW52aXNpYmxlUmFkaXVzOiBudW1iZXIgPSB0aGlzLlJBRElVU19TQ0FMRSAqIHVudmlzaWJsZVdpZHRoO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuQkFDS0dST1VORF9DT0xPUik7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodW52aXNpYmxlV2lkdGgpO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2Mucm91bmRlZFJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVJlY3QoYm9yZGVyT3B0aW9ucywgdW52aXNpYmxlU2NhbGUpKSwgdW52aXNpYmxlUmFkaXVzLCB1bnZpc2libGVSYWRpdXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGJvcmRlck9wdGlvbnMuZGFzaFN0eWxlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lRGFzaFBhdHRlcm4oW10pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldExvY1N0cmluZyh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmhhc0h0bWwodGV4dCkpIHJldHVybiB0ZXh0LnJlbmRlcmVkSHRtbDtcbiAgICAgICAgcmV0dXJuICg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCB8fCB0ZXh0LnJlbmRlcmVkSHRtbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXREcm9wZG93blF1ZXN0aW9uVmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcURyb3BEb3duOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgPSA8UXVlc3Rpb25Ecm9wZG93bk1vZGVsPnF1ZXN0aW9uO1xuICAgICAgICBpZiAocURyb3BEb3duLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHFEcm9wRG93bi5vdGhlclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoISFxdWVzdGlvbi5kaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocURyb3BEb3duLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHFEcm9wRG93bi5vcHRpb25zQ2FwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbik6IFF1ZXN0aW9uIHtcbiAgICAgICAgcmV0dXJuICEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA/ICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gOiBxdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb25UeXBlUmVuZGVyQXMocXVlc3Rpb246IFF1ZXN0aW9uLCBzdXJ2ZXk6IFN1cnZleVBERik6IHN0cmluZyB7XG4gICAgICAgIGxldCByZW5kZXJBcyA9IHF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZihxdWVzdGlvbi5nZXRUeXBlKCkgPT09ICdib29sZWFuJyAmJiBzdXJ2ZXkub3B0aW9ucy51c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICByZW5kZXJBcyA9ICdjaGVja2JveCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYocmVuZGVyQXMgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGAke3F1ZXN0aW9uLmdldFR5cGUoKX0tJHtyZW5kZXJBc31gO1xuICAgICAgICAgICAgaWYoRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5pc1R5cGVSZWdpc3RlcmVkKHR5cGUpKSByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb246IFF1ZXN0aW9uLCBzdXJ2ZXk6IFN1cnZleVBERik6IHN0cmluZyB7XG4gICAgICAgIGlmKCEhcXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSByZXR1cm4gcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlF1ZXN0aW9uVHlwZTtcbiAgICAgICAgcmV0dXJuICEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA/ICdjdXN0b21fbW9kZWwnIDogdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlUmVuZGVyQXMocXVlc3Rpb24sIHN1cnZleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nTWluV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMuUkFUSU5HX01JTl9XSURUSCkud2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nSXRlbVRleHQocXVlc3Rpb246IFF1ZXN0aW9uUmF0aW5nTW9kZWwsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgICAgICBjb25zdCByYXRpbmdJdGVtTG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobG9jVGV4dC5vd25lciwgbG9jVGV4dC51c2VNYXJrZG93bik7XG4gICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbi50ZXh0ICsgJyAnICsgdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEgJiYgcXVlc3Rpb24ubWF4UmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCkgKyAnICcgKyBxdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF0aW5nSXRlbUxvY1RleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9ICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtXG4gICAgICAgICAgICAodGhpcy5JTUFHRVBJQ0tFUl9DT1VOVCAtIDEpICogY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoID4gMCA/IHdpZHRoIDogY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbHVtbldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGNvbENvdW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIChjb2xDb3VudCAtIDEpICpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5HQVBfQkVUV0VFTl9DT0xVTU5TKSAvIGNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldENvbHVtbk1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlciwgY29sdW1uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSB0aGlzLmdldENvbHVtbldpZHRoKGNvbnRyb2xsZXIsIGNvbENvdW50KTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIGNvbHVtbiAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyAoY29sQ291bnQgLSBjb2x1bW4gLSAxKSAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIG1vdmVSZWN0KHJlY3Q6IElSZWN0LCBsZWZ0OiBudW1iZXIgPSByZWN0LnhMZWZ0LCB0b3A6IG51bWJlciA9IHJlY3QueVRvcCk6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgeVRvcDogdG9wLFxuICAgICAgICAgICAgeFJpZ2h0OiBsZWZ0ICsgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeUJvdDogdG9wICsgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2NhbGVSZWN0KHJlY3Q6IElSZWN0LCBzY2FsZTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCBzY2FsZVdpZHRoOiBudW1iZXIgPSBNYXRoLm1pbihyZWN0LnhSaWdodCAtIHJlY3QueExlZnQsIHJlY3QueUJvdCAtIHJlY3QueVRvcCkgKiAoMS4wIC0gc2NhbGUpIC8gMi4wO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgc2NhbGVXaWR0aCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdC54UmlnaHQgLSBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeUJvdDogcmVjdC55Qm90IC0gc2NhbGVXaWR0aFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIDIuMCAqIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybVNjYWxlKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXQ6IElTaXplKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICByZXR1cm4gKG1pblNpZGUgLSB0aGlzLmdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXIpKSAvIG1pblNpZGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlKHF1ZXN0aW9uLCBzdXJ2ZXkpO1xuICAgICAgICBjb25zdCBmbGF0UXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLlxuICAgICAgICAgICAgY3JlYXRlKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgZmxhdFF1ZXN0aW9uLmdlbmVyYXRlRmxhdHMocG9pbnQpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucyA9IG5ldyBBZG9ybmVyc09wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBxdWVzdGlvbkZsYXRzLCBxdWVzdGlvbiwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJiBxdWVzdGlvbi5jdXN0b21XaWRnZXQuaXNGaXQocXVlc3Rpb24pICYmXG4gICAgICAgICAgICBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi51bnNoaWZ0KHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9udEV4aXN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmZvbnROYW1lID09PSBmb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0N1c3RvbUZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZW5jb2RpbmcgPT09IHRoaXMuQ1VTVE9NX0ZPTlRfRU5DT0RJTkc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZml4Rm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VzdG9tRm9udChjb250cm9sbGVyLCBjb250cm9sbGVyLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MudGV4dCgnbG9hZCBmb250JywgMCwgMCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICAgICAgY29udHJvbGxlci5hZGRQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjbG9uZShzcmM6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgICAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzcmNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRSZW5kZXJSZWFkT25seShxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWFkT25seT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICgoISFxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8IHJlYWRPbmx5KSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIDxRdWVzdGlvbj5xdWVzdGlvbiwgY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHx8IGNvbnRyb2xsZXI/LmNvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzU2l6ZUVtcHR5KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdmFsIHx8IHZhbCA9PT0gJ2F1dG8nO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSGVpZ2h0RW1wdHkodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTaXplRW1wdHkodmFsKSB8fCB2YWwgPT0gJzEwMCUnO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldENvcnJlY3RlZEltYWdlU2l6ZShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgaW1hZ2VXaWR0aD86IGFueSwgaW1hZ2VIZWlnaHQ/OiBhbnksIGltYWdlTGluazogc3RyaW5nLCBkZWZhdWx0SW1hZ2VXaWR0aD86IGFueSwgZGVmYXVsdEltYWdlSGVpZ2h0PzogYW55IH0pOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIGxldCB7IGltYWdlV2lkdGgsIGltYWdlTGluaywgaW1hZ2VIZWlnaHQsIGRlZmF1bHRJbWFnZVdpZHRoLCBkZWZhdWx0SW1hZ2VIZWlnaHQgfSA9IGltYWdlT3B0aW9ucztcbiAgICAgICAgaW1hZ2VXaWR0aCA9IHR5cGVvZiBpbWFnZVdpZHRoID09PSAnbnVtYmVyJyA/IGltYWdlV2lkdGgudG9TdHJpbmcoKSA6IGltYWdlV2lkdGg7XG4gICAgICAgIGltYWdlSGVpZ2h0ID0gdHlwZW9mIGltYWdlSGVpZ2h0ID09PSAnbnVtYmVyJyA/IGltYWdlSGVpZ2h0LnRvU3RyaW5nKCkgOiBpbWFnZUhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoUHQ6IG51bWJlciA9IGltYWdlV2lkdGggJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGxldCBoZWlnaHRQdDogbnVtYmVyID0gaW1hZ2VIZWlnaHQgJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICBkZWZhdWx0SW1hZ2VXaWR0aCA9IHR5cGVvZiBkZWZhdWx0SW1hZ2VXaWR0aCA9PT0gJ251bWJlcicgPyBkZWZhdWx0SW1hZ2VXaWR0aC50b1N0cmluZygpIDogZGVmYXVsdEltYWdlV2lkdGg7XG4gICAgICAgIGRlZmF1bHRJbWFnZUhlaWdodCA9IHR5cGVvZiBkZWZhdWx0SW1hZ2VIZWlnaHQgPT09ICdudW1iZXInID8gZGVmYXVsdEltYWdlSGVpZ2h0LnRvU3RyaW5nKCkgOiBkZWZhdWx0SW1hZ2VIZWlnaHQ7XG4gICAgICAgIGxldCBkZWZhdWx0V2lkdGhQdDogbnVtYmVyID0gZGVmYXVsdEltYWdlV2lkdGggJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZGVmYXVsdEltYWdlV2lkdGgsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICBsZXQgZGVmYXVsdEhlaWdodFB0OiBudW1iZXIgPSBkZWZhdWx0SW1hZ2VIZWlnaHQgJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZGVmYXVsdEltYWdlSGVpZ2h0LCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcblxuICAgICAgICBpZihTdXJ2ZXlIZWxwZXIuaXNTaXplRW1wdHkoaW1hZ2VXaWR0aCkgfHwgU3VydmV5SGVscGVyLmlzSGVpZ2h0RW1wdHkoaW1hZ2VIZWlnaHQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VTaXplKGltYWdlTGluayk7XG4gICAgICAgICAgICBpZighU3VydmV5SGVscGVyLmlzU2l6ZUVtcHR5KGltYWdlV2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgaWYoaW1hZ2VTaXplICYmIGltYWdlU2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHRQdCA9IGltYWdlU2l6ZS5oZWlnaHQgKiB3aWR0aFB0IC8gaW1hZ2VTaXplLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIVN1cnZleUhlbHBlci5pc0hlaWdodEVtcHR5KGltYWdlSGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgIGlmKGltYWdlU2l6ZSAmJiBpbWFnZVNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoUHQgPSBpbWFnZVNpemUud2lkdGggKiBoZWlnaHRQdCAvIGltYWdlU2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihpbWFnZVNpemUgJiYgaW1hZ2VTaXplLmhlaWdodCAmJiBpbWFnZVNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBoZWlnaHRQdCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGltYWdlU2l6ZS5oZWlnaHQudG9TdHJpbmcoKSwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgd2lkdGhQdCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGltYWdlU2l6ZS53aWR0aC50b1N0cmluZygpLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGhQdCB8fCBkZWZhdWx0V2lkdGhQdCB8fCAwLCBoZWlnaHQ6IGhlaWdodFB0IHx8IGRlZmF1bHRIZWlnaHRQdCB8fCAwIH07XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbkRlZmF1bHQgfSBmcm9tICcuL2ZsYXRfZGVmYXVsdCc7XG5cbmV4cG9ydCB0eXBlIEZsYXRDb25zdHJ1Y3RvciA9IG5ldyAoXG4gICAgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyXG4pID0+IElGbGF0UXVlc3Rpb247XG5leHBvcnQgY2xhc3MgRmxhdFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgcXVlc3Rpb25zOiB7IFtpbmRleDogc3RyaW5nXTogRmxhdENvbnN0cnVjdG9yIH0gPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRmxhdFJlcG9zaXRvcnkgPSBuZXcgRmxhdFJlcG9zaXRvcnkoKTtcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZsYXRSZXBvc2l0b3J5IHtcbiAgICAgICAgcmV0dXJuIEZsYXRSZXBvc2l0b3J5Lmluc3RhbmNlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVnaXN0ZXIobW9kZWxUeXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uc1ttb2RlbFR5cGVdID0gcmVuZGVyZXJDb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgcHVibGljIGlzVHlwZVJlZ2lzdGVyZWQodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb25zW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UmVuZGVyZXIodHlwZTogc3RyaW5nKTogRmxhdENvbnN0cnVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgY3JlYXRlKHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGRvY0NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHR5cGU/OiBzdHJpbmcpOiBJRmxhdFF1ZXN0aW9uIHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcgPyBxdWVzdGlvbi5nZXRUeXBlKCkgOiB0eXBlO1xuICAgICAgICBsZXQgcmVuZGVyZXJDb25zdHJ1Y3RvciA9IHRoaXMuZ2V0UmVuZGVyZXIocXVlc3Rpb25UeXBlKTtcbiAgICAgICAgaWYoIXJlbmRlcmVyQ29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGlmKCEhcXVlc3Rpb24uY3VzdG9tV2lkZ2V0Py5wZGZSZW5kZXIpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlckNvbnN0cnVjdG9yID0gRmxhdFF1ZXN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlckNvbnN0cnVjdG9yID0gRmxhdFF1ZXN0aW9uRGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHJlbmRlcmVyQ29uc3RydWN0b3Ioc3VydmV5LCBxdWVzdGlvbiwgZG9jQ29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIodHlwZTogc3RyaW5nLCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKHR5cGUsIHJlbmRlcmVyQ29uc3RydWN0b3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlbmRlcmVyKHR5cGU6IHN0cmluZyk6IEZsYXRDb25zdHJ1Y3RvciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKCkuZ2V0UmVuZGVyZXIodHlwZSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBMb2NhbGl6YWJsZVN0cmluZywgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGbGF0UXVlc3Rpb24ge1xuICAgIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbiAgICBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbn1cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb24gaW1wbGVtZW50cyBJRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRFTlRfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDAuNTtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRFTlRfR0FQX0hPUl9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9JTkRFTlRfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIERFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjA2MjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24ocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5sb2NEZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SGVhZGVyKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlclRpdGxlKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGRlc2NQb2ludC55VG9wICs9IEZsYXRRdWVzdGlvbi5ERVNDX0dBUF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZGVzY1BvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oZGVzY1BvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbW1lbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5sb2NDb21tZW50VGV4dDtcbiAgICAgICAgY29uc3Qgb3RoZXJUZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KG90aGVyVGV4dEZsYXQpO1xuICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhvdGhlclRleHRGbGF0LCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29udGVudFBhbmVsID0gKDxhbnk+dGhpcy5xdWVzdGlvbikuY29udGVudFBhbmVsO1xuICAgICAgICBpZiAoISFjb250ZW50UGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbCh0aGlzLnN1cnZleSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbnRlbnRQYW5lbCwgcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50V2l0aE9wdGlvbmFsRWxlbWVudHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IEFycmF5PElQZGZCcmljaz4gPSBbXTtcbiAgICAgICAgY29uc3QgY29udGVudEZsYXRzID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKHBvaW50KTtcbiAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICBjb25zdCBnZXRMYXRlc3RQb2ludCA9ICgpOiBJUG9pbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgICAgIGlmKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0cykueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNDb21tZW50KSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoZ2V0TGF0ZXN0UG9pbnQoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dCkge1xuICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKGdldExhdGVzdFBvaW50KCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aDtcbiAgICAgICAgY29uc3QgaW5kZW50UG9pbnQ6IElQb2ludCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgdGl0bGVMb2NhdGlvbjogc3RyaW5nID0gdGhpcy5xdWVzdGlvbi5nZXRUaXRsZUxvY2F0aW9uKCk7XG4gICAgICAgIHRpdGxlTG9jYXRpb24gPSB0aGlzLnF1ZXN0aW9uLmhhc1RpdGxlID8gdGl0bGVMb2NhdGlvbiA6ICdoaWRkZW4nO1xuICAgICAgICBzd2l0Y2ggKHRpdGxlTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckZsYXQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcihpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGhlYWRlckZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGhlYWRlckZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCksIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICAgICAgICAgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IGluZGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcih0aXRsZVBvaW50KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdsZWZ0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcihpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfSE9SX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlckZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGhlYWRlckZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBjYXNlIFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZUxvY2F0aW9uICE9PSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHNob3VsZFJlbmRlckFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgncXVlc3Rpb24nLCB7XG4gICAgbmFtZTogJ3JlYWRvbmx5UmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAndGV4dCcsICdhY3JvZm9ybSddLFxuICAgIHZpc2libGU6IGZhbHNlXG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIGFsaWduOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5hbGlnbiA9IHtcbiAgICAgICAgICAgIGlzSW5wdXRSdGw6IGZhbHNlLFxuICAgICAgICAgICAgaXNPdXRwdXRSdGw6IGNvbnRyb2xsZXIuaXNSVEwsXG4gICAgICAgICAgICBhbGlnbjogY29udHJvbGxlci5pc1JUTCA/ICdyaWdodCc6ICdsZWZ0JyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiAnbWlkZGxlJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcml2YXRlIGVzY2FwZVRleHQoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnRleHQuaW5kZXhPZignXFx0JykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnJlcGxhY2UoJ1xcdCcsIEFycmF5KDUpLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgYWxpZ25Qb2ludDogSVBvaW50ID0gdGhpcy5hbGlnblBvaW50KHRoaXMpO1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IodGhpcy50ZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHQodGhpcy5lc2NhcGVUZXh0KCksIGFsaWduUG9pbnQueExlZnQsIGFsaWduUG9pbnQueVRvcCwgdGhpcy5hbGlnbik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYWxpZ25Qb2ludChyZWN0OiBJUmVjdCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogdGhpcy5jb250cm9sbGVyLmlzUlRMID8gcmVjdC54UmlnaHQgOiByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgKHJlY3QueUJvdCAtIHJlY3QueVRvcCkgLyAyLjBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJpbXBvcnQgeyBJUGRmQnJpY2ssIFRyYW5zbGF0ZVhGdW5jdGlvbiB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlQnJpY2sgaW1wbGVtZW50cyBJUGRmQnJpY2sge1xuICAgIHByaXZhdGUgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeVRvcDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3lCb3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYnJpY2tzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB0aGlzLl94TGVmdCA9IDAuMDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gMC4wO1xuICAgICAgICB0aGlzLl95VG9wID0gMC4wO1xuICAgICAgICB0aGlzLl95Qm90ID0gMC4wO1xuICAgICAgICB0aGlzLmFkZEJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIGdldCB4TGVmdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feExlZnQ7IH1cbiAgICBzZXQgeExlZnQoeExlZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KHhMZWZ0IC0gdGhpcy54TGVmdCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0geExlZnQ7XG4gICAgfVxuICAgIGdldCB4UmlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3hSaWdodDsgfVxuICAgIHNldCB4UmlnaHQoeFJpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIHhSaWdodCAtIHRoaXMueFJpZ2h0LCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHhSaWdodDtcbiAgICB9XG4gICAgZ2V0IHlUb3AoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lUb3A7IH1cbiAgICBzZXQgeVRvcCh5VG9wOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgeVRvcCAtIHRoaXMueVRvcCwgMC4wKTtcbiAgICAgICAgdGhpcy5feVRvcCA9IHlUb3A7XG4gICAgfVxuICAgIGdldCB5Qm90KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl95Qm90OyB9XG4gICAgc2V0IHlCb3QoeUJvdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoMC4wLCAwLjAsIDAuMCwgeUJvdCAtIHRoaXMueUJvdCk7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB5Qm90O1xuICAgIH1cbiAgICBwcml2YXRlIHNoaWZ0KGxlZnRTaGlmdDogbnVtYmVyLCByaWdodFNoaWZ0OiBudW1iZXIsXG4gICAgICAgIHRvcFNoaWZ0OiBudW1iZXIsIGJvdFNoaWZ0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgYnJpY2sueExlZnQgKz0gbGVmdFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueFJpZ2h0ICs9IHJpZ2h0U2hpZnQ7XG4gICAgICAgICAgICBicmljay55VG9wICs9IHRvcFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueUJvdCArPSBib3RTaGlmdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueUJvdCAtIHRoaXMueVRvcDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYnJpY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyaWNrc1tpXS5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyaWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRCcmljayguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIGlmIChicmlja3MubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnJpY2tzLnB1c2goLi4uYnJpY2tzKTtcbiAgICAgICAgICAgIGxldCBtZXJnZVJlY3QgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi50aGlzLmJyaWNrcyk7XG4gICAgICAgICAgICB0aGlzLl94TGVmdCA9IG1lcmdlUmVjdC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuX3hSaWdodCA9IG1lcmdlUmVjdC54UmlnaHQ7XG4gICAgICAgICAgICB0aGlzLl95VG9wID0gbWVyZ2VSZWN0LnlUb3A7XG4gICAgICAgICAgICB0aGlzLl95Qm90ID0gbWVyZ2VSZWN0LnlCb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGNvbnN0IHVuZm9sZEJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgdW5mb2xkQnJpY2tzLnB1c2goLi4uYnJpY2sudW5mb2xkKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuZm9sZEJyaWNrcztcbiAgICB9XG4gICAgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaChicmljayA9PiBicmljay50cmFuc2xhdGVYKGZ1bmMpKTtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gcmVzLnhMZWZ0O1xuICAgICAgICB0aGlzLl94UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzZfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJTdXJ2ZXlcIixcImNvbW1vbmpzMlwiOlwic3VydmV5LWNvcmVcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXktY29yZVwiLFwiYW1kXCI6XCJzdXJ2ZXktY29yZVwifVxuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zbGF0ZVhGdW5jdGlvbiA9ICh4TGVmdDogbnVtYmVyLCB4UmlnaHQgOiBudW1iZXIpID0+IHsgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXJ9O1xuZXhwb3J0IGludGVyZmFjZSBJUGRmQnJpY2sgZXh0ZW5kcyBJUmVjdCwgSVNpemUge1xuICAgIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVuZm9sZCgpOiBJUGRmQnJpY2tbXTtcbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQ7XG4gICAgaXNQYWdlQnJlYWs6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIFBERiBicmljayZtZGFzaDthIHNpbXBsZSBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGNvbnRlbnQsIHNpemUsIGFuZCBsb2NhdGlvbi4gQnJpY2tzIGFyZSBmdW5kYW1lbnRhbCBlbGVtZW50cyB1c2VkIHRvIGNvbnN0cnVjdCBhIFBERiBkb2N1bWVudC5cbiAqXG4gKiBZb3UgY2FuIGFjY2VzcyBgUGRmQnJpY2tgIG9iamVjdHMgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXJRdWVzdGlvbmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyUXVlc3Rpb24pLCBbYG9uUmVuZGVyUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlclBhbmVsKSwgYW5kIFtgb25SZW5kZXJQYWdlYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXlwZGYjb25SZW5kZXJQYWdlKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2FkZC1tYXJrdXAtdG8tY3VzdG9taXplLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQZGZCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIF94TGVmdDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF95VG9wOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF95Qm90OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSBsZWZ0IGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB4TGVmdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5feExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeExlZnQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRYTGVmdCh2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSByaWdodCBicmljayBlZGdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgeFJpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl94UmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeFJpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0WFJpZ2h0KHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgdG9wIGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB5VG9wKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHlUb3AodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRZVG9wKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgYm90dG9tIGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB5Qm90KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHlCb3QodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRZQm90dG9tKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNCAoaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBQREYgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHVibGljIGZvbnRTaXplOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbG9yIG9mIHRleHQgd2l0aGluIHRoZSBicmljay5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBcIiM0MDQwNDBcImBcbiAgICAgKi9cbiAgICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuVEVYVF9DT0xPUjtcbiAgICBwdWJsaWMgZm9ybUJvcmRlckNvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuRk9STV9CT1JERVJfQ09MT1I7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gISFjb250cm9sbGVyID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgOiBEb2NDb250cm9sbGVyLkZPTlRfU0laRTtcbiAgICB9XG4gICAgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMueExlZnQgPSByZXMueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVzLnhSaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJyaWNrJ3Mgd2lkdGggaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJyaWNrJ3MgaGVpZ2h0IGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHVibGljIGFmdGVyUmVuZGVyQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJSZWFkT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmFmdGVyUmVuZGVyQ2FsbGJhY2sgJiYgdGhpcy5hZnRlclJlbmRlckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgeW91IHRvIGdldCBhIGZsYXQgYXJyYXkgb2YgbmVzdGVkIFBERiBicmlja3MuXG4gICAgICogQHJldHVybnMgQSBmbGF0IGFycmF5IG9mIG5lc3RlZCBQREYgYnJpY2tzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkVGV4dCh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaXNSVEwgPyAodmFsIHx8ICcnKS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpOiB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRYTGVmdCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl94TGVmdCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhSaWdodCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl94UmlnaHQgPSB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZVG9wKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3lUb3AgPSB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZQm90dG9tKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB2YWw7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwiaW1wb3J0IHsganNQREYsIGpzUERGT3B0aW9ucyB9IGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IElIVE1MUmVuZGVyVHlwZSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbi8vIGltcG9ydCBGb250cyBmcm9tICcuL2ZvbnRzJztcbmltcG9ydCBzZXRSYWRpb0FwcGVhcmFuY2UgZnJvbSAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSBsZWZ0IGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgdG9wIGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB5VG9wOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IGRlc2NyaWJlcyBhIHJlY3RhbmdsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVjdCBleHRlbmRzIElQb2ludCB7XG4gICAgLyoqXG4gICAgICogQW4gWC1jb29yZGluYXRlIGZvciB0aGUgcmlnaHQgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgYm90dG9tIGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB5Qm90OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTaXplIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luTFIge1xuICAgIC8qKlxuICAgICAqIEEgbGVmdCBtYXJnaW4uXG4gICAgICovXG4gICAgbGVmdD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHJpZ2h0IG1hcmdpbi5cbiAgICAgKi9cbiAgICByaWdodD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIG1hcmdpbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU1hcmdpbiBleHRlbmRzIElNYXJnaW5MUiB7XG4gICAgLyoqXG4gICAgICogQSB0b3AgbWFyZ2luLlxuICAgICAqL1xuICAgIHRvcD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGJvdHRvbSBtYXJnaW4uXG4gICAgICovXG4gICAgYm90PzogbnVtYmVyO1xufVxuLyoqXG4gKiBQREYgZG9jdW1lbnQgY29uZmlndXJhdGlvbi4gUGFzcyBpdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBgU3VydmV5UERGYCBjb25zdHJ1Y3RvcjpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc3VydmV5UGRmID0gbmV3IFN1cnZleVBERi5TdXJ2ZXlQREYoc3VydmV5SnNvbiwgcGRmRG9jT3B0aW9ucyk7XG4gKlxuICogLy8gSW4gbW9kdWxhciBhcHBsaWNhdGlvbnM6XG4gKiBpbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tIFwic3VydmV5LXBkZlwiO1xuICogY29uc3Qgc3VydmV5UGRmID0gbmV3IFN1cnZleVBERihzdXJ2ZXlKc29uLCBwZGZEb2NPcHRpb25zKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEb2NPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBQYWdlIG9yaWVudGF0aW9uLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJwXCJgIChkZWZhdWx0KSAtIFBvcnRyYWl0IG9yaWVudGF0aW9uLlxuICAgICAqIC0gYFwibFwiYCAtIExhbmRzY2FwZSBvcmllbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzZWUgZm9ybWF0XG4gICAgICovXG4gICAgb3JpZW50YXRpb24/OiAncCcgfCAnbCc7XG5cbiAgICAvKipcbiAgICAgKiBQYWdlIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwiYTBcImAgLSBgXCJhMTBcImAgKGBcImE0XCJgIGlzIGRlZmF1bHQpXG4gICAgICogLSBgXCJiMFwiYCAtIGBcImIxMFwiYFxuICAgICAqIC0gYFwiYzBcImAgLSBgXCJjMTBcImBcbiAgICAgKiAtIGBcImRsXCJgXG4gICAgICogLSBgXCJsZXR0ZXJcImBcbiAgICAgKiAtIGBcImdvdmVybm1lbnQtbGV0dGVyXCJgXG4gICAgICogLSBgXCJsZWdhbFwiYFxuICAgICAqIC0gYFwianVuaW9yLWxlZ2FsXCJgXG4gICAgICogLSBgXCJsZWRnZXJcImBcbiAgICAgKiAtIGBcInRhYmxvaWRcImBcbiAgICAgKiAtIGBcImNyZWRpdC1jYXJkXCJgXG4gICAgICogLSBBcnJheTxudW1iZXI+IC0gY3VzdG9tIHBhZ2Ugc2l6ZSBpbiBtaWxsaW1ldGVycywgZm9yIGV4YW1wbGUsIGBbMjEwLCAyOTddYC5cbiAgICAgKlxuICAgICAqIEBzZWUgb3JpZW50YXRpb25cbiAgICAgKi9cbiAgICBmb3JtYXQ/OiBzdHJpbmcgfCBudW1iZXJbXTtcblxuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNFxuICAgICAqXG4gICAgICogQHNlZSBmb250TmFtZVxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRm9udCBuYW1lLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJIZWx2ZXRpY2FcImAgKGRlZmF1bHQpXG4gICAgICogLSBgXCJDb3VyaWVyXCJgXG4gICAgICogLSBgXCJUaW1lc1wiYFxuICAgICAqIC0gYFwiU3ltYm9sXCJgXG4gICAgICogLSBgXCJaYXBmRGluZ2JhdHNcImBcbiAgICAgKiAtIFtDdXN0b20gZm9udCBuYW1lXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vUGRmLUV4cG9ydD9pZD1DdXN0b21pemF0aW9uLUNoYW5nZUZvbnRzI3VzZS1jdXN0b20tZm9udClcbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jaGFuZ2UtZm9udC1pbi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICogQHNlZSBmb250U2l6ZVxuICAgICAqL1xuICAgIGZvbnROYW1lPzogc3RyaW5nO1xuXG4gICAgYmFzZTY0Tm9ybWFsPzogc3RyaW5nO1xuICAgIGJhc2U2NEJvbGQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXBwbHkgYSBjdXN0b20gZm9udCB0byBbSFRNTCBxdWVzdGlvbnNdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2V4YW1wbGVzL3F1ZXN0aW9udHlwZS1odG1sLykuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY2hhbmdlLWZvbnQtaW4tcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICAgICAqIEBzZWUgaHRtbFJlbmRlckFzXG4gICAgICovXG4gICAgdXNlQ3VzdG9tRm9udEluSHRtbD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQYWdlIG1hcmdpbnMuIFNldCB0aGlzIHByb3BlcnR5IHRvIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBgdG9wYCwgYGJvdGAsIGBsZWZ0YCwgYHJpZ2h0YC5cbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVuZGVyIFtIVE1MIHF1ZXN0aW9uc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25odG1sbW9kZWwpIGludG8gUERGLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJzdGFuZGFyZFwiYCAtIFJlbmRlciBIVE1MIHF1ZXN0aW9ucyBhcyBzZWxlY3RhYmxlIHRleHQuXG4gICAgICogLSBgXCJpbWFnZVwiYCAtIFJlbmRlciBIVE1MIHF1ZXN0aW9ucyBhcyBpbWFnZXMuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFNlbGVjdCBiZXR3ZWVuIHRoZSBgXCJzdGFuZGFyZFwiYCBhbmQgYFwiaW1hZ2VcImAgbW9kZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgSFRNTCBjb250ZW50LlxuICAgICAqXG4gICAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIHByb3BlcnR5IGZvciBhbiBpbmRpdmlkdWFsIEhUTUwgcXVlc3Rpb24uIFNldCB0aGUgcXVlc3Rpb24ncyBgcmVuZGVyQXNgIHByb3BlcnR5IHRvIGBcInN0YW5kYXJkXCJgIG9yIGBcImltYWdlXCJgIGluIHRoZSBzdXJ2ZXkgSlNPTiBzY2hlbWEuXG4gICAgICogQHNlZSB1c2VDdXN0b21Gb250SW5IdG1sXG4gICAgICovXG4gICAgaHRtbFJlbmRlckFzPzogSUhUTUxSZW5kZXJUeXBlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZW5kZXIgW01hdHJpeF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhtb2RlbCksIFtNYXRyaXggRHJvcGRvd25dKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXF1ZXN0aW9ubWF0cml4ZHJvcGRvd25tb2RlbCksIGFuZCBbTWF0cml4IER5bmFtaWNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXF1ZXN0aW9ubWF0cml4ZHluYW1pY21vZGVsKSBxdWVzdGlvbnMgaW50byBQREYuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcImxpc3RcImAgLSBSZW5kZXIgbWF0cml4LWxpa2UgcXVlc3Rpb25zIGFzIGxpc3RzLlxuICAgICAqIC0gYFwiYXV0b1wiYCAoZGVmYXVsdCkgLSBSZW5kZXIgbWF0cml4LWxpa2UgcXVlc3Rpb25zIGFzIHRhYmxlcyBpZiB0aGV5IGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgc3BhY2UuIE90aGVyd2lzZSwgcmVuZGVyIHRoZSBxdWVzdGlvbnMgYXMgbGlzdHMuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgZm9yIGFuIGluZGl2aWR1YWwgbWF0cml4LWxpa2UgcXVlc3Rpb24uIFNldCB0aGUgcXVlc3Rpb24ncyBgcmVuZGVyQXNgIHByb3BlcnR5IHRvIGBcImxpc3RcImAgaW4gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAgICAgKi9cbiAgICBtYXRyaXhSZW5kZXJBcz86ICdhdXRvJyB8ICdsaXN0JztcbiAgICB1c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG93IHRvIHJlbmRlciByZWFkLW9ubHkgcXVlc3Rpb25zLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJ0ZXh0XCJgIC0gUmVuZGVyIHJlYWQtb25seSBxdWVzdGlvbnMgYXMgcGxhaW4gdGV4dCBhbmQgY3VzdG9tIHByaW1pdGl2ZXMuXG4gICAgICogLSBgXCJhY3JvZm9ybVwiYCAtIFVzZSBBZG9iZSBBY3JvRm9ybXMgdG8gcmVuZGVyIHF1ZXN0aW9ucyB0aGF0IHN1cHBvcnQgdGhlbSBhcyBpbnRlcmFjdGl2ZSBmb3JtIGVsZW1lbnRzIHN3aXRjaGVkIHRvIHRoZWlyIG5hdGl2ZSByZWFkLW9ubHkgc3RhdGUuIE90aGVyIHF1ZXN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gYFwidGV4dFwiYCBtb2RlLlxuICAgICAqIC0gYFwiYXV0b1wiYCAoZGVmYXVsdCkgLSBQcmVmZXIgdGhlIGBcInRleHRcImAgbW9kZSBidXQgdXNlIGBcImFjcm9mb3JtXCJgIGZvciBbRmlsZSBVcGxvYWRdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9maWxlLW1vZGVsKSBxdWVzdGlvbnMgYW5kIGxpbmtzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5UmVuZGVyQXM/OiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuXG4gICAgdGV4dEZpZWxkUmVuZGVyQXM/OiAnc2luZ2xlTGluZScgfCAnbXVsdGlMaW5lJztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNvbXByZXNzIHRoZSBQREYgZG9jdW1lbnQuIENvbXByZXNzZWQgZG9jdW1lbnRzIGRvIG5vdCBzdXBwb3J0IFtjdXN0b20gZm9udHNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9QZGYtRXhwb3J0P2lkPUN1c3RvbWl6YXRpb24tQ2hhbmdlRm9udHMjdXNlLWN1c3RvbS1mb250KS5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBjb21wcmVzcz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcHBseSBgaW1hZ2VGaXRgIHNldHRpbmdzIHNwZWNpZmllZCBpbiB0aGUgc3VydmV5IEpTT04gc2NoZW1hIHRvIGV4cG9ydGVkIGltYWdlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKlxuICAgICAqIFRoaXMgcHJvcGVydHkgYXBwbGllcyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOlxuICAgICAqXG4gICAgICogLSBbYGltYWdlRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2FkZC1pbWFnZS10by1zdXJ2ZXkjaW1hZ2VGaXQpIHRvIGV4cG9ydGVkIFtJbWFnZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2FkZC1pbWFnZS10by1zdXJ2ZXkpIHF1ZXN0aW9uc1xuICAgICAqIC0gW2BpbWFnZUZpdGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pbWFnZS1waWNrZXItcXVlc3Rpb24tbW9kZWwjaW1hZ2VGaXQpIHRvIGV4cG9ydGVkIFtJbWFnZSBQaWNrZXJdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pbWFnZS1waWNrZXItcXVlc3Rpb24tbW9kZWwpIHF1ZXN0aW9uc1xuICAgICAqIC0gW2Bsb2dvRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleS1kYXRhLW1vZGVsI2xvZ29GaXQpIHRvIGFuIGV4cG9ydGVkIGxvZ28gaW4gdGhlIHN1cnZleSBoZWFkZXJcbiAgICAgKlxuICAgICAqIElmIHlvdSBlbmFibGUgdGhlIGBhcHBseUltYWdlRml0YCBwcm9wZXJ0eSwgdGhlIHF1YWxpdHkgb2YgaW1hZ2VzIG1heSBiZSBsb3dlciBiZWNhdXNlIHRoZXkgcGFzcyB0aHJvdWdoIHNldmVyYWwgY29udmVyc2lvbnMuIElmIGBhcHBseUltYWdlRml0YCBpcyBkaXNhYmxlZCwgZXhwb3J0ZWQgaW1hZ2VzIGZpbGwgdGhlIGVudGlyZSBjb250YWluZXIgYW5kIGRvIG5vdCBwcmVzZXJ2ZSB0aGVpciBhc3BlY3QgcmF0aW8sIGJ1dCB0aGVpciBxdWFsaXR5IHJlbWFpbnMgdGhlIHNhbWUgYmVjYXVzZSB0aGV5IGFyZSBleHBvcnRlZCBhcyBpcy5cbiAgICAgKi9cbiAgICBhcHBseUltYWdlRml0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQREYgZG9jdW1lbnQgY29udGFpbnMgdGV4dCBpbiByaWdodC10by1sZWZ0IGxhbmd1YWdlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc1JUTD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHNlbGVjdGVkIGNob2ljZXMgd2hlbiBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBbTXVsdGktU2VsZWN0IERyb3Bkb3duIChUYWcgQm94KV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvaG93LXRvLWNyZWF0ZS1tdWx0aXNlbGVjdC10YWctYm94LykgcXVlc3Rpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgIChpbmNsdWRlIGFsbCBjaG9pY2VzKVxuICAgICAqL1xuICAgIHRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRG9jT3B0aW9ucyBpbXBsZW1lbnRzIElEb2NPcHRpb25zIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1NX1RPX1BUID0gNzIgLyAyNS40O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRk9OVF9TSVpFID0gMTQ7XG4gICAgcHJvdGVjdGVkIF9vcmllbnRhdGlvbjogJ2wnIHwgJ3AnO1xuICAgIHByb3RlY3RlZCBfZm9ybWF0OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgX2ZvbnRTaXplOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9mb250TmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgU0VHT0VfTk9STUFMOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9CT0xEOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9iYXNlNjROb3JtYWw6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NEJvbGQ6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX3VzZUN1c3RvbUZvbnRJbkh0bWw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9tYXJnaW5zOiBJTWFyZ2luO1xuICAgIHByb3RlY3RlZCBfaHRtbFJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGU7XG4gICAgcHJvdGVjdGVkIF9tYXRyaXhSZW5kZXJBczogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHByb3RlY3RlZCBfcmVhZG9ubHlSZW5kZXJBczogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJztcbiAgICBwcm90ZWN0ZWQgX2NvbXByZXNzOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfYXBwbHlJbWFnZUZpdDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc6IGJvb2xlYW5cbiAgICBwcm90ZWN0ZWQgX2lzUlRMOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9yaWVudGF0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1hdFswXSA8IG9wdGlvbnMuZm9ybWF0WzFdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSAncCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHRoaXMuX29yaWVudGF0aW9uID0gJ2wnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uO1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCAnYTQnO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtYXQgPSB0aGlzLl9mb3JtYXQubWFwKGYgPT4gZiAqIERvY09wdGlvbnMuTU1fVE9fUFQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gb3B0aW9ucy5mb250U2l6ZSB8fCBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgaWYoIW9wdGlvbnMuZm9udE5hbWUpIHtcbiAgICAgICAgICAgIGlmKCFEb2NPcHRpb25zLlNFR09FX0JPTEQgJiYgIURvY09wdGlvbnMuU0VHT0VfTk9STUFMKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBTdXJ2ZXlIZWxwZXIuU1RBTkRBUkRfRk9OVDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSAnc2Vnb2UnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBvcHRpb25zLmZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodHlwZW9mIG9wdGlvbnMuZm9udE5hbWUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmJhc2U2NEJvbGQgIT09ICd1bmRlZmluZWQnKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IG9wdGlvbnMuYmFzZTY0Tm9ybWFsIHx8IG9wdGlvbnMuYmFzZTY0Qm9sZDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NEJvbGQgPSBvcHRpb25zLmJhc2U2NEJvbGQgfHwgb3B0aW9ucy5iYXNlNjROb3JtYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mb250TmFtZSA9PT0gJ3NlZ29lJykge1xuICAgICAgICAgICAgLy8gdGhpcy5fYmFzZTY0Tm9ybWFsID0gRm9udHMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgLy8gdGhpcy5fYmFzZTY0Qm9sZCA9IEZvbnRzLlNFR09FX0JPTEQ7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjROb3JtYWwgPSBEb2NPcHRpb25zLlNFR09FX05PUk1BTDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NEJvbGQgPSBEb2NPcHRpb25zLlNFR09FX0JPTEQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFyZ2lucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zLm1hcmdpbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMuYm90ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5ib3QgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMucmlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9tYXJnaW5zKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdID0gKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gKiBEb2NPcHRpb25zLk1NX1RPX1BUO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faHRtbFJlbmRlckFzID0gb3B0aW9ucy5odG1sUmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9tYXRyaXhSZW5kZXJBcyA9IG9wdGlvbnMubWF0cml4UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9yZWFkb25seVJlbmRlckFzID0gb3B0aW9ucy5yZWFkb25seVJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fY29tcHJlc3MgPSBvcHRpb25zLmNvbXByZXNzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9hcHBseUltYWdlRml0ID0gb3B0aW9ucy5hcHBseUltYWdlRml0IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl91c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nID0gb3B0aW9ucy51c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc1JUTCA9IG9wdGlvbnMuaXNSVEwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3RhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkgPSBvcHRpb25zLnRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkgfHwgZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbGVmdFRvcFBvaW50KCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0aGlzLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYXNlNjROb3JtYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NE5vcm1hbDtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYXNlNjRCb2xkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlNjRCb2xkO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVzZUN1c3RvbUZvbnRJbkh0bWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1hcmdpbnMoKTogSU1hcmdpbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJnaW5zO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvcm1hdCgpOiBzdHJpbmcgfCBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgb3JpZW50YXRpb24oKTogJ2wnIHwgJ3AnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGh0bWxSZW5kZXJBcygpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5faHRtbFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1hdHJpeFJlbmRlckFzKCk6ICdhdXRvJyB8ICdsaXN0JyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRyaXhSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCByZWFkb25seVJlbmRlckFzKCk6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybScge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCBjb21wcmVzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGFwcGx5SW1hZ2VGaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUltYWdlRml0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzUlRMKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNSVEw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBgRG9jQ29udHJvbGxlcmAgb2JqZWN0IGluY2x1ZGVzIGFuIEFQSSB0aGF0IGFsbG93cyB5b3UgdG8gY29uZmlndXJlIHRoZSByZXN1bHRpbmcgUERGIGRvY3VtZW50LiBZb3UgY2FuIGFjY2VzcyB0aGlzIG9iamVjdCB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXIuLi5gXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckZvb3RlcikgZXZlbnRzLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NDb250cm9sbGVyIGV4dGVuZHMgRG9jT3B0aW9ucyB7XG4gICAgcHJpdmF0ZSBfZG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9oZWxwZXJEb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2ZvbnRTdHlsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgbWFyZ2luc1N0YWNrOiBJTWFyZ2luTFJbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QganNwZGZPcHRpb25zOiBqc1BERk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIHVuaXQ6ICdwdCcsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3NcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnICYmICFTdXJ2ZXlIZWxwZXIuaXNGb250RXhpc3QodGhpcywgdGhpcy5mb250TmFtZSkpIHtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuYWRkRm9udCh0aGlzLmZvbnROYW1lLCB0aGlzLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpO1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Qm9sZCwgJ2JvbGQnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHNldFJhZGlvQXBwZWFyYW5jZSh0aGlzLl9kb2MpO1xuICAgICAgICB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sID0gb3B0aW9ucy51c2VDdXN0b21Gb250SW5IdG1sICYmIFN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjayA9IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGN1c3RvbUZvbnRzOiB7IFtuYW1lOiBzdHJpbmddOiB7IG5vcm1hbDogc3RyaW5nLCBib2xkOiBzdHJpbmcsIGl0YWxpYzogc3RyaW5nLCBib2xkaXRhbGljOiBzdHJpbmcgfSB9ID0ge307XG4gICAgcHVibGljIHN0YXRpYyBhZGRGb250KGZvbnROYW1lOiBzdHJpbmcsIGJhc2U2NDogc3RyaW5nLCBmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpIHtcbiAgICAgICAgbGV0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKCFmb250KSB7XG4gICAgICAgICAgICBmb250ID0gPGFueT57fTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgfVxuICAgICAgICBmb250W2ZvbnRTdHlsZV0gPSBiYXNlNjQ7XG4gICAgICAgIGNvbnN0IGFkZEZvbnRDYWxsYmFjazogKCkgPT4gdm9pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgIGlmICghIWN1c3RvbUZvbnQgJiYgISFjdXN0b21Gb250W2ZvbnRTdHlsZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250RmlsZTogc3RyaW5nID0gYCR7Zm9udE5hbWV9LSR7Zm9udFN0eWxlfS50dGZgO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsZVRvVkZTKGZvbnRGaWxlLCBjdXN0b21Gb250W2ZvbnRTdHlsZV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9udChmb250RmlsZSwgZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgICg8YW55PmpzUERGKS5BUEkuZXZlbnRzLnB1c2goWydhZGRGb250cycsIGFkZEZvbnRDYWxsYmFja10pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlbHBlckRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVscGVyRG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250TmFtZShmb250TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gZm9udE5hbWU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U2l6ZShmb250U2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFN0eWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U3R5bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFN0eWxlKGZvbnRTdHlsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgIH1cbiAgICBwdWJsaWMgbWVhc3VyZVRleHQodGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcgfCBudW1iZXIgPSAxLCBmb250U3R5bGU6IHN0cmluZyA9IHRoaXMuX2ZvbnRTdHlsZSxcbiAgICAgICAgZm9udFNpemU6IG51bWJlciA9IHRoaXMuX2ZvbnRTaXplKTogSVNpemUge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRMaW5lSGVpZ2h0KCkgLyB0aGlzLl9oZWxwZXJEb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gMC4wO1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGV4dCk7XG4gICAgICAgICAgICB3aWR0aCA9IHRleHQuc3BsaXQoJycpLnJlZHVjZSgoc206IG51bWJlciwgY3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBzbSArIHRoaXMuX2hlbHBlckRvYy5nZXRUZXh0V2lkdGgoY3IpLCAwLjApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShvbGRGb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCAnbm9ybWFsJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2Ygb25lIGNoYXJhY3RlciBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bml0V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWd0aCBvZiBvbmUgY2hhcmFjdGVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVuaXRIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwdXNoTWFyZ2lucyhsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjay5wdXNoKHsgbGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsIHJpZ2h0OiB0aGlzLm1hcmdpbnMucmlnaHQgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgaWYgKHR5cGVvZiByaWdodCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcG9wTWFyZ2lucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogSU1hcmdpbkxSID0gdGhpcy5tYXJnaW5zU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMubWFyZ2lucy5sZWZ0ID0gbWFyZ2lucy5sZWZ0O1xuICAgICAgICB0aGlzLm1hcmdpbnMucmlnaHQgPSBtYXJnaW5zLnJpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgYSBQREYgcGFnZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXBlcldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiBhIFBERiBwYWdlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXROdW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5hZGRQYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDdXJyZW50UGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyIC0gMTtcbiAgICB9XG4gICAgcHVibGljIHNldFBhZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5zZXRQYWdlKGluZGV4ICsgMSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RvY19jb250cm9sbGVyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBSYWRpb0dyb3VwV3JhcCwgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFkaW9ncm91cCBleHRlbmRzIEZsYXRTZWxlY3RCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsO1xuICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlLCBjaGVja2VkPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBjaGVja2VkID09PSAndW5kZWZpbmVkJykgP1xuICAgICAgICAgICAgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtID8gdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgOlxuICAgICAgICAgICAgICAgIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQoaXRlbSkpKSkgOiBjaGVja2VkO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLFxuICAgICAgICBpbmRleDogbnVtYmVyLCBrZXk/OiBzdHJpbmcsIGNoZWNrZWQ/OiBib29sZWFuLCBjb250ZXh0OiBhbnkgPSB7fSk6IElQZGZCcmljayB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9IG5ldyBSYWRpb0dyb3VwV3JhcCh0aGlzLnF1ZXN0aW9uLmlkICsgKCh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykgPyAnJyA6IGtleSksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB7IHJlYWRPbmx5OiB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHksIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCAuLi5jb250ZXh0IH0pO1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJhZGlvR3JvdXBXcmFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLnBkZlJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZDogYm9vbGVhbiA9IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSwgY2hlY2tlZCk7XG4gICAgICAgIHJldHVybiBuZXcgUmFkaW9JdGVtQnJpY2sodGhpcy5jb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbiwgaW5kZXg6IGluZGV4LCBjaGVja2VkOiBpc0NoZWNrZWQsIGl0ZW06IGl0ZW0gfSwgdGhpcy5yYWRpb0dyb3VwV3JhcCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYWRpb2dyb3VwJywgRmxhdFJhZGlvZ3JvdXApO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYnV0dG9uZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmFkaW9ncm91cC50cyIsImltcG9ydCB7IElFbGVtZW50LCBRdWVzdGlvbiwgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEFkb3JuZXJzUGFuZWxPcHRpb25zLCBBZG9ybmVyc1BhZ2VPcHRpb25zIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U3VydmV5IHtcbiAgICBwdWJsaWMgc3RhdGljIFFVRVNfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0NPTlRfR0FQX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBQQU5FTF9ERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHBhbmVsQ29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbENvbnRlbnRQb2ludC54TGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXksXG4gICAgICAgICAgICBjb250cm9sbGVyLCBwYW5lbCwgcGFuZWxDb250ZW50UG9pbnQpKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYW5lbE9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBwYW5lbEZsYXRzLCBwYW5lbCwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFuZWwuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhZ2VQYW5lbDogUGFuZWxNb2RlbEJhc2UsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghcGFnZVBhbmVsLmlzVmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICBwYWdlUGFuZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgICAgICBjb25zdCBwYWdlUGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgaWYgKHBhZ2VQYW5lbC5nZXRUeXBlKCkgIT09ICdwYWdlJyB8fCBzdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwgJiYgcGFnZVBhbmVsLm5vKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubm8sIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodCArIGNvbnRyb2xsZXIubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZWxQYW5lbFRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NUaXRsZSwgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVBhbmVsRGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBudWxsLCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHJvd0xpbmVQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2VQYW5lbC5yb3dzKSB7XG4gICAgICAgICAgICBpZiAoIXJvdy52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgbGV0IG5leHRNYXJnaW5MZWZ0OiBudW1iZXIgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUVsZW1lbnRzID0gcm93LmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZpc2libGVFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50OiBJRWxlbWVudCA9IHZpc2libGVFbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJzV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGVsZW1lbnQucmVuZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHZpc2libGVFbGVtZW50cy5sZW5ndGggLSAxKSAqIGNvbnRyb2xsZXIudW5pdFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlRWxlbWVudHMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IG5leHRNYXJnaW5MZWZ0ICsgKChpICE9PSAwKSA/IGNvbnRyb2xsZXIudW5pdFdpZHRoIDogMCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBwZXJzV2lkdGg7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgbmV4dE1hcmdpbkxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IFN1cnZleUhlbHBlci5nZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgPFF1ZXN0aW9uPmVsZW1lbnQsIGN1cnJQb2ludCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBpZiAocm93RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5yb3dGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlFVRVNfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaCguLi5yb3dGbGF0cyk7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VQYW5lbEZsYXRzO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBwb3BSb3dsaW5lcyhmbGF0czogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgd2hpbGUgKGZsYXRzLmxlbmd0aCA+IDAgJiYgZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBSb3dsaW5lQnJpY2spIHtcbiAgICAgICAgICAgIGZsYXRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwb2ludDogSVBvaW50KTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoc3VydmV5LnNob3dUaXRsZSkge1xuICAgICAgICAgICAgaWYgKHN1cnZleS50aXRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1cnZleVRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlU3VydmV5RmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NUaXRsZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhzdXJ2ZXlUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VydmV5LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1cnZleS50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCBzdXJ2ZXkubG9jRGVzY3JpcHRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgbG9nb1VybCA9IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoc3VydmV5LmxvY0xvZ28pO1xuICAgICAgICBjb25zdCBsb2dvU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRDb3JyZWN0ZWRJbWFnZVNpemUoY29udHJvbGxlciwgeyBpbWFnZUxpbms6IGxvZ29VcmwsIGltYWdlSGVpZ2h0OiBzdXJ2ZXkubG9nb0hlaWdodCwgaW1hZ2VXaWR0aDogc3VydmV5LmxvZ29XaWR0aCB9KTtcbiAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBwb2ludCwgbnVsbCwgY29udHJvbGxlciwgeyBsaW5rOiBsb2dvVXJsLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBsb2dvU2l6ZS53aWR0aCwgaGVpZ2h0OiBsb2dvU2l6ZS5oZWlnaHQgfSk7XG4gICAgICAgIGxldCBzaGlmdDogbnVtYmVyID0gMDtcbiAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHNoaWZ0ID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIGxvZ29GbGF0LndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC8gMi4wIC0gbG9nb0ZsYXQud2lkdGggLyAyLjA7XG4gICAgICAgIH1cbiAgICAgICAgbG9nb0ZsYXQueExlZnQgKz0gc2hpZnQ7XG4gICAgICAgIGxvZ29GbGF0LnhSaWdodCArPSBzaGlmdDtcbiAgICAgICAgcmV0dXJuIGxvZ29GbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmlja1tdW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGFzTG9nbykge1xuICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdXJ2ZXkuaXNMb2dvQmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxvZ29GbGF0LFxuICAgICAgICAgICAgICAgIHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICd0b3AnLCBzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJyk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC54TGVmdCArPSBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIHRpdGxlUG9pbnQpO1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKSBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzWzBdLnB1c2godGl0bGVGbGF0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gbG9nb0ZsYXQud2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0udW5zaGlmdCh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGxldCBsb2dvUG9pbnQ6IElQb2ludCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50O1xuICAgICAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHMucHVzaChbdGl0bGVGbGF0XSk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBsb2dvUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBsb2dvUG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIGZsYXRzWzBdLnB1c2gobG9nb0ZsYXQpO1xuICAgICAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9pbnQ6IElQb2ludCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50O1xuICAgICAgICBpZiAoZmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzWzBdKSkueVRvcDtcbiAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICBwb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUEFORUxfQ09OVF9HQVBfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3VydmV5LnZpc2libGVQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VydmV5LmN1cnJlbnRQYWdlID0gc3VydmV5LnZpc2libGVQYWdlc1tpXTtcbiAgICAgICAgICAgIGxldCBwYWdlRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBwYWdlRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFnZU9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICAgICAgcGFnZUZsYXRzLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFnZS5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cyA9IFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goLi4ucGFnZUZsYXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChwYWdlRmxhdHMpO1xuICAgICAgICAgICAgdGhpcy5wb3BSb3dsaW5lcyhmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueVRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIsIElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hlY2tJdGVtQnJpY2tDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgaXRlbT86IEl0ZW1WYWx1ZTtcbiAgICBpbmRleD86IG51bWJlcjtcbn1cbmV4cG9ydCBjbGFzcyBDaGVja0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDAuNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnMyc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ6IHN0cmluZyA9ICd6YXBmZGluZ2JhdHMnO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gTWF0aC5FIC8gMTAuMDtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIGNvbnRleHQ6IElDaGVja0l0ZW1Ccmlja0NvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY29udGV4dC5xdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnRoaXMuY29udGV4dC5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFNob3VsZFJlbmRlclJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJyB8fCB0aGlzLmNvbnRyb2xsZXIuY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY2hlY2tCb3g6IGFueSA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ2hlY2tCb3gpKCk7XG4gICAgICAgIGNvbnN0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5tYXhGb250U2l6ZSA9IHRoaXMuaGVpZ2h0ICogZm9ybVNjYWxlICogQ2hlY2tJdGVtQnJpY2suRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBvcHRpb25zLmNhcHRpb24gPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MO1xuICAgICAgICBvcHRpb25zLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBvcHRpb25zLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBvcHRpb25zLnJlYWRPbmx5ID0gdGhpcy5jb250ZXh0LnJlYWRPbmx5O1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSB0aGlzLmNvbnRleHQuY2hlY2tlZCA/ICdPbicgOiBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5BUyA9IHRoaXMuY29udGV4dC5jaGVja2VkID8gJy9PbicgOiAnL09mZic7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBvcHRpb25zLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjaGVja0JveCk7XG4gICAgICAgICg8U3VydmV5UERGPnRoaXMucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZENoZWNrSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBjaGVja0JveC5tYXhGb250U2l6ZSA9IG9wdGlvbnMubWF4Rm9udFNpemU7XG4gICAgICAgIGNoZWNrQm94LmNhcHRpb24gPSBvcHRpb25zLmNhcHRpb247XG4gICAgICAgIGNoZWNrQm94LnRleHRBbGlnbiA9IG9wdGlvbnMudGV4dEFsaWduO1xuICAgICAgICBjaGVja0JveC5maWVsZE5hbWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgY2hlY2tCb3gucmVhZE9ubHkgPSBvcHRpb25zLnJlYWRPbmx5O1xuICAgICAgICBjaGVja0JveC5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG4gICAgICAgIGNoZWNrQm94LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY2hlY2tCb3guQVMgPSBvcHRpb25zLkFTO1xuICAgICAgICBjaGVja0JveC5SZWN0ID0gb3B0aW9ucy5SZWN0O1xuXG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250TmFtZTogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBjaGVja21hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIGNoZWNrbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PmNoZWNrbWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICBhd2FpdCBjaGVja21hcmtGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gb2xkRm9udE5hbWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsImltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEVtcHR5QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBpc0JvcmRlclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG51bGwsXG4gICAgICAgIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKG51bGwsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmlzQm9yZGVyVmlzaWJsZSA9IGlzQm9yZGVyVmlzaWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2l6ZUJvcmRlcihpc0luY3JlYXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvZWY6IG51bWJlciA9IGlzSW5jcmVhc2UgPyAxIDogLTE7XG4gICAgICAgIGNvbnN0IGJvcmRlclBhZGRpbmc6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKSAqIFN1cnZleUhlbHBlci5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICB0aGlzLnhMZWZ0IC09IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnhSaWdodCArPSBjb2VmICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgdGhpcy55Qm90ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNCb3JkZXJWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcih0cnVlKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVCb3JkZXIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0Qm9sZEJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJleHBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuZXhwb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5leHBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgSU1hcmdpbkxSLCBJTWFyZ2luLCBJRG9jT3B0aW9ucywgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmV4cG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmV4cG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuZXhwb3J0IHsgRmxhdFF1ZXN0aW9uRGVmYXVsdCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZGVmYXVsdCc7XG5leHBvcnQgeyBGbGF0Qm9vbGVhbkNoZWNrYm94IGFzIEZsYXRCb29sZWFuIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuJztcbmV4cG9ydCB7IEZsYXRDaGVja2JveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gnO1xuZXhwb3J0IHsgRmxhdEN1c3RvbU1vZGVsIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwnO1xuZXhwb3J0IHsgRmxhdENvbW1lbnQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQnO1xuZXhwb3J0IHsgRmxhdERyb3Bkb3duIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bic7XG5leHBvcnQgeyBGbGF0RXhwcmVzc2lvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbic7XG5leHBvcnQgeyBGbGF0RmlsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZSc7XG5leHBvcnQgeyBGbGF0SFRNTCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5leHBvcnQgeyBGbGF0SW1hZ2UgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ltYWdlJztcbmV4cG9ydCB7IEZsYXRJbWFnZVBpY2tlciB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXInO1xuZXhwb3J0IHsgRmxhdFBhbmVsRHluYW1pYyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwJztcbmV4cG9ydCB7IEZsYXRSYW5raW5nIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nJztcbmV4cG9ydCB7IEZsYXRSYXRpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhdGluZyc7XG5leHBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZSc7XG5leHBvcnQgeyBGbGF0U2lnbmF0dXJlUGFkIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQnO1xuZXhwb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3RleHRib3gnO1xuZXhwb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5JztcbmV4cG9ydCB7IEZsYXRNYXRyaXggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeCc7XG5leHBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlJztcbmV4cG9ydCB7IEZsYXRNYXRyaXhEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRNdWx0aXBsZVRleHQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dCc7XG5leHBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuZXhwb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmV4cG9ydCB7IEhvcml6b250YWxBbGlnbiwgVmVydGljYWxBbGlnbiwgSURyYXdSZWN0T3B0aW9ucywgSURyYXdUZXh0T3B0aW9ucywgSURyYXdJbWFnZU9wdGlvbnMsIERyYXdDYW52YXMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmV4cG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5leHBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuZXhwb3J0IHsgQ29tbWVudEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5leHBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5leHBvcnQgeyBDdXN0b21CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2N1c3RvbSc7XG5leHBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuZXhwb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmV4cG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2h0bWwnO1xuZXhwb3J0IHsgSW1hZ2VCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmV4cG9ydCB7IExpbmtCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuZXhwb3J0IHsgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuZXhwb3J0IHsgUmFua2luZ0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtJztcbmV4cG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuZXhwb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuZXhwb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmV4cG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuZXhwb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5leHBvcnQgeyBUaXRsZVBhbmVsQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcblxuaW1wb3J0IHsgY2hlY2tMaWJyYXJ5VmVyc2lvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmNoZWNrTGlicmFyeVZlcnNpb24oYCR7cHJvY2Vzcy5lbnYuVkVSU0lPTn1gLCAnc3VydmV5LXBkZicpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL3BkZi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGbGF0U2VsZWN0QmFzZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94QmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94QmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFic3RyYWN0IGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljaztcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgaWYgKGl0ZW0ubG9jVGV4dC5yZW5kZXJlZEh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSAmJiAoaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpKSkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IGluZGV4LCByb3dzOiBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbENvdW50ID0gdGhpcy5nZXRDb2xDb3VudCgpO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2xDb3VudDogbnVtYmVyID0gY29sQ291bnQ7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PSAwKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSBNYXRoLmZsb29yKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKVxuICAgICAgICAgICAgICAgIC8gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aCkgfHwgMTtcbiAgICAgICAgICAgIGlmICh2aXNpYmxlQ2hvaWNlcy5sZW5ndGggPCBjdXJyZW50Q29sQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSAoU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQpIDxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSA/IDEgOiBjb2xDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGN1cnJlbnRDb2xDb3VudCA9PSAxKSA/IGF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQsIHZpc2libGVDaG9pY2VzKSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQsIGN1cnJlbnRDb2xDb3VudCk7XG5cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGl0ZW1WYWx1ZXM6IEl0ZW1WYWx1ZVtdKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaXRlbVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKGN1cnJQb2ludCwgaXRlbVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50LCBjb2xDb3VudDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgaSAlIGNvbENvdW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCB2aXNpYmxlQ2hvaWNlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmIChpICUgY29sQ291bnQgPT09IGNvbENvdW50IC0gMSB8fCBpID09PSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZUZsYXQ6IElQZGZCcmljayA9IFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dMaW5lRmxhdC55Qm90ICtcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFRyYW5zbGF0ZVhGdW5jdGlvbiB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFJvd2xpbmVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMueExlZnQgPSByZWN0LnhMZWZ0O1xuICAgICAgICB0aGlzLnhSaWdodCA9IHJlY3QueFJpZ2h0O1xuICAgICAgICB0aGlzLnlUb3AgPSByZWN0LnlUb3A7XG4gICAgICAgIHRoaXMueUJvdCA9IHJlY3QueUJvdDtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb2xvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG9sZERyYXdDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5saW5lKHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy54UmlnaHQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKF86IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge31cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4vcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb3hCcmljayBleHRlbmRzIFRleHRGaWVsZEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UsIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaWQgKyAoaXNRdWVzdGlvbiA/ICcnIDogJ19jb21tZW50JyArIGluZGV4KSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKDxRdWVzdGlvbj5xdWVzdGlvbiwgaXNRdWVzdGlvbiksXG4gICAgICAgICAgICBpc1F1ZXN0aW9uICYmICg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyID8gU3VydmV5SGVscGVyLmdldExvY1N0cmluZygoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5sb2NQbGFjZUhvbGRlcikgOiAnJyxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksIGlzTXVsdGlsaW5lLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaW5wdXRUeXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSU1hcmdpbiwgSVNpemUsIERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbi8qKlxuICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgdHlwZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgZW51bSBIb3Jpem9udGFsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gICAgUmlnaHQgPSAncmlnaHQnXG59XG4vKipcbiAqIFZlcnRpY2FsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnRpY2FsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIFRvcCA9ICd0b3AnLFxuICAgIE1pZGRsZSA9ICdtaWRkbGUnLFxuICAgIEJvdHRvbSA9ICdib3R0b20nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdSZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgd2l0aGluIHRoZSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwiY2VudGVyXCJgIChkZWZhdWx0KVxuICAgICAqIC0gYFwibGVmdFwiYFxuICAgICAqIC0gYFwicmlnaHRcImBcbiAgICAgKi9cbiAgICBob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG4gICAgLyoqXG4gICAgICogVmVydGljYWwgYWxpZ25tZW50IHdpdGhpbiB0aGUgcmVjdGFuZ2xlIHRoYXQgbGltaXRzIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcIm1pZGRsZVwiYCAoZGVmYXVsdClcbiAgICAgKiAtIGBcInRvcFwiYFxuICAgICAqIC0gYFwiYm90dG9tXCJgXG4gICAgICovXG4gICAgdmVydGljYWxBbGlnbj86IFZlcnRpY2FsQWxpZ247XG4gICAgLyoqXG4gICAgICogVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNvbnRlbnQgYW5kIHRoZSBib3JkZXJzIG9mIHRoZSByZWN0YW5nbGUuIFRoaXMgcHJvcGVydHkgYXBwbGllcyBvbmx5IGlmIHRoZSBjb250ZW50IGlzIGFsaWduZWQgdG8gdGhlIGxlZnQvcmlnaHQgb3IgdG9wL2JvdHRvbS5cbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqL1xuICAgIHJlY3Q/OiBJUmVjdDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyByZW5kZXJpbmcgYSBwaWVjZSBvZiB0ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3VGV4dE9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHQgc3RyaW5nIHRvIGJlIGRyYXduLlxuICAgICAqL1xuICAgIHRleHQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGb250IHNpemUgaW4gcG9pbnRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogMTRcbiAgICAgKi9cbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFbmFibGUgdGhpcyBwcm9wZXJ0eSB0byByZW5kZXIgdGhlIHRleHQgc3RyaW5nIGJvbGQuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAgICovXG4gICAgaXNCb2xkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyByZW5kZXJpbmcgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdJbWFnZU9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbWFnZSB3aWR0aCBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIHRoZSBbcmVjdGFuZ2xlIHdpZHRoXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zI3JlY3QpLlxuICAgICAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGltYWdlIGhlaWdodCBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIHRoZSBbcmVjdGFuZ2xlIGhlaWdodF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pZHJhd2ltYWdlb3B0aW9ucyNyZWN0KS5cbiAgICAgKi9cbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdmFsdWUgd2l0aCBhIGJhc2U2NC1lbmNvZGVkIGltYWdlIHRvIGJlIGRyYXduLlxuICAgICAqL1xuICAgIGJhc2U2NDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVzaXplIHRoZSBpbWFnZSB0byBmaXQgaXQgaW50byBpdHMgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYFwiY29udGFpblwiYCBpZiBbYGFwcGx5SW1hZ2VGaXRgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkb2NvcHRpb25zI2FwcGx5SW1hZ2VGaXQpIGlzIGVuYWJsZWQgb3IgYHVuZGVmaW5lZGAgaWYgbm90LlxuICAgICAqXG4gICAgICogUmVmZXIgdG8gdGhlIFtgb2JqZWN0LWZpdGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9vYmplY3QtZml0KSBDU1MgcHJvcGVydHkgZGVzY3JpcHRpb24gZm9yIGluZm9ybWF0aW9uIG9uIGFjY2VwdGVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBpbWFnZUZpdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBkcmF3aW5nIGFyZWEgYW5kIGVuYWJsZXMgeW91IHRvIGRyYXcgYW4gaW1hZ2Ugb3IgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiB0aGUgYXJlYS4gWW91IGNhbiBhY2Nlc3MgdGhpcyBvYmplY3Qgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXJIZWFkZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckhlYWRlcikgYW5kIFtgb25SZW5kZXJGb290ZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckZvb3RlcikgZXZlbnRzLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jdXN0b21pemUtaGVhZGVyLWFuZC1mb290ZXItb2YtcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgRHJhd0NhbnZhcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwYWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHB1YmxpYyBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3JlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgX2NvdW50UGFnZXM6IG51bWJlcixcbiAgICAgICAgcHJvdGVjdGVkIF9wYWdlTnVtYmVyOiBudW1iZXIpIHsgfVxuICAgIC8qKlxuICAgICAqIEEgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRQYWdlcztcbiAgICB9XG4gICAgcHVibGljIGdldCBjb3VudFBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGRyYXdpbmcgYXJlYS4gRW51bWVyYXRpb24gc3RhcnRzIHdpdGggMS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIGEgcmVjdGFuZ2xlIHRoYXQgbGltaXRzIHRoZSBkcmF3aW5nIGFyZWEuIFRoaXMgb2JqZWN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6IGB4TGVmdGAsIGB4UmlnaHRgLCBgeVRvcGAsIGB5Qm90YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlY3QoKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhbGlnblJlY3QocmVjdE9wdGlvbnM6IElEcmF3UmVjdE9wdGlvbnMsIGl0ZW1TaXplOiBJU2l6ZSk6IElSZWN0IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucyA9IHsgbGVmdDogMC4wLCByaWdodDogMC4wLCB0b3A6IDAuMCwgYm90OiAwLjAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5yZWN0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID09PSBIb3Jpem9udGFsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID0gSG9yaXpvbnRhbEFsaWduLkNlbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSBWZXJ0aWNhbEFsaWduLk5vdFNldCkge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPSBWZXJ0aWNhbEFsaWduLk1pZGRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jbG9uZSh0aGlzLnJlY3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uTGVmdDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54UmlnaHQgPSBNYXRoLm1pbih0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCArIGl0ZW1TaXplLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgLSBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgKyBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5SaWdodDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IE1hdGgubWF4KHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0IC0gaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueExlZnQgPSByZWN0T3B0aW9ucy5yZWN0LnhMZWZ0IHx8IHRoaXMucmVjdC54TGVmdDtcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gcmVjdE9wdGlvbnMucmVjdC54UmlnaHQgfHwgdGhpcy5yZWN0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uVG9wOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCArIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5NaWRkbGU6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IE1hdGgubWF4KHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCAtIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC55VG9wICsgdGhpcy5yZWN0LnlCb3QgKyBpdGVtU2l6ZS5oZWlnaHQpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLkJvdHRvbTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgLSBpdGVtU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSB0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueVRvcCA9IHJlY3RPcHRpb25zLnJlY3QueVRvcCB8fCB0aGlzLnJlY3QueVRvcDtcbiAgICAgICAgICAgIHJlY3QueUJvdCA9IHJlY3RPcHRpb25zLnJlY3QueUJvdCB8fCB0aGlzLnJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJhd3MgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiB0aGUgZHJhd2luZyBhcmVhLlxuICAgICAqIEBwYXJhbSB0ZXh0T3B0aW9ucyBBbiBbYElEcmF3VGV4dE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3dGV4dG9wdGlvbnMpIG9iamVjdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGRyYXdpbmcuXG4gICAgICovXG4gICAgcHVibGljIGRyYXdUZXh0KHRleHRPcHRpb25zOiBJRHJhd1RleHRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRleHRPcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKHRleHRPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5mb250U2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmZvbnRTaXplID0gRG9jT3B0aW9ucy5GT05UX1NJWkU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5pc0JvbGQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5pc0JvbGQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0U2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGV4dE9wdGlvbnMudGV4dCxcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA/ICdib2xkJyA6ICdub3JtYWwnLCB0ZXh0T3B0aW9ucy5mb250U2l6ZSk7XG4gICAgICAgIGNvbnN0IHRleHRSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KHRleHRPcHRpb25zLCB0ZXh0U2l6ZSk7XG4gICAgICAgIGlmICghdGV4dE9wdGlvbnMuaXNCb2xkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tzLnB1c2gobmV3IFRleHRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJvbGRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICAoPFBkZkJyaWNrPnRoaXMucGFja3NbdGhpcy5wYWNrcy5sZW5ndGggLSAxXSkuZm9udFNpemUgPSB0ZXh0T3B0aW9ucy5mb250U2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJhd3MgYW4gaW1hZ2Ugd2l0aGluIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICogQHBhcmFtIGltYWdlT3B0aW9ucyBBbiBbYElEcmF3SW1hZ2VPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pZHJhd2ltYWdlb3B0aW9ucykgb2JqZWN0IHRoYXQgY29uZmlndXJlcyBkcmF3aW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkcmF3SW1hZ2UoaW1hZ2VPcHRpb25zOiBJRHJhd0ltYWdlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpbWFnZU9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW1hZ2VPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMud2lkdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSB0aGlzLnJlY3QueFJpZ2h0IC0gdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VPcHRpb25zLmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5oZWlnaHQgPSB0aGlzLnJlY3QueUJvdCAtIHRoaXMucmVjdC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZTogSVNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogaW1hZ2VPcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZU9wdGlvbnMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGltYWdlUmVjdDogSVJlY3QgPSB0aGlzLmFsaWduUmVjdChpbWFnZU9wdGlvbnMsIGltYWdlU2l6ZSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygwLCAwKTtcbiAgICAgICAgdGhpcy5wYWNrcy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaW1hZ2VSZWN0LCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICAgIG51bGwsIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiBpbWFnZU9wdGlvbnMuYmFzZTY0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBpbWFnZVJlY3QueFJpZ2h0IC0gaW1hZ2VSZWN0LnhMZWZ0LFxuICAgICAgICAgICAgICAgIGhlaWdodDogaW1hZ2VSZWN0LnlCb3QgLSBpbWFnZVJlY3QueVRvcCwgb2JqZWN0Rml0OiBpbWFnZU9wdGlvbnMuaW1hZ2VGaXQgfSwgISFpbWFnZU9wdGlvbnMuaW1hZ2VGaXQgfHwgdGhpcy5jb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJpbXBvcnQgeyBFdmVudCwgRXZlbnRCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9kcmF3X2NhbnZhcyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEV2ZW50QXN5bmM8U2VuZGVyLCBPcHRpb25zPiBleHRlbmRzIEV2ZW50QmFzZTxTZW5kZXIsIE9wdGlvbnM+IHtcbiAgICBwdWJsaWMgdW5zaGlmdChmdW5jOiAoc2VuZGVyOiBTZW5kZXIsIG9wdGlvbnM6IE9wdGlvbnMpID0+IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBBcnJheTwoc2VuZGVyOiBTZW5kZXIsIG9wdGlvbnM6IE9wdGlvbnMpID0+IGFueT4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrcy51bnNoaWZ0KGZ1bmMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmlyZShzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBwcm9jZXNzX2hlYWRlcl9ldmVudHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBhY2tzOiBJUGRmQnJpY2tbXVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghc3VydmV5LmhhdmVDb21tZXJjaWFsTGljZW5zZSkge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVySGVhZGVyLmFkZCgoXywgY2FudmFzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1N1cnZleUpTIFBERiB8IFBsZWFzZSBwdXJjaGFzZSBhIFN1cnZleUpTIFBERiBkZXZlbG9wZXIgbGljZW5zZSB0byB1c2UgaXQgaW4geW91ciBhcHAgfCBodHRwczovL3N1cnZleWpzLmlvL0J1eScsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJGb290ZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsImltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuXG5leHBvcnQgY2xhc3MgRmxhdFF1ZXN0aW9uRGVmYXVsdCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgYCR7dGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWV9YCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIFt2YWx1ZUJyaWNrXTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZGVmYXVsdC50cyIsImltcG9ydCB7XG4gICAgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSxcbiAgICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIFNlcmlhbGl6ZXIsIFBhbmVsTW9kZWwsIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLFxuICAgIExvY2FsaXphYmxlU3RyaW5nXG59IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeE11bHRpcGxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERiwgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgdmlzaWJsZVJvd3NWYWx1ZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W107XG4gICAgcHJpdmF0ZSBnZXQgdmlzaWJsZVJvd3MoKSB7XG4gICAgICAgIGlmKCF0aGlzLnZpc2libGVSb3dzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NWYWx1ZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5yb3dzLmZpbHRlcihyb3cgPT4gcm93LnZpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzVmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGxUaXRsZShwb2ludDogSVBvaW50LCBsb2NUaXRsZTogTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDZWxsKHBvaW50OiBJUG9pbnQsIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG4gICAgICAgIGxvY2F0aW9uPzogJ2hlYWRlcicgfCAnZm9vdGVyJywgaXNXaWRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoY2VsbC5oYXNRdWVzdGlvbikge1xuICAgICAgICAgICAgaWYobG9jYXRpb24gPT0gJ2Zvb3RlcicgJiYgIWNlbGwucXVlc3Rpb24uaXNBbnN3ZXJlZCkge31cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2lkZSAmJiBjZWxsLmlzQ2hvaWNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCBjZWxsLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljaygoPEZsYXRTZWxlY3RCYXNlPmZsYXRNdWx0aXBsZUNvbHVtbnNRdWVzdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlRmxhdEl0ZW0oaXRlbVJlY3QsIGNlbGwuaXRlbSwgY2VsbC5jaG9pY2VJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC5xdWVzdGlvbi50aXRsZUxvY2F0aW9uID0gU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbiwgcG9pbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjZWxsLmhhc1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLmxvY1RpdGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGhhc0RldGFpbFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5zb21lKChyZW5kZXJlZFJvdykgPT4gcmVuZGVyZWRSb3cucm93ICYmIHRoaXMucXVlc3Rpb24uaGFzRGV0YWlsUGFuZWwocmVuZGVyZWRSb3cucm93KSk7XG4gICAgfVxuICAgIHByaXZhdGUgaWdub3JlQ2VsbChjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBpbmRleDogbnVtYmVyLCBsb2NhdGlvbj86ICdoZWFkZXInIHwgJ2Zvb3RlcicsIGlzV2lkZTogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICAgICAgaWYoIWlzV2lkZSAmJiBsb2NhdGlvbiA9PSAnZm9vdGVyJyAmJiBjZWxsLmhhc1F1ZXN0aW9uICYmICFjZWxsLnF1ZXN0aW9uLmlzQW5zd2VyZWQpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gIShjZWxsLmhhc1F1ZXN0aW9uIHx8IGNlbGwuaGFzVGl0bGUgfHwgKHRoaXMuaXNNdWx0aXBsZSAmJiAodGhpcy5oYXNEZXRhaWxQYW5lbCA/IGluZGV4ID09IDEgOiBpbmRleCA9PSAwKSkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvd0xvY2F0aW9uKHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KSB7XG4gICAgICAgIHJldHVybiByb3cgPT09IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5oZWFkZXJSb3cgPyAnaGVhZGVyJyA6ICh0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuZm9vdGVyUm93ID09PSByb3cgPyAnZm9vdGVyJyA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd0hvcmlzb250YWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIGNvbHVtbldpZHRoOiBudW1iZXJbXSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCBsYXN0UmlnaHRNYXJnaW46IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBsZXQgY250ID0gMDtcbiAgICAgICAgY29uc3Qgcm93TG9jYXRpb24gPSB0aGlzLmdldFJvd0xvY2F0aW9uKHJvdyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDZWxsKHJvdy5jZWxsc1tpXSwgaSwgcm93TG9jYXRpb24pKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGxhc3RSaWdodE1hcmdpbiArXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbHVtbldpZHRoW2NudF07XG4gICAgICAgICAgICBsYXN0UmlnaHRNYXJnaW4gPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBjZWxsQ29udGVudDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKFxuICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3dMb2NhdGlvbik7XG4gICAgICAgICAgICBpZiAoIWNlbGxDb250ZW50LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soY2VsbENvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY250Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dMb2NhdGlvbiA9IHRoaXMuZ2V0Um93TG9jYXRpb24ocm93KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2VsbChyb3cuY2VsbHNbaV0sIGksIHJvd0xvY2F0aW9uLCBmYWxzZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5zaG93SGVhZGVyICYmICghdGhpcy5pc011bHRpcGxlIHx8IGkgPiAwKSAmJiByb3cuY2VsbHNbaV0uY2VsbD8uY29sdW1uPy5sb2NUaXRsZSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsVGl0bGUoY3VyclBvaW50LCByb3cuY2VsbHNbaV0uY2VsbC5jb2x1bW4ubG9jVGl0bGUpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3dMb2NhdGlvbiwgZmFsc2UpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0QXZhbGFibGVXaWR0aChjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtXG4gICAgICAgIChjb2xDb3VudCAtIDEpICogdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgIH1cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLCBjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aDogbnVtYmVyID0gdGhpcy5nZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50KTtcbiAgICAgICAgbGV0IHJlbWFpbldpZHRoOiBudW1iZXIgPSBhdmFpbGFibGVXaWR0aDtcbiAgICAgICAgbGV0IHJlbWFpbkNvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGg6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHVuc2V0Q2VsbHM6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxbXSA9IFtdO1xuICAgICAgICBsZXQgY2VsbHMgPSByb3dzWzBdLmNlbGxzLmZpbHRlcigoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgaW5kZXg6IG51bWJlcikgPT4gIXRoaXMuaWdub3JlQ2VsbChjZWxsLCBpbmRleCkpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGNlbGxzW2ldLndpZHRoLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gd2lkdGg7XG4gICAgICAgICAgICBpZiAod2lkdGggIT09IDAuMCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuc2V0Q2VsbHMucHVzaChjZWxsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2x1bW5XaWR0aC5wdXNoKHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVtYWluQ29sQ291bnQgPT09IDApIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaGV1cmlzdGljV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIHVuc2V0Q2VsbHMuc29ydCgoY2VsbDE6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGNlbGwyOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWluV2lkdGgxID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbDEubWluV2lkdGgsIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgbGV0IG1pbldpZHRoMiA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGNlbGwyLm1pbldpZHRoLCBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIHJldHVybiBtaW5XaWR0aDIgPiBtaW5XaWR0aDEgPyAxIDogLTE7XG4gICAgICAgIH0pLmZvckVhY2goKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsV2lkdGg6IG51bWJlciA9IHJlbWFpbldpZHRoIC8gcmVtYWluQ29sQ291bnQ7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5NaW5XaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbC5taW5XaWR0aCwgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICBpZihjb2x1bW5NaW5XaWR0aCA+IGVxdWFsV2lkdGggJiYgY29sdW1uTWluV2lkdGggPiBoZXVyaXN0aWNXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbldpZHRoIC09IGNvbHVtbk1pbldpZHRoO1xuICAgICAgICAgICAgICAgIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2x1bW5XaWR0aFtjZWxscy5pbmRleE9mKGNlbGwpXSA9IE1hdGgubWF4KGhldXJpc3RpY1dpZHRoLCBjb2x1bW5NaW5XaWR0aCwgZXF1YWxXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVPbmVSb3cocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIGlzV2lkZTogYm9vbGVhbiwgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBpZiAoaXNXaWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludCwgcm93LCBjb2x1bW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd1ZlcnRpY2FsKHBvaW50LCByb3cpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dzKHBvaW50OiBJUG9pbnQsIHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb3dGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzW2ldLFxuICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgaWYgKHJvd0ZsYXQuaXNFbXB0eSAmJiAhKHJvd3NbaV0ucm93ICYmIHJvd3NbaV0ucm93Lmhhc1BhbmVsKSkgY29udGludWU7XG4gICAgICAgICAgICBpZighcm93RmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gocm93RmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dGbGF0LnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISFyb3dzW2ldLnJvdyAmJiByb3dzW2ldLnJvdy5oYXNQYW5lbCkge1xuICAgICAgICAgICAgICAgIHJvd3NbaV0ucm93LnNob3dEZXRhaWxQYW5lbCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZXRhaWxQYW5lbDogUGFuZWxNb2RlbCA9IHJvd3NbaV0ucm93LmRldGFpbFBhbmVsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3VycmVudERldGFpbFBhbmVsLnF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zW2pdLmlkICs9ICdfJyArIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsQnJpY2tzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjdXJyZW50RGV0YWlsUGFuZWwsIGN1cnJQb2ludCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyQ29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgIGN1cnJDb21wb3NpdGUuYWRkQnJpY2soLi4ucGFuZWxCcmlja3MpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY3VyckNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcblxuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGN1cnJDb21wb3NpdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEgJiYgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgaXNXaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcjogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlT25lUm93KGN1cnJQb2ludCwgcm93c1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycllUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFoZWFkZXIuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycllUb3AgPSBoZWFkZXIueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyWVRvcCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlSXNXaWRlKHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBpZih0YWJsZS5zaG93SGVhZGVyKSB7XG4gICAgICAgICAgICByb3dzLnB1c2godGFibGUuaGVhZGVyUm93KTtcbiAgICAgICAgfVxuICAgICAgICByb3dzLnB1c2goLi4udGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIGlmKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGhTdW0gPSB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KS5yZWR1Y2UoKHdpZHRoU3VtOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpID0+IHdpZHRoU3VtICs9IHdpZHRoLCAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgIT09ICdsaXN0JyAmJiB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgIT09ICdsaXN0JyAmJiBNYXRoLmZsb29yKGNvbHVtbldpZHRoU3VtKSA8PSBNYXRoLmZsb29yKHRoaXMuZ2V0QXZhbGFibGVXaWR0aChjb2xDb3VudCkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvd3NUb1JlbmRlcih0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsIGlzVmVydGljYWw6IGJvb2xlYW4sIGlzV2lkZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBjb25zdCByZW5kZXJlZFJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgICBpZiAodGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICByb3dzLnB1c2goLi4ucmVuZGVyZWRSb3dzKTtcbiAgICAgICAgaWYgKHRhYmxlLmhhc1JlbW92ZVJvd3MgJiYgaXNWZXJ0aWNhbCkgcm93cy5wb3AoKTtcbiAgICAgICAgaWYgKHRhYmxlLnNob3dGb290ZXIpIHJvd3MucHVzaCh0YWJsZS5mb290ZXJSb3cpO1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRDb2xDb3VudCh0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsIHJlbmRlcmVkUm93czogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93Pik6IG51bWJlciB7XG4gICAgICAgIGlmICghIXJlbmRlcmVkUm93c1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVkUm93c1swXS5jZWxscy5maWx0ZXIoKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGluZGV4OiBudW1iZXIpID0+ICF0aGlzLmlnbm9yZUNlbGwoY2VsbCwgaW5kZXgpKS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFibGUuc2hvd0hlYWRlciAmJiB0YWJsZS5oZWFkZXJSb3cgPyB0YWJsZS5oZWFkZXJSb3cuY2VsbHMubGVuZ3RoIDpcbiAgICAgICAgICAgICAgICB0YWJsZS5zaG93Rm9vdGVyICYmIHRhYmxlLmZvb3RlclJvdyA/IHRhYmxlLmZvb3RlclJvdy5jZWxscy5sZW5ndGggOiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUgPSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGU7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5MYXlvdXQgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICAgIGxldCBjb2xDb3VudDogbnVtYmVyID0gdGhpcy5nZXRDb2xDb3VudCh0YWJsZSwgdGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PT0gMCAmJiAhdGhpcy5oYXNEZXRhaWxQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgQ29tcG9zaXRlQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNXaWRlID0gdGhpcy5jYWxjdWxhdGVJc1dpZGUodGFibGUsIGNvbENvdW50KTtcbiAgICAgICAgaWYoIWlzV2lkZSkge1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc01vYmlsZSA9IHRydWU7XG4gICAgICAgICAgICBpc1ZlcnRpY2FsID0gZmFsc2U7XG4gICAgICAgICAgICB0YWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbENvdW50ID0gdGhpcy5nZXRDb2xDb3VudCh0YWJsZSwgdGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93c1RvUmVuZGVyKHRhYmxlLCBpc1ZlcnRpY2FsLCBpc1dpZGUpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93cyhwb2ludCwgcm93cywgY29sQ291bnQsIGlzV2lkZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHJvcGRvd24nLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ2xpc3QnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtYXRyaXhkcm9wZG93bicsIEZsYXRNYXRyaXhNdWx0aXBsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJpbXBvcnQgSW50ZXJ2YWxUcmVlIGZyb20gJ25vZGUtaW50ZXJ2YWwtdHJlZSc7XG5pbXBvcnQgeyBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmludGVyZmFjZSBQYWNrSW50ZXJ2YWwge1xuICAgIHBhZ2VJbmRleDogbnVtYmVyO1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIGFic0JvdDogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIFBhZ2VQYWNrZXIge1xuICAgIHByaXZhdGUgc3RhdGljIGZpbmRCb3RJbnRlcnZhbCh0cmVlOiBJbnRlcnZhbFRyZWU8UGFja0ludGVydmFsPixcbiAgICAgICAgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IERvY09wdGlvbnMpOiBQYWNrSW50ZXJ2YWwge1xuICAgICAgICBjb25zdCBpbnRlcnZhbHM6IFBhY2tJbnRlcnZhbFtdID0gdHJlZS5zZWFyY2goeExlZnQsIHhSaWdodCk7XG4gICAgICAgIGludGVydmFscy5wdXNoKHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogMCwgeExlZnQ6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXJnaW5zLmxlZnQsIHhSaWdodDogb3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5Qm90OiBvcHRpb25zLm1hcmdpbnMudG9wLCBhYnNCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3BcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbHMucmVkdWNlKChteCwgY3IpID0+IHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjci54UmlnaHQgLSB4TGVmdCkgPCBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fFxuICAgICAgICAgICAgICAgIE1hdGguYWJzKGNyLnhMZWZ0IC0geFJpZ2h0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OKSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4IDwgbXgucGFnZUluZGV4KSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4ID4gbXgucGFnZUluZGV4KSByZXR1cm4gY3I7XG4gICAgICAgICAgICByZXR1cm4gY3IueUJvdCA+IG14LnlCb3QgPyBjciA6IG14O1xuICAgICAgICB9LCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkUGFjayhwYWNrczogSVBkZkJyaWNrW11bXSwgaW5kZXg6IG51bWJlciwgYnJpY2s6IElQZGZCcmljaykge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBwYWNrcy5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICAgICAgcGFja3MucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFja3NbaW5kZXhdLnB1c2goYnJpY2spO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHBhY2soZmxhdHM6IElQZGZCcmlja1tdW10sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUGRmQnJpY2tbXVtdIHtcbiAgICAgICAgY29uc3QgcGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtXG4gICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMudG9wIC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgY29uc3QgdW5mb2xkRmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgZmxhdHMuZm9yRWFjaCgoZmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHMucHVzaChbXSk7XG4gICAgICAgICAgICBmbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXQuaGVpZ2h0ID4gcGFnZUhlaWdodCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuZm9sZEZsYXRzW3VuZm9sZEZsYXRzLmxlbmd0aCAtIDFdLnB1c2goLi4uZmxhdC51bmZvbGQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaChmbGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLnNvcnQoKGE6IElQZGZCcmljaywgYjogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA8IGIueVRvcCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIGlmIChhLnlUb3AgPiBiLnlUb3ApIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIGlmIChhLnhMZWZ0ID4gYi54TGVmdCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPCBiLnhMZWZ0KSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwYWdlSW5kZXhNb2RlbDogbnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgcGFja3M6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFnZUJvdDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3Q7XG4gICAgICAgIHVuZm9sZEZsYXRzLmZvckVhY2goKHVuZm9sZEZsYXRzUGFnZTogSVBkZkJyaWNrW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+ID0gbmV3IEludGVydmFsVHJlZSgpO1xuICAgICAgICAgICAgbGV0IHBhZ2VJbmRleFNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLmZvckVhY2goKGZsYXQ6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IHBhZ2VJbmRleCwgeUJvdCwgYWJzQm90IH0gPSBQYWdlUGFja2VyLmZpbmRCb3RJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgdHJlZSwgZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gZmxhdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZmxhdC55VG9wID0geUJvdCArIGZsYXQueVRvcCAtIGFic0JvdDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZmxhdC55VG9wIC0gY29udHJvbGxlci5tYXJnaW5zLnRvcCkgPiBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiAmJlxuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgKyBoZWlnaHQgPiBwYWdlQm90ICsgU3VydmV5SGVscGVyLkVQU0lMT04gfHwgZmxhdC5pc1BhZ2VCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4U2hpZnQgPSBNYXRoLm1heChwYWdlSW5kZXhTaGlmdCwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJlZS5pbnNlcnQoZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBmbGF0LnhMZWZ0LCB4UmlnaHQ6IGZsYXQueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBmbGF0LnlUb3AgKyBoZWlnaHQsIGFic0JvdDogZmxhdC55Qm90XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmxhdC55Qm90ID0gZmxhdC55VG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICAgIFBhZ2VQYWNrZXIuYWRkUGFjayhwYWNrcywgcGFnZUluZGV4TW9kZWwgKyBwYWdlSW5kZXgsIGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYWdlSW5kZXhNb2RlbCArPSBwYWdlSW5kZXhTaGlmdCArIDE7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFja3M7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5JdGVtQnJpY2sgZXh0ZW5kcyBDaGVja0l0ZW1CcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5pZCxcbiAgICAgICAgICAgIHsgcXVlc3Rpb246IHF1ZXN0aW9uLCByZWFkT25seTogcXVlc3Rpb24uaXNSZWFkT25seSwgY2hlY2tlZDogKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikuY2hlY2tlZFZhbHVlIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2JveEl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihjb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlkICsgJ2luZGV4JyArIGluZGV4LFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJlYWRPbmx5OiBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZCwgaXRlbTogaXRlbSwgY2hlY2tlZDogKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlzSXRlbVNlbGVjdGVkKGl0ZW0pLCBpbmRleDogaW5kZXggfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIENvbW1lbnRCcmljayBleHRlbmRzIFRleHRCb3hCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXNRdWVzdGlvbjogYm9vbGVhbiwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIHRydWUsIGluZGV4KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZih0aGlzLmlzUXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgIT09ICdjb21tZW50JykgcmV0dXJuIHN1cGVyLnNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCk7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlID09PSAndGV4dGFyZWEnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBEcm9wZG93bkJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29tYm9Cb3ggPSBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybUNvbWJvQm94KSgpO1xuICAgICAgICBjb21ib0JveC5maWVsZE5hbWUgPSB0aGlzLnF1ZXN0aW9uLmlkO1xuICAgICAgICBjb21ib0JveC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcyxcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcykpKTtcbiAgICAgICAgY29tYm9Cb3guZWRpdCA9IGZhbHNlO1xuICAgICAgICBjb21ib0JveC5jb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLmdldENvcnJlY3RlZFRleHQodGhpcy5xdWVzdGlvbi5vcHRpb25zQ2FwdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaCgoaXRlbTogSXRlbVZhbHVlKSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy5nZXRDb3JyZWN0ZWRUZXh0KFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoaXRlbS5sb2NUZXh0KSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tYm9Cb3guc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29tYm9Cb3guZm9udE5hbWUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgIGNvbWJvQm94LmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgY29tYm9Cb3gucmVhZE9ubHkgPSB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgICAgIGNvbWJvQm94LmlzVW5pY29kZSA9IFN1cnZleUhlbHBlci5pc0N1c3RvbUZvbnQoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbWJvQm94LmZvbnROYW1lKTtcbiAgICAgICAgY29tYm9Cb3guViA9IHRoaXMuZ2V0Q29ycmVjdGVkVGV4dChTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjb21ib0JveCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuXG5leHBvcnQgY2xhc3MgSFRNTEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBodG1sOiBzdHJpbmcsIGlzSW1hZ2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLjAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLjBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5mcm9tSFRNTCh0aGlzLmh0bWwsIHRoaXMueExlZnQsIHRoaXMueVRvcCwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLCBwYWdlc3BsaXQ6IHRydWUsXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2pzLXBkZi1oaWRkZW4taHRtbC1kaXYnKSkuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHRoaXMubWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUG9pbnQgfSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcm90ZWN0ZWQgaW1hZ2U6IHN0cmluZyxcbiAgICAgICAgcG9pbnQ6IElQb2ludCwgcHJvdGVjdGVkIG9yaWdpbmFsV2lkdGg6IG51bWJlciwgcHJvdGVjdGVkIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcG9pbnQueExlZnQgKyAob3JpZ2luYWxXaWR0aCB8fCAwKSxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AsXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgKG9yaWdpbmFsSGVpZ2h0IHx8IDApXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzUGFnZUJyZWFrID0gdGhpcy5vcmlnaW5hbEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkSW1hZ2UodGhpcy5pbWFnZSwgJ1BORycsIHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy5vcmlnaW5hbFdpZHRoLCB0aGlzLm9yaWdpbmFsSGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgTGlua0JyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ0FMRV9GQUNUT1JfTUFHSUM6IG51bWJlciA9IDAuOTU1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09MT1I6IHN0cmluZyA9ICcjMDAwMEVFJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodGV4dEZsYXQ6IFRleHRCcmljaywgcHJvdGVjdGVkIGxpbms6IHN0cmluZykge1xuICAgICAgICBzdXBlcigoPExpbmtCcmljaz50ZXh0RmxhdCkucXVlc3Rpb24sXG4gICAgICAgICAgICAoPExpbmtCcmljaz50ZXh0RmxhdCkuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRleHRGbGF0LCAoPExpbmtCcmljaz50ZXh0RmxhdCkudGV4dCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gTGlua0JyaWNrLkNPTE9SO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgbGV0IGRlc2NlbnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICh0aGlzLmNvbnRyb2xsZXIuZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKSAtXG4gICAgICAgICAgICAgICAgTGlua0JyaWNrLlNDQUxFX0ZBQ1RPUl9NQUdJQyk7XG4gICAgICAgIGxldCB5VG9wTGluazogbnVtYmVyID0gdGhpcy55VG9wICtcbiAgICAgICAgICAgICh0aGlzLnlCb3QgLSB0aGlzLnlUb3ApIC0gZGVzY2VudDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0V2l0aExpbmsodGhpcy50ZXh0LCB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgeVRvcExpbmssIHsgdXJsOiB0aGlzLmxpbmsgfSk7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhZGlvZ3JvdXBXcmFwQ29udGV4dCB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICByZWFkT25seTogYm9vbGVhbjtcbn1cbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwV3JhcCB7XG4gICAgcHJpdmF0ZSBfcmFkaW9Hcm91cDogYW55O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dDogSVJhZGlvZ3JvdXBXcmFwQ29udGV4dCkge1xuICAgIH1cbiAgICBwdWJsaWMgYWRkVG9QZGYoY29sb3I6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwID0gbmV3IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1SYWRpb0J1dHRvbigpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWVsZE5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSB0aGlzLnJlYWRPbmx5O1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gY29sb3I7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgKDxTdXJ2ZXlQREY+dGhpcy5jb250ZXh0LnF1ZXN0aW9uLnN1cnZleSk/LmdldFVwZGF0ZWRSYWRpb0dyb3VwV3JhcE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuZmllbGROYW1lID0gb3B0aW9ucy5maWVsZE5hbWU7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAucmVhZE9ubHkgPSBvcHRpb25zLnJlYWRPbmx5O1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcblxuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQodGhpcy5fcmFkaW9Hcm91cCk7XG4gICAgfVxuICAgIGdldCByYWRpb0dyb3VwKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWRpb0dyb3VwO1xuICAgIH1cbiAgICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVhZE9ubHk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSYWRpb0dyb3VwSXRlbUJyaWNrQ29udGV4dCB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgaXRlbTogSXRlbVZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgUmFkaW9JdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnbCc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMCAtICgoMi4wICsgTWF0aC5FKSAvIDEwLjApO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBjb250ZXh0OiBJUmFkaW9Hcm91cEl0ZW1Ccmlja0NvbnRleHQsXG4gICAgICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQucXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhZGlvR3JvdXBXcmFwLnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScgfHwgdGhpcy5jb250cm9sbGVyLmNvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5kZXggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5hZGRUb1BkZih0aGlzLmZvcm1Cb3JkZXJDb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgIG9wdGlvbnMuZmllbGROYW1lID0gdGhpcy5yYWRpb0dyb3VwV3JhcC5uYW1lICsgJ2luZGV4JyArIHRoaXMuY29udGV4dC5pbmRleDtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBvcHRpb25zLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgb3B0aW9ucy5jb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgICAgICBvcHRpb25zLmFwcGVhcmFuY2UgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtLkFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlO1xuICAgICAgICBvcHRpb25zLnJhZGlvR3JvdXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXA7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICAoPFN1cnZleVBERj50aGlzLmNvbnRleHQucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZFJhZGlvSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgbGV0IHJhZGlvQnV0dG9uOiBhbnkgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAuY3JlYXRlT3B0aW9uKG9wdGlvbnMuZmllbGROYW1lKTtcblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGlmKCFvcHRpb25zLkFTKSB7XG4gICAgICAgICAgICAgICAgcmFkaW9CdXR0b24uQVMgPSAnLycgKyBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCF0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKCFvcHRpb25zLkFTKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5BUyA9ICcvT2ZmJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByYWRpb0J1dHRvbi5SZWN0ID0gb3B0aW9ucy5SZWN0O1xuICAgICAgICByYWRpb0J1dHRvbi5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG5cbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5zZXRBcHBlYXJhbmNlKFxuICAgICAgICAgICAgb3B0aW9ucy5hcHBlYXJhbmNlXG4gICAgICAgICk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgcmFkaW9tYXJrZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9GT05UO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGxldCByYWRpb21hcmtlclNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCk7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSByYWRpb21hcmtlclNpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnlUb3AgKz0gdGhpcy5oZWlnaHQgLyAyLjAgLSByYWRpb21hcmtlclNpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9TWU1CT0wsIFRleHRCcmljayk7XG4gICAgICAgICAgICAoPGFueT5yYWRpb21hcmtlckZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgYXdhaXQgcmFkaW9tYXJrZXJGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgbWFyazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgY29uc3QgbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICpcbiAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IG1hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLm1hcmspO1xuICAgICAgICBtYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIG1hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICBtYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIG1hcmtTaXplLmhlaWdodCAvIDIuMDtcbiAgICAgICAgY29uc3QgbWFya0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIG1hcmtQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLm1hcmssIFRleHRCcmljayk7XG4gICAgICAgICg8YW55Pm1hcmtGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGF3YWl0IG1hcmtGbGF0LnJlbmRlcigpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsLCBzZXR0aW5ncyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4vcGRmX2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RmllbGRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4sXG4gICAgICAgIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBwbGFjZWhvbGRlcjogc3RyaW5nLCBwdWJsaWMgaXNSZWFkT25seTogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuLCBwcm90ZWN0ZWQgaW5wdXRUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIHJlbmRlckNvbG9yUXVlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMucXVlc3Rpb24udmFsdWUgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RmllbGQ6IGFueSA9IHRoaXMuaW5wdXRUeXBlID09PSAncGFzc3dvcmQnID9cbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZCkoKSA6XG4gICAgICAgICAgICBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVRleHRGaWVsZCkoKTtcbiAgICAgICAgaW5wdXRGaWVsZC5maWVsZE5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGlucHV0RmllbGQuaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgaW5wdXRGaWVsZC5mb250TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSAhPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5WID0gJyAnICsgdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5EViA9ICcgJyArIHRoaXMuZ2V0Q29ycmVjdGVkVGV4dCh0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlucHV0RmllbGQudmFsdWUgPSAnJztcbiAgICAgICAgaW5wdXRGaWVsZC5tdWx0aWxpbmUgPSB0aGlzLmlzTXVsdGlsaW5lO1xuICAgICAgICBpbnB1dEZpZWxkLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgICAgICBpbnB1dEZpZWxkLmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGxldCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaW5wdXRGaWVsZC5tYXhGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZSAqIGZvcm1TY2FsZTtcbiAgICAgICAgaW5wdXRGaWVsZC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoaW5wdXRGaWVsZCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZWFkT25seVRleHRSZW5kZXJNb2RlID09PSAnaW5wdXQnO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgICBwcml2YXRlIF90ZXh0QnJpY2s6IElQZGZCcmljaztcbiAgICBwdWJsaWMgZ2V0IHRleHRCcmljaygpOiBJUGRmQnJpY2sge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEJyaWNrO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHRleHRCcmljayh2YWw6IElQZGZCcmljaykge1xuICAgICAgICB0aGlzLl90ZXh0QnJpY2sgPSB2YWw7XG4gICAgICAgIGNvbnN0IHVuRm9sZGVkQnJpY2tzID0gdmFsLnVuZm9sZCgpO1xuICAgICAgICBjb25zdCBicmlja3NDb3VudCA9IHVuRm9sZGVkQnJpY2tzLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbmRlcmVkQnJpY2tzQ291bnQgPSAwO1xuICAgICAgICBjb25zdCBicmlja3NCeVBhZ2U6IHsgW2luZGV4OiBudW1iZXJdOiBBcnJheTxQZGZCcmljaz4gfSA9IHt9O1xuICAgICAgICBjb25zdCBhZnRlclJlbmRlclRleHRCcmlja0NhbGxiYWNrID0gKGJyaWNrOiBQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5zaG91bGRSZW5kZXJGbGF0Qm9yZGVycygpKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRCcmlja3NDb3VudCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmdldEN1cnJlbnRQYWdlSW5kZXgoKTtcbiAgICAgICAgICAgICAgICBpZighYnJpY2tzQnlQYWdlW2N1cnJlbnRQYWdlTnVtYmVyXSkge1xuICAgICAgICAgICAgICAgICAgICBicmlja3NCeVBhZ2VbY3VycmVudFBhZ2VOdW1iZXJdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyaWNrc0J5UGFnZVtjdXJyZW50UGFnZU51bWJlcl0ucHVzaChicmljayk7XG4gICAgICAgICAgICAgICAgaWYocmVuZGVyZWRCcmlja3NDb3VudCA+PSBicmlja3NDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYnJpY2tzQnlQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRPbk9uZVBhZ2UgPSBrZXlzLmxlbmd0aCA9PSAxO1xuICAgICAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJpY2tzQnlQYWdlW2tleSBhcyBhbnldLmZvckVhY2goKGJyaWNrOiBQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUJyaWNrLmFkZEJyaWNrKGJyaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSZWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhMZWZ0OiB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhSaWdodDogdGhpcy54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVRvcDogcmVuZGVyZWRPbk9uZVBhZ2UgPyB0aGlzLnlUb3AgOiBjb21wb3NpdGVCcmljay55VG9wIC0gcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Qm90OiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMueUJvdCA6IGNvbXBvc2l0ZUJyaWNrLnlCb3QgKyBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcmVuZGVyZWRPbk9uZVBhZ2UgPyB0aGlzLmhlaWdodCA6IGNvbXBvc2l0ZUJyaWNrLmhlaWdodCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Cb3JkZXJDb2xvcjogdGhpcy5mb3JtQm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBhZ2UoTnVtYmVyKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgYm9yZGVyUmVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdW5Gb2xkZWRCcmlja3MuZm9yRWFjaCgoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay5hZnRlclJlbmRlckNhbGxiYWNrID0gYWZ0ZXJSZW5kZXJUZXh0QnJpY2tDYWxsYmFjay5iaW5kKHRoaXMsIGJyaWNrKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMueExlZnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbG9yUXVlc3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGV4dEJyaWNrLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICBpZiAodGhpcy5nZXRTaG91bGRSZW5kZXJSZWFkT25seSgpICYmIHRoaXMuaW5wdXRUeXBlICE9PSAnY29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0QnJpY2sudW5mb2xkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudW5mb2xkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHRyYW5zbGF0ZVgoZnVuYzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGZ1bmModGhpcy54TGVmdCwgdGhpcy54UmlnaHQpO1xuICAgICAgICB0aGlzLl94TGVmdCA9IHJlcy54TGVmdDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gcmVzLnhSaWdodDtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnRyYW5zbGF0ZVgoZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhMZWZ0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feExlZnQ7XG4gICAgICAgIHN1cGVyLnNldFhMZWZ0KHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay54TGVmdCA9IHRoaXMudGV4dEJyaWNrLnhMZWZ0ICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhSaWdodCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3hSaWdodDtcbiAgICAgICAgc3VwZXIuc2V0WFJpZ2h0KHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay54UmlnaHQgPSB0aGlzLnRleHRCcmljay54UmlnaHQgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WVRvcCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3lUb3A7XG4gICAgICAgIHN1cGVyLnNldFlUb3AodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnlUb3AgPSB0aGlzLnRleHRCcmljay55VG9wICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlCb3R0b20odmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB2YWwgLSB0aGlzLl95Qm90O1xuICAgICAgICBzdXBlci5zZXRZQm90dG9tKHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay55Qm90ID0gdGhpcy50ZXh0QnJpY2sueUJvdCArIGRlbHRhO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBUaXRsZVBhbmVsQnJpY2sgZXh0ZW5kcyBUZXh0Qm9sZEJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRm9udFNpemUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogU3VydmV5SGVscGVyLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBQYW5lbE1vZGVsLCBQYWdlTW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHBvaW50OiBJUG9pbnQ7XG4gICAgcHVibGljIGJyaWNrczogSVBkZkJyaWNrW107XG4gICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXI7XG4gICAgcHVibGljIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5O1xuICAgIHB1YmxpYyBtb2R1bGU6IGFueTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5wb2ludCA9IHBvaW50O1xuICAgICAgICB0aGlzLmJyaWNrcyA9IGJyaWNrcztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb247XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYW5lbE9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHBhbmVsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzUGFnZU9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFnZTogUGFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwYWdlOiBQYWdlTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uQm9vbGVhbk1vZGVsLCBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgU3VydmV5TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcblxuZXhwb3J0IGNsYXNzIEZsYXRCb29sZWFuQ2hlY2tib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Cb29sZWFuTW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBuZXcgQm9vbGVhbkl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgaGVpZ2h0LCBoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KSk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBsb2NMYWJlbFRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5pc0luZGV0ZXJtaW5hdGUgPyBudWxsIDpcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlID8gdGhpcy5xdWVzdGlvbi5sb2NMYWJlbFRydWUgOiB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsRmFsc2U7XG4gICAgICAgIGlmIChsb2NMYWJlbFRleHQgIT09IG51bGwgJiYgbG9jTGFiZWxUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGxvY0xhYmVsVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVGbGF0XTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW4gZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJpdmF0ZSBpdGVtczogQXJyYXk8SXRlbVZhbHVlPjtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmJ1aWxkSXRlbXMoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBidWlsZEl0ZW1zKCkge1xuICAgICAgICBjb25zdCBxdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD4oPGFueT50aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgY29uc3QgZmFsc2VDaG9pY2UgPSBuZXcgSXRlbVZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZCA/ICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlRmFsc2UgOiBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHRydWVDaG9pY2UgPSBuZXcgSXRlbVZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlVHJ1ZSAhPT0gdW5kZWZpbmVkID8gKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVUcnVlIDogdHJ1ZSk7XG4gICAgICAgIGZhbHNlQ2hvaWNlLmxvY093bmVyID0gcXVlc3Rpb247XG4gICAgICAgIGZhbHNlQ2hvaWNlLnNldExvY1RleHQoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikubG9jTGFiZWxGYWxzZSk7XG4gICAgICAgIHRydWVDaG9pY2UubG9jT3duZXIgPSBxdWVzdGlvbjtcbiAgICAgICAgdHJ1ZUNob2ljZS5zZXRMb2NUZXh0KCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmxvY0xhYmVsVHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbZmFsc2VDaG9pY2UsIHRydWVDaG9pY2VdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuJywgRmxhdEJvb2xlYW4pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYm9vbGVhbi1jaGVja2JveCcsIEZsYXRCb29sZWFuQ2hlY2tib3gpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwsIFF1ZXN0aW9uVGFnYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgRmxhdENoZWNrYm94IGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LCBpdGVtLCBpbmRleCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZsYXRUYWdib3ggZXh0ZW5kcyBGbGF0Q2hlY2tib3gge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UYWdib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRhZ2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIGlmKHRoaXMuY29udHJvbGxlci50YWdib3hTZWxlY3RlZENob2ljZXNPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5zZWxlY3RlZENob2ljZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3RhZ2JveCcsIEZsYXRUYWdib3gpO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY2hlY2tib3gnLCBGbGF0Q2hlY2tib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNvbW1lbnRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRDb21tZW50IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ29tbWVudE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ29tbWVudE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHJvd3M6IHRoaXMucXVlc3Rpb24ucm93cyB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjb21tZW50JywgRmxhdENvbW1lbnQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ3VzdG9tTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdEN1c3RvbU1vZGVsIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdCA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgcmV0dXJuIGZsYXQuZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY3VzdG9tX21vZGVsJywgRmxhdEN1c3RvbU1vZGVsKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRHJvcGRvd25CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdERyb3Bkb3duIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUJyaWNrID0gIXRoaXMuc2hvdWxkUmVuZGVyQXNDb21tZW50ID8gbmV3IERyb3Bkb3duQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKSkgOiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdHJ1ZSwgeyB2YWx1ZTogU3VydmV5SGVscGVyLmdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZSh0aGlzLnF1ZXN0aW9uKSB9KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodmFsdWVCcmljayk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZHJvcGRvd24nLCBGbGF0RHJvcGRvd24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RXhwcmVzc2lvbiBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdHJ1ZSwgeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWUsIHJlYWRPbmx5OiB0cnVlIH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2V4cHJlc3Npb24nLCBGbGF0RXhwcmVzc2lvbik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25GaWxlTW9kZWwsIHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRGaWxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElNQUdFX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4xOTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBURVhUX01JTl9TQ0FMRTogbnVtYmVyID0gNS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9JTUFHRV9GSVQ6IHN0cmluZyA9ICdjb250YWluJztcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25GaWxlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplLFxuICAgIH0pOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlTGlua0ZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLm5hbWUgPT09IHVuZGVmaW5lZCA/ICdpbWFnZScgOiBpdGVtLm5hbWUsIGl0ZW0uY29udGVudCkpO1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBpbWFnZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0RmlsZS5JTUFHRV9HQVBfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoaW1hZ2VQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IGl0ZW0uY29udGVudCwgd2lkdGg6IGl0ZW0uaW1hZ2VTaXplLndpZHRoLCBoZWlnaHQ6IGl0ZW0uaW1hZ2VTaXplLmhlaWdodCwgb2JqZWN0Rml0OiBGbGF0RmlsZS5ERUZBVUxUX0lNQUdFX0ZJVCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYWRkTGluZShyb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10sIGN1cnJQb2ludDogSVBvaW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbWFnZVByZXZpZXdDb250ZW50V2lkdGgoaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpbWFnZVNpemU/OiBJU2l6ZSB9KSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChpdGVtLmltYWdlU2l6ZS53aWR0aCwgRmxhdEZpbGUuVEVYVF9NSU5fU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5ub0ZpbGVDaG9zZW5DYXB0aW9uLCBUZXh0QnJpY2spXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpbWFnZVNpemU/OiBJU2l6ZSB9ID0geyAuLi50aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXSB9O1xuICAgICAgICAgICAgY29uc3QgY2FuUHJldmlld0ltYWdlID0gU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKGNhblByZXZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uaW1hZ2VTaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZSh0aGlzLmNvbnRyb2xsZXIsIHsgaW1hZ2VXaWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgaW1hZ2VMaW5rOiB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXS5jb250ZW50LCBkZWZhdWx0SW1hZ2VXaWR0aDogMjAwLCBkZWZhdWx0SW1hZ2VIZWlnaHQ6IDE1MCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICBpZiAoY2FuUHJldmlld0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGggPSBhd2FpdCB0aGlzLmdldEltYWdlUHJldmlld0NvbnRlbnRXaWR0aChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCBjb21wb3NpdGVXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoY3VyclBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGN1cnJQb2ludC54TGVmdCAtIGNvbXBvc2l0ZVdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LndpZHRoO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdpZHRoIDwgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LnhSaWdodCAtIGl0ZW1GbGF0LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdmaWxlJywgRmxhdEZpbGUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSHRtbE1vZGVsLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcblxuZXhwb3J0IHR5cGUgSUhUTUxSZW5kZXJUeXBlID0gJ2F1dG8nIHwgJ3N0YW5kYXJkJyB8ICdpbWFnZSc7XG5leHBvcnQgY2xhc3MgRmxhdEhUTUwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25IdG1sTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaG9vc2VSZW5kZXIoaHRtbDogc3RyaW5nKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgaWYgKC88W14+XSpzdHlsZVtePF0qPi8udGVzdChodG1sKSB8fFxuICAgICAgICAgICAgLzxbXj5dKnRhYmxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvJlxcdys7Ly50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3N0YW5kYXJkJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb3JyZWN0SHRtbFJ1bGVzOiBbeyBzZWFyY2hSZWdFeHA6IFJlZ0V4cCwgcmVwbGFjZVN0cmluZzogc3RyaW5nIH1dID0gW1xuICAgICAgICB7IHNlYXJjaFJlZ0V4cDogLyg8XFwvP2JyXFxzKj9cXC8/XFxzKj8+XFxzKil7Mix9L2csIHJlcGxhY2VTdHJpbmc6ICc8YnI+JyB9XG4gICAgXVxuICAgIHByb3RlY3RlZCBjb3JyZWN0SHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBGbGF0SFRNTC5jb3JyZWN0SHRtbFJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UocnVsZS5zZWFyY2hSZWdFeHAsIHJ1bGUucmVwbGFjZVN0cmluZyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlID0gPElIVE1MUmVuZGVyVHlwZT50aGlzLnF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZighU3VydmV5SGVscGVyLmhhc0RvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBFbXB0eUJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCAwLCAwKSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY29udHJvbGxlci5odG1sUmVuZGVyQXM7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY2hvb3NlUmVuZGVyKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NIdG1sKSk7XG4gICAgICAgIGNvbnN0IGh0bWw6IHN0cmluZyA9IFN1cnZleUhlbHBlci5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2soU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpLCB0aGlzLmNvbnRyb2xsZXIsIHJlbmRlckFzKTtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgeyB1cmwsIGFzcGVjdCB9OiB7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9ID1cbiAgICAgICAgICAgIGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShodG1sLCB3aWR0aCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gd2lkdGggLyBhc3BlY3Q7XG4gICAgICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB1cmwsIHdpZHRoLCBoZWlnaHQgfSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbU3VydmV5SGVscGVyLnNwbGl0SHRtbFJlY3QodGhpcy5jb250cm9sbGVyLCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLmNvcnJlY3RIdG1sKGh0bWwpKSldO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnaHRtbCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnaHRtbCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnc3RhbmRhcmQnLCAnaW1hZ2UnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdodG1sJywgRmxhdEhUTUwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSW1hZ2VNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIsIElTaXplIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2UgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25JbWFnZU1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdldENvcnJlY3RJbWFnZVNpemUoKTogUHJvbWlzZTxJU2l6ZT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZSh0aGlzLmNvbnRyb2xsZXIsIHsgaW1hZ2VXaWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgaW1hZ2VMaW5rOiB0aGlzLnF1ZXN0aW9uLmltYWdlTGluayB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGF3YWl0IHRoaXMuZ2V0Q29ycmVjdEltYWdlU2l6ZSgpO1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5xdWVzdGlvbi5pbWFnZUxpbmssIHdpZHRoOiBpbWFnZVNpemUud2lkdGgsIGhlaWdodDogaW1hZ2VTaXplLmhlaWdodCB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZScsIEZsYXRJbWFnZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2VQaWNrZXIgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsO1xuICAgIHByb3RlY3RlZCByYWRpbzogRmxhdFJhZGlvZ3JvdXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWdlQXZhaWxhYmxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGltYWdlRmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiAoPGFueT5pdGVtKS5pbWFnZUxpbmssIHdpZHRoOiBwYWdlQXZhaWxhYmxlV2lkdGgsIGhlaWdodDogcGFnZUF2YWlsYWJsZVdpZHRoIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX1JBVElPIH0pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhpbWFnZUZsYXQpO1xuICAgICAgICBsZXQgYnV0dG9uUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uc2hvd0xhYmVsKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoYnV0dG9uUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS50ZXh0IHx8IGl0ZW0udmFsdWUsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGxhYmVsRmxhdCk7XG4gICAgICAgICAgICBidXR0b25Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChsYWJlbEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvblJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoYnV0dG9uUG9pbnQsIHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobmV3IENoZWNrSXRlbUJyaWNrKHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBidXR0b25SZWN0LCB0aGlzLnF1ZXN0aW9uLmlkICsgJ2luZGV4JyArIGluZGV4LCB7IHJlYWRPbmx5OiB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLCBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbiwgaXRlbTogaXRlbSwgY2hlY2tlZDogdGhpcy5xdWVzdGlvbi52YWx1ZS5pbmRleE9mKGl0ZW0udmFsdWUpICE9PSAtMSwgaW5kZXg6IGluZGV4IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5yYWRpby5nZW5lcmF0ZUZsYXRJdGVtKGJ1dHRvblJlY3QsIGl0ZW0sIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLnJhZGlvID0gdGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCA/IG51bGwgOlxuICAgICAgICAgICAgbmV3IEZsYXRSYWRpb2dyb3VwKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjb2xXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldEltYWdlUGlja2VyQXZhaWxhYmxlV2lkdGgoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX0NPVU5UO1xuICAgICAgICBsZXQgY29sczogbnVtYmVyID0gfn4oU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyBjb2xXaWR0aCkgfHwgMTtcbiAgICAgICAgY29uc3QgY291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgICAgICBjb2xzID0gY29scyA8PSBjb3VudCA/IGNvbHMgOiBjb3VudDtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyID0gfn4oTWF0aC5jZWlsKGNvdW50IC8gY29scykpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgbGV0IGN1cnJNYXJnaW5MZWZ0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBpICogY29scyArIGo7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGNvdW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3Vyck1hcmdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGN1cnJNYXJnaW5MZWZ0IC0gY29sV2lkdGg7XG4gICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgIGlmIChpICE9PSByb3dzIC0gMSkge1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaW1hZ2VwaWNrZXInLCBGbGF0SW1hZ2VQaWNrZXIpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ltYWdlcGlja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeE1vZGVsLCBNYXRyaXhSb3dNb2RlbCxcbiAgICBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgSXRlbVZhbHVlLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElQb2ludCwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD5xdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLnJvd1RpdGxlV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLSB0aGlzLmNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnNbaV0ubG9jVGV4dCkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29sdW1uV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5oZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgaXNWZXJ0aWNhbDogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9ICdyb3cnICsgaTtcbiAgICAgICAgICAgIGNvbnN0IGZsYXRzUm93OiBJUGRmQnJpY2tbXSA9IGF3YWl0IG5ldyBGbGF0TWF0cml4Um93KHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c1tpXSwgaSwga2V5LCBpID09IDAsIGlzVmVydGljYWwsIHRoaXMucm93VGl0bGVXaWR0aCwgdGhpcy5jb2x1bW5XaWR0aCkuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1JvdykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjZWxscy5wdXNoKC4uLmZsYXRzUm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuICAgIHByaXZhdGUgcm93VGl0bGVXaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY29sdW1uV2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbnNXaWR0aGVzKCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5oYXNSb3dzICYmIHRoaXMucXVlc3Rpb24ucm93VGl0bGVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1RpdGxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLnJvd1RpdGxlV2lkdGgsIGF2YWlsYWJsZVdpZHRoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gKHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbldpZHRoID0gU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPSB0aGlzLnJvd1RpdGxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgPyAxIDogMCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbnNXaWR0aGVzKCk7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLnJlbmRlckFzID09PSAnbGlzdCcgfHwgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzID09PSAnbGlzdCcgfHxcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgaWYgKCFpc1ZlcnRpY2FsICYmIHRoaXMucXVlc3Rpb24uc2hvd0hlYWRlciAmJiB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVyczogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIZWFkZXIoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5oZWFkZXJzKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uaGVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKGN1cnJQb2ludCwgaXNWZXJ0aWNhbCkpO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeFJvdyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25NYXRyaXg6IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByaXZhdGUgcm93OiBNYXRyaXhSb3dNb2RlbCwgcHJpdmF0ZSByb3dJbmRleDogbnVtYmVyLFxuICAgICAgICBwcml2YXRlIGtleTogc3RyaW5nLCBwcm90ZWN0ZWQgaXNGaXJzdDogYm9vbGVhbiA9IGZhbHNlLCBwcm90ZWN0ZWQgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlLCBwcml2YXRlIHJvd1RpdGxlV2lkdGg6IG51bWJlciwgcHJpdmF0ZSBjb2x1bW5XaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4ID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsID9cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludCkgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSk7XG4gICAgICAgIGN1cnJQb2ludC55VG9wID0gcmFkaW9GbGF0LnlCb3QgKyB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGNlbGxUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXguZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHRoaXMucm93Lm5hbWUsIGNvbHVtbiksIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2socmFkaW9GbGF0LCBjZWxsVGV4dEZsYXQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVJdGVtQ29tcG9pc3RlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGl0ZW1SZWN0LnhMZWZ0KSwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSk7XG4gICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHJhZGlvRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgcmFkaW9UZXh0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb2x1bW4ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIHJhZGlvVGV4dCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQ6IElQb2ludCkge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSAoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC0gdGhpcy5yb3dUaXRsZVdpZHRoKTtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLnJvd1RpdGxlV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW46IEl0ZW1WYWx1ZSA9IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtIHRoaXMuY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpIHtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKGN1cnJQb2ludCwgY29sdW1uLCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCh0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGN1cnJQb2ludC54TGVmdCksIGNvbHVtbiwgaSwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29sdW1uV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmNlbGxzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dUZXh0RmxhdC55Qm90ICsgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2gocm93VGV4dEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlID0gKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpID8gdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUgOiB0aGlzLmdlbmVyYXRlSXRlbUNvbXBvaXN0ZTtcbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucykpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXgnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeCcsIEZsYXRNYXRyaXgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuL2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeER5bmFtaWMgZXh0ZW5kcyBGbGF0TWF0cml4TXVsdGlwbGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgZmFsc2UpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGR5bmFtaWMnLCBGbGF0TWF0cml4RHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCwgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiwgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuL2ZsYXRfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TXVsdGlwbGVUZXh0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJPV1NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZ2V0Um93cygpLmZpbHRlcihyb3cgPT4gcm93LmlzVmlzaWJsZSk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCByb3dfaW5kZXg6IG51bWJlciwgY29sX2luZGV4OiBudW1iZXIsXG4gICAgICAgIGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb2xXaWR0aCAqIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5sb2NUaXRsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuXG4gICAgICAgIGNvbnN0IGZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LCBpdGVtLmVkaXRvciwgdGhpcy5jb250cm9sbGVyLCAndGV4dCcpO1xuICAgICAgICBjb25zdCBpdGVtUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlMsIHlUb3A6IHBvaW50LnlUb3AgfSxcbiAgICAgICAgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayguLi5hd2FpdCAoPEZsYXRUZXh0Ym94PmZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb24pLmdlbmVyYXRlRmxhdHNDb250ZW50KGl0ZW1Qb2ludCkpO1xuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uY29sQ291bnQsIGopO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpLCBqLCByb3dzW2ldLmNlbGxzW2pdLml0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TXVsdGlwbGVUZXh0LlJPV1NfR0FQX1NDQUxFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtdWx0aXBsZXRleHQnLCBGbGF0TXVsdGlwbGVUZXh0KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UGFuZWxEeW5hbWljIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9QQU5FTFM6IG51bWJlciA9IDAuNzU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWwgb2YgdGhpcy5xdWVzdGlvbi5wYW5lbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgcGFuZWwsIGN1cnJQb2ludCk7XG4gICAgICAgICAgICBpZiAocGFuZWxGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnBhbmVsRmxhdHMpLnlCb3Q7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UGFuZWxEeW5hbWljLkdBUF9CRVRXRUVOX1BBTkVMUztcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLnBhbmVsRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3BhbmVsZHluYW1pYycsIEZsYXRQYW5lbER5bmFtaWMpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBDb2xvcmVkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb2xvcmVkYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhbmtpbmcgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYW5raW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyLCB1bnJhbmtlZEl0ZW06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtU2NhbGVkUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgIGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBSYW5raW5nSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIGl0ZW1TY2FsZWRSZWN0LCB1bnJhbmtlZEl0ZW0gPyAnLScgOiB0aGlzLnF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soaXRlbUZsYXQsIHRleHRGbGF0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ2hvaWNlc0NvbHVtbihwb2ludDogSVBvaW50LCBjaG9pY2VzOiBJdGVtVmFsdWVbXSwgdW5yYW5rZWRDaG9pY2VzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBjaG9pY2VzW2ldLCBpLCB1bnJhbmtlZENob2ljZXMpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90ICsgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goaXRlbUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNWZXJ0aWNhbGx5KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdCArIDIgKiAoU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICB5VG9wOiBjdXJyUG9pbnQueVRvcCAtIChTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSAtIDAuNSxcbiAgICAgICAgfSwgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdCwgMSk7XG4gICAgICAgIGZsYXRzLnB1c2gobmV3IENvbG9yZWRCcmljayh0aGlzLmNvbnRyb2xsZXIsIHNlcGFyYXRvclJlY3QsIFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUikpO1xuXG4gICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUNob2ljZXNDb2x1bW4oY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uLnVuUmFua2luZ0Nob2ljZXMsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTZWxlY3RUb1JhbmtJdGVtc0hvcml6b250YWxseShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb2xDb3VudCA9IDI7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHJvd3NDb3VudCA9IE1hdGgubWF4KHRoaXMucXVlc3Rpb24udW5SYW5raW5nQ2hvaWNlcy5sZW5ndGgsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3NDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29sSW5kZXggPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBbdGhpcy5xdWVzdGlvbi51blJhbmtpbmdDaG9pY2VzW2ldLCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmKCEhaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBjb2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgaXRlbSwgaSwgY29sSW5kZXggPT0gMCk7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChyb3cpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgZmxhdHMucHVzaChyb3csIHJvd0xpbmVGbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvclJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdCh7XG4gICAgICAgICAgICAgICAgeExlZnQ6IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKyBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyAyIC0gMC41LFxuICAgICAgICAgICAgICAgIHlUb3A6IGN1cnJQb2ludC55VG9wLFxuICAgICAgICAgICAgfSwgMCwgMCk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2sobmV3IENvbG9yZWRCcmljayh0aGlzLmNvbnRyb2xsZXIsIHNlcGFyYXRvclJlY3QsIFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUiwgMSwgcm93TGluZUZsYXQueUJvdCAtIGN1cnJQb2ludC55VG9wICsgKGkgIT09IHJvd3NDb3VudCAtIDEgP1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgOiAwKSkpO1xuXG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICByb3cgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZighdGhpcy5xdWVzdGlvbi5zZWxlY3RUb1JhbmtFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNob2ljZXNDb2x1bW4ocG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5xdWVzdGlvbi5zZWxlY3RUb1JhbmtBcmVhc0xheW91dCA9PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zVmVydGljYWxseShwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zSG9yaXpvbnRhbGx5KHBvaW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmFua2luZycsIEZsYXRSYW5raW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYXRpbmcgZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uUmF0aW5nOiBRdWVzdGlvblJhdGluZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nID0gPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRIb3Jpc29udGFsQ29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoIC8gMi4wO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gaGFsZldpZHRoO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdCh0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb25SYXRpbmcsIHRoaXMuY29udHJvbGxlciwgaXRlbVRleHQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgbGV0IHRleHRXaWR0aDogbnVtYmVyID0gY29tcG9zaXRlRmxhdC53aWR0aDtcbiAgICAgICAgaWYgKHRleHRXaWR0aCA8IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LnhMZWZ0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgoXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAtIHRleHRXaWR0aCkgLyAyLjAgLSBoYWxmV2lkdGg7XG4gICAgICAgICAgICB0ZXh0V2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHRXaWR0aCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhZGlvUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgcmFkaW9Qb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChcbiAgICAgICAgICAgIHJhZGlvUG9pbnQsIHRleHRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpLCBpdGVtLCBpbmRleCwgdW5kZWZpbmVkLCB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgsIHVuZGVmaW5lZCwgdGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dCh0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpbmRleCwgaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgaXRlbVRleHQgPT0gbnVsbCB8fCBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0V2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKSA8PSBsZWZ0V2lkdGggKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaSwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXS5sb2NUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoaXRlbVRleHQpLndpZHRoID4gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5SQVRJTkdfQ09MVU1OX1dJRFRIKS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGlzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcykgOiB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmF0aW5nJywgRmxhdFJhdGluZyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciwgSVJlY3QsIElTaXplIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IElCb3JkZXJEZXNjcmlwdGlvbiwgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFNpZ25hdHVyZVBhZCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NUWUxFOiAnZGFzaGVkJyB8ICdzb2xpZCcgfCAnbm9uZScgPSAnZGFzaGVkJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlQmFja2dyb3VuZEltYWdlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IHRoaXMucXVlc3Rpb24uYmFja2dyb3VuZEltYWdlLCB3aWR0aDogU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlV2lkdGgpLCBoZWlnaHQ6IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZUhlaWdodCksIG9iamVjdEZpdDogJ2NvdmVyJyB9LCB0cnVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTaWduSW1hZ2VVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnN0b3JlRGF0YUFzVGV4dCB8fCAhdGhpcy5xdWVzdGlvbi5sb2FkZWREYXRhID8gdGhpcy5xdWVzdGlvbi52YWx1ZSA6IHRoaXMucXVlc3Rpb24ubG9hZGVkRGF0YTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlU2lnbihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5zaWduYXR1cmVXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZUhlaWdodCk7XG4gICAgICAgIGxldCBicmljazogUGRmQnJpY2s7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24udmFsdWUpIHtcbiAgICAgICAgICAgIGJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5nZXRTaWduSW1hZ2VVcmwoKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCB9LCBmYWxzZVxuICAgICAgICAgICAgKSBhcyBQZGZCcmljaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyaWNrID0gbmV3IEVtcHR5QnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZihGbGF0U2lnbmF0dXJlUGFkLkJPUkRFUl9TVFlMRSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBicmljay5hZnRlclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlck9wdGlvbnM6IElCb3JkZXJEZXNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBicmljay53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJyaWNrLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB5VG9wOiBicmljay55VG9wLFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBicmljay55Qm90LFxuICAgICAgICAgICAgICAgICAgICB4TGVmdDogYnJpY2sueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHhSaWdodDogYnJpY2sueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBmb3JtQm9yZGVyQ29sb3I6IGJyaWNrLmZvcm1Cb3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgcm91bmRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRhc2hTdHlsZTogRmxhdFNpZ25hdHVyZVBhZC5CT1JERVJfU1RZTEUgPT0gJ2Rhc2hlZCcgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXk6IFs1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hQaGFzZTogMFxuICAgICAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCBib3JkZXJPcHRpb25zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYnJpY2s7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uYmFja2dyb3VuZEltYWdlKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVCcmljay5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlQmFja2dyb3VuZEltYWdlKHBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zaXRlQnJpY2suYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZVNpZ24ocG9pbnQpKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmlja107XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdzaWduYXR1cmVwYWQnLCBGbGF0U2lnbmF0dXJlUGFkKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFRleHRib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVDogbnVtYmVyID0gMTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyQXNDb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVGV4dEJveEJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHJvd3M6IEZsYXRUZXh0Ym94Lk1VTFRJTElORV9URVhUX1JPV1NfQ09VTlQgfSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGV4dCcsIEZsYXRUZXh0Ym94KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcblxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuXG4gICAgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByZW5kZXJGdW5jOiAoZG9jOiBhbnksIHF1ZXN0aW9uOiBhbnksIHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlcikgPT4gSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlbmRlckZ1bmMoY29udHJvbGxlci5oZWxwZXJEb2MsIHF1ZXN0aW9uLCAwLCAwKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRnVuYyh0aGlzLmNvbnRyb2xsZXIuZG9jLCB0aGlzLnF1ZXN0aW9uLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3ApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2N1c3RvbS50cyIsImltcG9ydCB7IFN1cnZleU1vZGVsLCBRdWVzdGlvbiwgRXZlbnRCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0ICogYXMgU3VydmV5Q29yZSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBFdmVudEFzeW5jLCBFdmVudEhhbmRsZXIgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucywgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBUaGUgYFN1cnZleVBERmAgb2JqZWN0IGVuYWJsZXMgeW91IHRvIGV4cG9ydCB5b3VyIHN1cnZleXMgYW5kIGZvcm1zIHRvIFBERiBkb2N1bWVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVBERiBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBjdXJyZW50bHlTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHN0YXRpYyBzYXZlUXVldWU6IGFueVtdID0gW107XG4gICAgcHVibGljIG9wdGlvbnM6IElEb2NPcHRpb25zO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihqc29uT2JqZWN0OiBhbnksIG9wdGlvbnM/OiBJRG9jT3B0aW9ucykge1xuICAgICAgICBzdXBlcihqc29uT2JqZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGYgPSBTdXJ2ZXlDb3JlLmhhc0xpY2Vuc2U7XG4gICAgICAgIHJldHVybiAhIWYgJiYgZigyKTtcbiAgICB9XG4gICAgcHVibGljIHNldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FzIG9mIHYxLjkuMTAxLCB0aGUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuIFRvIGFjdGl2YXRlIHlvdXIgbGljZW5zZSwgdXNlIHRoZSBzZXRMaWNlbnNlS2V5KGtleSkgbWV0aG9kIGFzIHNob3duIG9uIHRoZSBmb2xsb3dpbmcgcGFnZTogaHR0cHM6Ly9zdXJ2ZXlqcy5pby9yZW1vdmUtYWxlcnQtYmFubmVyJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZSBoZWFkZXIuIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSB0aGUgaGVhZGVyLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBjYW52YXNgOiBbYERyYXdDYW52YXNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RyYXdjYW52YXMpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY3VzdG9taXplLWhlYWRlci1hbmQtZm9vdGVyLW9mLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJIZWFkZXI6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHBhZ2UgZm9vdGVyLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgdGhlIGZvb3Rlci5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgY2FudmFzYDogW2BEcmF3Q2FudmFzYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kcmF3Y2FudmFzKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gZHJhdyB0ZXh0IGFuZCBpbWFnZXMgaW4gdGhlIHBhZ2UgZm9vdGVyLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2N1c3RvbWl6ZS1oZWFkZXItYW5kLWZvb3Rlci1vZi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyRm9vdGVyOiBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIERyYXdDYW52YXM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBzdXJ2ZXkgcXVlc3Rpb24uIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSBxdWVzdGlvbiByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucXVlc3Rpb25gOiBbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcXG4gICAgICogQSBzdXJ2ZXkgcXVlc3Rpb24gdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUXVlc3Rpb246IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc09wdGlvbnM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc09wdGlvbnM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYW5lbC4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHBhbmVsIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wYW5lbGA6IFtgUGFuZWxNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wYW5lbC1tb2RlbClcXFxuICAgICAqIEEgcGFuZWwgdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFuZWw6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhbmVsT3B0aW9ucz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFuZWxPcHRpb25zPigpO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZS4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHBhZ2UgcmVuZGVyaW5nLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBhZ2VgOiBbYFBhZ2VNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wYWdlLW1vZGVsKVxcXG4gICAgICogQSBwYWdlIHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBvaW50YDogYElQb2ludGBcXFxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQgYmVpbmcgcmVuZGVyZWQuIFRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczogYHsgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyIH1gLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5icmlja3NgOiBbYFBkZkJyaWNrW11gXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BkZmJyaWNrKVxcXG4gICAgICogQW4gYXJyYXkgb2YgW2JyaWNrc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vY3VzdG9taXplLXN1cnZleS1xdWVzdGlvbi1yZW5kZXJpbmctaW4tcGRmLWZvcm0jY3VzdG9tLXJlbmRlcmluZykgdXNlZCB0byByZW5kZXIgdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmNvbnRyb2xsZXJgOiBbYERvY0NvbnRyb2xsZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RvY2NvbnRyb2xsZXIpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gbWFpbiBQREYgZG9jdW1lbnQgcHJvcGVydGllcyAoZm9udCwgbWFyZ2lucywgcGFnZSB3aWR0aCBhbmQgaGVpZ2h0KSBhbmQgYWxsb3dzIHlvdSB0byBtb2RpZnkgdGhlbS5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucmVwb3NpdG9yeWA6IGBGbGF0UmVwb3NpdG9yeWBcXFxuICAgICAqIEEgcmVwb3NpdG9yeSB3aXRoIGNsYXNzZXMgdGhhdCByZW5kZXIgZWxlbWVudHMgdG8gUERGLiBVc2UgaXRzIGBjcmVhdGVgIG1ldGhvZCBpZiB5b3UgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZW5kZXJpbmcgY2xhc3MuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvaG93LXRvLXVzZS1hZG9ybmVycy1pbi1wZGYtZm9ybXMvIChsaW5rU3R5bGUpKVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlclBhZ2U6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhZ2VPcHRpb25zPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgQWRvcm5lcnNQYWdlT3B0aW9ucz4oKTtcblxuICAgIHB1YmxpYyBvbkRvY0NvbnRyb2xsZXJDcmVhdGVkOiBFdmVudEJhc2U8U3VydmV5UERGLCB7IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgfT4gPSBuZXcgRXZlbnRCYXNlPFN1cnZleVBERiwge2NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXJ9PigpO1xuXG4gICAgcHVibGljIG9uUmVuZGVyQ2hlY2tJdGVtQWNyb2Zvcm06IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJSYWRpb0dyb3VwV3JhcEFjcm9mb3JtOiBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PiA9XG4gICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJSYWRpb0l0ZW1BY3JvZm9ybTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4gPVxuICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PigpO1xuXG4gICAgcHJpdmF0ZSB3YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrOiAoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiB2b2lkID1cbiAgICAgICAgICAgICAgICAoXywgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9uUmVhZHlDaGFuZ2VkLnJlbW92ZShyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQuYWRkKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQ29yZUlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKCEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q6IFF1ZXN0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICAoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsLmFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlubmVyUXVlc3Rpb24gb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoaW5uZXJRdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbig8UXVlc3Rpb24+cXVlc3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0VXBkYXRlZENoZWNrSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlbmRlckNoZWNrSXRlbUFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkUmFkaW9Hcm91cFdyYXBPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyUmFkaW9Hcm91cFdyYXBBY3JvZm9ybS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VXBkYXRlZFJhZGlvSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlbmRlclJhZGlvSXRlbUFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHByaXZhdGUgY29ycmVjdEJyaWNrc1Bvc2l0aW9uKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXRzOiBJUGRmQnJpY2tbXVtdKSB7XG4gICAgICAgIGlmKGNvbnRyb2xsZXIuaXNSVEwpIHtcbiAgICAgICAgICAgIGZsYXRzLmZvckVhY2goZmxhdHNBcnIgPT4ge1xuICAgICAgICAgICAgICAgIGZsYXRzQXJyLmZvckVhY2goZmxhdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQudHJhbnNsYXRlWCgoeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0V2lkdGggPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSB4TGVmdCAtIHhSaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHhMZWZ0OiB4TGVmdCArIHNoaWZ0V2lkdGgsIHhSaWdodDogeFJpZ2h0ICsgc2hpZnRXaWR0aCB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyByZW5kZXJTdXJ2ZXkoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnZpc2libGVQYWdlcy5mb3JFYWNoKHBhZ2UgPT4gcGFnZS5vbkZpcnN0UmVuZGVyaW5nKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JDb3JlSXNSZWFkeSgpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0cyh0aGlzLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0QnJpY2tzUG9zaXRpb24oY29udHJvbGxlciwgZmxhdHMpO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFBhZ2VQYWNrZXIucGFjayhmbGF0cywgY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IEV2ZW50SGFuZGxlci5wcm9jZXNzX2hlYWRlcl9ldmVudHModGhpcywgY29udHJvbGxlciwgcGFja3MpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBwYWNrc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmdldE51bWJlck9mUGFnZXMoKSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRQYWdlKGkpO1xuICAgICAgICAgICAgICAgIC8vZ2l6bW9zIGJyaWNrcyBib3JkZXJzIGZvciBkZWJ1Z1xuICAgICAgICAgICAgICAgIC8vIHBhY2tzW2ldW2pdLnVuZm9sZCgpLmZvckVhY2goKHJlY3Q6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoJ2dyZWVuJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4uU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignYmxhY2snKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhY2tzW2ldW2pdLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFzeW5jaHJvbm91cyBtZXRob2QgdGhhdCBzdGFydHMgZG93bmxvYWQgb2YgdGhlIGdlbmVyYXRlZCBQREYgZmlsZSBpbiB0aGUgd2ViIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZU5hbWUgKihPcHRpb25hbCkqIEEgZmlsZSBuYW1lIHdpdGggdGhlIFwiLnBkZlwiIGV4dGVuc2lvbi4gRGVmYXVsdCB2YWx1ZTogYFwic3VydmV5X3Jlc3VsdC5wZGZcImAuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNhdmUoZmlsZU5hbWU6IHN0cmluZyA9ICdzdXJ2ZXlfcmVzdWx0LnBkZicpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZighU3VydmV5UERGLmN1cnJlbnRseVNhdmluZykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLm9uRG9jQ29udHJvbGxlckNyZWF0ZWQuZmlyZSh0aGlzLCB7IGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIgfSk7XG4gICAgICAgICAgICBTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5maXhGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gY29udHJvbGxlci5kb2Muc2F2ZShmaWxlTmFtZSwgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSBTdXJ2ZXlQREYuc2F2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYoISFzYXZlRnVuYykge1xuICAgICAgICAgICAgICAgICAgICBzYXZlRnVuYygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTdXJ2ZXlQREYuc2F2ZVF1ZXVlLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZShmaWxlTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhc3luY2hyb25vdXMgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBnZXQgUERGIGNvbnRlbnQgaW4gZGlmZmVyZW50IGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY29udmVydC1wZGYtZm9ybS1ibG9iLWJhc2U2NC1yYXctcGRmLWphdmFzY3JpcHQvIChsaW5rU3R5bGUpKVxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgKihPcHRpb25hbCkqIE9uZSBvZiBgXCJibG9iXCJgLCBgXCJibG9idXJsXCJgLCBgXCJkYXRhdXJsc3RyaW5nXCJgLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBnZXQgcmF3IFBERiBjb250ZW50IGFzIGEgc3RyaW5nIHZhbHVlLlxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJhdyh0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMub25Eb2NDb250cm9sbGVyQ3JlYXRlZC5maXJlKHRoaXMsIHsgY29udHJvbGxlcjogY29udHJvbGxlciB9KTtcbiAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyU3VydmV5KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2Mub3V0cHV0KHR5cGUpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXkudHMiLCJcInVzZSBzdHJpY3RcIjtcclxuLy8gQW4gYXVnbWVudGVkIEFWTCBUcmVlIHdoZXJlIGVhY2ggbm9kZSBtYWludGFpbnMgYSBsaXN0IG9mIHJlY29yZHMgYW5kIHRoZWlyIHNlYXJjaCBpbnRlcnZhbHMuXHJcbi8vIFJlY29yZCBpcyBjb21wb3NlZCBvZiBhbiBpbnRlcnZhbCBhbmQgaXRzIHVuZGVybHlpbmcgZGF0YSwgc2VudCBieSBhIGNsaWVudC4gVGhpcyBhbGxvd3MgdGhlXHJcbi8vIGludGVydmFsIHRyZWUgdG8gaGF2ZSB0aGUgc2FtZSBpbnRlcnZhbCBpbnNlcnRlZCBtdWx0aXBsZSB0aW1lcywgYXMgbG9uZyBpdHMgZGF0YSBpcyBkaWZmZXJlbnQuXHJcbi8vIEJvdGggaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiByZXF1aXJlIE8obG9nIG4pIHRpbWUuIFNlYXJjaGluZyByZXF1aXJlcyBPKGsqbG9nbikgdGltZSwgd2hlcmUgYGtgXHJcbi8vIGlzIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzIGluIHRoZSBvdXRwdXQgbGlzdC5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgaXNTYW1lID0gcmVxdWlyZShcInNoYWxsb3dlcXVhbFwiKTtcclxuZnVuY3Rpb24gaGVpZ2h0KG5vZGUpIHtcclxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XHJcbiAgICB9XHJcbn1cclxudmFyIE5vZGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBOb2RlKGludGVydmFsVHJlZSwgcmVjb3JkKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUgPSBpbnRlcnZhbFRyZWU7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRzID0gW107XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMua2V5ID0gcmVjb3JkLmxvdztcclxuICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIC8vIFNhdmUgdGhlIGFycmF5IG9mIGFsbCByZWNvcmRzIHdpdGggdGhlIHNhbWUga2V5IGZvciB0aGlzIG5vZGVcclxuICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xyXG4gICAgfVxyXG4gICAgLy8gR2V0cyB0aGUgaGlnaGVzdCByZWNvcmQuaGlnaCB2YWx1ZSBmb3IgdGhpcyBub2RlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5nZXROb2RlSGlnaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGlnaCA9IHRoaXMucmVjb3Jkc1swXS5oaWdoO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZHNbaV0uaGlnaCA+IGhpZ2gpIHtcclxuICAgICAgICAgICAgICAgIGhpZ2ggPSB0aGlzLnJlY29yZHNbaV0uaGlnaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGlnaDtcclxuICAgIH07XHJcbiAgICAvLyBVcGRhdGVzIGhlaWdodCB2YWx1ZSBvZiB0aGUgbm9kZS4gQ2FsbGVkIGR1cmluZyBpbnNlcnRpb24sIHJlYmFsYW5jZSwgcmVtb3ZhbFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0KHRoaXMubGVmdCksIGhlaWdodCh0aGlzLnJpZ2h0KSkgKyAxO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgdGhlIG1heCB2YWx1ZSBvZiBhbGwgdGhlIHBhcmVudHMgYWZ0ZXIgaW5zZXJ0aW5nIGludG8gYWxyZWFkeSBleGlzdGluZyBub2RlLCBhcyB3ZWxsIGFzXHJcbiAgICAvLyByZW1vdmluZyB0aGUgbm9kZSBjb21wbGV0ZWx5IG9yIHJlbW92aW5nIHRoZSByZWNvcmQgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBub2RlLiBTdGFydHMgd2l0aFxyXG4gICAgLy8gdGhlIHBhcmVudCBvZiBhbiBhZmZlY3RlZCBub2RlIGFuZCBidWJibGVzIHVwIHRvIHJvb3RcclxuICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZU1heE9mUGFyZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLnJpZ2h0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgTGVmdC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgICAgIHkgICBUNCAgICAgIFJpZ2h0IFJvdGF0ZSAoeikgICAgICAgICAgeCAgICAgelxyXG4gICAgICAgIC8gXFwgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAgIC8gXFwgICAvIFxcXHJcbiAgICAgICB4ICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgIC8gXFxcclxuICAgIFQxICAgVDJcclxuICBcclxuICAgIExlZnQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgIHkgICBUNCAgTGVmdCBSb3RhdGUgKHkpICAgICAgICAgeCAgVDQgIFJpZ2h0IFJvdGF0ZSh6KSAgICAgeSAgICAgelxyXG4gICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgIFQxICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgIFQzICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcXHJcbiAgICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDJcclxuICAgICovXHJcbiAgICAvLyBIYW5kbGVzIExlZnQtTGVmdCBjYXNlIGFuZCBMZWZ0LVJpZ2h0IGNhc2UgYWZ0ZXIgcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgbGVmdCA9IHBhcmVudC5sZWZ0O1xyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgbGVmdCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50TGVmdEhpZ2ggPSBsZWZ0LmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgIT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50TGVmdEhpZ2gsIGxlZnQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSB0aGlzUGFyZW50TGVmdEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KGxlZnQubGVmdC5tYXgsIGxlZnQucmlnaHQubWF4KSwgdGhpc1BhcmVudExlZnRIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBpdHNlbGYgKHopXHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBwYXJlbnQgKHkgaW4gZmlyc3QgY2FzZSwgeCBpbiBzZWNvbmQpXHJcbiAgICAgICAgcGFyZW50Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHBhcmVudC5sZWZ0Lm1heCwgcGFyZW50LnJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgUmlnaHQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgIFQxICB5ICAgICBMZWZ0IFJvdGF0ZSh6KSAgICAgICB6ICAgICB4XHJcbiAgICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgVDIgIHggICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAgLyBcXFxyXG4gICAgICAgIFQzIFQ0XHJcbiAgXHJcbiAgICBSaWdodC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgIFQxICB5ICAgUmlnaHQgUm90YXRlICh5KSAgICAgVDEgIHggICAgICBMZWZ0IFJvdGF0ZSh6KSAgIHogICAgIHlcclxuICAgICAgICAvIFxcICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggIFQ0ICAgICAgICAgICAgICAgICAgICAgICAgVDIgIHkgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICBUMyBUNFxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgUmlnaHQtUmlnaHQgY2FzZSBhbmQgUmlnaHQtTGVmdCBjYXNlIGluIHJlYmFsYW5jaW5nIEFWTCB0cmVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fdXBkYXRlTWF4QWZ0ZXJMZWZ0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgcmlnaHQgPSBwYXJlbnQucmlnaHQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiByaWdodCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50UmlnaHRIaWdoID0gcmlnaHQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAocmlnaHQubGVmdCA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmlnaHQubGVmdCAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSB0aGlzUGFyZW50UmlnaHRIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocmlnaHQubGVmdC5tYXgsIHJpZ2h0LnJpZ2h0Lm1heCksIHRoaXNQYXJlbnRSaWdodEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCByaWdodC5tYXgpLCBwYXJlbnQuZ2V0Tm9kZUhpZ2goKSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX2xlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJpZ2h0Q2hpbGQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKHJpZ2h0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50LnJpZ2h0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHRDaGlsZC5sZWZ0O1xyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByaWdodENoaWxkLmxlZnQgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBsZWZ0Q2hpbGQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgbGVmdENoaWxkLnBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnRDaGlsZC5yaWdodDtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxlZnRDaGlsZC5yaWdodCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICBsZWZ0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgLy8gUmViYWxhbmNlcyB0aGUgdHJlZSBpZiB0aGUgaGVpZ2h0IHZhbHVlIGJldHdlZW4gdHdvIG5vZGVzIG9mIHRoZSBzYW1lIHBhcmVudCBpcyBncmVhdGVyIHRoYW5cclxuICAgIC8vIHR3by4gVGhlcmUgYXJlIDQgY2FzZXMgdGhhdCBjYW4gaGFwcGVuIHdoaWNoIGFyZSBvdXRsaW5lZCBpbiB0aGUgZ3JhcGhpY3MgYWJvdmVcclxuICAgIE5vZGUucHJvdG90eXBlLl9yZWJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGhlaWdodCh0aGlzLmxlZnQpID49IDIgKyBoZWlnaHQodGhpcy5yaWdodCkpIHtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQobGVmdC5sZWZ0KSA+PSBoZWlnaHQobGVmdC5yaWdodCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIExlZnQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICBsZWZ0Ll9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlaWdodCh0aGlzLnJpZ2h0KSA+PSAyICsgaGVpZ2h0KHRoaXMubGVmdCkpIHtcclxuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChyaWdodC5yaWdodCkgPj0gaGVpZ2h0KHJpZ2h0LmxlZnQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSaWdodC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LUxlZnQgY2FzZVxyXG4gICAgICAgICAgICAgICAgcmlnaHQuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byBsZWZ0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byByaWdodCBzdWJ0cmVlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXggdmFsdWUgb2YgdGhpcyBhbmNlc3RvciBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodGhpcy5tYXggPCByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgaGVpZ2h0IG9mIGVhY2ggbm9kZVxyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gUmViYWxhbmNlIHRoZSB0cmVlIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gTyhsb2duKSB0aW1lLiBUaGlzIGlzIGVzcGVjaWFsbHlcclxuICAgICAgICAvLyBpbXBvcnRhbnQgaW4gc2VhcmNoaW5nLCBhcyB0aGUgdHJlZSBoYXMgYSBoaWdoIGNoYW5jZSBvZiBkZWdlbmVyYXRpbmcgd2l0aG91dCB0aGUgcmViYWxhbmNpbmdcclxuICAgICAgICB0aGlzLl9yZWJhbGFuY2UoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlLCBsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAoY3VycmVudE5vZGUua2V5IDw9IGhpZ2ggJiYgbG93IDw9IGN1cnJlbnROb2RlLmdldE5vZGVIaWdoKCkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIG92ZXJsYXBwaW5nLCBjaGVjayBpZiBpbmRpdmlkdWFsIHJlY29yZHMgaW4gdGhlIG5vZGUgYXJlIG92ZXJsYXBwaW5nXHJcbiAgICAgICAgICAgIHZhciB0ZW1wUmVzdWx0cyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldLmhpZ2ggPj0gbG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcFJlc3VsdHMucHVzaChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGVtcFJlc3VsdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgLy8gRG9uJ3Qgc2VhcmNoIG5vZGVzIHRoYXQgZG9uJ3QgZXhpc3RcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxlZnRTZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgb3duU2VhcmNoID0gW107XHJcbiAgICAgICAgdmFyIHJpZ2h0U2VhcmNoID0gW107XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgcG9pbnQgb2YgYW55IGludGVydmFsIGluIHRoaXMgbm9kZSBhbmQgYWxsIGl0c1xyXG4gICAgICAgIC8vIGNoaWxkcmVuLCB0aGVyZSB3b24ndCBiZSBhbnkgbWF0Y2hlc1xyXG4gICAgICAgIGlmIChsb3cgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlYXJjaCBsZWZ0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGVmdC5tYXggPj0gbG93KSB7XHJcbiAgICAgICAgICAgIGxlZnRTZWFyY2ggPSB0aGlzLmxlZnQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIHRoaXMgbm9kZVxyXG4gICAgICAgIG93blNlYXJjaCA9IHRoaXMuX2dldE92ZXJsYXBwaW5nUmVjb3Jkcyh0aGlzLCBsb3csIGhpZ2gpO1xyXG4gICAgICAgIC8vIElmIGludGVydmFsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzdGFydCBvZiB0aGlzIGludGVydmFsLCB0aGVuIGl0IGNhbid0IGJlIGluIGFueSBjaGlsZCB0b1xyXG4gICAgICAgIC8vIHRoZSByaWdodFxyXG4gICAgICAgIGlmIChoaWdoIDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlZnRTZWFyY2guY29uY2F0KG93blNlYXJjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2VhcmNoIHJpZ2h0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodFNlYXJjaCA9IHRoaXMucmlnaHQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJldHVybiBhY2N1bXVsYXRlZCByZXN1bHRzLCBpZiBhbnlcclxuICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoLCByaWdodFNlYXJjaCk7XHJcbiAgICB9O1xyXG4gICAgLy8gU2VhcmNoZXMgZm9yIGEgbm9kZSBieSBhIGBrZXlgIHZhbHVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2hFeGlzdGluZyA9IGZ1bmN0aW9uIChsb3cpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gbG93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IG5vZGUgb2YgdGhlIHN1YnRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl9taW5WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Ll9taW5WYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAobm9kZS5rZXkgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlIHRvIGJlIHJlbW92ZWQgaXMgb24gdGhlIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA+IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIGhhcyB0d28gY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIHZhciBtaW5WYWx1ZSA9IHRoaXMucmlnaHQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleSA9IG1pblZhbHVlLmtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkcyA9IG1pblZhbHVlLnJlY29yZHM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIHJpZ2h0IHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJpZ2h0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gTm9kZTtcclxufSgpKTtcclxuZXhwb3J0cy5Ob2RlID0gTm9kZTtcclxudmFyIEludGVydmFsVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLmNvdW50ID0gMDtcclxuICAgIH1cclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmIChyZWNvcmQubG93ID4gcmVjb3JkLmhpZ2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgbG93YCB2YWx1ZSBtdXN0IGJlIGxvd2VyIG9yIGVxdWFsIHRvIGBoaWdoYCB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gQmFzZSBjYXNlOiBUcmVlIGlzIGVtcHR5LCBuZXcgbm9kZSBiZWNvbWVzIHJvb3RcclxuICAgICAgICAgICAgdGhpcy5yb290ID0gbmV3IE5vZGUodGhpcywgcmVjb3JkKTtcclxuICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaWYgbm9kZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGtleVxyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlY29yZHMgaW4gdGhpcyBub2RlIGlmIHRoZXJlIGFscmVhZHkgaXMgdGhlIG9uZSB3aXRoIHNhbWUgbG93LCBoaWdoLCBkYXRhXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVjb3JkIGlzIHNhbWUgYXMgdGhlIG9uZSB3ZSdyZSB0cnlpbmcgdG8gaW5zZXJ0OyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBoYXMgYmVlbiBpbnNlcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZWNvcmQgdG8gdGhlIG5vZGVcclxuICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoZSBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuaGlnaCA+IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSByZWNvcmQuaGlnaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiBDYWxsIGluc2VydCBmdW5jdGlvbiBvbiByb290J3Mgbm9kZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyZWUgaXMgZW1wdHk7IHJldHVybiBlbXB0eSBhcnJheVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LnNlYXJjaChsb3csIGhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgbm90aGluZyB0byByZW1vdmVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnJvb3Quc2VhcmNoRXhpc3RpbmcocmVjb3JkLmxvdyk7XHJcbiAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZWRSZWNvcmQgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIDIgb3IgbW9yZSByZWNvcmRzLiBGaW5kIHRoZSBvbmUgd2UgbmVlZCBhbmQgcmVtb3ZlIGl0XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRSZWNvcmQgPSBub2RlLnJlY29yZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkUmVjb3JkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoYXQgbm9kZSBhbmQgaXRzIHBhcmVudHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID09PSBub2RlLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUhpZ2ggPSBub2RlLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZS5yaWdodC5tYXgpLCBub2RlSGlnaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgbm9kZS5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IE1hdGgubWF4KG5vZGUubGVmdC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgPT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5yaWdodC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gbm9kZUhpZ2g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5yZWNvcmRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSB3aXRoIHRoaXMga2V5IGhhcyBvbmx5IDEgcmVjb3JkLiBDaGVjayBpZiB0aGUgcmVtYWluaW5nIHJlY29yZCBpbiB0aGlzIG5vZGUgaXNcclxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHRoZSBvbmUgd2Ugd2FudCB0byByZW1vdmVcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzWzBdLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyByZWNvcmQgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZS4gUmVtb3ZlIHRoZSB3aG9sZSBub2RlIGZyb20gdGhlIHRyZWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290LmtleSA9PT0gbm9kZS5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgcmVtb3ZpbmcgdGhlIHJvb3QgZWxlbWVudC4gQ3JlYXRlIGEgZHVtbXkgbm9kZSB0aGF0IHdpbGwgdGVtcG9yYXJpbHkgdGFrZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb290J3MgcGFyZW50IHJvbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3RQYXJlbnQgPSBuZXcgTm9kZSh0aGlzLCB7IGxvdzogcmVjb3JkLmxvdywgaGlnaDogcmVjb3JkLmxvdyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhcmVudC5sZWZ0ID0gdGhpcy5yb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QucGFyZW50ID0gcm9vdFBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWROb2RlID0gdGhpcy5yb290LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdFBhcmVudC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyBub3QgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vIHJlY29yZHMgYXQgYWxsIGluIHRoaXMgbm9kZT8hIFNob3VsZG4ndCBoYXBwZW5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbk9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByZU9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEludGVydmFsVHJlZTtcclxufSgpKTtcclxuZXhwb3J0cy5JbnRlcnZhbFRyZWUgPSBJbnRlcnZhbFRyZWU7XHJcbnZhciBEYXRhSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRGF0YUludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLnRyZWUgPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XHJcbiAgICB9XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5pbnNlcnQoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5yZW1vdmUoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5zZWFyY2gobG93LCBoaWdoKS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYuZGF0YTsgfSk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnByZU9yZGVyKCk7XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLCBcImNvdW50XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5jb3VudDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBEYXRhSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBEYXRhSW50ZXJ2YWxUcmVlO1xyXG52YXIgSW5PcmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEluT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2goc3RhcnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBNaWdodCBwb3AgdGhlIGxhc3QgYW5kIHNldCB0aGlzLmN1cnJlbnROb2RlID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHRoaXMucG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5jdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLmxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5zdGFjay5wb3AoKTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBJbk9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLkluT3JkZXIgPSBJbk9yZGVyO1xyXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxudmFyIFByZU9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUHJlT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHN0YXJ0Tm9kZTtcclxuICAgIH1cclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHJpZ2h0IG5vZGUgKGkuZSB3ZSBhcmUgZG9uZSlcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5sZWZ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XHJcbiAgICB9O1xyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChub2RlKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFByZU9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLlByZU9yZGVyID0gUHJlT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldFJhZGlvQXBwZWFyYW5jZShkb2M6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbjogRnVuY3Rpb24gPSBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgZG9jLkFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsID0gZnVuY3Rpb24oZm9ybU9iamVjdDogYW55KSB7XG4gICAgICAgIGNvbnN0IHhvYmo6IGFueSA9IG9sZEFwcGVhcmFuY2VGdW5jaXRpb24oZm9ybU9iamVjdCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbTogc3RyaW5nW10gPSB4b2JqLnN0cmVhbS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZUNvbG9yOiBzdHJpbmcgPSBkb2MuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgIHN0cmVhbVswXSA9IHN0cmVhbVswXSArICdcXG4nICsgZW5jb2RlQ29sb3IgKyAnXFxuJyArIGVuY29kZUNvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oJ1xcbicpO1xuICAgICAgICByZXR1cm4geG9iajtcbiAgICB9O1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIENvbG9yZWRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByaXZhdGUgY29sb3I6IHN0cmluZywgcHJpdmF0ZSByZW5kZXJXaWR0aD86IG51bWJlciwgcHJpdmF0ZSByZW5kZXJIZWlnaHQ/OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRmlsbENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldEZpbGxDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcih0aGlzLmNvbG9yIHx8ICdibGFjaycpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnJlY3QodGhpcy54TGVmdCwgdGhpcy55VG9wLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJXaWR0aCA/PyB0aGlzLndpZHRoLCB0aGlzLnJlbmRlckhlaWdodCA/PyB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBEZXNjcmlwdGlvbkJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogZ2xvYmFsIGpzUERGICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFdlaWR0LFxuICogaHR0cHM6Ly9naXRodWIuY29tL0JpZ2dBOTRcbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuXG4vKiogXG4qIGpzUERGIEFjcm9Gb3JtIFBsdWdpblxuKiBAbW9kdWxlIEFjcm9Gb3JtXG4qL1xudmFyIGpzcGRmID0gcmVxdWlyZSgnanNwZGYnKTtcbihmdW5jdGlvbiAoanNQREYsIGdsb2JhbE9iaikge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBqc1BERkFQSSA9IGpzUERGLkFQSTtcbiAgICB2YXIgc2NvcGU7XG4gICAgdmFyIHNjYWxlRmFjdG9yID0gMTtcbiAgICBmdW5jdGlvbiB0b1VuaWNvZGUoc3RyKSB7XG4gICAgICAgIHZhciB1bmljb2RlU3RyaW5nID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhlVW5pY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgd2hpbGUgKHRoZVVuaWNvZGUubGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIHRoZVVuaWNvZGUgPSAnMCcgKyB0aGVVbmljb2RlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHVuaWNvZGVTdHJpbmcgKz0gdGhlVW5pY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzxGRUZGJyArIHVuaWNvZGVTdHJpbmcgKyAnPic7XG4gICAgfVxuICAgIHZhciBwZGZFc2NhcGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXFwoL2csICdcXFxcKCcpLnJlcGxhY2UoL1xcKS9nLCAnXFxcXCknKSB9O1xuICAgIHZhciBwZGZVbmVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC9cXFxcXFwoL2csICcoJykucmVwbGFjZSgvXFxcXFxcKS9nLCAnKScpOyB9O1xuICAgIGZ1bmN0aW9uIGFycmF5VG9QZGZVbmljb2RlQXJyYXkodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICdbICc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b1VuaWNvZGUodmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSAnIF0nXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBmMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDIpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICB2YXIgZjUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCg1KTsgLy8gSWUsICUuMmZcbiAgICB9O1xuXG4gICAganNQREZBUEkuX19hY3JvZm9ybV9fID0ge307XG4gICAgdmFyIGluaGVyaXQgPSBmdW5jdGlvbiAoY2hpbGQsIHBhcmVudCkge1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICB9O1xuXG4gICAgdmFyIHNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4ICogc2NhbGVGYWN0b3IpO1xuICAgIH07XG4gICAgdmFyIGFudGlTY2FsZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiAoeCAvIHNjYWxlRmFjdG9yKTtcbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZUZvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHhvYmogPSBuZXcgQWNyb0Zvcm1YT2JqZWN0KCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB4b2JqLkJCb3ggPSBbMCwgMCwgTnVtYmVyKGYyKHdpZHRoKSksIE51bWJlcihmMihoZWlnaHQpKV07XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEJpdC1PcGVyYXRpb25zXG4gICAgKi9cbiAgICB2YXIgc2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgfD0gYml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIgfHwgMDtcbiAgICAgICAgYml0UG9zaXRpb24gPSBiaXRQb3NpdGlvbiB8fCAwO1xuXG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgJj0gfmJpdE1hc2s7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9O1xuXG4gICAgdmFyIGdldEJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChudW1iZXIgJiAoMSA8PCBiaXRQb3NpdGlvbikpID09PSAwID8gMCA6IDE7XG4gICAgfTtcblxuICAgIC8qXG4gICAgKiBGZiBzdGFydHMgY291bnRpbmcgdGhlIGJpdCBwb3NpdGlvbiBhdCAxIGFuZCBub3QgbGlrZSBqYXZhc2NyaXB0IGF0IDBcbiAgICAqL1xuICAgIHZhciBnZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgc2V0Qml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0Qml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFyQml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsZWFyQml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUNvb3JkaW5hdGVzID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNhbGN1bGF0ZUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGdldEhvcml6b250YWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZTtcbiAgICAgICAgdmFyIGdldFZlcnRpY2FsQ29vcmRpbmF0ZSA9IHRoaXMuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgeCA9IGFyZ3NbMF07XG4gICAgICAgIHZhciB5ID0gYXJnc1sxXTtcbiAgICAgICAgdmFyIHcgPSBhcmdzWzJdO1xuICAgICAgICB2YXIgaCA9IGFyZ3NbM107XG5cbiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0ge307XG5cbiAgICAgICAgY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4KSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5ICsgaCkgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YID0gZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUoeCArIHcpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5KSB8fCAwO1xuXG4gICAgICAgIHJldHVybiBbTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy5sb3dlckxlZnRfWSkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1kpKV07XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3JtT2JqZWN0LlYgJiYgIWZvcm1PYmplY3QuRFYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UgY2FsY3VsYXRlIGl0XG5cbiAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICB2YXIgdGV4dCA9IGZvcm1PYmplY3QuViB8fCBmb3JtT2JqZWN0LkRWO1xuICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgdGV4dCk7XG4gICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICBzdHJlYW0ucHVzaCgnL1R4IEJNQycpO1xuICAgICAgICBzdHJlYW0ucHVzaCgncScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnQlQnKTsgLy8gQmVnaW4gVGV4dFxuICAgICAgICBzdHJlYW0ucHVzaChzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKSk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvJyArIGZvbnRLZXkgKyAnICcgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArICcgVGYnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJzEgMCAwIDEgMCAwIFRtJyk7Ly8gVHJhbnNmb3JtYXRpb24gTWF0cml4XG4gICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdFVCcpOyAvLyBFbmQgVGV4dCAgICBcbiAgICAgICAgc3RyZWFtLnB1c2goJ1EnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VNQycpO1xuXG4gICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZVggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCwgdGV4dCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHRleHQgPSBmb3JtT2JqZWN0LnRydWVWYWx1ZTtcbiAgICAgICAgIHZhciBtYXhGb250U2l6ZSA9XG4gICAgICAgICAgICBmb3JtT2JqZWN0LmZvbnRTaXplID09PSAwID8gZm9ybU9iamVjdC5tYXhGb250U2l6ZSA6IGZvcm1PYmplY3QuZm9udFNpemU7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHtcbiAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICBmb250U2l6ZTogXCJcIlxuICAgICAgICB9O1xuICAgICAgICAvLyBSZW1vdmUgQnJhY2tldHNcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKDAsIDEpID09IFwiKFwiID8gdGV4dC5zdWJzdHIoMSkgOiB0ZXh0O1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICAgIHRleHQuc3Vic3RyKHRleHQubGVuZ3RoIC0gMSkgPT0gXCIpXCJcbiAgICAgICAgICAgID8gdGV4dC5zdWJzdHIoMCwgdGV4dC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgOiB0ZXh0O1xuICAgICAgICAvLyBzcGxpdCBpbnRvIGFycmF5IG9mIHdvcmRzXG4gICAgICAgIHZhciB0ZXh0U3BsaXQgPSB0ZXh0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgdGV4dFNwbGl0ID0gdGV4dFNwbGl0Lm1hcChmdW5jdGlvbiAod29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2Fyci5qb2luKFwiIFwiKV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvbnRTaXplID0gbWF4Rm9udFNpemU7IC8vIFRoZSBTdGFydGluZyBmb250U2l6ZSAoVGhlIE1heGltdW0pXG4gICAgICAgIHZhciBsaW5lU3BhY2luZyA9IDI7XG4gICAgICAgIHZhciBib3JkZXJQYWRkaW5nID0gMjtcblxuICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICBoZWlnaHQgPSBoZWlnaHQgPCAwID8gLWhlaWdodCA6IGhlaWdodDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHdpZHRoID0gd2lkdGggPCAwID8gLXdpZHRoIDogd2lkdGg7XG5cbiAgICAgICAgdmFyIGlzU21hbGxlclRoYW5XaWR0aCA9IGZ1bmN0aW9uKGksIGxhc3RMaW5lLCBmb250U2l6ZSkge1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGV4dFNwbGl0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHRtcCA9IGxhc3RMaW5lICsgXCIgXCIgKyB0ZXh0U3BsaXRbaSArIDFdWzBdO1xuICAgICAgICAgICAgdmFyIFRleHRXaWR0aCA9IGNhbGN1bGF0ZUZvbnRTcGFjZSh0bXAsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcbiAgICAgICAgICAgIHZhciBGaWVsZFdpZHRoID0gd2lkdGggLSAyICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgIHJldHVybiBUZXh0V2lkdGggPD0gRmllbGRXaWR0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9udFNpemUrKztcbiAgICAgICAgRm9udFNpemU6IHdoaWxlIChmb250U2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZm9udFNpemUtLTtcbiAgICAgICAgICAgIHZhciB0ZXh0SGVpZ2h0ID0gY2FsY3VsYXRlRm9udFNwYWNlKFwiM1wiLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHN0YXJ0WSA9IGZvcm1PYmplY3QubXVsdGlsaW5lXG4gICAgICAgICAgICA/IGhlaWdodCAtIGZvbnRTaXplXG4gICAgICAgICAgICA6IChoZWlnaHQgLSB0ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICBzdGFydFkgKz0gbGluZVNwYWNpbmc7XG4gICAgICAgICAgICB2YXIgc3RhcnRYO1xuXG4gICAgICAgICAgICB2YXIgbGFzdFkgPSBzdGFydFk7XG4gICAgICAgICAgICB2YXIgZmlyc3RXb3JkSW5MaW5lID0gMCxcbiAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gMDtcbiAgICAgICAgICAgIHZhciBsYXN0TGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGN1cnJXb3JkID0gMDtcblxuICAgICAgICAgICAgaWYgKGZvbnRTaXplIDw9IDApIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2UsIHRoZSBUZXh0IGRvZXNuJ3QgZml0IGF0IGFsbFxuICAgICAgICAgICAgZm9udFNpemUgPSAxMjtcbiAgICAgICAgICAgIHRleHQgPSBcIiguLi4pIFRqXFxuXCI7XG4gICAgICAgICAgICB0ZXh0ICs9XG4gICAgICAgICAgICAgICAgXCIlIFdpZHRoIG9mIFRleHQ6IFwiICtcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVGb250U3BhY2UodGV4dCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoICtcbiAgICAgICAgICAgICAgICBcIiwgRmllbGRXaWR0aDpcIiArXG4gICAgICAgICAgICAgICAgd2lkdGggK1xuICAgICAgICAgICAgICAgIFwiXFxuXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBsaW5lQ291bnQgPSAwO1xuICAgICAgICAgICAgTGluZTogZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0U3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0ZXh0U3BsaXQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNXaXRoTmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3BsaXRbaV0ubGVuZ3RoICE9PSAxICYmIGN1cnJXb3JkICE9PSB0ZXh0U3BsaXRbaV0ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdO1xuICAgICAgICAgICAgICAgIGlzV2l0aE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gaTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgbGFzdExpbmUgPVxuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZS5zdWJzdHIobGFzdExpbmUubGVuZ3RoIC0gMSkgPT0gXCIgXCJcbiAgICAgICAgICAgICAgICAgICAgPyBsYXN0TGluZS5zdWJzdHIoMCwgbGFzdExpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyc2VJbnQoaSk7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRMaW5lSXNTbWFsbGVyID0gaXNTbWFsbGVyVGhhbldpZHRoKGtleSwgbGFzdExpbmUsIGZvbnRTaXplKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0V29yZCA9IGkgPj0gdGV4dFNwbGl0Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV4dExpbmVJc1NtYWxsZXIgJiYgIWlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJXb3JkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIExpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmllbGRPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAvLyBnbyBvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZm9ybU9iamVjdC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZSBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcblxuICAgICAgICAgICAgICAgIHZhciBsaW5lID0gXCJcIjtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSBmaXJzdFdvcmRJbkxpbmU7IHggPD0gbGFzdFdvcmRJbkxpbmU7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyckxpbmUgPSB0ZXh0U3BsaXRbeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGxhc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJXb3JkXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAoY3VycldvcmQgKyAxKSAlIGN1cnJMaW5lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGZpcnN0V29yZEluTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVtjdXJyTGluZS5sZW5ndGggLSAxXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVswXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsYXN0IGJsYW5rXG4gICAgICAgICAgICAgICAgbGluZSA9XG4gICAgICAgICAgICAgICAgbGluZS5zdWJzdHIobGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5lO1xuICAgICAgICAgICAgICAgIC8vIGxhc3RMZW5ndGggLT0gYmxhbmtTcGFjZS53aWR0aDtcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gY2FsY3VsYXRlRm9udFNwYWNlKGxpbmUsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzdGFydFhcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1PYmplY3QudGV4dEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IHdpZHRoIC0gbGFzdExlbmd0aCAtIGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gKHdpZHRoIC0gbGFzdExlbmd0aCkgLyAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGYyKHN0YXJ0WCkgKyBcIiBcIiArIGYyKGxhc3RZKSArIFwiIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbnRMaXN0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvbnRMaXN0W3Njb3BlLmludGVybmFsLmdldEZvbnQoKS5pZF0gPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkVzY2FwZTogcGRmRXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvbnRLZXk6IHNjb3BlLmludGVybmFsLmdldEZvbnQoKS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250czogZm9udExpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udFNpemU6IGZvcm1PYmplY3QuZm9udFNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ3Bvc3RQcm9jZXNzVGV4dCcsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICc8JyArIHBheWxvYWQudGV4dCArICc+IFRqXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJygnICsgcGRmRXNjYXBlKGxpbmUpICsgJykgVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXNldCBYIGluIFBERlxuICAgICAgICAgICAgICAgIHRleHQgKz0gLWYyKHN0YXJ0WCkgKyBcIiAwIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBBZnRlciBhIExpbmUsIGFkanVzdCB5IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgbGFzdFkgPSAtKGZvbnRTaXplICsgbGluZVNwYWNpbmcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgZm9yIG5leHQgaXRlcmF0aW9uIHN0ZXBcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBmaXJzdFdvcmRJbkxpbmUgPSBpc1dpdGhOZXdMaW5lID8gbGFzdFdvcmRJbkxpbmUgOiBsYXN0V29yZEluTGluZSArIDE7XG4gICAgICAgICAgICAgICAgbGluZUNvdW50Kys7XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY29udGludWUgTGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuVmFsdWUudGV4dCA9IHRleHQ7XG4gICAgICAgIHJldHVyblZhbHVlLmZvbnRTaXplID0gZm9udFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFNtYWxsIHdvcmthcm91bmQgZm9yIGNhbGN1bGF0aW5nIHRoZSBUZXh0TWV0cmljIGFwcHJveGltYXRlbHkuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB0ZXh0XG4gICAgKiBAcGFyYW0gZm9udHNpemVcbiAgICAqIEByZXR1cm5zIHtUZXh0TWV0cmljc30gKEhhcyBIZWlnaHQgYW5kIFdpZHRoKVxuICAgICovXG4gICAgdmFyIGNhbGN1bGF0ZUZvbnRTcGFjZSA9IGZ1bmN0aW9uICh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkge1xuICAgICAgICB2YXIgZm9udCA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpO1xuICAgICAgICB2YXIgd2lkdGggPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgodGV4dCwgeyBmb250OiBmb250LCBmb250U2l6ZTogcGFyc2VGbG9hdChmb250U2l6ZSksIGNoYXJTcGFjZTogMCB9KSAqIHBhcnNlRmxvYXQoZm9udFNpemUpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKFwiM1wiLCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSkgKiAxLjU7XG4gICAgICAgIHJldHVybiB7IGhlaWdodDogaGVpZ2h0LCB3aWR0aDogd2lkdGggfTtcbiAgICB9O1xuXG4gICAgdmFyIGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUgPSB7XG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICAgIHhGb3JtczogW10sXG4gICAgICAgIC8qKlxuICAgICAgICAqIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFjcm9Gb3JtXG4gICAgICAgICogRGljdGlvbmFyeSAwOiBUaGUgRXZlbnQtVG9rZW4sIHRoZSBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayBoYXNcbiAgICAgICAgKiAxOiBUaGUgT2JqZWN0IElEIG9mIHRoZSBSb290XG4gICAgICAgICovXG4gICAgICAgIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3Q6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAqIEFmdGVyIHRoZSBQREYgZ2V0cyBldmFsdWF0ZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvb3QgaGFzIHRvIGJlXG4gICAgICAgICogcmVzZXQsIHRoaXMgaW5kaWNhdGVzLCB3aGV0aGVyIHRoZSByb290IGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZFxuICAgICAgICAqIG91dFxuICAgICAgICAqL1xuICAgICAgICBwcmludGVkT3V0OiBmYWxzZSxcbiAgICAgICAgaW50ZXJuYWw6IG51bGwsXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IGZhbHNlXG4gICAgfTtcblxuICAgIHZhciBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBmaWVsZHMgPSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcztcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9ybU9iamVjdCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgICAgICAgICAgZm9ybU9iamVjdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBhZGQgQW5ub3QgUmVmZXJlbmNlIVxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lmhhc0Fubm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmVzIGFuIEFubm90YXRpb24gV2lkZ2V0IGluIHRoZSBGb3JtIE9iamVjdCwgcHV0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgaW4gdGhlIC9Bbm5vdCBhcnJheVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlLmNhbGwoc2NvcGUsIGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHV0Rm9ybSA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0KSB7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcy5wdXNoKGZvcm1PYmplY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBDcmVhdGUgdGhlIFJlZmVyZW5jZSB0byB0aGUgd2lkZ2V0QW5ub3RhdGlvbiwgc28gdGhhdCBpdCBnZXRzIHJlZmVyZW5jZWRcbiAgICAqIGluIHRoZSBBbm5vdFtdIGludCB0aGUrIChSZXF1aXJlcyB0aGUgQW5ub3RhdGlvbiBQbHVnaW4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlQW5ub3RhdGlvblJlZmVyZW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0eXBlOiAncmVmZXJlbmNlJyxcbiAgICAgICAgICAgIG9iamVjdDogb2JqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmaW5kRW50cnkgPSBmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIChlbnRyeS50eXBlID09PSBvcHRpb25zLnR5cGUgJiYgZW50cnkub2JqZWN0ID09PSBvcHRpb25zLm9iamVjdCk7IH07XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyhvYmplY3QucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMuZmluZChmaW5kRW50cnkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENhbGxiYWNrc1xuXG4gICAgdmFyIHB1dENhdGFsb2dDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHV0IHJlZmVyZW5jZSB0byBBY3JvRm9ybSB0byBEb2N1bWVudENhdGFsb2dcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2FmZXR5LCBzaG91bGRuJ3Qgbm9ybWFsbHkgYmUgdGhlIGNhc2VcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLndyaXRlKCcvQWNyb0Zvcm0gJyArIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgKyAnICcgKyAwICsgJyBSJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1dENhdGFsb2dDYWxsYmFjazogUm9vdCBtaXNzaW5nLicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQWRkcyAvQWNyb2Zvcm0gWCAwIFIgdG8gRG9jdW1lbnQgQ2F0YWxvZywgYW5kIGNyZWF0ZXMgdGhlIEFjcm9Gb3JtXG4gICAgKiBEaWN0aW9uYXJ5XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudFxuICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMudW5zdWJzY3JpYmUoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCk7XG4gICAgICAgIGRlbGV0ZSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIHRoZSBzaW5nbGUgRmllbGRzIGFuZCB3cml0ZXMgdGhlbSBpbnRvIHRoZSBEb2N1bWVudFxuICAgICogXG4gICAgKiBJZiBmaWVsZEFycmF5IGlzIHNldCwgdXNlIHRoZSBmaWVsZHMgdGhhdCBhcmUgaW5zaWRlIGl0IGluc3RlYWQgb2YgdGhlXG4gICAgKiBmaWVsZHMgZnJvbSB0aGUgQWNyb1Jvb3QgKGZvciB0aGUgRm9ybVhPYmplY3RzLi4uKVxuICAgICovXG4gICAgdmFyIGNyZWF0ZUZpZWxkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZmllbGRBcnJheSkge1xuICAgICAgICB2YXIgc3RhbmRhcmRGaWVsZHMgPSAoIWZpZWxkQXJyYXkpO1xuXG4gICAgICAgIGlmICghZmllbGRBcnJheSkge1xuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBmaWVsZEFycmF5IHNwZWNpZmllZCwgd2Ugd2FudCB0byBwcmludCBvdXRcbiAgICAgICAgICAgIC8vIHRoZSBGaWVsZHMgb2YgdGhlIEFjcm9Gb3JtXG4gICAgICAgICAgICAvLyBQcmludCBvdXQgUm9vdFxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkLCB0cnVlKTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QucHV0U3RyZWFtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZEFycmF5ID0gZmllbGRBcnJheSB8fCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LktpZHM7XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBvbGRSZWN0ID0gZmllbGRPYmplY3QuUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5SZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LlJlY3QgPSBjYWxjdWxhdGVDb29yZGluYXRlcy5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0LlJlY3QpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuREEgPSBBY3JvRm9ybUFwcGVhcmFuY2UuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW0oZmllbGRPYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0ID0gZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IG9sZFJlY3Q7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuaGFzQXBwZWFyYW5jZVN0cmVhbSAmJiAhZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIEFwcGVhcmFuY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDwvTiBcIiArIGFwcGVhcmFuY2UgKyBcIj4+XCIgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2goYXBwZWFyYW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzdW1lIEFwcGVhcmFuY2VTdHJlYW1Db250ZW50IGlzIGEgQXJyYXkgd2l0aCBOLFIsRCAoYXQgbGVhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgb2YgdGhlbSEpXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIE4sUiBhbmQgRFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudFtrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGsgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIjw8XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPj0gMSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlU3RyZWFtIGlzIGFuIEFycmF5IG9yIE9iamVjdCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ2V0IHRoZSBGb3JtWE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgaSArIFwiIFwiICsgb2JqICsgXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgWEZvcm0gaXMgYWxyZWFkeSB1c2VkLCBlLmcuIE9mZlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgQ2hlY2tCb3hlcywgZG9uJ3QgYWRkIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2Yob2JqKSA+PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGdW5jdGlvbiBpcyByZWZlcmVuY2VkLCBjYWxsIGl0IGluIG9yZGVyIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIj4+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlIHN0cmVhbSBpcyBhIG5vcm1hbCBPYmplY3QuLlxuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDxcXG5cIiArIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKyBcIj4+XCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgYWRkaXRpb25hbEtleVZhbHVlczoga2V5VmFsdWVMaXN0IH0pO1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YW5kYXJkRmllbGRzKSB7XG4gICAgICAgICAgICBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrLmNhbGwodGhpcywgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlWEZvcm1PYmplY3RDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRBcnJheSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXkuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gaTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmplY3QgPSBmaWVsZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3QgJiYgZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QucHV0U3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QucHV0U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZEFycmF5W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGluaXRpYWxpemVBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWwgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpKSB7XG5cbiAgICAgICAgICAgIHNjb3BlID0gdGhpcztcblxuICAgICAgICAgICAgQWNyb0Zvcm1GaWVsZC5GaWVsZE51bSA9IDA7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhY3JvZm9ybVBsdWdpblRlbXBsYXRlKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEFjcm9mb3JtRGljdGlvbmFyeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gc2NvcGUuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAvLyBUaGUgT2JqZWN0IE51bWJlciBvZiB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCA9IG5ldyBBY3JvRm9ybURpY3Rpb25hcnkoKTtcblxuICAgICAgICAgICAgLy8gYWRkIENhbGxiYWNrIGZvciBjcmVhdGluZyB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCA9IHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRSZXNvdXJjZXMnLCBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2J1aWxkRG9jdW1lbnQnLCBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrKTsgLy8gYnVpbGREb2N1bWVudFxuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgRG9jdW1lbnRDYXRhbG9nIGlzXG4gICAgICAgICAgICAvLyB3cml0dGVuLCBpbiBvcmRlciB0byBhZGQgL0Fjcm9Gb3JtXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwdXRDYXRhbG9nJywgcHV0Q2F0YWxvZ0NhbGxiYWNrKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQsIHRoYXQgY3JlYXRlcyBhbGwgRmllbGRzXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwb3N0UHV0UGFnZXMnLCBjcmVhdGVGaWVsZENhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDI2LCA3LjMuNlxuICAgIHZhciBhcnJheVRvUGRmQXJyYXkgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSAnWyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGFycmF5W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0uc3Vic3RyKDAsIDEpICE9PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcoJyArIHBkZkVzY2FwZShhcnJheVtpXS50b1N0cmluZygpKSArICcpJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCArPSAnXSc7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXknKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoZXMoc3RyaW5nLCByZWdleCwgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggfHwgKGluZGV4ID0gMSk7IC8vIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cFxuICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuICAgIHZhciBwZGZBcnJheVRvU3RyaW5nQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGFycmF5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnZXRNYXRjaGVzKGFycmF5LCAvXFwoKC4qPylcXCkvZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHRvUGRmU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIjtcbiAgICAgICAgc3RyaW5nLnRvU3RyaW5nKCk7XG4gICAgICAgIHN0cmluZyA9ICcoJyArIHBkZkVzY2FwZShzdHJpbmcpICsgJyknO1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAgIC8vIENsYXNzZXNcbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QREZPYmplY3RcbiAgICAqIEBjbGFzc2Rlc2MgQSBBY3JvRm9ybVBERk9iamVjdFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUERGT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX29iaklkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtUERGT2JqZWN0I29iaklkXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvYmpJZCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX29iaklkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9vYmpJZCA9IHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9vYmpJZCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAZnVuY3Rpb24gQWNyb0Zvcm1QREZPYmplY3QudG9TdHJpbmdcbiAgICAqL1xuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqSWQgKyBcIiAwIFJcIjtcbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnB1dFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IHRoaXMuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLnB1dFN0cmVhbSh7IGRhdGE6IHRoaXMuc3RyZWFtLCBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLm91dChcImVuZG9ialwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIGFuIGtleS12YWx1ZS1MaXN0IG9mIGFsbCBub24tY29uZmlndXJhYmxlIFZhcmlhYmxlcyBmcm9tIHRoZSBPYmplY3RcbiAgICAqIFxuICAgICogQG5hbWUgZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmaWVsZE9iamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGtleSAhPSAnY29udGVudCcgJiYga2V5ICE9ICdhcHBlYXJhbmNlU3RyZWFtQ29udGVudCcgJiYga2V5LnN1YnN0cmluZygwLCAxKSAhPSBcIl9cIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmllbGRPYmplY3QsIGtleXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eURlc2NyaXB0b3IgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGFycmF5VG9QZGZBcnJheSh2YWx1ZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWNyb0Zvcm1QREZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUERGT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgdGhlIHJlZmVyZW5jZSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUub2JqSWQgKyBcIiAwIFJcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5VmFsdWVMaXN0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVLZXlWYWx1ZUxpc3RGcm9tRmllbGRPYmplY3QodGhpcyk7XG4gICAgfTtcblxuICAgIHZhciBBY3JvRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1R5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvWE9iamVjdFwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1N1YnR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvRm9ybVwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0Zvcm1UeXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQkJveCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0JCb3gnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9CQm94O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0JCb3ggPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZXNvdXJjZXMnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIyIDAgUlwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX3N0cmVhbTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3N0cmVhbSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtWE9iamVjdCwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgdmFyIEFjcm9Gb3JtRGljdGlvbmFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICB2YXIgX0tpZHMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfS2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmllbGRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWZhdWx0IEFwcGVhcmFuY2VcbiAgICAgICAgdmFyIF9EQTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEQScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBfREEgKyAnKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybURpY3Rpb25hcnksIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogVGhlIEZpZWxkIE9iamVjdCBjb250YWlucyB0aGUgVmFyaWFibGVzLCB0aGF0IGV2ZXJ5IEZpZWxkIG5lZWRzXG4gICAgKiBcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAY2xhc3NkZXNjIEFuIEFjcm9Gb3JtIEZpZWxkT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1GaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICAvL0Fubm90YXRpb24tRmxhZyBTZWUgVGFibGUgMTY1XG4gICAgICAgIHZhciBfRiA9IDQ7XG4gICAgICAgIHRoaXMuaXNVbmljb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJ1ZVZhbHVlID0gJyc7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRiBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS4yKSBJZiBzZXQsIHByaW50IHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIHBhZ2UgaXMgcHJpbnRlZC4gSWYgY2xlYXIsIG5ldmVyIHByaW50IHRoZSBhbm5vdGF0aW9uLCByZWdhcmRsZXNzIG9mIHdldGhlciBpcyBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gXG4gICAgICAgICogTk9URSAyIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYW5ub3RhdGlvbnMgcmVwcmVzZW50aW5nIGludGVyYWN0aXZlIHB1c2hidXR0b25zLCB3aGljaCB3b3VsZCBzZXJ2ZSBubyBtZWFuaW5nZnVsIHB1cnBvc2Ugb24gdGhlIHByaW50ZWQgcGFnZS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjc2hvd1doZW5QcmludGVkXG4gICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Nob3dXaGVuUHJpbnRlZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYoX0YsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkYgPSBzZXRCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IGNsZWFyQml0Rm9yUGRmKF9GLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRmYgPSAwO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GZjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GZiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEZmIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9SZWN0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUmVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUmVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9SZWN0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfUmVjdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3hcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzBdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeS1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3lcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzFdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzFdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN3aWR0aFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3dpZHRoJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzJdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzJdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGVpZ2h0XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGVpZ2h0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzNdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzNdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0ZUID0gXCJcIjtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GVFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQnRuJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1R4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL0NoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1NpZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfRlQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRlQgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1QgPSBudWxsO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfVCB8fCBfVC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBDaGlsZCBmcm9tIGEgUmFkaW/CtEdyb3VwLCB5b3UgZG9uJ3QgbmVlZCBhIEZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hpbGRDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfVCA9IFwiRmllbGRPYmplY3RcIiArIChBY3JvRm9ybUZpZWxkLkZpZWxkTnVtKyspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJygnICsgcGRmRXNjYXBlKF9UKSArICcpJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBUaGUgcGFydGlhbCBmaWVsZCBuYW1lIChzZWUgMTIuNy4zLjIsIOKAnEZpZWxkIE5hbWVz4oCdKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZmllbGROYW1lXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmllbGROYW1lJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnROYW1lIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnROYW1lXG4gICAgICAgICogQGRlZmF1bHQgJ2hlbHZldGljYSdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnROYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udE5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTdHlsZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250U3R5bGVcbiAgICAgICAgKiBAZGVmYXVsdCAnbm9ybWFsJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udFN0eWxlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udFN0eWxlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnRTdHlsZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTaXplID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTaXplIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTaXplXG4gICAgICAgICogQGRlZmF1bHQgMCAoZm9yIGF1dG8pXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U2l6ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9mb250U2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFNpemUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfbWF4Rm9udFNpemUgPSA1MDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIG1heGltdW0gZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjbWF4Rm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heEZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX21heEZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9tYXhGb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9jb2xvciA9ICdibGFjayc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgdGV4dFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNjb2xvclxuICAgICAgICAqIEBkZWZhdWx0ICdibGFjaydcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfHJnYmF9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29sb3InLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9jb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0RBID0gJy9GMSAwIFRmIDAgZyc7XG4gICAgICAgIC8vIERlZmluZXMgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSAoTmVlZGVkIGZvciB2YXJpYWJsZSBUZXh0KVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EQVxuICAgICAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RBKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBfREEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX0RWID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RWKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9EVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKDAsIDEpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfRFYgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHdoaWNoIHRoZSBmaWVsZCByZXZlcnRzIHdoZW4gYSByZXNldC1mb3JtIGFjdGlvbiBpcyBleGVjdXRlZCAoc2VlIDEyLjcuNS4zLCDigJxSZXNldC1Gb3JtIEFjdGlvbuKAnSkuIFRoZSBmb3JtYXQgb2YgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZGVmYXVsdFZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGVmYXVsdFZhbHVlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmVW5lc2NhcGUoX0RWLnN1YnN0cigxLCBfRFYubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfViA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX1YpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX1YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gdG9Vbmljb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnVlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgZmllbGTigJlzIHZhbHVlLCB3aG9zZSBmb3JtYXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4gU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgaW5kaXZpZHVhbCBmaWVsZCB0eXBlcyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3ZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfVi5zdWJzdHIoMSwgX1YubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGZpZWxkIGhhcyBhbm5vdGF0aW9uc1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBbm5vdGF0aW9uXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQW5ub3RhdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuUmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvQW5ub3RcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvV2lkZ2V0XCIgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICogdHJ1ZSBpZiBmaWVsZCBoYXMgYW4gYXBwZWFyYW5jZVN0cmVhbVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2hhc0FwcGVhcmFuY2VTdHJlYW07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIF9oYXNBcHBlYXJhbmNlU3RyZWFtID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBwYWdlIG9uIHdoaWNoIHRoZSBBY3JvRm9ybUZpZWxkIGlzIHBsYWNlZFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNwYWdlXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgdmFyIF9wYWdlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BhZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9wYWdlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIHVzZXIgbWF5IG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW55IGFzc29jaWF0ZWQgd2lkZ2V0IGFubm90YXRpb25zIHdpbGwgbm90IGludGVyYWN0IHdpdGggdGhlIHVzZXI7IHRoYXQgaXMsIHRoZXkgd2lsbCBub3QgcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlIHRoZWlyIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2UgbW90aW9ucy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgb3IgaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVhZE9ubHlcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlYWRPbmx5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBoYXZlIGEgdmFsdWUgYXQgdGhlIHRpbWUgaXQgaXMgZXhwb3J0ZWQgYnkgYSBzdWJtaXRmb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVxdWlyZWRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlcXVpcmVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgZXhwb3J0ZWQgYnkgYSBzdWJtaXQtZm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwg4oCcU3VibWl0LUZvcm0gQWN0aW9u4oCdKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNub0V4cG9ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm9FeHBvcnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdmFyIF9RID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdRJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX1EgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9RO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFswLCAxLCAyXS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgX1EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBRIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgQSBjb2RlIHNwZWNpZnlpbmcgdGhlIGZvcm0gb2YgcXVhZGRpbmcgKGp1c3RpZmljYXRpb24pIHRoYXQgc2hhbGwgYmUgdXNlZCBpbiBkaXNwbGF5aW5nIHRoZSB0ZXh0OlxuICAgICAgICAqICdsZWZ0JywgJ2NlbnRlcicsICdyaWdodCdcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdGV4dEFsaWduXG4gICAgICAgICogQGRlZmF1bHQgJ2xlZnQnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0QWxpZ24nLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX1EpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdyaWdodCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybUZpZWxkLCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICAvLyBGaWVsZCBUeXBlID0gQ2hvaWNlIEZpZWxkXG4gICAgICAgIHRoaXMuRlQgPSBcIi9DaFwiO1xuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMuViA9ICcoKSc7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICAvLyBUb3AgSW5kZXhcbiAgICAgICAgdmFyIF9USSA9IDA7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUSScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9USTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9USSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNSyBmaXggZm9yIEFjcm9iYXRcbiAgICAgICAgdmFyIF9NSyA9ICc8PCAvQkcgWyAwLjk3NSAwLjk3NSAwLjk3NSBdICA+Pic7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUs7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBGb3Igc2Nyb2xsYWJsZSBsaXN0IGJveGVzLCB0aGUgdG9wIGluZGV4ICh0aGUgaW5kZXggaW4gdGhlIE9wdCBhcnJheSBvZiB0aGUgZmlyc3Qgb3B0aW9uIHZpc2libGUgaW4gdGhlIGxpc3QpLiBEZWZhdWx0IHZhbHVlOiAwLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjdG9wSW5kZXhcbiAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0b3BJbmRleCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfT3B0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnT3B0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZVbmljb2RlQXJyYXkoX09wdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvUGRmQXJyYXkoX09wdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfT3B0ID0gcGRmQXJyYXlUb1N0cmluZ0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIGdldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IGFycmF5IG9mIE9wdGlvbnNcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9PcHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHNldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge2FycmF5fSB2YWx1ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIF9PcHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgYWRkT3B0aW9uXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBfT3B0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSByZW1vdmVPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbEVudHJpZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbW92ZU9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgYWxsRW50cmllcykge1xuICAgICAgICAgICAgYWxsRW50cmllcyA9IGFsbEVudHJpZXMgfHwgZmFsc2VcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgd2hpbGUgKF9PcHQuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgX09wdC5zcGxpY2UoX09wdC5pbmRleE9mKHZhbHVlKSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGFsbEVudHJpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIGNvbWJvIGJveDsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGxpc3QgYm94LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tYm9cbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWJvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBjb21ibyBib3ggc2hhbGwgaW5jbHVkZSBhbiBlZGl0YWJsZSB0ZXh0IGJveCBhcyB3ZWxsIGFzIGEgZHJvcC1kb3duIGxpc3Q7IGlmIGNsZWFyLCBpdCBzaGFsbCBpbmNsdWRlIG9ubHkgYSBkcm9wLWRvd24gbGlzdC4gVGhpcyBmbGFnIHNoYWxsIGJlIHVzZWQgb25seSBpZiB0aGUgQ29tYm8gZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNlZGl0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdlZGl0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbWJvID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZOKAmXMgb3B0aW9uIGl0ZW1zIHNoYWxsIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gVGhpcyBmbGFnIGlzIGludGVuZGVkIGZvciB1c2UgYnkgd3JpdGVycywgbm90IGJ5IHJlYWRlcnMuIENvbmZvcm1pbmcgcmVhZGVycyBzaGFsbCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBPcHQgYXJyYXkgKHNlZSBUYWJsZSAyMzEpLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjc29ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc29ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgbWF5IGJlIHNlbGVjdGVkIHNpbXVsdGFuZW91c2x5OyBpZiBjbGVhciwgYXQgbW9zdCBvbmUgaXRlbSBzaGFsbCBiZSBzZWxlY3RlZCBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjbXVsdGlTZWxlY3RcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpU2VsZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsY2hlY2tlZC4gVGhpcyBmbGFnIHNoYWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgQ29tYm8gYW5kIEVkaXQgZmxhZ3MgYXJlIGJvdGggc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSBuZXcgdmFsdWUgc2hhbGwgYmUgY29tbWl0dGVkIGFzIHNvb24gYXMgYSBzZWxlY3Rpb24gaXMgbWFkZSAoY29tbW9ubHkgd2l0aCB0aGUgcG9pbnRpbmcgZGV2aWNlKS4gSW4gdGhpcyBjYXNlLCBzdXBwbHlpbmcgYSB2YWx1ZSBmb3IgYSBmaWVsZCBpbnZvbHZlcyB0aHJlZSBhY3Rpb25zOiBzZWxlY3RpbmcgdGhlIGZpZWxkIGZvciBmaWxsLWluLCBzZWxlY3RpbmcgYSBjaG9pY2UgZm9yIHRoZSBmaWxsLWluIHZhbHVlLCBhbmQgbGVhdmluZyB0aGF0IGZpZWxkLCB3aGljaCBmaW5hbGl6ZXMgb3Ig4oCcY29tbWl0c+KAnSB0aGUgZGF0YSBjaG9pY2UgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgb3IgY2hhbmdpbmcgb2YgdGhpcyBkYXRhLiBJZiB0aGlzIGZsYWcgaXMgb24sIHRoZW4gcHJvY2Vzc2luZyBkb2VzIG5vdCB3YWl0IGZvciBsZWF2aW5nIHRoZSBmaWVsZCBhY3Rpb24gdG8gb2NjdXIsIGJ1dCBpbW1lZGlhdGVseSBwcm9jZWVkcyB0byB0aGUgdGhpcmQgc3RlcC5cbiAgICAgICAgKiBUaGlzIG9wdGlvbiBlbmFibGVzIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGFuIGFjdGlvbiBvbmNlIGEgc2VsZWN0aW9uIGlzIG1hZGUsIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGV4aXQgdGhlIGZpZWxkLiBJZiBjbGVhciwgdGhlIG5ldyB2YWx1ZSBpcyBub3QgY29tbWl0dGVkIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tbWl0T25TZWxDaGFuZ2VcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbW1pdE9uU2VsQ2hhbmdlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNob2ljZUZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtTGlzdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1DaG9pY2VGaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ2hlbHZldGljYSc7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICB0aGlzLmNvbWJvID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtTGlzdEJveCwgQWNyb0Zvcm1DaG9pY2VGaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNvbWJvQm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1Db21ib0JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1MaXN0Qm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY29tYm8gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNvbWJvQm94LCBBY3JvRm9ybUxpc3RCb3gpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1FZGl0Qm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1Db21ib0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1FZGl0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNvbWJvQm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtRWRpdEJveCwgQWNyb0Zvcm1Db21ib0JveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSBcIi9CdG5cIjtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmFkaW8gYnV0dG9ucyBvbmx5KSBJZiBzZXQsIGV4YWN0bHkgb25lIHJhZGlvIGJ1dHRvbiBzaGFsbCBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXM7IHNlbGVjdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiBoYXMgbm8gZWZmZWN0LiBJZiBjbGVhciwgY2xpY2tpbmcgdGhlIHNlbGVjdGVkIGJ1dHRvbiBkZXNlbGVjdHMgaXQsIGxlYXZpbmcgbm8gYnV0dG9uIHNlbGVjdGVkLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI25vVG9nZ2xlVG9PZmZcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub1RvZ2dsZVRvT2ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHNldCBvZiByYWRpbyBidXR0b25zOyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgY2hlY2tib3guIFRoaXMgZmxhZyBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIFB1c2hidXR0b24gZmxhZyBpcyBjbGVhci4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcmFkaW9cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpbycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBwdXNoYnV0dG9uIHRoYXQgZG9lcyBub3QgcmV0YWluIGEgcGVybWFuZW50IHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3B1c2hCdXR0b25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwdXNoQnV0dG9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgd2l0aGluIGEgcmFkaW8gYnV0dG9uIGZpZWxkIHRoYXQgdXNlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgb24gc3RhdGUgd2lsbCB0dXJuIG9uIGFuZCBvZmYgaW4gdW5pc29uOyB0aGF0IGlzIGlmIG9uZSBpcyBjaGVja2VkLCB0aGV5IGFyZSBhbGwgY2hlY2tlZC4gSWYgY2xlYXIsIHRoZSBidXR0b25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKHRoZSBzYW1lIGJlaGF2aW9yIGFzIEhUTUwgcmFkaW8gYnV0dG9ucykuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb0lzVW5pc29uXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmFkaW9Jc1VuaXNvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKF9NSykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIF9NSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPj4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJlcXVpcmVkIGlmIHRoZSBhcHBlYXJhbmNlIGRpY3Rpb25hcnkgQVAgY29udGFpbnMgb25lIG9yIG1vcmUgc3ViZGljdGlvbmFyaWVzOyBQREYgMS4yKSBUaGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RhdGUsIHdoaWNoIHNlbGVjdHMgdGhlIGFwcGxpY2FibGUgYXBwZWFyYW5jZSBzdHJlYW0gZnJvbSBhbiBhcHBlYXJhbmNlIHN1YmRpY3Rpb25hcnkgKHNlZSBTZWN0aW9uIDEyLjUuNSwgXCJBcHBlYXJhbmNlIFN0cmVhbXNcIilcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2FwcGVhcmFuY2VTdGF0ZVxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXBwZWFyYW5jZVN0YXRlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVMuc3Vic3RyKDEsIF9BUy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUJ1dHRvbiwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVB1c2hCdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QdXNoQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnB1c2hCdXR0b24gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVB1c2hCdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUmFkaW9CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpbyA9IHRydWU7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX0tpZHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUmFkaW9CdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogVGhlIENoaWxkIGNsYXNzIG9mIGEgUmFkaW9CdXR0b24gKHRoZSByYWRpb0dyb3VwKSAtPiBUaGUgc2luZ2xlIEJ1dHRvbnNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hpbGRDbGFzc1xuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICogQGlnbm9yZVxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hpbGRDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfcGFyZW50O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1BhcmVudCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcGFyZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhcmVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX29wdGlvbk5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnb3B0aW9uTmFtZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25OYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29wdGlvbk5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc8PCcpO1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcvJyArIGtleSArICcgKCcgKyBfTUtba2V5XSArICcpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBGcm9tIHRoZSBQREYgcmVmZXJlbmNlOlxuICAgICAgICAqIChPcHRpb25hbCwgYnV0dG9uIGZpZWxkcyBvbmx5KSBUaGUgd2lkZ2V0IGFubm90YXRpb24ncyBub3JtYWwgY2FwdGlvbiB3aGljaCBzaGFsbCBiZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gXG4gICAgICAgICogVW5saWtlIHRoZSByZW1haW5pbmcgZW50cmllcyBsaXN0ZWQgaW4gdGhpcyBUYWJsZSB3aGljaCBhcHBseSBvbmx5IHRvIHdpZGdldCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcHVzaGJ1dHRvbiBmaWVsZHMgKHNlZSBQdXNoYnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLCB0aGUgQ0EgZW50cnkgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBidXR0b24gZmllbGQsIGluY2x1ZGluZyBjaGVjayBib3hlcyAoc2VlIENoZWNrIEJveGVzIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikgYW5kIHJhZGlvIGJ1dHRvbnMgKFJhZGlvIEJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKS5cbiAgICAgICAgKlxuICAgICAgICAqIC0gJzgnID0gQ3Jvc3MsIFxuICAgICAgICAqIC0gJ2wnID0gIENpcmNsZSxcbiAgICAgICAgKiAtICcnID0gbm90aGluZ1xuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2NhcHRpb25cbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhcHRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSy5DQSB8fCAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LLkNBID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0FTO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0FTJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnbCc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09mZic7XG4gICAgICAgIC8vIHRvZG86IHNldCBBcHBlYXJhbmNlVHlwZSBhcyB2YXJpYWJsZSB0aGF0IGNhbiBiZSBzZXQgZnJvbSB0aGVcbiAgICAgICAgLy8gb3V0c2lkZS4uLlxuICAgICAgICB0aGlzLl9BcHBlYXJhbmNlVHlwZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIC8vIFRoZSBEZWZhdWx0IGFwcGVhcmFuY2VUeXBlIGlzIHRoZSBDaXJjbGVcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHRoaXMuX0FwcGVhcmFuY2VUeXBlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0odGhpcy5vcHRpb25OYW1lKTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaGlsZENsYXNzLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICBpZiAoISgnY3JlYXRlQXBwZWFyYW5jZVN0cmVhbScgaW4gYXBwZWFyYW5jZSAmJiAnZ2V0Q0EnIGluIGFwcGVhcmFuY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBhc3NpZ24gQXBwZWFyYW5jZSB0byBSYWRpb0J1dHRvbi4gQXBwZWFyYW5jZSB3YXMgSW52YWxpZCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgb2JqSWQgaW4gdGhpcy5LaWRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5LaWRzLmhhc093blByb3BlcnR5KG9iaklkKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuS2lkc1tvYmpJZF07XG4gICAgICAgICAgICAgICAgY2hpbGQuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBhcHBlYXJhbmNlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oY2hpbGQub3B0aW9uTmFtZSk7XG4gICAgICAgICAgICAgICAgY2hpbGQuY2FwdGlvbiA9IGFwcGVhcmFuY2UuZ2V0Q0EoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBY3JvRm9ybVJhZGlvQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAvLyBDcmVhdGUgbmV3IENoaWxkIGZvciBSYWRpb0dyb3VwXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyBBY3JvRm9ybUNoaWxkQ2xhc3MoKTtcbiAgICAgICAgY2hpbGQuUGFyZW50ID0gdGhpcztcbiAgICAgICAgY2hpbGQub3B0aW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIEFkZCB0byBQYXJlbnRcbiAgICAgICAgdGhpcy5LaWRzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgIGFkZEZpZWxkLmNhbGwodGhpcywgY2hpbGQpO1xuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGVja0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNoZWNrQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnemFwZmRpbmdiYXRzJztcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJzMnO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdGF0ZSA9ICdPbic7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIk9uXCI7XG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSgpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoZWNrQm94LCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtVGV4dEZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSAnL1R4JztcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0OyBpZiBjbGVhciwgdGhlIGZpZWxk4oCZcyB0ZXh0IHNoYWxsIGJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgbGluZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtdWx0aWxpbmVcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtdWx0aWxpbmUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHJlcHJlc2VudHMgdGhlIHBhdGhuYW1lIG9mIGEgZmlsZSB3aG9zZSBjb250ZW50cyBzaGFsbCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZmlsZVNlbGVjdFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZpbGVTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTcGVsbENoZWNrJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IHNjcm9sbCAoaG9yaXpvbnRhbGx5IGZvciBzaW5nbGUtbGluZSBmaWVsZHMsIHZlcnRpY2FsbHkgZm9yIG11bHRpcGxlLWxpbmUgZmllbGRzKSB0byBhY2NvbW1vZGF0ZSBtb3JlIHRleHQgdGhhbiBmaXRzIHdpdGhpbiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUuIE9uY2UgdGhlIGZpZWxkIGlzIGZ1bGwsIG5vIGZ1cnRoZXIgdGV4dCBzaGFsbCBiZSBhY2NlcHRlZCBmb3IgaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nOyBmb3Igbm9uaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nLCB0aGUgZmlsbGVyIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGFkZCBtb3JlIGNoYXJhY3RlciB0aGFuIHdpbGwgdmlzaWJseSBmaXQgaW4gdGhlIGRlZmluZWQgYXJlYS4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTY3JvbGxcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNjcm9sbCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIE1heSBiZSBzZXQgb25seSBpZiB0aGUgTWF4TGVuIGVudHJ5IGlzIHByZXNlbnQgaW4gdGhlIHRleHQgZmllbGQgZGljdGlvbmFyeSAoc2VlIFRhYmxlIDIyOSkgYW5kIGlmIHRoZSBNdWx0aWxpbmUsIFBhc3N3b3JkLCBhbmQgRmlsZVNlbGVjdCBmbGFncyBhcmUgY2xlYXIuIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGJlIGF1dG9tYXRpY2FsbHkgZGl2aWRlZCBpbnRvIGFzIG1hbnkgZXF1YWxseSBzcGFjZWQgcG9zaXRpb25zLCBvciBjb21icywgYXMgdGhlIHZhbHVlIG9mIE1heExlbiwgYW5kIHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGludG8gdGhvc2UgY29tYnMuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjY29tYlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWInLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIGEgcmljaCB0ZXh0IHN0cmluZyAoc2VlIDEyLjcuMy40LCDigJxSaWNoIFRleHQgU3RyaW5nc+KAnSkuIElmIHRoZSBmaWVsZCBoYXMgYSB2YWx1ZSwgdGhlIFJWIGVudHJ5IG9mIHRoZSBmaWVsZCBkaWN0aW9uYXJ5IChUYWJsZSAyMjIpIHNoYWxsIHNwZWNpZnkgdGhlIHJpY2ggdGV4dCBzdHJpbmcuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcmljaFRleHRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyaWNoVGV4dCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NYXhMZW4gPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01heExlbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmllbGTigJlzIHRleHQsIGluIGNoYXJhY3RlcnMuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjbWF4TGVuZ3RoXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtYXhMZW5ndGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX01heExlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0FwcGVhcmFuY2VTdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLlYgfHwgdGhpcy5EVik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtVGV4dEZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1UZXh0RmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtVGV4dEZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgaW50ZW5kZWQgZm9yIGVudGVyaW5nIGEgc2VjdXJlIHBhc3N3b3JkIHRoYXQgc2hvdWxkIG5vdCBiZSBlY2hvZWQgdmlzaWJseSB0byB0aGUgc2NyZWVuLiBDaGFyYWN0ZXJzIHR5cGVkIGZyb20gdGhlIGtleWJvYXJkIHNoYWxsIGluc3RlYWQgYmUgZWNob2VkIGluIHNvbWUgdW5yZWFkYWJsZSBmb3JtLCBzdWNoIGFzIGFzdGVyaXNrcyBvciBidWxsZXQgY2hhcmFjdGVycy5cbiAgICAgICAgKiBOT1RFIFRvIHByb3RlY3QgcGFzc3dvcmQgY29uZmlkZW50aWFsaXR5LCByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQgaW4gdGhlIFBERiBmaWxlIGlmIHRoaXMgZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcGFzc3dvcmRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXNzd29yZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVBhc3N3b3JkRmllbGQsIEFjcm9Gb3JtVGV4dEZpZWxkKTtcblxuXG4gICAgLy8gQ29udGFpbnMgTWV0aG9kcyBmb3IgY3JlYXRpbmcgc3RhbmRhcmQgYXBwZWFyYW5jZXNcbiAgICB2YXIgQWNyb0Zvcm1BcHBlYXJhbmNlID0ge1xuICAgICAgICBDaGVja0JveDoge1xuICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICBOOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc05vcm1hbFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc1B1c2hEb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgT2ZmOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBPbiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJNQ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQlRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVNQ1wiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIGZvcm1PYmplY3QuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCkgKyBcIiBcIiArIGYyKGhlaWdodCkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIDEgcmdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCAtIDEpICsgXCIgXCIgKyBmMihoZWlnaHQgLSAxKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9mZiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIFJhZGlvQnV0dG9uOiB7XG4gICAgICAgICAgICBDaXJjbGU6IHtcbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LkRbbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2wnO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIFJhZGl1cyBvZiB0aGUgQ2lyY2xlIHJlbGF0aXZlIHRvIG1pbihoZWlnaHQsIHdpZHRoKSBvZiBmb3JtT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID8gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzQmV6aWVyID0gTnVtYmVyKChEb3RSYWRpdXMgKiBjKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBGb2xsb3dpbmcgaXMgYSBDaXJjbGUgY3JlYXRlZCB3aXRoIEJlemllci1DdXJ2ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRjID0gTnVtYmVyKChEb3RSYWRpdXMgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBkYyArIFwiIFwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgXCIgKyBrYyArIFwiIFwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIFwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgayArIFwiIC1cIiArIGtjICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCAtXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goa2MgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgQ3Jvc3M6IHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgQWN0dWFsIEFwcGVhcmFuY2VEaWN0aW9uYXJ5LVJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPZmYnOiBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNQdXNoRG93bjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0Q0E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc4J1xuICAgICAgICAgICAgICAgIH0sXG5cblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNyb3NzID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMSBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAtIDIpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC0gMikgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngxLngpICsgXCIgXCIgKyBmMihjcm9zcy54MS55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngyLngpICsgXCIgXCIgKyBmMihjcm9zcy54Mi55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLng0LngpICsgXCIgXCIgKyBmMihjcm9zcy54NC55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngzLngpICsgXCIgXCIgKyBmMihjcm9zcy54My55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwic1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgQXBwZWFyYW5jZVxuICAgICAgICAgICogXG4gICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgLy8gU2V0IEhlbHZldGljYSB0byBTdGFuZGFyZCBGb250IChzaXplOiBhdXRvKVxuICAgICAgICAgICAgLy8gQ29sb3I6IEJsYWNrXG4gICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLycgKyBmb250S2V5ICsgJyAnICsgZm9udFNpemUgKyAnIFRmICcgKyBlbmNvZGVkQ29sb3I7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbCA9IHtcbiAgICAgICAgQmV6aWVyX0M6IDAuNTUxOTE1MDI0NDk0LFxuXG4gICAgICAgIGNhbGN1bGF0ZUNyb3NzOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBhID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICAgIHZhciBjcm9zcyA9IHtcbiAgICAgICAgICAgICAgICB4MTogeyAvLyB1cHBlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgyOiB7IC8vIGxvd2VyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4MzogeyAvLyBsb3dlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4NDogeyAvLyB1cHBlclJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHg6ICgod2lkdGggLSBhKSAvIDIpICsgYSxcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpICsgYSwvLyBoZWlnaHQgLSBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGNyb3NzO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1PYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNjYWxlKGZvcm1PYmplY3QuUmVjdFszXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gUHVibGljOlxuXG4gICAgLyoqXG4gICAgKiBBZGQgYW4gQWNyb0Zvcm0tRmllbGQgdG8gdGhlIGpzUERGLWluc3RhbmNlXG4gICAgKlxuICAgICogQG5hbWUgYWRkRmllbGRcbiAgICAqIEBmdW5jdGlvbiBcbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT2JqZWN0XG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKi9cbiAgICB2YXIgYWRkRmllbGQgPSBqc1BERkFQSS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICBpbml0aWFsaXplQWNyb0Zvcm0uY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAoZmllbGRPYmplY3QgaW5zdGFuY2VvZiBBY3JvRm9ybUZpZWxkKSB7XG4gICAgICAgICAgICBwdXRGb3JtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZE9iamVjdC5wYWdlID0gc2NvcGUuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQnV0dG9uXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybUJ1dHRvbn0gb3B0aW9uc1xuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZEJ1dHRvbiA9IGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgICAgaWYgKGJ1dHRvbiBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRCdXR0b24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgYnV0dG9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRUZXh0RmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtVGV4dEZpZWxkfSB0ZXh0RmllbGRcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRUZXh0RmllbGQgPSBmdW5jdGlvbiAodGV4dEZpZWxkKSB7XG4gICAgICAgIGlmICh0ZXh0RmllbGQgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkVGV4dEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIHRleHRGaWVsZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQ2hvaWNlRmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQ2hvaWNlRmllbGR9IFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZENob2ljZUZpZWxkID0gZnVuY3Rpb24gKGNob2ljZUZpZWxkKSB7XG4gICAgICAgIGlmIChjaG9pY2VGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hvaWNlRmllbGQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZENob2ljZUZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIGNob2ljZUZpZWxkKTtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxPYmogPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNob2ljZUZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkxpc3RCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ29tYm9Cb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJCdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUHVzaEJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDaGVja0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCJcbiAgICApIHtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0gPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgICAgICBnbG9iYWxPYmpbXCJMaXN0Qm94XCJdID0gQWNyb0Zvcm1MaXN0Qm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJDb21ib0JveFwiXSA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkVkaXRCb3hcIl0gPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkJ1dHRvblwiXSA9IEFjcm9Gb3JtQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIkNoZWNrQm94XCJdID0gQWNyb0Zvcm1DaGVja0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiVGV4dEZpZWxkXCJdID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIlBhc3N3b3JkRmllbGRcIl0gPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG5cbiAgICAgICAgLy8gYmFja3dhcmRzQ29tcGF0aWJpbGl0eVxuICAgICAgICBnbG9iYWxPYmpbXCJBY3JvRm9ybVwiXSA9IHsgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQWNyb0Zvcm0tQ2xhc3NlcyBhcmUgbm90IHBvcHVsYXRlZCBpbnRvIGdsb2JhbC1uYW1lc3BhY2UsIGJlY2F1c2UgdGhlIGNsYXNzLU5hbWVzIGV4aXN0IGFscmVhZHkuIFRoaXMgYXZvaWRzIGNvbmZsaWN0cyB3aXRoIHRoZSBhbHJlYWR5IHVzZWQgZnJhbWV3b3JrLlwiKTtcbiAgICB9XG5cbiAgICBqc1BERkFQSS5BY3JvRm9ybUNob2ljZUZpZWxkID0gQWNyb0Zvcm1DaG9pY2VGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUxpc3RCb3ggPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1Db21ib0JveCA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1FZGl0Qm94ID0gQWNyb0Zvcm1FZGl0Qm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQnV0dG9uID0gQWNyb0Zvcm1CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1QdXNoQnV0dG9uID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUmFkaW9CdXR0b24gPSBBY3JvRm9ybVJhZGlvQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hlY2tCb3ggPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtVGV4dEZpZWxkID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1QYXNzd29yZEZpZWxkID0gQWNyb0Zvcm1QYXNzd29yZEZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQXBwZWFyYW5jZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZTtcblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtID0ge1xuICAgICAgICBDaG9pY2VGaWVsZDogQWNyb0Zvcm1DaG9pY2VGaWVsZCxcbiAgICAgICAgTGlzdEJveDogQWNyb0Zvcm1MaXN0Qm94LFxuICAgICAgICBDb21ib0JveDogQWNyb0Zvcm1Db21ib0JveCxcbiAgICAgICAgRWRpdEJveDogQWNyb0Zvcm1FZGl0Qm94LFxuICAgICAgICBCdXR0b246IEFjcm9Gb3JtQnV0dG9uLFxuICAgICAgICBQdXNoQnV0dG9uOiBBY3JvRm9ybVB1c2hCdXR0b24sXG4gICAgICAgIFJhZGlvQnV0dG9uOiBBY3JvRm9ybVJhZGlvQnV0dG9uLFxuICAgICAgICBDaGVja0JveDogQWNyb0Zvcm1DaGVja0JveCxcbiAgICAgICAgVGV4dEZpZWxkOiBBY3JvRm9ybVRleHRGaWVsZCxcbiAgICAgICAgUGFzc3dvcmRGaWVsZDogQWNyb0Zvcm1QYXNzd29yZEZpZWxkLFxuICAgICAgICBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2VcbiAgICB9O1xuXG4gICAganNQREYuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG59KShqc3BkZi5qc1BERiwgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyB8fCB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIgIC8qKlxuICAgKiBqc1BERiBmcm9tSFRNTCBwbHVnaW4uIEJFVEEgc3RhZ2UuIEFQSSBzdWJqZWN0IHRvIGNoYW5nZS4gTmVlZHMgYnJvd3NlclxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgV2lsbG93IFN5c3RlbXMgQ29ycG9yYXRpb24sIHdpbGxvdy1zeXN0ZW1zLmNvbVxuICAgKiAgICAgICAgICAgICAgIDIwMTQgSnVhbiBQYWJsbyBHYXZpcmlhLCBodHRwczovL2dpdGh1Yi5jb20vanVhbnBnYXZpcmlhXG4gICAqICAgICAgICAgICAgICAgMjAxNCBEaWVnbyBDYXNvcnJhbiwgaHR0cHM6Ly9naXRodWIuY29tL2RpZWdvY3JcbiAgICogICAgICAgICAgICAgICAyMDE0IERhbmllbCBIdXNhciwgaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGh1c2FyXG4gICAqICAgICAgICAgICAgICAgMjAxNCBXb2xmZ2FuZyBHYXNzbGVyLCBodHRwczovL2dpdGh1Yi5jb20vd29vbGZnXG4gICAqICAgICAgICAgICAgICAgMjAxNCBTdGV2ZW4gU3B1bmdpbiwgaHR0cHM6Ly9naXRodWIuY29tL2ZsYW1lbmNvXG4gICAqXG4gICAqIEBsaWNlbnNlXG4gICAqIFxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cbiAgdmFyIGpzcGRmID0gcmVxdWlyZShcImpzcGRmXCIpO1xuXG4gIChmdW5jdGlvbiAoanNQREZBUEkpIHtcbiAgICB2YXIgY2xvbmUsIF9EcmlsbEZvckNvbnRlbnQsIEZvbnROYW1lREIsIEZvbnRTdHlsZU1hcCwgVGV4dEFsaWduTWFwLCBGb250V2VpZ2h0TWFwLCBGbG9hdE1hcCwgQ2xlYXJNYXAsIEdldENTUywgUHVyZ2VXaGl0ZVNwYWNlLCBSZW5kZXJlciwgUmVzb2x2ZUZvbnQsIFJlc29sdmVVbml0ZWROdW1iZXIsIFVuaXRlZE51bWJlck1hcCwgZWxlbWVudEhhbmRsZWRFbHNld2hlcmUsIGltYWdlcywgbG9hZEltZ3MsIGNoZWNrRm9yRm9vdGVyLCBwcm9jZXNzLCB0YWJsZVRvSnNvbjtcblxuICAgIGNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgQ2xvbmUucHJvdG90eXBlID0gb2JqO1xuICAgICAgICByZXR1cm4gbmV3IENsb25lKCk7XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBDbG9uZSgpIHt9XG4gICAgfSgpO1xuXG4gICAgUHVyZ2VXaGl0ZVNwYWNlID0gZnVuY3Rpb24gUHVyZ2VXaGl0ZVNwYWNlKGFycmF5KSB7XG4gICAgICB2YXIgZnJhZ21lbnQsIGksIGwsIGxUcmltbWVkLCByLCByVHJpbW1lZCwgdHJhaWxpbmdTcGFjZTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgbFRyaW1tZWQgPSBmYWxzZTtcbiAgICAgIHJUcmltbWVkID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICghbFRyaW1tZWQgJiYgaSAhPT0gbCkge1xuICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldID0gYXJyYXlbaV0udHJpbUxlZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBsVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGkgPSBsIC0gMTtcblxuICAgICAgd2hpbGUgKGwgJiYgIXJUcmltbWVkICYmIGkgIT09IC0xKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltUmlnaHQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICByVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpLS07XG4gICAgICB9XG5cbiAgICAgIHIgPSAvXFxzKyQvZztcbiAgICAgIHRyYWlsaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgaSA9IDA7XG5cbiAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgIC8vIExlYXZlIHRoZSBsaW5lIGJyZWFrcyBpbnRhY3RcbiAgICAgICAgaWYgKGFycmF5W2ldICE9IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcblxuICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnRyaW1MZWZ0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICB0cmFpbGluZ1NwYWNlID0gci50ZXN0KGZyYWdtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVtpXSA9IGZyYWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyID0gZnVuY3Rpb24gUmVuZGVyZXIocGRmLCB4LCB5LCBzZXR0aW5ncykge1xuICAgICAgdGhpcy5wZGYgPSBwZGY7XG4gICAgICB0aGlzLnggPSB4O1xuICAgICAgdGhpcy55ID0geTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsgLy9saXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGFmdGVyIGVhY2ggZWxlbWVudC1yZW5kZXJpbmcgcHJvY2Vzc1xuXG4gICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gW107XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBSZXNvbHZlRm9udCA9IGZ1bmN0aW9uIFJlc29sdmVGb250KGNzc19mb250X2ZhbWlseV9zdHJpbmcpIHtcbiAgICAgIHZhciBuYW1lLCBwYXJ0LCBwYXJ0cztcbiAgICAgIG5hbWUgPSB2b2lkIDA7XG4gICAgICBwYXJ0cyA9IGNzc19mb250X2ZhbWlseV9zdHJpbmcuc3BsaXQoXCIsXCIpO1xuICAgICAgcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICAgIHdoaWxlICghbmFtZSAmJiBwYXJ0KSB7XG4gICAgICAgIG5hbWUgPSBGb250TmFtZURCW3BhcnQudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcblxuICAgIFJlc29sdmVVbml0ZWROdW1iZXIgPSBmdW5jdGlvbiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcpIHtcbiAgICAgIC8vSUU4IGlzc3Vlc1xuICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcgPT09IFwiYXV0b1wiID8gXCIwcHhcIiA6IGNzc19saW5lX2hlaWdodF9zdHJpbmc7XG5cbiAgICAgIGlmIChjc3NfbGluZV9oZWlnaHRfc3RyaW5nLmluZGV4T2YoXCJlbVwiKSA+IC0xICYmICFpc05hTihOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpKSkge1xuICAgICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcImVtXCIsIFwiXCIpKSAqIDE4LjcxOSArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcInB0XCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwicHRcIiwgXCJcIikpICogMS4zMzMgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWwsIHVuZGVmLCB2YWx1ZTtcbiAgICAgIHVuZGVmID0gdm9pZCAwO1xuICAgICAgbm9ybWFsID0gMTYuMDA7XG4gICAgICB2YWx1ZSA9IFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB7XG4gICAgICAgIFwieHgtc21hbGxcIjogOSxcbiAgICAgICAgXCJ4LXNtYWxsXCI6IDExLFxuICAgICAgICBzbWFsbDogMTMsXG4gICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgIGxhcmdlOiAxOSxcbiAgICAgICAgXCJ4LWxhcmdlXCI6IDIzLFxuICAgICAgICBcInh4LWxhcmdlXCI6IDI4LFxuICAgICAgICBhdXRvOiAwXG4gICAgICB9W2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID0gcGFyc2VGbG9hdChjc3NfbGluZV9oZWlnaHRfc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gdmFsdWUgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5tYXRjaCgvKFtcXGRcXC5dKykocHgpLyk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHBhcnNlRmxvYXQodmFsdWVbMV0pIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gMTtcbiAgICB9O1xuXG4gICAgR2V0Q1NTID0gZnVuY3Rpb24gR2V0Q1NTKGVsZW1lbnQpIHtcbiAgICAgIHZhciBjc3MsIHRtcCwgY29tcHV0ZWRDU1NFbGVtZW50O1xuXG4gICAgICBjb21wdXRlZENTU0VsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIGNvbXBDU1M7XG5cbiAgICAgICAgY29tcENTUyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5jdXJyZW50U3R5bGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5zdHlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0oZWwpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoLy1cXEQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBDU1NbcHJvcF07XG4gICAgICAgIH07XG4gICAgICB9KGVsZW1lbnQpO1xuXG4gICAgICBjc3MgPSB7fTtcbiAgICAgIHRtcCA9IHZvaWQgMDtcbiAgICAgIGNzc1tcImZvbnQtZmFtaWx5XCJdID0gUmVzb2x2ZUZvbnQoY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1mYW1pbHlcIikpIHx8IFwidGltZXNcIjtcbiAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSBGb250U3R5bGVNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1zdHlsZVwiKV0gfHwgXCJub3JtYWxcIjtcbiAgICAgIGNzc1tcInRleHQtYWxpZ25cIl0gPSBUZXh0QWxpZ25NYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwidGV4dC1hbGlnblwiKV0gfHwgXCJsZWZ0XCI7XG4gICAgICB0bXAgPSBGb250V2VpZ2h0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtd2VpZ2h0XCIpXSB8fCBcIm5vcm1hbFwiO1xuXG4gICAgICBpZiAodG1wID09PSBcImJvbGRcIikge1xuICAgICAgICBpZiAoY3NzW1wiZm9udC1zdHlsZVwiXSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSB0bXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcCArIGNzc1tcImZvbnQtc3R5bGVcIl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3NzW1wiZm9udC1zaXplXCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXNpemVcIikpIHx8IDE7XG4gICAgICBjc3NbXCJsaW5lLWhlaWdodFwiXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibGluZS1oZWlnaHRcIikpIHx8IDE7XG4gICAgICBjc3NbXCJkaXNwbGF5XCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiZGlzcGxheVwiKSA9PT0gXCJpbmxpbmVcIiA/IFwiaW5saW5lXCIgOiBcImJsb2NrXCI7XG4gICAgICB0bXAgPSBjc3NbXCJkaXNwbGF5XCJdID09PSBcImJsb2NrXCI7XG4gICAgICBjc3NbXCJtYXJnaW4tdG9wXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tYm90dG9tXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctYm90dG9tXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tbGVmdFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXJpZ2h0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1yaWdodFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWdlLWJyZWFrLWJlZm9yZVwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZ2UtYnJlYWstYmVmb3JlXCIpIHx8IFwiYXV0b1wiOyAvL2Zsb2F0IGFuZCBjbGVhcmluZyBvZiBmbG9hdHNcblxuICAgICAgY3NzW1wiZmxvYXRcIl0gPSBGbG9hdE1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJjc3NGbG9hdFwiKV0gfHwgXCJub25lXCI7XG4gICAgICBjc3NbXCJjbGVhclwiXSA9IENsZWFyTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNsZWFyXCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNvbG9yXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiY29sb3JcIik7XG4gICAgICByZXR1cm4gY3NzO1xuICAgIH07XG5cbiAgICBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSA9IGZ1bmN0aW9uIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVycywgaSwgaXNIYW5kbGVkRWxzZXdoZXJlLCBsLCBjbGFzc05hbWVzO1xuICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gZmFsc2U7XG4gICAgICBpID0gdm9pZCAwO1xuICAgICAgbCA9IHZvaWQgMDtcbiAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzW1wiI1wiICsgZWxlbWVudC5pZF07XG5cbiAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbZWxlbWVudC5ub2RlTmFtZV07XG5cbiAgICAgIGlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBUcnkgY2xhc3MgbmFtZXNcblxuXG4gICAgICBjbGFzc05hbWVzID0gdHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykgOiBbXTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbJy4nICsgY2xhc3NOYW1lc1tpXV07XG5cbiAgICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNIYW5kbGVkRWxzZXdoZXJlO1xuICAgIH07XG5cbiAgICB0YWJsZVRvSnNvbiA9IGZ1bmN0aW9uIHRhYmxlVG9Kc29uKHRhYmxlLCByZW5kZXJlcikge1xuICAgICAgdmFyIGRhdGEsIGhlYWRlcnMsIGksIGosIHJvd0RhdGEsIHRhYmxlUm93LCB0YWJsZV9vYmosIHRhYmxlX3dpdGgsIGNlbGwsIGw7XG4gICAgICBkYXRhID0gW107XG4gICAgICBoZWFkZXJzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSAwO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGwgKz0gdGFibGUucm93c1swXS5jZWxsc1tqXS5jb2xTcGFuO1xuICAgICAgfVxuICAgICAgdGFibGVfd2l0aCA9IHRhYmxlLmNsaWVudFdpZHRoO1xuXG4gICAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgY2VsbCA9IHRhYmxlLnJvd3NbMF0uY2VsbHNbaV07XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjZWxsLmNvbFNwYW47IGorKykge1xuICAgICAgICAgIGhlYWRlcnNbaSArIGpdID0ge1xuICAgICAgICAgICAgbmFtZTogY2VsbC50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpICsgJ18nICsgaixcbiAgICAgICAgICAgIHByb21wdDogY2VsbC50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKSxcbiAgICAgICAgICAgIHdpZHRoOiBjZWxsLmNsaWVudFdpZHRoIC8gdGFibGVfd2l0aCAqIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC8gY2VsbC5jb2xTcGFuXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gajtcbiAgICAgIH1cblxuICAgICAgaSA9IDE7XG5cbiAgICAgIHdoaWxlIChpIDwgdGFibGUucm93cy5sZW5ndGgpIHtcbiAgICAgICAgdGFibGVSb3cgPSB0YWJsZS5yb3dzW2ldO1xuICAgICAgICByb3dEYXRhID0ge307XG4gICAgICAgIGogPSAwO1xuXG4gICAgICAgIHdoaWxlIChqIDwgdGFibGVSb3cuY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93RGF0YVtoZWFkZXJzW2pdLm5hbWVdID0gdGFibGVSb3cuY2VsbHNbal0udGV4dENvbnRlbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5wdXNoKHJvd0RhdGEpO1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZV9vYmogPSB7XG4gICAgICAgIHJvd3M6IGRhdGEsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBTa2lwTm9kZSA9IHtcbiAgICAgIFNDUklQVDogMSxcbiAgICAgIFNUWUxFOiAxLFxuICAgICAgTk9TQ1JJUFQ6IDEsXG4gICAgICBPQkpFQ1Q6IDEsXG4gICAgICBFTUJFRDogMSxcbiAgICAgIFNFTEVDVDogMVxuICAgIH07XG4gICAgdmFyIGxpc3RDb3VudCA9IDE7XG5cbiAgICBfRHJpbGxGb3JDb250ZW50ID0gZnVuY3Rpb24gRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBjbiwgY25zLCBmcmFnbWVudENTUywgaSwgaXNCbG9jaywgbCwgdGFibGUyanNvbiwgY2I7XG4gICAgICBjbnMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICBjbiA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q1NTID0gR2V0Q1NTKGVsZW1lbnQpO1xuICAgICAgaXNCbG9jayA9IGZyYWdtZW50Q1NTLmRpc3BsYXkgPT09IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeSgpO1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja1N0eWxlKGZyYWdtZW50Q1NTKTtcbiAgICAgIH1cbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGNucy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjbiA9IGNuc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mKGNuKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vZXhlY3V0ZSBhbGwgd2F0Y2hlciBmdW5jdGlvbnMgdG8gZS5nLiByZXNldCBmbG9hdGluZ1xuICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgLyoqKiBIRUFERVIgcmVuZGVyaW5nICoqL1xuXG4gICAgICAgICAgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmIGNuLm5vZGVOYW1lID09PSAnSEVBREVSJykge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IGNuOyAvL3N0b3JlIG9sZCB0b3AgbWFyZ2luXG5cbiAgICAgICAgICAgIHZhciBvbGRNYXJnaW5Ub3AgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL3N1YnNjcmliZSBmb3IgbmV3IHBhZ2UgZXZlbnQgYW5kIHJlbmRlciBoZWFkZXIgZmlyc3Qgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIGZ1bmN0aW9uIChwYWdlSW5mbykge1xuICAgICAgICAgICAgICAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuICAgICAgICAgICAgICByZW5kZXJlci55ID0gb2xkTWFyZ2luVG9wOyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChoZWFkZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBtYXJnaW4gdG8gb2xkIG1hcmdpbiArIHJlbmRlcmVkIGhlYWRlciArIDEwIHNwYWNlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcbiAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCA9IHJlbmRlcmVyLnkgKyAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDggJiYgY24ubm9kZU5hbWUgPT09IFwiI2NvbW1lbnRcIikge1xuICAgICAgICAgICAgaWYgKH5jbi50ZXh0Q29udGVudC5pbmRleE9mKFwiQUREX1BBR0VcIikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiAhU2tpcE5vZGVbY24ubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAvKioqIElNQUdFIFJFTkRFUklORyAqKiovXG4gICAgICAgICAgICB2YXIgY2FjaGVkX2ltYWdlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZU5hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGNuLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gaW1hZ2VzWyhyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhY2hlZF9pbWFnZSkge1xuICAgICAgICAgICAgICBpZiAocmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQgJiYgcmVuZGVyZXIueSA+IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3ApIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gc2V0IGJhY2sgc29tZSB2YWx1ZXMgZHVlIHRvIGUuZy4gaGVhZGVyIHJlbmRlcmluZyBmb3IgbmV3IHBhZ2VcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaW1hZ2VzQ1NTID0gR2V0Q1NTKGNuKTtcbiAgICAgICAgICAgICAgdmFyIGltYWdlWCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHZhciBmb250VG9Vbml0UmF0aW8gPSAxMiAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjsgLy9kZWZpbmUgYWRkaXRpb25hbCBwYWRkaW5ncywgbWFyZ2lucyB3aGljaCBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgbWFyZ2luIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VMZWZ0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1sZWZ0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1sZWZ0XCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZVJpZ2h0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1yaWdodFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctcmlnaHRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlVG9wID0gKGltYWdlc0NTU1tcIm1hcmdpbi10b3BcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLXRvcFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VCb3R0b20gPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWJvdHRvbVwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctYm90dG9tXCJdKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBmbG9hdCBpcyBzZXQgdG8gcmlnaHQsIG1vdmUgdGhlIGltYWdlIHRvIHRoZSByaWdodCBib3JkZXJcbiAgICAgICAgICAgICAgLy9hZGQgc3BhY2UgaWYgbWFyZ2luIGlzIHNldFxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gIT09IHVuZGVmaW5lZCAmJiBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVggKz0gcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLSBjbi53aWR0aCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSBhZGRpdGlvbmFsU3BhY2VMZWZ0O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZEltYWdlKGNhY2hlZF9pbWFnZSwgaW1hZ2VYLCByZW5kZXJlci55ICsgYWRkaXRpb25hbFNwYWNlVG9wLCBjbi53aWR0aCwgY24uaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gdW5kZWZpbmVkOyAvL2lmIHRoZSBmbG9hdCBwcm9wIGlzIHNwZWNpZmllZCB3ZSBoYXZlIHRvIGZsb2F0IHRoZSB0ZXh0IGFyb3VuZCB0aGUgaW1hZ2VcblxuICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAncmlnaHQnIHx8IGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgLy9hZGQgZnVuY3Rpb250IHRvIHNldCBiYWNrIGNvb3JkaW5hdGVzIGFmdGVyIGltYWdlIHJlbmRlcmluZ1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKGRpZmZYLCB0aHJlc2hvbGRZLCBkaWZmV2lkdGgsIGVsKSB7XG4gICAgICAgICAgICAgICAgICAvL3VuZG8gZHJhd2luZyBib3ggYWRhcHRpb25zIHdoaWNoIHdlcmUgc2V0IGJ5IGZsb2F0aW5nXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA+PSB0aHJlc2hvbGRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gZGlmZlg7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtlbC5ub2RlTmFtZV0gJiYgcmVuZGVyZXIueCArIGVsLndpZHRoID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmxlZnQgKyByZW5kZXJlci5wZGYubWFyZ2luc19kb2Mud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHRocmVzaG9sZFk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnID8gLWNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlTGVmdCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0IDogMCwgcmVuZGVyZXIueSArIGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSwgY24ud2lkdGgpKTsgLy9yZXNldCBmbG9hdGluZyBieSBjbGVhcjpib3RoIGRpdnNcbiAgICAgICAgICAgICAgICAvL2p1c3Qgc2V0IGN1cnNvclkgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnRcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcsIHBhZ2VzLCBlbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnkgPCB5UG9zaXRpb25BZnRlckZsb2F0aW5nICYmIHBhZ2VzID09PSByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5ub2RlVHlwZSA9PT0gMSAmJiBHZXRDU1MoZWwpLmNsZWFyID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0geVBvc2l0aW9uQWZ0ZXJGbG9hdGluZztcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCByZW5kZXJlci55ICsgY24uaGVpZ2h0LCByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSk7IC8vaWYgZmxvYXRpbmcgaXMgc2V0IHdlIGRlY3JlYXNlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgdGhlIGltYWdlIHdpZHRoXG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDsgLy9pZiBsZWZ0IGp1c3QgYWRkIHRoZSBpbWFnZSB3aWR0aCB0byB0aGUgWCBjb29yZGluYXRlXG5cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gY24ud2lkdGggKyBhZGRpdGlvbmFsU3BhY2VMZWZ0ICsgYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gZmxvYXRpbmcgaXMgc2V0LCBtb3ZlIHRoZSByZW5kZXJpbmcgY3Vyc29yIGFmdGVyIHRoZSBpbWFnZSBoZWlnaHRcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKioqIFRBQkxFIFJFTkRFUklORyAqKiovXG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiVEFCTEVcIikge1xuICAgICAgICAgICAgICBpZighcmVuZGVyZXIucGRmLmF1dG9UYWJsZSkge1xuICAgICAgICAgICAgICAgIHRhYmxlMmpzb24gPSB0YWJsZVRvSnNvbihjbiwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLnRhYmxlKHJlbmRlcmVyLngsIHJlbmRlcmVyLnksIHRhYmxlMmpzb24ucm93cywgdGFibGUyanNvbi5oZWFkZXJzLCB7XG4gICAgICAgICAgICAgICAgICBhdXRvU2l6ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBwcmludEhlYWRlcnM6IGVsZW1lbnRIYW5kbGVycy5wcmludEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICBtYXJnaW5zOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MsXG4gICAgICAgICAgICAgICAgICBjc3M6IEdldENTUyhjbilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLnkgK1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLmhlaWdodDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hdXRvVGFibGUoeyB0aGVtZTogXCJncmlkXCIsIGh0bWw6IGNuLCBzdGFydFk6IHJlbmRlcmVyLnksXG4gICAgICAgICAgICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udDogcmVuZGVyZXIucGRmLmdldEZvbnQoKS5mb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHJlbmRlcmVyLnBkZi5nZXRGb250U2l6ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IHJlbmRlcmVyLnBkZi5nZXRUZXh0Q29sb3IoKVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogeyBcbiAgICAgICAgICAgICAgICAgICAgdG9wOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wLCBcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVuZGVyZXIueCwgXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChyZW5kZXJlci54ICArIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoKSwgXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubGFzdEF1dG9UYWJsZS5maW5hbFk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiT0xcIiB8fCBjbi5ub2RlTmFtZSA9PT0gXCJVTFwiKSB7XG4gICAgICAgICAgICAgIGxpc3RDb3VudCA9IDE7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHRlbXAgPSByZW5kZXJlci54O1xuICAgICAgICAgICAgICByZW5kZXJlci54ICs9IDIwIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDM7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggPSB0ZW1wO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJCUlwiKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl0gKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQoXCJcXHUyMDI4XCIsIGNsb25lKGZyYWdtZW50Q1NTKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY24ubm9kZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZVZhbHVlICYmIGNuLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICBpZiAoY24ucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RDb3VudCsrICsgJy4gJyArIHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IGZyYWdtZW50Q1NTW1wiZm9udC1zaXplXCJdO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRYID0gKDMgLSBmb250U2l6ZSAqIDAuNzUpICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZm9udFNpemUgKiAwLjc1ICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciByYWRpdXMgPSBmb250U2l6ZSAqIDEuNzQgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG5cbiAgICAgICAgICAgICAgICBjYiA9IGZ1bmN0aW9uIGNiKHgsIHkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGRmLmNpcmNsZSh4ICsgb2Zmc2V0WCwgeSArIG9mZnNldFksIHJhZGl1cywgJ0ZEJyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBPbmx5IGFkZCB0aGUgdGV4dCBpZiB0aGUgdGV4dCBub2RlIGlzIGluIHRoZSBib2R5IGVsZW1lbnRcbiAgICAgICAgICAgIC8vIEFkZCBjb21wYXRpYmlsaXR5IHdpdGggSUUxMVxuXG5cbiAgICAgICAgICAgIGlmICghIShjbi5vd25lckRvY3VtZW50LmJvZHkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oY24pICYgMTYpKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQodmFsdWUsIGZyYWdtZW50Q1NTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChjbiwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgZWxlbWVudEhhbmRsZXJzLm91dFkgPSByZW5kZXJlci55O1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZXR1cm4gcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeShjYik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGltYWdlcyA9IHt9O1xuXG4gICAgbG9hZEltZ3MgPSBmdW5jdGlvbiBsb2FkSW1ncyhlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzLCBjYikge1xuICAgICAgdmFyIGltZ3MgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSxcbiAgICAgICAgICBsID0gaW1ncy5sZW5ndGgsXG4gICAgICAgICAgZm91bmRfaW1hZ2VzLFxuICAgICAgICAgIHggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ2ltYWdlc0xvYWRlZCcpO1xuICAgICAgICBjYihmb3VuZF9pbWFnZXMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2FkSW1hZ2UodXJsLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgZm91bmRfaW1hZ2VzID0gKyt4O1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnJztcblxuICAgICAgICBpbWcub25lcnJvciA9IGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xuICAgICAgICAgICAgLy90byBzdXBwb3J0IGRhdGEgdXJscyBpbiBpbWFnZXMsIHNldCB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgICAgICAvL2FzIHRob3NlIHZhbHVlcyBhcmUgbm90IHJlY29nbml6ZWQgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5kZXhPZignZGF0YTppbWFnZS8nKSA9PT0gMCkge1xuICAgICAgICAgICAgICBpbWcud2lkdGggPSB3aWR0aCB8fCBpbWcud2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgaW1nLmhlaWdodCA9IGhlaWdodCB8fCBpbWcuaGVpZ2h0IHx8IDA7XG4gICAgICAgICAgICB9IC8vaWYgdmFsaWQgaW1hZ2UgYWRkIHRvIGtub3duIGltYWdlcyBhcnJheVxuXG5cbiAgICAgICAgICAgIGlmIChpbWcud2lkdGggKyBpbWcuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBoYXNoID0gKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmw7XG4gICAgICAgICAgICAgIGltYWdlc1toYXNoXSA9IGltYWdlc1toYXNoXSB8fCBpbWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEgLS14KSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgbG9hZEltYWdlKGltZ3NbbF0uZ2V0QXR0cmlidXRlKFwic3JjXCIpLCBpbWdzW2xdLndpZHRoLCBpbWdzW2xdLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB4IHx8IGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY2hlY2tGb3JGb290ZXIgPSBmdW5jdGlvbiBjaGVja0ZvckZvb3RlcihlbGVtLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICAvL2NoZWNrIGlmIHdlIGNhbiBmb3VuZCBhIDxmb290ZXI+IGVsZW1lbnRcbiAgICAgIHZhciBmb290ZXIgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9vdGVyXCIpO1xuXG4gICAgICBpZiAoZm9vdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9vdGVyID0gZm9vdGVyWzBdOyAvL2JhZCBoYWNrIHRvIGdldCBoZWlnaHQgb2YgZm9vdGVyXG4gICAgICAgIC8vY3JlYXQgZHVtbXkgb3V0IGFuZCBjaGVjayBuZXcgeSBhZnRlciBmYWtlIHJlbmRlcmluZ1xuXG4gICAgICAgIHZhciBvbGRPdXQgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGU7XG4gICAgICAgIHZhciBvbGRZID0gcmVuZGVyZXIueTtcblxuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG5cbiAgICAgICAgdmFyIGZvb3RlckhlaWdodCA9IE1hdGguY2VpbChyZW5kZXJlci55IC0gb2xkWSkgKyA1O1xuICAgICAgICByZW5kZXJlci55ID0gb2xkWTtcbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlID0gb2xkT3V0OyAvL2FkZCAyMCUgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gKz0gZm9vdGVySGVpZ2h0OyAvL0NyZWF0ZSBmdW5jdGlvbiByZW5kZXIgaGVhZGVyIG9uIGV2ZXJ5IHBhZ2VcblxuICAgICAgICB2YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBwYWdlSW5mbyAhPT0gdW5kZWZpbmVkID8gcGFnZUluZm8ucGFnZU51bWJlciA6IDE7IC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG5cbiAgICAgICAgICB2YXIgb2xkUG9zaXRpb24gPSByZW5kZXJlci55OyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbTtcbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIC09IGZvb3RlckhlaWdodDsgLy9jaGVjayBpZiB3ZSBoYXZlIHRvIGFkZCBwYWdlIG51bWJlcnNcblxuICAgICAgICAgIHZhciBzcGFucyA9IGZvb3Rlci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy9pZiB3ZSBmaW5kIHNvbWUgc3BhbiBlbGVtZW50IHdpdGggY2xhc3MgcGFnZUNvdW50ZXIsIHNldCB0aGUgcGFnZVxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiBwYWdlQ291bnRlciBcIikgPiAtMSkge1xuICAgICAgICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgfSAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyB0b3RhbFBhZ2VzLCBzZXQgYSB2YXJpYWJsZSB3aGljaCBpcyByZXBsYWNlZCBhZnRlciByZW5kZXJpbmcgb2YgYWxsIHBhZ2VzXG5cblxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9ICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy9yZW5kZXIgZm9vdGVyIGNvbnRlbnRcblxuXG4gICAgICAgICAgX0RyaWxsRm9yQ29udGVudChmb290ZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBib3R0b20gbWFyZ2luIHRvIHByZXZpb3VzIGhlaWdodCBpbmNsdWRpbmcgdGhlIGZvb3RlciBoZWlnaHRcblxuXG4gICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vaW1wb3J0YW50IGZvciBvdGhlciBwbHVnaW5zIChlLmcuIHRhYmxlKSB0byBzdGFydCByZW5kZXJpbmcgYXQgY29ycmVjdCBwb3NpdGlvbiBhZnRlciBoZWFkZXJcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRQb3NpdGlvbjtcbiAgICAgICAgfTsgLy9jaGVjayBpZiBmb290ZXIgY29udGFpbnMgdG90YWxQYWdlcyB3aGljaCBzaG91bGQgYmUgcmVwbGFjZSBhdCB0aGUgZGlzb3Bvc2FsIG9mIHRoZSBkb2N1bWVudFxuXG5cbiAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgdG90YWxQYWdlcyBcIikgPiAtMSkge1xuICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2h0bWxSZW5kZXJpbmdGaW5pc2hlZCcsIHJlbmRlcmVyLnBkZi5wdXRUb3RhbFBhZ2VzLmJpbmQocmVuZGVyZXIucGRmLCAnIyMjanNQREZWYXJUb3RhbFBhZ2VzIyMjJyksIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvL3JlZ2lzdGVyIGV2ZW50IHRvIHJlbmRlciBmb290ZXIgb24gZXZlcnkgbmV3IHBhZ2VcblxuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgcmVuZGVyRm9vdGVyLCBmYWxzZSk7IC8vcmVuZGVyIGZvb3RlciBvbiBmaXJzdCBwYWdlXG5cbiAgICAgICAgcmVuZGVyRm9vdGVyKCk7IC8vcHJldmVudCBmb290ZXIgcmVuZGVyaW5nXG5cbiAgICAgICAgU2tpcE5vZGVbJ0ZPT1RFUiddID0gMTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MocGRmLCBlbGVtZW50LCB4LCB5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiICYmICFlbGVtZW50LnBhcmVudE5vZGUpIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyICRmcmFtZSwgJGhpZGRlbmRpdiwgZnJhbWVuYW1lLCB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICBmcmFtZW5hbWUgPSBcImpzUERGaHRtbFRleHRcIiArIERhdGUubm93KCkudG9TdHJpbmcoKSArIChNYXRoLnJhbmRvbSgpICogMTAwMCkudG9GaXhlZCgwKTtcbiAgICAgICAgICB2aXN1YWxseWhpZGRlbiA9IFwicG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XCIgKyBcImNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgLyogSUU2LCBJRTcgKi9cIiArIFwiY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1wiICsgXCJwYWRkaW5nOjAgIWltcG9ydGFudDtcIiArIFwiYm9yZGVyOjAgIWltcG9ydGFudDtcIiArIFwiaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcIiArIFwid2lkdGg6IDFweCAhaW1wb3J0YW50OyBcIiArIFwidG9wOmF1dG87XCIgKyBcImxlZnQ6LTEwMHB4O1wiICsgXCJvdmVyZmxvdzogaGlkZGVuO1wiO1xuICAgICAgICAgICRoaWRkZW5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAkaGlkZGVuZGl2LmNsYXNzTmFtZSA9IFwic2pzLXBkZi1oaWRkZW4taHRtbC1kaXZcIjtcbiAgICAgICAgICAkaGlkZGVuZGl2LnN0eWxlLmNzc1RleHQgPSB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICAkaGlkZGVuZGl2LmlubmVySFRNTCA9IFwiPGlmcmFtZSBzdHlsZT1cXFwiaGVpZ2h0OjFweDt3aWR0aDoxcHhcXFwiIG5hbWU9XFxcIlwiICsgZnJhbWVuYW1lICsgXCJcXFwiIC8+XCI7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCgkaGlkZGVuZGl2KTtcbiAgICAgICAgICAkZnJhbWUgPSB3aW5kb3cuZnJhbWVzW2ZyYW1lbmFtZV07XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50Lm9wZW4oKTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQud3JpdGVsbihlbGVtZW50KTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm4gJGZyYW1lLmRvY3VtZW50LmJvZHk7XG4gICAgICAgIH0oZWxlbWVudC5yZXBsYWNlKC88XFwvP3NjcmlwdFtePl0qPz4vZ2ksICcnKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdmFpbGFibGVGb250cyA9IE9iamVjdC5rZXlzKHBkZi5nZXRGb250TGlzdCgpKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhdmFpbGFibGVGb250cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgZm9udE5hbWUgPSBhdmFpbGFibGVGb250c1tpXTtcbiAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBmb250TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZighRm9udE5hbWVEQltmb250RmFtaWx5XSkge1xuICAgICAgICAgIEZvbnROYW1lREJbZm9udEZhbWlseV0gPSBmb250TmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgciA9IG5ldyBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSxcbiAgICAgICAgICBvdXQ7IC8vIDEuIGxvYWQgaW1hZ2VzXG4gICAgICAvLyAyLiBwcmVwYXJlIG9wdGlvbmFsIGZvb3RlciBlbGVtZW50c1xuICAgICAgLy8gMy4gcmVuZGVyIGNvbnRlbnRcblxuICAgICAgbG9hZEltZ3MuY2FsbCh0aGlzLCBlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMsIGZ1bmN0aW9uIChmb3VuZF9pbWFnZXMpIHtcbiAgICAgICAgY2hlY2tGb3JGb290ZXIoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyk7IC8vc2VuZCBldmVudCBkaXNwb3NlIGZvciBmaW5hbCB0YWtzIChlLmcuIGZvb3RlciB0b3RhbHBhZ2UgcmVwbGFjZW1lbnQpXG5cblxuICAgICAgICByLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJyk7XG4gICAgICAgIG91dCA9IHIuZGlzcG9zZSgpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhvdXQpO2Vsc2UgaWYgKGZvdW5kX2ltYWdlcykgY29uc29sZS5lcnJvcignanNQREYgV2FybmluZzogcmVuZGVyaW5nIGlzc3Vlcz8gcHJvdmlkZSBhIGNhbGxiYWNrIHRvIGZyb21IVE1MIScpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3V0IHx8IHtcbiAgICAgICAgeDogci54LFxuICAgICAgICB5OiByLnlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wYXJhZ3JhcGggPSB7XG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICBzdHlsZTogW11cbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiUVwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgeTogdGhpcy55LFxuICAgICAgICByZWFkeTogdHJ1ZVxuICAgICAgfTtcbiAgICB9OyAvL0NoZWNrcyBpZiB3ZSBoYXZlIHRvIGV4ZWN1dGUgc29tZSB3YXRjaGVyIGZ1bmN0aW9uc1xuICAgIC8vZS5nLiB0byBlbmQgdGV4dCBmbG9hdGluZyBhcm91bmQgYW4gaW1hZ2VcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgdmFyIHJldCA9IGZhbHNlO1xuICAgICAgdmFyIG5hcnJheSA9IFtdO1xuXG4gICAgICBpZiAodGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKGVsKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFycmF5LnB1c2godGhpcy53YXRjaEZ1bmN0aW9uc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaEZ1bmN0aW9ucyA9IG5hcnJheTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzID0gZnVuY3Rpb24gKGZyYWdtZW50cywgc3R5bGVzKSB7XG4gICAgICB2YXIgY3VycmVudExpbmVMZW5ndGgsIGRlZmF1bHRGb250U2l6ZSwgZmYsIGZvbnRNZXRyaWNzLCBmb250TWV0cmljc0NhY2hlLCBmcmFnbWVudCwgZnJhZ21lbnRDaG9wcGVkLCBmcmFnbWVudExlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MsIGZzLCBrLCBsaW5lLCBsaW5lcywgbWF4TGluZUxlbmd0aCwgc3R5bGU7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGsgPSB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgIGZvbnRNZXRyaWNzQ2FjaGUgPSB7fTtcbiAgICAgIGZmID0gdm9pZCAwO1xuICAgICAgZnMgPSB2b2lkIDA7XG4gICAgICBmb250TWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgc3R5bGUgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50TGVuZ3RoID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdm9pZCAwO1xuICAgICAgbGluZSA9IFtdO1xuICAgICAgbGluZXMgPSBbbGluZV07XG4gICAgICBjdXJyZW50TGluZUxlbmd0aCA9IDA7XG4gICAgICBtYXhMaW5lTGVuZ3RoID0gdGhpcy5zZXR0aW5ncy53aWR0aDtcblxuICAgICAgd2hpbGUgKGZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgc3R5bGUgPSBzdHlsZXMuc2hpZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBmZiA9IHN0eWxlW1wiZm9udC1mYW1pbHlcIl07XG4gICAgICAgICAgZnMgPSBzdHlsZVtcImZvbnQtc3R5bGVcIl07XG4gICAgICAgICAgZm9udE1ldHJpY3MgPSBmb250TWV0cmljc0NhY2hlW2ZmICsgZnNdO1xuXG4gICAgICAgICAgaWYgKCFmb250TWV0cmljcykge1xuICAgICAgICAgICAgZm9udE1ldHJpY3MgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KGZmLCBmcykubWV0YWRhdGEuVW5pY29kZTtcbiAgICAgICAgICAgIGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc10gPSBmb250TWV0cmljcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHtcbiAgICAgICAgICAgIHdpZHRoczogZm9udE1ldHJpY3Mud2lkdGhzLFxuICAgICAgICAgICAga2VybmluZzogZm9udE1ldHJpY3Mua2VybmluZyxcbiAgICAgICAgICAgIGZvbnRTaXplOiBzdHlsZVtcImZvbnQtc2l6ZVwiXSAqIGRlZmF1bHRGb250U2l6ZSxcbiAgICAgICAgICAgIHRleHRJbmRlbnQ6IGN1cnJlbnRMaW5lTGVuZ3RoXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmcmFnbWVudExlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChmcmFnbWVudCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuXG4gICAgICAgICAgaWYgKGZyYWdtZW50ID09IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExpbmVMZW5ndGggKyBmcmFnbWVudExlbmd0aCA+IG1heExpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgIGZyYWdtZW50Q2hvcHBlZCA9IHRoaXMucGRmLnNwbGl0VGV4dFRvU2l6ZShmcmFnbWVudCwgbWF4TGluZUxlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpO1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdKTtcblxuICAgICAgICAgICAgd2hpbGUgKGZyYWdtZW50Q2hvcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgbGluZSA9IFtbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXV07XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVbMF1bMF0sIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudCwgc3R5bGVdKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoICs9IGZyYWdtZW50TGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvL2lmIHRleHQgYWxpZ25tZW50IHdhcyBzZXQsIHNldCBtYXJnaW4vaW5kZW50IG9mIGVhY2ggbGluZVxuXG5cbiAgICAgIGlmIChzdHlsZVsndGV4dC1hbGlnbiddICE9PSB1bmRlZmluZWQgJiYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInIHx8IHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChsaW5lc1tpXVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrOyAvL2lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbiBsaW5lIHdlIGhhdmUgdG8gY2xvbmUgdGhlIHN0eWxlIG9iamVjdCBhcyBhbGwgbGluZXMgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdFxuXG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXSA9IGNsb25lKGxpbmVzW2ldWzBdWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc3BhY2UgPSBtYXhMaW5lTGVuZ3RoIC0gbGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2U7IC8vaWYgYWxpZ25tZW50IGlzIG5vdCByaWdodCwgaXQgaGFzIHRvIGJlIGNlbnRlciBzbyBzcGxpdCB0aGUgc3BhY2UgdG8gdGhlIGxlZnQgYW5kIHRoZSByaWdodFxuICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2UgLyAyOyAvL2lmIGp1c3RpZnkgd2FzIHNldCwgY2FsY3VsYXRlIHRoZSB3b3JkIHNwYWNpbmcgYW5kIGRlZmluZSBpbiBieSB1c2luZyB0aGUgY3NzIHByb3BlcnR5XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpIHtcbiAgICAgICAgICAgIHZhciBjb3VudFNwYWNlcyA9IGxpbmVzW2ldWzBdWzBdLnNwbGl0KCcgJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IHNwYWNlIC8gY291bnRTcGFjZXM7IC8vaWdub3JlIHRoZSBsYXN0IGxpbmUgaW4ganVzdGlmeSBtb2RlXG5cbiAgICAgICAgICAgIGlmIChpID09PSBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lcztcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLlJlbmRlclRleHRGcmFnbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBzdHlsZSkge1xuICAgICAgdmFyIGRlZmF1bHRGb250U2l6ZSwgZm9udCwgbWF4TGluZUhlaWdodDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG5cbiAgICAgIGlmICh0aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHRoaXMucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHRoaXMueSArIHRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCkpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJFVFwiLCBcIlFcIiwgXCJRXCIpO1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZU51bWJlciA9IHRoaXMucGRmLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnBkZi5nZXROdW1iZXJPZlBhZ2VzKCkgPT09IGN1cnJlbnRQYWdlTnVtYmVyKSB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wZGYuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlciArIDEpO1xuICAgICAgICB0aGlzLnkgPSB0aGlzLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwicVwiLCBcInFcIiwgXCJCVFwiLCB0aGlzLmdldFBkZkNvbG9yKHN0eWxlLmNvbG9yKSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTsgLy9tb3ZlIGN1cnNvciBieSBvbmUgbGluZSBvbiBuZXcgcGFnZVxuXG4gICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBzdHlsZVtcImxpbmUtaGVpZ2h0XCJdLCBzdHlsZVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKDAsICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMiksIFwiVGRcIik7XG4gICAgICB9XG5cbiAgICAgIGZvbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHN0eWxlW1wiZm9udC1mYW1pbHlcIl0sIHN0eWxlW1wiZm9udC1zdHlsZVwiXSk7IC8vIHRleHQgY29sb3JcblxuICAgICAgdmFyIHBkZlRleHRDb2xvciA9IHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGVbXCJjb2xvclwiXSk7XG5cbiAgICAgIGlmIChwZGZUZXh0Q29sb3IgIT09IHRoaXMubGFzdFRleHRDb2xvcikge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShwZGZUZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmxhc3RUZXh0Q29sb3IgPSBwZGZUZXh0Q29sb3I7XG4gICAgICB9IC8vc2V0IHRoZSB3b3JkIHNwYWNpbmcgZm9yIGUuZy4ganVzdGlmeSBzdHlsZVxuXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCAmJiBzdHlsZVsnd29yZC1zcGFjaW5nJ10gPiAwKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHN0eWxlWyd3b3JkLXNwYWNpbmcnXS50b0ZpeGVkKDIpLCBcIlR3XCIpO1xuICAgICAgfVxuXG5cbiAgICAgIHZhciBwZGZFc2NhcGUxNiA9IGZ1bmN0aW9uKHRleHQsIGZvbnQpIHtcbiAgICAgICAgdmFyIHdpZHRocyA9IGZvbnQubWV0YWRhdGEuVW5pY29kZS53aWR0aHM7XG4gICAgICAgIHZhciBwYWR6ID0gW1wiXCIsIFwiMFwiLCBcIjAwXCIsIFwiMDAwXCIsIFwiMDAwMFwiXTtcbiAgICAgICAgdmFyIGFyID0gW1wiXCJdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRleHQubGVuZ3RoLCB0OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgdCA9IGZvbnQubWV0YWRhdGEuY2hhcmFjdGVyVG9HbHlwaCh0ZXh0LmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEuZ2x5SWRzVXNlZC5wdXNoKHQpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEudG9Vbmljb2RlW3RdID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgIGlmICh3aWR0aHMuaW5kZXhPZih0KSA9PSAtMSkge1xuICAgICAgICAgICAgd2lkdGhzLnB1c2godCk7XG4gICAgICAgICAgICB3aWR0aHMucHVzaChbcGFyc2VJbnQoZm9udC5tZXRhZGF0YS53aWR0aE9mR2x5cGgodCksIDEwKV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodCA9PSBcIjBcIikge1xuICAgICAgICAgICAgLy9TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGNtYXAuXG4gICAgICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdCA9IHQudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgYXIucHVzaChwYWR6WzQgLSB0Lmxlbmd0aF0sIHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciB1dGY4VGV4dEZ1bmN0aW9uID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICBcbiAgICAgICAgdmFyIHN0ciA9IFwiXCIsXG4gICAgICAgICAgcyA9IDAsXG4gICAgICAgICAgY21hcENvbmZpcm07XG4gICAgICAgIHZhciBzdHJUZXh0ID0gXCJcIjtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gZm9udC5lbmNvZGluZztcbiAgICBcbiAgICAgICAgaWYgKGZvbnQuZW5jb2RpbmcgIT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RyVGV4dCA9IHRleHQ7XG4gICAgXG4gICAgICAgIGZvciAocyA9IDA7IHMgPCBzdHJUZXh0Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgaWYgKGZvbnQubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJjbWFwXCIpKSB7XG4gICAgICAgICAgICBjbWFwQ29uZmlybSA9IGZvbnQubWV0YWRhdGEuY21hcC51bmljb2RlLmNvZGVNYXBbc3RyVGV4dFtzXS5jaGFyQ29kZUF0KDApXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjbWFwQ29uZmlybSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCkgPCAyNTYgJiZcbiAgICAgICAgICAgICAgZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcIlVuaWNvZGVcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ciArPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChwYXJzZUludChmb250LmlkLnNsaWNlKDEpKSA8IDE0IHx8IGVuY29kaW5nID09PSBcIldpbkFuc2lFbmNvZGluZ1wiKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHN0ciwga2V5KVxuICAgICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGN2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSBwZGZFc2NhcGUxNihzdHIsIGZvbnQpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9OyAgICAgIFxuXG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUodGV4dCk7XG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB1dGY4VGV4dEZ1bmN0aW9uKHRleHQsIGZvbnQpO1xuICAgICAgLy8gaWYoZXNjYXBlZFRleHQgIT0gdGV4dCkge1xuICAgICAgLy8gICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgZXNjYXBlZFRleHQgKyBcIj5cIjtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCIoXCIgKyBlc2NhcGVkVGV4dCArIFwiKVwiO1xuICAgICAgLy8gfVxuXG4gICAgICB2YXIgZXNjYXBlZFRleHQgPSBcIlwiO1xuICAgICAgaWYoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIihcIiArIHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KSArIFwiKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIjxcIiArIHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCkgKyBcIj5cIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCIvXCIgKyBmb250LmlkLCAoZGVmYXVsdEZvbnRTaXplICogc3R5bGVbXCJmb250LXNpemVcIl0pLnRvRml4ZWQoMiksIFwiVGZcIiwgZXNjYXBlZFRleHQgKyBcIiBUalwiKTsgLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBiYWNrIHRvIG5ldXRyYWwgPT4gMFxuXG4gICAgICBpZiAoc3R5bGVbJ3dvcmQtc3BhY2luZyddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgXCJUd1wiKTtcbiAgICAgIH1cbiAgICB9OyAvLyBBY2NlcHRzICNGRkZGRkYsIHJnYihpbnQsaW50LGludCksIG9yIENTUyBDb2xvciBOYW1lXG5cblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5nZXRQZGZDb2xvciA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgdmFyIHRleHRDb2xvcjtcbiAgICAgIHZhciByLCBnLCBiO1xuICAgICAgdmFyIHJ4ID0gL3JnYlxccypcXChcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrXFxzKilcXCkvO1xuICAgICAgdmFyIG0gPSByeC5leGVjKHN0eWxlKTtcblxuICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICByID0gcGFyc2VJbnQobVsxXSk7XG4gICAgICAgIGcgPSBwYXJzZUludChtWzJdKTtcbiAgICAgICAgYiA9IHBhcnNlSW50KG1bM10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gXCJzdHJpbmdcIiAmJiBzdHlsZS5jaGFyQXQoMCkgIT0gJyMnKSB7XG4gICAgICAgICAgdmFyIHJnYkNvbG9yID0gbmV3IFJHQkNvbG9yKHN0eWxlKTtcblxuICAgICAgICAgIGlmIChyZ2JDb2xvci5vaykge1xuICAgICAgICAgICAgc3R5bGUgPSByZ2JDb2xvci50b0hleCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZSA9ICcjMDAwMDAwJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByID0gc3R5bGUuc3Vic3RyaW5nKDEsIDMpO1xuICAgICAgICByID0gcGFyc2VJbnQociwgMTYpO1xuICAgICAgICBnID0gc3R5bGUuc3Vic3RyaW5nKDMsIDUpO1xuICAgICAgICBnID0gcGFyc2VJbnQoZywgMTYpO1xuICAgICAgICBiID0gc3R5bGUuc3Vic3RyaW5nKDUsIDcpO1xuICAgICAgICBiID0gcGFyc2VJbnQoYiwgMTYpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnICYmIC9eI1swLTlBLUZhLWZdezZ9JC8udGVzdChyKSkge1xuICAgICAgICB2YXIgaGV4ID0gcGFyc2VJbnQoci5zdWJzdHIoMSksIDE2KTtcbiAgICAgICAgciA9IGhleCA+PiAxNiAmIDI1NTtcbiAgICAgICAgZyA9IGhleCA+PiA4ICYgMjU1O1xuICAgICAgICBiID0gaGV4ICYgMjU1O1xuICAgICAgfVxuXG4gICAgICB2YXIgZjMgPSB0aGlzLmYzO1xuXG4gICAgICBpZiAociA9PT0gMCAmJiBnID09PSAwICYmIGIgPT09IDAgfHwgdHlwZW9mIGcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRleHRDb2xvciA9IGYzKHIgLyAyNTUpICsgJyBnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRDb2xvciA9IFtmMyhyIC8gMjU1KSwgZjMoZyAvIDI1NSksIGYzKGIgLyAyNTUpLCAncmcnXS5qb2luKCcgJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0Q29sb3I7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5mMyA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCgzKTsgLy8gSWUsICUuM2ZcbiAgICB9LCBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyUGFyYWdyYXBoID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICB2YXIgYmxvY2tzdHlsZSwgZGVmYXVsdEZvbnRTaXplLCBmb250VG9Vbml0UmF0aW8sIGZyYWdtZW50cywgaSwgbCwgbGluZSwgbGluZXMsIG1heExpbmVIZWlnaHQsIG91dCwgcGFyYWdyYXBoc3BhY2luZ19hZnRlciwgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUsIHByaW9yYmxvY2tzdHlsZSwgc3R5bGVzLCBmb250U2l6ZTtcbiAgICAgIGZyYWdtZW50cyA9IFB1cmdlV2hpdGVTcGFjZSh0aGlzLnBhcmFncmFwaC50ZXh0KTtcbiAgICAgIHN0eWxlcyA9IHRoaXMucGFyYWdyYXBoLnN0eWxlO1xuICAgICAgYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGU7XG4gICAgICBwcmlvcmJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5wcmlvcmJsb2Nrc3R5bGUgfHwge307XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXSxcbiAgICAgICAgYmxvY2tzdHlsZToge30sXG4gICAgICAgIHByaW9yYmxvY2tzdHlsZTogYmxvY2tzdHlsZVxuICAgICAgfTtcblxuICAgICAgaWYgKCFmcmFnbWVudHMuam9pbihcIlwiKS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoZnJhZ21lbnRzLCBzdHlsZXMpO1xuICAgICAgbGluZSA9IHZvaWQgMDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSB2b2lkIDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGZvbnRUb1VuaXRSYXRpbyA9IGRlZmF1bHRGb250U2l6ZSAvIHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gfHwgMDtcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKE1hdGgubWF4KChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSAtIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20sIDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyID0gKChibG9ja3N0eWxlW1wibWFyZ2luLWJvdHRvbVwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy1ib3R0b21cIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDA7XG5cbiAgICAgIGlmIChibG9ja3N0eWxlWydwYWdlLWJyZWFrLWJlZm9yZSddID09PSAnYWx3YXlzJykge1xuICAgICAgICB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy10b3BcIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgfVxuXG4gICAgICBvdXQgPSB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlO1xuICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL3N0b3JlcyB0aGUgY3VycmVudCBpbmRlbnQgb2YgY3Vyc29yIHBvc2l0aW9uXG5cbiAgICAgIHZhciBjdXJyZW50SW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGxpbmVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBsID0gbGluZS5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICBpZiAobGluZVtpXVswXS50cmltKCkpIHtcbiAgICAgICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBsaW5lW2ldWzFdW1wibGluZS1oZWlnaHRcIl0sIGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0pO1xuICAgICAgICAgICAgZm9udFNpemUgPSBsaW5lW2ldWzFdW1wiZm9udC1zaXplXCJdICogNztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gLy9pZiB3ZSBoYXZlIHRvIG1vdmUgdGhlIGN1cnNvciB0byBhZGFwdCB0aGUgaW5kZW50XG5cblxuICAgICAgICB2YXIgaW5kZW50TW92ZSA9IDA7XG4gICAgICAgIHZhciB3YW50ZWRJbmRlbnQgPSAwOyAvL2lmIGEgbWFyZ2luIHdhcyBhZGRlZCAoYnkgZS5nLiBhIHRleHQtYWxpZ25tZW50KSwgbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgaWYgKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSAhPT0gdW5kZWZpbmVkICYmIGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSA+IDApIHtcbiAgICAgICAgICB3YW50ZWRJbmRlbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSk7XG4gICAgICAgICAgaW5kZW50TW92ZSA9IHdhbnRlZEluZGVudCAtIGN1cnJlbnRJbmRlbnQ7XG4gICAgICAgICAgY3VycmVudEluZGVudCA9IHdhbnRlZEluZGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRlbnRNb3JlID0gTWF0aC5tYXgoYmxvY2tzdHlsZVtcIm1hcmdpbi1sZWZ0XCJdIHx8IDAsIDApICogZm9udFRvVW5pdFJhdGlvOyAvL21vdmUgdGhlIGN1cnNvclxuXG4gICAgICAgIG91dChpbmRlbnRNb3ZlICsgaW5kZW50TW9yZSwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICB0aGlzLlJlbmRlclRleHRGcmFnbWVudChsaW5lW2ldWzBdLCBsaW5lW2ldWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnkgKz0gbWF4TGluZUhlaWdodCAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBzb21lIHdhdGNoZXIgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWwsIHNvIGUuZy4gbWFyZ2luIGFuZCB3aWR0aHMgd2VyZSBjaGFuZ2VkLFxuICAgICAgICAvL3Jlc2V0IGxpbmUgZHJhd2luZyBhbmQgY2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBsaW5lcyBhZ2FpblxuICAgICAgICAvL2UuZy4gdG8gc3RvcCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhsaW5lWzBdWzFdKSAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxvY2FsRnJhZ21lbnRzID0gW107XG4gICAgICAgICAgdmFyIGxvY2FsU3R5bGVzID0gW107IC8vY3JlYXRlIGZyYWdtZW50IGFycmF5IG9mXG5cbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbExpbmUpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBsID0gbG9jYWxMaW5lLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaWYgKGxvY2FsTGluZVtpXVswXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsRnJhZ21lbnRzLnB1c2gobG9jYWxMaW5lW2ldWzBdICsgJyAnKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0eWxlcy5wdXNoKGxvY2FsTGluZVtpXVsxXSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7IC8vc3BsaXQgbGluZXMgYWdhaW4gZHVlIHRvIHBvc3NpYmxlIGNvb3JkaW5hdGUgY2hhbmdlc1xuXG4gICAgICAgICAgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKFB1cmdlV2hpdGVTcGFjZShsb2NhbEZyYWdtZW50cyksIGxvY2FsU3R5bGVzKTsgLy9yZXBvc2l0aW9uIHRoZSBjdXJyZW50IGN1cnNvclxuXG4gICAgICAgICAgb3V0KFwiRVRcIiwgXCJRXCIpO1xuICAgICAgICAgIG91dChcInFcIiwgXCJCVCAwIGdcIiwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2IgJiYgdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzLCB0aGlzLnggLSA5LCB0aGlzLnkgLSBmb250U2l6ZSAvIDIpO1xuICAgICAgfVxuXG4gICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICByZXR1cm4gdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXI7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja0JvdW5kYXJ5ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJhZ3JhcGgoY2IpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tTdHlsZSA9IGZ1bmN0aW9uIChjc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlID0gY3NzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuYWRkVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjc3MpIHtcbiAgICAgIHRoaXMucGFyYWdyYXBoLnRleHQucHVzaCh0ZXh0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5zdHlsZS5wdXNoKGNzcyk7XG4gICAgfTtcblxuICAgIEZvbnROYW1lREIgPSB7XG4gICAgICBoZWx2ZXRpY2E6IFwiaGVsdmV0aWNhXCIsXG4gICAgICBcInNhbnMtc2VyaWZcIjogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwidGltZXMgbmV3IHJvbWFuXCI6IFwidGltZXNcIixcbiAgICAgIHNlcmlmOiBcInRpbWVzXCIsXG4gICAgICB0aW1lczogXCJ0aW1lc1wiLFxuICAgICAgbW9ub3NwYWNlOiBcImNvdXJpZXJcIixcbiAgICAgIGNvdXJpZXI6IFwiY291cmllclwiXG4gICAgfTtcbiAgICBGb250V2VpZ2h0TWFwID0ge1xuICAgICAgMTAwOiBcIm5vcm1hbFwiLFxuICAgICAgMjAwOiBcIm5vcm1hbFwiLFxuICAgICAgMzAwOiBcIm5vcm1hbFwiLFxuICAgICAgNDAwOiBcIm5vcm1hbFwiLFxuICAgICAgNTAwOiBcImJvbGRcIixcbiAgICAgIDYwMDogXCJib2xkXCIsXG4gICAgICA3MDA6IFwiYm9sZFwiLFxuICAgICAgODAwOiBcImJvbGRcIixcbiAgICAgIDkwMDogXCJib2xkXCIsXG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBib2xkOiBcImJvbGRcIixcbiAgICAgIGJvbGRlcjogXCJib2xkXCIsXG4gICAgICBsaWdodGVyOiBcIm5vcm1hbFwiXG4gICAgfTtcbiAgICBGb250U3R5bGVNYXAgPSB7XG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBpdGFsaWM6IFwiaXRhbGljXCIsXG4gICAgICBvYmxpcXVlOiBcIml0YWxpY1wiXG4gICAgfTtcbiAgICBUZXh0QWxpZ25NYXAgPSB7XG4gICAgICBsZWZ0OiBcImxlZnRcIixcbiAgICAgIHJpZ2h0OiBcInJpZ2h0XCIsXG4gICAgICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gICAgICBqdXN0aWZ5OiBcImp1c3RpZnlcIlxuICAgIH07XG4gICAgRmxvYXRNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICByaWdodDogJ3JpZ2h0JyxcbiAgICAgIGxlZnQ6ICdsZWZ0J1xuICAgIH07XG4gICAgQ2xlYXJNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICBib3RoOiAnYm90aCdcbiAgICB9O1xuICAgIFVuaXRlZE51bWJlck1hcCA9IHtcbiAgICAgIG5vcm1hbDogMVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgSFRNTC1mb3JtYXR0ZWQgdGV4dCBpbnRvIGZvcm1hdHRlZCBQREYgdGV4dC5cbiAgICAgKlxuICAgICAqIE5vdGVzOlxuICAgICAqIDIwMTItMDctMThcbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGhhdmluZyBicm93c2VyLCBET00gYXJvdW5kLiBUaGUgSFRNTCBpcyBwdXNoZWQgaW50byBkb20gYW5kIHRyYXZlcnNlZC5cbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGpRdWVyeSBmb3IgQ1NTIGV4dHJhY3Rpb24uXG4gICAgICogVGFyZ2V0aW5nIEhUTUwgb3V0cHV0IGZyb20gTWFya2Rvd24gdGVtcGxhdGluZywgd2hpY2ggaXMgYSB2ZXJ5IHNpbXBsZVxuICAgICAqIG1hcmt1cCAtIGRpdiwgc3BhbiwgZW0sIHN0cm9uZywgcC4gTm8gYnItYmFzZWQgcGFyYWdyYXBoIHNlcGFyYXRpb24gc3VwcG9ydGVkIGV4cGxpY2l0bHkgKGJ1dCBzdGlsbCBtYXkgd29yay4pXG4gICAgICogSW1hZ2VzLCB0YWJsZXMgYXJlIE5PVCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIEhUTUwge1N0cmluZ3xPYmplY3R9IEhUTUwtZm9ybWF0dGVkIHRleHQsIG9yIHBvaW50ZXIgdG8gRE9NIGVsZW1lbnQgdGhhdCBpcyB0byBiZSByZW5kZXJlZCBpbnRvIFBERi5cbiAgICAgKiBAcGFyYW0geCB7TnVtYmVyfSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0geSB7TnVtYmVyfSBzdGFydGluZyBZIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3Mge09iamVjdH0gQWRkaXRpb25hbCAvIG9wdGlvbmFsIHZhcmlhYmxlcyBjb250cm9sbGluZyBwYXJzaW5nLCByZW5kZXJpbmcuXG4gICAgICogQHJldHVybnMge09iamVjdH0ganNQREYgaW5zdGFuY2VcbiAgICAgKi9cblxuICAgIGpzUERGQVBJLmZyb21IVE1MID0gZnVuY3Rpb24gKEhUTUwsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaywgbWFyZ2lucykge1xuXG4gICAgICB0aGlzLm1hcmdpbnNfZG9jID0gbWFyZ2lucyB8fCB7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgYm90dG9tOiAwXG4gICAgICB9O1xuICAgICAgaWYgKCFzZXR0aW5ncykgc2V0dGluZ3MgPSB7fTtcbiAgICAgIGlmICghc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKSBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHJldHVybiBwcm9jZXNzKHRoaXMsIEhUTUwsIGlzTmFOKHgpID8gNCA6IHgsIGlzTmFOKHkpID8gNCA6IHksIHNldHRpbmdzLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgfSkoanNwZGYuanNQREYuQVBJKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
|
|
12196
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA5ZGMwMzc3ZmVlNmE1MmU0MDEwYiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcGRmLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFB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SUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFLENBQUMsQ0FBQztRQUNuRyxTQUFTLElBQUksQ0FBQyxNQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBUztJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQU8sRUFBRSxFQUFFLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTSxDQUFDO0lBQy9JLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUs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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFnQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlCQUF5QjtBQUN4RDtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5RUFBeUU7QUFDbkg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWdEOztBQUV2RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDLDJEQUEyRDtBQUNsRzs7QUFFQSwwQ0FBMEMsb0NBQW9DOztBQUU5RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUZBQXFGOztBQUVyRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyx1REFBdUQ7QUFDekY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLDBDQUEwQztBQUN6Rix5QkFBeUI7QUFDekI7QUFDQTtBQUNBLCtDQUErQyx3Q0FBd0M7QUFDdkYseUJBQXlCO0FBQ3pCLCtDQUErQyx5QkFBeUI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNB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aUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsTUFBTTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE1BQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekIsa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHFHQUFxRztBQUNyRztBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtGQUErRjtBQUMvRjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSx5SkFBeUo7QUFDeko7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsNlJBQTZSO0FBQzdSO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsT0FBTztBQUNuQyw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjs7O0FBR2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0IsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGtCQUFrQjtBQUNoQyxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsb0I7QUFDZCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHFHOzs7Ozs7O0FDNTJGRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztB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b0JBQW9CLGNBQWM7QUFDbEMsaUJBQWlCLE9BQU87QUFDeEIsaUJBQWlCLE9BQU87QUFDeEIsd0JBQXdCLE9BQU87QUFDL0IsaUJBQWlCLE9BQU87QUFDeEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUciLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktcGRmL3N1cnZleS5wZGYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5UERGXCIsIFtcInN1cnZleS1jb3JlXCIsIFwianNwZGZcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5UERGXCJdID0gZmFjdG9yeShyb290W1wiU3VydmV5XCJdLCByb290W1wianNwZGZcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgOWRjMDM3N2ZlZTZhNTJlNDAxMGIiLCJkZWNsYXJlIHZhciBSZWZsZWN0OiBhbnk7XG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZDogYW55LCBiOiBhbnkpOiBhbnkge1xuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZDogYW55LCBiOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09ICdmdW5jdGlvbicgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAnICsgU3RyaW5nKGIpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsJyk7XG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICAgIF9fYXNzaWduID0gKDxhbnk+T2JqZWN0KS5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odDogYW55KSB7XG4gICAgICAgIGZvciAodmFyIHM6IGFueSwgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzOiBhbnksIGU6IGFueSkge1xuICAgIHZhciB0OiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihxW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHFbaV0pKVxuICAgICAgICAgICAgICAgIHRbcVtpXV0gPSBzW3FbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnM6IGFueSwgdGFyZ2V0OiBhbnksIGtleTogYW55LCBkZXNjOiBhbnkpIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09ICdmdW5jdGlvbicpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZzogYW55LCBfYXJndW1lbnRzOiBhbnksIFA6IGFueSwgZ2VuZXJhdG9yOiBhbnkpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZTogYW55KSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnkpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWU6IGFueSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsndGhyb3cnXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0OiBhbnkpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZzogYW55LCBib2R5OiBhbnkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiA8YW55PltdLCBvcHM6IDxhbnk+W10gfSwgZjogYW55LCB5OiBhbnksIHQ6IGFueSwgZzogYW55O1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAndGhyb3cnOiB2ZXJiKDEpLCAncmV0dXJuJzogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobjogYW55KSB7IHJldHVybiBmdW5jdGlvbiAodjogYW55KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wOiBhbnkpIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4nKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WydyZXR1cm4nXSA6IG9wWzBdID8geVsndGhyb3cnXSB8fCAoKHQgPSB5WydyZXR1cm4nXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7ICg8YW55Pl8pID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSAodG86IGFueSwgZnJvbTogYW55LCBwYWNrOiBhbnkpIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjogYW55OyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvaGVscGVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIFF1ZXN0aW9uRmlsZU1vZGVsLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25TZWxlY3RCYXNlLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0ICogYXMgU3VydmV5UERGTW9kdWxlIGZyb20gJy4vZW50cmllcy9wZGYnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBJSFRNTFJlbmRlclR5cGUgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgVGl0bGVQYW5lbEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcbmltcG9ydCB7IERlc2NyaXB0aW9uQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uJztcbmltcG9ydCB7IENvbW1lbnRCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5pbXBvcnQgeyBMaW5rQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuaW1wb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9odG1sJztcbmltcG9ydCB7IEltYWdlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmltcG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmltcG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5cbmV4cG9ydCB0eXBlIElCb3JkZXJEZXNjcmlwdGlvbiA9IElSZWN0ICYgSVNpemUgJiBQaWNrPFBkZkJyaWNrLCAnZm9ybUJvcmRlckNvbG9yJz4gJiB7IHJvdW5kZWQ/OiBib29sZWFuLCBkYXNoU3R5bGU/OiB7IGRhc2hBcnJheTogW251bWJlciwgbnVtYmVyXSB8IFtudW1iZXJdLCBkYXNoUGhhc2U6IG51bWJlciB9LCBvdXRzaWRlPzogYm9vbGVhbiB9O1xuXG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIEVQU0lMT046IG51bWJlciA9IDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3MjYzMzM2MTgxNmUtMTU7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjc7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjM7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDIuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE9USEVSX1JPV1NfQ09VTlQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfTUlOX1dJRFRIOiBudW1iZXIgPSAzO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9IRUlHSFQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfQ09MVU1OX1dJRFRIOiBudW1iZXIgPSA1O1xuICAgIHB1YmxpYyBzdGF0aWMgTUFUUklYX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX0NPVU5UOiBudW1iZXIgPSA0O1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VQSUNLRVJfUkFUSU86IG51bWJlciA9IDQuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE1VTFRJUExFVEVYVF9URVhUX1BFUlM6IG51bWJlciA9IE1hdGguRSAvIDEwLjA7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RBSUxfVEVYVF9TQ0FMRTogbnVtYmVyID0gMC4yNDtcbiAgICBwdWJsaWMgc3RhdGljIFNFTEVDVF9JVEVNX0ZMQVRfU0NBTEU6IG51bWJlciA9IDAuOTU7XG4gICAgcHVibGljIHN0YXRpYyBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fQ09MVU1OUzogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fSVRFTV9URVhUOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfVklTSUJMRTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU0NBTEU6IG51bWJlciA9IDAuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjg7XG4gICAgcHVibGljIHN0YXRpYyBVTlZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyBSQURJVVNfU0NBTEU6IG51bWJlciA9IDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0ZPTlRfU0NBTEU6IG51bWJlciA9IDEuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU6IG51bWJlciA9IDAuMztcbiAgICBwdWJsaWMgc3RhdGljIEhUTUxfVE9fSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfQ09MT1I6IHN0cmluZyA9ICcjOWY5ZjlmJztcbiAgICBwdWJsaWMgc3RhdGljIFRFWFRfQ09MT1I6IHN0cmluZyA9ICcjNDA0MDQwJztcbiAgICBwdWJsaWMgc3RhdGljIEJBQ0tHUk9VTkRfQ09MT1I6IHN0cmluZyA9ICcjRkZGRkZGJztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0xPQ0FUSU9OX01BVFJJWDogc3RyaW5nID0gJ21hdHJpeCc7XG4gICAgcHVibGljIHN0YXRpYyBTVEFOREFSRF9GT05UOiBzdHJpbmcgPSAnaGVsdmV0aWNhJztcbiAgICBwdWJsaWMgc3RhdGljIENVU1RPTV9GT05UX0VOQ09ESU5HOiBzdHJpbmcgPSAnSWRlbnRpdHktSCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlV2lkdGgod2lkdGg6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgY29sdW1uc0NvdW50OiBudW1iZXIgPSAxLCBkZWZhdWx0VW5pdD86IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGlmICh3aWR0aC5pbmRleE9mKCdjYWxjJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhXaWR0aCAvIGNvbHVtbnNDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZTogbnVtYmVyID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGNvbnN0IHVuaXQ6IHN0cmluZyA9IHdpZHRoLnJlcGxhY2UoL1teQS1aYS16JV0vZywgJycpIHx8IGRlZmF1bHRVbml0O1xuICAgICAgICBsZXQgazogbnVtYmVyO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3B0JzpcbiAgICAgICAgICAgICAgICBrID0gMS4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gMjUuNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NtJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDIuNTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbic6XG4gICAgICAgICAgICAgICAgayA9IDcyLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdweCc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyA5Ni4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncGMnOlxuICAgICAgICAgICAgICAgIGsgPSAxMi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW0nOlxuICAgICAgICAgICAgICAgIGsgPSAxMi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXgnOlxuICAgICAgICAgICAgICAgIGsgPSA2LjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgayA9IG1heFdpZHRoIC8gMTAwLjA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHZhbHVlICogaywgbWF4V2lkdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHB4VG9QdCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZighaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHZhbHVlLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgKiA3Mi4wIC8gOTYuMDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVJlY3RzKC4uLnJlY3RzOiBJUmVjdFtdKTogSVJlY3Qge1xuICAgICAgICBjb25zdCByZXN1bHRSZWN0OiBJUmVjdCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiByZWN0c1swXS54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdHNbMF0ueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcmVjdHNbMF0ueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHJlY3RzWzBdLnlCb3RcbiAgICAgICAgfTtcbiAgICAgICAgcmVjdHMuZm9yRWFjaCgocmVjdDogSVJlY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueExlZnQgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnhMZWZ0LCByZWN0LnhMZWZ0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueFJpZ2h0ID0gTWF0aC5tYXgocmVzdWx0UmVjdC54UmlnaHQsIHJlY3QueFJpZ2h0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueVRvcCA9IE1hdGgubWluKHJlc3VsdFJlY3QueVRvcCwgcmVjdC55VG9wKSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueUJvdCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueUJvdCwgcmVjdC55Qm90KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRSZWN0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBvaW50KHJlY3Q6IElSZWN0LCBpc0xlZnQ6IGJvb2xlYW4gPSB0cnVlLCBpc1RvcDogYm9vbGVhbiA9IGZhbHNlKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBpc0xlZnQgPyByZWN0LnhMZWZ0IDogcmVjdC54UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBpc1RvcCA/IHJlY3QueVRvcCA6IHJlY3QueUJvdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlY3QocG9pbnQ6IElQb2ludCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiAwLjAsXG4gICAgICAgICAgICB4UmlnaHQ6IGNvbnRyb2xsZXIucGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHlUb3A6IDAuMCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIucGFwZXJIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaG9vc2VIdG1sRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIudXNlQ3VzdG9tRm9udEluSHRtbCA/IGNvbnRyb2xsZXIuZm9udE5hbWUgOiB0aGlzLlNUQU5EQVJEX0ZPTlQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDc3NUZXh0UnVsZShmb250U2l6ZTogbnVtYmVyLCBmb250U3R5bGU6IHN0cmluZywgZm9udE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgXCJmb250LXNpemU6ICR7Zm9udFNpemV9cHQ7IGZvbnQtd2VpZ2h0OiAke2ZvbnRTdHlsZX07IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgY29sb3I6ICR7dGhpcy5URVhUX0NPTE9SfTtcImA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKGh0bWw6IHN0cmluZywgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmNob29zZUh0bWxGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJfX3N1cnZleXBkZl9odG1sXCIgc3R5bGU9JHt0aGlzLmdlbmVyYXRlQ3NzVGV4dFJ1bGUoXG4gICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplLCBjb250cm9sbGVyLmZvbnRTdHlsZSwgZm9udCl9PmAgK1xuICAgICAgICAgICAgYDxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiAwOyBsaW5lLWhlaWdodDogJHtjb250cm9sbGVyLmZvbnRTaXplfXB0IH0gYm9keSB7IG1hcmdpbjogMDsgfTwvc3R5bGU+JHtodG1sfTwvZGl2PmA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc3BsaXRIdG1sUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sQnJpY2s6IElQZGZCcmljayk6IElQZGZCcmljayB7XG4gICAgICAgIGNvbnN0IGJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgaHRtbEhlaWdodDogbnVtYmVyID0gaHRtbEJyaWNrLmhlaWdodDtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpO1xuICAgICAgICBodG1sQnJpY2sueUJvdCA9IGh0bWxCcmljay55VG9wICsgbWluSGVpZ2h0O1xuICAgICAgICBjb25zdCBlbXB0eUJyaWNrQ291bnQ6IG51bWJlciA9IE1hdGguZmxvb3IoaHRtbEhlaWdodCAvIG1pbkhlaWdodCkgLSAxO1xuICAgICAgICBicmlja3MucHVzaChodG1sQnJpY2spO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoaHRtbEJyaWNrKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVtcHR5QnJpY2tDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIG1pbkhlaWdodCkpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IG1pbkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW1haW5pbmdIZWlnaHQ6IG51bWJlciA9IGh0bWxIZWlnaHQgLSAoZW1wdHlCcmlja0NvdW50ICsgMSkgKiBtaW5IZWlnaHQ7XG4gICAgICAgIGlmIChyZW1haW5pbmdIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICBicmlja3MucHVzaChuZXcgRW1wdHlCcmljayh0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBodG1sQnJpY2sud2lkdGgsIHJlbWFpbmluZ0hlaWdodCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGxhaW5UZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IENvbXBvc2l0ZUJyaWNrIHtcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gY29udHJvbGxlci5kb2Muc3BsaXRUZXh0VG9TaXplKHRleHQsXG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBwb2ludC54TGVmdCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplOiBJU2l6ZSA9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQobGluZSk7XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobmV3IGZhYnJpYyhxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlY3QoY3VyclBvaW50LCBzaXplLndpZHRoLCBzaXplLmhlaWdodCksIGxpbmUpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHNpemUuaGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUZXh0RmxhdDxUIGV4dGVuZHMgSVBkZkJyaWNrPihwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyB8fCAhdGhpcy5oYXNIdG1sKHRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQbGFpblRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICB0ZXh0IDogdGhpcy5nZXRMb2NTdHJpbmcoPExvY2FsaXphYmxlU3RyaW5nPnRleHQpLCBmYWJyaWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRIdG1sUmVjdChjb250cm9sbGVyLCBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KHBvaW50LCA8UXVlc3Rpb24+cXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sodGhpcy5nZXRMb2NTdHJpbmcodGV4dCksIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgaGFzSHRtbCh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuOiBSZWdFeHAgPSAvPFxcLz9bYS16XVtcXHNcXFNdKj4vaTtcbiAgICAgICAgcmV0dXJuIHRleHQuaGFzSHRtbCAmJiAocGF0dGVybi50ZXN0KCg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCkgfHwgcGF0dGVybi50ZXN0KHRleHQucmVuZGVyZWRIdG1sKSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBvaW50OiBJUG9pbnQpOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoID4gY29udHJvbGxlci51bml0V2lkdGggPyB3aWR0aCA6IGNvbnRyb2xsZXIudW5pdFdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIVE1MUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9LCByZXN1bHRZOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVBhZ2VIZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJIZWlnaHQgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90IC0gY29udHJvbGxlci5tYXJnaW5zLnRvcDtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSAoY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpIC0gMSkgKlxuICAgICAgICAgICAgKGNvbnRyb2xsZXIuZm9udFNpemUgKiBNYXRoLmZsb29yKGF2YWlsYWJsZVBhZ2VIZWlnaHQgLyBjb250cm9sbGVyLmZvbnRTaXplKSlcbiAgICAgICAgICAgICsgcmVzdWx0WSAtIG1hcmdpbnMudG9wICsgU3VydmV5SGVscGVyLkhUTUxfVEFJTF9URVhUX1NDQUxFICogY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZQYWdlczogbnVtYmVyID0gY29udHJvbGxlci5oZWxwZXJEb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5hZGRQYWdlKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBudW1iZXJPZlBhZ2VzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBtYXJnaW5zLndpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSFRNTEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBodG1sOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgd2lkdGg6IG51bWJlciB9ID0gdGhpcy5nZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyLCBwb2ludCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJUGRmQnJpY2s+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5mcm9tSFRNTChodG1sLCBwb2ludC54TGVmdCwgbWFyZ2lucy50b3AsIHtcbiAgICAgICAgICAgICAgICBwYWdlc3BsaXQ6IHRydWUsIHdpZHRoOiBtYXJnaW5zLndpZHRoXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVzdWx0OiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MUmVjdChwb2ludCwgY29udHJvbGxlciwgbWFyZ2lucywgcmVzdWx0LnkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaHRtbCkpO1xuICAgICAgICAgICAgfSwgbWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IH1gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWU6IHN0cmluZywgZm9udEJhc2U2NDogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6ICR7Zm9udE5hbWV9OyBgICtcbiAgICAgICAgICAgIGBzcmM6IHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwke2ZvbnRCYXNlNjR9KSBmb3JtYXQoJ3dvZmYnKTsgYCArXG4gICAgICAgICAgICBgZm9udC13ZWlnaHQ6ICR7Zm9udFdlaWdodH07IGZvbnQtc3R5bGU6IGl0YWxpY31gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGh0bWxUb1htbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBodG1sRG9jOiBEb2N1bWVudCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7XG4gICAgICAgIGh0bWxEb2Mud3JpdGUoaHRtbC5yZXBsYWNlKC9cXCMvZywgJyUyMycpKTtcbiAgICAgICAgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4bWxucycsIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSk7XG4gICAgICAgIGh0bWxEb2MuYm9keS5zdHlsZS5tYXJnaW4gPSAndW5zZXQnO1xuICAgICAgICByZXR1cm4gKG5ldyBYTUxTZXJpYWxpemVyKCkpLnNlcmlhbGl6ZVRvU3RyaW5nKGh0bWxEb2MuYm9keSkucmVwbGFjZSgvJTIzL2csICcjJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3ZnQ29udGVudChodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3Qgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSAnLl9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogdW5zZXQ7IGxpbmUtaGVpZ2h0OiAyMnB4OyB9IGJvZHkgeyBtYXJnaW46IHVuc2V0OyB9JztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIGNvbnN0IGRpdjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdfX3N1cnZleXBkZl9odG1sJztcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBkaXYuc3R5bGUudG9wID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAod2lkdGggLyA3Mi4wICogOTYuMCkgKyAncHgnO1xuICAgICAgICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuY29sb3IgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250RmFtaWx5ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmxpbmVIZWlnaHQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIGNvbnN0IGRpdldpZHRoOiBudW1iZXIgPSBkaXYub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IGRpdkhlaWdodDogbnVtYmVyID0gZGl2Lm9mZnNldEhlaWdodDtcbiAgICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgICBzdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgbGV0IGRlZnM6IHN0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY29udHJvbGxlci51c2VDdXN0b21Gb250SW5IdG1sKSB7XG4gICAgICAgICAgICBkZWZzID0gYDxkZWZzPjxzdHlsZT4ke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpfWAgK1xuICAgICAgICAgICAgICAgIGAgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjRCb2xkLCAnYm9sZCcpfTwvc3R5bGU+PC9kZWZzPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzKS5mb3JFYWNoKGZvbnROYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZm9udCkuZm9yRWFjaCgoZm9udFN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyB8ICdpdGFsaWMnIHwgJ2JvbGRpdGFsaWMnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb250U3R5bGUgPT09ICdub3JtYWwnIHx8IGZvbnRTdHlsZSA9PT0gJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUpfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZzICs9IGAke3RoaXMuZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZSwgZm9udFtmb250U3R5bGVdLCBmb250U3R5bGUgPT09ICdpdGFsaWMnID8gJ25vcm1hbCcgOiAnYm9sZCcpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWZzID0gJzxkZWZzPjxzdHlsZT4nICsgZGVmcyArICc8L3N0eWxlPjwvZGVmcz4nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ZnOiBzdHJpbmcgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICsgZGVmcyArXG4gICAgICAgICAgICAnPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfTwvc3R5bGU+JyArXG4gICAgICAgICAgICBgPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICtcbiAgICAgICAgICAgIHRoaXMuaHRtbFRvWG1sKGh0bWwpICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuICAgICAgICByZXR1cm4geyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgc2V0Q2FudmFzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGRpdldpZHRoOiBudW1iZXIsIGRpdkhlaWdodDogbnVtYmVyLCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY2FudmFzLndpZHRoID0gZGl2V2lkdGggKiBTdXJ2ZXlIZWxwZXIuSFRNTF9UT19JTUFHRV9RVUFMSVRZO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gZGl2SGVpZ2h0ICogU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWTtcbiAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGNvbnRleHQuc2NhbGUoU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSwgU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1I7XG4gICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgZGl2V2lkdGgsIGRpdkhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaHRtbFRvSW1hZ2UoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH0gPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlU3ZnQ29udGVudChodG1sLCB3aWR0aCwgY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGRhdGE6IHN0cmluZyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdmcpKSk7XG4gICAgICAgIGNvbnN0IGltZzogSFRNTEltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7XG4gICAgICAgIGltZy5zcmMgPSBkYXRhO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDYW52YXMoY2FudmFzLCBkaXZXaWR0aCwgZGl2SGVpZ2h0LCBpbWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiB1cmwsIGFzcGVjdDogZGl2V2lkdGggLyBkaXZIZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogJ2RhdGE6LCcsIGFzcGVjdDogd2lkdGggLyB0aGlzLkVQU0lMT04gfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCb2xkQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSAqPSB0aGlzLlRJVExFX0ZPTlRfU0NBTEU7XG4gICAgICAgIGlmIChxdWVzdGlvbi5ubykge1xuICAgICAgICAgICAgY29uc3Qgbm9UZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5ubyArICcgJztcbiAgICAgICAgICAgIGxldCBub0ZsYXQ6IElQZGZCcmljaztcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChub1RleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhub1RleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9GbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgbm9UZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoXG4gICAgICAgICAgICBjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBxdWVzdGlvbi5sb2NUaXRsZSk7XG4gICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayh0ZXh0RmxhdCk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRUZXh0OiBzdHJpbmcgPSBxdWVzdGlvbi5yZXF1aXJlZFRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKClbMF0sIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tZWFzdXJlVGV4dChyZXF1aXJlZFRleHQsICdib2xkJykud2lkdGg7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2socmVxdWlyZWRUZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpLnBvcCgpLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlcXVpcmVkVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZvbnRTaXplU2NhbGU6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB0ZXh0LCBUaXRsZVBhbmVsQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiB0aXRsZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsIHRoaXMuVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVQYW5lbEZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGlzUGFnZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlVGl0bGVTdXJ2ZXlQYW5lbEZsYXQocG9pbnQsIGNvbnRyb2xsZXIsIHRleHQsXG4gICAgICAgICAgICBpc1BhZ2UgPyB0aGlzLlRJVExFX1BBR0VfRk9OVF9TSVpFX1NDQUxFIDogdGhpcy5USVRMRV9QQU5FTF9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZURlc2NGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIHRoaXMuREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIERlc2NyaXB0aW9uQnJpY2spO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVhZG9ubHlSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzID09PSAnYXV0bycgPyBjb250cm9sbGVyLnJlYWRvbmx5UmVuZGVyQXMgOiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVDb21tZW50RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGlzUXVlc3Rpb246IGJvb2xlYW4sIG9wdGlvbnM6IHsgcm93cz86IG51bWJlciwgaW5kZXg/OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nLCByZWFkT25seT86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSB0aGlzLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIGNvbnRyb2xsZXIsIG9wdGlvbnMucm93cyA/PyAxKTtcbiAgICAgICAgbGV0IHRleHRGbGF0O1xuICAgICAgICBpZiAob3B0aW9ucy5yZWFkT25seSA/PyBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkocXVlc3Rpb24sIGNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZFZhbHVlID0gb3B0aW9ucy52YWx1ZSA/PyB0aGlzLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgICAgICAgICAgdGV4dEZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLCByZW5kZXJlZFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgIGlmICh0ZXh0RmxhdC55Qm90ICsgcGFkZGluZyA+IHJlY3QueUJvdCkgcmVjdC55Qm90ID0gdGV4dEZsYXQueUJvdCArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tbWVudCA9IG5ldyBDb21tZW50QnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIG9wdGlvbnMuaW5kZXgpO1xuICAgICAgICBpZihvcHRpb25zLnJlYWRPbmx5ICE9PSBudWxsICYmIG9wdGlvbnMucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tbWVudC5pc1JlYWRPbmx5ID0gb3B0aW9ucy5yZWFkT25seTtcbiAgICAgICAgfVxuICAgICAgICBpZih0ZXh0RmxhdCkge1xuICAgICAgICAgICAgY29tbWVudC50ZXh0QnJpY2sgPSB0ZXh0RmxhdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXNRdWVzdGlvbiA/IChxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsID8gcXVlc3Rpb24udmFsdWUgOiAnJykgOlxuICAgICAgICAgICAgKHF1ZXN0aW9uLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5jb21tZW50ICE9PSBudWxsID8gcXVlc3Rpb24uY29tbWVudCA6ICcnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaW5Ccm93c2VyID0gdHlwZW9mIEltYWdlID09PSAnZnVuY3Rpb24nO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgaGFzRG9jdW1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VCYXNlNjQoaW1hZ2VMaW5rOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWFnZS5jcm9zc09yaWdpbj0nYW5vbnltb3VzJztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltYWdlLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2UubmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhVXJsKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IGltYWdlTGluaztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ29udmVydEltYWdlVG9QbmcgPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VMaW5rKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlT3B0aW9uczogeyBsaW5rOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvYmplY3RGaXQ/OiBzdHJpbmcgfSwgYXBwbHlJbWFnZUZpdDogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHB0VG9QeDogbnVtYmVyID0gOTYuMCAvIDcyLjA7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLnNob3VsZENvbnZlcnRJbWFnZVRvUG5nID8gYXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlQmFzZTY0KGltYWdlT3B0aW9ucy5saW5rKSA6IGltYWdlT3B0aW9ucy5saW5rO1xuICAgICAgICBpZih0eXBlb2YgWE1MU2VyaWFsaXplciA9PT0gJ2Z1bmN0aW9uJyAmJiBhcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNIdG1sOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgYDxkaXYgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47IHdpZHRoOiAke2ltYWdlT3B0aW9ucy53aWR0aCAqIHB0VG9QeH1weDsgaGVpZ2h0OiAke2ltYWdlT3B0aW9ucy5oZWlnaHQgKiBwdFRvUHh9cHg7Jz5cbiAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0nJHt1cmx9JyBzdHlsZT0nb2JqZWN0LWZpdDogJHtpbWFnZU9wdGlvbnMub2JqZWN0Rml0fTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsnLz5cbiAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICB1cmwgPSAoYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGNhbnZhc0h0bWwsIGltYWdlT3B0aW9ucy53aWR0aCwgY29udHJvbGxlcikpLnVybDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogYW55LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2JqZWN0Rml0Pzogc3RyaW5nIH0sIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5vYmplY3RGaXQgPSAhIXF1ZXN0aW9uICYmICEhcXVlc3Rpb24uaW1hZ2VGaXQgPyBxdWVzdGlvbi5pbWFnZUZpdCA6IChpbWFnZU9wdGlvbnMub2JqZWN0Rml0IHx8ICdjb250YWluJyk7XG4gICAgICAgICAgICBpZiAoYXBwbHlJbWFnZUZpdCA/PyBjb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VPcHRpb25zLndpZHRoID4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3V2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZU9wdGlvbnMuaGVpZ2h0ICo9IG5ld1dpZHRoIC8gaW1hZ2VPcHRpb25zLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBgPGltZyBzcmM9JyR7YXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlTGluayhjb250cm9sbGVyLCBpbWFnZU9wdGlvbnMsIGFwcGx5SW1hZ2VGaXQgPz8gY29udHJvbGxlci5hcHBseUltYWdlRml0KX0nIHdpZHRoPScke2ltYWdlT3B0aW9ucy53aWR0aH0nIGhlaWdodD0nJHtpbWFnZU9wdGlvbnMuaGVpZ2h0fScvPmA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgdGhpcy5jcmVhdGVSZWN0KHBvaW50LCBpbWFnZU9wdGlvbnMud2lkdGgsIGltYWdlT3B0aW9ucy5oZWlnaHQpLCBodG1sLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEltYWdlQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIGltYWdlT3B0aW9ucy5saW5rLCBwb2ludCwgaW1hZ2VPcHRpb25zLndpZHRoLCBpbWFnZU9wdGlvbnMuaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjYW5QcmV2aWV3SW1hZ2UocXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsLCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfSwgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZShpdGVtKTtcbiAgICAgICAgLy8gICYmICBhd2FpdCB0aGlzLmdldEltYWdlU2l6ZSh1cmwpICE9PSBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlU2l6ZSh1cmw6IHN0cmluZyk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgaWYgKCFTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiB1bmRlZmluZWQsIGhlaWdodDogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZTogYW55ID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmw7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKG51bGwpOyB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSb3dsaW5lRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB3aWR0aD86IG51bWJlciwgY29sb3I/OiBzdHJpbmcpOiBJUGRmQnJpY2sge1xuICAgICAgICBsZXQgeFJpZ2h0OiBudW1iZXIgPSB0eXBlb2Ygd2lkdGggPT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA6XG4gICAgICAgICAgICBwb2ludC54TGVmdCArIHdpZHRoO1xuICAgICAgICB4UmlnaHQgPSB4UmlnaHQgPiBwb2ludC54TGVmdCA/IHhSaWdodCA6IHBvaW50LnhMZWZ0ICsgdGhpcy5FUFNJTE9OO1xuICAgICAgICByZXR1cm4gbmV3IFJvd2xpbmVCcmljayhjb250cm9sbGVyLCB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT04sXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OXG4gICAgICAgIH0sIHR5cGVvZiBjb2xvciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogY29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUxpbmtGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBsaW5rOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVUZXh0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLlxuICAgICAgICAgICAgY3JlYXRlVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVMaW5rOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGVUZXh0LnVuZm9sZCgpLmZvckVhY2goKHRleHQ6IFRleHRCcmljaykgPT4ge1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayhuZXcgTGlua0JyaWNrKHRleHQsIGxpbmspKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChjb21wb3NpdGVMaW5rKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sodGhpcy5jcmVhdGVSb3dsaW5lRmxhdChsaW5lUG9pbnQsXG4gICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tcG9zaXRlTGluay53aWR0aCwgTGlua0JyaWNrLkNPTE9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlTGluaztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBY3JvZm9ybVJlY3QocmVjdDogSVJlY3QpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55VG9wLFxuICAgICAgICAgICAgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIF07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBsaW5lczogbnVtYmVyID0gMSk6IElSZWN0IHtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIGxpbmVzO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICBwb2ludC55VG9wICs9IHBhZGRpbmc7XG4gICAgICAgIHBvaW50LnhMZWZ0ICs9IHBhZGRpbmc7XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMocG9pbnQueExlZnQsIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdmFsdWUudG9TdHJpbmcoKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIHJldHVybiB0ZXh0RmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJGbGF0Qm9yZGVycyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBib3JkZXJPcHRpb25zOiBJQm9yZGVyRGVzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLkZPUk1fQk9SREVSX1ZJU0lCTEUpIHJldHVybjtcbiAgICAgICAgYm9yZGVyT3B0aW9ucy5yb3VuZGVkID0gYm9yZGVyT3B0aW9ucy5yb3VuZGVkID8/IHRydWU7XG4gICAgICAgIGJvcmRlck9wdGlvbnMub3V0c2lkZSA9IGJvcmRlck9wdGlvbnMub3V0c2lkZSA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oYm9yZGVyT3B0aW9ucy53aWR0aCwgYm9yZGVyT3B0aW9ucy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5WSVNJQkxFX0JPUkRFUl9TQ0FMRSAqIHRoaXMuQk9SREVSX1NDQUxFO1xuICAgICAgICBjb25zdCB2aXNpYmxlU2NhbGU6IG51bWJlciA9IGJvcmRlck9wdGlvbnMub3V0c2lkZSA/IChtaW5TaWRlICsgYm9yZGVyV2lkdGgpIC8gbWluU2lkZSAtIHZpc2libGVXaWR0aCAvIG1pblNpZGUgOiAobWluU2lkZSAtIGJvcmRlcldpZHRoKSAvIG1pblNpZGUgKyB2aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICBjb25zdCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IGNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoYm9yZGVyT3B0aW9ucy5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29uc3Qgc2NhbGVkUmVjdCA9IHRoaXMuc2NhbGVSZWN0KGJvcmRlck9wdGlvbnMsIHZpc2libGVTY2FsZSk7XG4gICAgICAgIGlmKGJvcmRlck9wdGlvbnMuZGFzaFN0eWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXNoU3R5bGUgPSBib3JkZXJPcHRpb25zLmRhc2hTdHlsZTtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckxlbmd0aCA9IChNYXRoLmFicyhzY2FsZWRSZWN0LnlUb3AgLSBzY2FsZWRSZWN0LnlCb3QpICsgTWF0aC5hYnMoc2NhbGVkUmVjdC54TGVmdCAtIHNjYWxlZFJlY3QueFJpZ2h0KSkgKiAyO1xuICAgICAgICAgICAgY29uc3QgZGFzaFdpdGhTcGFjZVNpemUgPSBkYXNoU3R5bGUuZGFzaEFycmF5WzBdICsgKGRhc2hTdHlsZS5kYXNoQXJyYXlbMV0gPz8gZGFzaFN0eWxlLmRhc2hBcnJheVswXSk7XG4gICAgICAgICAgICBjb25zdCBkYXNoU2l6ZSA9IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF0gKyAoYm9yZGVyTGVuZ3RoICUgZGFzaFdpdGhTcGFjZVNpemUpIC8gTWF0aC5mbG9vcihib3JkZXJMZW5ndGggLyBkYXNoV2l0aFNwYWNlU2l6ZSk7XG5cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVEYXNoUGF0dGVybihcbiAgICAgICAgICAgICAgICBbZGFzaFNpemUsIGRhc2hTdHlsZS5kYXNoQXJyYXlbMV0gPz8gZGFzaFN0eWxlLmRhc2hBcnJheVswXV0sXG4gICAgICAgICAgICAgICAgZGFzaFN0eWxlLmRhc2hQaGFzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3Qoc2NhbGVkUmVjdCkpO1xuICAgICAgICBpZihib3JkZXJPcHRpb25zLnJvdW5kZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVudmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlVOVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IHVudmlzaWJsZVNjYWxlOiBudW1iZXIgPSAxLjAgLSB1bnZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVSYWRpdXM6IG51bWJlciA9IHRoaXMuUkFESVVTX1NDQUxFICogdW52aXNpYmxlV2lkdGg7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVXaWR0aCh1bnZpc2libGVXaWR0aCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5yb3VuZGVkUmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlUmVjdChib3JkZXJPcHRpb25zLCB1bnZpc2libGVTY2FsZSkpLCB1bnZpc2libGVSYWRpdXMsIHVudmlzaWJsZVJhZGl1cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoYm9yZGVyT3B0aW9ucy5kYXNoU3R5bGUpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldExpbmVEYXNoUGF0dGVybihbXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TG9jU3RyaW5nKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSHRtbCh0ZXh0KSkgcmV0dXJuIHRleHQucmVuZGVyZWRIdG1sO1xuICAgICAgICByZXR1cm4gKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0IHx8IHRleHQucmVuZGVyZWRIdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxRHJvcERvd246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgICAgIGlmIChxRHJvcERvd24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm90aGVyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIXF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChxRHJvcERvd24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcURyb3BEb3duLm9wdGlvbnNDYXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogUXVlc3Rpb24ge1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA6IHF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGVSZW5kZXJBcyhxdWVzdGlvbjogUXVlc3Rpb24sIHN1cnZleTogU3VydmV5UERGKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlbmRlckFzID0gcXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gJ2Jvb2xlYW4nICYmIHN1cnZleS5vcHRpb25zLnVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcpIHtcbiAgICAgICAgICAgIHJlbmRlckFzID0gJ2NoZWNrYm94JztcbiAgICAgICAgfVxuICAgICAgICBpZihyZW5kZXJBcyAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gYCR7cXVlc3Rpb24uZ2V0VHlwZSgpfS0ke3JlbmRlckFzfWA7XG4gICAgICAgICAgICBpZihGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmlzVHlwZVJlZ2lzdGVyZWQodHlwZSkpIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uVHlwZShxdWVzdGlvbjogUXVlc3Rpb24sIHN1cnZleTogU3VydmV5UERGKTogc3RyaW5nIHtcbiAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQpIHJldHVybiBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUXVlc3Rpb25UeXBlO1xuICAgICAgICByZXR1cm4gISEoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uID8gJ2N1c3RvbV9tb2RlbCcgOiB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGVSZW5kZXJBcyhxdWVzdGlvbiwgc3VydmV5KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdNaW5XaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5SQVRJTkdfTUlOX1dJRFRIKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdJdGVtVGV4dChxdWVzdGlvbjogUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgICAgICAgaW5kZXg6IG51bWJlciwgbG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhdGluZ0l0ZW1Mb2NUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhsb2NUZXh0Lm93bmVyLCBsb2NUZXh0LnVzZU1hcmtkb3duKTtcbiAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKGxvY1RleHQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgcXVlc3Rpb24ubWluUmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gcXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uLnRleHQgKyAnICcgKyB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSAmJiBxdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KSArICcgJyArIHF1ZXN0aW9uLmxvY01heFJhdGVEZXNjcmlwdGlvbi50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYXRpbmdJdGVtTG9jVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC1cbiAgICAgICAgICAgICh0aGlzLklNQUdFUElDS0VSX0NPVU5UIC0gMSkgKiBjb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gKGNvbENvdW50IC0gMSkgKlxuICAgICAgICAgICAgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpIC8gY29sQ291bnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q29sdW1uTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW46IG51bWJlcikge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IHRoaXMuZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlciwgY29sQ291bnQpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgY29sdW1uICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIChjb2xDb3VudCAtIGNvbHVtbiAtIDEpICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbW92ZVJlY3QocmVjdDogSVJlY3QsIGxlZnQ6IG51bWJlciA9IHJlY3QueExlZnQsIHRvcDogbnVtYmVyID0gcmVjdC55VG9wKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IGxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0b3AsXG4gICAgICAgICAgICB4UmlnaHQ6IGxlZnQgKyByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICB5Qm90OiB0b3AgKyByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzY2FsZVJlY3QocmVjdDogSVJlY3QsIHNjYWxlOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IHNjYWxlV2lkdGg6IG51bWJlciA9IE1hdGgubWluKHJlY3QueFJpZ2h0IC0gcmVjdC54TGVmdCwgcmVjdC55Qm90IC0gcmVjdC55VG9wKSAqICgxLjAgLSBzY2FsZSkgLyAyLjA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCArIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeFJpZ2h0OiByZWN0LnhSaWdodCAtIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5Qm90OiByZWN0LnlCb3QgLSBzY2FsZVdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gMi4wICogY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmb3JtU2NhbGUoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdDogSVNpemUpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtaW5TaWRlOiBudW1iZXIgPSBNYXRoLm1pbihmbGF0LndpZHRoLCBmbGF0LmhlaWdodCk7XG4gICAgICAgIHJldHVybiAobWluU2lkZSAtIHRoaXMuZ2V0Qm9yZGVyV2lkdGgoY29udHJvbGxlcikpIC8gbWluU2lkZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb24sIHN1cnZleSk7XG4gICAgICAgIGNvbnN0IGZsYXRRdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuXG4gICAgICAgICAgICBjcmVhdGUoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgcXVlc3Rpb25UeXBlKTtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25GbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBmbGF0UXVlc3Rpb24uZ2VuZXJhdGVGbGF0cyhwb2ludCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNPcHRpb25zID0gbmV3IEFkb3JuZXJzT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgIHF1ZXN0aW9uRmxhdHMsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICBpZiAocXVlc3Rpb24uY3VzdG9tV2lkZ2V0ICYmIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5pc0ZpdChxdWVzdGlvbikgJiZcbiAgICAgICAgICAgIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpIHtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLnVuc2hpZnQocXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlJlbmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUXVlc3Rpb24uZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNGb250RXhpc3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZm9udE5hbWUgPT09IGZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQ3VzdG9tRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmb250TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5pbnRlcm5hbC5nZXRGb250KGZvbnROYW1lKS5lbmNvZGluZyA9PT0gdGhpcy5DVVNUT01fRk9OVF9FTkNPRElORztcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBmaXhGb250KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDdXN0b21Gb250KGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZm9udE5hbWUpKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy50ZXh0KCdsb2FkIGZvbnQnLCAwLCAwKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLmRlbGV0ZVBhZ2UoMSk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNsb25lKHNyYzogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHNyYykge1xuICAgICAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNyY1twcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZFJlbmRlclJlYWRPbmx5KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlYWRPbmx5PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCghIXF1ZXN0aW9uICYmIHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgcmVhZE9ubHkpICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLCBjb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykgfHwgY29udHJvbGxlcj8uY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaXplRW1wdHkodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF2YWwgfHwgdmFsID09PSAnYXV0byc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNIZWlnaHRFbXB0eSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NpemVFbXB0eSh2YWwpIHx8IHZhbCA9PSAnMTAwJSc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlT3B0aW9uczogeyBpbWFnZVdpZHRoPzogYW55LCBpbWFnZUhlaWdodD86IGFueSwgaW1hZ2VMaW5rOiBzdHJpbmcsIGRlZmF1bHRJbWFnZVdpZHRoPzogYW55LCBkZWZhdWx0SW1hZ2VIZWlnaHQ/OiBhbnkgfSk6IFByb21pc2U8SVNpemU+IHtcbiAgICAgICAgbGV0IHsgaW1hZ2VXaWR0aCwgaW1hZ2VMaW5rLCBpbWFnZUhlaWdodCwgZGVmYXVsdEltYWdlV2lkdGgsIGRlZmF1bHRJbWFnZUhlaWdodCB9ID0gaW1hZ2VPcHRpb25zO1xuICAgICAgICBpbWFnZVdpZHRoID0gdHlwZW9mIGltYWdlV2lkdGggPT09ICdudW1iZXInID8gaW1hZ2VXaWR0aC50b1N0cmluZygpIDogaW1hZ2VXaWR0aDtcbiAgICAgICAgaW1hZ2VIZWlnaHQgPSB0eXBlb2YgaW1hZ2VIZWlnaHQgPT09ICdudW1iZXInID8gaW1hZ2VIZWlnaHQudG9TdHJpbmcoKSA6IGltYWdlSGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGhQdDogbnVtYmVyID0gaW1hZ2VXaWR0aCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChpbWFnZVdpZHRoLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgbGV0IGhlaWdodFB0OiBudW1iZXIgPSBpbWFnZUhlaWdodCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChpbWFnZUhlaWdodCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGRlZmF1bHRJbWFnZVdpZHRoID0gdHlwZW9mIGRlZmF1bHRJbWFnZVdpZHRoID09PSAnbnVtYmVyJyA/IGRlZmF1bHRJbWFnZVdpZHRoLnRvU3RyaW5nKCkgOiBkZWZhdWx0SW1hZ2VXaWR0aDtcbiAgICAgICAgZGVmYXVsdEltYWdlSGVpZ2h0ID0gdHlwZW9mIGRlZmF1bHRJbWFnZUhlaWdodCA9PT0gJ251bWJlcicgPyBkZWZhdWx0SW1hZ2VIZWlnaHQudG9TdHJpbmcoKSA6IGRlZmF1bHRJbWFnZUhlaWdodDtcbiAgICAgICAgbGV0IGRlZmF1bHRXaWR0aFB0OiBudW1iZXIgPSBkZWZhdWx0SW1hZ2VXaWR0aCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChkZWZhdWx0SW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGxldCBkZWZhdWx0SGVpZ2h0UHQ6IG51bWJlciA9IGRlZmF1bHRJbWFnZUhlaWdodCAmJiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChkZWZhdWx0SW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuXG4gICAgICAgIGlmKFN1cnZleUhlbHBlci5pc1NpemVFbXB0eShpbWFnZVdpZHRoKSB8fCBTdXJ2ZXlIZWxwZXIuaXNIZWlnaHRFbXB0eShpbWFnZUhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZVNpemUoaW1hZ2VMaW5rKTtcbiAgICAgICAgICAgIGlmKCFTdXJ2ZXlIZWxwZXIuaXNTaXplRW1wdHkoaW1hZ2VXaWR0aCkpIHtcbiAgICAgICAgICAgICAgICBpZihpbWFnZVNpemUgJiYgaW1hZ2VTaXplLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFB0ID0gaW1hZ2VTaXplLmhlaWdodCAqIHdpZHRoUHQgLyBpbWFnZVNpemUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighU3VydmV5SGVscGVyLmlzSGVpZ2h0RW1wdHkoaW1hZ2VIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgaWYoaW1hZ2VTaXplICYmIGltYWdlU2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhQdCA9IGltYWdlU2l6ZS53aWR0aCAqIGhlaWdodFB0IC8gaW1hZ2VTaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKGltYWdlU2l6ZSAmJiBpbWFnZVNpemUuaGVpZ2h0ICYmIGltYWdlU2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGhlaWdodFB0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VTaXplLmhlaWdodC50b1N0cmluZygpLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgICAgICAgICB3aWR0aFB0ID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VTaXplLndpZHRoLnRvU3RyaW5nKCksIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aFB0IHx8IGRlZmF1bHRXaWR0aFB0IHx8IDAsIGhlaWdodDogaGVpZ2h0UHQgfHwgZGVmYXVsdEhlaWdodFB0IHx8IDAgfTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2hlbHBlcl9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uRGVmYXVsdCB9IGZyb20gJy4vZmxhdF9kZWZhdWx0JztcblxuZXhwb3J0IHR5cGUgRmxhdENvbnN0cnVjdG9yID0gbmV3IChcbiAgICBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXJcbikgPT4gSUZsYXRRdWVzdGlvbjtcbmV4cG9ydCBjbGFzcyBGbGF0UmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBxdWVzdGlvbnM6IHsgW2luZGV4OiBzdHJpbmddOiBGbGF0Q29uc3RydWN0b3IgfSA9IHt9O1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGbGF0UmVwb3NpdG9yeSA9IG5ldyBGbGF0UmVwb3NpdG9yeSgpO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRmxhdFJlcG9zaXRvcnkge1xuICAgICAgICByZXR1cm4gRmxhdFJlcG9zaXRvcnkuaW5zdGFuY2U7XG4gICAgfVxuICAgIHB1YmxpYyByZWdpc3Rlcihtb2RlbFR5cGU6IHN0cmluZywgcmVuZGVyZXJDb25zdHJ1Y3RvcjogRmxhdENvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25zW21vZGVsVHlwZV0gPSByZW5kZXJlckNvbnN0cnVjdG9yO1xuICAgIH1cbiAgICBwdWJsaWMgaXNUeXBlUmVnaXN0ZXJlZCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbnNbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBnZXRSZW5kZXJlcih0eXBlOiBzdHJpbmcpOiBGbGF0Q29uc3RydWN0b3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNbdHlwZV07XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGUoc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgZG9jQ29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdHlwZT86IHN0cmluZyk6IElGbGF0UXVlc3Rpb24ge1xuICAgICAgICBjb25zdCBxdWVzdGlvblR5cGU6IHN0cmluZyA9IHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJyA/IHF1ZXN0aW9uLmdldFR5cGUoKSA6IHR5cGU7XG4gICAgICAgIGxldCByZW5kZXJlckNvbnN0cnVjdG9yID0gdGhpcy5nZXRSZW5kZXJlcihxdWVzdGlvblR5cGUpO1xuICAgICAgICBpZighcmVuZGVyZXJDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYoISFxdWVzdGlvbi5jdXN0b21XaWRnZXQ/LnBkZlJlbmRlcikge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyQ29uc3RydWN0b3IgPSBGbGF0UXVlc3Rpb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyQ29uc3RydWN0b3IgPSBGbGF0UXVlc3Rpb25EZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgcmVuZGVyZXJDb25zdHJ1Y3RvcihzdXJ2ZXksIHF1ZXN0aW9uLCBkb2NDb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEluc3RhbmNlKCkucmVnaXN0ZXIodHlwZSwgcmVuZGVyZXJDb25zdHJ1Y3Rvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVuZGVyZXIodHlwZTogc3RyaW5nKTogRmxhdENvbnN0cnVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2UoKS5nZXRSZW5kZXJlcih0eXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24sIExvY2FsaXphYmxlU3RyaW5nLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfc3VydmV5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZsYXRRdWVzdGlvbiB7XG4gICAgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+O1xuICAgIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+O1xufVxuZXhwb3J0IGNsYXNzIEZsYXRRdWVzdGlvbiBpbXBsZW1lbnRzIElGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTogbnVtYmVyID0gMC41O1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9HQVBfSE9SX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBDT05URU5UX0lOREVOVF9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ19HQVBfU0NBTEU6IG51bWJlciA9IDAuMDYyNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb24+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5oYXNEZXNjcmlwdGlvblVuZGVyVGl0bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgZGVzY1BvaW50LnlUb3AgKz0gRmxhdFF1ZXN0aW9uLkRFU0NfR0FQX1NDQUxFICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBkZXNjUG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihkZXNjUG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tbWVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0NvbW1lbnRUZXh0O1xuICAgICAgICBjb25zdCBvdGhlclRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQob3RoZXJUZXh0RmxhdCk7XG4gICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKG90aGVyVGV4dEZsYXQsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgcm93czogU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQgfSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb250ZW50UGFuZWwgPSAoPGFueT50aGlzLnF1ZXN0aW9uKS5jb250ZW50UGFuZWw7XG4gICAgICAgIGlmICghIWNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKHRoaXMuc3VydmV5LFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29udGVudFBhbmVsLCBwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IFN1cnZleUhlbHBlci5nZXRDb250ZW50UXVlc3Rpb24odGhpcy5xdWVzdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogQXJyYXk8SVBkZkJyaWNrPiA9IFtdO1xuICAgICAgICBjb25zdCBjb250ZW50RmxhdHMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQpO1xuICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgIGNvbnN0IGdldExhdGVzdFBvaW50ID0gKCk6IElQb2ludCA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICByZXMueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzKS55Qm90ICsgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tbWVudChnZXRMYXRlc3RQb2ludCgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlcklucHV0KSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oZ2V0TGF0ZXN0UG9pbnQoKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5xdWVzdGlvbi5pbmRlbnQpLndpZHRoO1xuICAgICAgICBjb25zdCBpbmRlbnRQb2ludDogSVBvaW50ID0ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aCxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3BcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCB0aXRsZUxvY2F0aW9uOiBzdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICAgICAgdGl0bGVMb2NhdGlvbiA9IHRoaXMucXVlc3Rpb24uaGFzVGl0bGUgPyB0aXRsZUxvY2F0aW9uIDogJ2hpZGRlbic7XG4gICAgICAgIHN3aXRjaCAodGl0bGVMb2NhdGlvbikge1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRmxhdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChoZWFkZXJGbGF0KSwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBpZihjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJGbGF0LmFkZEJyaWNrKGNvbnRlbnRGbGF0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChoZWFkZXJGbGF0KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKHRpdGxlUG9pbnQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SGVhZGVyKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChoZWFkZXJGbGF0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9IT1JfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRlbnRQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgICAgICAgIGNhc2UgU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlTG9jYXRpb24gIT09IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb250ZW50V2l0aE9wdGlvbmFsRWxlbWVudHMoY29udGVudFBvaW50KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgc2hvdWxkUmVuZGVyQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLnNob3VsZFJlbmRlclJlYWRPbmx5KHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdxdWVzdGlvbicsIHtcbiAgICBuYW1lOiAncmVhZG9ubHlSZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICd0ZXh0JywgJ2Fjcm9mb3JtJ10sXG4gICAgdmlzaWJsZTogZmFsc2Vcbn0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3F1ZXN0aW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFRleHRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgYWxpZ246IGFueTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmFsaWduID0ge1xuICAgICAgICAgICAgaXNJbnB1dFJ0bDogZmFsc2UsXG4gICAgICAgICAgICBpc091dHB1dFJ0bDogY29udHJvbGxlci5pc1JUTCxcbiAgICAgICAgICAgIGFsaWduOiBjb250cm9sbGVyLmlzUlRMID8gJ3JpZ2h0JzogJ2xlZnQnLFxuICAgICAgICAgICAgYmFzZWxpbmU6ICdtaWRkbGUnXG4gICAgICAgIH07XG4gICAgfVxuICAgIHByaXZhdGUgZXNjYXBlVGV4dCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudGV4dC5pbmRleE9mKCdcXHQnKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQucmVwbGFjZSgnXFx0JywgQXJyYXkoNSkuam9pbihTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBhbGlnblBvaW50OiBJUG9pbnQgPSB0aGlzLmFsaWduUG9pbnQodGhpcyk7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBsZXQgb2xkVGV4dENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldFRleHRDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcih0aGlzLnRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MudGV4dCh0aGlzLmVzY2FwZVRleHQoKSwgYWxpZ25Qb2ludC54TGVmdCwgYWxpZ25Qb2ludC55VG9wLCB0aGlzLmFsaWduKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhbGlnblBvaW50KHJlY3Q6IElSZWN0KTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLmNvbnRyb2xsZXIuaXNSVEwgPyByZWN0LnhSaWdodCA6IHJlY3QueExlZnQsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyAocmVjdC55Qm90IC0gcmVjdC55VG9wKSAvIDIuMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dC50cyIsImltcG9ydCB7IElQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgcHJpdmF0ZSBfeExlZnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF95VG9wOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gMC4wO1xuICAgICAgICB0aGlzLl94UmlnaHQgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lUb3AgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lCb3QgPSAwLjA7XG4gICAgICAgIHRoaXMuYWRkQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgZ2V0IHhMZWZ0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl94TGVmdDsgfVxuICAgIHNldCB4TGVmdCh4TGVmdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoeExlZnQgLSB0aGlzLnhMZWZ0LCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feExlZnQgPSB4TGVmdDtcbiAgICB9XG4gICAgZ2V0IHhSaWdodCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feFJpZ2h0OyB9XG4gICAgc2V0IHhSaWdodCh4UmlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgeFJpZ2h0IC0gdGhpcy54UmlnaHQsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0geFJpZ2h0O1xuICAgIH1cbiAgICBnZXQgeVRvcCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feVRvcDsgfVxuICAgIHNldCB5VG9wKHlUb3A6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgMC4wLCB5VG9wIC0gdGhpcy55VG9wLCAwLjApO1xuICAgICAgICB0aGlzLl95VG9wID0geVRvcDtcbiAgICB9XG4gICAgZ2V0IHlCb3QoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lCb3Q7IH1cbiAgICBzZXQgeUJvdCh5Qm90OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgMC4wLCB5Qm90IC0gdGhpcy55Qm90KTtcbiAgICAgICAgdGhpcy5feUJvdCA9IHlCb3Q7XG4gICAgfVxuICAgIHByaXZhdGUgc2hpZnQobGVmdFNoaWZ0OiBudW1iZXIsIHJpZ2h0U2hpZnQ6IG51bWJlcixcbiAgICAgICAgdG9wU2hpZnQ6IG51bWJlciwgYm90U2hpZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay54TGVmdCArPSBsZWZ0U2hpZnQ7XG4gICAgICAgICAgICBicmljay54UmlnaHQgKz0gcmlnaHRTaGlmdDtcbiAgICAgICAgICAgIGJyaWNrLnlUb3AgKz0gdG9wU2hpZnQ7XG4gICAgICAgICAgICBicmljay55Qm90ICs9IGJvdFNoaWZ0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5icmlja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJpY2tzW2ldLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJpY2tzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcHVibGljIGFkZEJyaWNrKC4uLmJyaWNrczogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgaWYgKGJyaWNrcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5icmlja3MucHVzaCguLi5icmlja3MpO1xuICAgICAgICAgICAgbGV0IG1lcmdlUmVjdCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnRoaXMuYnJpY2tzKTtcbiAgICAgICAgICAgIHRoaXMuX3hMZWZ0ID0gbWVyZ2VSZWN0LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5feFJpZ2h0ID0gbWVyZ2VSZWN0LnhSaWdodDtcbiAgICAgICAgICAgIHRoaXMuX3lUb3AgPSBtZXJnZVJlY3QueVRvcDtcbiAgICAgICAgICAgIHRoaXMuX3lCb3QgPSBtZXJnZVJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgY29uc3QgdW5mb2xkQnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRCcmlja3MucHVzaCguLi5icmljay51bmZvbGQoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5mb2xkQnJpY2tzO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKGJyaWNrID0+IGJyaWNrLnRyYW5zbGF0ZVgoZnVuYykpO1xuICAgICAgICBjb25zdCByZXMgPSBmdW5jKHRoaXMueExlZnQsIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgdGhpcy5feExlZnQgPSByZXMueExlZnQ7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHJlcy54UmlnaHQ7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNl9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9XG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IHR5cGUgVHJhbnNsYXRlWEZ1bmN0aW9uID0gKHhMZWZ0OiBudW1iZXIsIHhSaWdodCA6IG51bWJlcikgPT4geyB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlcn07XG5leHBvcnQgaW50ZXJmYWNlIElQZGZCcmljayBleHRlbmRzIElSZWN0LCBJU2l6ZSB7XG4gICAgcmVuZGVyKCk6IFByb21pc2U8dm9pZD47XG4gICAgdW5mb2xkKCk6IElQZGZCcmlja1tdO1xuICAgIHRyYW5zbGF0ZVgoZnVuYzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZDtcbiAgICBpc1BhZ2VCcmVhazogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgUERGIGJyaWNrJm1kYXNoO2Egc2ltcGxlIGVsZW1lbnQgd2l0aCBzcGVjaWZpZWQgY29udGVudCwgc2l6ZSwgYW5kIGxvY2F0aW9uLiBCcmlja3MgYXJlIGZ1bmRhbWVudGFsIGVsZW1lbnRzIHVzZWQgdG8gY29uc3RydWN0IGEgUERGIGRvY3VtZW50LlxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIGBQZGZCcmlja2Agb2JqZWN0cyB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlclF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXlwZGYjb25SZW5kZXJRdWVzdGlvbiksIFtgb25SZW5kZXJQYW5lbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyUGFuZWwpLCBhbmQgW2BvblJlbmRlclBhZ2VgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlclBhZ2UpIGV2ZW50cy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvYWRkLW1hcmt1cC10by1jdXN0b21pemUtcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFBkZkJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3lUb3A6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3lCb3Q6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIGxlZnQgYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHhMZWZ0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl94TGVmdDtcbiAgICB9XG4gICAgcHVibGljIHNldCB4TGVmdCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFhMZWZ0KHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIHJpZ2h0IGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB4UmlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3hSaWdodDtcbiAgICB9XG4gICAgcHVibGljIHNldCB4UmlnaHQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRYUmlnaHQodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSB0b3AgYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHlUb3AoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3lUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeVRvcCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFlUb3AodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSBib3R0b20gYnJpY2sgZWRnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHlCb3QoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3lCb3Q7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeUJvdCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFlCb3R0b20odmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIGluIHBvaW50cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IDE0IChpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IFBERiBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNpemU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29sb3Igb2YgdGV4dCB3aXRoaW4gdGhlIGJyaWNrLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYFwiIzQwNDA0MFwiYFxuICAgICAqL1xuICAgIHB1YmxpYyB0ZXh0Q29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5URVhUX0NPTE9SO1xuICAgIHB1YmxpYyBmb3JtQm9yZGVyQ29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCkge1xuICAgICAgICB0aGlzLnhMZWZ0ID0gcmVjdC54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZWN0LnhSaWdodDtcbiAgICAgICAgdGhpcy55VG9wID0gcmVjdC55VG9wO1xuICAgICAgICB0aGlzLnlCb3QgPSByZWN0LnlCb3Q7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAhIWNvbnRyb2xsZXIgP1xuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA6IERvY0NvbnRyb2xsZXIuRk9OVF9TSVpFO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCByZXMgPSBmdW5jKHRoaXMueExlZnQsIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlcy54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYnJpY2sncyB3aWR0aCBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYnJpY2sncyBoZWlnaHQgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5nZXRTaG91bGRSZW5kZXJSZWFkT25seSgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJSZW5kZXJDYWxsYmFjayAmJiB0aGlzLmFmdGVyUmVuZGVyQ2FsbGJhY2soKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyB5b3UgdG8gZ2V0IGEgZmxhdCBhcnJheSBvZiBuZXN0ZWQgUERGIGJyaWNrcy5cbiAgICAgKiBAcmV0dXJucyBBIGZsYXQgYXJyYXkgb2YgbmVzdGVkIFBERiBicmlja3MuXG4gICAgICovXG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb3JyZWN0ZWRUZXh0KHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5pc1JUTCA/ICh2YWwgfHwgJycpLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk6IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhMZWZ0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gdmFsO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WFJpZ2h0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlUb3AodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5feVRvcCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlCb3R0b20odmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5feUJvdCA9IHZhbDtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJpbXBvcnQgeyBqc1BERiwganNQREZPcHRpb25zIH0gZnJvbSAnanNwZGYnO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuLy8gaW1wb3J0IEZvbnRzIGZyb20gJy4vZm9udHMnO1xuaW1wb3J0IHNldFJhZGlvQXBwZWFyYW5jZSBmcm9tICcuL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0nO1xuaW1wb3J0ICcuL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanMnO1xuaW1wb3J0ICcuL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJUG9pbnQge1xuICAgIC8qKlxuICAgICAqIEFuIFgtY29vcmRpbmF0ZSBmb3IgdGhlIGxlZnQgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSB0b3AgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHlUb3A6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIGEgcmVjdGFuZ2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWN0IGV4dGVuZHMgSVBvaW50IHtcbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSByaWdodCBlbGVtZW50IGVkZ2UuXG4gICAgICovXG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBZLWNvb3JkaW5hdGUgZm9yIHRoZSBib3R0b20gZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHlCb3Q6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVNpemUge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW5MUiB7XG4gICAgLyoqXG4gICAgICogQSBsZWZ0IG1hcmdpbi5cbiAgICAgKi9cbiAgICBsZWZ0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgcmlnaHQgbWFyZ2luLlxuICAgICAqL1xuICAgIHJpZ2h0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCBkZXNjcmliZXMgbWFyZ2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luIGV4dGVuZHMgSU1hcmdpbkxSIHtcbiAgICAvKipcbiAgICAgKiBBIHRvcCBtYXJnaW4uXG4gICAgICovXG4gICAgdG9wPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgYm90dG9tIG1hcmdpbi5cbiAgICAgKi9cbiAgICBib3Q/OiBudW1iZXI7XG59XG4vKipcbiAqIFBERiBkb2N1bWVudCBjb25maWd1cmF0aW9uLiBQYXNzIGl0IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGBTdXJ2ZXlQREZgIGNvbnN0cnVjdG9yOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzdXJ2ZXlQZGYgPSBuZXcgU3VydmV5UERGLlN1cnZleVBERihzdXJ2ZXlKc29uLCBwZGZEb2NPcHRpb25zKTtcbiAqXG4gKiAvLyBJbiBtb2R1bGFyIGFwcGxpY2F0aW9uczpcbiAqIGltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gXCJzdXJ2ZXktcGRmXCI7XG4gKiBjb25zdCBzdXJ2ZXlQZGYgPSBuZXcgU3VydmV5UERGKHN1cnZleUpzb24sIHBkZkRvY09wdGlvbnMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURvY09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFBhZ2Ugb3JpZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInBcImAgKGRlZmF1bHQpIC0gUG9ydHJhaXQgb3JpZW50YXRpb24uXG4gICAgICogLSBgXCJsXCJgIC0gTGFuZHNjYXBlIG9yaWVudGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBmb3JtYXRcbiAgICAgKi9cbiAgICBvcmllbnRhdGlvbj86ICdwJyB8ICdsJztcblxuICAgIC8qKlxuICAgICAqIFBhZ2UgZm9ybWF0LlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJhMFwiYCAtIGBcImExMFwiYCAoYFwiYTRcImAgaXMgZGVmYXVsdClcbiAgICAgKiAtIGBcImIwXCJgIC0gYFwiYjEwXCJgXG4gICAgICogLSBgXCJjMFwiYCAtIGBcImMxMFwiYFxuICAgICAqIC0gYFwiZGxcImBcbiAgICAgKiAtIGBcImxldHRlclwiYFxuICAgICAqIC0gYFwiZ292ZXJubWVudC1sZXR0ZXJcImBcbiAgICAgKiAtIGBcImxlZ2FsXCJgXG4gICAgICogLSBgXCJqdW5pb3ItbGVnYWxcImBcbiAgICAgKiAtIGBcImxlZGdlclwiYFxuICAgICAqIC0gYFwidGFibG9pZFwiYFxuICAgICAqIC0gYFwiY3JlZGl0LWNhcmRcImBcbiAgICAgKiAtIEFycmF5PG51bWJlcj4gLSBjdXN0b20gcGFnZSBzaXplIGluIG1pbGxpbWV0ZXJzLCBmb3IgZXhhbXBsZSwgYFsyMTAsIDI5N11gLlxuICAgICAqXG4gICAgICogQHNlZSBvcmllbnRhdGlvblxuICAgICAqL1xuICAgIGZvcm1hdD86IHN0cmluZyB8IG51bWJlcltdO1xuXG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIGluIHBvaW50cy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IDE0XG4gICAgICpcbiAgICAgKiBAc2VlIGZvbnROYW1lXG4gICAgICovXG4gICAgZm9udFNpemU/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBGb250IG5hbWUuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcIkhlbHZldGljYVwiYCAoZGVmYXVsdClcbiAgICAgKiAtIGBcIkNvdXJpZXJcImBcbiAgICAgKiAtIGBcIlRpbWVzXCJgXG4gICAgICogLSBgXCJTeW1ib2xcImBcbiAgICAgKiAtIGBcIlphcGZEaW5nYmF0c1wiYFxuICAgICAqIC0gW0N1c3RvbSBmb250IG5hbWVdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9QZGYtRXhwb3J0P2lkPUN1c3RvbWl6YXRpb24tQ2hhbmdlRm9udHMjdXNlLWN1c3RvbS1mb250KVxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2NoYW5nZS1mb250LWluLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKiBAc2VlIGZvbnRTaXplXG4gICAgICovXG4gICAgZm9udE5hbWU/OiBzdHJpbmc7XG5cbiAgICBiYXNlNjROb3JtYWw/OiBzdHJpbmc7XG4gICAgYmFzZTY0Qm9sZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcHBseSBhIGN1c3RvbSBmb250IHRvIFtIVE1MIHF1ZXN0aW9uc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvcXVlc3Rpb250eXBlLWh0bWwvKS5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jaGFuZ2UtZm9udC1pbi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICogQHNlZSBodG1sUmVuZGVyQXNcbiAgICAgKi9cbiAgICB1c2VDdXN0b21Gb250SW5IdG1sPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFBhZ2UgbWFyZ2lucy4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6IGB0b3BgLCBgYm90YCwgYGxlZnRgLCBgcmlnaHRgLlxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZW5kZXIgW0hUTUwgcXVlc3Rpb25zXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbmh0bWxtb2RlbCkgaW50byBQREYuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInN0YW5kYXJkXCJgIC0gUmVuZGVyIEhUTUwgcXVlc3Rpb25zIGFzIHNlbGVjdGFibGUgdGV4dC5cbiAgICAgKiAtIGBcImltYWdlXCJgIC0gUmVuZGVyIEhUTUwgcXVlc3Rpb25zIGFzIGltYWdlcy5cbiAgICAgKiAtIGBcImF1dG9cImAgKGRlZmF1bHQpIC0gU2VsZWN0IGJldHdlZW4gdGhlIGBcInN0YW5kYXJkXCJgIGFuZCBgXCJpbWFnZVwiYCBtb2RlcyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBIVE1MIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgZm9yIGFuIGluZGl2aWR1YWwgSFRNTCBxdWVzdGlvbi4gU2V0IHRoZSBxdWVzdGlvbidzIGByZW5kZXJBc2AgcHJvcGVydHkgdG8gYFwic3RhbmRhcmRcImAgb3IgYFwiaW1hZ2VcImAgaW4gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAgICAgKiBAc2VlIHVzZUN1c3RvbUZvbnRJbkh0bWxcbiAgICAgKi9cbiAgICBodG1sUmVuZGVyQXM/OiBJSFRNTFJlbmRlclR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG93IHRvIHJlbmRlciBbTWF0cml4XShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbm1hdHJpeG1vZGVsKSwgW01hdHJpeCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhkcm9wZG93bm1vZGVsKSwgYW5kIFtNYXRyaXggRHluYW1pY10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhkeW5hbWljbW9kZWwpIHF1ZXN0aW9ucyBpbnRvIFBERi5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwibGlzdFwiYCAtIFJlbmRlciBtYXRyaXgtbGlrZSBxdWVzdGlvbnMgYXMgbGlzdHMuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFJlbmRlciBtYXRyaXgtbGlrZSBxdWVzdGlvbnMgYXMgdGFibGVzIGlmIHRoZXkgZml0IGludG8gdGhlIGF2YWlsYWJsZSBzcGFjZS4gT3RoZXJ3aXNlLCByZW5kZXIgdGhlIHF1ZXN0aW9ucyBhcyBsaXN0cy5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBwcm9wZXJ0eSBmb3IgYW4gaW5kaXZpZHVhbCBtYXRyaXgtbGlrZSBxdWVzdGlvbi4gU2V0IHRoZSBxdWVzdGlvbidzIGByZW5kZXJBc2AgcHJvcGVydHkgdG8gYFwibGlzdFwiYCBpbiB0aGUgc3VydmV5IEpTT04gc2NoZW1hLlxuICAgICAqL1xuICAgIG1hdHJpeFJlbmRlckFzPzogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVuZGVyIHJlYWQtb25seSBxdWVzdGlvbnMuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcInRleHRcImAgLSBSZW5kZXIgcmVhZC1vbmx5IHF1ZXN0aW9ucyBhcyBwbGFpbiB0ZXh0IGFuZCBjdXN0b20gcHJpbWl0aXZlcy5cbiAgICAgKiAtIGBcImFjcm9mb3JtXCJgIC0gVXNlIEFkb2JlIEFjcm9Gb3JtcyB0byByZW5kZXIgcXVlc3Rpb25zIHRoYXQgc3VwcG9ydCB0aGVtIGFzIGludGVyYWN0aXZlIGZvcm0gZWxlbWVudHMgc3dpdGNoZWQgdG8gdGhlaXIgbmF0aXZlIHJlYWQtb25seSBzdGF0ZS4gT3RoZXIgcXVlc3Rpb25zIGFyZSByZW5kZXJlZCBpbiBgXCJ0ZXh0XCJgIG1vZGUuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFByZWZlciB0aGUgYFwidGV4dFwiYCBtb2RlIGJ1dCB1c2UgYFwiYWNyb2Zvcm1cImAgZm9yIFtGaWxlIFVwbG9hZF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ZpbGUtbW9kZWwpIHF1ZXN0aW9ucyBhbmQgbGlua3MuXG4gICAgICovXG4gICAgcmVhZG9ubHlSZW5kZXJBcz86ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybSc7XG5cbiAgICB0ZXh0RmllbGRSZW5kZXJBcz86ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gY29tcHJlc3MgdGhlIFBERiBkb2N1bWVudC4gQ29tcHJlc3NlZCBkb2N1bWVudHMgZG8gbm90IHN1cHBvcnQgW2N1c3RvbSBmb250c10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL1BkZi1FeHBvcnQ/aWQ9Q3VzdG9taXphdGlvbi1DaGFuZ2VGb250cyN1c2UtY3VzdG9tLWZvbnQpLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqL1xuICAgIGNvbXByZXNzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGFwcGx5IGBpbWFnZUZpdGAgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSBzdXJ2ZXkgSlNPTiBzY2hlbWEgdG8gZXhwb3J0ZWQgaW1hZ2VzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6XG4gICAgICpcbiAgICAgKiAtIFtgaW1hZ2VGaXRgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvYWRkLWltYWdlLXRvLXN1cnZleSNpbWFnZUZpdCkgdG8gZXhwb3J0ZWQgW0ltYWdlXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvYWRkLWltYWdlLXRvLXN1cnZleSkgcXVlc3Rpb25zXG4gICAgICogLSBbYGltYWdlRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ltYWdlLXBpY2tlci1xdWVzdGlvbi1tb2RlbCNpbWFnZUZpdCkgdG8gZXhwb3J0ZWQgW0ltYWdlIFBpY2tlcl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2ltYWdlLXBpY2tlci1xdWVzdGlvbi1tb2RlbCkgcXVlc3Rpb25zXG4gICAgICogLSBbYGxvZ29GaXRgXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5LWRhdGEtbW9kZWwjbG9nb0ZpdCkgdG8gYW4gZXhwb3J0ZWQgbG9nbyBpbiB0aGUgc3VydmV5IGhlYWRlclxuICAgICAqXG4gICAgICogSWYgeW91IGVuYWJsZSB0aGUgYGFwcGx5SW1hZ2VGaXRgIHByb3BlcnR5LCB0aGUgcXVhbGl0eSBvZiBpbWFnZXMgbWF5IGJlIGxvd2VyIGJlY2F1c2UgdGhleSBwYXNzIHRocm91Z2ggc2V2ZXJhbCBjb252ZXJzaW9ucy4gSWYgYGFwcGx5SW1hZ2VGaXRgIGlzIGRpc2FibGVkLCBleHBvcnRlZCBpbWFnZXMgZmlsbCB0aGUgZW50aXJlIGNvbnRhaW5lciBhbmQgZG8gbm90IHByZXNlcnZlIHRoZWlyIGFzcGVjdCByYXRpbywgYnV0IHRoZWlyIHF1YWxpdHkgcmVtYWlucyB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIGV4cG9ydGVkIGFzIGlzLlxuICAgICAqL1xuICAgIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBERiBkb2N1bWVudCBjb250YWlucyB0ZXh0IGluIHJpZ2h0LXRvLWxlZnQgbGFuZ3VhZ2VzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYGZhbHNlYFxuICAgICAqL1xuICAgIGlzUlRMPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBpbmNsdWRlIG9ubHkgc2VsZWN0ZWQgY2hvaWNlcyB3aGVuIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIFtNdWx0aS1TZWxlY3QgRHJvcGRvd24gKFRhZyBCb3gpXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9leGFtcGxlcy9ob3ctdG8tY3JlYXRlLW11bHRpc2VsZWN0LXRhZy1ib3gvKSBxdWVzdGlvbi5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWAgKGluY2x1ZGUgYWxsIGNob2ljZXMpXG4gICAgICovXG4gICAgdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NPcHRpb25zIGltcGxlbWVudHMgSURvY09wdGlvbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU1fVE9fUFQgPSA3MiAvIDI1LjQ7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkUgPSAxNDtcbiAgICBwcm90ZWN0ZWQgX29yaWVudGF0aW9uOiAnbCcgfCAncCc7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3RlY3RlZCBfZm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2ZvbnROYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9OT1JNQUw6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX0JPTEQ6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NE5vcm1hbDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Qm9sZDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfdXNlQ3VzdG9tRm9udEluSHRtbDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX21hcmdpbnM6IElNYXJnaW47XG4gICAgcHJvdGVjdGVkIF9odG1sUmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZTtcbiAgICBwcm90ZWN0ZWQgX21hdHJpeFJlbmRlckFzOiAnYXV0bycgfCAnbGlzdCc7XG4gICAgcHJvdGVjdGVkIF9yZWFkb25seVJlbmRlckFzOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHByb3RlY3RlZCBfY29tcHJlc3M6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9hcHBseUltYWdlRml0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdXNlTGVnYWN5Qm9vbGVhblJlbmRlcmluZzogYm9vbGVhblxuICAgIHByb3RlY3RlZCBfaXNSVEw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF90YWdib3hTZWxlY3RlZENob2ljZXNPbmx5OiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0WzBdIDwgb3B0aW9ucy5mb3JtYXRbMV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICdwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSAnbCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICdhNCc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2Zvcm1hdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IHRoaXMuX2Zvcm1hdC5tYXAoZiA9PiBmICogRG9jT3B0aW9ucy5NTV9UT19QVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBvcHRpb25zLmZvbnRTaXplIHx8IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICBpZighb3B0aW9ucy5mb250TmFtZSkge1xuICAgICAgICAgICAgaWYoIURvY09wdGlvbnMuU0VHT0VfQk9MRCAmJiAhRG9jT3B0aW9ucy5TRUdPRV9OT1JNQUwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9IFN1cnZleUhlbHBlci5TVEFOREFSRF9GT05UO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9ICdzZWdvZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb250TmFtZSA9IG9wdGlvbnMuZm9udE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlb2Ygb3B0aW9ucy5mb250TmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Qm9sZCAhPT0gJ3VuZGVmaW5lZCcpKSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gb3B0aW9ucy5iYXNlNjROb3JtYWwgfHwgb3B0aW9ucy5iYXNlNjRCb2xkO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IG9wdGlvbnMuYmFzZTY0Qm9sZCB8fCBvcHRpb25zLmJhc2U2NE5vcm1hbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZvbnROYW1lID09PSAnc2Vnb2UnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjROb3JtYWwgPSBGb250cy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjRCb2xkID0gRm9udHMuU0VHT0VfQk9MRDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IERvY09wdGlvbnMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IERvY09wdGlvbnMuU0VHT0VfQk9MRDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJnaW5zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMubWFyZ2lucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy50b3AgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmJvdCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLmxlZnQgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMucmlnaHQgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX21hcmdpbnMpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gPSAoPGFueT50aGlzLl9tYXJnaW5zKVtuYW1lXSAqIERvY09wdGlvbnMuTU1fVE9fUFQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9odG1sUmVuZGVyQXMgPSBvcHRpb25zLmh0bWxSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX21hdHJpeFJlbmRlckFzID0gb3B0aW9ucy5tYXRyaXhSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3JlYWRvbmx5UmVuZGVyQXMgPSBvcHRpb25zLnJlYWRvbmx5UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9jb21wcmVzcyA9IG9wdGlvbnMuY29tcHJlc3MgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2FwcGx5SW1hZ2VGaXQgPSBvcHRpb25zLmFwcGx5SW1hZ2VGaXQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcgPSBvcHRpb25zLnVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzUlRMID0gb3B0aW9ucy5pc1JUTCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSA9IG9wdGlvbnMudGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSB8fCBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBsZWZ0VG9wUG9pbnQoKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHRoaXMubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NE5vcm1hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Tm9ybWFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NEJvbGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NEJvbGQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlQ3VzdG9tRm9udEluSHRtbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWFyZ2lucygpOiBJTWFyZ2luIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmdpbnM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB8IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBvcmllbnRhdGlvbigpOiAnbCcgfCAncCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaHRtbFJlbmRlckFzKCk6IElIVE1MUmVuZGVyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9odG1sUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWF0cml4UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ2xpc3QnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hdHJpeFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlYWRvbmx5UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvbXByZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYXBwbHlJbWFnZUZpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5SW1hZ2VGaXQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlTGVnYWN5Qm9vbGVhblJlbmRlcmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNSVEwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1JUTDtcbiAgICB9XG4gICAgcHVibGljIGdldCB0YWdib3hTZWxlY3RlZENob2ljZXNPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seTtcbiAgICB9XG59XG5cbi8qKlxuICogVGhlIGBEb2NDb250cm9sbGVyYCBvYmplY3QgaW5jbHVkZXMgYW4gQVBJIHRoYXQgYWxsb3dzIHlvdSB0byBjb25maWd1cmUgdGhlIHJlc3VsdGluZyBQREYgZG9jdW1lbnQuIFlvdSBjYW4gYWNjZXNzIHRoaXMgb2JqZWN0IHdpdGhpbiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdGhlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlci4uLmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyRm9vdGVyKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIERvY0NvbnRyb2xsZXIgZXh0ZW5kcyBEb2NPcHRpb25zIHtcbiAgICBwcml2YXRlIF9kb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2hlbHBlckRvYzoganNQREY7XG4gICAgcHJpdmF0ZSBfZm9udFN0eWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBtYXJnaW5zU3RhY2s6IElNYXJnaW5MUltdO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBqc3BkZk9wdGlvbnM6IGpzUERGT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiB0aGlzLm9yaWVudGF0aW9uLFxuICAgICAgICAgICAgdW5pdDogJ3B0JyxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5mb3JtYXQsXG4gICAgICAgICAgICBjb21wcmVzczogdGhpcy5jb21wcmVzc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgIVN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjRCb2xkLCAnYm9sZCcpO1xuICAgICAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmFkaW9BcHBlYXJhbmNlKHRoaXMuX2RvYyk7XG4gICAgICAgIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWwgPSBvcHRpb25zLnVzZUN1c3RvbUZvbnRJbkh0bWwgJiYgU3VydmV5SGVscGVyLmlzRm9udEV4aXN0KHRoaXMsIHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZSh0aGlzLmZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIHRoaXMubWFyZ2luc1N0YWNrID0gW107XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3VzdG9tRm9udHM6IHsgW25hbWU6IHN0cmluZ106IHsgbm9ybWFsOiBzdHJpbmcsIGJvbGQ6IHN0cmluZywgaXRhbGljOiBzdHJpbmcsIGJvbGRpdGFsaWM6IHN0cmluZyB9IH0gPSB7fTtcbiAgICBwdWJsaWMgc3RhdGljIGFkZEZvbnQoZm9udE5hbWU6IHN0cmluZywgYmFzZTY0OiBzdHJpbmcsIGZvbnRTdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgfCAnaXRhbGljJyB8ICdib2xkaXRhbGljJykge1xuICAgICAgICBsZXQgZm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICBpZiAoIWZvbnQpIHtcbiAgICAgICAgICAgIGZvbnQgPSA8YW55Pnt9O1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV0gPSBmb250O1xuICAgICAgICB9XG4gICAgICAgIGZvbnRbZm9udFN0eWxlXSA9IGJhc2U2NDtcbiAgICAgICAgY29uc3QgYWRkRm9udENhbGxiYWNrOiAoKSA9PiB2b2lkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICAgICAgaWYgKCEhY3VzdG9tRm9udCAmJiAhIWN1c3RvbUZvbnRbZm9udFN0eWxlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRGaWxlOiBzdHJpbmcgPSBgJHtmb250TmFtZX0tJHtmb250U3R5bGV9LnR0ZmA7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlVG9WRlMoZm9udEZpbGUsIGN1c3RvbUZvbnRbZm9udFN0eWxlXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGb250KGZvbnRGaWxlLCBmb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgKDxhbnk+anNQREYpLkFQSS5ldmVudHMucHVzaChbJ2FkZEZvbnRzJywgYWRkRm9udENhbGxiYWNrXSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZG9jKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVscGVyRG9jKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWxwZXJEb2M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnROYW1lKGZvbnROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBmb250TmFtZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udChmb250TmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnRTaXplKGZvbnRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U3R5bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTdHlsZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U3R5bGUoZm9udFN0eWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZm9udFN0eWxlID0gZm9udFN0eWxlO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBtZWFzdXJlVGV4dCh0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyB8IG51bWJlciA9IDEsIGZvbnRTdHlsZTogc3RyaW5nID0gdGhpcy5fZm9udFN0eWxlLFxuICAgICAgICBmb250U2l6ZTogbnVtYmVyID0gdGhpcy5fZm9udFNpemUpOiBJU2l6ZSB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLl9oZWxwZXJEb2MuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldExpbmVIZWlnaHQoKSAvIHRoaXMuX2hlbHBlckRvYy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSAwLjA7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0ZXh0IDogU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0ZXh0KTtcbiAgICAgICAgICAgIHdpZHRoID0gdGV4dC5zcGxpdCgnJykucmVkdWNlKChzbTogbnVtYmVyLCBjcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgIHNtICsgdGhpcy5faGVscGVyRG9jLmdldFRleHRXaWR0aChjciksIDAuMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKG9sZEZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsICdub3JtYWwnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBvbmUgY2hhcmFjdGVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVuaXRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ3RoIG9mIG9uZSBjaGFyYWN0ZXIgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5pdEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLmhlaWdodDtcbiAgICB9XG4gICAgcHVibGljIHB1c2hNYXJnaW5zKGxlZnQ/OiBudW1iZXIsIHJpZ2h0PzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFyZ2luc1N0YWNrLnB1c2goeyBsZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCwgcmlnaHQ6IHRoaXMubWFyZ2lucy5yaWdodCB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBsZWZ0ICE9PSAndW5kZWZpbmVkJykgdGhpcy5tYXJnaW5zLmxlZnQgPSBsZWZ0O1xuICAgICAgICBpZiAodHlwZW9mIHJpZ2h0ICE9PSAndW5kZWZpbmVkJykgdGhpcy5tYXJnaW5zLnJpZ2h0ID0gcmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwb3BNYXJnaW5zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXJnaW5zOiBJTWFyZ2luTFIgPSB0aGlzLm1hcmdpbnNTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy5tYXJnaW5zLmxlZnQgPSBtYXJnaW5zLmxlZnQ7XG4gICAgICAgIHRoaXMubWFyZ2lucy5yaWdodCA9IG1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiBhIFBERiBwYWdlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcGVyV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgUERGIHBhZ2UgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFwZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodDtcbiAgICB9XG4gICAgcHVibGljIGdldE51bWJlck9mUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICB9XG4gICAgcHVibGljIGFkZFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLmFkZFBhZ2UoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEN1cnJlbnRQYWdlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgLSAxO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLnNldFBhZ2UoaW5kZXggKyAxKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZG9jX2NvbnRyb2xsZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFJhZGlvR3JvdXBXcmFwLCBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYWRpb2dyb3VwIGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw7XG4gICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUsIGNoZWNrZWQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIGNoZWNrZWQgPT09ICd1bmRlZmluZWQnKSA/XG4gICAgICAgICAgICAoaXRlbSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0gPyB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCA6XG4gICAgICAgICAgICAgICAgKGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24udmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZChpdGVtKSkpKSA6IGNoZWNrZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGtleT86IHN0cmluZywgY2hlY2tlZD86IGJvb2xlYW4sIGNvbnRleHQ6IGFueSA9IHt9KTogSVBkZkJyaWNrIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gbmV3IFJhZGlvR3JvdXBXcmFwKHRoaXMucXVlc3Rpb24uaWQgKyAoKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSA/ICcnIDoga2V5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHsgcmVhZE9ubHk6IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSwgcXVlc3Rpb246IHRoaXMucXVlc3Rpb24sIC4uLmNvbnRleHQgfSk7XG4gICAgICAgICAgICAoPGFueT50aGlzLnF1ZXN0aW9uKS5wZGZSYWRpb0dyb3VwV3JhcCA9IHRoaXMucmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucmFkaW9Hcm91cFdyYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNDaGVja2VkOiBib29sZWFuID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtLCBjaGVja2VkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0l0ZW1Ccmljayh0aGlzLmNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICB7IHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCBpbmRleDogaW5kZXgsIGNoZWNrZWQ6IGlzQ2hlY2tlZCwgaXRlbTogaXRlbSB9LCB0aGlzLnJhZGlvR3JvdXBXcmFwKTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhZGlvZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdidXR0b25ncm91cCcsIEZsYXRSYWRpb2dyb3VwKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSUVsZW1lbnQsIFF1ZXN0aW9uLCBQYW5lbE1vZGVsQmFzZSwgUGFuZWxNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZW50cmllcy9wZGYnO1xuaW1wb3J0ICogYXMgU3VydmV5UERGTW9kdWxlIGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEZsYXRTdXJ2ZXkge1xuICAgIHB1YmxpYyBzdGF0aWMgUVVFU19HQVBfVkVSVF9TQ0FMRTogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgUEFORUxfQ09OVF9HQVBfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0RFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0c1BhbmVsKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwYW5lbDogUGFuZWxNb2RlbCwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFuZWxDb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gY29udHJvbGxlci5tZWFzdXJlVGV4dChwYW5lbC5pbm5lckluZGVudCkud2lkdGg7XG4gICAgICAgIHBhbmVsQ29udGVudFBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbEZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKHN1cnZleSxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhbmVsLCBwYW5lbENvbnRlbnRQb2ludCkpO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhbmVsT3B0aW9ucyA9IG5ldyBBZG9ybmVyc1BhbmVsT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgIHBhbmVsRmxhdHMsIHBhbmVsLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJQYW5lbC5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFnZVBhbmVsOiBQYW5lbE1vZGVsQmFzZSwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKCFwYWdlUGFuZWwuaXNWaXNpYmxlKSByZXR1cm47XG4gICAgICAgIHBhZ2VQYW5lbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgICAgIGNvbnN0IHBhZ2VQYW5lbEZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAocGFnZVBhbmVsLmdldFR5cGUoKSAhPT0gJ3BhZ2UnIHx8IHN1cnZleS5zaG93UGFnZVRpdGxlcykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsIGluc3RhbmNlb2YgUGFuZWxNb2RlbCAmJiBwYWdlUGFuZWwubm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVQYW5lbEZsYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5ubywgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhub0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBub0ZsYXQueFJpZ2h0ICsgY29udHJvbGxlci5tZWFzdXJlVGV4dCgnICcpLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlbFBhbmVsVGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVQYW5lbEZsYXQoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgY29udHJvbGxlciwgcGFnZVBhbmVsLmxvY1RpdGxlLCBwYWdlUGFuZWwuZ2V0VHlwZSgpID09PSAncGFnZScpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZWxQYW5lbFRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChwYWdlUGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlUGFuZWxEZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHBhZ2VQYW5lbERlc2NGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29tcG9zaXRlRmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocm93TGluZVBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlBBTkVMX0NPTlRfR0FQX1NDQUxFICsgU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgcGFnZVBhbmVsLnJvd3MpIHtcbiAgICAgICAgICAgIGlmICghcm93LnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcik7XG4gICAgICAgICAgICBsZXQgbmV4dE1hcmdpbkxlZnQ6IG51bWJlciA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3Qgcm93RmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSByb3cuZWxlbWVudHMuZmlsdGVyKGVsID0+IGVsLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmlzaWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IElFbGVtZW50ID0gdmlzaWJsZUVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnNXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZWxlbWVudC5yZW5kZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAodmlzaWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEpICogY29udHJvbGxlci51bml0V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGVFbGVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gbmV4dE1hcmdpbkxlZnQgKyAoKGkgIT09IDApID8gY29udHJvbGxlci51bml0V2lkdGggOiAwKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBuZXh0TWFyZ2luTGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBlbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhzdXJ2ZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCA8UXVlc3Rpb24+ZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnJvd0ZsYXRzKS55Qm90O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUVVFU19HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKC4uLnJvd0ZsYXRzKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVBhbmVsRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHBvcFJvd2xpbmVzKGZsYXRzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB3aGlsZSAoZmxhdHMubGVuZ3RoID4gMCAmJiBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFJvd2xpbmVCcmljaykge1xuICAgICAgICAgICAgZmxhdHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChzdXJ2ZXkuc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VydmV5VGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgc3VydmV5LmxvY1RpdGxlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdXJ2ZXkuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NEZXNjcmlwdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRMb2dvSW1hZ2Uoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBsb2dvVXJsID0gU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhzdXJ2ZXkubG9jTG9nbyk7XG4gICAgICAgIGNvbnN0IGxvZ29TaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZShjb250cm9sbGVyLCB7IGltYWdlTGluazogbG9nb1VybCwgaW1hZ2VIZWlnaHQ6IHN1cnZleS5sb2dvSGVpZ2h0LCBpbWFnZVdpZHRoOiBzdXJ2ZXkubG9nb1dpZHRoLCBkZWZhdWx0SW1hZ2VXaWR0aDogJzMwMHB4JywgZGVmYXVsdEltYWdlSGVpZ2h0OiAnMjAwcHgnIH0pO1xuICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCB7IGxpbms6IGxvZ29VcmwsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGxvZ29TaXplLndpZHRoLCBoZWlnaHQ6IGxvZ29TaXplLmhlaWdodCB9KTtcbiAgICAgICAgbGV0IHNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gbG9nb0ZsYXQud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLyAyLjAgLSBsb2dvRmxhdC53aWR0aCAvIDIuMDtcbiAgICAgICAgfVxuICAgICAgICBsb2dvRmxhdC54TGVmdCArPSBzaGlmdDtcbiAgICAgICAgbG9nb0ZsYXQueFJpZ2h0ICs9IHNoaWZ0O1xuICAgICAgICByZXR1cm4gbG9nb0ZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrW11bXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBpZiAoIXN1cnZleS5oYXNMb2dvKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5pc0xvZ29CZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQobG9nb0ZsYXQsXG4gICAgICAgICAgICAgICAgc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3RvcCcsIHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgdGl0bGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0ucHVzaCh0aXRsZUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS51bnNoaWZ0KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvZ29Qb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGxvZ29Qb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkgZmxhdHNbMF0ucHVzaChsb2dvRmxhdCk7XG4gICAgICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHNbMF0pKS55VG9wO1xuICAgICAgICAgICAgZmxhdHNbMF0ucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdXJ2ZXkudmlzaWJsZVBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdXJ2ZXkuY3VycmVudFBhZ2UgPSBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldO1xuICAgICAgICAgICAgbGV0IHBhZ2VGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIHN1cnZleS52aXNpYmxlUGFnZXNbaV0sIHBvaW50KSk7XG4gICAgICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzUGFnZU9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYWdlT3B0aW9ucyhwb2ludCxcbiAgICAgICAgICAgICAgICBwYWdlRmxhdHMsIHN1cnZleS52aXNpYmxlUGFnZXNbaV0sIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJQYWdlLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICAgICAgcGFnZUZsYXRzID0gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgZmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhdHNbMF0ucHVzaCguLi5wYWdlRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKHBhZ2VGbGF0cyk7XG4gICAgICAgICAgICB0aGlzLnBvcFJvd2xpbmVzKGZsYXRzW2ZsYXRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGVja0l0ZW1Ccmlja0NvbnRleHQge1xuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb247XG4gICAgcmVhZE9ubHk6IGJvb2xlYW47XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBpdGVtPzogSXRlbVZhbHVlO1xuICAgIGluZGV4PzogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIENoZWNrSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMC43O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICczJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjAgLSBNYXRoLkUgLyAxMC4wO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgY29udGV4dDogSUNoZWNrSXRlbUJyaWNrQ29udGV4dCkge1xuICAgICAgICBzdXBlcihjb250ZXh0LnF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+dGhpcy5jb250ZXh0LnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nIHx8IHRoaXMuY29udHJvbGxlci5jb21wcmVzcztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjaGVja0JveDogYW55ID0gbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1DaGVja0JveCkoKTtcbiAgICAgICAgY29uc3QgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBvcHRpb25zLm1heEZvbnRTaXplID0gdGhpcy5oZWlnaHQgKiBmb3JtU2NhbGUgKiBDaGVja0l0ZW1Ccmljay5GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIG9wdGlvbnMuY2FwdGlvbiA9IENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0w7XG4gICAgICAgIG9wdGlvbnMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG9wdGlvbnMuZmllbGROYW1lID0gdGhpcy5maWVsZE5hbWU7XG4gICAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSB0aGlzLmNvbnRleHQucmVhZE9ubHk7XG4gICAgICAgIG9wdGlvbnMuY29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICAgICAgb3B0aW9ucy52YWx1ZSA9IHRoaXMuY29udGV4dC5jaGVja2VkID8gJ09uJyA6IGZhbHNlO1xuICAgICAgICBvcHRpb25zLkFTID0gdGhpcy5jb250ZXh0LmNoZWNrZWQgPyAnL09uJyA6ICcvT2ZmJztcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgIG9wdGlvbnMuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNoZWNrQm94KTtcbiAgICAgICAgKDxTdXJ2ZXlQREY+dGhpcy5xdWVzdGlvbi5zdXJ2ZXkpPy5nZXRVcGRhdGVkQ2hlY2tJdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIGNoZWNrQm94Lm1heEZvbnRTaXplID0gb3B0aW9ucy5tYXhGb250U2l6ZTtcbiAgICAgICAgY2hlY2tCb3guY2FwdGlvbiA9IG9wdGlvbnMuY2FwdGlvbjtcbiAgICAgICAgY2hlY2tCb3gudGV4dEFsaWduID0gb3B0aW9ucy50ZXh0QWxpZ247XG4gICAgICAgIGNoZWNrQm94LmZpZWxkTmFtZSA9IG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICBjaGVja0JveC5yZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIGNoZWNrQm94LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICAgICAgY2hlY2tCb3gudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICBjaGVja0JveC5BUyA9IG9wdGlvbnMuQVM7XG4gICAgICAgIGNoZWNrQm94LlJlY3QgPSBvcHRpb25zLlJlY3Q7XG5cbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVDtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0wpO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIGNoZWNrbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICBjaGVja21hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gY2hlY2ttYXJrU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MLCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgKDxhbnk+Y2hlY2ttYXJrRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIGF3YWl0IGNoZWNrbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRW1wdHlCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbnVsbCxcbiAgICAgICAgaXNCb3JkZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobnVsbCwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMuaXNCb3JkZXJWaXNpYmxlID0gaXNCb3JkZXJWaXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplQm9yZGVyKGlzSW5jcmVhc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29lZjogbnVtYmVyID0gaXNJbmNyZWFzZSA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgYm9yZGVyUGFkZGluZzogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIHRoaXMueExlZnQgLT0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgIHRoaXMueFJpZ2h0ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnlCb3QgKz0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc0JvcmRlclZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplQm9yZGVyKHRydWUpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2VtcHR5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb2xkQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsImV4cG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5leHBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmV4cG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBJTWFyZ2luTFIsIElNYXJnaW4sIElEb2NPcHRpb25zLCBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuZXhwb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuZXhwb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5leHBvcnQgeyBGbGF0UXVlc3Rpb25EZWZhdWx0IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0JztcbmV4cG9ydCB7IEZsYXRCb29sZWFuQ2hlY2tib3ggYXMgRmxhdEJvb2xlYW4gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4nO1xuZXhwb3J0IHsgRmxhdENoZWNrYm94IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveCc7XG5leHBvcnQgeyBGbGF0Q3VzdG9tTW9kZWwgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbCc7XG5leHBvcnQgeyBGbGF0Q29tbWVudCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudCc7XG5leHBvcnQgeyBGbGF0RHJvcGRvd24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duJztcbmV4cG9ydCB7IEZsYXRFeHByZXNzaW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uJztcbmV4cG9ydCB7IEZsYXRGaWxlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9maWxlJztcbmV4cG9ydCB7IEZsYXRIVE1MIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmV4cG9ydCB7IEZsYXRJbWFnZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UnO1xuZXhwb3J0IHsgRmxhdEltYWdlUGlja2VyIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlcic7XG5leHBvcnQgeyBGbGF0UGFuZWxEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9wYW5lbGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhZGlvZ3JvdXAnO1xuZXhwb3J0IHsgRmxhdFJhbmtpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcnO1xuZXhwb3J0IHsgRmxhdFJhdGluZyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nJztcbmV4cG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlJztcbmV4cG9ydCB7IEZsYXRTaWduYXR1cmVQYWQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZCc7XG5leHBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveCc7XG5leHBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuZXhwb3J0IHsgRmxhdE1hdHJpeCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4JztcbmV4cG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuZXhwb3J0IHsgRmxhdE1hdHJpeER5bmFtaWMgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMnO1xuZXhwb3J0IHsgRmxhdE11bHRpcGxlVGV4dCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0JztcbmV4cG9ydCB7IFBhZ2VQYWNrZXIgfSBmcm9tICcuLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5leHBvcnQgeyBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXInO1xuZXhwb3J0IHsgSG9yaXpvbnRhbEFsaWduLCBWZXJ0aWNhbEFsaWduLCBJRHJhd1JlY3RPcHRpb25zLCBJRHJhd1RleHRPcHRpb25zLCBJRHJhd0ltYWdlT3B0aW9ucywgRHJhd0NhbnZhcyB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuZXhwb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmV4cG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5leHBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5leHBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5leHBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21tZW50JztcbmV4cG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmV4cG9ydCB7IEN1c3RvbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY3VzdG9tJztcbmV4cG9ydCB7IERyb3Bkb3duQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bic7XG5leHBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuZXhwb3J0IHsgSFRNTEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5leHBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfaW1hZ2UnO1xuZXhwb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfbGluayc7XG5leHBvcnQgeyBSYWRpb0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhZGlvaXRlbSc7XG5leHBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuZXhwb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5leHBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5leHBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuZXhwb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJveCc7XG5leHBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmV4cG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwnO1xuXG5pbXBvcnQgeyBjaGVja0xpYnJhcnlWZXJzaW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuY2hlY2tMaWJyYXJ5VmVyc2lvbihgJHtwcm9jZXNzLmVudi5WRVJTSU9OfWAsICdzdXJ2ZXktcGRmJyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvcGRmLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsYXRTZWxlY3RCYXNlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrO1xuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBpZiAoaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtICYmIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgaW5kZXgsIHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcztcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldENvbENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KCk7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICBsZXQgY3VycmVudENvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgaWYgKGNvbENvdW50ID09IDApIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IE1hdGguZmxvb3IoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgLyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSB8fCAxO1xuICAgICAgICAgICAgaWYgKHZpc2libGVDaG9pY2VzLmxlbmd0aCA8IGN1cnJlbnRDb2xDb3VudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IHZpc2libGVDaG9pY2VzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2xDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb2xDb3VudCA9IChTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCkgPFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGgpID8gMSA6IGNvbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY3VycmVudENvbENvdW50ID09IDEpID8gYXdhaXQgdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdmlzaWJsZUNob2ljZXMpIDpcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCwgY3VycmVudENvbENvdW50KTtcblxuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQ6IElQb2ludCwgaXRlbVZhbHVlczogSXRlbVZhbHVlW10pOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBpdGVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBpdGVtVmFsdWVzW2ldLCBpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdCArIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGl0ZW1GbGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGNvbENvdW50OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gdGhpcy5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBpICUgY29sQ291bnQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIHZpc2libGVDaG9pY2VzW2ldLCBpKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKGkgJSBjb2xDb3VudCA9PT0gY29sQ291bnQgLSAxIHx8IGkgPT09IHZpc2libGVDaG9pY2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocm93KSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2gocm93LCByb3dMaW5lRmxhdCk7XG4gICAgICAgICAgICAgICAgcm93ID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgUm93bGluZUJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlUb3A6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnhSaWdodCAtIHRoaXMueExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmxpbmUodGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLnhSaWdodCwgdGhpcy55VG9wKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuICAgIHRyYW5zbGF0ZVgoXzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZCB7fVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGZpZWxkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJveEJyaWNrIGV4dGVuZHMgVGV4dEZpZWxkQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4gPSBmYWxzZSwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pZCArIChpc1F1ZXN0aW9uID8gJycgOiAnX2NvbW1lbnQnICsgaW5kZXgpLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBpc1F1ZXN0aW9uKSxcbiAgICAgICAgICAgIGlzUXVlc3Rpb24gJiYgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikubG9jUGxhY2VIb2xkZXIgPyBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKCg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyKSA6ICcnLFxuICAgICAgICAgICAgcXVlc3Rpb24uaXNSZWFkT25seSwgaXNNdWx0aWxpbmUsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pbnB1dFR5cGUpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn1cbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJTWFyZ2luLCBJU2l6ZSwgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBIb3Jpem9udGFsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIEhvcml6b250YWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgTGVmdCA9ICdsZWZ0JyxcbiAgICBDZW50ZXIgPSAnY2VudGVyJyxcbiAgICBSaWdodCA9ICdyaWdodCdcbn1cbi8qKlxuICogVmVydGljYWwgYWxpZ25tZW50IHR5cGVzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGVudW0gVmVydGljYWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgVG9wID0gJ3RvcCcsXG4gICAgTWlkZGxlID0gJ21pZGRsZScsXG4gICAgQm90dG9tID0gJ2JvdHRvbSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3Jpem9udGFsIGFsaWdubWVudCB3aXRoaW4gdGhlIHJlY3RhbmdsZSB0aGF0IGxpbWl0cyB0aGUgZHJhd2luZyBhcmVhLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJjZW50ZXJcImAgKGRlZmF1bHQpXG4gICAgICogLSBgXCJsZWZ0XCJgXG4gICAgICogLSBgXCJyaWdodFwiYFxuICAgICAqL1xuICAgIGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBWZXJ0aWNhbCBhbGlnbm1lbnQgd2l0aGluIHRoZSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwibWlkZGxlXCJgIChkZWZhdWx0KVxuICAgICAqIC0gYFwidG9wXCJgXG4gICAgICogLSBgXCJib3R0b21cImBcbiAgICAgKi9cbiAgICB2ZXJ0aWNhbEFsaWduPzogVmVydGljYWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY29udGVudCBhbmQgdGhlIGJvcmRlcnMgb2YgdGhlIHJlY3RhbmdsZS4gVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIG9ubHkgaWYgdGhlIGNvbnRlbnQgaXMgYWxpZ25lZCB0byB0aGUgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tLlxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUuXG4gICAgICovXG4gICAgcmVjdD86IElSZWN0O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIHJlbmRlcmluZyBhIHBpZWNlIG9mIHRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdUZXh0T3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dCBzdHJpbmcgdG8gYmUgZHJhd24uXG4gICAgICovXG4gICAgdGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNFxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciB0aGUgdGV4dCBzdHJpbmcgYm9sZC5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc0JvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIHJlbmRlcmluZyBhbiBpbWFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd0ltYWdlT3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGltYWdlIHdpZHRoIGluIHBpeGVscy4gRGVmYXVsdHMgdG8gdGhlIFtyZWN0YW5nbGUgd2lkdGhdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRyYXdpbWFnZW9wdGlvbnMjcmVjdCkuXG4gICAgICovXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gaW1hZ2UgaGVpZ2h0IGluIHBpeGVscy4gRGVmYXVsdHMgdG8gdGhlIFtyZWN0YW5nbGUgaGVpZ2h0XShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zI3JlY3QpLlxuICAgICAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB2YWx1ZSB3aXRoIGEgYmFzZTY0LWVuY29kZWQgaW1hZ2UgdG8gYmUgZHJhd24uXG4gICAgICovXG4gICAgYmFzZTY0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZXNpemUgdGhlIGltYWdlIHRvIGZpdCBpdCBpbnRvIGl0cyBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgXCJjb250YWluXCJgIGlmIFtgYXBwbHlJbWFnZUZpdGBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRvY29wdGlvbnMjYXBwbHlJbWFnZUZpdCkgaXMgZW5hYmxlZCBvciBgdW5kZWZpbmVkYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBSZWZlciB0byB0aGUgW2BvYmplY3QtZml0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL29iamVjdC1maXQpIENTUyBwcm9wZXJ0eSBkZXNjcmlwdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gYWNjZXB0ZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGltYWdlRml0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRyYXdpbmcgYXJlYSBhbmQgZW5hYmxlcyB5b3UgdG8gZHJhdyBhbiBpbWFnZSBvciBhIHBpZWNlIG9mIHRleHQgd2l0aGluIHRoZSBhcmVhLiBZb3UgY2FuIGFjY2VzcyB0aGlzIG9iamVjdCB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGBTdXJ2ZXlQREZgJ3MgW2BvblJlbmRlckhlYWRlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVySGVhZGVyKSBhbmQgW2BvblJlbmRlckZvb3RlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyRm9vdGVyKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2N1c3RvbWl6ZS1oZWFkZXItYW5kLWZvb3Rlci1vZi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3Q2FudmFzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBfcmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBfY291bnRQYWdlczogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3BhZ2VOdW1iZXI6IG51bWJlcikgeyB9XG4gICAgLyoqXG4gICAgICogQSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvdW50UGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50UGFnZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGhlIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgZHJhd2luZyBhcmVhLiBFbnVtZXJhdGlvbiBzdGFydHMgd2l0aCAxLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZU51bWJlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgYSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS4gVGhpcyBvYmplY3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczogYHhMZWZ0YCwgYHhSaWdodGAsIGB5VG9wYCwgYHlCb3RgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVjdCgpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWN0O1xuICAgIH1cbiAgICBwcml2YXRlIGFsaWduUmVjdChyZWN0T3B0aW9uczogSURyYXdSZWN0T3B0aW9ucywgaXRlbVNpemU6IElTaXplKTogSVJlY3Qge1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zID0geyBsZWZ0OiAwLjAsIHJpZ2h0OiAwLjAsIHRvcDogMC4wLCBib3Q6IDAuMCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnJlY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09IEhvcml6b250YWxBbGlnbi5Ob3RTZXQpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPT09IFZlcnRpY2FsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9IFZlcnRpY2FsQWxpZ24uTWlkZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNsb25lKHRoaXMucmVjdCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3dpdGNoIChyZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5MZWZ0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ICsgaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5DZW50ZXI6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSBNYXRoLm1heCh0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCAtIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gTWF0aC5taW4odGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCArIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgLSBpdGVtU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC54TGVmdCA9IHJlY3RPcHRpb25zLnJlY3QueExlZnQgfHwgdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICAgICAgcmVjdC54UmlnaHQgPSByZWN0T3B0aW9ucy5yZWN0LnhSaWdodCB8fCB0aGlzLnJlY3QueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMudmVydGljYWxBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5Ub3A6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wICsgaXRlbVNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLk1pZGRsZTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueVRvcCArIHRoaXMucmVjdC55Qm90IC0gaXRlbVNpemUuaGVpZ2h0KSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCArIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uQm90dG9tOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSBNYXRoLm1heCh0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCAtIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3Q7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC55VG9wID0gcmVjdE9wdGlvbnMucmVjdC55VG9wIHx8IHRoaXMucmVjdC55VG9wO1xuICAgICAgICAgICAgcmVjdC55Qm90ID0gcmVjdE9wdGlvbnMucmVjdC55Qm90IHx8IHRoaXMucmVjdC55Qm90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcmF3cyBhIHBpZWNlIG9mIHRleHQgd2l0aGluIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICogQHBhcmFtIHRleHRPcHRpb25zIEFuIFtgSURyYXdUZXh0T3B0aW9uc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvaWRyYXd0ZXh0b3B0aW9ucykgb2JqZWN0IHRoYXQgY29uZmlndXJlcyB0aGUgZHJhd2luZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhd1RleHQodGV4dE9wdGlvbnM6IElEcmF3VGV4dE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGV4dE9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUodGV4dE9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmZvbnRTaXplID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGV4dE9wdGlvbnMuZm9udFNpemUgPSBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRleHRPcHRpb25zLmlzQm9sZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHRTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0ZXh0T3B0aW9ucy50ZXh0LFxuICAgICAgICAgICAgdGV4dE9wdGlvbnMuaXNCb2xkID8gJ2JvbGQnIDogJ25vcm1hbCcsIHRleHRPcHRpb25zLmZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgdGV4dFJlY3Q6IElSZWN0ID0gdGhpcy5hbGlnblJlY3QodGV4dE9wdGlvbnMsIHRleHRTaXplKTtcbiAgICAgICAgaWYgKCF0ZXh0T3B0aW9ucy5pc0JvbGQpIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWNrcy5wdXNoKG5ldyBUZXh0Qm9sZEJyaWNrKG51bGwsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0ZXh0UmVjdCwgdGV4dE9wdGlvbnMudGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgICg8UGRmQnJpY2s+dGhpcy5wYWNrc1t0aGlzLnBhY2tzLmxlbmd0aCAtIDFdKS5mb250U2l6ZSA9IHRleHRPcHRpb25zLmZvbnRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcmF3cyBhbiBpbWFnZSB3aXRoaW4gdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKiBAcGFyYW0gaW1hZ2VPcHRpb25zIEFuIFtgSURyYXdJbWFnZU9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zKSBvYmplY3QgdGhhdCBjb25maWd1cmVzIGRyYXdpbmcuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRyYXdJbWFnZShpbWFnZU9wdGlvbnM6IElEcmF3SW1hZ2VPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGltYWdlT3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShpbWFnZU9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIGltYWdlT3B0aW9ucy53aWR0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy53aWR0aCA9IHRoaXMucmVjdC54UmlnaHQgLSB0aGlzLnJlY3QueExlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMuaGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCA9IHRoaXMucmVjdC55Qm90IC0gdGhpcy5yZWN0LnlUb3A7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW1hZ2VTaXplOiBJU2l6ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZU9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlT3B0aW9ucy5oZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaW1hZ2VSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KGltYWdlT3B0aW9ucywgaW1hZ2VTaXplKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKDAsIDApO1xuICAgICAgICB0aGlzLnBhY2tzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChpbWFnZVJlY3QsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgbnVsbCwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IGltYWdlT3B0aW9ucy5iYXNlNjQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGltYWdlUmVjdC54UmlnaHQgLSBpbWFnZVJlY3QueExlZnQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZVJlY3QueUJvdCAtIGltYWdlUmVjdC55VG9wLCBvYmplY3RGaXQ6IGltYWdlT3B0aW9ucy5pbWFnZUZpdCB9LCAhIWltYWdlT3B0aW9ucy5pbWFnZUZpdCB8fCB0aGlzLmNvbnRyb2xsZXIuYXBwbHlJbWFnZUZpdCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcy50cyIsImltcG9ydCB7IEV2ZW50LCBFdmVudEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRBc3luYzxTZW5kZXIsIE9wdGlvbnM+IGV4dGVuZHMgRXZlbnRCYXNlPFNlbmRlciwgT3B0aW9ucz4ge1xuICAgIHB1YmxpYyB1bnNoaWZ0KGZ1bmM6IChzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykgPT4gYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PChzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykgPT4gYW55PigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnVuc2hpZnQoZnVuYyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaXJlKHNlbmRlcjogU2VuZGVyLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHByb2Nlc3NfaGVhZGVyX2V2ZW50cyhzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcGFja3M6IElQZGZCcmlja1tdW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuYWRkKChfLCBjYW52YXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU3VydmV5SlMgUERGIHwgUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgUERGIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcCB8IGh0dHBzOi8vc3VydmV5anMuaW8vQnV5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlckhlYWRlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlckZvb3Rlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUZvb3RlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyLnRzIiwiaW1wb3J0IHsgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb25EZWZhdWx0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgdmFsdWVCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBgJHt0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZX1gLCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gW3ZhbHVlQnJpY2tdO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwiaW1wb3J0IHtcbiAgICBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxuICAgIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgU2VyaWFsaXplciwgUGFuZWxNb2RlbCwgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwsXG4gICAgTG9jYWxpemFibGVTdHJpbmdcbn0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4TXVsdGlwbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aXBsZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSB2aXNpYmxlUm93c1ZhbHVlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXTtcbiAgICBwcml2YXRlIGdldCB2aXNpYmxlUm93cygpIHtcbiAgICAgICAgaWYoIXRoaXMudmlzaWJsZVJvd3NWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlUm93c1ZhbHVlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnJvd3MuZmlsdGVyKHJvdyA9PiByb3cudmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3NWYWx1ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ2VsbFRpdGxlKHBvaW50OiBJUG9pbnQsIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBsb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGwocG9pbnQ6IElQb2ludCwgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCxcbiAgICAgICAgbG9jYXRpb24/OiAnaGVhZGVyJyB8ICdmb290ZXInLCBpc1dpZGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChjZWxsLmhhc1F1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZihsb2NhdGlvbiA9PSAnZm9vdGVyJyAmJiAhY2VsbC5xdWVzdGlvbi5pc0Fuc3dlcmVkKSB7fVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNXaWRlICYmIGNlbGwuaXNDaG9pY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0TXVsdGlwbGVDb2x1bW5zUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGNlbGwucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKCg8RmxhdFNlbGVjdEJhc2U+ZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY2VsbC5pdGVtLCBjZWxsLmNob2ljZUluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayguLi5hd2FpdCBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjZWxsLnF1ZXN0aW9uLCBwb2ludCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNlbGwuaGFzVGl0bGUpIHtcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5sb2NUaXRsZSwgVGV4dEJyaWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXQgaGFzRGV0YWlsUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLnNvbWUoKHJlbmRlcmVkUm93KSA9PiByZW5kZXJlZFJvdy5yb3cgJiYgdGhpcy5xdWVzdGlvbi5oYXNEZXRhaWxQYW5lbChyZW5kZXJlZFJvdy5yb3cpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpZ25vcmVDZWxsKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGluZGV4OiBudW1iZXIsIGxvY2F0aW9uPzogJ2hlYWRlcicgfCAnZm9vdGVyJywgaXNXaWRlOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZighaXNXaWRlICYmIGxvY2F0aW9uID09ICdmb290ZXInICYmIGNlbGwuaGFzUXVlc3Rpb24gJiYgIWNlbGwucXVlc3Rpb24uaXNBbnN3ZXJlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhKGNlbGwuaGFzUXVlc3Rpb24gfHwgY2VsbC5oYXNUaXRsZSB8fCAodGhpcy5pc011bHRpcGxlICYmICh0aGlzLmhhc0RldGFpbFBhbmVsID8gaW5kZXggPT0gMSA6IGluZGV4ID09IDApKSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Um93TG9jYXRpb24ocm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cpIHtcbiAgICAgICAgcmV0dXJuIHJvdyA9PT0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLmhlYWRlclJvdyA/ICdoZWFkZXInIDogKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5mb290ZXJSb3cgPT09IHJvdyA/ICdmb290ZXInIDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IGxhc3RSaWdodE1hcmdpbjogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgICBjb25zdCByb3dMb2NhdGlvbiA9IHRoaXMuZ2V0Um93TG9jYXRpb24ocm93KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNlbGwocm93LmNlbGxzW2ldLCBpLCByb3dMb2NhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gbGFzdFJpZ2h0TWFyZ2luICtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29sdW1uV2lkdGhbY250XTtcbiAgICAgICAgICAgIGxhc3RSaWdodE1hcmdpbiA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxDb250ZW50OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvd0xvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmICghY2VsbENvbnRlbnQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhjZWxsQ29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dWZXJ0aWNhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd0xvY2F0aW9uID0gdGhpcy5nZXRSb3dMb2NhdGlvbihyb3cpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDZWxsKHJvdy5jZWxsc1tpXSwgaSwgcm93TG9jYXRpb24sIGZhbHNlKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgKCF0aGlzLmlzTXVsdGlwbGUgfHwgaSA+IDApICYmIHJvdy5jZWxsc1tpXS5jZWxsPy5jb2x1bW4/LmxvY1RpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGxUaXRsZShjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXS5jZWxsLmNvbHVtbi5sb2NUaXRsZSkpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NlbGwoY3VyclBvaW50LCByb3cuY2VsbHNbaV0sIHJvd0xvY2F0aW9uLCBmYWxzZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC1cbiAgICAgICAgKGNvbENvdW50IC0gMSkgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sIGNvbENvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmdldEF2YWxhYmxlV2lkdGgoY29sQ291bnQpO1xuICAgICAgICBsZXQgcmVtYWluV2lkdGg6IG51bWJlciA9IGF2YWlsYWJsZVdpZHRoO1xuICAgICAgICBsZXQgcmVtYWluQ29sQ291bnQ6IG51bWJlciA9IGNvbENvdW50O1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3QgdW5zZXRDZWxsczogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbFtdID0gW107XG4gICAgICAgIGxldCBjZWxscyA9IHJvd3NbMF0uY2VsbHMuZmlsdGVyKChjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBpbmRleDogbnVtYmVyKSA9PiAhdGhpcy5pZ25vcmVDZWxsKGNlbGwsIGluZGV4KSk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbHNbaV0ud2lkdGgsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICByZW1haW5XaWR0aCAtPSB3aWR0aDtcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gMC4wKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5zZXRDZWxscy5wdXNoKGNlbGxzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoLnB1c2god2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1haW5Db2xDb3VudCA9PT0gMCkgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZXVyaXN0aWNXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aDtcbiAgICAgICAgdW5zZXRDZWxscy5zb3J0KChjZWxsMTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgY2VsbDI6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpID0+IHtcbiAgICAgICAgICAgIGxldCBtaW5XaWR0aDEgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChjZWxsMS5taW5XaWR0aCwgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICBsZXQgbWluV2lkdGgyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbDIubWluV2lkdGgsIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmV0dXJuIG1pbldpZHRoMiA+IG1pbldpZHRoMSA/IDEgOiAtMTtcbiAgICAgICAgfSkuZm9yRWFjaCgoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXF1YWxXaWR0aDogbnVtYmVyID0gcmVtYWluV2lkdGggLyByZW1haW5Db2xDb3VudDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbk1pbldpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChjZWxsLm1pbldpZHRoLCBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIGlmKGNvbHVtbk1pbldpZHRoID4gZXF1YWxXaWR0aCAmJiBjb2x1bW5NaW5XaWR0aCA+IGhldXJpc3RpY1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gY29sdW1uTWluV2lkdGg7XG4gICAgICAgICAgICAgICAgcmVtYWluQ29sQ291bnQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoW2NlbGxzLmluZGV4T2YoY2VsbCldID0gTWF0aC5tYXgoaGV1cmlzdGljV2lkdGgsIGNvbHVtbk1pbldpZHRoLCBlcXVhbFdpZHRoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU9uZVJvdyhwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgaXNXaWRlOiBib29sZWFuLCBjb2x1bW5XaWR0aDogbnVtYmVyW10pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGlmIChpc1dpZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dIb3Jpc29udGFsKHBvaW50LCByb3csIGNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQsIHJvdyk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgcm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIsIGlzV2lkZTogYm9vbGVhbik6IFByb21pc2U8Q29tcG9zaXRlQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJvd0ZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU9uZVJvdyhjdXJyUG9pbnQsIHJvd3NbaV0sXG4gICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICBpZiAocm93RmxhdC5pc0VtcHR5ICYmICEocm93c1tpXS5yb3cgJiYgcm93c1tpXS5yb3cuaGFzUGFuZWwpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKCFyb3dGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90O1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0LmFkZEJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChyb3dGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghIXJvd3NbaV0ucm93ICYmIHJvd3NbaV0ucm93Lmhhc1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgcm93c1tpXS5yb3cuc2hvd0RldGFpbFBhbmVsKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudERldGFpbFBhbmVsOiBQYW5lbE1vZGVsID0gcm93c1tpXS5yb3cuZGV0YWlsUGFuZWw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXRhaWxQYW5lbC5xdWVzdGlvbnNbal0uaWQgKz0gJ18nICsgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxCcmlja3M6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGN1cnJlbnREZXRhaWxQYW5lbCwgY3VyclBvaW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJDb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgY3VyckNvbXBvc2l0ZS5hZGRCcmljayguLi5wYW5lbEJyaWNrcyk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goY3VyckNvbXBvc2l0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSAmJiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyOiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyWVRvcCA9IGN1cnJDb21wb3NpdGUueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWhlYWRlci5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyWVRvcCA9IGhlYWRlci55Qm90O1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGN1cnJZVG9wICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJc1dpZGUodGFibGU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLCBjb2xDb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGlmKHRhYmxlLnNob3dIZWFkZXIpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJvd3MucHVzaCguLi50aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgaWYocm93cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aFN1bSA9IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93cywgY29sQ291bnQpLnJlZHVjZSgod2lkdGhTdW06IG51bWJlciwgd2lkdGg6IG51bWJlcikgPT4gd2lkdGhTdW0gKz0gd2lkdGgsIDApO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5yZW5kZXJBcyAhPT0gJ2xpc3QnICYmIHRoaXMuY29udHJvbGxlci5tYXRyaXhSZW5kZXJBcyAhPT0gJ2xpc3QnICYmIE1hdGguZmxvb3IoY29sdW1uV2lkdGhTdW0pIDw9IE1hdGguZmxvb3IodGhpcy5nZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50KSk7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0Um93c1RvUmVuZGVyKHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgaXNWZXJ0aWNhbDogYm9vbGVhbiwgaXNXaWRlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdID0gW107XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICAgIGlmICh0YWJsZS5zaG93SGVhZGVyICYmIGlzV2lkZSkgcm93cy5wdXNoKHRhYmxlLmhlYWRlclJvdyk7XG4gICAgICAgIHJvd3MucHVzaCguLi5yZW5kZXJlZFJvd3MpO1xuICAgICAgICBpZiAodGFibGUuaGFzUmVtb3ZlUm93cyAmJiBpc1ZlcnRpY2FsKSByb3dzLnBvcCgpO1xuICAgICAgICBpZiAodGFibGUuc2hvd0Zvb3Rlcikgcm93cy5wdXNoKHRhYmxlLmZvb3RlclJvdyk7XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgICBwcml2YXRlIGdldENvbENvdW50KHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCEhcmVuZGVyZWRSb3dzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZWRSb3dzWzBdLmNlbGxzLmZpbHRlcigoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgaW5kZXg6IG51bWJlcikgPT4gIXRoaXMuaWdub3JlQ2VsbChjZWxsLCBpbmRleCkpLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZS5zaG93SGVhZGVyICYmIHRhYmxlLmhlYWRlclJvdyA/IHRhYmxlLmhlYWRlclJvdy5jZWxscy5sZW5ndGggOlxuICAgICAgICAgICAgICAgIHRhYmxlLnNob3dGb290ZXIgJiYgdGFibGUuZm9vdGVyUm93ID8gdGFibGUuZm9vdGVyUm93LmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbkxheW91dCA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgICAgbGV0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLmdldENvbENvdW50KHRhYmxlLCB0aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgaWYgKGNvbENvdW50ID09PSAwICYmICF0aGlzLmhhc0RldGFpbFBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBDb21wb3NpdGVCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIHRoaXMuY29udHJvbGxlcikpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1dpZGUgPSB0aGlzLmNhbGN1bGF0ZUlzV2lkZSh0YWJsZSwgY29sQ291bnQpO1xuICAgICAgICBpZighaXNXaWRlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlzTW9iaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRhYmxlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlUm93c1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29sQ291bnQgPSB0aGlzLmdldENvbENvdW50KHRhYmxlLCB0aGlzLnZpc2libGVSb3dzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzVG9SZW5kZXIodGFibGUsIGlzVmVydGljYWwsIGlzV2lkZSk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKHBvaW50LCByb3dzLCBjb2xDb3VudCwgaXNXaWRlKTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeGRyb3Bkb3duJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGRyb3Bkb3duJywgRmxhdE1hdHJpeE11bHRpcGxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZS50cyIsImltcG9ydCBJbnRlcnZhbFRyZWUgZnJvbSAnbm9kZS1pbnRlcnZhbC10cmVlJztcbmltcG9ydCB7IERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuaW50ZXJmYWNlIFBhY2tJbnRlcnZhbCB7XG4gICAgcGFnZUluZGV4OiBudW1iZXI7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgYWJzQm90OiBudW1iZXI7XG59XG5leHBvcnQgY2xhc3MgUGFnZVBhY2tlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEJvdEludGVydmFsKHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+LFxuICAgICAgICB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlciwgb3B0aW9uczogRG9jT3B0aW9ucyk6IFBhY2tJbnRlcnZhbCB7XG4gICAgICAgIGNvbnN0IGludGVydmFsczogUGFja0ludGVydmFsW10gPSB0cmVlLnNlYXJjaCh4TGVmdCwgeFJpZ2h0KTtcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgcGFnZUluZGV4OiAwLCB4TGVmdDpcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmdpbnMubGVmdCwgeFJpZ2h0OiBvcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3AsIGFic0JvdDogb3B0aW9ucy5tYXJnaW5zLnRvcFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVydmFscy5yZWR1Y2UoKG14LCBjcikgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNyLnhSaWdodCAtIHhMZWZ0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoY3IueExlZnQgLSB4UmlnaHQpIDwgU3VydmV5SGVscGVyLkVQU0lMT04pIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPCBteC5wYWdlSW5kZXgpIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPiBteC5wYWdlSW5kZXgpIHJldHVybiBjcjtcbiAgICAgICAgICAgIHJldHVybiBjci55Qm90ID4gbXgueUJvdCA/IGNyIDogbXg7XG4gICAgICAgIH0sIGludGVydmFsc1tpbnRlcnZhbHMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhZGRQYWNrKHBhY2tzOiBJUGRmQnJpY2tbXVtdLCBpbmRleDogbnVtYmVyLCBicmljazogSVBkZkJyaWNrKSB7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHBhY2tzLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBwYWNrcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBwYWNrc1tpbmRleF0ucHVzaChicmljayk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcGFjayhmbGF0czogSVBkZkJyaWNrW11bXSwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElQZGZCcmlja1tdW10ge1xuICAgICAgICBjb25zdCBwYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy50b3AgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90O1xuICAgICAgICBjb25zdCB1bmZvbGRGbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBmbGF0cy5mb3JFYWNoKChmbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0cy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGZsYXRzUGFnZS5mb3JFYWNoKChmbGF0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdC5oZWlnaHQgPiBwYWdlSGVpZ2h0ICsgU3VydmV5SGVscGVyLkVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaCguLi5mbGF0LnVuZm9sZCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB1bmZvbGRGbGF0c1t1bmZvbGRGbGF0cy5sZW5ndGggLSAxXS5wdXNoKGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB1bmZvbGRGbGF0cy5mb3JFYWNoKCh1bmZvbGRGbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2Uuc29ydCgoYTogSVBkZkJyaWNrLCBiOiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS55VG9wIDwgYi55VG9wKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA+IGIueVRvcCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPiBiLnhMZWZ0KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBpZiAoYS54TGVmdCA8IGIueExlZnQpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHBhZ2VJbmRleE1vZGVsOiBudW1iZXIgPSAwO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBjb25zdCBwYWdlQm90OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJlZTogSW50ZXJ2YWxUcmVlPFBhY2tJbnRlcnZhbD4gPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG4gICAgICAgICAgICBsZXQgcGFnZUluZGV4U2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcGFnZUluZGV4LCB5Qm90LCBhYnNCb3QgfSA9IFBhZ2VQYWNrZXIuZmluZEJvdEludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICB0cmVlLCBmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBmbGF0LmhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSB5Qm90ICsgZmxhdC55VG9wIC0gYWJzQm90O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhmbGF0LnlUb3AgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wKSA+IFN1cnZleUhlbHBlci5FUFNJTE9OICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCArIGhlaWdodCA+IHBhZ2VCb3QgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fCBmbGF0LmlzUGFnZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCA9IGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXhTaGlmdCA9IE1hdGgubWF4KHBhZ2VJbmRleFNoaWZ0LCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmluc2VydChmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgeExlZnQ6IGZsYXQueExlZnQsIHhSaWdodDogZmxhdC54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGZsYXQueVRvcCArIGhlaWdodCwgYWJzQm90OiBmbGF0LnlCb3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmbGF0LnlCb3QgPSBmbGF0LnlUb3AgKyBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgUGFnZVBhY2tlci5hZGRQYWNrKHBhY2tzLCBwYWdlSW5kZXhNb2RlbCArIHBhZ2VJbmRleCwgZmxhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhZ2VJbmRleE1vZGVsICs9IHBhZ2VJbmRleFNoaWZ0ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIoY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmlkLFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJlYWRPbmx5OiBxdWVzdGlvbi5pc1JlYWRPbmx5LCBjaGVja2VkOiAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5jaGVja2VkVmFsdWUgfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DaGVja2JveE1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIENoZWNrYm94SXRlbUJyaWNrIGV4dGVuZHMgQ2hlY2tJdGVtQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaWQgKyAnaW5kZXgnICsgaW5kZXgsXG4gICAgICAgICAgICB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgcmVhZE9ubHk6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLCBpdGVtOiBpdGVtLCBjaGVja2VkOiAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaXNJdGVtU2VsZWN0ZWQoaXRlbSksIGluZGV4OiBpbmRleCB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgc2V0dGluZ3MgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4vcGRmX3RleHRib3gnO1xuXG5leHBvcnQgY2xhc3MgQ29tbWVudEJyaWNrIGV4dGVuZHMgVGV4dEJveEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgaXNRdWVzdGlvbiwgdHJ1ZSwgaW5kZXgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKHRoaXMuaXNRdWVzdGlvbiAmJiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSAhPT0gJ2NvbW1lbnQnKSByZXR1cm4gc3VwZXIuc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJlYWRPbmx5Q29tbWVudFJlbmRlck1vZGUgPT09ICd0ZXh0YXJlYSc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIEl0ZW1WYWx1ZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWw7XG4gICAgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb21ib0JveCA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ29tYm9Cb3gpKCk7XG4gICAgICAgIGNvbWJvQm94LmZpZWxkTmFtZSA9IHRoaXMucXVlc3Rpb24uaWQ7XG4gICAgICAgIGNvbWJvQm94LlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKSkpO1xuICAgICAgICBjb21ib0JveC5lZGl0ID0gZmFsc2U7XG4gICAgICAgIGNvbWJvQm94LmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHRoaXMuZ2V0Q29ycmVjdGVkVGV4dCh0aGlzLnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5mb3JFYWNoKChpdGVtOiBJdGVtVmFsdWUpID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLmdldENvcnJlY3RlZFRleHQoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhpdGVtLmxvY1RleHQpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb21ib0JveC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb21ib0JveC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgY29tYm9Cb3guZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBjb21ib0JveC5yZWFkT25seSA9IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICAgICAgY29tYm9Cb3guaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29tYm9Cb3guZm9udE5hbWUpO1xuICAgICAgICBjb21ib0JveC5WID0gdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbikpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNvbWJvQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBtYXJnaW5zOiB7IHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciB9O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGh0bWw6IHN0cmluZywgaXNJbWFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgaWYgKGlzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAuMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAuMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFyZ2lucyA9IHtcbiAgICAgICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBjb250cm9sbGVyLm1hcmdpbnMuYm90XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmZyb21IVE1MKHRoaXMuaHRtbCwgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsIHBhZ2VzcGxpdDogdHJ1ZSxcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zanMtcGRmLWhpZGRlbi1odG1sLWRpdicpKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZWw6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5tYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEltYWdlQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByb3RlY3RlZCBpbWFnZTogc3RyaW5nLFxuICAgICAgICBwb2ludDogSVBvaW50LCBwcm90ZWN0ZWQgb3JpZ2luYWxXaWR0aDogbnVtYmVyLCBwcm90ZWN0ZWQgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIChvcmlnaW5hbFdpZHRoIHx8IDApLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyAob3JpZ2luYWxIZWlnaHQgfHwgMClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNQYWdlQnJlYWsgPSB0aGlzLm9yaWdpbmFsSGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRJbWFnZSh0aGlzLmltYWdlLCAnUE5HJywgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLm9yaWdpbmFsV2lkdGgsIHRoaXMub3JpZ2luYWxIZWlnaHQpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaW1hZ2UudHMiLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDQUxFX0ZBQ1RPUl9NQUdJQzogbnVtYmVyID0gMC45NTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT0xPUjogc3RyaW5nID0gJyMwMDAwRUUnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXh0RmxhdDogVGV4dEJyaWNrLCBwcm90ZWN0ZWQgbGluazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCg8TGlua0JyaWNrPnRleHRGbGF0KS5xdWVzdGlvbixcbiAgICAgICAgICAgICg8TGlua0JyaWNrPnRleHRGbGF0KS5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGV4dEZsYXQsICg8TGlua0JyaWNrPnRleHRGbGF0KS50ZXh0KTtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSBMaW5rQnJpY2suQ09MT1I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IoU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBsZXQgZGVzY2VudDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgKHRoaXMuY29udHJvbGxlci5kb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpIC1cbiAgICAgICAgICAgICAgICBMaW5rQnJpY2suU0NBTEVfRkFDVE9SX01BR0lDKTtcbiAgICAgICAgbGV0IHlUb3BMaW5rOiBudW1iZXIgPSB0aGlzLnlUb3AgK1xuICAgICAgICAgICAgKHRoaXMueUJvdCAtIHRoaXMueVRvcCkgLSBkZXNjZW50O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHRXaXRoTGluayh0aGlzLnRleHQsIHRoaXMueExlZnQsXG4gICAgICAgICAgICB5VG9wTGluaywgeyB1cmw6IHRoaXMubGluayB9KTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpICE9PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2xpbmsudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmFkaW9ncm91cFdyYXBDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xufVxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBXcmFwIHtcbiAgICBwcml2YXRlIF9yYWRpb0dyb3VwOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJpdmF0ZSBjb250ZXh0OiBJUmFkaW9ncm91cFdyYXBDb250ZXh0KSB7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRUb1BkZihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAgPSBuZXcgdGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVJhZGlvQnV0dG9uKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBvcHRpb25zLmZpZWxkTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgb3B0aW9ucy5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgICAgIG9wdGlvbnMuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAoPFN1cnZleVBERj50aGlzLmNvbnRleHQucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZFJhZGlvR3JvdXBXcmFwT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5maWVsZE5hbWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5yZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuY29sb3IgPSBvcHRpb25zLmNvbG9yO1xuXG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAudmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZCh0aGlzLl9yYWRpb0dyb3VwKTtcbiAgICB9XG4gICAgZ2V0IHJhZGlvR3JvdXAoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhZGlvR3JvdXA7XG4gICAgfVxuICAgIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5yZWFkT25seTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhZGlvR3JvdXBJdGVtQnJpY2tDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBpdGVtOiBJdGVtVmFsdWU7XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICdsJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UOiBzdHJpbmcgPSAnemFwZmRpbmdiYXRzJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gKCgyLjAgKyBNYXRoLkUpIC8gMTAuMCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcml2YXRlIGNvbnRleHQ6IElSYWRpb0dyb3VwSXRlbUJyaWNrQ29udGV4dCxcbiAgICAgICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXApIHtcbiAgICAgICAgc3VwZXIoY29udGV4dC5xdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFkaW9Hcm91cFdyYXAucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICA8UXVlc3Rpb24+dGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJyB8fCB0aGlzLmNvbnRyb2xsZXIuY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbmRleCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLmFkZFRvUGRmKHRoaXMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWVsZE5hbWUgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLm5hbWUgKyAnaW5kZXgnICsgdGhpcy5jb250ZXh0LmluZGV4O1xuICAgICAgICBsZXQgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIG9wdGlvbnMuUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIG9wdGlvbnMuYXBwZWFyYW5jZSA9IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm0uQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIG9wdGlvbnMucmFkaW9Hcm91cCA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cDtcbiAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgICg8U3VydmV5UERGPnRoaXMuY29udGV4dC5xdWVzdGlvbi5zdXJ2ZXkpPy5nZXRVcGRhdGVkUmFkaW9JdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBsZXQgcmFkaW9CdXR0b246IGFueSA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5jcmVhdGVPcHRpb24ob3B0aW9ucy5maWVsZE5hbWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMuQVMpIHtcbiAgICAgICAgICAgICAgICByYWRpb0J1dHRvbi5BUyA9ICcvJyArIG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIXRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSA9IG9wdGlvbnMuZmllbGROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMuQVMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLkFTID0gJy9PZmYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJhZGlvQnV0dG9uLlJlY3QgPSBvcHRpb25zLlJlY3Q7XG4gICAgICAgIHJhZGlvQnV0dG9uLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcblxuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5yYWRpb0dyb3VwLnNldEFwcGVhcmFuY2UoXG4gICAgICAgICAgICBvcHRpb25zLmFwcGVhcmFuY2VcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jaGVja2VkKSB7XG4gICAgICAgICAgICBjb25zdCByYWRpb21hcmtlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udE5hbWU6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PnJhZGlvbWFya2VyRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICBhd2FpdCByYWRpb21hcmtlckZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250TmFtZSA9IG9sZEZvbnROYW1lO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyLCBJUG9pbnQgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFJhbmtpbmdJdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBtYXJrOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBtYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMubWFyayk7XG4gICAgICAgIG1hcmtQb2ludC54TGVmdCArPSB0aGlzLndpZHRoIC8gMi4wIC0gbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgIG1hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICBjb25zdCBtYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMubWFyaywgVGV4dEJyaWNrKTtcbiAgICAgICAgKDxhbnk+bWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgYXdhaXQgbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrLCBUcmFuc2xhdGVYRnVuY3Rpb24gfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi9wZGZfY29tcG9zaXRlJztcblxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaXNRdWVzdGlvbjogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHB1YmxpYyBpc1JlYWRPbmx5OiBib29sZWFuLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4sIHByb3RlY3RlZCBpbnB1dFR5cGU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgcmVuZGVyQ29sb3JRdWVzdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbGV0IG9sZEZpbGxDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGaWxsQ29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3IodGhpcy5xdWVzdGlvbi52YWx1ZSB8fCAnYmxhY2snKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5yZWN0KHRoaXMueExlZnQsIHRoaXMueVRvcCxcbiAgICAgICAgICAgIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xvclF1ZXN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRGaWVsZDogYW55ID0gdGhpcy5pbnB1dFR5cGUgPT09ICdwYXNzd29yZCcgP1xuICAgICAgICAgICAgbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1QYXNzd29yZEZpZWxkKSgpIDpcbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtVGV4dEZpZWxkKSgpO1xuICAgICAgICBpbnB1dEZpZWxkLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnROYW1lID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICBpbnB1dEZpZWxkLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgaW5wdXRGaWVsZC5pc1VuaWNvZGUgPSBTdXJ2ZXlIZWxwZXIuaXNDdXN0b21Gb250KFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBpbnB1dEZpZWxkLmZvbnROYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLlYgPSAnICcgKyB0aGlzLmdldENvcnJlY3RlZFRleHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLkRWID0gJyAnICsgdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KHRoaXMucGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaW5wdXRGaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICBpbnB1dEZpZWxkLm11bHRpbGluZSA9IHRoaXMuaXNNdWx0aWxpbmU7XG4gICAgICAgIGlucHV0RmllbGQucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgICAgIGlucHV0RmllbGQuY29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpbnB1dEZpZWxkLm1heEZvbnRTaXplID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplICogZm9ybVNjYWxlO1xuICAgICAgICBpbnB1dEZpZWxkLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChpbnB1dEZpZWxkKTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzaG91bGRSZW5kZXJGbGF0Qm9yZGVycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnJlYWRPbmx5VGV4dFJlbmRlck1vZGUgPT09ICdpbnB1dCc7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRTaG91bGRSZW5kZXJSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMuaXNSZWFkT25seSk7XG4gICAgfVxuICAgIHByaXZhdGUgX3RleHRCcmljazogSVBkZkJyaWNrO1xuICAgIHB1YmxpYyBnZXQgdGV4dEJyaWNrKCk6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0QnJpY2s7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdGV4dEJyaWNrKHZhbDogSVBkZkJyaWNrKSB7XG4gICAgICAgIHRoaXMuX3RleHRCcmljayA9IHZhbDtcbiAgICAgICAgY29uc3QgdW5Gb2xkZWRCcmlja3MgPSB2YWwudW5mb2xkKCk7XG4gICAgICAgIGNvbnN0IGJyaWNrc0NvdW50ID0gdW5Gb2xkZWRCcmlja3MubGVuZ3RoO1xuICAgICAgICBsZXQgcmVuZGVyZWRCcmlja3NDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IGJyaWNrc0J5UGFnZTogeyBbaW5kZXg6IG51bWJlcl06IEFycmF5PFBkZkJyaWNrPiB9ID0ge307XG4gICAgICAgIGNvbnN0IGFmdGVyUmVuZGVyVGV4dEJyaWNrQ2FsbGJhY2sgPSAoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLnNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCkpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZEJyaWNrc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0Q3VycmVudFBhZ2VJbmRleCgpO1xuICAgICAgICAgICAgICAgIGlmKCFicmlja3NCeVBhZ2VbY3VycmVudFBhZ2VOdW1iZXJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyaWNrc0J5UGFnZVtjdXJyZW50UGFnZU51bWJlcl0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJpY2tzQnlQYWdlW2N1cnJlbnRQYWdlTnVtYmVyXS5wdXNoKGJyaWNrKTtcbiAgICAgICAgICAgICAgICBpZihyZW5kZXJlZEJyaWNrc0NvdW50ID49IGJyaWNrc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhicmlja3NCeVBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZE9uT25lUGFnZSA9IGtleXMubGVuZ3RoID09IDE7XG4gICAgICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmlja3NCeVBhZ2Vba2V5IGFzIGFueV0uZm9yRWFjaCgoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlQnJpY2suYWRkQnJpY2soYnJpY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeExlZnQ6IHRoaXMueExlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFJpZ2h0OiB0aGlzLnhSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5VG9wOiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMueVRvcCA6IGNvbXBvc2l0ZUJyaWNrLnlUb3AgLSBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlCb3Q6IHJlbmRlcmVkT25PbmVQYWdlID8gdGhpcy55Qm90IDogY29tcG9zaXRlQnJpY2sueUJvdCArIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMuaGVpZ2h0IDogY29tcG9zaXRlQnJpY2suaGVpZ2h0ICsgMiAqIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUJvcmRlckNvbG9yOiB0aGlzLmZvcm1Cb3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UGFnZShOdW1iZXIoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCBib3JkZXJSZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB1bkZvbGRlZEJyaWNrcy5mb3JFYWNoKChicmljazogUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgIGJyaWNrLmFmdGVyUmVuZGVyQ2FsbGJhY2sgPSBhZnRlclJlbmRlclRleHRCcmlja0NhbGxiYWNrLmJpbmQodGhpcywgYnJpY2spO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy54TGVmdCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy54UmlnaHQpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXh0QnJpY2sucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGlmICh0aGlzLmdldFNob3VsZFJlbmRlclJlYWRPbmx5KCkgJiYgdGhpcy5pbnB1dFR5cGUgIT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRCcmljay51bmZvbGQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci51bmZvbGQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gcmVzLnhMZWZ0O1xuICAgICAgICB0aGlzLl94UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgICAgICBpZih0aGlzLnRleHRCcmljaykge1xuICAgICAgICAgICAgdGhpcy50ZXh0QnJpY2sudHJhbnNsYXRlWChmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WExlZnQodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB2YWwgLSB0aGlzLl94TGVmdDtcbiAgICAgICAgc3VwZXIuc2V0WExlZnQodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnhMZWZ0ID0gdGhpcy50ZXh0QnJpY2sueExlZnQgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WFJpZ2h0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feFJpZ2h0O1xuICAgICAgICBzdXBlci5zZXRYUmlnaHQodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnhSaWdodCA9IHRoaXMudGV4dEJyaWNrLnhSaWdodCArIGRlbHRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZVG9wKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feVRvcDtcbiAgICAgICAgc3VwZXIuc2V0WVRvcCh2YWwpO1xuICAgICAgICBpZih0aGlzLnRleHRCcmljaykge1xuICAgICAgICAgICAgdGhpcy50ZXh0QnJpY2sueVRvcCA9IHRoaXMudGV4dEJyaWNrLnlUb3AgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WUJvdHRvbSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3lCb3Q7XG4gICAgICAgIHN1cGVyLnNldFlCb3R0b20odmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnlCb3QgPSB0aGlzLnRleHRCcmljay55Qm90ICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRpdGxlUGFuZWxCcmljayBleHRlbmRzIFRleHRCb2xkQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBTdXJ2ZXlIZWxwZXIuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFBhbmVsTW9kZWwsIFBhZ2VNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcG9pbnQ6IElQb2ludDtcbiAgICBwdWJsaWMgYnJpY2tzOiBJUGRmQnJpY2tbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnk7XG4gICAgcHVibGljIG1vZHVsZTogYW55O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICB0aGlzLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIHRoaXMuYnJpY2tzID0gYnJpY2tzO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNPcHRpb25zIGV4dGVuZHMgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc1BhbmVsT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYW5lbDogUGFuZWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhbmVsID0gcGFuZWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYWdlT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYWdlOiBQYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhZ2U6IFBhZ2VNb2RlbCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxufVxuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9hZG9ybmVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBMb2NhbGl6YWJsZVN0cmluZywgUXVlc3Rpb25Cb29sZWFuTW9kZWwsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBTdXJ2ZXlNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuXG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW5DaGVja2JveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkJvb2xlYW5Nb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBCb29sZWFuSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCBoZWlnaHQsIGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGxvY0xhYmVsVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZSA/IG51bGwgOlxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgPyB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsVHJ1ZSA6IHRoaXMucXVlc3Rpb24ubG9jTGFiZWxGYWxzZTtcbiAgICAgICAgaWYgKGxvY0xhYmVsVGV4dCAhPT0gbnVsbCAmJiBsb2NMYWJlbFRleHQucmVuZGVyZWRIdG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jTGFiZWxUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBGbGF0Qm9vbGVhbiBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcml2YXRlIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+O1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuYnVpbGRJdGVtcygpO1xuICAgIH1cbiAgICBwcml2YXRlIGJ1aWxkSXRlbXMoKSB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPig8YW55PnRoaXMucXVlc3Rpb24pO1xuICAgICAgICBjb25zdCBmYWxzZUNob2ljZSA9IG5ldyBJdGVtVmFsdWUoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVGYWxzZSAhPT0gdW5kZWZpbmVkID8gKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVGYWxzZSA6IGZhbHNlKTtcbiAgICAgICAgY29uc3QgdHJ1ZUNob2ljZSA9IG5ldyBJdGVtVmFsdWUoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVUcnVlICE9PSB1bmRlZmluZWQgPyAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS52YWx1ZVRydWUgOiB0cnVlKTtcbiAgICAgICAgZmFsc2VDaG9pY2UubG9jT3duZXIgPSBxdWVzdGlvbjtcbiAgICAgICAgZmFsc2VDaG9pY2Uuc2V0TG9jVGV4dCgoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5sb2NMYWJlbEZhbHNlKTtcbiAgICAgICAgdHJ1ZUNob2ljZS5sb2NPd25lciA9IHF1ZXN0aW9uO1xuICAgICAgICB0cnVlQ2hvaWNlLnNldExvY1RleHQoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikubG9jTGFiZWxUcnVlKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtmYWxzZUNob2ljZSwgdHJ1ZUNob2ljZV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2Jvb2xlYW4nLCBGbGF0Qm9vbGVhbik7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuLWNoZWNrYm94JywgRmxhdEJvb2xlYW5DaGVja2JveCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgUXVlc3Rpb25UYWdib3hNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBDaGVja2JveEl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q2hlY2tib3ggZXh0ZW5kcyBGbGF0U2VsZWN0QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveEl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsIGl0ZW0sIGluZGV4KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmxhdFRhZ2JveCBleHRlbmRzIEZsYXRDaGVja2JveCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRhZ2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGFnYm94TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgaWYodGhpcy5jb250cm9sbGVyLnRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnNlbGVjdGVkQ2hvaWNlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuICAgICAgICB9XG4gICAgfVxufVxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGFnYm94JywgRmxhdFRhZ2JveCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjaGVja2JveCcsIEZsYXRDaGVja2JveCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdENvbW1lbnQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Db21tZW50TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Db21tZW50TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogdGhpcy5xdWVzdGlvbi5yb3dzIH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2NvbW1lbnQnLCBGbGF0Q29tbWVudCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DdXN0b21Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q3VzdG9tTW9kZWwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0ID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICByZXR1cm4gZmxhdC5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjdXN0b21fbW9kZWwnLCBGbGF0Q3VzdG9tTW9kZWwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RHJvcGRvd24gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQnJpY2sgPSAhdGhpcy5zaG91bGRSZW5kZXJBc0NvbW1lbnQgPyBuZXcgRHJvcGRvd25Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKSA6IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHZhbHVlOiBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pIH0pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayh2YWx1ZUJyaWNrKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgZmFsc2UsIHsgcm93czogU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlRmxhdF07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdkcm9wZG93bicsIEZsYXREcm9wZG93bik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRFeHByZXNzaW9uIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25FeHByZXNzaW9uTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSwgcmVhZE9ubHk6IHRydWUgfSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZXhwcmVzc2lvbicsIEZsYXRFeHByZXNzaW9uKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkZpbGVNb2RlbCwgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEZpbGUgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU1BR0VfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRFWFRfTUlOX1NDQUxFOiBudW1iZXIgPSA1LjA7XG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX0lNQUdFX0ZJVDogc3RyaW5nID0gJ2NvbnRhaW4nO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkZpbGVNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgaW1hZ2VTaXplPzogSVNpemUsXG4gICAgfSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVMaW5rRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubmFtZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlJyA6IGl0ZW0ubmFtZSwgaXRlbS5jb250ZW50KSk7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIGltYWdlUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRGaWxlLklNQUdFX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChpbWFnZVBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogaXRlbS5jb250ZW50LCB3aWR0aDogaXRlbS5pbWFnZVNpemUud2lkdGgsIGhlaWdodDogaXRlbS5pbWFnZVNpemUuaGVpZ2h0LCBvYmplY3RGaXQ6IEZsYXRGaWxlLkRFRkFVTFRfSU1BR0VfRklUIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRMaW5lKHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSwgY3VyclBvaW50OiBJUG9pbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEltYWdlUHJldmlld0NvbnRlbnRXaWR0aChpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplIH0pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGl0ZW0uaW1hZ2VTaXplLndpZHRoLCBGbGF0RmlsZS5URVhUX01JTl9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0V2lkdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLm5vRmlsZUNob3NlbkNhcHRpb24sIFRleHRCcmljayldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpdGVtOiB7IG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplIH0gPSB7IC4uLnRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldIH07XG4gICAgICAgICAgICBjb25zdCBjYW5QcmV2aWV3SW1hZ2UgPSBTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCk7XG4gICAgICAgICAgICBpZiAoY2FuUHJldmlld0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5pbWFnZVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKHRoaXMuY29udHJvbGxlciwgeyBpbWFnZVdpZHRoOiB0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIGltYWdlSGVpZ2h0OiB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBpbWFnZUxpbms6IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlW2ldLmNvbnRlbnQsIGRlZmF1bHRJbWFnZVdpZHRoOiAyMDAsIGRlZmF1bHRJbWFnZUhlaWdodDogMTUwIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIGlmIChjYW5QcmV2aWV3SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVXaWR0aCA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VQcmV2aWV3Q29udGVudFdpZHRoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aCA8IGNvbXBvc2l0ZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyhjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gY3VyclBvaW50LnhMZWZ0IC0gY29tcG9zaXRlV2lkdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQud2lkdGg7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZShyb3dzRmxhdHMsIGN1cnJQb2ludCwgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LCBpdGVtKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gaXRlbUZsYXQueFJpZ2h0IC0gaXRlbUZsYXQueExlZnQ7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ZpbGUnLCBGbGF0RmlsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25IdG1sTW9kZWwsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuXG5leHBvcnQgdHlwZSBJSFRNTFJlbmRlclR5cGUgPSAnYXV0bycgfCAnc3RhbmRhcmQnIHwgJ2ltYWdlJztcbmV4cG9ydCBjbGFzcyBGbGF0SFRNTCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkh0bWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwcml2YXRlIGNob29zZVJlbmRlcihodG1sOiBzdHJpbmcpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICBpZiAoLzxbXj5dKnN0eWxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvPFtePl0qdGFibGVbXjxdKj4vLnRlc3QoaHRtbCkgfHxcbiAgICAgICAgICAgIC8mXFx3KzsvLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnaW1hZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnc3RhbmRhcmQnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvcnJlY3RIdG1sUnVsZXM6IFt7IHNlYXJjaFJlZ0V4cDogUmVnRXhwLCByZXBsYWNlU3RyaW5nOiBzdHJpbmcgfV0gPSBbXG4gICAgICAgIHsgc2VhcmNoUmVnRXhwOiAvKDxcXC8/YnJcXHMqP1xcLz9cXHMqPz5cXHMqKXsyLH0vZywgcmVwbGFjZVN0cmluZzogJzxicj4nIH1cbiAgICBdXG4gICAgcHJvdGVjdGVkIGNvcnJlY3RIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIEZsYXRIVE1MLmNvcnJlY3RIdG1sUnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZShydWxlLnNlYXJjaFJlZ0V4cCwgcnVsZS5yZXBsYWNlU3RyaW5nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUgPSA8SUhUTUxSZW5kZXJUeXBlPnRoaXMucXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmKCFTdXJ2ZXlIZWxwZXIuaGFzRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IEVtcHR5QnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIDAsIDApKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jb250cm9sbGVyLmh0bWxSZW5kZXJBcztcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnYXV0bycpIHJlbmRlckFzID0gdGhpcy5jaG9vc2VSZW5kZXIoU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpKTtcbiAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gU3VydmV5SGVscGVyLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jSHRtbCksIHRoaXMuY29udHJvbGxlciwgcmVuZGVyQXMpO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGh0bWwsIHdpZHRoLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB3aWR0aCAvIGFzcGVjdDtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IHVybCwgd2lkdGgsIGhlaWdodCB9KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtTdXJ2ZXlIZWxwZXIuc3BsaXRIdG1sUmVjdCh0aGlzLmNvbnRyb2xsZXIsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVIVE1MRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMuY29ycmVjdEh0bWwoaHRtbCkpKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdodG1sJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdodG1sJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdzdGFuZGFyZCcsICdpbWFnZSddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2h0bWwnLCBGbGF0SFRNTCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciwgSVNpemUgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2V0Q29ycmVjdEltYWdlU2l6ZSgpOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0Q29ycmVjdGVkSW1hZ2VTaXplKHRoaXMuY29udHJvbGxlciwgeyBpbWFnZVdpZHRoOiB0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIGltYWdlSGVpZ2h0OiB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBpbWFnZUxpbms6IHRoaXMucXVlc3Rpb24uaW1hZ2VMaW5rIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaW1hZ2VTaXplID0gYXdhaXQgdGhpcy5nZXRDb3JyZWN0SW1hZ2VTaXplKCk7XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB0aGlzLnF1ZXN0aW9uLmltYWdlTGluaywgd2lkdGg6IGltYWdlU2l6ZS53aWR0aCwgaGVpZ2h0OiBpbWFnZVNpemUuaGVpZ2h0IH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ltYWdlJywgRmxhdEltYWdlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZVBpY2tlciBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw7XG4gICAgcHJvdGVjdGVkIHJhZGlvOiBGbGF0UmFkaW9ncm91cDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZ2VBdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgaW1hZ2VGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6ICg8YW55Pml0ZW0pLmltYWdlTGluaywgd2lkdGg6IHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0OiBwYWdlQXZhaWxhYmxlV2lkdGggLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfUkFUSU8gfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGltYWdlRmxhdCk7XG4gICAgICAgIGxldCBidXR0b25Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93TGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChidXR0b25Qb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLnRleHQgfHwgaXRlbS52YWx1ZSwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobGFiZWxGbGF0KTtcbiAgICAgICAgICAgIGJ1dHRvblBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxhYmVsRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgYnV0dG9uUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChidXR0b25Qb2ludCwgcGFnZUF2YWlsYWJsZVdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhuZXcgQ2hlY2tJdGVtQnJpY2sodGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QsIHRoaXMucXVlc3Rpb24uaWQgKyAnaW5kZXgnICsgaW5kZXgsIHsgcmVhZE9ubHk6IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQsIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCBpdGVtOiBpdGVtLCBjaGVja2VkOiB0aGlzLnF1ZXN0aW9uLnZhbHVlLmluZGV4T2YoaXRlbS52YWx1ZSkgIT09IC0xLCBpbmRleDogaW5kZXggfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayh0aGlzLnJhZGlvLmdlbmVyYXRlRmxhdEl0ZW0oYnV0dG9uUmVjdCwgaXRlbSwgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMucmFkaW8gPSB0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gbnVsbCA6XG4gICAgICAgICAgICBuZXcgRmxhdFJhZGlvZ3JvdXAodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcikgLyBTdXJ2ZXlIZWxwZXIuSU1BR0VQSUNLRVJfQ09VTlQ7XG4gICAgICAgIGxldCBjb2xzOiBudW1iZXIgPSB+fihTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBnZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIGNvbFdpZHRoKSB8fCAxO1xuICAgICAgICBjb25zdCBjb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgIGNvbHMgPSBjb2xzIDw9IGNvdW50ID8gY29scyA6IGNvdW50O1xuICAgICAgICBjb25zdCByb3dzOiBudW1iZXIgPSB+fihNYXRoLmNlaWwoY291bnQgLyBjb2xzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBsZXQgY3Vyck1hcmdpbkxlZnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgY29sczsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGkgKiBjb2xzICsgajtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gY291bnQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyTWFyZ2luTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgLSBjb2xXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyTWFyZ2luTGVmdCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaW5kZXhdLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MgLSAxKSB7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZXBpY2tlcicsIEZsYXRJbWFnZVBpY2tlcik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4TW9kZWwsIE1hdHJpeFJvd01vZGVsLFxuICAgIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsLCBJdGVtVmFsdWUsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVBvaW50LCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC41O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk1hdHJpeE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c0hlYWRlcihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzUm93cykge1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtIHRoaXMuY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgaGVhZGVycy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1uc1tpXS5sb2NUZXh0KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb2x1bW5XaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2s6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzUm93cyhwb2ludDogSVBvaW50LCBpc1ZlcnRpY2FsOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleTogc3RyaW5nID0gJ3JvdycgKyBpO1xuICAgICAgICAgICAgY29uc3QgZmxhdHNSb3c6IElQZGZCcmlja1tdID0gYXdhaXQgbmV3IEZsYXRNYXRyaXhSb3codGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzW2ldLCBpLCBrZXksIGkgPT0gMCwgaXNWZXJ0aWNhbCwgdGhpcy5yb3dUaXRsZVdpZHRoLCB0aGlzLmNvbHVtbldpZHRoKS5nZW5lcmF0ZUZsYXRzQ29udGVudChjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzUm93KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uZmxhdHNSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG4gICAgcHJpdmF0ZSByb3dUaXRsZVdpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjb2x1bW5XaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uc1dpZHRoZXMoKSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgJiYgdGhpcy5xdWVzdGlvbi5yb3dUaXRsZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIHRoaXMucm93VGl0bGVXaWR0aCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHRoaXMucXVlc3Rpb24ucm93VGl0bGVXaWR0aCwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSAodGhpcy5yb3dUaXRsZVdpZHRoICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aCA9IHRoaXMucm93VGl0bGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uc1dpZHRoZXMoKTtcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgPT09ICdsaXN0JyB8fCB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgPT09ICdsaXN0JyB8fFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5XaWR0aCA8IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZiAoIWlzVmVydGljYWwgJiYgdGhpcy5xdWVzdGlvbi5zaG93SGVhZGVyICYmIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0hlYWRlcihjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmhlYWRlcnMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaCguLi5oZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd3MoY3VyclBvaW50LCBpc1ZlcnRpY2FsKSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4Um93IGV4dGVuZHMgRmxhdFJhZGlvZ3JvdXAge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbk1hdHJpeDogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByb3c6IE1hdHJpeFJvd01vZGVsLCBwcml2YXRlIHJvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHByaXZhdGUga2V5OiBzdHJpbmcsIHByb3RlY3RlZCBpc0ZpcnN0OiBib29sZWFuID0gZmFsc2UsIHByb3RlY3RlZCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2UsIHByaXZhdGUgcm93VGl0bGVXaWR0aDogbnVtYmVyLCBwcml2YXRlIGNvbHVtbldpZHRoOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXggPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmVydGljYWwgP1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50KSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVRleHRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGl0ZW1SZWN0LCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KTtcbiAgICAgICAgY3VyclBvaW50LnlUb3AgPSByYWRpb0ZsYXQueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgY2VsbFRleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbk1hdHJpeC5nZXRDZWxsRGlzcGxheUxvY1RleHQodGhpcy5yb3cubmFtZSwgY29sdW1uKSwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIGNlbGxUZXh0RmxhdCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUl0ZW1Db21wb2lzdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgaXRlbVJlY3QueExlZnQpLCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KTtcbiAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcmFkaW9GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCByYWRpb1RleHQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbHVtbi5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgcmFkaW9UZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLSB0aGlzLnJvd1RpdGxlV2lkdGgpO1xuICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbjogSXRlbVZhbHVlID0gdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSAoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC0gdGhpcy5jb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkge1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUoY3VyclBvaW50LCBjb2x1bW4sIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgY3VyclBvaW50LnhMZWZ0KSwgY29sdW1uLCBpLCB0aGlzLmtleSwgY2hlY2tlZCwgeyByb3c6IHRoaXMucm93LCByb3dJbmRleDogdGhpcy5yb3dJbmRleCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb2x1bW5XaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1RleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd1RleHRGbGF0LnlCb3QgKyBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaChyb3dUZXh0RmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUgPSAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkgPyB0aGlzLmdlbmVyYXRlVGV4dENvbXBvc2l0ZSA6IHRoaXMuZ2VuZXJhdGVJdGVtQ29tcG9pc3RlO1xuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5jZWxscyk7XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlQnJpY2ssIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlQnJpY2spLCB0aGlzLmNvbnRyb2xsZXIpXTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4Jywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4JywgRmxhdE1hdHJpeCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4vZmxhdF9tYXRyaXhtdWx0aXBsZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4RHluYW1pYyBleHRlbmRzIEZsYXRNYXRyaXhNdWx0aXBsZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4ZHluYW1pYycsIEZsYXRNYXRyaXhEeW5hbWljKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLCBNdWx0aXBsZVRleHRJdGVtTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uLCBJRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4vZmxhdF90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNdWx0aXBsZVRleHQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUk9XU19HQVBfU0NBTEU6IG51bWJlciA9IDAuMTk1O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFZpc2libGVSb3dzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCkuZmlsdGVyKHJvdyA9PiByb3cuaXNWaXNpYmxlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIHJvd19pbmRleDogbnVtYmVyLCBjb2xfaW5kZXg6IG51bWJlcixcbiAgICAgICAgaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlM7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RpdGxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG5cbiAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGl0ZW0uZWRpdG9yLCB0aGlzLmNvbnRyb2xsZXIsICd0ZXh0Jyk7XG4gICAgICAgIGNvbnN0IGl0ZW1Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgY29sV2lkdGggKiBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUywgeVRvcDogcG9pbnQueVRvcCB9LFxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKC4uLmF3YWl0ICg8RmxhdFRleHRib3g+ZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbikuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoaXRlbVBvaW50KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgcm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5jb2xDb3VudCwgaik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGksIGosIHJvd3NbaV0uY2VsbHNbal0uaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNdWx0aXBsZVRleHQuUk9XU19HQVBfU0NBTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ211bHRpcGxldGV4dCcsIEZsYXRNdWx0aXBsZVRleHQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRQYW5lbER5bmFtaWMgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1BBTkVMUzogbnVtYmVyID0gMC43NTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbCBvZiB0aGlzLnF1ZXN0aW9uLnBhbmVscykge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBwYW5lbCwgY3VyclBvaW50KTtcbiAgICAgICAgICAgIGlmIChwYW5lbEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucGFuZWxGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRQYW5lbER5bmFtaWMuR0FQX0JFVFdFRU5fUEFORUxTO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4ucGFuZWxGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncGFuZWxkeW5hbWljJywgRmxhdFBhbmVsRHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IENvbG9yZWRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFua2luZyBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIsIHVucmFua2VkSXRlbTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1TY2FsZWRSZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gbmV3IFJhbmtpbmdJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgaXRlbVNjYWxlZFJlY3QsIHVucmFua2VkSXRlbSA/ICctJyA6IHRoaXMucXVlc3Rpb24uZ2V0TnVtYmVyQnlJbmRleChpbmRleCkpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhpdGVtRmxhdCwgdGV4dEZsYXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVDaG9pY2VzQ29sdW1uKHBvaW50OiBJUG9pbnQsIGNob2ljZXM6IEl0ZW1WYWx1ZVtdLCB1bnJhbmtlZENob2ljZXM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShjdXJyUG9pbnQsIGNob2ljZXNbaV0sIGksIHVucmFua2VkQ2hvaWNlcyk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTZWxlY3RUb1JhbmtJdGVtc1ZlcnRpY2FsbHkocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVDaG9pY2VzQ29sdW1uKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90ICsgMiAqIChTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXBhcmF0b3JSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IGN1cnJQb2ludC54TGVmdCxcbiAgICAgICAgICAgIHlUb3A6IGN1cnJQb2ludC55VG9wIC0gKFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpIC0gMC41LFxuICAgICAgICB9LCB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gY3VyclBvaW50LnhMZWZ0LCAxKTtcbiAgICAgICAgZmxhdHMucHVzaChuZXcgQ29sb3JlZEJyaWNrKHRoaXMuY29udHJvbGxlciwgc2VwYXJhdG9yUmVjdCwgU3VydmV5SGVscGVyLkZPUk1fQk9SREVSX0NPTE9SKSk7XG5cbiAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24udW5SYW5raW5nQ2hvaWNlcywgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zSG9yaXpvbnRhbGx5KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbENvdW50ID0gMjtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93c0NvdW50ID0gTWF0aC5tYXgodGhpcy5xdWVzdGlvbi51blJhbmtpbmdDaG9pY2VzLmxlbmd0aCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcy5sZW5ndGgpO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93c0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIFt0aGlzLnF1ZXN0aW9uLnVuUmFua2luZ0Nob2ljZXNbaV0sIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXNbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYoISFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LCB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpdGVtLCBpLCBjb2xJbmRleCA9PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcm93LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVGbGF0OiBJUGRmQnJpY2sgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHtcbiAgICAgICAgICAgICAgICB4TGVmdDogdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAvIDIgLSAwLjUsXG4gICAgICAgICAgICAgICAgeVRvcDogY3VyclBvaW50LnlUb3AsXG4gICAgICAgICAgICB9LCAwLCAwKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhuZXcgQ29sb3JlZEJyaWNrKHRoaXMuY29udHJvbGxlciwgc2VwYXJhdG9yUmVjdCwgU3VydmV5SGVscGVyLkZPUk1fQk9SREVSX0NPTE9SLCAxLCByb3dMaW5lRmxhdC55Qm90IC0gY3VyclBvaW50LnlUb3AgKyAoaSAhPT0gcm93c0NvdW50IC0gMSA/XG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCA6IDApKSk7XG5cbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93TGluZUZsYXQueUJvdCArXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmKCF0aGlzLnF1ZXN0aW9uLnNlbGVjdFRvUmFua0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihwb2ludCwgdGhpcy5xdWVzdGlvbi5yYW5raW5nQ2hvaWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0aGlzLnF1ZXN0aW9uLnNlbGVjdFRvUmFua0FyZWFzTGF5b3V0ID09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNWZXJ0aWNhbGx5KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNIb3Jpem9udGFsbHkocG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYW5raW5nJywgRmxhdFJhbmtpbmcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhdGluZyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25SYXRpbmc6IFF1ZXN0aW9uUmF0aW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcgPSA8UXVlc3Rpb25SYXRpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaW5kZXgsIGl0ZW0ubG9jVGV4dCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggLyAyLjA7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gaGFsZldpZHRoO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgY3JlYXRlQm9sZFRleHRGbGF0KHRleHRQb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZywgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBsZXQgdGV4dFdpZHRoOiBudW1iZXIgPSBjb21wb3NpdGVGbGF0LndpZHRoO1xuICAgICAgICBpZiAodGV4dFdpZHRoIDwgU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQueExlZnQgKz0gKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC0gdGV4dFdpZHRoKSAvIDIuMCAtIGhhbGZXaWR0aDtcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dFdpZHRoICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFkaW9Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICByYWRpb1BvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KFxuICAgICAgICAgICAgcmFkaW9Qb2ludCwgdGV4dFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksIGl0ZW0sIGluZGV4LCB1bmRlZmluZWQsIHRoaXMucXVlc3Rpb24udmFsdWUgPT0gaXRlbS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCwgdW5kZWZpbmVkLCB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWUpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICBpdGVtVGV4dCA9PSBudWxsIHx8IGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW1UZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQpIHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SG9yaXNvbnRhbENvbXBvc2l0ZShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpIDw9IGxlZnRXaWR0aCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90O1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpLCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzW2ldLmxvY1RleHQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChpdGVtVGV4dCkud2lkdGggPiB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLlJBVElOR19DT0xVTU5fV0lEVEgpLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmVydGljYWwgPyB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50LCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzKSA6IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYXRpbmcnLCBGbGF0UmF0aW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYXRpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyLCBJUmVjdCwgSVNpemUgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgSUJvcmRlckRlc2NyaXB0aW9uLCBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U2lnbmF0dXJlUGFkIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU1RZTEU6ICdkYXNoZWQnIHwgJ3NvbGlkJyB8ICdub25lJyA9ICdkYXNoZWQnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVCYWNrZ3JvdW5kSW1hZ2UocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5xdWVzdGlvbi5iYWNrZ3JvdW5kSW1hZ2UsIHdpZHRoOiBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5zaWduYXR1cmVXaWR0aCksIGhlaWdodDogU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlSGVpZ2h0KSwgb2JqZWN0Rml0OiAnY292ZXInIH0sIHRydWUpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFNpZ25JbWFnZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uc3RvcmVEYXRhQXNUZXh0IHx8ICF0aGlzLnF1ZXN0aW9uLmxvYWRlZERhdGEgPyB0aGlzLnF1ZXN0aW9uLnZhbHVlIDogdGhpcy5xdWVzdGlvbi5sb2FkZWREYXRhO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTaWduKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZVdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlSGVpZ2h0KTtcbiAgICAgICAgbGV0IGJyaWNrOiBQZGZCcmljaztcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgYnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB0aGlzLmdldFNpZ25JbWFnZVVybCgpLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0IH0sIGZhbHNlXG4gICAgICAgICAgICApIGFzIFBkZkJyaWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJpY2sgPSBuZXcgRW1wdHlCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKEZsYXRTaWduYXR1cmVQYWQuQk9SREVSX1NUWUxFICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGJyaWNrLmFmdGVyUmVuZGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyT3B0aW9uczogSUJvcmRlckRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJyaWNrLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYnJpY2sud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHlUb3A6IGJyaWNrLnlUb3AsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGJyaWNrLnlCb3QsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBicmljay54TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgeFJpZ2h0OiBicmljay54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Cb3JkZXJDb2xvcjogYnJpY2suZm9ybUJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgICByb3VuZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGFzaFN0eWxlOiBGbGF0U2lnbmF0dXJlUGFkLkJPUkRFUl9TVFlMRSA9PSAnZGFzaGVkJyA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hBcnJheTogWzVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaFBoYXNlOiAwXG4gICAgICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIGJvcmRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBicmljaztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5iYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUJyaWNrLmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVCYWNrZ3JvdW5kSW1hZ2UocG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NpdGVCcmljay5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlU2lnbihwb2ludCkpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3NpZ25hdHVyZXBhZCcsIEZsYXRTaWduYXR1cmVQYWQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0VGV4dGJveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNVUxUSUxJTkVfVEVYVF9ST1dTX0NPVU5UOiBudW1iZXIgPSAxO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRSZW5kZXJBc0NvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBUZXh0Qm94QnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRydWUsIHsgcm93czogRmxhdFRleHRib3guTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVCB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCd0ZXh0JywgRmxhdFRleHRib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3RleHRib3gudHMiLCJpbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG5cbiAgICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcml2YXRlIHJlbmRlckZ1bmM6IChkb2M6IGFueSwgcXVlc3Rpb246IGFueSwgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyKSA9PiBJUmVjdCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVuZGVyRnVuYyhjb250cm9sbGVyLmhlbHBlckRvYywgcXVlc3Rpb24sIDAsIDApKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJGdW5jKHRoaXMuY29udHJvbGxlci5kb2MsIHRoaXMucXVlc3Rpb24sIHRoaXMueExlZnQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwiaW1wb3J0IHsgU3VydmV5TW9kZWwsIFF1ZXN0aW9uLCBFdmVudEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgKiBhcyBTdXJ2ZXlDb3JlIGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IEV2ZW50QXN5bmMsIEV2ZW50SGFuZGxlciB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuaW1wb3J0IHsgQWRvcm5lcnNPcHRpb25zLCBBZG9ybmVyc1BhbmVsT3B0aW9ucywgQWRvcm5lcnNQYWdlT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuL2hlbHBlcl9zdXJ2ZXknO1xuXG4vKipcbiAqIFRoZSBgU3VydmV5UERGYCBvYmplY3QgZW5hYmxlcyB5b3UgdG8gZXhwb3J0IHlvdXIgc3VydmV5cyBhbmQgZm9ybXMgdG8gUERGIGRvY3VtZW50cy5cbiAqXG4gKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5UERGIGV4dGVuZHMgU3VydmV5TW9kZWwge1xuICAgIHByaXZhdGUgc3RhdGljIGN1cnJlbnRseVNhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3RhdGljIHNhdmVRdWV1ZTogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgb3B0aW9uczogSURvY09wdGlvbnM7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGpzb25PYmplY3Q6IGFueSwgb3B0aW9ucz86IElEb2NPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGpzb25PYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKG9wdGlvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZiA9IFN1cnZleUNvcmUuaGFzTGljZW5zZTtcbiAgICAgICAgcmV0dXJuICEhZiAmJiBmKDIpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcignQXMgb2YgdjEuOS4xMDEsIHRoZSBoYXZlQ29tbWVyY2lhbExpY2Vuc2UgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4gVG8gYWN0aXZhdGUgeW91ciBsaWNlbnNlLCB1c2UgdGhlIHNldExpY2Vuc2VLZXkoa2V5KSBtZXRob2QgYXMgc2hvd24gb24gdGhlIGZvbGxvd2luZyBwYWdlOiBodHRwczovL3N1cnZleWpzLmlvL3JlbW92ZS1hbGVydC1iYW5uZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYWdlIGhlYWRlci4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHRoZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYGNhbnZhc2A6IFtgRHJhd0NhbnZhc2BdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZHJhd2NhbnZhcylcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHlvdSBjYW4gdXNlIHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGhlYWRlci5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jdXN0b21pemUtaGVhZGVyLWFuZC1mb290ZXItb2YtcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckhlYWRlcjogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIERyYXdDYW52YXM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPigpO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZSBmb290ZXIuIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSB0aGUgZm9vdGVyLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBjYW52YXNgOiBbYERyYXdDYW52YXNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RyYXdjYW52YXMpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBmb290ZXIuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY3VzdG9taXplLWhlYWRlci1hbmQtZm9vdGVyLW9mLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJGb290ZXI6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHN1cnZleSBxdWVzdGlvbi4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHF1ZXN0aW9uIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5xdWVzdGlvbmA6IFtgUXVlc3Rpb25gXShodHRwczovL3N1cnZleWpzLmlvL2Zvcm0tbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcXVlc3Rpb24pXFxcbiAgICAgKiBBIHN1cnZleSBxdWVzdGlvbiB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wb2ludGA6IGBJUG9pbnRgXFxcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkLiBUaGlzIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IGB7IHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlciB9YC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuYnJpY2tzYDogW2BQZGZCcmlja1tdYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wZGZicmljaylcXFxuICAgICAqIEFuIGFycmF5IG9mIFticmlja3NdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2N1c3RvbWl6ZS1zdXJ2ZXktcXVlc3Rpb24tcmVuZGVyaW5nLWluLXBkZi1mb3JtI2N1c3RvbS1yZW5kZXJpbmcpIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5jb250cm9sbGVyYDogW2BEb2NDb250cm9sbGVyYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kb2Njb250cm9sbGVyKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1haW4gUERGIGRvY3VtZW50IHByb3BlcnRpZXMgKGZvbnQsIG1hcmdpbnMsIHBhZ2Ugd2lkdGggYW5kIGhlaWdodCkgYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZW0uXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnJlcG9zaXRvcnlgOiBgRmxhdFJlcG9zaXRvcnlgXFxcbiAgICAgKiBBIHJlcG9zaXRvcnkgd2l0aCBjbGFzc2VzIHRoYXQgcmVuZGVyIGVsZW1lbnRzIHRvIFBERi4gVXNlIGl0cyBgY3JlYXRlYCBtZXRob2QgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVuZGVyaW5nIGNsYXNzLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJRdWVzdGlvbjogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzT3B0aW9ucz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzT3B0aW9ucz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHBhbmVsLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgcGFuZWwgcmVuZGVyaW5nLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBhbmVsYDogW2BQYW5lbE1vZGVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BhbmVsLW1vZGVsKVxcXG4gICAgICogQSBwYW5lbCB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wb2ludGA6IGBJUG9pbnRgXFxcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkLiBUaGlzIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IGB7IHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlciB9YC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuYnJpY2tzYDogW2BQZGZCcmlja1tdYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wZGZicmljaylcXFxuICAgICAqIEFuIGFycmF5IG9mIFticmlja3NdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2N1c3RvbWl6ZS1zdXJ2ZXktcXVlc3Rpb24tcmVuZGVyaW5nLWluLXBkZi1mb3JtI2N1c3RvbS1yZW5kZXJpbmcpIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5jb250cm9sbGVyYDogW2BEb2NDb250cm9sbGVyYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kb2Njb250cm9sbGVyKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1haW4gUERGIGRvY3VtZW50IHByb3BlcnRpZXMgKGZvbnQsIG1hcmdpbnMsIHBhZ2Ugd2lkdGggYW5kIGhlaWdodCkgYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZW0uXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnJlcG9zaXRvcnlgOiBgRmxhdFJlcG9zaXRvcnlgXFxcbiAgICAgKiBBIHJlcG9zaXRvcnkgd2l0aCBjbGFzc2VzIHRoYXQgcmVuZGVyIGVsZW1lbnRzIHRvIFBERi4gVXNlIGl0cyBgY3JlYXRlYCBtZXRob2QgaWYgeW91IG5lZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgcmVuZGVyaW5nIGNsYXNzLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2hvdy10by11c2UtYWRvcm5lcnMtaW4tcGRmLWZvcm1zLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJQYW5lbDogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFuZWxPcHRpb25zPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgQWRvcm5lcnNQYW5lbE9wdGlvbnM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYWdlLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgcGFnZSByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucGFnZWA6IFtgUGFnZU1vZGVsYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BhZ2UtbW9kZWwpXFxcbiAgICAgKiBBIHBhZ2UgdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFnZTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFnZU9wdGlvbnM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhZ2VPcHRpb25zPigpO1xuXG4gICAgcHVibGljIG9uRG9jQ29udHJvbGxlckNyZWF0ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlQREYsIHsgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciB9PiA9IG5ldyBFdmVudEJhc2U8U3VydmV5UERGLCB7Y29udHJvbGxlcjogRG9jQ29udHJvbGxlcn0+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJDaGVja0l0ZW1BY3JvZm9ybTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4oKTtcblxuICAgIHB1YmxpYyBvblJlbmRlclJhZGlvR3JvdXBXcmFwQWNyb2Zvcm06IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+ID1cbiAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4oKTtcblxuICAgIHB1YmxpYyBvblJlbmRlclJhZGlvSXRlbUFjcm9mb3JtOiBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PiA9XG4gICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwcml2YXRlIHdhaXRGb3JRdWVzdGlvbklzUmVhZHkocXVlc3Rpb246IFF1ZXN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5Q2FsbGJhY2s6IChzZW5kZXI6IFF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpID0+IHZvaWQgPVxuICAgICAgICAgICAgICAgIChfLCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQucmVtb3ZlKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5vblJlYWR5Q2hhbmdlZC5hZGQocmVhZHlDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHdhaXRGb3JDb3JlSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiB0aGlzLmdldEFsbFF1ZXN0aW9ucygpKSB7XG4gICAgICAgICAgICBpZiAoISEoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdDogUXVlc3Rpb25bXSA9IFtdO1xuICAgICAgICAgICAgICAgICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UGFuZWwuYWRkUXVlc3Rpb25zVG9MaXN0KGxpc3QpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5uZXJRdWVzdGlvbiBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShpbm5lclF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKDxRdWVzdGlvbj5xdWVzdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkQ2hlY2tJdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyQ2hlY2tJdGVtQWNyb2Zvcm0uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcHVibGljIGdldFVwZGF0ZWRSYWRpb0dyb3VwV3JhcE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25SZW5kZXJSYWRpb0dyb3VwV3JhcEFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkUmFkaW9JdGVtQWNyb2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyUmFkaW9JdGVtQWNyb2Zvcm0uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjb3JyZWN0QnJpY2tzUG9zaXRpb24oY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdHM6IElQZGZCcmlja1tdW10pIHtcbiAgICAgICAgaWYoY29udHJvbGxlci5pc1JUTCkge1xuICAgICAgICAgICAgZmxhdHMuZm9yRWFjaChmbGF0c0FyciA9PiB7XG4gICAgICAgICAgICAgICAgZmxhdHNBcnIuZm9yRWFjaChmbGF0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdC50cmFuc2xhdGVYKCh4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hpZnRXaWR0aCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHhMZWZ0IC0geFJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeExlZnQ6IHhMZWZ0ICsgc2hpZnRXaWR0aCwgeFJpZ2h0OiB4UmlnaHQgKyBzaGlmdFdpZHRoIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIHJlbmRlclN1cnZleShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMudmlzaWJsZVBhZ2VzLmZvckVhY2gocGFnZSA9PiBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNvcmVJc1JlYWR5KCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzKHRoaXMsIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmNvcnJlY3RCcmlja3NQb3NpdGlvbihjb250cm9sbGVyLCBmbGF0cyk7XG4gICAgICAgIGNvbnN0IHBhY2tzOiBJUGRmQnJpY2tbXVtdID0gUGFnZVBhY2tlci5wYWNrKGZsYXRzLCBjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgRXZlbnRIYW5kbGVyLnByb2Nlc3NfaGVhZGVyX2V2ZW50cyh0aGlzLCBjb250cm9sbGVyLCBwYWNrcyk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBhY2tzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuZ2V0TnVtYmVyT2ZQYWdlcygpID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldFBhZ2UoaSk7XG4gICAgICAgICAgICAgICAgLy9naXptb3MgYnJpY2tzIGJvcmRlcnMgZm9yIGRlYnVnXG4gICAgICAgICAgICAgICAgLy8gcGFja3NbaV1bal0udW5mb2xkKCkuZm9yRWFjaCgocmVjdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignZ3JlZW4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi5TdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKCdibGFjaycpO1xuICAgICAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFja3NbaV1bal0ucmVuZGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXN5bmNocm9ub3VzIG1ldGhvZCB0aGF0IHN0YXJ0cyBkb3dubG9hZCBvZiB0aGUgZ2VuZXJhdGVkIFBERiBmaWxlIGluIHRoZSB3ZWIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlTmFtZSAqKE9wdGlvbmFsKSogQSBmaWxlIG5hbWUgd2l0aCB0aGUgXCIucGRmXCIgZXh0ZW5zaW9uLiBEZWZhdWx0IHZhbHVlOiBgXCJzdXJ2ZXlfcmVzdWx0LnBkZlwiYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZShmaWxlTmFtZTogc3RyaW5nID0gJ3N1cnZleV9yZXN1bHQucGRmJyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmKCFTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMub25Eb2NDb250cm9sbGVyQ3JlYXRlZC5maXJlKHRoaXMsIHsgY29udHJvbGxlcjogY29udHJvbGxlciB9KTtcbiAgICAgICAgICAgIFN1cnZleVBERi5jdXJyZW50bHlTYXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclN1cnZleShjb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBjb250cm9sbGVyLmRvYy5zYXZlKGZpbGVOYW1lLCB7IHJldHVyblByb21pc2U6IHRydWUgfSk7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIFN1cnZleVBERi5jdXJyZW50bHlTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBzYXZlRnVuYyA9IFN1cnZleVBERi5zYXZlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZighIXNhdmVGdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhdmVGdW5jKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFN1cnZleVBERi5zYXZlUXVldWUucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlKGZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFzeW5jaHJvbm91cyBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIGdldCBQREYgY29udGVudCBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jb252ZXJ0LXBkZi1mb3JtLWJsb2ItYmFzZTY0LXJhdy1wZGYtamF2YXNjcmlwdC8gKGxpbmtTdHlsZSkpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAqKE9wdGlvbmFsKSogT25lIG9mIGBcImJsb2JcImAsIGBcImJsb2J1cmxcImAsIGBcImRhdGF1cmxzdHJpbmdcImAuIERvIG5vdCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyIGlmIHlvdSB3YW50IHRvIGdldCByYXcgUERGIGNvbnRlbnQgYXMgYSBzdHJpbmcgdmFsdWUuXG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmF3KHR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbmV3IERvY0NvbnRyb2xsZXIodGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5vbkRvY0NvbnRyb2xsZXJDcmVhdGVkLmZpcmUodGhpcywgeyBjb250cm9sbGVyOiBjb250cm9sbGVyIH0pO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5vdXRwdXQodHlwZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsIlwidXNlIHN0cmljdFwiO1xyXG4vLyBBbiBhdWdtZW50ZWQgQVZMIFRyZWUgd2hlcmUgZWFjaCBub2RlIG1haW50YWlucyBhIGxpc3Qgb2YgcmVjb3JkcyBhbmQgdGhlaXIgc2VhcmNoIGludGVydmFscy5cclxuLy8gUmVjb3JkIGlzIGNvbXBvc2VkIG9mIGFuIGludGVydmFsIGFuZCBpdHMgdW5kZXJseWluZyBkYXRhLCBzZW50IGJ5IGEgY2xpZW50LiBUaGlzIGFsbG93cyB0aGVcclxuLy8gaW50ZXJ2YWwgdHJlZSB0byBoYXZlIHRoZSBzYW1lIGludGVydmFsIGluc2VydGVkIG11bHRpcGxlIHRpbWVzLCBhcyBsb25nIGl0cyBkYXRhIGlzIGRpZmZlcmVudC5cclxuLy8gQm90aCBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIHJlcXVpcmUgTyhsb2cgbikgdGltZS4gU2VhcmNoaW5nIHJlcXVpcmVzIE8oaypsb2duKSB0aW1lLCB3aGVyZSBga2BcclxuLy8gaXMgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIG91dHB1dCBsaXN0LlxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBpc1NhbWUgPSByZXF1aXJlKFwic2hhbGxvd2VxdWFsXCIpO1xyXG5mdW5jdGlvbiBoZWlnaHQobm9kZSkge1xyXG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcclxuICAgIH1cclxufVxyXG52YXIgTm9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE5vZGUoaW50ZXJ2YWxUcmVlLCByZWNvcmQpIHtcclxuICAgICAgICB0aGlzLmludGVydmFsVHJlZSA9IGludGVydmFsVHJlZTtcclxuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcbiAgICAgICAgdGhpcy5rZXkgPSByZWNvcmQubG93O1xyXG4gICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgYXJyYXkgb2YgYWxsIHJlY29yZHMgd2l0aCB0aGUgc2FtZSBrZXkgZm9yIHRoaXMgbm9kZVxyXG4gICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICAvLyBHZXRzIHRoZSBoaWdoZXN0IHJlY29yZC5oaWdoIHZhbHVlIGZvciB0aGlzIG5vZGVcclxuICAgIE5vZGUucHJvdG90eXBlLmdldE5vZGVIaWdoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBoaWdoID0gdGhpcy5yZWNvcmRzWzBdLmhpZ2g7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3Jkc1tpXS5oaWdoID4gaGlnaCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaCA9IHRoaXMucmVjb3Jkc1tpXS5oaWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoaWdoO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgaGVpZ2h0IHZhbHVlIG9mIHRoZSBub2RlLiBDYWxsZWQgZHVyaW5nIGluc2VydGlvbiwgcmViYWxhbmNlLCByZW1vdmFsXHJcbiAgICBOb2RlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heChoZWlnaHQodGhpcy5sZWZ0KSwgaGVpZ2h0KHRoaXMucmlnaHQpKSArIDE7XHJcbiAgICB9O1xyXG4gICAgLy8gVXBkYXRlcyB0aGUgbWF4IHZhbHVlIG9mIGFsbCB0aGUgcGFyZW50cyBhZnRlciBpbnNlcnRpbmcgaW50byBhbHJlYWR5IGV4aXN0aW5nIG5vZGUsIGFzIHdlbGwgYXNcclxuICAgIC8vIHJlbW92aW5nIHRoZSBub2RlIGNvbXBsZXRlbHkgb3IgcmVtb3ZpbmcgdGhlIHJlY29yZCBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIG5vZGUuIFN0YXJ0cyB3aXRoXHJcbiAgICAvLyB0aGUgcGFyZW50IG9mIGFuIGFmZmVjdGVkIG5vZGUgYW5kIGJ1YmJsZXMgdXAgdG8gcm9vdFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlTWF4T2ZQYXJlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXMucmlnaHQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBMZWZ0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgICAgeSAgIFQ0ICAgICAgUmlnaHQgUm90YXRlICh6KSAgICAgICAgICB4ICAgICB6XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXFxyXG4gICAgVDEgICBUMlxyXG4gIFxyXG4gICAgTGVmdC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgICAgeSAgIFQ0ICBMZWZ0IFJvdGF0ZSAoeSkgICAgICAgICB4ICBUNCAgUmlnaHQgUm90YXRlKHopICAgICB5ICAgICB6XHJcbiAgICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgVDEgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICBUMSBUMlxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgTGVmdC1MZWZ0IGNhc2UgYW5kIExlZnQtUmlnaHQgY2FzZSBhZnRlciByZWJhbGFuY2luZyBBVkwgdHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBsZWZ0ID0gcGFyZW50LmxlZnQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBsZWZ0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRMZWZ0SGlnaCA9IGxlZnQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAobGVmdC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudExlZnRIaWdoLCBsZWZ0LnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCAhPT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IHRoaXNQYXJlbnRMZWZ0SGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobGVmdC5sZWZ0Lm1heCwgbGVmdC5yaWdodC5tYXgpLCB0aGlzUGFyZW50TGVmdEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCBwYXJlbnQucmlnaHQubWF4KSwgcGFyZW50LmdldE5vZGVIaWdoKCkpO1xyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBSaWdodC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgVDEgIHkgICAgIExlZnQgUm90YXRlKHopICAgICAgIHogICAgIHhcclxuICAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgLyBcXFxyXG4gICAgICBUMiAgeCAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAgICAvIFxcXHJcbiAgICAgICAgVDMgVDRcclxuICBcclxuICAgIFJpZ2h0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgVDEgIHkgICBSaWdodCBSb3RhdGUgKHkpICAgICBUMSAgeCAgICAgIExlZnQgUm90YXRlKHopICAgeiAgICAgeVxyXG4gICAgICAgIC8gXFwgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgICAgeCAgVDQgICAgICAgICAgICAgICAgICAgICAgICBUMiAgeSAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxyXG4gICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQzIFQ0XHJcbiAgICAqL1xyXG4gICAgLy8gSGFuZGxlcyBSaWdodC1SaWdodCBjYXNlIGFuZCBSaWdodC1MZWZ0IGNhc2UgaW4gcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciByaWdodCA9IHBhcmVudC5yaWdodDtcclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHJpZ2h0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRSaWdodEhpZ2ggPSByaWdodC5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJpZ2h0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IHRoaXNQYXJlbnRSaWdodEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heChNYXRoLm1heChyaWdodC5sZWZ0Lm1heCwgcmlnaHQucmlnaHQubWF4KSwgdGhpc1BhcmVudFJpZ2h0SGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgaXRzZWxmICh6KVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcGFyZW50ICh5IGluIGZpcnN0IGNhc2UsIHggaW4gc2Vjb25kKVxyXG4gICAgICAgIHBhcmVudC5tYXggPSBNYXRoLm1heChNYXRoLm1heChwYXJlbnQubGVmdC5tYXgsIHJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fbGVmdFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmlnaHRDaGlsZCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodENoaWxkLnBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodENoaWxkLnBhcmVudC5sZWZ0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyaWdodENoaWxkLnBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPSByaWdodENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodENoaWxkLmxlZnQ7XHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJpZ2h0Q2hpbGQubGVmdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSByaWdodENoaWxkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgcmlnaHRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fcmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGxlZnRDaGlsZCA9IHRoaXMubGVmdDtcclxuICAgICAgICBsZWZ0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gbGVmdENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGVmdENoaWxkLnBhcmVudC5sZWZ0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdENoaWxkLnJpZ2h0O1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVmdENoaWxkLnJpZ2h0ID0gdGhpcztcclxuICAgICAgICB0aGlzLnBhcmVudCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIGxlZnRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICAvLyBSZWJhbGFuY2VzIHRoZSB0cmVlIGlmIHRoZSBoZWlnaHQgdmFsdWUgYmV0d2VlbiB0d28gbm9kZXMgb2YgdGhlIHNhbWUgcGFyZW50IGlzIGdyZWF0ZXIgdGhhblxyXG4gICAgLy8gdHdvLiBUaGVyZSBhcmUgNCBjYXNlcyB0aGF0IGNhbiBoYXBwZW4gd2hpY2ggYXJlIG91dGxpbmVkIGluIHRoZSBncmFwaGljcyBhYm92ZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JlYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaGVpZ2h0KHRoaXMubGVmdCkgPj0gMiArIGhlaWdodCh0aGlzLnJpZ2h0KSkge1xyXG4gICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChsZWZ0LmxlZnQpID49IGhlaWdodChsZWZ0LnJpZ2h0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1MZWZ0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBMZWZ0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIGxlZnQuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KHRoaXMucmlnaHQpID49IDIgKyBoZWlnaHQodGhpcy5sZWZ0KSkge1xyXG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0KHJpZ2h0LnJpZ2h0KSA+PSBoZWlnaHQocmlnaHQubGVmdCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICByaWdodC5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAocmVjb3JkLmxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIGxlZnQgc3VidHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIHJpZ2h0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGFuY2VzdG9yIGlmIG5lZWRlZFxyXG4gICAgICAgIGlmICh0aGlzLm1heCA8IHJlY29yZC5oaWdoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBoZWlnaHQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAvLyBSZWJhbGFuY2UgdGhlIHRyZWUgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBPKGxvZ24pIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseVxyXG4gICAgICAgIC8vIGltcG9ydGFudCBpbiBzZWFyY2hpbmcsIGFzIHRoZSB0cmVlIGhhcyBhIGhpZ2ggY2hhbmNlIG9mIGRlZ2VuZXJhdGluZyB3aXRob3V0IHRoZSByZWJhbGFuY2luZ1xyXG4gICAgICAgIHRoaXMuX3JlYmFsYW5jZSgpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9nZXRPdmVybGFwcGluZ1JlY29yZHMgPSBmdW5jdGlvbiAoY3VycmVudE5vZGUsIGxvdywgaGlnaCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5rZXkgPD0gaGlnaCAmJiBsb3cgPD0gY3VycmVudE5vZGUuZ2V0Tm9kZUhpZ2goKSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlcyBhcmUgb3ZlcmxhcHBpbmcsIGNoZWNrIGlmIGluZGl2aWR1YWwgcmVjb3JkcyBpbiB0aGUgbm9kZSBhcmUgb3ZlcmxhcHBpbmdcclxuICAgICAgICAgICAgdmFyIHRlbXBSZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLnJlY29yZHNbaV0uaGlnaCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wUmVzdWx0cy5wdXNoKGN1cnJlbnROb2RlLnJlY29yZHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wUmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICAvLyBEb24ndCBzZWFyY2ggbm9kZXMgdGhhdCBkb24ndCBleGlzdFxyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVmdFNlYXJjaCA9IFtdO1xyXG4gICAgICAgIHZhciBvd25TZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgcmlnaHRTZWFyY2ggPSBbXTtcclxuICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCBwb2ludCBvZiBhbnkgaW50ZXJ2YWwgaW4gdGhpcyBub2RlIGFuZCBhbGwgaXRzXHJcbiAgICAgICAgLy8gY2hpbGRyZW4sIHRoZXJlIHdvbid0IGJlIGFueSBtYXRjaGVzXHJcbiAgICAgICAgaWYgKGxvdyA+IHRoaXMubWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VhcmNoIGxlZnQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sZWZ0Lm1heCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgbGVmdFNlYXJjaCA9IHRoaXMubGVmdC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhpcyBub2RlXHJcbiAgICAgICAgb3duU2VhcmNoID0gdGhpcy5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzKHRoaXMsIGxvdywgaGlnaCk7XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgaW50ZXJ2YWwsIHRoZW4gaXQgY2FuJ3QgYmUgaW4gYW55IGNoaWxkIHRvXHJcbiAgICAgICAgLy8gdGhlIHJpZ2h0XHJcbiAgICAgICAgaWYgKGhpZ2ggPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWFyY2ggcmlnaHQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0U2VhcmNoID0gdGhpcy5yaWdodC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmV0dXJuIGFjY3VtdWxhdGVkIHJlc3VsdHMsIGlmIGFueVxyXG4gICAgICAgIHJldHVybiBsZWZ0U2VhcmNoLmNvbmNhdChvd25TZWFyY2gsIHJpZ2h0U2VhcmNoKTtcclxuICAgIH07XHJcbiAgICAvLyBTZWFyY2hlcyBmb3IgYSBub2RlIGJ5IGEgYGtleWAgdmFsdWVcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaEV4aXN0aW5nID0gZnVuY3Rpb24gKGxvdykge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMua2V5ID09PSBsb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgbm9kZSBvZiB0aGUgc3VidHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX21pblZhbHVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChub2RlLmtleSA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgbGVmdCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5ID4gdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZSB0byBiZSByZW1vdmVkIGlzIG9uIHRoZSByaWdodCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgaGFzIHR3byBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgdmFyIG1pblZhbHVlID0gdGhpcy5yaWdodC5fbWluVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gbWluVmFsdWUua2V5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzID0gbWluVmFsdWUucmVjb3JkcztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZSh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gbGVmdCBzaWRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBOb2RlO1xyXG59KCkpO1xyXG5leHBvcnRzLk5vZGUgPSBOb2RlO1xyXG52YXIgSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPiByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dgIHZhbHVlIG11c3QgYmUgbG93ZXIgb3IgZXF1YWwgdG8gYGhpZ2hgIHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IFRyZWUgaXMgZW1wdHksIG5ldyBub2RlIGJlY29tZXMgcm9vdFxyXG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBuZXcgTm9kZSh0aGlzLCByZWNvcmQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBub2RlIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUga2V5XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290LnNlYXJjaEV4aXN0aW5nKHJlY29yZC5sb3cpO1xyXG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVjb3JkcyBpbiB0aGlzIG5vZGUgaWYgdGhlcmUgYWxyZWFkeSBpcyB0aGUgb25lIHdpdGggc2FtZSBsb3csIGhpZ2gsIGRhdGFcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZWNvcmQgaXMgc2FtZSBhcyB0aGUgb25lIHdlJ3JlIHRyeWluZyB0byBpbnNlcnQ7IHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlY29yZCB0byB0aGUgbm9kZVxyXG4gICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnB1c2gocmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID4gbm9kZS5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuIENhbGwgaW5zZXJ0IGZ1bmN0aW9uIG9uIHJvb3QncyBub2RlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgcmV0dXJuIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5OyBub3RoaW5nIHRvIHJlbW92ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucmVjb3Jkcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZFJlY29yZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBoYXMgMiBvciBtb3JlIHJlY29yZHMuIEZpbmQgdGhlIG9uZSB3ZSBuZWVkIGFuZCByZW1vdmUgaXRcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IG5vZGUucmVjb3Jkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRSZWNvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkUmVjb3JkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhhdCBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmhpZ2ggPT09IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSGlnaCA9IG5vZGUuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChNYXRoLm1heChub2RlLmxlZnQubWF4LCBub2RlLnJpZ2h0Lm1heCksIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubGVmdCA9PT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChub2RlLnJpZ2h0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBub2RlSGlnaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIG9ubHkgMSByZWNvcmQuIENoZWNrIGlmIHRoZSByZW1haW5pbmcgcmVjb3JkIGluIHRoaXMgbm9kZSBpc1xyXG4gICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbMF0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlLiBSZW1vdmUgdGhlIHdob2xlIG5vZGUgZnJvbSB0aGUgdHJlZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Qua2V5ID09PSBub2RlLmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSByZW1vdmluZyB0aGUgcm9vdCBlbGVtZW50LiBDcmVhdGUgYSBkdW1teSBub2RlIHRoYXQgd2lsbCB0ZW1wb3JhcmlseSB0YWtlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvb3QncyBwYXJlbnQgcm9sZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdFBhcmVudCA9IG5ldyBOb2RlKHRoaXMsIHsgbG93OiByZWNvcmQubG93LCBoaWdoOiByZWNvcmQubG93IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290UGFyZW50LmxlZnQgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSByb290UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290UGFyZW50LmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290LnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZSA9IHRoaXMucm9vdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgcmVjb3JkIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkcyBhdCBhbGwgaW4gdGhpcyBub2RlPyEgU2hvdWxkbid0IGhhcHBlblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJlT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLkludGVydmFsVHJlZSA9IEludGVydmFsVHJlZTtcclxudmFyIERhdGFJbnRlcnZhbFRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBEYXRhSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcclxuICAgIH1cclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluc2VydCh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnJlbW92ZSh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlYXJjaChsb3csIGhpZ2gpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi5kYXRhOyB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbk9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuaW5PcmRlcigpO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUucHJlT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUsIFwiY291bnRcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlLmNvdW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIERhdGFJbnRlcnZhbFRyZWU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IERhdGFJbnRlcnZhbFRyZWU7XHJcbnZhciBJbk9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW5PcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChzdGFydE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEluT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZFxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1pZ2h0IHBvcCB0aGUgbGFzdCBhbmQgc2V0IHRoaXMuY3VycmVudE5vZGUgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnROb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEluT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSW5PcmRlciA9IEluT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG52YXIgUHJlT3JkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBQcmVPcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gc3RhcnROb2RlO1xyXG4gICAgfVxyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZCxcclxuICAgICAgICAvLyB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gcmlnaHQgbm9kZSAoaS5lIHdlIGFyZSBkb25lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLmxlZnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xyXG4gICAgfTtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUHJlT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuUHJlT3JkZXIgPSBQcmVPcmRlcjtcclxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbm9kZS1pbnRlcnZhbC10cmVlL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NoYWxsb3dlcXVhbC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0UmFkaW9BcHBlYXJhbmNlKGRvYzogYW55KTogYW55IHtcbiAgICBjb25zdCBvbGRBcHBlYXJhbmNlRnVuY2l0aW9uOiBGdW5jdGlvbiA9IGRvYy5BY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWwgPSBmdW5jdGlvbihmb3JtT2JqZWN0OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeG9iajogYW55ID0gb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbihmb3JtT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgc3RyZWFtOiBzdHJpbmdbXSA9IHhvYmouc3RyZWFtLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgZW5jb2RlQ29sb3I6IHN0cmluZyA9IGRvYy5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgc3RyZWFtWzBdID0gc3RyZWFtWzBdICsgJ1xcbicgKyBlbmNvZGVDb2xvciArICdcXG4nICsgZW5jb2RlQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JlZEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBjb2xvcjogc3RyaW5nLCBwcml2YXRlIHJlbmRlcldpZHRoPzogbnVtYmVyLCBwcml2YXRlIHJlbmRlckhlaWdodD86IG51bWJlcikge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMuY29sb3IgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLnJlbmRlcldpZHRoID8/IHRoaXMud2lkdGgsIHRoaXMucmVuZGVySGVpZ2h0ID8/IHRoaXMuaGVpZ2h0LCAnRicpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcihvbGRGaWxsQ29sb3IpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29sb3JlZGJyaWNrLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIERlc2NyaXB0aW9uQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uLnRzIiwidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiBnbG9iYWwganNQREYgKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgV2VpZHQsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQmlnZ0E5NFxuICogXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5cbi8qKiBcbioganNQREYgQWNyb0Zvcm0gUGx1Z2luXG4qIEBtb2R1bGUgQWNyb0Zvcm1cbiovXG52YXIganNwZGYgPSByZXF1aXJlKCdqc3BkZicpO1xuKGZ1bmN0aW9uIChqc1BERiwgZ2xvYmFsT2JqKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGpzUERGQVBJID0ganNQREYuQVBJO1xuICAgIHZhciBzY29wZTtcbiAgICB2YXIgc2NhbGVGYWN0b3IgPSAxO1xuICAgIGZ1bmN0aW9uIHRvVW5pY29kZShzdHIpIHtcbiAgICAgICAgdmFyIHVuaWNvZGVTdHJpbmcgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0aGVVbmljb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB3aGlsZSAodGhlVW5pY29kZS5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICAgICAgdGhlVW5pY29kZSA9ICcwJyArIHRoZVVuaWNvZGU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdW5pY29kZVN0cmluZyArPSB0aGVVbmljb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnPEZFRkYnICsgdW5pY29kZVN0cmluZyArICc+JztcbiAgICB9XG4gICAgdmFyIHBkZkVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cXCgvZywgJ1xcXFwoJykucmVwbGFjZSgvXFwpL2csICdcXFxcKScpIH07XG4gICAgdmFyIHBkZlVuZXNjYXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpLnJlcGxhY2UoL1xcXFxcXCgvZywgJygnKS5yZXBsYWNlKC9cXFxcXFwpL2csICcpJyk7IH07XG4gICAgZnVuY3Rpb24gYXJyYXlUb1BkZlVuaWNvZGVBcnJheSh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJ1sgJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvVW5pY29kZSh2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9ICcgXSdcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFyIGYyID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoMik7IC8vIEllLCAlLjJmXG4gICAgfTtcblxuICAgIHZhciBmNSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDUpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICBqc1BERkFQSS5fX2Fjcm9mb3JtX18gPSB7fTtcbiAgICB2YXIgaW5oZXJpdCA9IGZ1bmN0aW9uIChjaGlsZCwgcGFyZW50KSB7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gICAgICAgIGNoaWxkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIH07XG5cbiAgICB2YXIgc2NhbGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gKHggKiBzY2FsZUZhY3Rvcik7XG4gICAgfTtcbiAgICB2YXIgYW50aVNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC8gc2NhbGVGYWN0b3IpO1xuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgeG9iaiA9IG5ldyBBY3JvRm9ybVhPYmplY3QoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHhvYmouQkJveCA9IFswLCAwLCBOdW1iZXIoZjIod2lkdGgpKSwgTnVtYmVyKGYyKGhlaWdodCkpXTtcbiAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQml0LU9wZXJhdGlvbnNcbiAgICAqL1xuICAgIHZhciBzZXRCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyIHx8IDA7XG4gICAgICAgIGJpdFBvc2l0aW9uID0gYml0UG9zaXRpb24gfHwgMDtcblxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciB8PSBiaXRNYXNrO1xuXG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfTtcblxuICAgIHZhciBjbGVhckJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdE1hc2sgPSAxIDw8IGJpdFBvc2l0aW9uO1xuXG4gICAgICAgIG51bWJlciAmPSB+Yml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmdldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG51bWJlciAmICgxIDw8IGJpdFBvc2l0aW9uKSkgPT09IDAgPyAwIDogMTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAqIEZmIHN0YXJ0cyBjb3VudGluZyB0aGUgYml0IHBvc2l0aW9uIGF0IDEgYW5kIG5vdCBsaWtlIGphdmFzY3JpcHQgYXQgMFxuICAgICovXG4gICAgdmFyIGdldEJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBzZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xlYXJCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2FsY3VsYXRlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUgPSB0aGlzLmludGVybmFsLmdldEhvcml6b250YWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgZ2V0VmVydGljYWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGU7XG4gICAgICAgIHZhciB4ID0gYXJnc1swXTtcbiAgICAgICAgdmFyIHkgPSBhcmdzWzFdO1xuICAgICAgICB2YXIgdyA9IGFyZ3NbMl07XG4gICAgICAgIHZhciBoID0gYXJnc1szXTtcblxuICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSB7fTtcblxuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWCA9IGdldEhvcml6b250YWxDb29yZGluYXRlKHgpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkgKyBoKSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy51cHBlclJpZ2h0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4ICsgdykgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9ZID0gZ2V0VmVydGljYWxDb29yZGluYXRlKHkpIHx8IDA7XG5cbiAgICAgICAgcmV0dXJuIFtOdW1iZXIoZjIoY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9ZKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1gpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSkpXTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZvcm1PYmplY3QuViAmJiAhZm9ybU9iamVjdC5EVikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSBjYWxjdWxhdGUgaXRcblxuICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgIHZhciB0ZXh0ID0gZm9ybU9iamVjdC5WIHx8IGZvcm1PYmplY3QuRFY7XG4gICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCB0ZXh0KTtcbiAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvVHggQk1DJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdxJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdCVCcpOyAvLyBCZWdpbiBUZXh0XG4gICAgICAgIHN0cmVhbS5wdXNoKHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJy8nICsgZm9udEtleSArICcgJyArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgJyBUZicpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnMSAwIDAgMSAwIDAgVG0nKTsvLyBUcmFuc2Zvcm1hdGlvbiBNYXRyaXhcbiAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VUJyk7IC8vIEVuZCBUZXh0ICAgIFxuICAgICAgICBzdHJlYW0ucHVzaCgnUScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnRU1DJyk7XG5cbiAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlWCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0LCB0ZXh0KSB7XG4gICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkgdGV4dCA9IGZvcm1PYmplY3QudHJ1ZVZhbHVlO1xuICAgICAgICAgdmFyIG1heEZvbnRTaXplID1cbiAgICAgICAgICAgIGZvcm1PYmplY3QuZm9udFNpemUgPT09IDAgPyBmb3JtT2JqZWN0Lm1heEZvbnRTaXplIDogZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0ge1xuICAgICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICAgIGZvbnRTaXplOiBcIlwiXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJlbW92ZSBCcmFja2V0c1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoMCwgMSkgPT0gXCIoXCIgPyB0ZXh0LnN1YnN0cigxKSA6IHRleHQ7XG4gICAgICAgIHRleHQgPVxuICAgICAgICAgICAgdGV4dC5zdWJzdHIodGV4dC5sZW5ndGggLSAxKSA9PSBcIilcIlxuICAgICAgICAgICAgPyB0ZXh0LnN1YnN0cigwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgICAgICAgICA6IHRleHQ7XG4gICAgICAgIC8vIHNwbGl0IGludG8gYXJyYXkgb2Ygd29yZHNcbiAgICAgICAgdmFyIHRleHRTcGxpdCA9IHRleHQuc3BsaXQoXCIgXCIpO1xuICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gd29yZC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHRleHRTcGxpdCA9IHRleHRTcGxpdC5tYXAoZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbYXJyLmpvaW4oXCIgXCIpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm9udFNpemUgPSBtYXhGb250U2l6ZTsgLy8gVGhlIFN0YXJ0aW5nIGZvbnRTaXplIChUaGUgTWF4aW11bSlcbiAgICAgICAgdmFyIGxpbmVTcGFjaW5nID0gMjtcbiAgICAgICAgdmFyIGJvcmRlclBhZGRpbmcgPSAyO1xuXG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIGhlaWdodCA9IGhlaWdodCA8IDAgPyAtaGVpZ2h0IDogaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgd2lkdGggPSB3aWR0aCA8IDAgPyAtd2lkdGggOiB3aWR0aDtcblxuICAgICAgICB2YXIgaXNTbWFsbGVyVGhhbldpZHRoID0gZnVuY3Rpb24oaSwgbGFzdExpbmUsIGZvbnRTaXplKSB7XG4gICAgICAgICAgICBpZiAoaSArIDEgPCB0ZXh0U3BsaXQubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gbGFzdExpbmUgKyBcIiBcIiArIHRleHRTcGxpdFtpICsgMV1bMF07XG4gICAgICAgICAgICB2YXIgVGV4dFdpZHRoID0gY2FsY3VsYXRlRm9udFNwYWNlKHRtcCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuICAgICAgICAgICAgdmFyIEZpZWxkV2lkdGggPSB3aWR0aCAtIDIgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgcmV0dXJuIFRleHRXaWR0aCA8PSBGaWVsZFdpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmb250U2l6ZSsrO1xuICAgICAgICBGb250U2l6ZTogd2hpbGUgKGZvbnRTaXplID4gMCkge1xuICAgICAgICAgICAgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBmb250U2l6ZS0tO1xuICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSBjYWxjdWxhdGVGb250U3BhY2UoXCIzXCIsIGZvcm1PYmplY3QsIGZvbnRTaXplKS5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgc3RhcnRZID0gZm9ybU9iamVjdC5tdWx0aWxpbmVcbiAgICAgICAgICAgID8gaGVpZ2h0IC0gZm9udFNpemVcbiAgICAgICAgICAgIDogKGhlaWdodCAtIHRleHRIZWlnaHQpIC8gMjtcbiAgICAgICAgICAgIHN0YXJ0WSArPSBsaW5lU3BhY2luZztcbiAgICAgICAgICAgIHZhciBzdGFydFg7XG5cbiAgICAgICAgICAgIHZhciBsYXN0WSA9IHN0YXJ0WTtcbiAgICAgICAgICAgIHZhciBmaXJzdFdvcmRJbkxpbmUgPSAwLFxuICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSAwO1xuICAgICAgICAgICAgdmFyIGxhc3RMZW5ndGg7XG4gICAgICAgICAgICB2YXIgY3VycldvcmQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoZm9udFNpemUgPD0gMCkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSwgdGhlIFRleHQgZG9lc24ndCBmaXQgYXQgYWxsXG4gICAgICAgICAgICBmb250U2l6ZSA9IDEyO1xuICAgICAgICAgICAgdGV4dCA9IFwiKC4uLikgVGpcXG5cIjtcbiAgICAgICAgICAgIHRleHQgKz1cbiAgICAgICAgICAgICAgICBcIiUgV2lkdGggb2YgVGV4dDogXCIgK1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUZvbnRTcGFjZSh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGggK1xuICAgICAgICAgICAgICAgIFwiLCBGaWVsZFdpZHRoOlwiICtcbiAgICAgICAgICAgICAgICB3aWR0aCArXG4gICAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbGFzdExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgdmFyIGxpbmVDb3VudCA9IDA7XG4gICAgICAgICAgICBMaW5lOiBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRTcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRleHRTcGxpdC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBpc1dpdGhOZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRTcGxpdFtpXS5sZW5ndGggIT09IDEgJiYgY3VycldvcmQgIT09IHRleHRTcGxpdFtpXS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF07XG4gICAgICAgICAgICAgICAgaXNXaXRoTmV3TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IHRleHRTcGxpdFtpXVtjdXJyV29yZF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lLnN1YnN0cihsYXN0TGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxhc3RMaW5lLnN1YnN0cigwLCBsYXN0TGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxhc3RMaW5lO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwYXJzZUludChpKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dExpbmVJc1NtYWxsZXIgPSBpc1NtYWxsZXJUaGFuV2lkdGgoa2V5LCBsYXN0TGluZSwgZm9udFNpemUpO1xuICAgICAgICAgICAgICAgIHZhciBpc0xhc3RXb3JkID0gaSA+PSB0ZXh0U3BsaXQubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZSArPSBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTGluZVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5leHRMaW5lSXNTbWFsbGVyICYmICFpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdvIG9uXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFdvcmRJbkxpbmUgPSBrZXk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm11bHRpbGluZSAmJlxuICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFRleHQgaXMgaGlnaGVyIHRoYW4gdGhlIEZpZWxkT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBibGFua1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IGZpcnN0V29yZEluTGluZTsgeCA8PSBsYXN0V29yZEluTGluZTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyTGluZSA9IHRleHRTcGxpdFt4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gbGFzdFdvcmRJbkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV29yZCA9IChjdXJyV29yZCArIDEpICUgY3VyckxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PT0gZmlyc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJMaW5lLmxlbmd0aCAtIDFdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lWzBdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcbiAgICAgICAgICAgICAgICBsaW5lID1cbiAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cihsaW5lLmxlbmd0aCAtIDEpID09IFwiIFwiXG4gICAgICAgICAgICAgICAgICAgID8gbGluZS5zdWJzdHIoMCwgbGluZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICA6IGxpbmU7XG4gICAgICAgICAgICAgICAgLy8gbGFzdExlbmd0aCAtPSBibGFua1NwYWNlLndpZHRoO1xuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSBjYWxjdWxhdGVGb250U3BhY2UobGluZSwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHN0YXJ0WFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybU9iamVjdC50ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gd2lkdGggLSBsYXN0TGVuZ3RoIC0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSAod2lkdGggLSBsYXN0TGVuZ3RoKSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRleHQgKz0gZjIoc3RhcnRYKSArIFwiIFwiICsgZjIobGFzdFkpICsgXCIgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0LmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9udExpc3QgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZm9udExpc3Rbc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkXSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRXNjYXBlOiBwZGZFc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udEtleTogc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzOiBmb250TGlzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVGb250U2l6ZTogZm9ybU9iamVjdC5mb250U2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgncG9zdFByb2Nlc3NUZXh0JywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJzwnICsgcGF5bG9hZC50ZXh0ICsgJz4gVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnKCcgKyBwZGZFc2NhcGUobGluZSkgKyAnKSBUalxcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlc2V0IFggaW4gUERGXG4gICAgICAgICAgICAgICAgdGV4dCArPSAtZjIoc3RhcnRYKSArIFwiIDAgVGRcXG5cIjtcblxuICAgICAgICAgICAgICAgIC8vIEFmdGVyIGEgTGluZSwgYWRqdXN0IHkgcG9zaXRpb25cbiAgICAgICAgICAgICAgICBsYXN0WSA9IC0oZm9udFNpemUgKyBsaW5lU3BhY2luZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXNldCBmb3IgbmV4dCBpdGVyYXRpb24gc3RlcFxuICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGZpcnN0V29yZEluTGluZSA9IGlzV2l0aE5ld0xpbmUgPyBsYXN0V29yZEluTGluZSA6IGxhc3RXb3JkSW5MaW5lICsgMTtcbiAgICAgICAgICAgICAgICBsaW5lQ291bnQrKztcblxuICAgICAgICAgICAgICAgIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBMaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5WYWx1ZS50ZXh0ID0gdGV4dDtcbiAgICAgICAgcmV0dXJuVmFsdWUuZm9udFNpemUgPSBmb250U2l6ZTtcblxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogU21hbGwgd29ya2Fyb3VuZCBmb3IgY2FsY3VsYXRpbmcgdGhlIFRleHRNZXRyaWMgYXBwcm94aW1hdGVseS5cbiAgICAqIFxuICAgICogQHBhcmFtIHRleHRcbiAgICAqIEBwYXJhbSBmb250c2l6ZVxuICAgICogQHJldHVybnMge1RleHRNZXRyaWNzfSAoSGFzIEhlaWdodCBhbmQgV2lkdGgpXG4gICAgKi9cbiAgICB2YXIgY2FsY3VsYXRlRm9udFNwYWNlID0gZnVuY3Rpb24gKHRleHQsIGZvcm1PYmplY3QsIGZvbnRTaXplKSB7XG4gICAgICAgIHZhciBmb250ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IHNjb3BlLmdldFN0cmluZ1VuaXRXaWR0aCh0ZXh0LCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgoXCIzXCIsIHsgZm9udDogZm9udCwgZm9udFNpemU6IHBhcnNlRmxvYXQoZm9udFNpemUpLCBjaGFyU3BhY2U6IDAgfSkgKiBwYXJzZUZsb2F0KGZvbnRTaXplKSAqIDEuNTtcbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0OiBoZWlnaHQsIHdpZHRoOiB3aWR0aCB9O1xuICAgIH07XG5cbiAgICB2YXIgYWNyb2Zvcm1QbHVnaW5UZW1wbGF0ZSA9IHtcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgICAgeEZvcm1zOiBbXSxcbiAgICAgICAgLyoqXG4gICAgICAgICogYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQWNyb0Zvcm1cbiAgICAgICAgKiBEaWN0aW9uYXJ5IDA6IFRoZSBFdmVudC1Ub2tlbiwgdGhlIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrIGhhc1xuICAgICAgICAqIDE6IFRoZSBPYmplY3QgSUQgb2YgdGhlIFJvb3RcbiAgICAgICAgKi9cbiAgICAgICAgYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdDogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICogQWZ0ZXIgdGhlIFBERiBnZXRzIGV2YWx1YXRlZCwgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBoYXMgdG8gYmVcbiAgICAgICAgKiByZXNldCwgdGhpcyBpbmRpY2F0ZXMsIHdoZXRoZXIgdGhlIHJvb3QgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkXG4gICAgICAgICogb3V0XG4gICAgICAgICovXG4gICAgICAgIHByaW50ZWRPdXQ6IGZhbHNlLFxuICAgICAgICBpbnRlcm5hbDogbnVsbCxcbiAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuXG4gICAgdmFyIGFubm90UmVmZXJlbmNlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzO1xuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3JtT2JqZWN0ID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgICAgIC8vc2V0IG9iaklkIHRvIHVuZGVmaW5lZCBhbmQgZm9yY2UgaXQgdG8gZ2V0IGEgbmV3IG9iaklkIG9uIGJ1aWxkRG9jdW1lbnRcbiAgICAgICAgICAgICAgICBmb3JtT2JqZWN0Lm9iaklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBBbm5vdCBSZWZlcmVuY2UhXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QuaGFzQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZXMgYW4gQW5ub3RhdGlvbiBXaWRnZXQgaW4gdGhlIEZvcm0gT2JqZWN0LCBwdXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBpbiB0aGUgL0Fubm90IGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFubm90YXRpb25SZWZlcmVuY2UuY2FsbChzY29wZSwgZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBwdXRGb3JtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCkge1xuICAgICAgICAgICAgaW5pdGlhbGl6ZUFjcm9Gb3JtLmNhbGwoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuRmllbGRzLnB1c2goZm9ybU9iamVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIENyZWF0ZSB0aGUgUmVmZXJlbmNlIHRvIHRoZSB3aWRnZXRBbm5vdGF0aW9uLCBzbyB0aGF0IGl0IGdldHMgcmVmZXJlbmNlZFxuICAgICogaW4gdGhlIEFubm90W10gaW50IHRoZSsgKFJlcXVpcmVzIHRoZSBBbm5vdGF0aW9uIFBsdWdpbilcbiAgICAqL1xuICAgIHZhciBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdyZWZlcmVuY2UnLFxuICAgICAgICAgICAgb2JqZWN0OiBvYmplY3RcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGZpbmRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gKGVudHJ5LnR5cGUgPT09IG9wdGlvbnMudHlwZSAmJiBlbnRyeS5vYmplY3QgPT09IG9wdGlvbnMub2JqZWN0KTsgfTtcbiAgICAgICAgaWYgKHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5maW5kKGZpbmRFbnRyeSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZ2V0UGFnZUluZm8ob2JqZWN0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FsbGJhY2tzXG5cbiAgICB2YXIgcHV0Q2F0YWxvZ0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQdXQgcmVmZXJlbmNlIHRvIEFjcm9Gb3JtIHRvIERvY3VtZW50Q2F0YWxvZ1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGZvciBzYWZldHksIHNob3VsZG4ndCBub3JtYWxseSBiZSB0aGUgY2FzZVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwud3JpdGUoJy9BY3JvRm9ybSAnICsgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCArICcgJyArIDAgKyAnIFInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHV0Q2F0YWxvZ0NhbGxiYWNrOiBSb290IG1pc3NpbmcuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBBZGRzIC9BY3JvZm9ybSBYIDAgUiB0byBEb2N1bWVudCBDYXRhbG9nLCBhbmQgY3JlYXRlcyB0aGUgQWNyb0Zvcm1cbiAgICAqIERpY3Rpb25hcnlcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy51bnN1YnNjcmliZShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEKTtcbiAgICAgICAgZGVsZXRlIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQ7XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnByaW50ZWRPdXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgdGhlIHNpbmdsZSBGaWVsZHMgYW5kIHdyaXRlcyB0aGVtIGludG8gdGhlIERvY3VtZW50XG4gICAgKiBcbiAgICAqIElmIGZpZWxkQXJyYXkgaXMgc2V0LCB1c2UgdGhlIGZpZWxkcyB0aGF0IGFyZSBpbnNpZGUgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICAqIGZpZWxkcyBmcm9tIHRoZSBBY3JvUm9vdCAoZm9yIHRoZSBGb3JtWE9iamVjdHMuLi4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlRmllbGRDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIHZhciBzdGFuZGFyZEZpZWxkcyA9ICghZmllbGRBcnJheSk7XG5cbiAgICAgICAgaWYgKCFmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGZpZWxkQXJyYXkgc3BlY2lmaWVkLCB3ZSB3YW50IHRvIHByaW50IG91dFxuICAgICAgICAgICAgLy8gdGhlIEZpZWxkcyBvZiB0aGUgQWNyb0Zvcm1cbiAgICAgICAgICAgIC8vIFByaW50IG91dCBSb290XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQsIHRydWUpO1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkQXJyYXkgPSBmaWVsZEFycmF5IHx8IHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuS2lkcztcblxuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqZWN0ID0gZmllbGRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG9sZFJlY3QgPSBmaWVsZE9iamVjdC5SZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LlJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IGNhbGN1bGF0ZUNvb3JkaW5hdGVzLmNhbGwodGhpcywgZmllbGRPYmplY3QuUmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5EQSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbShmaWVsZE9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QgPSBmaWVsZE9iamVjdC5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5SZWN0ID0gb2xkUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5oYXNBcHBlYXJhbmNlU3RyZWFtICYmICFmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgQXBwZWFyYW5jZVxuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IGNhbGN1bGF0ZUFwcGVhcmFuY2VTdHJlYW0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PC9OIFwiICsgYXBwZWFyYW5jZSArIFwiPj5cIiB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChhcHBlYXJhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgaXMgYSBBcnJheSB3aXRoIE4sUixEIChhdCBsZWFzdFxuICAgICAgICAgICAgICAgIC8vIG9uZSBvZiB0aGVtISlcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgTixSIGFuZCBEXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudC5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50W2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgayArIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPDxcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+PSAxIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2VTdHJlYW0gaXMgYW4gQXJyYXkgb3IgT2JqZWN0IVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gdmFsdWVbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgRnVuY3Rpb24gaXMgcmVmZXJlbmNlZCwgY2FsbCBpdCBpbiBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmogKyBcIiBcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBYRm9ybSBpcyBhbHJlYWR5IHVzZWQsIGUuZy4gT2ZmU3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBDaGVja0JveGVzLCBkb24ndCBhZGQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXIgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgRm9ybVhPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGkgKyBcIiBcIiArIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKG9iaikgPj0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMucHVzaChvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IFwiPj5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGEgbm9ybWFsIE9iamVjdC4uXG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiAnQVAnLCB2YWx1ZTogXCI8PFxcblwiICsgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArIFwiPj5cIiB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oeyBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG5cbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIik7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhbmRhcmRGaWVsZHMpIHtcbiAgICAgICAgICAgIGNyZWF0ZVhGb3JtT2JqZWN0Q2FsbGJhY2suY2FsbCh0aGlzLCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrID0gZnVuY3Rpb24gKGZpZWxkQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBpO1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgV3JpdGluZyB0aGUgT2JqZWN0XG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihmaWVsZE9iamVjdCAmJiBmaWVsZE9iamVjdC5vYmpJZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkT2JqZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBmaWVsZE9iamVjdC5wdXRTdHJlYW0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5wdXRTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGZpZWxkQXJyYXlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaW5pdGlhbGl6ZUFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID09PSB1bmRlZmluZWQgfHwgdGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID09PSBmYWxzZSkpIHtcblxuICAgICAgICAgICAgc2NvcGUgPSB0aGlzO1xuXG4gICAgICAgICAgICBBY3JvRm9ybUZpZWxkLkZpZWxkTnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgQWNyb2Zvcm1EaWN0aW9uYXJ5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhbGVGYWN0b3IgPSBzY29wZS5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgIC8vIFRoZSBPYmplY3QgTnVtYmVyIG9mIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbmV3IEFjcm9Gb3JtRGljdGlvbmFyeSgpO1xuXG4gICAgICAgICAgICAvLyBhZGQgQ2FsbGJhY2sgZm9yIGNyZWF0aW5nIHRoZSBBY3JvRm9ybSBEaWN0aW9uYXJ5XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEID0gc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncG9zdFB1dFJlc291cmNlcycsIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYnVpbGREb2N1bWVudCcsIGFubm90UmVmZXJlbmNlQ2FsbGJhY2spOyAvLyBidWlsZERvY3VtZW50XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50LCB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBEb2N1bWVudENhdGFsb2cgaXNcbiAgICAgICAgICAgIC8vIHdyaXR0ZW4sIGluIG9yZGVyIHRvIGFkZCAvQWNyb0Zvcm1cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3B1dENhdGFsb2cnLCBwdXRDYXRhbG9nQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBjcmVhdGVzIGFsbCBGaWVsZHNcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRQYWdlcycsIGNyZWF0ZUZpZWxkQ2FsbGJhY2spO1xuXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgMjYsIDcuMy42XG4gICAgdmFyIGFycmF5VG9QZGZBcnJheSA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9ICdbJztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgYXJyYXlbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXS5zdWJzdHIoMCwgMSkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJygnICsgcGRmRXNjYXBlKGFycmF5W2ldLnRvU3RyaW5nKCkpICsgJyknO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGFycmF5W2ldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ICs9ICddJztcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheScpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0TWF0Y2hlcyhzdHJpbmcsIHJlZ2V4LCBpbmRleCkge1xuICAgICAgICBpbmRleCB8fCAoaW5kZXggPSAxKTsgLy8gZGVmYXVsdCB0byB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgd2hpbGUgKG1hdGNoID0gcmVnZXguZXhlYyhzdHJpbmcpKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9XG4gICAgdmFyIHBkZkFycmF5VG9TdHJpbmdBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGdldE1hdGNoZXMoYXJyYXksIC9cXCgoLio/KVxcKS9nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB2YXIgdG9QZGZTdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiO1xuICAgICAgICBzdHJpbmcudG9TdHJpbmcoKTtcbiAgICAgICAgc3RyaW5nID0gJygnICsgcGRmRXNjYXBlKHN0cmluZykgKyAnKSc7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gICAgLy8gQ2xhc3Nlc1xuICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVBERk9iamVjdFxuICAgICogQGNsYXNzZGVzYyBBIEFjcm9Gb3JtUERGT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QREZPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfb2JqSWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1QREZPYmplY3Qjb2JqSWRcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ29iaklkJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfb2JqSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX29iaklkID0gc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYmpJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29iaklkID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBmdW5jdGlvbiBBY3JvRm9ybVBERk9iamVjdC50b1N0cmluZ1xuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYmpJZCArIFwiIDAgUlwiO1xuICAgIH07XG5cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUucHV0U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gdGhpcy5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0oKTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgZGF0YTogdGhpcy5zdHJlYW0sIGFkZGl0aW9uYWxLZXlWYWx1ZXM6IGtleVZhbHVlTGlzdCB9KTtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgYW4ga2V5LXZhbHVlLUxpc3Qgb2YgYWxsIG5vbi1jb25maWd1cmFibGUgVmFyaWFibGVzIGZyb20gdGhlIE9iamVjdFxuICAgICogXG4gICAgKiBAbmFtZSBnZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW1cbiAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgKi9cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRlS2V5VmFsdWVMaXN0RnJvbUZpZWxkT2JqZWN0ID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWVMaXN0ID0gW107XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZpZWxkT2JqZWN0KS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoa2V5ICE9ICdjb250ZW50JyAmJiBrZXkgIT0gJ2FwcGVhcmFuY2VTdHJlYW1Db250ZW50JyAmJiBrZXkuc3Vic3RyaW5nKDAsIDEpICE9IFwiX1wiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGtleXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmaWVsZE9iamVjdCwga2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvciAmJiBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGRPYmplY3Rba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogYXJyYXlUb1BkZkFycmF5KHZhbHVlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBY3JvRm9ybVBERk9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgaXQgaXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBQREZPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSB0aGUgcmVmZXJlbmNlIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZS5vYmpJZCArIFwiIDAgUlwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlWYWx1ZUxpc3Q7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCh0aGlzKTtcbiAgICB9O1xuXG4gICAgdmFyIEFjcm9Gb3JtWE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9YT2JqZWN0XCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIi9Gb3JtXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm9ybVR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9CQm94ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQkJveCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0JCb3g7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQkJveCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1Jlc291cmNlcycsIHtcbiAgICAgICAgICAgIHZhbHVlOiBcIjIgMCBSXCIsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfc3RyZWFtO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RyZWFtID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3RyZWFtO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1YT2JqZWN0LCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9LaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGaWVsZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQXBwZWFyYW5jZVxuICAgICAgICB2YXIgX0RBO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfREEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIF9EQSArICcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0RBID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRGljdGlvbmFyeSwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgRmllbGQgT2JqZWN0IGNvbnRhaW5zIHRoZSBWYXJpYWJsZXMsIHRoYXQgZXZlcnkgRmllbGQgbmVlZHNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtRmllbGRcbiAgICAqIEBjbGFzc2Rlc2MgQW4gQWNyb0Zvcm0gRmllbGRPYmplY3RcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vQW5ub3RhdGlvbi1GbGFnIFNlZSBUYWJsZSAxNjVcbiAgICAgICAgdmFyIF9GID0gNDtcbiAgICAgICAgdGhpcy5pc1VuaWNvZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cnVlVmFsdWUgPSAnJztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjIpIElmIHNldCwgcHJpbnQgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgcGFnZSBpcyBwcmludGVkLiBJZiBjbGVhciwgbmV2ZXIgcHJpbnQgdGhlIGFubm90YXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIGlzIGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLiBcbiAgICAgICAgKiBOT1RFIDIgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbm5vdGF0aW9ucyByZXByZXNlbnRpbmcgaW50ZXJhY3RpdmUgcHVzaGJ1dHRvbnMsIHdoaWNoIHdvdWxkIHNlcnZlIG5vIG1lYW5pbmdmdWwgcHVycG9zZSBvbiB0aGUgcHJpbnRlZCBwYWdlLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNzaG93V2hlblByaW50ZWRcbiAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2hvd1doZW5QcmludGVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZihfRiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IHNldEJpdEZvclBkZihfRiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GID0gY2xlYXJCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9GZiA9IDA7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZmO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0ZmID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRmYgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1JlY3QgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9SZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1JlY3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1JlY3QgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3gnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMF0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB5LXBvc2l0aW9uIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjeVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3knLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMV0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMV0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3dpZHRoXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnd2lkdGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFsyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbMl0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbMl0gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoZWlnaHRcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoZWlnaHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfUmVjdCB8fCBpc05hTihfUmVjdFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX1JlY3RbM10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1JlY3RbM10gPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRlQgPSBcIlwiO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0ZUXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9CdG4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvVHgnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQ2gnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcvU2lnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9GVCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGVCBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfVCA9IG51bGw7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9UIHx8IF9ULmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIENoaWxkIGZyb20gYSBSYWRpb8K0R3JvdXAsIHlvdSBkb24ndCBuZWVkIGEgRmllbGROYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9UID0gXCJGaWVsZE9iamVjdFwiICsgKEFjcm9Gb3JtRmllbGQuRmllbGROdW0rKyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBwZGZFc2NhcGUoX1QpICsgJyknO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBwYXJ0aWFsIGZpZWxkIG5hbWUgKHNlZSAxMi43LjMuMiwg4oCcRmllbGQgTmFtZXPigJ0pLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmaWVsZE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmaWVsZE5hbWUnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9UO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1QgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250TmFtZSA9ICdoZWx2ZXRpY2EnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udE5hbWUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udE5hbWVcbiAgICAgICAgKiBAZGVmYXVsdCAnaGVsdmV0aWNhJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udE5hbWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250TmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250TmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFN0eWxlIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTdHlsZVxuICAgICAgICAqIEBkZWZhdWx0ICdub3JtYWwnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U3R5bGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250U3R5bGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFN0eWxlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udFNpemUgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX2ZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9tYXhGb250U2l6ZSA9IDUwO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgbWF4aW11bSBmb250U2l6ZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNtYXhGb250U2l6ZVxuICAgICAgICAqIEBkZWZhdWx0IDAgKGZvciBhdXRvKVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWF4Rm9udFNpemUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfbWF4Rm9udFNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX21heEZvbnRTaXplID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2NvbG9yID0gJ2JsYWNrJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSB0ZXh0XG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2NvbG9yXG4gICAgICAgICogQGRlZmF1bHQgJ2JsYWNrJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd8cmdiYX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2xvcicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2NvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfREEgPSAnL0YxIDAgVGYgMCBnJztcbiAgICAgICAgLy8gRGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIChOZWVkZWQgZm9yIHZhcmlhYmxlIFRleHQpXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnREEnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUNoaWxkQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfREEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHZhciBfRFYgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfRFYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RWKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX0RWID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIGRlZmF1bHQgdmFsdWUgdG8gd2hpY2ggdGhlIGZpZWxkIHJldmVydHMgd2hlbiBhIHJlc2V0LWZvcm0gYWN0aW9uIGlzIGV4ZWN1dGVkIChzZWUgMTIuNy41LjMsIOKAnFJlc2V0LUZvcm0gQWN0aW9u4oCdKS4gVGhlIGZvcm1hdCBvZiB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNkZWZhdWx0VmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkZWZhdWx0VmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfRFYuc3Vic3RyKDEsIF9EVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9EVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9EViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9WID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdWJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFfVikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB0b1VuaWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRydWVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cigwLCAxKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfViA9IHBkZlVuZXNjYXBlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBmaWVsZOKAmXMgdmFsdWUsIHdob3NlIGZvcm1hdCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlLiBTZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiBpbmRpdmlkdWFsIGZpZWxkIHR5cGVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdmFsdWVcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2YWx1ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZlVuZXNjYXBlKF9WLnN1YnN0cigxLCBfVi5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2sgaWYgZmllbGQgaGFzIGFubm90YXRpb25zXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0Fubm90YXRpb25cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBbm5vdGF0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5SZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUeXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9Bbm5vdFwiIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdTdWJ0eXBlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzQW5ub3RhdGlvbikgPyBcIi9XaWRnZXRcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgKiB0cnVlIGlmIGZpZWxkIGhhcyBhbiBhcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hhc0FwcGVhcmFuY2VTdHJlYW1cbiAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBcHBlYXJhbmNlU3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfaGFzQXBwZWFyYW5jZVN0cmVhbTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHBhZ2Ugb24gd2hpY2ggdGhlIEFjcm9Gb3JtRmllbGQgaXMgcGxhY2VkXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3BhZ2VcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICB2YXIgX3BhZ2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGFnZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9wYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgdXNlciBtYXkgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbnkgYXNzb2NpYXRlZCB3aWRnZXQgYW5ub3RhdGlvbnMgd2lsbCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgdXNlcjsgdGhhdCBpcywgdGhleSB3aWxsIG5vdCByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2UgdGhlaXIgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZSBtb3Rpb25zLiBUaGlzIGZsYWcgaXMgdXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBvciBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZWFkT25seVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVhZE9ubHknLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGhhdmUgYSB2YWx1ZSBhdCB0aGUgdGltZSBpdCBpcyBleHBvcnRlZCBieSBhIHN1Ym1pdGZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIOKAnFN1Ym1pdC1Gb3JtIEFjdGlvbuKAnSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNyZXF1aXJlZFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVxdWlyZWQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBleHBvcnRlZCBieSBhIHN1Ym1pdC1mb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI25vRXhwb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub0V4cG9ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX1EgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1EnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1E7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoWzAsIDEsIDJdLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBfUSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIFEgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBBIGNvZGUgc3BlY2lmeWluZyB0aGUgZm9ybSBvZiBxdWFkZGluZyAoanVzdGlmaWNhdGlvbikgdGhhdCBzaGFsbCBiZSB1c2VkIGluIGRpc3BsYXlpbmcgdGhlIHRleHQ6XG4gICAgICAgICogJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN0ZXh0QWxpZ25cbiAgICAgICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RleHRBbGlnbicsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfUSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3JpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtRmllbGQsIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNob2ljZUZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIC8vIEZpZWxkIFR5cGUgPSBDaG9pY2UgRmllbGRcbiAgICAgICAgdGhpcy5GVCA9IFwiL0NoXCI7XG4gICAgICAgIC8vIG9wdGlvbnNcbiAgICAgICAgdGhpcy5WID0gJygpJztcblxuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgICAgIC8vIFRvcCBJbmRleFxuICAgICAgICB2YXIgX1RJID0gMDtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1RJJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1LIGZpeCBmb3IgQWNyb2JhdFxuICAgICAgICB2YXIgX01LID0gJzw8IC9CRyBbIDAuOTc1IDAuOTc1IDAuOTc1IF0gID4+JztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBzY3JvbGxhYmxlIGxpc3QgYm94ZXMsIHRoZSB0b3AgaW5kZXggKHRoZSBpbmRleCBpbiB0aGUgT3B0IGFycmF5IG9mIHRoZSBmaXJzdCBvcHRpb24gdmlzaWJsZSBpbiB0aGUgbGlzdCkuIERlZmF1bHQgdmFsdWU6IDAuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCN0b3BJbmRleFxuICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RvcEluZGV4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVEk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVEkgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9PcHQgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdPcHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1BkZlVuaWNvZGVBcnJheShfT3B0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZBcnJheShfT3B0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9PcHQgPSBwZGZBcnJheVRvU3RyaW5nQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgZ2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEByZXR1cm5zIHthcnJheX0gYXJyYXkgb2YgT3B0aW9uc1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX09wdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgc2V0T3B0aW9uc1xuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7YXJyYXl9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgX09wdCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBhZGRPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZGRPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIF9PcHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHJlbW92ZU9wdGlvblxuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsRW50cmllcyAoZGVmYXVsdDogZmFsc2UpXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBhbGxFbnRyaWVzKSB7XG4gICAgICAgICAgICBhbGxFbnRyaWVzID0gYWxsRW50cmllcyB8fCBmYWxzZVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICB3aGlsZSAoX09wdC5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNwbGljZShfT3B0LmluZGV4T2YodmFsdWUpLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRW50cmllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgY29tYm8gYm94OyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgbGlzdCBib3guIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21ib1xuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYm8nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE4KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGNvbWJvIGJveCBzaGFsbCBpbmNsdWRlIGFuIGVkaXRhYmxlIHRleHQgYm94IGFzIHdlbGwgYXMgYSBkcm9wLWRvd24gbGlzdDsgaWYgY2xlYXIsIGl0IHNoYWxsIGluY2x1ZGUgb25seSBhIGRyb3AtZG93biBsaXN0LiBUaGlzIGZsYWcgc2hhbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBDb21ibyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2VkaXRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VkaXQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tYm8gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgc2hhbGwgYmUgc29ydGVkIGFscGhhYmV0aWNhbGx5LiBUaGlzIGZsYWcgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB3cml0ZXJzLCBub3QgYnkgcmVhZGVycy4gQ29uZm9ybWluZyByZWFkZXJzIHNoYWxsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIE9wdCBhcnJheSAoc2VlIFRhYmxlIDIzMSkuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNzb3J0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzb3J0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgbW9yZSB0aGFuIG9uZSBvZiB0aGUgZmllbGTigJlzIG9wdGlvbiBpdGVtcyBtYXkgYmUgc2VsZWN0ZWQgc2ltdWx0YW5lb3VzbHk7IGlmIGNsZWFyLCBhdCBtb3N0IG9uZSBpdGVtIHNoYWxsIGJlIHNlbGVjdGVkIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNtdWx0aVNlbGVjdFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbXVsdGlTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMik7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGxjaGVja2VkLiBUaGlzIGZsYWcgc2hhbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBDb21ibyBhbmQgRWRpdCBmbGFncyBhcmUgYm90aCBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U3BlbGxDaGVjaycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIG5ldyB2YWx1ZSBzaGFsbCBiZSBjb21taXR0ZWQgYXMgc29vbiBhcyBhIHNlbGVjdGlvbiBpcyBtYWRlIChjb21tb25seSB3aXRoIHRoZSBwb2ludGluZyBkZXZpY2UpLiBJbiB0aGlzIGNhc2UsIHN1cHBseWluZyBhIHZhbHVlIGZvciBhIGZpZWxkIGludm9sdmVzIHRocmVlIGFjdGlvbnM6IHNlbGVjdGluZyB0aGUgZmllbGQgZm9yIGZpbGwtaW4sIHNlbGVjdGluZyBhIGNob2ljZSBmb3IgdGhlIGZpbGwtaW4gdmFsdWUsIGFuZCBsZWF2aW5nIHRoYXQgZmllbGQsIHdoaWNoIGZpbmFsaXplcyBvciDigJxjb21taXRz4oCdIHRoZSBkYXRhIGNob2ljZSBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeSBvciBjaGFuZ2luZyBvZiB0aGlzIGRhdGEuIElmIHRoaXMgZmxhZyBpcyBvbiwgdGhlbiBwcm9jZXNzaW5nIGRvZXMgbm90IHdhaXQgZm9yIGxlYXZpbmcgdGhlIGZpZWxkIGFjdGlvbiB0byBvY2N1ciwgYnV0IGltbWVkaWF0ZWx5IHByb2NlZWRzIHRvIHRoZSB0aGlyZCBzdGVwLlxuICAgICAgICAqIFRoaXMgb3B0aW9uIGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYW4gYWN0aW9uIG9uY2UgYSBzZWxlY3Rpb24gaXMgbWFkZSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhpdCB0aGUgZmllbGQuIElmIGNsZWFyLCB0aGUgbmV3IHZhbHVlIGlzIG5vdCBjb21taXR0ZWQgdW50aWwgdGhlIHVzZXIgZXhpdHMgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNjb21taXRPblNlbENoYW5nZVxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tbWl0T25TZWxDaGFuZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdGhpcy5oYXNBcHBlYXJhbmNlU3RyZWFtID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hvaWNlRmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1MaXN0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNob2ljZUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcblxuICAgICAgICAvL1BERiAzMjAwMC0xOjIwMDgsIHBhZ2UgNDQ0XG4gICAgICAgIHRoaXMuY29tYm8gPSBmYWxzZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1MaXN0Qm94LCBBY3JvRm9ybUNob2ljZUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ29tYm9Cb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNvbWJvQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUxpc3RCb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb21ibyA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ29tYm9Cb3gsIEFjcm9Gb3JtTGlzdEJveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUVkaXRCb3ggXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNvbWJvQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUVkaXRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQ29tYm9Cb3guY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1FZGl0Qm94LCBBY3JvRm9ybUNvbWJvQm94KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1CdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9IFwiL0J0blwiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSYWRpbyBidXR0b25zIG9ubHkpIElmIHNldCwgZXhhY3RseSBvbmUgcmFkaW8gYnV0dG9uIHNoYWxsIGJlIHNlbGVjdGVkIGF0IGFsbCB0aW1lczsgc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnV0dG9uIGhhcyBubyBlZmZlY3QuIElmIGNsZWFyLCBjbGlja2luZyB0aGUgc2VsZWN0ZWQgYnV0dG9uIGRlc2VsZWN0cyBpdCwgbGVhdmluZyBubyBidXR0b24gc2VsZWN0ZWQuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jbm9Ub2dnbGVUb09mZlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25vVG9nZ2xlVG9PZmYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnM7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBjaGVja2JveC4gVGhpcyBmbGFnIG1heSBiZSBzZXQgb25seSBpZiB0aGUgUHVzaGJ1dHRvbiBmbGFnIGlzIGNsZWFyLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb1xuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JhZGlvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHB1c2hidXR0b24gdGhhdCBkb2VzIG5vdCByZXRhaW4gYSBwZXJtYW5lbnQgdmFsdWUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcHVzaEJ1dHRvblxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3B1c2hCdXR0b24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE3KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyB3aXRoaW4gYSByYWRpbyBidXR0b24gZmllbGQgdGhhdCB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZSBvbiBzdGF0ZSB3aWxsIHR1cm4gb24gYW5kIG9mZiBpbiB1bmlzb247IHRoYXQgaXMgaWYgb25lIGlzIGNoZWNrZWQsIHRoZXkgYXJlIGFsbCBjaGVja2VkLiBJZiBjbGVhciwgdGhlIGJ1dHRvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAodGhlIHNhbWUgYmVoYXZpb3IgYXMgSFRNTCByYWRpbyBidXR0b25zKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3JhZGlvSXNVbmlzb25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpb0lzVW5pc29uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX01LKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPDwnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLycgKyBrZXkgKyAnICgnICsgX01LW2tleV0gKyAnKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogRnJvbSB0aGUgUERGIHJlZmVyZW5jZTpcbiAgICAgICAgKiAoT3B0aW9uYWwsIGJ1dHRvbiBmaWVsZHMgb25seSkgVGhlIHdpZGdldCBhbm5vdGF0aW9uJ3Mgbm9ybWFsIGNhcHRpb24gd2hpY2ggc2hhbGwgYmUgZGlzcGxheWVkIHdoZW4gaXQgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuIFxuICAgICAgICAqIFVubGlrZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgbGlzdGVkIGluIHRoaXMgVGFibGUgd2hpY2ggYXBwbHkgb25seSB0byB3aWRnZXQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHB1c2hidXR0b24gZmllbGRzIChzZWUgUHVzaGJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSwgdGhlIENBIGVudHJ5IG1heSBiZSB1c2VkIHdpdGggYW55IHR5cGUgb2YgYnV0dG9uIGZpZWxkLCBpbmNsdWRpbmcgY2hlY2sgYm94ZXMgKHNlZSBDaGVjayBCb3hlcyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpIGFuZCByYWRpbyBidXR0b25zIChSYWRpbyBCdXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikuXG4gICAgICAgICpcbiAgICAgICAgKiAtICc4JyA9IENyb3NzLCBcbiAgICAgICAgKiAtICdsJyA9ICBDaXJjbGUsXG4gICAgICAgICogLSAnJyA9IG5vdGhpbmdcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNjYXB0aW9uXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjYXB0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUsuQ0EgfHwgJyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSy5DQSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9BUztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdBUycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQnV0dG9uLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUHVzaEJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVB1c2hCdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUHVzaEJ1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1SYWRpb0J1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVJhZGlvQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnJhZGlvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wdXNoQnV0dG9uID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIF9LaWRzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnS2lkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9LaWRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1SYWRpb0J1dHRvbiwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgQ2hpbGQgY2xhc3Mgb2YgYSBSYWRpb0J1dHRvbiAodGhlIHJhZGlvR3JvdXApIC0+IFRoZSBzaW5nbGUgQnV0dG9uc1xuICAgICogXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAaWdub3JlXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaGlsZENsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIF9wYXJlbnQ7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUGFyZW50Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJlbnQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfcGFyZW50ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfb3B0aW9uTmFtZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvcHRpb25OYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbk5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01LID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBfTUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz4+Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSZXF1aXJlZCBpZiB0aGUgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5IEFQIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1YmRpY3Rpb25hcmllczsgUERGIDEuMikgVGhlIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0YXRlLCB3aGljaCBzZWxlY3RzIHRoZSBhcHBsaWNhYmxlIGFwcGVhcmFuY2Ugc3RyZWFtIGZyb20gYW4gYXBwZWFyYW5jZSBzdWJkaWN0aW9uYXJ5IChzZWUgU2VjdGlvbiAxMi41LjUsIFwiQXBwZWFyYW5jZSBTdHJlYW1zXCIpXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNhcHBlYXJhbmNlU3RhdGVcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2FwcGVhcmFuY2VTdGF0ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTLnN1YnN0cigxLCBfQVMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9ICdsJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RhdGUgPSAnT2ZmJztcbiAgICAgICAgLy8gdG9kbzogc2V0IEFwcGVhcmFuY2VUeXBlIGFzIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHNldCBmcm9tIHRoZVxuICAgICAgICAvLyBvdXRzaWRlLi4uXG4gICAgICAgIHRoaXMuX0FwcGVhcmFuY2VUeXBlID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZTtcbiAgICAgICAgLy8gVGhlIERlZmF1bHQgYXBwZWFyYW5jZVR5cGUgaXMgdGhlIENpcmNsZVxuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gdGhpcy5fQXBwZWFyYW5jZVR5cGUuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh0aGlzLm9wdGlvbk5hbWUpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoaWxkQ2xhc3MsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgQWNyb0Zvcm1SYWRpb0J1dHRvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIGlmICghKCdjcmVhdGVBcHBlYXJhbmNlU3RyZWFtJyBpbiBhcHBlYXJhbmNlICYmICdnZXRDQScgaW4gYXBwZWFyYW5jZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGFzc2lnbiBBcHBlYXJhbmNlIHRvIFJhZGlvQnV0dG9uLiBBcHBlYXJhbmNlIHdhcyBJbnZhbGlkIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBvYmpJZCBpbiB0aGlzLktpZHMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLktpZHMuaGFzT3duUHJvcGVydHkob2JqSWQpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5LaWRzW29iaklkXTtcbiAgICAgICAgICAgICAgICBjaGlsZC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IGFwcGVhcmFuY2UuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbShjaGlsZC5vcHRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICBjaGlsZC5jYXB0aW9uID0gYXBwZWFyYW5jZS5nZXRDQSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLmNyZWF0ZU9wdGlvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgQ2hpbGQgZm9yIFJhZGlvR3JvdXBcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IEFjcm9Gb3JtQ2hpbGRDbGFzcygpO1xuICAgICAgICBjaGlsZC5QYXJlbnQgPSB0aGlzO1xuICAgICAgICBjaGlsZC5vcHRpb25OYW1lID0gbmFtZTtcbiAgICAgICAgLy8gQWRkIHRvIFBhcmVudFxuICAgICAgICB0aGlzLktpZHMucHVzaChjaGlsZCk7XG5cbiAgICAgICAgYWRkRmllbGQuY2FsbCh0aGlzLCBjaGlsZCk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNoZWNrQm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hlY2tCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnMyc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09uJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiT25cIjtcbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKCk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hlY2tCb3gsIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtVGV4dEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1UZXh0RmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5GVCA9ICcvVHgnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIGxpbmVzIG9mIHRleHQ7IGlmIGNsZWFyLCB0aGUgZmllbGTigJlzIHRleHQgc2hhbGwgYmUgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBsaW5lLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI211bHRpbGluZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpbGluZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgcmVwcmVzZW50cyB0aGUgcGF0aG5hbWUgb2YgYSBmaWxlIHdob3NlIGNvbnRlbnRzIHNoYWxsIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNmaWxlU2VsZWN0XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmlsZVNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNwZWxsQ2hlY2tcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3Qgc2Nyb2xsIChob3Jpem9udGFsbHkgZm9yIHNpbmdsZS1saW5lIGZpZWxkcywgdmVydGljYWxseSBmb3IgbXVsdGlwbGUtbGluZSBmaWVsZHMpIHRvIGFjY29tbW9kYXRlIG1vcmUgdGV4dCB0aGFuIGZpdHMgd2l0aGluIGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gT25jZSB0aGUgZmllbGQgaXMgZnVsbCwgbm8gZnVydGhlciB0ZXh0IHNoYWxsIGJlIGFjY2VwdGVkIGZvciBpbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmc7IGZvciBub25pbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmcsIHRoZSBmaWxsZXIgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gYWRkIG1vcmUgY2hhcmFjdGVyIHRoYW4gd2lsbCB2aXNpYmx5IGZpdCBpbiB0aGUgZGVmaW5lZCBhcmVhLiBcbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNkb05vdFNjcm9sbFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U2Nyb2xsJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgTWF5IGJlIHNldCBvbmx5IGlmIHRoZSBNYXhMZW4gZW50cnkgaXMgcHJlc2VudCBpbiB0aGUgdGV4dCBmaWVsZCBkaWN0aW9uYXJ5IChzZWUgVGFibGUgMjI5KSBhbmQgaWYgdGhlIE11bHRpbGluZSwgUGFzc3dvcmQsIGFuZCBGaWxlU2VsZWN0IGZsYWdzIGFyZSBjbGVhci4gSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgYmUgYXV0b21hdGljYWxseSBkaXZpZGVkIGludG8gYXMgbWFueSBlcXVhbGx5IHNwYWNlZCBwb3NpdGlvbnMsIG9yIGNvbWJzLCBhcyB0aGUgdmFsdWUgb2YgTWF4TGVuLCBhbmQgdGhlIHRleHQgaXMgbGFpZCBvdXQgaW50byB0aG9zZSBjb21icy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNjb21iXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29tYicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgYSByaWNoIHRleHQgc3RyaW5nIChzZWUgMTIuNy4zLjQsIOKAnFJpY2ggVGV4dCBTdHJpbmdz4oCdKS4gSWYgdGhlIGZpZWxkIGhhcyBhIHZhbHVlLCB0aGUgUlYgZW50cnkgb2YgdGhlIGZpZWxkIGRpY3Rpb25hcnkgKFRhYmxlIDIyMikgc2hhbGwgc3BlY2lmeSB0aGUgcmljaCB0ZXh0IHN0cmluZy5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNyaWNoVGV4dFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JpY2hUZXh0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX01heExlbiA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTWF4TGVuJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9NYXhMZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBmaWVsZOKAmXMgdGV4dCwgaW4gY2hhcmFjdGVycy4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtYXhMZW5ndGhcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heExlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01heExlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuViB8fCB0aGlzLkRWKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1UZXh0RmllbGQsIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QYXNzd29yZEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1UZXh0RmllbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgZW50ZXJpbmcgYSBzZWN1cmUgcGFzc3dvcmQgdGhhdCBzaG91bGQgbm90IGJlIGVjaG9lZCB2aXNpYmx5IHRvIHRoZSBzY3JlZW4uIENoYXJhY3RlcnMgdHlwZWQgZnJvbSB0aGUga2V5Ym9hcmQgc2hhbGwgaW5zdGVhZCBiZSBlY2hvZWQgaW4gc29tZSB1bnJlYWRhYmxlIGZvcm0sIHN1Y2ggYXMgYXN0ZXJpc2tzIG9yIGJ1bGxldCBjaGFyYWN0ZXJzLlxuICAgICAgICAqIE5PVEUgVG8gcHJvdGVjdCBwYXNzd29yZCBjb25maWRlbnRpYWxpdHksIHJlYWRlcnMgc2hvdWxkIG5ldmVyIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgUERGIGZpbGUgaWYgdGhpcyBmbGFnIGlzIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNwYXNzd29yZFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Bhc3N3b3JkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCwgQWNyb0Zvcm1UZXh0RmllbGQpO1xuXG5cbiAgICAvLyBDb250YWlucyBNZXRob2RzIGZvciBjcmVhdGluZyBzdGFuZGFyZCBhcHBlYXJhbmNlc1xuICAgIHZhciBBY3JvRm9ybUFwcGVhcmFuY2UgPSB7XG4gICAgICAgIENoZWNrQm94OiB7XG4gICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIE46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzTm9ybWFsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guWWVzUHVzaERvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICBPZmY6IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9uIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCBmb3JtT2JqZWN0LmNhcHRpb24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQk1DXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCAxIHJnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRVRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRU1DXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoKSArIFwiIFwiICsgZjIoaGVpZ2h0KSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKHdpZHRoIC0gMSkgKyBcIiBcIiArIGYyKGhlaWdodCAtIDEpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiL1wiICsgZm9udEtleSArIFwiIFwiICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyBcIiBUZiBcIiArIGVuY29kZWRDb2xvcik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgT2ZmIEFwcGVhcmFuY2UgZm9yIGEgQ2hlY2tCb3hcbiAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmFkaW9CdXR0b246IHtcbiAgICAgICAgICAgIENpcmNsZToge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2ZmJzogQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzUHVzaERvd247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldENBOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbCc7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgUmFkaXVzIG9mIHRoZSBDaXJjbGUgcmVsYXRpdmUgdG8gbWluKGhlaWdodCwgd2lkdGgpIG9mIGZvcm1PYmplY3RcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgPyBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0M7XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXNCZXppZXIgPSBOdW1iZXIoKERvdFJhZGl1cyAqIGMpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICogVGhlIEZvbGxvd2luZyBpcyBhIENpcmNsZSBjcmVhdGVkIHdpdGggQmV6aWVyLUN1cnZlcy5cbiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIFwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIFwiICsga2MgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBcIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgLVwiICsgayArIFwiIFwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgLVwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGtjICsgXCIgLVwiICsgayArIFwiIFwiICsgayArIFwiIC1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgLVwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIERvdFJhZGl1cyA9IE51bWJlcigoRG90UmFkaXVzICogMC45KS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZXN1bHRzIGZvciBsYXRlciB1c2U7IG5vIG5lZWQgdG8gd2FzdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yIHRpY2tzIG9uIGRvaW5nIG1hdGhcbiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDIpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2MgPSBOdW1iZXIoKGsgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBDcm9zczoge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgKiBDcmVhdGVzIHRoZSBBY3R1YWwgQXBwZWFyYW5jZURpY3Rpb25hcnktUmVmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgICAgICAgICAgICAgICogQGlnbm9yZVxuICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5PZmZQdXNoRG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE46IHt9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lk5bbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzTm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5EW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzgnXG4gICAgICAgICAgICAgICAgfSxcblxuXG4gICAgICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDEgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLSAyKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAtIDIpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54MS54KSArIFwiIFwiICsgZjIoY3Jvc3MueDEueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54Mi54KSArIFwiIFwiICsgZjIoY3Jvc3MueDIueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54NC54KSArIFwiIFwiICsgZjIoY3Jvc3MueDQueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54My54KSArIFwiIFwiICsgZjIoY3Jvc3MueDMueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcm9zcyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyhmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBBcHBlYXJhbmNlXG4gICAgICAgICAgKiBcbiAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBTZXQgSGVsdmV0aWNhIHRvIFN0YW5kYXJkIEZvbnQgKHNpemU6IGF1dG8pXG4gICAgICAgICAgICAvLyBDb2xvcjogQmxhY2tcbiAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICB2YXIgZm9udFNpemUgPSBmb3JtT2JqZWN0LmZvbnRTaXplO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvJyArIGZvbnRLZXkgKyAnICcgKyBmb250U2l6ZSArICcgVGYgJyArIGVuY29kZWRDb2xvcjtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsID0ge1xuICAgICAgICBCZXppZXJfQzogMC41NTE5MTUwMjQ0OTQsXG5cbiAgICAgICAgY2FsY3VsYXRlQ3Jvc3M6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG5cbiAgICAgICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgdmFyIGEgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgICAgdmFyIGNyb3NzID0ge1xuICAgICAgICAgICAgICAgIHgxOiB7IC8vIHVwcGVyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKSArIGEsLy8gaGVpZ2h0IC0gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDI6IHsgLy8gbG93ZXJSaWdodFxuICAgICAgICAgICAgICAgICAgICB4OiAoKHdpZHRoIC0gYSkgLyAyKSArIGEsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgzOiB7IC8vIGxvd2VyTGVmdFxuICAgICAgICAgICAgICAgICAgICB4OiAod2lkdGggLSBhKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKS8vIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHg0OiB7IC8vIHVwcGVyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gY3Jvc3M7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzY2FsZShmb3JtT2JqZWN0LlJlY3RbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBQdWJsaWM6XG5cbiAgICAvKipcbiAgICAqIEFkZCBhbiBBY3JvRm9ybS1GaWVsZCB0byB0aGUganNQREYtaW5zdGFuY2VcbiAgICAqXG4gICAgKiBAbmFtZSBhZGRGaWVsZFxuICAgICogQGZ1bmN0aW9uIFxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRPYmplY3RcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqL1xuICAgIHZhciBhZGRGaWVsZCA9IGpzUERGQVBJLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkT2JqZWN0KSB7XG4gICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGlmIChmaWVsZE9iamVjdCBpbnN0YW5jZW9mIEFjcm9Gb3JtRmllbGQpIHtcbiAgICAgICAgICAgIHB1dEZvcm0uY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkT2JqZWN0LnBhZ2UgPSBzY29wZS5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRCdXR0b25cbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQnV0dG9ufSBvcHRpb25zXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQnV0dG9uID0gZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgICAgICBpZiAoYnV0dG9uIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZEJ1dHRvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCBidXR0b24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZFRleHRGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1UZXh0RmllbGR9IHRleHRGaWVsZFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZFRleHRGaWVsZCA9IGZ1bmN0aW9uICh0ZXh0RmllbGQpIHtcbiAgICAgICAgaWYgKHRleHRGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtVGV4dEZpZWxkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRUZXh0RmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgdGV4dEZpZWxkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRDaG9pY2VGaWVsZFxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1DaG9pY2VGaWVsZH0gXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkQ2hvaWNlRmllbGQgPSBmdW5jdGlvbiAoY2hvaWNlRmllbGQpIHtcbiAgICAgICAgaWYgKGNob2ljZUZpZWxkIGluc3RhbmNlb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkQ2hvaWNlRmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgY2hvaWNlRmllbGQpO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbE9iaiA9PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiTGlzdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDb21ib0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJFZGl0Qm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNoZWNrQm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlRleHRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJQYXNzd29yZEZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICBnbG9iYWxPYmpbXCJDaG9pY2VGaWVsZFwiXSA9IEFjcm9Gb3JtQ2hvaWNlRmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIkxpc3RCb3hcIl0gPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkNvbWJvQm94XCJdID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSA9IEFjcm9Gb3JtRWRpdEJveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQnV0dG9uXCJdID0gQWNyb0Zvcm1CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlB1c2hCdXR0b25cIl0gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIlJhZGlvQnV0dG9uXCJdID0gQWNyb0Zvcm1SYWRpb0J1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hlY2tCb3hcIl0gPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0gPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSA9IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZDtcblxuICAgICAgICAvLyBiYWNrd2FyZHNDb21wYXRpYmlsaXR5XG4gICAgICAgIGdsb2JhbE9ialtcIkFjcm9Gb3JtXCJdID0geyBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJBY3JvRm9ybS1DbGFzc2VzIGFyZSBub3QgcG9wdWxhdGVkIGludG8gZ2xvYmFsLW5hbWVzcGFjZSwgYmVjYXVzZSB0aGUgY2xhc3MtTmFtZXMgZXhpc3QgYWxyZWFkeS4gVGhpcyBhdm9pZHMgY29uZmxpY3RzIHdpdGggdGhlIGFscmVhZHkgdXNlZCBmcmFtZXdvcmsuXCIpO1xuICAgIH1cblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hvaWNlRmllbGQgPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtTGlzdEJveCA9IEFjcm9Gb3JtTGlzdEJveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUNvbWJvQm94ID0gQWNyb0Zvcm1Db21ib0JveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUVkaXRCb3ggPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1CdXR0b24gPSBBY3JvRm9ybUJ1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVB1c2hCdXR0b24gPSBBY3JvRm9ybVB1c2hCdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1DaGVja0JveCA9IEFjcm9Gb3JtQ2hlY2tCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1UZXh0RmllbGQgPSBBY3JvRm9ybVRleHRGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1BcHBlYXJhbmNlID0gQWNyb0Zvcm1BcHBlYXJhbmNlO1xuXG4gICAganNQREZBUEkuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG5cbiAgICBqc1BERi5BY3JvRm9ybSA9IHtcbiAgICAgICAgQ2hvaWNlRmllbGQ6IEFjcm9Gb3JtQ2hvaWNlRmllbGQsXG4gICAgICAgIExpc3RCb3g6IEFjcm9Gb3JtTGlzdEJveCxcbiAgICAgICAgQ29tYm9Cb3g6IEFjcm9Gb3JtQ29tYm9Cb3gsXG4gICAgICAgIEVkaXRCb3g6IEFjcm9Gb3JtRWRpdEJveCxcbiAgICAgICAgQnV0dG9uOiBBY3JvRm9ybUJ1dHRvbixcbiAgICAgICAgUHVzaEJ1dHRvbjogQWNyb0Zvcm1QdXNoQnV0dG9uLFxuICAgICAgICBSYWRpb0J1dHRvbjogQWNyb0Zvcm1SYWRpb0J1dHRvbixcbiAgICAgICAgQ2hlY2tCb3g6IEFjcm9Gb3JtQ2hlY2tCb3gsXG4gICAgICAgIFRleHRGaWVsZDogQWNyb0Zvcm1UZXh0RmllbGQsXG4gICAgICAgIFBhc3N3b3JkRmllbGQ6IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxcbiAgICAgICAgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlXG4gICAgfTtcbn0pKGpzcGRmLmpzUERGLCAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIiAgLyoqXG4gICAqIGpzUERGIGZyb21IVE1MIHBsdWdpbi4gQkVUQSBzdGFnZS4gQVBJIHN1YmplY3QgdG8gY2hhbmdlLiBOZWVkcyBicm93c2VyXG4gICAqIENvcHlyaWdodCAoYykgMjAxMiBXaWxsb3cgU3lzdGVtcyBDb3Jwb3JhdGlvbiwgd2lsbG93LXN5c3RlbXMuY29tXG4gICAqICAgICAgICAgICAgICAgMjAxNCBKdWFuIFBhYmxvIEdhdmlyaWEsIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFucGdhdmlyaWFcbiAgICogICAgICAgICAgICAgICAyMDE0IERpZWdvIENhc29ycmFuLCBodHRwczovL2dpdGh1Yi5jb20vZGllZ29jclxuICAgKiAgICAgICAgICAgICAgIDIwMTQgRGFuaWVsIEh1c2FyLCBodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsaHVzYXJcbiAgICogICAgICAgICAgICAgICAyMDE0IFdvbGZnYW5nIEdhc3NsZXIsIGh0dHBzOi8vZ2l0aHViLmNvbS93b29sZmdcbiAgICogICAgICAgICAgICAgICAyMDE0IFN0ZXZlbiBTcHVuZ2luLCBodHRwczovL2dpdGh1Yi5jb20vZmxhbWVuY29cbiAgICpcbiAgICogQGxpY2Vuc2VcbiAgICogXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAqL1xuICB2YXIganNwZGYgPSByZXF1aXJlKFwianNwZGZcIik7XG5cbiAgKGZ1bmN0aW9uIChqc1BERkFQSSkge1xuICAgIHZhciBjbG9uZSwgX0RyaWxsRm9yQ29udGVudCwgRm9udE5hbWVEQiwgRm9udFN0eWxlTWFwLCBUZXh0QWxpZ25NYXAsIEZvbnRXZWlnaHRNYXAsIEZsb2F0TWFwLCBDbGVhck1hcCwgR2V0Q1NTLCBQdXJnZVdoaXRlU3BhY2UsIFJlbmRlcmVyLCBSZXNvbHZlRm9udCwgUmVzb2x2ZVVuaXRlZE51bWJlciwgVW5pdGVkTnVtYmVyTWFwLCBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSwgaW1hZ2VzLCBsb2FkSW1ncywgY2hlY2tGb3JGb290ZXIsIHByb2Nlc3MsIHRhYmxlVG9Kc29uO1xuXG4gICAgY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBDbG9uZS5wcm90b3R5cGUgPSBvYmo7XG4gICAgICAgIHJldHVybiBuZXcgQ2xvbmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIENsb25lKCkge31cbiAgICB9KCk7XG5cbiAgICBQdXJnZVdoaXRlU3BhY2UgPSBmdW5jdGlvbiBQdXJnZVdoaXRlU3BhY2UoYXJyYXkpIHtcbiAgICAgIHZhciBmcmFnbWVudCwgaSwgbCwgbFRyaW1tZWQsIHIsIHJUcmltbWVkLCB0cmFpbGluZ1NwYWNlO1xuICAgICAgaSA9IDA7XG4gICAgICBsID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBsVHJpbW1lZCA9IGZhbHNlO1xuICAgICAgclRyaW1tZWQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCFsVHJpbW1lZCAmJiBpICE9PSBsKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltTGVmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGxUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgaSA9IGwgLSAxO1xuXG4gICAgICB3aGlsZSAobCAmJiAhclRyaW1tZWQgJiYgaSAhPT0gLTEpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXSA9IGFycmF5W2ldLnRyaW1SaWdodCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIHJUcmltbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGktLTtcbiAgICAgIH1cblxuICAgICAgciA9IC9cXHMrJC9nO1xuICAgICAgdHJhaWxpbmdTcGFjZSA9IHRydWU7XG4gICAgICBpID0gMDtcblxuICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgLy8gTGVhdmUgdGhlIGxpbmUgYnJlYWtzIGludGFjdFxuICAgICAgICBpZiAoYXJyYXlbaV0gIT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldLnJlcGxhY2UoL1xccysvZywgXCIgXCIpO1xuXG4gICAgICAgICAgaWYgKHRyYWlsaW5nU3BhY2UpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQudHJpbUxlZnQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgIHRyYWlsaW5nU3BhY2UgPSByLnRlc3QoZnJhZ21lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFycmF5W2ldID0gZnJhZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIgPSBmdW5jdGlvbiBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSB7XG4gICAgICB0aGlzLnBkZiA9IHBkZjtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOyAvL2xpc3Qgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZSBjYWxsZWQgYWZ0ZXIgZWFjaCBlbGVtZW50LXJlbmRlcmluZyBwcm9jZXNzXG5cbiAgICAgIHRoaXMud2F0Y2hGdW5jdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFJlc29sdmVGb250ID0gZnVuY3Rpb24gUmVzb2x2ZUZvbnQoY3NzX2ZvbnRfZmFtaWx5X3N0cmluZykge1xuICAgICAgdmFyIG5hbWUsIHBhcnQsIHBhcnRzO1xuICAgICAgbmFtZSA9IHZvaWQgMDtcbiAgICAgIHBhcnRzID0gY3NzX2ZvbnRfZmFtaWx5X3N0cmluZy5zcGxpdChcIixcIik7XG4gICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcblxuICAgICAgd2hpbGUgKCFuYW1lICYmIHBhcnQpIHtcbiAgICAgICAgbmFtZSA9IEZvbnROYW1lREJbcGFydC50cmltKCkudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9O1xuXG4gICAgUmVzb2x2ZVVuaXRlZE51bWJlciA9IGZ1bmN0aW9uIFJlc29sdmVVbml0ZWROdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZykge1xuICAgICAgLy9JRTggaXNzdWVzXG4gICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9PT0gXCJhdXRvXCIgPyBcIjBweFwiIDogY3NzX2xpbmVfaGVpZ2h0X3N0cmluZztcblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcImVtXCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJlbVwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpICogMTguNzE5ICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5pbmRleE9mKFwicHRcIikgPiAtMSAmJiAhaXNOYU4oTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcInB0XCIsIFwiXCIpKSkpIHtcbiAgICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkgKiAxLjMzMyArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbCwgdW5kZWYsIHZhbHVlO1xuICAgICAgdW5kZWYgPSB2b2lkIDA7XG4gICAgICBub3JtYWwgPSAxNi4wMDtcbiAgICAgIHZhbHVlID0gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHtcbiAgICAgICAgXCJ4eC1zbWFsbFwiOiA5LFxuICAgICAgICBcIngtc21hbGxcIjogMTEsXG4gICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgbWVkaXVtOiAxNixcbiAgICAgICAgbGFyZ2U6IDE5LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjMsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMjgsXG4gICAgICAgIGF1dG86IDBcbiAgICAgIH1bY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ107XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWYpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPSBwYXJzZUZsb2F0KGNzc19saW5lX2hlaWdodF9zdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSBjc3NfbGluZV9oZWlnaHRfc3RyaW5nLm1hdGNoKC8oW1xcZFxcLl0rKShweCkvKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSAxO1xuICAgIH07XG5cbiAgICBHZXRDU1MgPSBmdW5jdGlvbiBHZXRDU1MoZWxlbWVudCkge1xuICAgICAgdmFyIGNzcywgdG1wLCBjb21wdXRlZENTU0VsZW1lbnQ7XG5cbiAgICAgIGNvbXB1dGVkQ1NTRWxlbWVudCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICB2YXIgY29tcENTUztcblxuICAgICAgICBjb21wQ1NTID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsLnN0eWxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfShlbCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvLVxcRC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY29tcENTU1twcm9wXTtcbiAgICAgICAgfTtcbiAgICAgIH0oZWxlbWVudCk7XG5cbiAgICAgIGNzcyA9IHt9O1xuICAgICAgdG1wID0gdm9pZCAwO1xuICAgICAgY3NzW1wiZm9udC1mYW1pbHlcIl0gPSBSZXNvbHZlRm9udChjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LWZhbWlseVwiKSkgfHwgXCJ0aW1lc1wiO1xuICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IEZvbnRTdHlsZU1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXN0eWxlXCIpXSB8fCBcIm5vcm1hbFwiO1xuICAgICAgY3NzW1widGV4dC1hbGlnblwiXSA9IFRleHRBbGlnbk1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJ0ZXh0LWFsaWduXCIpXSB8fCBcImxlZnRcIjtcbiAgICAgIHRtcCA9IEZvbnRXZWlnaHRNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC13ZWlnaHRcIildIHx8IFwibm9ybWFsXCI7XG5cbiAgICAgIGlmICh0bXAgPT09IFwiYm9sZFwiKSB7XG4gICAgICAgIGlmIChjc3NbXCJmb250LXN0eWxlXCJdID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gdG1wICsgY3NzW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjc3NbXCJmb250LXNpemVcIl0gPSBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtc2l6ZVwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImxpbmUtaGVpZ2h0XCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJsaW5lLWhlaWdodFwiKSkgfHwgMTtcbiAgICAgIGNzc1tcImRpc3BsYXlcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJkaXNwbGF5XCIpID09PSBcImlubGluZVwiID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgICAgIHRtcCA9IGNzc1tcImRpc3BsYXlcIl0gPT09IFwiYmxvY2tcIjtcbiAgICAgIGNzc1tcIm1hcmdpbi10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLWJvdHRvbVwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXRvcFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctdG9wXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWJvdHRvbVwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tcmlnaHRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLWxlZnRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLWxlZnRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1yaWdodFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZ2UtYnJlYWstYmVmb3JlXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwicGFnZS1icmVhay1iZWZvcmVcIikgfHwgXCJhdXRvXCI7IC8vZmxvYXQgYW5kIGNsZWFyaW5nIG9mIGZsb2F0c1xuXG4gICAgICBjc3NbXCJmbG9hdFwiXSA9IEZsb2F0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNzc0Zsb2F0XCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNsZWFyXCJdID0gQ2xlYXJNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiY2xlYXJcIildIHx8IFwibm9uZVwiO1xuICAgICAgY3NzW1wiY29sb3JcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJjb2xvclwiKTtcbiAgICAgIHJldHVybiBjc3M7XG4gICAgfTtcblxuICAgIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlID0gZnVuY3Rpb24gZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGhhbmRsZXJzLCBpLCBpc0hhbmRsZWRFbHNld2hlcmUsIGwsIGNsYXNzTmFtZXM7XG4gICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBmYWxzZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbXCIjXCIgKyBlbGVtZW50LmlkXTtcblxuICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1tlbGVtZW50Lm5vZGVOYW1lXTtcblxuICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIFRyeSBjbGFzcyBuYW1lc1xuXG5cbiAgICAgIGNsYXNzTmFtZXMgPSB0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnID8gZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSA6IFtdO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1snLicgKyBjbGFzc05hbWVzW2ldXTtcblxuICAgICAgICBpZiAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBoYW5kbGVycykge1xuICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0hhbmRsZWRFbHNld2hlcmU7XG4gICAgfTtcblxuICAgIHRhYmxlVG9Kc29uID0gZnVuY3Rpb24gdGFibGVUb0pzb24odGFibGUsIHJlbmRlcmVyKSB7XG4gICAgICB2YXIgZGF0YSwgaGVhZGVycywgaSwgaiwgcm93RGF0YSwgdGFibGVSb3csIHRhYmxlX29iaiwgdGFibGVfd2l0aCwgY2VsbCwgbDtcbiAgICAgIGRhdGEgPSBbXTtcbiAgICAgIGhlYWRlcnMgPSBbXTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IDA7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgbCArPSB0YWJsZS5yb3dzWzBdLmNlbGxzW2pdLmNvbFNwYW47XG4gICAgICB9XG4gICAgICB0YWJsZV93aXRoID0gdGFibGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjZWxsID0gdGFibGUucm93c1swXS5jZWxsc1tpXTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNlbGwuY29sU3BhbjsgaisrKSB7XG4gICAgICAgICAgaGVhZGVyc1tpICsgal0gPSB7XG4gICAgICAgICAgICBuYW1lOiBjZWxsLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJykgKyAnXycgKyBqLFxuICAgICAgICAgICAgcHJvbXB0OiBjZWxsLnRleHRDb250ZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJycpLFxuICAgICAgICAgICAgd2lkdGg6IGNlbGwuY2xpZW50V2lkdGggLyB0YWJsZV93aXRoICogcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLyBjZWxsLmNvbFNwYW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSBqO1xuICAgICAgfVxuXG4gICAgICBpID0gMTtcblxuICAgICAgd2hpbGUgKGkgPCB0YWJsZS5yb3dzLmxlbmd0aCkge1xuICAgICAgICB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07XG4gICAgICAgIHJvd0RhdGEgPSB7fTtcbiAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCB0YWJsZVJvdy5jZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dEYXRhW2hlYWRlcnNbal0ubmFtZV0gPSB0YWJsZVJvdy5jZWxsc1tqXS50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnB1c2gocm93RGF0YSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlX29iaiA9IHtcbiAgICAgICAgcm93czogZGF0YSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIFNraXBOb2RlID0ge1xuICAgICAgU0NSSVBUOiAxLFxuICAgICAgU1RZTEU6IDEsXG4gICAgICBOT1NDUklQVDogMSxcbiAgICAgIE9CSkVDVDogMSxcbiAgICAgIEVNQkVEOiAxLFxuICAgICAgU0VMRUNUOiAxXG4gICAgfTtcbiAgICB2YXIgbGlzdENvdW50ID0gMTtcblxuICAgIF9EcmlsbEZvckNvbnRlbnQgPSBmdW5jdGlvbiBEcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGNuLCBjbnMsIGZyYWdtZW50Q1NTLCBpLCBpc0Jsb2NrLCBsLCB0YWJsZTJqc29uLCBjYjtcbiAgICAgIGNucyA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgIGNuID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDU1MgPSBHZXRDU1MoZWxlbWVudCk7XG4gICAgICBpc0Jsb2NrID0gZnJhZ21lbnRDU1MuZGlzcGxheSA9PT0gXCJibG9ja1wiO1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KCk7XG4gICAgICAgIHJlbmRlcmVyLnNldEJsb2NrU3R5bGUoZnJhZ21lbnRDU1MpO1xuICAgICAgfVxuICAgICAgaSA9IDA7XG4gICAgICBsID0gY25zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIGNuID0gY25zW2ldO1xuXG4gICAgICAgIGlmICh0eXBlb2YoY24pID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy9leGVjdXRlIGFsbCB3YXRjaGVyIGZ1bmN0aW9ucyB0byBlLmcuIHJlc2V0IGZsb2F0aW5nXG4gICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAvKioqIEhFQURFUiByZW5kZXJpbmcgKiovXG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDEgJiYgY24ubm9kZU5hbWUgPT09ICdIRUFERVInKSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gY247IC8vc3RvcmUgb2xkIHRvcCBtYXJnaW5cblxuICAgICAgICAgICAgdmFyIG9sZE1hcmdpblRvcCA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vc3Vic2NyaWJlIGZvciBuZXcgcGFnZSBldmVudCBhbmQgcmVuZGVyIGhlYWRlciBmaXJzdCBvbiBldmVyeSBwYWdlXG5cbiAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgZnVuY3Rpb24gKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgICAgIC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRNYXJnaW5Ub3A7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGhlYWRlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IG1hcmdpbiB0byBvbGQgbWFyZ2luICsgcmVuZGVyZWQgaGVhZGVyICsgMTAgc3BhY2UgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuICAgICAgICAgICAgICAvL2ltcG9ydGFudCBmb3Igb3RoZXIgcGx1Z2lucyAoZS5nLiB0YWJsZSkgdG8gc3RhcnQgcmVuZGVyaW5nIGF0IGNvcnJlY3QgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyXG5cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wID0gcmVuZGVyZXIueSArIDEwO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjbi5ub2RlVHlwZSA9PT0gOCAmJiBjbi5ub2RlTmFtZSA9PT0gXCIjY29tbWVudFwiKSB7XG4gICAgICAgICAgICBpZiAofmNuLnRleHRDb250ZW50LmluZGV4T2YoXCJBRERfUEFHRVwiKSkge1xuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtjbi5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgIC8qKiogSU1BR0UgUkVOREVSSU5HICoqKi9cbiAgICAgICAgICAgIHZhciBjYWNoZWRfaW1hZ2U7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICB2YXIgdXJsID0gY24uZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSBpbWFnZXNbKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkX2ltYWdlKSB7XG4gICAgICAgICAgICAgIGlmIChyZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgcmVuZGVyZXIueSArIGNuLmhlaWdodCAmJiByZW5kZXJlci55ID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCkge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vY2hlY2sgaWYgd2UgaGF2ZSB0byBzZXQgYmFjayBzb21lIHZhbHVlcyBkdWUgdG8gZS5nLiBoZWFkZXIgcmVuZGVyaW5nIGZvciBuZXcgcGFnZVxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBpbWFnZXNDU1MgPSBHZXRDU1MoY24pO1xuICAgICAgICAgICAgICB2YXIgaW1hZ2VYID0gcmVuZGVyZXIueDtcbiAgICAgICAgICAgICAgdmFyIGZvbnRUb1VuaXRSYXRpbyA9IDEyIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yOyAvL2RlZmluZSBhZGRpdGlvbmFsIHBhZGRpbmdzLCBtYXJnaW5zIHdoaWNoIGhhdmUgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciBtYXJnaW4gY2FsY3VsYXRpb25zXG5cbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUxlZnQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWxlZnRcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLWxlZnRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlUmlnaHQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXJpZ2h0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1yaWdodFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VUb3AgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXRvcFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctdG9wXCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSA9IChpbWFnZXNDU1NbXCJtYXJnaW4tYm90dG9tXCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1ib3R0b21cIl0pICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIGZsb2F0IGlzIHNldCB0byByaWdodCwgbW92ZSB0aGUgaW1hZ2UgdG8gdGhlIHJpZ2h0IGJvcmRlclxuICAgICAgICAgICAgICAvL2FkZCBzcGFjZSBpZiBtYXJnaW4gaXMgc2V0XG5cbiAgICAgICAgICAgICAgaWYgKGltYWdlc0NTU1snZmxvYXQnXSAhPT0gdW5kZWZpbmVkICYmIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtIGNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VYICs9IGFkZGl0aW9uYWxTcGFjZUxlZnQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkSW1hZ2UoY2FjaGVkX2ltYWdlLCBpbWFnZVgsIHJlbmRlcmVyLnkgKyBhZGRpdGlvbmFsU3BhY2VUb3AsIGNuLndpZHRoLCBjbi5oZWlnaHQpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSB1bmRlZmluZWQ7IC8vaWYgdGhlIGZsb2F0IHByb3AgaXMgc3BlY2lmaWVkIHdlIGhhdmUgdG8gZmxvYXQgdGhlIHRleHQgYXJvdW5kIHRoZSBpbWFnZVxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcgfHwgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBmdW5jdGlvbnQgdG8gc2V0IGJhY2sgY29vcmRpbmF0ZXMgYWZ0ZXIgaW1hZ2UgcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoZGlmZlgsIHRocmVzaG9sZFksIGRpZmZXaWR0aCwgZWwpIHtcbiAgICAgICAgICAgICAgICAgIC8vdW5kbyBkcmF3aW5nIGJveCBhZGFwdGlvbnMgd2hpY2ggd2VyZSBzZXQgYnkgZmxvYXRpbmdcbiAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci55ID49IHRocmVzaG9sZFkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgIVNraXBOb2RlW2VsLm5vZGVOYW1lXSAmJiByZW5kZXJlci54ICsgZWwud2lkdGggPiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MubGVmdCArIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci54ICs9IGRpZmZYO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gdGhyZXNob2xkWTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcgPyAtY24ud2lkdGggLSBhZGRpdGlvbmFsU3BhY2VMZWZ0IC0gYWRkaXRpb25hbFNwYWNlUmlnaHQgOiAwLCByZW5kZXJlci55ICsgY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tLCBjbi53aWR0aCkpOyAvL3Jlc2V0IGZsb2F0aW5nIGJ5IGNsZWFyOmJvdGggZGl2c1xuICAgICAgICAgICAgICAgIC8vanVzdCBzZXQgY3Vyc29yWSBhZnRlciB0aGUgZmxvYXRpbmcgZWxlbWVudFxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoeVBvc2l0aW9uQWZ0ZXJGbG9hdGluZywgcGFnZXMsIGVsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA8IHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcgJiYgcGFnZXMgPT09IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5vZGVUeXBlID09PSAxICYmIEdldENTUyhlbCkuY2xlYXIgPT09ICdib3RoJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSB5UG9zaXRpb25BZnRlckZsb2F0aW5nO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQsIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpKTsgLy9pZiBmbG9hdGluZyBpcyBzZXQgd2UgZGVjcmVhc2UgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSB0aGUgaW1hZ2Ugd2lkdGhcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC09IGNuLndpZHRoICsgYWRkaXRpb25hbFNwYWNlTGVmdCArIGFkZGl0aW9uYWxTcGFjZVJpZ2h0OyAvL2lmIGxlZnQganVzdCBhZGQgdGhlIGltYWdlIHdpZHRoIHRvIHRoZSBYIGNvb3JkaW5hdGVcblxuICAgICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBmbG9hdGluZyBpcyBzZXQsIG1vdmUgdGhlIHJlbmRlcmluZyBjdXJzb3IgYWZ0ZXIgdGhlIGltYWdlIGhlaWdodFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKiogVEFCTEUgUkVOREVSSU5HICoqKi9cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJUQUJMRVwiKSB7XG4gICAgICAgICAgICAgIGlmKCFyZW5kZXJlci5wZGYuYXV0b1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGFibGUyanNvbiA9IHRhYmxlVG9Kc29uKGNuLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYudGFibGUocmVuZGVyZXIueCwgcmVuZGVyZXIueSwgdGFibGUyanNvbi5yb3dzLCB0YWJsZTJqc29uLmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICAgIGF1dG9TaXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHByaW50SGVhZGVyczogZWxlbWVudEhhbmRsZXJzLnByaW50SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbnM6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYyxcbiAgICAgICAgICAgICAgICAgIGNzczogR2V0Q1NTKGNuKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwueSArXG4gICAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwuaGVpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmF1dG9UYWJsZSh7IHRoZW1lOiBcImdyaWRcIiwgaHRtbDogY24sIHN0YXJ0WTogcmVuZGVyZXIueSxcbiAgICAgICAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgICAgICBmb250OiByZW5kZXJlci5wZGYuZ2V0Rm9udCgpLmZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogcmVuZGVyZXIucGRmLmdldEZvbnRTaXplKCksXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogcmVuZGVyZXIucGRmLmdldFRleHRDb2xvcigpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbWFyZ2luOiB7IFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3AsIFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZW5kZXJlci54LCBcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpIC0gKHJlbmRlcmVyLnggICsgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGgpLCBcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5sYXN0QXV0b1RhYmxlLmZpbmFsWTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJPTFwiIHx8IGNuLm5vZGVOYW1lID09PSBcIlVMXCIpIHtcbiAgICAgICAgICAgICAgbGlzdENvdW50ID0gMTtcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gMjAgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMztcblxuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIueCA9IHRlbXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkJSXCIpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSBmcmFnbWVudENTU1tcImZvbnQtc2l6ZVwiXSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChcIlxcdTIwMjhcIiwgY2xvbmUoZnJhZ21lbnRDU1MpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjbi5ub2RlVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlVmFsdWUgJiYgY24ucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgIGlmIChjbi5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdENvdW50KysgKyAnLiAnICsgdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl07XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFggPSAoMyAtIGZvbnRTaXplICogMC43NSkgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFkgPSBmb250U2l6ZSAqIDAuNzUgKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl1cyA9IGZvbnRTaXplICogMS43NCAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcblxuICAgICAgICAgICAgICAgIGNiID0gZnVuY3Rpb24gY2IoeCwgeSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5wZGYuY2lyY2xlKHggKyBvZmZzZXRYLCB5ICsgb2Zmc2V0WSwgcmFkaXVzLCAnRkQnKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIE9ubHkgYWRkIHRoZSB0ZXh0IGlmIHRoZSB0ZXh0IG5vZGUgaXMgaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgLy8gQWRkIGNvbXBhdGliaWxpdHkgd2l0aCBJRTExXG5cblxuICAgICAgICAgICAgaWYgKCEhKGNuLm93bmVyRG9jdW1lbnQuYm9keS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjbikgJiAxNikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dCh2YWx1ZSwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNuID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KGNuLCBmcmFnbWVudENTUyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50SGFuZGxlcnMub3V0WSA9IHJlbmRlcmVyLnk7XG5cbiAgICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KGNiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaW1hZ2VzID0ge307XG5cbiAgICBsb2FkSW1ncyA9IGZ1bmN0aW9uIGxvYWRJbWdzKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMsIGNiKSB7XG4gICAgICB2YXIgaW1ncyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpLFxuICAgICAgICAgIGwgPSBpbWdzLmxlbmd0aCxcbiAgICAgICAgICBmb3VuZF9pbWFnZXMsXG4gICAgICAgICAgeCA9IDA7XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaW1hZ2VzTG9hZGVkJyk7XG4gICAgICAgIGNiKGZvdW5kX2ltYWdlcyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZSh1cmwsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBmb3VuZF9pbWFnZXMgPSArK3g7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICcnO1xuXG4gICAgICAgIGltZy5vbmVycm9yID0gaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAvL3RvIHN1cHBvcnQgZGF0YSB1cmxzIGluIGltYWdlcywgc2V0IHdpZHRoIGFuZCBoZWlnaHRcbiAgICAgICAgICAgIC8vYXMgdGhvc2UgdmFsdWVzIGFyZSBub3QgcmVjb2duaXplZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICBpZiAoaW1nLnNyYy5pbmRleE9mKCdkYXRhOmltYWdlLycpID09PSAwKSB7XG4gICAgICAgICAgICAgIGltZy53aWR0aCA9IHdpZHRoIHx8IGltZy53aWR0aCB8fCAwO1xuICAgICAgICAgICAgICBpbWcuaGVpZ2h0ID0gaGVpZ2h0IHx8IGltZy5oZWlnaHQgfHwgMDtcbiAgICAgICAgICAgIH0gLy9pZiB2YWxpZCBpbWFnZSBhZGQgdG8ga25vd24gaW1hZ2VzIGFycmF5XG5cblxuICAgICAgICAgICAgaWYgKGltZy53aWR0aCArIGltZy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgdmFyIGhhc2ggPSAocmVuZGVyZXIucGRmLnNIYXNoQ29kZSAmJiByZW5kZXJlci5wZGYuc0hhc2hDb2RlKHVybCkpIHx8IHVybDtcbiAgICAgICAgICAgICAgaW1hZ2VzW2hhc2hdID0gaW1hZ2VzW2hhc2hdIHx8IGltZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoISAtLXgpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGwtLSkge1xuICAgICAgICBsb2FkSW1hZ2UoaW1nc1tsXS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksIGltZ3NbbF0ud2lkdGgsIGltZ3NbbF0uaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHggfHwgZG9uZSgpO1xuICAgIH07XG5cbiAgICBjaGVja0ZvckZvb3RlciA9IGZ1bmN0aW9uIGNoZWNrRm9yRm9vdGVyKGVsZW0sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIC8vY2hlY2sgaWYgd2UgY2FuIGZvdW5kIGEgPGZvb3Rlcj4gZWxlbWVudFxuICAgICAgdmFyIGZvb3RlciA9IGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJmb290ZXJcIik7XG5cbiAgICAgIGlmIChmb290ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBmb290ZXIgPSBmb290ZXJbMF07IC8vYmFkIGhhY2sgdG8gZ2V0IGhlaWdodCBvZiBmb290ZXJcbiAgICAgICAgLy9jcmVhdCBkdW1teSBvdXQgYW5kIGNoZWNrIG5ldyB5IGFmdGVyIGZha2UgcmVuZGVyaW5nXG5cbiAgICAgICAgdmFyIG9sZE91dCA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgICAgdmFyIG9sZFkgPSByZW5kZXJlci55O1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZm9vdGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICB2YXIgZm9vdGVySGVpZ2h0ID0gTWF0aC5jZWlsKHJlbmRlcmVyLnkgLSBvbGRZKSArIDU7XG4gICAgICAgIHJlbmRlcmVyLnkgPSBvbGRZO1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBvbGRPdXQ7IC8vYWRkIDIwJSB0byBwcmV2ZW50IG92ZXJsYXBwaW5nXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vQ3JlYXRlIGZ1bmN0aW9uIHJlbmRlciBoZWFkZXIgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgIHZhciByZW5kZXJGb290ZXIgPSBmdW5jdGlvbiByZW5kZXJGb290ZXIocGFnZUluZm8pIHtcbiAgICAgICAgICB2YXIgcGFnZU51bWJlciA9IHBhZ2VJbmZvICE9PSB1bmRlZmluZWQgPyBwYWdlSW5mby5wYWdlTnVtYmVyIDogMTsgLy9zZXQgY3VycmVudCB5IHBvc2l0aW9uIHRvIG9sZCBtYXJnaW5cblxuICAgICAgICAgIHZhciBvbGRQb3NpdGlvbiA9IHJlbmRlcmVyLnk7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tO1xuICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gLT0gZm9vdGVySGVpZ2h0OyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gYWRkIHBhZ2UgbnVtYmVyc1xuXG4gICAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyBwYWdlQ291bnRlciwgc2V0IHRoZSBwYWdlXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHBhZ2VDb3VudGVyIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9IHBhZ2VOdW1iZXI7XG4gICAgICAgICAgICB9IC8vaWYgd2UgZmluZCBzb21lIHNwYW4gZWxlbWVudCB3aXRoIGNsYXNzIHRvdGFsUGFnZXMsIHNldCBhIHZhcmlhYmxlIHdoaWNoIGlzIHJlcGxhY2VkIGFmdGVyIHJlbmRlcmluZyBvZiBhbGwgcGFnZXNcblxuXG4gICAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHRvdGFsUGFnZXMgXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0gJyMjI2pzUERGVmFyVG90YWxQYWdlcyMjIyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvL3JlbmRlciBmb290ZXIgY29udGVudFxuXG5cbiAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IGJvdHRvbSBtYXJnaW4gdG8gcHJldmlvdXMgaGVpZ2h0IGluY2x1ZGluZyB0aGUgZm9vdGVyIGhlaWdodFxuXG5cbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tICs9IGZvb3RlckhlaWdodDsgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG4gICAgICAgICAgcmVuZGVyZXIueSA9IG9sZFBvc2l0aW9uO1xuICAgICAgICB9OyAvL2NoZWNrIGlmIGZvb3RlciBjb250YWlucyB0b3RhbFBhZ2VzIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlIGF0IHRoZSBkaXNvcG9zYWwgb2YgdGhlIGRvY3VtZW50XG5cblxuICAgICAgICB2YXIgc3BhbnMgPSBmb290ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NwYW4nKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJywgcmVuZGVyZXIucGRmLnB1dFRvdGFsUGFnZXMuYmluZChyZW5kZXJlci5wZGYsICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vcmVnaXN0ZXIgZXZlbnQgdG8gcmVuZGVyIGZvb3RlciBvbiBldmVyeSBuZXcgcGFnZVxuXG5cbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2FkZFBhZ2UnLCByZW5kZXJGb290ZXIsIGZhbHNlKTsgLy9yZW5kZXIgZm9vdGVyIG9uIGZpcnN0IHBhZ2VcblxuICAgICAgICByZW5kZXJGb290ZXIoKTsgLy9wcmV2ZW50IGZvb3RlciByZW5kZXJpbmdcblxuICAgICAgICBTa2lwTm9kZVsnRk9PVEVSJ10gPSAxO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhwZGYsIGVsZW1lbnQsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIgJiYgIWVsZW1lbnQucGFyZW50Tm9kZSkgZWxlbWVudCA9ICcnICsgZWxlbWVudC5pbm5lckhUTUw7XG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgJGZyYW1lLCAkaGlkZGVuZGl2LCBmcmFtZW5hbWUsIHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgIGZyYW1lbmFtZSA9IFwianNQREZodG1sVGV4dFwiICsgRGF0ZS5ub3coKS50b1N0cmluZygpICsgKE1hdGgucmFuZG9tKCkgKiAxMDAwKS50b0ZpeGVkKDApO1xuICAgICAgICAgIHZpc3VhbGx5aGlkZGVuID0gXCJwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcIiArIFwiY2xpcDogcmVjdCgxcHggMXB4IDFweCAxcHgpOyAvKiBJRTYsIElFNyAqL1wiICsgXCJjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7XCIgKyBcInBhZGRpbmc6MCAhaW1wb3J0YW50O1wiICsgXCJib3JkZXI6MCAhaW1wb3J0YW50O1wiICsgXCJoZWlnaHQ6IDFweCAhaW1wb3J0YW50O1wiICsgXCJ3aWR0aDogMXB4ICFpbXBvcnRhbnQ7IFwiICsgXCJ0b3A6YXV0bztcIiArIFwibGVmdDotMTAwcHg7XCIgKyBcIm92ZXJmbG93OiBoaWRkZW47XCI7XG4gICAgICAgICAgJGhpZGRlbmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICRoaWRkZW5kaXYuY2xhc3NOYW1lID0gXCJzanMtcGRmLWhpZGRlbi1odG1sLWRpdlwiO1xuICAgICAgICAgICRoaWRkZW5kaXYuc3R5bGUuY3NzVGV4dCA9IHZpc3VhbGx5aGlkZGVuO1xuICAgICAgICAgICRoaWRkZW5kaXYuaW5uZXJIVE1MID0gXCI8aWZyYW1lIHN0eWxlPVxcXCJoZWlnaHQ6MXB4O3dpZHRoOjFweFxcXCIgbmFtZT1cXFwiXCIgKyBmcmFtZW5hbWUgKyBcIlxcXCIgLz5cIjtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRoaWRkZW5kaXYpO1xuICAgICAgICAgICRmcmFtZSA9IHdpbmRvdy5mcmFtZXNbZnJhbWVuYW1lXTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQub3BlbigpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC53cml0ZWxuKGVsZW1lbnQpO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybiAkZnJhbWUuZG9jdW1lbnQuYm9keTtcbiAgICAgICAgfShlbGVtZW50LnJlcGxhY2UoLzxcXC8/c2NyaXB0W14+XSo/Pi9naSwgJycpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF2YWlsYWJsZUZvbnRzID0gT2JqZWN0LmtleXMocGRmLmdldEZvbnRMaXN0KCkpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGF2YWlsYWJsZUZvbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBmb250TmFtZSA9IGF2YWlsYWJsZUZvbnRzW2ldO1xuICAgICAgICB2YXIgZm9udEZhbWlseSA9IGZvbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKCFGb250TmFtZURCW2ZvbnRGYW1pbHldKSB7XG4gICAgICAgICAgRm9udE5hbWVEQltmb250RmFtaWx5XSA9IGZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gbmV3IFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpLFxuICAgICAgICAgIG91dDsgLy8gMS4gbG9hZCBpbWFnZXNcbiAgICAgIC8vIDIuIHByZXBhcmUgb3B0aW9uYWwgZm9vdGVyIGVsZW1lbnRzXG4gICAgICAvLyAzLiByZW5kZXIgY29udGVudFxuXG4gICAgICBsb2FkSW1ncy5jYWxsKHRoaXMsIGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycywgZnVuY3Rpb24gKGZvdW5kX2ltYWdlcykge1xuICAgICAgICBjaGVja0ZvckZvb3RlcihlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpO1xuXG4gICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTsgLy9zZW5kIGV2ZW50IGRpc3Bvc2UgZm9yIGZpbmFsIHRha3MgKGUuZy4gZm9vdGVyIHRvdGFscGFnZSByZXBsYWNlbWVudClcblxuXG4gICAgICAgIHIucGRmLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdodG1sUmVuZGVyaW5nRmluaXNoZWQnKTtcbiAgICAgICAgb3V0ID0gci5kaXNwb3NlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKG91dCk7ZWxzZSBpZiAoZm91bmRfaW1hZ2VzKSBjb25zb2xlLmVycm9yKCdqc1BERiBXYXJuaW5nOiByZW5kZXJpbmcgaXNzdWVzPyBwcm92aWRlIGEgY2FsbGJhY2sgdG8gZnJvbUhUTUwhJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvdXQgfHwge1xuICAgICAgICB4OiByLngsXG4gICAgICAgIHk6IHIueVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcInFcIik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJRXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGhpcy54LFxuICAgICAgICB5OiB0aGlzLnksXG4gICAgICAgIHJlYWR5OiB0cnVlXG4gICAgICB9O1xuICAgIH07IC8vQ2hlY2tzIGlmIHdlIGhhdmUgdG8gZXhlY3V0ZSBzb21lIHdhdGNoZXIgZnVuY3Rpb25zXG4gICAgLy9lLmcuIHRvIGVuZCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgICB2YXIgbmFycmF5ID0gW107XG5cbiAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndhdGNoRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKHRoaXMud2F0Y2hGdW5jdGlvbnNbaV0oZWwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYXJyYXkucHVzaCh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gbmFycmF5O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMgPSBmdW5jdGlvbiAoZnJhZ21lbnRzLCBzdHlsZXMpIHtcbiAgICAgIHZhciBjdXJyZW50TGluZUxlbmd0aCwgZGVmYXVsdEZvbnRTaXplLCBmZiwgZm9udE1ldHJpY3MsIGZvbnRNZXRyaWNzQ2FjaGUsIGZyYWdtZW50LCBmcmFnbWVudENob3BwZWQsIGZyYWdtZW50TGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcywgZnMsIGssIGxpbmUsIGxpbmVzLCBtYXhMaW5lTGVuZ3RoLCBzdHlsZTtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgayA9IHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgZm9udE1ldHJpY3NDYWNoZSA9IHt9O1xuICAgICAgZmYgPSB2b2lkIDA7XG4gICAgICBmcyA9IHZvaWQgMDtcbiAgICAgIGZvbnRNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnQgPSB2b2lkIDA7XG4gICAgICBzdHlsZSA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRMZW5ndGggPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudENob3BwZWQgPSB2b2lkIDA7XG4gICAgICBsaW5lID0gW107XG4gICAgICBsaW5lcyA9IFtsaW5lXTtcbiAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gMDtcbiAgICAgIG1heExpbmVMZW5ndGggPSB0aGlzLnNldHRpbmdzLndpZHRoO1xuXG4gICAgICB3aGlsZSAoZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50cy5zaGlmdCgpO1xuICAgICAgICBzdHlsZSA9IHN0eWxlcy5zaGlmdCgpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgIGZmID0gc3R5bGVbXCJmb250LWZhbWlseVwiXTtcbiAgICAgICAgICBmcyA9IHN0eWxlW1wiZm9udC1zdHlsZVwiXTtcbiAgICAgICAgICBmb250TWV0cmljcyA9IGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc107XG5cbiAgICAgICAgICBpZiAoIWZvbnRNZXRyaWNzKSB7XG4gICAgICAgICAgICBmb250TWV0cmljcyA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoZmYsIGZzKS5tZXRhZGF0YS5Vbmljb2RlO1xuICAgICAgICAgICAgZm9udE1ldHJpY3NDYWNoZVtmZiArIGZzXSA9IGZvbnRNZXRyaWNzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzID0ge1xuICAgICAgICAgICAgd2lkdGhzOiBmb250TWV0cmljcy53aWR0aHMsXG4gICAgICAgICAgICBrZXJuaW5nOiBmb250TWV0cmljcy5rZXJuaW5nLFxuICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlW1wiZm9udC1zaXplXCJdICogZGVmYXVsdEZvbnRTaXplLFxuICAgICAgICAgICAgdGV4dEluZGVudDogY3VycmVudExpbmVMZW5ndGhcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZyYWdtZW50TGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGZyYWdtZW50LCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7XG5cbiAgICAgICAgICBpZiAoZnJhZ21lbnQgPT0gXCJcXHUyMDI4XCIpIHtcbiAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TGluZUxlbmd0aCArIGZyYWdtZW50TGVuZ3RoID4gbWF4TGluZUxlbmd0aCkge1xuICAgICAgICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdGhpcy5wZGYuc3BsaXRUZXh0VG9TaXplKGZyYWdtZW50LCBtYXhMaW5lTGVuZ3RoLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcyk7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV0pO1xuXG4gICAgICAgICAgICB3aGlsZSAoZnJhZ21lbnRDaG9wcGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBsaW5lID0gW1tmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdXTtcbiAgICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgobGluZVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaW5lLnB1c2goW2ZyYWdtZW50LCBzdHlsZV0pO1xuICAgICAgICAgICAgY3VycmVudExpbmVMZW5ndGggKz0gZnJhZ21lbnRMZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vaWYgdGV4dCBhbGlnbm1lbnQgd2FzIHNldCwgc2V0IG1hcmdpbi9pbmRlbnQgb2YgZWFjaCBsaW5lXG5cblxuICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gIT09IHVuZGVmaW5lZCAmJiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0JyB8fCBzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVzW2ldWzBdWzBdLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7IC8vaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uIGxpbmUgd2UgaGF2ZSB0byBjbG9uZSB0aGUgc3R5bGUgb2JqZWN0IGFzIGFsbCBsaW5lcyBob2xkIGEgcmVmZXJlbmNlIG9uIHRoaXMgb2JqZWN0XG5cbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdID0gY2xvbmUobGluZXNbaV1bMF1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzcGFjZSA9IG1heExpbmVMZW5ndGggLSBsZW5ndGg7XG5cbiAgICAgICAgICBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZTsgLy9pZiBhbGlnbm1lbnQgaXMgbm90IHJpZ2h0LCBpdCBoYXMgdG8gYmUgY2VudGVyIHNvIHNwbGl0IHRoZSBzcGFjZSB0byB0aGUgbGVmdCBhbmQgdGhlIHJpZ2h0XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ21hcmdpbi1sZWZ0J10gPSBzcGFjZSAvIDI7IC8vaWYganVzdGlmeSB3YXMgc2V0LCBjYWxjdWxhdGUgdGhlIHdvcmQgc3BhY2luZyBhbmQgZGVmaW5lIGluIGJ5IHVzaW5nIHRoZSBjc3MgcHJvcGVydHlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5Jykge1xuICAgICAgICAgICAgdmFyIGNvdW50U3BhY2VzID0gbGluZXNbaV1bMF1bMF0uc3BsaXQoJyAnKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gc3BhY2UgLyBjb3VudFNwYWNlczsgLy9pZ25vcmUgdGhlIGxhc3QgbGluZSBpbiBqdXN0aWZ5IG1vZGVcblxuICAgICAgICAgICAgaWYgKGkgPT09IGxpbmVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgbGluZXNbaV1bMF1bMV1bJ3dvcmQtc3BhY2luZyddID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuUmVuZGVyVGV4dEZyYWdtZW50ID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7XG4gICAgICB2YXIgZGVmYXVsdEZvbnRTaXplLCBmb250LCBtYXhMaW5lSGVpZ2h0O1xuICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcblxuICAgICAgaWYgKHRoaXMucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gdGhpcy5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgdGhpcy55ICsgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udFNpemUoKSkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIkVUXCIsIFwiUVwiLCBcIlFcIik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5wZGYuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgaWYgKHRoaXMucGRmLmdldE51bWJlck9mUGFnZXMoKSA9PT0gY3VycmVudFBhZ2VOdW1iZXIpIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgZWxzZSB0aGlzLnBkZi5zZXRQYWdlKGN1cnJlbnRQYWdlTnVtYmVyICsgMSk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIsIFwicVwiLCBcIkJUXCIsIHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGUuY29sb3IpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL21vdmUgY3Vyc29yIGJ5IG9uZSBsaW5lIG9uIG5ldyBwYWdlXG5cbiAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIHN0eWxlW1wibGluZS1oZWlnaHRcIl0sIHN0eWxlW1wiZm9udC1zaXplXCJdKTtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgIH1cblxuICAgICAgZm9udCA9IHRoaXMucGRmLmludGVybmFsLmdldEZvbnQoc3R5bGVbXCJmb250LWZhbWlseVwiXSwgc3R5bGVbXCJmb250LXN0eWxlXCJdKTsgLy8gdGV4dCBjb2xvclxuXG4gICAgICB2YXIgcGRmVGV4dENvbG9yID0gdGhpcy5nZXRQZGZDb2xvcihzdHlsZVtcImNvbG9yXCJdKTtcblxuICAgICAgaWYgKHBkZlRleHRDb2xvciAhPT0gdGhpcy5sYXN0VGV4dENvbG9yKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHBkZlRleHRDb2xvcik7XG4gICAgICAgIHRoaXMubGFzdFRleHRDb2xvciA9IHBkZlRleHRDb2xvcjtcbiAgICAgIH0gLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBmb3IgZS5nLiBqdXN0aWZ5IHN0eWxlXG5cblxuICAgICAgaWYgKHN0eWxlWyd3b3JkLXNwYWNpbmcnXSAhPT0gdW5kZWZpbmVkICYmIHN0eWxlWyd3b3JkLXNwYWNpbmcnXSA+IDApIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoc3R5bGVbJ3dvcmQtc3BhY2luZyddLnRvRml4ZWQoMiksIFwiVHdcIik7XG4gICAgICB9XG5cblxuICAgICAgdmFyIHBkZkVzY2FwZTE2ID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgd2lkdGhzID0gZm9udC5tZXRhZGF0YS5Vbmljb2RlLndpZHRocztcbiAgICAgICAgdmFyIHBhZHogPSBbXCJcIiwgXCIwXCIsIFwiMDBcIiwgXCIwMDBcIiwgXCIwMDAwXCJdO1xuICAgICAgICB2YXIgYXIgPSBbXCJcIl07XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gdGV4dC5sZW5ndGgsIHQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICB0ID0gZm9udC5tZXRhZGF0YS5jaGFyYWN0ZXJUb0dseXBoKHRleHQuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS5nbHlJZHNVc2VkLnB1c2godCk7XG4gICAgICAgICAgZm9udC5tZXRhZGF0YS50b1VuaWNvZGVbdF0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgaWYgKHdpZHRocy5pbmRleE9mKHQpID09IC0xKSB7XG4gICAgICAgICAgICB3aWR0aHMucHVzaCh0KTtcbiAgICAgICAgICAgIHdpZHRocy5wdXNoKFtwYXJzZUludChmb250Lm1ldGFkYXRhLndpZHRoT2ZHbHlwaCh0KSwgMTApXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ID09IFwiMFwiKSB7XG4gICAgICAgICAgICAvL1NwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gY21hcC5cbiAgICAgICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ID0gdC50b1N0cmluZygxNik7XG4gICAgICAgICAgICBhci5wdXNoKHBhZHpbNCAtIHQubGVuZ3RoXSwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhci5qb2luKFwiXCIpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHV0ZjhUZXh0RnVuY3Rpb24gPSBmdW5jdGlvbih0ZXh0LCBmb250KSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGV4dCB8fCBcIlwiO1xuICAgIFxuICAgICAgICB2YXIgc3RyID0gXCJcIixcbiAgICAgICAgICBzID0gMCxcbiAgICAgICAgICBjbWFwQ29uZmlybTtcbiAgICAgICAgdmFyIHN0clRleHQgPSBcIlwiO1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBmb250LmVuY29kaW5nO1xuICAgIFxuICAgICAgICBpZiAoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHJUZXh0ID0gdGV4dDtcbiAgICBcbiAgICAgICAgZm9yIChzID0gMDsgcyA8IHN0clRleHQubGVuZ3RoOyBzICs9IDEpIHtcbiAgICAgICAgICBpZiAoZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcImNtYXBcIikpIHtcbiAgICAgICAgICAgIGNtYXBDb25maXJtID0gZm9udC5tZXRhZGF0YS5jbWFwLnVuaWNvZGUuY29kZU1hcFtzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNtYXBDb25maXJtKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN0clRleHRbc10uY2hhckNvZGVBdCgwKSA8IDI1NiAmJlxuICAgICAgICAgICAgICBmb250Lm1ldGFkYXRhLmhhc093blByb3BlcnR5KFwiVW5pY29kZVwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyICs9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSBzdHJUZXh0W3NdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgaWYgKHBhcnNlSW50KGZvbnQuaWQuc2xpY2UoMSkpIDwgMTQgfHwgZW5jb2RpbmcgPT09IFwiV2luQW5zaUVuY29kaW5nXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUoc3RyLCBrZXkpXG4gICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24oY3YpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGN2LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICAgIHJlc3VsdCA9IHBkZkVzY2FwZTE2KHN0ciwgZm9udCk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07ICAgICAgXG5cbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KTtcbiAgICAgIC8vIHZhciBlc2NhcGVkVGV4dCA9IHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCk7XG4gICAgICAvLyBpZihlc2NhcGVkVGV4dCAhPSB0ZXh0KSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCI8XCIgKyBlc2NhcGVkVGV4dCArIFwiPlwiO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgZXNjYXBlZFRleHQgPSBcIihcIiArIGVzY2FwZWRUZXh0ICsgXCIpXCI7XG4gICAgICAvLyB9XG5cbiAgICAgIHZhciBlc2NhcGVkVGV4dCA9IFwiXCI7XG4gICAgICBpZihmb250LmVuY29kaW5nICE9PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiKFwiICsgdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHRleHQpICsgXCIpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgdXRmOFRleHRGdW5jdGlvbih0ZXh0LCBmb250KSArIFwiPlwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIi9cIiArIGZvbnQuaWQsIChkZWZhdWx0Rm9udFNpemUgKiBzdHlsZVtcImZvbnQtc2l6ZVwiXSkudG9GaXhlZCgyKSwgXCJUZlwiLCBlc2NhcGVkVGV4dCArIFwiIFRqXCIpOyAvL3NldCB0aGUgd29yZCBzcGFjaW5nIGJhY2sgdG8gbmV1dHJhbCA9PiAwXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgwLCBcIlR3XCIpO1xuICAgICAgfVxuICAgIH07IC8vIEFjY2VwdHMgI0ZGRkZGRiwgcmdiKGludCxpbnQsaW50KSwgb3IgQ1NTIENvbG9yIE5hbWVcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmdldFBkZkNvbG9yID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICB2YXIgdGV4dENvbG9yO1xuICAgICAgdmFyIHIsIGcsIGI7XG4gICAgICB2YXIgcnggPSAvcmdiXFxzKlxcKFxccyooXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCtcXHMqKVxcKS87XG4gICAgICB2YXIgbSA9IHJ4LmV4ZWMoc3R5bGUpO1xuXG4gICAgICBpZiAobSAhPSBudWxsKSB7XG4gICAgICAgIHIgPSBwYXJzZUludChtWzFdKTtcbiAgICAgICAgZyA9IHBhcnNlSW50KG1bMl0pO1xuICAgICAgICBiID0gcGFyc2VJbnQobVszXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiICYmIHN0eWxlLmNoYXJBdCgwKSAhPSAnIycpIHtcbiAgICAgICAgICB2YXIgcmdiQ29sb3IgPSBuZXcgUkdCQ29sb3Ioc3R5bGUpO1xuXG4gICAgICAgICAgaWYgKHJnYkNvbG9yLm9rKSB7XG4gICAgICAgICAgICBzdHlsZSA9IHJnYkNvbG9yLnRvSGV4KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlID0gJyMwMDAwMDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHIgPSBzdHlsZS5zdWJzdHJpbmcoMSwgMyk7XG4gICAgICAgIHIgPSBwYXJzZUludChyLCAxNik7XG4gICAgICAgIGcgPSBzdHlsZS5zdWJzdHJpbmcoMywgNSk7XG4gICAgICAgIGcgPSBwYXJzZUludChnLCAxNik7XG4gICAgICAgIGIgPSBzdHlsZS5zdWJzdHJpbmcoNSwgNyk7XG4gICAgICAgIGIgPSBwYXJzZUludChiLCAxNik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3N0cmluZycgJiYgL14jWzAtOUEtRmEtZl17Nn0kLy50ZXN0KHIpKSB7XG4gICAgICAgIHZhciBoZXggPSBwYXJzZUludChyLnN1YnN0cigxKSwgMTYpO1xuICAgICAgICByID0gaGV4ID4+IDE2ICYgMjU1O1xuICAgICAgICBnID0gaGV4ID4+IDggJiAyNTU7XG4gICAgICAgIGIgPSBoZXggJiAyNTU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmMyA9IHRoaXMuZjM7XG5cbiAgICAgIGlmIChyID09PSAwICYmIGcgPT09IDAgJiYgYiA9PT0gMCB8fCB0eXBlb2YgZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGV4dENvbG9yID0gZjMociAvIDI1NSkgKyAnIGcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dENvbG9yID0gW2YzKHIgLyAyNTUpLCBmMyhnIC8gMjU1KSwgZjMoYiAvIDI1NSksICdyZyddLmpvaW4oJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRleHRDb2xvcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmYzID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDMpOyAvLyBJZSwgJS4zZlxuICAgIH0sIFJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJQYXJhZ3JhcGggPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHZhciBibG9ja3N0eWxlLCBkZWZhdWx0Rm9udFNpemUsIGZvbnRUb1VuaXRSYXRpbywgZnJhZ21lbnRzLCBpLCBsLCBsaW5lLCBsaW5lcywgbWF4TGluZUhlaWdodCwgb3V0LCBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyLCBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSwgcHJpb3JibG9ja3N0eWxlLCBzdHlsZXMsIGZvbnRTaXplO1xuICAgICAgZnJhZ21lbnRzID0gUHVyZ2VXaGl0ZVNwYWNlKHRoaXMucGFyYWdyYXBoLnRleHQpO1xuICAgICAgc3R5bGVzID0gdGhpcy5wYXJhZ3JhcGguc3R5bGU7XG4gICAgICBibG9ja3N0eWxlID0gdGhpcy5wYXJhZ3JhcGguYmxvY2tzdHlsZTtcbiAgICAgIHByaW9yYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLnByaW9yYmxvY2tzdHlsZSB8fCB7fTtcbiAgICAgIHRoaXMucGFyYWdyYXBoID0ge1xuICAgICAgICB0ZXh0OiBbXSxcbiAgICAgICAgc3R5bGU6IFtdLFxuICAgICAgICBibG9ja3N0eWxlOiB7fSxcbiAgICAgICAgcHJpb3JibG9ja3N0eWxlOiBibG9ja3N0eWxlXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWZyYWdtZW50cy5qb2luKFwiXCIpLnRyaW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxpbmVzID0gdGhpcy5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyhmcmFnbWVudHMsIHN0eWxlcyk7XG4gICAgICBsaW5lID0gdm9pZCAwO1xuICAgICAgbWF4TGluZUhlaWdodCA9IHZvaWQgMDtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuICAgICAgZm9udFRvVW5pdFJhdGlvID0gZGVmYXVsdEZvbnRTaXplIC8gdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSB8fCAwO1xuICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoTWF0aC5tYXgoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApIC0gdGhpcy5wcmlvck1hcmdpbkJvdHRvbSwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctdG9wXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLWJvdHRvbVwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB0aGlzLnByaW9yTWFyZ2luQm90dG9tID0gYmxvY2tzdHlsZVtcIm1hcmdpbi1ib3R0b21cIl0gfHwgMDtcblxuICAgICAgaWYgKGJsb2Nrc3R5bGVbJ3BhZ2UtYnJlYWstYmVmb3JlJ10gPT09ICdhbHdheXMnKSB7XG4gICAgICAgIHRoaXMucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUgPSAoKGJsb2Nrc3R5bGVbXCJtYXJnaW4tdG9wXCJdIHx8IDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICB9XG5cbiAgICAgIG91dCA9IHRoaXMucGRmLmludGVybmFsLndyaXRlO1xuICAgICAgaSA9IHZvaWQgMDtcbiAgICAgIGwgPSB2b2lkIDA7XG4gICAgICB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19iZWZvcmU7XG4gICAgICBvdXQoXCJxXCIsIFwiQlQgMCBnXCIsIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7IC8vc3RvcmVzIHRoZSBjdXJyZW50IGluZGVudCBvZiBjdXJzb3IgcG9zaXRpb25cblxuICAgICAgdmFyIGN1cnJlbnRJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGxpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gMDtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdLnRyaW0oKSkge1xuICAgICAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGxpbmVbaV1bMV1bXCJsaW5lLWhlaWdodFwiXSwgbGluZVtpXVsxXVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgICAgICBmb250U2l6ZSA9IGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0gKiA3O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfSAvL2lmIHdlIGhhdmUgdG8gbW92ZSB0aGUgY3Vyc29yIHRvIGFkYXB0IHRoZSBpbmRlbnRcblxuXG4gICAgICAgIHZhciBpbmRlbnRNb3ZlID0gMDtcbiAgICAgICAgdmFyIHdhbnRlZEluZGVudCA9IDA7IC8vaWYgYSBtYXJnaW4gd2FzIGFkZGVkIChieSBlLmcuIGEgdGV4dC1hbGlnbm1lbnQpLCBtb3ZlIHRoZSBjdXJzb3JcblxuICAgICAgICBpZiAobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdICE9PSB1bmRlZmluZWQgJiYgbGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdID4gMCkge1xuICAgICAgICAgIHdhbnRlZEluZGVudCA9IHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcobGluZVswXVsxXVtcIm1hcmdpbi1sZWZ0XCJdKTtcbiAgICAgICAgICBpbmRlbnRNb3ZlID0gd2FudGVkSW5kZW50IC0gY3VycmVudEluZGVudDtcbiAgICAgICAgICBjdXJyZW50SW5kZW50ID0gd2FudGVkSW5kZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGVudE1vcmUgPSBNYXRoLm1heChibG9ja3N0eWxlW1wibWFyZ2luLWxlZnRcIl0gfHwgMCwgMCkgKiBmb250VG9Vbml0UmF0aW87IC8vbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgb3V0KGluZGVudE1vdmUgKyBpbmRlbnRNb3JlLCAoLTEgKiBkZWZhdWx0Rm9udFNpemUgKiBtYXhMaW5lSGVpZ2h0KS50b0ZpeGVkKDIpLCBcIlRkXCIpO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbCA9IGxpbmUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgaWYgKGxpbmVbaV1bMF0pIHtcbiAgICAgICAgICAgIHRoaXMuUmVuZGVyVGV4dEZyYWdtZW50KGxpbmVbaV1bMF0sIGxpbmVbaV1bMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMueSArPSBtYXhMaW5lSGVpZ2h0ICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIHNvbWUgd2F0Y2hlciBmdW5jdGlvbiB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bCwgc28gZS5nLiBtYXJnaW4gYW5kIHdpZHRocyB3ZXJlIGNoYW5nZWQsXG4gICAgICAgIC8vcmVzZXQgbGluZSBkcmF3aW5nIGFuZCBjYWxjdWxhdGUgcG9zaXRpb24gYW5kIGxpbmVzIGFnYWluXG4gICAgICAgIC8vZS5nLiB0byBzdG9wIHRleHQgZmxvYXRpbmcgYXJvdW5kIGFuIGltYWdlXG5cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGxpbmVbMF1bMV0pICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbG9jYWxGcmFnbWVudHMgPSBbXTtcbiAgICAgICAgICB2YXIgbG9jYWxTdHlsZXMgPSBbXTsgLy9jcmVhdGUgZnJhZ21lbnQgYXJyYXkgb2ZcblxuICAgICAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsTGluZSkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGwgPSBsb2NhbExpbmUubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgICAgICBpZiAobG9jYWxMaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxGcmFnbWVudHMucHVzaChsb2NhbExpbmVbaV1bMF0gKyAnICcpO1xuICAgICAgICAgICAgICAgIGxvY2FsU3R5bGVzLnB1c2gobG9jYWxMaW5lW2ldWzFdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy9zcGxpdCBsaW5lcyBhZ2FpbiBkdWUgdG8gcG9zc2libGUgY29vcmRpbmF0ZSBjaGFuZ2VzXG5cbiAgICAgICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoUHVyZ2VXaGl0ZVNwYWNlKGxvY2FsRnJhZ21lbnRzKSwgbG9jYWxTdHlsZXMpOyAvL3JlcG9zaXRpb24gdGhlIGN1cnJlbnQgY3Vyc29yXG5cbiAgICAgICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYiAmJiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYi5jYWxsKHRoaXMsIHRoaXMueCAtIDksIHRoaXMueSAtIGZvbnRTaXplIC8gMik7XG4gICAgICB9XG5cbiAgICAgIG91dChcIkVUXCIsIFwiUVwiKTtcbiAgICAgIHJldHVybiB0aGlzLnkgKz0gcGFyYWdyYXBoc3BhY2luZ19hZnRlcjtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrQm91bmRhcnkgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmFncmFwaChjYik7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja1N0eWxlID0gZnVuY3Rpb24gKGNzcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGUgPSBjc3M7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5hZGRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNzcykge1xuICAgICAgdGhpcy5wYXJhZ3JhcGgudGV4dC5wdXNoKHRleHQpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoLnN0eWxlLnB1c2goY3NzKTtcbiAgICB9O1xuXG4gICAgRm9udE5hbWVEQiA9IHtcbiAgICAgIGhlbHZldGljYTogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwic2Fucy1zZXJpZlwiOiBcImhlbHZldGljYVwiLFxuICAgICAgXCJ0aW1lcyBuZXcgcm9tYW5cIjogXCJ0aW1lc1wiLFxuICAgICAgc2VyaWY6IFwidGltZXNcIixcbiAgICAgIHRpbWVzOiBcInRpbWVzXCIsXG4gICAgICBtb25vc3BhY2U6IFwiY291cmllclwiLFxuICAgICAgY291cmllcjogXCJjb3VyaWVyXCJcbiAgICB9O1xuICAgIEZvbnRXZWlnaHRNYXAgPSB7XG4gICAgICAxMDA6IFwibm9ybWFsXCIsXG4gICAgICAyMDA6IFwibm9ybWFsXCIsXG4gICAgICAzMDA6IFwibm9ybWFsXCIsXG4gICAgICA0MDA6IFwibm9ybWFsXCIsXG4gICAgICA1MDA6IFwiYm9sZFwiLFxuICAgICAgNjAwOiBcImJvbGRcIixcbiAgICAgIDcwMDogXCJib2xkXCIsXG4gICAgICA4MDA6IFwiYm9sZFwiLFxuICAgICAgOTAwOiBcImJvbGRcIixcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGJvbGQ6IFwiYm9sZFwiLFxuICAgICAgYm9sZGVyOiBcImJvbGRcIixcbiAgICAgIGxpZ2h0ZXI6IFwibm9ybWFsXCJcbiAgICB9O1xuICAgIEZvbnRTdHlsZU1hcCA9IHtcbiAgICAgIG5vcm1hbDogXCJub3JtYWxcIixcbiAgICAgIGl0YWxpYzogXCJpdGFsaWNcIixcbiAgICAgIG9ibGlxdWU6IFwiaXRhbGljXCJcbiAgICB9O1xuICAgIFRleHRBbGlnbk1hcCA9IHtcbiAgICAgIGxlZnQ6IFwibGVmdFwiLFxuICAgICAgcmlnaHQ6IFwicmlnaHRcIixcbiAgICAgIGNlbnRlcjogXCJjZW50ZXJcIixcbiAgICAgIGp1c3RpZnk6IFwianVzdGlmeVwiXG4gICAgfTtcbiAgICBGbG9hdE1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIHJpZ2h0OiAncmlnaHQnLFxuICAgICAgbGVmdDogJ2xlZnQnXG4gICAgfTtcbiAgICBDbGVhck1hcCA9IHtcbiAgICAgIG5vbmU6ICdub25lJyxcbiAgICAgIGJvdGg6ICdib3RoJ1xuICAgIH07XG4gICAgVW5pdGVkTnVtYmVyTWFwID0ge1xuICAgICAgbm9ybWFsOiAxXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBIVE1MLWZvcm1hdHRlZCB0ZXh0IGludG8gZm9ybWF0dGVkIFBERiB0ZXh0LlxuICAgICAqXG4gICAgICogTm90ZXM6XG4gICAgICogMjAxMi0wNy0xOFxuICAgICAqIFBsdWdpbiByZWxpZXMgb24gaGF2aW5nIGJyb3dzZXIsIERPTSBhcm91bmQuIFRoZSBIVE1MIGlzIHB1c2hlZCBpbnRvIGRvbSBhbmQgdHJhdmVyc2VkLlxuICAgICAqIFBsdWdpbiByZWxpZXMgb24galF1ZXJ5IGZvciBDU1MgZXh0cmFjdGlvbi5cbiAgICAgKiBUYXJnZXRpbmcgSFRNTCBvdXRwdXQgZnJvbSBNYXJrZG93biB0ZW1wbGF0aW5nLCB3aGljaCBpcyBhIHZlcnkgc2ltcGxlXG4gICAgICogbWFya3VwIC0gZGl2LCBzcGFuLCBlbSwgc3Ryb25nLCBwLiBObyBici1iYXNlZCBwYXJhZ3JhcGggc2VwYXJhdGlvbiBzdXBwb3J0ZWQgZXhwbGljaXRseSAoYnV0IHN0aWxsIG1heSB3b3JrLilcbiAgICAgKiBJbWFnZXMsIHRhYmxlcyBhcmUgTk9UIHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gSFRNTCB7U3RyaW5nfE9iamVjdH0gSFRNTC1mb3JtYXR0ZWQgdGV4dCwgb3IgcG9pbnRlciB0byBET00gZWxlbWVudCB0aGF0IGlzIHRvIGJlIHJlbmRlcmVkIGludG8gUERGLlxuICAgICAqIEBwYXJhbSB4IHtOdW1iZXJ9IHN0YXJ0aW5nIFggY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSB5IHtOdW1iZXJ9IHN0YXJ0aW5nIFkgY29vcmRpbmF0ZSBpbiBqc1BERiBpbnN0YW5jZSdzIGRlY2xhcmVkIHVuaXRzLlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyB7T2JqZWN0fSBBZGRpdGlvbmFsIC8gb3B0aW9uYWwgdmFyaWFibGVzIGNvbnRyb2xsaW5nIHBhcnNpbmcsIHJlbmRlcmluZy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBqc1BERiBpbnN0YW5jZVxuICAgICAqL1xuXG4gICAganNQREZBUEkuZnJvbUhUTUwgPSBmdW5jdGlvbiAoSFRNTCwgeCwgeSwgc2V0dGluZ3MsIGNhbGxiYWNrLCBtYXJnaW5zKSB7XG5cbiAgICAgIHRoaXMubWFyZ2luc19kb2MgPSBtYXJnaW5zIHx8IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBib3R0b206IDBcbiAgICAgIH07XG4gICAgICBpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IHt9O1xuICAgICAgaWYgKCFzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyA9IHt9O1xuICAgICAgcmV0dXJuIHByb2Nlc3ModGhpcywgSFRNTCwgaXNOYU4oeCkgPyA0IDogeCwgaXNOYU4oeSkgPyA0IDogeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICB9O1xuICB9KShqc3BkZi5qc1BERi5BUEkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=
|