obsidian-integration-testing 8.3.0 → 8.4.0

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 (60) hide show
  1. package/dist/lib/cjs/asar-fallback-detection.cjs +48 -0
  2. package/dist/lib/cjs/asar-fallback-detection.d.cts +75 -0
  3. package/dist/lib/cjs/compatibility-options.cjs +18 -1
  4. package/dist/lib/cjs/compatibility-options.d.cts +41 -0
  5. package/dist/lib/cjs/connect-to-cdp.cjs +17 -18
  6. package/dist/lib/cjs/connect-to-cdp.d.cts +25 -0
  7. package/dist/lib/cjs/ecmascript-version.cjs +63 -0
  8. package/dist/lib/cjs/ecmascript-version.d.cts +28 -0
  9. package/dist/lib/cjs/index.cjs +7 -1
  10. package/dist/lib/cjs/index.d.cts +5 -1
  11. package/dist/lib/cjs/installer-asset.cjs +18 -3
  12. package/dist/lib/cjs/installer-asset.d.cts +26 -0
  13. package/dist/lib/cjs/library.cjs +1 -1
  14. package/dist/lib/cjs/namespace-bootstrap.cjs +44 -7
  15. package/dist/lib/cjs/normalize-optional-properties.cjs +31 -0
  16. package/dist/lib/cjs/normalize-optional-properties.d.cts +26 -0
  17. package/dist/lib/cjs/obsidian-installer.cjs +6 -1
  18. package/dist/lib/cjs/obsidian-metadata.cjs +3775 -302
  19. package/dist/lib/cjs/obsidian-metadata.d.cts +71 -0
  20. package/dist/lib/cjs/obsidian-version-switch.cjs +5 -2
  21. package/dist/lib/cjs/owned-vault-seed.cjs +38 -0
  22. package/dist/lib/cjs/owned-vault-seed.d.cts +67 -0
  23. package/dist/lib/cjs/silent-asar-fallback-error.cjs +48 -0
  24. package/dist/lib/cjs/silent-asar-fallback-error.d.cts +40 -0
  25. package/dist/lib/cjs/transport-desktop-cdp.cjs +197 -73
  26. package/dist/lib/cjs/transport-desktop-cdp.d.cts +74 -15
  27. package/dist/lib/cjs/transport-factory.cjs +14 -12
  28. package/dist/lib/cjs/transport-options.cjs +1 -1
  29. package/dist/lib/cjs/transport-options.d.cts +16 -0
  30. package/dist/lib/esm/asar-fallback-detection.d.mts +75 -0
  31. package/dist/lib/esm/asar-fallback-detection.mjs +24 -0
  32. package/dist/lib/esm/compatibility-options.d.mts +41 -0
  33. package/dist/lib/esm/compatibility-options.mjs +16 -1
  34. package/dist/lib/esm/connect-to-cdp.d.mts +25 -0
  35. package/dist/lib/esm/connect-to-cdp.mjs +17 -18
  36. package/dist/lib/esm/ecmascript-version.d.mts +28 -0
  37. package/dist/lib/esm/ecmascript-version.mjs +39 -0
  38. package/dist/lib/esm/index.d.mts +5 -1
  39. package/dist/lib/esm/index.mjs +5 -1
  40. package/dist/lib/esm/installer-asset.d.mts +26 -0
  41. package/dist/lib/esm/installer-asset.mjs +16 -2
  42. package/dist/lib/esm/library.mjs +1 -1
  43. package/dist/lib/esm/namespace-bootstrap.mjs +44 -7
  44. package/dist/lib/esm/normalize-optional-properties.d.mts +26 -0
  45. package/dist/lib/esm/normalize-optional-properties.mjs +7 -0
  46. package/dist/lib/esm/obsidian-installer.mjs +8 -2
  47. package/dist/lib/esm/obsidian-metadata.d.mts +71 -0
  48. package/dist/lib/esm/obsidian-metadata.mjs +3775 -302
  49. package/dist/lib/esm/obsidian-version-switch.mjs +5 -2
  50. package/dist/lib/esm/owned-vault-seed.d.mts +67 -0
  51. package/dist/lib/esm/owned-vault-seed.mjs +14 -0
  52. package/dist/lib/esm/silent-asar-fallback-error.d.mts +40 -0
  53. package/dist/lib/esm/silent-asar-fallback-error.mjs +24 -0
  54. package/dist/lib/esm/transport-desktop-cdp.d.mts +74 -15
  55. package/dist/lib/esm/transport-desktop-cdp.mjs +197 -73
  56. package/dist/lib/esm/transport-factory.mjs +15 -12
  57. package/dist/lib/esm/transport-options.d.mts +16 -0
  58. package/dist/obsidian-integration-testing-8.4.0.tgz +0 -0
  59. package/package.json +3 -1
  60. package/dist/obsidian-integration-testing-8.3.0.tgz +0 -0
@@ -23,7 +23,9 @@ __export(index_exports, {
23
23
  DesktopCdpTransport: () => import_transport_desktop_cdp.DesktopCdpTransport,
24
24
  IncompatibleInstallerVersionError: () => import_incompatible_installer_version_error.IncompatibleInstallerVersionError,
25
25
  RendererFailedToInitializeError: () => import_renderer_failed_to_initialize_error.RendererFailedToInitializeError,
26
+ SilentAsarFallbackError: () => import_silent_asar_fallback_error.SilentAsarFallbackError,
26
27
  TempVault: () => import_temp_vault.TempVault,
28
+ checkAsarFallback: () => import_asar_fallback_detection.checkAsarFallback,
27
29
  checkElectronCompatibility: () => import_electron_compatibility.checkElectronCompatibility,
28
30
  checkInstallerCompatibility: () => import_installer_compatibility.checkInstallerCompatibility,
29
31
  connectToCdp: () => import_connect_to_cdp.connectToCdp,
@@ -37,6 +39,7 @@ __export(index_exports, {
37
39
  unregisterVault: () => import_vault_registry.unregisterVault
38
40
  });
39
41
  module.exports = __toCommonJS(index_exports);
42
+ var import_asar_fallback_detection = require("./asar-fallback-detection.cjs");
40
43
  var import_connect_to_cdp = require("./connect-to-cdp.cjs");
41
44
  var import_context_id = require("./context-id.cjs");
42
45
  var import_context_provider = require("./context-provider.cjs");
@@ -47,6 +50,7 @@ var import_installer_compatibility = require("./installer-compatibility.cjs");
47
50
  var import_lib_registry = require("./lib-registry.cjs");
48
51
  var import_obsidian_metadata = require("./obsidian-metadata.cjs");
49
52
  var import_renderer_failed_to_initialize_error = require("./renderer-failed-to-initialize-error.cjs");
53
+ var import_silent_asar_fallback_error = require("./silent-asar-fallback-error.cjs");
50
54
  var import_temp_vault = require("./temp-vault.cjs");
51
55
  var import_transport_appium = require("./transport-appium.cjs");
52
56
  var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
@@ -59,7 +63,9 @@ var import_vault_registry = require("./vault-registry.cjs");
59
63
  DesktopCdpTransport,
60
64
  IncompatibleInstallerVersionError,
61
65
  RendererFailedToInitializeError,
66
+ SilentAsarFallbackError,
62
67
  TempVault,
68
+ checkAsarFallback,
63
69
  checkElectronCompatibility,
64
70
  checkInstallerCompatibility,
65
71
  connectToCdp,
@@ -72,4 +78,4 @@ var import_vault_registry = require("./vault-registry.cjs");
72
78
  setVaultPathResolver,
73
79
  unregisterVault
74
80
  });
75
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5janMnO1xuZXhwb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2hlY2tFbGVjdHJvbkNvbXBhdGliaWxpdHlQYXJhbXMsXG4gIEVsZWN0cm9uQ29tcGF0aWJpbGl0eSxcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5VGllclxufSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB7IGNoZWNrRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIEV2YWxJbk9ic2lkaWFuUGFyYW1zLFxuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIExpYixcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zLFxuICBXYWl0VW50aWxQYXJhbXNcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5leHBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHR5cGUgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLmNqcyc7XG5leHBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHlQYXJhbXMsXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHksXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHlUaWVyXG59IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuZXhwb3J0IHsgcmVnaXN0ZXJMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5LmNqcyc7XG5leHBvcnQgdHlwZSB7IE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5janMnO1xuZXhwb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5janMnO1xuZXhwb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkuY2pzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLDRCQUE2QjtBQUM3Qix3QkFBMEI7QUFLMUIsOEJBR087QUFNUCxvQ0FBMkM7QUFXM0MsOEJBQStCO0FBRS9CLGtEQUFrRDtBQU1sRCxxQ0FBNEM7QUFFNUMsMEJBQW9DO0FBRXBDLCtCQUFtQztBQUNuQyxpREFBZ0Q7QUFLaEQsd0JBQTBCO0FBSzFCLDhCQUFnQztBQU1oQyxtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBVTNDLDRCQUdPOyIsCiAgIm5hbWVzIjogW10KfQo=
81
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIENoZWNrQXNhckZhbGxiYWNrUGFyYW1zXG59IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24uY2pzJztcbmV4cG9ydCB7IGNoZWNrQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5janMnO1xuZXhwb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2hlY2tFbGVjdHJvbkNvbXBhdGliaWxpdHlQYXJhbXMsXG4gIEVsZWN0cm9uQ29tcGF0aWJpbGl0eSxcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5VGllclxufSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB7IGNoZWNrRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIEV2YWxJbk9ic2lkaWFuUGFyYW1zLFxuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIExpYixcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zLFxuICBXYWl0VW50aWxQYXJhbXNcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5leHBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHR5cGUgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLmNqcyc7XG5leHBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5janMnO1xuZXhwb3J0IHR5cGUge1xuICBDaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHlQYXJhbXMsXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHksXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHlUaWVyXG59IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmV4cG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuZXhwb3J0IHsgcmVnaXN0ZXJMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5LmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUnVudGltZVZlcnNpb25zLFxuICBPYnNpZGlhblZlcnNpb25Eb3dubG9hZHMsXG4gIE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhXG59IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmV4cG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmV4cG9ydCB7IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfSBmcm9tICcuL3JlbmRlcmVyLWZhaWxlZC10by1pbml0aWFsaXplLWVycm9yLmNqcyc7XG5leHBvcnQgdHlwZSB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLmNqcyc7XG5leHBvcnQgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciB9IGZyb20gJy4vc2lsZW50LWFzYXItZmFsbGJhY2stZXJyb3IuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkuY2pzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxxQ0FBa0M7QUFLbEMsNEJBQTZCO0FBQzdCLHdCQUEwQjtBQUsxQiw4QkFHTztBQU1QLG9DQUEyQztBQVczQyw4QkFBK0I7QUFFL0Isa0RBQWtEO0FBTWxELHFDQUE0QztBQUU1QywwQkFBb0M7QUFNcEMsK0JBQW1DO0FBQ25DLGlEQUFnRDtBQUVoRCx3Q0FBd0M7QUFLeEMsd0JBQTBCO0FBSzFCLDhCQUFnQztBQU1oQyxtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBVTNDLDRCQUdPOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -3,6 +3,8 @@
3
3
  *
4
4
  * Contains the entry point for the integration testing module.
5
5
  */
6
+ export type { AsarFallback, AsarFallbackTier, CheckAsarFallbackParams } from './asar-fallback-detection.cjs';
7
+ export { checkAsarFallback } from './asar-fallback-detection.cjs';
6
8
  export type { CdpConnection, ConnectToCdpOptions } from './connect-to-cdp.cjs';
7
9
  export { connectToCdp } from './connect-to-cdp.cjs';
8
10
  export { ContextId } from './context-id.cjs';
