obsidian-integration-testing 8.0.1 → 8.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +23 -4
  2. package/dist/lib/cjs/cli.cjs +29 -8
  3. package/dist/lib/cjs/cli.d.cts +2 -1
  4. package/dist/lib/cjs/connect-to-cdp.cjs +17 -11
  5. package/dist/lib/cjs/connect-to-cdp.d.cts +35 -3
  6. package/dist/lib/cjs/context-provider.cjs +1 -1
  7. package/dist/lib/cjs/context-provider.d.cts +1 -1
  8. package/dist/lib/cjs/global-setup-core.cjs +17 -5
  9. package/dist/lib/cjs/global-setup-core.d.cts +11 -1
  10. package/dist/lib/cjs/incompatible-installer-version-error.cjs +52 -0
  11. package/dist/lib/cjs/incompatible-installer-version-error.d.cts +44 -0
  12. package/dist/lib/cjs/index.cjs +13 -1
  13. package/dist/lib/cjs/index.d.cts +7 -0
  14. package/dist/lib/cjs/installer-compatibility.cjs +64 -0
  15. package/dist/lib/cjs/installer-compatibility.d.cts +75 -0
  16. package/dist/lib/cjs/library.cjs +1 -1
  17. package/dist/lib/cjs/namespace-bootstrap.cjs +16 -7
  18. package/dist/lib/cjs/obsidian-installer.cjs +7 -4
  19. package/dist/lib/cjs/obsidian-metadata.cjs +1811 -0
  20. package/dist/lib/cjs/obsidian-metadata.d.cts +56 -0
  21. package/dist/lib/cjs/renderer-boot-detection.cjs +49 -0
  22. package/dist/lib/cjs/renderer-boot-detection.d.cts +83 -0
  23. package/dist/lib/cjs/renderer-failed-to-initialize-error.cjs +41 -0
  24. package/dist/lib/cjs/renderer-failed-to-initialize-error.d.cts +23 -0
  25. package/dist/lib/cjs/transport-desktop-cdp.cjs +85 -3
  26. package/dist/lib/cjs/transport-desktop-cdp.d.cts +55 -1
  27. package/dist/lib/cjs/transport-factory.cjs +76 -21
  28. package/dist/lib/cjs/transport-factory.d.cts +1 -1
  29. package/dist/lib/cjs/transport-options.cjs +1 -1
  30. package/dist/lib/cjs/transport-options.d.cts +37 -4
  31. package/dist/lib/cjs/visibility.cjs +10 -2
  32. package/dist/lib/cjs/visibility.d.cts +27 -8
  33. package/dist/lib/esm/cli.d.mts +2 -1
  34. package/dist/lib/esm/cli.mjs +29 -8
  35. package/dist/lib/esm/connect-to-cdp.d.mts +35 -3
  36. package/dist/lib/esm/connect-to-cdp.mjs +17 -11
  37. package/dist/lib/esm/context-provider.d.mts +1 -1
  38. package/dist/lib/esm/context-provider.mjs +1 -1
  39. package/dist/lib/esm/global-setup-core.d.mts +11 -1
  40. package/dist/lib/esm/global-setup-core.mjs +15 -4
  41. package/dist/lib/esm/incompatible-installer-version-error.d.mts +44 -0
  42. package/dist/lib/esm/incompatible-installer-version-error.mjs +28 -0
  43. package/dist/lib/esm/index.d.mts +7 -0
  44. package/dist/lib/esm/index.mjs +9 -1
  45. package/dist/lib/esm/installer-compatibility.d.mts +75 -0
  46. package/dist/lib/esm/installer-compatibility.mjs +40 -0
  47. package/dist/lib/esm/library.mjs +1 -1
  48. package/dist/lib/esm/namespace-bootstrap.mjs +16 -7
  49. package/dist/lib/esm/obsidian-installer.mjs +7 -4
  50. package/dist/lib/esm/obsidian-metadata.d.mts +56 -0
  51. package/dist/lib/esm/obsidian-metadata.mjs +1787 -0
  52. package/dist/lib/esm/renderer-boot-detection.d.mts +83 -0
  53. package/dist/lib/esm/renderer-boot-detection.mjs +23 -0
  54. package/dist/lib/esm/renderer-failed-to-initialize-error.d.mts +23 -0
  55. package/dist/lib/esm/renderer-failed-to-initialize-error.mjs +17 -0
  56. package/dist/lib/esm/transport-desktop-cdp.d.mts +55 -1
  57. package/dist/lib/esm/transport-desktop-cdp.mjs +89 -3
  58. package/dist/lib/esm/transport-factory.d.mts +1 -1
  59. package/dist/lib/esm/transport-factory.mjs +76 -21
  60. package/dist/lib/esm/transport-options.d.mts +37 -4
  61. package/dist/lib/esm/visibility.d.mts +27 -8
  62. package/dist/lib/esm/visibility.mjs +8 -2
  63. package/dist/obsidian-integration-testing-8.1.1.tgz +0 -0
  64. package/package.json +2 -3
  65. package/dist/obsidian-integration-testing-8.0.1.tgz +0 -0
