@myop/sdk 0.3.34 → 0.3.37

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.
Files changed (47) hide show
  1. package/dist/bundled-declarations.d.ts +25 -1
  2. package/dist/cjs/{_IframeSDK.c7926c56.js → _IframeSDK.119b841c.js} +31 -15
  3. package/dist/cjs/_IframeSDK.119b841c.js.map +7 -0
  4. package/dist/cjs/_IframeSDK.4c1677d2.min.js +1 -0
  5. package/dist/cjs/{_MyopHelpers.08d1cf5d.js → _MyopHelpers.cc216538.js} +17 -1
  6. package/dist/cjs/_MyopHelpers.cc216538.js.map +7 -0
  7. package/dist/cjs/_MyopHelpers.eff18534.min.js +1 -0
  8. package/dist/cjs/{_WebComponentSDK.501a71f9.js → _WebComponentSDK.68c26204.js} +31 -15
  9. package/dist/cjs/_WebComponentSDK.68c26204.js.map +7 -0
  10. package/dist/cjs/_WebComponentSDK.78fd3813.min.js +1 -0
  11. package/dist/cjs/_hostSDK.a52dd73c.min.js +1 -0
  12. package/dist/cjs/{_hostSDK.cdbc1f60.js → _hostSDK.cb624992.js} +31 -15
  13. package/dist/cjs/_hostSDK.cb624992.js.map +7 -0
  14. package/dist/cjs/myop_sdk.js +14 -14
  15. package/dist/cjs/myop_sdk.js.map +1 -1
  16. package/dist/cjs/myop_sdk.min.js +1 -1
  17. package/dist/cjs-bundled/myop_sdk.bundled.js +38 -17
  18. package/dist/cjs-bundled/myop_sdk.bundled.js.map +3 -3
  19. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  20. package/dist/module/Iframe/index.js +32 -16
  21. package/dist/module/Iframe/index.js.map +2 -2
  22. package/dist/module/SDK.js +38 -17
  23. package/dist/module/SDK.js.map +3 -3
  24. package/dist/module/common/index.d.ts +5 -0
  25. package/dist/module/common/index.js +1 -1
  26. package/dist/module/common/index.js.map +2 -2
  27. package/dist/module/embeddedSDK.js +1 -1
  28. package/dist/module/helpers/CloudRepository.d.ts +5 -0
  29. package/dist/module/helpers/cloudRepositoryHelpers.d.ts +10 -0
  30. package/dist/module/helpers/index.js +17 -2
  31. package/dist/module/helpers/index.js.map +2 -2
  32. package/dist/module/host/components/IMyopComponent.d.ts +3 -0
  33. package/dist/module/host/embeddedSDK.js +1 -1
  34. package/dist/module/host/index.js +32 -16
  35. package/dist/module/host/index.js.map +2 -2
  36. package/dist/module/host/loaders/HTMLComponentLoader.d.ts +2 -1
  37. package/dist/module/webcomponent/index.js +32 -16
  38. package/dist/module/webcomponent/index.js.map +2 -2
  39. package/package.json +1 -1
  40. package/dist/cjs/_IframeSDK.c2225e19.min.js +0 -1
  41. package/dist/cjs/_IframeSDK.c7926c56.js.map +0 -7
  42. package/dist/cjs/_MyopHelpers.08d1cf5d.js.map +0 -7
  43. package/dist/cjs/_MyopHelpers.59521d8f.min.js +0 -1
  44. package/dist/cjs/_WebComponentSDK.0caec562.min.js +0 -1
  45. package/dist/cjs/_WebComponentSDK.501a71f9.js.map +0 -7
  46. package/dist/cjs/_hostSDK.02edf3e2.min.js +0 -1
  47. package/dist/cjs/_hostSDK.cdbc1f60.js.map +0 -7
@@ -1044,6 +1044,10 @@ var BaseMyopComponent = class {
1044
1044
  }
1045
1045
  });
1046
1046
  }
1047
+ get uiTags() {
1048
+ var _a;
1049
+ return ((_a = this.componentDefinition) == null ? void 0 : _a.uiTags) || [];
1050
+ }
1047
1051
  get markedForDisposed() {
1048
1052
  return this._markedForDisposed;
1049
1053
  }
@@ -2237,7 +2241,7 @@ var WebcomponentLoader = class extends BaseMyopLoader {
2237
2241
  };
2238
2242
 
2239
2243
  // version:myop-sdk-version
2240
- var myop_sdk_version_default = "0.3.34";
2244
+ var myop_sdk_version_default = "0.3.37";
2241
2245
 
2242
2246
  // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
2243
2247
  var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
@@ -2566,7 +2570,7 @@ defineDynamicImport("WebComponentSDK", WebComponentSDK);
2566
2570
  import { EMBEDDED_SDK_CONTENT, HAS_EMBEDDED_SDK } from "./embeddedSDK.js";
2567
2571
  var MYOP_WEB_COMPONENT_MARKER = "<!-- myop-web-component -->";
2568
2572
  var MYOP_WEB_COMPONENT_SCRIPT_ID = "myop-web-component";
2569
- var extractedWebComponentScripts = /* @__PURE__ */ new Set();
2573
+ var extractedWebComponentScripts = /* @__PURE__ */ new Map();
2570
2574
  var seen2 = [];
2571
2575
  var sdk;
2572
2576
  var getInitiatedSdk = () => __async(void 0, null, function* () {
@@ -2962,19 +2966,25 @@ var HTMLComponentLoader = class extends BaseMyopLoader {
2962
2966
  return (script == null ? void 0 : script.textContent) || null;
2963
2967
  }
2964
2968
  /**
2965
- * Execute the web component script on the host document
2969
+ * Execute the web component script on the host document.
2970
+ * Returns the custom element tag name this script registered.
2966
2971
  */
2967
2972
  executeWebComponentScript(scriptContent, scriptId) {
2968
- if (extractedWebComponentScripts.has(scriptId)) {
2969
- console.log(`[MyopWebComponent] Script already executed for ${scriptId}, skipping`);
2970
- return;
2973
+ const cachedTagName = extractedWebComponentScripts.get(scriptId);
2974
+ if (cachedTagName) {
2975
+ console.log(`[MyopWebComponent] Script already executed for ${scriptId}, reusing <${cachedTagName}>`);
2976
+ return cachedTagName;
2971
2977
  }
2972
2978
  const script = document.createElement("script");
2973
2979
  script.textContent = scriptContent;
2974
2980
  script.id = `myop-extracted-${scriptId}`;
2975
2981
  document.head.appendChild(script);
2976
- extractedWebComponentScripts.add(scriptId);
2977
- console.log(`[MyopWebComponent] Executed web component script: ${scriptId}`);
2982
+ const tagName = window.__MYOP_TAG_NAME__;
2983
+ if (tagName) {
2984
+ extractedWebComponentScripts.set(scriptId, tagName);
2985
+ }
2986
+ console.log(`[MyopWebComponent] Executed web component script: ${scriptId} -> <${tagName}>`);
2987
+ return tagName;
2978
2988
  }
2979
2989
  /**
2980
2990
  * Load a Myop Web Component (extracted and run on host document)
@@ -2986,15 +2996,10 @@ var HTMLComponentLoader = class extends BaseMyopLoader {
2986
2996
  throw new Error('[MyopWebComponent] No <script id="myop-web-component"> found in HTML');
2987
2997
  }
2988
2998
  const scriptId = `${componentDefinition.id}-${skin.id}`;
2989
- const previousTagName = window.__MYOP_TAG_NAME__;
2990
- this.executeWebComponentScript(scriptContent, scriptId);
2991
- const tagName = window.__MYOP_TAG_NAME__;
2999
+ const tagName = this.executeWebComponentScript(scriptContent, scriptId);
2992
3000
  if (!tagName) {
2993
3001
  throw new Error("[MyopWebComponent] Script did not set window.__MYOP_TAG_NAME__");
2994
3002
  }
2995
- if (previousTagName && previousTagName !== tagName) {
2996
- console.warn(`[MyopWebComponent] __MYOP_TAG_NAME__ changed from ${previousTagName} to ${tagName}`);
2997
- }
2998
3003
  const domId = `myop-comp-${uuidv4()}`;
2999
3004
  const element = document.createElement(tagName);
3000
3005
  element.id = domId;
@@ -3074,7 +3079,10 @@ var convertV2VariantToComponentConfig = (config) => {
3074
3079
  loader: config.consume_variant[0].loader
3075
3080
  }
3076
3081
  ],
3077
- defaultSkin: 0
3082
+ defaultSkin: 0,
3083
+ // Only `ui:` tags ever reach the client; the server filters, absent = none.
3084
+ // @ts-ignore
3085
+ uiTags: Array.isArray(config.uiTags) ? config.uiTags : []
3078
3086
  },
3079
3087
  name: config.name
3080
3088
  };
@@ -3273,6 +3281,14 @@ var _CloudRepository = class _CloudRepository {
3273
3281
  const { cacheKey } = this.resolveParams(componentId, env, preview);
3274
3282
  return ((_a = this.variants[cacheKey]) == null ? void 0 : _a.resolved) || null;
3275
3283
  }
3284
+ /**
3285
+ * The `ui:` tags of an already-resolved component (`[]` if it has none or is not
3286
+ * resolved yet). Synchronous, no request: tags arrive with the component itself.
3287
+ */
3288
+ getComponentTags(componentId, env, preview) {
3289
+ var _a, _b;
3290
+ return ((_b = (_a = this.getResolvedConfig(componentId, env, preview)) == null ? void 0 : _a.type) == null ? void 0 : _b.uiTags) || [];
3291
+ }
3276
3292
  /**
3277
3293
  * Resolve which (env, preview) pair — and therefore which cache key — a call
3278
3294
  * for `componentId` refers to.
@@ -4004,4 +4020,4 @@ defineDynamicImport("IframeSDK", IframeSDK);
4004
4020
  export {
4005
4021
  IframeSDK
4006
4022
  };
4007
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiLFxuICAgIFwiTWluaW1pemVkTG9hZGVyXCI6IFwiTWluaW1pemVkTG9hZGVyXCJcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9IGtleW9mIHR5cGVvZiBTa2luTG9hZGVycztcblxuZXhwb3J0IHR5cGUgUHJvcFR5cGUgPSAnYW55JyB8ICdzdHJpbmcnIHwgJ251bWJlcicgfCBzdHJpbmc7IC8vIFRPRE8gOiA8XG5leHBvcnQgdHlwZSBSZWZTZWxlY3RvclR5cGUgPSAnaWQtYXR0cmlidXRlJyB8ICdjc3Mtc2VsZWN0b3InIHwgJ3hwYXRoJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IExvYWRlckZyYW1ld29ya3MgPSB7XG4gICAgXCJyZWFjdFwiOiBcInJlYWN0XCIsXG4gICAgXCJ2dWVcIjogXCJ2dWVcIixcbiAgICBcImFuZ3VsYXJcIjogXCJhbmd1bGFyXCIsXG59IGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2FkZXJGcmFtZXdvcmtUeXBlID0ga2V5b2YgdHlwZW9mIExvYWRlckZyYW1ld29ya3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIldlYkNvbXBvbmVudExvYWRlclwiO1xuICAgIHVybDogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZyYW1ld29yaz86IExvYWRlckZyYW1ld29ya1R5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSWZyYW1lTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSWZyYW1lTG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBhdXRvSGVpZ2h0OiBib29sZWFuXG4gICAgaGVpZ2h0Pzogc3RyaW5nXG4gICAgd2lkdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd1Jvb3RNb2RlVHlwZSA9IHtcbiAgICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gICAgXCJjbG9zZWRcIjogXCJjbG9zZWRcIixcbiAgICBcIm5vbmVcIjogXCJub25lXCIsXG4gICAgXCJsb2NhbEZyYW1lXCI6IFwibG9jYWxGcmFtZVwiXG59IGFzIGNvbnN0O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhUTUxMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJIVE1MTG9hZGVyXCI7XG4gICAgSFRNTDogc3RyaW5nO1xuICAgIC8vVE9ETzogcmVuYW1lKHJvb3RNb2RlL2N1c3RvbUVsZW1lbnRNb2RlKSArIGRiIG1pZ3JhdGlvblxuICAgIHNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZTtcbiAgICBhdXRvSGVpZ2h0PzogYm9vbGVhbjtcbiAgICBoZWlnaHQ/OiBzdHJpbmc7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBhbiBpbmxpbmUtSFRNTCAobG9jYWxGcmFtZSkgY29tcG9uZW50IGlzIHJlbmRlcmVkIGluIGEgc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBOTyBhY2Nlc3MgdG8gdGhlIGhvc3QgZG9jdW1lbnQgKHVudHJ1c3RlZCBjb2RlKS5cbiAgICAgKiBUaGUgaG9zdCByZW5kZXIgcG9saWN5IGNhbiBhbHNvIGZvcmNlIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlnIHZhbHVlLlxuICAgICAqL1xuICAgIGlzb2xhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG93IGEgY29tcG9uZW50IGlzIHJlbmRlcmVkIG9uIHRoZSBob3N0IHBhZ2UsIGluIGFzY2VuZGluZyBpc29sYXRpb246XG4gKiAgLSAnd2ViQ29tcG9uZW50JyAgIFx1MjAxNCBjdXN0b20gZWxlbWVudCBvbiB0aGUgaG9zdCBkb2N1bWVudCAobW9zdCBwcml2aWxlZ2VkKVxuICogIC0gJ2lmcmFtZScgICAgICAgICBcdTIwMTQgc2FtZS1vcmlnaW4gaW5saW5lLUhUTUwgaWZyYW1lICh0b2RheSdzIGRlZmF1bHQpXG4gKiAgLSAnaXNvbGF0ZWRJZnJhbWUnIFx1MjAxNCBzYW5kYm94ZWQsIGNyb3NzLW9yaWdpbiBpZnJhbWUgKHVudHJ1c3RlZCBjb2RlKVxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJNb2RlID0gJ3dlYkNvbXBvbmVudCcgfCAnaWZyYW1lJyB8ICdpc29sYXRlZElmcmFtZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUG9saWN5Q29udGV4dCB7XG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWc7XG4gICAgc2tpbjogSVNraW5Db25maWc7XG4gICAgLyoqIFdoYXQgdGhlIGNvbXBvbmVudCBhc2tlZCBmb3IgKG1hcmtlciBcdTIxRDIgJ3dlYkNvbXBvbmVudCcsIGNvbmZpZy5pc29sYXRpb24gXHUyMUQyICdpc29sYXRlZElmcmFtZScpLiAqL1xuICAgIHJlcXVlc3RlZE1vZGU6IFJlbmRlck1vZGU7XG4gICAgLyoqIFdoZXRoZXIgdGhlIEhUTUwgY2FycmllcyB0aGUgYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAgbWFya2VyLiAqL1xuICAgIGlzV2ViQ29tcG9uZW50OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvc3Qtc3VwcGxpZWQgZ2F0ZSBkZWNpZGluZyBob3cgKG9yIHdoZXRoZXIpIGEgY29tcG9uZW50IHJlbmRlcnMuIFJldHVybiBhXG4gKiBSZW5kZXJNb2RlIHRvIHVzZSwgb3IgYGZhbHNlYCB0byBibG9jayByZW5kZXJpbmcgZW50aXJlbHkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlclBvbGljeSA9XG4gICAgKGN0eDogUmVuZGVyUG9saWN5Q29udGV4dCkgPT4gUmVuZGVyTW9kZSB8IGZhbHNlIHwgUHJvbWlzZTxSZW5kZXJNb2RlIHwgZmFsc2U+O1xuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHJlbGVhc2VkT24/OiBzdHJpbmc7XG4gICAgcmVsZWFzZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JVmFyaWFudENvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIHJlbGVhc2VzPzogdjJfSVJlbGVhc2VNZXRhZGF0YVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Db25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5Db25maWcge1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQmluZE1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBjb25zdCBQcm9wTWVzc2FnZU1vZGVzID0ge1xuICAgIFwiaW5wdXRcIjogXCJpbnB1dFwiLFxuICAgIFwib3V0cHV0XCI6IFwib3V0cHV0XCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyA9IHtcbiAgICBcIm1lc3NhZ2VcIjogXCJtZXNzYWdlXCIsXG4gICAgXCJjb2RlXCI6IFwiY29kZVwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW0ge1xuICAgIHZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvZGVCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwiY29kZVwiXG4gICAgcmVtYXA/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwibWVzc2FnZVwiXG4gICAgbWVzc2FnZTogTXlvcE1lc3NhZ2VLZXlcbiAgICByZWY6IHN0cmluZywgLy9UT0RPIG1ha2UgaXQgaWRcbiAgICBwYXJhbXM6IElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW1bXVxuICAgIG1vZGU6IGtleW9mIHR5cGVvZiBQcm9wTWVzc2FnZU1vZGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBiZWhhdmlvcjogSVByb3BCZWhhdmlvclxufVxuXG5cbmV4cG9ydCBjbGFzcyBSZWZCZWhhdmlvclR5cGUge1xuICAgIHN0YXRpYyBjb2RlID0gJ2NvZGUnIGFzIGNvbnN0XG4gICAgc3RhdGljIGNvbXBvbmVudCA9ICdjb21wb25lbnQnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIElSZWZCZWhhdmlvclR5cGUgPSAnY29kZScgfCAnY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6IElSZWZCZWhhdmlvclR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50UmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb21wb25lbnQnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBQcm9wZXJ0eSBpbnN0YW5jZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqL1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29kZVJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29kZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHNlbGVjdG9yVHlwZTogUmVmU2VsZWN0b3JUeXBlXG4gICAgc2VsZWN0b3I6IHN0cmluZ1xuICAgIGJlaGF2aW9yOiBJUmVmQmVoYXZpb3Jcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudFJ1bGUge1xuICAgIHByb3BlcnR5OiBzdHJpbmc7XG4gICAgb3BlcmF0b3I6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IHZlcnNpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0IHtcbiAgICB2ZXJzaW9uczogSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbltdO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJ1bGVzOiBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlW107XG4gICAgdXNlQWI6IGJvb2xlYW47XG4gICAgY29tcG9uZW50VmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAgIGFiU3BsaXQ/OiBJRXhwZXJpZW5jZUFCU3BsaXQ7XG4gICAgc3RpY2t5UHJvcGVydGllcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgZGVmaW5pdGlvbiBjb25maWcgKHYyKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlRGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICAvKiogU2VsZWN0ZWQgY29tcG9uZW50IElEcyAqL1xuICAgIGNvbXBvbmVudHM6IHN0cmluZ1tdO1xuICAgIC8qKiBTZWdtZW50IGNvbmZpZ3VyYXRpb25zICovXG4gICAgc2VnbWVudHM6IElFeHBlcmllbmNlU2VnbWVudFtdO1xuICAgIC8qKiBGYWxsYmFjayB2YXJpYW50IHBlciBjb21wb25lbnQgKi9cbiAgICBmYWxsYmFjazogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAvKiogVGFncyAqL1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIC8vIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBJUHJvcENvbmZpZz4gLy9pZCAtIHR5cGVcbiAgICAvLyByZWZzOiBSZWNvcmQ8c3RyaW5nLCBJUmVmQ29uZmlnPixcbiAgICAvLyBza2luczogUmVjb3JkPHN0cmluZywgSVNraW5Db25maWc+XG4gICAgcHJvcHM6IElQcm9wQ29uZmlnW10sXG4gICAgcmVmczogSVJlZkNvbmZpZ1tdLFxuICAgIHNraW5zOiBJU2tpbkNvbmZpZ1tdLFxuICAgIGRlZmF1bHRTa2luOiBudW1iZXI7XG5cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgLy9yZXNvbHZlZERlZmluaXRpb25zPzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbXVxuICAgIC8vVE9ETyA6IG1vdmUgdG8gYmFzZSBjbGFzcyAoIElTdG9yYWJsZUl0ZW0gb3Igc28uLi4pXG5cbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JTXlvcFN0b3JlZE9iamVjdCBleHRlbmRzIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50QWNjZXNzIHtcbiAgICB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfCAndW5saXN0ZWQnIHwgJ3B1YmxpYyc7XG4gICAgdW5saXN0ZWQ/OiB7XG4gICAgICAgIHNsdWc6IHN0cmluZztcbiAgICB9O1xuICAgIG1hcmtldHBsYWNlPzoge1xuICAgICAgICBzdGF0dXM6ICdkcmFmdCcgfCAnc3VibWl0dGVkJyB8ICdjbGFpbWVkJyB8ICdjbG9zZWQnO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBjb250YWN0RW1haWw6IHN0cmluZztcbiAgICAgICAgZGVhZGxpbmU6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIHZhcmlhbnRzX2lkczogc3RyaW5nW10sXG4gICAgRFRPczogdjJfSURUT1tdLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgIGFjY2Vzcz86IENvbXBvbmVudEFjY2VzcyxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgSUVsZW1lbnRSZWYsIE15b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IERldGVjdE15b3BSZWZzTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG4gICAgICAgIC8vY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgKmApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogSUVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIC8vbGV0IGNvdW50ZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICB9IC8vZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKCFjb3VudGVyc1tpdGVtLnRhZ05hbWVdKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSAwO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gY291bnRlcnNbaXRlbS50YWdOYW1lXSArIDE7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICAgIG15b3BSZWZzLnB1c2gobmV3IFhQYXRoRWxlbWVudFJlZihgJHtpdGVtLnRhZ05hbWV9KCR7Y291bnRlcnNbaXRlbS50YWdOYW1lXX0pYCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfVxufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZSgpLCBldmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGVhblVwVGFzayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKGNsZWFuVXBUYXNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9jbGVhbiB1cFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7IE15b3BNZXNzYWdlcyB9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NoYW5nZVRleHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENoYW5nZVRleHRNZXNzYWdlPiB7XG4gIFxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuICAgIFxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDaGFuZ2VUZXh0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgX19mZWRlcmF0aW9uX18gPSBcIl9fZmVkZXJhdGlvbl9fXCJcbmV4cG9ydCBjb25zdCBvbkxvYWRLZXkgPSBcIm9uTG9hZFwiXG5leHBvcnQgY29uc3QgbW9kdWxlSW5zdGFuY2VLZXkgPSBcIm1vZHVsZUluc3RhbmNlXCJcblxuZXhwb3J0IGNvbnN0IGRlZmluZUR5bmFtaWNJbXBvcnQgPSAoZ2xvYmFsTmFtZTogc3RyaW5nLCBtb2R1bGU6IGFueSkgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAod2luZG93W19fZmVkZXJhdGlvbl9fXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV1bb25Mb2FkS2V5XSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV1bb25Mb2FkS2V5XSh7W2dsb2JhbE5hbWVdOiBtb2R1bGV9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ19fZmVkZXJhdGlvbl9fIGxvYWRlciBub3QgZGVmaW5lZCBmb3IgbW9kdWxlJywgbW9kdWxlKTtcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYobWVzc2FnZS5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBtYWtlU2VyaWFsaXphYmxlKGUsIG1lc3NhZ2Uuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleSwgTXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRGlzcG9zZU1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZlxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREssIGxvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IG9ic2VydmVBdXRvU2l6ZSBjYWxsYmFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TaXplUmVzdWx0IHtcbiAgICAvKiogQ3VycmVudCB3aWR0aCAoZnJvbSBjb250ZW50KSAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIEN1cnJlbnQgaGVpZ2h0IChmcm9tIGNvbnRlbnQpICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqIFdoZXRoZXIgd2lkdGggaXMgYmVpbmcgYXV0by1zaXplZCAqL1xuICAgIGF1dG9TaXppbmdXaWR0aDogYm9vbGVhbjtcbiAgICAvKiogV2hldGhlciBoZWlnaHQgaXMgYmVpbmcgYXV0by1zaXplZCAqL1xuICAgIGF1dG9TaXppbmdIZWlnaHQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igb2JzZXJ2ZUF1dG9TaXplIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TaXplT3B0aW9ucyB7XG4gICAgLyoqIENhbGxiYWNrIGNhbGxlZCB3aXRoIHNpemUgaW5mbyB3aGVuZXZlciBzaXplIGNoYW5nZXMgKi9cbiAgICBvblNpemVDaGFuZ2U/OiAocmVzdWx0OiBBdXRvU2l6ZVJlc3VsdCkgPT4gdm9pZDtcbiAgICAvKiogTWluaW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWluV2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1heFdpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNaW5pbXVtIGhlaWdodCBjb25zdHJhaW50ICovXG4gICAgbWluSGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIGhlaWdodCBjb25zdHJhaW50ICovXG4gICAgbWF4SGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBFeHBsaWNpdCB3aWR0aCBzZXQgYnkgaG9zdCAtIGlmIGRlZmluZWQsIGRvbid0IGF1dG8tc2l6ZSB3aWR0aCAqL1xuICAgIGV4cGxpY2l0V2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEV4cGxpY2l0IGhlaWdodCBzZXQgYnkgaG9zdCAtIGlmIGRlZmluZWQsIGRvbid0IGF1dG8tc2l6ZSBoZWlnaHQgKi9cbiAgICBleHBsaWNpdEhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRm9yY2UgYXV0by1zaXplIGV2ZW4gaWYgY29udGFpbmVyIGhhcyBkaW1lbnNpb25zICovXG4gICAgZm9yY2VBdXRvU2l6ZT86IGJvb2xlYW47XG4gICAgLyoqIE1pbiBoZWlnaHQgdXNlZCBieSBsb2FkZXIgdG8gZGV0ZWN0IGNvbGxhcHNlIChkZWZhdWx0OiA1MCkgKi9cbiAgICBsb2FkZXJNaW5IZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8vVE9ETyA6IGNoYW5nZSBJTXlvcENvbXBvbmVudCB0byByZWYgc3BlY2lmaWMgaW1wbFxudHlwZSBSZWZUeXBlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBJTXlvcENvbXBvbmVudCB8IFJlZlxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcENvbXBvbmVudDxQID0gYW55LCBSID0gYW55PiB7XG5cbiAgICBpZDogc3RyaW5nO1xuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW47XG5cbiAgICBtYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbjtcblxuICAgIHNldEluaXRpYXRlZDogKCkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnRcblxuICAgIC8vcmVmIGNvbXBvbmVudHMgY2FuIGJlIGVsZW1lbnQtbGVzc1xuICAgIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFxuXG4gICAgc2VuZDogKG1zZzogQmFzZU15b3BNZXNzYWdlKSA9PiBDbGVhbnVwSGFuZGxlclxuXG4gICAgYmluZChtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgYmluZDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXksIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKTogdm9pZDtcblxuICAgIC8vIGJvb2xlYW4gcmV0dXJuZWQgdmFsdWUgPSBoYW5kbGVkIG9yIG5vdFxuICAgIG9uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IGJvb2xlYW5cblxuICAgIGluaXRpYXRlZDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuXG4gICAgZGlzcG9zZTogKCkgPT4gdm9pZFxuXG4gICAgaGlkZSgpOiB2b2lkO1xuXG4gICAgc2hvdygpOiB2b2lkO1xuXG4gICAgaW5zcGVjdCgpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBpZnJhbWUtYmFzZWQgY29tcG9uZW50cy4gVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2Vzcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplPzogKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpID0+IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIG15b3A6c2l6ZSBtZXRhIHRhZyBmcm9tIHRoZSBjb21wb25lbnQgSFRNTC5cbiAgICAgKiBTZXQgYnkgSFRNTENvbXBvbmVudExvYWRlciBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uLlxuICAgICAqIFVzZWQgYnkgdGhlIFJlYWN0IGhvc3QgdG8gZGV0ZXJtaW5lIHNpemluZyBtb2RlIChmaWxsIHZzIGNvbnRlbnQpLlxuICAgICAqL1xuICAgIHNpemVNZXRhPzogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsO1xuXG4gICAgcGFyZW50PzogSU15b3BDb21wb25lbnQ7XG5cbiAgICBwcm9wczogUFxuXG4gICAgcmVmczogUlxufVxuXG5mdW5jdGlvbiBpc0luaGVyaXRGcm9tKG9iajogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXG4gICAgaWYgKCFwcm90bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IGJhc2VDbGFzcy5uYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbmhlcml0RnJvbShwcm90bywgYmFzZUNsYXNzKTtcbn1cblxuLy8gVE9ETyA6IG1vdmUgOiBcbnR5cGUgbWVzc2FnZUhhbmRsZXI8VD4gPSAobWVzc2FnZTogVCkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgZXh0ZW5kcyBSZWZUeXBlcyA9IFJlZlR5cGVzPiBpbXBsZW1lbnRzIElNeW9wQ29tcG9uZW50PFA+IHtcbiAgICBpZDogc3RyaW5nID0gJydcblxuICAgIG1lc3NhZ2VIYW5kbGVyczogUmVjb3JkPHN0cmluZywgbWVzc2FnZUhhbmRsZXI8YW55PltdPiA9IHt9O1xuXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IG9wdGlvbnM/LmlkIHx8IEhvc3RTREsuSW5zdGFuY2UoKS5hc3NpZ25JZChjb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPyBvcHRpb25zPy50aW1lb3V0IDogNSAqIDEwMDA7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkICYmIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QgJiYgIXRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgdGltZW91dF8ke3RpbWVvdXR9ICR7dGhpcy5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGF1dG8gaW5zcGVjdCwgY29udHJvbCBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLmhvc3RTREsuaW5zcGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBnZXQgbWFya2VkRm9yRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZDtcbiAgICB9XG5cbiAgICBzZXQgbWFya2VkRm9yRGlzcG9zZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWRPcGVyYXRpb25FeGNlcHRpb246IFRoZSBjb21wb25lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkaXNwb3NlZC4gRGlzcG9zZSBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBhZ2FpbiB1bnRpbCB0aGUgY3VycmVudCBkaXNwb3NhbCBwcm9jZXNzIGlzIGNvbXBsZXRlLicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBoaWRlKCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBzaG93KCk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBpbnNwZWN0KCk6IENsZWFudXBIYW5kbGVyO1xuXG4gICAgLy9UT0RPOiB1c2UgYmluZFdoZW4gd2l0aCByZXR1cm4gdHJ1ZSBwcmVkaWNhdGUgLi4uXG4gICAgYmluZCA9IDxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPihtZXNzYWdlVHlwZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdLmluY2x1ZGVzKGhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRXaGVuID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIHByZWRpY2F0ZTogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4sIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiB2b2lkKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCB1c2UgY29tcG9uZW50LmJpbmRXaGVuIHdpdGhvdXQgYW4gaGFuZGxlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXTtcblxuICAgICAgICBjb25zdCBwcmVkaWNhdGVXcmFwcGVkSGFuZGxlciA9IChlOiBUKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiA/XG4gICAgICAgIGhhbmRsZXJzLnB1c2gocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YocHJlZGljYXRlV3JhcHBlZEhhbmRsZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ29uTWVzc2FnZVJlY2VpdmVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgaW5jb21lTWVzc2FnZSwgdGhpcyk7XG4gICAgICAgIC8vVE9ETyA6IGhhbmRlbCBzcGVjaWFsIGV2ZXRzID8gbGlrZSBpbml0UmVzID9cbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAoaW5jb21lTWVzc2FnZSBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKTtcblxuICAgICAgICAgICAgLy9rZWVwaW5nIHRoaXMubWV0aG9kKCkgc28gdGhhdCBjb250ZXh0IHdpbGwgc2F2ZWRcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KVt0eXBlZE1lc3NhZ2UubWV0aG9kXSh0eXBlZE1lc3NhZ2UuY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBtZXRob2Qgbm90IGZvdW5kICR7dHlwZWRNZXNzYWdlLm1ldGhvZH0gb24gY29tcG9uZW50YCwgdGhpcylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzW2luY29tZU1lc3NhZ2UubWVzc2FnZVR5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBoYW5kbGVkIHx8IGhhbmRsZXIoaW5jb21lTWVzc2FnZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGNvbnNvbGUgb25seSB3aGVuIGRlYnVnIGNvbmZpZ1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbm8gaGFuZGxlcnMgZm91bmQgZm9yICcsIGluY29tZU1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNldEluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYXRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlKVxuICAgICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX3doZW5Jbml0aWF0ZWRSZXNvbHZlPzogKHZhbHVlPzogYW55KSA9PiBhbnk7XG4gICAgX3doZW5Jbml0aWF0ZWRSZWplY3Q/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcblxuICAgIF93aGVuSW5pdGlhdGVkOiBQcm9taXNlPGFueT4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGluaXRpYXRlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5Jbml0aWF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kQ2xlYW51cE1lc3NhZ2UobWVzc2FnZTogQ2xlYW51cE1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gdGhpcy5pZDtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKG1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSBtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICB9LCAobTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2UuaGFuZGxlcihtKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXI7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIHRoaXMuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHNlbmQobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIge1xuICAgICAgICAvL21lc3NhZ2VzIHRoYXQgZXhldHJhY3RlZCBmcm9tIGVudmVsb3BlIGFscmVhZHkgaGF2ZSBzb3VyY2UgaW4gdGhlbVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSB0aGlzLmlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuXG4gICAgICAgIGxldCBjbGVhbnVwSGFuZGxlcjtcbiAgICAgICAgLy8gVE9ETyA6IGZpeCBoZWF2eSBvcC4uXG4gICAgICAgIC8vICBpZiAoaXNJbmhlcml0RnJvbShtZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgTXlvcEJpbmRNZXNzYWdlKTtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyID0gdGhpcy5iaW5kV2hlbih0eXBlZE1lc3NhZ2UucmVwbHlNZXNzYWdlS2V5LCAobXNnOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnLnJlcGxheVRvSGFuZGxlciA9PT0gdHlwZWRNZXNzYWdlLmhhbmRsZXJVbmlxdWVJZFxuICAgICAgICAgICAgfSwgdHlwZWRNZXNzYWdlLmhhbmRsZXIpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgaWYgKG1lc3NhZ2UucmVmKSB7XG4gICAgICAgICAgICAvLyBzZXJpYWxpemFibGVcbiAgICAgICAgICAgIG1lc3NhZ2UucmVmID0gbWVzc2FnZS5yZWYuX19ub25Qcm94aWVkIHx8IG1lc3NhZ2UucmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZENsZWFudXBNZXNzYWdlKG5ldyBDbGVhbnVwTWVzc2FnZShtZXNzYWdlLmlkLCAocmVwbGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZyByZXBsYXk/XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNsZWFudXBIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHNkay5sb2dnZXJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2Rpc3Bvc2luZyBiZWZvcmUgaXNJbml0aWF0ZWQnLCB0aGlzLmlkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnZGlzcG9zaW5nIGNvbXBvbmVudCcsIHRoaXMuaWQpO1xuXG4gICAgICAgIC8vIC8vVE9ETyA6IGltcGxlbWVudCBkaXNwb3NlIGZsb3dcbiAgICAgICAgLy8gT2JqZWN0LmtleXModGhpcy5yZWZzKS5mb3JFYWNoKHJlZktleT0+e1xuICAgICAgICAvLyAgICAgdGhpcy5yZWZzW3JlZktleV0uZGlzcG9zZSgpO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgdGltZSBmb3IgdGhlIG9cbiAgICAgICAgLy8gdGhlciBzaWRlIHRvIHByb2NjZXNzIHRvIG1lc3NhZ2UgYmVmb3JlIGRpZSA/XG4gICAgICAgIC8vbm90aWZ5IHRoZSBvdGhlciBzaWRlIFNES1xuICAgICAgICB0aGlzLnNlbmQobmV3IERpc3Bvc2VNZXNzYWdlKCkpXG5cbiAgICAgICAgY29uc3Qgb25EaXNwb3NlSGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyc1snb25EaXNwb3NlJ11cbiAgICAgICAgaWYgKG9uRGlzcG9zZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICBvbkRpc3Bvc2VIYW5kbGVycy5mb3JFYWNoKGRpc3Bvc2VIYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIG51bGwgb3IgZml4IHRoZSB0eXBlID9cbiAgICAgICAgICAgICAgICBkaXNwb3NlSGFuZGxlcihudWxsKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMgPSB7fVxuICAgICAgICB0aGlzLmlkICs9ICdfZGlzcG9zZWQnO1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvcHM6IFAgPSB7fSBhcyB1bmtub3duIGFzIFA7XG4gICAgcmVmczogUiA9IHt9IGFzIHVua25vd24gYXMgUjtcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG4vKipcbiAqIENvbXBvbmVudCB3cmFwcGVyIGZvciBNeW9wIFdlYiBDb21wb25lbnRzIHRoYXQgYXJlIGV4dHJhY3RlZCBmcm9tIEhUTUxcbiAqIGFuZCBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQgKG5vdCBpbiBhbiBpZnJhbWUpLlxuICpcbiAqIFRoZXNlIGNvbXBvbmVudHMgdXNlIHRoZSBuYXRpdmUgV2ViIENvbXBvbmVudHMgQVBJIChDdXN0b20gRWxlbWVudHMgKyBTaGFkb3cgRE9NKVxuICogYW5kIGNvbW11bmljYXRlIHZpYSBkaXJlY3QgbWV0aG9kIGNhbGxzIGFuZCBDdXN0b21FdmVudHMgaW5zdGVhZCBvZiBwb3N0TWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSBjdGFDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9jdGFIYW5kbGVyPzogKGFjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YVF1ZXVlOiBBcnJheTx7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd259PiA9IFtdO1xuXG4gICAgLy8gQSBzaW5nbGUgJ215b3AtY3RhJyBsaXN0ZW5lciwgYXR0YWNoZWQgYXQgY29uc3RydWN0aW9uIHNvIENUQXMgYSBjb21wb25lbnRcbiAgICAvLyBkaXNwYXRjaGVzIGR1cmluZyBpdHMgZmlyc3QgaW5pdFdpdGhEYXRhKCkgcmVuZGVyIFx1MjAxNCBiZWZvcmUgdGhlIGhvc3QgYXR0YWNoZXNcbiAgICAvLyBhIGhhbmRsZXIgXHUyMDE0IGFyZSBidWZmZXJlZCAoYW5kIGZsdXNoZWQgb24gc2V0Q3RhSGFuZGxlciksIG1hdGNoaW5nIHRoZSBpZnJhbWVcbiAgICAvLyBwYXRoJ3MgcHJlLWhhbmRsZXIgQ1RBIHF1ZXVlLlxuICAgIHByaXZhdGUgX2N0YUxpc3RlbmVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IChlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgICAgIGlmICghZGV0YWlsPy5hY3Rpb24pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoZGV0YWlsLmFjdGlvbiwgZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jdGFIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHsgYWN0aW9uOiBkZXRhaWwuYWN0aW9uLCBwYXlsb2FkOiBkZXRhaWwucGF5bG9hZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIEJFRk9SRSBhbnkgaW5pdFdpdGhEYXRhIHJlbmRlciBzbyBpbml0LXRpbWUgQ1RBcyBhcmVuJ3QgbG9zdC5cbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ215b3AtY3RhJywgdGhpcy5fY3RhTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLmN0YUNsZWFudXAgPSAoKSA9PiB0aGlzLmN1c3RvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCB0aGlzLl9jdGFMaXN0ZW5lcik7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhlICdteW9wLWN0YScgbGlzdGVuZXIgaXMgYXR0YWNoZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBzbyB3ZSBvbmx5IHNldCB0aGVcbiAgICAgICAgLy8gaGFuZGxlciBhbmQgZmx1c2ggYW55dGhpbmcgdGhlIGNvbXBvbmVudCBlbWl0dGVkIGJlZm9yZSBub3cgKGUuZy4gZHVyaW5nIHRoZVxuICAgICAgICAvLyBmaXJzdCBpbml0V2l0aERhdGEgcmVuZGVyKS5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2N0YVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLnRoaXMuX2N0YVF1ZXVlXTtcbiAgICAgICAgICAgIHRoaXMuX2N0YVF1ZXVlID0gW107XG4gICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtZXNzYWdlLWJhc2VkIGNvbXBvbmVudHMuXG4gICAgICogV2ViIGNvbXBvbmVudHMgZG9uJ3QgdXNlIHBvc3RNZXNzYWdlLCBzbyB0aGlzIGlzIGEgbm8tb3AgZm9yIG1vc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICAvLyBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgdGhlIHBvc3RNZXNzYWdlIHN5c3RlbVxuICAgICAgICAvLyBJbnN0ZWFkLCBpbnRlcmFjdCBkaXJlY3RseSB2aWEgcHJvcHMubXlvcF9pbml0X2ludGVyZmFjZSBhbmQgcHJvcHMubXlvcF9jdGFfaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gTG9nIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRdIHNlbmQoKSBjYWxsZWQgLSB3ZWIgY29tcG9uZW50cyB1c2UgZGlyZWN0IEFQSSBpbnN0ZWFkJywgbWVzc2FnZSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1RcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBnZXRzL3NldHMgZGF0YSAobWF0Y2hlcyBpZnJhbWUgYmVoYXZpb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgbXlvcF9jdGFfaGFuZGxlciwgcmV0dXJuIHVuZGVmaW5lZCAoaXQncyB3cml0ZS1vbmx5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogbm8gc2FtZS1vcmlnaW4gYWNjZXNzIFx1MjAxNCB1c2UgdGhlIHBvc3RNZXNzYWdlIGJyaWRnZVxuICAgICAgICAgICAgICAgIC8vIChzYW1lIG1ldGhvZCBzdXJmYWNlIGFzIHRoZSBleHRyYWN0ZWQtV0MgYnJhbmNoIGFib3ZlKS5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcElmcmFtZUNvbXBvbmVudCAmJiBjb21wb25lbnQuaXNvbGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGE/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gbXlvcF9jdGFfaGFuZGxlciBpcyB3cml0ZS1vbmx5XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUIChiZWZvcmUgbG9jYWxGcmFtZSBjaGVjaylcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50cyBtYXkgaGF2ZSBzaGFkb3dSb290TW9kZTogbG9jYWxGcmFtZSBpbiB0aGVpciBjb25maWdcbiAgICAgICAgICAgICAgICAvLyBidXQgdGhleSBydW4gZGlyZWN0bHkgb24gdGhlIGhvc3QgZG9jdW1lbnQsIG5vdCBpbiBhbiBpZnJhbWVcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEN0YUhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2luaXRfaW50ZXJmYWNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElzb2xhdGVkIGlmcmFtZTogcm91dGUgdmlhIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKG5vIHNhbWUtb3JpZ2luIGFjY2VzcykuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BJZnJhbWVDb21wb25lbnQgJiYgY29tcG9uZW50Lmlzb2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT09ICdteW9wX2N0YV9oYW5kbGVyJykgeyBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7IGNvbXBvbmVudC5pbml0V2l0aERhdGEodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvciBpZnJhbWUgKGxvY2FsRnJhbWUpIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFdpbmRvdyA9IChjb21wb25lbnQuZWxlbWVudCBhcyBIVE1MSUZyYW1lRWxlbWVudCkuY29udGVudFdpbmRvdyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2luZG93W3Byb3BOYW1lXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGbHVzaCBDVEEgcXVldWUgaWYgdGhpcyBpcyBteW9wX2N0YV9oYW5kbGVyIGFuZCBxdWV1ZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInICYmIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3cuX19teW9wX2N0YV9xdWV1ZSA9IG51bGw7IC8vIENsZWFyIHRvIHByZXZlbnQgZG91YmxlLWZsdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuZm9yRWFjaCgoaXRlbToge2FjdGlvbjogc3RyaW5nLCBwYXlsb2FkOiBhbnl9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29tcG9uZW50IHdhcyBkaXNwb3NlZCBkdXJpbmcgZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZShpdGVtLmFjdGlvbiwgaXRlbS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9cblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QXV0b1NpemVPcHRpb25zLCBCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE1lc3NhZ2VEaXJlY3Rpb25cbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlcy50c1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgX2F1dG9TaXplQ2xlYW51cD86IENsZWFudXBIYW5kbGVyO1xuICAgIHByaXZhdGUgX2F1dG9TaXplT3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucztcbiAgICBwcml2YXRlIF9hdXRvU2l6ZVVwZGF0ZT86ICgpID0+IHZvaWQ7XG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSXNvbGF0aW9uIChzYW5kYm94ZWQgY3Jvc3Mtb3JpZ2luIGZyYW1lKSBcdTIwMTQgcG9zdE1lc3NhZ2UgYnJpZGdlLCBob3N0IHNpZGUgXHUyNTAwXHUyNTAwXG4gICAgcHVibGljIGlzb2xhdGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbGFzdERhdGE/OiB1bmtub3duOyAgICAgICAgICAgICAgIC8vIGNhY2hlZCBsYXN0LXNlbnQgZGF0YSAoc3luYyBnZXREYXRhKVxuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHsgYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24gfT4gPSBbXTtcbiAgICBwcml2YXRlIF9pc29Nc2dIYW5kbGVyPzogKGU6IE1lc3NhZ2VFdmVudCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9pc29TaXplT3B0cz86IEF1dG9TaXplT3B0aW9ucztcbiAgICBwcml2YXRlIF9pc29BdXRvU2l6ZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBicmlkZ2Ugc2l6aW5nIG9ubHkgd2hlbiBhdXRvLXNpemUgaXMgb25cbiAgICBwcml2YXRlIF9pc29MYXN0U2l6ZT86IHsgaGVpZ2h0OiBudW1iZXIsIHdpZHRoPzogbnVtYmVyIH07ICAvLyBsYXN0IHJlcG9ydGVkIHNpemUgKGZvciB0aGUgZW5hYmxlIHJhY2UpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucylcblxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2xhc3REYXRhID0gb3B0aW9ucz8uZGF0YTtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBJc29sYXRpb24gYnJpZGdlIChob3N0IHNpZGUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8qKiBBdHRhY2ggdGhlIGhvc3Qtc2lkZSBwb3N0TWVzc2FnZSBsaXN0ZW5lciBmb3IgYSBzYW5kYm94ZWQgZnJhbWUuICovXG4gICAgZW5hYmxlSXNvbGF0aW9uKCkge1xuICAgICAgICB0aGlzLmlzb2xhdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIGRvbid0IHJ1biB0aGUgSWZyYW1lU0RLIGhhbmRzaGFrZSAobm8gc2FtZS1vcmlnaW4gaW5pdCksXG4gICAgICAgIC8vIHNvIG1hcmsgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IFx1MjAxNCBsaWtlIHRoZSBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBkb2VzLlxuICAgICAgICB0aGlzLnNldEluaXRpYXRlZCgpO1xuICAgICAgICB0aGlzLl9pc29Nc2dIYW5kbGVyID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuc291cmNlICE9PSB0aGlzLklmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgZDogYW55ID0gZS5kYXRhO1xuICAgICAgICAgICAgaWYgKCFkIHx8IGQuX19teW9wICE9PSB0cnVlKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoZC50eXBlID09PSAnbXlvcDpjdGEnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N0YUhhbmRsZXIgJiYgIXRoaXMubWFya2VkRm9yRGlzcG9zZWQpIHRoaXMuX2N0YUhhbmRsZXIoZC5hY3Rpb24sIGQucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHRoaXMuX2N0YVF1ZXVlLnB1c2goeyBhY3Rpb246IGQuYWN0aW9uLCBwYXlsb2FkOiBkLnBheWxvYWQgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ215b3A6c2l6ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUlzb1NpemUoZC5oZWlnaHQsIGQud2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2lzb01zZ0hhbmRsZXIpO1xuICAgIH1cblxuICAgIC8qKiBEYXRhLWluIFx1MjAxNCB1bmlmaWVkIHdpdGggdGhlIGV4dHJhY3RlZC1XQyBBUEkuIFBvc3RzIGluaXQgb3ZlciB0aGUgYnJpZGdlLiAqL1xuICAgIGluaXRXaXRoRGF0YShkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhc3REYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZSh7IF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6aW5pdCcsIGRhdGEgfSwgJyonKTtcbiAgICB9XG5cbiAgICAvKiogRGF0YS1pbiBnZXR0ZXIgXHUyMDE0IHJldHVybnMgdGhlIGxhc3QgZGF0YSB0aGUgaG9zdCBzZW50IChjYWNoZWQsIHN5bmNocm9ub3VzKS4gKi9cbiAgICBnZXREYXRhKCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdERhdGE7XG4gICAgfVxuXG4gICAgLyoqIERhdGEtb3V0IFx1MjAxNCB1bmlmaWVkIHdpdGggdGhlIGV4dHJhY3RlZC1XQyBBUEkuIEZsdXNoZXMgQ1RBcyBxdWV1ZWQgcHJlLWhhbmRsZXIuICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLl9jdGFRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZSA9IFsuLi50aGlzLl9jdGFRdWV1ZV07XG4gICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgcXVldWUuZm9yRWFjaChpdGVtID0+IHsgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSBoYW5kbGVyKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpOyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGx5SXNvU2l6ZShoZWlnaHQ6IG51bWJlciwgd2lkdGg/OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFoZWlnaHQgfHwgTnVtYmVyLmlzTmFOKGhlaWdodCkpIHJldHVybjtcbiAgICAgICAgLy8gQWx3YXlzIHJlbWVtYmVyIHRoZSBsYXRlc3QgcmVwb3J0ZWQgc2l6ZSBzbyBpdCBjYW4gYmUgYXBwbGllZCBpZi93aGVuXG4gICAgICAgIC8vIGF1dG8tc2l6aW5nIGlzIGVuYWJsZWQgYWZ0ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgYXJyaXZlcy5cbiAgICAgICAgdGhpcy5faXNvTGFzdFNpemUgPSB7IGhlaWdodCwgd2lkdGggfTtcbiAgICAgICAgLy8gUmVzcGVjdCBhdXRvU2l6ZTpmYWxzZSBcdTIwMTQgdGhlIGhvc3Qgb3ducyBkaW1lbnNpb25zLCBzbyBkb24ndCB0b3VjaCB0aGVtLlxuICAgICAgICBpZiAoIXRoaXMuX2lzb0F1dG9TaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9pc29TaXplT3B0cztcbiAgICAgICAgY29uc3QgdG9OdW0gPSAodjogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+XG4gICAgICAgICAgICB2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IChpc05hTihwYXJzZUZsb2F0KHYpKSA/IHVuZGVmaW5lZCA6IHBhcnNlRmxvYXQodikpKTtcbiAgICAgICAgY29uc3QgbWluID0gdG9OdW0ob3B0cz8ubWluSGVpZ2h0KSwgbWF4ID0gdG9OdW0ob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgbGV0IGggPSBoZWlnaHQ7XG4gICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiBoIDwgbWluKSBoID0gbWluO1xuICAgICAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgaCA+IG1heCkgaCA9IG1heDtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIGFic29sdXRlIG92ZXJsYXkgdG8gZG9jdW1lbnQgZmxvdyBhdCB0aGUgbWVhc3VyZWQgaGVpZ2h0LlxuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaW5zZXQgPSAnYXV0byc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoICsgJ3B4JztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7IHdpZHRoOiB3aWR0aCA/PyB0aGlzLklmcmFtZUVsZW1lbnQuY2xpZW50V2lkdGgsIGhlaWdodDogaCwgYXV0b1NpemluZ1dpZHRoOiBmYWxzZSwgYXV0b1NpemluZ0hlaWdodDogdHJ1ZSB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogVXNlcyBkaXJlY3QgY29udGVudERvY3VtZW50IGFjY2VzcyAoc2FtZS1vcmlnaW4gb25seSkgZm9yIGFjY3VyYXRlIG1lYXN1cmVtZW50cy5cbiAgICAgKlxuICAgICAqIFJlZW50cmFudDogd2hlbiBjYWxsZWQgYWdhaW4gd2hpbGUgb2JzZXJ2ZXJzIGFscmVhZHkgZXhpc3QsIHVwZGF0ZXMgb3B0aW9ucyBhbmRcbiAgICAgKiByZS1ldmFsdWF0ZXMgc2l6aW5nIHdpdGhvdXQgcmVjcmVhdGluZyBvYnNlcnZlcnMuIENsZWFudXAgKyByZS1jYWxsIChlLmcuIFJlYWN0XG4gICAgICogcmUtcmVuZGVyKSBjcmVhdGVzIGZyZXNoIG9ic2VydmVycyBzaW5jZSBjbGVhbnVwIGNsZWFycyB0aGUgZXhpc3Rpbmcgb25lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemUgPSAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucyk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3B0aW9ucyBzbyB1cGRhdGVTaXplIGFsd2F5cyByZWFkcyB0aGUgbGF0ZXN0XG4gICAgICAgIHRoaXMuX2F1dG9TaXplT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gSXNvbGF0ZWQgZnJhbWVzIGNhbid0IGJlIG1lYXN1cmVkIGNyb3NzLW9yaWdpbiBcdTIwMTQgc2l6aW5nIGlzIGRyaXZlbiBieVxuICAgICAgICAvLyAnbXlvcDpzaXplJyBwb3N0TWVzc2FnZXMgZnJvbSB0aGUgYnJpZGdlIChzZWUgX2FwcGx5SXNvU2l6ZSkuXG4gICAgICAgIGlmICh0aGlzLmlzb2xhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc29TaXplT3B0cyA9IG9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLl9pc29BdXRvU2l6ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgbW9zdCByZWNlbnQgYnJpZGdlLXJlcG9ydGVkIHNpemUgKGl0IG1heSBoYXZlIGFycml2ZWQgYmVmb3JlXG4gICAgICAgICAgICAvLyBhdXRvLXNpemluZyB3YXMgdHVybmVkIG9uKS5cbiAgICAgICAgICAgIGlmICh0aGlzLl9pc29MYXN0U2l6ZSkgdGhpcy5fYXBwbHlJc29TaXplKHRoaXMuX2lzb0xhc3RTaXplLmhlaWdodCwgdGhpcy5faXNvTGFzdFNpemUud2lkdGgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHsgdGhpcy5faXNvQXV0b1NpemUgPSBmYWxzZTsgdGhpcy5faXNvU2l6ZU9wdHMgPSB1bmRlZmluZWQ7IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvYnNlcnZlcnMgYWxyZWFkeSBleGlzdCwgcmUtZXZhbHVhdGUgd2l0aCBuZXcgb3B0aW9ucyBhbmQgcmV1c2UgdGhlbVxuICAgICAgICBpZiAodGhpcy5fYXV0b1NpemVDbGVhbnVwICYmIHRoaXMuX2F1dG9TaXplVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9TaXplQ2xlYW51cDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgY29uc3QgZG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbTXlvcElmcmFtZUNvbXBvbmVudF0gQ2Fubm90IG9ic2VydmUgYXV0byBzaXplOiBjb250ZW50RG9jdW1lbnQgbm90IGFjY2Vzc2libGUnKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IG1pbikgcmV0dXJuIG1pbjtcbiAgICAgICAgICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+IG1heCkgcmV0dXJuIG1heDtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQYXJzZSBDU1Mgc2l6ZSB2YWx1ZXMgdG8gbnVtYmVyc1xuICAgICAgICBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBwYXJzZWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlU2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFjb250ZW50RG9jKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9hdXRvU2l6ZU9wdGlvbnM7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoID0gcGFyc2VTaXplKG9wdHM/Lm1pbldpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gcGFyc2VTaXplKG9wdHM/Lm1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHBhcnNlU2l6ZShvcHRzPy5taW5IZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1heEhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJNaW5IZWlnaHQgPSBvcHRzPy5sb2FkZXJNaW5IZWlnaHQgPz8gNTA7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgZXhwbGljaXQgZGltZW5zaW9uczogaG9zdCBvcHRpb25zIFx1MjE5MiBzaXplTWV0YSBmaWxsIG1vZGUgXHUyMTkyIHdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiXG4gICAgICAgICAgICAvLyBXaWR0aCBkZWZhdWx0cyB0byBcIjEwMCVcIiAoYmxvY2sgZWxlbWVudCBiZWhhdmlvcikgdG8gcHJldmVudCB0aGUgc2hyaW5rLXRvLTAgbWVhc3VyZW1lbnQgYnVnLlxuICAgICAgICAgICAgLy8gSGVpZ2h0IGhhcyBubyBkZWZhdWx0IHNvIGl0IGF1dG8tc2l6ZXMgdG8gY29udGVudC5cbiAgICAgICAgICAgIC8vIE9ubHkgc2l6ZU1ldGEgXCIxMDAlXCIgKGZpbGwgbW9kZSkgaXMgdHJlYXRlZCBhcyBleHBsaWNpdCBhbmQgZGlzYWJsZXMgYXV0by1zaXppbmcuXG4gICAgICAgICAgICAvLyBQaXhlbCBzaXplTWV0YSB2YWx1ZXMgKGUuZy4sIGhlaWdodDogMjAwKSBhcmUgaW5pdGlhbCBoaW50cywgTk9UIGV4cGxpY2l0IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsV2lkdGggPSB0aGlzLnNpemVNZXRhPy53aWR0aCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhRmlsbEhlaWdodCA9IHRoaXMuc2l6ZU1ldGE/LmhlaWdodCA9PT0gXCIxMDAlXCIgPyBcIjEwMCVcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRXaWR0aCA9IG9wdHM/LmV4cGxpY2l0V2lkdGggPz8gc2l6ZU1ldGFGaWxsV2lkdGggPz8gXCIxMDAlXCI7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID0gb3B0cz8uZXhwbGljaXRIZWlnaHQgPz8gc2l6ZU1ldGFGaWxsSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRXaWR0aCA9IHJlc29sdmVkRXhwbGljaXRXaWR0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRIZWlnaHQgPSByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIC8vIERldGVjdCBjb2xsYXBzZWQgZGltZW5zaW9ucyBmcm9tIGNvbnRhaW5lciAodGhpcy5jb250YWluZXIpXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRXaWR0aCA9IGNvbnRhaW5lclJlY3Qud2lkdGggPT09IDA7XG4gICAgICAgICAgICAvLyBDb25zaWRlciBjb2xsYXBzZWQgaWYgaGVpZ2h0IGlzIDAgT1IgZXF1YWxzIHRoZSBsb2FkZXIgbWluSGVpZ2h0XG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRIZWlnaHQgPSBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gMCB8fCBjb250YWluZXJSZWN0LmhlaWdodCA9PT0gbG9hZGVyTWluSGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGltZW5zaW9ucyB0byBhdXRvLXNpemU6XG4gICAgICAgICAgICAvLyAtIElmIGZvcmNlQXV0b1NpemUgaXMgdHJ1ZSwgYXV0by1zaXplIHVubGVzcyBleHBsaWNpdCBkaW1lbnNpb24gaXMgc2V0XG4gICAgICAgICAgICAvLyAtIE90aGVyd2lzZSwgYXV0by1zaXplIG9ubHkgaWYgY29sbGFwc2VkXG4gICAgICAgICAgICBjb25zdCBzaG91bGRBdXRvV2lkdGggPSBvcHRzPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRXaWR0aFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZFdpZHRoICYmICFoYXNFeHBsaWNpdFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9IZWlnaHQgPSBvcHRzPy5mb3JjZUF1dG9TaXplXG4gICAgICAgICAgICAgICAgPyAhaGFzRXhwbGljaXRIZWlnaHRcbiAgICAgICAgICAgICAgICA6IChjb2xsYXBzZWRIZWlnaHQgJiYgIWhhc0V4cGxpY2l0SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gSWYgbm90aGluZyBuZWVkcyBhdXRvLXNpemluZywgYXBwbHkgZXhwbGljaXQvcGVyY2VudGFnZSBkaW1lbnNpb25zXG4gICAgICAgICAgICBpZiAoIXNob3VsZEF1dG9XaWR0aCAmJiAhc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG5cbiAgICAgICAgICAgICAgICBvcHRzPy5vblNpemVDaGFuZ2U/Lih7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRXaWR0aCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgQ1NTIHRyYW5zaXRpb25zIG9uIGlmcmFtZSBhbmQgY29udGFpbmVyIGZvciB0aGUgZW50aXJlXG4gICAgICAgICAgICAvLyBtZWFzdXJlbWVudCArIGhlaWdodC1zZXR0aW5nIGN5Y2xlLiBIb3N0IGFwcHMgbWF5IHNldCBgdHJhbnNpdGlvbjogYWxsYFxuICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgYW5pbWF0ZSB0aGUgMHB4IGNvbGxhcHNlIGFuZCBmaW5hbCBoZWlnaHQgY2hhbmdlLCBjYXVzaW5nXG4gICAgICAgICAgICAvLyB2aXNpYmxlIGp1bXBzIGR1cmluZyBzY3JvbGwuXG4gICAgICAgICAgICBjb25zdCBwcmV2VHJhbnNpdGlvbiA9IGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q29udGFpbmVyVHJhbnNpdGlvbiA9IGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uO1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgICAgICAgLy8gUXVpY2sgcHJlLWNoZWNrOiByZWFkIHNjcm9sbEhlaWdodC9XaWR0aCBCRUZPUkUgY29sbGFwc2luZyB0aGUgaWZyYW1lLlxuICAgICAgICAgICAgLy8gSWYgY29udGVudCBvbmx5IGdyZXcgKHNjcm9sbEhlaWdodCA+IGlmcmFtZSBoZWlnaHQpLCB3ZSBjYW4gc2tpcCB0aGVcbiAgICAgICAgICAgIC8vIDBweCBjb2xsYXBzZSBcdTIwMTQgc2Nyb2xsSGVpZ2h0IG5hdHVyYWxseSBleHBhbmRzIGJleW9uZCB0aGUgaWZyYW1lLlxuICAgICAgICAgICAgY29uc3QgY3VycmVudElmcmFtZUhlaWdodCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lV2lkdGggPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICBjb25zdCBwcmVTY3JvbGxIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCBwcmVTY3JvbGxXaWR0aCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpKTtcblxuICAgICAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHByZVNjcm9sbFdpZHRoO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSBwcmVTY3JvbGxIZWlnaHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGhlaWdodEdyZXcgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIHByZVNjcm9sbEhlaWdodCA+IGN1cnJlbnRJZnJhbWVIZWlnaHQgKyAxO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGhHcmV3ID0gc2hvdWxkQXV0b1dpZHRoICYmIHByZVNjcm9sbFdpZHRoID4gY3VycmVudElmcmFtZVdpZHRoICsgMTtcblxuICAgICAgICAgICAgLy8gRm9yIG5vbi1ncm93IGNhc2VzIChzaHJpbmsgb3Igbm8tY2hhbmdlKSwgd2UgbXVzdCBjb2xsYXBzZSB0byAwcHggdG9cbiAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIHRydWUgY29udGVudCBoZWlnaHQuIHNjcm9sbEhlaWdodCBjYW4gbmV2ZXIgZGVjcmVhc2UgYmVsb3dcbiAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUncyBjbGllbnRIZWlnaHQsIHNvIHNocmluayBpcyB1bmRldGVjdGFibGUgd2l0aG91dCBjb2xsYXBzaW5nLlxuICAgICAgICAgICAgLy8gV2l0aCB0cmFuc2l0aW9ucyBkaXNhYmxlZCArIGNvbnRhaW5lciBtaW4taGVpZ2h0IGhlbGQsIHRoZSBjb2xsYXBzZVxuICAgICAgICAgICAgLy8gaXMgaW52aXNpYmxlIChubyBsYXlvdXQgc2hpZnQsIG5vIGFuaW1hdGlvbikuXG4gICAgICAgICAgICBjb25zdCBuZWVkc0hlaWdodENvbGxhcHNlID0gc2hvdWxkQXV0b0hlaWdodCAmJiAhaGVpZ2h0R3JldztcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzV2lkdGhDb2xsYXBzZSA9IHNob3VsZEF1dG9XaWR0aCAmJiAhd2lkdGhHcmV3O1xuXG4gICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSB8fCBuZWVkc1dpZHRoQ29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBIb2xkIHRoZSBjb250YWluZXIncyBtaW4taGVpZ2h0L3dpZHRoIGR1cmluZyBtZWFzdXJlbWVudCB0byBwcmV2ZW50XG4gICAgICAgICAgICAgICAgLy8gbGF5b3V0IHNoaWZ0IChlbGVtZW50cyBiZWxvdyB0aGUgaWZyYW1lIHdvbid0IGp1bXApLlxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNaW5IZWlnaHQgPSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNaW5XaWR0aCA9IGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IGAke2N1cnJlbnRJZnJhbWVIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc1dpZHRoQ29sbGFwc2UpIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IGAke2N1cnJlbnRJZnJhbWVXaWR0aH1weGA7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNIZWlnaHRDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc1dpZHRoQ29sbGFwc2UpIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcwcHgnO1xuXG4gICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogaWYgY29sbGFwc2luZyB0byAwcHggZ2F2ZSBhIG5lYXItemVybyBtZWFzdXJlbWVudCwgdGhlIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vIGxpa2VseSBoYXMgYGhlaWdodDogMTAwJWAgY2hhaW5zIChodG1sID4gYm9keSA+IC5hcHAtY29udGFpbmVyKSB0aGF0IGNhc2NhZGVkXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvbGxhcHNlIGludG8gYWxsIGNoaWxkcmVuLiBSZXRyeSB3aXRoIGEgbnVjbGVhciBvdmVycmlkZSB0aGF0IGZvcmNlcyBhbGxcbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyB0byBpbnRyaW5zaWMgc2l6aW5nLiBUaGlzIGlzIG9ubHkgYSBmYWxsYmFjayBiZWNhdXNlIHRoZSBvdmVycmlkZVxuICAgICAgICAgICAgICAgIC8vIGJyZWFrcyBleHBsaWNpdCBwaXhlbCBoZWlnaHRzIChlLmcuIDhweCBpbmRpY2F0b3IgZG90cyBcdTIxOTIgMHB4KS5cbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkc051Y2xlYXJIZWlnaHQgPSBuZWVkc0hlaWdodENvbGxhcHNlICYmIGNvbnRlbnRIZWlnaHQgPCAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhcldpZHRoID0gbmVlZHNXaWR0aENvbGxhcHNlICYmIGNvbnRlbnRXaWR0aCA8IDI7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhckhlaWdodCB8fCBuZWVkc051Y2xlYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlU3R5bGUgPSBjb250ZW50RG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS5pZCA9ICdfX215b3BfbWVhc3VyZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKCdoZWlnaHQ6IGF1dG8gIWltcG9ydGFudCcsICdtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQnLCAnbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKCd3aWR0aDogYXV0byAhaW1wb3J0YW50JywgJ21pbi13aWR0aDogMCAhaW1wb3J0YW50JywgJ21heC13aWR0aDogbm9uZSAhaW1wb3J0YW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnRleHRDb250ZW50ID0gYCosICo6OmJlZm9yZSwgKjo6YWZ0ZXIgeyAke3J1bGVzLmpvaW4oJzsgJyl9OyBmbGV4LWJhc2lzOiBhdXRvICFpbXBvcnRhbnQ7IGZsZXgtZ3JvdzogMCAhaW1wb3J0YW50OyB9YDtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERvYy5oZWFkLmFwcGVuZENoaWxkKG1lYXN1cmVTdHlsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGVudFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LnNjcm9sbEhlaWdodCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVTdHlsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGNvbnRhaW5lciBjb25zdHJhaW50cyBpbW1lZGlhdGVseSAoc2FtZSBmcmFtZSwgYmVmb3JlIHBhaW50KVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBwcmV2TWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IHByZXZNaW5XaWR0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjbGFtcChjb250ZW50V2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBjbGFtcChjb250ZW50SGVpZ2h0LCBtaW5IZWlnaHQsIG1heEhlaWdodCk7XG5cbiAgICAgICAgICAgIC8vIFNldCBhdXRvLXNpemVkIGRpbWVuc2lvbnMgdG8gbWVhc3VyZWQgdmFsdWVzLCBub24tYXV0byB0byBleHBsaWNpdC8xMDAlXG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID09PSAnbnVtYmVyJyA/IGAke3Jlc29sdmVkRXhwbGljaXRXaWR0aH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkQXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdEhlaWdodH1weGAgOiAnMTAwJSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHJlZmxvdyBzbyB0aGUgZmluYWwgZGltZW5zaW9ucyBhcmUgYXBwbGllZCB3aXRob3V0IHRyYW5zaXRpb24sXG4gICAgICAgICAgICAvLyB0aGVuIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWZyYW1lLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9IHByZXZDb250YWluZXJUcmFuc2l0aW9uO1xuXG4gICAgICAgICAgICAvLyBEb24ndCBmb3JjZSBvdmVyZmxvdyBcdTIwMTQgbGV0IHRoZSBjb21wb25lbnQvcGFyZW50IGNvbnRyb2wgc2Nyb2xsaW5nLlxuICAgICAgICAgICAgLy8gT25seSBzZXQgb3ZlcmZsb3c6IGF1dG8gd2hlbiBjb250ZW50IGV4Y2VlZHMgbWF4IGNvbnN0cmFpbnRzLlxuICAgICAgICAgICAgY29uc3QgaXNXaWR0aENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b1dpZHRoICYmIG1heFdpZHRoICE9PSB1bmRlZmluZWQgJiYgY29udGVudFdpZHRoID4gbWF4V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBpc0hlaWdodENvbnN0cmFpbmVkID0gc2hvdWxkQXV0b0hlaWdodCAmJiBtYXhIZWlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb250ZW50SGVpZ2h0ID4gbWF4SGVpZ2h0O1xuICAgICAgICAgICAgY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYID0gaXNXaWR0aENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpc0hlaWdodENvbnN0cmFpbmVkID8gJ2F1dG8nIDogJyc7XG5cbiAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ1dpZHRoOiBzaG91bGRBdXRvV2lkdGgsXG4gICAgICAgICAgICAgICAgYXV0b1NpemluZ0hlaWdodDogc2hvdWxkQXV0b0hlaWdodFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSW5pdGlhbCBzaXplIChydW4gc3luY2hyb25vdXNseSwgbm90IGRlYm91bmNlZClcbiAgICAgICAgdXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIC8vIFN0b3JlIHVwZGF0ZVNpemUgZm9yIHJlZW50cmFudCBjYWxsc1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVwZGF0ZVNpemU7XG5cbiAgICAgICAgLy8gRGVib3VuY2Ugb2JzZXJ2ZXIgY2FsbGJhY2tzIHZpYSByQUYgXHUyMDE0IGF0IG1vc3Qgb25lIHVwZGF0ZVNpemUgcGVyIGZyYW1lLlxuICAgICAgICAvLyBQcmV2ZW50cyBsYXlvdXQgdGhyYXNoaW5nIGZyb20gaGlnaC1mcmVxdWVuY3kgbXV0YXRpb25zIChlLmcuIENTUyBhbmltYXRpb25zKS5cbiAgICAgICAgbGV0IHJhZklkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJhZklkICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB1cGRhdGVTaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPYnNlcnZlIGZvciBjaGFuZ2VzXG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHNjaGVkdWxlVXBkYXRlKCkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgICAgICAvLyBNdXRhdGlvbk9ic2VydmVyIGNhdGNoZXMgRE9NIGNvbnRlbnQgY2hhbmdlcyAoZS5nLiByZW1vdmluZyBsaXN0IGl0ZW1zLCB0b2dnbGluZyB2aWV3cylcbiAgICAgICAgLy8gdGhhdCBkb24ndCB0cmlnZ2VyIFJlc2l6ZU9ic2VydmVyIGJlY2F1c2UgdGhlIGJvZHkgYm94LXNpemUgc3RheXMgdGhlIHNhbWVcbiAgICAgICAgLy8gKGJvZHkgZmlsbHMgaWZyYW1lLCBpZnJhbWUgaGFzbid0IHNocnVuayB5ZXQpLlxuICAgICAgICAvLyBgYXR0cmlidXRlczogdHJ1ZWAgY2F0Y2hlcyBDU1MgY2xhc3Mvc3R5bGUgY2hhbmdlcyAoZS5nLiBkaXNwbGF5Om5vbmUgdG9nZ2xpbmcgdmlld3MpLlxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2MuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgaWYgKHJhZklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZVVwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gY2xlYW51cDtcbiAgICAgICAgcmV0dXJuIGNsZWFudXA7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc29Nc2dIYW5kbGVyKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2lzb01zZ0hhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5faXNvTXNnSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdClcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QoKTtcblxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25lZWRzIHRvIGxvYWQgaW50byBhbiBleHNpc3RpbmcgSWZyYW1lLi4uJywgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MSUZyYW1lRWxlbWVudClcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBpZnJhbWVTdHlsZXMgPSBgXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnMTAwJScgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9O1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICBgO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gaWZyYW1lU3R5bGVzO1xuXG4gICAgICAgICAgICAvLyBTZXQgZWxlbWVudCBhdHRyaWJ1dGVzIGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLmVsZW1lbnRBdHRyaWJ1dGVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGlzc3VlIHRvIGxvYWQgaWZyYW1lIGluc2lkZSBhbiBpZnJhbWUgd2l0aCB0aGUgc2FtZSB1cmxcbiAgICAgICAgICAgIGxldCB1cmwybG9hZCA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS51cmw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHVybDJsb2FkO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wV2ViY29tcG9uZW50Q29uc3RzID0ge1xuICAgIHdlYmNvbXBvbmVudF9tZXNzYWdlX2tleTogJ215b3Bfd2ViY29tcG9uZW50X21lc3NhZ2UnXG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAnMC4zLjM0JzsiLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BFeHRyYWN0ZWRXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BFeHRyYWN0ZWRXZWJDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElIVE1MTG9hZGVyQ29uZmlnLFxuICAgIElTa2luQ29uZmlnLCBTaGFkb3dSb290TW9kZVR5cGUsXG4gICAgU2tpbkxvYWRlcnMsXG4gICAgUmVuZGVyTW9kZSwgUmVuZGVyUG9saWN5XG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbmltcG9ydCB7RU1CRURERURfU0RLX0NPTlRFTlQsIEhBU19FTUJFRERFRF9TREt9IGZyb20gXCIuLi9lbWJlZGRlZFNESy50c1wiO1xuLy9pbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSBcIi4uLy4uL1NESy50c1wiO1xuXG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSID0gJzwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPic7XG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEID0gJ215b3Atd2ViLWNvbXBvbmVudCc7XG5cbi8vIFRyYWNrIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IHNjcmlwdHMgdG8gcHJldmVudCBkb3VibGUgcmVnaXN0cmF0aW9uXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgaWYgSFRNTCBpcyBhIE15b3AgV2ViIENvbXBvbmVudCAoc3RhcnRzIHdpdGggbWFya2VyIGNvbW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBob3cgdGhpcyBjb21wb25lbnQgc2hvdWxkIHJlbmRlciwgYXBwbHlpbmcgdGhlIGhvc3QgcmVuZGVyIHBvbGljeS5cbiAgICAgKiBQcmVjZWRlbmNlOiBvcHRpb25zLnJlbmRlclBvbGljeSAocGVyLWNhbGwpIGZ1bGx5IHJlcGxhY2VzIHRoZSBnbG9iYWxcbiAgICAgKiBob3N0U0RLLnNldFJlbmRlclBvbGljeSBcdTIwMTQgc28gYW4gYXBwIGNhbiByZXN0cmljdCBnbG9iYWxseSBhbmQgYWxsb3cgc3BlY2lmaWNzLlxuICAgICAqIFdpdGggbm8gcG9saWN5IHNldCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIChtYXJrZXIgXHUyMUQyIHdlYiBjb21wb25lbnQpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlbmRlck1vZGUoXG4gICAgICAgIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgICAgICBza2luOiBJU2tpbkNvbmZpZyxcbiAgICAgICAgbG9hZGVyQ29uZmlnOiBJSFRNTExvYWRlckNvbmZpZyxcbiAgICAgICAgaXNXZWJDb21wb25lbnQ6IGJvb2xlYW4sXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLFxuICAgICk6IFByb21pc2U8eyBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2U7IGlzb2xhdGU6IGJvb2xlYW4gfT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRNb2RlOiBSZW5kZXJNb2RlID0gaXNXZWJDb21wb25lbnRcbiAgICAgICAgICAgID8gJ3dlYkNvbXBvbmVudCdcbiAgICAgICAgICAgIDogKChsb2FkZXJDb25maWcuaXNvbGF0aW9uIHx8IG9wdGlvbnM/Lmlzb2xhdGlvbikgPyAnaXNvbGF0ZWRJZnJhbWUnIDogJ2lmcmFtZScpO1xuXG4gICAgICAgIC8vIHBlci1jYWxsIHBvbGljeSB3aW5zOyBlbHNlIGdsb2JhbCBwb2xpY3kgb24gdGhlIGhvc3QgU0RLIHNpbmdsZXRvbi5cbiAgICAgICAgY29uc3QgcG9saWN5OiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyUG9saWN5ID8/ICh3aW5kb3cgYXMgYW55KT8ubXlvcD8uaG9zdFNESz8uZ2V0UmVuZGVyUG9saWN5Py4oKTtcblxuICAgICAgICBjb25zdCBtb2RlOiBSZW5kZXJNb2RlIHwgZmFsc2UgPSBwb2xpY3lcbiAgICAgICAgICAgID8gYXdhaXQgcG9saWN5KHsgY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgcmVxdWVzdGVkTW9kZSwgaXNXZWJDb21wb25lbnQgfSlcbiAgICAgICAgICAgIDogcmVxdWVzdGVkTW9kZTtcblxuICAgICAgICByZXR1cm4geyBtb2RlLCBpc29sYXRlOiBtb2RlID09PSAnaXNvbGF0ZWRJZnJhbWUnIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGluLWZyYW1lIGJyaWRnZSBmb3IgaXNvbGF0ZWQgY29tcG9uZW50cy4gUnVucyBpbnNpZGUgdGhlIHNhbmRib3hlZFxuICAgICAqIChvcGFxdWUtb3JpZ2luKSBpZnJhbWUsIHRyYW5zbGF0aW5nIHRoZSBzYW1lIGF1dGhvci1mYWNpbmcgY29udHJhY3QgdG8vZnJvbVxuICAgICAqIHBvc3RNZXNzYWdlIHNpbmNlIHRoZSBob3N0IGhhcyBubyBzYW1lLW9yaWdpbiBhY2Nlc3M6XG4gICAgICogICBcdTIwMjIgZGF0YS1pbiA6IHBhcmVudCBwb3N0cyB7dHlwZTonbXlvcDppbml0J30gXHUyMTkyIGNhbGxzIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlXG4gICAgICogICAgICAgICAgICAgICAocGx1cyBhIGJha2VkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBmaXJzdCByZW5kZXIpXG4gICAgICogICBcdTIwMjIgZGF0YS1vdXQ6IHdpbmRvdy5teW9wX2N0YV9oYW5kbGVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6Y3RhJ30pXG4gICAgICogICBcdTIwMjIgcmVzaXplICA6IFJlc2l6ZU9ic2VydmVyIFx1MjE5MiBwYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6J215b3A6c2l6ZSd9KVxuICAgICAqXG4gICAgICogVE9ETyhkZXYtZXh0ZW5zaW9uKTogdGhlIGlzb2xhdGVkIHBhdGggZGVsaWJlcmF0ZWx5IHNraXBzIHRoZSBzYW1lLW9yaWdpblxuICAgICAqIGRhdGFTY3JpcHQsIHNvIGl0IG5ldmVyIHBvc3RzIHRoZSBgTVlPUF9QUkVJTkpFQ1RFRF9JTklUYCBtZXNzYWdlIHRoZSBNeW9wIGRldlxuICAgICAqIGV4dGVuc2lvbiBsaXN0ZW5zIGZvciB0byBsb2cgdGhlIElOSVRJQUwgcmVuZGVyIChgaW5pdCpgKS4gTGF0ZXIgaW5pdCB1cGRhdGVzIGFuZFxuICAgICAqIGFsbCBDVEFzIGFyZSBzdGlsbCB0cmFja2VkICh0aGUgZXh0ZW5zaW9uIHdyYXBzIGBjb21wLnByb3BzYCwgd2hpY2ggb3VyIGlzb2xhdGVkXG4gICAgICogY29ubmVjdFByb3BzIGJyYW5jaCByb3V0ZXMgdGhyb3VnaCksIHNvIG9ubHkgdGhlIGZpcnN0LXJlbmRlciBwYXlsb2FkIGlzIG1pc3NpbmdcbiAgICAgKiBmcm9tIHRoZSBleHRlbnNpb24ncyBhY3Rpdml0eSBsb2cgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIENsb3NpbmcgdGhpcyB3b3VsZCBiZSBhXG4gICAgICogfjEtbGluZSBgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidNWU9QX1BSRUlOSkVDVEVEX0lOSVQnLCBwYXlsb2FkOntkYXRhfX0pYCBpbnNpZGVcbiAgICAgKiBmbHVzaEluaXRpYWwoKSBiZWxvdyBcdTIwMTQgaW50ZW50aW9uYWxseSBOT1QgZG9uZSBmb3Igbm93IHRvIGF2b2lkIGFkZGluZyBleHRlbnNpb24tb25seVxuICAgICAqIHRyYWZmaWMgdG8gdGhlIGNvbXBvbmVudCBydW50aW1lLiBXZWIgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lIGluaXRpYWwtaW5pdCBnYXBcbiAgICAgKiAoaW5pdFdpdGhEYXRhIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudCwgbm90IHZpYSBjb21wLnByb3BzKSBhbmQgaXQgcHJlZGF0ZXMgdGhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSXNvbGF0aW9uQnJpZGdlKGluaXRpYWxEYXRhTGl0ZXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGA8c2NyaXB0PlxuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX19pbml0aWFsID0gJHtpbml0aWFsRGF0YUxpdGVyYWx9O1xuICAgICAgICAgICAgICAgIHZhciBfX3BlbmRpbmc7XG4gICAgICAgICAgICAgICAgLy8gZGF0YS1vdXQgKGN0YSlcbiAgICAgICAgICAgICAgICB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciA9IGZ1bmN0aW9uIChhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50LnBvc3RNZXNzYWdlKHsgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpjdGEnLCBhY3Rpb246IGFjdGlvbiwgcGF5bG9hZDogcGF5bG9hZCB9LCAnKicpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbEluaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7IHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlKGRhdGEpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRhdGEtaW4gKGluaXQgdXBkYXRlcylcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgZC5fX215b3AgIT09IHRydWUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PT0gJ215b3A6aW5pdCcpIHsgaWYgKCFjYWxsSW5pdChkLmRhdGEpKSBfX3BlbmRpbmcgPSBkLmRhdGE7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBmaXJzdCByZW5kZXI6IHVzZSBhIHBlbmRpbmcgdXBkYXRlIGlmIG9uZSBhcnJpdmVkLCBlbHNlIHRoZSBiYWtlZCBpbml0aWFsIGRhdGFcbiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gZmx1c2hJbml0aWFsKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IChfX3BlbmRpbmcgIT09IHVuZGVmaW5lZCkgPyBfX3BlbmRpbmcgOiBfX2luaXRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxJbml0KGRhdGEpKSB7IF9fcGVuZGluZyA9IHVuZGVmaW5lZDsgX19pbml0aWFsID0gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoSW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgKHJlcG9ydCBjb250ZW50IHNpemUpXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aGUgQk9EWSAoY29udGVudCBib3gpLiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgXHUyMDE0IHdoaWNoIHdlJ3JlIGRyaXZpbmcgXHUyMDE0IHNvIGl0IHdvdWxkIHJlcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBoZWlnaHQsIG5vdCB0aGUgY29udGVudCwgYW5kIG5ldmVyIHNocmluay5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYikgcmV0dXJuIE1hdGgubWF4KGIuc2Nyb2xsSGVpZ2h0LCBiLm9mZnNldEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwb3N0U2l6ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19teW9wOiB0cnVlLCB0eXBlOiAnbXlvcDpzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIHRoZSBCT0RZIChyZWZsb3dzIHdpdGggY29udGVudCkgXHUyMDE0IG5vdCBkb2N1bWVudEVsZW1lbnQsIHdob3NlIGJveCBpc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpZnJhbWUgdmlld3BvcnQgYW5kIHdvdWxkIGZlZWQgYmFjayBpbnRvIGEgcmVzaXplIGxvb3AuIEEgTXV0YXRpb25PYnNlcnZlclxuICAgICAgICAgICAgICAgIC8vIGNhdGNoZXMgY29udGVudCBzd2FwcyAoZS5nLiBpbm5lckhUTUwgcmUtcmVuZGVyKSB0aGF0IGRvbid0IGNoYW5nZSBib2R5J3MgYm94LlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdmFyIF9fcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocG9zdFNpemUpOyBpZiAoZG9jdW1lbnQuYm9keSkgX19yby5vYnNlcnZlKGRvY3VtZW50LmJvZHkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBuZXcgTXV0YXRpb25PYnNlcnZlcihwb3N0U2l6ZSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwb3N0U2l6ZSk7XG4gICAgICAgICAgICAgICAgcG9zdFNpemUoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIDwvc2NyaXB0PmA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudFxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGVjdXRlZCAoYnkgc2NyaXB0IGNvbnRlbnQgaGFzaClcbiAgICAgICAgaWYgKGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuaGFzKHNjcmlwdElkKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHNraXBwaW5nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0Q29udGVudDtcbiAgICAgICAgc2NyaXB0LmlkID0gYG15b3AtZXh0cmFjdGVkLSR7c2NyaXB0SWR9YDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuYWRkKHNjcmlwdElkKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBFeGVjdXRlZCB3ZWIgY29tcG9uZW50IHNjcmlwdDogJHtzY3JpcHRJZH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgYW5kIHJ1biBvbiBob3N0IGRvY3VtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBodG1sOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKTogUHJvbWlzZTxNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSB0aGlzLmV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbCk7XG5cbiAgICAgICAgaWYgKCFzY3JpcHRDb250ZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBObyA8c2NyaXB0IGlkPVwibXlvcC13ZWItY29tcG9uZW50XCI+IGZvdW5kIGluIEhUTUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBjb21wb25lbnQgZGVmaW5pdGlvbiBpZCBhcyBzY3JpcHQgaWRlbnRpZmllciBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgICBjb25zdCBzY3JpcHRJZCA9IGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9LSR7c2tpbi5pZH1gO1xuXG4gICAgICAgIC8vIFN0b3JlIF9fTVlPUF9UQUdfTkFNRV9fIGJlZm9yZSBleGVjdXRpb24gdG8gY2FwdHVyZSBpdFxuICAgICAgICBjb25zdCBwcmV2aW91c1RhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50XG4gICAgICAgIHRoaXMuZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50LCBzY3JpcHRJZCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB0YWcgbmFtZSB0aGF0IHdhcyBzZXQgYnkgdGhlIHNjcmlwdFxuICAgICAgICBjb25zdCB0YWdOYW1lID0gKHdpbmRvdyBhcyBhbnkpLl9fTVlPUF9UQUdfTkFNRV9fO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyB0YWcgbmFtZSBpZiB0aGlzIHdhcyBhIHJlLXJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAocHJldmlvdXNUYWdOYW1lICYmIHByZXZpb3VzVGFnTmFtZSAhPT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTXlvcFdlYkNvbXBvbmVudF0gX19NWU9QX1RBR19OQU1FX18gY2hhbmdlZCBmcm9tICR7cHJldmlvdXNUYWdOYW1lfSB0byAke3RhZ05hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWA7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/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/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLnRzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSByZWYgaGVscGVyIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGl0IHRvIHBhc3MgdGhlIGFzc2lnbmVkIGlkc1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlZkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gcmVmQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKCk7XG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgIi8vIEB0cy1ub2NoZWNrXG5leHBvcnQgY29uc3Qgb2JzZXJ2ZURPTSA9IChvYmo6IEhUTUxFbGVtZW50IHwgbnVsbCwgY2FsbGJhY2s6IChtdXRhdGlvblJlY29yZHM/OiBNdXRhdGlvblJlY29yZFtdKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgY29uc29sZS5sb2coJ24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgTXV0YXRpb25PYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgaWYgKCFvYmogfHwgb2JqLm5vZGVUeXBlICE9PSAxKSByZXR1cm47XG5cbiAgICBpZiAoTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXJcbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKVxuICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvciBjaGFuZ2VzIGluIGNoaWxkcmVuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9O1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JqLCBjb25maWcpXG4gICAgICAgIHJldHVybiBtdXRhdGlvbk9ic2VydmVyXG4gICAgfVxuXG4gICAgLy8gYnJvd3NlciBzdXBwb3J0IGZhbGxiYWNrXG4gICAgZWxzZSBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVSZW1vdmVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtvYnNlcnZlRE9NfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL2RvbU9ic2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZURPTShkb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICAgIC8vICBuZXcgRW52ZWxvcGVkTWVzc2FnZShldmVudC5zb3VyY2UhLCBuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gfHwgIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUgfHwgbm9kZURhdGEudmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGdldElucHV0VmFsdWUoaXRlbSlcbiAgICAgICAgICAgICksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVNZXNzYWdlLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0Rmlyc3RFbGVtZW50QnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnZXRGaXJzdEVsZW1lbnRCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KVxuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKGl0ZW0uZ2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUpKSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7UmVzaXplT2JzZXJ2ZXJNZXNzYWdlLCBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2V9IGZyb20gJy4uLy4uL21lc3NhZ2VzJ1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogcGFzcyB0aGUgaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRJbm5lckh0bWwpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gKiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gKiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuICpcbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge0lmcmFtZVNES30gZnJvbSAnQG15b3Avc2RrL2lmcmFtZSc7XG4gYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlclwiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElmcmFtZVNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHdpbmRvdy5teW9wID0ge31cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESyA9IHRoaXM7XG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRzKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChyZXBsYXlUbz8ucm91dGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCB0aGF0IGluaXRpYXRlZCB0aGF0IGN5Y2xlXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHJlcGxheVRvLnJvdXRlW3JlcGxheVRvLnJvdXRlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gY29tcG9uZW50SWRzWzBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gY29tcG9uZW50SWRzWzBdO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuXG4gICAgICAgIHdpbmRvdy5wYXJlbnQ/LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2VcbiAgICAgICAgfSwgJyonKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcblxuICAgICAgICAvL2NvbXBvc2l0ZSBzdXBwb3J0IG1lc3NhZ2VzIDpcbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdClcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5vbm1lc3NhZ2UgPSB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgIH1cblxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdJZnJhbWVTREsnLCBJZnJhbWVTREspO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCTyxJQUFNLGlCQUFOLE1BQTRDO0FBQUEsRUFDL0MsWUFBbUIsUUFDQSxhQUNBLGNBQ0EsV0FDQSxZQUFxQjtBQUpyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSW5CLHdCQUFnQixRQUFlO0FBQUEsRUFGL0I7QUFHSjs7O0FDekJPLElBQU0scUJBQXFCLENBQU8sU0FBa0M7QUFDdkUsTUFBSSxPQUFPLFNBQVMsWUFBWTtBQUU1QixTQUFLO0FBQUEsRUFDVCxXQUFXLGdCQUFnQixTQUFTO0FBRWhDLFVBQU0sU0FBUyxNQUFNO0FBRXJCLFFBQUksT0FBTyxXQUFXLFlBQVk7QUFFOUIsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBRUo7QUFZTyxJQUFlLHFCQUFmLE1BQWlHO0FBQUE7QUFBQSxFQUlwRyxZQUFtQixlQUFxRjtBQUFyRjtBQUFBLEVBRW5CO0FBSUo7QUFFTyxJQUFlLDRCQUFmLGNBQTJGLG1CQUFzQjtBQUFBLEVBQ3BILFlBQW1CLGVBQTRGLFNBQWE7QUFDeEgsVUFBTSxhQUFhO0FBREo7QUFBNEY7QUFBQSxFQUUvRztBQUNKOzs7QUM1Q08sSUFBTSxlQUFlO0FBQUE7QUFBQSxFQUV4QixlQUFlO0FBQUEsRUFDZixnQkFBZ0I7QUFBQSxFQUNoQixlQUFlO0FBQUEsRUFDZixrQkFBa0I7QUFBQSxFQUVsQixxQkFBcUI7QUFBQSxFQUNyQixvQkFBb0I7QUFBQSxFQUNwQix5QkFBeUI7QUFBQSxFQUV6Qix3QkFBd0I7QUFBQSxFQUV4QiwyQkFBMkI7QUFBQSxFQUMzQix1QkFBdUI7QUFBQSxFQUV2Qiw2QkFBNkI7QUFBQSxFQUM3QixvQkFBb0I7QUFBQSxFQUVwQiwwQkFBMEI7QUFBQSxFQUMxQix1QkFBdUI7QUFBQSxFQUV2QixnQkFBZ0I7QUFBQTtBQUFBLEVBR2hCLDBCQUEwQjtBQUFBLEVBQzFCLDhCQUE4QjtBQUFBLEVBQzlCLDRCQUE0QjtBQUFBLEVBRTVCLGtCQUFrQjtBQUFBO0FBQUEsRUFHbEIsSUFBSTtBQUFBLElBQ0EsMkJBQTJCO0FBQUEsSUFDM0Isc0JBQXNCO0FBQUEsSUFDdEIsNkJBQTZCO0FBQUEsSUFFN0IsZ0NBQWdDO0FBQUEsSUFDaEMsNkJBQTZCO0FBQUEsSUFFN0IsNkJBQTZCO0FBQUEsSUFDN0IsOEJBQThCO0FBQUEsSUFDOUIsb0JBQW9CO0FBQUEsSUFFcEIsMkJBQTJCO0FBQUEsSUFDM0Isd0JBQXdCO0FBQUEsSUFDeEIseUJBQXlCO0FBQUEsRUFDN0I7QUFDSjs7O0FDcERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNHTyxJQUFNLFNBQVMsTUFBTTtBQUN4QixTQUFPLHVDQUF1QztBQUFBLElBQVE7QUFBQSxJQUFVLFFBQzNELENBQUMsSUFBSSxPQUFPLGdCQUFnQixJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxFQUFFO0FBQUEsRUFDbEY7QUFDSjtBQVVPLElBQU0sY0FBYyxDQUFDLFVBQThCO0FBQ3RELFFBQU0sTUFBTSxDQUFDLEdBQUcsS0FBSyxFQUFFLElBQUksT0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDeEUsU0FBTztBQUFBLElBQ0gsSUFBSSxNQUFNLEdBQUcsQ0FBQztBQUFBLElBQ2QsSUFBSSxNQUFNLEdBQUcsRUFBRTtBQUFBLElBQ2YsSUFBSSxNQUFNLElBQUksRUFBRTtBQUFBLElBQ2hCLElBQUksTUFBTSxJQUFJLEVBQUU7QUFBQSxJQUNoQixJQUFJLE1BQU0sRUFBRTtBQUFBLEVBQ2hCLEVBQUUsS0FBSyxHQUFHO0FBQ2Q7QUFTTyxJQUFNLGtCQUFrQixDQUFDLFFBQTRCO0FBQ3hELE1BQUksU0FBUyxJQUFJLFFBQVEsTUFBTSxHQUFHLEVBQUUsUUFBUSxNQUFNLEdBQUc7QUFDckQsU0FBTyxPQUFPLFNBQVMsRUFBRyxXQUFVO0FBQ3BDLFFBQU0sU0FBUyxLQUFLLE1BQU07QUFDMUIsU0FBTyxXQUFXLEtBQUssUUFBUSxVQUFRLEtBQUssV0FBVyxDQUFDLENBQUM7QUFDN0Q7QUFTTyxJQUFNLGtCQUFrQixDQUFDLFlBQThCO0FBQzFELFFBQU0sUUFBUSxnQkFBZ0IsT0FBTztBQUNyQyxNQUFJLE1BQU0sU0FBUyxPQUFPLEVBQUcsT0FBTSxJQUFJLE1BQU0sc0JBQXNCO0FBRW5FLFFBQU0sUUFBa0IsQ0FBQztBQUN6QixXQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLLElBQUk7QUFDdkMsVUFBTSxLQUFLLFlBQVksTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUFBLEVBQ2xEO0FBQ0EsU0FBTztBQUNYOzs7QUN4RE8sSUFBTSxPQUFPLENBQUMsT0FBZTtBQUNoQyxTQUFPLElBQUksUUFBUSxhQUFXLFdBQVcsU0FBUyxFQUFFLENBQUM7QUFDekQ7OztBQ0NPLElBQU0sbUJBQU4sTUFBdUI7QUFHOUI7QUFGSSxjQURTLGtCQUNGLFFBQU87QUFDZCxjQUZTLGtCQUVGLE1BQUs7QUFLVCxJQUFlLGtCQUFmLE1BQXdDO0FBQUEsRUFXM0MsY0FBYztBQVZkLDhCQUFLLE9BQU87QUFjWixnQ0FBTztBQUlQO0FBR0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUEscUNBQXFCO0FBQUEsRUFsQnJCO0FBQUEsRUFWQSxPQUFPLFVBRUEsTUFDc0I7QUFFekIsV0FBTyxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQUEsRUFDM0I7QUFBQSxFQXdCQSxTQUFTLEtBQStCO0FBQ3BDLFdBQU8sSUFBSSxnQkFBZ0IsS0FBSztBQUFBLEVBQ3BDO0FBQ0o7QUFFTyxJQUFlLHFCQUFmLGNBQW1ELGdCQUFtQjtBQUFBLEVBQ3pFLFlBQW1CLEtBQVU7QUFDekIsVUFBTTtBQURTO0FBQUEsRUFFbkI7QUFDSjtBQUVPLElBQWUsd0JBQWYsY0FBc0QsZ0JBQW1CO0FBQUEsRUFDNUUsWUFBbUIsaUJBQTBCO0FBQ3pDLFVBQU07QUFEUztBQUFBLEVBRW5CO0FBQ0o7QUFFTyxJQUFlLGtCQUFmLGNBQXVGLGdCQUFtQjtBQUFBLEVBTTdHLFlBQW1CLFNBQStCO0FBQzlDLFVBQU07QUFEUztBQUZuQix3QkFBTyxtQkFBa0IsT0FBTztBQUFBLEVBSWhDO0FBQ0o7QUFFTyxJQUFNLE1BQU4sTUFBTSxLQUFJO0FBQUEsRUFzQmIsWUFBbUIsV0FBOEIsV0FBNEI7QUFBMUQ7QUFBOEI7QUFyQmpELHdCQUFPLFFBQU87QUFFZCx3QkFBTztBQW9CSCxTQUFLLGVBQWUsaUNBQ2IsT0FEYTtBQUFBLE1BRWhCLFdBQVc7QUFBQTtBQUFBLElBQ2Y7QUFBQSxFQUNKO0FBQUEsRUF0QkEsT0FBTyxPQUFPLFVBQWtCLFdBQXdCLFdBQTRCO0FBQ2hGLFFBQUksYUFBYTtBQUNqQixRQUFJLENBQUMsWUFBWTtBQUNiLG1CQUFhO0FBQUEsUUFDVCxJQUFJO0FBQUEsUUFDSixNQUFNO0FBQUEsUUFDTixhQUFhO0FBQUEsUUFDYixjQUFjO0FBQUEsUUFDZDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1Y7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLFdBQU8sSUFBSSxLQUFJLFlBQVksU0FBUztBQUFBLEVBQ3hDO0FBUUo7OztBQ2xHQSxJQUFNLG1CQUFtQjtBQUVsQixJQUFNLG1CQUFOLGNBQStCLGdCQUEwQztBQUFBLEVBSzVFLFlBQW1CLEtBQVUsU0FBZ0Q7QUFDekUsVUFBTSxPQUFPO0FBREU7QUFKbkIsMkNBQWtDO0FBQ2xDLHVDQUFjO0FBQ2QscUNBQVk7QUFBQSxFQUlaO0FBQ0o7QUFFTyxJQUFNLHFCQUFOLGNBQWlDLHNCQUFzQjtBQUFBLEVBQXZEO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCOzs7QUNmTyxJQUFNLG9CQUFOLGNBQWdDLGdCQUF3QjtBQUFBLEVBSTNELFlBQW1CLEtBQVUsTUFBYztBQUN2QyxVQUFNO0FBRFM7QUFGbkIsdUNBQWM7QUFJVixTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUNKOzs7QUNMQSxJQUFNQSxvQkFBbUI7QUFFekIsSUFBTSxvQkFBb0I7QUFDMUIsSUFBTSxzQkFBc0I7QUFFckIsSUFBTSxnQkFBZ0IsQ0FBQyxZQUFvQjtBQUM5QyxNQUFJLFFBQVEsUUFBUSxNQUFNLGlCQUFpQjtBQUMzQyxNQUFJLE9BQU87QUFDUCxXQUFPLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQzlCLE9BQU87QUFDSCxRQUFJQyxTQUFRLFFBQVEsTUFBTSxtQkFBbUI7QUFDN0MsUUFBSUE7QUFDQSxhQUFPQSxPQUFNLENBQUMsRUFBRSxLQUFLO0FBQUEsRUFDN0I7QUFDSjtBQWlCTyxJQUFNLHVCQUFOLGNBQTBFLGdCQUFzRDtBQUFBLEVBU25JLFlBQVksUUFBK0MsVUFBMkQsTUFBTTtBQUFBLEVBQzVILEdBQVVDLGVBQWtCO0FBQ3hCLFVBQU0sT0FBTztBQURQLHdCQUFBQTtBQVJWLDJDQUFrQ0Y7QUFDbEMsdUNBQWM7QUFDZCxrQ0FBaUI7QUFRYixTQUFLLFNBQVMsT0FBTyxTQUFTO0FBRzlCLFNBQUssVUFBVSxPQUFPLFNBQVM7QUFDL0IsU0FBSyxVQUFVLGNBQWMsS0FBSyxPQUFPO0FBQUEsRUFDN0M7QUFDSjtBQVpJLGNBTlMsc0JBTUYsY0FBYTtBQUNwQixjQVBTLHNCQU9GLHFCQUFvQjtBQWF4QixJQUFNLDRCQUFOLGNBQWlELHNCQUF5QjtBQUFBLEVBSTdFLFlBQW1CLGlCQUFnQyxTQUFZO0FBQzNELFVBQU0sZUFBZTtBQUROO0FBQWdDO0FBRm5ELHVDQUFjQTtBQUFBLEVBSWQ7QUFDSjs7O0FDakRPLElBQU0sbUJBQU4sY0FBd0YscUJBQW1EO0FBQUEsRUFFOUksWUFBWSxRQUNPRyxlQUNQLFVBQTJELE1BQU07QUFBQSxFQUNqRSxHQUFHO0FBSVgsVUFBTSxDQUFDLEVBQUMsU0FBUyxXQUFXLFNBQVMsZUFBYyxNQUFNO0FBQ3JELFlBQU0sUUFBUSxRQUFRLGNBQWMsUUFBUSxXQUFXLGlCQUFpQixJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUk7QUFDdkcsVUFBSSxLQUFLLFFBQVE7QUFPYix1QkFBZSxNQUFNLEtBQUssQ0FBQztBQUUzQixjQUFNLGtCQUFrQixJQUFJLFNBQVMsV0FBVyxPQUFPLGlCQUFpQjtBQUN4RSxlQUFPLGdCQUFnQixjQUFjO0FBQUEsTUFJekM7QUFDQSxhQUFPO0FBQUEsSUFDWCxHQUFHLE9BQU87QUF4Qkssd0JBQUFBO0FBMEJmLFNBQUssZUFBZSxpQ0FDYkEsZ0JBRGE7QUFBQTtBQUFBLE1BR2hCLFNBQVMsT0FBTyxTQUFTO0FBQUEsSUFDN0I7QUFBQSxFQUNKO0FBQ0o7OztBQzdDQSxJQUFNQyxvQkFBbUI7QUFFbEIsSUFBTSwwQkFBTixjQUF1RyxnQkFBZ0I7QUFBQTtBQUFBLEVBTzFILFlBQW1CLEtBQWlCLE1BQWdCLFNBQTBEO0FBQzFHLFVBQU0sT0FBTztBQURFO0FBQWlCO0FBQWdCO0FBTHBELDJDQUFrQ0E7QUFDbEMsdUNBQWM7QUFDZCxxQ0FBWTtBQUNaLGdEQUFxRTtBQUFBLEVBSXJFO0FBQUEsRUFFQSx5QkFBeUIsc0JBQW9FO0FBQ3pGLFNBQUssdUJBQXVCO0FBQzVCLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFFTyxJQUFNLCtCQUFOLGNBQTJDLHNCQUFzQjtBQUFBLEVBR3BFLFlBQW1CLGlCQUFnQyxHQUF3QjtBQUN2RSxVQUFNLGVBQWU7QUFETjtBQUFnQztBQUZuRCx1Q0FBY0E7QUFJVixTQUFLLFVBQVU7QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDSjs7O0FDN0JPLElBQU0sc0JBQU4sY0FBa0MsZ0JBQWdCO0FBQUEsRUFJckQsWUFBbUIsS0FBaUIsTUFBcUIsT0FBZTtBQUNwRSxVQUFNO0FBRFM7QUFBaUI7QUFBcUI7QUFGekQsdUNBQWM7QUFBQSxFQUlkO0FBQ0o7OztBQ05BLElBQU1DLG9CQUFtQjtBQUVsQixJQUFNLHlCQUFOLGNBQXFDLGdCQUFpRDtBQUFBLEVBSXpGLFlBQW1CLEtBQVUsU0FBdUQ7QUFDaEYsVUFBTSxPQUFPO0FBREU7QUFIbkIsMkNBQWtDQTtBQUNsQyx1Q0FBYztBQUFBLEVBSWQ7QUFDSjtBQWtCTyxJQUFNLDRCQUFOLGNBQXdDLHNCQUFzQjtBQUFBLEVBR2pFLFlBQW1CLFNBQTRCO0FBQzNDLFVBQU07QUFEUztBQUZuQix1Q0FBY0E7QUFBQSxFQUlkO0FBQ0o7OztBQ25DTyxJQUFNLGVBQU4sY0FBMkIsZ0JBQXdCO0FBQUEsRUFJdEQsWUFBbUIsS0FBVSxXQUFtQjtBQUM1QyxVQUFNO0FBRFM7QUFGbkIsdUNBQWM7QUFJVixTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUNKOzs7QUNQTyxJQUFNLGNBQU4sY0FBMEIsZ0JBQWdDO0FBQUEsRUFHN0QsWUFBWSxJQUFZO0FBQ3BCLFVBQU07QUFIVix1Q0FBYztBQUlWLFNBQUssVUFBVSxFQUFFLEdBQUc7QUFBQSxFQUN4QjtBQUFBLEVBRUEsU0FBUyxLQUErQjtBQUNwQyxXQUFPLElBQUksZ0JBQWdCLEtBQUs7QUFBQSxFQUNwQztBQUNKO0FBR08sSUFBTSxlQUFOLGNBQTJCLFlBQVk7QUFBQSxFQUF2QztBQUFBO0FBQ0gsdUNBQWM7QUFBQTtBQUNsQjtBQUdPLElBQU0sY0FBTixjQUEwQixnQkFBZ0I7QUFBQSxFQUExQztBQUFBO0FBQ0gsdUNBQWM7QUFBQTtBQUNsQjs7O0FDbkJBLElBQU1DLG9CQUFtQjtBQUVsQixJQUFNLDRCQUFOLGNBQXdDLGdCQUFrRDtBQUFBLEVBSTdGLFlBQW1CLFdBQ0EsdUJBQ0EsU0FDUCxTQUNWO0FBQ0UsVUFBTSxPQUFPO0FBTEU7QUFDQTtBQUNBO0FBTG5CLDJDQUFrQ0E7QUFDbEMsdUNBQWM7QUFBQSxFQVNkO0FBQ0o7QUFPTyxJQUFNLDZCQUFOLGNBQXlDLHNCQUFzQjtBQUFBLEVBR2xFLFlBQW1CLGlCQUFnQyxZQUFnQyxRQUFrQjtBQUNqRyxVQUFNLGVBQWU7QUFETjtBQUFnQztBQUFnQztBQUZuRix1Q0FBY0E7QUFBQSxFQUlkO0FBQ0o7OztBQzlCTyxJQUFNLG1CQUFOLGNBQStCLGdCQUFnQjtBQUFBLEVBR2xELFlBQW1CLGFBQTRCLFNBQTBCO0FBQ3JFLFVBQU07QUFEUztBQUE0QjtBQUYvQyx1Q0FBYztBQUtWLFVBQU0sd0JBQXlCO0FBQy9CLFNBQUssUUFBUSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsUUFBUSxzQkFBc0IsUUFBUSxDQUFDLENBQUM7QUFBQSxFQUNoRztBQUNKOzs7QUNSQSxJQUFNQyxvQkFBbUI7QUFFbEIsSUFBTSx3QkFBTixjQUFvQyxnQkFBOEM7QUFBQSxFQUFsRjtBQUFBO0FBQ0gsdUNBQWM7QUFDZCwyQ0FBa0JBO0FBQUE7QUFDdEI7QUFFTyxJQUFNLDBCQUFOLGNBQXNDLHNCQUFxQztBQUFBLEVBSTlFLFlBQW1CLGlCQUF5QixpQkFBZ0M7QUFDeEUsVUFBTSxlQUFlO0FBRE47QUFGbkIsdUNBQWNBO0FBSVYsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUVBLFNBQVMsS0FBb0M7QUFDekMsV0FBTyxJQUFJLGdCQUFnQixLQUFLO0FBQUEsRUFDcEM7QUFDSjs7O0FDbkJBLElBQU1DLG9CQUFtQjtBQUVsQixJQUFNLHNCQUFOLGNBQWtDLGdCQUFpRDtBQUFBLEVBSXRGLFlBQW1CLEtBQWlCLE1BQWMsU0FBdUQ7QUFDckcsVUFBTSxPQUFPO0FBREU7QUFBaUI7QUFIcEMsMkNBQWtDQTtBQUNsQyx1Q0FBYztBQUFBLEVBSWQ7QUFDSjtBQUVPLElBQU0sNEJBQU4sY0FBd0Msc0JBQXNCO0FBQUEsRUFHakUsWUFBbUIsU0FBd0I7QUFDdkMsVUFBTTtBQURTO0FBRm5CLHVDQUFjQTtBQUFBLEVBSWQ7QUFDSjs7O0FDUk8sSUFBTSx5QkFBTixjQUFxQyxnQkFBZ0I7QUFBQSxFQUd4RCxZQUFtQixRQUFzQztBQUNyRCxVQUFNO0FBRFM7QUFGbkIsdUNBQWM7QUFBQSxFQUlkO0FBQ0o7OztBQ2hCTyxJQUFNLDZCQUFOLGNBQXlDLGdCQUFnQjtBQUFBLEVBQXpEO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCO0FBRU8sSUFBTSwwQkFBTixjQUFzQyxnQkFBZ0I7QUFBQSxFQUF0RDtBQUFBO0FBQ0gsdUNBQWM7QUFBQTtBQUNsQjs7O0FDTEEsSUFBTUMsb0JBQW1CO0FBRWxCLElBQU0saUJBQU4sY0FBNkIsZ0JBQTRDO0FBQUEsRUFJNUUsWUFBbUIscUJBQTZCLFNBQWtEO0FBQzlGLFVBQU0sT0FBTztBQURFO0FBSG5CLDJDQUFrQ0E7QUFDbEMsdUNBQWM7QUFBQSxFQUlkO0FBQ0o7QUFFTyxJQUFNLHVCQUFOLGNBQW1DLHNCQUFzQjtBQUFBLEVBRzVELFlBQW1CLGVBQXdCO0FBQ3ZDLFVBQU07QUFEUztBQUZuQix1Q0FBY0E7QUFBQSxFQUlkO0FBQ0o7OztBQ2xCTyxJQUFNLGlCQUFOLGNBQTZCLGdCQUFnQjtBQUFBLEVBQTdDO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCOzs7QUNGTyxJQUFNLDJCQUFOLGNBQXVDLGdCQUFnQjtBQUFBLEVBQXZEO0FBQUE7QUFDSCxxQ0FBWTtBQUNaLHVDQUFjO0FBQUE7QUFDbEI7QUFFTyxJQUFNLHdCQUFOLGNBQW9DLGdCQUFnQjtBQUFBLEVBQXBEO0FBQUE7QUFDSCx1Q0FBYztBQUFBO0FBQ2xCOzs7QUNHTyxJQUFNLGtCQUFOLE1BQStCO0FBQUE7QUFBQSxFQU9sQyxZQUFtQixJQUFtQixTQUFhO0FBQWhDO0FBQW1CO0FBTnRDLGdDQUFPLENBQUMsWUFBNkI7QUFBQSxJQUVyQztBQUFBLEVBTUE7QUFDSjtBQW9CTyxJQUFlLGNBQWYsTUFBK0M7QUFBQSxFQUEvQztBQU1ILG9EQUE4QyxDQUFDO0FBRS9DLHNDQUE4QyxDQUFDO0FBRS9DLHFEQUFxQztBQUVyQywrQ0FBZ0csQ0FBQztBQUFBO0FBQUEsRUFFakcscUJBQXFCLE9BQVk7QUFDN0IsVUFBTSxlQUFlLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTTtBQUVyRCxRQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxNQUFNO0FBRXJDO0FBQUEsSUFDSixPQUFPO0FBQ0gsVUFBSSxVQUFVO0FBRWQsVUFBSSxRQUFRLGNBQWMsaUJBQWlCLE1BQU07QUFFN0M7QUFBQSxNQUNKO0FBU0EsVUFBSSxRQUFRLGdCQUFnQixhQUFhLGdCQUFnQjtBQUlyRCxZQUFJLFFBQVE7QUFDUixpQkFBTyxLQUFLLFdBQVcsUUFBUSxXQUFXO0FBQzlDO0FBQUEsTUFDSjtBQUdBLFVBQUksUUFBUSxnQkFBZ0IsYUFBYSxhQUFhO0FBR2xELGNBQU0saUJBQWtCLFFBQXdCLFFBQVE7QUFFeEQsWUFBSSxLQUFLLFdBQVcsY0FBYyxHQUFHO0FBR2pDO0FBQUEsUUFDSjtBQUVBLGFBQUssV0FBVyxjQUFjLElBQUksSUFBSSxnQkFBZ0IsY0FBYztBQUNwRSxhQUFLLGNBQWMsSUFBSSxhQUFhLGNBQWMsQ0FBQztBQUduRDtBQUFBLE1BQ0o7QUFJQSxVQUFJLFFBQVEsZ0JBQWdCLGFBQWEsa0JBQWtCO0FBQ3ZELGNBQU0sbUJBQW9CO0FBQzFCLGNBQU0sZUFBZSxpQkFBaUI7QUFDdEMsa0JBQVU7QUFFVixZQUFJLEtBQUssNkJBQTZCLEtBQUssV0FBVyxRQUFRLFdBQVksR0FBRztBQUV6RSxnQkFBTSx1QkFBdUIsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFLLEVBQUUsT0FBTyxhQUFhLFdBQVc7QUFDaEcsY0FBSSxzQkFBc0I7QUFDdEIsaUNBQXFCLEtBQUssWUFBWTtBQUN0QztBQUFBLFVBQ0o7QUFHQSxnQkFBTSxnQ0FBZ0MsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFLLEVBQUUsT0FBTyxpQkFBaUIsV0FBVztBQUM3RyxjQUFJLCtCQUErQjtBQUMvQiwwQ0FBOEIsS0FBSyxZQUFZO0FBQy9DO0FBQUEsVUFDSjtBQUFBLFFBQ0osT0FBTztBQUNIO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFNQSxVQUFJLFFBQVEsYUFBYTtBQUVyQixZQUFJLFFBQVEsZ0JBQWdCLGFBQWEsZ0JBQWdCO0FBQ3JELGdCQUFNLGVBQWU7QUFDckIsZ0JBQU0sVUFBVSxLQUFLLG9CQUFvQixhQUFhLG1CQUFtQjtBQUV6RSxnQkFBTSxpQkFBaUIsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLE9BQU87QUFDekQseUJBQWUsY0FBYyxRQUFRO0FBRXJDLGNBQUksQ0FBQyxDQUFDLFNBQVM7QUFDWCxtQkFBTyxLQUFLLG9CQUFvQixhQUFhLG1CQUFtQjtBQUNoRSwrQkFBbUIsT0FBTyxFQUFFLEtBQUssTUFBTTtBQUNuQyxtQkFBSyxjQUFjLGdCQUFnQixZQUFZO0FBQUEsWUFDbkQsQ0FBQyxFQUFFLE1BQU0sTUFBTTtBQUFBLFlBRWYsQ0FBQztBQUFBLFVBQ0wsT0FBTztBQUNILGlCQUFLLGNBQWMsZ0JBQWdCLFlBQVk7QUFBQSxVQUNuRDtBQUNBO0FBQUEsUUFDSjtBQUVBLFlBQUkscUJBQXFCO0FBRXpCLGFBQUssa0JBQWtCLFFBQVEsYUFBVztBQUN0QyxjQUFJLFFBQVEsZ0JBQWdCLFFBQVEsYUFBYTtBQUM3QyxpQ0FBcUI7QUFDckIsa0JBQU0sVUFBVSxRQUFRLFNBQVMsT0FBTztBQUV4QyxnQkFBSSxRQUFRLGFBQWEsU0FBUztBQUM5QixtQkFBSyxvQkFBb0IsUUFBUSxFQUFFLElBQUk7QUFBQSxZQUMzQztBQUVBLGdCQUFJLFdBQVcsQ0FBQyxRQUFRLFdBQVc7QUFDL0Isb0JBQU0sSUFBSSxNQUFNO0FBQUEsZ0JBQzVCLFFBQVEsV0FBVyw0QkFBNEIsUUFBUSxRQUFRO0FBQUE7QUFBQTtBQUFBLDZIQUc4QztBQUFBLFlBQ3JHO0FBRUEsZ0JBQUksQ0FBQyxXQUFXLFFBQVEsV0FBVztBQUMvQixvQkFBTSxJQUFJLE1BQU07QUFBQSxnQkFDNUIsUUFBUSxXQUFXLDRCQUE0QixRQUFRLFFBQVE7QUFBQTtBQUFBO0FBQUEsNkhBRzhDO0FBQUEsWUFDckc7QUFBQSxVQUNKO0FBQUEsUUFDSixDQUFDO0FBRUQsWUFBSSxDQUFDLG9CQUFvQjtBQUFBLFFBR3pCO0FBQUEsTUFDSixPQUFPO0FBQ0gsZ0JBQVEsSUFBSSwwQkFBMEI7QUFBQSxNQUMxQztBQUFBLElBQ0o7QUFBQSxFQUNKO0FBR0o7OztBQ3pMTyxJQUFNLGNBQWM7QUFBQSxFQUN2QixnQkFBZ0I7QUFBQSxFQUNoQixzQkFBc0I7QUFBQSxFQUN0QixjQUFjO0FBQUEsRUFDZCxtQkFBbUI7QUFDdkI7QUE0Qk8sSUFBTSxxQkFBcUI7QUFBQSxFQUM5QixRQUFRO0FBQUEsRUFDUixVQUFVO0FBQUEsRUFDVixRQUFRO0FBQUEsRUFDUixjQUFjO0FBQ2xCO0FBZ0hPLElBQU0sMEJBQTBCO0FBQUEsRUFDbkMsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUNaO0FBZ0NPLElBQU0sa0JBQU4sTUFBc0I7QUFHN0I7QUFGSSxjQURTLGlCQUNGLFFBQU87QUFDZCxjQUZTLGlCQUVGLGFBQVk7QUE4TGhCLElBQU0sb0JBQW9CO0FBQUEsRUFDN0IsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWIsV0FBVztBQUNmO0FBc0RPLElBQU0sa0JBQWtCO0FBQUEsRUFDM0IsV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUNWO0FBZ0VPLElBQU0sVUFBTixNQUFjO0FBQUEsRUFDakIsWUFBbUIsV0FBK0IsWUFBeUI7QUFBeEQ7QUFBK0I7QUFJbEQsc0NBQWEsTUFBTTtBQUNmLGNBQVEsS0FBSyxjQUFjLEtBQUssV0FBVyxjQUFjLEtBQUs7QUFBQSxJQUNsRTtBQUVBLG1DQUFVLE1BQU07QUFDWixhQUFRLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFDcEM7QUFBQSxFQVJBO0FBU0o7OztBQ3RoQk8sSUFBTSxpQkFBaUI7QUFBQSxFQUMxQixJQUFJO0FBQ1I7OztBQ0dPLElBQU0sK0JBQU4sY0FBMkMsbUJBQTBDO0FBQUEsRUFBckY7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0Isb0NBQVcsQ0FBQyxZQUFtQztBQUMzQyxZQUFNLGVBQWUsU0FBUyxpQkFBaUIsSUFBSSxlQUFlLEVBQUUsR0FBRztBQUd2RSxVQUFJLFdBQTBCLENBQUM7QUFJL0IsbUJBQWEsUUFBUSxVQUFRO0FBRXpCLGNBQU0sU0FBUyxLQUFLLGFBQWEsZUFBZSxFQUFFO0FBQ2xELFlBQUksUUFBUTtBQUNSLG1CQUFTLEtBQUssSUFBSSxlQUFlLFFBQVEsS0FBSyxTQUFTLEtBQUssc0JBQXNCLENBQUMsQ0FBQztBQUFBLFFBQ3hGO0FBQUEsTUFRSixDQUFDO0FBRUQsV0FBSyxjQUFjLElBQUksd0JBQXdCLFFBQVEsaUJBQWlCLFFBQVEsQ0FBQztBQUFBLElBQ3JGO0FBQUE7QUFDSjs7O0FDL0JPLElBQU0sbUJBQW1CLENBQUMsS0FBVSxPQUFtQjtBQUMxRCxTQUFPLEdBQUcsaUJBQWlCLElBQUksZUFBZSxFQUFFLEtBQUssSUFBSSxVQUFVLFFBQVEsSUFBSTtBQUNuRjtBQUVPLElBQU0sdUJBQXVCLENBQUMsS0FBVSxPQUFtQjtBQUM5RCxRQUFNLFdBQVcsaUJBQWlCLEtBQUssRUFBRTtBQUN6QyxNQUFJLFNBQVMsUUFBUTtBQUNqQixXQUFPLFNBQVMsS0FBSyxDQUFDO0FBQUEsRUFDMUI7QUFDQSxTQUFPO0FBQ1g7OztBQ1JPLElBQU0scUJBQU4sY0FBaUMsbUJBQXFDO0FBQUEsRUFBdEU7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0Isb0NBQVcsQ0FBQyxVQUE0QjtBQUNwQyxZQUFNLGVBQStCLENBQUM7QUFFdEMsWUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssUUFBUTtBQUNsRCxZQUFNLFFBQVEsVUFBUTtBQUNsQixjQUFNLFVBQVUsTUFBTTtBQUNsQixlQUFLLGNBQWMsSUFBSSxtQkFBbUIsR0FBRyxLQUFLO0FBQUEsUUFDdEQ7QUFDQSxhQUFLLGlCQUFpQixTQUFTLE9BQU87QUFFdEMsY0FBTSxjQUFjLE1BQU07QUFDdEIsZUFBSyxvQkFBb0IsU0FBUyxPQUFPO0FBQUEsUUFDN0M7QUFDQSxxQkFBYSxLQUFLLFdBQVc7QUFBQSxNQUNqQyxDQUFDO0FBR0QsYUFBTyxNQUFNO0FBQ1QscUJBQWEsUUFBUSxVQUFRLEtBQUssQ0FBQztBQUFBLE1BQ3ZDO0FBQUEsSUFDSjtBQUFBO0FBQ0o7OztBQ3pCTyxJQUFNLG9CQUFOLGNBQWdDLG1CQUFzQztBQUFBLEVBQXRFO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLG9DQUFXLENBQUMsVUFBNkI7QUFDckMsWUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssUUFBUTtBQUNsRCxZQUFNLFFBQVEsVUFBUTtBQUVsQixhQUFLLGNBQWMsTUFBTTtBQUFBLE1BQzdCLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFDSjs7O0FDVEEsSUFBTSxjQUFjLENBQUMsVUFBVTtBQUMzQixTQUFPLFVBQVUsT0FBTyxLQUFLO0FBQ2pDO0FBRUEsSUFBTSxhQUFhLENBQUMsVUFBVTtBQUMxQixTQUFPLE9BQU8sVUFBVTtBQUM1QjtBQUVPLElBQU0seUJBQXlCLENBQUMsUUFBUTtBQUMzQyxNQUFJLFlBQVksR0FBRyxHQUFHO0FBQ2xCLFdBQU87QUFBQSxFQUNYO0FBRUEsTUFBSSxXQUFXLEdBQUcsR0FBRztBQUNqQixXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksT0FBTyxlQUFlLEdBQUcsR0FBRztBQUM1QixXQUFPO0FBQUEsRUFDWDtBQUVBLGFBQVcsT0FBTyxLQUFLO0FBQ25CLFVBQU0sUUFBUSxJQUFJLEdBQUc7QUFDckIsUUFBSSxPQUFPLFVBQVUsVUFBVTtBQUUzQixVQUFJLENBQUMsdUJBQXVCLEtBQUssR0FBRztBQUNoQyxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0osV0FBVyxZQUFZLEtBQUssR0FBRztBQUMzQjtBQUFBLElBQ0osT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUVBLFNBQU87QUFDWDtBQVFPLElBQU0sbUJBQW1CLENBQzVCLEtBQ0EsV0FBb0MsQ0FBQyxHQUNyQyxtQkFBNEIsTUFDNUJDLFFBQTJDLG9CQUFJLFFBQVEsTUFDckM7QUFFbEIsTUFBSSxZQUFZLEdBQUcsR0FBRztBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksTUFBTSxRQUFRLEdBQUcsR0FBRztBQUNwQixRQUFJQSxNQUFLLElBQUksR0FBRyxHQUFHO0FBQ2YsYUFBT0EsTUFBSyxJQUFJLEdBQUc7QUFBQSxJQUN2QjtBQUdBLFVBQU0sb0JBQXlDLENBQUM7QUFDaEQsSUFBQUEsTUFBSyxJQUFJLEtBQUssaUJBQWlCO0FBRS9CLGFBQVMsUUFBUSxHQUFHLFFBQVEsSUFBSSxRQUFRLFNBQVM7QUFDN0MsWUFBTSxVQUFVLElBQUksS0FBSztBQUN6Qix3QkFBa0IsS0FBSyxJQUFJLGlCQUFpQixTQUFTLFVBQVUsa0JBQWtCQSxLQUFJO0FBQUEsSUFDekY7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLE1BQUksUUFBUSxRQUFRLE9BQU8sUUFBUSxVQUFVO0FBRXpDLFFBQUlBLE1BQUssSUFBSSxHQUFHLEdBQUc7QUFDZixhQUFPQSxNQUFLLElBQUksR0FBRztBQUFBLElBQ3ZCO0FBQ0EsVUFBTSxxQkFBK0MsQ0FBQztBQUN0RCxJQUFBQSxNQUFLLElBQUksS0FBSyxrQkFBa0I7QUFFaEMsZUFBVyxPQUFPLEtBQUs7QUFHbkIsWUFBTSxnQkFBZ0IsT0FBTyxZQUFZLFlBQVksV0FBVyxTQUFTLEdBQUc7QUFFNUUsVUFBSSxlQUFlO0FBQ2YsWUFBSSxrQkFBa0IsTUFBTTtBQUV4QixjQUFJLG1CQUFtQixJQUFJLEdBQUcsTUFBTSxTQUFZLElBQUksR0FBRyxHQUFHO0FBRXRELCtCQUFtQixHQUFHLElBQUksaUJBQWlCLElBQUksR0FBRyxHQUFHLE1BQU0sa0JBQWtCQSxLQUFJO0FBQUEsVUFDckY7QUFBQSxRQUNKLFdBQVcsT0FBTyxrQkFBa0IsVUFBVTtBQUcxQyw2QkFBbUIsR0FBRyxJQUFJLGlCQUFpQixJQUFJLEdBQUcsR0FBRyxlQUFlLGtCQUFrQkEsS0FBSTtBQUFBLFFBQzlGO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUVBLFNBQU8sQ0FBQztBQUNaOzs7QUN6R08sSUFBTSwrQkFBK0IsQ0FBQyxPQUE2QixTQUE4QixZQUFxQjtBQUN6SCxRQUFNLGlCQUFpQixNQUFNLGVBQWUsTUFBTSxlQUFlLENBQUM7QUFDbEUsaUJBQWUsbUJBQW1CO0FBRWxDLGlCQUFlLE9BQU87QUFDdEIsaUJBQWUsVUFBVTtBQUN6QixpQkFBZSxpQkFBaUI7QUFFaEMsUUFBTSxrQkFBa0IsSUFBSSxTQUFTLFdBQVcsTUFBTSxNQUFNLGlCQUFpQjtBQUM3RSxRQUFNLE1BQU0sZ0JBQWdCLGNBQWM7QUFJMUMsVUFBUSxHQUFHO0FBQ2Y7OztBQ2JPLElBQU0sdUJBQU4sY0FBbUMsbUJBQXlDO0FBQUEsRUFBNUU7QUFBQTtBQUNILHVDQUFjLGFBQWE7QUFFM0Isb0NBQVcsQ0FBQyxVQUFnQztBQUN4QyxZQUFNLFVBQVUsQ0FBQyxTQUFjO0FBQzNCLGFBQUssY0FBYyxJQUFJLDBCQUEwQixNQUFNLGlCQUFpQixJQUFJLENBQUM7QUFBQSxNQUNqRjtBQUVBLG1DQUE2QixPQUFPLFNBQVMsSUFBSSxRQUFRLFNBQVMsZUFBZSxDQUFDO0FBQUEsSUFDdEY7QUFBQTtBQUNKOzs7QUNmTyxJQUFNLGlCQUFpQjtBQUN2QixJQUFNLFlBQVk7QUFHbEIsSUFBTSxzQkFBc0IsQ0FBQyxZQUFvQixXQUFnQjtBQUVwRSxNQUFJLE9BQU8sY0FBYyxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBRS9HLFdBQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBQyxDQUFDLFVBQVUsR0FBRyxPQUFNLENBQUM7QUFBQSxFQUN4RSxPQUFPO0FBQUEsRUFFUDtBQUNKOzs7QUNOTyxJQUFNLDBCQUFOLGNBQXNDLG1CQUE0QztBQUFBLEVBQWxGO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLG9DQUFXLENBQUMsWUFBcUM7QUFFN0MsWUFBTSxRQUFRLGlCQUFpQixRQUFRLEtBQUssUUFBUTtBQUNwRCxZQUFNLGVBQXNCLENBQUM7QUFDN0IsWUFBTSxRQUFRLFVBQVE7QUFFbEIsY0FBTSxVQUFVLENBQUMsTUFBTTtBQUVuQixnQ0FBc0IsTUFBTTtBQUN4QixpQkFBSyxjQUFjLElBQUksNkJBQTZCLFFBQVEsaUJBQWlCLGlCQUFpQixHQUFHLFFBQVEsb0JBQW9CLENBQUMsQ0FBQztBQUFBLFVBQ25JLENBQUM7QUFBQSxRQUNMO0FBQ0EsYUFBSyxpQkFBaUIsUUFBUSxNQUFNLE9BQU87QUFDM0MscUJBQWEsS0FBSyxNQUFNO0FBQ3BCLGVBQUssb0JBQW9CLFFBQVEsTUFBTSxPQUFPO0FBQUEsUUFDbEQsQ0FBQztBQUFBLE1BRUwsQ0FBQztBQUVELGFBQU8sTUFBTTtBQUNULHFCQUFhLFFBQVEsVUFBUTtBQUN6QixlQUFLO0FBQUEsUUFDVCxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFBQTtBQUNKOzs7QUM5Qk8sSUFBTSxzQkFBTixjQUFrQyxtQkFBd0M7QUFBQSxFQUExRTtBQUFBO0FBRUgsdUNBQWMsYUFBYTtBQUUzQixvQ0FBVyxDQUFDLFVBQStCO0FBQ3ZDLFlBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLFFBQVE7QUFDbEQsWUFBTSxRQUFRLFVBQVE7QUFDbEIsYUFBSyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUs7QUFBQSxNQUM3QyxDQUFDO0FBQUEsSUFDTDtBQUFBO0FBQ0o7OztBQ3FITyxJQUFlLG9CQUFmLE1BQXNHO0FBQUEsRUFPL0YsWUFBbUIscUJBQXdELFdBQXdCLFNBQXlCO0FBQXpHO0FBQXdEO0FBTnJGLDhCQUFhO0FBRWIsMkNBQXlELENBQUM7QUFFMUQ7QUFvQkEsOENBQThCO0FBb0I5QjtBQUFBLGdDQUFPLENBQTRCLGFBQXFCLFlBQXFDO0FBQ3pGLFVBQUksQ0FBQyxLQUFLLGdCQUFnQixXQUFXLEdBQUc7QUFDcEMsYUFBSyxnQkFBZ0IsV0FBVyxJQUFJLENBQUM7QUFBQSxNQUN6QztBQUdBLFVBQUksQ0FBQyxLQUFLLGdCQUFnQixXQUFXLEVBQUUsU0FBUyxPQUFPLEdBQUc7QUFDdEQsYUFBSyxnQkFBZ0IsV0FBVyxFQUFFLEtBQUssT0FBTztBQUFBLE1BQ2xEO0FBQUEsSUFDSjtBQUVBLG9DQUFXLENBQTRCLGFBQXFCLFdBQW9DLFlBQWtEO0FBQzlJLFVBQUksQ0FBQyxTQUFTO0FBQ1YsY0FBTSxJQUFJLE1BQU0saURBQWtEO0FBQUEsTUFDdEU7QUFFQSxVQUFJLENBQUMsS0FBSyxnQkFBZ0IsV0FBVyxHQUFHO0FBQ3BDLGFBQUssZ0JBQWdCLFdBQVcsSUFBSSxDQUFDO0FBQUEsTUFDekM7QUFFQSxZQUFNLFdBQVcsS0FBSyxnQkFBZ0IsV0FBVztBQUVqRCxZQUFNLDBCQUEwQixDQUFDLE1BQVM7QUFDdEMsWUFBSSxVQUFVLENBQUMsR0FBRztBQUNkLGtCQUFRLENBQUM7QUFDVCxpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUdBLGVBQVMsS0FBSyx1QkFBdUI7QUFFckMsYUFBTyxNQUFNO0FBQ1QsY0FBTSxRQUFRLFNBQVMsUUFBUSx1QkFBdUI7QUFDdEQsWUFBSSxRQUFRLElBQUk7QUFDWixtQkFBUyxPQUFPLE9BQU8sQ0FBQztBQUFBLFFBQzVCO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFpQ0Esd0NBQWUsTUFBTTtBQUNqQixXQUFLLGNBQWM7QUFFbkIsVUFBSSxLQUFLO0FBQ0wsYUFBSyxzQkFBc0I7QUFBQSxJQUNuQztBQUVBLHVDQUF1QjtBQUV2QjtBQUNBO0FBRUEsMENBQStCLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1RCxXQUFLLHdCQUF3QjtBQUM3QixXQUFLLHVCQUF1QjtBQUFBLElBQ2hDLENBQUM7QUFFRCxxQ0FBWSxNQUFNO0FBQ2QsYUFBTyxLQUFLO0FBQUEsSUFDaEI7QUF3R0EsaUNBQVcsQ0FBQztBQUNaLGdDQUFVLENBQUM7QUF6T1AsU0FBSyxNQUFLLG1DQUFTLE9BQU0sUUFBUSxTQUFTLEVBQUUsU0FBUyxtQkFBbUI7QUFDeEUsVUFBTSxXQUFVLG1DQUFTLFdBQVUsbUNBQVMsVUFBVSxJQUFJO0FBQzFELGVBQVcsTUFBTTtBQUNiLFVBQUksQ0FBQyxLQUFLLGVBQWUsS0FBSyx3QkFBd0IsQ0FBQyxLQUFLLG9CQUFvQjtBQUM1RSxhQUFLLHFCQUFxQixXQUFXLE9BQU8sSUFBSSxLQUFLLEVBQUUsRUFBRTtBQUFBLE1BQzdEO0FBQUEsSUFDSixHQUFHLE9BQU87QUFHVixTQUFLLFVBQVUsRUFBRSxLQUFLLE1BQU07QUFFeEIsVUFBSSxPQUFPLEtBQUssUUFBUSxXQUFXO0FBQy9CLGFBQUssUUFBUTtBQUFBLE1BQ2pCO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBSUEsSUFBSSxvQkFBNkI7QUFDN0IsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVBLElBQUksa0JBQWtCLE9BQWdCO0FBQ2xDLFFBQUksS0FBSyxvQkFBb0I7QUFDekIsWUFBTSxJQUFJLE1BQU0sbUxBQW1MO0FBQUEsSUFDdk07QUFDQSxTQUFLLHFCQUFxQjtBQUFBLEVBQzlCO0FBQUEsRUFrREEsa0JBQWtCLGVBQXlDO0FBR3ZELFFBQUksY0FBYyxnQkFBZ0IsYUFBYSx3QkFBd0I7QUFDbkUsWUFBTSxlQUFnQjtBQUd0QixVQUFLLEtBQWEsYUFBYSxNQUFNLEdBQUc7QUFDcEMsUUFBQyxLQUFhLGFBQWEsTUFBTSxFQUFFLGFBQWEsT0FBTztBQUFBLE1BQzNELE9BQU87QUFDSCxnQkFBUSxJQUFJLG9CQUFvQixhQUFhLE1BQU0saUJBQWlCLElBQUk7QUFBQSxNQUM1RTtBQUVBLGFBQU87QUFBQSxJQUNYO0FBRUEsVUFBTSxXQUFXLEtBQUssZ0JBQWdCLGNBQWMsV0FBVztBQUMvRCxRQUFJLFlBQVksU0FBUyxRQUFRO0FBQzdCLFVBQUksVUFBVTtBQUVkLGVBQVMsUUFBUSxhQUFXO0FBQ3hCLGtCQUFVLFdBQVcsUUFBUSxhQUFhO0FBQUEsTUFDOUMsQ0FBQztBQUNELGFBQU87QUFBQSxJQUNYLE9BQU87QUFBQSxJQUdQO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQXVCUSxtQkFBbUIsU0FBK0I7QUFDdEQsWUFBUSxTQUFTLEtBQUs7QUFDdEIsWUFBUSxjQUFjLEtBQUs7QUFDM0IsWUFBUSxZQUFZLGlCQUFpQjtBQUVyQyxVQUFNLGlCQUFpQixLQUFLLFNBQVMsUUFBUSxpQkFBaUIsQ0FBQyxRQUErQjtBQUMxRixhQUFPLElBQUksb0JBQW9CLFFBQVE7QUFBQSxJQUMzQyxHQUFHLENBQUMsTUFBNEI7QUFDNUIsY0FBUSxRQUFRLENBQUM7QUFDakIscUJBQWU7QUFBQSxJQUNuQixDQUFDO0FBRUQsVUFBTSxVQUFVLFFBQVE7QUFFeEIsV0FBTyxRQUFRO0FBRWYsU0FBSyxLQUFLLE9BQU87QUFFakIsWUFBUSxVQUFVO0FBQUEsRUFDdEI7QUFBQSxFQUVBLEtBQUssU0FBMEM7QUFFM0MsUUFBSSxDQUFDLFFBQVE7QUFDVCxjQUFRLFNBQVMsS0FBSztBQUUxQixRQUFJLENBQUMsUUFBUTtBQUNULGNBQVEsY0FBYyxLQUFLO0FBRS9CLFlBQVEsWUFBWSxpQkFBaUI7QUFFckMsUUFBSTtBQUlKLFFBQUksUUFBUSxTQUFTO0FBQ2pCLFlBQU0sZUFBZ0I7QUFDdEIsdUJBQWlCLEtBQUssU0FBUyxhQUFhLGlCQUFpQixDQUFDLFFBQStCO0FBQ3pGLGVBQU8sSUFBSSxvQkFBb0IsYUFBYTtBQUFBLE1BQ2hELEdBQUcsYUFBYSxPQUFPO0FBR3ZCLGFBQU8sUUFBUTtBQUFBLElBQ25CO0FBR0EsUUFBSSxRQUFRLEtBQUs7QUFFYixjQUFRLE1BQU0sUUFBUSxJQUFJLGdCQUFnQixRQUFRO0FBQUEsSUFDdEQ7QUFFQSxRQUFJLFFBQVEsV0FBVztBQUNuQixhQUFPLE1BQU07QUFDVCxhQUFLLG1CQUFtQixJQUFJLGVBQWUsUUFBUSxJQUFJLENBQUMsV0FBVztBQUFBLFFBRW5FLENBQUMsQ0FBQztBQUVGLFlBQUksZ0JBQWdCO0FBQ2hCLHlCQUFlO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQUEsSUFDSixPQUFPO0FBQ0gsYUFBTyxNQUFNO0FBQUEsTUFDYjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFQSxVQUFnQjtBQUNaLFNBQUssb0JBQW9CO0FBRXpCLFFBQUksQ0FBQyxLQUFLLGFBQWE7QUFHbkI7QUFBQSxJQUNKO0FBQ0EsWUFBUSxJQUFJLHVCQUF1QixLQUFLLEVBQUU7QUFVMUMsU0FBSyxLQUFLLElBQUksZUFBZSxDQUFDO0FBRTlCLFVBQU0sb0JBQW9CLEtBQUssZ0JBQWdCLFdBQVc7QUFDMUQsUUFBSSxtQkFBbUI7QUFDbkIsd0JBQWtCLFFBQVEsb0JBQWtCO0FBRXhDLHVCQUFlLElBQUk7QUFBQSxNQUN2QixDQUFDO0FBQUEsSUFDTDtBQUlBLFNBQUssa0JBQWtCLENBQUM7QUFDeEIsU0FBSyxNQUFNO0FBQ1gsU0FBSyxjQUFjO0FBQUEsRUFDdkI7QUFJSjs7O0FDdFhPLElBQU0sU0FBUztBQUFBLEVBQ2xCLHdCQUF3QixDQUFDLE1BQU0sUUFBUTtBQUNuQyxVQUFNLElBQUksTUFBTTtBQUFBLHlCQUNDLEtBQUssU0FBUyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWXRDLEdBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQSxrRUFJNkQsS0FBSyxTQUFTLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxDQWFoRjtBQUFBLEVBQ0c7QUFDSjs7O0FDNUJPLElBQU0sbUJBQU4sY0FBK0Isa0JBQWtCO0FBQUEsRUFFcEQsWUFBbUIscUJBQXdELFFBQXdCLFNBQXlCO0FBRXhILFVBQU0scUJBQXFCLE9BQU8sV0FBVyxPQUFPO0FBRnJDO0FBQXdEO0FBd0MzRSxnQ0FBTyxDQUFDLFlBQTZCO0FBR2pDLFlBQU0sVUFBVSxRQUFRO0FBQ3hCLFlBQU0saUJBQWlCLE1BQU0sS0FBSyxPQUFPO0FBR3pDLFdBQUssT0FBTyxLQUFLLElBQUksaUJBQWlCLEtBQUssSUFBSSxPQUFPLENBQUM7QUFHdkQsY0FBUSxVQUFVO0FBQ2xCLGFBQU87QUFBQSxJQUNYO0FBRUEsbUNBQVUsTUFBTTtBQUNaLFVBQUksS0FBSztBQUNMLGFBQUssS0FBSyxJQUFJLHVCQUF1QixTQUFTLENBQUM7QUFDbkQsWUFBTSxRQUFRO0FBQUEsSUFDbEI7QUFBQSxFQXZEQTtBQUFBLEVBRUEsT0FBTztBQUVILFNBQUssS0FBSyxJQUFJLHVCQUF1QixNQUFNLENBQUM7QUFBQSxFQUNoRDtBQUFBLEVBRUEsT0FBTztBQUNILFNBQUssS0FBSyxJQUFJLHVCQUF1QixNQUFNLENBQUM7QUFBQSxFQUNoRDtBQUFBLEVBRUEsVUFBVTtBQUdOLFdBQU8sS0FBSyxLQUFLLElBQUksdUJBQXVCLFNBQVMsQ0FBQztBQUFBLEVBQzFEO0FBQUEsRUFFQSxrQ0FBa0M7QUFFOUIsU0FBSyxLQUFLLElBQUksdUJBQXVCLGlDQUFpQyxDQUFDO0FBQUEsRUFDM0U7QUFBQSxFQUVBLCtCQUErQjtBQUUzQixTQUFLLEtBQUssSUFBSSx1QkFBdUIsOEJBQThCLENBQUM7QUFBQSxFQUN4RTtBQUFBLEVBRUEsa0JBQWtCLGVBQXlDO0FBTXZELFdBQU8sTUFBTSxrQkFBa0IsYUFBYTtBQUFBLEVBQ2hEO0FBc0JKOzs7QUN0RE8sSUFBTSw0QkFBTixjQUF3QyxrQkFBa0I7QUFBQSxFQW1CN0QsWUFDSSxxQkFDQSxNQUNPLFdBQ0MsZUFDQSxTQUNSLFNBQ0Y7QUFDRSxVQUFNLHFCQUFxQixXQUFXLE9BQU87QUFMdEM7QUFDQztBQUNBO0FBdkJaLHdCQUFRO0FBQ1Isd0JBQVE7QUFDUix3QkFBUSxhQUF1RCxDQUFDO0FBTWhFO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBQVEsZ0JBQWUsQ0FBQyxNQUFhO0FBQ2pDLFlBQU0sU0FBVSxFQUFrQjtBQUNsQyxVQUFJLEVBQUMsaUNBQVEsUUFBUTtBQUNyQixVQUFJLEtBQUssZUFBZSxDQUFDLEtBQUssbUJBQW1CO0FBQzdDLGFBQUssWUFBWSxPQUFPLFFBQVEsT0FBTyxPQUFPO0FBQUEsTUFDbEQsV0FBVyxDQUFDLEtBQUssYUFBYTtBQUMxQixhQUFLLFVBQVUsS0FBSyxFQUFFLFFBQVEsT0FBTyxRQUFRLFNBQVMsT0FBTyxRQUFRLENBQUM7QUFBQSxNQUMxRTtBQUFBLElBQ0o7QUFxQkEsMENBQWlDLE1BQU07QUFBQSxJQUFDO0FBcUV4QztBQUFBO0FBQUE7QUFBQTtBQUFBLGdDQUFPLENBQUMsWUFBa0M7QUFHdEMsWUFBTSxpQkFBaUIsTUFBTSxLQUFLLE9BQU87QUFHekMsY0FBUSxNQUFNLHFGQUFxRixPQUFPO0FBRTFHLGFBQU87QUFBQSxJQUNYO0FBRUEsbUNBQVUsTUFBTTtBQW5JcEI7QUFvSVEsVUFBSSxLQUFLLFlBQVk7QUFDakIsYUFBSyxXQUFXO0FBQUEsTUFDcEI7QUFDQSxZQUFNLFFBQVE7QUFDZCxpQkFBSyxjQUFjLGVBQW5CLG1CQUErQixZQUFZLEtBQUs7QUFBQSxJQUNwRDtBQWhHSSxTQUFLLFVBQVU7QUFHZixTQUFLLGNBQWMsaUJBQWlCLFlBQVksS0FBSyxZQUFZO0FBQ2pFLFNBQUssYUFBYSxNQUFNLEtBQUssY0FBYyxvQkFBb0IsWUFBWSxLQUFLLFlBQVk7QUFHNUYsU0FBSyxhQUFhO0FBQUEsRUFDdEI7QUFBQSxFQUlBLFVBQVU7QUFDTixTQUFLLGlCQUFpQixjQUFjLEtBQUssSUFBSSw2QkFBNkIsR0FBRyxLQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssbUJBQW1CO0FBQ3pJLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxPQUFPO0FBQ0gsU0FBSyxjQUFjLE1BQU0sVUFBVTtBQUNuQyxTQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLFNBQUssY0FBYyxNQUFNLGdCQUFnQjtBQUN6QyxTQUFLLGNBQWMsTUFBTSxhQUFhO0FBQ3RDLFNBQUssY0FBYyxNQUFNLFNBQVM7QUFDbEMsU0FBSyxjQUFjLE1BQU0sUUFBUTtBQUFBLEVBQ3JDO0FBQUEsRUFFQSxPQUFPO0FBQ0gsU0FBSyxjQUFjLE1BQU0sVUFBVTtBQUNuQyxTQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLFNBQUssY0FBYyxNQUFNLGdCQUFnQjtBQUN6QyxTQUFLLGNBQWMsTUFBTSxhQUFhO0FBQ3RDLFNBQUssY0FBYyxNQUFNLFNBQVM7QUFDbEMsU0FBSyxjQUFjLE1BQU0sUUFBUTtBQUFBLEVBQ3JDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxhQUFhLE1BQXFCO0FBQzlCLFFBQUksT0FBUSxLQUFLLGNBQXNCLHdCQUF3QixZQUFZO0FBQ3ZFLE1BQUMsS0FBSyxjQUFzQixvQkFBb0IsSUFBSTtBQUFBLElBQ3hEO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsVUFBbUI7QUFDZixRQUFJLE9BQVEsS0FBSyxjQUFzQix3QkFBd0IsWUFBWTtBQUN2RSxhQUFRLEtBQUssY0FBc0Isb0JBQW9CO0FBQUEsSUFDM0Q7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxjQUFjLFNBQTJEO0FBSXJFLFNBQUssY0FBYztBQUVuQixRQUFJLEtBQUssVUFBVSxTQUFTLEdBQUc7QUFDM0IsWUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLFNBQVM7QUFDaEMsV0FBSyxZQUFZLENBQUM7QUFDbEIsWUFBTSxRQUFRLFVBQVE7QUFDbEIsWUFBSSxDQUFDLEtBQUssbUJBQW1CO0FBQ3pCLGtCQUFRLEtBQUssUUFBUSxLQUFLLE9BQU87QUFBQSxRQUNyQztBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBd0JKOzs7QUN0SEEsSUFBTSxtQkFBbUIsQ0FBQyxNQUFjLEtBQWEsOEJBQTBEO0FBQzNHLFFBQU0sVUFBVSxTQUFTLGNBQWMsR0FBRztBQUMxQyxVQUFRLGNBQWM7QUFDdEIsVUFBUSxNQUFNLFdBQVc7QUFDekIsVUFBUSxNQUFNLFVBQVU7QUFDeEIsVUFBUSxNQUFNLFdBQVc7QUFDekIsVUFBUSxNQUFNLEtBQUssSUFBSTtBQUN2QixVQUFRLE1BQU0sTUFBTSxHQUFHLEdBQUc7QUFFMUIsVUFBUSxNQUFNLFlBQVk7QUFDMUIsVUFBUSxTQUFTO0FBQ2pCLFVBQVEsT0FBTyxrREFBa0QsMEJBQTBCLEVBQUU7QUFFN0YsU0FBTztBQUNYO0FBRU8sSUFBTSxnQkFBZ0IsQ0FBQyxJQUNBLE1BQ0EsS0FDQSxXQUNBLGtCQUNBLDhCQUNUO0FBSWpCLFFBQU0sVUFBVSxpQkFBaUIsR0FBRywwQkFBMEIsSUFBSSxNQUFNLElBQUksSUFBSSxLQUFLLHlCQUF5QjtBQUM5RyxZQUFVLGFBQWEsU0FBUyxnQkFBZ0I7QUFDaEQsbUJBQWlCLE1BQU0sU0FBUztBQUNoQyxtQkFBaUIsTUFBTSxVQUFVO0FBRWpDLFNBQU8sTUFBTTtBQUNULHFCQUFpQixNQUFNLFNBQVM7QUFDaEMsY0FBVSxZQUFZLE9BQU87QUFBQSxFQUNqQztBQUNKO0FBRUEsSUFBTSxjQUFjLENBQUMsWUFBeUIsVUFBa0IsY0FBd0M7QUFDcEcsTUFBSSxDQUFDLFlBQVk7QUFFYixZQUFRO0FBQUE7QUFBQSxNQUVKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUdjLFFBQVE7QUFBQSxhQUNSLFVBQVUsb0JBQW9CLElBQUksU0FBUyxVQUFVLG9CQUFvQixFQUFFO0FBQUE7QUFBQSxtR0FDVyxVQUFVLG9CQUFvQixFQUFFO0FBQUEsSUFDeEk7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLFNBQU87QUFDWDtBQUVBLElBQU0sb0JBQW9CLENBQUMsWUFBeUIsVUFBa0IsY0FBd0M7QUFDMUcsVUFBUTtBQUFBLElBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUljLFFBQVE7QUFBQSxhQUNSLFVBQVUsb0JBQW9CLElBQUksU0FBUyxVQUFVLG9CQUFvQixFQUFFO0FBQUE7QUFBQSxtR0FDVyxVQUFVLG9CQUFvQixFQUFFO0FBQUEsRUFDeEk7QUFDSjtBQUVPLElBQU0sZUFBZSxDQUFxQyxXQUEyQixhQUE0QixpQkFBOEI7QUFFbEosUUFBTSxXQUFXLFlBQVksT0FBTyxDQUFDLGVBQWUsaUJBQWlCO0FBQ2pFLFdBQU8saUNBQ0EsZ0JBREE7QUFBQSxNQUVILENBQUMsYUFBYSxJQUFJLEdBQUcsbUJBQUk7QUFBQSxJQUM3QjtBQUFBLEVBQ0osR0FBRyxDQUFDLENBQUM7QUFFTCxRQUFNLGVBQWU7QUFBQSxJQUNqQixLQUFLLENBQUMsR0FBbUIsU0FBaUI7QUFFdEMsWUFBTSxhQUFhLFNBQVMsSUFBSTtBQUVoQyxVQUFJLFlBQVksWUFBWSxNQUFNLFNBQVMsR0FBRztBQUMxQyxlQUFPO0FBQUEsTUFDWDtBQUVBLFVBQUksV0FBVyxTQUFTLFNBQVMsd0JBQXdCLE1BQU07QUFFM0QsWUFBSSxxQkFBcUIsMkJBQTJCO0FBQ2hELGdCQUFNLG9CQUFvQixXQUFXO0FBQ3JDLGdCQUFNLFdBQVcsa0JBQWtCLFNBQVM7QUFFNUMsY0FBSSxhQUFhLHVCQUF1QjtBQUVwQyxtQkFBTyxDQUFDLFNBQW1CO0FBQ3ZCLGtCQUFJLFNBQVMsUUFBVztBQUNwQix1QkFBTyxVQUFVLFFBQVE7QUFBQSxjQUM3QjtBQUNBLHdCQUFVLGFBQWEsSUFBSTtBQUFBLFlBQy9CO0FBQUEsVUFDSjtBQUdBLGlCQUFPO0FBQUEsUUFDWDtBQUlBLFlBQUkscUJBQXFCLHVCQUF1QixVQUFVLFVBQVU7QUFDaEUsZ0JBQU0sb0JBQW9CLFdBQVc7QUFDckMsZ0JBQU0sV0FBVyxrQkFBa0IsU0FBUztBQUM1QyxjQUFJLGFBQWEsdUJBQXVCO0FBQ3BDLG1CQUFPLENBQUMsU0FBbUI7QUFDdkIsa0JBQUksU0FBUyxPQUFXLFFBQU8sVUFBVSxRQUFRO0FBQ2pELHdCQUFVLGFBQWEsSUFBSTtBQUFBLFlBQy9CO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUdBLFlBQUksYUFBYSxPQUFPLFNBQVMsWUFBWSxZQUFZO0FBQ3JELGdCQUFNLGNBQWMsYUFBYTtBQUNqQyxjQUFJLFlBQVksbUJBQW1CLG1CQUFtQixZQUFZO0FBQzlELGtCQUFNLG9CQUFvQixXQUFXO0FBRXJDLG1CQUFPLFVBQVUsUUFBUSxjQUFjLGtCQUFrQixTQUFTLElBQUk7QUFBQSxVQUMxRTtBQUFBLFFBQ0o7QUFFQSwwQkFBa0IsWUFBWSxNQUFNLFNBQVM7QUFDN0MsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLFdBQVcsU0FBUyxVQUFVO0FBQzlCLGVBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM1QixnQkFBTSxnQkFBdUIsQ0FBQztBQUU5QixjQUFJLFdBQVcsU0FBUyxLQUFLO0FBQ3pCLDBCQUFjLEtBQUssSUFBSSxPQUFPLFdBQVcsU0FBUyxHQUFHLENBQUM7QUFBQSxVQUMxRDtBQUVBLHdCQUFjLEtBQUssQ0FBQyxTQUFjO0FBQzlCLG9CQUFRLElBQUk7QUFBQSxVQUNoQixDQUFDO0FBRUQsY0FBSSxXQUFXLFNBQVMsUUFBUTtBQUM1QiwwQkFBYyxLQUFLLEdBQUcsV0FBVyxTQUFTLE1BQU07QUFBQSxVQUNwRDtBQUdBLGdCQUFNLGNBQWMsaUJBQVMsV0FBVyxTQUFTLE9BQU87QUFFeEQsb0JBQVUsS0FBSyxJQUFJLFlBQVksR0FBRyxhQUFhLENBQUM7QUFBQSxRQUNwRCxDQUFDO0FBQUEsTUFDTDtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxLQUFLLENBQUMsR0FBbUIsTUFBYyxVQUFlO0FBRWxELFlBQU0sYUFBYSxTQUFTLElBQUk7QUFFaEMsVUFBSSxZQUFZLFlBQVksTUFBTSxTQUFTLEdBQUc7QUFDMUMsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLFdBQVcsU0FBUyxTQUFTLHdCQUF3QixNQUFNO0FBSTNELFlBQUkscUJBQXFCLDJCQUEyQjtBQUNoRCxnQkFBTSxvQkFBb0IsV0FBVztBQUNyQyxnQkFBTSxXQUFXLGtCQUFrQixTQUFTO0FBRTVDLGNBQUksYUFBYSxvQkFBb0I7QUFDakMsc0JBQVUsY0FBYyxLQUFLO0FBQzdCLG1CQUFPO0FBQUEsVUFDWDtBQUVBLGNBQUksYUFBYSx1QkFBdUI7QUFDcEMsc0JBQVUsYUFBYSxLQUFLO0FBQzVCLG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0o7QUFHQSxZQUFJLHFCQUFxQix1QkFBdUIsVUFBVSxVQUFVO0FBQ2hFLGdCQUFNLG9CQUFvQixXQUFXO0FBQ3JDLGdCQUFNLFdBQVcsa0JBQWtCLFNBQVM7QUFDNUMsY0FBSSxhQUFhLG9CQUFvQjtBQUFFLHNCQUFVLGNBQWMsS0FBSztBQUFHLG1CQUFPO0FBQUEsVUFBTTtBQUNwRixjQUFJLGFBQWEsdUJBQXVCO0FBQUUsc0JBQVUsYUFBYSxLQUFLO0FBQUcsbUJBQU87QUFBQSxVQUFNO0FBQUEsUUFDMUY7QUFHQSxZQUFJLGFBQWEsT0FBTyxTQUFTLFlBQVksWUFBWTtBQUNyRCxnQkFBTSxjQUFjLGFBQWE7QUFDakMsY0FBSSxZQUFZLG1CQUFtQixtQkFBbUIsWUFBWTtBQUM5RCxrQkFBTSxvQkFBb0IsV0FBVztBQUNyQyxrQkFBTSxnQkFBaUIsVUFBVSxRQUE4QjtBQUMvRCxrQkFBTSxXQUFXLGtCQUFrQixTQUFTO0FBRzVDLDBCQUFjLFFBQVEsSUFBSTtBQUcxQixnQkFBSSxhQUFhLHNCQUFzQixjQUFjLGtCQUFrQjtBQUNuRSxvQkFBTSxRQUFRLGNBQWM7QUFDNUIsNEJBQWMsbUJBQW1CO0FBQ2pDLG9CQUFNLFFBQVEsQ0FBQyxTQUF5QztBQUVwRCxvQkFBSSxVQUFVLGtCQUFtQjtBQUNqQyxzQkFBTSxLQUFLLFFBQVEsS0FBSyxPQUFPO0FBQUEsY0FDbkMsQ0FBQztBQUFBLFlBQ0w7QUFFQSxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBRUEsMEJBQWtCLFlBQVksTUFBTSxTQUFTO0FBQzdDLGVBQU87QUFBQSxNQUNYLE9BQU87QUFFSCxZQUFJLFdBQVcsU0FBUyxTQUFTO0FBRzdCLGNBQUksV0FBVyxTQUFTLFNBQVMsV0FBVztBQUN4QyxrQkFBTSxnQkFBdUIsQ0FBQztBQUU5QixnQkFBSSxXQUFXLFNBQVMsS0FBSztBQUN6Qiw0QkFBYyxLQUFLLElBQUksT0FBTyxXQUFXLFNBQVMsR0FBRyxDQUFDO0FBQUEsWUFDMUQ7QUFDQSwwQkFBYyxLQUFLLEtBQUs7QUFDeEIsZ0JBQUksV0FBVyxTQUFTLFFBQVE7QUFDNUIsNEJBQWMsS0FBSyxHQUFHLFdBQVcsU0FBUyxNQUFNO0FBQUEsWUFDcEQ7QUFHQSxrQkFBTSxjQUFjLGlCQUFTLFdBQVcsU0FBUyxPQUFPO0FBQ3hELHNCQUFVLEtBQUssSUFBSSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBQ2hELG1CQUFPO0FBQUEsVUFDWCxPQUFPO0FBQ0gsa0JBQU0sSUFBSTtBQUFBLGNBQ047QUFBQTtBQUFBO0FBQUEsYUFFYyxVQUFVLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQkFBb0IsRUFBRTtBQUFBO0FBQUEsYUFDM0UsSUFBSTtBQUFBLGtCQUNDLFdBQVcsU0FBUyxJQUFJO0FBQUE7QUFBQTtBQUFBLFlBRS9DO0FBRUEsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFFQSxZQUFVLFFBQVEsQ0FBQztBQUNuQixZQUFVLFFBQVEsSUFBSSxNQUFNLFVBQVUsT0FBTyxZQUFZO0FBRXpELFNBQU87QUFHWDtBQUVPLElBQU0saUJBQWlCLENBQUMsUUFBYSxjQUE4QjtBQUN0RSxTQUFPLElBQUksTUFBTSxRQUFRO0FBQUEsSUFDckIsSUFBSUMsU0FBUSxNQUFNO0FBT2QsVUFBSUEsUUFBTyxJQUFJLEdBQUc7QUFFZCxlQUFPQSxRQUFPLElBQUk7QUFBQSxNQUN0QjtBQUdBLFlBQU0saUJBQWlCLElBQUksU0FBUztBQUNoQyxlQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDNUIsZUFBSyxRQUFRLFNBQU87QUFDaEIsZ0JBQUksQ0FBQyx1QkFBdUIsR0FBRyxHQUFHO0FBQzlCLHFCQUFPLHVCQUF1QixNQUFNLEdBQUc7QUFBQSxZQUMzQztBQUFBLFVBQ0osQ0FBQztBQUNELG9CQUFVLEtBQUssSUFBSTtBQUFBLFlBQWlCLENBQUMsRUFBQyxLQUFLLFVBQVUsY0FBYyxrQkFBQUMsa0JBQWdCLE1BQU07QUFDakYsa0JBQUksS0FBSztBQUVMLHNCQUFNLFFBQVEsSUFBSSxRQUFRO0FBQzFCLG9CQUFJLE9BQU8sVUFBVSxZQUFZO0FBRTdCLHlCQUFPQSxrQkFBaUIsSUFBSSxRQUFRLEVBQUUsR0FBRyxZQUFZLEdBQUcsSUFBSTtBQUFBLGdCQUNoRSxPQUFPO0FBRUgseUJBQU9BLGtCQUFpQixPQUFPLElBQUk7QUFBQSxnQkFDdkM7QUFBQSxjQUNKO0FBQ0EscUJBQU87QUFBQSxZQUNYO0FBQUEsWUFDQTtBQUFBO0FBQUEsY0FFSSxXQUFXRCxRQUFPLFVBQVU7QUFBQSxjQUM1QixVQUFVO0FBQUEsY0FDVixjQUFjO0FBQUEsWUFDbEI7QUFBQSxZQUNBLENBQUMsUUFBUTtBQUNMLHNCQUFRLElBQUksT0FBTztBQUFBLFlBQ3ZCO0FBQUEsVUFBQyxDQUFDO0FBQUEsUUFDVixDQUFDO0FBQUEsTUFDTDtBQUtBLGFBQU87QUFBQSxJQUdYO0FBQUEsSUFDQSxJQUFJQSxTQUFRLE1BQWMsT0FBTztBQUM3QixnQkFBVSxLQUFLLElBQUk7QUFBQSxRQUFpQixDQUFDLEVBQUMsS0FBSyxVQUFVLFVBQVMsTUFBTTtBQUM1RCxjQUFJO0FBRUEsZ0JBQUksUUFBUSxJQUFJO0FBQUEsUUFDeEI7QUFBQSxRQUNBO0FBQUE7QUFBQSxVQUVJLFdBQVdBLFFBQU8sVUFBVTtBQUFBLFVBQzVCLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxRQUNkO0FBQUEsUUFDQSxDQUFDLFFBQVE7QUFBQSxRQUVUO0FBQUEsTUFBQyxDQUFDO0FBQ04sYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKLENBQUM7QUFDTDtBQUVPLElBQU0scUJBQXFCLENBQWtELEtBQVUsaUJBQW1DLFlBQThCLFlBQXdDO0FBQ25NLFFBQU0sWUFBWSxJQUFJO0FBQ3RCLE1BQUksQ0FBQztBQUNELFVBQU0sSUFBSSxNQUFNLDJDQUEyQztBQUkvRCxTQUFPLElBQUksUUFBUSxDQUFPLFNBQVMsV0FBVztBQUMxQyxVQUFNLGVBQWUsSUFBSSxpQkFBaUIsZ0JBQWdCLE1BQU0sV0FBVyxPQUFPO0FBQ2xGLGVBQVcsS0FBSyxZQUFZO0FBSTVCLFVBQU0sVUFBVSxVQUFVO0FBSTFCLFVBQU0sVUFBVSxXQUFXLE1BQU07QUFFN0IsYUFBTyxTQUFTO0FBQUEsSUFDcEIsR0FBRyxHQUFJO0FBRVAsY0FBVSxLQUFLLElBQUk7QUFBQSxNQUEwQixJQUFJO0FBQUEsTUFDN0M7QUFBQSxNQUNBLGlDQUNPLFVBQVUsVUFBVSxDQUFDLElBRDVCO0FBQUEsUUFFSSxJQUFJLGFBQWE7QUFBQSxRQUNqQixZQUFZO0FBQUEsTUFDaEI7QUFBQSxNQUNBLENBQU8sWUFBWTtBQUdmLHFCQUFhLE9BQU87QUFFcEIsWUFBSSxRQUFRLFFBQVE7QUFFaEIsaUJBQU8sa0NBQWtDO0FBQ3pDO0FBQUEsUUFDSjtBQUVBLGNBQU0sMEJBQTBCLFdBQVcsS0FBSyxPQUFLLEVBQUUsTUFBTSxhQUFhLEVBQUU7QUFHNUUsWUFBSSw0QkFBNEIsY0FBYztBQUcxQyxvQkFBVSxLQUFLLElBQUksVUFBVSxJQUFJLElBQUk7QUFDckMsa0JBQVEsdUJBQXVDO0FBQy9DO0FBQUEsUUFDSixPQUFPO0FBQ0gsdUJBQWEsYUFBYTtBQUMxQixvQkFBVSxLQUFLLElBQUksVUFBVSxJQUFJLElBQUk7QUFBQSxRQUN6QztBQW1CQSxnQkFBUSxXQUFXLFFBQVEscUJBQW1CO0FBQzFDLGdCQUFNLDRCQUE0QixnQkFBZ0IsU0FBUyx5QkFBMEIsS0FBSyxPQUFLLEVBQUUsS0FBSyxPQUFPLGdCQUFnQixxQkFBcUIsRUFBRztBQVNySixnQkFBTSxrQkFBa0IsSUFBSSxpQkFBaUIsMkJBQTJCLFlBQVk7QUFDcEYsMEJBQWdCLGFBQWE7QUFDN0IsdUJBQWEsS0FBSyxnQkFBZ0IsT0FBTyxJQUFJO0FBQzdDLHFCQUFXLEtBQUssZUFBZTtBQUFBLFFBQ25DLENBQUM7QUFHRCxZQUFJO0FBQ0EsZ0JBQU0sWUFBWSxjQUFjLGlCQUFpQixZQUFZLElBQUk7QUFJakUsY0FBSSxVQUFVO0FBRVYsc0JBQVUsNkJBQTZCO0FBRTNDLGtCQUFRLFlBQTRCO0FBQUEsUUFDeEMsU0FBUyxHQUFHO0FBRVIsaUJBQU8sQ0FBQztBQUFBLFFBRVo7QUFBQSxNQUNKO0FBQUEsSUFBQyxDQUFDO0FBQUEsRUFDVixFQUFDO0FBQ0w7QUFFTyxJQUFNLGNBQWMsQ0FBTyxXQUEyQixpQkFBbUMsWUFBOEIsdUJBQWdDLFVBQVU7QUFFcEssTUFBSSxDQUFDLFVBQVU7QUFDWCxjQUFVLE9BQU8sQ0FBQztBQUV0QixRQUFNLFVBQVUsT0FBTyxPQUFPLFVBQVUsb0JBQW9CLElBQUksRUFBRSxJQUFJLFNBQU87QUFDekUsV0FBTyxJQUFJLFFBQWMsQ0FBTyxTQUFTLFdBQVc7QUF6ZDVEO0FBMGRZLFVBQUksSUFBSSxTQUFTLFFBQVEsZ0JBQWdCLFdBQVc7QUFHaEQsWUFBSSxzQkFBc0I7QUFDdEIsa0JBQVE7QUFDUjtBQUFBLFFBQ0o7QUFJQSxZQUFJLGlCQUFrQixJQUFJLFNBQW1DO0FBQzdELFlBQUksQ0FBQztBQUNELDJCQUFrQixJQUFJLFNBQW1DLFNBQVM7QUFldEUsY0FBTSx5QkFBd0IscUJBQWdCLFNBQVMsNkJBQXpCLG1CQUFtRCxLQUFLLHFCQUFtQixnQkFBZ0IsS0FBSyxPQUFPO0FBRXJJLFlBQUksQ0FBQyx1QkFBdUI7QUFDeEIsZ0JBQU0sSUFBSSxNQUFNLGdGQUFnRjtBQUNoRztBQUFBLFFBQ0o7QUFnQkEsY0FBTSxPQUFPLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUztBQUUxQyxZQUFJO0FBRUEsZ0JBQU0sa0JBQWtCLE1BQU0sbUJBQW1CLE1BQU0sdUJBQXdCLFVBQVU7QUFJekYsb0JBQVUsS0FBSyxJQUFJLElBQUksSUFBSTtBQUUzQixrQkFBUTtBQUFBLFFBQ1osU0FBUyxHQUFHO0FBQ1IsaUJBQU8sQ0FBQztBQUFBLFFBQ1o7QUFBQSxNQUNKLE9BQU87QUFDSCxZQUFJO0FBQ0EsZ0JBQU0sZUFBZSxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVM7QUFDbEQsb0JBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxlQUFlLGNBQWMsU0FBUztBQUNqRSxrQkFBUTtBQUFBLFFBQ1osU0FBUyxHQUFHO0FBQUEsUUFFWjtBQUFBLE1BQ0o7QUFBQSxJQUNKLEVBQUM7QUFBQSxFQUNMLENBQUM7QUFDRCxNQUFJO0FBQ0EsVUFBTSxRQUFRLElBQUksT0FBTztBQUFBLEVBQzdCLFNBQVMsR0FBRztBQUVSLFVBQU07QUFBQSxFQUNWO0FBRUo7OztBQy9oQk8sSUFBTSxzQkFBTixjQUFrQyxrQkFBa0I7QUFBQTtBQUFBLEVBZ0J2RCxZQUFtQixpQkFBNkMsTUFBMEIsV0FBZ0MsZUFBa0MsU0FBeUI7QUFDakwsVUFBTSxpQkFBaUIsV0FBVyxPQUFPO0FBRDFCO0FBQXVFO0FBQWdDO0FBZDFILHdCQUFRO0FBQ1Isd0JBQVE7QUFDUix3QkFBUTtBQUdSO0FBQUEsd0JBQU8sWUFBVztBQUNsQix3QkFBUTtBQUNSO0FBQUEsd0JBQVE7QUFDUix3QkFBUSxhQUF5RCxDQUFDO0FBQ2xFLHdCQUFRO0FBQ1Isd0JBQVE7QUFDUix3QkFBUSxnQkFBZTtBQUN2QjtBQUFBLHdCQUFRO0FBYVI7QUFrRUE7QUE2QkEsMkRBQWtDLE1BQU07QUFDcEMsWUFBTSxpQkFBaUIsS0FBSyxLQUFLLElBQUkscUJBQXFCLE1BQU07QUFDNUQsZUFBTyxPQUFPLFNBQVMsZ0JBQWdCO0FBQUEsTUFDM0MsR0FBRyxDQUFDLFFBQVE7QUFDUixhQUFLLGNBQWMsTUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPO0FBQ2hELHVCQUFlO0FBQUEsTUFDbkIsQ0FBQyxDQUFDO0FBQUEsSUFDTjtBQUVBLDZEQUFvQyxNQUFNO0FBQ3RDLFlBQU0saUJBQWlCLEtBQUssS0FBSyxJQUFJLHFCQUFxQixDQUFDLEVBQUMsS0FBSSxNQUFNO0FBQ2xFLGNBQU0sRUFBQyxRQUFRLE1BQUssSUFBSSxTQUFTLGdCQUFnQixzQkFBc0I7QUFFdkUsY0FBTSxXQUFXLElBQUksZUFBZSxNQUFNO0FBQ3RDLGdCQUFNLEVBQUMsUUFBQUUsU0FBUSxPQUFBQyxPQUFLLElBQUksU0FBUyxnQkFBZ0Isc0JBQXNCO0FBQ3ZFLGVBQUssRUFBQyxRQUFBRCxTQUFRLE9BQUFDLE9BQUssQ0FBQztBQUFBLFFBQ3hCLENBQUM7QUFDRCxpQkFBUyxRQUFRLFNBQVMsZUFBZTtBQUN6QyxpQkFBUyxRQUFRLFNBQVMsSUFBSTtBQUU5QixlQUFPLEVBQUMsUUFBUSxNQUFLO0FBQUEsTUFDekIsR0FBRyxDQUFDLFFBQVE7QUFDUixhQUFLLGNBQWMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDckQsYUFBSyxjQUFjLE1BQU0sU0FBUyxHQUFHLElBQUksUUFBUSxNQUFNO0FBQUEsTUFDM0QsQ0FBQyxDQUFDO0FBRUYsYUFBTztBQUFBLElBQ1g7QUFhQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMkNBQWtCLENBQUMsWUFBOEM7QUFFN0QsV0FBSyxtQkFBbUI7QUFJeEIsVUFBSSxLQUFLLFVBQVU7QUFDZixhQUFLLGVBQWU7QUFDcEIsYUFBSyxlQUFlO0FBR3BCLFlBQUksS0FBSyxhQUFjLE1BQUssY0FBYyxLQUFLLGFBQWEsUUFBUSxLQUFLLGFBQWEsS0FBSztBQUMzRixlQUFPLE1BQU07QUFBRSxlQUFLLGVBQWU7QUFBTyxlQUFLLGVBQWU7QUFBQSxRQUFXO0FBQUEsTUFDN0U7QUFHQSxVQUFJLEtBQUssb0JBQW9CLEtBQUssaUJBQWlCO0FBQy9DLGFBQUssZ0JBQWdCO0FBQ3JCLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBRUEsWUFBTSxTQUFTLEtBQUs7QUFDcEIsWUFBTSxNQUFNLE9BQU87QUFFbkIsVUFBSSxDQUFDLEtBQUs7QUFDTixnQkFBUSxLQUFLLGdGQUFnRjtBQUM3RixlQUFPLE1BQU07QUFBQSxRQUFDO0FBQUEsTUFDbEI7QUFFQSxZQUFNLFFBQVEsQ0FBQyxPQUFlLEtBQWMsUUFBeUI7QUFDakUsWUFBSSxRQUFRLFVBQWEsUUFBUSxJQUFLLFFBQU87QUFDN0MsWUFBSSxRQUFRLFVBQWEsUUFBUSxJQUFLLFFBQU87QUFDN0MsZUFBTztBQUFBLE1BQ1g7QUFHQSxZQUFNLFlBQVksQ0FBQyxVQUEyRDtBQUMxRSxZQUFJLFVBQVUsT0FBVyxRQUFPO0FBQ2hDLFlBQUksT0FBTyxVQUFVLFNBQVUsUUFBTztBQUN0QyxjQUFNLFNBQVMsV0FBVyxLQUFLO0FBQy9CLGVBQU8sTUFBTSxNQUFNLElBQUksU0FBWTtBQUFBLE1BQ3ZDO0FBRUEsWUFBTSxhQUFhLE1BQU07QUF4TmpDO0FBeU5ZLGNBQU0sYUFBYSxPQUFPO0FBQzFCLFlBQUksQ0FBQyxXQUFZO0FBRWpCLGNBQU0sT0FBTyxLQUFLO0FBRWxCLGNBQU0sV0FBVyxVQUFVLDZCQUFNLFFBQVE7QUFDekMsY0FBTSxXQUFXLFVBQVUsNkJBQU0sUUFBUTtBQUN6QyxjQUFNLFlBQVksVUFBVSw2QkFBTSxTQUFTO0FBQzNDLGNBQU0sWUFBWSxVQUFVLDZCQUFNLFNBQVM7QUFDM0MsY0FBTSxtQkFBa0Isa0NBQU0sb0JBQU4sWUFBeUI7QUFPakQsY0FBTSxzQkFBb0IsVUFBSyxhQUFMLG1CQUFlLFdBQVUsU0FBUyxTQUFTO0FBQ3JFLGNBQU0sdUJBQXFCLFVBQUssYUFBTCxtQkFBZSxZQUFXLFNBQVMsU0FBUztBQUN2RSxjQUFNLHlCQUF3Qix3Q0FBTSxrQkFBTixZQUF1QixzQkFBdkIsWUFBNEM7QUFDMUUsY0FBTSwwQkFBeUIsa0NBQU0sbUJBQU4sWUFBd0I7QUFDdkQsY0FBTSxtQkFBbUIsMEJBQTBCO0FBQ25ELGNBQU0sb0JBQW9CLDJCQUEyQjtBQUdyRCxjQUFNLGdCQUFnQixLQUFLLFVBQVUsc0JBQXNCO0FBQzNELGNBQU0saUJBQWlCLGNBQWMsVUFBVTtBQUUvQyxjQUFNLGtCQUFrQixjQUFjLFdBQVcsS0FBSyxjQUFjLFdBQVc7QUFLL0UsY0FBTSxtQkFBa0IsNkJBQU0saUJBQ3hCLENBQUMsbUJBQ0Esa0JBQWtCLENBQUM7QUFDMUIsY0FBTSxvQkFBbUIsNkJBQU0saUJBQ3pCLENBQUMsb0JBQ0EsbUJBQW1CLENBQUM7QUFHM0IsWUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQjtBQUN2QyxpQkFBTyxNQUFNLFFBQVEsT0FBTywwQkFBMEIsV0FBVyxHQUFHLHFCQUFxQixPQUFPO0FBQ2hHLGlCQUFPLE1BQU0sU0FBUyxPQUFPLDJCQUEyQixXQUFXLEdBQUcsc0JBQXNCLE9BQU87QUFFbkcsNkNBQU0saUJBQU4sOEJBQXFCO0FBQUEsWUFDakIsT0FBTyxPQUFPLDBCQUEwQixXQUFXLHdCQUF3QjtBQUFBLFlBQzNFLFFBQVEsT0FBTywyQkFBMkIsV0FBVyx5QkFBeUI7QUFBQSxZQUM5RSxpQkFBaUI7QUFBQSxZQUNqQixrQkFBa0I7QUFBQSxVQUN0QjtBQUNBO0FBQUEsUUFDSjtBQU1BLGNBQU0saUJBQWlCLE9BQU8sTUFBTTtBQUNwQyxjQUFNLFlBQVksS0FBSztBQUN2QixjQUFNLDBCQUEwQixVQUFVLE1BQU07QUFDaEQsZUFBTyxNQUFNLGFBQWE7QUFDMUIsa0JBQVUsTUFBTSxhQUFhO0FBSzdCLGNBQU0sc0JBQXNCLE9BQU8sc0JBQXNCLEVBQUU7QUFDM0QsY0FBTSxxQkFBcUIsT0FBTyxzQkFBc0IsRUFBRTtBQUMxRCxjQUFNLGtCQUFrQixLQUFLLEtBQUssS0FBSyxJQUFJLFdBQVcsZ0JBQWdCLGNBQWMsV0FBVyxLQUFLLGNBQWMsV0FBVyxLQUFLLHNCQUFzQixFQUFFLE1BQU0sQ0FBQztBQUNqSyxjQUFNLGlCQUFpQixLQUFLLEtBQUssS0FBSyxJQUFJLFdBQVcsZ0JBQWdCLGFBQWEsV0FBVyxLQUFLLGFBQWEsV0FBVyxLQUFLLHNCQUFzQixFQUFFLEtBQUssQ0FBQztBQUU3SixZQUFJLGVBQWU7QUFDbkIsWUFBSSxnQkFBZ0I7QUFFcEIsY0FBTSxhQUFhLG9CQUFvQixrQkFBa0Isc0JBQXNCO0FBQy9FLGNBQU0sWUFBWSxtQkFBbUIsaUJBQWlCLHFCQUFxQjtBQU8zRSxjQUFNLHNCQUFzQixvQkFBb0IsQ0FBQztBQUNqRCxjQUFNLHFCQUFxQixtQkFBbUIsQ0FBQztBQUUvQyxZQUFJLHVCQUF1QixvQkFBb0I7QUFHM0MsZ0JBQU0sZ0JBQWdCLFVBQVUsTUFBTTtBQUN0QyxnQkFBTSxlQUFlLFVBQVUsTUFBTTtBQUNyQyxjQUFJLG9CQUFxQixXQUFVLE1BQU0sWUFBWSxHQUFHLG1CQUFtQjtBQUMzRSxjQUFJLG1CQUFvQixXQUFVLE1BQU0sV0FBVyxHQUFHLGtCQUFrQjtBQUV4RSxjQUFJLG9CQUFxQixRQUFPLE1BQU0sU0FBUztBQUMvQyxjQUFJLG1CQUFvQixRQUFPLE1BQU0sUUFBUTtBQUU3Qyx5QkFBZSxLQUFLLEtBQUssS0FBSyxJQUFJLFdBQVcsZ0JBQWdCLGFBQWEsV0FBVyxLQUFLLGFBQWEsV0FBVyxLQUFLLHNCQUFzQixFQUFFLEtBQUssQ0FBQztBQUNySiwwQkFBZ0IsS0FBSyxLQUFLLEtBQUssSUFBSSxXQUFXLGdCQUFnQixjQUFjLFdBQVcsS0FBSyxjQUFjLFdBQVcsS0FBSyxzQkFBc0IsRUFBRSxNQUFNLENBQUM7QUFPekosZ0JBQU0scUJBQXFCLHVCQUF1QixnQkFBZ0I7QUFDbEUsZ0JBQU0sb0JBQW9CLHNCQUFzQixlQUFlO0FBQy9ELGNBQUksc0JBQXNCLG1CQUFtQjtBQUN6QyxrQkFBTSxlQUFlLFdBQVcsY0FBYyxPQUFPO0FBQ3JELHlCQUFhLEtBQUs7QUFDbEIsa0JBQU0sUUFBa0IsQ0FBQztBQUN6QixnQkFBSSxvQkFBb0I7QUFDcEIsb0JBQU0sS0FBSywyQkFBMkIsNEJBQTRCLDZCQUE2QjtBQUFBLFlBQ25HO0FBQ0EsZ0JBQUksbUJBQW1CO0FBQ25CLG9CQUFNLEtBQUssMEJBQTBCLDJCQUEyQiw0QkFBNEI7QUFBQSxZQUNoRztBQUNBLHlCQUFhLGNBQWMsNEJBQTRCLE1BQU0sS0FBSyxJQUFJLENBQUM7QUFDdkUsdUJBQVcsS0FBSyxZQUFZLFlBQVk7QUFFeEMsMkJBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxXQUFXLGdCQUFnQixhQUFhLFdBQVcsS0FBSyxhQUFhLFdBQVcsS0FBSyxzQkFBc0IsRUFBRSxLQUFLLENBQUM7QUFDckosNEJBQWdCLEtBQUssS0FBSyxLQUFLLElBQUksV0FBVyxnQkFBZ0IsY0FBYyxXQUFXLEtBQUssY0FBYyxXQUFXLEtBQUssc0JBQXNCLEVBQUUsTUFBTSxDQUFDO0FBRXpKLHlCQUFhLE9BQU87QUFBQSxVQUN4QjtBQUdBLG9CQUFVLE1BQU0sWUFBWTtBQUM1QixvQkFBVSxNQUFNLFdBQVc7QUFBQSxRQUMvQjtBQUVBLGNBQU0sUUFBUSxNQUFNLGNBQWMsVUFBVSxRQUFRO0FBQ3BELGNBQU0sU0FBUyxNQUFNLGVBQWUsV0FBVyxTQUFTO0FBR3hELFlBQUksaUJBQWlCO0FBQ2pCLGlCQUFPLE1BQU0sUUFBUSxHQUFHLEtBQUs7QUFBQSxRQUNqQyxPQUFPO0FBQ0gsaUJBQU8sTUFBTSxRQUFRLE9BQU8sMEJBQTBCLFdBQVcsR0FBRyxxQkFBcUIsT0FBTztBQUFBLFFBQ3BHO0FBQ0EsWUFBSSxrQkFBa0I7QUFDbEIsaUJBQU8sTUFBTSxTQUFTLEdBQUcsTUFBTTtBQUFBLFFBQ25DLE9BQU87QUFDSCxpQkFBTyxNQUFNLFNBQVMsT0FBTywyQkFBMkIsV0FBVyxHQUFHLHNCQUFzQixPQUFPO0FBQUEsUUFDdkc7QUFLQSxlQUFPO0FBQ1AsZUFBTyxNQUFNLGFBQWE7QUFDMUIsa0JBQVUsTUFBTSxhQUFhO0FBSTdCLGNBQU0scUJBQXFCLG1CQUFtQixhQUFhLFVBQWEsZUFBZTtBQUN2RixjQUFNLHNCQUFzQixvQkFBb0IsY0FBYyxVQUFhLGdCQUFnQjtBQUMzRixtQkFBVyxnQkFBZ0IsTUFBTSxZQUFZLHFCQUFxQixTQUFTO0FBQzNFLG1CQUFXLGdCQUFnQixNQUFNLFlBQVksc0JBQXNCLFNBQVM7QUFFNUUsMkNBQU0saUJBQU4sOEJBQXFCO0FBQUEsVUFDakI7QUFBQSxVQUNBO0FBQUEsVUFDQSxpQkFBaUI7QUFBQSxVQUNqQixrQkFBa0I7QUFBQSxRQUN0QjtBQUFBLE1BQ0o7QUFHQSxpQkFBVztBQUdYLFdBQUssa0JBQWtCO0FBSXZCLFVBQUk7QUFDSixZQUFNLGlCQUFpQixNQUFNO0FBQ3pCLFlBQUksVUFBVSxPQUFXO0FBQ3pCLGdCQUFRLHNCQUFzQixNQUFNO0FBQ2hDLGtCQUFRO0FBQ1IscUJBQVc7QUFBQSxRQUNmLENBQUM7QUFBQSxNQUNMO0FBR0EsWUFBTSxpQkFBaUIsSUFBSSxlQUFlLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLHFCQUFlLFFBQVEsSUFBSSxJQUFJO0FBQy9CLHFCQUFlLFFBQVEsSUFBSSxlQUFlO0FBTTFDLFlBQU0sbUJBQW1CLElBQUksaUJBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLHVCQUFpQixRQUFRLElBQUksTUFBTSxFQUFFLFdBQVcsTUFBTSxTQUFTLE1BQU0sZUFBZSxNQUFNLFlBQVksS0FBSyxDQUFDO0FBRTVHLFlBQU0sVUFBVSxNQUFNO0FBQ2xCLHVCQUFlLFdBQVc7QUFDMUIseUJBQWlCLFdBQVc7QUFDNUIsWUFBSSxVQUFVLFFBQVc7QUFDckIsK0JBQXFCLEtBQUs7QUFDMUIsa0JBQVE7QUFBQSxRQUNaO0FBQ0EsYUFBSyxrQkFBa0I7QUFDdkIsYUFBSyxtQkFBbUI7QUFBQSxNQUM1QjtBQUNBLFdBQUssbUJBQW1CO0FBQ3hCLGFBQU87QUFBQSxJQUNYO0FBRUEseURBQWdDLE1BQU07QUFDbEMsWUFBTSxpQkFBaUIsS0FBSyxLQUFLLElBQUkscUJBQXFCLE1BQU07QUFDNUQsY0FBTSxFQUFDLFFBQVEsTUFBSyxJQUFJLFNBQVMsZ0JBQWdCLHNCQUFzQjtBQUN2RSxlQUFPLEVBQUMsUUFBUSxNQUFLO0FBQUEsTUFDekIsR0FBRyxDQUFDLFFBQVE7QUFDUixhQUFLLGNBQWMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDckQsYUFBSyxjQUFjLE1BQU0sU0FBUyxHQUFHLElBQUksUUFBUSxNQUFNO0FBQ3ZELHVCQUFlO0FBQUEsTUFDbkIsQ0FBQyxDQUFDO0FBQUEsSUFDTjtBQUVBLHdEQUErQixNQUFNO0FBQ2pDLFlBQU0saUJBQWlCLEtBQUssS0FBSyxJQUFJLHFCQUFxQixNQUFNO0FBTTVELGNBQU0sT0FBTyxNQUFNO0FBRWYsaUJBQU87QUFBQSxRQUNYO0FBRUEsWUFBSSxJQUFJLEtBQUs7QUFDYjtBQUNBO0FBS0EsZUFBTyxLQUFLO0FBQUEsVUFBSSxLQUFLO0FBQUEsWUFDYixPQUFPLFNBQVMsS0FBSztBQUFBLFlBQ3JCLE9BQU8sU0FBUyxLQUFLO0FBQUEsVUFBWTtBQUFBLFVBQ25DLE9BQU8sU0FBUyxLQUFLO0FBQUEsUUFBWSxJQUFJLElBQUk7QUFBQSxNQUVuRCxHQUFHLENBQUMsUUFBUTtBQUNSLGFBQUssY0FBYyxNQUFNLFNBQVMsSUFBSTtBQUN0Qyx1QkFBZTtBQUFBLE1BQ25CLENBQUMsQ0FBQztBQUFBLElBQ047QUFFQSxnQ0FBTyxDQUFDLFlBQTZDO0FBcGR6RDtBQXFkUSxVQUFJLFdBQVcsbUJBQUk7QUFFbkIsVUFBSSxTQUFTLGdCQUFnQixhQUFhLHdCQUF3QjtBQUM5RCxjQUFNLGVBQWdCO0FBQ3RCLGFBQUssYUFBYSxNQUFNLEVBQUU7QUFDMUIsZUFBTyxNQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0o7QUFNQSxlQUFTLFlBQVksaUJBQWlCO0FBQ3RDLFlBQU0saUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBQzFDLHVCQUFLLGtCQUFMLG1CQUFvQixrQkFBcEIsbUJBQW1DLFlBQVksVUFBVTtBQUt6RCxhQUFPO0FBQUEsSUFDWDtBQWNBLG1DQUFVLE1BQU07QUFDWixVQUFJLEtBQUssa0JBQWtCO0FBQ3ZCLGFBQUssaUJBQWlCO0FBQ3RCLGFBQUssbUJBQW1CO0FBQUEsTUFDNUI7QUFDQSxVQUFJLEtBQUssZ0JBQWdCO0FBQ3JCLGVBQU8sb0JBQW9CLFdBQVcsS0FBSyxjQUFjO0FBQ3pELGFBQUssaUJBQWlCO0FBQUEsTUFDMUI7QUFDQSxVQUFJLEtBQUs7QUFDTCxhQUFLLGVBQWU7QUFFeEIsWUFBTSxRQUFRO0FBQ2QsV0FBSyxjQUFjLFdBQVksWUFBWSxLQUFLLGFBQWE7QUFBQSxJQUNqRTtBQXhlSSxTQUFLLFVBQVUsS0FBSztBQUNwQixTQUFLLFlBQVksbUNBQVM7QUFBQSxFQUs5QjtBQUFBO0FBQUE7QUFBQSxFQU1BLGtCQUFrQjtBQUNkLFNBQUssV0FBVztBQUdoQixTQUFLLGFBQWE7QUFDbEIsU0FBSyxpQkFBaUIsQ0FBQyxNQUFvQjtBQUN2QyxVQUFJLEVBQUUsV0FBVyxLQUFLLGNBQWMsY0FBZTtBQUNuRCxZQUFNLElBQVMsRUFBRTtBQUNqQixVQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsS0FBTTtBQUM3QixVQUFJLEVBQUUsU0FBUyxZQUFZO0FBQ3ZCLFlBQUksS0FBSyxlQUFlLENBQUMsS0FBSyxrQkFBbUIsTUFBSyxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU87QUFBQSxpQkFDNUUsQ0FBQyxLQUFLLFlBQWEsTUFBSyxVQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxTQUFTLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFDNUYsV0FBVyxFQUFFLFNBQVMsYUFBYTtBQUMvQixhQUFLLGNBQWMsRUFBRSxRQUFRLEVBQUUsS0FBSztBQUFBLE1BQ3hDO0FBQUEsSUFDSjtBQUNBLFdBQU8saUJBQWlCLFdBQVcsS0FBSyxjQUFjO0FBQUEsRUFDMUQ7QUFBQTtBQUFBLEVBR0EsYUFBYSxNQUFxQjtBQTlEdEM7QUErRFEsU0FBSyxZQUFZO0FBQ2pCLHFCQUFLLGtCQUFMLG1CQUFvQixrQkFBcEIsbUJBQW1DLFlBQVksRUFBRSxRQUFRLE1BQU0sTUFBTSxhQUFhLEtBQUssR0FBRztBQUFBLEVBQzlGO0FBQUE7QUFBQSxFQUdBLFVBQW1CO0FBQ2YsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBLEVBR0EsY0FBYyxTQUEyRDtBQUNyRSxTQUFLLGNBQWM7QUFDbkIsUUFBSSxLQUFLLFVBQVUsU0FBUyxHQUFHO0FBQzNCLFlBQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxTQUFTO0FBQ2hDLFdBQUssWUFBWSxDQUFDO0FBQ2xCLFlBQU0sUUFBUSxVQUFRO0FBQUUsWUFBSSxDQUFDLEtBQUssa0JBQW1CLFNBQVEsS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBLE1BQUcsQ0FBQztBQUFBLElBQzlGO0FBQUEsRUFDSjtBQUFBLEVBRVEsY0FBYyxRQUFnQixPQUFnQjtBQWxGMUQ7QUFtRlEsUUFBSSxDQUFDLFVBQVUsT0FBTyxNQUFNLE1BQU0sRUFBRztBQUdyQyxTQUFLLGVBQWUsRUFBRSxRQUFRLE1BQU07QUFFcEMsUUFBSSxDQUFDLEtBQUssYUFBYztBQUN4QixVQUFNLE9BQU8sS0FBSztBQUNsQixVQUFNLFFBQVEsQ0FBQyxNQUNYLE1BQU0sU0FBWSxTQUFhLE9BQU8sTUFBTSxXQUFXLElBQUssTUFBTSxXQUFXLENBQUMsQ0FBQyxJQUFJLFNBQVksV0FBVyxDQUFDO0FBQy9HLFVBQU0sTUFBTSxNQUFNLDZCQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sNkJBQU0sU0FBUztBQUMvRCxRQUFJLElBQUk7QUFDUixRQUFJLFFBQVEsVUFBYSxJQUFJLElBQUssS0FBSTtBQUN0QyxRQUFJLFFBQVEsVUFBYSxJQUFJLElBQUssS0FBSTtBQUV0QyxTQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLFNBQUssY0FBYyxNQUFNLFFBQVE7QUFDakMsU0FBSyxjQUFjLE1BQU0sU0FBUyxJQUFJO0FBQ3RDLFNBQUssY0FBYyxNQUFNLFFBQVE7QUFDakMsdUNBQU0saUJBQU4sOEJBQXFCLEVBQUUsT0FBTyx3QkFBUyxLQUFLLGNBQWMsYUFBYSxRQUFRLEdBQUcsaUJBQWlCLE9BQU8sa0JBQWtCLEtBQUs7QUFBQSxFQUNySTtBQUFBLEVBSUEsVUFBVTtBQUVOLFFBQUksS0FBSyxnQkFBZ0I7QUFFckIsYUFBTyxLQUFLO0FBQUEsSUFDaEI7QUFDQSxTQUFLLGlCQUFpQixjQUFjLEtBQUssSUFBSSx1QkFBdUIsSUFBSSxLQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssbUJBQW1CO0FBQ3BJLFdBQU8sTUFBTTtBQUNULFdBQUssZUFBZ0I7QUFDckIsV0FBSyxpQkFBaUI7QUFBQSxJQUMxQjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU87QUFDSCxTQUFLLGNBQWMsTUFBTSxVQUFVO0FBQ25DLFNBQUssY0FBYyxNQUFNLFdBQVc7QUFDcEMsU0FBSyxjQUFjLE1BQU0sZ0JBQWdCO0FBQ3pDLFNBQUssY0FBYyxNQUFNLGFBQWE7QUFBQSxFQUMxQztBQUFBLEVBRUEsT0FBTztBQUNILFNBQUssY0FBYyxNQUFNLFVBQVU7QUFDbkMsU0FBSyxjQUFjLE1BQU0sV0FBVztBQUNwQyxTQUFLLGNBQWMsTUFBTSxnQkFBZ0I7QUFDekMsU0FBSyxjQUFjLE1BQU0sYUFBYTtBQUFBLEVBQzFDO0FBQUEsRUF5V0Esa0JBQWtCLGVBQXlDO0FBQ3ZELFFBQUksY0FBYyxnQkFBZ0IsYUFBYSxHQUFHLDJCQUMzQyxjQUFjLGdCQUFnQixhQUFhLEdBQUcsdUJBQXVCO0FBQ3hFLFdBQUssNkJBQTZCO0FBR2xDLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTyxNQUFNLGtCQUFrQixhQUFhO0FBQUEsRUFDaEQ7QUFpQko7OztBQzlmTyxJQUFlLGlCQUFmLE1BQXFEO0FBQUEsRUFBckQ7QUFJSCx1Q0FBYyxDQUFDLFdBQXdCLFNBQXNCLFlBQTZCO0FBYjlGO0FBY1EsVUFBSSxtQ0FBUyxVQUFVO0FBQ25CLFlBQUksUUFBUSxTQUFTLGNBQWMsVUFBVTtBQUN6QyxpQkFBTyxVQUFVLGFBQWEsU0FBUyxRQUFRLFNBQVMsS0FBSztBQUFBLFFBQ2pFO0FBRUEsWUFBSSxRQUFRLFNBQVMsY0FBYyxTQUFTO0FBQ3hDLGdCQUFNLGVBQWMsYUFBUSxTQUFTLFVBQWpCLG1CQUF3QjtBQUM1QyxpQkFBTyxVQUFVLGFBQWEsU0FBUyxjQUFjLGNBQWMsSUFBSTtBQUFBLFFBQzNFO0FBQUEsTUFDSixPQUFPO0FBQ0gsZUFBTyxVQUFVLFlBQVksT0FBTztBQUFBLE1BQ3hDO0FBQUEsSUFDSjtBQUFBO0FBQ0o7OztBQ3JCQSxJQUFNLGdCQUFnQixDQUFDLEtBQWEsT0FBZSxVQUFrQjtBQUVqRSxRQUFNLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFHMUIsU0FBTyxhQUFhLE9BQU8sT0FBTyxLQUFLO0FBR3ZDLFNBQU8sT0FBTyxTQUFTO0FBQzNCO0FBRU8sSUFBTSxtQkFBTixjQUErQixlQUFlO0FBQUEsRUFBOUM7QUFBQTtBQUNILGdDQUFPLFlBQVk7QUFHbkI7QUFBQSxnQ0FBTyxDQUFPLHFCQUFpRCxNQUFtQixXQUF3QixZQUE0QjtBQUNsSSxVQUFJO0FBRUosWUFBTSxvQkFBcUIsS0FBSztBQUVoQyxXQUFJLHVDQUFXLGNBQWEsVUFBVTtBQUNsQyxnQkFBUSxJQUFJLDZDQUE2QyxrQkFBa0IsS0FBSyxTQUFTO0FBRXpGLHdCQUFpQjtBQUNqQixzQkFBYyxNQUFNLGtCQUFrQjtBQUFBLE1BQzFDLE9BQU87QUFDSCxjQUFNLFNBQVMsT0FBTztBQUN0QixjQUFNLFFBQVEsYUFBYSxNQUFNO0FBRWpDLHdCQUFnQixTQUFTLGNBQWMsUUFBUTtBQUMvQyxzQkFBYyxLQUFLO0FBR25CLGNBQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMEJBS1Asa0JBQWtCLGNBQWMsQ0FBQyxrQkFBa0IsU0FBUyxTQUFTLGtCQUFrQixNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsNEJBSTVGLG1DQUFTLFVBQVMsTUFBTSxHQUFHO0FBQUEsbUNBQ3BCLG1DQUFTLFVBQVMsU0FBUyxLQUFLO0FBQUE7QUFFdEQsc0JBQWMsTUFBTSxVQUFVO0FBRzlCLFlBQUksbUNBQVMsbUJBQW1CO0FBQzVCLGlCQUFPLFFBQVEsUUFBUSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTTtBQUNoRSxnQkFBSSxVQUFVLE1BQU0sVUFBVSxRQUFRLFVBQVUsUUFBVztBQUN2RCw0QkFBYyxhQUFhLEtBQUssRUFBRTtBQUFBLFlBQ3RDLE9BQU87QUFDSCw0QkFBYyxhQUFhLEtBQUssT0FBTyxLQUFLLENBQUM7QUFBQSxZQUNqRDtBQUFBLFVBQ0osQ0FBQztBQUFBLFFBQ0w7QUFHQSxZQUFJLFdBQVksS0FBSyxPQUErQjtBQUNwRCxZQUFJLG1DQUFTO0FBQ1QscUJBQVcsY0FBYyxVQUFVLGNBQWMsTUFBTTtBQUUzRCxzQkFBYyxNQUFNO0FBR3BCLFlBQUksQ0FBQyxVQUFVLGNBQWMsb0JBQW9CO0FBQzdDLG9CQUFVLFlBQVk7QUFFMUIsd0JBQWdCLEtBQUssWUFBWSxXQUFXLGVBQWUsT0FBTztBQUFBLE1BR3RFO0FBRUEsYUFBTyxJQUFJLG9CQUFvQixxQkFBcUIsTUFBTSxXQUFXLGVBQWUsT0FBTztBQUFBLElBQy9GO0FBQUE7QUFDSjs7O0FDbEZPLElBQU0seUJBQXlCO0FBQUEsRUFDbEMsMEJBQTBCO0FBQzlCOzs7QUNLTyxJQUFNLG1CQUFOLGNBQStCLGtCQUFrQjtBQUFBLEVBRXBELFlBQVkscUJBQWlELE1BQTBCLFdBQWdDLGVBQTRCLFNBQXlCO0FBQ3hLLFVBQU0scUJBQXFCLFdBQVksT0FBTztBQURxQztBQUFnQztBQUt2SCwwQ0FBaUMsTUFBTTtBQUFBLElBQ3ZDO0FBeUJBLGdDQUFPLENBQUMsWUFBa0M7QUFDdEMsVUFBSSxXQUFXLG1CQUFJO0FBS25CLFlBQU0saUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBRTFDLFlBQU0sTUFBTSxJQUFJLFlBQTZCLHVCQUF1QiwwQkFBMEI7QUFBQTtBQUFBLFFBRTFGLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUlaLENBQUM7QUFLRCxVQUFJO0FBQ0EsYUFBSyxjQUFjLGNBQWMsR0FBRztBQUFBLE1BS3hDLFNBQVMsR0FBRztBQUNSLGdCQUFRLElBQUksdUNBQXVDLENBQUM7QUFBQSxNQUN4RDtBQUtBLGFBQU87QUFBQSxJQUNYO0FBRUEsbUNBQVUsTUFBTTtBQTNFcEI7QUE0RVEsWUFBTSxRQUFRO0FBQ2QsaUJBQUssY0FBYyxlQUFuQixtQkFBK0IsWUFBWSxLQUFLO0FBQUEsSUFDcEQ7QUFuRUksU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUtBLFVBQVU7QUFDTixTQUFLLGlCQUFpQixjQUFjLEtBQUssSUFBSSxvQkFBb0IsR0FBRyxLQUFLLFdBQVcsS0FBSyxlQUFlLEtBQUssbUJBQW1CO0FBQ2hJLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxPQUFPO0FBQ0gsU0FBSyxjQUFjLE1BQU0sVUFBVTtBQUNuQyxTQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLFNBQUssY0FBYyxNQUFNLGdCQUFnQjtBQUN6QyxTQUFLLGNBQWMsTUFBTSxhQUFhO0FBQ3RDLFNBQUssY0FBYyxNQUFNLFNBQVM7QUFDbEMsU0FBSyxjQUFjLE1BQU0sUUFBUTtBQUFBLEVBQ3JDO0FBQUEsRUFFQSxPQUFPO0FBQ0gsU0FBSyxjQUFjLE1BQU0sVUFBVTtBQUNuQyxTQUFLLGNBQWMsTUFBTSxXQUFXO0FBQ3BDLFNBQUssY0FBYyxNQUFNLGdCQUFnQjtBQUN6QyxTQUFLLGNBQWMsTUFBTSxhQUFhO0FBQ3RDLFNBQUssY0FBYyxNQUFNLFNBQVM7QUFDbEMsU0FBSyxjQUFjLE1BQU0sUUFBUTtBQUFBLEVBQ3JDO0FBeUNKOzs7QUN6RUEsSUFBTSxPQUFzQyxDQUFDO0FBRXRDLElBQU0scUJBQU4sY0FBaUMsZUFBZTtBQUFBLEVBQWhEO0FBQUE7QUFFSCxnQ0FBTyxZQUFZO0FBRW5CLGdDQUFPLENBQU8scUJBQWlELE1BQW1CLFdBQXdCLFlBQTRCO0FBRWxJLFlBQU0sZUFBZ0IsS0FBSztBQUUzQixVQUFJLENBQUMsS0FBSyxhQUFhLEdBQUcsR0FBRztBQUd6QixhQUFLLGFBQWEsR0FBRyxJQUFJLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUN0RCxnQkFBTSxzQkFBc0IsYUFBYTtBQUN6QyxnQkFBTSxTQUFTLFNBQVMsY0FBYyxRQUFRO0FBQzlDLGlCQUFPLE9BQU87QUFDZCxpQkFBTyxNQUFNO0FBQ2IsaUJBQU8sU0FBUyxNQUFNO0FBQ2xCLG9CQUFRO0FBQUEsVUFDWjtBQUVBLGlCQUFPLFVBQVUsTUFBTTtBQUNuQixtQkFBTztBQUFBLFVBQ1g7QUFDQSxtQkFBUyxLQUFLLFlBQVksTUFBTTtBQUFBLFFBQ3BDLENBQUM7QUFBQSxNQUNMLE9BQU87QUFDSCxnQkFBUSxJQUFJLDZDQUE2QztBQUFBLE1BQzdEO0FBRUEsWUFBTSxLQUFLLGFBQWEsR0FBRztBQUszQixZQUFNLEtBQUssQ0FBQztBQUVaLFVBQUksUUFBUSxhQUFhLE9BQU8sQ0FBQztBQUNqQyxZQUFNLFVBQVUsU0FBUyxjQUFjLGFBQWEsR0FBRztBQUd2RCxVQUFJLENBQUMsVUFBVSxjQUFjLG9CQUFvQjtBQUM3QyxrQkFBVSxZQUFZO0FBRzFCLGNBQVEsS0FBSztBQUViLFVBQUksbUNBQVMsUUFBUTtBQUNqQixnQkFBUSxNQUFNLFVBQVU7QUFDeEIsZ0JBQVEsTUFBTSxXQUFXO0FBQ3pCLGdCQUFRLE1BQU0sU0FBUztBQUN2QixnQkFBUSxNQUFNLFFBQVE7QUFDdEIsZ0JBQVEsTUFBTSxnQkFBZ0I7QUFDOUIsZ0JBQVEsTUFBTSxhQUFhO0FBQUEsTUFDL0I7QUFVQSxVQUFHLG1DQUFTLGNBQWE7QUFFckIsZ0JBQVEsbUJBQW1CLG1DQUFTO0FBQUEsTUFDeEM7QUFFQSxXQUFLLFlBQVksV0FBVyxTQUFTLE9BQU87QUFFNUMsYUFBTyxJQUFJLGlCQUFpQixxQkFBcUIsTUFBTSxXQUFXLFNBQVMsT0FBTztBQUFBLElBQ3RGO0FBQUE7QUFFSjs7O0FDakZBLElBQU8sMkJBQVE7OztBQ01SLElBQWUsaUNBQWYsY0FBdUYsMEJBQTZFO0FBQUEsRUFJdkssWUFBWSxlQUEyQixTQUF5RDtBQUM1RixVQUFNLGFBQWE7QUFEZ0I7QUFNdkMsb0NBQVcsQ0FBQyxVQUFhO0FBRXJCLFVBQUksTUFBTSxhQUFhO0FBQ25CLGNBQU0sY0FBYyxNQUFNO0FBQzFCLFlBQUksS0FBSyxRQUFRLFdBQVcsRUFBRSxTQUFTO0FBR25DLGdCQUFNLGlCQUFpQixDQUFDLFNBQTBCLGFBQStCO0FBQzdFLGlCQUFLLGNBQWMsaUNBQ1osVUFEWTtBQUFBLGNBRWYsUUFBUSxNQUFNLGNBQWMsTUFBTSxjQUFjLE1BQU07QUFBQSxjQUN0RCxhQUFhLE1BQU0sU0FBUyxNQUFNLFNBQVMsTUFBTTtBQUFBLFlBQ3JELElBQXNCLFFBQVE7QUFBQSxVQUNsQztBQUVBLGlCQUFPLEtBQUssY0FBYyxPQUFPLEtBQUssUUFBUSxXQUFXLEVBQUUsU0FBUyxjQUFjO0FBQUEsUUFDdEYsT0FBTztBQUNIO0FBQUEsUUFDSjtBQUFBLE1BQ0osT0FBTztBQUNIO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQTFCQTtBQTJCSjs7O0FDakNPLElBQU1DLHNCQUFOLGNBQWlDLCtCQUFpRDtBQUFBLEVBQWxGO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLHlDQUFnQixDQUFDLE9BQXlCLGVBQThCLGtCQUFpQztBQUNyRyxZQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLFVBQVU7QUFDbEUsWUFBTSxlQUFzQixDQUFDO0FBRTdCLFlBQU0sUUFBUSxVQUFRO0FBQ2xCLGNBQU0sVUFBVSxNQUFNO0FBQ2xCLHdCQUFjLElBQUksbUJBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQUEsUUFDL0Q7QUFFQSxhQUFLLGlCQUFpQixTQUFTLE9BQU87QUFDdEMscUJBQWEsS0FBSyxNQUFNO0FBQ3BCLGVBQUssb0JBQW9CLFNBQVMsT0FBTztBQUFBLFFBQzdDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFFRCxhQUFPLE1BQU07QUFDVCxxQkFBYSxRQUFRLFVBQVEsS0FBSyxDQUFDO0FBQUEsTUFDdkM7QUFBQSxJQUNKO0FBQUE7QUFDSjs7O0FDdkJPLElBQU1DLHFCQUFOLGNBQWdDLCtCQUFtRDtBQUFBLEVBQW5GO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLHlDQUFnQixDQUFDLE9BQTJCLGtCQUFpQztBQUN6RSxZQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLFVBQVU7QUFDbEUsWUFBTSxRQUFRLFVBQVE7QUFDbEIsYUFBSyxjQUFjLE1BQU07QUFBQSxNQUM3QixDQUFDO0FBQUEsSUFDTDtBQUFBO0FBQ0o7OztBQ2RPLElBQU0sZ0JBQU4sY0FBNEIsUUFBUTtBQUFBLEVBQ3ZDLFlBQW1CLFdBQStCLFlBQXdCO0FBQ3RFLFVBQU0sV0FBVyxVQUFVO0FBRFo7QUFBK0I7QUFBQSxFQUVsRDtBQUNKOzs7QUNDTyxJQUFNQyxnQ0FBTixjQUEyQywrQkFBc0Q7QUFBQSxFQUFqRztBQUFBO0FBQ0gseUNBQWdCLENBQUMsT0FBOEIsa0JBQWlDO0FBRzVFLFlBQU0sZUFBZSxjQUFjLFdBQVcsaUJBQWlCLElBQUksZUFBZSxFQUFFLEdBQUc7QUFFdkYsVUFBSSxXQUE2QixDQUFDO0FBRWxDLG1CQUFhLFFBQVEsVUFBUTtBQUt6QixjQUFNLFNBQVMsS0FBSyxhQUFhLGVBQWUsRUFBRTtBQUVsRCxZQUFJLFFBQVE7QUFHUixtQkFBUyxLQUFLLElBQUksZUFBZSxRQUFRLEtBQUssU0FBUyxLQUFLLHNCQUFzQixHQUFHLEtBQUssV0FBVyxLQUFLLFVBQVUsQ0FBQztBQUFBLFFBQ3pIO0FBQUEsTUFDSixDQUFDO0FBRUQsV0FBSyxjQUFjLElBQUksd0JBQXdCLE1BQU0saUJBQWlCLFFBQVEsQ0FBQztBQUFBLElBQ25GO0FBRUEsdUNBQWMsYUFBYTtBQUFBO0FBRy9COzs7QUM3Qk8sSUFBTUMsdUJBQU4sY0FBa0MsK0JBQW9EO0FBQUEsRUFBdEY7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0IseUNBQWdCLENBQUMsT0FBNEIsa0JBQWlDO0FBQzFFLFlBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxZQUFNLFFBQVEsVUFBUTtBQUNsQixhQUFLLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSztBQUFBLE1BQzdDLENBQUM7QUFBQSxJQUNMO0FBQUE7QUFDSjs7O0FDTk8sSUFBTUMsMkJBQU4sY0FBc0MsK0JBQXdEO0FBQUEsRUFBOUY7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0IseUNBQWdCLENBQUMsT0FBZ0MsZUFBOEIsa0JBQWlDO0FBRTVHLFlBQU0sUUFBUSxpQkFBaUIsTUFBTSxLQUFLLGNBQWMsVUFBVTtBQUNsRSxZQUFNLGVBQStCLENBQUM7QUFFdEMsWUFBTSxRQUFRLFVBQVE7QUFDbEIsY0FBTSxVQUFVLENBQUMsTUFBTTtBQUduQix3QkFBYyxJQUFJLDZCQUE2QixNQUFNLGlCQUFrQixpQkFBaUIsR0FBRyxNQUFNLG9CQUFvQixDQUFDLENBQUM7QUFBQSxRQUMzSDtBQUVBLGFBQUssaUJBQWlCLE1BQU0sTUFBTSxPQUFPO0FBRXpDLHFCQUFhLEtBQUssTUFBTTtBQUNwQixlQUFLLG9CQUFvQixNQUFNLE1BQU0sT0FBTztBQUFBLFFBQ2hELENBQUM7QUFBQSxNQUNMLENBQUM7QUFFRCxhQUFPLE1BQU07QUFDVCxxQkFBYSxRQUFRLFVBQVEsS0FBSyxDQUFDO0FBQUEsTUFDdkM7QUFBQSxJQUNKO0FBQUE7QUFDSjs7O0FDN0JPLElBQU0sbUNBQU4sY0FBK0MsK0JBQTBEO0FBQUEsRUFBekc7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0IseUNBQWdCLENBQUMsT0FBa0MsZUFBOEIsa0JBQWlDO0FBRTlHLFlBQU0sWUFBWSxNQUFZO0FBRTFCLGNBQU0sV0FBVyxjQUFjLFdBQVcsaUJBQThCLElBQUksZUFBZSxFQUFFLEtBQUssTUFBTSxVQUFVLFFBQVEsSUFBSTtBQUU5SCxZQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3ZCLGdCQUFNQyxXQUFVLFFBQVEsU0FBUztBQUVqQyxnQkFBTSxlQUFlQSxTQUFRLFdBQVcsS0FBSyxPQUFLLEVBQUUsT0FBTyxNQUFNLFFBQVEsRUFBRTtBQUMzRSxjQUFJLGNBQWM7QUFFZCx5QkFBYSxRQUFRO0FBQUEsVUFDekIsT0FBTztBQUFBLFVBRVA7QUFJQSxnQkFBTSxRQUFRQSxTQUFRLFdBQVcsUUFBUSxZQUFZO0FBQ3JELGNBQUksVUFBVSxJQUFJO0FBQ2QsWUFBQUEsU0FBUSxXQUFXLE9BQU8sT0FBTyxDQUFDO0FBQUEsVUFFdEMsT0FBTztBQUFBLFVBRVA7QUFFQSxnQkFBTSwwQkFBMEIsTUFBTUEsU0FBUTtBQUFBLFlBQWMsTUFBTTtBQUFBLFlBQzlELFNBQVMsS0FBSyxDQUFDO0FBQUEsWUFDZixNQUFNO0FBQUEsVUFBTztBQVNqQixnQkFBTSxrQkFBeUIsQ0FBQztBQUVoQyxpQkFBTyxLQUFLLHdCQUF3QixJQUFJLEVBQUUsUUFBUSxhQUFXO0FBQ3pELGdCQUFJLE1BQU0sd0JBQXdCLEtBQUssT0FBTztBQUM5QyxrQkFBTSxJQUFJLGdCQUFnQjtBQUUxQixnQkFBSyxJQUF1QixxQkFBcUI7QUFDN0MsOEJBQWdCLEtBQUs7QUFBQSxnQkFDakI7QUFBQSxnQkFDQSx1QkFBd0IsSUFBdUIsb0JBQW9CO0FBQUEsY0FDdkUsQ0FBQztBQUFBLFlBQ0w7QUFBQSxVQUNKLENBQUM7QUFFRCx3QkFBYyxJQUFJLDJCQUEyQixNQUFNLGlCQUFpQixlQUFlLENBQUM7QUFBQSxRQUN4RixPQUFPO0FBQ0gsa0JBQVEsTUFBTSwwREFBMEQ7QUFDeEUsZUFBSyxjQUFjLElBQUksMkJBQTJCLE1BQU0saUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUM7QUFFbEY7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGdCQUFVLEVBQUUsS0FBSztBQUFBLElBRXJCO0FBQUE7QUFDSjs7O0FDdEVPLElBQU1DLHdCQUFOLGNBQW1DLCtCQUFxRDtBQUFBLEVBQXhGO0FBQUE7QUFDSCx1Q0FBYyxhQUFhO0FBRTNCLHlDQUFnQixDQUFDLE9BQTZCLGVBQThCLGtCQUFpQztBQUN6RyxZQUFNLFVBQVUsQ0FBQyxTQUFjO0FBQzNCLHNCQUFjLElBQUksMEJBQTBCLE1BQU0saUJBQWlCLElBQUksQ0FBQztBQUFBLE1BQzVFO0FBRUEsbUNBQTZCLE9BQU8sU0FBUyxhQUFhO0FBQUEsSUFDOUQ7QUFBQTtBQUNKOzs7QUNSQSxJQUFNLGdCQUFnQixDQUFDLFlBQStCO0FBQ2xELE1BQUksQ0FBQyxRQUFTLFFBQU87QUFHckIsTUFBSSxRQUFRLFlBQVksUUFBUTtBQUM1QixVQUFNLFdBQVcsSUFBSSxTQUFTLE9BQU87QUFDckMsVUFBTSxhQUFnQztBQUFBLE1BQ2xDLFVBQVUsQ0FBQztBQUFBLE1BQ1gsY0FBYyxDQUFDO0FBQUEsSUFDbkI7QUFHQSxVQUFNLFdBQVcsUUFBUSxpQkFBaUIseUJBQXlCO0FBQ25FLFFBQUksa0JBQWtCO0FBRXRCLGFBQVMsUUFBUSxDQUFBQyxhQUFXO0FBQ3hCLFVBQUksT0FBT0EsU0FBUSxVQUFVLFVBQVU7QUFDbkMsY0FBTSxTQUFTQSxTQUFRLGFBQWEsZUFBZSxFQUFFO0FBQ3JELFlBQUksTUFBTUEsU0FBUSxhQUFhLE1BQU07QUFJckMsY0FBTSxXQUEwQjtBQUFBLFVBQzVCLElBQUlBLFNBQVE7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLE9BQU8sY0FBY0EsUUFBTztBQUFBLFVBQzVCLFVBQVVBLFNBQVE7QUFBQSxVQUNsQixVQUFVLGlCQUFpQkEsU0FBUSxVQUFVLElBQUk7QUFBQSxVQUNqRDtBQUFBLFFBQ0o7QUFFQSxZQUFJLENBQUMsS0FBSztBQUNOLHFCQUFXLGFBQWMsS0FBSyxRQUFRO0FBQUEsUUFDMUMsT0FBTztBQUNILGNBQUksV0FBVyxTQUFVLEdBQUcsR0FBRztBQUMzQixnQkFBSSxXQUFXLFNBQVUsR0FBRyxFQUFFLE9BQU87QUFDakMseUJBQVcsYUFBYyxLQUFLLFFBQVE7QUFBQSxZQUMxQyxPQUFPO0FBQ0gseUJBQVcsYUFBYyxLQUFLLFdBQVcsU0FBVSxHQUFHLENBQUM7QUFDdkQseUJBQVcsU0FBVSxHQUFHLElBQUk7QUFBQSxZQUNoQztBQUFBLFVBQ0osT0FBTztBQUNILHVCQUFXLFNBQVUsR0FBRyxJQUFJO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELFdBQU87QUFBQSxFQUNYO0FBR0EsTUFBSSxRQUFRLFNBQVMsY0FBYyxRQUFRLFNBQVMsU0FBUztBQUN6RCxXQUFPLFFBQVEsVUFBVSxRQUFRLFFBQVE7QUFBQSxFQUM3QztBQUdBLE1BQUksUUFBUSxZQUFZLFdBQVcsUUFBUSxZQUFZLFlBQVk7QUFDL0QsV0FBTyxRQUFRO0FBQUEsRUFDbkI7QUFHQSxNQUFJLFFBQVEsWUFBWSxVQUFVO0FBQzlCLFdBQU8sUUFBUTtBQUFBLEVBQ25CO0FBR0EsTUFBSSxRQUFRLG1CQUFtQjtBQUMzQixXQUFPLFFBQVEsYUFBYSxRQUFRO0FBQUEsRUFDeEM7QUFHQSxTQUFPO0FBQ1g7QUFFTyxJQUFNLHlCQUFOLGNBQXFDLCtCQUF1RDtBQUFBLEVBQTVGO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLHlDQUFnQixDQUFDLE9BQStCLGVBQThCLGtCQUFpQztBQUMzRyxZQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLFVBQVU7QUFDbEUsWUFBTSxRQUFRLFVBQVE7QUFFbEIsc0JBQWMsSUFBSSwwQkFBMEIsY0FBYyxJQUFJLENBQUMsR0FBRyxLQUFLO0FBQUEsTUFDM0UsQ0FBQztBQUFBLElBQ0w7QUFBQTtBQUNKOzs7QUN2Rk8sSUFBTSxzQkFBTixjQUFrQywrQkFBNkM7QUFBQSxFQUEvRTtBQUFBO0FBRUgsdUNBQWMsYUFBYTtBQUUzQix5Q0FBZ0IsQ0FBQyxPQUEyQixrQkFBaUM7QUFDekUsWUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssY0FBYyxVQUFVO0FBQ2xFLFlBQU0sUUFBUSxVQUFRO0FBQ2xCLGFBQUssWUFBWSxNQUFNO0FBQUEsTUFDM0IsQ0FBQztBQUFBLElBQ0w7QUFBQTtBQUNKOzs7QUM4Q08sSUFBTSxrQkFBTixjQUE4QixZQUFZO0FBQUEsRUFBMUM7QUFBQTtBQUVILHFEQUE0QjtBQUc1QjtBQUFBLDZDQUFvQixDQUFDLFdBQXdCLFdBQXVCO0FBQ2hFLGdCQUFVLGlCQUFpQix1QkFBdUIsMEJBQTBCLENBQUMsTUFBVztBQUVwRixjQUFNLGVBQWUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pDLFlBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLE1BQU07QUFDckM7QUFDQSxnQkFBTSxJQUFJLE1BQU0sOENBQThDO0FBQUEsUUFDbEUsT0FBTztBQUNILGdCQUFNLFVBQVU7QUFHaEIsZUFBSyxxQkFBcUIsQ0FBQztBQUUzQixjQUFJLFFBQVEsZ0JBQWdCLGFBQWEsYUFBYTtBQUVsRCxrQkFBTSxpQkFBa0IsUUFBd0IsUUFBUTtBQUN4RCxpQkFBSyxXQUFXLGNBQWMsRUFBRSxVQUFVLElBQUksY0FBYyxXQUFXLE1BQU07QUFBQSxVQUtqRjtBQUFBLFFBQ0o7QUFBQSxNQUNKLENBQUM7QUFHRCxpQkFBVyxNQUFNO0FBQ2IsYUFBSyxjQUFjLElBQUksWUFBWSxDQUFDO0FBQUEsTUFDeEMsR0FBRyxDQUFDO0FBQUEsSUFDUjtBQUVBLHlDQUFnQixDQUFDLFNBQWdDLGFBQStCO0FBQzVFLGNBQVEsWUFBWSxpQkFBaUI7QUFHckMsVUFBSSxDQUFDLFFBQVEsb0JBQW1CLHFDQUFVO0FBQ3RDLGdCQUFRLGtCQUFrQixTQUFTO0FBRXZDLGFBQU8sS0FBSyxRQUFRLEtBQUssT0FBTztBQUFBLElBQ3BDO0FBRUEsNkNBQXNEO0FBQUEsTUFDbEQsSUFBSUMsbUJBQWtCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUN6RCxJQUFJLG9CQUFvQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDM0QsSUFBSUMsb0JBQW1CLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUMxRCxJQUFJQyw4QkFBNkIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQ3BFLElBQUlDLHFCQUFvQixLQUFLLGVBQWUsS0FBSyxVQUFVO0FBQUEsTUFDM0QsSUFBSUMseUJBQXdCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxNQUMvRCxJQUFJQyxzQkFBcUIsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLE1BQzVELElBQUksdUJBQXVCLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQTtBQUFBLE1BRTlELElBQUksaUNBQWlDLEtBQUssZUFBZSxLQUFLLFVBQVU7QUFBQSxJQUM1RTtBQUVBLHdCQUFPLFFBQU8sTUFBTTtBQUFBLElBR3BCO0FBQUE7QUFDSjtBQUVBLG9CQUFvQixtQkFBbUIsZUFBZTs7O0FDbEh0RCxTQUFRLHNCQUFzQix3QkFBdUI7QUFHckQsSUFBTSw0QkFBNEI7QUFDbEMsSUFBTSwrQkFBK0I7QUFHckMsSUFBTSwrQkFBNEMsb0JBQUksSUFBSTtBQUUxRCxJQUFNQyxRQUFpQixDQUFDO0FBQ3hCLElBQUk7QUFDSixJQUFNLGtCQUFrQixNQUFZO0FBQ2hDLE1BQUksQ0FBQyxLQUFLO0FBRU4sVUFBTSxJQUFJLGdCQUFnQjtBQUMxQixRQUFJLEtBQUs7QUFBQSxFQUNiO0FBQ0EsU0FBTztBQUNYO0FBRUEsU0FBUyw2QkFBNkIsWUFBb0IsZ0JBQXlFO0FBQy9ILFNBQU8sY0FBYyxZQUFZO0FBQUEsSUFFN0Isb0JBQW9CO0FBQ2hCLFlBQU0sT0FBTyxtQkFBbUIsbUJBQW1CLE9BQU8sU0FBUztBQUNuRSxZQUFNLFNBQVMsS0FBSyxhQUFhLEVBQUMsS0FBSSxDQUFDO0FBQ3ZDLHNCQUFnQixFQUFFLEtBQUssQ0FBQ0MsU0FBUTtBQUM1QixRQUFBQSxLQUFJLGtCQUFrQixNQUFNLE1BQU07QUFDbEMsZUFBTyxZQUFZO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQ0o7QUFFQSxJQUFNLDJCQUEyQixDQUFDLGVBQXVCLE1BQWMsbUJBQXFEO0FBQ3hILGlCQUFlLE9BQU8sZUFBZSw2QkFBNkIsTUFBTSxjQUFjLENBQUM7QUFDdkYsVUFBUSxJQUFJLFdBQVcsYUFBYSwyQ0FBMkM7QUFDbkY7QUFFQSxJQUFNLHFCQUFxQixDQUFDLFFBQVE7QUFDaEMsU0FBTyxJQUNGLFFBQVEsbUJBQW1CLE9BQU8sRUFDbEMsUUFBUSxVQUFVLEtBQUssRUFDdkIsWUFBWTtBQUNyQjtBQUVBLElBQU0sc0JBQXNCLENBQUMsU0FBaUI7QUFDMUMsU0FBTyxtQkFBbUIsSUFBSTtBQUM5QixTQUFPLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFDakM7QUFJTyxJQUFNLHNCQUFOLGNBQWtDLGVBQWU7QUFBQSxFQUFqRDtBQUFBO0FBRUgsZ0NBQU8sWUFBWTtBQStObkIsZ0NBQU8sQ0FBTyxxQkFBaUQsTUFBbUIsV0FBd0IsWUFBNEI7QUFFbEksWUFBTSxlQUFnQixLQUFLO0FBRTNCLFlBQU0sT0FBTyxLQUFLLG1CQUFtQixhQUFhLElBQUk7QUFDdEQsWUFBTSxFQUFFLE1BQU0sUUFBUSxJQUFJLE1BQU0sS0FBSyxrQkFBa0IscUJBQXFCLE1BQU0sY0FBYyxNQUFNLE9BQU87QUFFN0csVUFBSSxTQUFTLE9BQU87QUFDaEIsY0FBTSxJQUFJLE1BQU0sNERBQTRELG9CQUFvQixFQUFFLEdBQUc7QUFBQSxNQUN6RztBQUVBLFVBQUksTUFBTTtBQUlOLFlBQUksU0FBUyxnQkFBZ0I7QUFDekIsZ0JBQU0sSUFBSSxNQUFNLHlFQUF5RSxvQkFBb0IsRUFBRSxHQUFHO0FBQUEsUUFDdEg7QUFDQSxlQUFPLEtBQUssMEJBQTBCLHFCQUFxQixNQUFNLFdBQVcsYUFBYSxNQUFNLE9BQU87QUFBQSxNQUMxRztBQUVBLFVBQUksUUFBUSxhQUFhLE9BQU8sQ0FBQztBQUNqQyxVQUFJO0FBRUosVUFBSSxhQUFhLG1CQUFtQixtQkFBbUIsWUFBWTtBQUMvRCxjQUFNLFNBQVMsT0FBTztBQUN0QixjQUFNQyxTQUFRLGFBQWEsTUFBTTtBQUVqQyxZQUFJLGdCQUFnQixTQUFTLGNBQWMsUUFBUTtBQUNuRCxzQkFBYyxLQUFLQTtBQUtuQixZQUFJLFNBQVM7QUFDVCx3QkFBYyxhQUFhLFdBQVcsd0NBQXdDO0FBQUEsUUFDbEY7QUFHQSxzQkFBYyxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQVFmLG1DQUFTLFVBQVMsTUFBTSxHQUFHO0FBQUE7QUFBQTtBQUFBLG1DQUdwQixtQ0FBUyxVQUFTLFNBQVMsS0FBSztBQUFBO0FBSXRELFlBQUksQ0FBQyxVQUFVLGNBQWMsb0JBQW9CO0FBQzdDLG9CQUFVLFlBQVk7QUFFMUIsd0JBQWdCLEtBQUssWUFBWSxXQUFXLGVBQWUsT0FBTztBQUtsRSxjQUFNLGFBQXVCLENBQUM7QUFDOUIsY0FBTSxNQUFpRSxVQUNqRTtBQUFBLFVBQ0UsT0FBTztBQUFBLFVBQUM7QUFBQSxVQUNSLFFBQVEsR0FBVztBQUFFLHVCQUFXLEtBQUssQ0FBQztBQUFBLFVBQUc7QUFBQSxVQUN6QyxRQUFRO0FBQUUsMEJBQWMsU0FBUyxXQUFXLEtBQUssSUFBSTtBQUFBLFVBQUc7QUFBQSxRQUM1RCxLQUNHLE1BQU07QUFFTCxnQkFBTSxJQUFJLGNBQWMsbUJBQW1CLGNBQWMsY0FBYztBQUN2RSxZQUFFLEtBQUs7QUFDUCxpQkFBTztBQUFBLFFBQ1gsR0FBRztBQUtQLFlBQUksaUJBQTZKO0FBQ2pLO0FBQ0ksZ0JBQU0sYUFBYSxJQUFJLFVBQVU7QUFDakMsZ0JBQU0sVUFBVSxXQUFXLGdCQUFnQixhQUFhLE1BQU0sV0FBVztBQUN6RSxnQkFBTSxXQUFXLFFBQVEsY0FBYyx3QkFBd0I7QUFDL0QsY0FBSSxVQUFVO0FBQ1YsZ0JBQUk7QUFBRSwrQkFBaUIsS0FBSyxNQUFNLFNBQVMsYUFBYSxTQUFTLEtBQUssSUFBSTtBQUFBLFlBQUcsU0FBUTtBQUFBLFlBQUM7QUFBQSxVQUMxRjtBQUFBLFFBQ0o7QUFFQSxZQUFJLGNBQWMsYUFBYTtBQUUvQixZQUFJLG1DQUFTLGFBQWE7QUFFdEIsZ0JBQU0sU0FBUyxJQUFJLFVBQVU7QUFDN0IsZ0JBQU0sT0FBTyxPQUFPLGdCQUFnQixhQUFhLE1BQU0sV0FBVztBQUdsRSxnQkFBTSxzQkFBc0IsS0FBSyxlQUFlLGNBQWM7QUFDOUQscUVBQXFCLGdCQUFnQjtBQUdyQyxnQkFBTSxPQUFPLEtBQUssZUFBZSxtQkFBbUI7QUFDcEQsZUFBSyxLQUFLLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT3RCLGdCQUFNLE9BQU8sS0FBSyxLQUFLO0FBRXZCLGNBQUksUUFBUSxLQUFLLE1BQU07QUFDbkIsaUJBQUssS0FBSyxhQUFhLEtBQUssV0FBVyxNQUFNLElBQUksR0FBRyxLQUFLLEtBQUssVUFBVTtBQUFBLFVBQzVFO0FBT0Esd0JBQWMsb0JBQW9CLEtBQUssZ0JBQWdCO0FBQUEsUUFDM0QsWUFBVyxtQ0FBUyxVQUFTLFFBQVc7QUFLcEMsZ0JBQU0sU0FBUyxJQUFJLFVBQVU7QUFDN0IsZ0JBQU0sT0FBTyxPQUFPLGdCQUFnQixhQUFhLE1BQU0sV0FBVztBQUNsRSxnQkFBTSxzQkFBc0IsS0FBSyxlQUFlLGNBQWM7QUFFOUQsY0FBSSxxQkFBcUI7QUFDckIsZ0NBQW9CLE9BQU87QUFFM0IsMEJBQWMsb0JBQW9CLEtBQUssZ0JBQWdCO0FBQUEsVUFDM0Q7QUFBQSxRQUNKO0FBS0EsWUFBSSxtQ0FBUyxXQUFXO0FBQ3BCLGdCQUFNLFNBQVMsSUFBSSxVQUFVO0FBQzdCLGdCQUFNLE9BQU8sT0FBTyxnQkFBZ0IsYUFBYSxXQUFXO0FBQzVELGdCQUFNLFdBQVcsS0FBSyxjQUFjLE9BQU87QUFDM0MsbUJBQVMsYUFBYSxzQkFBc0IsTUFBTTtBQU9sRCxtQkFBUyxjQUFjLFFBQVEsVUFBVSxRQUFRLG9CQUFvQixXQUFXO0FBQ2hGLFdBQUMsS0FBSyxRQUFRLEtBQUssaUJBQWlCLFlBQVksUUFBUTtBQUV4RCx3QkFBYyxvQkFBb0IsS0FBSyxnQkFBZ0I7QUFBQSxRQUMzRDtBQUdBLFlBQUksUUFBUSxXQUFXO0FBZ0J2QixjQUFNLFlBQVksbUJBQ1osV0FBVyxvQkFBb0IsZUFDL0IsZ0JBQWdCLE9BQU8sS0FBSyx1QkFBdUI7QUFLekQsY0FBTSxhQUFhLG1CQUNiO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw4QkFTQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZTixZQUFJLENBQUMsU0FBUztBQUNWLGNBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxVQUFVLEVBQUU7QUFBQSxRQUMzQztBQUdBLFlBQUksQ0FBQyxZQUFXLG1DQUFTLFVBQVMsUUFBVztBQUV6QyxnQkFBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU3ZCLGdCQUFNLGNBQWMsS0FBSyxVQUFVLFFBQVEsSUFBSSxFQUMxQyxRQUFRLGVBQWUsZ0JBQWdCO0FBTzVDLGdCQUFNLGFBQWE7QUFBQTtBQUFBLHFDQUVFLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJEaEMsY0FBSSxRQUFRLGlCQUFpQixVQUFVO0FBQUEsUUFDM0M7QUFHQSxZQUFJLFNBQVM7QUFDVCxnQkFBTSxlQUFjLG1DQUFTLFVBQVMsU0FDaEMsS0FBSyxVQUFVLFFBQVEsSUFBSSxFQUFFLFFBQVEsZUFBZSxnQkFBZ0IsSUFDcEU7QUFDTixjQUFJLFFBQVEsS0FBSyxxQkFBcUIsV0FBVyxDQUFDO0FBQUEsUUFDdEQ7QUFFQSxZQUFJLE1BQU07QUFLVixjQUFNLE9BQU8sSUFBSSxvQkFBb0IscUJBQXFCLE1BQU0sV0FBVyxlQUFlLE9BQU87QUFHakcsWUFBSSxRQUFTLE1BQUssZ0JBQWdCO0FBR2xDLGFBQUssV0FBVztBQU1oQixhQUFLLFVBQVUsRUFBRSxLQUFLLE1BQU07QUFDeEIsZUFBSSxtQ0FBUyxjQUFhLE9BQU87QUFHN0I7QUFBQSxVQUNKO0FBQ0EsY0FBSSxRQUFRO0FBQ1osZUFBSyxnQkFBZ0I7QUFBQSxZQUNqQixlQUFlO0FBQUEsWUFDZixjQUFjLE1BQU07QUFJaEIsa0JBQUksQ0FBQyxTQUFTLEVBQUMsbUNBQVMsU0FBUTtBQUM1Qix3QkFBUTtBQUNSLHFCQUFLLEtBQUs7QUFBQSxjQUNkO0FBQUEsWUFDSjtBQUFBLFVBQ0osQ0FBQztBQUFBLFFBQ0wsQ0FBQztBQUdELGVBQU87QUFBQSxNQUVYO0FBRUEsVUFBSSxhQUFhLG1CQUFtQixtQkFBbUIsTUFBTTtBQU16RCxjQUFNLFdBQVcsU0FBUyxjQUFjLFVBQVU7QUFDbEQsaUJBQVMsWUFBWSxhQUFhO0FBQ2xDLGtCQUFVLFNBQVMsUUFBUTtBQWEzQix3QkFBZ0IsRUFBRSxLQUFLLENBQUNDLFNBQVE7QUFDNUIsVUFBQUEsS0FBSSxrQkFBa0IsU0FBUyxPQUFPO0FBQUEsUUFDMUMsQ0FBQztBQUFBLE1BQ0wsT0FBTztBQUNILGNBQU0sb0JBQW9CLG9CQUFvQixvQkFBb0IsT0FBTyxLQUFLLEVBQUU7QUFHaEYsWUFBSSxDQUFDQyxNQUFLLFNBQVMsaUJBQWlCLEdBQUc7QUFDbkMsbUNBQXlCLG1CQUFtQixhQUFhLE1BQU0sYUFBYSxjQUFjO0FBQzFGLFVBQUFBLE1BQUssS0FBSyxpQkFBaUI7QUFBQSxRQUMvQjtBQUNBLGtCQUFVLFNBQVMsY0FBYyxpQkFBaUI7QUFBQSxNQUN0RDtBQUVBLFVBQUksQ0FBQyxVQUFVLGNBQWMsb0JBQW9CO0FBQzdDLGtCQUFVLFlBQVk7QUFHMUIsY0FBUSxLQUFLO0FBRWIsVUFBSSxtQ0FBUyxRQUFRO0FBQ2pCLGdCQUFRLE1BQU0sVUFBVTtBQUN4QixnQkFBUSxNQUFNLFdBQVc7QUFDekIsZ0JBQVEsTUFBTSxTQUFTO0FBQ3ZCLGdCQUFRLE1BQU0sUUFBUTtBQUN0QixnQkFBUSxNQUFNLGdCQUFnQjtBQUM5QixnQkFBUSxNQUFNLGFBQWE7QUFBQSxNQUMvQjtBQVVBLFdBQUssWUFBWSxXQUFXLFNBQVMsT0FBTztBQUc1QyxhQUFPLElBQUksaUJBQWlCLHFCQUFxQixNQUFNLFdBQVcsU0FBUyxPQUFPO0FBQUEsSUFDdEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBOW1CUSxtQkFBbUIsTUFBdUI7QUFDOUMsV0FBTyxLQUFLLFVBQVUsRUFBRSxXQUFXLHlCQUF5QjtBQUFBLEVBQ2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRYyxrQkFDVixxQkFDQSxNQUNBLGNBQ0EsZ0JBQ0EsU0FDdUQ7QUFBQTtBQTFGL0Q7QUEyRlEsWUFBTSxnQkFBNEIsaUJBQzVCLGlCQUNFLGFBQWEsY0FBYSxtQ0FBUyxhQUFhLG1CQUFtQjtBQUczRSxZQUFNLFVBQ0Ysd0NBQVMsaUJBQVQsYUFBMEIsa0RBQWdCLFNBQWhCLG1CQUFzQixZQUF0QixtQkFBK0Isb0JBQS9CO0FBRTlCLFlBQU0sT0FBMkIsU0FDM0IsTUFBTSxPQUFPLEVBQUUscUJBQXFCLE1BQU0sZUFBZSxlQUFlLENBQUMsSUFDekU7QUFFTixhQUFPLEVBQUUsTUFBTSxTQUFTLFNBQVMsaUJBQWlCO0FBQUEsSUFDdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXNCUSxxQkFBcUIsb0JBQW9DO0FBQzdELFdBQU87QUFBQTtBQUFBLGtDQUVtQixrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFzRGhEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLUSwwQkFBMEIsTUFBNkI7QUFDM0QsVUFBTSxTQUFTLElBQUksVUFBVTtBQUM3QixVQUFNLE1BQU0sT0FBTyxnQkFBZ0IsTUFBTSxXQUFXO0FBQ3BELFVBQU0sU0FBUyxJQUFJLGVBQWUsNEJBQTRCO0FBQzlELFlBQU8saUNBQVEsZ0JBQWU7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1EsMEJBQTBCLGVBQXVCLFVBQXdCO0FBRTdFLFFBQUksNkJBQTZCLElBQUksUUFBUSxHQUFHO0FBQzVDLGNBQVEsSUFBSSxrREFBa0QsUUFBUSxZQUFZO0FBQ2xGO0FBQUEsSUFDSjtBQUVBLFVBQU0sU0FBUyxTQUFTLGNBQWMsUUFBUTtBQUM5QyxXQUFPLGNBQWM7QUFDckIsV0FBTyxLQUFLLGtCQUFrQixRQUFRO0FBQ3RDLGFBQVMsS0FBSyxZQUFZLE1BQU07QUFFaEMsaUNBQTZCLElBQUksUUFBUTtBQUN6QyxZQUFRLElBQUkscURBQXFELFFBQVEsRUFBRTtBQUFBLEVBQy9FO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLYywwQkFDVixxQkFDQSxNQUNBLFdBQ0EsTUFDQSxTQUNrQztBQUFBO0FBQ2xDLFlBQU0sZ0JBQWdCLEtBQUssMEJBQTBCLElBQUk7QUFFekQsVUFBSSxDQUFDLGVBQWU7QUFDaEIsY0FBTSxJQUFJLE1BQU0sc0VBQXNFO0FBQUEsTUFDMUY7QUFHQSxZQUFNLFdBQVcsR0FBRyxvQkFBb0IsRUFBRSxJQUFJLEtBQUssRUFBRTtBQUdyRCxZQUFNLGtCQUFtQixPQUFlO0FBR3hDLFdBQUssMEJBQTBCLGVBQWUsUUFBUTtBQUd0RCxZQUFNLFVBQVcsT0FBZTtBQUVoQyxVQUFJLENBQUMsU0FBUztBQUNWLGNBQU0sSUFBSSxNQUFNLGdFQUFnRTtBQUFBLE1BQ3BGO0FBR0EsVUFBSSxtQkFBbUIsb0JBQW9CLFNBQVM7QUFDaEQsZ0JBQVEsS0FBSyxxREFBcUQsZUFBZSxPQUFPLE9BQU8sRUFBRTtBQUFBLE1BQ3JHO0FBR0EsWUFBTSxRQUFRLGFBQWEsT0FBTyxDQUFDO0FBQ25DLFlBQU0sVUFBVSxTQUFTLGNBQWMsT0FBTztBQUM5QyxjQUFRLEtBQUs7QUFFYixVQUFJLG1DQUFTLFFBQVE7QUFDakIsZ0JBQVEsTUFBTSxVQUFVO0FBQ3hCLGdCQUFRLE1BQU0sV0FBVztBQUN6QixnQkFBUSxNQUFNLFNBQVM7QUFDdkIsZ0JBQVEsTUFBTSxRQUFRO0FBQ3RCLGdCQUFRLE1BQU0sZ0JBQWdCO0FBQzlCLGdCQUFRLE1BQU0sYUFBYTtBQUFBLE1BQy9CO0FBR0EsVUFBSSxDQUFDLFVBQVUsY0FBYyxvQkFBb0IsR0FBRztBQUNoRCxrQkFBVSxZQUFZO0FBQUEsTUFDMUI7QUFFQSxXQUFLLFlBQVksV0FBVyxTQUFTLE9BQU87QUFHNUMsWUFBTSxZQUFZLElBQUk7QUFBQSxRQUNsQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUdBLFdBQUksbUNBQVMsVUFBUyxRQUFXO0FBQzdCLGtCQUFVLGFBQWEsUUFBUSxJQUFJO0FBQUEsTUFDdkM7QUFFQSxjQUFRLElBQUksOEJBQThCLE9BQU8sa0JBQWtCO0FBRW5FLGFBQU87QUFBQSxJQUNYO0FBQUE7QUF1Wko7OztBQzdxQkEsSUFBTSxvQ0FBb0MsQ0FBQyxXQUFnRDtBQUN2RixTQUFPO0FBQUEsSUFDSCxVQUFVO0FBQUEsTUFDTixJQUFJO0FBQUEsTUFDSixhQUFhLE9BQU87QUFBQSxNQUNwQixlQUFlLE9BQU87QUFBQSxNQUV0QixjQUFjO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixNQUFNO0FBQUEsVUFDRixJQUFJO0FBQUEsUUFDUjtBQUFBLE1BQ0o7QUFBQSxJQUVKO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDRixJQUFJLE9BQU87QUFBQSxNQUNYLE1BQU0sT0FBTztBQUFBLE1BQ2IsYUFBYSxPQUFPO0FBQUEsTUFDcEIsT0FBTztBQUFBLFFBQ0g7QUFBQSxVQUNJLElBQUk7QUFBQSxVQUNKLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxZQUNOLE1BQU0sd0JBQXdCO0FBQUEsVUFDbEM7QUFBQSxRQUNKO0FBQUEsUUFFQTtBQUFBLFVBQ0ksSUFBSTtBQUFBLFVBQ0osTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFlBQ04sTUFBTSx3QkFBd0I7QUFBQSxVQUNsQztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsTUFDQSxNQUFNLENBQUM7QUFBQSxNQUNQLE9BQU87QUFBQSxRQUNIO0FBQUEsVUFDSSxJQUFJO0FBQUEsVUFDSixNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUE7QUFBQTtBQUFBLFVBR2IsUUFBUSxPQUFPLGdCQUFnQixDQUFDLEVBQUU7QUFBQSxRQUN0QztBQUFBLE1BQ0o7QUFBQSxNQUNBLGFBQWE7QUFBQSxJQUNqQjtBQUFBLElBQ0EsTUFBTSxPQUFPO0FBQUEsRUFDakI7QUFDSjtBQVdBLElBQU0sYUFBYTtBQUVuQixJQUFNLGdCQUFnQixNQUFtQztBQUNyRCxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQy9CLFdBQVEsT0FBZSxVQUFVO0FBQUEsRUFDckM7QUFDQSxNQUFJLE9BQU8sZUFBZSxhQUFhO0FBQ25DLFdBQVEsV0FBbUIsVUFBVTtBQUFBLEVBQ3pDO0FBQ0EsU0FBTztBQUNYO0FBRUEsSUFBTSxnQkFBZ0IsQ0FBQyxhQUE4QjtBQUNqRCxNQUFJLE9BQU8sV0FBVyxhQUFhO0FBQy9CLElBQUMsT0FBZSxVQUFVLElBQUk7QUFBQSxFQUNsQztBQUNBLE1BQUksT0FBTyxlQUFlLGFBQWE7QUFDbkMsSUFBQyxXQUFtQixVQUFVLElBQUk7QUFBQSxFQUN0QztBQUNKO0FBRU8sSUFBTSxtQkFBTixNQUFNLGlCQUFnQjtBQUFBLEVBa0N6QixZQUFvQixXQUFXLDBCQUEwQjtBQUFyQztBQWRwQjtBQUFBO0FBQUEsd0JBQVEsWUFBd0YsQ0FBQztBQUlqRztBQUFBO0FBQUEsd0JBQVEsdUJBQXlFLENBQUM7QUFHbEY7QUFBQSx3QkFBUSxhQUFnRCxDQUFDO0FBRXpELHdCQUFRLGVBQWM7QUFDdEIsd0JBQVEscUJBQW9CO0FBQzVCLHdCQUFRLGVBQWM7QUFDdEIsd0JBQVEsZ0JBQXVDLENBQUM7QUFBQSxFQUdoRDtBQUFBLEVBaENBLFdBQVcsT0FBd0I7QUFFL0IsVUFBTSxhQUFhLGNBQWM7QUFDakMsUUFBSSxZQUFZO0FBQ1osYUFBTztBQUFBLElBQ1g7QUFHQSxRQUFJLENBQUMsaUJBQWdCLE9BQU87QUFDeEIsdUJBQWdCLFFBQVEsSUFBSSxpQkFBZ0I7QUFDNUMsb0JBQWMsaUJBQWdCLEtBQUs7QUFBQSxJQUN2QztBQUNBLFdBQU8saUJBQWdCO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUEwQkEsbUJBQW1CO0FBQ2YsU0FBSyxjQUFjO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsZUFBZSxRQUFnQztBQUMzQyxTQUFLLGVBQWU7QUFBQSxFQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsZUFBZSxLQUFhO0FBQ3hCLFNBQUssY0FBYztBQUNuQixTQUFLLG9CQUFvQjtBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSx3QkFBZ0M7QUFDNUIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxZQUFZLGFBQXFCLEtBQWMsU0FBNEI7QUFFdkUsUUFBSSxRQUFRLFVBQWEsWUFBWSxRQUFXO0FBQzVDLFlBQU0sV0FBVyxHQUFHLFdBQVcsSUFBSSxPQUFPLEtBQUssV0FBVyxJQUFJLFVBQVUsWUFBWSxNQUFNO0FBQzFGLGFBQU8sWUFBWSxLQUFLO0FBQUEsSUFDNUI7QUFFQSxXQUFPLGVBQWUsS0FBSztBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLG1CQUFtQixhQUFvRTtBQUNuRixXQUFPLEtBQUssb0JBQW9CLFdBQVc7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFrQk0saUJBQWlCLGFBQXFCLEtBQWMsU0FBOEM7QUFBQTtBQUNwRyxhQUFPLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxPQUFPO0FBQUEsSUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU0saUJBQWlCLGFBQXFCLHVCQUFnQyxTQUE4QztBQUFBO0FBQ3RILFlBQU0sRUFBRSxLQUFLLFlBQVksU0FBUyxJQUFJLEtBQUssY0FBYyxhQUFhLHVCQUF1QixPQUFPO0FBRXBHLGNBQVEsSUFBSSxzQ0FBc0M7QUFBQSxRQUM5QyxhQUFhLFlBQVksTUFBTSxHQUFHLENBQUMsSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLFFBQVEsWUFBWSxLQUFLO0FBQUEsTUFDN0IsQ0FBQztBQUVELFVBQUksQ0FBQyxLQUFLLFNBQVMsUUFBUSxHQUFHO0FBRTFCLFlBQUksQ0FBQyxLQUFLLG9CQUFvQixXQUFXLEdBQUc7QUFDeEMsZUFBSyxvQkFBb0IsV0FBVyxJQUFJLEVBQUUsS0FBSyxTQUFTLFdBQVc7QUFBQSxRQUN2RTtBQUdBLGFBQUssU0FBUyxRQUFRLElBQUksSUFBSTtBQUFBLFVBQzFCLENBQU8sU0FBUyxXQUFXO0FBQ3ZCLGdCQUFJO0FBQ0Esa0JBQUk7QUFDSixrQkFBSSxLQUFLLGFBQWE7QUFDbEIsc0JBQU0sT0FBTyxhQUFhLFlBQVk7QUFDdEMsc0JBQU0sR0FBRyxLQUFLLFFBQVEsZUFBZSxXQUFXLElBQUksSUFBSTtBQUN4RCxzQkFBTSxLQUFLLElBQUksZ0JBQWdCLEtBQUssWUFBWSxFQUFFLFNBQVM7QUFDM0Qsb0JBQUksR0FBSSxRQUFPLElBQUksRUFBRTtBQUFBLGNBQ3pCLE9BQU87QUFDSCxzQkFBTSxHQUFHLEtBQUssUUFBUSxlQUFlLFdBQVcsUUFBUSxHQUFHO0FBQzNELG9CQUFJLFlBQVk7QUFDWix5QkFBTztBQUFBLGdCQUNYO0FBQUEsY0FDSjtBQUNBLG9CQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUc7QUFDM0Isa0JBQUksQ0FBQyxJQUFJLElBQUk7QUFDVCx1QkFBTyxJQUFJLE1BQU0sNkJBQTZCLFdBQVcsTUFBTSxJQUFJLE1BQU0sR0FBRyxLQUFLLGNBQWMsU0FBUyxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDdEg7QUFBQSxjQUNKO0FBQ0Esb0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixvQkFBTSxVQUFVLEtBQUs7QUFFckIsa0JBQUksQ0FBQyxTQUFTO0FBQ1YsdUJBQU8sSUFBSSxNQUFNLGNBQWMsV0FBVyxhQUFhLENBQUM7QUFDeEQ7QUFBQSxjQUNKO0FBRUEsa0JBQUksQ0FBQyxRQUFRLG1CQUFtQixDQUFDLFFBQVEsZ0JBQWdCLFFBQVE7QUFDN0QsdUJBQU8sSUFBSSxNQUFNLGNBQWMsV0FBVyw0Q0FBNEMsR0FBRyxHQUFHLENBQUM7QUFDN0Y7QUFBQSxjQUNKO0FBRUEsb0JBQU0sa0JBQWtCLGtDQUFrQyxPQUFPO0FBRWpFLGNBQUMsS0FBSyxTQUFTLFFBQVEsRUFBVSxXQUFXO0FBQzVDLHNCQUFRLGVBQWU7QUFBQSxZQUMzQixTQUFTLEdBQUc7QUFHUixxQkFBTyxLQUFLLFNBQVMsUUFBUTtBQUM3QixxQkFBTyxDQUFDO0FBQUEsWUFDWjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGFBQU8sTUFBTSxLQUFLLFNBQVMsUUFBUTtBQUFBLElBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZUEsa0JBQWtCLGFBQXFCLEtBQWMsU0FBNEM7QUF6U3JHO0FBMFNRLFVBQU0sRUFBRSxTQUFTLElBQUksS0FBSyxjQUFjLGFBQWEsS0FBSyxPQUFPO0FBQ2pFLGFBQU8sVUFBSyxTQUFTLFFBQVEsTUFBdEIsbUJBQXlCLGFBQVk7QUFBQSxFQUNoRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVRLGNBQWMsYUFBcUIsdUJBQWdDLFNBQW1CO0FBRTFGLFVBQU0sWUFBWSxLQUFLLG9CQUFvQixXQUFXO0FBQ3RELFVBQU0sb0JBQW9CLDBCQUEwQixVQUFhLFlBQVk7QUFFN0UsUUFBSTtBQUNKLFFBQUk7QUFFSixRQUFJLENBQUMscUJBQXFCLFdBQVc7QUFFakMsWUFBTSxVQUFVO0FBQ2hCLG1CQUFhLFVBQVU7QUFBQSxJQUMzQixPQUFPO0FBRUgsWUFBTSx5QkFBeUIsS0FBSztBQUlwQyxZQUFNLGtCQUFrQix5QkFBeUIsS0FBSztBQUN0RCxtQkFBYSxZQUFZLE9BQU8sT0FBUSxZQUFZLFFBQVEsUUFBUSxDQUFDO0FBQUEsSUFDekU7QUFFQSxXQUFPLEVBQUUsS0FBSyxZQUFZLFVBQVUsR0FBRyxXQUFXLElBQUksR0FBRyxJQUFJLGFBQWEsWUFBWSxNQUFNLEdBQUc7QUFBQSxFQUNuRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCQSxpQkFBaUIsYUFBcUIsUUFBMEIsS0FBYyxTQUF5QjtBQUNuRyxVQUFNLEVBQUUsS0FBSyxhQUFhLFlBQVksU0FBUyxJQUFJLEtBQUssY0FBYyxhQUFhLEtBQUssT0FBTztBQUUvRixVQUFNLFVBQVUsUUFBUSxRQUFRLE1BQU07QUFHdEMsWUFBUSxXQUFXO0FBRW5CLFNBQUssU0FBUyxRQUFRLElBQUk7QUFDMUIsU0FBSyxvQkFBb0IsV0FBVyxJQUFJLEVBQUUsS0FBSyxhQUFhLFNBQVMsV0FBVztBQUFBLEVBQ3BGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9NLGlCQUFpQixhQUFxQixRQUFpQjtBQUFBO0FBQ3pELFVBQUksUUFBUTtBQUNSLGNBQU0sT0FBTyxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQ3hDLGVBQU8sS0FBSyxXQUFXLEtBQUssT0FBSyxFQUFFLEtBQUssT0FBTyxXQUFXO0FBQUEsTUFDOUQsT0FBTztBQUNILGNBQU0sT0FBTyxNQUFNLEtBQUssY0FBYyxXQUFXO0FBQ2pELGVBQU8sS0FBSyxXQUFXLENBQUM7QUFBQSxNQUM1QjtBQUFBLElBQ0o7QUFBQTtBQUFBLEVBRU0sY0FBYyxhQUFxQjtBQUFBO0FBQ3JDLFVBQUksQ0FBQyxLQUFLLFVBQVUsV0FBVyxHQUFHO0FBRTlCLGFBQUssVUFBVSxXQUFXLElBQUksSUFBSTtBQUFBLFVBQzlCLENBQU8sU0FBUyxXQUFXO0FBQ3ZCLGdCQUFJO0FBQ0Esb0JBQU0sTUFBTSxNQUFNO0FBQUEsZ0JBQ2QsR0FBRyxLQUFLLFFBQVEsWUFBWSxXQUFXO0FBQUEsY0FDM0M7QUFDQSxvQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLHNCQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3JCLFNBQVMsR0FBRztBQUNSLHFCQUFPLEtBQUssVUFBVSxXQUFXO0FBQ2pDLHFCQUFPLENBQUM7QUFBQSxZQUNaO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsYUFBTyxNQUFNLEtBQUssVUFBVSxXQUFXO0FBQUEsSUFDM0M7QUFBQTtBQUFBLEVBRU0sVUFBVSxRQUFnQjtBQUFBO0FBQzVCLFVBQUksQ0FBQyxLQUFLLFVBQVUsTUFBTSxHQUFHO0FBRXpCLGFBQUssVUFBVSxNQUFNLElBQUksSUFBSTtBQUFBLFVBQ3pCLENBQU8sU0FBUyxXQUFXO0FBQ3ZCLGdCQUFJO0FBQ0Esb0JBQU0sTUFBTSxNQUFNO0FBQUEsZ0JBQ2QsR0FBRyxLQUFLLFFBQVEsWUFBWSxNQUFNO0FBQUEsY0FDdEM7QUFDQSxvQkFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQzVCLHNCQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3JCLFNBQVMsR0FBRztBQUNSLHFCQUFPLEtBQUssVUFBVSxNQUFNO0FBQzVCLHFCQUFPLENBQUM7QUFBQSxZQUNaO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsYUFBTyxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFNLGVBQWUsYUFBcUIsUUFBaUI7QUFBQTtBQUN2RCxhQUFPLEtBQUssaUJBQWlCLGFBQWEsTUFBTTtBQUFBLElBQ3BEO0FBQUE7QUFDSjtBQTNVSSxjQURTLGtCQUNNLFNBQWdDO0FBRDVDLElBQU0sa0JBQU47OztBQzlGUCxJQUFJLG1CQUFtQixnQkFBZ0I7OztBQ09oQyxJQUFNLG9CQUFvQixDQUFPLG9CQUF3RTtBQUM1RyxNQUFJO0FBRUEsVUFBTSxNQUFNLElBQUksSUFBSSxPQUFPLFNBQVMsSUFBSTtBQUN4QyxVQUFNLFNBQVMsSUFBSSxnQkFBZ0IsSUFBSSxNQUFNO0FBQzdDLFVBQU0sZUFBZSxPQUFPLElBQUksY0FBYztBQUM5QyxRQUFJLGNBQWM7QUFDZCxZQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssSUFBSSxnQkFBZ0IsWUFBWTtBQUV2RCxjQUFRLFFBQVE7QUFBQSxRQUNaLEtBQUs7QUFBYTtBQUNkLGtCQUFNLENBQUMsYUFBYSxNQUFNLElBQUk7QUFDOUIsa0JBQU0sc0JBQXNCLE1BQU0sZ0JBQWdCLEtBQUssZUFBZSxXQUFXO0FBQ2pGLGdCQUFJLHFCQUFxQjtBQUVyQixvQkFBTSxPQUFPLG9CQUFvQixLQUFLLE1BQU0sS0FBSyxDQUFBQyxVQUFRQSxNQUFLLE9BQU8sTUFBTTtBQUMzRSxrQkFBSSxNQUFNO0FBR04sb0NBQW9CLFNBQVMsZUFBZTtBQUFBLGtCQUN4QyxNQUFNLGtCQUFrQjtBQUFBLGtCQUN4QixNQUFNO0FBQUEsb0JBQ0YsSUFBSTtBQUFBLGtCQUNSO0FBQUEsZ0JBRUo7QUFFQSx1QkFBTztBQUFBLGNBQ1g7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNJO0FBQUE7QUFBQSxRQUVKO0FBQVU7QUFFTixrQkFBTSxDQUFDLFFBQVEsWUFBWSxJQUFJLGdCQUFnQixZQUFZO0FBQzNELGtCQUFNLE9BQU8sTUFBTSxnQkFBZ0IsS0FBSyxVQUFVLE1BQU07QUFDeEQsa0JBQU0sc0JBQXNCLEtBQUssV0FBVyxLQUFLLE9BQUssRUFBRSxLQUFLLE9BQU8sZ0JBQWdCLEtBQUssRUFBRTtBQUMzRixnQkFBSSxxQkFBcUI7QUFDckIsa0JBQUksb0JBQW9CLFNBQVMsYUFBYSxTQUFTLGtCQUFrQixXQUFXO0FBRWhGLG9CQUFJLG9CQUFvQixTQUFTLHFCQUFxQjtBQUNsRCx3QkFBTSxxQkFBcUIsb0JBQW9CLFNBQVMsb0JBQW9CLEtBQUssT0FBSyxFQUFFLE9BQU8sWUFBWTtBQUUzRyx1QkFBSSx5REFBb0IsVUFBUyxnQkFBZ0IsU0FBUztBQUV0RCwwQkFBTSwwQkFBMEI7QUFFaEMsMEJBQU0sb0JBQW9CLG9CQUFvQixTQUFTO0FBQ3ZELDBCQUFNLFVBQVUsa0JBQWtCLFNBQVMsS0FBSyxPQUFLLEVBQUUsY0FBYyx3QkFBd0IsUUFBUSxFQUFFO0FBQ3ZHLHdCQUFJLFNBQVM7QUFDVCwwQ0FBb0IsU0FBUyxlQUFlLG1DQUFTO0FBQ3JELDZCQUFPO0FBQUEsb0JBQ1g7QUFBQSxrQkFDSjtBQUFBLGdCQUNKO0FBQUEsY0FDSjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0k7QUFBQSxNQUNSO0FBQUEsSUFDSjtBQUFBLEVBQ0osVUFBRTtBQUNFLFdBQU87QUFBQSxFQUNYO0FBQ0o7OztBQzdCQSxJQUFNLDBCQUEwQjtBQU96QixJQUFNLFVBQU4sTUFBYztBQUFBLEVBQWQ7QUFHSCwyQ0FBb0MsQ0FBQztBQUNyQyxzQ0FBK0IsQ0FBQztBQUNoQyw2Q0FBbUMsQ0FBQztBQUlwQztBQUFBO0FBQUEsd0JBQVE7QUFDUix3QkFBTyxtQkFBa0IsQ0FBQyxXQUEwQjtBQUFFLFdBQUssZ0JBQWdCO0FBQUEsSUFBUTtBQUNuRix3QkFBTyxtQkFBa0IsTUFBZ0MsS0FBSztBQUU5RCx3QkFBTyxhQUFxQjtBQUU1Qix3QkFBTyxXQUFVO0FBRWpCLDhDQUE2QyxDQUFDO0FBQzlDLHdCQUFPLFlBQVcsQ0FBQyx3QkFBb0Q7QUFDbkUsVUFBSSxDQUFDLEtBQUssbUJBQW1CLG9CQUFvQixFQUFFLEdBQUc7QUFDbEQsYUFBSyxtQkFBbUIsb0JBQW9CLEVBQUUsSUFBSTtBQUFBLE1BQ3REO0FBQ0EsYUFBTyxHQUFHLG9CQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLG1CQUFtQixvQkFBb0IsRUFBRSxDQUFDO0FBQUEsSUFDekY7QUFJQTtBQUFBO0FBQUEsd0JBQVEsYUFBWTtBQUNwQix3QkFBTyxXQUFVLE1BQU07QUFDbkIsVUFBSSxLQUFLO0FBQ0w7QUFFSixXQUFLLFlBQVk7QUFFakIsV0FBSyxXQUFXLFFBQVEsZUFBYTtBQUNqQyxZQUFJLFVBQVUsU0FBUztBQUNuQixvQkFBVSxRQUFRO0FBQUEsUUFDdEI7QUFBQSxNQUNKLENBQUM7QUFBQSxJQUNMO0FBRUEsd0JBQVEsMEJBQXlCLENBQUMsVUFBeUM7QUFHdkUsVUFBSSxNQUFNLFdBQVcsU0FBUyxTQUFTLFFBQVE7QUFBQSxNQUcvQztBQUdBLFVBQUksTUFBTSxLQUFLLE1BQU07QUFDakIsWUFBSSxNQUFNLEtBQUssY0FBYyxpQkFBaUIsTUFBTSxNQUFNLEtBQUssZ0JBQWdCLGFBQWEsa0JBQWtCO0FBRTFHO0FBQUEsUUFDSjtBQUdBLGNBQU0sY0FBK0IsTUFBTTtBQUUzQyxZQUFJLFlBQVksZ0JBQWdCLGFBQWEsYUFBYTtBQUN0RCxlQUFLLGdCQUFnQixRQUFRLENBQUFDLGVBQWE7QUFDdEMsWUFBQUEsV0FBVSxLQUFLLElBQUksWUFBWUEsV0FBVSxFQUFFLENBQUM7QUFBQSxVQUNoRCxDQUFDO0FBQ0Q7QUFBQSxRQUNKO0FBRUEsWUFBSSxZQUFZLGdCQUFnQixhQUFhLGNBQWM7QUFHdkQsZUFBSyxrQkFBa0IsS0FBSyxnQkFBZ0IsT0FBTyxDQUFBQSxlQUFhQSxXQUFVLE9BQVEsWUFBNkIsUUFBUSxFQUFFO0FBRXpILGdCQUFNLHFCQUFxQixLQUFLLFdBQVcsS0FBSyxDQUFBQSxlQUFVO0FBNUgxRTtBQTRINkUsbUJBQUFBLFdBQVUsU0FBUSxpQkFBNkIsWUFBN0IsbUJBQXNDO0FBQUEsV0FBRTtBQUN2SCxtRUFBb0I7QUFHcEI7QUFBQSxRQUNKO0FBRUEsWUFBSSxZQUFZLGdCQUFnQixhQUFhLGtCQUFrQjtBQUUzRCxnQkFBTSxlQUFlO0FBQ3JCLGdCQUFNLGVBQWUsS0FBSyxXQUFXLEtBQUssQ0FBQUEsZUFBYUEsV0FBVSxPQUFPLGFBQWEsV0FBVztBQUVoRyxjQUFJLGNBQWM7QUFDZCxnQkFBSSxhQUFhLGNBQWMsaUJBQWlCLE1BQU07QUFDbEQsa0JBQUksYUFBYSxRQUFRLGdCQUFnQix1QkFBdUIsTUFBTTtBQUNsRSw2QkFBYSxrQkFBa0IsYUFBYSxPQUFPO0FBQUEsY0FDdkQsT0FBTztBQUVILDZCQUFhLFFBQVEsUUFBUSxhQUFhO0FBQzFDLDZCQUFhLEtBQUssYUFBYSxPQUFPO0FBQUEsY0FDMUM7QUFDQTtBQUFBLFlBQ0o7QUFBQSxVQUNKLE9BQU87QUFDSCxrQkFBTSxpQkFBaUIsS0FBSyxXQUFXLEtBQUssQ0FBQUEsZUFBYUEsV0FBVSxPQUFPLGFBQWEsUUFBUSxXQUFXO0FBQzFHLGdCQUFJLGdCQUFnQjtBQUNoQiw2QkFBZSxLQUFLLGFBQWEsT0FBTztBQUFBLFlBQzVDLE9BQU87QUFBQSxZQUVQO0FBQUEsVUFDSjtBQUlBO0FBQUEsUUFDSjtBQUVBLGNBQU0sWUFBWSxLQUFLLFdBQVcsS0FBSyxDQUFBQSxlQUFhQSxXQUFVLE9BQU8sWUFBWSxXQUFXO0FBRTVGLFlBQUksQ0FBQyxXQUFXO0FBR1osY0FBSSxPQUFPLEtBQUssV0FBVztBQUN2QixtQkFBTyxLQUFLLFVBQVUsY0FBYyxXQUFXO0FBQUEsVUFDbkQ7QUFDQTtBQUFBLFFBQ0o7QUFFQSxZQUFJLFdBQVc7QUFDWCxjQUFJLFVBQVUsa0JBQWtCLFdBQVcsR0FBRztBQUMxQztBQUFBLFVBQ0osT0FBTztBQUdILGdCQUFJLE9BQU8sS0FBSztBQUNaLHFCQUFPLEtBQUssVUFBVSxjQUFjLFdBQVc7QUFBQSxVQUN2RDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFNSjtBQUVBLHdCQUFPLFFBQU8sQ0FBQyxZQUE2QjtBQUN4QyxZQUFNLGlCQUFpQixJQUFJO0FBQUEsUUFBOEI7QUFBQSxRQUNyRCxFQUFDLE1BQU0sUUFBTztBQUFBLE1BQ2xCO0FBRUEsV0FBSyx1QkFBdUIsY0FBYztBQUFBLElBQzlDO0FBRUEsd0JBQU8sUUFBTyxDQUFDLGtDQUE2RDtBQUN4RSxVQUFJLEtBQUssV0FBVztBQUNoQixjQUFNLElBQUksTUFBTSwyQkFBMkI7QUFBQSxNQUMvQztBQUVBLFlBQU0sZUFBZTtBQUFBLFFBQ2pCLElBQUksaUJBQWlCO0FBQUEsUUFDckIsSUFBSSxtQkFBbUI7QUFBQSxRQUN2QixJQUFJLG9CQUFvQjtBQUFBLE1BQzVCO0FBRUEsV0FBSyxvQkFBb0I7QUFBQSxRQUNyQixHQUFHO0FBQUEsTUFDUDtBQUVBLFVBQUksK0JBQStCO0FBRS9CLGNBQU0sZUFBNEMsQ0FBQztBQUVuRCxzQ0FBOEIsUUFBUSxrQ0FBZ0M7QUFDbEUsZ0JBQU0sZUFBZSxJQUFJLDZCQUE2QixLQUFLLGlCQUFpQjtBQUM1RSx1QkFBYSxhQUFhLElBQUksSUFBSTtBQUFBLFFBQ3RDLENBQUM7QUFFRCxhQUFLLGtCQUFrQixRQUFRLFlBQVU7QUFDckMsY0FBSSxDQUFDLGFBQWEsT0FBTyxJQUFJO0FBQ3pCLHlCQUFhLE9BQU8sSUFBSSxJQUFJO0FBQUEsUUFDcEMsQ0FBQztBQUVELGFBQUssb0JBQW9CLE9BQU8sT0FBTyxZQUFZO0FBQUEsTUFDdkQ7QUFHQSxhQUFPO0FBQUEsUUFDSDtBQUFBLFFBQ0EsS0FBSztBQUFBLFFBQ0w7QUFBQSxNQUNKO0FBRUEsY0FBUSxJQUFJLDBCQUEwQixTQUFTLFNBQVMsSUFBSTtBQUM1RCxXQUFLLFlBQVk7QUFBQSxJQUNyQjtBQUVBLHdCQUFRLDRCQUEyQixDQUFPLE9BQTZHLHNCQUE3RyxJQUE2RyxtQkFBN0csY0FBbUMsY0FBNkIsQ0FBQyxHQUFHLE9BQXlDO0FBalAzSjtBQWtQUSxlQUFlLFVBQ1gsT0FDQSxXQUNzQjtBQUFBO0FBQ3RCLHFCQUFXLFFBQVEsT0FBTztBQUN0QixnQkFBSSxNQUFNLFVBQVUsSUFBSSxHQUFHO0FBQ3ZCLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQTtBQUVBLGNBQVEsYUFBYSxNQUFNO0FBQUE7QUFBQSxRQUV2QixLQUFLO0FBQUE7QUFBQSxRQUNMLEtBQUssa0JBQWtCO0FBQVc7QUFDOUIsZ0JBQUksbUJBQWtCLGtCQUFzQyxTQUF0QyxtQkFBNEMsT0FDMUQsYUFBc0MsTUFBTyxDQUFDLEVBQUU7QUFFeEQsbUJBQU87QUFBQSxVQUNYO0FBQ0k7QUFBQSxRQUNKLEtBQUssa0JBQWtCO0FBQVc7QUFDOUIsa0JBQU0sb0JBQXFCO0FBQzNCLGtCQUFNLFVBQVUsTUFBTSxVQUFVLGtCQUFrQixVQUFVLENBQU1DLGFBQVc7QUFDekUsa0JBQUlBLFNBQVEsY0FBYyxXQUFXO0FBQ2pDLHVCQUFPO0FBQUEsY0FDWDtBQUVBLG9CQUFNLGFBQWEsWUFBWSxLQUFLLENBQUFDLGdCQUFjO0FBQzlDLG9CQUFJQSxZQUFXLFNBQVMsZ0JBQWdCLFNBQVM7QUFDN0MseUJBQVFBLFlBQWtDLFFBQVEsT0FBT0QsU0FBUTtBQUFBLGdCQUNyRTtBQUNBLHVCQUFPO0FBQUEsY0FDWCxDQUFDO0FBRUQsa0JBQUksQ0FBQyxZQUFZO0FBQ2Isc0JBQU0sSUFBSSxNQUFNLHNCQUFzQjtBQUFBLGNBQzFDO0FBRUEsb0JBQU0sa0JBQWtCO0FBQ3hCLG9CQUFNLGVBQWdCLGdCQUFnQjtBQUV0QyxvQkFBTSxtQkFBbUIsUUFBUSxRQUFRLENBQUMsR0FBRyxhQUFhLFFBQVE7QUFDbEUsa0JBQUksaUJBQWlCO0FBQ2pCLHNCQUFNLFVBQVUsTUFBTSxnQkFBZ0I7QUFDdEMsdUJBQU87QUFBQSxjQUNYLE9BQU87QUFDSCx3QkFBUSxLQUFLLGFBQWFBLFNBQVEsU0FBUyxLQUFLLGFBQWEsUUFBUSwwQkFBMEI7QUFBQSxjQUNuRztBQUVBLHFCQUFPO0FBQUEsWUFDWCxFQUFDO0FBRUQsZ0JBQUk7QUFDQSxxQkFBTyxLQUFLLHlCQUF5QixRQUFRLGNBQWMsV0FBVztBQUFBLGlCQUNyRTtBQUNEO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDSTtBQUFBLFFBQ0osU0FBUztBQUNMO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUVBLHdCQUFRLG1CQUFrQixDQUFPLGlCQUFtQyxVQUF3QjtBQUN4RixZQUFNLFNBQVMsTUFBTSxLQUFLLHlCQUF5QixnQkFBZ0IsU0FBUyxjQUFjLGdCQUFnQixTQUFTLHFCQUFxQixLQUFLO0FBQzdJLGFBQU8sZ0JBQWdCLEtBQUssTUFBTSxLQUFLLFVBQVEsS0FBSyxPQUFPLE1BQU07QUFBQSxJQUNyRTtBQUVBLHdCQUFPO0FBRVAsd0JBQU8saUJBQWdCLENBQWtELGlCQUFtQyxXQUErQixZQUN6SDtBQTlUdEI7QUFnVVEsVUFBSSxDQUFDLFdBQVc7QUFDWjtBQUNBLGNBQU0sSUFBSSxNQUFNLDJDQUEyQztBQUFBLE1BQy9EO0FBRUEsWUFBTSxtQkFBbUIsTUFBTSxrQkFBa0IsZUFBZTtBQUNoRSxVQUFJLGtCQUFrQjtBQUVsQiwwQkFBa0I7QUFBQSxNQUN0QjtBQW1CQSxZQUFNLFFBQVEsbUNBQUssVUFBSyxnQkFBTCxZQUFvQixDQUFDLEtBQVEsd0NBQVMsVUFBVCxZQUFrQixDQUFDO0FBRW5FLFlBQU0sTUFBTTtBQUNaLFVBQUksSUFBSSxNQUFNO0FBQ1YsWUFBSSxJQUFJLFdBQVc7QUFFZiw0QkFBa0IsbUJBQUk7QUFDdEIsMEJBQWdCLFdBQVcsbUJBQ3BCLGdCQUFnQjtBQUd2QixjQUFJRSxnQkFBZSxNQUFNLEtBQUssZ0JBQWdCLGlCQUFpQixLQUFLO0FBQ3BFLGNBQUksQ0FBQ0EsZUFBYztBQUNmLGtCQUFNLElBQUksTUFBTSxrRUFBa0U7QUFBQSxVQUN0RjtBQUVBLGVBQUksd0NBQVMsVUFBVCxtQkFBZ0IsbUJBQW1CO0FBQ25DLFlBQUFBLGdCQUFlLE1BQU0sUUFBUSxNQUFNLGtCQUFrQixtQkFBSUEsY0FBYTtBQUFBLFVBQzFFO0FBRUEsMEJBQWdCLFNBQVMsZUFBZTtBQUFBLFlBQ3BDLE1BQU0sa0JBQWtCO0FBQUEsWUFDeEIsTUFBTUE7QUFBQTtBQUFBLFVBRVY7QUFFQSxjQUFJLFNBQVM7QUFDVCxzQkFBVSxtQkFBSTtBQUNkLG1CQUFPLFFBQVE7QUFBQSxVQUNuQjtBQUVBLGdCQUFNLGVBQWUsTUFBTSxtQkFBc0IsS0FBSyxpQkFBaUIsS0FBSyxZQUFZLE9BQU87QUFHL0YsaUJBQU87QUFBQSxRQUNYLE9BQU87QUFDSCxnQkFBTSxJQUFJLE1BQU0sb0NBQW9DO0FBQUEsUUFDeEQ7QUFBQSxNQUNKO0FBRUEsa0JBQVk7QUFRWixVQUFJLGVBQWUsTUFBTSxLQUFLLGdCQUFnQixpQkFBaUIsS0FBSztBQUVwRSxVQUFJLENBQUMsY0FBYztBQUNmLGNBQU0sSUFBSSxNQUFNLGtFQUFrRTtBQUFBLE1BQ3RGO0FBRUEsV0FBSSx3Q0FBUyxVQUFULG1CQUFnQixtQkFBbUI7QUFDbkMsdUJBQWUsTUFBTSxRQUFRLE1BQU0sa0JBQWtCLG1CQUFJLGFBQWE7QUFBQSxNQUMxRTtBQUNBLFlBQU0sa0JBQWtCLEtBQUssa0JBQWtCLEtBQUssWUFBVSxPQUFPLFNBQVMsYUFBYSxPQUFPLElBQUk7QUFFdEcsVUFBSSxDQUFDLGlCQUFpQjtBQUNsQjtBQUNBLGNBQU0sSUFBSSxNQUFNLGNBQWMsYUFBYSxPQUFPLElBQUksMkJBQTJCO0FBQUEsTUFDckY7QUFHQSxVQUFJLFlBQVksTUFBTSxnQkFBZ0IsS0FBSyxnQkFBZ0IsTUFBTSxjQUFjLFdBQVcsT0FBTztBQUdqRyxVQUFJLENBQUMsVUFBVTtBQUNYLGFBQUssZ0JBQWdCLEtBQUssU0FBUztBQUV2QyxnQkFBVSxLQUFLLGFBQWEsTUFBTTtBQUU5QixhQUFLLGFBQWEsS0FBSyxXQUFXLE9BQU8sT0FBSyxNQUFNLFNBQVM7QUFDN0QsYUFBSyxrQkFBa0IsS0FBSyxnQkFBZ0IsT0FBTyxPQUFLLE1BQU0sU0FBUztBQUN2RSxlQUFPO0FBQUEsTUFDWCxDQUFDO0FBRUQsV0FBSyxXQUFXLEtBQUssU0FBUztBQUc5QixVQUFJLENBQUMsV0FBVyxRQUFRLGlCQUFpQixPQUFPO0FBRTVDLG9CQUFZLGFBQWEsV0FBVyxnQkFBZ0IsS0FBSyxPQUFPLFlBQVk7QUFBQSxNQUNoRjtBQUVBLFVBQUk7QUFHQSxjQUFNLFlBQVksV0FBVyxpQkFBaUIsS0FBSyxVQUFVO0FBQUEsTUFDakUsU0FBUyxHQUFHO0FBQ1IsY0FBTTtBQUFBLE1BR1Y7QUFDQSxVQUFJLEVBQUMsbUNBQVM7QUFDVixjQUFNLFVBQVUsVUFBVTtBQUU5QixhQUFPO0FBQUEsSUFDWDtBQUVBLHdCQUFPLFlBQVcsQ0FBa0QsV0FBMkIsb0JBQXNDLFlBQWdDO0FBQ2pLLFVBQUksVUFBVSxRQUFRO0FBQ2xCLGNBQU0sSUFBSSxNQUFNLDREQUE0RDtBQUFBLE1BQ2hGO0FBa0JBLFVBQUksbUNBQVMsUUFBUTtBQUVqQixZQUFJLGVBQWUsTUFBTSxLQUFLLGNBQWlCLG9CQUFvQixVQUFVLFdBQVc7QUFBQSxVQUNwRixRQUFRO0FBQUEsVUFDUixVQUFVLEVBQUMsV0FBVyxTQUFTLE9BQU8sVUFBVSxRQUFRO0FBQUEsV0FDckQsUUFDTjtBQUVELFlBQUksUUFBUTtBQUNSLGdCQUFNLFFBQVEsS0FBSyxZQUFZO0FBRW5DLHFCQUFhLEtBQUs7QUFDbEIsa0JBQVUsUUFBUTtBQUNsQixlQUFPO0FBQUEsTUFDWCxPQUFPO0FBQ0gsY0FBTSxjQUFjLFVBQVUsUUFBUztBQUV2QyxrQkFBVSxRQUFRO0FBQ2xCLGVBQU8sS0FBSyxjQUFpQixvQkFBb0IsVUFBVSxXQUFXO0FBQUEsVUFDbEUsVUFBVTtBQUFBLFlBQ04sV0FBVztBQUFBLFlBQ1gsT0FBTztBQUFBLFVBQ1g7QUFBQSxXQUNHLFFBQ047QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUFBO0FBQ0o7QUEzYkksY0FEUyxTQUNGLFlBQVcsTUFBTSxPQUFPLEtBQUs7QUF1Z0J4QyxJQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsU0FBTyxPQUFPO0FBQUEsSUFDVjtBQUFBLEVBQ0o7QUFDSjtBQUVBLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUztBQUN0QixRQUFNLFdBQVcsSUFBSSxRQUFRO0FBRTdCLFdBQVMsS0FBSztBQUVkLE1BQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxXQUFPLE9BQU87QUFBQSxNQUNWO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxTQUFPLEtBQUssVUFBVTtBQUMxQjtBQUdPLElBQU0sVUFBbUIsT0FBTyxLQUFLO0FBRTVDLG9CQUFvQixXQUFXLE9BQU87OztBQzlrQi9CLElBQU1DLG9DQUFOLGNBQStDLG1CQUE4QztBQUFBLEVBQTdGO0FBQUE7QUFFSCx1Q0FBYyxhQUFhO0FBRTNCLG9DQUFXLENBQUMsVUFBcUM7QUFDN0MsWUFBTSxZQUFZLE1BQVk7QUFFMUIsY0FBTSxXQUFXLFNBQVMsaUJBQThCLElBQUksZUFBZSxFQUFFLEtBQUssTUFBTSxVQUFVLFFBQVEsSUFBSTtBQUM5RyxZQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3ZCLGdCQUFNQyxXQUFVLFFBQVEsU0FBUztBQUNqQyxnQkFBTSxlQUFlLE1BQU1BLFNBQVE7QUFBQSxZQUFjLE1BQU07QUFBQSxZQUNuRCxTQUFTLEtBQUssQ0FBQztBQUFBLFlBQ2YsTUFBTTtBQUFBLFVBQU87QUFHakIsZ0JBQU0sa0JBQXlCLENBQUM7QUFFaEMsaUJBQU8sS0FBSyxhQUFhLElBQUksRUFBRSxRQUFRLGFBQVc7QUFDOUMsZ0JBQUksTUFBTSxhQUFhLEtBQUssT0FBTztBQUNuQyxrQkFBTSxJQUFJLGdCQUFnQjtBQUcxQixnQkFBSyxJQUF1QixxQkFBcUI7QUFDN0MsOEJBQWdCLEtBQUs7QUFBQSxnQkFDakI7QUFBQSxnQkFDQSx1QkFBd0IsSUFBdUIsb0JBQW9CO0FBQUEsY0FDdkUsQ0FBQztBQUFBLFlBQ0w7QUFBQSxVQUNKLENBQUM7QUFJRCxlQUFLLGNBQWMsSUFBSSwyQkFBMkIsTUFBTSxpQkFBaUIsZUFBZSxDQUFDO0FBQUEsUUFDN0YsT0FBTztBQUNILGtCQUFRLE1BQU0sMERBQTBEO0FBQ3hFLGVBQUssY0FBYyxJQUFJLDJCQUEyQixNQUFNLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2xGO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFFQSxnQkFBVSxFQUFFLEtBQUs7QUFBQSxJQUVyQjtBQUFBO0FBQ0o7OztBQ2pETyxJQUFNLGFBQWEsQ0FBQyxLQUF5QixhQUEyRDtBQUMzRyxNQUFJLENBQUMsS0FBSztBQUNOLFlBQVEsSUFBSSxHQUFHO0FBQ2Y7QUFBQSxFQUNKO0FBQ0EsTUFBSUMsb0JBQW1CLE9BQU8sb0JBQW9CLE9BQU87QUFFekQsTUFBSSxDQUFDLE9BQU8sSUFBSSxhQUFhLEVBQUc7QUFFaEMsTUFBSUEsbUJBQWtCO0FBRWxCLFVBQU0sbUJBQW1CLElBQUlBLGtCQUFpQixRQUFRO0FBRXRELFVBQU0sU0FBUyxFQUFDLFlBQVksTUFBTSxXQUFXLE1BQU0sU0FBUyxLQUFJO0FBQ2hFLHFCQUFpQixRQUFRLEtBQUssTUFBTTtBQUNwQyxXQUFPO0FBQUEsRUFDWCxXQUdTLE9BQU8sa0JBQWtCO0FBQzlCLFFBQUksaUJBQWlCLG1CQUFtQixVQUFVLEtBQUs7QUFDdkQsUUFBSSxpQkFBaUIsa0JBQWtCLFVBQVUsS0FBSztBQUFBLEVBQzFEO0FBQ0o7OztBQ25CTyxJQUFNLDZCQUFOLGNBQXlDLG1CQUF5QztBQUFBLEVBQWxGO0FBQUE7QUFDSCx1Q0FBYyxhQUFhO0FBRTNCLG9DQUFXLENBQUMsVUFBZ0M7QUFDeEMsVUFBSSxNQUFNLFFBQVE7QUFDZCxtQkFBVyxTQUFTLE1BQU0sTUFBTTtBQUM1QixlQUFLO0FBQUEsWUFBYyxJQUFJLHdCQUF3QjtBQUFBO0FBQUEsVUFFL0M7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUFBO0FBQ0o7OztBQ1ZBLElBQU1DLGlCQUFnQixDQUFDLFlBQStCO0FBQ2xELE1BQUksQ0FBQyxRQUFTLFFBQU87QUFHckIsTUFBSSxRQUFRLFlBQVksUUFBUTtBQUM1QixVQUFNLFdBQVcsSUFBSSxTQUFTLE9BQU87QUFDckMsVUFBTSxhQUFnQztBQUFBLE1BQ2xDLFVBQVUsQ0FBQztBQUFBLE1BQ1gsY0FBYyxDQUFDO0FBQUEsSUFDbkI7QUFHQSxVQUFNLFdBQVcsUUFBUSxpQkFBaUIseUJBQXlCO0FBQ25FLFFBQUksa0JBQWtCO0FBRXRCLGFBQVMsUUFBUSxDQUFBQyxhQUFXO0FBQ3hCLFVBQUksT0FBT0EsU0FBUSxVQUFVLFVBQVU7QUFDbkMsY0FBTSxTQUFTQSxTQUFRLGFBQWEsZUFBZSxFQUFFO0FBQ3JELFlBQUksTUFBTUEsU0FBUSxhQUFhLE1BQU07QUFJckMsY0FBTSxXQUEwQjtBQUFBLFVBQzVCLElBQUlBLFNBQVE7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLE9BQU9ELGVBQWNDLFFBQU87QUFBQSxVQUM1QixVQUFVQSxTQUFRO0FBQUEsVUFDbEIsVUFBVSxpQkFBaUJBLFNBQVEsVUFBVSxJQUFJO0FBQUEsVUFDakQ7QUFBQSxRQUNKO0FBR0EsbUJBQVcsYUFBYyxLQUFLLFFBQVE7QUFDdEMsWUFBSSxLQUFLO0FBQ0wsY0FBRyxDQUFDLFdBQVcsU0FBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLFNBQVUsR0FBRyxFQUFFLFNBQVMsU0FBUyxPQUFNO0FBQ2hGLHVCQUFXLFNBQVUsR0FBRyxJQUFJO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQUEsTUFnQko7QUFBQSxJQUNKLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDWDtBQUdBLE1BQUksUUFBUSxTQUFTLGNBQWMsUUFBUSxTQUFTLFNBQVM7QUFDekQsV0FBTyxRQUFRLFVBQVUsUUFBUSxRQUFRO0FBQUEsRUFDN0M7QUFHQSxNQUFJLFFBQVEsWUFBWSxXQUFXLFFBQVEsWUFBWSxZQUFZO0FBQy9ELFdBQU8sUUFBUTtBQUFBLEVBQ25CO0FBR0EsTUFBSSxRQUFRLFlBQVksVUFBVTtBQUM5QixXQUFPLFFBQVE7QUFBQSxFQUNuQjtBQUdBLE1BQUksUUFBUSxtQkFBbUI7QUFDM0IsV0FBTyxRQUFRLGFBQWEsUUFBUTtBQUFBLEVBQ3hDO0FBR0EsU0FBTztBQUNYO0FBRU8sSUFBTUMsMEJBQU4sY0FBcUMsbUJBQTJDO0FBQUEsRUFBaEY7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0Isb0NBQVcsQ0FBQyxVQUFrQztBQUMxQyxZQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBQ2xELFlBQU0sUUFBUSxVQUFRO0FBRWxCLGFBQUssY0FBYyxJQUFJO0FBQUEsVUFDbkJGLGVBQWMsSUFBSTtBQUFBLFFBQ3RCLEdBQUcsS0FBSztBQUFBLE1BQ1osQ0FBQztBQUFBLElBQ0w7QUFBQTtBQUNKOzs7QUNsR08sSUFBTSxzQkFBTixjQUFrQyxtQkFBd0M7QUFBQSxFQUExRTtBQUFBO0FBRUgsdUNBQWMsYUFBYTtBQUUzQixvQ0FBVyxDQUFDLFVBQStCO0FBQ3ZDLFlBQU0sT0FBTyxxQkFBcUIsTUFBTSxLQUFLLFFBQVE7QUFDckQsVUFBSSxNQUFNO0FBQ04sYUFBSyxjQUFjLElBQUksMEJBQTBCLEtBQUssYUFBYSxNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUs7QUFBQSxNQUMxRjtBQUFBLElBQ0o7QUFBQTtBQUNKOzs7QUNYTyxJQUFNLDJCQUFOLGNBQXVDLG1CQUE2QztBQUFBLEVBQXBGO0FBQUE7QUFDSCx1Q0FBYyxhQUFhO0FBRTNCLG9DQUFXLENBQUMsVUFBb0M7QUFDNUMsWUFBTSxpQkFBaUIsSUFBSSxlQUFlLENBQUMsWUFBWTtBQUVuRCxhQUFLLGNBQWMsSUFBSSxzQkFBc0IsQ0FBQztBQUFBLE1BQ2xELENBQUM7QUFDRCxxQkFBZSxRQUFRLFNBQVMsSUFBSTtBQUVwQyxhQUFPLE1BQU07QUFDVCx1QkFBZSxXQUFXO0FBQUEsTUFDOUI7QUFBQSxJQUNKO0FBQUE7QUFDSjs7O0FDYk8sSUFBTUcsdUJBQU4sY0FBa0MsbUJBQWlDO0FBQUEsRUFBbkU7QUFBQTtBQUVILHVDQUFjLGFBQWE7QUFFM0Isb0NBQVcsQ0FBQyxVQUF3QjtBQUNoQyxZQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSyxRQUFRO0FBQ2xELFlBQU0sUUFBUSxVQUFRO0FBRWxCLGFBQUssWUFBWSxNQUFNO0FBQUEsTUFDM0IsQ0FBQztBQUFBLElBQ0w7QUFBQTtBQUNKOzs7QUM0Q08sSUFBTSxZQUFOLGNBQXdCLFlBQVk7QUFBQSxFQUl2QyxjQUFjO0FBQ1YsVUFBTTtBQUhWLHdCQUFPLFdBQVU7QUFhakIseUNBQWdCLENBQUMsU0FBZ0MsYUFBK0I7QUEzRXBGO0FBNEVRLFVBQUksQ0FBQyxRQUFRLG9CQUFtQixxQ0FBVTtBQUN0QyxnQkFBUSxrQkFBa0IsU0FBUztBQUV2QyxZQUFNLGVBQWUsT0FBTyxLQUFLLEtBQUssVUFBVTtBQUVoRCxVQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3RCLFlBQUkscUNBQVUsT0FBTztBQUVqQixrQkFBUSxjQUFjLFNBQVMsTUFBTSxTQUFTLE1BQU0sU0FBUyxDQUFDO0FBQUEsUUFDbEUsT0FBTztBQUNILGtCQUFRLGNBQWMsYUFBYSxDQUFDO0FBQUEsUUFDeEM7QUFBQSxNQUNKO0FBQ0EsVUFBSSxDQUFDLFFBQVE7QUFDVCxnQkFBUSxTQUFTLGFBQWEsQ0FBQztBQUVuQyxjQUFRLFlBQVksaUJBQWlCO0FBRXJDLG1CQUFPLFdBQVAsbUJBQWUsWUFBWSxtQkFDcEIsVUFDSjtBQUFBLElBQ1A7QUFFQSw2Q0FBMEM7QUFBQSxNQUN0QyxJQUFJLGtCQUFrQixLQUFLLGFBQWE7QUFBQSxNQUN4QyxJQUFJQyxxQkFBb0IsS0FBSyxhQUFhO0FBQUEsTUFDMUMsSUFBSSxtQkFBbUIsS0FBSyxhQUFhO0FBQUEsTUFDekMsSUFBSSw2QkFBNkIsS0FBSyxhQUFhO0FBQUEsTUFDbkQsSUFBSSxxQkFBcUIsS0FBSyxhQUFhO0FBQUEsTUFDM0MsSUFBSSx3QkFBd0IsS0FBSyxhQUFhO0FBQUEsTUFDOUMsSUFBSSxvQkFBb0IsS0FBSyxhQUFhO0FBQUEsTUFDMUMsSUFBSUMsd0JBQXVCLEtBQUssYUFBYTtBQUFBLE1BQzdDLElBQUksMkJBQTJCLEtBQUssYUFBYTtBQUFBLE1BQ2pELElBQUkseUJBQXlCLEtBQUssYUFBYTtBQUFBLE1BQy9DLElBQUksb0JBQW9CLEtBQUssYUFBYTtBQUFBO0FBQUEsTUFHMUMsSUFBSUMsa0NBQWlDLEtBQUssYUFBYTtBQUFBLElBQzNEO0FBRUEsd0JBQU8sUUFBTyxNQUFNO0FBQ2hCLGFBQU8sWUFBWSxLQUFLLHFCQUFxQixLQUFLLElBQUk7QUFDdEQsV0FBSyxjQUFjLElBQUksWUFBWSxDQUFDO0FBQUEsSUFDeEM7QUFwREksUUFBSSxDQUFDLE9BQU8sTUFBTTtBQUVkLGFBQU8sT0FBTyxDQUFDO0FBQUEsSUFDbkI7QUFFQSxXQUFPLEtBQUssWUFBWTtBQUFBLEVBQzVCO0FBZ0RKO0FBRUEsb0JBQW9CLGFBQWEsU0FBUzsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgInNlZW4iLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiaGVpZ2h0IiwgIndpZHRoIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaG9zdFNESyIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJlbGVtZW50IiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAic2VlbiIsICJzZGsiLCAiZG9tSWQiLCAic2RrIiwgInNlZW4iLCAic2tpbiIsICJjb21wb25lbnQiLCAic2VnbWVudCIsICJleHBlcmllbmNlIiwgInNlbGVjdGVkU2tpbiIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJob3N0U0RLIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZ2V0SW5wdXRWYWx1ZSIsICJlbGVtZW50IiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiXQp9Cg==
4023
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiLFxuICAgIFwiTWluaW1pemVkTG9hZGVyXCI6IFwiTWluaW1pemVkTG9hZGVyXCJcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9IGtleW9mIHR5cGVvZiBTa2luTG9hZGVycztcblxuZXhwb3J0IHR5cGUgUHJvcFR5cGUgPSAnYW55JyB8ICdzdHJpbmcnIHwgJ251bWJlcicgfCBzdHJpbmc7IC8vIFRPRE8gOiA8XG5leHBvcnQgdHlwZSBSZWZTZWxlY3RvclR5cGUgPSAnaWQtYXR0cmlidXRlJyB8ICdjc3Mtc2VsZWN0b3InIHwgJ3hwYXRoJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IExvYWRlckZyYW1ld29ya3MgPSB7XG4gICAgXCJyZWFjdFwiOiBcInJlYWN0XCIsXG4gICAgXCJ2dWVcIjogXCJ2dWVcIixcbiAgICBcImFuZ3VsYXJcIjogXCJhbmd1bGFyXCIsXG59IGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2FkZXJGcmFtZXdvcmtUeXBlID0ga2V5b2YgdHlwZW9mIExvYWRlckZyYW1ld29ya3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIldlYkNvbXBvbmVudExvYWRlclwiO1xuICAgIHVybDogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZyYW1ld29yaz86IExvYWRlckZyYW1ld29ya1R5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSWZyYW1lTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSWZyYW1lTG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBhdXRvSGVpZ2h0OiBib29sZWFuXG4gICAgaGVpZ2h0Pzogc3RyaW5nXG4gICAgd2lkdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd1Jvb3RNb2RlVHlwZSA9IHtcbiAgICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gICAgXCJjbG9zZWRcIjogXCJjbG9zZWRcIixcbiAgICBcIm5vbmVcIjogXCJub25lXCIsXG4gICAgXCJsb2NhbEZyYW1lXCI6IFwibG9jYWxGcmFtZVwiXG59IGFzIGNvbnN0O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhUTUxMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJIVE1MTG9hZGVyXCI7XG4gICAgSFRNTDogc3RyaW5nO1xuICAgIC8vVE9ETzogcmVuYW1lKHJvb3RNb2RlL2N1c3RvbUVsZW1lbnRNb2RlKSArIGRiIG1pZ3JhdGlvblxuICAgIHNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZTtcbiAgICBhdXRvSGVpZ2h0PzogYm9vbGVhbjtcbiAgICBoZWlnaHQ/OiBzdHJpbmc7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBhbiBpbmxpbmUtSFRNTCAobG9jYWxGcmFtZSkgY29tcG9uZW50IGlzIHJlbmRlcmVkIGluIGEgc2FuZGJveGVkLFxuICAgICAqIGNyb3NzLW9yaWdpbiBpZnJhbWUgd2l0aCBOTyBhY2Nlc3MgdG8gdGhlIGhvc3QgZG9jdW1lbnQgKHVudHJ1c3RlZCBjb2RlKS5cbiAgICAgKiBUaGUgaG9zdCByZW5kZXIgcG9saWN5IGNhbiBhbHNvIGZvcmNlIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlnIHZhbHVlLlxuICAgICAqL1xuICAgIGlzb2xhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSG93IGEgY29tcG9uZW50IGlzIHJlbmRlcmVkIG9uIHRoZSBob3N0IHBhZ2UsIGluIGFzY2VuZGluZyBpc29sYXRpb246XG4gKiAgLSAnd2ViQ29tcG9uZW50JyAgIFx1MjAxNCBjdXN0b20gZWxlbWVudCBvbiB0aGUgaG9zdCBkb2N1bWVudCAobW9zdCBwcml2aWxlZ2VkKVxuICogIC0gJ2lmcmFtZScgICAgICAgICBcdTIwMTQgc2FtZS1vcmlnaW4gaW5saW5lLUhUTUwgaWZyYW1lICh0b2RheSdzIGRlZmF1bHQpXG4gKiAgLSAnaXNvbGF0ZWRJZnJhbWUnIFx1MjAxNCBzYW5kYm94ZWQsIGNyb3NzLW9yaWdpbiBpZnJhbWUgKHVudHJ1c3RlZCBjb2RlKVxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJNb2RlID0gJ3dlYkNvbXBvbmVudCcgfCAnaWZyYW1lJyB8ICdpc29sYXRlZElmcmFtZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUG9saWN5Q29udGV4dCB7XG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWc7XG4gICAgc2tpbjogSVNraW5Db25maWc7XG4gICAgLyoqIFdoYXQgdGhlIGNvbXBvbmVudCBhc2tlZCBmb3IgKG1hcmtlciBcdTIxRDIgJ3dlYkNvbXBvbmVudCcsIGNvbmZpZy5pc29sYXRpb24gXHUyMUQyICdpc29sYXRlZElmcmFtZScpLiAqL1xuICAgIHJlcXVlc3RlZE1vZGU6IFJlbmRlck1vZGU7XG4gICAgLyoqIFdoZXRoZXIgdGhlIEhUTUwgY2FycmllcyB0aGUgYDwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPmAgbWFya2VyLiAqL1xuICAgIGlzV2ViQ29tcG9uZW50OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhvc3Qtc3VwcGxpZWQgZ2F0ZSBkZWNpZGluZyBob3cgKG9yIHdoZXRoZXIpIGEgY29tcG9uZW50IHJlbmRlcnMuIFJldHVybiBhXG4gKiBSZW5kZXJNb2RlIHRvIHVzZSwgb3IgYGZhbHNlYCB0byBibG9jayByZW5kZXJpbmcgZW50aXJlbHkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbmRlclBvbGljeSA9XG4gICAgKGN0eDogUmVuZGVyUG9saWN5Q29udGV4dCkgPT4gUmVuZGVyTW9kZSB8IGZhbHNlIHwgUHJvbWlzZTxSZW5kZXJNb2RlIHwgZmFsc2U+O1xuXG4vL2ZvciBpbnRlcm5hbCBkYXNoYm9hcmQgdXNhZ2VcbmV4cG9ydCBpbnRlcmZhY2UgSU1pbmltaXplZExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIk1pbmltaXplZExvYWRlclwiO1xufVxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkT2JqZWN0IHtcbiAgICBfdGVtcF9jbGllbnRfaWQ/OiBzdHJpbmcsXG59XG5cbnR5cGUgRXh0ZW5kPFQsIFU+ID0gVCAmIFU7XG5cbnR5cGUgRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgRV06IEVbS107XG59ICYge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgID8gRXh0ZW5kUmVjdXJzaXZlbHk8VFtLXSwgRT5cbiAgICAgICAgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgSURhc2hib2FyZDxUPiA9IEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIERhc2hib2FyZE9iamVjdD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlXG5cbiAgICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVJlbGVhc2VNZXRhZGF0YSB7XG4gICAgZW52aXJvbm1lbnRJZDogc3RyaW5nO1xuICAgIGVudmlyb25tZW50SWRlbnRpZmllcjogc3RyaW5nO1xuICAgIHJlbGVhc2VkT24/OiBzdHJpbmc7XG4gICAgcmVsZWFzZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JVmFyaWFudENvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIHJlbGVhc2VzPzogdjJfSVJlbGVhc2VNZXRhZGF0YVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5Db25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgbG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5Db25maWcge1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQmluZE1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBjb25zdCBQcm9wTWVzc2FnZU1vZGVzID0ge1xuICAgIFwiaW5wdXRcIjogXCJpbnB1dFwiLFxuICAgIFwib3V0cHV0XCI6IFwib3V0cHV0XCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyA9IHtcbiAgICBcIm1lc3NhZ2VcIjogXCJtZXNzYWdlXCIsXG4gICAgXCJjb2RlXCI6IFwiY29kZVwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW0ge1xuICAgIHZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvZGVCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwiY29kZVwiXG4gICAgcmVtYXA/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwibWVzc2FnZVwiXG4gICAgbWVzc2FnZTogTXlvcE1lc3NhZ2VLZXlcbiAgICByZWY6IHN0cmluZywgLy9UT0RPIG1ha2UgaXQgaWRcbiAgICBwYXJhbXM6IElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW1bXVxuICAgIG1vZGU6IGtleW9mIHR5cGVvZiBQcm9wTWVzc2FnZU1vZGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBiZWhhdmlvcjogSVByb3BCZWhhdmlvclxufVxuXG5cbmV4cG9ydCBjbGFzcyBSZWZCZWhhdmlvclR5cGUge1xuICAgIHN0YXRpYyBjb2RlID0gJ2NvZGUnIGFzIGNvbnN0XG4gICAgc3RhdGljIGNvbXBvbmVudCA9ICdjb21wb25lbnQnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIElSZWZCZWhhdmlvclR5cGUgPSAnY29kZScgfCAnY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6IElSZWZCZWhhdmlvclR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50UmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb21wb25lbnQnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBQcm9wZXJ0eSBpbnN0YW5jZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqL1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29kZVJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29kZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHNlbGVjdG9yVHlwZTogUmVmU2VsZWN0b3JUeXBlXG4gICAgc2VsZWN0b3I6IHN0cmluZ1xuICAgIGJlaGF2aW9yOiBJUmVmQmVoYXZpb3Jcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIHNlZ21lbnQgcnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlU2VnbWVudFJ1bGUge1xuICAgIHByb3BlcnR5OiBzdHJpbmc7XG4gICAgb3BlcmF0b3I6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IHZlcnNpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHBlcmllbmNlIEEvQiBzcGxpdCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VBQlNwbGl0IHtcbiAgICB2ZXJzaW9uczogSUV4cGVyaWVuY2VBQlNwbGl0VmVyc2lvbltdO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJ1bGVzOiBJRXhwZXJpZW5jZVNlZ21lbnRSdWxlW107XG4gICAgdXNlQWI6IGJvb2xlYW47XG4gICAgY29tcG9uZW50VmFyaWFudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAgIGFiU3BsaXQ/OiBJRXhwZXJpZW5jZUFCU3BsaXQ7XG4gICAgc3RpY2t5UHJvcGVydGllcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgZGVmaW5pdGlvbiBjb25maWcgKHYyKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlRGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICAvKiogU2VsZWN0ZWQgY29tcG9uZW50IElEcyAqL1xuICAgIGNvbXBvbmVudHM6IHN0cmluZ1tdO1xuICAgIC8qKiBTZWdtZW50IGNvbmZpZ3VyYXRpb25zICovXG4gICAgc2VnbWVudHM6IElFeHBlcmllbmNlU2VnbWVudFtdO1xuICAgIC8qKiBGYWxsYmFjayB2YXJpYW50IHBlciBjb21wb25lbnQgKi9cbiAgICBmYWxsYmFjazogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAvKiogVGFncyAqL1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFRoZSBjb21wb25lbnQncyBydW50aW1lIHRhZ3M6IG9ubHkgdGFncyBuYW1lZCBgdWk6Li4uYCAoZS5nLiBgdWk6YmV0YWApLCBhcyBzZXQgaW4gdGhlXG4gICAgICogZGFzaGJvYXJkLiBFdmVyeSBvdGhlciB0YWcgc3RheXMgcHJpdmF0ZSBvbiB0aGUgc2VydmVyLiBFbXB0eSB3aGVuIHRoZXJlIGFyZSBub25lLlxuICAgICAqL1xuICAgIHVpVGFncz86IHN0cmluZ1tdLFxuICAgIC8vIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBJUHJvcENvbmZpZz4gLy9pZCAtIHR5cGVcbiAgICAvLyByZWZzOiBSZWNvcmQ8c3RyaW5nLCBJUmVmQ29uZmlnPixcbiAgICAvLyBza2luczogUmVjb3JkPHN0cmluZywgSVNraW5Db25maWc+XG4gICAgcHJvcHM6IElQcm9wQ29uZmlnW10sXG4gICAgcmVmczogSVJlZkNvbmZpZ1tdLFxuICAgIHNraW5zOiBJU2tpbkNvbmZpZ1tdLFxuICAgIGRlZmF1bHRTa2luOiBudW1iZXI7XG5cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgLy9yZXNvbHZlZERlZmluaXRpb25zPzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbXVxuICAgIC8vVE9ETyA6IG1vdmUgdG8gYmFzZSBjbGFzcyAoIElTdG9yYWJsZUl0ZW0gb3Igc28uLi4pXG5cbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JTXlvcFN0b3JlZE9iamVjdCBleHRlbmRzIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50QWNjZXNzIHtcbiAgICB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfCAndW5saXN0ZWQnIHwgJ3B1YmxpYyc7XG4gICAgdW5saXN0ZWQ/OiB7XG4gICAgICAgIHNsdWc6IHN0cmluZztcbiAgICB9O1xuICAgIG1hcmtldHBsYWNlPzoge1xuICAgICAgICBzdGF0dXM6ICdkcmFmdCcgfCAnc3VibWl0dGVkJyB8ICdjbGFpbWVkJyB8ICdjbG9zZWQnO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBjb250YWN0RW1haWw6IHN0cmluZztcbiAgICAgICAgZGVhZGxpbmU6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIHZhcmlhbnRzX2lkczogc3RyaW5nW10sXG4gICAgRFRPczogdjJfSURUT1tdLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgIGFjY2Vzcz86IENvbXBvbmVudEFjY2VzcyxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgSUVsZW1lbnRSZWYsIE15b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IERldGVjdE15b3BSZWZzTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG4gICAgICAgIC8vY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgKmApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogSUVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIC8vbGV0IGNvdW50ZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICB9IC8vZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKCFjb3VudGVyc1tpdGVtLnRhZ05hbWVdKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSAwO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gY291bnRlcnNbaXRlbS50YWdOYW1lXSArIDE7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICAgIG15b3BSZWZzLnB1c2gobmV3IFhQYXRoRWxlbWVudFJlZihgJHtpdGVtLnRhZ05hbWV9KCR7Y291bnRlcnNbaXRlbS50YWdOYW1lXX0pYCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfVxufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZSgpLCBldmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGVhblVwVGFzayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKGNsZWFuVXBUYXNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9jbGVhbiB1cFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7IE15b3BNZXNzYWdlcyB9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NoYW5nZVRleHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENoYW5nZVRleHRNZXNzYWdlPiB7XG4gIFxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuICAgIFxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDaGFuZ2VUZXh0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgcmVwbGllcjogKGRhdGE6IGFueSkgPT4gdm9pZCwgcm9vdFJlZjogUm9vdFJlZikgPT4ge1xuICAgIGNvbnN0IF9fc2NyaXB0SW5wdXRzID0gZXZlbnQuc2NyaXB0SW5wdXRzID8gZXZlbnQuc2NyaXB0SW5wdXRzIDoge31cbiAgICBfX3NjcmlwdElucHV0cy5tYWtlU2VyaWFsaXphYmxlID0gbWFrZVNlcmlhbGl6YWJsZTtcblxuICAgIF9fc2NyaXB0SW5wdXRzLnNlbmQgPSByZXBsaWVyO1xuICAgIF9fc2NyaXB0SW5wdXRzLnJvb3RSZWYgPSByb290UmVmO1xuICAgIF9fc2NyaXB0SW5wdXRzLl9fc2NyaXB0SW5wdXRzID0gX19zY3JpcHRJbnB1dHM7XG5cbiAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtldmVudC5zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgIC8vIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IEZ1bmN0aW9uKCdzZW5kJywgJ3Jvb3RSZWYnLCdfX3NjcmlwdElucHV0cycsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgZXZlbnQuY29udGVudCA/IGV2ZW50LmNvbnRlbnQgOiAnJylcbiAgICAvL2NvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihyZXBsaWVyLCByb290UmVmLCBfX3NjcmlwdElucHV0cywgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpO1xuICAgIHJlcGxpZXIocmV0KTtcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgX19mZWRlcmF0aW9uX18gPSBcIl9fZmVkZXJhdGlvbl9fXCJcbmV4cG9ydCBjb25zdCBvbkxvYWRLZXkgPSBcIm9uTG9hZFwiXG5leHBvcnQgY29uc3QgbW9kdWxlSW5zdGFuY2VLZXkgPSBcIm1vZHVsZUluc3RhbmNlXCJcblxuZXhwb3J0IGNvbnN0IGRlZmluZUR5bmFtaWNJbXBvcnQgPSAoZ2xvYmFsTmFtZTogc3RyaW5nLCBtb2R1bGU6IGFueSkgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAod2luZG93W19fZmVkZXJhdGlvbl9fXSAmJiB3aW5kb3dbX19mZWRlcmF0aW9uX19dW2dsb2JhbE5hbWVdICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV1bb25Mb2FkS2V5XSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV1bb25Mb2FkS2V5XSh7W2dsb2JhbE5hbWVdOiBtb2R1bGV9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ19fZmVkZXJhdGlvbl9fIGxvYWRlciBub3QgZGVmaW5lZCBmb3IgbW9kdWxlJywgbW9kdWxlKTtcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYobWVzc2FnZS5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHRoaW5rIGFib3V0IHRoYXQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBtYWtlU2VyaWFsaXphYmxlKGUsIG1lc3NhZ2Uuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleSwgTXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRGlzcG9zZU1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgQ2xlYW51cE1lc3NhZ2UsIENsZWFudXBSZXBsYXlNZXNzYWdlLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZlxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREssIGxvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IG9ic2VydmVBdXRvU2l6ZSBjYWxsYmFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TaXplUmVzdWx0IHtcbiAgICAvKiogQ3VycmVudCB3aWR0aCAoZnJvbSBjb250ZW50KSAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIEN1cnJlbnQgaGVpZ2h0IChmcm9tIGNvbnRlbnQpICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqIFdoZXRoZXIgd2lkdGggaXMgYmVpbmcgYXV0by1zaXplZCAqL1xuICAgIGF1dG9TaXppbmdXaWR0aDogYm9vbGVhbjtcbiAgICAvKiogV2hldGhlciBoZWlnaHQgaXMgYmVpbmcgYXV0by1zaXplZCAqL1xuICAgIGF1dG9TaXppbmdIZWlnaHQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igb2JzZXJ2ZUF1dG9TaXplIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9TaXplT3B0aW9ucyB7XG4gICAgLyoqIENhbGxiYWNrIGNhbGxlZCB3aXRoIHNpemUgaW5mbyB3aGVuZXZlciBzaXplIGNoYW5nZXMgKi9cbiAgICBvblNpemVDaGFuZ2U/OiAocmVzdWx0OiBBdXRvU2l6ZVJlc3VsdCkgPT4gdm9pZDtcbiAgICAvKiogTWluaW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWluV2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gd2lkdGggY29uc3RyYWludCAqL1xuICAgIG1heFdpZHRoPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNaW5pbXVtIGhlaWdodCBjb25zdHJhaW50ICovXG4gICAgbWluSGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBNYXhpbXVtIGhlaWdodCBjb25zdHJhaW50ICovXG4gICAgbWF4SGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIC8qKiBFeHBsaWNpdCB3aWR0aCBzZXQgYnkgaG9zdCAtIGlmIGRlZmluZWQsIGRvbid0IGF1dG8tc2l6ZSB3aWR0aCAqL1xuICAgIGV4cGxpY2l0V2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgLyoqIEV4cGxpY2l0IGhlaWdodCBzZXQgYnkgaG9zdCAtIGlmIGRlZmluZWQsIGRvbid0IGF1dG8tc2l6ZSBoZWlnaHQgKi9cbiAgICBleHBsaWNpdEhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRm9yY2UgYXV0by1zaXplIGV2ZW4gaWYgY29udGFpbmVyIGhhcyBkaW1lbnNpb25zICovXG4gICAgZm9yY2VBdXRvU2l6ZT86IGJvb2xlYW47XG4gICAgLyoqIE1pbiBoZWlnaHQgdXNlZCBieSBsb2FkZXIgdG8gZGV0ZWN0IGNvbGxhcHNlIChkZWZhdWx0OiA1MCkgKi9cbiAgICBsb2FkZXJNaW5IZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8vVE9ETyA6IGNoYW5nZSBJTXlvcENvbXBvbmVudCB0byByZWYgc3BlY2lmaWMgaW1wbFxudHlwZSBSZWZUeXBlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBJTXlvcENvbXBvbmVudCB8IFJlZlxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcENvbXBvbmVudDxQID0gYW55LCBSID0gYW55PiB7XG5cbiAgICBpZDogc3RyaW5nO1xuXG4gICAgaXNJbml0aWF0ZWQ6IGJvb2xlYW47XG5cbiAgICBtYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbjtcblxuICAgIHNldEluaXRpYXRlZDogKCkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8qKiBSdW50aW1lIHRhZ3M6IG9ubHkgdGFncyBuYW1lZCBgdWk6Li4uYCAoZS5nLiBgdWk6YmV0YWApLiBgW11gIHdoZW4gdGhlcmUgYXJlIG5vbmUuICovXG4gICAgcmVhZG9ubHkgdWlUYWdzOiBzdHJpbmdbXVxuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgbXlvcDpzaXplIG1ldGEgdGFnIGZyb20gdGhlIGNvbXBvbmVudCBIVE1MLlxuICAgICAqIFNldCBieSBIVE1MQ29tcG9uZW50TG9hZGVyIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24uXG4gICAgICogVXNlZCBieSB0aGUgUmVhY3QgaG9zdCB0byBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkuXG4gICAgICovXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgdWlUYWdzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbj8udWlUYWdzIHx8IFtdO1xuICAgIH1cblxuICAgIF9tYXJrZWRGb3JEaXNwb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZ2V0IG1hcmtlZEZvckRpc3Bvc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQ7XG4gICAgfVxuXG4gICAgc2V0IG1hcmtlZEZvckRpc3Bvc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOiBUaGUgY29tcG9uZW50IGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcG9zZWQuIERpc3Bvc2Ugb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgYWdhaW4gdW50aWwgdGhlIGN1cnJlbnQgZGlzcG9zYWwgcHJvY2VzcyBpcyBjb21wbGV0ZS4nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgaGlkZSgpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdygpOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgaW5zcGVjdCgpOiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIC8vVE9ETzogdXNlIGJpbmRXaGVuIHdpdGggcmV0dXJuIHRydWUgcHJlZGljYXRlIC4uLlxuICAgIGJpbmQgPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+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/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4zNyc7IiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzLFxuICAgIFJlbmRlck1vZGUsIFJlbmRlclBvbGljeVxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG5pbXBvcnQge0VNQkVEREVEX1NES19DT05URU5ULCBIQVNfRU1CRURERURfU0RLfSBmcm9tIFwiLi4vZW1iZWRkZWRTREsudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUiA9ICc8IS0tIG15b3Atd2ViLWNvbXBvbmVudCAtLT4nO1xuY29uc3QgTVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRCA9ICdteW9wLXdlYi1jb21wb25lbnQnO1xuXG4vLyBUcmFjayBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBzY3JpcHRzIHRvIHByZXZlbnQgZG91YmxlIHJlZ2lzdHJhdGlvbi5cbi8vIE1hcHMgc2NyaXB0SWQgLT4gdGhlIHRhZyBuYW1lIHRoYXQgc2NyaXB0IHJlZ2lzdGVyZWQuIFRoZSB0YWcgTVVTVCBiZSByZW1lbWJlcmVkIHBlclxuLy8gc2NyaXB0OiB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18gaXMgYSBzaW5nbGUgZ2xvYmFsIHNsb3QgdGhhdCBldmVyeSBleHRyYWN0ZWQgY29tcG9uZW50XG4vLyBvdmVyd3JpdGVzLCBzbyBvbiBhIHJlLW1vdW50IChzY3JpcHQgc2tpcHBlZCkgaXQgaG9sZHMgd2hpY2hldmVyIGNvbXBvbmVudCByYW4gbGFzdC5cbmNvbnN0IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IGlmIEhUTUwgaXMgYSBNeW9wIFdlYiBDb21wb25lbnQgKHN0YXJ0cyB3aXRoIG1hcmtlciBjb21tZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNNeW9wV2ViQ29tcG9uZW50KGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaHRtbC50cmltU3RhcnQoKS5zdGFydHNXaXRoKE1ZT1BfV0VCX0NPTVBPTkVOVF9NQVJLRVIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgaG93IHRoaXMgY29tcG9uZW50IHNob3VsZCByZW5kZXIsIGFwcGx5aW5nIHRoZSBob3N0IHJlbmRlciBwb2xpY3kuXG4gICAgICogUHJlY2VkZW5jZTogb3B0aW9ucy5yZW5kZXJQb2xpY3kgKHBlci1jYWxsKSBmdWxseSByZXBsYWNlcyB0aGUgZ2xvYmFsXG4gICAgICogaG9zdFNESy5zZXRSZW5kZXJQb2xpY3kgXHUyMDE0IHNvIGFuIGFwcCBjYW4gcmVzdHJpY3QgZ2xvYmFsbHkgYW5kIGFsbG93IHNwZWNpZmljcy5cbiAgICAgKiBXaXRoIG5vIHBvbGljeSBzZXQsIGJlaGF2aW9yIGlzIHVuY2hhbmdlZCBmcm9tIGJlZm9yZSAobWFya2VyIFx1MjFEMiB3ZWIgY29tcG9uZW50KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVSZW5kZXJNb2RlKFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIGxvYWRlckNvbmZpZzogSUhUTUxMb2FkZXJDb25maWcsXG4gICAgICAgIGlzV2ViQ29tcG9uZW50OiBib29sZWFuLFxuICAgICAgICBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyxcbiAgICApOiBQcm9taXNlPHsgbW9kZTogUmVuZGVyTW9kZSB8IGZhbHNlOyBpc29sYXRlOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkTW9kZTogUmVuZGVyTW9kZSA9IGlzV2ViQ29tcG9uZW50XG4gICAgICAgICAgICA/ICd3ZWJDb21wb25lbnQnXG4gICAgICAgICAgICA6ICgobG9hZGVyQ29uZmlnLmlzb2xhdGlvbiB8fCBvcHRpb25zPy5pc29sYXRpb24pID8gJ2lzb2xhdGVkSWZyYW1lJyA6ICdpZnJhbWUnKTtcblxuICAgICAgICAvLyBwZXItY2FsbCBwb2xpY3kgd2luczsgZWxzZSBnbG9iYWwgcG9saWN5IG9uIHRoZSBob3N0IFNESyBzaW5nbGV0b24uXG4gICAgICAgIGNvbnN0IHBvbGljeTogUmVuZGVyUG9saWN5IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlclBvbGljeSA/PyAod2luZG93IGFzIGFueSk/Lm15b3A/Lmhvc3RTREs/LmdldFJlbmRlclBvbGljeT8uKCk7XG5cbiAgICAgICAgY29uc3QgbW9kZTogUmVuZGVyTW9kZSB8IGZhbHNlID0gcG9saWN5XG4gICAgICAgICAgICA/IGF3YWl0IHBvbGljeSh7IGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIHJlcXVlc3RlZE1vZGUsIGlzV2ViQ29tcG9uZW50IH0pXG4gICAgICAgICAgICA6IHJlcXVlc3RlZE1vZGU7XG5cbiAgICAgICAgcmV0dXJuIHsgbW9kZSwgaXNvbGF0ZTogbW9kZSA9PT0gJ2lzb2xhdGVkSWZyYW1lJyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbi1mcmFtZSBicmlkZ2UgZm9yIGlzb2xhdGVkIGNvbXBvbmVudHMuIFJ1bnMgaW5zaWRlIHRoZSBzYW5kYm94ZWRcbiAgICAgKiAob3BhcXVlLW9yaWdpbikgaWZyYW1lLCB0cmFuc2xhdGluZyB0aGUgc2FtZSBhdXRob3ItZmFjaW5nIGNvbnRyYWN0IHRvL2Zyb21cbiAgICAgKiBwb3N0TWVzc2FnZSBzaW5jZSB0aGUgaG9zdCBoYXMgbm8gc2FtZS1vcmlnaW4gYWNjZXNzOlxuICAgICAqICAgXHUyMDIyIGRhdGEtaW4gOiBwYXJlbnQgcG9zdHMge3R5cGU6J215b3A6aW5pdCd9IFx1MjE5MiBjYWxscyB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZVxuICAgICAqICAgICAgICAgICAgICAgKHBsdXMgYSBiYWtlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgZmlyc3QgcmVuZGVyKVxuICAgICAqICAgXHUyMDIyIGRhdGEtb3V0OiB3aW5kb3cubXlvcF9jdGFfaGFuZGxlciBcdTIxOTIgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidteW9wOmN0YSd9KVxuICAgICAqICAgXHUyMDIyIHJlc2l6ZSAgOiBSZXNpemVPYnNlcnZlciBcdTIxOTIgcGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidteW9wOnNpemUnfSlcbiAgICAgKlxuICAgICAqIFRPRE8oZGV2LWV4dGVuc2lvbik6IHRoZSBpc29sYXRlZCBwYXRoIGRlbGliZXJhdGVseSBza2lwcyB0aGUgc2FtZS1vcmlnaW5cbiAgICAgKiBkYXRhU2NyaXB0LCBzbyBpdCBuZXZlciBwb3N0cyB0aGUgYE1ZT1BfUFJFSU5KRUNURURfSU5JVGAgbWVzc2FnZSB0aGUgTXlvcCBkZXZcbiAgICAgKiBleHRlbnNpb24gbGlzdGVucyBmb3IgdG8gbG9nIHRoZSBJTklUSUFMIHJlbmRlciAoYGluaXQqYCkuIExhdGVyIGluaXQgdXBkYXRlcyBhbmRcbiAgICAgKiBhbGwgQ1RBcyBhcmUgc3RpbGwgdHJhY2tlZCAodGhlIGV4dGVuc2lvbiB3cmFwcyBgY29tcC5wcm9wc2AsIHdoaWNoIG91ciBpc29sYXRlZFxuICAgICAqIGNvbm5lY3RQcm9wcyBicmFuY2ggcm91dGVzIHRocm91Z2gpLCBzbyBvbmx5IHRoZSBmaXJzdC1yZW5kZXIgcGF5bG9hZCBpcyBtaXNzaW5nXG4gICAgICogZnJvbSB0aGUgZXh0ZW5zaW9uJ3MgYWN0aXZpdHkgbG9nIGZvciBpc29sYXRlZCBjb21wb25lbnRzLiBDbG9zaW5nIHRoaXMgd291bGQgYmUgYVxuICAgICAqIH4xLWxpbmUgYHBhcmVudC5wb3N0TWVzc2FnZSh7dHlwZTonTVlPUF9QUkVJTkpFQ1RFRF9JTklUJywgcGF5bG9hZDp7ZGF0YX19KWAgaW5zaWRlXG4gICAgICogZmx1c2hJbml0aWFsKCkgYmVsb3cgXHUyMDE0IGludGVudGlvbmFsbHkgTk9UIGRvbmUgZm9yIG5vdyB0byBhdm9pZCBhZGRpbmcgZXh0ZW5zaW9uLW9ubHlcbiAgICAgKiB0cmFmZmljIHRvIHRoZSBjb21wb25lbnQgcnVudGltZS4gV2ViIGNvbXBvbmVudHMgaGF2ZSB0aGUgc2FtZSBpbml0aWFsLWluaXQgZ2FwXG4gICAgICogKGluaXRXaXRoRGF0YSBpcyBjYWxsZWQgb24gdGhlIGVsZW1lbnQsIG5vdCB2aWEgY29tcC5wcm9wcykgYW5kIGl0IHByZWRhdGVzIHRoaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZElzb2xhdGlvbkJyaWRnZShpbml0aWFsRGF0YUxpdGVyYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgPHNjcmlwdD5cbiAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9faW5pdGlhbCA9ICR7aW5pdGlhbERhdGFMaXRlcmFsfTtcbiAgICAgICAgICAgICAgICB2YXIgX19wZW5kaW5nO1xuICAgICAgICAgICAgICAgIC8vIGRhdGEtb3V0IChjdGEpXG4gICAgICAgICAgICAgICAgd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgPSBmdW5jdGlvbiAoYWN0aW9uLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHBhcmVudC5wb3N0TWVzc2FnZSh7IF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6Y3RhJywgYWN0aW9uOiBhY3Rpb24sIHBheWxvYWQ6IHBheWxvYWQgfSwgJyonKTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxJbml0KGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykgeyB3aW5kb3cubXlvcF9pbml0X2ludGVyZmFjZShkYXRhKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkYXRhLWluIChpbml0IHVwZGF0ZXMpXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8IGQuX19teW9wICE9PSB0cnVlKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChkLnR5cGUgPT09ICdteW9wOmluaXQnKSB7IGlmICghY2FsbEluaXQoZC5kYXRhKSkgX19wZW5kaW5nID0gZC5kYXRhOyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgcmVuZGVyOiB1c2UgYSBwZW5kaW5nIHVwZGF0ZSBpZiBvbmUgYXJyaXZlZCwgZWxzZSB0aGUgYmFrZWQgaW5pdGlhbCBkYXRhXG4gICAgICAgICAgICAgICAgKGZ1bmN0aW9uIGZsdXNoSW5pdGlhbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAoX19wZW5kaW5nICE9PSB1bmRlZmluZWQpID8gX19wZW5kaW5nIDogX19pbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsSW5pdChkYXRhKSkgeyBfX3BlbmRpbmcgPSB1bmRlZmluZWQ7IF9faW5pdGlhbCA9IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbHVzaEluaXRpYWwpO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgLy8gcmVzaXplIChyZXBvcnQgY29udGVudCBzaXplKVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRlbnRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1lYXN1cmUgdGhlIEJPRFkgKGNvbnRlbnQgYm94KS4gZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCBpbmNsdWRlc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaWZyYW1lIHZpZXdwb3J0IFx1MjAxNCB3aGljaCB3ZSdyZSBkcml2aW5nIFx1MjAxNCBzbyBpdCB3b3VsZCByZXBvcnQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZnJhbWUgaGVpZ2h0LCBub3QgdGhlIGNvbnRlbnQsIGFuZCBuZXZlciBzaHJpbmsuXG4gICAgICAgICAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHJldHVybiBNYXRoLm1heChiLnNjcm9sbEhlaWdodCwgYi5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFNpemUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbXlvcDogdHJ1ZSwgdHlwZTogJ215b3A6c2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb250ZW50SGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gT2JzZXJ2ZSB0aGUgQk9EWSAocmVmbG93cyB3aXRoIGNvbnRlbnQpIFx1MjAxNCBub3QgZG9jdW1lbnRFbGVtZW50LCB3aG9zZSBib3ggaXNcbiAgICAgICAgICAgICAgICAvLyB0aGUgaWZyYW1lIHZpZXdwb3J0IGFuZCB3b3VsZCBmZWVkIGJhY2sgaW50byBhIHJlc2l6ZSBsb29wLiBBIE11dGF0aW9uT2JzZXJ2ZXJcbiAgICAgICAgICAgICAgICAvLyBjYXRjaGVzIGNvbnRlbnQgc3dhcHMgKGUuZy4gaW5uZXJIVE1MIHJlLXJlbmRlcikgdGhhdCBkb24ndCBjaGFuZ2UgYm9keSdzIGJveC5cbiAgICAgICAgICAgICAgICBpZiAod2luZG93LlJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHZhciBfX3JvID0gbmV3IFJlc2l6ZU9ic2VydmVyKHBvc3RTaXplKTsgaWYgKGRvY3VtZW50LmJvZHkpIF9fcm8ub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTsgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgbmV3IE11dGF0aW9uT2JzZXJ2ZXIocG9zdFNpemUpLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcG9zdFNpemUpO1xuICAgICAgICAgICAgICAgIHBvc3RTaXplKCk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICA8L3NjcmlwdD5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgdGhlIHdlYiBjb21wb25lbnQgc2NyaXB0IGNvbnRlbnQgZnJvbSBIVE1MXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0V2ViQ29tcG9uZW50U2NyaXB0KGh0bWw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoTVlPUF9XRUJfQ09NUE9ORU5UX1NDUklQVF9JRCk7XG4gICAgICAgIHJldHVybiBzY3JpcHQ/LnRleHRDb250ZW50IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgb24gdGhlIGhvc3QgZG9jdW1lbnQuXG4gICAgICogUmV0dXJucyB0aGUgY3VzdG9tIGVsZW1lbnQgdGFnIG5hbWUgdGhpcyBzY3JpcHQgcmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4ZWN1dGVXZWJDb21wb25lbnRTY3JpcHQoc2NyaXB0Q29udGVudDogc3RyaW5nLCBzY3JpcHRJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGVjdXRlZCAoYnkgc2NyaXB0IGNvbnRlbnQgaGFzaClcbiAgICAgICAgY29uc3QgY2FjaGVkVGFnTmFtZSA9IGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuZ2V0KHNjcmlwdElkKTtcbiAgICAgICAgaWYgKGNhY2hlZFRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGFscmVhZHkgZXhlY3V0ZWQgZm9yICR7c2NyaXB0SWR9LCByZXVzaW5nIDwke2NhY2hlZFRhZ05hbWV9PmApO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFRhZ05hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0Q29udGVudDtcbiAgICAgICAgc2NyaXB0LmlkID0gYG15b3AtZXh0cmFjdGVkLSR7c2NyaXB0SWR9YDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGdsb2JhbCBpbW1lZGlhdGVseTogdGhlIG5leHQgZXh0cmFjdGVkIHNjcmlwdCB0byBydW4gd2lsbCBvdmVyd3JpdGUgaXQuXG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG4gICAgICAgIGlmICh0YWdOYW1lKSB7XG4gICAgICAgICAgICBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzLnNldChzY3JpcHRJZCwgdGFnTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBFeGVjdXRlZCB3ZWIgY29tcG9uZW50IHNjcmlwdDogJHtzY3JpcHRJZH0gLT4gPCR7dGFnTmFtZX0+YCk7XG4gICAgICAgIHJldHVybiB0YWdOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBNeW9wIFdlYiBDb21wb25lbnQgKGV4dHJhY3RlZCBhbmQgcnVuIG9uIGhvc3QgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KFxuICAgICAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgc2tpbjogSVNraW5Db25maWcsXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIGh0bWw6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGxvYWRlck9wdGlvbnNcbiAgICApOiBQcm9taXNlPE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQ+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IHRoaXMuZXh0cmFjdFdlYkNvbXBvbmVudFNjcmlwdChodG1sKTtcblxuICAgICAgICBpZiAoIXNjcmlwdENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW015b3BXZWJDb21wb25lbnRdIE5vIDxzY3JpcHQgaWQ9XCJteW9wLXdlYi1jb21wb25lbnRcIj4gZm91bmQgaW4gSFRNTCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGNvbXBvbmVudCBkZWZpbml0aW9uIGlkIGFzIHNjcmlwdCBpZGVudGlmaWVyIGZvciBkZWR1cGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IHNjcmlwdElkID0gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH0tJHtza2luLmlkfWA7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50LCBvciByZXVzZSB0aGUgdGFnIGl0IHJlZ2lzdGVyZWQgZWFybGllci5cbiAgICAgICAgLy8gTmV2ZXIgcmUtcmVhZCB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18gaGVyZTogb24gYSByZS1tb3VudCB0aGUgc2NyaXB0IGlzIHNraXBwZWQgYW5kXG4gICAgICAgIC8vIHRoZSBnbG9iYWwgc3RpbGwgcG9pbnRzIGF0IHdoaWNoZXZlciBjb21wb25lbnQncyBzY3JpcHQgcmFuIGxhc3QsIHdoaWNoIHdvdWxkIGJ1aWxkXG4gICAgICAgIC8vIHRoaXMgY29udGFpbmVyJ3MgZWxlbWVudCBmcm9tIGFub3RoZXIgY29tcG9uZW50J3MgdGFnLlxuICAgICAgICBjb25zdCB0YWdOYW1lID0gdGhpcy5leGVjdXRlV2ViQ29tcG9uZW50U2NyaXB0KHNjcmlwdENvbnRlbnQsIHNjcmlwdElkKTtcblxuICAgICAgICBpZiAoIXRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW015b3BXZWJDb21wb25lbnRdIFNjcmlwdCBkaWQgbm90IHNldCB3aW5kb3cuX19NWU9QX1RBR19OQU1FX18nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgY29udGFpbmVyIGlmIG5lZWRlZFxuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKSB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgd3JhcHBlclxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb24sXG4gICAgICAgICAgICBza2luLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGRhdGEgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmluaXRXaXRoRGF0YShvcHRpb25zLmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBMb2FkZWQgPCR7dGFnTmFtZX0+IGludG8gY29udGFpbmVyYCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGNvbnN0IGlzV0MgPSB0aGlzLmlzTXlvcFdlYkNvbXBvbmVudChsb2FkZXJDb25maWcuSFRNTCk7XG4gICAgICAgIGNvbnN0IHsgbW9kZSwgaXNvbGF0ZSB9ID0gYXdhaXQgdGhpcy5yZXNvbHZlUmVuZGVyTW9kZShjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBsb2FkZXJDb25maWcsIGlzV0MsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbTXlvcF0gUmVuZGVyaW5nIGJsb2NrZWQgYnkgcmVuZGVyIHBvbGljeSBmb3IgY29tcG9uZW50IFwiJHtjb21wb25lbnREZWZpbml0aW9uLmlkfVwiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNXQykge1xuICAgICAgICAgICAgLy8gV2ViLWNvbXBvbmVudCBIVE1MIG9ubHkgc3VwcG9ydHMgdGhlIHdlYi1jb21wb25lbnQgY29udHJhY3Q7IGEgcG9saWN5IHRoYXRcbiAgICAgICAgICAgIC8vIGRlbmllcyBpdCBoYXMgbm8gaWZyYW1lIGZhbGxiYWNrIChzZWUgcGxhbiBcdTAwQTczLjMpIFx1MjAxNCBibG9jayByYXRoZXIgdGhhblxuICAgICAgICAgICAgLy8gc2lsZW50bHkgcmVuZGVyIGJyb2tlbi4gVW50cnVzdGVkIGNvbnRyaWJ1dG9ycyBtdXN0IHNoaXAgaWZyYW1lIGNvbXBvbmVudHMuXG4gICAgICAgICAgICBpZiAobW9kZSAhPT0gJ3dlYkNvbXBvbmVudCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtNeW9wXSBXZWItY29tcG9uZW50IHJlbmRlcmluZyBkZW5pZWQgYnkgcmVuZGVyIHBvbGljeSBmb3IgY29tcG9uZW50IFwiJHtjb21wb25lbnREZWZpbml0aW9uLmlkfVwiYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgbG9hZGVyQ29uZmlnLkhUTUwsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gRnVsbCBpc29sYXRpb246IGEgc2FuZGJveCBXSVRIT1VUIGFsbG93LXNhbWUtb3JpZ2luIGdpdmVzIHRoZSBmcmFtZSBhblxuICAgICAgICAgICAgLy8gb3BhcXVlIG9yaWdpbiBcdTIwMTQgbm8gaG9zdCBET00vY29va2llcy9wYXJlbnQgYWNjZXNzLiBNdXN0IGJlIHNldCBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoZSBmcmFtZSBuYXZpZ2F0ZXMgKGkuZS4gYmVmb3JlIHNyY2RvYyAvIGFwcGVuZCkuXG4gICAgICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzYW5kYm94JywgJ2FsbG93LXNjcmlwdHMgYWxsb3ctZm9ybXMgYWxsb3ctcG9wdXBzJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gV3JpdGUgY29udGVudCBpbnRvIHRoZSBpZnJhbWUuIEFuIGlzb2xhdGVkIChzYW5kYm94ZWQsIG9wYXF1ZS1vcmlnaW4pIGZyYW1lXG4gICAgICAgICAgICAvLyBjYW4ndCBiZSBkb2Mud3JpdGUoKSduIGZyb20gdGhlIGhvc3QsIHNvIGFjY3VtdWxhdGUgdGhlIG1hcmt1cCBhbmQgc2V0IGl0IHZpYVxuICAgICAgICAgICAgLy8gc3JjZG9jIG9uIGNsb3NlKCkuIE5vbi1pc29sYXRlZCBmcmFtZXMga2VlcCB0aGUgc2FtZS1vcmlnaW4gZG9jLndyaXRlIHBhdGguXG4gICAgICAgICAgICBjb25zdCBfX3NyY1BhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZG9jOiB7IG9wZW4oKTogdm9pZDsgd3JpdGVsbihzOiBzdHJpbmcpOiB2b2lkOyBjbG9zZSgpOiB2b2lkIH0gPSBpc29sYXRlXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIG9wZW4oKSB7fSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVsbihzOiBzdHJpbmcpIHsgX19zcmNQYXJ0cy5wdXNoKHMpOyB9LFxuICAgICAgICAgICAgICAgICAgICBjbG9zZSgpIHsgSWZyYW1lRWxlbWVudC5zcmNkb2MgPSBfX3NyY1BhcnRzLmpvaW4oJ1xcbicpOyB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gSWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgICAgICAgICAgICBkLm9wZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfSkoKTtcblxuXG4gICAgICAgICAgICAvLyBQYXJzZSBteW9wOnNpemUgbWV0YSB0YWcgYmVmb3JlIGlmcmFtZSBjcmVhdGlvbiAoc2FtZSBET01QYXJzZXIgcGFzcyBwYXR0ZXJuIGFzIG15b3BfcHJldmlldyByZW1vdmFsKS5cbiAgICAgICAgICAgIC8vIFRoaXMgbGV0cyB0aGUgUmVhY3QgaG9zdCBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkgZnJvbSB0aGUgc3RhcnQuXG4gICAgICAgICAgICBsZXQgcGFyc2VkU2l6ZU1ldGE6IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3ByZVBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlRG9jID0gX3ByZVBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplTWV0YSA9IF9wcmVEb2MucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwibXlvcDpzaXplXCJdJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNpemVNZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHBhcnNlZFNpemVNZXRhID0gSlNPTi5wYXJzZShzaXplTWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAne30nKTsgfSBjYXRjaCB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IEhUTUwyUmVuZGVyID0gbG9hZGVyQ29uZmlnLkhUTUw7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faW5zcGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vaW5qZWN0IGluc3BlY3Rpb24gc2NyaXB0IGZvciBwcm9wcyBkZXRlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBwYXJ0IG9mIEFJIGNvbXBvbmVudHMsIHRoaW5rIGFib3V0IHRoYXQsIGRvY3VtZW50IGl0LlxuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcbiAgICAgICAgICAgICAgICBteW9wX3ByZXZpZXdfc2NyaXB0Py5yZW1vdmVBdHRyaWJ1dGUoJ3R5cGUnKTtcblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBpbmplY3RlZCBIVE1MIHN0cmluZyBpbnRvIGEgbm9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBfZG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICAgICAgICAgICAgICAgIHRlbXAuYm9keS5pbm5lckhUTUwgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUtleXNXaW5kb3cgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVLZXlzV2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXAuYm9keS5maXJzdENoaWxkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgX2RvYy5oZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kb2MuaGVhZC5pbnNlcnRCZWZvcmUoX2RvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpLCBfZG9jLmhlYWQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBET0NUWVBFOiBkb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIHJldHVybnMgb25seSA8aHRtbD4uLi48L2h0bWw+XG4gICAgICAgICAgICAgICAgLy8gYW5kIGRyb3BzIHRoZSBkb2N0eXBlLCB3aGljaCB3b3VsZCBwdXQgdGhlIGlmcmFtZSBpbiBxdWlya3MgbW9kZS5cbiAgICAgICAgICAgICAgICAvLyBRdWlya3MgbW9kZSBicmVha3MgYXV0by1zaXppbmcgYmVjYXVzZSA8Ym9keT4gc3RyZXRjaGVzIHRvIHRoZSBpZnJhbWVcbiAgICAgICAgICAgICAgICAvLyB2aWV3cG9ydCBpbnN0ZWFkIG9mIHNocmlua2luZyB0byBjb250ZW50LCBzbyBSZXNpemVPYnNlcnZlciBvbiBib2R5XG4gICAgICAgICAgICAgICAgLy8gbmV2ZXIgZmlyZXMgd2hlbiBjb250ZW50IHJlZmxvd3MgKGUuZy4gYWZ0ZXIgZm9udCBzd2FwKS5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9ICc8IURPQ1RZUEUgaHRtbD4nICsgX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaW1wcm92ZSBieSBkbyBpdCBvbiB0aGUgc2VydmUgb25jZVxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG15b3BfcHJldmlldyBzY3JpcHQgd2hlbiBub3QgaW4gaW5zcGVjdGlvbiBtb2RlXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG15b3BfcHJldmlld19zY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXlvcF9wcmV2aWV3X3NjcmlwdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIG5vdGUgYWJvdmU6IHByZXBlbmQgRE9DVFlQRSB0byBrZWVwIHRoZSBpZnJhbWUgaW4gc3RhbmRhcmRzIG1vZGUuXG4gICAgICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gJzwhRE9DVFlQRSBodG1sPicgKyBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgaG9zdC1wcm92aWRlZCBDU1MgYmVmb3JlIHRoZSBpZnJhbWUgaXMgd3JpdHRlbiBzbyBzdHlsZXMgYXJlXG4gICAgICAgICAgICAvLyBwcmVzZW50IG9uIGZpcnN0IHBhaW50IChubyBGT1VDKS4gQXBwZW5kZWQgbGFzdCBpbiA8aGVhZD4gc28gaXQgd2luc1xuICAgICAgICAgICAgLy8gb3ZlciB0aGUgY29tcG9uZW50J3Mgb3duIHN0eWxlcyB2aWEgbm9ybWFsIGNhc2NhZGUgb3JkZXIuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaW5qZWN0Q3NzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9kb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKEhUTUwyUmVuZGVyLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVUYWcuc2V0QXR0cmlidXRlKCdkYXRhLW15b3AtaW5qZWN0ZWQnLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgIC8vIDxzdHlsZT4gaXMgYW4gSFRNTCByYXctdGV4dCBlbGVtZW50OiB0aGUgc2VyaWFsaXplciBiZWxvdyB3cml0ZXMgaXRzXG4gICAgICAgICAgICAgICAgLy8gY29udGVudHMgTElURVJBTExZLCB3aXRob3V0IGVzY2FwaW5nLiBDU1MgY29udGFpbmluZyBcIjwvc3R5bGU+XCIgd291bGRcbiAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgY2xvc2UgdGhlIHRhZyBhbmQgaW5qZWN0IGxpdmUgbWFya3VwIGludG8gdGhlIGlmcmFtZSwgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBleGVjdXRlcyBzYW1lLW9yaWdpbiB3aXRoIHRoaXMgcGFnZS4gTmV1dHJhbGl6ZSB0aGUgc2VxdWVuY2UgXHUyMDE0IG5vIHJlYWxcbiAgICAgICAgICAgICAgICAvLyBzdHlsZXNoZWV0IGNvbnRhaW5zIGl0LiAoU2FtZSBjbGFzcyBvZiBidWcgYXMgdGhlIDwvc2NyaXB0PiBlc2NhcGUgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgZGF0YSBwYXlsb2FkIGJlbG93LilcbiAgICAgICAgICAgICAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IG9wdGlvbnMuaW5qZWN0Q3NzLnJlcGxhY2UoLzxcXHMqXFwvXFxzKnN0eWxlL2dpLCAnPFxcXFwvc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAoX2RvYy5oZWFkIHx8IF9kb2MuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgICAgICAgICAgICAgLy8gU2VlIG5vdGUgYWJvdmU6IHByZXBlbmQgRE9DVFlQRSB0byBrZWVwIHRoZSBpZnJhbWUgaW4gc3RhbmRhcmRzIG1vZGUuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSAnPCFET0NUWVBFIGh0bWw+JyArIF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihIVE1MMlJlbmRlcik7XG5cbiAgICAgICAgICAgIC8vIHdpbmRvdy5fX2ZlZGVyYXRpb25fXyA9XG4gICAgICAgICAgICAvLyAgICAgeyAuLi53aW5kb3cuX19mZWRlcmF0aW9uX18sXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vVE9ETyA6IGdldCBmcm9tIEVOViBhdCBidWlsZCB0aW1lLFxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBpbmplY3QgdmFsdWUgdG8gbW9kdWxlIGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uXG4gICAgICAgICAgICAvLyAgICAgICAgIF9fcHVibGljX3BhdGhfXyA6J2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0J1xuICAgICAgICAgICAgLy8gICAgICAgICAsLi4uJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fKVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9O1xuXG4gICAgICAgICAgICAvLyBGb3IgbnBtIHBhY2thZ2UgdXNlcnMgd2l0aCBidW5kbGVycyAoVml0ZS9XZWJwYWNrKSwgaW5qZWN0IFNESyBpbmxpbmVcbiAgICAgICAgICAgIC8vIEZvciBDRE4gdXNlcnMgKHNjcmlwdCB0YWcpLCB1c2UgQ0ROIFVSTFxuICAgICAgICAgICAgY29uc3Qgc2RrU2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+JHtFTUJFRERFRF9TREtfQ09OVEVOVH08L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdCBzcmM9XCIke3dpbmRvdy5teW9wLl9fUk9PVF9TREtfUFVCTElDX1VSTF9ffVwiPjwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIERpZmZlcmVudCBpbml0IHNjcmlwdCBmb3IgZW1iZWRkZWQgdnMgQ0ROIFNES1xuICAgICAgICAgICAgLy8gLSBFbWJlZGRlZCAoYnVuZGxlZCBJSUZFKTogdXNlcyBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHJldHVybnMgbW9kdWxlIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyAtIENETiAoZHluYW1pYyBsb2FkaW5nKTogdXNlcyB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHdyYXBzIHdpdGggLmdldCgpXG4gICAgICAgICAgICBjb25zdCBpbml0U2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVNb2R1bGUgPSBhd2FpdCBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWZyYW1lU0RLID0gaWZyYW1lTW9kdWxlLklmcmFtZVNESztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fO1xuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAvLyBJc29sYXRlZCBmcmFtZXMgdXNlIHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgaW5zdGVhZCBvZiB0aGUgc2FtZS1vcmlnaW5cbiAgICAgICAgICAgIC8vIElmcmFtZVNESyArIGRhdGEtaW5qZWN0aW9uIHNjcmlwdHMgKHdoaWNoIHJlbHkgb24gaG9zdFx1MjE5NGZyYW1lIGFjY2VzcykuXG4gICAgICAgICAgICBpZiAoIWlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBkb2Mud3JpdGVsbihgJHtzZGtTY3JpcHR9JHtpbml0U2NyaXB0fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgZGF0YSBzY3JpcHQgaWYgZGF0YSBvcHRpb24gaXMgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmICghaXNvbGF0ZSAmJiBvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBDVEEgcXVldWUgLSBjYXB0dXJlcyBhbnkgQ1RBcyBlbWl0dGVkIGR1cmluZyBpbml0IGJlZm9yZSBob3N0IHJlZ2lzdGVycyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgY29uc3QgY3RhUXVldWVTY3JpcHQgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgPSBmdW5jdGlvbihhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlLnB1c2goe2FjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBkYXRhIGZvciBzYWZlIGVtYmVkZGluZyBpbiBzY3JpcHQgdGFnXG4gICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgZG9lc24ndCBlc2NhcGUgPC9zY3JpcHQ+IHdoaWNoIGNvdWxkIGJyZWFrIEhUTUwgcGFyc2luZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPFxcL3NjcmlwdC9naSwgJ1xcXFx1MDAzYy9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgIC8vIFNlbGYtY29udGFpbmVkIGRhdGEgaW5qZWN0aW9uIHNjcmlwdCB0aGF0OlxuICAgICAgICAgICAgICAgIC8vIDEuIENhbGxzIG15b3BfaW5pdF9pbnRlcmZhY2UgaW1tZWRpYXRlbHkgaWYgYWxyZWFkeSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgLy8gMi4gV2F0Y2hlcyBmb3IgbGF0ZS1kZWZpbmVkIG15b3BfaW5pdF9pbnRlcmZhY2UgdmlhIGRlZmluZVByb3BlcnR5XG4gICAgICAgICAgICAgICAgLy8gMy4gQ2xlYW5zIHVwIGFmdGVyIGl0c2VsZiAocmVtb3ZlcyBzY3JpcHQgdGFnIGFuZCB3aW5kb3cgZGF0YSlcbiAgICAgICAgICAgICAgICAvLyA0LiBQb3N0cyBtZXNzYWdlIHRvIHBhcmVudCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nIChwcmUtaW5qZWN0ZWQgaW5pdCopXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNjcmlwdCA9IGA8c2NyaXB0IGlkPVwiX19teW9wX2luaXRfZGF0YV9zY3JpcHRcIj5cbiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAke2VzY2FwZWREYXRhfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JpcHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdfX215b3BfaW5pdF9kYXRhX3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbEluaXRJbnRlcmZhY2UgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIHByZS1pbmplY3RlZCBkYXRhIGNhbGwgZm9yIGV4dGVuc2lvbiB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGV4dGVuc2lvbiB2aWEgcG9zdE1lc3NhZ2UgKGluaXQqID0gcHJlLWluamVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01ZT1BfUFJFSU5KRUNURURfSU5JVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXA6IHJlbW92ZSBzY3JpcHQgdGFnIGFuZCBzdG9yZWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRFbCAmJiBzY3JpcHRFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gYWxyZWFkeSBleGlzdHMgLSBjYWxsIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2Uod2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBub3QgeWV0IGRlZmluZWQgLSBzdG9yZSBkYXRhIGFuZCB3YXRjaCBmb3IgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhID0gZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ215b3BfaW5pdF9pbnRlcmZhY2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29yaWdpbmFsID0gZm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fbXlvcF9pbml0X2RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZWREYXRhID0gd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKGZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGN0YVF1ZXVlU2NyaXB0ICsgZGF0YVNjcmlwdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElzb2xhdGVkIGZyYW1lczogaW5qZWN0IHRoZSBwb3N0TWVzc2FnZSBicmlkZ2UgKGluaXQgaW4gLyBjdGEgb3V0IC8gc2l6ZSBvdXQpLlxuICAgICAgICAgICAgaWYgKGlzb2xhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkRGF0YSA9IG9wdGlvbnM/LmRhdGEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSkucmVwbGFjZSgvPFxcL3NjcmlwdC9naSwgJ1xcXFx1MDAzYy9zY3JpcHQnKVxuICAgICAgICAgICAgICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKHRoaXMuYnVpbGRJc29sYXRpb25CcmlkZ2UoZXNjYXBlZERhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gSXNvbGF0ZWQ6IHdpcmUgdGhlIGhvc3Qgc2lkZSBvZiB0aGUgcG9zdE1lc3NhZ2UgYnJpZGdlIChjdGEgaW4sIHNpemUgaW4sIGluaXQgb3V0KS5cbiAgICAgICAgICAgIGlmIChpc29sYXRlKSBjb21wLmVuYWJsZUlzb2xhdGlvbigpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBwYXJzZWQgc2l6ZU1ldGEgb24gdGhlIGNvbXBvbmVudCBzbyB0aGUgUmVhY3QgaG9zdCBjYW4gcmVhZCBpdFxuICAgICAgICAgICAgY29tcC5zaXplTWV0YSA9IHBhcnNlZFNpemVNZXRhO1xuXG4gICAgICAgICAgICAvLyBBdXRvLXNpemU6IG9ic2VydmUgY29udGVudCBzaXplIGFuZCBzeW5jIHRvIGlmcmFtZSBkaW1lbnNpb25zLlxuICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBmb3IgYWxsIGhvc3RzICh2YW5pbGxhIFNESywgUmVhY3QsIFZ1ZSwgQW5ndWxhcikuXG4gICAgICAgICAgICAvLyBJZiBhIGZyYW1ld29yayBob3N0IChlLmcuIEBteW9wL3JlYWN0KSBhbHNvIGNhbGxzIG9ic2VydmVBdXRvU2l6ZSgpLFxuICAgICAgICAgICAgLy8gaXQgY2xlYW5seSByZXBsYWNlcyB0aGVzZSBvYnNlcnZlcnMgdmlhIF9hdXRvU2l6ZUNsZWFudXAgdHJhY2tpbmcuXG4gICAgICAgICAgICBjb21wLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5hdXRvU2l6ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gYXV0by1zaXppbmcuIElmcmFtZSBzdGF5cyBwb3NpdGlvbjphYnNvbHV0ZSBmaWxsaW5nIGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgICAgLy8gSG9zdCBpcyBmdWxseSByZXNwb25zaWJsZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMgKGUuZy4gUmVhY3QgTmF0aXZlIFdlYlZpZXcpLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzaG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZUF1dG9TaXplKHtcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VBdXRvU2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgb25TaXplQ2hhbmdlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93IGFmdGVyIGZpcnN0IG1lYXN1cmVtZW50IGNvbXBsZXRlcyAobm90IGJlZm9yZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zaXRpb25zIGZyb20gYWJzb2x1dGUgb3ZlcmxheSB0byBkb2N1bWVudCBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgbWVhc3VyZWQgaGVpZ2h0LCBwcmV2ZW50aW5nIGZsYXNoIGF0IHdyb25nIHNpemUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3duICYmICFvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gY29tcC5wcm9wcy5fZ2xvYmFsID0gY29tcC5lbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgICAgICAgICByZXR1cm4gY29tcDtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm5vbmUpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlciA9IHBhcnNlciA/IHBhcnNlciA6IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBkb2MuYm9keS5maXJzdENoaWxkO1xuICAgICAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBkb21JZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MOy8vLnRyaW0oKTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IHogPSBmaXJzdEVsZW1lbnQgPyBmaXJzdEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgICAgIC8vICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBmaXJzdEVsZW1lbnQsIHopXG4gICAgICAgICAgICAvLyAgIGVsZW1lbnQgPSBmaXJzdEVsZW1lbnRcblxuICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKGVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnROYW1lID0gdG9DdXN0b21FbGVtZW50TmFtZShjb21wb25lbnREZWZpbml0aW9uLm5hbWUgKyBza2luLmlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWRlZmluZSAhXG4gICAgICAgICAgICBpZiAoIXNlZW4uaW5jbHVkZXMoY3VzdG9tRWxlbWVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50KGN1c3RvbUVsZW1lbnROYW1lLCBsb2FkZXJDb25maWcuSFRNTCwgbG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlKTtcbiAgICAgICAgICAgICAgICBzZWVuLnB1c2goY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7Y3VzdG9tRWxlbWVudE5hbWV9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVByb3BDb25maWcsXG4gICAgSVNraW5Db25maWcsXG4gICAgSVVzZXJGbG93LFxuICAgIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIHYyX0lWYXJpYW50Q29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwLFxuICAgICAgICAgICAgLy8gT25seSBgdWk6YCB0YWdzIGV2ZXIgcmVhY2ggdGhlIGNsaWVudDsgdGhlIHNlcnZlciBmaWx0ZXJzLCBhYnNlbnQgPSBub25lLlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdWlUYWdzOiBBcnJheS5pc0FycmF5KGNvbmZpZy51aVRhZ3MpID8gY29uZmlnLnVpVGFncyA6IFtdXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG4vLyBVc2UgYSBnbG9iYWwgc2luZ2xldG9uIHRvIGVuc3VyZSBvbmx5IG9uZSBDbG91ZFJlcG9zaXRvcnkuTWFpbiBleGlzdHNcbi8vIGV2ZW4gd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcyBieSBkaWZmZXJlbnQgYnVuZGxlcnNcbmNvbnN0IEdMT0JBTF9LRVkgPSAnX19NWU9QX0NMT1VEX1JFUE9TSVRPUllfTUFJTl9fJztcblxuY29uc3QgZ2V0R2xvYmFsTWFpbiA9ICgpOiBDbG91ZFJlcG9zaXRvcnkgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0dMT0JBTF9LRVldO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3Qgc2V0R2xvYmFsTWFpbiA9IChpbnN0YW5jZTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV0gPSBpbnN0YW5jZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHN0YXRpYyBfbWFpbjogQ2xvdWRSZXBvc2l0b3J5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IE1haW4oKTogQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBnbG9iYWwgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgKGZyb20gYW5vdGhlciBidW5kbGUpXG4gICAgICAgIGNvbnN0IGdsb2JhbE1haW4gPSBnZXRHbG9iYWxNYWluKCk7XG4gICAgICAgIGlmIChnbG9iYWxNYWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTWFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2UgaWYgbmVlZGVkXG4gICAgICAgIGlmICghQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKSB7XG4gICAgICAgICAgICBDbG91ZFJlcG9zaXRvcnkuX21haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gICAgICAgICAgICBzZXRHbG9iYWxNYWluKENsb3VkUmVwb3NpdG9yeS5fbWFpbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsb3VkUmVwb3NpdG9yeS5fbWFpbjtcbiAgICB9XG5cbiAgICAvLyB2MiBjYWNoZSAtIGtleWVkIGJ5IGNvbXBvbmVudElkOmVudjpwcmV2aWV3fGxpdmVcbiAgICAvLyBFYWNoIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgcmVzb2x2ZWRgIHByb3BlcnR5IGFmdGVyIHNldHRsaW5nIChzZWUgZmV0Y2hDb21wb25lbnRWMikuXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH0+ID0ge307XG5cbiAgICAvLyBUcmFjayB3aGljaCBjb21wb25lbnRzIHdlcmUgcHJlbG9hZGVkIGFuZCB3aXRoIHdoYXQgcGFyYW1zXG4gICAgLy8gS2V5OiBjb21wb25lbnRJZCwgVmFsdWU6IHsgZW52LCBwcmV2aWV3IH1cbiAgICBwcml2YXRlIHByZWxvYWRlZENvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfT4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG4gICAgcHJpdmF0ZSBfZW52RXhwbGljaXRseVNldCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N0YXRpY01vZGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzdGF0aWMgbW9kZSBmb3Igc2VsZi1ob3N0ZWQgY29tcG9uZW50IHJlZ2lzdHJpZXMuXG4gICAgICogSW4gc3RhdGljIG1vZGUsIFVSTHMgYXJlIGNvbnN0cnVjdGVkIGFzIGZpbGUgcGF0aHMgaW5zdGVhZCBvZiBxdWVyeSBwYXJhbXM6XG4gICAgICogICAke2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZ9Lmpzb25cbiAgICAgKi9cbiAgICBlbmFibGVTdGF0aWNNb2RlKCkge1xuICAgICAgICB0aGlzLl9zdGF0aWNNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcXVlcnkgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gYWxsIGZldGNoIFVSTHMgKGUuZy4gZm9yIENETiBjYWNoZSBidXN0aW5nKS5cbiAgICAgKiBFeGFtcGxlOiBgc2V0UXVlcnlQYXJhbXMoeyBsYXN0dXBkYXRlOiAnMTExMTIwMjYnIH0pYFxuICAgICAqL1xuICAgIHNldFF1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICB0aGlzLl9xdWVyeVBhcmFtcyA9IHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgYSBjb21wb25lbnQgY29uZmlnOiBmZXRjaCBpdCBvbmNlLCB0aGVuIHNlcnZlIGl0IGZyb20gdGhpc1xuICAgICAqIHJlcG9zaXRvcnkncyBjYWNoZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIG5hbWUgdG8gdXNlLiBgZmV0Y2hDb21wb25lbnRWMmAgaXMgdGhlIHNhbWUgbWV0aG9kIHVuZGVyIGl0c1xuICAgICAqIHZlcnNpb25lZCBuYW1lIGFuZCBzdGF5cyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBcdTIwMTQgbm90ZSB0aGF0IHRoZVxuICAgICAqIHVudmVyc2lvbmVkIGBmZXRjaENvbXBvbmVudGAgaXMgYSAqZGVwcmVjYXRlZCB2MSogQVBJIGFuZCBpcyBOT1QgdGhpcy5cbiAgICAgKlxuICAgICAqIENvbXBsZXRlcyB0aGUgdHJpbyB3aXRoIHtAbGluayBnZXRSZXNvbHZlZENvbmZpZ30gKHN5bmNocm9ub3VzIHJlYWQgb2YgYW5cbiAgICAgKiBhbHJlYWR5LXJlc29sdmVkIGNvbmZpZykgYW5kIHtAbGluayBoeWRyYXRlQ29tcG9uZW50fSAoc2VlZCBvbmUgeW91XG4gICAgICogYWxyZWFkeSBob2xkKS5cbiAgICAgKlxuICAgICAqIFByZWZlciB0aGUgbW9kdWxlLWxldmVsIGBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKWAgaW4gYXBwIGNvZGU7IHJlYWNoIGZvclxuICAgICAqIHRoaXMgd2hlbiB5b3UgbmVlZCBhbiBpc29sYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIHdob3NlIGNhY2hlIGxpZmV0aW1lXG4gICAgICogeW91IGNvbnRyb2wgXHUyMDE0IGEgc2VydmVyIHdpdGggaXRzIG93biBUVEwsIGZvciBleGFtcGxlLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc29sdmVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKlxuICAgICAqIEBzZWUgcmVzb2x2ZUNvbXBvbmVudCBcdTIwMTQgdGhlIHVudmVyc2lvbmVkIG5hbWUgZm9yIHRoaXMgbWV0aG9kXG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnRWMihjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiB7XG4gICAgICAgIGNvbnN0IHsgZW52LCB1c2VQcmV2aWV3LCBjYWNoZUtleSB9ID0gdGhpcy5yZXNvbHZlUGFyYW1zKGNvbXBvbmVudElkLCBlbnZpcm9ubWVudElkZW50aWZpZXIsIHByZXZpZXcpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0aWNNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHVzZVByZXZpZXcgPyAncHJldmlldycgOiBlbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2ZpbGV9Lmpzb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLl9xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXMpIHVybCArPSBgPyR7cXN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwcmV2aWV3PXRydWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIGNvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgKCR7cmVzLnN0YXR1c30ke3RoaXMuX3N0YXRpY01vZGUgPyBgIGZyb20gJHt1cmx9YCA6ICcnfSlgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0ganNvbi5pdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb21wb25lbnQgXCIke2NvbXBvbmVudElkfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQgfHwgIXZhcmlhbnQuY29uc3VtZV92YXJpYW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgaGFzIG5vIGltcGxlbWVudGF0aW9uIGZvciBlbnZpcm9ubWVudCBcIiR7ZW52fVwiYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uZmlnID0gY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnKHZhcmlhbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnIHRoZSBQcm9taXNlIHNvIGdldFJlc29sdmVkQ29uZmlnIGNhbiByZWFkIGl0IHN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSBhcyBhbnkpLnJlc29sdmVkID0gY29tcG9uZW50Q29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY2FjaGVkIHJlamVjdGVkIHByb21pc2Ugc28gdGhlIG5leHQgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgYSBmcmVzaCByZXF1ZXN0IChlLmcuIGFmdGVyIG5ldHdvcmsgcmVjb3ZlcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY2FjaGVLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHZlcnNpb24gb2YgZmV0Y2hDb21wb25lbnRWMiBcdTIwMTQgcmV0dXJucyB0aGUgY29uZmlnIG9ubHkgaWZcbiAgICAgKiB0aGUgZmV0Y2ggYWxyZWFkeSBjb21wbGV0ZWQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogVXNlcyB0aGUgc2FtZSBgdGhpcy52YXJpYW50c2AgY2FjaGUgdGhhdCBmZXRjaENvbXBvbmVudFYyL3ByZWxvYWRDb21wb25lbnRzXG4gICAgICogcG9wdWxhdGUuIEVhY2ggY2FjaGVkIFByb21pc2UgaXMgdGFnZ2VkIHdpdGggYSBgLnJlc29sdmVkYCBwcm9wZXJ0eSB3aGVuXG4gICAgICogaXQgc2V0dGxlcyBcdTIwMTQgdGhpcyBtZXRob2QganVzdCByZWFkcyB0aGF0IHByb3BlcnR5LiBObyBzZXBhcmF0ZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdoeSB0aGlzIGV4aXN0czogUmVhY3QgTmF0aXZlIG5lZWRzIHRoZSBjb25maWcgYXQgcmVuZGVyIHRpbWUgdG8gZW1iZWQgaXRcbiAgICAgKiBpbiB0aGUgV2ViVmlldyBIVE1MIChjYW4ndCBhd2FpdCBpbiB1c2VTdGF0ZSkuIElmIHByZWxvYWRDb21wb25lbnRzIHJhblxuICAgICAqIGVhcmxpZXIgYW5kIHRoZSBmZXRjaCBjb21wbGV0ZWQsIHRoaXMgcmV0dXJucyB0aGUgcmVzdWx0IHN5bmNocm9ub3VzbHksXG4gICAgICogc2tpcHBpbmcgdGhlIFdFQlZJRVdfUkVBRFkgXHUyMTkyIGZldGNoIFx1MjE5MiBpbmplY3Qgcm91bmQgdHJpcCBlbnRpcmVseS5cbiAgICAgKi9cbiAgICBnZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogSUNvbXBvbmVudENvbmZpZyB8IG51bGwge1xuICAgICAgICBjb25zdCB7IGNhY2hlS2V5IH0gPSB0aGlzLnJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XT8ucmVzb2x2ZWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHVpOmAgdGFncyBvZiBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCAoYFtdYCBpZiBpdCBoYXMgbm9uZSBvciBpcyBub3RcbiAgICAgKiByZXNvbHZlZCB5ZXQpLiBTeW5jaHJvbm91cywgbm8gcmVxdWVzdDogdGFncyBhcnJpdmUgd2l0aCB0aGUgY29tcG9uZW50IGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXRDb21wb25lbnRUYWdzKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpPy50eXBlPy51aVRhZ3MgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB3aGljaCAoZW52LCBwcmV2aWV3KSBwYWlyIFx1MjAxNCBhbmQgdGhlcmVmb3JlIHdoaWNoIGNhY2hlIGtleSBcdTIwMTQgYSBjYWxsXG4gICAgICogZm9yIGBjb21wb25lbnRJZGAgcmVmZXJzIHRvLlxuICAgICAqXG4gICAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZmV0Y2hDb21wb25lbnRWMiwgZ2V0UmVzb2x2ZWRDb25maWcgYW5kXG4gICAgICogaHlkcmF0ZUNvbXBvbmVudCwgc28gYSBoeWRyYXRlZCBjb25maWcgYWx3YXlzIGxhbmRzIG9uIHRoZSBrZXkgYSBsYXRlclxuICAgICAqIGZldGNoIHdpbGwgbG9vayB1bmRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgdHJ1ZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBmYWxzZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyB1bmRlZmluZWQ6IGVudiB3YXMgc3BlY2lmaWVkICh2aWEgcGFyYW0gb3Igc2V0RW52aXJvbm1lbnQpIFx1MjE5MiBmYWxzZSwgb3RoZXJ3aXNlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICBjb25zdCBoYXNFZmZlY3RpdmVFbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZW52RXhwbGljaXRseVNldDtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmV2aWV3ID09PSB0cnVlID8gdHJ1ZSA6IChwcmV2aWV3ID09PSBmYWxzZSA/IGZhbHNlIDogIWhhc0VmZmVjdGl2ZUVudik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlbnYsIHVzZVByZXZpZXcsIGNhY2hlS2V5OiBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlZCBhbiBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWcgaW50byB0aGUgY2FjaGUsIHdpdGhvdXQgYW55XG4gICAgICogbmV0d29yayByZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBmZXRjaENvbXBvbmVudFYyfTogdXNlIGl0IHdoZW4gdGhlIGNvbmZpZyB3YXNcbiAgICAgKiByZXNvbHZlZCBzb21ld2hlcmUgZWxzZSBcdTIwMTQgbW9zdCBvZnRlbiBvbiBhIHNlcnZlciwgdGhlbiBlbWJlZGRlZCBpbiB0aGVcbiAgICAgKiBwYWdlIFx1MjAxNCBzbyB0aGUgYnJvd3NlciBjYW4gcmVuZGVyIHRoZSBjb21wb25lbnQgd2l0aCBubyByb3VuZCB0cmlwLlxuICAgICAqXG4gICAgICogQWZ0ZXIgaHlkcmF0aW5nLCBgZmV0Y2hDb21wb25lbnRWMmAsIGBnZXRSZXNvbHZlZENvbmZpZ2AgYW5kIGBpc1ByZWxvYWRlZGBcbiAgICAgKiBhbGwgYW5zd2VyIGZvciB0aGlzIGNvbXBvbmVudCBmcm9tIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZyB3YXMgcmVzb2x2ZWQgd2l0aDsgdGhlIGRlZmF1bHRzXG4gICAgICogbWF0Y2ggd2hhdCBhIHBsYWluIGBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkKWAgd291bGQgaGF2ZSB1c2VkLlxuICAgICAqL1xuICAgIGh5ZHJhdGVDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgY29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW52OiByZXNvbHZlZEVudiwgdXNlUHJldmlldywgY2FjaGVLZXkgfSA9IHRoaXMucmVzb2x2ZVBhcmFtcyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZykgYXMgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPiAmIHsgcmVzb2x2ZWQ/OiBJQ29tcG9uZW50Q29uZmlnIH07XG4gICAgICAgIC8vIFRhZyBpdCB0aGUgc2FtZSB3YXkgZmV0Y2hDb21wb25lbnRWMiBkb2VzLCBzbyBnZXRSZXNvbHZlZENvbmZpZyBjYW5cbiAgICAgICAgLy8gcmVhZCBpdCBzeW5jaHJvbm91c2x5LlxuICAgICAgICBwcm9taXNlLnJlc29sdmVkID0gY29uZmlnO1xuXG4gICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52OiByZXNvbHZlZEVudiwgcHJldmlldzogdXNlUHJldmlldyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PSBWMSBNZXRob2RzIChMZWdhY3kpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MSBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hDb21wb25lbnRWMiBvciBmZXRjaENvbXBvbmVudFYxIGV4cGxpY2l0bHlcbiAgICAgKiBEZWZhdWx0cyB0byB2MSBiZWhhdmlvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hDb21wb25lbnRWMShjb21wb25lbnRJZCwgZmxvd0lkKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENsb3VkUmVwb3NpdG9yeSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBjb25zdCB2Ml9DbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnk7XG4iLCAiaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJQ29tcG9uZW50Q29uZmlnIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5sZXQgX2Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeS5NYWluO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvdWRSZXBvc2l0b3J5ID0gKCkgPT4gX2Nsb3VkUmVwb3NpdG9yeTtcblxuZXhwb3J0IGNvbnN0IGlzUHJlbG9hZGVkID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5pc1ByZWxvYWRlZChjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcmVsb2FkZWRQYXJhbXMgPSAoY29tcG9uZW50SWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5hYmxlTG9jYWxEZXYgPSAoKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoXCJodHRwOi8vbG9jYWxob3N0OjkyOTJcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5VXJsID0gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkodXJsKTtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBTREsgdG8gZmV0Y2ggY29tcG9uZW50cyBmcm9tIGEgc2VsZi1ob3N0ZWQgc3RhdGljIHJlZ2lzdHJ5IChTMywgQ0ROLCBldGMuKVxuICogaW5zdGVhZCBvZiB0aGUgTXlvcCBjbG91ZC4gQ29tcG9uZW50cyBhcmUgc2VydmVkIGFzIHN0YXRpYyBKU09OIGZpbGVzOlxuICogICBgJHtjZG5Vcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZpcm9ubWVudH0uanNvbmBcbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZVNlbGZIb3N0ZWQgPSAoY2RuVXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KGNkblVybCk7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5lbmFibGVTdGF0aWNNb2RlKCk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWRDb25maWcgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuLyoqXG4gKiBUaGUgcnVudGltZSB0YWdzIG9mIGEgbG9hZGVkL3ByZWxvYWRlZCBjb21wb25lbnQ6IG9ubHkgdGFncyBuYW1lZCBgdWk6Li4uYCAoZS5nLlxuICogYHVpOmJldGFgKS4gUmV0dXJucyBgW11gIHdoZW4gaXQgaGFzIG5vbmUgb3IgaGFzIG5vdCBiZWVuIGZldGNoZWQgeWV0LlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwcmVsb2FkQ29tcG9uZW50cyhbaWRdKTtcbiAqIGdldENvbXBvbmVudFRhZ3MoaWQpOyAvLyBbJ3VpOmJldGEnXVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb21wb25lbnRUYWdzID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBzdHJpbmdbXSA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuZ2V0Q29tcG9uZW50VGFncyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmVsb2FkQ29tcG9uZW50cyA9IGFzeW5jIChpZHM6IHN0cmluZ1tdLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgaWRzLm1hcCgoaWQpID0+IF9jbG91ZFJlcG9zaXRvcnkuZmV0Y2hDb21wb25lbnRWMihpZCwgZW52LCBwcmV2aWV3KSksXG4gICAgKTtcbn07XG5cbi8qKlxuICogU2VlZCBhbHJlYWR5LXJlc29sdmVkIGNvbXBvbmVudCBjb25maWdzIGludG8gdGhlIFNESyBjYWNoZSwgd2l0aCBubyBuZXR3b3JrXG4gKiByZXF1ZXN0LiBUaGUgY291bnRlcnBhcnQgdG8ge0BsaW5rIHByZWxvYWRDb21wb25lbnRzfS5cbiAqXG4gKiBVc2UgaXQgd2hlbiB0aGUgY29uZmlncyB3ZXJlIHJlc29sdmVkIHNvbWV3aGVyZSBlbHNlIFx1MjAxNCB0eXBpY2FsbHkgb24gYSBzZXJ2ZXJcbiAqIGFuZCBlbWJlZGRlZCBpbiB0aGUgcGFnZSBcdTIwMTQgc28gdGhlIGNvbXBvbmVudCByZW5kZXJzIHdpdGggemVybyByb3VuZCB0cmlwczpcbiAqXG4gKiBgYGB0c1xuICogLy8gc2VydmVyOiBjb25zdCBjb25maWdzID0geyBbaWRdOiBhd2FpdCBuZXcgQ2xvdWRSZXBvc2l0b3J5KCkuZmV0Y2hDb21wb25lbnRWMihpZCkgfVxuICogLy8gY2xpZW50OlxuICogaHlkcmF0ZUNvbXBvbmVudHMoY29uZmlncyk7XG4gKiAvLyA8TXlvcENvbXBvbmVudCBjb21wb25lbnRJZD17aWR9IC8+IG5vdyByZW5kZXJzIHdpdGhvdXQgZmV0Y2hpbmdcbiAqIGBgYFxuICpcbiAqIFBhc3MgdGhlIHNhbWUgYGVudmAgLyBgcHJldmlld2AgdGhlIGNvbmZpZ3Mgd2VyZSByZXNvbHZlZCB3aXRoOyB0aGUgZGVmYXVsdHNcbiAqIG1hdGNoIHdoYXQgYSBwbGFpbiBgcHJlbG9hZENvbXBvbmVudHMoW2lkXSlgIHdvdWxkIGhhdmUgdXNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGh5ZHJhdGVDb21wb25lbnRzID0gKFxuICAgIGNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIElDb21wb25lbnRDb25maWc+LFxuICAgIGVudj86IHN0cmluZyxcbiAgICBwcmV2aWV3PzogYm9vbGVhbixcbikgPT4ge1xuICAgIGZvciAoY29uc3QgW2lkLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ3MpKSB7XG4gICAgICAgIF9jbG91ZFJlcG9zaXRvcnkuaHlkcmF0ZUNvbXBvbmVudChpZCwgY29uZmlnLCBlbnYsIHByZXZpZXcpO1xuICAgIH1cbn07XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge1JlbmRlclBvbGljeX0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHR5cGUge0lmcmFtZVNES30gZnJvbSBcIi4uL0lmcmFtZVwiO1xuaW1wb3J0IHtjb25uZWN0UHJvcHMsIGNvbm5lY3RSZWZzLCBjcmVhdGVSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElFeHBlcmllbmNlLCBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCwgSVNlZ21lbnRlZFNraW5Db25maWcsIElTZWdtZW50RXhwZXJpZW5jZSxcbiAgICBJU2tpbkNvbmZpZywgSVNraW5TZWxlY3RvckNvbmZpZywgU2tpblNlbGVjdG9yVHlwZXMsXG5cblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtIVE1MQ29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7Y2hlY2tNeW9wT3ZlcnJpZGV9IGZyb20gXCIuL215b3BPdmVycmlkZS50c1wiO1xuXG5pbnRlcmZhY2UgY29tcG9uZW50TG9hZGVyQ3JlYXRvciB7XG4gICAgbmV3KGxvYWRlcnM6IElNeW9wTG9hZGVyW10pOiBhbnk7XG59XG5cbi8vIGNvbnN0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjMwMDAvY29tcG9uZW50P2lkPSR7aWR9YCk7XG4vLyAgICAgY29uc3QgY29tcG9uZW50RGVmOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IChhd2FpdCByZXMuanNvbigpKS5pdGVtO1xuLy8gICAgIHJldHVybiBjb21wb25lbnREZWZcbi8vIH1cblxuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG4vKipcbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0U0RLIHtcbiAgICBzdGF0aWMgSW5zdGFuY2UgPSAoKSA9PiB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG4gICAgY29tcG9uZW50czJpbml0OiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHNMb2FkZXJzOiBJTXlvcExvYWRlcltdID0gW107XG5cbiAgICAvLyBHbG9iYWwgcmVuZGVyIHBvbGljeSAoYWxsb3cvZGVueS9tb2RlIGdhdGUpLiBBIHBlci1jYWxsIG9wdGlvbnMucmVuZGVyUG9saWN5XG4gICAgLy8gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMgXHUyMDE0IHNlZSBIVE1MQ29tcG9uZW50TG9hZGVyLnJlc29sdmVSZW5kZXJNb2RlLlxuICAgIHByaXZhdGUgX3JlbmRlclBvbGljeT86IFJlbmRlclBvbGljeTtcbiAgICBwdWJsaWMgc2V0UmVuZGVyUG9saWN5ID0gKHBvbGljeT86IFJlbmRlclBvbGljeSkgPT4geyB0aGlzLl9yZW5kZXJQb2xpY3kgPSBwb2xpY3k7IH07XG4gICAgcHVibGljIGdldFJlbmRlclBvbGljeSA9ICgpOiBSZW5kZXJQb2xpY3kgfCB1bmRlZmluZWQgPT4gdGhpcy5fcmVuZGVyUG9saWN5O1xuXG4gICAgcHVibGljIGluaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgdHlwZTJJbnN0YW5jZUNvdW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHVibGljIGFzc2lnbklkID0gKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1fJHsrK3RoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdfWA7XG4gICAgfVxuXG4gICAgLy9UT0RPIDogZml4IHRoZSBpbnNwZWN0IGltcGxlbWVudGF0aW9uIGluc2lkZSByZWZDb21wb25lbnRcbiAgICAvL3RoZW4gaW5zcGVjdGVkIG1heWJlIGNhbiBiZSBkcm9wcGVkXG4gICAgcHJpdmF0ZSBpbnNwZWN0ZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaW5zcGVjdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5zcGVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zcGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pbnNwZWN0KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4pID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnaW5jb21pbmdNZXNzYWdlSGFuZGxlciBHT1QgJywgZXZlbnQpXG4gICAgICAgIC8vVE9ETyA6ICBpZiAoZXZlbnQub3JpZ2luICE9PSBcImh0dHA6Ly9leGFtcGxlLm9yZzo4MDgwXCIpIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdJIEtub3cgdGhhdCAhISEnKTtcbiAgICAgICAgICAgIC8vICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBjb21wb25lbnRzIDIgaW5pdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjb21wb25lbnQgPT4gY29tcG9uZW50LmlkICE9PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50LmlkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhdGVkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudD8uaWQpO1xuICAgICAgICAgICAgICAgIGluaXRpYXRlZENvbXBvbmVudD8uc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAvL2luaXRpYXRlZENvbXBvbmVudD8ucGFyZW50Py5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBteW9wTWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5kaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5tZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRNZXNzYWdlLm1lc3NhZ2Uucm91dGUgPSB0eXBlZE1lc3NhZ2Uucm91dGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UubWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBsb2cgP1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL2NvbXBvbmVudC5yZWZzLmJvZHkub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UubWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IG15b3BNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvL25vIGluIG1lbSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vbm90IHByb2Nlc3NlZCBpbiBvbk1lc3NhZ2VSZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESylcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoXG4gICAgICAgIC8vICAgICBcImhpIHRoZXJlIHlvdXJzZWxmISAgdGhlIHNlY3JldCByZXNwb25zZSBcIiArIFwiaXM6IHJoZWVlZWV0IVwiLFxuICAgICAgICAvLyAgICAgZXZlbnQub3JpZ2luLFxuICAgICAgICAvLyAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50ID0gbmV3IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KCcnLFxuICAgICAgICAgICAge2RhdGE6IG1lc3NhZ2V9XG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIoc3ludGhldGljRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0ID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPzogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdob3N0U0RLIGFscmVhZHkgaW5pdGlhdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJCeVR5cGU6IFJlY29yZDxzdHJpbmcsIElNeW9wTG9hZGVyPiA9IHt9O1xuXG4gICAgICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtjdXN0b21Mb2FkZXIudHlwZV0gPSBjdXN0b21Mb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0pXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gT2JqZWN0LnZhbHVlcyhsb2FkZXJCeVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yID0gYXN5bmMgKHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZywgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW10gPSBbXSwgaG9va3M/OiBsb2FkZXJIb29rcyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmluZDxUPihcbiAgICAgICAgICAgIGFycmF5OiBUW10sXG4gICAgICAgICAgICBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBQcm9taXNlPGJvb2xlYW4+XG4gICAgICAgICk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIG5vIG1hdGNoIGlzIGZvdW5kXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHNraW5TZWxlY3Rvci50eXBlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjYXNlIFwiRGVkaWNhdGVkU2tpblwiIDogLy9iYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZDoge1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW5JZCA9IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW4/LmlkXG4gICAgICAgICAgICAgICAgICAgIHx8IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW5zIVswXS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFNraW5JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSAoc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhd2FpdCBhc3luY0ZpbmQodHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMsIGFzeW5jIHNlZ21lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5zZWdtZW50SWQgPT09ICdEZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlcmllbmNlID0gZXhwZXJpZW5jZXMuZmluZChleHBlcmllbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlcmllbmNlLnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZSkuc2VnbWVudC5pZCA9PT0gc2VnbWVudC5zZWdtZW50SWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlcmllbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlcmllbmNlIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkRXhwZXJpZW5jZSA9IGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNlZ21lbnQgPSAodHlwZWRFeHBlcmllbmNlLnNlZ21lbnQgYXMgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudEZ1bmN0aW9uID0gKGhvb2tzID8gaG9va3MgOiB7fSlbdHlwZWRTZWdtZW50LmZ1bmN0aW9uXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHNlZ21lbnRGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYHNlZ21lbnRJZDoke3NlZ21lbnQuc2VnbWVudElkfSwgJHt0eXBlZFNlZ21lbnQuZnVuY3Rpb259IGZ1bmN0aW9uIG5vdCBwcm92aWRlZCAhYClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3Ioc2VnbWVudC5za2luU2VsZWN0b3IsIGV4cGVyaWVuY2VzKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJyAvL1RPRE9cbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blNraW5TZWxlY3RvciA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGhvb2tzPzogbG9hZGVySG9va3MpID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbklkID0gYXdhaXQgdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciwgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMsIGhvb2tzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudENvbmZpZy50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkZXJIb29rcz86IGxvYWRlckhvb2tzO1xuXG4gICAgcHVibGljIGxvYWRDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBSZWYsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTpcbiAgICAgICAgUHJvbWlzZTxUPiA9PiB7XG5cbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjb250YWluZXIgd2FzIGZvdW5kIGZvciB0aGlzIGNvbXBvbmVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbmZpZyA9IGF3YWl0IGNoZWNrTXlvcE92ZXJyaWRlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgIGlmIChvdmVycmlkZGVuQ29uZmlnKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBsb2dcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IG92ZXJyaWRkZW5Db25maWc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIGlmICghY29udGFpbmVyLl9fbm9uUHJveGllZCkge1xuICAgICAgICAvLyAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIE15b3BSZWZDb21wb25lbnQpO1xuICAgICAgICAvLyAgICAgLy9pZiB3ZSBnb3QgbG9hZENvbXBvbmVudCBvdmVyIE15b3BSZWZDb21wb25lbnRcbiAgICAgICAgLy8gICAgIGlmIChyZWZDb21wb25lbnQuaWQgJiYgcmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLCByZWZDb21wb25lbnQucmVmLCBvcHRpb25zKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyBsZXQgcm9vdENvbXBvbmVudDogSU15b3BDb21wb25lbnQgPSByZWZDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICAgICAgLy8gd2hpbGUoIXJvb3RDb21wb25lbnQuZWxlbWVudCAmJiByb290Q29tcG9uZW50LnBhcmVudCl7XG4gICAgICAgIC8vICAgICAgICAgLy8gICAgIHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50LnBhcmVudFxuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICAvLyAgICAgICAgIC8vIC8vd2hhdCBub3cgP1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgY29uc3QgaG9va3MgPSB7Li4uKHRoaXMubG9hZGVySG9va3MgPz8ge30pLCAuLi4ob3B0aW9ucz8uaG9va3MgPz8ge30pfTtcblxuICAgICAgICBjb25zdCByZWYgPSBjb250YWluZXIgYXMgUmVmO1xuICAgICAgICBpZiAocmVmLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChyZWYuY29tcG9uZW50KSB7XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSB7Li4uY29tcG9uZW50Q29uZmlnfTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudENvbmZpZy5pbnN0YW5jZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBza2luOiBzZWxlY3RlZFNraW5cbiAgICAgICAgICAgICAgICAgICAgLy8gIHNraW5zOiBbc2VsZWN0ZWRTa2luXVxuICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuaG9va3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQ8VD4ocmVmLCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cywgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjb25uZWN0IHJlZnMgYW5kIHByb3BzIGluc29kZSBjcmVhdGVSZWZDb21wb25lbnQsIGVsc2V3aGVyZSBpdHMgbm90IHJlYWxseSA8VD5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvYWQgY29tcG9uZW50IGdvdCBhIGRldGFjaGVkIHJlZi4nKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBjaG9vc2Ugc2tpbiBvbiBydW50aW1lIC4uLlxuICAgICAgICAgKiAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlXG4gICAgICAgICAqL1xuXG4gICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcblxuICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudExvYWRlciA9IHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZmluZChsb2FkZXIgPT4gbG9hZGVyLnR5cGUgPT09IHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSk7XG5cbiAgICAgICAgaWYgKCFjb21wb25lbnRMb2FkZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBsb2FkZXIgXCIke3NlbGVjdGVkU2tpbi5sb2FkZXIudHlwZX1cIiB3YXMgZm91bmQgZm9yIGNvbXBvbmVudGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9mb3IgbG9hZGVkIHdlYmNvbXBvbmVudCBtb2R1bGVzIHRvIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHRoZSBpbml0IG1lc3NhZ2UgZmxvd1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gYXdhaXQgY29tcG9uZW50TG9hZGVyLmxvYWQoY29tcG9uZW50Q29uZmlnLnR5cGUsIHNlbGVjdGVkU2tpbiwgY29udGFpbmVyLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBUT0RPIDogd2hlbiB0aGlzIGlzIG5vdCB0cnVlID9cbiAgICAgICAgaWYgKCFjb21wb25lbnQuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcblxuICAgICAgICBjb21wb25lbnQuYmluZCgnb25EaXNwb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY29tcG9uZW50IGRpc3Bvc2UnLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbiAgICAvKipcbiAgICAgKiBSYXcgQ1NTIGluamVjdGVkIGludG8gdGhlIGNvbXBvbmVudCdzIGlmcmFtZSA8aGVhZD4gYmVmb3JlIGZpcnN0IHBhaW50LlxuICAgICAqIEFwcGVuZGVkIGxhc3Qgc28gaXQgb3ZlcnJpZGVzIHRoZSBjb21wb25lbnQncyBvd24gc3R5bGVzIHZpYSBjYXNjYWRlIG9yZGVyLlxuICAgICAqIFVzZWZ1bCBmb3IgdGhlbWluZyB2MiAoSFRNTCkgY29tcG9uZW50cyBcdTIwMTQgY29sb3JzLCBmb250cywgc3BhY2luZywgZXRjLlxuICAgICAqL1xuICAgIGluamVjdENzcz86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbnRyb2wgaWZyYW1lIGF1dG8tc2l6aW5nIGJlaGF2aW9yLlxuICAgICAqIC0gdHJ1ZSAoZGVmYXVsdCk6IGlmcmFtZSBhdXRvLXNpemVzIHRvIGNvbnRlbnQgaGVpZ2h0LCB3aWR0aCBmaWxscyBwYXJlbnQuXG4gICAgICogLSBmYWxzZTogbm8gc2l6aW5nIGxvZ2ljIHJ1bnMuIE5vIG9ic2VydmVycywgbm8gbWVhc3VyZW1lbnRzLCBubyBzdHlsZSBjaGFuZ2VzLlxuICAgICAqICAgVGhlIGlmcmFtZSBzdGF5cyBhdCBwb3NpdGlvbjphYnNvbHV0ZSBmaWxsaW5nIHRoZSBjb250YWluZXIuXG4gICAgICogICBUaGUgaG9zdCBpcyBmdWxseSByZXNwb25zaWJsZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMuXG4gICAgICovXG4gICAgYXV0b1NpemU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBQZXItY2FsbCByZW5kZXIgcG9saWN5LiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgaG9zdFNESy5zZXRSZW5kZXJQb2xpY3kgXHUyMDE0IGxldHMgYW5cbiAgICAgKiBhcHAgcmVzdHJpY3QgZ2xvYmFsbHkgYW5kIGFsbG93IChvciBmdXJ0aGVyIHJlc3RyaWN0KSBzcGVjaWZpYyBsb2FkQ29tcG9uZW50IGNhbGxzLlxuICAgICAqL1xuICAgIHJlbmRlclBvbGljeT86IFJlbmRlclBvbGljeVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgZnVsbCBpc29sYXRpb24gZm9yIGFuIGlubGluZS1IVE1MIChsb2NhbEZyYW1lKSBjb21wb25lbnQ6IHNhbmRib3hlZCxcbiAgICAgKiBjcm9zcy1vcmlnaW4gaWZyYW1lIHdpdGggbm8gaG9zdC1kb2N1bWVudCBhY2Nlc3MuIEEgcmVuZGVyIHBvbGljeSByZXR1cm5pbmdcbiAgICAgKiAnaXNvbGF0ZWRJZnJhbWUnIGhhcyB0aGUgc2FtZSBlZmZlY3QuXG4gICAgICovXG4gICAgaXNvbGF0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldFJlc2l6ZU9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cblxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3cubXlvcCA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsgPSB0aGlzO1xuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29tcG9uZW50cyk7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVwbGF5VG8/LnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBmaXJzdCBjb21wb25lbnQgdGhhdCBpbml0aWF0ZWQgdGhhdCBjeWNsZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSByZXBsYXlUby5yb3V0ZVtyZXBsYXlUby5yb3V0ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IGNvbXBvbmVudElkc1swXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IGNvbXBvbmVudElkc1swXTtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcblxuICAgICAgICB3aW5kb3cucGFyZW50Py5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICB3aW5kb3cub25tZXNzYWdlID0gdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcy5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQk8sSUFBTSxpQkFBTixNQUE0QztBQUFBLEVBQy9DLFlBQW1CLFFBQ0EsYUFDQSxjQUNBLFdBQ0EsWUFBcUI7QUFKckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUluQix3QkFBZ0IsUUFBZTtBQUFBLEVBRi9CO0FBR0o7OztBQ3pCTyxJQUFNLHFCQUFxQixDQUFPLFNBQWtDO0FBQ3ZFLE1BQUksT0FBTyxTQUFTLFlBQVk7QUFFNUIsU0FBSztBQUFBLEVBQ1QsV0FBVyxnQkFBZ0IsU0FBUztBQUVoQyxVQUFNLFNBQVMsTUFBTTtBQUVy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cHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJoZWlnaHQiLCAid2lkdGgiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJob3N0U0RLIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImVsZW1lbnQiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZWVuIiwgInNkayIsICJkb21JZCIsICJzZGsiLCAic2VlbiIsICJza2luIiwgImNvbXBvbmVudCIsICJzZWdtZW50IiwgImV4cGVyaWVuY2UiLCAic2VsZWN0ZWRTa2luIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImhvc3RTREsiLCAiTXV0YXRpb25PYnNlcnZlciIsICJnZXRJbnB1dFZhbHVlIiwgImVsZW1lbnQiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJTZXRJbm5lckh0bWxIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciJdCn0K