@myop/sdk 0.3.36 → 0.3.38
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/dist/bundled-declarations.d.ts +23 -0
- package/dist/cjs/{_IframeSDK.3283252f.js → _IframeSDK.bc681e76.js} +17 -2
- package/dist/cjs/_IframeSDK.bc681e76.js.map +7 -0
- package/dist/cjs/_IframeSDK.d2fe8db7.min.js +1 -0
- package/dist/cjs/{_MyopHelpers.08d1cf5d.js → _MyopHelpers.cc216538.js} +17 -1
- package/dist/cjs/_MyopHelpers.cc216538.js.map +7 -0
- package/dist/cjs/_MyopHelpers.eff18534.min.js +1 -0
- package/dist/cjs/{_WebComponentSDK.e84be6ea.js → _WebComponentSDK.c8669c12.js} +17 -2
- package/dist/cjs/_WebComponentSDK.c8669c12.js.map +7 -0
- package/dist/cjs/_WebComponentSDK.f906fc17.min.js +1 -0
- package/dist/cjs/_hostSDK.a3a77bfb.min.js +1 -0
- package/dist/cjs/{_hostSDK.fa5b3ccf.js → _hostSDK.d29e6783.js} +17 -2
- package/dist/cjs/_hostSDK.d29e6783.js.map +7 -0
- package/dist/cjs/myop_sdk.js +14 -14
- package/dist/cjs/myop_sdk.js.map +1 -1
- package/dist/cjs/myop_sdk.min.js +1 -1
- package/dist/cjs-bundled/myop_sdk.bundled.js +24 -4
- package/dist/cjs-bundled/myop_sdk.bundled.js.map +3 -3
- package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
- package/dist/module/Iframe/index.js +18 -3
- package/dist/module/Iframe/index.js.map +2 -2
- package/dist/module/SDK.js +24 -4
- package/dist/module/SDK.js.map +3 -3
- package/dist/module/common/index.d.ts +5 -0
- package/dist/module/common/index.js +1 -1
- package/dist/module/common/index.js.map +2 -2
- package/dist/module/embeddedSDK.js +1 -1
- package/dist/module/helpers/CloudRepository.d.ts +5 -0
- package/dist/module/helpers/cloudRepositoryHelpers.d.ts +10 -0
- package/dist/module/helpers/index.js +17 -2
- package/dist/module/helpers/index.js.map +2 -2
- package/dist/module/host/components/IMyopComponent.d.ts +3 -0
- package/dist/module/host/embeddedSDK.js +1 -1
- package/dist/module/host/index.js +18 -3
- package/dist/module/host/index.js.map +2 -2
- package/dist/module/webcomponent/index.js +18 -3
- package/dist/module/webcomponent/index.js.map +2 -2
- package/package.json +1 -1
- package/dist/cjs/_IframeSDK.3283252f.js.map +0 -7
- package/dist/cjs/_IframeSDK.652f4774.min.js +0 -1
- package/dist/cjs/_MyopHelpers.08d1cf5d.js.map +0 -7
- package/dist/cjs/_MyopHelpers.59521d8f.min.js +0 -1
- package/dist/cjs/_WebComponentSDK.8fe7c9bf.min.js +0 -1
- package/dist/cjs/_WebComponentSDK.e84be6ea.js.map +0 -7
- package/dist/cjs/_hostSDK.de2d767e.min.js +0 -1
- package/dist/cjs/_hostSDK.fa5b3ccf.js.map +0 -7
|
@@ -1046,6 +1046,10 @@ var BaseMyopComponent = class {
|
|
|
1046
1046
|
}
|
|
1047
1047
|
});
|
|
1048
1048
|
}
|
|
1049
|
+
get uiTags() {
|
|
1050
|
+
var _a;
|
|
1051
|
+
return ((_a = this.componentDefinition) == null ? void 0 : _a.uiTags) || [];
|
|
1052
|
+
}
|
|
1049
1053
|
get markedForDisposed() {
|
|
1050
1054
|
return this._markedForDisposed;
|
|
1051
1055
|
}
|
|
@@ -2234,7 +2238,7 @@ var WebcomponentLoader = class extends BaseMyopLoader {
|
|
|
2234
2238
|
};
|
|
2235
2239
|
|
|
2236
2240
|
// version:myop-sdk-version
|
|
2237
|
-
var myop_sdk_version_default = "0.3.
|
|
2241
|
+
var myop_sdk_version_default = "0.3.38";
|
|
2238
2242
|
|
|
2239
2243
|
// src/host/loaders/HTMLComponentLoader.ts
|
|
2240
2244
|
import { EMBEDDED_SDK_CONTENT, HAS_EMBEDDED_SDK } from "./embeddedSDK.js";
|
|
@@ -2749,7 +2753,10 @@ var convertV2VariantToComponentConfig = (config) => {
|
|
|
2749
2753
|
loader: config.consume_variant[0].loader
|
|
2750
2754
|
}
|
|
2751
2755
|
],
|
|
2752
|
-
defaultSkin: 0
|
|
2756
|
+
defaultSkin: 0,
|
|
2757
|
+
// Only `ui:` tags ever reach the client; the server filters, absent = none.
|
|
2758
|
+
// @ts-ignore
|
|
2759
|
+
uiTags: Array.isArray(config.uiTags) ? config.uiTags : []
|
|
2753
2760
|
},
|
|
2754
2761
|
name: config.name
|
|
2755
2762
|
};
|
|
@@ -2948,6 +2955,14 @@ var _CloudRepository = class _CloudRepository {
|
|
|
2948
2955
|
const { cacheKey } = this.resolveParams(componentId, env, preview);
|
|
2949
2956
|
return ((_a = this.variants[cacheKey]) == null ? void 0 : _a.resolved) || null;
|
|
2950
2957
|
}
|
|
2958
|
+
/**
|
|
2959
|
+
* The `ui:` tags of an already-resolved component (`[]` if it has none or is not
|
|
2960
|
+
* resolved yet). Synchronous, no request: tags arrive with the component itself.
|
|
2961
|
+
*/
|
|
2962
|
+
getComponentTags(componentId, env, preview) {
|
|
2963
|
+
var _a, _b;
|
|
2964
|
+
return ((_b = (_a = this.getResolvedConfig(componentId, env, preview)) == null ? void 0 : _a.type) == null ? void 0 : _b.uiTags) || [];
|
|
2965
|
+
}
|
|
2951
2966
|
/**
|
|
2952
2967
|
* Resolve which (env, preview) pair — and therefore which cache key — a call
|
|
2953
2968
|
* for `componentId` refers to.
|
|
@@ -3653,4 +3668,4 @@ defineDynamicImport("WebComponentSDK", WebComponentSDK);
|
|
|
3653
3668
|
export {
|
|
3654
3669
|
WebComponentSDK
|
|
3655
3670
|
};
|
|
3656
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnQudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2dNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudENvcmUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSU15b3BMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9pZnJhbWVMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyLnRzIiwgInZlcnNpb246bXlvcC1zZGstdmVyc2lvbiIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgaW50ZXJmYWNlIElFbGVtZW50UmVmIHtcbiAgICBteW9wSWQ/OiBzdHJpbmdcbiAgICBodG1sVGFnTmFtZTogc3RyaW5nXG4gICAgQm91bmRpbmdSZWN0PzogRE9NUmVjdFxuICAgIG9mZnNldFRvcD86IG51bWJlclxuICAgIG9mZnNldExlZnQ/OiBudW1iZXJcblxuICAgIHR5cGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgWFBhdGhFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB4UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ1hQYXRoRWxlbWVudFJlZidcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBteW9wSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ015b3BFbGVtZW50UmVmJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXJ9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmV4cG9ydCB0eXBlIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwID0gQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPiB8IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgY29uc3QgcnVuRXhlY3V0b3JDbGVhbnVwID0gYXN5bmMgKHRhc2s6IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICB0YXNrKCk7XG4gICAgfSBlbHNlIGlmICh0YXNrIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBJdCdzIGEgUHJvbWlzZSwgYXdhaXQgaXRcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFzaztcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgICAgICByZXN1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0YXNrIGlzIHZvaWQsIGRvIG5vdGhpbmdcbn1cblxudHlwZSBJTWVzc2FnZUV4ZWN1dG9yPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+ID0gKG1lc3NhZ2U6IFQpID0+IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwO1xuXG5pbnRlcmZhY2UgSU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcblxuICAgIGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gaW1wbGVtZW50cyBJTWVzc2FnZUhhbmRsZXI8VD4ge1xuXG4gICAgLy9UT0RPIDogYWRkIGRpc3Bvc2UgbWV0aG9kXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQpIHtcblxuICAgIH1cblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuICAgIGFic3RyYWN0IGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55LCBFID0gYW55PiBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkLCBwdWJsaWMgY29udGV4dD86IEUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxufVxuIiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9CYXNlTWVzc2FnZSc7XG5cbi8vdXNlcidzIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0JpbmRDbGlja01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VUZXh0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3VzdG9tUmVmTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRJbm5lckh0bWwnO1xuXG4vL3N5c3RlbSBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9Jbml0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnZlbG9wZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICAnLi9HZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGVhbnVwTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0Rpc3Bvc2VNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzsiLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudCBpcyByZW5kZXJlZCBpbiBhIHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggTk8gYWNjZXNzIHRvIHRoZSBob3N0IGRvY3VtZW50ICh1bnRydXN0ZWQgY29kZSkuXG4gICAgICogVGhlIGhvc3QgcmVuZGVyIHBvbGljeSBjYW4gYWxzbyBmb3JjZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdyBhIGNvbXBvbmVudCBpcyByZW5kZXJlZCBvbiB0aGUgaG9zdCBwYWdlLCBpbiBhc2NlbmRpbmcgaXNvbGF0aW9uOlxuICogIC0gJ3dlYkNvbXBvbmVudCcgICBcdTIwMTQgY3VzdG9tIGVsZW1lbnQgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG1vc3QgcHJpdmlsZWdlZClcbiAqICAtICdpZnJhbWUnICAgICAgICAgXHUyMDE0IHNhbWUtb3JpZ2luIGlubGluZS1IVE1MIGlmcmFtZSAodG9kYXkncyBkZWZhdWx0KVxuICogIC0gJ2lzb2xhdGVkSWZyYW1lJyBcdTIwMTQgc2FuZGJveGVkLCBjcm9zcy1vcmlnaW4gaWZyYW1lICh1bnRydXN0ZWQgY29kZSlcbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyTW9kZSA9ICd3ZWJDb21wb25lbnQnIHwgJ2lmcmFtZScgfCAnaXNvbGF0ZWRJZnJhbWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclBvbGljeUNvbnRleHQge1xuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnO1xuICAgIHNraW46IElTa2luQ29uZmlnO1xuICAgIC8qKiBXaGF0IHRoZSBjb21wb25lbnQgYXNrZWQgZm9yIChtYXJrZXIgXHUyMUQyICd3ZWJDb21wb25lbnQnLCBjb25maWcuaXNvbGF0aW9uIFx1MjFEMiAnaXNvbGF0ZWRJZnJhbWUnKS4gKi9cbiAgICByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlO1xuICAgIC8qKiBXaGV0aGVyIHRoZSBIVE1MIGNhcnJpZXMgdGhlIGA8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT5gIG1hcmtlci4gKi9cbiAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3N0LXN1cHBsaWVkIGdhdGUgZGVjaWRpbmcgaG93IChvciB3aGV0aGVyKSBhIGNvbXBvbmVudCByZW5kZXJzLiBSZXR1cm4gYVxuICogUmVuZGVyTW9kZSB0byB1c2UsIG9yIGBmYWxzZWAgdG8gYmxvY2sgcmVuZGVyaW5nIGVudGlyZWx5LlxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJQb2xpY3kgPVxuICAgIChjdHg6IFJlbmRlclBvbGljeUNvbnRleHQpID0+IFJlbmRlck1vZGUgfCBmYWxzZSB8IFByb21pc2U8UmVuZGVyTW9kZSB8IGZhbHNlPjtcblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICByZWxlYXNlZE9uPzogc3RyaW5nO1xuICAgIHJlbGVhc2VkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEFjY2VzcyB7XG4gICAgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIHwgJ3VubGlzdGVkJyB8ICdwdWJsaWMnO1xuICAgIHVubGlzdGVkPzoge1xuICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBtYXJrZXRwbGFjZT86IHtcbiAgICAgICAgc3RhdHVzOiAnZHJhZnQnIHwgJ3N1Ym1pdHRlZCcgfCAnY2xhaW1lZCcgfCAnY2xvc2VkJztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgY29udGFjdEVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlYWRsaW5lOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBhY2Nlc3M/OiBDb21wb25lbnRBY2Nlc3MsXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50XG5cbiAgICAvL3JlZiBjb21wb25lbnRzIGNhbiBiZSBlbGVtZW50LWxlc3NcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHNlbmQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gQ2xlYW51cEhhbmRsZXJcblxuICAgIGJpbmQobWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAoKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIGJpbmQ8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5LCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICAvLyBib29sZWFuIHJldHVybmVkIHZhbHVlID0gaGFuZGxlZCBvciBub3RcbiAgICBvbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBib29sZWFuXG5cbiAgICBpbml0aWF0ZWQ6ICgpID0+IFByb21pc2U8YW55PjtcblxuICAgIGRpc3Bvc2U6ICgpID0+IHZvaWRcblxuICAgIGhpZGUoKTogdm9pZDtcblxuICAgIHNob3coKTogdm9pZDtcblxuICAgIGluc3BlY3QoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgaWZyYW1lLWJhc2VkIGNvbXBvbmVudHMuIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZT86IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKSA9PiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBteW9wOnNpemUgbWV0YSB0YWcgZnJvbSB0aGUgY29tcG9uZW50IEhUTUwuXG4gICAgICogU2V0IGJ5IEhUTUxDb21wb25lbnRMb2FkZXIgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbi5cbiAgICAgKiBVc2VkIGJ5IHRoZSBSZWFjdCBob3N0IHRvIGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KS5cbiAgICAgKi9cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIHBhcmVudD86IElNeW9wQ29tcG9uZW50O1xuXG4gICAgcHJvcHM6IFBcblxuICAgIHJlZnM6IFJcbn1cblxuZnVuY3Rpb24gaXNJbmhlcml0RnJvbShvYmo6IGFueSwgYmFzZUNsYXNzOiBhbnkpIHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIGlmICghcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBiYXNlQ2xhc3MubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5oZXJpdEZyb20ocHJvdG8sIGJhc2VDbGFzcyk7XG59XG5cbi8vIFRPRE8gOiBtb3ZlIDogXG50eXBlIG1lc3NhZ2VIYW5kbGVyPFQ+ID0gKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcENvbXBvbmVudDxQID0gYW55LCBSIGV4dGVuZHMgUmVmVHlwZXMgPSBSZWZUeXBlcz4gaW1wbGVtZW50cyBJTXlvcENvbXBvbmVudDxQPiB7XG4gICAgaWQ6IHN0cmluZyA9ICcnXG5cbiAgICBtZXNzYWdlSGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIG1lc3NhZ2VIYW5kbGVyPGFueT5bXT4gPSB7fTtcblxuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCB8fCBIb3N0U0RLLkluc3RhbmNlKCkuYXNzaWduSWQoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zPy50aW1lb3V0ID8gb3B0aW9ucz8udGltZW91dCA6IDUgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCAmJiB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ICYmICF0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYHRpbWVvdXRfJHt0aW1lb3V0fSAke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBhdXRvIGluc3BlY3QsIGNvbnRyb2wgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5ob3N0U0RLLmluc3BlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5pbmNsdWRlcyhoYW5kbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kV2hlbiA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBwcmVkaWNhdGU6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gdm9pZCk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgdXNlIGNvbXBvbmVudC5iaW5kV2hlbiB3aXRob3V0IGFuIGhhbmRsZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV07XG5cbiAgICAgICAgY29uc3QgcHJlZGljYXRlV3JhcHBlZEhhbmRsZXIgPSAoZTogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9UT0RPIDogaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gP1xuICAgICAgICBoYW5kbGVycy5wdXNoKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdvbk1lc3NhZ2VSZWNlaXZlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIGluY29tZU1lc3NhZ2UsIHRoaXMpO1xuICAgICAgICAvL1RPRE8gOiBoYW5kZWwgc3BlY2lhbCBldmV0cyA/IGxpa2UgaW5pdFJlcyA/XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKGluY29tZU1lc3NhZ2UgYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCk7XG5cbiAgICAgICAgICAgIC8va2VlcGluZyB0aGlzLm1ldGhvZCgpIHNvIHRoYXQgY29udGV4dCB3aWxsIHNhdmVkXG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSkge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0odHlwZWRNZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgbWV0aG9kIG5vdCBmb3VuZCAke3R5cGVkTWVzc2FnZS5tZXRob2R9IG9uIGNvbXBvbmVudGAsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1tpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gaGFuZGxlZCB8fCBoYW5kbGVyKGluY29tZU1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBjb25zb2xlIG9ubHkgd2hlbiBkZWJ1ZyBjb25maWdcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIGhhbmRsZXJzIGZvdW5kIGZvciAnLCBpbmNvbWVNZXNzYWdlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSlcbiAgICAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF93aGVuSW5pdGlhdGVkUmVzb2x2ZT86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuICAgIF93aGVuSW5pdGlhdGVkUmVqZWN0PzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG5cbiAgICBfd2hlbkluaXRpYXRlZDogUHJvbWlzZTxhbnk+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpbml0aWF0ZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuSW5pdGlhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZENsZWFudXBNZXNzYWdlKG1lc3NhZ2U6IENsZWFudXBNZXNzYWdlKTogdm9pZCB7XG4gICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbihtZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gbWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgfSwgKG06IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlLmhhbmRsZXIobSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICB0aGlzLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZW5kKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyIHtcbiAgICAgICAgLy9tZXNzYWdlcyB0aGF0IGV4ZXRyYWN0ZWQgZnJvbSBlbnZlbG9wZSBhbHJlYWR5IGhhdmUgc291cmNlIGluIHRoZW1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gdGhpcy5pZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBsZXQgY2xlYW51cEhhbmRsZXI7XG4gICAgICAgIC8vIFRPRE8gOiBmaXggaGVhdnkgb3AuLlxuICAgICAgICAvLyAgaWYgKGlzSW5oZXJpdEZyb20obWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChtZXNzYWdlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIE15b3BCaW5kTWVzc2FnZSk7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4odHlwZWRNZXNzYWdlLnJlcGx5TWVzc2FnZUtleSwgKG1zZzogTXlvcEJpbmRSZXBsYXlNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IHR5cGVkTWVzc2FnZS5oYW5kbGVyVW5pcXVlSWRcbiAgICAgICAgICAgIH0sIHR5cGVkTWVzc2FnZS5oYW5kbGVyKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgIGlmIChtZXNzYWdlLnJlZikge1xuICAgICAgICAgICAgLy8gc2VyaWFsaXphYmxlXG4gICAgICAgICAgICBtZXNzYWdlLnJlZiA9IG1lc3NhZ2UucmVmLl9fbm9uUHJveGllZCB8fCBtZXNzYWdlLnJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDbGVhbnVwTWVzc2FnZShuZXcgQ2xlYW51cE1lc3NhZ2UobWVzc2FnZS5pZCwgKHJlcGxheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2cgcmVwbGF5P1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSBzZGsubG9nZ2VyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdkaXNwb3NpbmcgYmVmb3JlIGlzSW5pdGlhdGVkJywgdGhpcy5pZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBjb21wb25lbnQnLCB0aGlzLmlkKTtcblxuICAgICAgICAvLyAvL1RPRE8gOiBpbXBsZW1lbnQgZGlzcG9zZSBmbG93XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHRoaXMucmVmcykuZm9yRWFjaChyZWZLZXk9PntcbiAgICAgICAgLy8gICAgIHRoaXMucmVmc1tyZWZLZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGhlcmUgaXMgYW55IHRpbWUgZm9yIHRoZSBvXG4gICAgICAgIC8vIHRoZXIgc2lkZSB0byBwcm9jY2VzcyB0byBtZXNzYWdlIGJlZm9yZSBkaWUgP1xuICAgICAgICAvL25vdGlmeSB0aGUgb3RoZXIgc2lkZSBTREtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBEaXNwb3NlTWVzc2FnZSgpKVxuXG4gICAgICAgIGNvbnN0IG9uRGlzcG9zZUhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbJ29uRGlzcG9zZSddXG4gICAgICAgIGlmIChvbkRpc3Bvc2VIYW5kbGVycykge1xuICAgICAgICAgICAgb25EaXNwb3NlSGFuZGxlcnMuZm9yRWFjaChkaXNwb3NlSGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBudWxsIG9yIGZpeCB0aGUgdHlwZSA/XG4gICAgICAgICAgICAgICAgZGlzcG9zZUhhbmRsZXIobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzID0ge31cbiAgICAgICAgdGhpcy5pZCArPSAnX2Rpc3Bvc2VkJztcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByb3BzOiBQID0ge30gYXMgdW5rbm93biBhcyBQO1xuICAgIHJlZnM6IFIgPSB7fSBhcyB1bmtub3duIGFzIFI7XG59XG4iLCAiZXhwb3J0IGNvbnN0IEVycm9ycyA9IHtcbiAgICBub3RTZXJpYWxpemFibGVSZWZDYWxsOiAocHJvcCwgYXJnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG5UaGUgaW5wdXQgcHJvdmlkZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgaXMgbm90IHNlcmlhbGl6YWJsZS4gU2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYW4gYmUgc2FmZWx5IHRyYW5zZmVycmVkIHRvIHRoZSBza2luIGltcGxlbWVudGF0aW9uLiBcblRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGF0YSBhcmUgY29uc2lkZXJlZCBub24tc2VyaWFsaXphYmxlIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkOlxuXG4tIEZ1bmN0aW9uc1xuLSBET00gZWxlbWVudHNcbi0gQ2xhc3MgaW5zdGFuY2VzXG4tIENpcmN1bGFyIHJlZmVyZW5jZXNcbi0gU3ltYm9sc1xuLSBCaWdJbnQgdmFsdWVzXG5cbkluIHRoZSBmb2xsb3dpbmcgZXhlY3V0aW9uIHdlIGRldGVjdGVkIDpcbn5+fn5+fn5+XG4ke2FyZ30gXG5+fn5+fn5+flxuYXMgbm90IHNlcmlhbGl6YWJsZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGlucHV0cyBwYXNzZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgYXJlIGluIGEgc2VyaWFsaXphYmxlIGZvcm1hdC5cblRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMpLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLiBcbklmIHlvdSBuZWVkIHRvIGluY2x1ZGUgY29tcGxleCBkYXRhIHR5cGVzLCBjb25zaWRlciBjb252ZXJ0aW5nIHRoZW0gdG8gYSBzZXJpYWxpemFibGUgc3RydWN0dXJlIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGZ1bmN0aW9uLlxuT3IgdXNlIE15b3AgbWVzc2FnZSB0aGF0IHN1cHBvcnQgaXQ6IEN1c3RvbVJlZk1lc3NhZ2UsIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlIG9yIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLlxuXG5TdWdnZXN0ZWQgRml4OlxuMS4gUmVtb3ZlIG9yIHJlcGxhY2Ugbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgZnJvbSB5b3VyIGlucHV0LlxuMi4gSWYgdXNpbmcgb2JqZWN0cywgZW5zdXJlIHRoZXkgZG8gbm90IGNvbnRhaW4gYW55IGZ1bmN0aW9ucyBvciBjaXJjdWxhciByZWZlcmVuY2VzLlxuMy4gQ29udmVydCBhbnkgY2xhc3MgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHMgb3IgSlNPTi1jb21wYXRpYmxlIGZvcm1hdHMuXG40LiBVc2UgZGVkaWNhdGVkIE15b3AgbWVzc2FnZS5cblxuRm9yIG1vcmUgZGV0YWlscyBvbiBzZXJpYWxpemF0aW9uIGFuZCBNeW9wIG1lc3NhZ2UgZXhhbXBsZXMsIHJlZmVyIHRvIGh0dHBzOi8vZG9jcy5teW9wLmRldlxcLlxuXG5gKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50LCBJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RW52ZWxvcGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2VcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BSZWZDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBwYXJlbnQ6IElNeW9wQ29tcG9uZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICAvL1RPRE8gOiBjaGVjayBwYXJlbnRDb21wb25lbnQuY29udGFpbmVyLi4uXG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIHBhcmVudC5jb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKGFyZ3VtZW50cy5jYWxsZWUubmFtZSkpO1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2hpZGUnKSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzaG93JykpO1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVhbCBjbGVhbnVwXG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBpbnNwZWN0IGNhbGxlZCwgY3JlYXRpbmcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBpbnNwZWN0JywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgdGhpcy5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2luc3BlY3QnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQnKSk7XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnKSB7XG4gICAgICAgIC8vICBkZWJ1Z2dlcjtcbiAgICAgICAgLy8gICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgd3JhcHBlciBmb3IgTXlvcCBXZWIgQ29tcG9uZW50cyB0aGF0IGFyZSBleHRyYWN0ZWQgZnJvbSBIVE1MXG4gKiBhbmQgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50IChub3QgaW4gYW4gaWZyYW1lKS5cbiAqXG4gKiBUaGVzZSBjb21wb25lbnRzIHVzZSB0aGUgbmF0aXZlIFdlYiBDb21wb25lbnRzIEFQSSAoQ3VzdG9tIEVsZW1lbnRzICsgU2hhZG93IERPTSlcbiAqIGFuZCBjb21tdW5pY2F0ZSB2aWEgZGlyZWN0IG1ldGhvZCBjYWxscyBhbmQgQ3VzdG9tRXZlbnRzIGluc3RlYWQgb2YgcG9zdE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuICAgIHByaXZhdGUgY3RhQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8e2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3dufT4gPSBbXTtcblxuICAgIC8vIEEgc2luZ2xlICdteW9wLWN0YScgbGlzdGVuZXIsIGF0dGFjaGVkIGF0IGNvbnN0cnVjdGlvbiBzbyBDVEFzIGEgY29tcG9uZW50XG4gICAgLy8gZGlzcGF0Y2hlcyBkdXJpbmcgaXRzIGZpcnN0IGluaXRXaXRoRGF0YSgpIHJlbmRlciBcdTIwMTQgYmVmb3JlIHRoZSBob3N0IGF0dGFjaGVzXG4gICAgLy8gYSBoYW5kbGVyIFx1MjAxNCBhcmUgYnVmZmVyZWQgKGFuZCBmbHVzaGVkIG9uIHNldEN0YUhhbmRsZXIpLCBtYXRjaGluZyB0aGUgaWZyYW1lXG4gICAgLy8gcGF0aCdzIHByZS1oYW5kbGVyIENUQSBxdWV1ZS5cbiAgICBwcml2YXRlIF9jdGFMaXN0ZW5lciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSAoZSBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgICAgICBpZiAoIWRldGFpbD8uYWN0aW9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFIYW5kbGVyKGRldGFpbC5hY3Rpb24sIGRldGFpbC5wYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZGV0YWlsLmFjdGlvbiwgcGF5bG9hZDogZGV0YWlsLnBheWxvYWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgdGFnTmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICkge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuXG4gICAgICAgIC8vIExpc3RlbiBCRUZPUkUgYW55IGluaXRXaXRoRGF0YSByZW5kZXIgc28gaW5pdC10aW1lIENUQXMgYXJlbid0IGxvc3QuXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jdGFDbGVhbnVwID0gKCkgPT4gdGhpcy5jdXN0b21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuXG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGFyZSBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgKG5vIHBvc3RNZXNzYWdlIGhhbmRzaGFrZSBuZWVkZWQpXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge307XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgd2l0aCBkYXRhIGJ5IGNhbGxpbmcgbXlvcF9pbml0X2ludGVyZmFjZSBkaXJlY3RseVxuICAgICAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgZGF0YSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBDVEEgaGFuZGxlciAtIHVuaWZpZWQgQVBJIHdpdGggaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICogQ2FsbGVkIHZpYSBwcm9wcy5teW9wX2N0YV9oYW5kbGVyID0gaGFuZGxlclxuICAgICAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSAnbXlvcC1jdGEnIGxpc3RlbmVyIGlzIGF0dGFjaGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gd2Ugb25seSBzZXQgdGhlXG4gICAgICAgIC8vIGhhbmRsZXIgYW5kIGZsdXNoIGFueXRoaW5nIHRoZSBjb21wb25lbnQgZW1pdHRlZCBiZWZvcmUgbm93IChlLmcuIGR1cmluZyB0aGVcbiAgICAgICAgLy8gZmlyc3QgaW5pdFdpdGhEYXRhIHJlbmRlcikuXG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbWVzc2FnZS1iYXNlZCBjb21wb25lbnRzLlxuICAgICAqIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSBwb3N0TWVzc2FnZSwgc28gdGhpcyBpcyBhIG5vLW9wIGZvciBtb3N0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHRoZSBwb3N0TWVzc2FnZSBzeXN0ZW1cbiAgICAgICAgLy8gSW5zdGVhZCwgaW50ZXJhY3QgZGlyZWN0bHkgdmlhIHByb3BzLm15b3BfaW5pdF9pbnRlcmZhY2UgYW5kIHByb3BzLm15b3BfY3RhX2hhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIExvZyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XSBzZW5kKCkgY2FsbGVkIC0gd2ViIGNvbXBvbmVudHMgdXNlIGRpcmVjdCBBUEkgaW5zdGVhZCcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLmN0YUNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IG5vIHNhbWUtb3JpZ2luIGFjY2VzcyBcdTIwMTQgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2VcbiAgICAgICAgICAgICAgICAvLyAoc2FtZSBtZXRob2Qgc3VyZmFjZSBhcyB0aGUgZXh0cmFjdGVkLVdDIGJyYW5jaCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIG15b3BfY3RhX2hhbmRsZXIgaXMgd3JpdGUtb25seVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVCAoYmVmb3JlIGxvY2FsRnJhbWUgY2hlY2spXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgbWF5IGhhdmUgc2hhZG93Um9vdE1vZGU6IGxvY2FsRnJhbWUgaW4gdGhlaXIgY29uZmlnXG4gICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgcnVuIGRpcmVjdGx5IG9uIHRoZSBob3N0IGRvY3VtZW50LCBub3QgaW4gYW4gaWZyYW1lXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJc29sYXRlZCBpZnJhbWU6IHJvdXRlIHZpYSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChubyBzYW1lLW9yaWdpbiBhY2Nlc3MpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicpIHsgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykgeyBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSAoY29tcG9uZW50LmVsZW1lbnQgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3cgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlYWwgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvd1twcm9wTmFtZV0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggQ1RBIHF1ZXVlIGlmIHRoaXMgaXMgbXlvcF9jdGFfaGFuZGxlciBhbmQgcXVldWUgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJyAmJiBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBudWxsOyAvLyBDbGVhciB0byBwcmV2ZW50IGRvdWJsZS1mbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goKGl0ZW06IHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogYW55fSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGNvbXBvbmVudCB3YXMgZGlzcG9zZWQgZHVyaW5nIGZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgcmVmIGNvbXBvbmVudHMgZGVmaW5lIGluIHRoZSBjb21wb25lbnQgY29uZmlnXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvb3QgY29tcG9uZW50IHRoZSBiZSBpbml0aWF0ZWQgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG5cbiAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy9yZWplY3QoJ3RpbWVvdXQ/Jyk7XG4gICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgfSwgNTAwMCk7XG5cbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UocmVmLnJlZkNvbmZpZyxcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zID8gb3B0aW9ucyA6IHt9LFxuICAgICAgICAgICAgICAgIGlkOiByZWZDb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgX2hhc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aW1lb3V0IGFscmVhZHkgcGFzc2VkXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0F1dG9TaXplT3B0aW9ucywgQmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBwcml2YXRlIF9hdXRvU2l6ZUNsZWFudXA/OiBDbGVhbnVwSGFuZGxlcjtcbiAgICBwcml2YXRlIF9hdXRvU2l6ZU9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVVcGRhdGU/OiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiAoc2FuZGJveGVkIGNyb3NzLW9yaWdpbiBmcmFtZSkgXHUyMDE0IHBvc3RNZXNzYWdlIGJyaWRnZSwgaG9zdCBzaWRlIFx1MjUwMFx1MjUwMFxuICAgIHB1YmxpYyBpc29sYXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2xhc3REYXRhPzogdW5rbm93bjsgICAgICAgICAgICAgICAvLyBjYWNoZWQgbGFzdC1zZW50IGRhdGEgKHN5bmMgZ2V0RGF0YSlcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7IGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duIH0+ID0gW107XG4gICAgcHJpdmF0ZSBfaXNvTXNnSGFuZGxlcj86IChlOiBNZXNzYWdlRXZlbnQpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfaXNvU2l6ZU9wdHM/OiBBdXRvU2l6ZU9wdGlvbnM7XG4gICAgcHJpdmF0ZSBfaXNvQXV0b1NpemUgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJpZGdlIHNpemluZyBvbmx5IHdoZW4gYXV0by1zaXplIGlzIG9uXG4gICAgcHJpdmF0ZSBfaXNvTGFzdFNpemU/OiB7IGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlciB9OyAgLy8gbGFzdCByZXBvcnRlZCBzaXplIChmb3IgdGhlIGVuYWJsZSByYWNlKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IG9wdGlvbnM/LmRhdGE7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIGJyaWRnZSAoaG9zdCBzaWRlKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvKiogQXR0YWNoIHRoZSBob3N0LXNpZGUgcG9zdE1lc3NhZ2UgbGlzdGVuZXIgZm9yIGEgc2FuZGJveGVkIGZyYW1lLiAqL1xuICAgIGVuYWJsZUlzb2xhdGlvbigpIHtcbiAgICAgICAgdGhpcy5pc29sYXRlZCA9IHRydWU7XG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBkb24ndCBydW4gdGhlIElmcmFtZVNESyBoYW5kc2hha2UgKG5vIHNhbWUtb3JpZ2luIGluaXQpLFxuICAgICAgICAvLyBzbyBtYXJrIGluaXRpYXRlZCBpbW1lZGlhdGVseSBcdTIwMTQgbGlrZSB0aGUgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgZG9lcy5cbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IChlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLnNvdXJjZSAhPT0gdGhpcy5JZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGQ6IGFueSA9IGUuZGF0YTtcbiAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6Y3RhJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB0aGlzLl9jdGFIYW5kbGVyKGQuYWN0aW9uLCBkLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkLmFjdGlvbiwgcGF5bG9hZDogZC5wYXlsb2FkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdteW9wOnNpemUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJc29TaXplKGQuaGVpZ2h0LCBkLndpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBQb3N0cyBpbml0IG92ZXIgdGhlIGJyaWRnZS4gKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXN0RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmluaXQnLCBkYXRhIH0sICcqJyk7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gZ2V0dGVyIFx1MjAxNCByZXR1cm5zIHRoZSBsYXN0IGRhdGEgdGhlIGhvc3Qgc2VudCAoY2FjaGVkLCBzeW5jaHJvbm91cykuICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3REYXRhO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLW91dCBcdTIwMTQgdW5pZmllZCB3aXRoIHRoZSBleHRyYWN0ZWQtV0MgQVBJLiBGbHVzaGVzIENUQXMgcXVldWVkIHByZS1oYW5kbGVyLiAqL1xuICAgIHNldEN0YUhhbmRsZXIoaGFuZGxlcjogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N0YUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7IGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgaGFuZGxlcihpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseUlzb1NpemUoaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghaGVpZ2h0IHx8IE51bWJlci5pc05hTihoZWlnaHQpKSByZXR1cm47XG4gICAgICAgIC8vIEFsd2F5cyByZW1lbWJlciB0aGUgbGF0ZXN0IHJlcG9ydGVkIHNpemUgc28gaXQgY2FuIGJlIGFwcGxpZWQgaWYvd2hlblxuICAgICAgICAvLyBhdXRvLXNpemluZyBpcyBlbmFibGVkIGFmdGVyIHRoZSBmaXJzdCBtZXNzYWdlIGFycml2ZXMuXG4gICAgICAgIHRoaXMuX2lzb0xhc3RTaXplID0geyBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgIC8vIFJlc3BlY3QgYXV0b1NpemU6ZmFsc2UgXHUyMDE0IHRoZSBob3N0IG93bnMgZGltZW5zaW9ucywgc28gZG9uJ3QgdG91Y2ggdGhlbS5cbiAgICAgICAgaWYgKCF0aGlzLl9pc29BdXRvU2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5faXNvU2l6ZU9wdHM7XG4gICAgICAgIGNvbnN0IHRvTnVtID0gKHY6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgICAgICAgICAgdiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogKHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiAoaXNOYU4ocGFyc2VGbG9hdCh2KSkgPyB1bmRlZmluZWQgOiBwYXJzZUZsb2F0KHYpKSk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRvTnVtKG9wdHM/Lm1pbkhlaWdodCksIG1heCA9IHRvTnVtKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgIGxldCBoID0gaGVpZ2h0O1xuICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgaCA8IG1pbikgaCA9IG1pbjtcbiAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIGggPiBtYXgpIGggPSBtYXg7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3cgYXQgdGhlIG1lYXN1cmVkIGhlaWdodC5cbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmluc2V0ID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oeyB3aWR0aDogd2lkdGggPz8gdGhpcy5JZnJhbWVFbGVtZW50LmNsaWVudFdpZHRoLCBoZWlnaHQ6IGgsIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsIGF1dG9TaXppbmdIZWlnaHQ6IHRydWUgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyBjYW4ndCBiZSBtZWFzdXJlZCBjcm9zcy1vcmlnaW4gXHUyMDE0IHNpemluZyBpcyBkcml2ZW4gYnlcbiAgICAgICAgLy8gJ215b3A6c2l6ZScgcG9zdE1lc3NhZ2VzIGZyb20gdGhlIGJyaWRnZSAoc2VlIF9hcHBseUlzb1NpemUpLlxuICAgICAgICBpZiAodGhpcy5pc29sYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNvU2l6ZU9wdHMgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5faXNvQXV0b1NpemUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1vc3QgcmVjZW50IGJyaWRnZS1yZXBvcnRlZCBzaXplIChpdCBtYXkgaGF2ZSBhcnJpdmVkIGJlZm9yZVxuICAgICAgICAgICAgLy8gYXV0by1zaXppbmcgd2FzIHR1cm5lZCBvbikuXG4gICAgICAgICAgICBpZiAodGhpcy5faXNvTGFzdFNpemUpIHRoaXMuX2FwcGx5SXNvU2l6ZSh0aGlzLl9pc29MYXN0U2l6ZS5oZWlnaHQsIHRoaXMuX2lzb0xhc3RTaXplLndpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IHRoaXMuX2lzb0F1dG9TaXplID0gZmFsc2U7IHRoaXMuX2lzb1NpemVPcHRzID0gdW5kZWZpbmVkOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHJlLWV2YWx1YXRlIHdpdGggbmV3IG9wdGlvbnMgYW5kIHJldXNlIHRoZW1cbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCAmJiB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRvU2l6ZUNsZWFudXA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW015b3BJZnJhbWVDb21wb25lbnRdIENhbm5vdCBvYnNlcnZlIGF1dG8gc2l6ZTogY29udGVudERvY3VtZW50IG5vdCBhY2Nlc3NpYmxlJyk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcCA9ICh2YWx1ZTogbnVtYmVyLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCBtaW4pIHJldHVybiBtaW47XG4gICAgICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBtYXgpIHJldHVybiBtYXg7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUGFyc2UgQ1NTIHNpemUgdmFsdWVzIHRvIG51bWJlcnNcbiAgICAgICAgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBpc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghY29udGVudERvYykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fYXV0b1NpemVPcHRpb25zO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5taW5XaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWluSGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyTWluSGVpZ2h0ID0gb3B0cz8ubG9hZGVyTWluSGVpZ2h0ID8/IDUwO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGV4cGxpY2l0IGRpbWVuc2lvbnM6IGhvc3Qgb3B0aW9ucyBcdTIxOTIgc2l6ZU1ldGEgZmlsbCBtb2RlIFx1MjE5MiB3aWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIlxuICAgICAgICAgICAgLy8gV2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCIgKGJsb2NrIGVsZW1lbnQgYmVoYXZpb3IpIHRvIHByZXZlbnQgdGhlIHNocmluay10by0wIG1lYXN1cmVtZW50IGJ1Zy5cbiAgICAgICAgICAgIC8vIEhlaWdodCBoYXMgbm8gZGVmYXVsdCBzbyBpdCBhdXRvLXNpemVzIHRvIGNvbnRlbnQuXG4gICAgICAgICAgICAvLyBPbmx5IHNpemVNZXRhIFwiMTAwJVwiIChmaWxsIG1vZGUpIGlzIHRyZWF0ZWQgYXMgZXhwbGljaXQgYW5kIGRpc2FibGVzIGF1dG8tc2l6aW5nLlxuICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZU1ldGEgdmFsdWVzIChlLmcuLCBoZWlnaHQ6IDIwMCkgYXJlIGluaXRpYWwgaGludHMsIE5PVCBleHBsaWNpdCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbFdpZHRoID0gdGhpcy5zaXplTWV0YT8ud2lkdGggPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxIZWlnaHQgPSB0aGlzLnNpemVNZXRhPy5oZWlnaHQgPT09IFwiMTAwJVwiID8gXCIxMDAlXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0V2lkdGggPSBvcHRzPy5leHBsaWNpdFdpZHRoID8/IHNpemVNZXRhRmlsbFdpZHRoID8/IFwiMTAwJVwiO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9IG9wdHM/LmV4cGxpY2l0SGVpZ2h0ID8/IHNpemVNZXRhRmlsbEhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0V2lkdGggPSByZXNvbHZlZEV4cGxpY2l0V2lkdGggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SGVpZ2h0ID0gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAvLyBEZXRlY3QgY29sbGFwc2VkIGRpbWVuc2lvbnMgZnJvbSBjb250YWluZXIgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkV2lkdGggPSBjb250YWluZXJSZWN0LndpZHRoID09PSAwO1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgY29sbGFwc2VkIGlmIGhlaWdodCBpcyAwIE9SIGVxdWFscyB0aGUgbG9hZGVyIG1pbkhlaWdodFxuICAgICAgICAgICAgY29uc3QgY29sbGFwc2VkSGVpZ2h0ID0gY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDAgfHwgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IGxvYWRlck1pbkhlaWdodDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGRpbWVuc2lvbnMgdG8gYXV0by1zaXplOlxuICAgICAgICAgICAgLy8gLSBJZiBmb3JjZUF1dG9TaXplIGlzIHRydWUsIGF1dG8tc2l6ZSB1bmxlc3MgZXhwbGljaXQgZGltZW5zaW9uIGlzIHNldFxuICAgICAgICAgICAgLy8gLSBPdGhlcndpc2UsIGF1dG8tc2l6ZSBvbmx5IGlmIGNvbGxhcHNlZFxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1dpZHRoID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0V2lkdGhcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRXaWR0aCAmJiAhaGFzRXhwbGljaXRXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvSGVpZ2h0ID0gb3B0cz8uZm9yY2VBdXRvU2l6ZVxuICAgICAgICAgICAgICAgID8gIWhhc0V4cGxpY2l0SGVpZ2h0XG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkSGVpZ2h0ICYmICFoYXNFeHBsaWNpdEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgbmVlZHMgYXV0by1zaXppbmcsIGFwcGx5IGV4cGxpY2l0L3BlcmNlbnRhZ2UgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKCFzaG91bGRBdXRvV2lkdGggJiYgIXNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuXG4gICAgICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0V2lkdGggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBvbiBpZnJhbWUgYW5kIGNvbnRhaW5lciBmb3IgdGhlIGVudGlyZVxuICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgKyBoZWlnaHQtc2V0dGluZyBjeWNsZS4gSG9zdCBhcHBzIG1heSBzZXQgYHRyYW5zaXRpb246IGFsbGBcbiAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGFuaW1hdGUgdGhlIDBweCBjb2xsYXBzZSBhbmQgZmluYWwgaGVpZ2h0IGNoYW5nZSwgY2F1c2luZ1xuICAgICAgICAgICAgLy8gdmlzaWJsZSBqdW1wcyBkdXJpbmcgc2Nyb2xsLlxuICAgICAgICAgICAgY29uc3QgcHJldlRyYW5zaXRpb24gPSBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgICAgY29uc3QgcHJldkNvbnRhaW5lclRyYW5zaXRpb24gPSBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIC8vIFF1aWNrIHByZS1jaGVjazogcmVhZCBzY3JvbGxIZWlnaHQvV2lkdGggQkVGT1JFIGNvbGxhcHNpbmcgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIC8vIElmIGNvbnRlbnQgb25seSBncmV3IChzY3JvbGxIZWlnaHQgPiBpZnJhbWUgaGVpZ2h0KSwgd2UgY2FuIHNraXAgdGhlXG4gICAgICAgICAgICAvLyAwcHggY29sbGFwc2UgXHUyMDE0IHNjcm9sbEhlaWdodCBuYXR1cmFsbHkgZXhwYW5kcyBiZXlvbmQgdGhlIGlmcmFtZS5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVIZWlnaHQgPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZVdpZHRoID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsSGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgcHJlU2Nyb2xsV2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSBwcmVTY3JvbGxXaWR0aDtcbiAgICAgICAgICAgIGxldCBjb250ZW50SGVpZ2h0ID0gcHJlU2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBoZWlnaHRHcmV3ID0gc2hvdWxkQXV0b0hlaWdodCAmJiBwcmVTY3JvbGxIZWlnaHQgPiBjdXJyZW50SWZyYW1lSGVpZ2h0ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoR3JldyA9IHNob3VsZEF1dG9XaWR0aCAmJiBwcmVTY3JvbGxXaWR0aCA+IGN1cnJlbnRJZnJhbWVXaWR0aCArIDE7XG5cbiAgICAgICAgICAgIC8vIEZvciBub24tZ3JvdyBjYXNlcyAoc2hyaW5rIG9yIG5vLWNoYW5nZSksIHdlIG11c3QgY29sbGFwc2UgdG8gMHB4IHRvXG4gICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSB0cnVlIGNvbnRlbnQgaGVpZ2h0LiBzY3JvbGxIZWlnaHQgY2FuIG5ldmVyIGRlY3JlYXNlIGJlbG93XG4gICAgICAgICAgICAvLyB0aGUgaWZyYW1lJ3MgY2xpZW50SGVpZ2h0LCBzbyBzaHJpbmsgaXMgdW5kZXRlY3RhYmxlIHdpdGhvdXQgY29sbGFwc2luZy5cbiAgICAgICAgICAgIC8vIFdpdGggdHJhbnNpdGlvbnMgZGlzYWJsZWQgKyBjb250YWluZXIgbWluLWhlaWdodCBoZWxkLCB0aGUgY29sbGFwc2VcbiAgICAgICAgICAgIC8vIGlzIGludmlzaWJsZSAobm8gbGF5b3V0IHNoaWZ0LCBubyBhbmltYXRpb24pLlxuICAgICAgICAgICAgY29uc3QgbmVlZHNIZWlnaHRDb2xsYXBzZSA9IHNob3VsZEF1dG9IZWlnaHQgJiYgIWhlaWdodEdyZXc7XG4gICAgICAgICAgICBjb25zdCBuZWVkc1dpZHRoQ29sbGFwc2UgPSBzaG91bGRBdXRvV2lkdGggJiYgIXdpZHRoR3JldztcblxuICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UgfHwgbmVlZHNXaWR0aENvbGxhcHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gSG9sZCB0aGUgY29udGFpbmVyJ3MgbWluLWhlaWdodC93aWR0aCBkdXJpbmcgbWVhc3VyZW1lbnQgdG8gcHJldmVudFxuICAgICAgICAgICAgICAgIC8vIGxheW91dCBzaGlmdCAoZWxlbWVudHMgYmVsb3cgdGhlIGlmcmFtZSB3b24ndCBqdW1wKS5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluSGVpZ2h0ID0gY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TWluV2lkdGggPSBjb250YWluZXIuc3R5bGUubWluV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBgJHtjdXJyZW50SWZyYW1lSGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBgJHtjdXJyZW50SWZyYW1lV2lkdGh9cHhgO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzSGVpZ2h0Q29sbGFwc2UpIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNXaWR0aENvbGxhcHNlKSBpZnJhbWUuc3R5bGUud2lkdGggPSAnMHB4JztcblxuICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIGNvbGxhcHNpbmcgdG8gMHB4IGdhdmUgYSBuZWFyLXplcm8gbWVhc3VyZW1lbnQsIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvLyBsaWtlbHkgaGFzIGBoZWlnaHQ6IDEwMCVgIGNoYWlucyAoaHRtbCA+IGJvZHkgPiAuYXBwLWNvbnRhaW5lcikgdGhhdCBjYXNjYWRlZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBjb2xsYXBzZSBpbnRvIGFsbCBjaGlsZHJlbi4gUmV0cnkgd2l0aCBhIG51Y2xlYXIgb3ZlcnJpZGUgdGhhdCBmb3JjZXMgYWxsXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdG8gaW50cmluc2ljIHNpemluZy4gVGhpcyBpcyBvbmx5IGEgZmFsbGJhY2sgYmVjYXVzZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAvLyBicmVha3MgZXhwbGljaXQgcGl4ZWwgaGVpZ2h0cyAoZS5nLiA4cHggaW5kaWNhdG9yIGRvdHMgXHUyMTkyIDBweCkuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFySGVpZ2h0ID0gbmVlZHNIZWlnaHRDb2xsYXBzZSAmJiBjb250ZW50SGVpZ2h0IDwgMjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJXaWR0aCA9IG5lZWRzV2lkdGhDb2xsYXBzZSAmJiBjb250ZW50V2lkdGggPCAyO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQgfHwgbmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZVN0eWxlID0gY29udGVudERvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUuaWQgPSAnX19teW9wX21lYXN1cmUnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLWhlaWdodDogMCAhaW1wb3J0YW50JywgJ21heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMucHVzaCgnd2lkdGg6IGF1dG8gIWltcG9ydGFudCcsICdtaW4td2lkdGg6IDAgIWltcG9ydGFudCcsICdtYXgtd2lkdGg6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS50ZXh0Q29udGVudCA9IGAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgJHtydWxlcy5qb2luKCc7ICcpfTsgZmxleC1iYXNpczogYXV0byAhaW1wb3J0YW50OyBmbGV4LWdyb3c6IDAgIWltcG9ydGFudDsgfWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREb2MuaGVhZC5hcHBlbmRDaGlsZChtZWFzdXJlU3R5bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjb250YWluZXIgY29uc3RyYWludHMgaW1tZWRpYXRlbHkgKHNhbWUgZnJhbWUsIGJlZm9yZSBwYWludClcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gcHJldk1pbkhlaWdodDtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSBwcmV2TWluV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2xhbXAoY29udGVudFdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY2xhbXAoY29udGVudEhlaWdodCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTZXQgYXV0by1zaXplZCBkaW1lbnNpb25zIHRvIG1lYXN1cmVkIHZhbHVlcywgbm9uLWF1dG8gdG8gZXhwbGljaXQvMTAwJVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9XaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRIZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGZpbmFsIGRpbWVuc2lvbnMgYXJlIGFwcGxpZWQgd2l0aG91dCB0cmFuc2l0aW9uLFxuICAgICAgICAgICAgLy8gdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmcmFtZS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbjtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgZm9yY2Ugb3ZlcmZsb3cgXHUyMDE0IGxldCB0aGUgY29tcG9uZW50L3BhcmVudCBjb250cm9sIHNjcm9sbGluZy5cbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IG92ZXJmbG93OiBhdXRvIHdoZW4gY29udGVudCBleGNlZWRzIG1heCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgIGNvbnN0IGlzV2lkdGhDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9XaWR0aCAmJiBtYXhXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRXaWR0aCA+IG1heFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgaXNIZWlnaHRDb25zdHJhaW5lZCA9IHNob3VsZEF1dG9IZWlnaHQgJiYgbWF4SGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29udGVudEhlaWdodCA+IG1heEhlaWdodDtcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IGlzV2lkdGhDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaXNIZWlnaHRDb25zdHJhaW5lZCA/ICdhdXRvJyA6ICcnO1xuXG4gICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogc2hvdWxkQXV0b1dpZHRoLFxuICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IHNob3VsZEF1dG9IZWlnaHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEluaXRpYWwgc2l6ZSAocnVuIHN5bmNocm9ub3VzbHksIG5vdCBkZWJvdW5jZWQpXG4gICAgICAgIHVwZGF0ZVNpemUoKTtcblxuICAgICAgICAvLyBTdG9yZSB1cGRhdGVTaXplIGZvciByZWVudHJhbnQgY2FsbHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1cGRhdGVTaXplO1xuXG4gICAgICAgIC8vIERlYm91bmNlIG9ic2VydmVyIGNhbGxiYWNrcyB2aWEgckFGIFx1MjAxNCBhdCBtb3N0IG9uZSB1cGRhdGVTaXplIHBlciBmcmFtZS5cbiAgICAgICAgLy8gUHJldmVudHMgbGF5b3V0IHRocmFzaGluZyBmcm9tIGhpZ2gtZnJlcXVlbmN5IG11dGF0aW9ucyAoZS5nLiBDU1MgYW5pbWF0aW9ucykuXG4gICAgICAgIGxldCByYWZJZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gT2JzZXJ2ZSBmb3IgY2hhbmdlc1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBjYXRjaGVzIERPTSBjb250ZW50IGNoYW5nZXMgKGUuZy4gcmVtb3ZpbmcgbGlzdCBpdGVtcywgdG9nZ2xpbmcgdmlld3MpXG4gICAgICAgIC8vIHRoYXQgZG9uJ3QgdHJpZ2dlciBSZXNpemVPYnNlcnZlciBiZWNhdXNlIHRoZSBib2R5IGJveC1zaXplIHN0YXlzIHRoZSBzYW1lXG4gICAgICAgIC8vIChib2R5IGZpbGxzIGlmcmFtZSwgaWZyYW1lIGhhc24ndCBzaHJ1bmsgeWV0KS5cbiAgICAgICAgLy8gYGF0dHJpYnV0ZXM6IHRydWVgIGNhdGNoZXMgQ1NTIGNsYXNzL3N0eWxlIGNoYW5nZXMgKGUuZy4gZGlzcGxheTpub25lIHRvZ2dsaW5nIHZpZXdzKS5cbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGlmIChyYWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVVcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IGNsZWFudXA7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAoKTtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNvTXNnSGFuZGxlcikge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9pc29Nc2dIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lU3R5bGVzID0gYFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJzEwMCUnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGlmcmFtZVN0eWxlcztcblxuICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgYXR0cmlidXRlcyBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbGVtZW50QXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnQvY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyICwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAvL1RPRE8gOiBjYW4gYmUgZG9uZSB3aXRob3V0IGNsb25pbmc/XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZV8uaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuXG4gICAgICAgIGNvbnN0IG1zZyA9IG5ldyBDdXN0b21FdmVudDxCYXNlTXlvcE1lc3NhZ2U+KG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VfLFxuICAgICAgICAgICAgLy8gYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobXNnKVxuXG4gICAgICAgIC8vc2VuZGluZyBkYXRhIGZyb20gaG9zdCB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGRpc3BhdGNoRXZlbnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0LCB3YWl0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBzZWVuOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG5leHBvcnQgY2xhc3MgV2ViY29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLldlYkNvbXBvbmVudExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmICghc2Vlbltsb2FkZXJDb25maWcudXJsXSkge1xuICAgICAgICAgICAgLy8gYXdhaXQgaW1wb3J0KCAvKiBAdml0ZS1pZ25vcmUgKi8gd2ViQ29tcG9uZW50TG9hZFVybCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW9kdWxlIGxvYWRlZCcpO1xuICAgICAgICAgICAgc2Vlbltsb2FkZXJDb25maWcudXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJDb21wb25lbnRMb2FkVXJsID0gbG9hZGVyQ29uZmlnLnVybFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHdlYkNvbXBvbmVudExvYWRVcmw7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2R1bGUgYWxyZWRheSBsb2FkZWQgb3IgaW4gbG9hZGluZyBwcm9jZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZWVuW2xvYWRlckNvbmZpZy51cmxdO1xuXG4gICAgICAgIC8vVE9ETyA6IGFkZCByZXRyeSBtZWNoYW5pc20gaW4gZmFpbCBjYXNlLlxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2ssIHNob3VsZCBmaXggdGhlIHJhY2UgY29uZGl0aW9uIGZvciBsb2FkZWQgbW9kdWxlc1xuICAgICAgICBhd2FpdCB3YWl0KDEpO1xuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvYWRlckNvbmZpZy50YWcpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYob3B0aW9ucz8uX2Vudmlyb25tZW50KXtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsZW1lbnQuX215b3BFbnZpcm9ubWVudCA9IG9wdGlvbnM/Ll9lbnZpcm9ubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtsb2FkZXJDb25maWcudGFnfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICcwLjMuMzYnOyIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVycyxcbiAgICBSZW5kZXJNb2RlLCBSZW5kZXJQb2xpY3lcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50c1wiO1xuaW1wb3J0IHtFTUJFRERFRF9TREtfQ09OVEVOVCwgSEFTX0VNQkVEREVEX1NES30gZnJvbSBcIi4uL2VtYmVkZGVkU0RLLnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIgPSAnPCEtLSBteW9wLXdlYi1jb21wb25lbnQgLS0+JztcbmNvbnN0IE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQgPSAnbXlvcC13ZWItY29tcG9uZW50JztcblxuLy8gVHJhY2sgZXh0cmFjdGVkIHdlYiBjb21wb25lbnQgc2NyaXB0cyB0byBwcmV2ZW50IGRvdWJsZSByZWdpc3RyYXRpb24uXG4vLyBNYXBzIHNjcmlwdElkIC0+IHRoZSB0YWcgbmFtZSB0aGF0IHNjcmlwdCByZWdpc3RlcmVkLiBUaGUgdGFnIE1VU1QgYmUgcmVtZW1iZXJlZCBwZXJcbi8vIHNjcmlwdDogd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGlzIGEgc2luZ2xlIGdsb2JhbCBzbG90IHRoYXQgZXZlcnkgZXh0cmFjdGVkIGNvbXBvbmVudFxuLy8gb3ZlcndyaXRlcywgc28gb24gYSByZS1tb3VudCAoc2NyaXB0IHNraXBwZWQpIGl0IGhvbGRzIHdoaWNoZXZlciBjb21wb25lbnQgcmFuIGxhc3QuXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG5jb25zdCBzZWVuOiBzdHJpbmdbXSA9IFtdO1xubGV0IHNkaztcbmNvbnN0IGdldEluaXRpYXRlZFNkayA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNkaykge1xuICAgICAgICAvL2NvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKClcbiAgICAgICAgc2RrID0gbmV3IFdlYkNvbXBvbmVudFNESygpO1xuICAgICAgICBzZGsuaW5pdCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2RrO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWxTdHJpbmc6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKTogbmV3ICgpID0+IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlID0gU2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5vcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCc7XG4gICAgICAgICAgICBjb25zdCBzaGFkb3cgPSB0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZX0pO1xuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKHRoaXMsIHNoYWRvdyk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmlubmVySFRNTCA9IGh0bWxTdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQgPSAoY29tcG9uZW50TmFtZTogc3RyaW5nLCBodG1sOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSkgPT4ge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShjb21wb25lbnROYW1lLCBjcmVhdGVIVE1MRWxlbWVudENvbnN0cnVjdG9yKGh0bWwsIFNoYWRvd1Jvb3RNb2RlKSk7XG4gICAgY29uc29sZS5sb2coYGRlZmluZSgnJHtjb21wb25lbnROYW1lfScpIHdhcyBjYWxsZWQsIHdlYiBjb21wb25lbnQgcmVhZHkgdG8gdXNlYCk7XG59XG5cbmNvbnN0IHRvV2ViQ29tcG9uZW50TmFtZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSB1cHBlcmNhc2UgbGV0dGVyc1xuICAgICAgICAucmVwbGFjZSgvKFxcZCspL2csICctJDEnKSAvLyBBZGQgaHlwaGVuIGJlZm9yZSBkaWdpdHNcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7IC8vIENvbnZlcnQgdG8gbG93ZXJjYXNlXG59XG5cbmNvbnN0IHRvQ3VzdG9tRWxlbWVudE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbmFtZSA9IHRvV2ViQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9fL2csICctJyk7XG59XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlcjsgLy8gPSBuZXcgRE9NUGFyc2VyKCk7XG5cbmV4cG9ydCBjbGFzcyBIVE1MQ29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXJcblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiBIVE1MIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50IChzdGFydHMgd2l0aCBtYXJrZXIgY29tbWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTXlvcFdlYkNvbXBvbmVudChodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGh0bWwudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGhvdyB0aGlzIGNvbXBvbmVudCBzaG91bGQgcmVuZGVyLCBhcHBseWluZyB0aGUgaG9zdCByZW5kZXIgcG9saWN5LlxuICAgICAqIFByZWNlZGVuY2U6IG9wdGlvbnMucmVuZGVyUG9saWN5IChwZXItY2FsbCkgZnVsbHkgcmVwbGFjZXMgdGhlIGdsb2JhbFxuICAgICAqIGhvc3RTREsuc2V0UmVuZGVyUG9saWN5IFx1MjAxNCBzbyBhbiBhcHAgY2FuIHJlc3RyaWN0IGdsb2JhbGx5IGFuZCBhbGxvdyBzcGVjaWZpY3MuXG4gICAgICogV2l0aCBubyBwb2xpY3kgc2V0LCBiZWhhdmlvciBpcyB1bmNoYW5nZWQgZnJvbSBiZWZvcmUgKG1hcmtlciBcdTIxRDIgd2ViIGNvbXBvbmVudCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZXNvbHZlUmVuZGVyTW9kZShcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBsb2FkZXJDb25maWc6IElIVE1MTG9hZGVyQ29uZmlnLFxuICAgICAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTx7IG1vZGU6IFJlbmRlck1vZGUgfCBmYWxzZTsgaXNvbGF0ZTogYm9vbGVhbiB9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZE1vZGU6IFJlbmRlck1vZGUgPSBpc1dlYkNvbXBvbmVudFxuICAgICAgICAgICAgPyAnd2ViQ29tcG9uZW50J1xuICAgICAgICAgICAgOiAoKGxvYWRlckNvbmZpZy5pc29sYXRpb24gfHwgb3B0aW9ucz8uaXNvbGF0aW9uKSA/ICdpc29sYXRlZElmcmFtZScgOiAnaWZyYW1lJyk7XG5cbiAgICAgICAgLy8gcGVyLWNhbGwgcG9saWN5IHdpbnM7IGVsc2UgZ2xvYmFsIHBvbGljeSBvbiB0aGUgaG9zdCBTREsgc2luZ2xldG9uLlxuICAgICAgICBjb25zdCBwb2xpY3k6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJQb2xpY3kgPz8gKHdpbmRvdyBhcyBhbnkpPy5teW9wPy5ob3N0U0RLPy5nZXRSZW5kZXJQb2xpY3k/LigpO1xuXG4gICAgICAgIGNvbnN0IG1vZGU6IFJlbmRlck1vZGUgfCBmYWxzZSA9IHBvbGljeVxuICAgICAgICAgICAgPyBhd2FpdCBwb2xpY3koeyBjb21wb25lbnREZWZpbml0aW9uLCBza2luLCByZXF1ZXN0ZWRNb2RlLCBpc1dlYkNvbXBvbmVudCB9KVxuICAgICAgICAgICAgOiByZXF1ZXN0ZWRNb2RlO1xuXG4gICAgICAgIHJldHVybiB7IG1vZGUsIGlzb2xhdGU6IG1vZGUgPT09ICdpc29sYXRlZElmcmFtZScgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW4tZnJhbWUgYnJpZGdlIGZvciBpc29sYXRlZCBjb21wb25lbnRzLiBSdW5zIGluc2lkZSB0aGUgc2FuZGJveGVkXG4gICAgICogKG9wYXF1ZS1vcmlnaW4pIGlmcmFtZSwgdHJhbnNsYXRpbmcgdGhlIHNhbWUgYXV0aG9yLWZhY2luZyBjb250cmFjdCB0by9mcm9tXG4gICAgICogcG9zdE1lc3NhZ2Ugc2luY2UgdGhlIGhvc3QgaGFzIG5vIHNhbWUtb3JpZ2luIGFjY2VzczpcbiAgICAgKiAgIFx1MjAyMiBkYXRhLWluIDogcGFyZW50IHBvc3RzIHt0eXBlOidteW9wOmluaXQnfSBcdTIxOTIgY2FsbHMgd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2VcbiAgICAgKiAgICAgICAgICAgICAgIChwbHVzIGEgYmFrZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGZpcnN0IHJlbmRlcilcbiAgICAgKiAgIFx1MjAyMiBkYXRhLW91dDogd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgXHUyMTkyIHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbXlvcDpjdGEnfSlcbiAgICAgKiAgIFx1MjAyMiByZXNpemUgIDogUmVzaXplT2JzZXJ2ZXIgXHUyMTkyIHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonbXlvcDpzaXplJ30pXG4gICAgICpcbiAgICAgKiBUT0RPKGRldi1leHRlbnNpb24pOiB0aGUgaXNvbGF0ZWQgcGF0aCBkZWxpYmVyYXRlbHkgc2tpcHMgdGhlIHNhbWUtb3JpZ2luXG4gICAgICogZGF0YVNjcmlwdCwgc28gaXQgbmV2ZXIgcG9zdHMgdGhlIGBNWU9QX1BSRUlOSkVDVEVEX0lOSVRgIG1lc3NhZ2UgdGhlIE15b3AgZGV2XG4gICAgICogZXh0ZW5zaW9uIGxpc3RlbnMgZm9yIHRvIGxvZyB0aGUgSU5JVElBTCByZW5kZXIgKGBpbml0KmApLiBMYXRlciBpbml0IHVwZGF0ZXMgYW5kXG4gICAgICogYWxsIENUQXMgYXJlIHN0aWxsIHRyYWNrZWQgKHRoZSBleHRlbnNpb24gd3JhcHMgYGNvbXAucHJvcHNgLCB3aGljaCBvdXIgaXNvbGF0ZWRcbiAgICAgKiBjb25uZWN0UHJvcHMgYnJhbmNoIHJvdXRlcyB0aHJvdWdoKSwgc28gb25seSB0aGUgZmlyc3QtcmVuZGVyIHBheWxvYWQgaXMgbWlzc2luZ1xuICAgICAqIGZyb20gdGhlIGV4dGVuc2lvbidzIGFjdGl2aXR5IGxvZyBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gQ2xvc2luZyB0aGlzIHdvdWxkIGJlIGFcbiAgICAgKiB+MS1saW5lIGBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J01ZT1BfUFJFSU5KRUNURURfSU5JVCcsIHBheWxvYWQ6e2RhdGF9fSlgIGluc2lkZVxuICAgICAqIGZsdXNoSW5pdGlhbCgpIGJlbG93IFx1MjAxNCBpbnRlbnRpb25hbGx5IE5PVCBkb25lIGZvciBub3cgdG8gYXZvaWQgYWRkaW5nIGV4dGVuc2lvbi1vbmx5XG4gICAgICogdHJhZmZpYyB0byB0aGUgY29tcG9uZW50IHJ1bnRpbWUuIFdlYiBjb21wb25lbnRzIGhhdmUgdGhlIHNhbWUgaW5pdGlhbC1pbml0IGdhcFxuICAgICAqIChpbml0V2l0aERhdGEgaXMgY2FsbGVkIG9uIHRoZSBlbGVtZW50LCBub3QgdmlhIGNvbXAucHJvcHMpIGFuZCBpdCBwcmVkYXRlcyB0aGlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRJc29sYXRpb25CcmlkZ2UoaW5pdGlhbERhdGFMaXRlcmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYDxzY3JpcHQ+XG4gICAgICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBfX2luaXRpYWwgPSAke2luaXRpYWxEYXRhTGl0ZXJhbH07XG4gICAgICAgICAgICAgICAgdmFyIF9fcGVuZGluZztcbiAgICAgICAgICAgICAgICAvLyBkYXRhLW91dCAoY3RhKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyID0gZnVuY3Rpb24gKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJlbnQucG9zdE1lc3NhZ2UoeyBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOmN0YScsIGFjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkIH0sICcqJyk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsSW5pdChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHsgd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1pbiAoaW5pdCB1cGRhdGVzKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZCB8fCBkLl9fbXlvcCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZC50eXBlID09PSAnbXlvcDppbml0JykgeyBpZiAoIWNhbGxJbml0KGQuZGF0YSkpIF9fcGVuZGluZyA9IGQuZGF0YTsgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHJlbmRlcjogdXNlIGEgcGVuZGluZyB1cGRhdGUgaWYgb25lIGFycml2ZWQsIGVsc2UgdGhlIGJha2VkIGluaXRpYWwgZGF0YVxuICAgICAgICAgICAgICAgIChmdW5jdGlvbiBmbHVzaEluaXRpYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gKF9fcGVuZGluZyAhPT0gdW5kZWZpbmVkKSA/IF9fcGVuZGluZyA6IF9faW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEluaXQoZGF0YSkpIHsgX19wZW5kaW5nID0gdW5kZWZpbmVkOyBfX2luaXRpYWwgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2hJbml0aWFsKTtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSAocmVwb3J0IGNvbnRlbnQgc2l6ZSlcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNZWFzdXJlIHRoZSBCT0RZIChjb250ZW50IGJveCkuIGRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgaW5jbHVkZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSB2aWV3cG9ydCBcdTIwMTQgd2hpY2ggd2UncmUgZHJpdmluZyBcdTIwMTQgc28gaXQgd291bGQgcmVwb3J0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGZyYW1lIGhlaWdodCwgbm90IHRoZSBjb250ZW50LCBhbmQgbmV2ZXIgc2hyaW5rLlxuICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiKSByZXR1cm4gTWF0aC5tYXgoYi5zY3JvbGxIZWlnaHQsIGIub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RTaXplKCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX215b3A6IHRydWUsIHR5cGU6ICdteW9wOnNpemUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogY29udGVudEhlaWdodCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE9ic2VydmUgdGhlIEJPRFkgKHJlZmxvd3Mgd2l0aCBjb250ZW50KSBcdTIwMTQgbm90IGRvY3VtZW50RWxlbWVudCwgd2hvc2UgYm94IGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSB2aWV3cG9ydCBhbmQgd291bGQgZmVlZCBiYWNrIGludG8gYSByZXNpemUgbG9vcC4gQSBNdXRhdGlvbk9ic2VydmVyXG4gICAgICAgICAgICAgICAgLy8gY2F0Y2hlcyBjb250ZW50IHN3YXBzIChlLmcuIGlubmVySFRNTCByZS1yZW5kZXIpIHRoYXQgZG9uJ3QgY2hhbmdlIGJvZHkncyBib3guXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5SZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyB2YXIgX19ybyA9IG5ldyBSZXNpemVPYnNlcnZlcihwb3N0U2l6ZSk7IGlmIChkb2N1bWVudC5ib2R5KSBfX3JvLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG5ldyBNdXRhdGlvbk9ic2VydmVyKHBvc3RTaXplKS5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHBvc3RTaXplKTtcbiAgICAgICAgICAgICAgICBwb3N0U2l6ZSgpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgPC9zY3JpcHQ+YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBjb250ZW50IGZyb20gSFRNTFxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jLmdldEVsZW1lbnRCeUlkKE1ZT1BfV0VCX0NPTVBPTkVOVF9TQ1JJUFRfSUQpO1xuICAgICAgICByZXR1cm4gc2NyaXB0Py50ZXh0Q29udGVudCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50LlxuICAgICAqIFJldHVybnMgdGhlIGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lIHRoaXMgc2NyaXB0IHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBleGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQ6IHN0cmluZywgc2NyaXB0SWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgZXhlY3V0ZWQgKGJ5IHNjcmlwdCBjb250ZW50IGhhc2gpXG4gICAgICAgIGNvbnN0IGNhY2hlZFRhZ05hbWUgPSBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzLmdldChzY3JpcHRJZCk7XG4gICAgICAgIGlmIChjYWNoZWRUYWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBhbHJlYWR5IGV4ZWN1dGVkIGZvciAke3NjcmlwdElkfSwgcmV1c2luZyA8JHtjYWNoZWRUYWdOYW1lfT5gKTtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRUYWdOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHNjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdENvbnRlbnQ7XG4gICAgICAgIHNjcmlwdC5pZCA9IGBteW9wLWV4dHJhY3RlZC0ke3NjcmlwdElkfWA7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBnbG9iYWwgaW1tZWRpYXRlbHk6IHRoZSBuZXh0IGV4dHJhY3RlZCBzY3JpcHQgdG8gcnVuIHdpbGwgb3ZlcndyaXRlIGl0LlxuICAgICAgICBjb25zdCB0YWdOYW1lID0gKHdpbmRvdyBhcyBhbnkpLl9fTVlPUF9UQUdfTkFNRV9fO1xuICAgICAgICBpZiAodGFnTmFtZSkge1xuICAgICAgICAgICAgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5zZXQoc2NyaXB0SWQsIHRhZ05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gRXhlY3V0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHQ6ICR7c2NyaXB0SWR9IC0+IDwke3RhZ05hbWV9PmApO1xuICAgICAgICByZXR1cm4gdGFnTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgYW5kIHJ1biBvbiBob3N0IGRvY3VtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBodG1sOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKTogUHJvbWlzZTxNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSB0aGlzLmV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbCk7XG5cbiAgICAgICAgaWYgKCFzY3JpcHRDb250ZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBObyA8c2NyaXB0IGlkPVwibXlvcC13ZWItY29tcG9uZW50XCI+IGZvdW5kIGluIEhUTUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBjb21wb25lbnQgZGVmaW5pdGlvbiBpZCBhcyBzY3JpcHQgaWRlbnRpZmllciBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgICBjb25zdCBzY3JpcHRJZCA9IGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9LSR7c2tpbi5pZH1gO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudCwgb3IgcmV1c2UgdGhlIHRhZyBpdCByZWdpc3RlcmVkIGVhcmxpZXIuXG4gICAgICAgIC8vIE5ldmVyIHJlLXJlYWQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fIGhlcmU6IG9uIGEgcmUtbW91bnQgdGhlIHNjcmlwdCBpcyBza2lwcGVkIGFuZFxuICAgICAgICAvLyB0aGUgZ2xvYmFsIHN0aWxsIHBvaW50cyBhdCB3aGljaGV2ZXIgY29tcG9uZW50J3Mgc2NyaXB0IHJhbiBsYXN0LCB3aGljaCB3b3VsZCBidWlsZFxuICAgICAgICAvLyB0aGlzIGNvbnRhaW5lcidzIGVsZW1lbnQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCdzIHRhZy5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50LCBzY3JpcHRJZCk7XG5cbiAgICAgICAgaWYgKCF0YWdOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgZGlkIG5vdCBzZXQgd2luZG93Ll9fTVlPUF9UQUdfTkFNRV9fJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWA7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uLFxuICAgICAgICAgICAgc2tpbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gTG9hZGVkIDwke3RhZ05hbWV9PiBpbnRvIGNvbnRhaW5lcmApO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBjb25zdCBpc1dDID0gdGhpcy5pc015b3BXZWJDb21wb25lbnQobG9hZGVyQ29uZmlnLkhUTUwpO1xuICAgICAgICBjb25zdCB7IG1vZGUsIGlzb2xhdGUgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlbmRlck1vZGUoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgbG9hZGVyQ29uZmlnLCBpc1dDLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFJlbmRlcmluZyBibG9ja2VkIGJ5IHJlbmRlciBwb2xpY3kgZm9yIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzV0MpIHtcbiAgICAgICAgICAgIC8vIFdlYi1jb21wb25lbnQgSFRNTCBvbmx5IHN1cHBvcnRzIHRoZSB3ZWItY29tcG9uZW50IGNvbnRyYWN0OyBhIHBvbGljeSB0aGF0XG4gICAgICAgICAgICAvLyBkZW5pZXMgaXQgaGFzIG5vIGlmcmFtZSBmYWxsYmFjayAoc2VlIHBsYW4gXHUwMEE3My4zKSBcdTIwMTQgYmxvY2sgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgIC8vIHNpbGVudGx5IHJlbmRlciBicm9rZW4uIFVudHJ1c3RlZCBjb250cmlidXRvcnMgbXVzdCBzaGlwIGlmcmFtZSBjb21wb25lbnRzLlxuICAgICAgICAgICAgaWYgKG1vZGUgIT09ICd3ZWJDb21wb25lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbTXlvcF0gV2ViLWNvbXBvbmVudCByZW5kZXJpbmcgZGVuaWVkIGJ5IHJlbmRlciBwb2xpY3kgZm9yIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1cImApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGxvYWRlckNvbmZpZy5IVE1MLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGxldCBlbGVtZW50O1xuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIGxldCBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIEZ1bGwgaXNvbGF0aW9uOiBhIHNhbmRib3ggV0lUSE9VVCBhbGxvdy1zYW1lLW9yaWdpbiBnaXZlcyB0aGUgZnJhbWUgYW5cbiAgICAgICAgICAgIC8vIG9wYXF1ZSBvcmlnaW4gXHUyMDE0IG5vIGhvc3QgRE9NL2Nvb2tpZXMvcGFyZW50IGFjY2Vzcy4gTXVzdCBiZSBzZXQgYmVmb3JlXG4gICAgICAgICAgICAvLyB0aGUgZnJhbWUgbmF2aWdhdGVzIChpLmUuIGJlZm9yZSBzcmNkb2MgLyBhcHBlbmQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LWZvcm1zIGFsbG93LXBvcHVwcycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lLiBBbiBpc29sYXRlZCAoc2FuZGJveGVkLCBvcGFxdWUtb3JpZ2luKSBmcmFtZVxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgZG9jLndyaXRlKCknbiBmcm9tIHRoZSBob3N0LCBzbyBhY2N1bXVsYXRlIHRoZSBtYXJrdXAgYW5kIHNldCBpdCB2aWFcbiAgICAgICAgICAgIC8vIHNyY2RvYyBvbiBjbG9zZSgpLiBOb24taXNvbGF0ZWQgZnJhbWVzIGtlZXAgdGhlIHNhbWUtb3JpZ2luIGRvYy53cml0ZSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgX19zcmNQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGRvYzogeyBvcGVuKCk6IHZvaWQ7IHdyaXRlbG4oczogc3RyaW5nKTogdm9pZDsgY2xvc2UoKTogdm9pZCB9ID0gaXNvbGF0ZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBvcGVuKCkge30sXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlbG4oczogc3RyaW5nKSB7IF9fc3JjUGFydHMucHVzaChzKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2UoKSB7IElmcmFtZUVsZW1lbnQuc3JjZG9jID0gX19zcmNQYXJ0cy5qb2luKCdcXG4nKTsgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgICAgICAgICAgZC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgICAgIH0pKCk7XG5cblxuICAgICAgICAgICAgLy8gUGFyc2UgbXlvcDpzaXplIG1ldGEgdGFnIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24gKHNhbWUgRE9NUGFyc2VyIHBhc3MgcGF0dGVybiBhcyBteW9wX3ByZXZpZXcgcmVtb3ZhbCkuXG4gICAgICAgICAgICAvLyBUaGlzIGxldHMgdGhlIFJlYWN0IGhvc3QgZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpIGZyb20gdGhlIHN0YXJ0LlxuICAgICAgICAgICAgbGV0IHBhcnNlZFNpemVNZXRhOiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVQYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZURvYyA9IF9wcmVQYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGEgPSBfcHJlRG9jLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIm15b3A6c2l6ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChzaXplTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBwYXJzZWRTaXplTWV0YSA9IEpTT04ucGFyc2Uoc2l6ZU1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgfHwgJ3t9Jyk7IH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBIVE1MMlJlbmRlciA9IGxvYWRlckNvbmZpZy5IVE1MO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2luc3BlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvL2luamVjdCBpbnNwZWN0aW9uIHNjcmlwdCBmb3IgcHJvcHMgZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogcGFydCBvZiBBSSBjb21wb25lbnRzLCB0aGluayBhYm91dCB0aGF0LCBkb2N1bWVudCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG4gICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdD8ucmVtb3ZlQXR0cmlidXRlKCd0eXBlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgaW5qZWN0ZWQgSFRNTCBzdHJpbmcgaW50byBhIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gX2RvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0ZW1wLmJvZHkuaW5uZXJIVE1MID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVLZXlzV2luZG93ID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlS2V5c1dpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wLmJvZHkuZmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlICYmIF9kb2MuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBfZG9jLmhlYWQuaW5zZXJ0QmVmb3JlKF9kb2MuaW1wb3J0Tm9kZShub2RlLCB0cnVlKSwgX2RvYy5oZWFkLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFByZXBlbmQgRE9DVFlQRTogZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCByZXR1cm5zIG9ubHkgPGh0bWw+Li4uPC9odG1sPlxuICAgICAgICAgICAgICAgIC8vIGFuZCBkcm9wcyB0aGUgZG9jdHlwZSwgd2hpY2ggd291bGQgcHV0IHRoZSBpZnJhbWUgaW4gcXVpcmtzIG1vZGUuXG4gICAgICAgICAgICAgICAgLy8gUXVpcmtzIG1vZGUgYnJlYWtzIGF1dG8tc2l6aW5nIGJlY2F1c2UgPGJvZHk+IHN0cmV0Y2hlcyB0byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAgICAgLy8gdmlld3BvcnQgaW5zdGVhZCBvZiBzaHJpbmtpbmcgdG8gY29udGVudCwgc28gUmVzaXplT2JzZXJ2ZXIgb24gYm9keVxuICAgICAgICAgICAgICAgIC8vIG5ldmVyIGZpcmVzIHdoZW4gY29udGVudCByZWZsb3dzIChlLmcuIGFmdGVyIGZvbnQgc3dhcCkuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGltcHJvdmUgYnkgZG8gaXQgb24gdGhlIHNlcnZlIG9uY2VcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBteW9wX3ByZXZpZXcgc2NyaXB0IHdoZW4gbm90IGluIGluc3BlY3Rpb24gbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChteW9wX3ByZXZpZXdfc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBwcmVwZW5kIERPQ1RZUEUgdG8ga2VlcCB0aGUgaWZyYW1lIGluIHN0YW5kYXJkcyBtb2RlLlxuICAgICAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGhvc3QtcHJvdmlkZWQgQ1NTIGJlZm9yZSB0aGUgaWZyYW1lIGlzIHdyaXR0ZW4gc28gc3R5bGVzIGFyZVxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiBmaXJzdCBwYWludCAobm8gRk9VQykuIEFwcGVuZGVkIGxhc3QgaW4gPGhlYWQ+IHNvIGl0IHdpbnNcbiAgICAgICAgICAgIC8vIG92ZXIgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIG5vcm1hbCBjYXNjYWRlIG9yZGVyLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmluamVjdENzcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhIVE1MMlJlbmRlciwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlVGFnID0gX2RvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnNldEF0dHJpYnV0ZSgnZGF0YS1teW9wLWluamVjdGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAvLyA8c3R5bGU+IGlzIGFuIEhUTUwgcmF3LXRleHQgZWxlbWVudDogdGhlIHNlcmlhbGl6ZXIgYmVsb3cgd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIExJVEVSQUxMWSwgd2l0aG91dCBlc2NhcGluZy4gQ1NTIGNvbnRhaW5pbmcgXCI8L3N0eWxlPlwiIHdvdWxkXG4gICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIGNsb3NlIHRoZSB0YWcgYW5kIGluamVjdCBsaXZlIG1hcmt1cCBpbnRvIHRoZSBpZnJhbWUsIHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgc2FtZS1vcmlnaW4gd2l0aCB0aGlzIHBhZ2UuIE5ldXRyYWxpemUgdGhlIHNlcXVlbmNlIFx1MjAxNCBubyByZWFsXG4gICAgICAgICAgICAgICAgLy8gc3R5bGVzaGVldCBjb250YWlucyBpdC4gKFNhbWUgY2xhc3Mgb2YgYnVnIGFzIHRoZSA8L3NjcmlwdD4gZXNjYXBlIGluXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEgcGF5bG9hZCBiZWxvdy4pXG4gICAgICAgICAgICAgICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBvcHRpb25zLmluamVjdENzcy5yZXBsYWNlKC88XFxzKlxcL1xccypzdHlsZS9naSwgJzxcXFxcL3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgKF9kb2MuaGVhZCB8fCBfZG9jLmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgICAgICAgICAgIC8vIFNlZSBub3RlIGFib3ZlOiBwcmVwZW5kIERPQ1RZUEUgdG8ga2VlcCB0aGUgaWZyYW1lIGluIHN0YW5kYXJkcyBtb2RlLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuXG4gICAgICAgICAgICAvLyB3aW5kb3cuX19mZWRlcmF0aW9uX18gPVxuICAgICAgICAgICAgLy8gICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgLy8gICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gaW5qZWN0IHZhbHVlIHRvIG1vZHVsZSBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCdcbiAgICAgICAgICAgIC8vICAgICAgICAgLC4uLiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfTtcblxuICAgICAgICAgICAgLy8gRm9yIG5wbSBwYWNrYWdlIHVzZXJzIHdpdGggYnVuZGxlcnMgKFZpdGUvV2VicGFjayksIGluamVjdCBTREsgaW5saW5lXG4gICAgICAgICAgICAvLyBGb3IgQ0ROIHVzZXJzIChzY3JpcHQgdGFnKSwgdXNlIENETiBVUkxcbiAgICAgICAgICAgIGNvbnN0IHNka1NjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PiR7RU1CRURERURfU0RLX0NPTlRFTlR9PC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAvLyBEaWZmZXJlbnQgaW5pdCBzY3JpcHQgZm9yIGVtYmVkZGVkIHZzIENETiBTREtcbiAgICAgICAgICAgIC8vIC0gRW1iZWRkZWQgKGJ1bmRsZWQgSUlGRSk6IHVzZXMgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCByZXR1cm5zIG1vZHVsZSBkaXJlY3RseVxuICAgICAgICAgICAgLy8gLSBDRE4gKGR5bmFtaWMgbG9hZGluZyk6IHVzZXMgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSB3aGljaCB3cmFwcyB3aXRoIC5nZXQoKVxuICAgICAgICAgICAgY29uc3QgaW5pdFNjcmlwdCA9IEhBU19FTUJFRERFRF9TREtcbiAgICAgICAgICAgICAgICA/IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lTW9kdWxlID0gYXdhaXQgTXlvcFNESy5nZXRJZnJhbWVNb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElmcmFtZVNESyA9IGlmcmFtZU1vZHVsZS5JZnJhbWVTREs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fID0gd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXztcbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIHVzZSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIGluc3RlYWQgb2YgdGhlIHNhbWUtb3JpZ2luXG4gICAgICAgICAgICAvLyBJZnJhbWVTREsgKyBkYXRhLWluamVjdGlvbiBzY3JpcHRzICh3aGljaCByZWx5IG9uIGhvc3RcdTIxOTRmcmFtZSBhY2Nlc3MpLlxuICAgICAgICAgICAgaWYgKCFpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oYCR7c2RrU2NyaXB0fSR7aW5pdFNjcmlwdH1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGRhdGEgc2NyaXB0IGlmIGRhdGEgb3B0aW9uIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAoIWlzb2xhdGUgJiYgb3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0dXAgQ1RBIHF1ZXVlIC0gY2FwdHVyZXMgYW55IENUQXMgZW1pdHRlZCBkdXJpbmcgaW5pdCBiZWZvcmUgaG9zdCByZWdpc3RlcnMgaGFuZGxlclxuICAgICAgICAgICAgICAgIGNvbnN0IGN0YVF1ZXVlU2NyaXB0ID0gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyID0gZnVuY3Rpb24oYWN0aW9uLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZS5wdXNoKHthY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICAvLyBFc2NhcGUgZGF0YSBmb3Igc2FmZSBlbWJlZGRpbmcgaW4gc2NyaXB0IHRhZ1xuICAgICAgICAgICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGRvZXNuJ3QgZXNjYXBlIDwvc2NyaXB0PiB3aGljaCBjb3VsZCBicmVhayBIVE1MIHBhcnNpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXC9zY3JpcHQvZ2ksICdcXFxcdTAwM2Mvc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZWxmLWNvbnRhaW5lZCBkYXRhIGluamVjdGlvbiBzY3JpcHQgdGhhdDpcbiAgICAgICAgICAgICAgICAvLyAxLiBDYWxscyBteW9wX2luaXRfaW50ZXJmYWNlIGltbWVkaWF0ZWx5IGlmIGFscmVhZHkgZGVmaW5lZFxuICAgICAgICAgICAgICAgIC8vIDIuIFdhdGNoZXMgZm9yIGxhdGUtZGVmaW5lZCBteW9wX2luaXRfaW50ZXJmYWNlIHZpYSBkZWZpbmVQcm9wZXJ0eVxuICAgICAgICAgICAgICAgIC8vIDMuIENsZWFucyB1cCBhZnRlciBpdHNlbGYgKHJlbW92ZXMgc2NyaXB0IHRhZyBhbmQgd2luZG93IGRhdGEpXG4gICAgICAgICAgICAgICAgLy8gNC4gUG9zdHMgbWVzc2FnZSB0byBwYXJlbnQgZm9yIGV4dGVuc2lvbiB0cmFja2luZyAocHJlLWluamVjdGVkIGluaXQqKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTY3JpcHQgPSBgPHNjcmlwdCBpZD1cIl9fbXlvcF9pbml0X2RhdGFfc2NyaXB0XCI+XG4gICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gJHtlc2NhcGVkRGF0YX07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX19teW9wX2luaXRfZGF0YV9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxJbml0SW50ZXJmYWNlID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcyBwcmUtaW5qZWN0ZWQgZGF0YSBjYWxsIGZvciBleHRlbnNpb24gdHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBleHRlbnNpb24gdmlhIHBvc3RNZXNzYWdlIChpbml0KiA9IHByZS1pbmplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwOiByZW1vdmUgc2NyaXB0IHRhZyBhbmQgc3RvcmVkIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RWwgJiYgc2NyaXB0RWwucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIGFscmVhZHkgZXhpc3RzIC0gY2FsbCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gbm90IHlldCBkZWZpbmVkIC0gc3RvcmUgZGF0YSBhbmQgd2F0Y2ggZm9yIGRlZmluaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX29yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdteW9wX2luaXRfaW50ZXJmYWNlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vcmlnaW5hbCA9IGZuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5fX215b3BfaW5pdF9kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmVkRGF0YSA9IHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZShmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29yaWdpbmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbihjdGFRdWV1ZVNjcmlwdCArIGRhdGFTY3JpcHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXM6IGluamVjdCB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChpbml0IGluIC8gY3RhIG91dCAvIHNpemUgb3V0KS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpLnJlcGxhY2UoLzxcXC9zY3JpcHQvZ2ksICdcXFxcdTAwM2Mvc2NyaXB0JylcbiAgICAgICAgICAgICAgICAgICAgOiAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbih0aGlzLmJ1aWxkSXNvbGF0aW9uQnJpZGdlKGVzY2FwZWREYXRhKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvYy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogY29udHJvbCBmcm9tIGRhc2hib2FyZFxuICAgICAgICAgICAgLy8gIChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgY29tcCA9IG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkOiB3aXJlIHRoZSBob3N0IHNpZGUgb2YgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoY3RhIGluLCBzaXplIGluLCBpbml0IG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkgY29tcC5lbmFibGVJc29sYXRpb24oKTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgcGFyc2VkIHNpemVNZXRhIG9uIHRoZSBjb21wb25lbnQgc28gdGhlIFJlYWN0IGhvc3QgY2FuIHJlYWQgaXRcbiAgICAgICAgICAgIGNvbXAuc2l6ZU1ldGEgPSBwYXJzZWRTaXplTWV0YTtcblxuICAgICAgICAgICAgLy8gQXV0by1zaXplOiBvYnNlcnZlIGNvbnRlbnQgc2l6ZSBhbmQgc3luYyB0byBpZnJhbWUgZGltZW5zaW9ucy5cbiAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGFsbCBob3N0cyAodmFuaWxsYSBTREssIFJlYWN0LCBWdWUsIEFuZ3VsYXIpLlxuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZXdvcmsgaG9zdCAoZS5nLiBAbXlvcC9yZWFjdCkgYWxzbyBjYWxscyBvYnNlcnZlQXV0b1NpemUoKSxcbiAgICAgICAgICAgIC8vIGl0IGNsZWFubHkgcmVwbGFjZXMgdGhlc2Ugb2JzZXJ2ZXJzIHZpYSBfYXV0b1NpemVDbGVhbnVwIHRyYWNraW5nLlxuICAgICAgICAgICAgY29tcC5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uYXV0b1NpemUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGF1dG8tc2l6aW5nLiBJZnJhbWUgc3RheXMgcG9zaXRpb246YWJzb2x1dGUgZmlsbGluZyBjb250YWluZXIuXG4gICAgICAgICAgICAgICAgICAgIC8vIEhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIChlLmcuIFJlYWN0IE5hdGl2ZSBXZWJWaWV3KS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb21wLm9ic2VydmVBdXRvU2l6ZSh7XG4gICAgICAgICAgICAgICAgICAgIGZvcmNlQXV0b1NpemU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG9uU2l6ZUNoYW5nZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBhZnRlciBmaXJzdCBtZWFzdXJlbWVudCBjb21wbGV0ZXMgKG5vdCBiZWZvcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc2l0aW9ucyBmcm9tIGFic29sdXRlIG92ZXJsYXkgdG8gZG9jdW1lbnQgZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIG1lYXN1cmVkIGhlaWdodCwgcHJldmVudGluZyBmbGFzaCBhdCB3cm9uZyBzaXplLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93biAmJiAhb3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElQcm9wQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLFxuICAgIElVc2VyRmxvdyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyA9IChjb25maWc6IHYyX0lWYXJpYW50Q29uZmlnKTogSUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2U6IHtcbiAgICAgICAgICAgIGlkOiAnYXV0bycsXG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZTogY29uZmlnLm5hbWUsXG5cbiAgICAgICAgICAgIHNraW5TZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfaW5pdF9pbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnb3V0X2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYW55JyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgICAgIHNraW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSBlbXB0eSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgIH0gYXMgSVNraW5Db25maWdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBuYW1lOiBjb25maWcubmFtZVxuICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcbn07XG5cbi8qKlxuICogQ2xvdWRSZXBvc2l0b3J5IC0gVW5pZmllZCBjbG91ZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgTXlvcCBjb21wb25lbnRzXG4gKlxuICogU3VwcG9ydHMgYm90aCB2MiAoZGVmYXVsdCkgYW5kIHYxIG1vZGVzOlxuICogLSB2MjogVXNlcyAvY29uc3VtZSBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdmFyaWFudHNcbiAqIC0gdjE6IFVzZXMgL2Zsb3cgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHVzZXIgZmxvd3NcbiAqL1xuLy8gVXNlIGEgZ2xvYmFsIHNpbmdsZXRvbiB0byBlbnN1cmUgb25seSBvbmUgQ2xvdWRSZXBvc2l0b3J5Lk1haW4gZXhpc3RzXG4vLyBldmVuIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXMgYnkgZGlmZmVyZW50IGJ1bmRsZXJzXG5jb25zdCBHTE9CQUxfS0VZID0gJ19fTVlPUF9DTE9VRF9SRVBPU0lUT1JZX01BSU5fXyc7XG5cbmNvbnN0IGdldEdsb2JhbE1haW4gPSAoKTogQ2xvdWRSZXBvc2l0b3J5IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHNldEdsb2JhbE1haW4gPSAoaW5zdGFuY2U6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX21haW46IENsb3VkUmVwb3NpdG9yeSB8IG51bGwgPSBudWxsO1xuXG4gICAgc3RhdGljIGdldCBNYWluKCk6IENsb3VkUmVwb3NpdG9yeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGEgZ2xvYmFsIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIChmcm9tIGFub3RoZXIgYnVuZGxlKVxuICAgICAgICBjb25zdCBnbG9iYWxNYWluID0gZ2V0R2xvYmFsTWFpbigpO1xuICAgICAgICBpZiAoZ2xvYmFsTWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbE1haW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIUNsb3VkUmVwb3NpdG9yeS5fbWFpbikge1xuICAgICAgICAgICAgQ2xvdWRSZXBvc2l0b3J5Ll9tYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgc2V0R2xvYmFsTWFpbihDbG91ZFJlcG9zaXRvcnkuX21haW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDbG91ZFJlcG9zaXRvcnkuX21haW47XG4gICAgfVxuXG4gICAgLy8gdjIgY2FjaGUgLSBrZXllZCBieSBjb21wb25lbnRJZDplbnY6cHJldmlld3xsaXZlXG4gICAgLy8gRWFjaCBQcm9taXNlIGlzIHRhZ2dlZCB3aXRoIGEgYHJlc29sdmVkYCBwcm9wZXJ0eSBhZnRlciBzZXR0bGluZyAoc2VlIGZldGNoQ29tcG9uZW50VjIpLlxuICAgIHByaXZhdGUgdmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4gJiB7IHJlc29sdmVkPzogSUNvbXBvbmVudENvbmZpZyB9PiA9IHt9O1xuXG4gICAgLy8gVHJhY2sgd2hpY2ggY29tcG9uZW50cyB3ZXJlIHByZWxvYWRlZCBhbmQgd2l0aCB3aGF0IHBhcmFtc1xuICAgIC8vIEtleTogY29tcG9uZW50SWQsIFZhbHVlOiB7IGVudiwgcHJldmlldyB9XG4gICAgcHJpdmF0ZSBwcmVsb2FkZWRDb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0+ID0ge307XG5cbiAgICAvLyB2MSBjYWNoZVxuICAgIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0RW52ID0gJ3Byb2R1Y3Rpb24nO1xuICAgIHByaXZhdGUgX2VudkV4cGxpY2l0bHlTZXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zdGF0aWNNb2RlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgc3RhdGljIG1vZGUgZm9yIHNlbGYtaG9zdGVkIGNvbXBvbmVudCByZWdpc3RyaWVzLlxuICAgICAqIEluIHN0YXRpYyBtb2RlLCBVUkxzIGFyZSBjb25zdHJ1Y3RlZCBhcyBmaWxlIHBhdGhzIGluc3RlYWQgb2YgcXVlcnkgcGFyYW1zOlxuICAgICAqICAgJHtiYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52fS5qc29uXG4gICAgICovXG4gICAgZW5hYmxlU3RhdGljTW9kZSgpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYXBwZW5kIHRvIGFsbCBmZXRjaCBVUkxzIChlLmcuIGZvciBDRE4gY2FjaGUgYnVzdGluZykuXG4gICAgICogRXhhbXBsZTogYHNldFF1ZXJ5UGFyYW1zKHsgbGFzdHVwZGF0ZTogJzExMTEyMDI2JyB9KWBcbiAgICAgKi9cbiAgICBzZXRRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXMgPSBwYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuX2VudkV4cGxpY2l0bHlTZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBkZWZhdWx0IGVudmlyb25tZW50XG4gICAgICovXG4gICAgZ2V0RGVmYXVsdEVudmlyb25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RW52O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMiBNZXRob2RzIChEZWZhdWx0KSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIGFscmVhZHkgY2FjaGVkL3ByZWxvYWRlZCAodjIpXG4gICAgICogSWYgZW52IGFuZCBwcmV2aWV3IGFyZSBub3QgcHJvdmlkZWQsIGNoZWNrcyBpZiBBTlkgdmVyc2lvbiBpcyBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElmIHNwZWNpZmljIGVudi9wcmV2aWV3IHJlcXVlc3RlZCwgY2hlY2sgZXhhY3QgbWF0Y2hcbiAgICAgICAgaWYgKGVudiAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnYgfHwgdGhpcy5fZGVmYXVsdEVudn06JHtwcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgaWYgYW55IHZlcnNpb24gd2FzIHByZWxvYWRlZFxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQgaW4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJlbG9hZGVkIHBhcmFtcyBmb3IgYSBjb21wb25lbnQgKGlmIHByZWxvYWRlZClcbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgcHJlbG9hZGVkXG4gICAgICovXG4gICAgZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkOiBzdHJpbmcpOiB7IGVudjogc3RyaW5nOyBwcmV2aWV3OiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGEgY29tcG9uZW50IGNvbmZpZzogZmV0Y2ggaXQgb25jZSwgdGhlbiBzZXJ2ZSBpdCBmcm9tIHRoaXNcbiAgICAgKiByZXBvc2l0b3J5J3MgY2FjaGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHRoZSBuYW1lIHRvIHVzZS4gYGZldGNoQ29tcG9uZW50VjJgIGlzIHRoZSBzYW1lIG1ldGhvZCB1bmRlciBpdHNcbiAgICAgKiB2ZXJzaW9uZWQgbmFtZSBhbmQgc3RheXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgXHUyMDE0IG5vdGUgdGhhdCB0aGVcbiAgICAgKiB1bnZlcnNpb25lZCBgZmV0Y2hDb21wb25lbnRgIGlzIGEgKmRlcHJlY2F0ZWQgdjEqIEFQSSBhbmQgaXMgTk9UIHRoaXMuXG4gICAgICpcbiAgICAgKiBDb21wbGV0ZXMgdGhlIHRyaW8gd2l0aCB7QGxpbmsgZ2V0UmVzb2x2ZWRDb25maWd9IChzeW5jaHJvbm91cyByZWFkIG9mIGFuXG4gICAgICogYWxyZWFkeS1yZXNvbHZlZCBjb25maWcpIGFuZCB7QGxpbmsgaHlkcmF0ZUNvbXBvbmVudH0gKHNlZWQgb25lIHlvdVxuICAgICAqIGFscmVhZHkgaG9sZCkuXG4gICAgICpcbiAgICAgKiBQcmVmZXIgdGhlIG1vZHVsZS1sZXZlbCBgcHJlbG9hZENvbXBvbmVudHMoW2lkXSlgIGluIGFwcCBjb2RlOyByZWFjaCBmb3JcbiAgICAgKiB0aGlzIHdoZW4geW91IG5lZWQgYW4gaXNvbGF0ZWQgcmVwb3NpdG9yeSBpbnN0YW5jZSB3aG9zZSBjYWNoZSBsaWZldGltZVxuICAgICAqIHlvdSBjb250cm9sIFx1MjAxNCBhIHNlcnZlciB3aXRoIGl0cyBvd24gVFRMLCBmb3IgZXhhbXBsZS5cbiAgICAgKi9cbiAgICBhc3luYyByZXNvbHZlQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKiBJZiBlbnYvcHJldmlldyBub3Qgc3BlY2lmaWVkIGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlcyBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICpcbiAgICAgKiBAc2VlIHJlc29sdmVDb21wb25lbnQgXHUyMDE0IHRoZSB1bnZlcnNpb25lZCBuYW1lIGZvciB0aGlzIG1ldGhvZFxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICBjb25zdCB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52aXJvbm1lbnRJZGVudGlmaWVyLCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0Nsb3VkUmVwb3NpdG9yeV0gZmV0Y2hDb21wb25lbnRWMicsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnRJZC5zbGljZSgwLCA4KSArICcuLi4nLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgdXNlUHJldmlldyxcbiAgICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgICAgY2FjaGVkOiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50c1tjYWNoZUtleV0pIHtcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoaXMgYXMgcHJlbG9hZGVkIChmaXJzdCBmZXRjaCBjb3VudHMgYXMgcHJlbG9hZClcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0gPSB7IGVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGljTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogZW52O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGAke3RoaXMuX2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtmaWxlfS5qc29uYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModGhpcy5fcXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHFzKSB1cmwgKz0gYD8ke3FzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGAke3RoaXMuX2Jhc2VVcmx9L2NvbnN1bWU/aWQ9JHtjb21wb25lbnRJZH0mZW52PSR7ZW52fWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBjb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiICgke3Jlcy5zdGF0dXN9JHt0aGlzLl9zdGF0aWNNb2RlID8gYCBmcm9tICR7dXJsfWAgOiAnJ30pYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGpzb24uaXRlbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQuY29uc3VtZV92YXJpYW50IHx8ICF2YXJpYW50LmNvbnN1bWVfdmFyaWFudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIGhhcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnQgXCIke2Vudn1cImApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IGNvbnZlcnRWMlZhcmlhbnRUb0NvbXBvbmVudENvbmZpZyh2YXJpYW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhZyB0aGUgUHJvbWlzZSBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW4gcmVhZCBpdCBzeW5jaHJvbm91c2x5XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy52YXJpYW50c1tjYWNoZUtleV0gYXMgYW55KS5yZXNvbHZlZCA9IGNvbXBvbmVudENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlZCByZWplY3RlZCBwcm9taXNlIHNvIHRoZSBuZXh0IGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIGEgZnJlc2ggcmVxdWVzdCAoZS5nLiBhZnRlciBuZXR3b3JrIHJlY292ZXJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91cyB2ZXJzaW9uIG9mIGZldGNoQ29tcG9uZW50VjIgXHUyMDE0IHJldHVybnMgdGhlIGNvbmZpZyBvbmx5IGlmXG4gICAgICogdGhlIGZldGNoIGFscmVhZHkgY29tcGxldGVkLCBudWxsIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIFVzZXMgdGhlIHNhbWUgYHRoaXMudmFyaWFudHNgIGNhY2hlIHRoYXQgZmV0Y2hDb21wb25lbnRWMi9wcmVsb2FkQ29tcG9uZW50c1xuICAgICAqIHBvcHVsYXRlLiBFYWNoIGNhY2hlZCBQcm9taXNlIGlzIHRhZ2dlZCB3aXRoIGEgYC5yZXNvbHZlZGAgcHJvcGVydHkgd2hlblxuICAgICAqIGl0IHNldHRsZXMgXHUyMDE0IHRoaXMgbWV0aG9kIGp1c3QgcmVhZHMgdGhhdCBwcm9wZXJ0eS4gTm8gc2VwYXJhdGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaHkgdGhpcyBleGlzdHM6IFJlYWN0IE5hdGl2ZSBuZWVkcyB0aGUgY29uZmlnIGF0IHJlbmRlciB0aW1lIHRvIGVtYmVkIGl0XG4gICAgICogaW4gdGhlIFdlYlZpZXcgSFRNTCAoY2FuJ3QgYXdhaXQgaW4gdXNlU3RhdGUpLiBJZiBwcmVsb2FkQ29tcG9uZW50cyByYW5cbiAgICAgKiBlYXJsaWVyIGFuZCB0aGUgZmV0Y2ggY29tcGxldGVkLCB0aGlzIHJldHVybnMgdGhlIHJlc3VsdCBzeW5jaHJvbm91c2x5LFxuICAgICAqIHNraXBwaW5nIHRoZSBXRUJWSUVXX1JFQURZIFx1MjE5MiBmZXRjaCBcdTIxOTIgaW5qZWN0IHJvdW5kIHRyaXAgZW50aXJlbHkuXG4gICAgICovXG4gICAgZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IElDb21wb25lbnRDb25maWcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgeyBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgICAgICByZXR1cm4gdGhpcy52YXJpYW50c1tjYWNoZUtleV0/LnJlc29sdmVkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB3aGljaCAoZW52LCBwcmV2aWV3KSBwYWlyIFx1MjAxNCBhbmQgdGhlcmVmb3JlIHdoaWNoIGNhY2hlIGtleSBcdTIwMTQgYSBjYWxsXG4gICAgICogZm9yIGBjb21wb25lbnRJZGAgcmVmZXJzIHRvLlxuICAgICAqXG4gICAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZmV0Y2hDb21wb25lbnRWMiwgZ2V0UmVzb2x2ZWRDb25maWcgYW5kXG4gICAgICogaHlkcmF0ZUNvbXBvbmVudCwgc28gYSBoeWRyYXRlZCBjb25maWcgYWx3YXlzIGxhbmRzIG9uIHRoZSBrZXkgYSBsYXRlclxuICAgICAqIGZldGNoIHdpbGwgbG9vayB1bmRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgdHJ1ZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBmYWxzZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyB1bmRlZmluZWQ6IGVudiB3YXMgc3BlY2lmaWVkICh2aWEgcGFyYW0gb3Igc2V0RW52aXJvbm1lbnQpIFx1MjE5MiBmYWxzZSwgb3RoZXJ3aXNlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICBjb25zdCBoYXNFZmZlY3RpdmVFbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZW52RXhwbGljaXRseVNldDtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmV2aWV3ID09PSB0cnVlID8gdHJ1ZSA6IChwcmV2aWV3ID09PSBmYWxzZSA/IGZhbHNlIDogIWhhc0VmZmVjdGl2ZUVudik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5OiBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlZCBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWcgaW50byB0aGUgY2FjaGUsIHdpdGhvdXQgYW55XG4gICAgICogbmV0d29yayByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBmZXRjaENvbXBvbmVudFYyfTogdXNlIGl0IHdoZW4gdGhlIGNvbmZpZyB3YXNcbiAgICAgKiByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgbW9zdCBvZnRlbiBvbiBhIHNlcnZlciwgdGhlbiBlbWJlZGRlZCBpbiB0aGVcbiAgICAgKiBwYWdlIFx1MjAxNCBzbyB0aGUgYnJvd3NlciBjYW4gcmVuZGVyIHRoZSBjb21wb25lbnQgd2l0aCBubyByb3VuZCB0cmlwLlxuICAgICAqXG4gICAgICogQWZ0ZXIgaHlkcmF0aW5nLCBgZmV0Y2hDb21wb25lbnRWMmAsIGBnZXRSZXNvbHZlZENvbmZpZ2AgYW5kIGBpc1ByZWxvYWRlZGBcbiAgICAgKiBhbGwgYW5zd2VyIGZvciB0aGlzIGNvbXBvbmVudCBmcm9tIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZyB3YXMgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gICAgICogbWF0Y2ggd2hhdCBhIHBsYWluIGBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkKWAgd291bGQgaGF2ZSB1c2VkLlxuICAgICAqL1xuICAgIGh5ZHJhdGVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgY29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW52OiByZXNvbHZlZEVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZykgYXMgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH07XG4gICAgICAgIC8vIFRhZyBpdCB0aGUgc2FtZSB3YXkgZmV0Y2hDb21wb25lbnRWMiBkb2VzLCBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW5cbiAgICAgICAgLy8gcmVhZCBpdCBzeW5jaHJvbm91c2x5LlxuICAgICAgICBwcm9taXNlLnJlc29sdmVkID0gY29uZmlnO1xuXG4gICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52OiByZXNvbHZlZEVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MSBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJQ29tcG9uZW50Q29uZmlnIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBTREsgdG8gZmV0Y2ggY29tcG9uZW50cyBmcm9tIGEgc2VsZi1ob3N0ZWQgc3RhdGljIHJlZ2lzdHJ5IChTMywgQ0ROLCBldGMuKVxuICogaW5zdGVhZCBvZiB0aGUgTXlvcCBjbG91ZC4gQ29tcG9uZW50cyBhcmUgc2VydmVkIGFzIHN0YXRpYyBKU09OIGZpbGVzOlxuICogICBgJHtjZG5Vcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZpcm9ubWVudH0uanNvbmBcbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZVNlbGZIb3N0ZWQgPSAoY2RuVXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KGNkblVybCk7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5lbmFibGVTdGF0aWNNb2RlKCk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWRDb25maWcgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcblxuLyoqXG4gKiBTZWVkIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZ3MgaW50byB0aGUgU0RLIGNhY2hlLCB3aXRoIG5vIG5ldHdvcmtcbiAqIHJlcXVlc3QuIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgcHJlbG9hZENvbXBvbmVudHN9LlxuICpcbiAqIFVzZSBpdCB3aGVuIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IHR5cGljYWxseSBvbiBhIHNlcnZlclxuICogYW5kIGVtYmVkZGVkIGluIHRoZSBwYWdlIFx1MjAxNCBzbyB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aCB6ZXJvIHJvdW5kIHRyaXBzOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXI6IGNvbnN0IGNvbmZpZ3MgPSB7IFtpZF06IGF3YWl0IG5ldyBDbG91ZFJlcG9zaXRvcnkoKS5mZXRjaENvbXBvbmVudFYyKGlkKSB9XG4gKiAvLyBjbGllbnQ6XG4gKiBoeWRyYXRlQ29tcG9uZW50cyhjb25maWdzKTtcbiAqIC8vIDxNeW9wQ29tcG9uZW50IGNvbXBvbmVudElkPXtpZH0gLz4gbm93IHJlbmRlcnMgd2l0aG91dCBmZXRjaGluZ1xuICogYGBgXG4gKlxuICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICogbWF0Y2ggd2hhdCBhIHBsYWluIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgd291bGQgaGF2ZSB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgaHlkcmF0ZUNvbXBvbmVudHMgPSAoXG4gICAgY29uZmlnczogUmVjb3JkPHN0cmluZywgSUNvbXBvbmVudENvbmZpZz4sXG4gICAgZW52Pzogc3RyaW5nLFxuICAgIHByZXZpZXc/OiBib29sZWFuLFxuKSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlncykpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5oeWRyYXRlQ29tcG9uZW50KGlkLCBjb25maWcsIGVudiwgcHJldmlldyk7XG4gICAgfVxufTtcbiIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7UmVuZGVyUG9saWN5fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIC8vIEdsb2JhbCByZW5kZXIgcG9saWN5IChhbGxvdy9kZW55L21vZGUgZ2F0ZSkuIEEgcGVyLWNhbGwgb3B0aW9ucy5yZW5kZXJQb2xpY3lcbiAgICAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBcdTIwMTQgc2VlIEhUTUxDb21wb25lbnRMb2FkZXIucmVzb2x2ZVJlbmRlck1vZGUuXG4gICAgcHJpdmF0ZSBfcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5O1xuICAgIHB1YmxpYyBzZXRSZW5kZXJQb2xpY3kgPSAocG9saWN5PzogUmVuZGVyUG9saWN5KSA9PiB7IHRoaXMuX3JlbmRlclBvbGljeSA9IHBvbGljeTsgfTtcbiAgICBwdWJsaWMgZ2V0UmVuZGVyUG9saWN5ID0gKCk6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9PiB0aGlzLl9yZW5kZXJQb2xpY3k7XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdpbmNvbWluZ01lc3NhZ2VIYW5kbGVyIEdPVCAnLCBldmVudClcbiAgICAgICAgLy9UT0RPIDogIGlmIChldmVudC5vcmlnaW4gIT09IFwiaHR0cDovL2V4YW1wbGUub3JnOjgwODBcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0kgS25vdyB0aGF0ICEhIScpO1xuICAgICAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RTREsgYWxyZWFkeSBpbml0aWF0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljTG9hZGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBNeW9wSWZyYW1lTG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgV2ViY29tcG9uZW50TG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgSFRNTENvbXBvbmVudExvYWRlcigpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IFtcbiAgICAgICAgICAgIC4uLmJhc2ljTG9hZGVyc1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycykge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzLmZvckVhY2goY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSA9IGxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhblxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyXG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWdcbiAgICBob29rcz86IGxvYWRlckhvb2tzXG4gICAgZWxlbWVudEF0dHJpYnV0ZXM/OiBFbGVtZW50QXR0cmlidXRlc1xuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG4gICAgZGF0YT86IGFueVxuICAgIC8qKlxuICAgICAqIFJhdyBDU1MgaW5qZWN0ZWQgaW50byB0aGUgY29tcG9uZW50J3MgaWZyYW1lIDxoZWFkPiBiZWZvcmUgZmlyc3QgcGFpbnQuXG4gICAgICogQXBwZW5kZWQgbGFzdCBzbyBpdCBvdmVycmlkZXMgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIGNhc2NhZGUgb3JkZXIuXG4gICAgICogVXNlZnVsIGZvciB0aGVtaW5nIHYyIChIVE1MKSBjb21wb25lbnRzIFx1MjAxNCBjb2xvcnMsIGZvbnRzLCBzcGFjaW5nLCBldGMuXG4gICAgICovXG4gICAgaW5qZWN0Q3NzPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udHJvbCBpZnJhbWUgYXV0by1zaXppbmcgYmVoYXZpb3IuXG4gICAgICogLSB0cnVlIChkZWZhdWx0KTogaWZyYW1lIGF1dG8tc2l6ZXMgdG8gY29udGVudCBoZWlnaHQsIHdpZHRoIGZpbGxzIHBhcmVudC5cbiAgICAgKiAtIGZhbHNlOiBubyBzaXppbmcgbG9naWMgcnVucy4gTm8gb2JzZXJ2ZXJzLCBubyBtZWFzdXJlbWVudHMsIG5vIHN0eWxlIGNoYW5nZXMuXG4gICAgICogICBUaGUgaWZyYW1lIHN0YXlzIGF0IHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgdGhlIGNvbnRhaW5lci5cbiAgICAgKiAgIFRoZSBob3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucy5cbiAgICAgKi9cbiAgICBhdXRvU2l6ZT86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFBlci1jYWxsIHJlbmRlciBwb2xpY3kuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgbGV0cyBhblxuICAgICAqIGFwcCByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgKG9yIGZ1cnRoZXIgcmVzdHJpY3QpIHNwZWNpZmljIGxvYWRDb21wb25lbnQgY2FsbHMuXG4gICAgICovXG4gICAgcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBmdWxsIGlzb2xhdGlvbiBmb3IgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudDogc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBubyBob3N0LWRvY3VtZW50IGFjY2Vzcy4gQSByZW5kZXIgcG9saWN5IHJldHVybmluZ1xuICAgICAqICdpc29sYXRlZElmcmFtZScgaGFzIHRoZSBzYW1lIGVmZmVjdC5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQk8sSUFBTSxpQkFBTixNQUE0QztBQUFBLEVBQy9DLFlBQW1CLFFBQ0EsYUFDQSxjQUNBLFdBQ0EsWUFB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S0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQzFELElBQUksNkJBQTZCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUNwRSxJQUFJLG9CQUFvQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDM0QsSUFBSSx3QkFBd0IsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQy9ELElBQUkscUJBQXFCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUM1RCxJQUFJLHVCQUF1QixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUE7QUFBQSxNQUU5RCxJQUFJLGlDQUFpQyxLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsSUFDNUU7QUFFQSx3QkFBTyxRQUFPLE1BQU07QUFBQSxJQUdwQjtBQUFBO0FBQ0o7QUFFQSxvQkFBb0IsbUJBQW1CLGVBQWU7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJzZWVuIiwgInNkayIsICJkb21JZCIsICJzZGsiLCAic2VlbiIsICJza2luIiwgImNvbXBvbmVudCIsICJzZWdtZW50IiwgImV4cGVyaWVuY2UiLCAic2VsZWN0ZWRTa2luIiwgImhvc3RTREsiLCAiZWxlbWVudCJdCn0K
|
|
3671
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvc2hhZG93Um9vdFJlZi50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnQudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2dNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudENvcmUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSU15b3BMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9pZnJhbWVMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyLnRzIiwgInZlcnNpb246bXlvcC1zZGstdmVyc2lvbiIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgaW50ZXJmYWNlIElFbGVtZW50UmVmIHtcbiAgICBteW9wSWQ/OiBzdHJpbmdcbiAgICBodG1sVGFnTmFtZTogc3RyaW5nXG4gICAgQm91bmRpbmdSZWN0PzogRE9NUmVjdFxuICAgIG9mZnNldFRvcD86IG51bWJlclxuICAgIG9mZnNldExlZnQ/OiBudW1iZXJcblxuICAgIHR5cGU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgWFBhdGhFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB4UGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ1hQYXRoRWxlbWVudFJlZidcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BFbGVtZW50UmVmIGltcGxlbWVudHMgSUVsZW1lbnRSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBteW9wSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgaHRtbFRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgQm91bmRpbmdSZWN0PzogRE9NUmVjdCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0VG9wPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRMZWZ0PzogbnVtYmVyKSB7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogc3RyaW5nID0gJ015b3BFbGVtZW50UmVmJ1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXJ9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmV4cG9ydCB0eXBlIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwID0gQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPiB8IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgY29uc3QgcnVuRXhlY3V0b3JDbGVhbnVwID0gYXN5bmMgKHRhc2s6IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmdW5jdGlvbiwgY2FsbCBpdFxuICAgICAgICB0YXNrKCk7XG4gICAgfSBlbHNlIGlmICh0YXNrIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBJdCdzIGEgUHJvbWlzZSwgYXdhaXQgaXRcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFzaztcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgICAgICByZXN1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0YXNrIGlzIHZvaWQsIGRvIG5vdGhpbmdcbn1cblxudHlwZSBJTWVzc2FnZUV4ZWN1dG9yPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+ID0gKG1lc3NhZ2U6IFQpID0+IElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwO1xuXG5pbnRlcmZhY2UgSU1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcblxuICAgIGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSA9IGFueT4gaW1wbGVtZW50cyBJTWVzc2FnZUhhbmRsZXI8VD4ge1xuXG4gICAgLy9UT0RPIDogYWRkIGRpc3Bvc2UgbWV0aG9kXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQpIHtcblxuICAgIH1cblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuICAgIGFic3RyYWN0IGV4ZWN1dG9yOiBJTWVzc2FnZUV4ZWN1dG9yPFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55LCBFID0gYW55PiBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkLCBwdWJsaWMgY29udGV4dD86IEUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZVRvSG9zdCk7XG4gICAgfVxufVxuIiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9CYXNlTWVzc2FnZSc7XG5cbi8vdXNlcidzIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0JpbmRDbGlja01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VUZXh0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3VzdG9tUmVmTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRJbm5lckh0bWwnO1xuXG4vL3N5c3RlbSBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9Jbml0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnZlbG9wZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICAnLi9HZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGVhbnVwTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0Rpc3Bvc2VNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzsiLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBydW5FeGVjdXRvckNsZWFudXB9IGZyb20gXCIuL2luZGV4LnRzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vYmFzZU1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSwgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLCBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBFbnZlbG9wZWRNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBIb3N0ZWRDb21wb25lbnQ8VCA9IGFueT4ge1xuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgfVxuXG4gICAgLy9vbk1lc3NhZ2VSZWNlaXZlZDogKG1zZzogSU15b3BNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBjb250ZXh0PzogVCkge1xuXG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wU0RLIHtcbiAgICBpbml0OiAoKSA9PiB2b2lkO1xuXG4gICAgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzOiAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+O1xufVxuXG4vLyBjb25zdCBsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMgPSBbXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0LFxuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UsXG4vLyAgICAgLy9NeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSxcbi8vIF1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wU0RLIGltcGxlbWVudHMgSU15b3BTREsge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBtZXNzYWdlVG9IYW5kbGVBZnRlckluaXQ6IEJhc2VNeW9wTWVzc2FnZVtdID0gW107XG5cbiAgICBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ+ID0ge307XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0OiBib29sZWFuID0gZmFsc2VcblxuICAgIG1lc3NhZ2VDbGVhbnVwQ2FjaGU6IFJlY29yZDxzdHJpbmcsIENsZWFudXBIYW5kbGVyIHwgUHJvbWlzZTxDbGVhbnVwSGFuZGxlcj4+IHwgUHJvbWlzZTx2b2lkPiA9IHt9O1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBldmVudC5kYXRhID8gZXZlbnQuZGF0YSA6IGV2ZW50LmRldGFpbDtcblxuICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIG5vdCBteW9wIG1hcmtlZCBldmVudCBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gYmFzZVNESywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIChsb2NhbEhvc3RIYW5kbGVkTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgICAvL1RPRE8gOiBmaXggZGlyZWN0aW9uID8gbWVzc2FnZSB3aWxsIG5vdCBwcm9jY2VzcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRGlzcG9zZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2hvdWxkIG5vdCBiZSBvcHRpb25hbCwgZml4IGFuZCByZW1vdmUgJ2lmJ1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb25dXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBnb3Qgb3VyIGlkIGZyb20gb3VyIGhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBTREsgbWF5IHNlcnZlIG1vcmUgdGhhbiAxIGNvbXBvbmVudCAuLiB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFcnJvcihcInJlY2hpdmVkIGluaXQgbWVzc2FnZSBmb3IgYW4gZXhzaXNpbmcgY29tcG9uZW50LlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXSA9IG5ldyBIb3N0ZWRDb21wb25lbnQobmV3Q29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVzcG9uc2UobmV3Q29tcG9uZW50SWQpKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBzYW1lIEhvc3RTREsgY2FzZXNcbiAgICAgICAgICAgIC8vIHdoZW4gYm90aCBSZWZDb21wb25lbnQgYW5kIHJlYWxDb21wb25lbnQgaG9zdGVkIGluIHRoZSBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSBlbnZlbG9wZWRNZXNzYWdlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGlubmVyTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgfHwgdGhpcy5jb21wb25lbnRzW21lc3NhZ2UuZGVzdGluYXRpb24hXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGlubmVyTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBlbnZlbG9wZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZihtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSl7XG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdHlwZWRNZXNzYWdlIDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcbiAgICAgICAgICAgIC8vIC8vICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuQ2xlYW51cE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbWVzc2FnZSBhcyBDbGVhbnVwTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cE1lc3NhZ2UgPSBuZXcgQ2xlYW51cFJlcGxheU1lc3NhZ2UoISFjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cE1lc3NhZ2UuZGVzdGluYXRpb24gPSBtZXNzYWdlLmRlc3RpbmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0b3JDbGVhbnVwKGNsZWFudXApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kZWwgZXJyb3I/XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYWN0aW9uSGFuZGxlckZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VUeXBlID09PSBtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25IYW5kbGVyRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IGhhbmRsZXIuZXhlY3V0b3IobWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmNsZWFuYWJsZSAmJiBjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW21lc3NhZ2UuaWRdID0gY2xlYW51cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFudXAgJiYgIW1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBub24tY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsZWFudXAgJiYgbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIGEgY2xlYW5hYmxlIG1lc3NhZ2UuIFxubWVzc2FnZVR5cGUgLSAke21lc3NhZ2UubWVzc2FnZVR5cGV9LCBoYW5kbGVyIGV4ZWN1dG9yIHdhcyAtICR7aGFuZGxlci5leGVjdXRvcn1cblxuUGxlYXNlIHJldmlldyB0aGUgbWVzc2FnZSBkZWZpbml0aW9uIG9iamVjdCAmIG1lc3NhZ2UgaGFuZGxlci5cblRvIGVuc3VyZSBjbGVhbnVwIHByb3Blcmx5IHNldCAnY2xlYW5hYmxlJyB0cnVlIGF0IG1lc3NhZ2UgZGVmaW5pdGlvbiBhbmQgcmV0dXJuIElNZXNzYWdlRXhlY3V0b3JDbGVhbnVwIGZyb20geW91ciBoYW5kbGVycy5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICghYWN0aW9uSGFuZGxlckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHByaW50IHdpdGggZGVidWcgY29uZmlnIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gbWVzc2FnZSBoYW5kbGVyIHdhcyBmb3VuZCBmb3IgJywgbWVzc2FnZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaW5pdDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0ICogZnJvbSAnLi9NeW9wRWxlbWVudFJlZic7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2VNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0Jhc2VNeW9wU0RLJztcblxuZXhwb3J0IHR5cGUgQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB2b2lkXG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQ7IH07XG5cbi8vZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSAnSWZyYW1lTG9hZGVyJyB8ICdXZWJDb21wb25lbnRMb2FkZXInIHwgJ0hUTUxMb2FkZXInIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU2tpbkxvYWRlcnMgPSB7XG4gICAgXCJJZnJhbWVMb2FkZXJcIjogXCJJZnJhbWVMb2FkZXJcIixcbiAgICBcIldlYkNvbXBvbmVudExvYWRlclwiOiBcIldlYkNvbXBvbmVudExvYWRlclwiLFxuICAgIFwiSFRNTExvYWRlclwiOiBcIkhUTUxMb2FkZXJcIixcbiAgICBcIk1pbmltaXplZExvYWRlclwiOiBcIk1pbmltaXplZExvYWRlclwiXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2tpbkxvYWRlclR5cGUgPSBrZXlvZiB0eXBlb2YgU2tpbkxvYWRlcnM7XG5cbmV4cG9ydCB0eXBlIFByb3BUeXBlID0gJ2FueScgfCAnc3RyaW5nJyB8ICdudW1iZXInIHwgc3RyaW5nOyAvLyBUT0RPIDogPFxuZXhwb3J0IHR5cGUgUmVmU2VsZWN0b3JUeXBlID0gJ2lkLWF0dHJpYnV0ZScgfCAnY3NzLXNlbGVjdG9yJyB8ICd4cGF0aCcgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBMb2FkZXJGcmFtZXdvcmtzID0ge1xuICAgIFwicmVhY3RcIjogXCJyZWFjdFwiLFxuICAgIFwidnVlXCI6IFwidnVlXCIsXG4gICAgXCJhbmd1bGFyXCI6IFwiYW5ndWxhclwiLFxufSBhcyBjb25zdFxuZXhwb3J0IHR5cGUgTG9hZGVyRnJhbWV3b3JrVHlwZSA9IGtleW9mIHR5cGVvZiBMb2FkZXJGcmFtZXdvcmtzO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJXZWJDb21wb25lbnRMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZyxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmcmFtZXdvcms/OiBMb2FkZXJGcmFtZXdvcmtUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlmcmFtZUxvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIklmcmFtZUxvYWRlclwiO1xuICAgIHVybDogc3RyaW5nXG4gICAgYXV0b0hlaWdodDogYm9vbGVhblxuICAgIGhlaWdodD86IHN0cmluZ1xuICAgIHdpZHRoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTaGFkb3dSb290TW9kZVR5cGUgPSB7XG4gICAgXCJvcGVuXCI6IFwib3BlblwiLFxuICAgIFwiY2xvc2VkXCI6IFwiY2xvc2VkXCIsXG4gICAgXCJub25lXCI6IFwibm9uZVwiLFxuICAgIFwibG9jYWxGcmFtZVwiOiBcImxvY2FsRnJhbWVcIlxufSBhcyBjb25zdDtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElIVE1MTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSFRNTExvYWRlclwiO1xuICAgIEhUTUw6IHN0cmluZztcbiAgICAvL1RPRE86IHJlbmFtZShyb290TW9kZS9jdXN0b21FbGVtZW50TW9kZSkgKyBkYiBtaWdyYXRpb25cbiAgICBzaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGU7XG4gICAgYXV0b0hlaWdodD86IGJvb2xlYW47XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudCBpcyByZW5kZXJlZCBpbiBhIHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggTk8gYWNjZXNzIHRvIHRoZSBob3N0IGRvY3VtZW50ICh1bnRydXN0ZWQgY29kZSkuXG4gICAgICogVGhlIGhvc3QgcmVuZGVyIHBvbGljeSBjYW4gYWxzbyBmb3JjZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZyB2YWx1ZS5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvdyBhIGNvbXBvbmVudCBpcyByZW5kZXJlZCBvbiB0aGUgaG9zdCBwYWdlLCBpbiBhc2NlbmRpbmcgaXNvbGF0aW9uOlxuICogIC0gJ3dlYkNvbXBvbmVudCcgICBcdTIwMTQgY3VzdG9tIGVsZW1lbnQgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG1vc3QgcHJpdmlsZWdlZClcbiAqICAtICdpZnJhbWUnICAgICAgICAgXHUyMDE0IHNhbWUtb3JpZ2luIGlubGluZS1IVE1MIGlmcmFtZSAodG9kYXkncyBkZWZhdWx0KVxuICogIC0gJ2lzb2xhdGVkSWZyYW1lJyBcdTIwMTQgc2FuZGJveGVkLCBjcm9zcy1vcmlnaW4gaWZyYW1lICh1bnRydXN0ZWQgY29kZSlcbiAqL1xuZXhwb3J0IHR5cGUgUmVuZGVyTW9kZSA9ICd3ZWJDb21wb25lbnQnIHwgJ2lmcmFtZScgfCAnaXNvbGF0ZWRJZnJhbWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclBvbGljeUNvbnRleHQge1xuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnO1xuICAgIHNraW46IElTa2luQ29uZmlnO1xuICAgIC8qKiBXaGF0IHRoZSBjb21wb25lbnQgYXNrZWQgZm9yIChtYXJrZXIgXHUyMUQyICd3ZWJDb21wb25lbnQnLCBjb25maWcuaXNvbGF0aW9uIFx1MjFEMiAnaXNvbGF0ZWRJZnJhbWUnKS4gKi9cbiAgICByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlO1xuICAgIC8qKiBXaGV0aGVyIHRoZSBIVE1MIGNhcnJpZXMgdGhlIGA8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT5gIG1hcmtlci4gKi9cbiAgICBpc1dlYkNvbXBvbmVudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIb3N0LXN1cHBsaWVkIGdhdGUgZGVjaWRpbmcgaG93IChvciB3aGV0aGVyKSBhIGNvbXBvbmVudCByZW5kZXJzLiBSZXR1cm4gYVxuICogUmVuZGVyTW9kZSB0byB1c2UsIG9yIGBmYWxzZWAgdG8gYmxvY2sgcmVuZGVyaW5nIGVudGlyZWx5LlxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJQb2xpY3kgPVxuICAgIChjdHg6IFJlbmRlclBvbGljeUNvbnRleHQpID0+IFJlbmRlck1vZGUgfCBmYWxzZSB8IFByb21pc2U8UmVuZGVyTW9kZSB8IGZhbHNlPjtcblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICByZWxlYXNlZE9uPzogc3RyaW5nO1xuICAgIHJlbGVhc2VkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVZhcmlhbnRDb25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICByZWxlYXNlcz86IHYyX0lSZWxlYXNlTWV0YWRhdGFbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JU2tpbkNvbmZpZyBleHRlbmRzIElTa2luQ29uZmlnIHtcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IHJ1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBwZXJjZW50YWdlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdCB7XG4gICAgdmVyc2lvbnM6IElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb25bXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBydWxlczogSUV4cGVyaWVuY2VTZWdtZW50UnVsZVtdO1xuICAgIHVzZUFiOiBib29sZWFuO1xuICAgIGNvbXBvbmVudFZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgICBhYlNwbGl0PzogSUV4cGVyaWVuY2VBQlNwbGl0O1xuICAgIHN0aWNreVByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIGRlZmluaXRpb24gY29uZmlnICh2MilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZURlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRHMgKi9cbiAgICBjb21wb25lbnRzOiBzdHJpbmdbXTtcbiAgICAvKiogU2VnbWVudCBjb25maWd1cmF0aW9ucyAqL1xuICAgIHNlZ21lbnRzOiBJRXhwZXJpZW5jZVNlZ21lbnRbXTtcbiAgICAvKiogRmFsbGJhY2sgdmFyaWFudCBwZXIgY29tcG9uZW50ICovXG4gICAgZmFsbGJhY2s6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLyoqIFRhZ3MgKi9cbiAgICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcG9uZW50J3MgcnVudGltZSB0YWdzOiBvbmx5IHRhZ3MgbmFtZWQgYHVpOi4uLmAgKGUuZy4gYHVpOmJldGFgKSwgYXMgc2V0IGluIHRoZVxuICAgICAqIGRhc2hib2FyZC4gRXZlcnkgb3RoZXIgdGFnIHN0YXlzIHByaXZhdGUgb24gdGhlIHNlcnZlci4gRW1wdHkgd2hlbiB0aGVyZSBhcmUgbm9uZS5cbiAgICAgKi9cbiAgICB1aVRhZ3M/OiBzdHJpbmdbXSxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSU15b3BTdG9yZWRPYmplY3QgZXh0ZW5kcyB2Ml9JQmFzZU15b3BPYmplY3Qge1xuICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEFjY2VzcyB7XG4gICAgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIHwgJ3VubGlzdGVkJyB8ICdwdWJsaWMnO1xuICAgIHVubGlzdGVkPzoge1xuICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBtYXJrZXRwbGFjZT86IHtcbiAgICAgICAgc3RhdHVzOiAnZHJhZnQnIHwgJ3N1Ym1pdHRlZCcgfCAnY2xhaW1lZCcgfCAnY2xvc2VkJztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgY29udGFjdEVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlYWRsaW5lOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICBhY2Nlc3M/OiBDb21wb25lbnRBY2Nlc3MsXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiZXhwb3J0IGNvbnN0IF9fZmVkZXJhdGlvbl9fID0gXCJfX2ZlZGVyYXRpb25fX1wiXG5leHBvcnQgY29uc3Qgb25Mb2FkS2V5ID0gXCJvbkxvYWRcIlxuZXhwb3J0IGNvbnN0IG1vZHVsZUluc3RhbmNlS2V5ID0gXCJtb2R1bGVJbnN0YW5jZVwiXG5cbmV4cG9ydCBjb25zdCBkZWZpbmVEeW5hbWljSW1wb3J0ID0gKGdsb2JhbE5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHdpbmRvd1tfX2ZlZGVyYXRpb25fX10gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdW29uTG9hZEtleV0oe1tnbG9iYWxOYW1lXTogbW9kdWxlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZXIgbm90IGRlZmluZWQgZm9yIG1vZHVsZScsIG1vZHVsZSk7XG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXksIE15b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIERpc3Bvc2VNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLCBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSxcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLLCBsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSBvYnNlcnZlQXV0b1NpemUgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZVJlc3VsdCB7XG4gICAgLyoqIEN1cnJlbnQgd2lkdGggKGZyb20gY29udGVudCkgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKiBDdXJyZW50IGhlaWdodCAoZnJvbSBjb250ZW50KSAqL1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8qKiBXaGV0aGVyIHdpZHRoIGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nV2lkdGg6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgaGVpZ2h0IGlzIGJlaW5nIGF1dG8tc2l6ZWQgKi9cbiAgICBhdXRvU2l6aW5nSGVpZ2h0OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9ic2VydmVBdXRvU2l6ZSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvU2l6ZU9wdGlvbnMge1xuICAgIC8qKiBDYWxsYmFjayBjYWxsZWQgd2l0aCBzaXplIGluZm8gd2hlbmV2ZXIgc2l6ZSBjaGFuZ2VzICovXG4gICAgb25TaXplQ2hhbmdlPzogKHJlc3VsdDogQXV0b1NpemVSZXN1bHQpID0+IHZvaWQ7XG4gICAgLyoqIE1pbmltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1pbldpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtYXhXaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWluaW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1pbkhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSBoZWlnaHQgY29uc3RyYWludCAqL1xuICAgIG1heEhlaWdodD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogRXhwbGljaXQgd2lkdGggc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgd2lkdGggKi9cbiAgICBleHBsaWNpdFdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBFeHBsaWNpdCBoZWlnaHQgc2V0IGJ5IGhvc3QgLSBpZiBkZWZpbmVkLCBkb24ndCBhdXRvLXNpemUgaGVpZ2h0ICovXG4gICAgZXhwbGljaXRIZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEZvcmNlIGF1dG8tc2l6ZSBldmVuIGlmIGNvbnRhaW5lciBoYXMgZGltZW5zaW9ucyAqL1xuICAgIGZvcmNlQXV0b1NpemU/OiBib29sZWFuO1xuICAgIC8qKiBNaW4gaGVpZ2h0IHVzZWQgYnkgbG9hZGVyIHRvIGRldGVjdCBjb2xsYXBzZSAoZGVmYXVsdDogNTApICovXG4gICAgbG9hZGVyTWluSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vL1RPRE8gOiBjaGFuZ2UgSU15b3BDb21wb25lbnQgdG8gcmVmIHNwZWNpZmljIGltcGxcbnR5cGUgUmVmVHlwZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogSU15b3BDb21wb25lbnQgfCBSZWZcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiA9IGFueT4ge1xuXG4gICAgaWQ6IHN0cmluZztcblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuO1xuXG4gICAgbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW47XG5cbiAgICBzZXRJbml0aWF0ZWQ6ICgpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvKiogUnVudGltZSB0YWdzOiBvbmx5IHRhZ3MgbmFtZWQgYHVpOi4uLmAgKGUuZy4gYHVpOmJldGFgKS4gYFtdYCB3aGVuIHRoZXJlIGFyZSBub25lLiAqL1xuICAgIHJlYWRvbmx5IHVpVGFnczogc3RyaW5nW11cblxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcblxuICAgIC8vcmVmIGNvbXBvbmVudHMgY2FuIGJlIGVsZW1lbnQtbGVzc1xuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgc2VuZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBDbGVhbnVwSGFuZGxlclxuXG4gICAgYmluZChtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgYmluZDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIC8vIGJvb2xlYW4gcmV0dXJuZWQgdmFsdWUgPSBoYW5kbGVkIG9yIG5vdFxuICAgIG9uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IGJvb2xlYW5cblxuICAgIGluaXRpYXRlZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZGlzcG9zZTogKCkgPT4gdm9pZFxuXG4gICAgaGlkZSgpOiB2b2lkO1xuXG4gICAgc2hvdygpOiB2b2lkO1xuXG4gICAgaW5zcGVjdCgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBpZnJhbWUtYmFzZWQgY29tcG9uZW50cy4gVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2Vzcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplPzogKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpID0+IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIG15b3A6c2l6ZSBtZXRhIHRhZyBmcm9tIHRoZSBjb21wb25lbnQgSFRNTC5cbiAgICAgKiBTZXQgYnkgSFRNTENvbXBvbmVudExvYWRlciBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uLlxuICAgICAqIFVzZWQgYnkgdGhlIFJlYWN0IGhvc3QgdG8gZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpLlxuICAgICAqL1xuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgcGFyZW50PzogSU15b3BDb21wb25lbnQ7XG5cbiAgICBwcm9wczogUFxuXG4gICAgcmVmczogUlxufVxuXG5mdW5jdGlvbiBpc0luaGVyaXRGcm9tKG9iajogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKCFwcm90bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IGJhc2VDbGFzcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbmhlcml0RnJvbShwcm90bywgYmFzZUNsYXNzKTtcbn1cblxuLy8gVE9ETyA6IG1vdmUgOiBcbnR5cGUgbWVzc2FnZUhhbmRsZXI8VD4gPSAobWVzc2FnZTogVCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgZXh0ZW5kcyBSZWZUeXBlcyA9IFJlZlR5cGVzPiBpbXBsZW1lbnRzIElNeW9wQ29tcG9uZW50PFA+IHtcbiAgICBpZDogc3RyaW5nID0gJydcblxuICAgIG1lc3NhZ2VIYW5kbGVyczogUmVjb3JkPHN0cmluZywgbWVzc2FnZUhhbmRsZXI8YW55PltdPiA9IHt9O1xuXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkIHx8IEhvc3RTREsuSW5zdGFuY2UoKS5hc3NpZ25JZChjb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPyBvcHRpb25zPy50aW1lb3V0IDogNSAqIDEwMDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkICYmIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgJiYgIXRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgdGltZW91dF8ke3RpbWVvdXR9ICR7dGhpcy5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGF1dG8gaW5zcGVjdCwgY29udHJvbCBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLmhvc3RTREsuaW5zcGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IHVpVGFncygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudERlZmluaXRpb24/LnVpVGFncyB8fCBbXTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IHdyYXBwZXIgZm9yIE15b3AgV2ViIENvbXBvbmVudHMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gSFRNTFxuICogYW5kIHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCAobm90IGluIGFuIGlmcmFtZSkuXG4gKlxuICogVGhlc2UgY29tcG9uZW50cyB1c2UgdGhlIG5hdGl2ZSBXZWIgQ29tcG9uZW50cyBBUEkgKEN1c3RvbSBFbGVtZW50cyArIFNoYWRvdyBET00pXG4gKiBhbmQgY29tbXVuaWNhdGUgdmlhIGRpcmVjdCBtZXRob2QgY2FsbHMgYW5kIEN1c3RvbUV2ZW50cyBpbnN0ZWFkIG9mIHBvc3RNZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGN0YUNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bn0+ID0gW107XG5cbiAgICAvLyBBIHNpbmdsZSAnbXlvcC1jdGEnIGxpc3RlbmVyLCBhdHRhY2hlZCBhdCBjb25zdHJ1Y3Rpb24gc28gQ1RBcyBhIGNvbXBvbmVudFxuICAgIC8vIGRpc3BhdGNoZXMgZHVyaW5nIGl0cyBmaXJzdCBpbml0V2l0aERhdGEoKSByZW5kZXIgXHUyMDE0IGJlZm9yZSB0aGUgaG9zdCBhdHRhY2hlc1xuICAgIC8vIGEgaGFuZGxlciBcdTIwMTQgYXJlIGJ1ZmZlcmVkIChhbmQgZmx1c2hlZCBvbiBzZXRDdGFIYW5kbGVyKSwgbWF0Y2hpbmcgdGhlIGlmcmFtZVxuICAgIC8vIHBhdGgncyBwcmUtaGFuZGxlciBDVEEgcXVldWUuXG4gICAgcHJpdmF0ZSBfY3RhTGlzdGVuZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gKGUgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbDtcbiAgICAgICAgaWYgKCFkZXRhaWw/LmFjdGlvbikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fY3RhSGFuZGxlciAmJiAhdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5fY3RhSGFuZGxlcihkZXRhaWwuYWN0aW9uLCBkZXRhaWwucGF5bG9hZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlLnB1c2goeyBhY3Rpb246IGRldGFpbC5hY3Rpb24sIHBheWxvYWQ6IGRldGFpbC5wYXlsb2FkIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICBwcml2YXRlIHRhZ05hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnNcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcblxuICAgICAgICAvLyBMaXN0ZW4gQkVGT1JFIGFueSBpbml0V2l0aERhdGEgcmVuZGVyIHNvIGluaXQtdGltZSBDVEFzIGFyZW4ndCBsb3N0LlxuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCB0aGlzLl9jdGFMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuY3RhQ2xlYW51cCA9ICgpID0+IHRoaXMuY3VzdG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIHRoaXMuX2N0YUxpc3RlbmVyKTtcblxuICAgICAgICAvLyBXZWIgY29tcG9uZW50cyBhcmUgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IChubyBwb3N0TWVzc2FnZSBoYW5kc2hha2UgbmVlZGVkKVxuICAgICAgICB0aGlzLnNldEluaXRpYXRlZCgpO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHt9O1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0JztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IHdpdGggZGF0YSBieSBjYWxsaW5nIG15b3BfaW5pdF9pbnRlcmZhY2UgZGlyZWN0bHlcbiAgICAgKi9cbiAgICBpbml0V2l0aERhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IGRhdGEgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0RGF0YSgpOiB1bmtub3duIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmN1c3RvbUVsZW1lbnQgYXMgYW55KS5teW9wX2luaXRfaW50ZXJmYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgQ1RBIGhhbmRsZXIgLSB1bmlmaWVkIEFQSSB3aXRoIGlmcmFtZSBjb21wb25lbnRzLlxuICAgICAqIENhbGxlZCB2aWEgcHJvcHMubXlvcF9jdGFfaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgKi9cbiAgICBzZXRDdGFIYW5kbGVyKGhhbmRsZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICAvLyBUaGUgJ215b3AtY3RhJyBsaXN0ZW5lciBpcyBhdHRhY2hlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNvIHdlIG9ubHkgc2V0IHRoZVxuICAgICAgICAvLyBoYW5kbGVyIGFuZCBmbHVzaCBhbnl0aGluZyB0aGUgY29tcG9uZW50IGVtaXR0ZWQgYmVmb3JlIG5vdyAoZS5nLiBkdXJpbmcgdGhlXG4gICAgICAgIC8vIGZpcnN0IGluaXRXaXRoRGF0YSByZW5kZXIpLlxuICAgICAgICB0aGlzLl9jdGFIYW5kbGVyID0gaGFuZGxlcjtcblxuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1lc3NhZ2UtYmFzZWQgY29tcG9uZW50cy5cbiAgICAgKiBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgcG9zdE1lc3NhZ2UsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgbW9zdCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSB0aGUgcG9zdE1lc3NhZ2Ugc3lzdGVtXG4gICAgICAgIC8vIEluc3RlYWQsIGludGVyYWN0IGRpcmVjdGx5IHZpYSBwcm9wcy5teW9wX2luaXRfaW50ZXJmYWNlIGFuZCBwcm9wcy5teW9wX2N0YV9oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudF0gc2VuZCgpIGNhbGxlZCAtIHdlYiBjb21wb25lbnRzIHVzZSBkaXJlY3QgQVBJIGluc3RlYWQnLCBtZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3RhQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5jdGFDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi9ob3N0U0RLXCI7XG5cbnR5cGUgY29tcG9uZW50RGVmaW5pdGlvblByb3BzID0gSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbJ3Byb3BzJ11cblxuY29uc3QgY3JlYXRlRGVidWdUaXRsZSA9ICh0ZXh0OiBzdHJpbmcsIHRvcDogbnVtYmVyLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgdGl0bGVFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgdGl0bGVFbC5zdHlsZS5wYWRkaW5nID0gJzAgNXB4JztcbiAgICB0aXRsZUVsLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xuICAgIHRpdGxlRWwuc3R5bGVbJ3RvcCddID0gJzAnO1xuICAgIHRpdGxlRWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAvL3RpdGxlRWwuc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgIHRpdGxlRWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIHRpdGxlRWwudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgdGl0bGVFbC5ocmVmID0gYGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkfWBcblxuICAgIHJldHVybiB0aXRsZUVsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldERlYnVnU3R5bGUgPSAoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcbik6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAvLyMwMDdCRkYgKGJsdWUpIG9yICNGRjU3MjIgKG9yYW5nZSlcbiAgICAvLyM0Q0FGNTAgKGdyZWVuKSBvciAjRkZDMTA3IChhbWJlcilcbiAgICAvLyBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtpZH0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLm5hbWV9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZSh0b3BUZXh0LCBjb21wb25lbnRFbGVtZW50KTtcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgIzAwN0JGRic7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJ3Vuc2V0JztcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvcFRleHQpO1xuICAgIH1cbn1cblxuY29uc3QgcmVwb3J0RXJyb3IgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgaWYgKCFwcm9wQ29uZmlnKSB7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvcjogVW5kZWZpbmVkIFByb3BcXG5cXG5gICtcbiAgICAgICAgICAgIGBJdCBsb29rcyBsaWtlIHlvdSd2ZSB0cmllZCB0byB1c2UgYSBwcm9wIHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZC5cXG5gICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIHByb3AgbmFtZSBmb3IgYW55IHR5cG9zIG9yIGVuc3VyZSB0aGF0IGl0IGlzIHByb3Blcmx5IGRlZmluZWQgaW4gdGhlIGNvbXBvbmVudCdzIHByb3AgbGlzdC5cXG5cXG5gICtcbiAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IHJlcG9ydFVuc3VwcG9ydGVkID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvcjogQ29kZSBQcm9wIE5vdCBTdXBwb3J0ZWRcXG5cXG5gICtcbiAgICAgICAgYEN1cnJlbnRseSwgY29kZSBwcm9wcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gbG9jYWwgZnJhbWUgY29tcG9uZW50cy5cXG5gICtcbiAgICAgICAgYFx1MjZBMFx1RkUwRiBUaGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcyBmZWF0dXJlIFx1MjAxNCBjb2RlIHByb3BzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHVwY29taW5nIHZlcnNpb25zLlxcblxcbmAgK1xuICAgICAgICBgSW4gdGhlIG1lYW50aW1lLCB5b3UgY2FuIHVzZSBtZXNzYWdlIHByb3BzLlxcblxcbmAgK1xuICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UHJvcHMgPSA8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgcHJvcHNDb25maWc6IElQcm9wQ29uZmlnW10sIHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcblxuICAgIGNvbnN0IHByb3BzTWFwID0gcHJvcHNDb25maWcucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICBbY3VycmVudFZhbHVlLm5hbWVdOiB7Li4uY3VycmVudFZhbHVlfVxuICAgICAgICB9XG4gICAgfSwge30pO1xuXG4gICAgY29uc3QgcHJvcHNIYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBGSVJTVFxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGdldHMvc2V0cyBkYXRhIChtYXRjaGVzIGlmcmFtZSBiZWhhdmlvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGF0YT86IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBteW9wX2N0YV9oYW5kbGVyLCByZXR1cm4gdW5kZWZpbmVkIChpdCdzIHdyaXRlLW9ubHkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSXNvbGF0ZWQgaWZyYW1lOiBubyBzYW1lLW9yaWdpbiBhY2Nlc3MgXHUyMDE0IHVzZSB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlXG4gICAgICAgICAgICAgICAgLy8gKHNhbWUgbWV0aG9kIHN1cmZhY2UgYXMgdGhlIGV4dHJhY3RlZC1XQyBicmFuY2ggYWJvdmUpLlxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wSWZyYW1lQ29tcG9uZW50ICYmIGNvbXBvbmVudC5pc29sYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGF0YT86IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBteW9wX2N0YV9oYW5kbGVyIGlzIHdyaXRlLW9ubHlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1QgKGJlZm9yZSBsb2NhbEZyYW1lIGNoZWNrKVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIG1heSBoYXZlIHNoYWRvd1Jvb3RNb2RlOiBsb2NhbEZyYW1lIGluIHRoZWlyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCwgbm90IGluIGFuIGlmcmFtZVxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSXNvbGF0ZWQgaWZyYW1lOiByb3V0ZSB2aWEgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAobm8gc2FtZS1vcmlnaW4gYWNjZXNzKS5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcElmcmFtZUNvbXBvbmVudCAmJiBjb21wb25lbnQuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7IGNvbXBvbmVudC5zZXRDdGFIYW5kbGVyKHZhbHVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHsgY29tcG9uZW50LmluaXRXaXRoRGF0YSh2YWx1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gKGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWFsIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3dbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIENUQSBxdWV1ZSBpZiB0aGlzIGlzIG15b3BfY3RhX2hhbmRsZXIgYW5kIHF1ZXVlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicgJiYgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVldWUgPSBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gbnVsbDsgLy8gQ2xlYXIgdG8gcHJldmVudCBkb3VibGUtZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKChpdGVtOiB7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IGFueX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb21wb25lbnQgd2FzIGRpc3Bvc2VkIGR1cmluZyBmbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2F1dG9TaXplVXBkYXRlPzogKCkgPT4gdm9pZDtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJc29sYXRpb24gKHNhbmRib3hlZCBjcm9zcy1vcmlnaW4gZnJhbWUpIFx1MjAxNCBwb3N0TWVzc2FnZSBicmlkZ2UsIGhvc3Qgc2lkZSBcdTI1MDBcdTI1MDBcbiAgICBwdWJsaWMgaXNvbGF0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sYXN0RGF0YT86IHVua25vd247ICAgICAgICAgICAgICAgLy8gY2FjaGVkIGxhc3Qtc2VudCBkYXRhIChzeW5jIGdldERhdGEpXG4gICAgcHJpdmF0ZSBfY3RhSGFuZGxlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFRdWV1ZTogQXJyYXk8eyBhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biB9PiA9IFtdO1xuICAgIHByaXZhdGUgX2lzb01zZ0hhbmRsZXI/OiAoZTogTWVzc2FnZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2lzb1NpemVPcHRzPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2lzb0F1dG9TaXplID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJyaWRnZSBzaXppbmcgb25seSB3aGVuIGF1dG8tc2l6ZSBpcyBvblxuICAgIHByaXZhdGUgX2lzb0xhc3RTaXplPzogeyBoZWlnaHQ6IG51bWJlciwgd2lkdGg/OiBudW1iZXIgfTsgIC8vIGxhc3QgcmVwb3J0ZWQgc2l6ZSAoZm9yIHRoZSBlbmFibGUgcmFjZSlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgdGhpcy5fbGFzdERhdGEgPSBvcHRpb25zPy5kYXRhO1xuICAgICAgICAvLyB0aGlzLklmcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdClcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGBJZnJhbWVFbGVtZW50IGVycm9yYCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIElzb2xhdGlvbiBicmlkZ2UgKGhvc3Qgc2lkZSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLyoqIEF0dGFjaCB0aGUgaG9zdC1zaWRlIHBvc3RNZXNzYWdlIGxpc3RlbmVyIGZvciBhIHNhbmRib3hlZCBmcmFtZS4gKi9cbiAgICBlbmFibGVJc29sYXRpb24oKSB7XG4gICAgICAgIHRoaXMuaXNvbGF0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgZG9uJ3QgcnVuIHRoZSBJZnJhbWVTREsgaGFuZHNoYWtlIChubyBzYW1lLW9yaWdpbiBpbml0KSxcbiAgICAgICAgLy8gc28gbWFyayBpbml0aWF0ZWQgaW1tZWRpYXRlbHkgXHUyMDE0IGxpa2UgdGhlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IGRvZXMuXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgIHRoaXMuX2lzb01zZ0hhbmRsZXIgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5zb3VyY2UgIT09IHRoaXMuSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBkOiBhbnkgPSBlLmRhdGE7XG4gICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdteW9wOmN0YScpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3RhSGFuZGxlciAmJiAhdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkgdGhpcy5fY3RhSGFuZGxlcihkLmFjdGlvbiwgZC5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fY3RhSGFuZGxlcikgdGhpcy5fY3RhUXVldWUucHVzaCh7IGFjdGlvbjogZC5hY3Rpb24sIHBheWxvYWQ6IGQucGF5bG9hZCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnbXlvcDpzaXplJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5SXNvU2l6ZShkLmhlaWdodCwgZC53aWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtaW4gXHUyMDE0IHVuaWZpZWQgd2l0aCB0aGUgZXh0cmFjdGVkLVdDIEFQSS4gUG9zdHMgaW5pdCBvdmVyIHRoZSBicmlkZ2UuICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbGFzdERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDppbml0JywgZGF0YSB9LCAnKicpO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLWluIGdldHRlciBcdTIwMTQgcmV0dXJucyB0aGUgbGFzdCBkYXRhIHRoZSBob3N0IHNlbnQgKGNhY2hlZCwgc3luY2hyb25vdXMpLiAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0RGF0YTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1vdXQgXHUyMDE0IHVuaWZpZWQgd2l0aCB0aGUgZXh0cmFjdGVkLVdDIEFQSS4gRmx1c2hlcyBDVEFzIHF1ZXVlZCBwcmUtaGFuZGxlci4gKi9cbiAgICBzZXRDdGFIYW5kbGVyKGhhbmRsZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdGFIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4geyBpZiAoIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbHlJc29TaXplKGhlaWdodDogbnVtYmVyLCB3aWR0aD86IG51bWJlcikge1xuICAgICAgICBpZiAoIWhlaWdodCB8fCBOdW1iZXIuaXNOYU4oaGVpZ2h0KSkgcmV0dXJuO1xuICAgICAgICAvLyBBbHdheXMgcmVtZW1iZXIgdGhlIGxhdGVzdCByZXBvcnRlZCBzaXplIHNvIGl0IGNhbiBiZSBhcHBsaWVkIGlmL3doZW5cbiAgICAgICAgLy8gYXV0by1zaXppbmcgaXMgZW5hYmxlZCBhZnRlciB0aGUgZmlyc3QgbWVzc2FnZSBhcnJpdmVzLlxuICAgICAgICB0aGlzLl9pc29MYXN0U2l6ZSA9IHsgaGVpZ2h0LCB3aWR0aCB9O1xuICAgICAgICAvLyBSZXNwZWN0IGF1dG9TaXplOmZhbHNlIFx1MjAxNCB0aGUgaG9zdCBvd25zIGRpbWVuc2lvbnMsIHNvIGRvbid0IHRvdWNoIHRoZW0uXG4gICAgICAgIGlmICghdGhpcy5faXNvQXV0b1NpemUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2lzb1NpemVPcHRzO1xuICAgICAgICBjb25zdCB0b051bSA9ICh2OiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICh0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogKGlzTmFOKHBhcnNlRmxvYXQodikpID8gdW5kZWZpbmVkIDogcGFyc2VGbG9hdCh2KSkpO1xuICAgICAgICBjb25zdCBtaW4gPSB0b051bShvcHRzPy5taW5IZWlnaHQpLCBtYXggPSB0b051bShvcHRzPy5tYXhIZWlnaHQpO1xuICAgICAgICBsZXQgaCA9IGhlaWdodDtcbiAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIGggPCBtaW4pIGggPSBtaW47XG4gICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBoID4gbWF4KSBoID0gbWF4O1xuICAgICAgICAvLyBUcmFuc2l0aW9uIGZyb20gYWJzb2x1dGUgb3ZlcmxheSB0byBkb2N1bWVudCBmbG93IGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQuXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5pbnNldCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGggKyAncHgnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHsgd2lkdGg6IHdpZHRoID8/IHRoaXMuSWZyYW1lRWxlbWVudC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBoLCBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLCBhdXRvU2l6aW5nSGVpZ2h0OiB0cnVlIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ic2VydmVzIHRoZSBpZnJhbWUgY29udGVudCBzaXplIGFuZCBhdXRvbWF0aWNhbGx5IHN5bmNzIGl0IHRvIHRoZSBpZnJhbWUgZWxlbWVudC5cbiAgICAgKiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzIChzYW1lLW9yaWdpbiBvbmx5KSBmb3IgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLlxuICAgICAqXG4gICAgICogUmVlbnRyYW50OiB3aGVuIGNhbGxlZCBhZ2FpbiB3aGlsZSBvYnNlcnZlcnMgYWxyZWFkeSBleGlzdCwgdXBkYXRlcyBvcHRpb25zIGFuZFxuICAgICAqIHJlLWV2YWx1YXRlcyBzaXppbmcgd2l0aG91dCByZWNyZWF0aW5nIG9ic2VydmVycy4gQ2xlYW51cCArIHJlLWNhbGwgKGUuZy4gUmVhY3RcbiAgICAgKiByZS1yZW5kZXIpIGNyZWF0ZXMgZnJlc2ggb2JzZXJ2ZXJzIHNpbmNlIGNsZWFudXAgY2xlYXJzIHRoZSBleGlzdGluZyBvbmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHNpemUgY2hhbmdlIGNhbGxiYWNrIGFuZCBtaW4vbWF4IGNvbnN0cmFpbnRzXG4gICAgICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byBzdG9wIG9ic2VydmluZ1xuICAgICAqL1xuICAgIG9ic2VydmVBdXRvU2l6ZSA9IChvcHRpb25zPzogQXV0b1NpemVPcHRpb25zKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICAvLyBTdG9yZSBvcHRpb25zIHNvIHVwZGF0ZVNpemUgYWx3YXlzIHJlYWRzIHRoZSBsYXRlc3RcbiAgICAgICAgdGhpcy5fYXV0b1NpemVPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgY2FuJ3QgYmUgbWVhc3VyZWQgY3Jvc3Mtb3JpZ2luIFx1MjAxNCBzaXppbmcgaXMgZHJpdmVuIGJ5XG4gICAgICAgIC8vICdteW9wOnNpemUnIHBvc3RNZXNzYWdlcyBmcm9tIHRoZSBicmlkZ2UgKHNlZSBfYXBwbHlJc29TaXplKS5cbiAgICAgICAgaWYgKHRoaXMuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzb1NpemVPcHRzID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX2lzb0F1dG9TaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtb3N0IHJlY2VudCBicmlkZ2UtcmVwb3J0ZWQgc2l6ZSAoaXQgbWF5IGhhdmUgYXJyaXZlZCBiZWZvcmVcbiAgICAgICAgICAgIC8vIGF1dG8tc2l6aW5nIHdhcyB0dXJuZWQgb24pLlxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzb0xhc3RTaXplKSB0aGlzLl9hcHBseUlzb1NpemUodGhpcy5faXNvTGFzdFNpemUuaGVpZ2h0LCB0aGlzLl9pc29MYXN0U2l6ZS53aWR0aCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4geyB0aGlzLl9pc29BdXRvU2l6ZSA9IGZhbHNlOyB0aGlzLl9pc29TaXplT3B0cyA9IHVuZGVmaW5lZDsgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCByZS1ldmFsdWF0ZSB3aXRoIG5ldyBvcHRpb25zIGFuZCByZXVzZSB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXAgJiYgdGhpcy5fYXV0b1NpemVVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NpemVDbGVhbnVwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNeW9wSWZyYW1lQ29tcG9uZW50XSBDYW5ub3Qgb2JzZXJ2ZSBhdXRvIHNpemU6IGNvbnRlbnREb2N1bWVudCBub3QgYWNjZXNzaWJsZScpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnREb2MpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWluV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1pbkhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdHM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgICAgIC8vIFdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiIChibG9jayBlbGVtZW50IGJlaGF2aW9yKSB0byBwcmV2ZW50IHRoZSBzaHJpbmstdG8tMCBtZWFzdXJlbWVudCBidWcuXG4gICAgICAgICAgICAvLyBIZWlnaHQgaGFzIG5vIGRlZmF1bHQgc28gaXQgYXV0by1zaXplcyB0byBjb250ZW50LlxuICAgICAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgICAgIC8vIFBpeGVsIHNpemVNZXRhIHZhbHVlcyAoZS5nLiwgaGVpZ2h0OiAyMDApIGFyZSBpbml0aWFsIGhpbnRzLCBOT1QgZXhwbGljaXQgY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxXaWR0aCA9IHRoaXMuc2l6ZU1ldGE/LndpZHRoID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID0gb3B0cz8uZXhwbGljaXRXaWR0aCA/PyBzaXplTWV0YUZpbGxXaWR0aCA/PyBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA/PyBzaXplTWV0YUZpbGxIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBhcHBseSBleHBsaWNpdC9wZXJjZW50YWdlIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcblxuICAgICAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBDU1MgdHJhbnNpdGlvbnMgb24gaWZyYW1lIGFuZCBjb250YWluZXIgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50ICsgaGVpZ2h0LXNldHRpbmcgY3ljbGUuIEhvc3QgYXBwcyBtYXkgc2V0IGB0cmFuc2l0aW9uOiBhbGxgXG4gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBhbmltYXRlIHRoZSAwcHggY29sbGFwc2UgYW5kIGZpbmFsIGhlaWdodCBjaGFuZ2UsIGNhdXNpbmdcbiAgICAgICAgICAgIC8vIHZpc2libGUganVtcHMgZHVyaW5nIHNjcm9sbC5cbiAgICAgICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gaWZyYW1lLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250YWluZXJUcmFuc2l0aW9uID0gY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAvLyBRdWljayBwcmUtY2hlY2s6IHJlYWQgc2Nyb2xsSGVpZ2h0L1dpZHRoIEJFRk9SRSBjb2xsYXBzaW5nIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICAvLyBJZiBjb250ZW50IG9ubHkgZ3JldyAoc2Nyb2xsSGVpZ2h0ID4gaWZyYW1lIGhlaWdodCksIHdlIGNhbiBza2lwIHRoZVxuICAgICAgICAgICAgLy8gMHB4IGNvbGxhcHNlIFx1MjAxNCBzY3JvbGxIZWlnaHQgbmF0dXJhbGx5IGV4cGFuZHMgYmV5b25kIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lSGVpZ2h0ID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVXaWR0aCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuXG4gICAgICAgICAgICBsZXQgY29udGVudFdpZHRoID0gcHJlU2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHByZVNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0R3JldyA9IHNob3VsZEF1dG9IZWlnaHQgJiYgcHJlU2Nyb2xsSGVpZ2h0ID4gY3VycmVudElmcmFtZUhlaWdodCArIDE7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEdyZXcgPSBzaG91bGRBdXRvV2lkdGggJiYgcHJlU2Nyb2xsV2lkdGggPiBjdXJyZW50SWZyYW1lV2lkdGggKyAxO1xuXG4gICAgICAgICAgICAvLyBGb3Igbm9uLWdyb3cgY2FzZXMgKHNocmluayBvciBuby1jaGFuZ2UpLCB3ZSBtdXN0IGNvbGxhcHNlIHRvIDBweCB0b1xuICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgdHJ1ZSBjb250ZW50IGhlaWdodC4gc2Nyb2xsSGVpZ2h0IGNhbiBuZXZlciBkZWNyZWFzZSBiZWxvd1xuICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSdzIGNsaWVudEhlaWdodCwgc28gc2hyaW5rIGlzIHVuZGV0ZWN0YWJsZSB3aXRob3V0IGNvbGxhcHNpbmcuXG4gICAgICAgICAgICAvLyBXaXRoIHRyYW5zaXRpb25zIGRpc2FibGVkICsgY29udGFpbmVyIG1pbi1oZWlnaHQgaGVsZCwgdGhlIGNvbGxhcHNlXG4gICAgICAgICAgICAvLyBpcyBpbnZpc2libGUgKG5vIGxheW91dCBzaGlmdCwgbm8gYW5pbWF0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzSGVpZ2h0Q29sbGFwc2UgPSBzaG91bGRBdXRvSGVpZ2h0ICYmICFoZWlnaHRHcmV3O1xuICAgICAgICAgICAgY29uc3QgbmVlZHNXaWR0aENvbGxhcHNlID0gc2hvdWxkQXV0b1dpZHRoICYmICF3aWR0aEdyZXc7XG5cbiAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlIHx8IG5lZWRzV2lkdGhDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIC8vIEhvbGQgdGhlIGNvbnRhaW5lcidzIG1pbi1oZWlnaHQvd2lkdGggZHVyaW5nIG1lYXN1cmVtZW50IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQgc2hpZnQgKGVsZW1lbnRzIGJlbG93IHRoZSBpZnJhbWUgd29uJ3QganVtcCkuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbkhlaWdodCA9IGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbldpZHRoID0gY29udGFpbmVyLnN0eWxlLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gYCR7Y3VycmVudElmcmFtZUhlaWdodH1weGA7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gYCR7Y3VycmVudElmcmFtZVdpZHRofXB4YDtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLndpZHRoID0gJzBweCc7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpZiBjb2xsYXBzaW5nIHRvIDBweCBnYXZlIGEgbmVhci16ZXJvIG1lYXN1cmVtZW50LCB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy8gbGlrZWx5IGhhcyBgaGVpZ2h0OiAxMDAlYCBjaGFpbnMgKGh0bWwgPiBib2R5ID4gLmFwcC1jb250YWluZXIpIHRoYXQgY2FzY2FkZWRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY29sbGFwc2UgaW50byBhbGwgY2hpbGRyZW4uIFJldHJ5IHdpdGggYSBudWNsZWFyIG92ZXJyaWRlIHRoYXQgZm9yY2VzIGFsbFxuICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRvIGludHJpbnNpYyBzaXppbmcuIFRoaXMgaXMgb25seSBhIGZhbGxiYWNrIGJlY2F1c2UgdGhlIG92ZXJyaWRlXG4gICAgICAgICAgICAgICAgLy8gYnJlYWtzIGV4cGxpY2l0IHBpeGVsIGhlaWdodHMgKGUuZy4gOHB4IGluZGljYXRvciBkb3RzIFx1MjE5MiAwcHgpLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhckhlaWdodCA9IG5lZWRzSGVpZ2h0Q29sbGFwc2UgJiYgY29udGVudEhlaWdodCA8IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFyV2lkdGggPSBuZWVkc1dpZHRoQ29sbGFwc2UgJiYgY29udGVudFdpZHRoIDwgMjtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0IHx8IG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVTdHlsZSA9IGNvbnRlbnREb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLmlkID0gJ19fbXlvcF9tZWFzdXJlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ2hlaWdodDogYXV0byAhaW1wb3J0YW50JywgJ21pbi1oZWlnaHQ6IDAgIWltcG9ydGFudCcsICdtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ3dpZHRoOiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLXdpZHRoOiAwICFpbXBvcnRhbnQnLCAnbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUudGV4dENvbnRlbnQgPSBgKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7ICR7cnVsZXMuam9pbignOyAnKX07IGZsZXgtYmFzaXM6IGF1dG8gIWltcG9ydGFudDsgZmxleC1ncm93OiAwICFpbXBvcnRhbnQ7IH1gO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RG9jLmhlYWQuYXBwZW5kQ2hpbGQobWVhc3VyZVN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY29udGFpbmVyIGNvbnN0cmFpbnRzIGltbWVkaWF0ZWx5IChzYW1lIGZyYW1lLCBiZWZvcmUgcGFpbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IHByZXZNaW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gcHJldk1pbldpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNsYW1wKGNvbnRlbnRXaWR0aCwgbWluV2lkdGgsIG1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNsYW1wKGNvbnRlbnRIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gU2V0IGF1dG8tc2l6ZWQgZGltZW5zaW9ucyB0byBtZWFzdXJlZCB2YWx1ZXMsIG5vbi1hdXRvIHRvIGV4cGxpY2l0LzEwMCVcbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBmaW5hbCBkaW1lbnNpb25zIGFyZSBhcHBsaWVkIHdpdGhvdXQgdHJhbnNpdGlvbixcbiAgICAgICAgICAgIC8vIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZnJhbWUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gcHJldkNvbnRhaW5lclRyYW5zaXRpb247XG5cbiAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCBvdmVyZmxvdzogYXV0byB3aGVuIGNvbnRlbnQgZXhjZWVkcyBtYXggY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcblxuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemUgKHJ1biBzeW5jaHJvbm91c2x5LCBub3QgZGVib3VuY2VkKVxuICAgICAgICB1cGRhdGVTaXplKCk7XG5cbiAgICAgICAgLy8gU3RvcmUgdXBkYXRlU2l6ZSBmb3IgcmVlbnRyYW50IGNhbGxzXG4gICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdXBkYXRlU2l6ZTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBvYnNlcnZlciBjYWxsYmFja3MgdmlhIHJBRiBcdTIwMTQgYXQgbW9zdCBvbmUgdXBkYXRlU2l6ZSBwZXIgZnJhbWUuXG4gICAgICAgIC8vIFByZXZlbnRzIGxheW91dCB0aHJhc2hpbmcgZnJvbSBoaWdoLWZyZXF1ZW5jeSBtdXRhdGlvbnMgKGUuZy4gQ1NTIGFuaW1hdGlvbnMpLlxuICAgICAgICBsZXQgcmFmSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ic2VydmUgZm9yIGNoYW5nZXNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5kb2N1bWVudEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgY2F0Y2hlcyBET00gY29udGVudCBjaGFuZ2VzIChlLmcuIHJlbW92aW5nIGxpc3QgaXRlbXMsIHRvZ2dsaW5nIHZpZXdzKVxuICAgICAgICAvLyB0aGF0IGRvbid0IHRyaWdnZXIgUmVzaXplT2JzZXJ2ZXIgYmVjYXVzZSB0aGUgYm9keSBib3gtc2l6ZSBzdGF5cyB0aGUgc2FtZVxuICAgICAgICAvLyAoYm9keSBmaWxscyBpZnJhbWUsIGlmcmFtZSBoYXNuJ3Qgc2hydW5rIHlldCkuXG4gICAgICAgIC8vIGBhdHRyaWJ1dGVzOiB0cnVlYCBjYXRjaGVzIENTUyBjbGFzcy9zdHlsZSBjaGFuZ2VzIChlLmcuIGRpc3BsYXk6bm9uZSB0b2dnbGluZyB2aWV3cykuXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzb01zZ0hhbmRsZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5faXNvTXNnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBTZXQgYWxsIHN0eWxlcyBCRUZPUkUgYXBwZW5kaW5nIHRvIHByZXZlbnQgZmxhc2ggYXQgd3JvbmcgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZVN0eWxlcyA9IGBcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcxMDAlJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBpZnJhbWVTdHlsZXM7XG5cbiAgICAgICAgICAgIC8vIFNldCBlbGVtZW50IGF0dHJpYnV0ZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZWxlbWVudEF0dHJpYnV0ZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdXJsMmxvYWQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAnMC4zLjM4JzsiLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnMsXG4gICAgUmVuZGVyTW9kZSwgUmVuZGVyUG9saWN5XG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbmltcG9ydCB7RU1CRURERURfU0RLX0NPTlRFTlQsIEhBU19FTUJFRERFRF9TREt9IGZyb20gXCIuLi9lbWJlZGRlZFNESy50c1wiO1xuLy9pbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSBcIi4uLy4uL1NESy50c1wiO1xuXG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSID0gJzwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPic7XG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEID0gJ215b3Atd2ViLWNvbXBvbmVudCc7XG5cbi8vIFRyYWNrIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IHNjcmlwdHMgdG8gcHJldmVudCBkb3VibGUgcmVnaXN0cmF0aW9uLlxuLy8gTWFwcyBzY3JpcHRJZCAtPiB0aGUgdGFnIG5hbWUgdGhhdCBzY3JpcHQgcmVnaXN0ZXJlZC4gVGhlIHRhZyBNVVNUIGJlIHJlbWVtYmVyZWQgcGVyXG4vLyBzY3JpcHQ6IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBpcyBhIHNpbmdsZSBnbG9iYWwgc2xvdCB0aGF0IGV2ZXJ5IGV4dHJhY3RlZCBjb21wb25lbnRcbi8vIG92ZXJ3cml0ZXMsIHNvIG9uIGEgcmUtbW91bnQgKHNjcmlwdCBza2lwcGVkKSBpdCBob2xkcyB3aGljaGV2ZXIgY29tcG9uZW50IHJhbiBsYXN0LlxuY29uc3QgZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0czogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgaWYgSFRNTCBpcyBhIE15b3AgV2ViIENvbXBvbmVudCAoc3RhcnRzIHdpdGggbWFya2VyIGNvbW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudC5cbiAgICAgKiBSZXR1cm5zIHRoZSBjdXN0b20gZWxlbWVudCB0YWcgbmFtZSB0aGlzIHNjcmlwdCByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGV4ZWN1dGVkIChieSBzY3JpcHQgY29udGVudCBoYXNoKVxuICAgICAgICBjb25zdCBjYWNoZWRUYWdOYW1lID0gZXh0cmFjdGVkV2ViQ29tcG9uZW50U2NyaXB0cy5nZXQoc2NyaXB0SWQpO1xuICAgICAgICBpZiAoY2FjaGVkVGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHJldXNpbmcgPCR7Y2FjaGVkVGFnTmFtZX0+YCk7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVGFnTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHRDb250ZW50O1xuICAgICAgICBzY3JpcHQuaWQgPSBgbXlvcC1leHRyYWN0ZWQtJHtzY3JpcHRJZH1gO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZ2xvYmFsIGltbWVkaWF0ZWx5OiB0aGUgbmV4dCBleHRyYWN0ZWQgc2NyaXB0IHRvIHJ1biB3aWxsIG92ZXJ3cml0ZSBpdC5cbiAgICAgICAgY29uc3QgdGFnTmFtZSA9ICh3aW5kb3cgYXMgYW55KS5fX01ZT1BfVEFHX05BTUVfXztcbiAgICAgICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuc2V0KHNjcmlwdElkLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIEV4ZWN1dGVkIHdlYiBjb21wb25lbnQgc2NyaXB0OiAke3NjcmlwdElkfSAtPiA8JHt0YWdOYW1lfT5gKTtcbiAgICAgICAgcmV0dXJuIHRhZ05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIE15b3AgV2ViIENvbXBvbmVudCAoZXh0cmFjdGVkIGFuZCBydW4gb24gaG9zdCBkb2N1bWVudClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgaHRtbDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9uc1xuICAgICk6IFByb21pc2U8TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudD4ge1xuICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gdGhpcy5leHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWwpO1xuXG4gICAgICAgIGlmICghc2NyaXB0Q29udGVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gTm8gPHNjcmlwdCBpZD1cIm15b3Atd2ViLWNvbXBvbmVudFwiPiBmb3VuZCBpbiBIVE1MJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGRlZmluaXRpb24gaWQgYXMgc2NyaXB0IGlkZW50aWZpZXIgZm9yIGRlZHVwbGljYXRpb25cbiAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfS0ke3NraW4uaWR9YDtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG9yIHJldXNlIHRoZSB0YWcgaXQgcmVnaXN0ZXJlZCBlYXJsaWVyLlxuICAgICAgICAvLyBOZXZlciByZS1yZWFkIHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXyBoZXJlOiBvbiBhIHJlLW1vdW50IHRoZSBzY3JpcHQgaXMgc2tpcHBlZCBhbmRcbiAgICAgICAgLy8gdGhlIGdsb2JhbCBzdGlsbCBwb2ludHMgYXQgd2hpY2hldmVyIGNvbXBvbmVudCdzIHNjcmlwdCByYW4gbGFzdCwgd2hpY2ggd291bGQgYnVpbGRcbiAgICAgICAgLy8gdGhpcyBjb250YWluZXIncyBlbGVtZW50IGZyb20gYW5vdGhlciBjb21wb25lbnQncyB0YWcuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0aGlzLmV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudCwgc2NyaXB0SWQpO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gZWxlbWVudFxuICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250YWluZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCB3cmFwcGVyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbixcbiAgICAgICAgICAgIHNraW4sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggZGF0YSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW015b3BXZWJDb21wb25lbnRdIExvYWRlZCA8JHt0YWdOYW1lfT4gaW50byBjb250YWluZXJgKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgaXNXQyA9IHRoaXMuaXNNeW9wV2ViQ29tcG9uZW50KGxvYWRlckNvbmZpZy5IVE1MKTtcbiAgICAgICAgY29uc3QgeyBtb2RlLCBpc29sYXRlIH0gPSBhd2FpdCB0aGlzLnJlc29sdmVSZW5kZXJNb2RlKGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGxvYWRlckNvbmZpZywgaXNXQywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBSZW5kZXJpbmcgYmxvY2tlZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1dDKSB7XG4gICAgICAgICAgICAvLyBXZWItY29tcG9uZW50IEhUTUwgb25seSBzdXBwb3J0cyB0aGUgd2ViLWNvbXBvbmVudCBjb250cmFjdDsgYSBwb2xpY3kgdGhhdFxuICAgICAgICAgICAgLy8gZGVuaWVzIGl0IGhhcyBubyBpZnJhbWUgZmFsbGJhY2sgKHNlZSBwbGFuIFx1MDBBNzMuMykgXHUyMDE0IGJsb2NrIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBzaWxlbnRseSByZW5kZXIgYnJva2VuLiBVbnRydXN0ZWQgY29udHJpYnV0b3JzIG11c3Qgc2hpcCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgICAgICAgIGlmIChtb2RlICE9PSAnd2ViQ29tcG9uZW50Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW015b3BdIFdlYi1jb21wb25lbnQgcmVuZGVyaW5nIGRlbmllZCBieSByZW5kZXIgcG9saWN5IGZvciBjb21wb25lbnQgXCIke2NvbXBvbmVudERlZmluaXRpb24uaWR9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFeHRyYWN0ZWRXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBsb2FkZXJDb25maWcuSFRNTCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBsZXQgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgICAgICAvLyBGdWxsIGlzb2xhdGlvbjogYSBzYW5kYm94IFdJVEhPVVQgYWxsb3ctc2FtZS1vcmlnaW4gZ2l2ZXMgdGhlIGZyYW1lIGFuXG4gICAgICAgICAgICAvLyBvcGFxdWUgb3JpZ2luIFx1MjAxNCBubyBob3N0IERPTS9jb29raWVzL3BhcmVudCBhY2Nlc3MuIE11c3QgYmUgc2V0IGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIGZyYW1lIG5hdmlnYXRlcyAoaS5lLiBiZWZvcmUgc3JjZG9jIC8gYXBwZW5kKS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctc2NyaXB0cyBhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZS4gQW4gaXNvbGF0ZWQgKHNhbmRib3hlZCwgb3BhcXVlLW9yaWdpbikgZnJhbWVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGRvYy53cml0ZSgpJ24gZnJvbSB0aGUgaG9zdCwgc28gYWNjdW11bGF0ZSB0aGUgbWFya3VwIGFuZCBzZXQgaXQgdmlhXG4gICAgICAgICAgICAvLyBzcmNkb2Mgb24gY2xvc2UoKS4gTm9uLWlzb2xhdGVkIGZyYW1lcyBrZWVwIHRoZSBzYW1lLW9yaWdpbiBkb2Mud3JpdGUgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IF9fc3JjUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCBkb2M6IHsgb3BlbigpOiB2b2lkOyB3cml0ZWxuKHM6IHN0cmluZyk6IHZvaWQ7IGNsb3NlKCk6IHZvaWQgfSA9IGlzb2xhdGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgb3BlbigpIHt9LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZWxuKHM6IHN0cmluZykgeyBfX3NyY1BhcnRzLnB1c2gocyk7IH0sXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlKCkgeyBJZnJhbWVFbGVtZW50LnNyY2RvYyA9IF9fc3JjUGFydHMuam9pbignXFxuJyk7IH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGQub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9KSgpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIERPQ1RZUEU6IGRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwgcmV0dXJucyBvbmx5IDxodG1sPi4uLjwvaHRtbD5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJvcHMgdGhlIGRvY3R5cGUsIHdoaWNoIHdvdWxkIHB1dCB0aGUgaWZyYW1lIGluIHF1aXJrcyBtb2RlLlxuICAgICAgICAgICAgICAgIC8vIFF1aXJrcyBtb2RlIGJyZWFrcyBhdXRvLXNpemluZyBiZWNhdXNlIDxib2R5PiBzdHJldGNoZXMgdG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2Ygc2hyaW5raW5nIHRvIGNvbnRlbnQsIHNvIFJlc2l6ZU9ic2VydmVyIG9uIGJvZHlcbiAgICAgICAgICAgICAgICAvLyBuZXZlciBmaXJlcyB3aGVuIGNvbnRlbnQgcmVmbG93cyAoZS5nLiBhZnRlciBmb250IHN3YXApLlxuICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpbXByb3ZlIGJ5IGRvIGl0IG9uIHRoZSBzZXJ2ZSBvbmNlXG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbXlvcF9wcmV2aWV3IHNjcmlwdCB3aGVuIG5vdCBpbiBpbnNwZWN0aW9uIG1vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wX3ByZXZpZXdfc2NyaXB0ID0gX2RvYy5nZXRFbGVtZW50QnlJZCgnbXlvcF9wcmV2aWV3Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobXlvcF9wcmV2aWV3X3NjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBob3N0LXByb3ZpZGVkIENTUyBiZWZvcmUgdGhlIGlmcmFtZSBpcyB3cml0dGVuIHNvIHN0eWxlcyBhcmVcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gZmlyc3QgcGFpbnQgKG5vIEZPVUMpLiBBcHBlbmRlZCBsYXN0IGluIDxoZWFkPiBzbyBpdCB3aW5zXG4gICAgICAgICAgICAvLyBvdmVyIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBub3JtYWwgY2FzY2FkZSBvcmRlci5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5pbmplY3RDc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoSFRNTDJSZW5kZXIsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVRhZyA9IF9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbXlvcC1pbmplY3RlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgLy8gPHN0eWxlPiBpcyBhbiBIVE1MIHJhdy10ZXh0IGVsZW1lbnQ6IHRoZSBzZXJpYWxpemVyIGJlbG93IHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBMSVRFUkFMTFksIHdpdGhvdXQgZXNjYXBpbmcuIENTUyBjb250YWluaW5nIFwiPC9zdHlsZT5cIiB3b3VsZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjbG9zZSB0aGUgdGFnIGFuZCBpbmplY3QgbGl2ZSBtYXJrdXAgaW50byB0aGUgaWZyYW1lLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIHNhbWUtb3JpZ2luIHdpdGggdGhpcyBwYWdlLiBOZXV0cmFsaXplIHRoZSBzZXF1ZW5jZSBcdTIwMTQgbm8gcmVhbFxuICAgICAgICAgICAgICAgIC8vIHN0eWxlc2hlZXQgY29udGFpbnMgaXQuIChTYW1lIGNsYXNzIG9mIGJ1ZyBhcyB0aGUgPC9zY3JpcHQ+IGVzY2FwZSBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhIHBheWxvYWQgYmVsb3cuKVxuICAgICAgICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gb3B0aW9ucy5pbmplY3RDc3MucmVwbGFjZSgvPFxccypcXC9cXHMqc3R5bGUvZ2ksICc8XFxcXC9zdHlsZScpO1xuICAgICAgICAgICAgICAgIChfZG9jLmhlYWQgfHwgX2RvYy5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICAgICAgICAvLyBTZWUgbm90ZSBhYm92ZTogcHJlcGVuZCBET0NUWVBFIHRvIGtlZXAgdGhlIGlmcmFtZSBpbiBzdGFuZGFyZHMgbW9kZS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcblxuICAgICAgICAgICAgLy8gd2luZG93Ll9fZmVkZXJhdGlvbl9fID1cbiAgICAgICAgICAgIC8vICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIGluamVjdCB2YWx1ZSB0byBtb2R1bGUgYXQgYnVpbGQgdGltZVxuICAgICAgICAgICAgLy8gICAgICAgICAvLyB0b2RheSB3ZSBkb2luZyBzbyBqdXN0IGZvciB0aGUgQ0pTIHZlcnNpb25cbiAgICAgICAgICAgIC8vICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnXG4gICAgICAgICAgICAvLyAgICAgICAgICwuLi4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICB3aW5kb3cuX19mZWRlcmF0aW9uX18pXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZvciBucG0gcGFja2FnZSB1c2VycyB3aXRoIGJ1bmRsZXJzIChWaXRlL1dlYnBhY2spLCBpbmplY3QgU0RLIGlubGluZVxuICAgICAgICAgICAgLy8gRm9yIENETiB1c2VycyAoc2NyaXB0IHRhZyksIHVzZSBDRE4gVVJMXG4gICAgICAgICAgICBjb25zdCBzZGtTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD4ke0VNQkVEREVEX1NES19DT05URU5UfTwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgLy8gRGlmZmVyZW50IGluaXQgc2NyaXB0IGZvciBlbWJlZGRlZCB2cyBDRE4gU0RLXG4gICAgICAgICAgICAvLyAtIEVtYmVkZGVkIChidW5kbGVkIElJRkUpOiB1c2VzIE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggcmV0dXJucyBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIC0gQ0ROIChkeW5hbWljIGxvYWRpbmcpOiB1c2VzIHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkgd2hpY2ggd3JhcHMgd2l0aCAuZ2V0KClcbiAgICAgICAgICAgIGNvbnN0IGluaXRTY3JpcHQgPSBIQVNfRU1CRURERURfU0RLXG4gICAgICAgICAgICAgICAgPyBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICBjb25zdCBfX215b3BfaW5pdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZU1vZHVsZSA9IGF3YWl0IE15b3BTREsuZ2V0SWZyYW1lTW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZnJhbWVTREsgPSBpZnJhbWVNb2R1bGUuSWZyYW1lU0RLO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgX19teW9wX2luaXQoKS50aGVuKCk7XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICAgICAgICAgIDogYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9IHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX187XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lcyB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSBpbnN0ZWFkIG9mIHRoZSBzYW1lLW9yaWdpblxuICAgICAgICAgICAgLy8gSWZyYW1lU0RLICsgZGF0YS1pbmplY3Rpb24gc2NyaXB0cyAod2hpY2ggcmVseSBvbiBob3N0XHUyMTk0ZnJhbWUgYWNjZXNzKS5cbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGAke3Nka1NjcmlwdH0ke2luaXRTY3JpcHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBkYXRhIHNjcmlwdCBpZiBkYXRhIG9wdGlvbiBpcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFpc29sYXRlICYmIG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIENUQSBxdWV1ZSAtIGNhcHR1cmVzIGFueSBDVEFzIGVtaXR0ZWQgZHVyaW5nIGluaXQgYmVmb3JlIGhvc3QgcmVnaXN0ZXJzIGhhbmRsZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjdGFRdWV1ZVNjcmlwdCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uKGFjdGlvbiwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUucHVzaCh7YWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWR9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgLy8gRXNjYXBlIGRhdGEgZm9yIHNhZmUgZW1iZWRkaW5nIGluIHNjcmlwdCB0YWdcbiAgICAgICAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBkb2Vzbid0IGVzY2FwZSA8L3NjcmlwdD4gd2hpY2ggY291bGQgYnJlYWsgSFRNTCBwYXJzaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZERhdGEgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2VsZi1jb250YWluZWQgZGF0YSBpbmplY3Rpb24gc2NyaXB0IHRoYXQ6XG4gICAgICAgICAgICAgICAgLy8gMS4gQ2FsbHMgbXlvcF9pbml0X2ludGVyZmFjZSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgICAvLyAyLiBXYXRjaGVzIGZvciBsYXRlLWRlZmluZWQgbXlvcF9pbml0X2ludGVyZmFjZSB2aWEgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyAzLiBDbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIChyZW1vdmVzIHNjcmlwdCB0YWcgYW5kIHdpbmRvdyBkYXRhKVxuICAgICAgICAgICAgICAgIC8vIDQuIFBvc3RzIG1lc3NhZ2UgdG8gcGFyZW50IGZvciBleHRlbnNpb24gdHJhY2tpbmcgKHByZS1pbmplY3RlZCBpbml0KilcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2NyaXB0ID0gYDxzY3JpcHQgaWQ9XCJfX215b3BfaW5pdF9kYXRhX3NjcmlwdFwiPlxuICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICR7ZXNjYXBlZERhdGF9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbXlvcF9pbml0X2RhdGFfc2NyaXB0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsSW5pdEludGVyZmFjZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJlLWluamVjdGVkIGRhdGEgY2FsbCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19teW9wX2luaXRfcHJlaW5qZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgZXh0ZW5zaW9uIHZpYSBwb3N0TWVzc2FnZSAoaW5pdCogPSBwcmUtaW5qZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTVlPUF9QUkVJTkpFQ1RFRF9JTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHNjcmlwdCB0YWcgYW5kIHN0b3JlZCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdEVsICYmIHNjcmlwdEVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyAtIGNhbGwgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSW5pdEludGVyZmFjZSh3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIG5vdCB5ZXQgZGVmaW5lZCAtIHN0b3JlIGRhdGEgYW5kIHdhdGNoIGZvciBkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X2RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbXlvcF9pbml0X2ludGVyZmFjZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3JpZ2luYWwgPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuX19teW9wX2luaXRfZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSB3aW5kb3cuX19teW9wX2luaXRfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2UoZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vcmlnaW5hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4oY3RhUXVldWVTY3JpcHQgKyBkYXRhU2NyaXB0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzOiBpbmplY3QgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZSAoaW5pdCBpbiAvIGN0YSBvdXQgLyBzaXplIG91dCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gb3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKS5yZXBsYWNlKC88XFwvc2NyaXB0L2dpLCAnXFxcXHUwMDNjL3NjcmlwdCcpXG4gICAgICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICAgICAgZG9jLndyaXRlbG4odGhpcy5idWlsZElzb2xhdGlvbkJyaWRnZShlc2NhcGVkRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZDogd2lyZSB0aGUgaG9zdCBzaWRlIG9mIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGN0YSBpbiwgc2l6ZSBpbiwgaW5pdCBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIGNvbXAuZW5hYmxlSXNvbGF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcgPSAoY29uZmlnOiB2Ml9JVmFyaWFudENvbmZpZyk6IElDb21wb25lbnRDb25maWcgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlOiB7XG4gICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbmZpZy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5uYW1lLFxuXG4gICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2luaXRfaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnLFxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2N0YV9oYW5kbGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZW1wdHkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlcjogY29uZmlnLmNvbnN1bWVfdmFyaWFudFswXS5sb2FkZXJcbiAgICAgICAgICAgICAgICB9IGFzIElTa2luQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGVmYXVsdFNraW46IDAsXG4gICAgICAgICAgICAvLyBPbmx5IGB1aTpgIHRhZ3MgZXZlciByZWFjaCB0aGUgY2xpZW50OyB0aGUgc2VydmVyIGZpbHRlcnMsIGFic2VudCA9IG5vbmUuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB1aVRhZ3M6IEFycmF5LmlzQXJyYXkoY29uZmlnLnVpVGFncykgPyBjb25maWcudWlUYWdzIDogW11cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICB9IGFzIElDb21wb25lbnRDb25maWc7XG59O1xuXG4vKipcbiAqIENsb3VkUmVwb3NpdG9yeSAtIFVuaWZpZWQgY2xvdWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIE15b3AgY29tcG9uZW50c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggdjIgKGRlZmF1bHQpIGFuZCB2MSBtb2RlczpcbiAqIC0gdjI6IFVzZXMgL2NvbnN1bWUgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHZhcmlhbnRzXG4gKiAtIHYxOiBVc2VzIC9mbG93IGVuZHBvaW50IGZvciBmZXRjaGluZyB1c2VyIGZsb3dzXG4gKi9cbi8vIFVzZSBhIGdsb2JhbCBzaW5nbGV0b24gdG8gZW5zdXJlIG9ubHkgb25lIENsb3VkUmVwb3NpdG9yeS5NYWluIGV4aXN0c1xuLy8gZXZlbiB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5IGRpZmZlcmVudCBidW5kbGVyc1xuY29uc3QgR0xPQkFMX0tFWSA9ICdfX01ZT1BfQ0xPVURfUkVQT1NJVE9SWV9NQUlOX18nO1xuXG5jb25zdCBnZXRHbG9iYWxNYWluID0gKCk6IENsb3VkUmVwb3NpdG9yeSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBzZXRHbG9iYWxNYWluID0gKGluc3RhbmNlOiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgc3RhdGljIF9tYWluOiBDbG91ZFJlcG9zaXRvcnkgfCBudWxsID0gbnVsbDtcblxuICAgIHN0YXRpYyBnZXQgTWFpbigpOiBDbG91ZFJlcG9zaXRvcnkge1xuICAgICAgICAvLyBDaGVjayBpZiBhIGdsb2JhbCBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhbm90aGVyIGJ1bmRsZSlcbiAgICAgICAgY29uc3QgZ2xvYmFsTWFpbiA9IGdldEdsb2JhbE1haW4oKTtcbiAgICAgICAgaWYgKGdsb2JhbE1haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxNYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFDbG91ZFJlcG9zaXRvcnkuX21haW4pIHtcbiAgICAgICAgICAgIENsb3VkUmVwb3NpdG9yeS5fbWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIHNldEdsb2JhbE1haW4oQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2xvdWRSZXBvc2l0b3J5Ll9tYWluO1xuICAgIH1cblxuICAgIC8vIHYyIGNhY2hlIC0ga2V5ZWQgYnkgY29tcG9uZW50SWQ6ZW52OnByZXZpZXd8bGl2ZVxuICAgIC8vIEVhY2ggUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGByZXNvbHZlZGAgcHJvcGVydHkgYWZ0ZXIgc2V0dGxpbmcgKHNlZSBmZXRjaENvbXBvbmVudFYyKS5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfT4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RhdGljTW9kZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIHN0YXRpYyBtb2RlIGZvciBzZWxmLWhvc3RlZCBjb21wb25lbnQgcmVnaXN0cmllcy5cbiAgICAgKiBJbiBzdGF0aWMgbW9kZSwgVVJMcyBhcmUgY29uc3RydWN0ZWQgYXMgZmlsZSBwYXRocyBpbnN0ZWFkIG9mIHF1ZXJ5IHBhcmFtczpcbiAgICAgKiAgICR7YmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudn0uanNvblxuICAgICAqL1xuICAgIGVuYWJsZVN0YXRpY01vZGUoKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpY01vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byBhbGwgZmV0Y2ggVVJMcyAoZS5nLiBmb3IgQ0ROIGNhY2hlIGJ1c3RpbmcpLlxuICAgICAqIEV4YW1wbGU6IGBzZXRRdWVyeVBhcmFtcyh7IGxhc3R1cGRhdGU6ICcxMTExMjAyNicgfSlgXG4gICAgICovXG4gICAgc2V0UXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zID0gcGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgdGhpcyBDbG91ZFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudChlbnY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RW52ID0gZW52O1xuICAgICAgICB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGdldERlZmF1bHRFbnZpcm9ubWVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEVudjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjIgTWV0aG9kcyAoRGVmYXVsdCkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGNhY2hlZC9wcmVsb2FkZWQgKHYyKVxuICAgICAqIElmIGVudiBhbmQgcHJldmlldyBhcmUgbm90IHByb3ZpZGVkLCBjaGVja3MgaWYgQU5ZIHZlcnNpb24gaXMgcHJlbG9hZGVkXG4gICAgICovXG4gICAgaXNQcmVsb2FkZWQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBzcGVjaWZpYyBlbnYvcHJldmlldyByZXF1ZXN0ZWQsIGNoZWNrIGV4YWN0IG1hdGNoXG4gICAgICAgIGlmIChlbnYgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52IHx8IHRoaXMuX2RlZmF1bHRFbnZ9OiR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGlmIGFueSB2ZXJzaW9uIHdhcyBwcmVsb2FkZWRcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkIGluIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByZWxvYWRlZCBwYXJhbXMgZm9yIGEgY29tcG9uZW50IChpZiBwcmVsb2FkZWQpXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHByZWxvYWRlZFxuICAgICAqL1xuICAgIGdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nKTogeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBhIGNvbXBvbmVudCBjb25maWc6IGZldGNoIGl0IG9uY2UsIHRoZW4gc2VydmUgaXQgZnJvbSB0aGlzXG4gICAgICogcmVwb3NpdG9yeSdzIGNhY2hlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgbmFtZSB0byB1c2UuIGBmZXRjaENvbXBvbmVudFYyYCBpcyB0aGUgc2FtZSBtZXRob2QgdW5kZXIgaXRzXG4gICAgICogdmVyc2lvbmVkIG5hbWUgYW5kIHN0YXlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IFx1MjAxNCBub3RlIHRoYXQgdGhlXG4gICAgICogdW52ZXJzaW9uZWQgYGZldGNoQ29tcG9uZW50YCBpcyBhICpkZXByZWNhdGVkIHYxKiBBUEkgYW5kIGlzIE5PVCB0aGlzLlxuICAgICAqXG4gICAgICogQ29tcGxldGVzIHRoZSB0cmlvIHdpdGgge0BsaW5rIGdldFJlc29sdmVkQ29uZmlnfSAoc3luY2hyb25vdXMgcmVhZCBvZiBhblxuICAgICAqIGFscmVhZHktcmVzb2x2ZWQgY29uZmlnKSBhbmQge0BsaW5rIGh5ZHJhdGVDb21wb25lbnR9IChzZWVkIG9uZSB5b3VcbiAgICAgKiBhbHJlYWR5IGhvbGQpLlxuICAgICAqXG4gICAgICogUHJlZmVyIHRoZSBtb2R1bGUtbGV2ZWwgYHByZWxvYWRDb21wb25lbnRzKFtpZF0pYCBpbiBhcHAgY29kZTsgcmVhY2ggZm9yXG4gICAgICogdGhpcyB3aGVuIHlvdSBuZWVkIGFuIGlzb2xhdGVkIHJlcG9zaXRvcnkgaW5zdGFuY2Ugd2hvc2UgY2FjaGUgbGlmZXRpbWVcbiAgICAgKiB5b3UgY29udHJvbCBcdTIwMTQgYSBzZXJ2ZXIgd2l0aCBpdHMgb3duIFRUTCwgZm9yIGV4YW1wbGUuXG4gICAgICovXG4gICAgYXN5bmMgcmVzb2x2ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgY29uZmlnXG4gICAgICogSWYgZW52L3ByZXZpZXcgbm90IHNwZWNpZmllZCBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZXMgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAqXG4gICAgICogQHNlZSByZXNvbHZlQ29tcG9uZW50IFx1MjAxNCB0aGUgdW52ZXJzaW9uZWQgbmFtZSBmb3IgdGhpcyBtZXRob2RcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgY29uc3QgeyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudmlyb25tZW50SWRlbnRpZmllciwgcHJldmlldyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ1tDbG91ZFJlcG9zaXRvcnldIGZldGNoQ29tcG9uZW50VjInLCB7XG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29tcG9uZW50SWQuc2xpY2UoMCwgOCkgKyAnLi4uJyxcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgIHVzZVByZXZpZXcsXG4gICAgICAgICAgICBjYWNoZUtleSxcbiAgICAgICAgICAgIGNhY2hlZDogY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50c1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY2FjaGVLZXldKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGlzIGFzIHByZWxvYWRlZCAoZmlyc3QgZmV0Y2ggY291bnRzIGFzIHByZWxvYWQpXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnYsIHByZXZpZXc6IHVzZVByZXZpZXcgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRpY01vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdXNlUHJldmlldyA/ICdwcmV2aWV3JyA6IGVudjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZmlsZX0uanNvbmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuX3F1ZXJ5UGFyYW1zKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxcykgdXJsICs9IGA/JHtxc31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWcgdGhlIFByb21pc2Ugc28gZ2V0UmVzb2x2ZWRDb25maWcgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBjb21wb25lbnRDb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjYWNoZWQgcmVqZWN0ZWQgcHJvbWlzZSBzbyB0aGUgbmV4dCBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyBhIGZyZXNoIHJlcXVlc3QgKGUuZy4gYWZ0ZXIgbmV0d29yayByZWNvdmVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMgdmVyc2lvbiBvZiBmZXRjaENvbXBvbmVudFYyIFx1MjAxNCByZXR1cm5zIHRoZSBjb25maWcgb25seSBpZlxuICAgICAqIHRoZSBmZXRjaCBhbHJlYWR5IGNvbXBsZXRlZCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBVc2VzIHRoZSBzYW1lIGB0aGlzLnZhcmlhbnRzYCBjYWNoZSB0aGF0IGZldGNoQ29tcG9uZW50VjIvcHJlbG9hZENvbXBvbmVudHNcbiAgICAgKiBwb3B1bGF0ZS4gRWFjaCBjYWNoZWQgUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGAucmVzb2x2ZWRgIHByb3BlcnR5IHdoZW5cbiAgICAgKiBpdCBzZXR0bGVzIFx1MjAxNCB0aGlzIG1ldGhvZCBqdXN0IHJlYWRzIHRoYXQgcHJvcGVydHkuIE5vIHNlcGFyYXRlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2h5IHRoaXMgZXhpc3RzOiBSZWFjdCBOYXRpdmUgbmVlZHMgdGhlIGNvbmZpZyBhdCByZW5kZXIgdGltZSB0byBlbWJlZCBpdFxuICAgICAqIGluIHRoZSBXZWJWaWV3IEhUTUwgKGNhbid0IGF3YWl0IGluIHVzZVN0YXRlKS4gSWYgcHJlbG9hZENvbXBvbmVudHMgcmFuXG4gICAgICogZWFybGllciBhbmQgdGhlIGZldGNoIGNvbXBsZXRlZCwgdGhpcyByZXR1cm5zIHRoZSByZXN1bHQgc3luY2hyb25vdXNseSxcbiAgICAgKiBza2lwcGluZyB0aGUgV0VCVklFV19SRUFEWSBcdTIxOTIgZmV0Y2ggXHUyMTkyIGluamVjdCByb3VuZCB0cmlwIGVudGlyZWx5LlxuICAgICAqL1xuICAgIGdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBJQ29tcG9uZW50Q29uZmlnIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHsgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFyaWFudHNbY2FjaGVLZXldPy5yZXNvbHZlZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgdWk6YCB0YWdzIG9mIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IChgW11gIGlmIGl0IGhhcyBub25lIG9yIGlzIG5vdFxuICAgICAqIHJlc29sdmVkIHlldCkuIFN5bmNocm9ub3VzLCBubyByZXF1ZXN0OiB0YWdzIGFycml2ZSB3aXRoIHRoZSBjb21wb25lbnQgaXRzZWxmLlxuICAgICAqL1xuICAgIGdldENvbXBvbmVudFRhZ3MoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk/LnR5cGU/LnVpVGFncyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHdoaWNoIChlbnYsIHByZXZpZXcpIHBhaXIgXHUyMDE0IGFuZCB0aGVyZWZvcmUgd2hpY2ggY2FjaGUga2V5IFx1MjAxNCBhIGNhbGxcbiAgICAgKiBmb3IgYGNvbXBvbmVudElkYCByZWZlcnMgdG8uXG4gICAgICpcbiAgICAgKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBmZXRjaENvbXBvbmVudFYyLCBnZXRSZXNvbHZlZENvbmZpZyBhbmRcbiAgICAgKiBoeWRyYXRlQ29tcG9uZW50LCBzbyBhIGh5ZHJhdGVkIGNvbmZpZyBhbHdheXMgbGFuZHMgb24gdGhlIGtleSBhIGxhdGVyXG4gICAgICogZmV0Y2ggd2lsbCBsb29rIHVuZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSB7XG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGVudi9wcmV2aWV3IGFuZCBjb21wb25lbnQgd2FzIHByZWxvYWRlZCwgdXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXTtcbiAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQYXJhbXMgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgLy8gVXNlIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgICAgICAgIGVudiA9IHByZWxvYWRlZC5lbnY7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJlbG9hZGVkLnByZXZpZXc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgcGFyYW1zIG9yIGRlZmF1bHRzXG4gICAgICAgICAgICBlbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSB0cnVlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgZmFsc2UgXHUyMTkyIGZhbHNlXG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IHVuZGVmaW5lZDogZW52IHdhcyBzcGVjaWZpZWQgKHZpYSBwYXJhbSBvciBzZXRFbnZpcm9ubWVudCkgXHUyMTkyIGZhbHNlLCBvdGhlcndpc2UgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVudiwgdXNlUHJldmlldywgY2FjaGVLZXk6IGAke2NvbXBvbmVudElkfToke2Vudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIGFuIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZyBpbnRvIHRoZSBjYWNoZSwgd2l0aG91dCBhbnlcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIGZldGNoQ29tcG9uZW50VjJ9OiB1c2UgaXQgd2hlbiB0aGUgY29uZmlnIHdhc1xuICAgICAqIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCBtb3N0IG9mdGVuIG9uIGEgc2VydmVyLCB0aGVuIGVtYmVkZGVkIGluIHRoZVxuICAgICAqIHBhZ2UgXHUyMDE0IHNvIHRoZSBicm93c2VyIGNhbiByZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIG5vIHJvdW5kIHRyaXAuXG4gICAgICpcbiAgICAgKiBBZnRlciBoeWRyYXRpbmcsIGBmZXRjaENvbXBvbmVudFYyYCwgYGdldFJlc29sdmVkQ29uZmlnYCBhbmQgYGlzUHJlbG9hZGVkYFxuICAgICAqIGFsbCBhbnN3ZXIgZm9yIHRoaXMgY29tcG9uZW50IGZyb20gbWVtb3J5LlxuICAgICAqXG4gICAgICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlnIHdhcyByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAgICAgKiBtYXRjaCB3aGF0IGEgcGxhaW4gYGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQpYCB3b3VsZCBoYXZlIHVzZWQuXG4gICAgICovXG4gICAgaHlkcmF0ZUNvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBjb25maWc6IElDb21wb25lbnRDb25maWcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnY6IHJlc29sdmVkRW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKSBhcyBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfTtcbiAgICAgICAgLy8gVGFnIGl0IHRoZSBzYW1lIHdheSBmZXRjaENvbXBvbmVudFYyIGRvZXMsIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhblxuICAgICAgICAvLyByZWFkIGl0IHN5bmNocm9ub3VzbHkuXG4gICAgICAgIHByb21pc2UucmVzb2x2ZWQgPSBjb25maWc7XG5cbiAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBwcm9taXNlO1xuICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnY6IHJlc29sdmVkRW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IElDb21wb25lbnRDb25maWcgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmxldCBfY2xvdWRSZXBvc2l0b3J5ID0gQ2xvdWRSZXBvc2l0b3J5Lk1haW47XG5cbmV4cG9ydCBjb25zdCBnZXRDbG91ZFJlcG9zaXRvcnkgPSAoKSA9PiBfY2xvdWRSZXBvc2l0b3J5O1xuXG5leHBvcnQgY29uc3QgaXNQcmVsb2FkZWQgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmlzUHJlbG9hZGVkKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByZWxvYWRlZFBhcmFtcyA9IChjb21wb25lbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UHJlbG9hZGVkUGFyYW1zKGNvbXBvbmVudElkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmFibGVMb2NhbERldiA9ICgpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShcImh0dHA6Ly9sb2NhbGhvc3Q6OTI5MlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnlVcmwgPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeSh1cmwpO1xufTtcblxuLyoqXG4gKiBDb25maWd1cmUgdGhlIFNESyB0byBmZXRjaCBjb21wb25lbnRzIGZyb20gYSBzZWxmLWhvc3RlZCBzdGF0aWMgcmVnaXN0cnkgKFMzLCBDRE4sIGV0Yy4pXG4gKiBpbnN0ZWFkIG9mIHRoZSBNeW9wIGNsb3VkLiBDb21wb25lbnRzIGFyZSBzZXJ2ZWQgYXMgc3RhdGljIEpTT04gZmlsZXM6XG4gKiAgIGAke2NkblVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudmlyb25tZW50fS5qc29uYFxuICovXG5leHBvcnQgY29uc3QgZW5hYmxlU2VsZkhvc3RlZCA9IChjZG5Vcmw6IHN0cmluZywgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoY2RuVXJsKTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LmVuYWJsZVN0YXRpY01vZGUoKTtcbiAgICBpZiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeSA9IChyZXBvc2l0b3J5OiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRFbnZpcm9ubWVudCA9IChlbnY6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0RW52aXJvbm1lbnQoZW52KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZENvbmZpZyA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0UmVzb2x2ZWRDb25maWcoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG4vKipcbiAqIFRoZSBydW50aW1lIHRhZ3Mgb2YgYSBsb2FkZWQvcHJlbG9hZGVkIGNvbXBvbmVudDogb25seSB0YWdzIG5hbWVkIGB1aTouLi5gIChlLmcuXG4gKiBgdWk6YmV0YWApLiBSZXR1cm5zIGBbXWAgd2hlbiBpdCBoYXMgbm9uZSBvciBoYXMgbm90IGJlZW4gZmV0Y2hlZCB5ZXQuXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHByZWxvYWRDb21wb25lbnRzKFtpZF0pO1xuICogZ2V0Q29tcG9uZW50VGFncyhpZCk7IC8vIFsndWk6YmV0YSddXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbXBvbmVudFRhZ3MgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRDb21wb25lbnRUYWdzKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcblxuLyoqXG4gKiBTZWVkIGFscmVhZHktcmVzb2x2ZWQgY29tcG9uZW50IGNvbmZpZ3MgaW50byB0aGUgU0RLIGNhY2hlLCB3aXRoIG5vIG5ldHdvcmtcbiAqIHJlcXVlc3QuIFRoZSBjb3VudGVycGFydCB0byB7QGxpbmsgcHJlbG9hZENvbXBvbmVudHN9LlxuICpcbiAqIFVzZSBpdCB3aGVuIHRoZSBjb25maWdzIHdlcmUgcmVzb2x2ZWQgc29tZXdoZXJlIGVsc2UgXHUyMDE0IHR5cGljYWxseSBvbiBhIHNlcnZlclxuICogYW5kIGVtYmVkZGVkIGluIHRoZSBwYWdlIFx1MjAxNCBzbyB0aGUgY29tcG9uZW50IHJlbmRlcnMgd2l0aCB6ZXJvIHJvdW5kIHRyaXBzOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBzZXJ2ZXI6IGNvbnN0IGNvbmZpZ3MgPSB7IFtpZF06IGF3YWl0IG5ldyBDbG91ZFJlcG9zaXRvcnkoKS5mZXRjaENvbXBvbmVudFYyKGlkKSB9XG4gKiAvLyBjbGllbnQ6XG4gKiBoeWRyYXRlQ29tcG9uZW50cyhjb25maWdzKTtcbiAqIC8vIDxNeW9wQ29tcG9uZW50IGNvbXBvbmVudElkPXtpZH0gLz4gbm93IHJlbmRlcnMgd2l0aG91dCBmZXRjaGluZ1xuICogYGBgXG4gKlxuICogUGFzcyB0aGUgc2FtZSBgZW52YCAvIGBwcmV2aWV3YCB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHdpdGg7IHRoZSBkZWZhdWx0c1xuICogbWF0Y2ggd2hhdCBhIHBsYWluIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgd291bGQgaGF2ZSB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgaHlkcmF0ZUNvbXBvbmVudHMgPSAoXG4gICAgY29uZmlnczogUmVjb3JkPHN0cmluZywgSUNvbXBvbmVudENvbmZpZz4sXG4gICAgZW52Pzogc3RyaW5nLFxuICAgIHByZXZpZXc/OiBib29sZWFuLFxuKSA9PiB7XG4gICAgZm9yIChjb25zdCBbaWQsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlncykpIHtcbiAgICAgICAgX2Nsb3VkUmVwb3NpdG9yeS5oeWRyYXRlQ29tcG9uZW50KGlkLCBjb25maWcsIGVudiwgcHJldmlldyk7XG4gICAgfVxufTtcbiIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7UmVuZGVyUG9saWN5fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIC8vIEdsb2JhbCByZW5kZXIgcG9saWN5IChhbGxvdy9kZW55L21vZGUgZ2F0ZSkuIEEgcGVyLWNhbGwgb3B0aW9ucy5yZW5kZXJQb2xpY3lcbiAgICAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBcdTIwMTQgc2VlIEhUTUxDb21wb25lbnRMb2FkZXIucmVzb2x2ZVJlbmRlck1vZGUuXG4gICAgcHJpdmF0ZSBfcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5O1xuICAgIHB1YmxpYyBzZXRSZW5kZXJQb2xpY3kgPSAocG9saWN5PzogUmVuZGVyUG9saWN5KSA9PiB7IHRoaXMuX3JlbmRlclBvbGljeSA9IHBvbGljeTsgfTtcbiAgICBwdWJsaWMgZ2V0UmVuZGVyUG9saWN5ID0gKCk6IFJlbmRlclBvbGljeSB8IHVuZGVmaW5lZCA9PiB0aGlzLl9yZW5kZXJQb2xpY3k7XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdpbmNvbWluZ01lc3NhZ2VIYW5kbGVyIEdPVCAnLCBldmVudClcbiAgICAgICAgLy9UT0RPIDogIGlmIChldmVudC5vcmlnaW4gIT09IFwiaHR0cDovL2V4YW1wbGUub3JnOjgwODBcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0kgS25vdyB0aGF0ICEhIScpO1xuICAgICAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RTREsgYWxyZWFkeSBpbml0aWF0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljTG9hZGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBNeW9wSWZyYW1lTG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgV2ViY29tcG9uZW50TG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgSFRNTENvbXBvbmVudExvYWRlcigpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IFtcbiAgICAgICAgICAgIC4uLmJhc2ljTG9hZGVyc1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycykge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzLmZvckVhY2goY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSA9IGxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhblxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyXG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWdcbiAgICBob29rcz86IGxvYWRlckhvb2tzXG4gICAgZWxlbWVudEF0dHJpYnV0ZXM/OiBFbGVtZW50QXR0cmlidXRlc1xuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG4gICAgZGF0YT86IGFueVxuICAgIC8qKlxuICAgICAqIFJhdyBDU1MgaW5qZWN0ZWQgaW50byB0aGUgY29tcG9uZW50J3MgaWZyYW1lIDxoZWFkPiBiZWZvcmUgZmlyc3QgcGFpbnQuXG4gICAgICogQXBwZW5kZWQgbGFzdCBzbyBpdCBvdmVycmlkZXMgdGhlIGNvbXBvbmVudCdzIG93biBzdHlsZXMgdmlhIGNhc2NhZGUgb3JkZXIuXG4gICAgICogVXNlZnVsIGZvciB0aGVtaW5nIHYyIChIVE1MKSBjb21wb25lbnRzIFx1MjAxNCBjb2xvcnMsIGZvbnRzLCBzcGFjaW5nLCBldGMuXG4gICAgICovXG4gICAgaW5qZWN0Q3NzPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udHJvbCBpZnJhbWUgYXV0by1zaXppbmcgYmVoYXZpb3IuXG4gICAgICogLSB0cnVlIChkZWZhdWx0KTogaWZyYW1lIGF1dG8tc2l6ZXMgdG8gY29udGVudCBoZWlnaHQsIHdpZHRoIGZpbGxzIHBhcmVudC5cbiAgICAgKiAtIGZhbHNlOiBubyBzaXppbmcgbG9naWMgcnVucy4gTm8gb2JzZXJ2ZXJzLCBubyBtZWFzdXJlbWVudHMsIG5vIHN0eWxlIGNoYW5nZXMuXG4gICAgICogICBUaGUgaWZyYW1lIHN0YXlzIGF0IHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgdGhlIGNvbnRhaW5lci5cbiAgICAgKiAgIFRoZSBob3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucy5cbiAgICAgKi9cbiAgICBhdXRvU2l6ZT86IGJvb2xlYW5cblxuICAgIC8qKlxuICAgICAqIFBlci1jYWxsIHJlbmRlciBwb2xpY3kuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgbGV0cyBhblxuICAgICAqIGFwcCByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgKG9yIGZ1cnRoZXIgcmVzdHJpY3QpIHNwZWNpZmljIGxvYWRDb21wb25lbnQgY2FsbHMuXG4gICAgICovXG4gICAgcmVuZGVyUG9saWN5PzogUmVuZGVyUG9saWN5XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBmdWxsIGlzb2xhdGlvbiBmb3IgYW4gaW5saW5lLUhUTUwgKGxvY2FsRnJhbWUpIGNvbXBvbmVudDogc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBubyBob3N0LWRvY3VtZW50IGFjY2Vzcy4gQSByZW5kZXIgcG9saWN5IHJldHVybmluZ1xuICAgICAqICdpc29sYXRlZElmcmFtZScgaGFzIHRoZSBzYW1lIGVmZmVjdC5cbiAgICAgKi9cbiAgICBpc29sYXRpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgc2hhZG93Um9vdFJlZik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzLnRzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoZ2V0SW5wdXRWYWx1ZShpdGVtKSksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSAnQG15b3Avc2RrL3dlYmNvbXBvbmVudCc7XG4gKiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiAqIFRoZSBXZWJjb21wb25lbnQgU0RLIGlzIHRhaWxvcmVkIGZvciB1c2luZyBNeW9wIGNvbXBvbmVudHMgcGFja2FnZWQgYXMgc2VwYXJhdGUgYnVuZGxlcyBhbmQgZXhwb3NlZCBhcyB3ZWIgY29tcG9uZW50cy48YnIvPlxuICogRGV2ZWxvcGVycyBpbXBvcnRpbmcgdGhpcyBTREsgY2FuIGxldmVyYWdlIEFQSXMgYW5kIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgY3JhZnRlZCB0byBzdXBwb3J0IHRoZSBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyByZXF1aXJlZCBmb3Igd2ViIGNvbXBvbmVudHMgd2l0aGluIHRoZSBNeW9wIGFyY2hpdGVjdHVyZS48YnIvPlxuICogVGhpcyBTREsgcHJvbW90ZXMgcmV1c2FiaWxpdHkgYW5kIGVuY2Fwc3VsYXRpb24sIGVuYWJsaW5nIGRldmVsb3BlcnMgdG8gYnVpbGQgbW9kdWxhciwgc2VsZi1jb250YWluZWQgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbidzIERPTSBzdHJ1Y3R1cmUuXG4gKlxuICpcbiAqIE9uY2UgbG9hZGVkIHRoZSBgUm9vdCBTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJDb21wb25lbnRTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBhbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0ID0gdHJ1ZTtcblxuICAgIC8vd2hlbiBuZXcgd2ViIGNvbXBvbmVudCBjcmVhdGVkLlxuICAgIGNvbm5lY3RlZENhbGxiYWNrID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNoYWRvdzogU2hhZG93Um9vdCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGUuZGF0YSA/IGUuZGF0YSA6IGUuZGV0YWlsO1xuICAgICAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWN2aWVkIHdlYmNvbXBvbmVudF9tZXNzYWdlIHdpdGggd3JvbmcgdHlwZScpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogc2VuZCBjb250YWluZXIgLyBjb21wb2VubnQgaWRlbnRpZmllciBmb3IgbXVsdGlsIGNvbXBvbmVudHMgc3VwcG9ydFxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMoZSlcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdLmNvbnRleHQgPSBuZXcgU2hhZG93Um9vdFJlZihjb250YWluZXIsIHNoYWRvdylcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN1cHBvcnRlZEhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyLmNvbnRleHQgPSB0aGlzLnNoYWRvd1Jvb3RzO1xuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjay4gcmFjZSBjb25kaXRpb24gd2l0aCBob3N0LmxvYWQgd2hlbiBtb2R1bGUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgICAgICB9LCAxKVxuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcbiAgICAgICAgLy9tZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICB3aW5kb3cubXlvcC5ob3N0U0RLLnNlbmQobWVzc2FnZSlcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIC8vXG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cylcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIC8vdGhpcy5teUNvbXBvbmVudElkXG4gICAgICAgIC8vdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlc1xuICAgIH1cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnV2ViQ29tcG9uZW50U0RLJywgV2ViQ29tcG9uZW50U0RLKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQk8sSUFBTSxpQkFBTixNQUE0QztBQUFBLEVBQy9DLFlBQW1CLFFBQ0EsYUFDQSxjQUNBLFdBQ0EsWUFBcUI7QUFKckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUluQix3QkFBZ0IsUUFBZTtBQUFBLEVBRi9CO0FBR0o7OztBQ3pCTyxJQUFNLHFCQUFxQixDQUFPLFNBQWtDO0FBQ3ZFLE1BQUksT0FBTyxTQUFTLFlBQVk7QUFFNUIsU0FBSztBQUFBLEVBQ1QsV0FBVyxnQkFBZ0IsU0FBUztBQUVoQyxVQUFNLFNBQVMsTUFBTTtBQUVyQixRQUFJLE9BQU8sV0FBVyxZQUFZO0FBRTlCLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUVKO0FBWU8sSUFBZSxxQkFBZixNQUFpRztBQUFBO0FBQUEsRUFJcEcsWUFBbUIsZUFBcUY7QUFBckY7QUFBQSxFQUVuQjtBQUlKO0FBRU8sSUFBZSw0QkFBZixjQUEy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S0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQ3BFLElBQUksb0JBQW9CLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUMzRCxJQUFJLHdCQUF3QixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDL0QsSUFBSSxxQkFBcUIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQzVELElBQUksdUJBQXVCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQTtBQUFBLE1BRTlELElBQUksaUNBQWlDLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxJQUM1RTtBQUVBLHdCQUFPLFFBQU8sTUFBTTtBQUFBLElBR3BCO0FBQUE7QUFDSjtBQUVBLG9CQUFvQixtQkFBbUIsZUFBZTsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgInNlZW4iLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiaGVpZ2h0IiwgIndpZHRoIiwgInNlZW4iLCAic2RrIiwgImRvbUlkIiwgInNkayIsICJzZWVuIiwgInNraW4iLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiaG9zdFNESyIsICJlbGVtZW50Il0KfQo=
|