@@ -140,13 +140,22 @@ function bootstrapNamespace(bootstrapParams) {
140
140
  const { key, modifiers = [] } = pressParams;
141
141
  const isMacOS = ns.obsidianModule.Platform.isMacOS;
142
142
  const electronModifiers = modifiers.map((modifier) => {
143
- if (modifier === "Mod") {
144
- return isMacOS ? "meta" : "control";
145
- }
146
- if (modifier === "Ctrl") {
147
- return "control";
143
+ switch (modifier) {
144
+ case "Alt":
145
+ return "alt";
146
+ case "Ctrl":
147
+ return "control";
148
+ case "Meta":
149
+ return "meta";
150
+ case "Mod":
151
+ return isMacOS ? "meta" : "control";
152
+ case "Shift":
153
+ return "shift";
154
+ default: {
155
+ const unknownModifier = modifier;
156
+ throw new Error(`Unknown modifier: ${String(unknownModifier)}`);
157
+ }
148
158
  }
149
- return modifier.toLowerCase();
150
159
  });
151
160
  const webContents = window.electron.remote.getCurrentWebContents();
152
161
  webContents.sendInputEvent({ keyCode: key, modifiers: electronModifiers, type: "keyDown" });
@@ -232,4 +241,4 @@ ${generateStackTraceLine(line)}`;
232
241
  export {
233
242
  ensureNamespaceBootstrapped
234
243
  };
235
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5tanMnO1xuaW1wb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbCB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5tanMnO1xuaW1wb3J0IHtcbiAgZ2V0Qm9vdHN0cmFwVmVyc2lvbixcbiAgZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVyc1xufSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2UgaXMgYm9vdHN0cmFwcGVkXG4gKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2VzcyB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQZXJmb3JtcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gY2hlY2sgdmlhIHRoZSB0cmFuc3BvcnQuIElmIHRoZSBuYW1lc3BhY2VcbiAqIGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIGEgZGlmZmVyZW50IHZlcnNpb24sIHNlbmRzIHRoZSBmdWxsIGJvb3RzdHJhcCBleHByZXNzaW9uXG4gKiB0byByZWdpc3RlciBhbGwgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh2YXVsdCBwYXRoKS5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBPcHRpb25hbCBwZXItZXZhbCB0aW1lb3V0LiBGb3J3YXJkZWQgdG8gYm90aFxuICogICB0aGUgdmVyc2lvbiBjaGVjayBhbmQgdGhlIGJvb3RzdHJhcCBldmFsIHNvIGEgaHVuZyBgb2JzaWRpYW4gZXZhbGAgcmVqZWN0c1xuICogICBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsZXIgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQsIGN3ZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXZhbE9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zID0ge1xuICAgIGN3ZCxcbiAgICAuLi4odGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgfTtcbiAgY29uc3QgYm9vdHN0cmFwVmVyc2lvbiA9IGdldEJvb3RzdHJhcFZlcnNpb24oKTtcbiAgY29uc3QgdmVyc2lvbkpzb24gPSBKU09OLnN0cmluZ2lmeShib290c3RyYXBWZXJzaW9uKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwciwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgZm4oZm5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBnZXRCYXNlUGF0aCgpOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBFbGVjdHJvbldlYkNvbnRlbnRzV2l0aFNlbmRJbnB1dEV2ZW50IHtcbiAgICBzZW5kSW5wdXRFdmVudChpbnB1dEV2ZW50OiBTZW5kSW5wdXRFdmVudEtleWJvYXJkSW5wdXQgfCBTZW5kSW5wdXRFdmVudE1vdXNlSW5wdXQpOiB2b2lkO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtIHtcbiAgICBQbGF0Zm9ybTogT2JzaWRpYW5QbGF0Zm9ybTtcbiAgfVxuXG4gIGludGVyZmFjZSBPYnNpZGlhblBsYXRmb3JtIHtcbiAgICBpc01hY09TOiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIFNlbmRJbnB1dEV2ZW50S2V5Ym9hcmRJbnB1dCB7XG4gICAga2V5Q29kZTogc3RyaW5nO1xuICAgIG1vZGlmaWVycz86IHN0cmluZ1tdO1xuICAgIHR5cGU6ICdjaGFyJyB8ICdrZXlEb3duJyB8ICdrZXlVcCc7XG4gIH1cblxuICBpbnRlcmZhY2UgU2VuZElucHV0RXZlbnRNb3VzZUlucHV0IHtcbiAgICB0eXBlOiAnbW91c2VNb3ZlJztcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IChpbiBtcykgYmVmb3JlIGludm9raW5nIGBlbGVjdHJvbldpbmRvdy5kZXN0cm95KClgIHNvIHRoZSBldmFsIHRoYXRcbiAgICogdHJpZ2dlcmVkIHRoZSBjYWxsIGhhcyB0aW1lIHRvIHJldHVybiBpdHMgcmVzdWx0IHRvIHRoZSBjYWxsZXIuIFdpdGhvdXRcbiAgICogaXQgdGhlIHJlbmRlcmVyIGRpZXMgYmVmb3JlIHRoZSBJUEMgcmVwbHkgc2hpcHMsIHRoZSBjYWxsZXIgd2FpdHMgZm9yIHRoZVxuICAgKiBmdWxsIGV2YWwgdGltZW91dCwgYW5kIHN0YWxlIGBCcm93c2VyV2luZG93YCBlbnRyaWVzIHBpbGUgdXAuXG4gICAqL1xuICBjb25zdCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4gcG9sbHMgd2hpbGUgd2FpdGluZyBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvXG4gICAqIHRha2UgZWZmZWN0ICh0aGUgZWRpdG9yIGRvY3VtZW50IHVwZGF0ZXMsIG9yIGFuIGVsZW1lbnQncyBgOmhvdmVyYCBzdGF0ZVxuICAgKiBmbGlwcykuIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlci5cbiAgICovXG4gIGNvbnN0IElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIHRvIHdhaXQgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0byB0YWtlIGVmZmVjdFxuICAgKiBiZWZvcmUgZ2l2aW5nIHVwICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBpbnB1dCBpcyByZWplY3RlZCBcdTIwMTQgZS5nLiBhXG4gICAqIHJlYWQtb25seSBlZGl0b3IsIG9yIGEgcG9pbnRlciBtb3ZlIHRoYXQgbmV2ZXIgbGFuZHMgb24gdGhlIGVsZW1lbnQpLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludGVydmFsIChpbiBtcykgYmV0d2VlbiB7QGxpbmsgd2FpdFVudGlsfSBwcmVkaWNhdGUgY2hlY2tzIHdoZW4gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgd2FpdFVudGlsfSB3YWl0cyBmb3IgaXRzIHByZWRpY2F0ZSB0b1xuICAgKiBiZWNvbWUgdHJ1dGh5IGJlZm9yZSByZWplY3RpbmcsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBjb25zdCBleGlzdGluZ0NvbnRleHRzID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNvbnRleHRzID8/IHt9O1xuICBjb25zdCBleGlzdGluZ09ic2lkaWFuTW9kdWxlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/Lm9ic2lkaWFuTW9kdWxlO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiB3aW5kb3cuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IHdpbmRvdy5lbGVjdHJvbldpbmRvdztcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpO1xuICAgICAgfSwgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVMYXlvdXRSZWFkeSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGVycm9yVG9TdHJpbmcodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3IpO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBpZiAoIXRoaXMuYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBwYXJhbXMuY29udGV4dElkXG4gICAgICAgID8gKHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPz89IHt9KVxuICAgICAgICA6IHt9O1xuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7IGhvdmVyRWxlbWVudCwgbW92ZU1vdXNlLCBwcmVzc0tleSwgdHlwZUludG9FZGl0b3IsIHVuaG92ZXJFbGVtZW50LCB3YWl0VW50aWwgfTtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZUxpYiBvZiB0aGlzLmxpYlJlc29sdmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGxpYiwgcmVzb2x2ZUxpYigpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxBcmdzID0geyAuLi5wYXJhbXMuYXJncywgYXBwOiB0aGlzLmFwcCwgY29udGV4dCwgbGliLCBvYnNpZGlhbk1vZHVsZSB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmZuKGZ1bGxBcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wTW9kdWxlTmFtZSA9IGBnZXQtb2JzaWRpYW4tbW9kdWxlLSR7cmFuZG9tU3VmZml4fWA7XG4gICAgICBjb25zdCBkaXIgPSBgJHt0aGlzLmFwcC52YXVsdC5jb25maWdEaXJ9L3BsdWdpbnMvJHt0ZW1wTW9kdWxlTmFtZX1gO1xuICAgICAgdGhpcy5hcHAucGx1Z2lucy5tYW5pZmVzdHNbdGVtcE1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGRpcixcbiAgICAgICAgaWQ6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICBpc0Rlc2t0b3BPbmx5OiBmYWxzZSxcbiAgICAgICAgbWluQXBwVmVyc2lvbjogJycsXG4gICAgICAgIG5hbWU6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyKTtcblxuICAgICAgY29uc3QgcGx1Z2luRm5Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJ9L21haW4uanNgLCBwbHVnaW5GbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2UpLmdldEJhc2VQYXRoKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAod2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayAoYW5kIHRodXMgYHByZXNzS2V5YCkgY2FuIHJ1bi5cbiAgICBjb25zdCBpc01hY09TID0gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01hY09TO1xuXG4gICAgLy8gTWFwIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCBuYW1lcyB0byBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWVzLlxuICAgIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IHN0cmluZyA9PiB7XG4gICAgICBpZiAobW9kaWZpZXIgPT09ICdNb2QnKSB7XG4gICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVyID09PSAnQ3RybCcpIHtcbiAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2RpZmllci50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBvYnNpZGlhbi10eXBpbmdzJyBgRWxlY3Ryb25XZWJDb250ZW50c2Agb21pdHMgdGhlIHN0YWJsZSBgc2VuZElucHV0RXZlbnRgLCB3aGljaCBpcyB3aGF0IGluamVjdHMgYSB0cnVzdGVkIChyZWFsKSBrZXkgcHJlc3MuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpIGFzIHVua25vd24gYXMgRWxlY3Ryb25XZWJDb250ZW50c1dpdGhTZW5kSW5wdXRFdmVudDtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBvYnNpZGlhbi10eXBpbmdzJyBgRWxlY3Ryb25XZWJDb250ZW50c2Agb21pdHMgdGhlIHN0YWJsZSBgc2VuZElucHV0RXZlbnRgLCB3aGljaCBpcyB3aGF0IGluamVjdHMgYSB0cnVzdGVkIChyZWFsKSBwb2ludGVyIG1vdmUuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpIGFzIHVua25vd24gYXMgRWxlY3Ryb25XZWJDb250ZW50c1dpdGhTZW5kSW5wdXRFdmVudDtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IHR5cGU6ICdtb3VzZU1vdmUnLCB4OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueCksIHk6IE1hdGgucm91bmQobW92ZVBhcmFtcy55KSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBNb3ZlIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LlxuICAgIC8vIFdoZW4gZmx1c2ggYWdhaW5zdCB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UsIHVzZSBqdXN0IHBhc3QgdGhlIHJpZ2h0IGVkZ2UuXG4gICAgLy8gQSBmdWxsLXZpZXdwb3J0LXdpZHRoIGVsZW1lbnQgc2hvdWxkIHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSByZWN0LmxlZnQgPj0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID8gcmVjdC5sZWZ0IC0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTIDogcmVjdC5yaWdodCArIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUztcbiAgICBjb25zdCB5ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SO1xuICAgIG1vdmVNb3VzZSh7IHgsIHkgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSBjbGVhcmVkLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUF5QkEsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFxQlAsZUFBc0IsNEJBQTRCLFdBQThCLEtBQWEsdUJBQStDO0FBQzFJLFFBQU0sY0FBb0M7QUFBQSxJQUN4QztBQUFBLElBQ0EsR0FBSSwwQkFBMEIsVUFBYSxFQUFFLHNCQUFzQjtBQUFBLEVBQ3JFO0FBQ0EsUUFBTSxtQkFBbUIsb0JBQW9CO0FBQzdDLFFBQU0sY0FBYyxLQUFLLFVBQVUsZ0JBQWdCO0FBQ25ELFFBQU0sY0FBYyxNQUFNLFVBQVU7QUFBQSxJQUNsQyxtRUFBbUUsV0FBVztBQUFBLElBQzlFO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFFBQVE7QUFDMUI7QUFBQSxFQUNGO0FBRUEsUUFBTSxnQkFBZ0IscUJBQXFCLG9CQUFvQjtBQUFBLElBQzdELGNBQWMsQ0FBQyxHQUFHLDBCQUEwQixDQUFDO0FBQUEsSUFDN0MsU0FBUztBQUFBLEVBQ1gsQ0FBQztBQUNELFFBQU0sVUFBVSxTQUFTLGVBQWUsV0FBVztBQUNyRDtBQWdCQSxTQUFTLG1CQUFtQixpQkFBNkU7QUEySHZHLFFBQU0sZ0NBQWdDO0FBT3RDLFFBQU0sc0NBQXNDO0FBTzVDLFFBQU0sZ0NBQWdDO0FBTXRDLFFBQU0sMkNBQTJDO0FBTWpELFFBQU0scUNBQXFDO0FBTzNDLFFBQU0scUJBQXFCO0FBRzNCLFFBQU0sU0FBUztBQUNmLFFBQU0sbUJBQW1CLE9BQU8sOEJBQThCLFlBQVksQ0FBQztBQUMzRSxRQUFNLHlCQUF5QixPQUFPLDhCQUE4QjtBQUVwRSxRQUFNLEtBQWtDO0FBQUEsSUFDdEMsSUFBSSxNQUFNO0FBRVIsYUFBTyxPQUFPO0FB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
244
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5tanMnO1xuaW1wb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbCB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5tanMnO1xuaW1wb3J0IHtcbiAgZ2V0Qm9vdHN0cmFwVmVyc2lvbixcbiAgZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVyc1xufSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2UgaXMgYm9vdHN0cmFwcGVkXG4gKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2VzcyB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQZXJmb3JtcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gY2hlY2sgdmlhIHRoZSB0cmFuc3BvcnQuIElmIHRoZSBuYW1lc3BhY2VcbiAqIGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIGEgZGlmZmVyZW50IHZlcnNpb24sIHNlbmRzIHRoZSBmdWxsIGJvb3RzdHJhcCBleHByZXNzaW9uXG4gKiB0byByZWdpc3RlciBhbGwgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh2YXVsdCBwYXRoKS5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBPcHRpb25hbCBwZXItZXZhbCB0aW1lb3V0LiBGb3J3YXJkZWQgdG8gYm90aFxuICogICB0aGUgdmVyc2lvbiBjaGVjayBhbmQgdGhlIGJvb3RzdHJhcCBldmFsIHNvIGEgaHVuZyBgb2JzaWRpYW4gZXZhbGAgcmVqZWN0c1xuICogICBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsZXIgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQsIGN3ZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXZhbE9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zID0ge1xuICAgIGN3ZCxcbiAgICAuLi4odGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgfTtcbiAgY29uc3QgYm9vdHN0cmFwVmVyc2lvbiA9IGdldEJvb3RzdHJhcFZlcnNpb24oKTtcbiAgY29uc3QgdmVyc2lvbkpzb24gPSBKU09OLnN0cmluZ2lmeShib290c3RyYXBWZXJzaW9uKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwciwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgZm4oZm5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBnZXRCYXNlUGF0aCgpOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIHR5cGUgQ3VycmVudFdlYkNvbnRlbnRzID0gUmV0dXJuVHlwZTxXaW5kb3dbJ2VsZWN0cm9uJ11bJ3JlbW90ZSddWydnZXRDdXJyZW50V2ViQ29udGVudHMnXT47XG5cbiAgLy8gVGhlIEVsZWN0cm9uIG1vZGlmaWVyLWtleSBuYW1lcyBgc2VuZElucHV0RXZlbnRgIGFjY2VwdHMgKGUuZy4gJ21ldGEnLCAnY29udHJvbCcsICdzaGlmdCcsICdhbHQnKS5cbiAgLy8gRGVyaXZlZCBmcm9tIHRoZSB3ZWItY29udGVudHMgdHlwZSBzbyBpdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIEVsZWN0cm9uIHR5cGluZ3MuXG4gIHR5cGUgRWxlY3Ryb25Nb2RpZmllciA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8Q3VycmVudFdlYkNvbnRlbnRzWydzZW5kSW5wdXRFdmVudCddPlswXVsnbW9kaWZpZXJzJ10+W251bWJlcl07XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtIHtcbiAgICBQbGF0Zm9ybTogT2JzaWRpYW5QbGF0Zm9ybTtcbiAgfVxuXG4gIGludGVyZmFjZSBPYnNpZGlhblBsYXRmb3JtIHtcbiAgICBpc01hY09TOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IChpbiBtcykgYmVmb3JlIGludm9raW5nIGBlbGVjdHJvbldpbmRvdy5kZXN0cm95KClgIHNvIHRoZSBldmFsIHRoYXRcbiAgICogdHJpZ2dlcmVkIHRoZSBjYWxsIGhhcyB0aW1lIHRvIHJldHVybiBpdHMgcmVzdWx0IHRvIHRoZSBjYWxsZXIuIFdpdGhvdXRcbiAgICogaXQgdGhlIHJlbmRlcmVyIGRpZXMgYmVmb3JlIHRoZSBJUEMgcmVwbHkgc2hpcHMsIHRoZSBjYWxsZXIgd2FpdHMgZm9yIHRoZVxuICAgKiBmdWxsIGV2YWwgdGltZW91dCwgYW5kIHN0YWxlIGBCcm93c2VyV2luZG93YCBlbnRyaWVzIHBpbGUgdXAuXG4gICAqL1xuICBjb25zdCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4gcG9sbHMgd2hpbGUgd2FpdGluZyBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvXG4gICAqIHRha2UgZWZmZWN0ICh0aGUgZWRpdG9yIGRvY3VtZW50IHVwZGF0ZXMsIG9yIGFuIGVsZW1lbnQncyBgOmhvdmVyYCBzdGF0ZVxuICAgKiBmbGlwcykuIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlci5cbiAgICovXG4gIGNvbnN0IElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIHRvIHdhaXQgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0byB0YWtlIGVmZmVjdFxuICAgKiBiZWZvcmUgZ2l2aW5nIHVwICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBpbnB1dCBpcyByZWplY3RlZCBcdTIwMTQgZS5nLiBhXG4gICAqIHJlYWQtb25seSBlZGl0b3IsIG9yIGEgcG9pbnRlciBtb3ZlIHRoYXQgbmV2ZXIgbGFuZHMgb24gdGhlIGVsZW1lbnQpLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludGVydmFsIChpbiBtcykgYmV0d2VlbiB7QGxpbmsgd2FpdFVudGlsfSBwcmVkaWNhdGUgY2hlY2tzIHdoZW4gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgd2FpdFVudGlsfSB3YWl0cyBmb3IgaXRzIHByZWRpY2F0ZSB0b1xuICAgKiBiZWNvbWUgdHJ1dGh5IGJlZm9yZSByZWplY3RpbmcsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBjb25zdCBleGlzdGluZ0NvbnRleHRzID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNvbnRleHRzID8/IHt9O1xuICBjb25zdCBleGlzdGluZ09ic2lkaWFuTW9kdWxlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/Lm9ic2lkaWFuTW9kdWxlO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiB3aW5kb3cuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IHdpbmRvdy5lbGVjdHJvbldpbmRvdztcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpO1xuICAgICAgfSwgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVMYXlvdXRSZWFkeSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGVycm9yVG9TdHJpbmcodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3IpO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBpZiAoIXRoaXMuYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBwYXJhbXMuY29udGV4dElkXG4gICAgICAgID8gKHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPz89IHt9KVxuICAgICAgICA6IHt9O1xuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7IGhvdmVyRWxlbWVudCwgbW92ZU1vdXNlLCBwcmVzc0tleSwgdHlwZUludG9FZGl0b3IsIHVuaG92ZXJFbGVtZW50LCB3YWl0VW50aWwgfTtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZUxpYiBvZiB0aGlzLmxpYlJlc29sdmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGxpYiwgcmVzb2x2ZUxpYigpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxBcmdzID0geyAuLi5wYXJhbXMuYXJncywgYXBwOiB0aGlzLmFwcCwgY29udGV4dCwgbGliLCBvYnNpZGlhbk1vZHVsZSB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmZuKGZ1bGxBcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wTW9kdWxlTmFtZSA9IGBnZXQtb2JzaWRpYW4tbW9kdWxlLSR7cmFuZG9tU3VmZml4fWA7XG4gICAgICBjb25zdCBkaXIgPSBgJHt0aGlzLmFwcC52YXVsdC5jb25maWdEaXJ9L3BsdWdpbnMvJHt0ZW1wTW9kdWxlTmFtZX1gO1xuICAgICAgdGhpcy5hcHAucGx1Z2lucy5tYW5pZmVzdHNbdGVtcE1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGRpcixcbiAgICAgICAgaWQ6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICBpc0Rlc2t0b3BPbmx5OiBmYWxzZSxcbiAgICAgICAgbWluQXBwVmVyc2lvbjogJycsXG4gICAgICAgIG5hbWU6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyKTtcblxuICAgICAgY29uc3QgcGx1Z2luRm5Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJ9L21haW4uanNgLCBwbHVnaW5GbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2UpLmdldEJhc2VQYXRoKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAod2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayAoYW5kIHRodXMgYHByZXNzS2V5YCkgY2FuIHJ1bi5cbiAgICBjb25zdCBpc01hY09TID0gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01hY09TO1xuXG4gICAgLy8gTWFwIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCBuYW1lcyB0byBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWVzLlxuICAgIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOlxuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgY2FzZSAnQ3RybCc6XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgY2FzZSAnTWV0YSc6XG4gICAgICAgICAgcmV0dXJuICdtZXRhJztcbiAgICAgICAgY2FzZSAnTW9kJzpcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgY2FzZSAnU2hpZnQnOlxuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gd2luZG93LmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsgdHlwZTogJ21vdXNlTW92ZScsIHg6IE1hdGgucm91bmQobW92ZVBhcmFtcy54KSwgeTogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLnkpIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG4gICAgY29uc3QgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID0gMTtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gdW5ob3ZlclBhcmFtcztcblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3YWl0VW50aWwod2FpdFBhcmFtczogV2FpdFVudGlsUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBtZXNzYWdlLFxuICAgICAgcHJlZGljYXRlLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgIH0gPSB3YWl0UGFyYW1zO1xuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoIShhd2FpdCBwcmVkaWNhdGUoKSkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IHRpbWVvdXRJbk1pbGxpc2Vjb25kcykge1xuICAgICAgICBjb25zdCBzdWZmaXggPSBtZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6IGA6ICR7bWVzc2FnZX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhaXRVbnRpbCB0aW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzJHtzdWZmaXh9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzbGVlcChpbnRlcnZhbEluTWlsbGlzZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBtZXNzYWdlID0gZXJyb3Iuc3RhY2sgPz8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgIGlmIChlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXNzYWdlID0gYXBwZW5kTmVzdGVkRXJyb3IobWVzc2FnZSwgZXJyb3IuY2F1c2UsICdDYXVzZWQgYnk6Jyk7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZUVycm9yKSB7XG4gICAgICBjb25zdCBhZ2dyZWdhdGVkRXJyb3JzOiByZWFkb25seSB1bmtub3duW10gPSBlcnJvci5lcnJvcnM7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYWdncmVnYXRlZEVycm9yXSBvZiBhZ2dyZWdhdGVkRXJyb3JzLmVudHJpZXMoKSkge1xuICAgICAgICBtZXNzYWdlID0gYXBwZW5kTmVzdGVkRXJyb3IobWVzc2FnZSwgYWdncmVnYXRlZEVycm9yLCBgQWdncmVnYXRlZCBlcnJvciAjJHtTdHJpbmcoaW5kZXggKyAxKX06YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwZW5kTmVzdGVkRXJyb3IobWVzc2FnZTogc3RyaW5nLCBuZXN0ZWRFcnJvcjogdW5rbm93biwgdGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IGAke21lc3NhZ2V9XFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlKX1gO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBlcnJvclRvU3RyaW5nSW1wbChuZXN0ZWRFcnJvcikuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBpZiAoIWxpbmUudHJpbSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGxpbmUuc3RhcnRzV2l0aChTVEFDS19UUkFDRV9QUkVGSVgpXG4gICAgICAgID8gYFxcbiR7bGluZX1gXG4gICAgICAgIDogYFxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZShsaW5lKX1gO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7U1RBQ0tfVFJBQ0VfUFJFRklYfSAtLS0gJHt0aXRsZX0gLS0tICgwKWA7XG4gIH1cbn1cblxuLyogdjggaWdu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
@@ -149,9 +149,12 @@ function extractWindowsShell(assetPath, shellDir) {
149
149
  }
150
150
  async function fetchReleaseAssetNames(version) {
151
151
  try {
152
- const response = await fetch(`${RELEASE_API_TAG_URL}/v${version}`, {
153
- headers: { "Accept": "application/vnd.github+json", "User-Agent": DOWNLOAD_USER_AGENT }
154
- });
152
+ const headers = new Headers({ "Accept": "application/vnd.github+json", "User-Agent": DOWNLOAD_USER_AGENT });
153
+ const token = process.env["GITHUB_TOKEN"] ?? process.env["GH_TOKEN"];
154
+ if (token) {
155
+ headers.set("Authorization", `Bearer ${token}`);
156
+ }
157
+ const response = await fetch(`${RELEASE_API_TAG_URL}/v${version}`, { headers });
155
158
  if (!response.ok) {
156
159
  log(`[installer] Release API for ${version} returned HTTP ${String(response.status)}; falling back to templated asset names.`);
157
160
  return void 0;
@@ -194,4 +197,4 @@ export {
194
197
  ensureShellCached,
195
198
  getCachedShellDir
196
199
  };
197
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgaGVscGVycyBmb3IgcmVzb2x2aW5nIHRoZSBPYnNpZGlhbiAqKnNoZWxsKiogKHRoZSBFbGVjdHJvblxuICogcnVudGltZSAvIGluc3RhbGxlciBidWlsZCkgdG8gbGF1bmNoLlxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgdXNlcyB0aGUgaW5zdGFsbGVkIHNoZWxsLiBXaGVuIGEgc3BlY2lmaWMgaW5zdGFsbGVyXG4gKiB2ZXJzaW9uIGlzIHJlcXVlc3RlZCwgaXQgZG93bmxvYWRzIHRoYXQgdmVyc2lvbidzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGFuZFxuICogZXh0cmFjdHMgYSBwb3J0YWJsZSBzaGVsbCBpbnRvIGEgY2FjaGUsIHJldHVybmluZyB0aGUgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gKlxuICogR2l0SHViIHJlbGVhc2UgYXNzZXRzIGV4aXN0IGZvciAqKnB1YmxpYyoqIHJlbGVhc2VzIG9ubHk7IGNhdGFseXN0IChiZXRhKVxuICogYnVpbGRzIHB1Ymxpc2ggb25seSB0aGUgYXNhciwgc28gaW5zdGFsbGVyLXBpbm5pbmcgc3VwcG9ydHMgcHVibGljIHZlcnNpb25zLlxuICogVGhlIGV4dHJhY3RlZCBzaGVsbCdzIGJ1bmRsZWQgYHJlc291cmNlcy9vYnNpZGlhbi5hc2FyYCBpcyB0aGF0IHZlcnNpb24sIHNvXG4gKiBwaW5uaW5nIHRoZSBpbnN0YWxsZXIgaXMgaG93IHlvdSBydW4gYSB2ZXJzaW9uICoqb2xkZXIqKiB0aGFuIHRoZSBpbnN0YWxsZWRcbiAqIHNoZWxsIChhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5IFx1MjAxNCBzZWUgYG9ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzYCkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZG93bmxvYWQvZXh0cmFjdGlvbiBnbHVlIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQge1xuICBleGVjRmlsZVN5bmMsXG4gIHNwYXduU3luY1xufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIGJ1aWxkSW5zdGFsbGVyQXNzZXROYW1lQ2FuZGlkYXRlcyxcbiAgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lXG59IGZyb20gJy4vaW5zdGFsbGVyLWFzc2V0Lm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG4vKipcbiAqIEJyb3dzZXIgVXNlci1BZ2VudCBmb3IgZG93bmxvYWRpbmcgcmVsZWFzZSBhc3NldHMgKENsb3VkZmxhcmUtZ2F0ZWQpLlxuICovXG5jb25zdCBET1dOTE9BRF9VU0VSX0FHRU5UID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84Ni4wLjQyNDAuMTgzIFNhZmFyaS81MzcuMzYnO1xuXG4vKiogQmFzZSBVUkwgZm9yIGBvYnNpZGlhbi1yZWxlYXNlc2AgcmVsZWFzZSBhc3NldHMgKGAuLi4vZG93bmxvYWQvdjx2ZXI+Lzxhc3NldD5gKS4gKi9cbmNvbnN0IFJFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvcmVsZWFzZXMvZG93bmxvYWQnO1xuXG4vKiogR2l0SHViIFJFU1QgZW5kcG9pbnQgbGlzdGluZyBhIHJlbGVhc2UncyBhc3NldHMgYnkgdGFnIChgLi4uL3JlbGVhc2VzL3RhZ3Mvdjx2ZXI+YCkuICovXG5jb25zdCBSRUxFQVNFX0FQSV9UQUdfVVJMID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9yZWxlYXNlcy90YWdzJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIEdpdEh1YiByZWxlYXNlIEFQSSByZXNwb25zZSB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqIFRoZSByZWxlYXNlJ3MgZG93bmxvYWRhYmxlIGFzc2V0cy4gKi9cbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBHaXRIdWJSZWxlYXNlQXNzZXRbXTtcbn1cblxuLyoqIFRoZSBzdWJzZXQgb2YgYSBHaXRIdWIgcmVsZWFzZSdzIGFzc2V0IG9iamVjdCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlQXNzZXQge1xuICAvKiogVGhlIGFzc2V0IGZpbGUgbmFtZSwgZS5nLiBgT2JzaWRpYW4uMC4xNC41LmV4ZWAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBTSEVMTF9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdzaGVsbC1jYWNoZScpO1xuY29uc3QgTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTiA9IC88a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPFxcL2tleT5cXHMqPHN0cmluZz4oPzx2ZXJzaW9uPltePF0rKTxcXC9zdHJpbmc+LztcblxuLyoqXG4gKiBBIHJlc29sdmVkIE9ic2lkaWFuIHNoZWxsIGV4ZWN1dGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTaGVsbCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlIHRvIGxhdW5jaC4gKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgc2hlbGwncyB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBpZiBpdCBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQuICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSB2ZXJzaW9uIG9mIGFuIGluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCBmcm9tIGl0cyBleGVjdXRhYmxlLlxuICpcbiAqIC0gV2luZG93czogdGhlIGV4ZWN1dGFibGUncyBQRSBgRmlsZVZlcnNpb25gLlxuICogLSBtYWNPUzogYENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nYCBmcm9tIHRoZSBhcHAgYnVuZGxlJ3MgYEluZm8ucGxpc3RgLlxuICogLSBMaW51eDogYmVzdC1lZmZvcnQgcGFyc2UgZnJvbSB0aGUgZXhlY3V0YWJsZSBwYXRoIChvZnRlbiBgdW5kZWZpbmVkYCkuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlLlxuICogQHJldHVybnMgVGhlIGB4LnkuemAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGRldGVjdE1hY0J1bmRsZVZlcnNpb24oZXhlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0VmVyc2lvbkZyb21QYXRoKGV4ZVBhdGgpO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgYSBwb3J0YWJsZSBPYnNpZGlhbiBzaGVsbCBmb3IgdGhlIGdpdmVuIHZlcnNpb24gaXMgZXh0cmFjdGVkIGludG8gdGhlXG4gKiBjYWNoZSwgZG93bmxvYWRpbmcgYW5kIGV4dHJhY3RpbmcgaXRzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGlmIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkIG9yIGV4dHJhY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNoZWxsQ2FjaGVkKHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNoZWxsRGlyID0gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbik7XG4gIGNvbnN0IGV4ZVBhdGggPSBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXIpO1xuICBpZiAoZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIGxvZyhgW2luc3RhbGxlcl0gVXNpbmcgY2FjaGVkIHNoZWxsIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBleGVQYXRoO1xuICB9XG5cbiAgbWtkaXJTeW5jKHNoZWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgYXNzZXRVcmxzID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uKTtcbiAgY29uc3QgYXNzZXRQYXRoID0gYXdhaXQgZG93bmxvYWRJbnN0YWxsZXJBc3NldChhc3NldFVybHMsIHNoZWxsRGlyLCB2ZXJzaW9uKTtcbiAgZXh0cmFjdFNoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICBybVN5bmMoYXNzZXRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gIGlmICghZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0cmFjdGVkIE9ic2lkaWFuIHNoZWxsICR7dmVyc2lvbn0gYnV0IGV4ZWN1dGFibGUgbm90IGZvdW5kIGF0ICR7ZXhlUGF0aH0uYCk7XG4gIH1cbiAgbG9nKGBbaW5zdGFsbGVyXSBFeHRyYWN0ZWQgc2hlbGwgJHt2ZXJzaW9ufSAtPiAke2V4ZVBhdGh9YCk7XG4gIHJldHVybiBleGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlIGRpcmVjdG9yeSBhIHZlcnNpb24ncyBleHRyYWN0ZWQgc2hlbGwgbGl2ZXMgaW4gKHRoZVxuICogZGlyZWN0b3J5IG1heSBub3QgeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBzaGVsbCBjYWNoZSBkaXJlY3RvcnkgZm9yIHRoZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oU0hFTExfQ0FDSEVfRElSLCB2ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBkZXNjcmlwdGl2ZSBlcnJvciBpZiBhIHJlcXVpcmVkIGNvbW1hbmQgaXMgbm90IG9uIGBQQVRIYC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gaGludCAtIEFjdGlvbmFibGUgZ3VpZGFuY2UgYXBwZW5kZWQgdG8gdGhlIGVycm9yLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDb21tYW5kQXZhaWxhYmxlKGNvbW1hbmQ6IHN0cmluZywgaGludDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHByb2JlID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICd3aGVyZS5leGUnIDogJ3doaWNoJztcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKHByb2JlLCBbY29tbWFuZF0sIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgY29tbWFuZCBcIiR7Y29tbWFuZH1cIiB3YXMgbm90IGZvdW5kIG9uIFBBVEguICR7aGludH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZ2AgZnJvbSBhIG1hY09TIGFwcCBidW5kbGUncyBgSW5mby5wbGlzdGAuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBQYXRoIHRvIGAuLi4vT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuYC5cbiAqIEByZXR1cm5zIFRoZSBgeC55LnpgIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RNYWNCdW5kbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudHNEaXIgPSBkaXJuYW1lKGRpcm5hbWUoZXhlUGF0aCkpO1xuICAgIGNvbnN0IHBsaXN0ID0gcmVhZEZpbGVTeW5jKGpvaW4oY29udGVudHNEaXIsICdJbmZvLnBsaXN0JyksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTi5leGVjKHBsaXN0KTtcbiAgICByZXR1cm4gbWF0Y2g/Lmdyb3Vwcz8uWyd2ZXJzaW9uJ107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBwYXJzZSBvZiBhbiBgeC55LnpgIHZlcnNpb24gZW1iZWRkZWQgaW4gYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwYXRoIG9yIHN0cmluZyB0byBzY2FuLlxuICogQHJldHVybnMgVGhlIGZpcnN0IGB4LnkuemAgbWF0Y2gsIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RWZXJzaW9uRnJvbVBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gLyg/PHZlcnNpb24+XFxkK1xcLlxcZCtcXC5cXGQrKS8uZXhlYyh2YWx1ZSk7XG4gIHJldHVybiBtYXRjaD8uZ3JvdXBzPy5bJ3ZlcnNpb24nXTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgUEUgYEZpbGVWZXJzaW9uYCBvZiBhIFdpbmRvd3MgZXhlY3V0YWJsZSB2aWEgUG93ZXJTaGVsbC5cbiAqXG4gKiBAcGFyYW0gZXhlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUuXG4gKiBAcmV0dXJucyBUaGUgYHgueS56YCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlY0ZpbGVTeW5jKFxuICAgICAgJ3Bvd2Vyc2hlbGwnLFxuICAgICAgWyctTm9Qcm9maWxlJywgJy1Db21tYW5kJywgYChHZXQtSXRlbSAtTGl0ZXJhbFBhdGggJHtKU09OLnN0cmluZ2lmeShleGVQYXRoKX0pLlZlcnNpb25JbmZvLkZpbGVWZXJzaW9uYF0sXG4gICAgICB7IGVuY29kaW5nOiAndXRmLTgnIH1cbiAgICApO1xuICAgIGNvbnN0IHZlcnNpb24gPSBvdXRwdXQudHJpbSgpO1xuICAgIHJldHVybiB2ZXJzaW9uLmxlbmd0aCA+IDAgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWRzIGEgc2luZ2xlIHJlbGVhc2UgYXNzZXQgZm9yIGEgdmVyc2lvbiB0byBhIGRlc3RpbmF0aW9uIGZpbGUuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBhc3NldCBkb3dubG9hZCBVUkwuXG4gKiBAcGFyYW0gZGVzdCAtIERlc3RpbmF0aW9uIGZpbGUgcGF0aC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXNzZXQodXJsOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFtpbnN0YWxsZXJdIERvd25sb2FkaW5nIGluc3RhbGxlciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHdyaXRlRmlsZVN5bmMoZGVzdCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyB0aGUgZmlyc3QgcmVhY2hhYmxlIGluc3RhbGxlciBhc3NldCBmcm9tIGFuIG9yZGVyZWQgbGlzdCBvZlxuICogY2FuZGlkYXRlIFVSTHMsIHJldHVybmluZyB0aGUgcGF0aCBpdCB3YXMgc2F2ZWQgdG8uXG4gKlxuICogQHBhcmFtIHVybHMgLSBDYW5kaWRhdGUgYXNzZXQgVVJMcywgaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgcmVsZWFzZSB2ZXJzaW9uIChmb3IgZXJyb3IgbWVzc2FnZXMpLlxuICogQHJldHVybnMgVGhlIGRvd25sb2FkZWQgYXNzZXQncyBwYXRoLlxuICogQHRocm93cyBFcnJvciBpZiBub25lIG9mIHRoZSBjYW5kaWRhdGVzIGNhbiBiZSBkb3dubG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEluc3RhbGxlckFzc2V0KHVybHM6IHN0cmluZ1tdLCBzaGVsbERpcjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgdXJsIG9mIHVybHMpIHtcbiAgICBjb25zdCBhc3NldFBhdGggPSBqb2luKHNoZWxsRGlyLCBiYXNlbmFtZSh1cmwpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZG93bmxvYWRBc3NldCh1cmwsIGFzc2V0UGF0aCk7XG4gICAgICByZXR1cm4gYXNzZXRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBpbnN0YWxsZXIgJHt2ZXJzaW9ufS4gQXR0ZW1wdHM6ICR7ZXJyb3JzLmpvaW4oJzsgJyl9LiBgXG4gICAgICArICdDYXRhbHlzdC9iZXRhIHZlcnNpb25zIGhhdmUgbm8gcHVibGljIGluc3RhbGxlciBcdTIwMTQgcGluIGFuIGFzYXIgdmVyc2lvbiBvbiBhIHB1YmxpYy9pbnN0YWxsZWQgc2hlbGwgaW5zdGVhZC4nXG4gICk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBMaW51eCBgLnRhci5nemAgcG9ydGFibGUgYnVpbGQuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC50YXIuZ3pgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGg6IHN0cmluZywgc2hlbGxEaXI6IHN0cmluZyk6IHZvaWQge1xuICBydW4oJ3RhcicsIFsneHpmJywgYXNzZXRQYXRoLCAnLUMnLCBzaGVsbERpciwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgbWFjT1MgYC5kbWdgIGJ5IG1vdW50aW5nIGl0IGFuZCBjb3B5aW5nIHRoZSBhcHAgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSBhc3NldFBhdGggLSBQYXRoIHRvIHRoZSBkb3dubG9hZGVkIGAuZG1nYC5cbiAqIEBwYXJhbSBzaGVsbERpciAtIERlc3RpbmF0aW9uIHNoZWxsIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1hY1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vdW50UG9pbnQgPSBqb2luKHNoZWxsRGlyLCAnX19tbnQnKTtcbiAgbWtkaXJTeW5jKG1vdW50UG9pbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBydW4oJ2hkaXV0aWwnLCBbJ2F0dGFjaCcsICctbm9icm93c2UnLCAnLW1vdW50cG9pbnQnLCBtb3VudFBvaW50LCBhc3NldFBhdGhdKTtcbiAgdHJ5IHtcbiAgICBydW4oJ2NwJywgWyctUicsIGpvaW4obW91bnRQb2ludCwgJ09ic2lkaWFuLmFwcCcpLCBzaGVsbERpcl0pO1xuICB9IGZpbmFsbHkge1xuICAgIHJ1bignaGRpdXRpbCcsIFsnZGV0YWNoJywgbW91bnRQb2ludF0pO1xuICB9XG4gIHJtU3luYyhtb3VudFBvaW50LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBkb3dubG9hZGVkIGluc3RhbGxlciBhc3NldCBpbnRvIGEgc2hlbGwgZGlyZWN0b3J5LCBwZXIgcGxhdGZvcm0uXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFRoZSBkb3dubG9hZGVkIGFzc2V0IHBhdGguXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0U2hlbGwoYXNzZXRQYXRoOiBzdHJpbmcsIHNoZWxsRGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIGV4dHJhY3RNYWNTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIFdpbmRvd3MgTlNJUyBpbnN0YWxsZXIncyBpbm5lciBhcHAgcGF5bG9hZCB2aWEgNy1aaXAuXG4gKlxuICogVGhlIE5TSVMgaW5zdGFsbGVyIGAuZXhlYCBjb250YWlucyBgJFBMVUdJTlNESVIvYXBwLTY0Ljd6YCwgd2hpY2ggaG9sZHMgdGhlXG4gKiBwb3J0YWJsZSBhcHAgKG1pcnJvcnMgaG93IHRoZSBzY29vcCBtYW5pZmVzdCBpbnN0YWxscyBPYnNpZGlhbikuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC5leGVgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGFzc2VydENvbW1hbmRBdmFpbGFibGUoJzd6JywgJ0luc3RhbGwgNy1aaXAgKGUuZy4gYHNjb29wIGluc3RhbGwgN3ppcGApIHRvIGV4dHJhY3QgYSBwaW5uZWQgT2JzaWRpYW4gaW5zdGFsbGVyLicpO1xuICBjb25zdCBuc2lzRXh0cmFjdERpciA9IGpvaW4oc2hlbGxEaXIsICdfX25zaXMnKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7bnNpc0V4dHJhY3REaXJ9YCwgYXNzZXRQYXRoXSk7XG4gIGNvbnN0IGlubmVyQXJjaGl2ZSA9IGpvaW4obnNpc0V4dHJhY3REaXIsICckUExVR0lOU0RJUicsICdhcHAtNjQuN3onKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7c2hlbGxEaXJ9YCwgaW5uZXJBcmNoaXZlXSk7XG4gIHJtU3luYyhuc2lzRXh0cmFjdERpciwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSByZWxlYXNlJ3MgYXNzZXQgbmFtZXMgZnJvbSB0aGUgR2l0SHViIEFQSS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSByZWxlYXNlIHZlcnNpb24gKHRhZyBgdjx2ZXJzaW9uPmApLlxuICogQHJldHVybnMgVGhlIGFzc2V0IG5hbWVzLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgQVBJIGlzIHVuYXZhaWxhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlbGVhc2VBc3NldE5hbWVzKHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke1JFTEVBU0VfQVBJX1RBR19VUkx9L3Yke3ZlcnNpb259YCwge1xuICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsICdVc2VyLUFnZW50JzogRE9XTkxPQURfVVNFUl9BR0VOVCB9XG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nKGBbaW5zdGFsbGVyXSBSZWxlYXNlIEFQSSBmb3IgJHt2ZXJzaW9ufSByZXR1cm5lZCBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9OyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBHaXRIdWJSZWxlYXNlO1xuICAgIHJldHVybiByZWxlYXNlLmFzc2V0cy5tYXAoKGFzc2V0KSA9PiBhc3NldC5uYW1lKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYFtpbnN0YWxsZXJdIFJlbGVhc2UgQVBJIGZvciAke3ZlcnNpb259IHVuYXZhaWxhYmxlICgke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX0pOyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHBlY3RlZCBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZSBwYXRoIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgc2hlbGwgY2FjaGUgZGlyZWN0b3J5IGZvciBhIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGpvaW4oc2hlbGxEaXIsICdPYnNpZGlhbi5leGUnKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKHNoZWxsRGlyLCAnT2JzaWRpYW4uYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ09ic2lkaWFuJyk7XG4gIH1cblxuICByZXR1cm4gam9pbihzaGVsbERpciwgJ29ic2lkaWFuJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG9yZGVyZWQgaW5zdGFsbGVyIGFzc2V0IGRvd25sb2FkIFVSTHMgdG8gdHJ5IGZvciBhIHZlcnNpb24uXG4gKlxuICogVGhlIHJlbGVhc2UncyByZWFsIGFzc2V0IGxpc3QgaXMgcXVlcmllZCBmaXJzdCBzbyB0aGUgcGxhdGZvcm0tY29ycmVjdCBhc3NldFxuICogaXMgcGlja2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIGhpc3RvcmljYWwgZG90LXZzLWh5cGhlbiBuYW1pbmc7IGlmIHRoYXQgY2FsbCBpc1xuICogdW5hdmFpbGFibGUgaXQgZmFsbHMgYmFjayB0byB0cnlpbmcgYm90aCB0ZW1wbGF0ZWQgc2VwYXJhdG9yIGZvcm1zLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIENhbmRpZGF0ZSBhc3NldCBVUkxzLCBpbiBwcmlvcml0eSBvcmRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGFzc2V0TmFtZXMgPSBhd2FpdCBmZXRjaFJlbGVhc2VBc3NldE5hbWVzKHZlcnNpb24pO1xuICBpZiAoYXNzZXROYW1lcykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lKHsgYXNzZXROYW1lcywgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sIHZlcnNpb24gfSk7XG4gICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbYCR7UkVMRUFTRV9ET1dOTE9BRF9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHtzZWxlY3RlZH1gXTtcbiAgICB9XG4gICAgbG9nKGBbaW5zdGFsbGVyXSBObyBpbnN0YWxsZXIgYXNzZXQgbWF0Y2hlZCBmb3IgJHt2ZXJzaW9ufTsgZmFsbGluZyBiYWNrIHRvIHRlbXBsYXRlZCBhc3NldCBuYW1lcy5gKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXMoeyBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSwgdmVyc2lvbiB9KVxuICAgIC5tYXAoKG5hbWUpID0+IGAke1JFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7bmFtZX1gKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgY29tbWFuZCBzeW5jaHJvbm91c2x5LCB0aHJvd2luZyBvbiBhIG5vbi16ZXJvIGV4aXQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gcnVuKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLm1hcCgoYXJnKSA9PiBiYXNlbmFtZShhcmcpKS5qb2luKCcgJyl9IChleGl0ICR7U3RyaW5nKHJlc3VsdC5zdGF0dXMpfSlgKTtcbiAgfVxufVxuXG4v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LFNBQVMsTUFBTSxDQUFDLDBDQUEwQztBQUM3SCxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sVUFBVSxNQUFNLFNBQVMsS0FBSztBQUNwQyxXQUFPLFFBQVEsT0FBTyxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUk7QUFBQSxFQUNqRCxTQUFTLE9BQU87QUFDZCxRQUFJLCtCQUErQixPQUFPLGlCQUFpQixpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLLENBQUMsMkNBQTJDO0FBQzVKLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFRQSxTQUFTLHNCQUFzQixVQUEwQjtBQUN2RCxNQUFJLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFdBQU8sS0FBSyxVQUFVLGNBQWM7QUFBQSxFQUN0QztBQUVBLE1BQUksUUFBUSxhQUFhLFVBQVU7QUFDakMsV0FBTyxLQUFLLFVBQVUsZ0JBQWdCLFlBQVksU0FBUyxVQUFVO0FBQUEsRUFDdkU7QUFFQSxTQUFPLEtBQUssVUFBVSxVQUFVO0FBQ2xDO0FBWUEsZUFBZSwwQkFBMEIsU0FBb0M7QUFDM0UsUUFBTSxhQUFhLE1BQU0sdUJBQXVCLE9BQU87QUFDdkQsTUFBSSxZQUFZO0FBQ2QsVUFBTSxXQUFXLHlCQUF5QixFQUFFLFlBQVksVUFBVSxRQUFRLFVBQVUsUUFBUSxDQUFDO0FBQzdGLFFBQUksYUFBYSxRQUFXO0FBQzFCLGFBQU8sQ0FBQyxHQUFHLHlCQUF5QixLQUFLLE9BQU8sSUFBSSxRQUFRLEVBQUU7QUFBQSxJQUNoRTtBQUNBLFFBQUksOENBQThDLE9BQU8sMENBQTBDO0FBQUEsRUFDckc7QUFFQSxTQUFPLGtDQUFrQyxFQUFFLFVBQVUsUUFBUSxVQUFVLFFBQVEsQ0FBQyxFQUM3RSxJQUFJLENBQUMsU0FBUyxHQUFHLHlCQUF5QixLQUFLLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDckU7QUFRQSxTQUFTLElBQUksU0FBaUIsTUFBc0I7QUFDbEQsUUFBTSxTQUFTLFVBQVUsU0FBUyxNQUFNLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDM0QsTUFBSSxPQUFPLFdBQVcsR0FBRztBQUN2QixVQUFNLElBQUksTUFBTSxtQkFBbUIsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsU0FBUyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxVQUFVLE9BQU8sT0FBTyxNQUFNLENBQUMsR0FBRztBQUFBLEVBQzVIO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
200
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgaGVscGVycyBmb3IgcmVzb2x2aW5nIHRoZSBPYnNpZGlhbiAqKnNoZWxsKiogKHRoZSBFbGVjdHJvblxuICogcnVudGltZSAvIGluc3RhbGxlciBidWlsZCkgdG8gbGF1bmNoLlxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgdXNlcyB0aGUgaW5zdGFsbGVkIHNoZWxsLiBXaGVuIGEgc3BlY2lmaWMgaW5zdGFsbGVyXG4gKiB2ZXJzaW9uIGlzIHJlcXVlc3RlZCwgaXQgZG93bmxvYWRzIHRoYXQgdmVyc2lvbidzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGFuZFxuICogZXh0cmFjdHMgYSBwb3J0YWJsZSBzaGVsbCBpbnRvIGEgY2FjaGUsIHJldHVybmluZyB0aGUgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gKlxuICogR2l0SHViIHJlbGVhc2UgYXNzZXRzIGV4aXN0IGZvciAqKnB1YmxpYyoqIHJlbGVhc2VzIG9ubHk7IGNhdGFseXN0IChiZXRhKVxuICogYnVpbGRzIHB1Ymxpc2ggb25seSB0aGUgYXNhciwgc28gaW5zdGFsbGVyLXBpbm5pbmcgc3VwcG9ydHMgcHVibGljIHZlcnNpb25zLlxuICogVGhlIGV4dHJhY3RlZCBzaGVsbCdzIGJ1bmRsZWQgYHJlc291cmNlcy9vYnNpZGlhbi5hc2FyYCBpcyB0aGF0IHZlcnNpb24sIHNvXG4gKiBwaW5uaW5nIHRoZSBpbnN0YWxsZXIgaXMgaG93IHlvdSBydW4gYSB2ZXJzaW9uICoqb2xkZXIqKiB0aGFuIHRoZSBpbnN0YWxsZWRcbiAqIHNoZWxsIChhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5IFx1MjAxNCBzZWUgYG9ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzYCkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZG93bmxvYWQvZXh0cmFjdGlvbiBnbHVlIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQge1xuICBleGVjRmlsZVN5bmMsXG4gIHNwYXduU3luY1xufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIGJ1aWxkSW5zdGFsbGVyQXNzZXROYW1lQ2FuZGlkYXRlcyxcbiAgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lXG59IGZyb20gJy4vaW5zdGFsbGVyLWFzc2V0Lm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG4vKipcbiAqIEJyb3dzZXIgVXNlci1BZ2VudCBmb3IgZG93bmxvYWRpbmcgcmVsZWFzZSBhc3NldHMgKENsb3VkZmxhcmUtZ2F0ZWQpLlxuICovXG5jb25zdCBET1dOTE9BRF9VU0VSX0FHRU5UID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84Ni4wLjQyNDAuMTgzIFNhZmFyaS81MzcuMzYnO1xuXG4vKiogQmFzZSBVUkwgZm9yIGBvYnNpZGlhbi1yZWxlYXNlc2AgcmVsZWFzZSBhc3NldHMgKGAuLi4vZG93bmxvYWQvdjx2ZXI+Lzxhc3NldD5gKS4gKi9cbmNvbnN0IFJFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvcmVsZWFzZXMvZG93bmxvYWQnO1xuXG4vKiogR2l0SHViIFJFU1QgZW5kcG9pbnQgbGlzdGluZyBhIHJlbGVhc2UncyBhc3NldHMgYnkgdGFnIChgLi4uL3JlbGVhc2VzL3RhZ3Mvdjx2ZXI+YCkuICovXG5jb25zdCBSRUxFQVNFX0FQSV9UQUdfVVJMID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9yZWxlYXNlcy90YWdzJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIEdpdEh1YiByZWxlYXNlIEFQSSByZXNwb25zZSB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqIFRoZSByZWxlYXNlJ3MgZG93bmxvYWRhYmxlIGFzc2V0cy4gKi9cbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBHaXRIdWJSZWxlYXNlQXNzZXRbXTtcbn1cblxuLyoqIFRoZSBzdWJzZXQgb2YgYSBHaXRIdWIgcmVsZWFzZSdzIGFzc2V0IG9iamVjdCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlQXNzZXQge1xuICAvKiogVGhlIGFzc2V0IGZpbGUgbmFtZSwgZS5nLiBgT2JzaWRpYW4uMC4xNC41LmV4ZWAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBTSEVMTF9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdzaGVsbC1jYWNoZScpO1xuY29uc3QgTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTiA9IC88a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPFxcL2tleT5cXHMqPHN0cmluZz4oPzx2ZXJzaW9uPltePF0rKTxcXC9zdHJpbmc+LztcblxuLyoqXG4gKiBBIHJlc29sdmVkIE9ic2lkaWFuIHNoZWxsIGV4ZWN1dGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTaGVsbCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlIHRvIGxhdW5jaC4gKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgc2hlbGwncyB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBpZiBpdCBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQuICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSB2ZXJzaW9uIG9mIGFuIGluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCBmcm9tIGl0cyBleGVjdXRhYmxlLlxuICpcbiAqIC0gV2luZG93czogdGhlIGV4ZWN1dGFibGUncyBQRSBgRmlsZVZlcnNpb25gLlxuICogLSBtYWNPUzogYENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nYCBmcm9tIHRoZSBhcHAgYnVuZGxlJ3MgYEluZm8ucGxpc3RgLlxuICogLSBMaW51eDogYmVzdC1lZmZvcnQgcGFyc2UgZnJvbSB0aGUgZXhlY3V0YWJsZSBwYXRoIChvZnRlbiBgdW5kZWZpbmVkYCkuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlLlxuICogQHJldHVybnMgVGhlIGB4LnkuemAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGRldGVjdE1hY0J1bmRsZVZlcnNpb24oZXhlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0VmVyc2lvbkZyb21QYXRoKGV4ZVBhdGgpO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgYSBwb3J0YWJsZSBPYnNpZGlhbiBzaGVsbCBmb3IgdGhlIGdpdmVuIHZlcnNpb24gaXMgZXh0cmFjdGVkIGludG8gdGhlXG4gKiBjYWNoZSwgZG93bmxvYWRpbmcgYW5kIGV4dHJhY3RpbmcgaXRzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGlmIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkIG9yIGV4dHJhY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNoZWxsQ2FjaGVkKHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNoZWxsRGlyID0gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbik7XG4gIGNvbnN0IGV4ZVBhdGggPSBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXIpO1xuICBpZiAoZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIGxvZyhgW2luc3RhbGxlcl0gVXNpbmcgY2FjaGVkIHNoZWxsIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBleGVQYXRoO1xuICB9XG5cbiAgbWtkaXJTeW5jKHNoZWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgYXNzZXRVcmxzID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uKTtcbiAgY29uc3QgYXNzZXRQYXRoID0gYXdhaXQgZG93bmxvYWRJbnN0YWxsZXJBc3NldChhc3NldFVybHMsIHNoZWxsRGlyLCB2ZXJzaW9uKTtcbiAgZXh0cmFjdFNoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICBybVN5bmMoYXNzZXRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gIGlmICghZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0cmFjdGVkIE9ic2lkaWFuIHNoZWxsICR7dmVyc2lvbn0gYnV0IGV4ZWN1dGFibGUgbm90IGZvdW5kIGF0ICR7ZXhlUGF0aH0uYCk7XG4gIH1cbiAgbG9nKGBbaW5zdGFsbGVyXSBFeHRyYWN0ZWQgc2hlbGwgJHt2ZXJzaW9ufSAtPiAke2V4ZVBhdGh9YCk7XG4gIHJldHVybiBleGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlIGRpcmVjdG9yeSBhIHZlcnNpb24ncyBleHRyYWN0ZWQgc2hlbGwgbGl2ZXMgaW4gKHRoZVxuICogZGlyZWN0b3J5IG1heSBub3QgeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBzaGVsbCBjYWNoZSBkaXJlY3RvcnkgZm9yIHRoZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oU0hFTExfQ0FDSEVfRElSLCB2ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBkZXNjcmlwdGl2ZSBlcnJvciBpZiBhIHJlcXVpcmVkIGNvbW1hbmQgaXMgbm90IG9uIGBQQVRIYC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gaGludCAtIEFjdGlvbmFibGUgZ3VpZGFuY2UgYXBwZW5kZWQgdG8gdGhlIGVycm9yLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDb21tYW5kQXZhaWxhYmxlKGNvbW1hbmQ6IHN0cmluZywgaGludDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHByb2JlID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICd3aGVyZS5leGUnIDogJ3doaWNoJztcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKHByb2JlLCBbY29tbWFuZF0sIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgY29tbWFuZCBcIiR7Y29tbWFuZH1cIiB3YXMgbm90IGZvdW5kIG9uIFBBVEguICR7aGludH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZ2AgZnJvbSBhIG1hY09TIGFwcCBidW5kbGUncyBgSW5mby5wbGlzdGAuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBQYXRoIHRvIGAuLi4vT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuYC5cbiAqIEByZXR1cm5zIFRoZSBgeC55LnpgIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RNYWNCdW5kbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudHNEaXIgPSBkaXJuYW1lKGRpcm5hbWUoZXhlUGF0aCkpO1xuICAgIGNvbnN0IHBsaXN0ID0gcmVhZEZpbGVTeW5jKGpvaW4oY29udGVudHNEaXIsICdJbmZvLnBsaXN0JyksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTi5leGVjKHBsaXN0KTtcbiAgICByZXR1cm4gbWF0Y2g/Lmdyb3Vwcz8uWyd2ZXJzaW9uJ107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBwYXJzZSBvZiBhbiBgeC55LnpgIHZlcnNpb24gZW1iZWRkZWQgaW4gYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwYXRoIG9yIHN0cmluZyB0byBzY2FuLlxuICogQHJldHVybnMgVGhlIGZpcnN0IGB4LnkuemAgbWF0Y2gsIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RWZXJzaW9uRnJvbVBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gLyg/PHZlcnNpb24+XFxkK1xcLlxcZCtcXC5cXGQrKS8uZXhlYyh2YWx1ZSk7XG4gIHJldHVybiBtYXRjaD8uZ3JvdXBzPy5bJ3ZlcnNpb24nXTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgUEUgYEZpbGVWZXJzaW9uYCBvZiBhIFdpbmRvd3MgZXhlY3V0YWJsZSB2aWEgUG93ZXJTaGVsbC5cbiAqXG4gKiBAcGFyYW0gZXhlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUuXG4gKiBAcmV0dXJucyBUaGUgYHgueS56YCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlY0ZpbGVTeW5jKFxuICAgICAgJ3Bvd2Vyc2hlbGwnLFxuICAgICAgWyctTm9Qcm9maWxlJywgJy1Db21tYW5kJywgYChHZXQtSXRlbSAtTGl0ZXJhbFBhdGggJHtKU09OLnN0cmluZ2lmeShleGVQYXRoKX0pLlZlcnNpb25JbmZvLkZpbGVWZXJzaW9uYF0sXG4gICAgICB7IGVuY29kaW5nOiAndXRmLTgnIH1cbiAgICApO1xuICAgIGNvbnN0IHZlcnNpb24gPSBvdXRwdXQudHJpbSgpO1xuICAgIHJldHVybiB2ZXJzaW9uLmxlbmd0aCA+IDAgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWRzIGEgc2luZ2xlIHJlbGVhc2UgYXNzZXQgZm9yIGEgdmVyc2lvbiB0byBhIGRlc3RpbmF0aW9uIGZpbGUuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBhc3NldCBkb3dubG9hZCBVUkwuXG4gKiBAcGFyYW0gZGVzdCAtIERlc3RpbmF0aW9uIGZpbGUgcGF0aC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXNzZXQodXJsOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFtpbnN0YWxsZXJdIERvd25sb2FkaW5nIGluc3RhbGxlciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHdyaXRlRmlsZVN5bmMoZGVzdCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyB0aGUgZmlyc3QgcmVhY2hhYmxlIGluc3RhbGxlciBhc3NldCBmcm9tIGFuIG9yZGVyZWQgbGlzdCBvZlxuICogY2FuZGlkYXRlIFVSTHMsIHJldHVybmluZyB0aGUgcGF0aCBpdCB3YXMgc2F2ZWQgdG8uXG4gKlxuICogQHBhcmFtIHVybHMgLSBDYW5kaWRhdGUgYXNzZXQgVVJMcywgaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgcmVsZWFzZSB2ZXJzaW9uIChmb3IgZXJyb3IgbWVzc2FnZXMpLlxuICogQHJldHVybnMgVGhlIGRvd25sb2FkZWQgYXNzZXQncyBwYXRoLlxuICogQHRocm93cyBFcnJvciBpZiBub25lIG9mIHRoZSBjYW5kaWRhdGVzIGNhbiBiZSBkb3dubG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEluc3RhbGxlckFzc2V0KHVybHM6IHN0cmluZ1tdLCBzaGVsbERpcjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgdXJsIG9mIHVybHMpIHtcbiAgICBjb25zdCBhc3NldFBhdGggPSBqb2luKHNoZWxsRGlyLCBiYXNlbmFtZSh1cmwpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZG93bmxvYWRBc3NldCh1cmwsIGFzc2V0UGF0aCk7XG4gICAgICByZXR1cm4gYXNzZXRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBpbnN0YWxsZXIgJHt2ZXJzaW9ufS4gQXR0ZW1wdHM6ICR7ZXJyb3JzLmpvaW4oJzsgJyl9LiBgXG4gICAgICArICdDYXRhbHlzdC9iZXRhIHZlcnNpb25zIGhhdmUgbm8gcHVibGljIGluc3RhbGxlciBcdTIwMTQgcGluIGFuIGFzYXIgdmVyc2lvbiBvbiBhIHB1YmxpYy9pbnN0YWxsZWQgc2hlbGwgaW5zdGVhZC4nXG4gICk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBMaW51eCBgLnRhci5nemAgcG9ydGFibGUgYnVpbGQuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC50YXIuZ3pgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGg6IHN0cmluZywgc2hlbGxEaXI6IHN0cmluZyk6IHZvaWQge1xuICBydW4oJ3RhcicsIFsneHpmJywgYXNzZXRQYXRoLCAnLUMnLCBzaGVsbERpciwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgbWFjT1MgYC5kbWdgIGJ5IG1vdW50aW5nIGl0IGFuZCBjb3B5aW5nIHRoZSBhcHAgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSBhc3NldFBhdGggLSBQYXRoIHRvIHRoZSBkb3dubG9hZGVkIGAuZG1nYC5cbiAqIEBwYXJhbSBzaGVsbERpciAtIERlc3RpbmF0aW9uIHNoZWxsIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1hY1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vdW50UG9pbnQgPSBqb2luKHNoZWxsRGlyLCAnX19tbnQnKTtcbiAgbWtkaXJTeW5jKG1vdW50UG9pbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBydW4oJ2hkaXV0aWwnLCBbJ2F0dGFjaCcsICctbm9icm93c2UnLCAnLW1vdW50cG9pbnQnLCBtb3VudFBvaW50LCBhc3NldFBhdGhdKTtcbiAgdHJ5IHtcbiAgICBydW4oJ2NwJywgWyctUicsIGpvaW4obW91bnRQb2ludCwgJ09ic2lkaWFuLmFwcCcpLCBzaGVsbERpcl0pO1xuICB9IGZpbmFsbHkge1xuICAgIHJ1bignaGRpdXRpbCcsIFsnZGV0YWNoJywgbW91bnRQb2ludF0pO1xuICB9XG4gIHJtU3luYyhtb3VudFBvaW50LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBkb3dubG9hZGVkIGluc3RhbGxlciBhc3NldCBpbnRvIGEgc2hlbGwgZGlyZWN0b3J5LCBwZXIgcGxhdGZvcm0uXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFRoZSBkb3dubG9hZGVkIGFzc2V0IHBhdGguXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0U2hlbGwoYXNzZXRQYXRoOiBzdHJpbmcsIHNoZWxsRGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIGV4dHJhY3RNYWNTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIFdpbmRvd3MgTlNJUyBpbnN0YWxsZXIncyBpbm5lciBhcHAgcGF5bG9hZCB2aWEgNy1aaXAuXG4gKlxuICogVGhlIE5TSVMgaW5zdGFsbGVyIGAuZXhlYCBjb250YWlucyBgJFBMVUdJTlNESVIvYXBwLTY0Ljd6YCwgd2hpY2ggaG9sZHMgdGhlXG4gKiBwb3J0YWJsZSBhcHAgKG1pcnJvcnMgaG93IHRoZSBzY29vcCBtYW5pZmVzdCBpbnN0YWxscyBPYnNpZGlhbikuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC5leGVgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGFzc2VydENvbW1hbmRBdmFpbGFibGUoJzd6JywgJ0luc3RhbGwgNy1aaXAgKGUuZy4gYHNjb29wIGluc3RhbGwgN3ppcGApIHRvIGV4dHJhY3QgYSBwaW5uZWQgT2JzaWRpYW4gaW5zdGFsbGVyLicpO1xuICBjb25zdCBuc2lzRXh0cmFjdERpciA9IGpvaW4oc2hlbGxEaXIsICdfX25zaXMnKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7bnNpc0V4dHJhY3REaXJ9YCwgYXNzZXRQYXRoXSk7XG4gIGNvbnN0IGlubmVyQXJjaGl2ZSA9IGpvaW4obnNpc0V4dHJhY3REaXIsICckUExVR0lOU0RJUicsICdhcHAtNjQuN3onKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7c2hlbGxEaXJ9YCwgaW5uZXJBcmNoaXZlXSk7XG4gIHJtU3luYyhuc2lzRXh0cmFjdERpciwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSByZWxlYXNlJ3MgYXNzZXQgbmFtZXMgZnJvbSB0aGUgR2l0SHViIEFQSS5cbiAqXG4gKiBSZWFkcyBhIGBHSVRIVUJfVE9LRU5gIChvciBgR0hfVE9LRU5gKSBmcm9tIHRoZSBlbnZpcm9ubWVudCBhbmQgc2VuZHMgaXQgYXMgYVxuICogYmVhcmVyIHRva2VuIHdoZW4gcHJlc2VudCwgdG8gbGlmdCB0aGUgYW5vbnltb3VzIHJhdGUgbGltaXQgdGhhdCBvdGhlcndpc2VcbiAqIHJldHVybnMgSFRUUCA0MDMgb24gc2hhcmVkIENJIHJ1bm5lciBJUHMuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgcmVsZWFzZSB2ZXJzaW9uICh0YWcgYHY8dmVyc2lvbj5gKS5cbiAqIEByZXR1cm5zIFRoZSBhc3NldCBuYW1lcywgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIEFQSSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWxlYXNlQXNzZXROYW1lcyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSk7XG4gICAgLy8gU2VuZCBhIGJlYXJlciB0b2tlbiB3aGVuIG9uZSBpcyBhdmFpbGFibGUgKGUuZy4gR0lUSFVCX1RPS0VOIG9uIENJKS5cbiAgICAvLyBXaXRob3V0IGl0IHRoZSBhc3NldC1saXN0IEFQSSBpcyBsaW1pdGVkIHRvIHRoZSBhbm9ueW1vdXMgcXVvdGEuXG4gICAgLy8gVGhhdCBxdW90YSByZXR1cm5zIEhUVFAgNDAzIG9uIHNoYXJlZCBDSSBydW5uZXIgSVBzIGFuZCBmb3JjZXMgdGhlIGZhbGxiYWNrLlxuICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9UT0tFTiddID8/IHByb2Nlc3MuZW52WydHSF9UT0tFTiddO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7dG9rZW59YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7UkVMRUFTRV9BUElfVEFHX1VSTH0vdiR7dmVyc2lvbn1gLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nKGBbaW5zdGFsbGVyXSBSZWxlYXNlIEFQSSBmb3IgJHt2ZXJzaW9ufSByZXR1cm5lZCBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9OyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBHaXRIdWJSZWxlYXNlO1xuICAgIHJldHVybiByZWxlYXNlLmFzc2V0cy5tYXAoKGFzc2V0KSA9PiBhc3NldC5uYW1lKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYFtpbnN0YWxsZXJdIFJlbGVhc2UgQVBJIGZvciAke3ZlcnNpb259IHVuYXZhaWxhYmxlICgke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX0pOyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHBlY3RlZCBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZSBwYXRoIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgc2hlbGwgY2FjaGUgZGlyZWN0b3J5IGZvciBhIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGpvaW4oc2hlbGxEaXIsICdPYnNpZGlhbi5leGUnKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKHNoZWxsRGlyLCAnT2JzaWRpYW4uYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ09ic2lkaWFuJyk7XG4gIH1cblxuICByZXR1cm4gam9pbihzaGVsbERpciwgJ29ic2lkaWFuJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG9yZGVyZWQgaW5zdGFsbGVyIGFzc2V0IGRvd25sb2FkIFVSTHMgdG8gdHJ5IGZvciBhIHZlcnNpb24uXG4gKlxuICogVGhlIHJlbGVhc2UncyByZWFsIGFzc2V0IGxpc3QgaXMgcXVlcmllZCBmaXJzdCBzbyB0aGUgcGxhdGZvcm0tY29ycmVjdCBhc3NldFxuICogaXMgcGlja2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIGhpc3RvcmljYWwgZG90LXZzLWh5cGhlbiBuYW1pbmc7IGlmIHRoYXQgY2FsbCBpc1xuICogdW5hdmFpbGFibGUgaXQgZmFsbHMgYmFjayB0byB0cnlpbmcgYm90aCB0ZW1wbGF0ZWQgc2VwYXJhdG9yIGZvcm1zLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIENhbmRpZGF0ZSBhc3NldCBVUkxzLCBpbiBwcmlvcml0eSBvcmRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGFzc2V0TmFtZXMgPSBhd2FpdCBmZXRjaFJlbGVhc2VBc3NldE5hbWVzKHZlcnNpb24pO1xuICBpZiAoYXNzZXROYW1lcykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lKHsgYXNzZXROYW1lcywgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sIHZlcnNpb24gfSk7XG4gICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbYCR7UkVMRUFTRV9ET1dOTE9BRF9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHtzZWxlY3RlZH1gXTtcbiAgICB9XG4gICAgbG9nKGBbaW5zdGFsbGVyXSBObyBpbnN0YWxsZXIgYXNzZXQgbWF0Y2hlZCBmb3IgJHt2ZXJzaW9ufTsgZmFsbGluZyBiYWNrIHRvIHRlbXBsYXRlZCBhc3NldCBuYW1lcy5gKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXMoeyBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSwgdmVyc2lvbiB9KVxuICAgIC5tYXAoKG5hbWUpID0+IGAke1JFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7bmFtZX1gKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgY29tbWFuZCBzeW5jaHJvbm91c2x5LCB0aHJvd2luZyBvbiBhIG5vbi16ZXJvIGV4aXQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gcnVuKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLm1hcCgoYXJnKSA9PiBiYXNlbmFtZShhcmcpKS5qb2luKCcgJyl9IChleGl0ICR7U3RyaW5nKHJlc3VsdC5zdGF0dXMpfSlgKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUJBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxhQUFhO0FBRXBCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxXQUFXO0FBS3BCLE1B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
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Typed access to the repo-root `metadata.json` — the per-Obsidian-app-version
5
+ * data table precomputed in this repo (installer-floor / recommended-installer /
6
+ * recommended-Electron thresholds; see the `metadata.json` section in
7
+ * `CLAUDE.md`). This is the single module that reads the raw table; everything
8
+ * else consumes it through {@link getVersionMetadata} against the
9
+ * {@link ObsidianVersionMetadata} shape, so the raw table stays internal and the
10
+ * public surface is a typed lookup.
11
+ *
12
+ * The table is injected at build time by esbuild's `define` (and at test time by
13
+ * Vitest's `define`) — the `OBSIDIAN_METADATA` global is replaced with the parsed
14
+ * contents of `metadata.json`. This mirrors how `OBSIDIAN_INTEGRATION_TESTING_VERSION`
15
+ * is injected, and keeps the built library self-contained (the table is inlined
16
+ * into the output, with no runtime file read and no `bundle`-time JSON import that
17
+ * `bundle: false` cannot inline).
18
+ */
19
+ /**
20
+ * The subset of a `metadata.json` per-version entry this library reads.
21
+ *
22
+ * Every field is optional — an entry carries only the thresholds that apply to
23
+ * that version (e.g. only old versions carry {@link minRecommendedInstallerVersion}).
24
+ */
25
+ export interface ObsidianVersionMetadata {
26
+ /** Whether the version's assets are available (present only when `false`). */
27
+ readonly available?: boolean;
28
+ /** URL of the version's changelog. */
29
+ readonly changelogUrl?: string;
30
+ /** The release channel: `'public'`, `'catalyst'`, or `'public+catalyst'`. */
31
+ readonly channel?: string;
32
+ /**
33
+ * The app's hardcoded required-minimum Electron version (e.g. `'28.2.3'`). An
34
+ * Electron version, not an installer version — comparing against it needs the
35
+ * installer's bundled Electron, which is not derivable offline.
36
+ */
37
+ readonly minRecommendedElectronVersion?: string;
38
+ /**
39
+ * The recommended-minimum installer version (Obsidian's own "installer too old,
40
+ * reinstall" guidance). Present only on older versions.
41
+ */
42
+ readonly minRecommendedInstallerVersion?: string;
43
+ /**
44
+ * The empirically-measured run floor: the oldest installer version whose
45
+ * Electron shell can actually boot this app version's asar. Below it the
46
+ * renderer dead-boots.
47
+ */
48
+ readonly minRunnableInstallerVersion?: string;
49
+ }
50
+ /**
51
+ * Looks up the metadata entry for a concrete Obsidian app version.
52
+ *
53
+ * @param version - A concrete `x.y.z` app version.
54
+ * @returns The entry, or `undefined` when the version is absent from the table.
55
+ */
56
+ export declare function getVersionMetadata(version: string): ObsidianVersionMetadata | undefined;