@@ -18,9 +20,11 @@ export type { CheckInstallerCompatibilityParams, InstallerCompatibility, Install
18
20
  export { checkInstallerCompatibility } from './installer-compatibility.cjs';
19
21
  export type { LibResolver } from './lib-registry.cjs';
20
22
  export { registerLibResolver } from './lib-registry.cjs';
21
- export type { ObsidianVersionMetadata } from './obsidian-metadata.cjs';
23
+ export type { ObsidianRuntimeVersions, ObsidianVersionDownloads, ObsidianVersionMetadata } from './obsidian-metadata.cjs';
22
24
  export { getVersionMetadata } from './obsidian-metadata.cjs';
23
25
  export { RendererFailedToInitializeError } from './renderer-failed-to-initialize-error.cjs';
26
+ export type { SilentAsarFallbackErrorConstructorParams } from './silent-asar-fallback-error.cjs';
27
+ export { SilentAsarFallbackError } from './silent-asar-fallback-error.cjs';
24
28
  export type { PopulateFileContent, PopulateFilesParams } from './temp-vault.cjs';
25
29
  export { TempVault } from './temp-vault.cjs';
26
30
  export type { AppiumSessionInfo, AppiumTransportConfig } from './transport-appium.cjs';
@@ -19,7 +19,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var installer_asset_exports = {};
20
20
  __export(installer_asset_exports, {
21
21
  buildInstallerAssetNameCandidates: () => buildInstallerAssetNameCandidates,
22
- selectInstallerAssetName: () => selectInstallerAssetName
22
+ selectInstallerAssetName: () => selectInstallerAssetName,
23
+ selectInstallerDownloadUrl: () => selectInstallerDownloadUrl
23
24
  });
24
25
  module.exports = __toCommonJS(installer_asset_exports);
25
26
  const WINDOWS_ASSET_SHAPE = {
@@ -53,6 +54,19 @@ function selectInstallerAssetName(params) {
53
54
  const pattern = buildAssetNamePattern(getPlatformAssetShape(params.platform), params.version);
54
55
  return params.assetNames.find((name) => pattern.test(name));
55
56
  }
57
+ function selectInstallerDownloadUrl(params) {
58
+ const { downloads } = params;
59
+ if (!downloads) {
60
+ return void 0;
61
+ }
62
+ if (params.platform === "win32") {
63
+ return downloads.exe;
64
+ }
65
+ if (params.platform === "darwin") {
66
+ return downloads.dmg;
67
+ }
68
+ return downloads.tar;
69
+ }
56
70
  function buildAssetNamePattern(shape, version) {
57
71
  const infixGroup = shape.optionalInfixes.length > 0 ? `(?:${shape.optionalInfixes.map(escapeRegExp).join("|")})?` : "";
58
72
  return new RegExp(
@@ -74,6 +88,7 @@ function getPlatformAssetShape(platform) {
74
88
  // Annotate the CommonJS export names for ESM import in node:
75
89
  0 && (module.exports = {
76
90
  buildInstallerAssetNameCandidates,
77
- selectInstallerAssetName
91
+ selectInstallerAssetName,
92
+ selectInstallerDownloadUrl
78
93
  });
79
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RhbGxlci1hc3NldC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFB1cmUgaGVscGVycyBmb3IgcmVzb2x2aW5nIHdoaWNoIEdpdEh1YiByZWxlYXNlIGFzc2V0IGlzIHRoZSBkZXNrdG9wXG4gKiAqKmluc3RhbGxlcioqIGZvciBhIGdpdmVuIE9ic2lkaWFuIHZlcnNpb24gYW5kIHBsYXRmb3JtLlxuICpcbiAqIE9ic2lkaWFuIGNoYW5nZWQgaXRzIGluc3RhbGxlciBhc3NldCBuYW1pbmcgY29udmVudGlvbiBwYXJ0d2F5IHRocm91Z2ggaXRzXG4gKiBoaXN0b3J5LCBzbyBhIHZlcnNpb24gY2Fubm90IGJlIHR1cm5lZCBpbnRvIGFuIGFzc2V0IG5hbWUgYnkgc3RyaW5nXG4gKiB0ZW1wbGF0aW5nIGFsb25lOlxuICpcbiAqIC0gKipEb3QqKiBzZXBhcmF0b3Igb24gb2xkZXIgcmVsZWFzZXM6IGBPYnNpZGlhbi48dmVyPi5leGVgICh2ZXJpZmllZCAwLjE0LjVcbiAqICAgdGhyb3VnaCAxLjUuMTIpLCB3aXRoIGEgYC11bml2ZXJzYWxgIGluZml4IG9uIHRoZSBtYWNPUyBkbWdcbiAqICAgKGBPYnNpZGlhbi08dmVyPi11bml2ZXJzYWwuZG1nYCkuXG4gKiAtICoqSHlwaGVuKiogc2VwYXJhdG9yIG9uIG5ld2VyIHJlbGVhc2VzOiBgT2JzaWRpYW4tPHZlcj4uZXhlYCxcbiAqICAgYE9ic2lkaWFuLTx2ZXI+LmRtZ2AgKHZlcmlmaWVkIDEuNi43IG9ud2FyZDsgdGhlIHRyYW5zaXRpb24gaXMgYXJvdW5kIDEuNi4wKS5cbiAqXG4gKiBUaGUgaW50ZWdyYXRpb24tdGltZSBkb3dubG9hZGVyIChgb2JzaWRpYW4taW5zdGFsbGVyLnRzYCkgcXVlcmllcyB0aGVcbiAqIHJlbGVhc2UncyByZWFsIGFzc2V0IGxpc3QgYW5kIHBpY2tzIHRoZSBwbGF0Zm9ybS1jb3JyZWN0IG9uZSB3aXRoXG4gKiB7QGxpbmsgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lfTsgaWYgdGhhdCBuZXR3b3JrIGNhbGwgaXMgdW5hdmFpbGFibGUgaXRcbiAqIGZhbGxzIGJhY2sgdG8gdHJ5aW5nIGV2ZXJ5IHtAbGluayBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXN9IGZvcm0uXG4gKiBCb3RoIGhlbHBlcnMgYXJlIHB1cmUgc28gdGhlIHNlcGFyYXRvci9hcmNoIG1hdHJpeCBzdGF5cyB1bml0LXRlc3RlZCAodGhlXG4gKiBkb3dubG9hZGVyIGl0c2VsZiBuZWVkcyB0aGUgbmV0d29yayBhbmQgaXMgZXhjbHVkZWQgZnJvbSB1bml0IHRlc3RzKS5cbiAqXG4gKiBPbmx5IHRoZSB4NjQgaW5zdGFsbGVyIGlzIHJlc29sdmVkIFx1MjAxNCB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIHg2NC1vbmx5IFx1MjAxNCBzbyB0aGVcbiAqIDMyLWJpdCAvIGFybTY0IC8gYWxsLXVzZXJzIHNpYmxpbmcgYXNzZXRzIGFyZSBkZWxpYmVyYXRlbHkgcmVqZWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgc2hhcGUgb2YgYW4gT2JzaWRpYW4gaW5zdGFsbGVyIGFzc2V0IG5hbWUuXG4gKi9cbmludGVyZmFjZSBQbGF0Zm9ybUluc3RhbGxlckFzc2V0U2hhcGUge1xuICAvKiogTGVhZGluZyB0b2tlbiBvZiB0aGUgYXNzZXQgbmFtZTogYE9ic2lkaWFuYCAoV2luZG93cy9tYWNPUykgb3IgYG9ic2lkaWFuYCAoTGludXgpLiAqL1xuICByZWFkb25seSBiYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBGaWxlIGV4dGVuc2lvbiB3aXRob3V0IHRoZSBsZWFkaW5nIGRvdCwgZS5nLiBgZXhlYCwgYGRtZ2AsIGB0YXIuZ3pgLiAqL1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogSW5maXhlcyBwZXJtaXR0ZWQgYmV0d2VlbiB0aGUgdmVyc2lvbiBhbmQgdGhlIGV4dGVuc2lvbiBmb3IgdGhlIHByaW1hcnlcbiAgICogKG5vbi1hcmNoKSBhc3NldCwgZS5nLiBgLXVuaXZlcnNhbGAgb24gdGhlIG9sZGVyIG1hY09TIGRtZy4gQW4gZW1wdHkgYXJyYXlcbiAgICogbWVhbnMgdGhlIHZlcnNpb24gaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIGV4dGVuc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsSW5maXhlczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmNvbnN0IFdJTkRPV1NfQVNTRVRfU0hBUEU6IFBsYXRmb3JtSW5zdGFsbGVyQXNzZXRTaGFwZSA9IHtcbiAgYmFzZU5hbWU6ICdPYnNpZGlhbicsXG4gIGV4dGVuc2lvbjogJ2V4ZScsXG4gIG9wdGlvbmFsSW5maXhlczogW11cbn07XG5cbmNvbnN0IE1BQ19BU1NFVF9TSEFQRTogUGxhdGZvcm1JbnN0YWxsZXJBc3NldFNoYXBlID0ge1xuICBiYXNlTmFtZTogJ09ic2lkaWFuJyxcbiAgZXh0ZW5zaW9uOiAnZG1nJyxcbiAgb3B0aW9uYWxJbmZpeGVzOiBbJy11bml2ZXJzYWwnXVxufTtcblxuY29uc3QgTElOVVhfQVNTRVRfU0hBUEU6IFBsYXRmb3JtSW5zdGFsbGVyQXNzZXRTaGFwZSA9IHtcbiAgYmFzZU5hbWU6ICdvYnNpZGlhbicsXG4gIGV4dGVuc2lvbjogJ3Rhci5neicsXG4gIG9wdGlvbmFsSW5maXhlczogW11cbn07XG5cbi8qKiBTZXBhcmF0b3IgZm9ybXMgdHJpZWQsIGh5cGhlbiAobmV3ZXIpIGZpcnN0LCB3aGVuIGZhbGxpbmcgYmFjayB0byB0ZW1wbGF0ZWQgbmFtZXMuICovXG5jb25zdCBBU1NFVF9OQU1FX1NFUEFSQVRPUlMgPSBbJy0nLCAnLiddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkSW5zdGFsbGVyQXNzZXROYW1lQ2FuZGlkYXRlc1BhcmFtcyB7XG4gIC8qKiBUaGUgcGxhdGZvcm0gdG8gYnVpbGQgY2FuZGlkYXRlIG5hbWVzIGZvci4gKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybTtcblxuICAvKiogVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzZWxlY3RJbnN0YWxsZXJBc3NldE5hbWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEluc3RhbGxlckFzc2V0TmFtZVBhcmFtcyB7XG4gIC8qKiBUaGUgcmVsZWFzZSdzIGFzc2V0IG5hbWVzIChlLmcuIGZyb20gdGhlIEdpdEh1YiByZWxlYXNlIEFQSSkuICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgcGxhdGZvcm0gd2hvc2UgaW5zdGFsbGVyIGFzc2V0IHRvIHNlbGVjdC4gKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybTtcblxuICAvKiogVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZmFsbGJhY2sgbGlzdCBvZiBpbnN0YWxsZXIgYXNzZXQgbmFtZXMgdG8gdHJ5IHdoZW4gdGhlIHJlbGVhc2Unc1xuICogcmVhbCBhc3NldCBsaXN0IGNhbm5vdCBiZSBmZXRjaGVkLCBjb3ZlcmluZyBib3RoIHNlcGFyYXRvciBmb3JtcyAoYW5kLCBvblxuICogbWFjT1MsIHRoZSBgLXVuaXZlcnNhbGAgaW5maXgpLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGxhdGZvcm0gYW5kIHZlcnNpb24uXG4gKiBAcmV0dXJucyBDYW5kaWRhdGUgYXNzZXQgbmFtZXMsIGh5cGhlbi1zZXBhcmF0ZWQgZm9ybXMgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXMocGFyYW1zOiBCdWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNoYXBlID0gZ2V0UGxhdGZvcm1Bc3NldFNoYXBlKHBhcmFtcy5wbGF0Zm9ybSk7XG4gIGNvbnN0IGluZml4ZXMgPSBzaGFwZS5vcHRpb25hbEluZml4ZXMubGVuZ3RoID4gMCA/IFsnJywgLi4uc2hhcGUub3B0aW9uYWxJbmZpeGVzXSA6IFsnJ107XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgc2VwYXJhdG9yIG9mIEFTU0VUX05BTUVfU0VQQVJBVE9SUykge1xuICAgIGZvciAoY29uc3QgaW5maXggb2YgaW5maXhlcykge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKGAke3NoYXBlLmJhc2VOYW1lfSR7c2VwYXJhdG9yfSR7cGFyYW1zLnZlcnNpb259JHtpbmZpeH0uJHtzaGFwZS5leHRlbnNpb259YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIHBsYXRmb3JtLWNvcnJlY3QgeDY0IGluc3RhbGxlciBhc3NldCBuYW1lIGZyb20gYSByZWxlYXNlJ3MgYXNzZXRcbiAqIGxpc3QsIHRvbGVyYXRpbmcgYm90aCB0aGUgZG90LSBhbmQgaHlwaGVuLXNlcGFyYXRlZCBuYW1pbmcgY29udmVudGlvbnMgYW5kXG4gKiByZWplY3RpbmcgdGhlIDMyLWJpdCAvIGFybTY0IC8gYWxsLXVzZXJzIHNpYmxpbmcgYXNzZXRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYXNzZXQgbGlzdCwgcGxhdGZvcm0sIGFuZCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGFzc2V0IG5hbWUsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUgbWF0Y2hlcyAoZS5nLiBhXG4gKiAgIGNhdGFseXN0IHJlbGVhc2UgdGhhdCBzaGlwcyBubyBpbnN0YWxsZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lKHBhcmFtczogU2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF0dGVybiA9IGJ1aWxkQXNzZXROYW1lUGF0dGVybihnZXRQbGF0Zm9ybUFzc2V0U2hhcGUocGFyYW1zLnBsYXRmb3JtKSwgcGFyYW1zLnZlcnNpb24pO1xuICByZXR1cm4gcGFyYW1zLmFzc2V0TmFtZXMuZmluZCgobmFtZSkgPT4gcGF0dGVybi50ZXN0KG5hbWUpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gYW5jaG9yZWQgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIHRoZSBwcmltYXJ5IGluc3RhbGxlciBhc3NldFxuICogZm9yIGEgcGxhdGZvcm0gc2hhcGUgYW5kIHZlcnNpb24sIGFjcm9zcyBib3RoIHNlcGFyYXRvciBjb252ZW50aW9ucy5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgLSBUaGUgcGxhdGZvcm0gYXNzZXQgc2hhcGUuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgcGF0dGVybi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRBc3NldE5hbWVQYXR0ZXJuKHNoYXBlOiBQbGF0Zm9ybUluc3RhbGxlckFzc2V0U2hhcGUsIHZlcnNpb246IHN0cmluZyk6IFJlZ0V4cCB7XG4gIGNvbnN0IGluZml4R3JvdXAgPSBzaGFwZS5vcHRpb25hbEluZml4ZXMubGVuZ3RoID4gMFxuICAgID8gYCg/OiR7c2hhcGUub3B0aW9uYWxJbmZpeGVzLm1hcChlc2NhcGVSZWdFeHApLmpvaW4oJ3wnKX0pP2BcbiAgICA6ICcnO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBgXiR7ZXNjYXBlUmVnRXhwKHNoYXBlLmJhc2VOYW1lKX1bLi1dJHtlc2NhcGVSZWdFeHAodmVyc2lvbil9JHtpbmZpeEdyb3VwfVxcXFwuJHtlc2NhcGVSZWdFeHAoc2hhcGUuZXh0ZW5zaW9uKX0kYFxuICApO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgYSBzdHJpbmcgZm9yIGxpdGVyYWwgdXNlIGluc2lkZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmF3IHN0cmluZy5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgaW5zdGFsbGVyIGFzc2V0IHNoYXBlIGZvciBhIHBsYXRmb3JtLlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybSAtIFRoZSBOb2RlLmpzIHBsYXRmb3JtIGlkZW50aWZpZXIuXG4gKiBAcmV0dXJucyBUaGUgYXNzZXQgc2hhcGUgKExpbnV4IGAudGFyLmd6YCBmb3IgYW55IG5vbi1XaW5kb3dzL21hY09TIHBsYXRmb3JtKS5cbiAqL1xuZnVuY3Rpb24gZ2V0UGxhdGZvcm1Bc3NldFNoYXBlKHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0pOiBQbGF0Zm9ybUluc3RhbGxlckFzc2V0U2hhcGUge1xuICBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gV0lORE9XU19BU1NFVF9TSEFQRTtcbiAgfVxuXG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gTUFDX0FTU0VUX1NIQVBFO1xuICB9XG5cbiAgcmV0dXJuIExJTlVYX0FTU0VUX1NIQVBFO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkNBLE1BQU0sc0JBQW1EO0FBQUEsRUFDdkQsVUFBVTtBQUFBLEVBQ1YsV0FBVztBQUFBLEVBQ1gsaUJBQWlCLENBQUM7QUFDcEI7QUFFQSxNQUFNLGtCQUErQztBQUFBLEVBQ25ELFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGlCQUFpQixDQUFDLFlBQVk7QUFDaEM7QUFFQSxNQUFNLG9CQUFpRDtBQUFBLEVBQ3JELFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGlCQUFpQixDQUFDO0FBQ3BCO0FBR0EsTUFBTSx3QkFBd0IsQ0FBQyxLQUFLLEdBQUc7QUFtQ2hDLFNBQVMsa0NBQWtDLFFBQTJEO0FBQzNHLFFBQU0sUUFBUSxzQkFBc0IsT0FBTyxRQUFRO0FBQ25ELFFBQU0sVUFBVSxNQUFNLGdCQUFnQixTQUFTLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxlQUFlLElBQUksQ0FBQyxFQUFFO0FBQ3ZGLFFBQU0sYUFBdUIsQ0FBQztBQUM5QixhQUFXLGFBQWEsdUJBQXVCO0FBQzdDLGVBQVcsU0FBUyxTQUFTO0FBQzNCLGlCQUFXLEtBQUssR0FBRyxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsT0FBTyxPQUFPLEdBQUcsS0FBSyxJQUFJLE1BQU0sU0FBUyxFQUFFO0FBQUEsSUFDN0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBV08sU0FBUyx5QkFBeUIsUUFBNEQ7QUFDbkcsUUFBTSxVQUFVLHNCQUFzQixzQkFBc0IsT0FBTyxRQUFRLEdBQUcsT0FBTyxPQUFPO0FBQzVGLFNBQU8sT0FBTyxXQUFXLEtBQUssQ0FBQyxTQUFTLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFDNUQ7QUFVQSxTQUFTLHNCQUFzQixPQUFvQyxTQUF5QjtBQUMxRixRQUFNLGFBQWEsTUFBTSxnQkFBZ0IsU0FBUyxJQUM5QyxNQUFNLE1BQU0sZ0JBQWdCLElBQUksWUFBWSxFQUFFLEtBQUssR0FBRyxDQUFDLE9BQ3ZEO0FBQ0osU0FBTyxJQUFJO0FBQUEsSUFDVCxJQUFJLGFBQWEsTUFBTSxRQUFRLENBQUMsT0FBTyxhQUFhLE9BQU8sQ0FBQyxHQUFHLFVBQVUsTUFBTSxhQUFhLE1BQU0sU0FBUyxDQUFDO0FBQUEsRUFDOUc7QUFDRjtBQVFBLFNBQVMsYUFBYSxPQUF1QjtBQUMzQyxTQUFPLE1BQU0sUUFBUSx1QkFBdUIsTUFBTTtBQUNwRDtBQVFBLFNBQVMsc0JBQXNCLFVBQXdEO0FBQ3JGLE1BQUksYUFBYSxTQUFTO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxhQUFhLFVBQVU7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
94
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RhbGxlci1hc3NldC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFB1cmUgaGVscGVycyBmb3IgcmVzb2x2aW5nIHdoaWNoIEdpdEh1YiByZWxlYXNlIGFzc2V0IGlzIHRoZSBkZXNrdG9wXG4gKiAqKmluc3RhbGxlcioqIGZvciBhIGdpdmVuIE9ic2lkaWFuIHZlcnNpb24gYW5kIHBsYXRmb3JtLlxuICpcbiAqIE9ic2lkaWFuIGNoYW5nZWQgaXRzIGluc3RhbGxlciBhc3NldCBuYW1pbmcgY29udmVudGlvbiBwYXJ0d2F5IHRocm91Z2ggaXRzXG4gKiBoaXN0b3J5LCBzbyBhIHZlcnNpb24gY2Fubm90IGJlIHR1cm5lZCBpbnRvIGFuIGFzc2V0IG5hbWUgYnkgc3RyaW5nXG4gKiB0ZW1wbGF0aW5nIGFsb25lOlxuICpcbiAqIC0gKipEb3QqKiBzZXBhcmF0b3Igb24gb2xkZXIgcmVsZWFzZXM6IGBPYnNpZGlhbi48dmVyPi5leGVgICh2ZXJpZmllZCAwLjE0LjVcbiAqICAgdGhyb3VnaCAxLjUuMTIpLCB3aXRoIGEgYC11bml2ZXJzYWxgIGluZml4IG9uIHRoZSBtYWNPUyBkbWdcbiAqICAgKGBPYnNpZGlhbi08dmVyPi11bml2ZXJzYWwuZG1nYCkuXG4gKiAtICoqSHlwaGVuKiogc2VwYXJhdG9yIG9uIG5ld2VyIHJlbGVhc2VzOiBgT2JzaWRpYW4tPHZlcj4uZXhlYCxcbiAqICAgYE9ic2lkaWFuLTx2ZXI+LmRtZ2AgKHZlcmlmaWVkIDEuNi43IG9ud2FyZDsgdGhlIHRyYW5zaXRpb24gaXMgYXJvdW5kIDEuNi4wKS5cbiAqXG4gKiBUaGUgaW50ZWdyYXRpb24tdGltZSBkb3dubG9hZGVyIChgb2JzaWRpYW4taW5zdGFsbGVyLnRzYCkgcXVlcmllcyB0aGVcbiAqIHJlbGVhc2UncyByZWFsIGFzc2V0IGxpc3QgYW5kIHBpY2tzIHRoZSBwbGF0Zm9ybS1jb3JyZWN0IG9uZSB3aXRoXG4gKiB7QGxpbmsgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lfTsgaWYgdGhhdCBuZXR3b3JrIGNhbGwgaXMgdW5hdmFpbGFibGUgaXRcbiAqIGZhbGxzIGJhY2sgdG8gdHJ5aW5nIGV2ZXJ5IHtAbGluayBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXN9IGZvcm0uXG4gKiBCb3RoIGhlbHBlcnMgYXJlIHB1cmUgc28gdGhlIHNlcGFyYXRvci9hcmNoIG1hdHJpeCBzdGF5cyB1bml0LXRlc3RlZCAodGhlXG4gKiBkb3dubG9hZGVyIGl0c2VsZiBuZWVkcyB0aGUgbmV0d29yayBhbmQgaXMgZXhjbHVkZWQgZnJvbSB1bml0IHRlc3RzKS5cbiAqXG4gKiBPbmx5IHRoZSB4NjQgaW5zdGFsbGVyIGlzIHJlc29sdmVkIFx1MjAxNCB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIHg2NC1vbmx5IFx1MjAxNCBzbyB0aGVcbiAqIDMyLWJpdCAvIGFybTY0IC8gYWxsLXVzZXJzIHNpYmxpbmcgYXNzZXRzIGFyZSBkZWxpYmVyYXRlbHkgcmVqZWN0ZWQuXG4gKlxuICogV2hlbiB0aGUgdmVyc2lvbiBpcyBwcmVzZW50IGluIHRoZSBiYWtlZCBgbWV0YWRhdGEuanNvbmAgY2F0YWxvZyAoZnJvbVxuICogdXBzdHJlYW0gYG9ic2lkaWFuLXZlcnNpb25zLmpzb25gKSwgaXRzIGV4YWN0IGluc3RhbGxlciBVUkwgaXMgYWxyZWFkeSBrbm93bjtcbiAqIHtAbGluayBzZWxlY3RJbnN0YWxsZXJEb3dubG9hZFVybH0gcGlja3MgdGhlIHBsYXRmb3JtLWNvcnJlY3Qgb25lIGFuZCB0aGVcbiAqIGRvd25sb2FkZXIgdXNlcyBpdCBkaXJlY3RseSwgc2tpcHBpbmcgdGhlIHJlbGVhc2UtQVBJIGxvb2t1cCBhbmQgdGhlXG4gKiBuYW1lLXRlbXBsYXRpbmcgZmFsbGJhY2sgZW50aXJlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblZlcnNpb25Eb3dubG9hZHMgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5cbi8qKlxuICogVGhlIHBsYXRmb3JtLXNwZWNpZmljIHNoYXBlIG9mIGFuIE9ic2lkaWFuIGluc3RhbGxlciBhc3NldCBuYW1lLlxuICovXG5pbnRlcmZhY2UgUGxhdGZvcm1JbnN0YWxsZXJBc3NldFNoYXBlIHtcbiAgLyoqIExlYWRpbmcgdG9rZW4gb2YgdGhlIGFzc2V0IG5hbWU6IGBPYnNpZGlhbmAgKFdpbmRvd3MvbWFjT1MpIG9yIGBvYnNpZGlhbmAgKExpbnV4KS4gKi9cbiAgcmVhZG9ubHkgYmFzZU5hbWU6IHN0cmluZztcblxuICAvKiogRmlsZSBleHRlbnNpb24gd2l0aG91dCB0aGUgbGVhZGluZyBkb3QsIGUuZy4gYGV4ZWAsIGBkbWdgLCBgdGFyLmd6YC4gKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZml4ZXMgcGVybWl0dGVkIGJldHdlZW4gdGhlIHZlcnNpb24gYW5kIHRoZSBleHRlbnNpb24gZm9yIHRoZSBwcmltYXJ5XG4gICAqIChub24tYXJjaCkgYXNzZXQsIGUuZy4gYC11bml2ZXJzYWxgIG9uIHRoZSBvbGRlciBtYWNPUyBkbWcuIEFuIGVtcHR5IGFycmF5XG4gICAqIG1lYW5zIHRoZSB2ZXJzaW9uIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBleHRlbnNpb24uXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbEluZml4ZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5jb25zdCBXSU5ET1dTX0FTU0VUX1NIQVBFOiBQbGF0Zm9ybUluc3RhbGxlckFzc2V0U2hhcGUgPSB7XG4gIGJhc2VOYW1lOiAnT2JzaWRpYW4nLFxuICBleHRlbnNpb246ICdleGUnLFxuICBvcHRpb25hbEluZml4ZXM6IFtdXG59O1xuXG5jb25zdCBNQUNfQVNTRVRfU0hBUEU6IFBsYXRmb3JtSW5zdGFsbGVyQXNzZXRTaGFwZSA9IHtcbiAgYmFzZU5hbWU6ICdPYnNpZGlhbicsXG4gIGV4dGVuc2lvbjogJ2RtZycsXG4gIG9wdGlvbmFsSW5maXhlczogWyctdW5pdmVyc2FsJ11cbn07XG5cbmNvbnN0IExJTlVYX0FTU0VUX1NIQVBFOiBQbGF0Zm9ybUluc3RhbGxlckFzc2V0U2hhcGUgPSB7XG4gIGJhc2VOYW1lOiAnb2JzaWRpYW4nLFxuICBleHRlbnNpb246ICd0YXIuZ3onLFxuICBvcHRpb25hbEluZml4ZXM6IFtdXG59O1xuXG4vKiogU2VwYXJhdG9yIGZvcm1zIHRyaWVkLCBoeXBoZW4gKG5ld2VyKSBmaXJzdCwgd2hlbiBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIG5hbWVzLiAqL1xuY29uc3QgQVNTRVRfTkFNRV9TRVBBUkFUT1JTID0gWyctJywgJy4nXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRJbnN0YWxsZXJBc3NldE5hbWVDYW5kaWRhdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXNQYXJhbXMge1xuICAvKiogVGhlIHBsYXRmb3JtIHRvIGJ1aWxkIGNhbmRpZGF0ZSBuYW1lcyBmb3IuICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm07XG5cbiAgLyoqIFRoZSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RJbnN0YWxsZXJBc3NldE5hbWVQYXJhbXMge1xuICAvKiogVGhlIHJlbGVhc2UncyBhc3NldCBuYW1lcyAoZS5nLiBmcm9tIHRoZSBHaXRIdWIgcmVsZWFzZSBBUEkpLiAqL1xuICByZWFkb25seSBhc3NldE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIHBsYXRmb3JtIHdob3NlIGluc3RhbGxlciBhc3NldCB0byBzZWxlY3QuICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm07XG5cbiAgLyoqIFRoZSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2VsZWN0SW5zdGFsbGVyRG93bmxvYWRVcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEluc3RhbGxlckRvd25sb2FkVXJsUGFyYW1zIHtcbiAgLyoqIFRoZSB2ZXJzaW9uJ3MgYmFrZWQgZG93bmxvYWQgVVJMcywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBhYnNlbnQgZnJvbSB0aGUgY2F0YWxvZy4gKi9cbiAgcmVhZG9ubHkgZG93bmxvYWRzOiBPYnNpZGlhblZlcnNpb25Eb3dubG9hZHMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBwbGF0Zm9ybSB3aG9zZSBpbnN0YWxsZXIgVVJMIHRvIHNlbGVjdC4gKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGZhbGxiYWNrIGxpc3Qgb2YgaW5zdGFsbGVyIGFzc2V0IG5hbWVzIHRvIHRyeSB3aGVuIHRoZSByZWxlYXNlJ3NcbiAqIHJlYWwgYXNzZXQgbGlzdCBjYW5ub3QgYmUgZmV0Y2hlZCwgY292ZXJpbmcgYm90aCBzZXBhcmF0b3IgZm9ybXMgKGFuZCwgb25cbiAqIG1hY09TLCB0aGUgYC11bml2ZXJzYWxgIGluZml4KS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBsYXRmb3JtIGFuZCB2ZXJzaW9uLlxuICogQHJldHVybnMgQ2FuZGlkYXRlIGFzc2V0IG5hbWVzLCBoeXBoZW4tc2VwYXJhdGVkIGZvcm1zIGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRJbnN0YWxsZXJBc3NldE5hbWVDYW5kaWRhdGVzKHBhcmFtczogQnVpbGRJbnN0YWxsZXJBc3NldE5hbWVDYW5kaWRhdGVzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBzaGFwZSA9IGdldFBsYXRmb3JtQXNzZXRTaGFwZShwYXJhbXMucGxhdGZvcm0pO1xuICBjb25zdCBpbmZpeGVzID0gc2hhcGUub3B0aW9uYWxJbmZpeGVzLmxlbmd0aCA+IDAgPyBbJycsIC4uLnNoYXBlLm9wdGlvbmFsSW5maXhlc10gOiBbJyddO1xuICBjb25zdCBjYW5kaWRhdGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlcGFyYXRvciBvZiBBU1NFVF9OQU1FX1NFUEFSQVRPUlMpIHtcbiAgICBmb3IgKGNvbnN0IGluZml4IG9mIGluZml4ZXMpIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaChgJHtzaGFwZS5iYXNlTmFtZX0ke3NlcGFyYXRvcn0ke3BhcmFtcy52ZXJzaW9ufSR7aW5maXh9LiR7c2hhcGUuZXh0ZW5zaW9ufWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBwbGF0Zm9ybS1jb3JyZWN0IHg2NCBpbnN0YWxsZXIgYXNzZXQgbmFtZSBmcm9tIGEgcmVsZWFzZSdzIGFzc2V0XG4gKiBsaXN0LCB0b2xlcmF0aW5nIGJvdGggdGhlIGRvdC0gYW5kIGh5cGhlbi1zZXBhcmF0ZWQgbmFtaW5nIGNvbnZlbnRpb25zIGFuZFxuICogcmVqZWN0aW5nIHRoZSAzMi1iaXQgLyBhcm02NCAvIGFsbC11c2VycyBzaWJsaW5nIGFzc2V0cy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGFzc2V0IGxpc3QsIHBsYXRmb3JtLCBhbmQgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBhc3NldCBuYW1lLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIG1hdGNoZXMgKGUuZy4gYVxuICogICBjYXRhbHlzdCByZWxlYXNlIHRoYXQgc2hpcHMgbm8gaW5zdGFsbGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluc3RhbGxlckFzc2V0TmFtZShwYXJhbXM6IFNlbGVjdEluc3RhbGxlckFzc2V0TmFtZVBhcmFtcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdHRlcm4gPSBidWlsZEFzc2V0TmFtZVBhdHRlcm4oZ2V0UGxhdGZvcm1Bc3NldFNoYXBlKHBhcmFtcy5wbGF0Zm9ybSksIHBhcmFtcy52ZXJzaW9uKTtcbiAgcmV0dXJuIHBhcmFtcy5hc3NldE5hbWVzLmZpbmQoKG5hbWUpID0+IHBhdHRlcm4udGVzdChuYW1lKSk7XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgcGxhdGZvcm0tY29ycmVjdCB4NjQgaW5zdGFsbGVyIGRvd25sb2FkIFVSTCBmcm9tIGEgdmVyc2lvbidzXG4gKiBiYWtlZCBjYXRhbG9nIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYmFrZWQgZG93bmxvYWQgVVJMcyBhbmQgdGhlIHBsYXRmb3JtLlxuICogQHJldHVybnMgVGhlIGluc3RhbGxlciBVUkwgZm9yIHRoZSBwbGF0Zm9ybSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdmVyc2lvblxuICogICBoYXMgbm8gY2F0YWxvZyBlbnRyeSBvciBzaGlwcyBubyBkZXNrdG9wIGluc3RhbGxlciBmb3IgaXQgKGUuZy4gYSBjYXRhbHlzdFxuICogICBidWlsZCwgb3IgYSBMaW51eCBgLnRhci5nemAgdGhhdCB3YXMgbmV2ZXIgcHVibGlzaGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluc3RhbGxlckRvd25sb2FkVXJsKHBhcmFtczogU2VsZWN0SW5zdGFsbGVyRG93bmxvYWRVcmxQYXJhbXMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGRvd25sb2FkcyB9ID0gcGFyYW1zO1xuICBpZiAoIWRvd25sb2Fkcykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAocGFyYW1zLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGRvd25sb2Fkcy5leGU7XG4gIH1cblxuICBpZiAocGFyYW1zLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBkb3dubG9hZHMuZG1nO1xuICB9XG5cbiAgcmV0dXJuIGRvd25sb2Fkcy50YXI7XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGFuY2hvcmVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyB0aGUgcHJpbWFyeSBpbnN0YWxsZXIgYXNzZXRcbiAqIGZvciBhIHBsYXRmb3JtIHNoYXBlIGFuZCB2ZXJzaW9uLCBhY3Jvc3MgYm90aCBzZXBhcmF0b3IgY29udmVudGlvbnMuXG4gKlxuICogQHBhcmFtIHNoYXBlIC0gVGhlIHBsYXRmb3JtIGFzc2V0IHNoYXBlLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIG1hdGNoaW5nIHBhdHRlcm4uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQXNzZXROYW1lUGF0dGVybihzaGFwZTogUGxhdGZvcm1JbnN0YWxsZXJBc3NldFNoYXBlLCB2ZXJzaW9uOiBzdHJpbmcpOiBSZWdFeHAge1xuICBjb25zdCBpbmZpeEdyb3VwID0gc2hhcGUub3B0aW9uYWxJbmZpeGVzLmxlbmd0aCA+IDBcbiAgICA/IGAoPzoke3NoYXBlLm9wdGlvbmFsSW5maXhlcy5tYXAoZXNjYXBlUmVnRXhwKS5qb2luKCd8Jyl9KT9gXG4gICAgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgYF4ke2VzY2FwZVJlZ0V4cChzaGFwZS5iYXNlTmFtZSl9Wy4tXSR7ZXNjYXBlUmVnRXhwKHZlcnNpb24pfSR7aW5maXhHcm91cH1cXFxcLiR7ZXNjYXBlUmVnRXhwKHNoYXBlLmV4dGVuc2lvbil9JGBcbiAgKTtcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEgc3RyaW5nIGZvciBsaXRlcmFsIHVzZSBpbnNpZGUgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHJhdyBzdHJpbmcuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGluc3RhbGxlciBhc3NldCBzaGFwZSBmb3IgYSBwbGF0Zm9ybS5cbiAqXG4gKiBAcGFyYW0gcGxhdGZvcm0gLSBUaGUgTm9kZS5qcyBwbGF0Zm9ybSBpZGVudGlmaWVyLlxuICogQHJldHVybnMgVGhlIGFzc2V0IHNoYXBlIChMaW51eCBgLnRhci5nemAgZm9yIGFueSBub24tV2luZG93cy9tYWNPUyBwbGF0Zm9ybSkuXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtQXNzZXRTaGFwZShwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtKTogUGxhdGZvcm1JbnN0YWxsZXJBc3NldFNoYXBlIHtcbiAgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIFdJTkRPV1NfQVNTRVRfU0hBUEU7XG4gIH1cblxuICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIE1BQ19BU1NFVF9TSEFQRTtcbiAgfVxuXG4gIHJldHVybiBMSU5VWF9BU1NFVF9TSEFQRTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcURBLE1BQU0sc0JBQW1EO0FBQUEsRUFDdkQsVUFBVTtBQUFBLEVBQ1YsV0FBVztBQUFBLEVBQ1gsaUJBQWlCLENBQUM7QUFDcEI7QUFFQSxNQUFNLGtCQUErQztBQUFBLEVBQ25ELFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGlCQUFpQixDQUFDLFlBQVk7QUFDaEM7QUFFQSxNQUFNLG9CQUFpRDtBQUFBLEVBQ3JELFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGlCQUFpQixDQUFDO0FBQ3BCO0FBR0EsTUFBTSx3QkFBd0IsQ0FBQyxLQUFLLEdBQUc7QUE4Q2hDLFNBQVMsa0NBQWtDLFFBQTJEO0FBQzNHLFFBQU0sUUFBUSxzQkFBc0IsT0FBTyxRQUFRO0FBQ25ELFFBQU0sVUFBVSxNQUFNLGdCQUFnQixTQUFTLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxlQUFlLElBQUksQ0FBQyxFQUFFO0FBQ3ZGLFFBQU0sYUFBdUIsQ0FBQztBQUM5QixhQUFXLGFBQWEsdUJBQXVCO0FBQzdDLGVBQVcsU0FBUyxTQUFTO0FBQzNCLGlCQUFXLEtBQUssR0FBRyxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsT0FBTyxPQUFPLEdBQUcsS0FBSyxJQUFJLE1BQU0sU0FBUyxFQUFFO0FBQUEsSUFDN0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBV08sU0FBUyx5QkFBeUIsUUFBNEQ7QUFDbkcsUUFBTSxVQUFVLHNCQUFzQixzQkFBc0IsT0FBTyxRQUFRLEdBQUcsT0FBTyxPQUFPO0FBQzVGLFNBQU8sT0FBTyxXQUFXLEtBQUssQ0FBQyxTQUFTLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFDNUQ7QUFXTyxTQUFTLDJCQUEyQixRQUE4RDtBQUN2RyxRQUFNLEVBQUUsVUFBVSxJQUFJO0FBQ3RCLE1BQUksQ0FBQyxXQUFXO0FBQ2QsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLE9BQU8sYUFBYSxTQUFTO0FBQy9CLFdBQU8sVUFBVTtBQUFBLEVBQ25CO0FBRUEsTUFBSSxPQUFPLGFBQWEsVUFBVTtBQUNoQyxXQUFPLFVBQVU7QUFBQSxFQUNuQjtBQUVBLFNBQU8sVUFBVTtBQUNuQjtBQVVBLFNBQVMsc0JBQXNCLE9BQW9DLFNBQXlCO0FBQzFGLFFBQU0sYUFBYSxNQUFNLGdCQUFnQixTQUFTLElBQzlDLE1BQU0sTUFBTSxnQkFBZ0IsSUFBSSxZQUFZLEVBQUUsS0FBSyxHQUFHLENBQUMsT0FDdkQ7QUFDSixTQUFPLElBQUk7QUFBQSxJQUNULElBQUksYUFBYSxNQUFNLFFBQVEsQ0FBQyxPQUFPLGFBQWEsT0FBTyxDQUFDLEdBQUcsVUFBVSxNQUFNLGFBQWEsTUFBTSxTQUFTLENBQUM7QUFBQSxFQUM5RztBQUNGO0FBUUEsU0FBUyxhQUFhLE9BQXVCO0FBQzNDLFNBQU8sTUFBTSxRQUFRLHVCQUF1QixNQUFNO0FBQ3BEO0FBUUEsU0FBUyxzQkFBc0IsVUFBd0Q7QUFDckYsTUFBSSxhQUFhLFNBQVM7QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGFBQWEsVUFBVTtBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -23,7 +23,14 @@
23
23
  *
24
24
  * Only the x64 installer is resolved — the extraction path is x64-only — so the
25
25
  * 32-bit / arm64 / all-users sibling assets are deliberately rejected.
26
+ *
27
+ * When the version is present in the baked `metadata.json` catalog (from
28
+ * upstream `obsidian-versions.json`), its exact installer URL is already known;
29
+ * {@link selectInstallerDownloadUrl} picks the platform-correct one and the
30
+ * downloader uses it directly, skipping the release-API lookup and the
31
+ * name-templating fallback entirely.
26
32
  */
33
+ import type { ObsidianVersionDownloads } from './obsidian-metadata.cjs';
27
34
  /**
28
35
  * Parameters for {@link buildInstallerAssetNameCandidates}.
29
36
  */
@@ -44,6 +51,15 @@ export interface SelectInstallerAssetNameParams {
44
51
  /** The concrete `x.y.z` version. */
45
52
  readonly version: string;
46
53
  }
54
+ /**
55
+ * Parameters for {@link selectInstallerDownloadUrl}.
56
+ */
57
+ export interface SelectInstallerDownloadUrlParams {
58
+ /** The version's baked download URLs, or `undefined` when it is absent from the catalog. */
59
+ readonly downloads: ObsidianVersionDownloads | undefined;
60
+ /** The platform whose installer URL to select. */
61
+ readonly platform: NodeJS.Platform;
62
+ }
47
63
  /**
48
64
  * Builds the fallback list of installer asset names to try when the release's
49
65
  * real asset list cannot be fetched, covering both separator forms (and, on
@@ -63,3 +79,13 @@ export declare function buildInstallerAssetNameCandidates(params: BuildInstaller
63
79
  * catalyst release that ships no installer).
64
80
  */
65
81
  export declare function selectInstallerAssetName(params: SelectInstallerAssetNameParams): string | undefined;
82
+ /**
83
+ * Selects the platform-correct x64 installer download URL from a version's
84
+ * baked catalog entry.
85
+ *
86
+ * @param params - The baked download URLs and the platform.
87
+ * @returns The installer URL for the platform, or `undefined` when the version
88
+ * has no catalog entry or ships no desktop installer for it (e.g. a catalyst
89
+ * build, or a Linux `.tar.gz` that was never published).
90
+ */
91
+ export declare function selectInstallerDownloadUrl(params: SelectInstallerDownloadUrlParams): string | undefined;
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "8.2.1";
24
+ const LIBRARY_VERSION = false ? "dev" : "8.3.0";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -53,6 +53,7 @@ function bootstrapNamespace(bootstrapParams) {
53
53
  const holder = window;
54
54
  const existingContexts = holder.__obsidianIntegrationTesting?.contexts ?? {};
55
55
  const existingObsidianModule = holder.__obsidianIntegrationTesting?.obsidianModule;
56
+ let hasWarnedMissingObsidianModule = false;
56
57
  const ns = {
57
58
  get app() {
58
59
  return window.app;
@@ -75,11 +76,20 @@ function bootstrapNamespace(bootstrapParams) {
75
76
  return errorToStringImpl(error);
76
77
  },
77
78
  async evalWrapper(params) {
78
- if (!this.app.plugins.isEnabled()) {
79
+ const plugins = this.app.plugins;
80
+ if (plugins.isEnabled && !plugins.isEnabled()) {
79
81
  await this.app.plugins.setEnable(true);
80
82
  }
81
83
  const obsidianModule = await this.getObsidianModule();
82
- const context = params.contextId ? this.contexts[params.contextId] ??= {} : {};
84
+ let context = {};
85
+ if (params.contextId) {
86
+ const existingContext = this.contexts[params.contextId];
87
+ if (existingContext) {
88
+ context = existingContext;
89
+ } else {
90
+ this.contexts[params.contextId] = context;
91
+ }
92
+ }
83
93
  const lib = { hoverElement, moveMouse, pressKey, typeIntoEditor, unhoverElement, waitUntil };
84
94
  for (const resolveLib of this.libResolvers) {
85
95
  Object.assign(lib, resolveLib());
@@ -99,10 +109,20 @@ function bootstrapNamespace(bootstrapParams) {
99
109
  if (this.obsidianModule) {
100
110
  return this.obsidianModule;
101
111
  }
112
+ const plugins = this.app.plugins;
113
+ if (!plugins.loadPlugin || !plugins.manifests) {
114
+ if (!hasWarnedMissingObsidianModule) {
115
+ hasWarnedMissingObsidianModule = true;
116
+ console.warn("[obsidian-integration-testing] `obsidianModule` is `null`: this Obsidian version predates the community-plugin API (added in 0.9.7), so the `obsidian` module cannot be resolved. App-only closures (`fn({ app })`) still work.");
117
+ }
118
+ return null;
119
+ }
102
120
  const SLICE_START = 2;
103
121
  const randomSuffix = String(Math.random()).slice(SLICE_START);
104
122
  const tempModuleName = `get-obsidian-module-${randomSuffix}`;
105
- const dir = `${this.app.vault.configDir}/plugins/${tempModuleName}`;
123
+ const configDir = this.app.vault.configDir ?? ".obsidian";
124
+ const pluginsDir = `${configDir}/plugins`;
125
+ const dir = `${pluginsDir}/${tempModuleName}`;
106
126
  this.app.plugins.manifests[tempModuleName] = {
107
127
  author: "",
108
128
  description: "",
@@ -113,11 +133,20 @@ function bootstrapNamespace(bootstrapParams) {
113
133
  name: tempModuleName,
114
134
  version: ""
115
135
  };
136
+ if (!await this.app.vault.adapter.exists(configDir)) {
137
+ await this.app.vault.adapter.mkdir(configDir);
138
+ }
139
+ if (!await this.app.vault.adapter.exists(pluginsDir)) {
140
+ await this.app.vault.adapter.mkdir(pluginsDir);
141
+ }
116
142
  await this.app.vault.adapter.mkdir(dir);
117
143
  const pluginFnBody = "const r=require,e=exports;const m=r('obsidian');window.__obsidianIntegrationTesting.obsidianModule=m;e.default=m.Plugin;";
118
144
  await this.app.vault.adapter.write(`${dir}/main.js`, pluginFnBody);
119
145
  await this.app.plugins.loadPlugin(tempModuleName);
120
- await this.app.plugins.uninstallPlugin(tempModuleName);
146
+ const pluginsForCleanup = this.app.plugins;
147
+ if (pluginsForCleanup.uninstallPlugin) {
148
+ await this.app.plugins.uninstallPlugin(tempModuleName);
149
+ }
121
150
  if (this.obsidianModule) {
122
151
  return this.obsidianModule;
123
152
  }
@@ -130,8 +159,16 @@ function bootstrapNamespace(bootstrapParams) {
130
159
  libResolvers: bootstrapParams.libResolvers,
131
160
  obsidianModule: existingObsidianModule,
132
161
  async pollVaultBasePath() {
133
- await this.ensureLayoutReady();
134
- return JSON.stringify(this.app.vault.adapter.getBasePath());
162
+ const app = this.app;
163
+ if (!app?.workspace) {
164
+ throw new Error("Owned vault is not ready yet (window.app/workspace not initialized).");
165
+ }
166
+ if (!app.workspace.layoutReady) {
167
+ await this.ensureLayoutReady();
168
+ }
169
+ const adapter = this.app.vault.adapter;
170
+ const basePath = adapter.getBasePath ? adapter.getBasePath() : adapter.basePath ?? "";
171
+ return JSON.stringify(basePath);
135
172
  },
136
173
  async setLocalStorageItem(params) {
137
174
  await this.ensureLayoutReady();
@@ -262,4 +299,4 @@ ${generateStackTraceLine(line)}`;
262
299
  0 && (module.exports = {
263
300
  ensureNamespaceBootstrapped
264
301
  });
265
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5LmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbCB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHtcbiAgZ2V0Qm9vdHN0cmFwVmVyc2lvbixcbiAgZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVyc1xufSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2UgaXMgYm9vdHN0cmFwcGVkXG4gKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2VzcyB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQZXJmb3JtcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gY2hlY2sgdmlhIHRoZSB0cmFuc3BvcnQuIElmIHRoZSBuYW1lc3BhY2VcbiAqIGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIGEgZGlmZmVyZW50IHZlcnNpb24sIHNlbmRzIHRoZSBmdWxsIGJvb3RzdHJhcCBleHByZXNzaW9uXG4gKiB0byByZWdpc3RlciBhbGwgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh2YXVsdCBwYXRoKS5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBPcHRpb25hbCBwZXItZXZhbCB0aW1lb3V0LiBGb3J3YXJkZWQgdG8gYm90aFxuICogICB0aGUgdmVyc2lvbiBjaGVjayBhbmQgdGhlIGJvb3RzdHJhcCBldmFsIHNvIGEgaHVuZyBgb2JzaWRpYW4gZXZhbGAgcmVqZWN0c1xuICogICBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsZXIgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQsIGN3ZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXZhbE9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zID0ge1xuICAgIGN3ZCxcbiAgICAuLi4odGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgfTtcbiAgY29uc3QgYm9vdHN0cmFwVmVyc2lvbiA9IGdldEJvb3RzdHJhcFZlcnNpb24oKTtcbiAgY29uc3QgdmVyc2lvbkpzb24gPSBKU09OLnN0cmluZ2lmeShib290c3RyYXBWZXJzaW9uKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwciwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgZm4oZm5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBnZXRCYXNlUGF0aCgpOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIHR5cGUgQ3VycmVudFdlYkNvbnRlbnRzID0gUmV0dXJuVHlwZTxXaW5kb3dbJ2VsZWN0cm9uJ11bJ3JlbW90ZSddWydnZXRDdXJyZW50V2ViQ29udGVudHMnXT47XG5cbiAgLy8gVGhlIEVsZWN0cm9uIG1vZGlmaWVyLWtleSBuYW1lcyBgc2VuZElucHV0RXZlbnRgIGFjY2VwdHMgKGUuZy4gJ21ldGEnLCAnY29udHJvbCcsICdzaGlmdCcsICdhbHQnKS5cbiAgLy8gRGVyaXZlZCBmcm9tIHRoZSB3ZWItY29udGVudHMgdHlwZSBzbyBpdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIEVsZWN0cm9uIHR5cGluZ3MuXG4gIHR5cGUgRWxlY3Ryb25Nb2RpZmllciA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8Q3VycmVudFdlYkNvbnRlbnRzWydzZW5kSW5wdXRFdmVudCddPlswXVsnbW9kaWZpZXJzJ10+W251bWJlcl07XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtIHtcbiAgICBQbGF0Zm9ybTogT2JzaWRpYW5QbGF0Zm9ybTtcbiAgfVxuXG4gIGludGVyZmFjZSBPYnNpZGlhblBsYXRmb3JtIHtcbiAgICBpc01hY09TOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IChpbiBtcykgYmVmb3JlIGludm9raW5nIGBlbGVjdHJvbldpbmRvdy5kZXN0cm95KClgIHNvIHRoZSBldmFsIHRoYXRcbiAgICogdHJpZ2dlcmVkIHRoZSBjYWxsIGhhcyB0aW1lIHRvIHJldHVybiBpdHMgcmVzdWx0IHRvIHRoZSBjYWxsZXIuIFdpdGhvdXRcbiAgICogaXQgdGhlIHJlbmRlcmVyIGRpZXMgYmVmb3JlIHRoZSBJUEMgcmVwbHkgc2hpcHMsIHRoZSBjYWxsZXIgd2FpdHMgZm9yIHRoZVxuICAgKiBmdWxsIGV2YWwgdGltZW91dCwgYW5kIHN0YWxlIGBCcm93c2VyV2luZG93YCBlbnRyaWVzIHBpbGUgdXAuXG4gICAqL1xuICBjb25zdCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4gcG9sbHMgd2hpbGUgd2FpdGluZyBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvXG4gICAqIHRha2UgZWZmZWN0ICh0aGUgZWRpdG9yIGRvY3VtZW50IHVwZGF0ZXMsIG9yIGFuIGVsZW1lbnQncyBgOmhvdmVyYCBzdGF0ZVxuICAgKiBmbGlwcykuIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlci5cbiAgICovXG4gIGNvbnN0IElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIHRvIHdhaXQgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0byB0YWtlIGVmZmVjdFxuICAgKiBiZWZvcmUgZ2l2aW5nIHVwICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBpbnB1dCBpcyByZWplY3RlZCBcdTIwMTQgZS5nLiBhXG4gICAqIHJlYWQtb25seSBlZGl0b3IsIG9yIGEgcG9pbnRlciBtb3ZlIHRoYXQgbmV2ZXIgbGFuZHMgb24gdGhlIGVsZW1lbnQpLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludGVydmFsIChpbiBtcykgYmV0d2VlbiB7QGxpbmsgd2FpdFVudGlsfSBwcmVkaWNhdGUgY2hlY2tzIHdoZW4gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgd2FpdFVudGlsfSB3YWl0cyBmb3IgaXRzIHByZWRpY2F0ZSB0b1xuICAgKiBiZWNvbWUgdHJ1dGh5IGJlZm9yZSByZWplY3RpbmcsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBjb25zdCBleGlzdGluZ0NvbnRleHRzID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNvbnRleHRzID8/IHt9O1xuICBjb25zdCBleGlzdGluZ09ic2lkaWFuTW9kdWxlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/Lm9ic2lkaWFuTW9kdWxlO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiB3aW5kb3cuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IHdpbmRvdy5lbGVjdHJvbldpbmRvdztcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpO1xuICAgICAgfSwgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVMYXlvdXRSZWFkeSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGVycm9yVG9TdHJpbmcodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3IpO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBpZiAoIXRoaXMuYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBwYXJhbXMuY29udGV4dElkXG4gICAgICAgID8gKHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPz89IHt9KVxuICAgICAgICA6IHt9O1xuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7IGhvdmVyRWxlbWVudCwgbW92ZU1vdXNlLCBwcmVzc0tleSwgdHlwZUludG9FZGl0b3IsIHVuaG92ZXJFbGVtZW50LCB3YWl0VW50aWwgfTtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZUxpYiBvZiB0aGlzLmxpYlJlc29sdmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGxpYiwgcmVzb2x2ZUxpYigpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxBcmdzID0geyAuLi5wYXJhbXMuYXJncywgYXBwOiB0aGlzLmFwcCwgY29udGV4dCwgbGliLCBvYnNpZGlhbk1vZHVsZSB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmZuKGZ1bGxBcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wTW9kdWxlTmFtZSA9IGBnZXQtb2JzaWRpYW4tbW9kdWxlLSR7cmFuZG9tU3VmZml4fWA7XG4gICAgICBjb25zdCBkaXIgPSBgJHt0aGlzLmFwcC52YXVsdC5jb25maWdEaXJ9L3BsdWdpbnMvJHt0ZW1wTW9kdWxlTmFtZX1gO1xuICAgICAgdGhpcy5hcHAucGx1Z2lucy5tYW5pZmVzdHNbdGVtcE1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGRpcixcbiAgICAgICAgaWQ6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICBpc0Rlc2t0b3BPbmx5OiBmYWxzZSxcbiAgICAgICAgbWluQXBwVmVyc2lvbjogJycsXG4gICAgICAgIG5hbWU6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyKTtcblxuICAgICAgY29uc3QgcGx1Z2luRm5Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJ9L21haW4uanNgLCBwbHVnaW5GbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2UpLmdldEJhc2VQYXRoKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAod2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayAoYW5kIHRodXMgYHByZXNzS2V5YCkgY2FuIHJ1bi5cbiAgICBjb25zdCBpc01hY09TID0gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01hY09TO1xuXG4gICAgLy8gTWFwIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCBuYW1lcyB0byBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWVzLlxuICAgIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOlxuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgY2FzZSAnQ3RybCc6XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgY2FzZSAnTWV0YSc6XG4gICAgICAgICAgcmV0dXJuICdtZXRhJztcbiAgICAgICAgY2FzZSAnTW9kJzpcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgY2FzZSAnU2hpZnQnOlxuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gd2luZG93LmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsgdHlwZTogJ21vdXNlTW92ZScsIHg6IE1hdGgucm91bmQobW92ZVBhcmFtcy54KSwgeTogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLnkpIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG4gICAgY29uc3QgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID0gMTtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gdW5ob3ZlclBhcmFtcztcblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3YWl0VW50aWwod2FpdFBhcmFtczogV2FpdFVudGlsUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBtZXNzYWdlLFxuICAgICAgcHJlZGljYXRlLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgIH0gPSB3YWl0UGFyYW1zO1xuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoIShhd2FpdCBwcmVkaWNhdGUoKSkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IHRpbWVvdXRJbk1pbGxpc2Vjb25kcykge1xuICAgICAgICBjb25zdCBzdWZmaXggPSBtZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6IGA6ICR7bWVzc2FnZX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhaXRVbnRpbCB0aW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzJHtzdWZmaXh9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzbGVlcChpbnRlcnZhbEluTWlsbGlzZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBtZXNzYWdlID0gZXJyb3Iuc3RhY2sgPz8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgIGlmIChlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXNzYWdlID0gYXBwZW5kTmVzdGVkRXJyb3IobWVzc2FnZSwgZXJyb3IuY2F1c2UsICdDYXVzZWQgYnk6Jyk7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZUVycm9yKSB7XG4gICAgICBjb25zdCBhZ2dyZWdhdGVkRXJyb3JzOiByZWFkb25seSB1bmtub3duW10gPSBlcnJvci5lcnJvcnM7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYWdncmVnYXRlZEVycm9yXSBvZiBhZ2dyZWdhdGVkRXJyb3JzLmVudHJpZXMoKSkge1xuICAgICAgICBtZXNzYWdlID0gYXBwZW5kTmVzdGVkRXJyb3IobWVzc2FnZSwgYWdncmVnYXRlZEVycm9yLCBgQWdncmVnYXRlZCBlcnJvciAjJHtTdHJpbmcoaW5kZXggKyAxKX06YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwZW5kTmVzdGVkRXJyb3IobWVzc2FnZTogc3RyaW5nLCBuZXN0ZWRFcnJvcjogdW5rbm93biwgdGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IGAke21lc3NhZ2V9XFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlKX1gO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBlcnJvclRvU3RyaW5nSW1wbChuZXN0ZWRFcnJvcikuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBpZiAoIWxpbmUudHJpbSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGxpbmUuc3RhcnRzV2l0aChTVEFDS19UUkFDRV9QUkVGSVgpXG4gICAgICAgID8gYFxcbiR7bGluZX1gXG4gICAgICAgIDogYFxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZShsaW5lKX1gO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7U1RBQ0tfVFJBQ0VfUFJFRklYfSAtLS0gJHt0aXRsZX0gLS0tICgwKWA7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5QkEsb0NBQXFDO0FBQ3JDLDBCQUdPO0FBcUJQLGVBQXNCLDRCQUE0QixXQUE4QixLQUFhLHVCQUErQztBQUMxSSxRQUFNLGNBQW9DO0FBQUEsSUFDeEM7QUFBQSxJQUNBLEdBQUksMEJBQTBCLFVBQWEsRUFBRSxzQkFBc0I7QUFBQSxFQUNyRTtBQUNBLFFBQU0sdUJBQW1CLHlDQUFvQjtBQUM3QyxRQUFNLGNBQWMsS0FBSyxVQUFVLGdCQUFnQjtBQUNuRCxRQUFNLGNBQWMsTUFBTSxVQUFVO0FBQUEsSUFDbEMsbUVBQW1FLFdBQVc7QUFBQSxJQUM5RTtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGdCQUFnQixRQUFRO0FBQzFCO0FBQUEsRUFDRjtBQUVBLFFBQU0sb0JBQWdCLG9EQUFxQixvQkFBb0I7QUFBQSxJQUM3RCxjQUFjLENBQUMsT0FBRywrQ0FBMEIsQ0FBQztBQUFBLElBQzdDLFNBQVM7QUFBQSxFQUNYLENBQUM7QUFDRCxRQUFNLFVBQVUsU0FBUyxlQUFlLFdBQVc7QUFDckQ7QUFnQkEsU0FBUyxtQkFBbUIsaUJBQTZFO0FBaUh2RyxRQUFNLGdDQUFnQztBQU90QyxRQUFNLHNDQUFzQztBQU81QyxRQUFNLGdDQUFnQztBQU10QyxRQUFNLDJDQUEyQztBQU1qRCxRQUFNLHFDQUFxQztBQU8zQyxRQUFNLHFCQUFxQjtBQUczQixRQUFNLFNBQVM7QUFDZixRQUFNLG1CQUFtQixPQUFPLDhCQUE4QixZQUFZLENBQUM7QUFDM0UsUUFBTSx5QkFBeUIsT0FBTyw4QkFBOEI7QUFFcEUsUUFBTSxLQUFrQztBQUFBLElBQ3RDLElBQUksTUFBTTtBQUVSLGFBQU8sT0FBTztBQUFBLElBQ2hCO0FBQUEsSUFFQSxVQUFVO0FBQUEsSUFFVixNQUFNLHVCQUF1RTtBQUMzRSxZQUFNLEtBQUssa0JBQWtCO0FBQzdCLFlBQU0sTUFBTSxDQUFDO0FBQ2IsWUFBTSxpQkFBaUIsT0FBTztBQUM5QixhQUFPLFdBQVcsTUFBTTtBQUN0Qix1QkFBZSxRQUFRO0FBQUEsTUFDekIsR0FBRyw2QkFBNkI7QUFBQSxJQUNsQztBQUFBLElBRUEsTUFBTSxvQkFBb0U7QUFDeEUsWUFBTSxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQ25DLGFBQUssSUFBSSxVQUFVLGNBQWMsT0FBTztBQUFBLE1BQzFDLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxjQUFpRCxPQUF3QjtBQUN2RSxhQUFPLGtCQUFrQixLQUFLO0FBQUEsSUFDaEM7QUFBQSxJQUVBLE1BQU0sWUFBK0MsUUFBeUI7QUFDNUUsVUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLFVBQVUsR0FBRztBQUNqQyxjQUFNLEtBQUssSUFBSSxRQUFRLFVBQVUsSUFBSTtBQUFBLE1BQ3ZDO0FBQ0EsWUFBTSxpQkFBaUIsTUFBTSxLQUFLLGtCQUFrQjtBQUNwRCxZQUFNLFVBQVUsT0FBTyxZQUNsQixLQUFLLFNBQVMsT0FBTyxTQUFTLE1BQU0sQ0FBQyxJQUN0QyxDQUFDO0FBSUwsWUFBTSxNQUFNLEVBQUUsY0FBYyxXQUFXLFVBQVUsZ0JBQWdCLGdCQUFnQixVQUFVO0FBQzNGLGlCQUFXLGNBQWMsS0FBSyxjQUFjO0FBQzFDLGVBQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQztBQUFBLE1BQ2pDO0FBQ0EsWUFBTSxXQUFXLEVBQUUsR0FBRyxPQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssU0FBUyxLQUFLLGVBQWU7QUFDL0UsVUFBSTtBQUNGLGNBQU0sU0FBUyxNQUFNLE9BQU8sR0FBRyxRQUFRO0FBQ3ZDLFlBQUksV0FBVyxRQUFXO0FBQ3hCLGlCQUFPLEtBQUssVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQUEsUUFDN0M7QUFDQSxlQUFPLEtBQUssVUFBVSxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDekMsU0FBUyxXQUFXO0FBQ2xCLGVBQU8sS0FBSyxVQUFVLEVBQUUsTUFBTSxTQUFTLE9BQU8sS0FBSyxjQUFjLFNBQVMsRUFBRSxDQUFDO0FBQUEsTUFDL0U7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLG9CQUF1RTtBQUMzRSxVQUFJLEtBQUssZ0JBQWdCO0FBQ3ZCLGVBQU8sS0FBSztBQUFBLE1BQ2Q7QUFFQSxZQUFNLGNBQWM7QUFDcEIsWUFBTSxlQUFlLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFBRSxNQUFNLFdBQVc7QUFDNUQsWUFBTSxpQkFBaUIsdUJBQXVCLFlBQVk7QUFDMUQsWUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLE1BQU0sU0FBUyxZQUFZLGNBQWM7QUFDakUsV0FBSyxJQUFJLFFBQVEsVUFBVSxjQUFjLElBQUk7QUFBQSxRQUMzQyxRQUFRO0FBQUEsUUFDUixhQUFhO0FBQUEsUUFDYjtBQUFBLFFBQ0EsSUFBSTtBQUFBLFFBQ0osZUFBZTtBQUFBLFFBQ2YsZUFBZTtBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sU0FBUztBQUFBLE1BQ1g7QUFDQSxZQUFNLEtBQUssSUFBSSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBRXRDLFlBQU0sZUFBZTtBQUNyQixZQUFNLEtBQUssSUFBSSxNQUFNLFFBQVEsTUFBTSxHQUFHLEdBQUcsWUFBWSxZQUFZO0FBRWpFLFlBQU0sS0FBSyxJQUFJLFFBQVEsV0FBVyxjQUFjO0FBQ2hELFlBQU0sS0FBSyxJQUFJLFFBQVEsZ0JBQWdCLGNBQWM7QUFFckQsVUFBSSxLQUFLLGdCQUFnQjtBQUN2QixlQUFPLEtBQUs7QUFBQSxNQUNkO0FBRUEsWUFBTSxJQUFJLE1BQU0sZ0NBQWdDO0FBQUEsSUFDbEQ7QUFBQSxJQUVBLE1BQU0sWUFBK0MsUUFBdUI7QUFDMUUsWUFBTSxLQUFLLGtCQUFrQjtBQUM3QixhQUFPLFNBQVMsWUFBWSxTQUFTLE9BQU8sU0FBUyxHQUFHLE9BQU8sSUFBSTtBQUFBLElBQ3JFO0FBQUEsSUFFQSxjQUFjLGdCQUFnQjtBQUFBLElBRTlCLGdCQUFnQjtBQUFBLElBRWhCLE1BQU0sb0JBQXNFO0FBQzFFLFlBQU0sS0FBSyxrQkFBa0I7QUFHN0IsYUFBTyxLQUFLLFVBQVcsS0FBSyxJQUFJLE1BQU0sUUFBNkMsWUFBWSxDQUFDO0FBQUEsSUFDbEc7QUFBQSxJQUVBLE1BQU0sb0JBQXVELFFBQXVCO0FBQ2xGLFlBQU0sS0FBSyxrQkFBa0I7QUFDN0IsbUJBQWEsUUFBUSxPQUFPLEtBQUssT0FBTyxLQUFLO0FBQUEsSUFDL0M7QUFBQSxJQUVBLFNBQVMsZ0JBQWdCO0FBQUEsRUFDM0I7QUFHQSxFQUFDLE9BQXdELCtCQUErQjtBQUV4RixpQkFBZSxlQUFlLFlBQWlEO0FBQzdFLFVBQU0scUNBQXFDO0FBRTNDLFVBQU0sRUFBRSxRQUFRLEtBQUssSUFBSTtBQUN6QixVQUFNLG9CQUFvQixPQUFPLFNBQVM7QUFHMUMsV0FBTyxNQUFNO0FBQ2IsVUFBTSxXQUFXLE9BQU8sU0FBUztBQUNqQyxXQUFPLFVBQVUsVUFBVSxPQUFPLFFBQVEsUUFBUSxFQUFFLE1BQU07QUFHMUQsVUFBTSxNQUFNLGtDQUFrQztBQUk5QyxlQUFXLFFBQVEsTUFBTTtBQUN2QixlQUFTLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFBQSxJQUN4QjtBQUdBLFVBQU0sWUFBWSxLQUFLLElBQUk7QUFDM0IsV0FBTyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsS0FBSyxJQUFJLElBQUksWUFBWSwrQkFBK0I7QUFDeEcsWUFBTSxNQUFNLG1DQUFtQztBQUFBLElBQ2pEO0FBQUEsRUFDRjtBQUVBLFdBQVMsU0FBUyxhQUFtQztBQUNuRCxVQUFNLEVBQUUsS0FBSyxZQUFZLENBQUMsRUFBRSxJQUFJO0FBS2hDLFVBQU0sVUFBVyxHQUFHLGVBQThDLFNBQVM7QUFJM0UsVUFBTSxvQkFBb0IsVUFBVSxJQUFJLENBQUMsYUFBK0I7QUFDdEUsY0FBUSxVQUFVO0FBQUEsUUFDaEIsS0FBSztBQUNILGlCQUFPO0FBQUEsUUFDVCxLQUFLO0FBQ0gsaUJBQU87QUFBQSxRQUNULEtBQUs7QUFDSCxpQkFBTztBQUFBLFFBQ1QsS0FBSztBQUNILGlCQUFPLFVBQVUsU0FBUztBQUFBLFFBQzVCLEtBQUs7QUFDSCxpQkFBTztBQUFBLFFBQ1QsU0FBUztBQUVQLGdCQUFNLGtCQUF5QjtBQUMvQixnQkFBTSxJQUFJLE1BQU0scUJBQXFCLE9BQU8sZUFBZSxDQUFDLEVBQUU7QUFBQSxRQUNoRTtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFFRCxVQUFNLGNBQWMsT0FBTyxTQUFTLE9BQU8sc0JBQXNCO0FBSWpFLGdCQUFZLGVBQWUsRUFBRSxTQUFTLEtBQUssV0FBVyxtQkFBbUIsTUFBTSxVQUFVLENBQUM7QUFDMUYsZ0JBQVksZUFBZSxFQUFFLFNBQVMsS0FBSyxXQUFXLG1CQUFtQixNQUFNLE9BQU8sQ0FBQztBQUN2RixnQkFBWSxlQUFlLEVBQUUsU0FBUyxLQUFLLFdBQVcsbUJBQW1CLE1BQU0sUUFBUSxDQUFDO0FBQUEsRUFDMUY7QUFFQSxpQkFBZSxhQUFhLGFBQWdEO0FBQzFFLFVBQU0saUJBQWlCO0FBRXZCLFVBQU0sRUFBRSxRQUFRLElBQUk7QUFHcEIsVUFBTSxPQUFPLFFBQVEsc0JBQXNCO0FBQzNDLGNBQVUsRUFBRSxHQUFHLEtBQUssT0FBTyxLQUFLLFFBQVEsZ0JBQWdCLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxlQUFlLENBQUM7QUFHcEcsVUFBTSxZQUFZLEtBQUssSUFBSTtBQUMzQixXQUFPLENBQUMsUUFBUSxRQUFRLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxZQUFZLCtCQUErQjtBQUMzRixZQUFNLE1BQU0sbUNBQW1DO0FBQUEsSUFDakQ7QUFBQSxFQUNGO0FBRUEsV0FBUyxVQUFVLFlBQW1DO0FBQ3BELFVBQU0sY0FBYyxPQUFPLFNBQVMsT0FBTyxzQkFBc0I7QUFDakUsZ0JBQVksZUFBZSxFQUFFLE1BQU0sYUFBYSxHQUFHLEtBQUssTUFBTSxXQUFXLENBQUMsR0FBRyxHQUFHLEtBQUssTUFBTSxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQUEsRUFDNUc7QUFFQSxpQkFBZSxlQUFlLGVBQW9EO0FBQ2hGLFVBQU0saUJBQWlCO0FBQ3ZCLFVBQU0sMkJBQTJCO0FBRWpDLFVBQU0sRUFBRSxRQUFRLElBQUk7QUFLcEIsVUFBTSxPQUFPLFFBQVEsc0JBQXNCO0FBQzNDLFVBQU0sSUFBSSxLQUFLLFFBQVEsMkJBQTJCLEtBQUssT0FBTywyQkFBMkIsS0FBSyxRQUFRO0FBQ3RHLFVBQU0sSUFBSSxLQUFLLE1BQU0sS0FBSyxTQUFTO0FBQ25DLGNBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUdsQixVQUFNLFlBQVksS0FBSyxJQUFJO0FBQzNCLFdBQU8sUUFBUSxRQUFRLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxZQUFZLCtCQUErQjtBQUMxRixZQUFNLE1BQU0sbUNBQW1DO0FBQUEsSUFDakQ7QUFBQSxFQUNGO0FBRUEsaUJBQWUsVUFBVSxZQUE0QztBQUNuRSxVQUFNO0FBQUEsTUFDSix5QkFBeUI7QUFBQSxNQUN6QjtBQUFBLE1BQ0E7QUFBQSxNQUNBLHdCQUF3QjtBQUFBLElBQzFCLElBQUk7QUFFSixVQUFNLFlBQVksS0FBSyxJQUFJO0FBQzNCLFdBQU8sQ0FBRSxNQUFNLFVBQVUsR0FBSTtBQUMzQixVQUFJLEtBQUssSUFBSSxJQUFJLGFBQWEsdUJBQXVCO0FBQ25ELGNBQU0sU0FBUyxZQUFZLFNBQVksS0FBSyxLQUFLLE9BQU87QUFDeEQsY0FBTSxJQUFJLE1BQU0sNkJBQTZCLE9BQU8scUJBQXFCLENBQUMsZ0JBQWdCLE1BQU0sRUFBRTtBQUFBLE1BQ3BHO0FBQ0EsWUFBTSxNQUFNLHNCQUFzQjtBQUFBLElBQ3BDO0FBQUEsRUFDRjtBQUVBLFdBQVMsa0JBQWtCLE9BQXdCO0FBQ2pELFFBQUksRUFBRSxpQkFBaUIsUUFBUTtBQUM3QixhQUFPLE9BQU8sS0FBSztBQUFBLElBQ3JCO0FBRUEsUUFBSSxVQUFVLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxLQUFLLE1BQU0sT0FBTztBQUM1RCxRQUFJLE1BQU0sVUFBVSxRQUFXO0FBQzdCLGdCQUFVLGtCQUFrQixTQUFTLE1BQU0sT0FBTyxZQUFZO0FBQUEsSUFDaEU7QUFDQSxRQUFJLGlCQUFpQixnQkFBZ0I7QUFDbkMsWUFBTSxtQkFBdUMsTUFBTTtBQUNuRCxpQkFBVyxDQUFDLE9BQU8sZUFBZSxLQUFLLGlCQUFpQixRQUFRLEdBQUc7QUFDakUsa0JBQVUsa0JBQWtCLFNBQVMsaUJBQWlCLHFCQUFxQixPQUFPLFFBQVEsQ0FBQyxDQUFDLEdBQUc7QUFBQSxNQUNqRztBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMsa0JBQWtCLFNBQWlCLGFBQXNCLE9BQXVCO0FBQ3ZGLFFBQUksU0FBUyxHQUFHLE9BQU87QUFBQSxFQUFLLHVCQUF1QixLQUFLLENBQUM7QUFDekQsZUFBVyxRQUFRLGtCQUFrQixXQUFXLEVBQUUsTUFBTSxJQUFJLEdBQUc7QUFDN0QsVUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQ2hCO0FBQUEsTUFDRjtBQUNBLGdCQUFVLEtBQUssV0FBVyxrQkFBa0IsSUFDeEM7QUFBQSxFQUFLLElBQUksS0FDVDtBQUFBLEVBQUssdUJBQXVCLElBQUksQ0FBQztBQUFBLElBQ3ZDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxXQUFTLHVCQUF1QixPQUF1QjtBQUNyRCxXQUFPLEdBQUcsa0JBQWtCLFFBQVEsS0FBSztBQUFBLEVBQzNDO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
302
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5LmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbCB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHtcbiAgZ2V0Qm9vdHN0cmFwVmVyc2lvbixcbiAgZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVyc1xufSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2UgaXMgYm9vdHN0cmFwcGVkXG4gKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2VzcyB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQZXJmb3JtcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gY2hlY2sgdmlhIHRoZSB0cmFuc3BvcnQuIElmIHRoZSBuYW1lc3BhY2VcbiAqIGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIGEgZGlmZmVyZW50IHZlcnNpb24sIHNlbmRzIHRoZSBmdWxsIGJvb3RzdHJhcCBleHByZXNzaW9uXG4gKiB0byByZWdpc3RlciBhbGwgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh2YXVsdCBwYXRoKS5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBPcHRpb25hbCBwZXItZXZhbCB0aW1lb3V0LiBGb3J3YXJkZWQgdG8gYm90aFxuICogICB0aGUgdmVyc2lvbiBjaGVjayBhbmQgdGhlIGJvb3RzdHJhcCBldmFsIHNvIGEgaHVuZyBgb2JzaWRpYW4gZXZhbGAgcmVqZWN0c1xuICogICBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsZXIgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQsIGN3ZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXZhbE9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zID0ge1xuICAgIGN3ZCxcbiAgICAuLi4odGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgfTtcbiAgY29uc3QgYm9vdHN0cmFwVmVyc2lvbiA9IGdldEJvb3RzdHJhcFZlcnNpb24oKTtcbiAgY29uc3QgdmVyc2lvbkpzb24gPSBKU09OLnN0cmluZ2lmeShib290c3RyYXBWZXJzaW9uKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwciwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgZm4oZm5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBnZXRCYXNlUGF0aD86ICgpID0+IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJcGNTZW5kU3luY1BhcmFtcyB7XG4gICAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgfVxuXG4gIC8vIENvbW11bml0eS1wbHVnaW4gQVBJIG1lbWJlcnMgdGhhdCBvbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIGxhY2suXG4gIC8vIGBvYnNpZGlhbi10eXBpbmdzYCBkZWNsYXJlcyB0aGVtIGFzIGFsd2F5cy1wcmVzZW50LCBzbyBwcm9iZSB0aHJvdWdoIHRoaXNcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXcgdG8gZGV0ZWN0IHRoZWlyIHJ1bnRpbWUgYWJzZW5jZSB3aXRob3V0IGEgZmFsc2VcbiAgLy8gYG5vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbmAuXG4gIGludGVyZmFjZSBQbHVnaW5zTGlrZSB7XG4gICAgaXNFbmFibGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBsb2FkUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgbWFuaWZlc3RzPzogdW5rbm93bjtcbiAgICB1bmluc3RhbGxQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfVxuXG4gIGludGVyZmFjZSBTZXRMb2NhbFN0b3JhZ2VJdGVtUGFyYW1zIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gVGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyBVbm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gVW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgKGluIG1zKSBiZWZvcmUgaW52b2tpbmcgYGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKWAgc28gdGhlIGV2YWwgdGhhdFxuICAgKiB0cmlnZ2VyZWQgdGhlIGNhbGwgaGFzIHRpbWUgdG8gcmV0dXJuIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gV2l0aG91dFxuICAgKiBpdCB0aGUgcmVuZGVyZXIgZGllcyBiZWZvcmUgdGhlIElQQyByZXBseSBzaGlwcywgdGhlIGNhbGxlciB3YWl0cyBmb3IgdGhlXG4gICAqIGZ1bGwgZXZhbCB0aW1lb3V0LCBhbmQgc3RhbGUgYEJyb3dzZXJXaW5kb3dgIGVudHJpZXMgcGlsZSB1cC5cbiAgICovXG4gIGNvbnN0IERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIChpbiBtcykgYmV0d2VlbiBwb2xscyB3aGlsZSB3YWl0aW5nIGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG9cbiAgICogdGFrZSBlZmZlY3QgKHRoZSBlZGl0b3IgZG9jdW1lbnQgdXBkYXRlcywgb3IgYW4gZWxlbWVudCdzIGA6aG92ZXJgIHN0YXRlXG4gICAqIGZsaXBzKS4gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvIHRha2UgZWZmZWN0XG4gICAqIGJlZm9yZSBnaXZpbmcgdXAgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGlucHV0IGlzIHJlamVjdGVkIFx1MjAxNCBlLmcuIGFcbiAgICogcmVhZC1vbmx5IGVkaXRvciwgb3IgYSBwb2ludGVyIG1vdmUgdGhhdCBuZXZlciBsYW5kcyBvbiB0aGUgZWxlbWVudCkuXG4gICAqL1xuICBjb25zdCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIFByZWZpeCB1c2VkIGJ5IHtAbGluayBlcnJvclRvU3RyaW5nfSdzIG5lc3RlZC1lcnJvciBzZXBhcmF0b3IgbGluZXMsIG1hdGNoaW5nXG4gICAqIHRoZSBgICAgIGF0YCBwcmVmaXggb2YgYSBWOCBzdGFjay10cmFjZSBmcmFtZSBzbyB0aGUgc2VwYXJhdG9ycyBibGVuZCBpbnRvXG4gICAqIHRoZSBzdXJyb3VuZGluZyBzdGFjay4gS2VwdCBpZGVudGljYWwgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AnIGBlcnJvclRvU3RyaW5nYC5cbiAgICovXG4gIGNvbnN0IFNUQUNLX1RSQUNFX1BSRUZJWCA9ICcgICAgYXQnO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICBjb25zdCBob2xkZXIgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gIGNvbnN0IGV4aXN0aW5nQ29udGV4dHMgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uY29udGV4dHMgPz8ge307XG4gIGNvbnN0IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8ub2JzaWRpYW5Nb2R1bGU7XG4gIC8vIFdhcm4gYXQgbW9zdCBvbmNlIHBlciBib290c3RyYXAgdGhhdCBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYCBvbiB0aGlzIHZlcnNpb24uXG4gIGxldCBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSBmYWxzZTtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gd2luZG93LmFwcDtcbiAgICB9LFxuXG4gICAgY29udGV4dHM6IGV4aXN0aW5nQ29udGV4dHMsXG5cbiAgICBhc3luYyBkZXN0cm95Q3VycmVudFdpbmRvdyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgY29uc3QgZWxlY3Ryb25XaW5kb3cgPSB3aW5kb3cuZWxlY3Ryb25XaW5kb3c7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gRXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIFBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHsgaG92ZXJFbGVtZW50LCBtb3ZlTW91c2UsIHByZXNzS2V5LCB0eXBlSW50b0VkaXRvciwgdW5ob3ZlckVsZW1lbnQsIHdhaXRVbnRpbCB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3MgPSB7IC4uLnBhcmFtcy5hcmdzLCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZm4oZnVsbEFyZ3MpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogcmVzdWx0IH0pO1xuICAgICAgfSBjYXRjaCAoZXZhbEVycm9yKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiB0aGlzLmVycm9yVG9TdHJpbmcoZXZhbEVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T2JzaWRpYW5Nb2R1bGUodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHRlbXAtcGx1Z2luIHRyaWNrIGJlbG93IHJlc29sdmVzIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggb25seVxuICAgICAgLy8gV29ya3MgaW5zaWRlIGEgcGx1Z2luLWxvYWQgY29udGV4dC4gSXQgbmVlZHMgdGhlIGNvbW11bml0eS1wbHVnaW4gcmVnaXN0cnlcbiAgICAgIC8vIChgbG9hZFBsdWdpbmAgKyBgbWFuaWZlc3RzYCksIHdoaWNoIEZJUlNUIGFwcGVhcnMgaW4gT2JzaWRpYW4gMC45Ljc7IHRoZVxuICAgICAgLy8gMC42LjQtMC45LjYgYmFuZCBoYXMgbm8gcmVnaXN0cnkgYW5kIGNhbm5vdCBydW4gaXQsIHNvIHJldHVybiBgbnVsbGAgKG5vdFxuICAgICAgLy8gYHVuZGVmaW5lZGApIC0gYXBwLW9ubHkgY2xvc3VyZXMgKGBmbih7IGFwcCB9KWApIHN0aWxsIHJ1bi5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAoIXBsdWdpbnMubG9hZFBsdWdpbiB8fCAhcGx1Z2lucy5tYW5pZmVzdHMpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgICBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUud2FybignW29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmddIGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgOiB0aGlzIE9ic2lkaWFuIHZlcnNpb24gcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJIChhZGRlZCBpbiAwLjkuNyksIHNvIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuIEFwcC1vbmx5IGNsb3N1cmVzIChgZm4oeyBhcHAgfSlgKSBzdGlsbCB3b3JrLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgICAgY29uc3QgdGVtcE1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIExvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpciA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpciA9IGAke2NvbmZpZ0Rpcn0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXIgPSBgJHtwbHVnaW5zRGlyfS8ke3RlbXBNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wTW9kdWxlTmFtZV0gPSB7XG4gICAgICAgIGF1dGhvcjogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgZGlyLFxuICAgICAgICBpZDogdGVtcE1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcE1vZHVsZU5hbWUsXG4gICAgICAgIHZlcnNpb246ICcnXG4gICAgICB9O1xuICAgICAgLy8gYGFkYXB0ZXIubWtkaXJgIGlzIG5vdCByZWN1cnNpdmUsIGFuZCBhbiBvbGQgdmVyc2lvbiBvbiBhIGZyZXNoIHZhdWx0IG1heSBub3RcbiAgICAgIC8vIEhhdmUgdGhlIGNvbmZpZy9wbHVnaW5zIGRpcnMgeWV0IFx1MjAxNCBjcmVhdGUgdGhlIGNoYWluIHNvIGBsb2FkUGx1Z2luYCBmaW5kcyB0aGVcbiAgICAgIC8vIFRlbXAgcGx1Z2luIGF0IGA8Y29uZmlnRGlyPi9wbHVnaW5zLzxpZD5gLlxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoY29uZmlnRGlyKSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2Rpcihjb25maWdEaXIpO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMocGx1Z2luc0RpcikpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIocGx1Z2luc0Rpcik7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGRpcik7XG5cbiAgICAgIGNvbnN0IHBsdWdpbkZuQm9keSA9ICdjb25zdCByPXJlcXVpcmUsZT1leHBvcnRzO2NvbnN0IG09cihcXCdvYnNpZGlhblxcJyk7d2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmcub2JzaWRpYW5Nb2R1bGU9bTtlLmRlZmF1bHQ9bS5QbHVnaW47JztcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7ZGlyfS9tYWluLmpzYCwgcGx1Z2luRm5Cb2R5KTtcblxuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5sb2FkUGx1Z2luKHRlbXBNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBIYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIFRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyBVbmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gUmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gQ2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gQW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBCeSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyBZZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNldExvY2FsU3RvcmFnZUl0ZW0odGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHBhcmFtcy5rZXksIHBhcmFtcy52YWx1ZSk7XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gICh3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj4pLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcgPSBucztcblxuICBhc3luYyBmdW5jdGlvbiB0eXBlSW50b0VkaXRvcih0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5cbiAgICBjb25zdCB7IGVkaXRvciwgdGV4dCB9ID0gdHlwZVBhcmFtcztcbiAgICBjb25zdCB2YWx1ZUJlZm9yZVR5cGluZyA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXG4gICAgLy8gRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIGVkaXRvci5mb2N1cygpO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gZWRpdG9yLmxhc3RMaW5lKCk7XG4gICAgZWRpdG9yLnNldEN1cnNvcihsYXN0TGluZSwgZWRpdG9yLmdldExpbmUobGFzdExpbmUpLmxlbmd0aCk7XG5cbiAgICAvLyBMZXQgYW55IGZvY3VzIHRyYXAgKGEgYHNldFRpbWVvdXQoMClgIHJlLWZvY3VzKSBmaXJlIGJlZm9yZSB0eXBpbmcsIHNvIHN0b2xlbiBmb2N1cyBpcyBkZXRlY3RlZC5cbiAgICBhd2FpdCBzbGVlcChGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIC8vIFR5cGluZyBpcyBwcmVzc2luZyBlYWNoIGNoYXJhY3RlciBrZXkgaW4gdHVybjogYHByZXNzS2V5YCBpbmplY3RzIHRoZSBzYW1lIHRydXN0ZWRcbiAgICAvLyBga2V5RG93bmAgLT4gYGNoYXJgIC0+IGBrZXlVcGAgYSByZWFsIHVzZXIgcHJvZHVjZXMgXHUyMDE0IHRleHQgbGFuZHMgb25seSBpZiB0aGUgZWRpdG9yIGhvbGRzIGZvY3VzLlxuICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICBwcmVzc0tleSh7IGtleTogY2hhciB9KTtcbiAgICB9XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGUgaW5wdXQgb3IgdGhlIHRpbWVvdXQgZWxhcHNlcywgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlZGl0b3IuZ2V0VmFsdWUoKSA9PT0gdmFsdWVCZWZvcmVUeXBpbmcgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBrZXksIG1vZGlmaWVycyA9IFtdIH0gPSBwcmVzc1BhcmFtcztcblxuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIChhbmQgdGh1cyBgcHJlc3NLZXlgKSBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICAvLyBNYXAgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gICAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IG1vZGlmaWVycy5tYXAoKG1vZGlmaWVyKTogRWxlY3Ryb25Nb2RpZmllciA9PiB7XG4gICAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICAgIGNhc2UgJ0FsdCc6XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICBjYXNlICdDdHJsJzpcbiAgICAgICAgICByZXR1cm4gJ2NvbnRyb2wnO1xuICAgICAgICBjYXNlICdNZXRhJzpcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICBjYXNlICdNb2QnOlxuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICBjYXNlICdTaGlmdCc6XG4gICAgICAgICAgcmV0dXJuICdzaGlmdCc7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGtleSBwcmVzcyBpcyBrZXlEb3duIC0+IGNoYXIgLT4ga2V5VXA6IGtleURvd24gZmlyZXMgYGtleWRvd25gLCBjaGFyIGZpcmVzXG4gICAgLy8gYGtleXByZXNzYC9gYmVmb3JlaW5wdXRgL2BpbnB1dGAsIGtleVVwIGZpcmVzIGBrZXl1cGAgXHUyMDE0IHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lLlxuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5RG93bicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdjaGFyJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleVVwJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSBob3ZlclBhcmFtcztcblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgLy8gTW92ZSB0byBhIHBvaW50IGp1c3Qgb3V0c2lkZSB0aGUgZWxlbWVudCdzIGJveC5cbiAgICAvLyBXaGVuIGZsdXNoIGFnYWluc3QgdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLCB1c2UganVzdCBwYXN0IHRoZSByaWdodCBlZGdlLlxuICAgIC8vIEEgZnVsbC12aWV3cG9ydC13aWR0aCBlbGVtZW50IHNob3VsZCB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ID49IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA/IHJlY3QubGVmdCAtIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA6IHJlY3QucmlnaHQgKyBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFM7XG4gICAgY29uc3QgeSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUjtcbiAgICBtb3ZlTW91c2UoeyB4LCB5IH0pO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgY2xlYXJlZCwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgaWYgKGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBlcnJvci5jYXVzZSwgJ0NhdXNlZCBieTonKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRFcnJvcnM6IHJlYWRvbmx5IHVua25vd25bXSA9IGVycm9yLmVycm9ycztcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhZ2dyZWdhdGVkRXJyb3JdIG9mIGFnZ3JlZ2F0ZWRFcnJvcnMuZW50cmllcygpKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBhZ2dyZWdhdGVkRXJyb3IsIGBBZ2dyZWdhdGVkIGVycm9yICMke1N0cmluZyhpbmRleCArIDEpfTpgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG5lc3RlZEVycm9yOiB1bmtub3duLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gYCR7bWVzc2FnZX1cXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGUpfWA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGVycm9yVG9TdHJpbmdJbXBsKG5lc3RlZEVycm9yKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gbGluZS5zdGFydHNXaXRoKFNUQUNLX1RSQUNFX1BSRUZJWClcbiAgICAgICAgPyBgXFxuJHtsaW5lfWBcbiAgICAgICAgOiBgXFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKGxpbmUpfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTVEFDS19UUkFDRV9QUkVGSVh9IC0tLSAke3RpdGxlfSAtLS0gKDApYDtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlCQSxvQ0FBcUM7QUFDckMsMEJB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
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var normalize_optional_properties_exports = {};
20
+ __export(normalize_optional_properties_exports, {
21
+ normalizeOptionalProperties: () => normalizeOptionalProperties
22
+ });
23
+ module.exports = __toCommonJS(normalize_optional_properties_exports);
24
+ function normalizeOptionalProperties(obj) {
25
+ return obj;
26
+ }
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ normalizeOptionalProperties
30
+ });
31
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVHlwZS1vbmx5IGhlbHBlciBmb3IgYnVpbGRpbmcgb2JqZWN0cyB3aXRoIG9wdGlvbmFsLWJ1dC1ub3QtYHVuZGVmaW5lZGBcbiAqIHByb3BlcnRpZXMgdW5kZXIgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC4gUG9ydGVkIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JqZWN0LXV0aWxzYCByYXRoZXIgdGhhbiBkZXBlbmRlZCBvbiwga2VlcGluZyB0aGUgaGFybmVzc1xuICogZnJlZSBvZiBhbiBgb2JzaWRpYW4tZGV2LXV0aWxzYCBydW50aW1lIGRlcGVuZGVuY3kgKHRoZSBzYW1lIGRlcGVuZGVuY3ktaHlnaWVuZVxuICogcmVhc29uIHRoZSB0cnVzdGVkLWlucHV0IGhlbHBlcnMgYXJlIGR1cGxpY2F0ZWQgXHUyMDE0IHNlZSB0aGUgcHJvamVjdCBgQUdFTlRTLm1kYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBVbmRlZmluZWRPblBhcnRpYWxEZWVwIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBMZXRzIGFuIG9iamVjdCBsaXRlcmFsIHNldCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGB1bmRlZmluZWRgIGFuZCBzdGlsbCBzYXRpc2Z5XG4gKiB0aGUgdGFyZ2V0IHR5cGUgdW5kZXIgYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYCAod2hpY2ggb3RoZXJ3aXNlIGZvcmJpZHNcbiAqIGFzc2lnbmluZyBgdW5kZWZpbmVkYCB0byBhIGBwcm9wPzogVGAgcHJvcGVydHkpLiBUaGlzIHJlcGxhY2VzIHRoZSB2ZXJib3NlXG4gKiBwZXIta2V5IGNvbmRpdGlvbmFsLXNwcmVhZCBpZGlvbSAoYC4uLih4ICE9PSB1bmRlZmluZWQgJiYgeyBrZXk6IHggfSlgKSB3aXRoIGFcbiAqIGZsYXQgYHsga2V5OiB4IH1gIGxpdGVyYWwuXG4gKlxuICogVGhlIGB1bmRlZmluZWRgLXZhbHVlZCBrZXlzIHJlbWFpbiBwcmVzZW50IGF0IHJ1bnRpbWU7IGV2ZXJ5IGNvbnN1bWVyIG9mIHRoZXNlXG4gKiBvcHRpb24gYmFncyByZWFkcyBlYWNoIGZpZWxkIHdpdGggYW4gYHg/LmtleSA/PyBkZWZhdWx0YCAvIGB4Py5rZXkgIT09IHVuZGVmaW5lZGBcbiAqIGd1YXJkLCBzbyBhbiBleHBsaWNpdCBgdW5kZWZpbmVkYCB2YWx1ZSBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFic2VudCBrZXkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCB0eXBlIHdpdGggb3B0aW9uYWwgcHJvcGVydGllcyB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCBsaXRlcmFsLCBwZXJtaXR0aW5nIGV4cGxpY2l0IGB1bmRlZmluZWRgIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMgVGhlIHNhbWUgb2JqZWN0LCB0eXBlZCBhcyBgVGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VD4ob2JqOiBVbmRlZmluZWRPblBhcnRpYWxEZWVwPFQ+KTogVCB7XG4gIHJldHVybiBvYmogYXMgVDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEyQk8sU0FBUyw0QkFBK0IsS0FBbUM7QUFDaEYsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Type-only helper for building objects with optional-but-not-`undefined`
5
+ * properties under `exactOptionalPropertyTypes`. Ported from
6
+ * `obsidian-dev-utils/object-utils` rather than depended on, keeping the harness
7
+ * free of an `obsidian-dev-utils` runtime dependency (the same dependency-hygiene
8
+ * reason the trusted-input helpers are duplicated — see the project `AGENTS.md`).
9
+ */
10
+ import type { UndefinedOnPartialDeep } from 'type-fest';
11
+ /**
12
+ * Lets an object literal set optional properties to `undefined` and still satisfy
13
+ * the target type under `exactOptionalPropertyTypes` (which otherwise forbids
14
+ * assigning `undefined` to a `prop?: T` property). This replaces the verbose
15
+ * per-key conditional-spread idiom (`...(x !== undefined && { key: x })`) with a
16
+ * flat `{ key: x }` literal.
17
+ *
18
+ * The `undefined`-valued keys remain present at runtime; every consumer of these
19
+ * option bags reads each field with an `x?.key ?? default` / `x?.key !== undefined`
20
+ * guard, so an explicit `undefined` value is indistinguishable from an absent key.
21
+ *
22
+ * @typeParam T - The target type with optional properties to normalize.
23
+ * @param obj - The object literal, permitting explicit `undefined` for optional properties.
24
+ * @returns The same object, typed as `T`.
25
+ */
26
+ export declare function normalizeOptionalProperties<T>(obj: UndefinedOnPartialDeep<T>): T;