obsidian-integration-testing 8.1.0 → 8.1.2

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 (53) hide show
  1. package/README.md +5 -5
  2. package/dist/lib/cjs/connect-to-cdp.cjs +17 -12
  3. package/dist/lib/cjs/connect-to-cdp.d.cts +23 -3
  4. package/dist/lib/cjs/context-provider.cjs +1 -1
  5. package/dist/lib/cjs/context-provider.d.cts +1 -1
  6. package/dist/lib/cjs/global-setup-core.cjs +17 -5
  7. package/dist/lib/cjs/global-setup-core.d.cts +11 -1
  8. package/dist/lib/cjs/incompatible-installer-version-error.cjs +52 -0
  9. package/dist/lib/cjs/incompatible-installer-version-error.d.cts +44 -0
  10. package/dist/lib/cjs/index.cjs +10 -1
  11. package/dist/lib/cjs/index.d.cts +6 -0
  12. package/dist/lib/cjs/installer-compatibility.cjs +64 -0
  13. package/dist/lib/cjs/installer-compatibility.d.cts +75 -0
  14. package/dist/lib/cjs/library.cjs +1 -1
  15. package/dist/lib/cjs/namespace-bootstrap.cjs +16 -7
  16. package/dist/lib/cjs/obsidian-installer.cjs +7 -4
  17. package/dist/lib/cjs/obsidian-metadata.cjs +1811 -0
  18. package/dist/lib/cjs/obsidian-metadata.d.cts +56 -0
  19. package/dist/lib/cjs/transport-desktop-cdp.cjs +19 -3
  20. package/dist/lib/cjs/transport-desktop-cdp.d.cts +27 -1
  21. package/dist/lib/cjs/transport-factory.cjs +77 -23
  22. package/dist/lib/cjs/transport-factory.d.cts +1 -1
  23. package/dist/lib/cjs/transport-options.cjs +1 -1
  24. package/dist/lib/cjs/transport-options.d.cts +24 -7
  25. package/dist/lib/cjs/visibility.cjs +10 -2
  26. package/dist/lib/cjs/visibility.d.cts +27 -8
  27. package/dist/lib/esm/connect-to-cdp.d.mts +23 -3
  28. package/dist/lib/esm/connect-to-cdp.mjs +17 -12
  29. package/dist/lib/esm/context-provider.d.mts +1 -1
  30. package/dist/lib/esm/context-provider.mjs +1 -1
  31. package/dist/lib/esm/global-setup-core.d.mts +11 -1
  32. package/dist/lib/esm/global-setup-core.mjs +15 -4
  33. package/dist/lib/esm/incompatible-installer-version-error.d.mts +44 -0
  34. package/dist/lib/esm/incompatible-installer-version-error.mjs +28 -0
  35. package/dist/lib/esm/index.d.mts +6 -0
  36. package/dist/lib/esm/index.mjs +7 -1
  37. package/dist/lib/esm/installer-compatibility.d.mts +75 -0
  38. package/dist/lib/esm/installer-compatibility.mjs +40 -0
  39. package/dist/lib/esm/library.mjs +1 -1
  40. package/dist/lib/esm/namespace-bootstrap.mjs +16 -7
  41. package/dist/lib/esm/obsidian-installer.mjs +7 -4
  42. package/dist/lib/esm/obsidian-metadata.d.mts +56 -0
  43. package/dist/lib/esm/obsidian-metadata.mjs +1787 -0
  44. package/dist/lib/esm/transport-desktop-cdp.d.mts +27 -1
  45. package/dist/lib/esm/transport-desktop-cdp.mjs +20 -3
  46. package/dist/lib/esm/transport-factory.d.mts +1 -1
  47. package/dist/lib/esm/transport-factory.mjs +77 -23
  48. package/dist/lib/esm/transport-options.d.mts +24 -7
  49. package/dist/lib/esm/visibility.d.mts +27 -8
  50. package/dist/lib/esm/visibility.mjs +8 -2
  51. package/dist/obsidian-integration-testing-8.1.2.tgz +0 -0
  52. package/package.json +2 -2
  53. package/dist/obsidian-integration-testing-8.1.0.tgz +0 -0
@@ -149,9 +149,12 @@ function extractWindowsShell(assetPath, shellDir) {
149
149
  }
150
150
  async function fetchReleaseAssetNames(version) {
151
151
  try {
152
- const response = await fetch(`${RELEASE_API_TAG_URL}/v${version}`, {
153
- headers: { "Accept": "application/vnd.github+json", "User-Agent": DOWNLOAD_USER_AGENT }
154
- });
152
+ const headers = new Headers({ "Accept": "application/vnd.github+json", "User-Agent": DOWNLOAD_USER_AGENT });
153
+ const token = process.env["GITHUB_TOKEN"] ?? process.env["GH_TOKEN"];
154
+ if (token) {
155
+ headers.set("Authorization", `Bearer ${token}`);
156
+ }
157
+ const response = await fetch(`${RELEASE_API_TAG_URL}/v${version}`, { headers });
155
158
  if (!response.ok) {
156
159
  log(`[installer] Release API for ${version} returned HTTP ${String(response.status)}; falling back to templated asset names.`);
157
160
  return void 0;
@@ -194,4 +197,4 @@ export {
194
197
  ensureShellCached,
195
198
  getCachedShellDir
196
199
  };
197
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgaGVscGVycyBmb3IgcmVzb2x2aW5nIHRoZSBPYnNpZGlhbiAqKnNoZWxsKiogKHRoZSBFbGVjdHJvblxuICogcnVudGltZSAvIGluc3RhbGxlciBidWlsZCkgdG8gbGF1bmNoLlxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgdXNlcyB0aGUgaW5zdGFsbGVkIHNoZWxsLiBXaGVuIGEgc3BlY2lmaWMgaW5zdGFsbGVyXG4gKiB2ZXJzaW9uIGlzIHJlcXVlc3RlZCwgaXQgZG93bmxvYWRzIHRoYXQgdmVyc2lvbidzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGFuZFxuICogZXh0cmFjdHMgYSBwb3J0YWJsZSBzaGVsbCBpbnRvIGEgY2FjaGUsIHJldHVybmluZyB0aGUgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gKlxuICogR2l0SHViIHJlbGVhc2UgYXNzZXRzIGV4aXN0IGZvciAqKnB1YmxpYyoqIHJlbGVhc2VzIG9ubHk7IGNhdGFseXN0IChiZXRhKVxuICogYnVpbGRzIHB1Ymxpc2ggb25seSB0aGUgYXNhciwgc28gaW5zdGFsbGVyLXBpbm5pbmcgc3VwcG9ydHMgcHVibGljIHZlcnNpb25zLlxuICogVGhlIGV4dHJhY3RlZCBzaGVsbCdzIGJ1bmRsZWQgYHJlc291cmNlcy9vYnNpZGlhbi5hc2FyYCBpcyB0aGF0IHZlcnNpb24sIHNvXG4gKiBwaW5uaW5nIHRoZSBpbnN0YWxsZXIgaXMgaG93IHlvdSBydW4gYSB2ZXJzaW9uICoqb2xkZXIqKiB0aGFuIHRoZSBpbnN0YWxsZWRcbiAqIHNoZWxsIChhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5IFx1MjAxNCBzZWUgYG9ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzYCkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZG93bmxvYWQvZXh0cmFjdGlvbiBnbHVlIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQge1xuICBleGVjRmlsZVN5bmMsXG4gIHNwYXduU3luY1xufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIGJ1aWxkSW5zdGFsbGVyQXNzZXROYW1lQ2FuZGlkYXRlcyxcbiAgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lXG59IGZyb20gJy4vaW5zdGFsbGVyLWFzc2V0Lm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG4vKipcbiAqIEJyb3dzZXIgVXNlci1BZ2VudCBmb3IgZG93bmxvYWRpbmcgcmVsZWFzZSBhc3NldHMgKENsb3VkZmxhcmUtZ2F0ZWQpLlxuICovXG5jb25zdCBET1dOTE9BRF9VU0VSX0FHRU5UID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84Ni4wLjQyNDAuMTgzIFNhZmFyaS81MzcuMzYnO1xuXG4vKiogQmFzZSBVUkwgZm9yIGBvYnNpZGlhbi1yZWxlYXNlc2AgcmVsZWFzZSBhc3NldHMgKGAuLi4vZG93bmxvYWQvdjx2ZXI+Lzxhc3NldD5gKS4gKi9cbmNvbnN0IFJFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvcmVsZWFzZXMvZG93bmxvYWQnO1xuXG4vKiogR2l0SHViIFJFU1QgZW5kcG9pbnQgbGlzdGluZyBhIHJlbGVhc2UncyBhc3NldHMgYnkgdGFnIChgLi4uL3JlbGVhc2VzL3RhZ3Mvdjx2ZXI+YCkuICovXG5jb25zdCBSRUxFQVNFX0FQSV9UQUdfVVJMID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9yZWxlYXNlcy90YWdzJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIEdpdEh1YiByZWxlYXNlIEFQSSByZXNwb25zZSB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqIFRoZSByZWxlYXNlJ3MgZG93bmxvYWRhYmxlIGFzc2V0cy4gKi9cbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBHaXRIdWJSZWxlYXNlQXNzZXRbXTtcbn1cblxuLyoqIFRoZSBzdWJzZXQgb2YgYSBHaXRIdWIgcmVsZWFzZSdzIGFzc2V0IG9iamVjdCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlQXNzZXQge1xuICAvKiogVGhlIGFzc2V0IGZpbGUgbmFtZSwgZS5nLiBgT2JzaWRpYW4uMC4xNC41LmV4ZWAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBTSEVMTF9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdzaGVsbC1jYWNoZScpO1xuY29uc3QgTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTiA9IC88a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPFxcL2tleT5cXHMqPHN0cmluZz4oPzx2ZXJzaW9uPltePF0rKTxcXC9zdHJpbmc+LztcblxuLyoqXG4gKiBBIHJlc29sdmVkIE9ic2lkaWFuIHNoZWxsIGV4ZWN1dGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTaGVsbCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlIHRvIGxhdW5jaC4gKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgc2hlbGwncyB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBpZiBpdCBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQuICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSB2ZXJzaW9uIG9mIGFuIGluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCBmcm9tIGl0cyBleGVjdXRhYmxlLlxuICpcbiAqIC0gV2luZG93czogdGhlIGV4ZWN1dGFibGUncyBQRSBgRmlsZVZlcnNpb25gLlxuICogLSBtYWNPUzogYENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nYCBmcm9tIHRoZSBhcHAgYnVuZGxlJ3MgYEluZm8ucGxpc3RgLlxuICogLSBMaW51eDogYmVzdC1lZmZvcnQgcGFyc2UgZnJvbSB0aGUgZXhlY3V0YWJsZSBwYXRoIChvZnRlbiBgdW5kZWZpbmVkYCkuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlLlxuICogQHJldHVybnMgVGhlIGB4LnkuemAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGRldGVjdE1hY0J1bmRsZVZlcnNpb24oZXhlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0VmVyc2lvbkZyb21QYXRoKGV4ZVBhdGgpO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgYSBwb3J0YWJsZSBPYnNpZGlhbiBzaGVsbCBmb3IgdGhlIGdpdmVuIHZlcnNpb24gaXMgZXh0cmFjdGVkIGludG8gdGhlXG4gKiBjYWNoZSwgZG93bmxvYWRpbmcgYW5kIGV4dHJhY3RpbmcgaXRzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGlmIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkIG9yIGV4dHJhY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNoZWxsQ2FjaGVkKHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNoZWxsRGlyID0gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbik7XG4gIGNvbnN0IGV4ZVBhdGggPSBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXIpO1xuICBpZiAoZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIGxvZyhgW2luc3RhbGxlcl0gVXNpbmcgY2FjaGVkIHNoZWxsIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBleGVQYXRoO1xuICB9XG5cbiAgbWtkaXJTeW5jKHNoZWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgYXNzZXRVcmxzID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uKTtcbiAgY29uc3QgYXNzZXRQYXRoID0gYXdhaXQgZG93bmxvYWRJbnN0YWxsZXJBc3NldChhc3NldFVybHMsIHNoZWxsRGlyLCB2ZXJzaW9uKTtcbiAgZXh0cmFjdFNoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICBybVN5bmMoYXNzZXRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gIGlmICghZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0cmFjdGVkIE9ic2lkaWFuIHNoZWxsICR7dmVyc2lvbn0gYnV0IGV4ZWN1dGFibGUgbm90IGZvdW5kIGF0ICR7ZXhlUGF0aH0uYCk7XG4gIH1cbiAgbG9nKGBbaW5zdGFsbGVyXSBFeHRyYWN0ZWQgc2hlbGwgJHt2ZXJzaW9ufSAtPiAke2V4ZVBhdGh9YCk7XG4gIHJldHVybiBleGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlIGRpcmVjdG9yeSBhIHZlcnNpb24ncyBleHRyYWN0ZWQgc2hlbGwgbGl2ZXMgaW4gKHRoZVxuICogZGlyZWN0b3J5IG1heSBub3QgeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBzaGVsbCBjYWNoZSBkaXJlY3RvcnkgZm9yIHRoZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oU0hFTExfQ0FDSEVfRElSLCB2ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBkZXNjcmlwdGl2ZSBlcnJvciBpZiBhIHJlcXVpcmVkIGNvbW1hbmQgaXMgbm90IG9uIGBQQVRIYC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gaGludCAtIEFjdGlvbmFibGUgZ3VpZGFuY2UgYXBwZW5kZWQgdG8gdGhlIGVycm9yLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDb21tYW5kQXZhaWxhYmxlKGNvbW1hbmQ6IHN0cmluZywgaGludDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHByb2JlID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICd3aGVyZS5leGUnIDogJ3doaWNoJztcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKHByb2JlLCBbY29tbWFuZF0sIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgY29tbWFuZCBcIiR7Y29tbWFuZH1cIiB3YXMgbm90IGZvdW5kIG9uIFBBVEguICR7aGludH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZ2AgZnJvbSBhIG1hY09TIGFwcCBidW5kbGUncyBgSW5mby5wbGlzdGAuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBQYXRoIHRvIGAuLi4vT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuYC5cbiAqIEByZXR1cm5zIFRoZSBgeC55LnpgIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RNYWNCdW5kbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudHNEaXIgPSBkaXJuYW1lKGRpcm5hbWUoZXhlUGF0aCkpO1xuICAgIGNvbnN0IHBsaXN0ID0gcmVhZEZpbGVTeW5jKGpvaW4oY29udGVudHNEaXIsICdJbmZvLnBsaXN0JyksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTi5leGVjKHBsaXN0KTtcbiAgICByZXR1cm4gbWF0Y2g/Lmdyb3Vwcz8uWyd2ZXJzaW9uJ107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBwYXJzZSBvZiBhbiBgeC55LnpgIHZlcnNpb24gZW1iZWRkZWQgaW4gYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwYXRoIG9yIHN0cmluZyB0byBzY2FuLlxuICogQHJldHVybnMgVGhlIGZpcnN0IGB4LnkuemAgbWF0Y2gsIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RWZXJzaW9uRnJvbVBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gLyg/PHZlcnNpb24+XFxkK1xcLlxcZCtcXC5cXGQrKS8uZXhlYyh2YWx1ZSk7XG4gIHJldHVybiBtYXRjaD8uZ3JvdXBzPy5bJ3ZlcnNpb24nXTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgUEUgYEZpbGVWZXJzaW9uYCBvZiBhIFdpbmRvd3MgZXhlY3V0YWJsZSB2aWEgUG93ZXJTaGVsbC5cbiAqXG4gKiBAcGFyYW0gZXhlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUuXG4gKiBAcmV0dXJucyBUaGUgYHgueS56YCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlY0ZpbGVTeW5jKFxuICAgICAgJ3Bvd2Vyc2hlbGwnLFxuICAgICAgWyctTm9Qcm9maWxlJywgJy1Db21tYW5kJywgYChHZXQtSXRlbSAtTGl0ZXJhbFBhdGggJHtKU09OLnN0cmluZ2lmeShleGVQYXRoKX0pLlZlcnNpb25JbmZvLkZpbGVWZXJzaW9uYF0sXG4gICAgICB7IGVuY29kaW5nOiAndXRmLTgnIH1cbiAgICApO1xuICAgIGNvbnN0IHZlcnNpb24gPSBvdXRwdXQudHJpbSgpO1xuICAgIHJldHVybiB2ZXJzaW9uLmxlbmd0aCA+IDAgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWRzIGEgc2luZ2xlIHJlbGVhc2UgYXNzZXQgZm9yIGEgdmVyc2lvbiB0byBhIGRlc3RpbmF0aW9uIGZpbGUuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBhc3NldCBkb3dubG9hZCBVUkwuXG4gKiBAcGFyYW0gZGVzdCAtIERlc3RpbmF0aW9uIGZpbGUgcGF0aC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXNzZXQodXJsOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFtpbnN0YWxsZXJdIERvd25sb2FkaW5nIGluc3RhbGxlciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHdyaXRlRmlsZVN5bmMoZGVzdCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyB0aGUgZmlyc3QgcmVhY2hhYmxlIGluc3RhbGxlciBhc3NldCBmcm9tIGFuIG9yZGVyZWQgbGlzdCBvZlxuICogY2FuZGlkYXRlIFVSTHMsIHJldHVybmluZyB0aGUgcGF0aCBpdCB3YXMgc2F2ZWQgdG8uXG4gKlxuICogQHBhcmFtIHVybHMgLSBDYW5kaWRhdGUgYXNzZXQgVVJMcywgaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgcmVsZWFzZSB2ZXJzaW9uIChmb3IgZXJyb3IgbWVzc2FnZXMpLlxuICogQHJldHVybnMgVGhlIGRvd25sb2FkZWQgYXNzZXQncyBwYXRoLlxuICogQHRocm93cyBFcnJvciBpZiBub25lIG9mIHRoZSBjYW5kaWRhdGVzIGNhbiBiZSBkb3dubG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEluc3RhbGxlckFzc2V0KHVybHM6IHN0cmluZ1tdLCBzaGVsbERpcjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgdXJsIG9mIHVybHMpIHtcbiAgICBjb25zdCBhc3NldFBhdGggPSBqb2luKHNoZWxsRGlyLCBiYXNlbmFtZSh1cmwpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZG93bmxvYWRBc3NldCh1cmwsIGFzc2V0UGF0aCk7XG4gICAgICByZXR1cm4gYXNzZXRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBpbnN0YWxsZXIgJHt2ZXJzaW9ufS4gQXR0ZW1wdHM6ICR7ZXJyb3JzLmpvaW4oJzsgJyl9LiBgXG4gICAgICArICdDYXRhbHlzdC9iZXRhIHZlcnNpb25zIGhhdmUgbm8gcHVibGljIGluc3RhbGxlciBcdTIwMTQgcGluIGFuIGFzYXIgdmVyc2lvbiBvbiBhIHB1YmxpYy9pbnN0YWxsZWQgc2hlbGwgaW5zdGVhZC4nXG4gICk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBMaW51eCBgLnRhci5nemAgcG9ydGFibGUgYnVpbGQuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC50YXIuZ3pgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGg6IHN0cmluZywgc2hlbGxEaXI6IHN0cmluZyk6IHZvaWQge1xuICBydW4oJ3RhcicsIFsneHpmJywgYXNzZXRQYXRoLCAnLUMnLCBzaGVsbERpciwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgbWFjT1MgYC5kbWdgIGJ5IG1vdW50aW5nIGl0IGFuZCBjb3B5aW5nIHRoZSBhcHAgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSBhc3NldFBhdGggLSBQYXRoIHRvIHRoZSBkb3dubG9hZGVkIGAuZG1nYC5cbiAqIEBwYXJhbSBzaGVsbERpciAtIERlc3RpbmF0aW9uIHNoZWxsIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1hY1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vdW50UG9pbnQgPSBqb2luKHNoZWxsRGlyLCAnX19tbnQnKTtcbiAgbWtkaXJTeW5jKG1vdW50UG9pbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBydW4oJ2hkaXV0aWwnLCBbJ2F0dGFjaCcsICctbm9icm93c2UnLCAnLW1vdW50cG9pbnQnLCBtb3VudFBvaW50LCBhc3NldFBhdGhdKTtcbiAgdHJ5IHtcbiAgICBydW4oJ2NwJywgWyctUicsIGpvaW4obW91bnRQb2ludCwgJ09ic2lkaWFuLmFwcCcpLCBzaGVsbERpcl0pO1xuICB9IGZpbmFsbHkge1xuICAgIHJ1bignaGRpdXRpbCcsIFsnZGV0YWNoJywgbW91bnRQb2ludF0pO1xuICB9XG4gIHJtU3luYyhtb3VudFBvaW50LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBkb3dubG9hZGVkIGluc3RhbGxlciBhc3NldCBpbnRvIGEgc2hlbGwgZGlyZWN0b3J5LCBwZXIgcGxhdGZvcm0uXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFRoZSBkb3dubG9hZGVkIGFzc2V0IHBhdGguXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0U2hlbGwoYXNzZXRQYXRoOiBzdHJpbmcsIHNoZWxsRGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIGV4dHJhY3RNYWNTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIFdpbmRvd3MgTlNJUyBpbnN0YWxsZXIncyBpbm5lciBhcHAgcGF5bG9hZCB2aWEgNy1aaXAuXG4gKlxuICogVGhlIE5TSVMgaW5zdGFsbGVyIGAuZXhlYCBjb250YWlucyBgJFBMVUdJTlNESVIvYXBwLTY0Ljd6YCwgd2hpY2ggaG9sZHMgdGhlXG4gKiBwb3J0YWJsZSBhcHAgKG1pcnJvcnMgaG93IHRoZSBzY29vcCBtYW5pZmVzdCBpbnN0YWxscyBPYnNpZGlhbikuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC5leGVgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGFzc2VydENvbW1hbmRBdmFpbGFibGUoJzd6JywgJ0luc3RhbGwgNy1aaXAgKGUuZy4gYHNjb29wIGluc3RhbGwgN3ppcGApIHRvIGV4dHJhY3QgYSBwaW5uZWQgT2JzaWRpYW4gaW5zdGFsbGVyLicpO1xuICBjb25zdCBuc2lzRXh0cmFjdERpciA9IGpvaW4oc2hlbGxEaXIsICdfX25zaXMnKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7bnNpc0V4dHJhY3REaXJ9YCwgYXNzZXRQYXRoXSk7XG4gIGNvbnN0IGlubmVyQXJjaGl2ZSA9IGpvaW4obnNpc0V4dHJhY3REaXIsICckUExVR0lOU0RJUicsICdhcHAtNjQuN3onKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7c2hlbGxEaXJ9YCwgaW5uZXJBcmNoaXZlXSk7XG4gIHJtU3luYyhuc2lzRXh0cmFjdERpciwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSByZWxlYXNlJ3MgYXNzZXQgbmFtZXMgZnJvbSB0aGUgR2l0SHViIEFQSS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSByZWxlYXNlIHZlcnNpb24gKHRhZyBgdjx2ZXJzaW9uPmApLlxuICogQHJldHVybnMgVGhlIGFzc2V0IG5hbWVzLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgQVBJIGlzIHVuYXZhaWxhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlbGVhc2VBc3NldE5hbWVzKHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke1JFTEVBU0VfQVBJX1RBR19VUkx9L3Yke3ZlcnNpb259YCwge1xuICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsICdVc2VyLUFnZW50JzogRE9XTkxPQURfVVNFUl9BR0VOVCB9XG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nKGBbaW5zdGFsbGVyXSBSZWxlYXNlIEFQSSBmb3IgJHt2ZXJzaW9ufSByZXR1cm5lZCBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9OyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBHaXRIdWJSZWxlYXNlO1xuICAgIHJldHVybiByZWxlYXNlLmFzc2V0cy5tYXAoKGFzc2V0KSA9PiBhc3NldC5uYW1lKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYFtpbnN0YWxsZXJdIFJlbGVhc2UgQVBJIGZvciAke3ZlcnNpb259IHVuYXZhaWxhYmxlICgke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX0pOyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHBlY3RlZCBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZSBwYXRoIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgc2hlbGwgY2FjaGUgZGlyZWN0b3J5IGZvciBhIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGpvaW4oc2hlbGxEaXIsICdPYnNpZGlhbi5leGUnKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKHNoZWxsRGlyLCAnT2JzaWRpYW4uYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ09ic2lkaWFuJyk7XG4gIH1cblxuICByZXR1cm4gam9pbihzaGVsbERpciwgJ29ic2lkaWFuJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG9yZGVyZWQgaW5zdGFsbGVyIGFzc2V0IGRvd25sb2FkIFVSTHMgdG8gdHJ5IGZvciBhIHZlcnNpb24uXG4gKlxuICogVGhlIHJlbGVhc2UncyByZWFsIGFzc2V0IGxpc3QgaXMgcXVlcmllZCBmaXJzdCBzbyB0aGUgcGxhdGZvcm0tY29ycmVjdCBhc3NldFxuICogaXMgcGlja2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIGhpc3RvcmljYWwgZG90LXZzLWh5cGhlbiBuYW1pbmc7IGlmIHRoYXQgY2FsbCBpc1xuICogdW5hdmFpbGFibGUgaXQgZmFsbHMgYmFjayB0byB0cnlpbmcgYm90aCB0ZW1wbGF0ZWQgc2VwYXJhdG9yIGZvcm1zLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIENhbmRpZGF0ZSBhc3NldCBVUkxzLCBpbiBwcmlvcml0eSBvcmRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGFzc2V0TmFtZXMgPSBhd2FpdCBmZXRjaFJlbGVhc2VBc3NldE5hbWVzKHZlcnNpb24pO1xuICBpZiAoYXNzZXROYW1lcykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lKHsgYXNzZXROYW1lcywgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sIHZlcnNpb24gfSk7XG4gICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbYCR7UkVMRUFTRV9ET1dOTE9BRF9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHtzZWxlY3RlZH1gXTtcbiAgICB9XG4gICAgbG9nKGBbaW5zdGFsbGVyXSBObyBpbnN0YWxsZXIgYXNzZXQgbWF0Y2hlZCBmb3IgJHt2ZXJzaW9ufTsgZmFsbGluZyBiYWNrIHRvIHRlbXBsYXRlZCBhc3NldCBuYW1lcy5gKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXMoeyBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSwgdmVyc2lvbiB9KVxuICAgIC5tYXAoKG5hbWUpID0+IGAke1JFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7bmFtZX1gKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgY29tbWFuZCBzeW5jaHJvbm91c2x5LCB0aHJvd2luZyBvbiBhIG5vbi16ZXJvIGV4aXQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gcnVuKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLm1hcCgoYXJnKSA9PiBiYXNlbmFtZShhcmcpKS5qb2luKCcgJyl9IChleGl0ICR7U3RyaW5nKHJlc3VsdC5zdGF0dXMpfSlgKTtcbiAgfVxufVxuXG4v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LFNBQVMsTUFBTSxDQUFDLDBDQUEwQztBQUM3SCxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sVUFBVSxNQUFNLFNBQVMsS0FBSztBQUNwQyxXQUFPLFFBQVEsT0FBTyxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUk7QUFBQSxFQUNqRCxTQUFTLE9BQU87QUFDZCxRQUFJLCtCQUErQixPQUFPLGlCQUFpQixpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLLENBQUMsMkNBQTJDO0FBQzVKLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFRQSxTQUFTLHNCQUFzQixVQUEwQjtBQUN2RCxNQUFJLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFdBQU8sS0FBSyxVQUFVLGNBQWM7QUFBQSxFQUN0QztBQUVBLE1BQUksUUFBUSxhQUFhLFVBQVU7QUFDakMsV0FBTyxLQUFLLFVBQVUsZ0JBQWdCLFlBQVksU0FBUyxVQUFVO0FBQUEsRUFDdkU7QUFFQSxTQUFPLEtBQUssVUFBVSxVQUFVO0FBQ2xDO0FBWUEsZUFBZSwwQkFBMEIsU0FBb0M7QUFDM0UsUUFBTSxhQUFhLE1BQU0sdUJBQXVCLE9BQU87QUFDdkQsTUFBSSxZQUFZO0FBQ2QsVUFBTSxXQUFXLHlCQUF5QixFQUFFLFlBQVksVUFBVSxRQUFRLFVBQVUsUUFBUSxDQUFDO0FBQzdGLFFBQUksYUFBYSxRQUFXO0FBQzFCLGFBQU8sQ0FBQyxHQUFHLHlCQUF5QixLQUFLLE9BQU8sSUFBSSxRQUFRLEVBQUU7QUFBQSxJQUNoRTtBQUNBLFFBQUksOENBQThDLE9BQU8sMENBQTBDO0FBQUEsRUFDckc7QUFFQSxTQUFPLGtDQUFrQyxFQUFFLFVBQVUsUUFBUSxVQUFVLFFBQVEsQ0FBQyxFQUM3RSxJQUFJLENBQUMsU0FBUyxHQUFHLHlCQUF5QixLQUFLLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDckU7QUFRQSxTQUFTLElBQUksU0FBaUIsTUFBc0I7QUFDbEQsUUFBTSxTQUFTLFVBQVUsU0FBUyxNQUFNLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDM0QsTUFBSSxPQUFPLFdBQVcsR0FBRztBQUN2QixVQUFNLElBQUksTUFBTSxtQkFBbUIsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsU0FBUyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxVQUFVLE9BQU8sT0FBTyxNQUFNLENBQUMsR0FBRztBQUFBLEVBQzVIO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
200
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgaGVscGVycyBmb3IgcmVzb2x2aW5nIHRoZSBPYnNpZGlhbiAqKnNoZWxsKiogKHRoZSBFbGVjdHJvblxuICogcnVudGltZSAvIGluc3RhbGxlciBidWlsZCkgdG8gbGF1bmNoLlxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgdXNlcyB0aGUgaW5zdGFsbGVkIHNoZWxsLiBXaGVuIGEgc3BlY2lmaWMgaW5zdGFsbGVyXG4gKiB2ZXJzaW9uIGlzIHJlcXVlc3RlZCwgaXQgZG93bmxvYWRzIHRoYXQgdmVyc2lvbidzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGFuZFxuICogZXh0cmFjdHMgYSBwb3J0YWJsZSBzaGVsbCBpbnRvIGEgY2FjaGUsIHJldHVybmluZyB0aGUgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gKlxuICogR2l0SHViIHJlbGVhc2UgYXNzZXRzIGV4aXN0IGZvciAqKnB1YmxpYyoqIHJlbGVhc2VzIG9ubHk7IGNhdGFseXN0IChiZXRhKVxuICogYnVpbGRzIHB1Ymxpc2ggb25seSB0aGUgYXNhciwgc28gaW5zdGFsbGVyLXBpbm5pbmcgc3VwcG9ydHMgcHVibGljIHZlcnNpb25zLlxuICogVGhlIGV4dHJhY3RlZCBzaGVsbCdzIGJ1bmRsZWQgYHJlc291cmNlcy9vYnNpZGlhbi5hc2FyYCBpcyB0aGF0IHZlcnNpb24sIHNvXG4gKiBwaW5uaW5nIHRoZSBpbnN0YWxsZXIgaXMgaG93IHlvdSBydW4gYSB2ZXJzaW9uICoqb2xkZXIqKiB0aGFuIHRoZSBpbnN0YWxsZWRcbiAqIHNoZWxsIChhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5IFx1MjAxNCBzZWUgYG9ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzYCkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZG93bmxvYWQvZXh0cmFjdGlvbiBnbHVlIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQge1xuICBleGVjRmlsZVN5bmMsXG4gIHNwYXduU3luY1xufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIGJ1aWxkSW5zdGFsbGVyQXNzZXROYW1lQ2FuZGlkYXRlcyxcbiAgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lXG59IGZyb20gJy4vaW5zdGFsbGVyLWFzc2V0Lm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG4vKipcbiAqIEJyb3dzZXIgVXNlci1BZ2VudCBmb3IgZG93bmxvYWRpbmcgcmVsZWFzZSBhc3NldHMgKENsb3VkZmxhcmUtZ2F0ZWQpLlxuICovXG5jb25zdCBET1dOTE9BRF9VU0VSX0FHRU5UID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84Ni4wLjQyNDAuMTgzIFNhZmFyaS81MzcuMzYnO1xuXG4vKiogQmFzZSBVUkwgZm9yIGBvYnNpZGlhbi1yZWxlYXNlc2AgcmVsZWFzZSBhc3NldHMgKGAuLi4vZG93bmxvYWQvdjx2ZXI+Lzxhc3NldD5gKS4gKi9cbmNvbnN0IFJFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvcmVsZWFzZXMvZG93bmxvYWQnO1xuXG4vKiogR2l0SHViIFJFU1QgZW5kcG9pbnQgbGlzdGluZyBhIHJlbGVhc2UncyBhc3NldHMgYnkgdGFnIChgLi4uL3JlbGVhc2VzL3RhZ3Mvdjx2ZXI+YCkuICovXG5jb25zdCBSRUxFQVNFX0FQSV9UQUdfVVJMID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9yZWxlYXNlcy90YWdzJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgdGhlIEdpdEh1YiByZWxlYXNlIEFQSSByZXNwb25zZSB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqIFRoZSByZWxlYXNlJ3MgZG93bmxvYWRhYmxlIGFzc2V0cy4gKi9cbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBHaXRIdWJSZWxlYXNlQXNzZXRbXTtcbn1cblxuLyoqIFRoZSBzdWJzZXQgb2YgYSBHaXRIdWIgcmVsZWFzZSdzIGFzc2V0IG9iamVjdCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlQXNzZXQge1xuICAvKiogVGhlIGFzc2V0IGZpbGUgbmFtZSwgZS5nLiBgT2JzaWRpYW4uMC4xNC41LmV4ZWAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBTSEVMTF9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdzaGVsbC1jYWNoZScpO1xuY29uc3QgTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTiA9IC88a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPFxcL2tleT5cXHMqPHN0cmluZz4oPzx2ZXJzaW9uPltePF0rKTxcXC9zdHJpbmc+LztcblxuLyoqXG4gKiBBIHJlc29sdmVkIE9ic2lkaWFuIHNoZWxsIGV4ZWN1dGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTaGVsbCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlIHRvIGxhdW5jaC4gKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgc2hlbGwncyB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCBpZiBpdCBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQuICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSB2ZXJzaW9uIG9mIGFuIGluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCBmcm9tIGl0cyBleGVjdXRhYmxlLlxuICpcbiAqIC0gV2luZG93czogdGhlIGV4ZWN1dGFibGUncyBQRSBgRmlsZVZlcnNpb25gLlxuICogLSBtYWNPUzogYENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nYCBmcm9tIHRoZSBhcHAgYnVuZGxlJ3MgYEluZm8ucGxpc3RgLlxuICogLSBMaW51eDogYmVzdC1lZmZvcnQgcGFyc2UgZnJvbSB0aGUgZXhlY3V0YWJsZSBwYXRoIChvZnRlbiBgdW5kZWZpbmVkYCkuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBleGVjdXRhYmxlLlxuICogQHJldHVybnMgVGhlIGB4LnkuemAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGRldGVjdE1hY0J1bmRsZVZlcnNpb24oZXhlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0VmVyc2lvbkZyb21QYXRoKGV4ZVBhdGgpO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgYSBwb3J0YWJsZSBPYnNpZGlhbiBzaGVsbCBmb3IgdGhlIGdpdmVuIHZlcnNpb24gaXMgZXh0cmFjdGVkIGludG8gdGhlXG4gKiBjYWNoZSwgZG93bmxvYWRpbmcgYW5kIGV4dHJhY3RpbmcgaXRzIEdpdEh1YiByZWxlYXNlIGFzc2V0IGlmIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkIG9yIGV4dHJhY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNoZWxsQ2FjaGVkKHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNoZWxsRGlyID0gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbik7XG4gIGNvbnN0IGV4ZVBhdGggPSBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXIpO1xuICBpZiAoZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIGxvZyhgW2luc3RhbGxlcl0gVXNpbmcgY2FjaGVkIHNoZWxsIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBleGVQYXRoO1xuICB9XG5cbiAgbWtkaXJTeW5jKHNoZWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgYXNzZXRVcmxzID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uKTtcbiAgY29uc3QgYXNzZXRQYXRoID0gYXdhaXQgZG93bmxvYWRJbnN0YWxsZXJBc3NldChhc3NldFVybHMsIHNoZWxsRGlyLCB2ZXJzaW9uKTtcbiAgZXh0cmFjdFNoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICBybVN5bmMoYXNzZXRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuXG4gIGlmICghZXhpc3RzU3luYyhleGVQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0cmFjdGVkIE9ic2lkaWFuIHNoZWxsICR7dmVyc2lvbn0gYnV0IGV4ZWN1dGFibGUgbm90IGZvdW5kIGF0ICR7ZXhlUGF0aH0uYCk7XG4gIH1cbiAgbG9nKGBbaW5zdGFsbGVyXSBFeHRyYWN0ZWQgc2hlbGwgJHt2ZXJzaW9ufSAtPiAke2V4ZVBhdGh9YCk7XG4gIHJldHVybiBleGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlIGRpcmVjdG9yeSBhIHZlcnNpb24ncyBleHRyYWN0ZWQgc2hlbGwgbGl2ZXMgaW4gKHRoZVxuICogZGlyZWN0b3J5IG1heSBub3QgeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgcHVibGljIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBzaGVsbCBjYWNoZSBkaXJlY3RvcnkgZm9yIHRoZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkU2hlbGxEaXIodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oU0hFTExfQ0FDSEVfRElSLCB2ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBkZXNjcmlwdGl2ZSBlcnJvciBpZiBhIHJlcXVpcmVkIGNvbW1hbmQgaXMgbm90IG9uIGBQQVRIYC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gaGludCAtIEFjdGlvbmFibGUgZ3VpZGFuY2UgYXBwZW5kZWQgdG8gdGhlIGVycm9yLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDb21tYW5kQXZhaWxhYmxlKGNvbW1hbmQ6IHN0cmluZywgaGludDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHByb2JlID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICd3aGVyZS5leGUnIDogJ3doaWNoJztcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKHByb2JlLCBbY29tbWFuZF0sIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgY29tbWFuZCBcIiR7Y29tbWFuZH1cIiB3YXMgbm90IGZvdW5kIG9uIFBBVEguICR7aGludH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZ2AgZnJvbSBhIG1hY09TIGFwcCBidW5kbGUncyBgSW5mby5wbGlzdGAuXG4gKlxuICogQHBhcmFtIGV4ZVBhdGggLSBQYXRoIHRvIGAuLi4vT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuYC5cbiAqIEByZXR1cm5zIFRoZSBgeC55LnpgIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RNYWNCdW5kbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudHNEaXIgPSBkaXJuYW1lKGRpcm5hbWUoZXhlUGF0aCkpO1xuICAgIGNvbnN0IHBsaXN0ID0gcmVhZEZpbGVTeW5jKGpvaW4oY29udGVudHNEaXIsICdJbmZvLnBsaXN0JyksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gTUFDX1BMSVNUX1ZFUlNJT05fUEFUVEVSTi5leGVjKHBsaXN0KTtcbiAgICByZXR1cm4gbWF0Y2g/Lmdyb3Vwcz8uWyd2ZXJzaW9uJ107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBwYXJzZSBvZiBhbiBgeC55LnpgIHZlcnNpb24gZW1iZWRkZWQgaW4gYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBwYXRoIG9yIHN0cmluZyB0byBzY2FuLlxuICogQHJldHVybnMgVGhlIGZpcnN0IGB4LnkuemAgbWF0Y2gsIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBkZXRlY3RWZXJzaW9uRnJvbVBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gLyg/PHZlcnNpb24+XFxkK1xcLlxcZCtcXC5cXGQrKS8uZXhlYyh2YWx1ZSk7XG4gIHJldHVybiBtYXRjaD8uZ3JvdXBzPy5bJ3ZlcnNpb24nXTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgUEUgYEZpbGVWZXJzaW9uYCBvZiBhIFdpbmRvd3MgZXhlY3V0YWJsZSB2aWEgUG93ZXJTaGVsbC5cbiAqXG4gKiBAcGFyYW0gZXhlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUuXG4gKiBAcmV0dXJucyBUaGUgYHgueS56YCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZpbGVWZXJzaW9uKGV4ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlY0ZpbGVTeW5jKFxuICAgICAgJ3Bvd2Vyc2hlbGwnLFxuICAgICAgWyctTm9Qcm9maWxlJywgJy1Db21tYW5kJywgYChHZXQtSXRlbSAtTGl0ZXJhbFBhdGggJHtKU09OLnN0cmluZ2lmeShleGVQYXRoKX0pLlZlcnNpb25JbmZvLkZpbGVWZXJzaW9uYF0sXG4gICAgICB7IGVuY29kaW5nOiAndXRmLTgnIH1cbiAgICApO1xuICAgIGNvbnN0IHZlcnNpb24gPSBvdXRwdXQudHJpbSgpO1xuICAgIHJldHVybiB2ZXJzaW9uLmxlbmd0aCA+IDAgPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWRzIGEgc2luZ2xlIHJlbGVhc2UgYXNzZXQgZm9yIGEgdmVyc2lvbiB0byBhIGRlc3RpbmF0aW9uIGZpbGUuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBhc3NldCBkb3dubG9hZCBVUkwuXG4gKiBAcGFyYW0gZGVzdCAtIERlc3RpbmF0aW9uIGZpbGUgcGF0aC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXNzZXQodXJsOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFtpbnN0YWxsZXJdIERvd25sb2FkaW5nIGluc3RhbGxlciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHdyaXRlRmlsZVN5bmMoZGVzdCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyB0aGUgZmlyc3QgcmVhY2hhYmxlIGluc3RhbGxlciBhc3NldCBmcm9tIGFuIG9yZGVyZWQgbGlzdCBvZlxuICogY2FuZGlkYXRlIFVSTHMsIHJldHVybmluZyB0aGUgcGF0aCBpdCB3YXMgc2F2ZWQgdG8uXG4gKlxuICogQHBhcmFtIHVybHMgLSBDYW5kaWRhdGUgYXNzZXQgVVJMcywgaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgcmVsZWFzZSB2ZXJzaW9uIChmb3IgZXJyb3IgbWVzc2FnZXMpLlxuICogQHJldHVybnMgVGhlIGRvd25sb2FkZWQgYXNzZXQncyBwYXRoLlxuICogQHRocm93cyBFcnJvciBpZiBub25lIG9mIHRoZSBjYW5kaWRhdGVzIGNhbiBiZSBkb3dubG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEluc3RhbGxlckFzc2V0KHVybHM6IHN0cmluZ1tdLCBzaGVsbERpcjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgdXJsIG9mIHVybHMpIHtcbiAgICBjb25zdCBhc3NldFBhdGggPSBqb2luKHNoZWxsRGlyLCBiYXNlbmFtZSh1cmwpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZG93bmxvYWRBc3NldCh1cmwsIGFzc2V0UGF0aCk7XG4gICAgICByZXR1cm4gYXNzZXRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBpbnN0YWxsZXIgJHt2ZXJzaW9ufS4gQXR0ZW1wdHM6ICR7ZXJyb3JzLmpvaW4oJzsgJyl9LiBgXG4gICAgICArICdDYXRhbHlzdC9iZXRhIHZlcnNpb25zIGhhdmUgbm8gcHVibGljIGluc3RhbGxlciBcdTIwMTQgcGluIGFuIGFzYXIgdmVyc2lvbiBvbiBhIHB1YmxpYy9pbnN0YWxsZWQgc2hlbGwgaW5zdGVhZC4nXG4gICk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBMaW51eCBgLnRhci5nemAgcG9ydGFibGUgYnVpbGQuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC50YXIuZ3pgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGg6IHN0cmluZywgc2hlbGxEaXI6IHN0cmluZyk6IHZvaWQge1xuICBydW4oJ3RhcicsIFsneHpmJywgYXNzZXRQYXRoLCAnLUMnLCBzaGVsbERpciwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgbWFjT1MgYC5kbWdgIGJ5IG1vdW50aW5nIGl0IGFuZCBjb3B5aW5nIHRoZSBhcHAgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSBhc3NldFBhdGggLSBQYXRoIHRvIHRoZSBkb3dubG9hZGVkIGAuZG1nYC5cbiAqIEBwYXJhbSBzaGVsbERpciAtIERlc3RpbmF0aW9uIHNoZWxsIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1hY1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vdW50UG9pbnQgPSBqb2luKHNoZWxsRGlyLCAnX19tbnQnKTtcbiAgbWtkaXJTeW5jKG1vdW50UG9pbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBydW4oJ2hkaXV0aWwnLCBbJ2F0dGFjaCcsICctbm9icm93c2UnLCAnLW1vdW50cG9pbnQnLCBtb3VudFBvaW50LCBhc3NldFBhdGhdKTtcbiAgdHJ5IHtcbiAgICBydW4oJ2NwJywgWyctUicsIGpvaW4obW91bnRQb2ludCwgJ09ic2lkaWFuLmFwcCcpLCBzaGVsbERpcl0pO1xuICB9IGZpbmFsbHkge1xuICAgIHJ1bignaGRpdXRpbCcsIFsnZGV0YWNoJywgbW91bnRQb2ludF0pO1xuICB9XG4gIHJtU3luYyhtb3VudFBvaW50LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBkb3dubG9hZGVkIGluc3RhbGxlciBhc3NldCBpbnRvIGEgc2hlbGwgZGlyZWN0b3J5LCBwZXIgcGxhdGZvcm0uXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFRoZSBkb3dubG9hZGVkIGFzc2V0IHBhdGguXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgZGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0U2hlbGwoYXNzZXRQYXRoOiBzdHJpbmcsIHNoZWxsRGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aCwgc2hlbGxEaXIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIGV4dHJhY3RNYWNTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBleHRyYWN0TGludXhTaGVsbChhc3NldFBhdGgsIHNoZWxsRGlyKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIFdpbmRvd3MgTlNJUyBpbnN0YWxsZXIncyBpbm5lciBhcHAgcGF5bG9hZCB2aWEgNy1aaXAuXG4gKlxuICogVGhlIE5TSVMgaW5zdGFsbGVyIGAuZXhlYCBjb250YWlucyBgJFBMVUdJTlNESVIvYXBwLTY0Ljd6YCwgd2hpY2ggaG9sZHMgdGhlXG4gKiBwb3J0YWJsZSBhcHAgKG1pcnJvcnMgaG93IHRoZSBzY29vcCBtYW5pZmVzdCBpbnN0YWxscyBPYnNpZGlhbikuXG4gKlxuICogQHBhcmFtIGFzc2V0UGF0aCAtIFBhdGggdG8gdGhlIGRvd25sb2FkZWQgYC5leGVgLlxuICogQHBhcmFtIHNoZWxsRGlyIC0gRGVzdGluYXRpb24gc2hlbGwgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBleHRyYWN0V2luZG93c1NoZWxsKGFzc2V0UGF0aDogc3RyaW5nLCBzaGVsbERpcjogc3RyaW5nKTogdm9pZCB7XG4gIGFzc2VydENvbW1hbmRBdmFpbGFibGUoJzd6JywgJ0luc3RhbGwgNy1aaXAgKGUuZy4gYHNjb29wIGluc3RhbGwgN3ppcGApIHRvIGV4dHJhY3QgYSBwaW5uZWQgT2JzaWRpYW4gaW5zdGFsbGVyLicpO1xuICBjb25zdCBuc2lzRXh0cmFjdERpciA9IGpvaW4oc2hlbGxEaXIsICdfX25zaXMnKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7bnNpc0V4dHJhY3REaXJ9YCwgYXNzZXRQYXRoXSk7XG4gIGNvbnN0IGlubmVyQXJjaGl2ZSA9IGpvaW4obnNpc0V4dHJhY3REaXIsICckUExVR0lOU0RJUicsICdhcHAtNjQuN3onKTtcbiAgcnVuKCc3eicsIFsneCcsICcteScsIGAtbyR7c2hlbGxEaXJ9YCwgaW5uZXJBcmNoaXZlXSk7XG4gIHJtU3luYyhuc2lzRXh0cmFjdERpciwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSByZWxlYXNlJ3MgYXNzZXQgbmFtZXMgZnJvbSB0aGUgR2l0SHViIEFQSS5cbiAqXG4gKiBSZWFkcyBhIGBHSVRIVUJfVE9LRU5gIChvciBgR0hfVE9LRU5gKSBmcm9tIHRoZSBlbnZpcm9ubWVudCBhbmQgc2VuZHMgaXQgYXMgYVxuICogYmVhcmVyIHRva2VuIHdoZW4gcHJlc2VudCwgdG8gbGlmdCB0aGUgYW5vbnltb3VzIHJhdGUgbGltaXQgdGhhdCBvdGhlcndpc2VcbiAqIHJldHVybnMgSFRUUCA0MDMgb24gc2hhcmVkIENJIHJ1bm5lciBJUHMuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgcmVsZWFzZSB2ZXJzaW9uICh0YWcgYHY8dmVyc2lvbj5gKS5cbiAqIEByZXR1cm5zIFRoZSBhc3NldCBuYW1lcywgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIEFQSSBpcyB1bmF2YWlsYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWxlYXNlQXNzZXROYW1lcyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSk7XG4gICAgLy8gU2VuZCBhIGJlYXJlciB0b2tlbiB3aGVuIG9uZSBpcyBhdmFpbGFibGUgKGUuZy4gR0lUSFVCX1RPS0VOIG9uIENJKS5cbiAgICAvLyBXaXRob3V0IGl0IHRoZSBhc3NldC1saXN0IEFQSSBpcyBsaW1pdGVkIHRvIHRoZSBhbm9ueW1vdXMgcXVvdGEuXG4gICAgLy8gVGhhdCBxdW90YSByZXR1cm5zIEhUVFAgNDAzIG9uIHNoYXJlZCBDSSBydW5uZXIgSVBzIGFuZCBmb3JjZXMgdGhlIGZhbGxiYWNrLlxuICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9UT0tFTiddID8/IHByb2Nlc3MuZW52WydHSF9UT0tFTiddO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7dG9rZW59YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7UkVMRUFTRV9BUElfVEFHX1VSTH0vdiR7dmVyc2lvbn1gLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgbG9nKGBbaW5zdGFsbGVyXSBSZWxlYXNlIEFQSSBmb3IgJHt2ZXJzaW9ufSByZXR1cm5lZCBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9OyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBHaXRIdWJSZWxlYXNlO1xuICAgIHJldHVybiByZWxlYXNlLmFzc2V0cy5tYXAoKGFzc2V0KSA9PiBhc3NldC5uYW1lKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2coYFtpbnN0YWxsZXJdIFJlbGVhc2UgQVBJIGZvciAke3ZlcnNpb259IHVuYXZhaWxhYmxlICgke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX0pOyBmYWxsaW5nIGJhY2sgdG8gdGVtcGxhdGVkIGFzc2V0IG5hbWVzLmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHBlY3RlZCBjYWNoZWQgc2hlbGwgZXhlY3V0YWJsZSBwYXRoIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiBAcGFyYW0gc2hlbGxEaXIgLSBUaGUgc2hlbGwgY2FjaGUgZGlyZWN0b3J5IGZvciBhIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRTaGVsbEV4ZVBhdGgoc2hlbGxEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGpvaW4oc2hlbGxEaXIsICdPYnNpZGlhbi5leGUnKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKHNoZWxsRGlyLCAnT2JzaWRpYW4uYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ09ic2lkaWFuJyk7XG4gIH1cblxuICByZXR1cm4gam9pbihzaGVsbERpciwgJ29ic2lkaWFuJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG9yZGVyZWQgaW5zdGFsbGVyIGFzc2V0IGRvd25sb2FkIFVSTHMgdG8gdHJ5IGZvciBhIHZlcnNpb24uXG4gKlxuICogVGhlIHJlbGVhc2UncyByZWFsIGFzc2V0IGxpc3QgaXMgcXVlcmllZCBmaXJzdCBzbyB0aGUgcGxhdGZvcm0tY29ycmVjdCBhc3NldFxuICogaXMgcGlja2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIGhpc3RvcmljYWwgZG90LXZzLWh5cGhlbiBuYW1pbmc7IGlmIHRoYXQgY2FsbCBpc1xuICogdW5hdmFpbGFibGUgaXQgZmFsbHMgYmFjayB0byB0cnlpbmcgYm90aCB0ZW1wbGF0ZWQgc2VwYXJhdG9yIGZvcm1zLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIENhbmRpZGF0ZSBhc3NldCBVUkxzLCBpbiBwcmlvcml0eSBvcmRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlckFzc2V0VXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGFzc2V0TmFtZXMgPSBhd2FpdCBmZXRjaFJlbGVhc2VBc3NldE5hbWVzKHZlcnNpb24pO1xuICBpZiAoYXNzZXROYW1lcykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lKHsgYXNzZXROYW1lcywgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sIHZlcnNpb24gfSk7XG4gICAgaWYgKHNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbYCR7UkVMRUFTRV9ET1dOTE9BRF9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHtzZWxlY3RlZH1gXTtcbiAgICB9XG4gICAgbG9nKGBbaW5zdGFsbGVyXSBObyBpbnN0YWxsZXIgYXNzZXQgbWF0Y2hlZCBmb3IgJHt2ZXJzaW9ufTsgZmFsbGluZyBiYWNrIHRvIHRlbXBsYXRlZCBhc3NldCBuYW1lcy5gKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZEluc3RhbGxlckFzc2V0TmFtZUNhbmRpZGF0ZXMoeyBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSwgdmVyc2lvbiB9KVxuICAgIC5tYXAoKG5hbWUpID0+IGAke1JFTEVBU0VfRE9XTkxPQURfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7bmFtZX1gKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgY29tbWFuZCBzeW5jaHJvbm91c2x5LCB0aHJvd2luZyBvbiBhIG5vbi16ZXJvIGV4aXQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gcnVuKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLm1hcCgoYXJnKSA9PiBiYXNlbmFtZShhcmcpKS5qb2luKCcgJyl9IChleGl0ICR7U3RyaW5nKHJlc3VsdC5zdGF0dXMpfSlgKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUJBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxhQUFhO0FBRXBCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxXQUFXO0FBS3BCLE1B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
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Typed access to the repo-root `metadata.json` — the per-Obsidian-app-version
5
+ * data table precomputed in this repo (installer-floor / recommended-installer /
6
+ * recommended-Electron thresholds; see the `metadata.json` section in
7
+ * `CLAUDE.md`). This is the single module that reads the raw table; everything
8
+ * else consumes it through {@link getVersionMetadata} against the
9
+ * {@link ObsidianVersionMetadata} shape, so the raw table stays internal and the
10
+ * public surface is a typed lookup.
11
+ *
12
+ * The table is injected at build time by esbuild's `define` (and at test time by
13
+ * Vitest's `define`) — the `OBSIDIAN_METADATA` global is replaced with the parsed
14
+ * contents of `metadata.json`. This mirrors how `OBSIDIAN_INTEGRATION_TESTING_VERSION`
15
+ * is injected, and keeps the built library self-contained (the table is inlined
16
+ * into the output, with no runtime file read and no `bundle`-time JSON import that
17
+ * `bundle: false` cannot inline).
18
+ */
19
+ /**
20
+ * The subset of a `metadata.json` per-version entry this library reads.
21
+ *
22
+ * Every field is optional — an entry carries only the thresholds that apply to
23
+ * that version (e.g. only old versions carry {@link minRecommendedInstallerVersion}).
24
+ */
25
+ export interface ObsidianVersionMetadata {
26
+ /** Whether the version's assets are available (present only when `false`). */
27
+ readonly available?: boolean;
28
+ /** URL of the version's changelog. */
29
+ readonly changelogUrl?: string;
30
+ /** The release channel: `'public'`, `'catalyst'`, or `'public+catalyst'`. */
31
+ readonly channel?: string;
32
+ /**
33
+ * The app's hardcoded required-minimum Electron version (e.g. `'28.2.3'`). An
34
+ * Electron version, not an installer version — comparing against it needs the
35
+ * installer's bundled Electron, which is not derivable offline.
36
+ */
37
+ readonly minRecommendedElectronVersion?: string;
38
+ /**
39
+ * The recommended-minimum installer version (Obsidian's own "installer too old,
40
+ * reinstall" guidance). Present only on older versions.
41
+ */
42
+ readonly minRecommendedInstallerVersion?: string;
43
+ /**
44
+ * The empirically-measured run floor: the oldest installer version whose
45
+ * Electron shell can actually boot this app version's asar. Below it the
46
+ * renderer dead-boots.
47
+ */
48
+ readonly minRunnableInstallerVersion?: string;
49
+ }
50
+ /**
51
+ * Looks up the metadata entry for a concrete Obsidian app version.
52
+ *
53
+ * @param version - A concrete `x.y.z` app version.
54
+ * @returns The entry, or `undefined` when the version is absent from the table.
55
+ */
56
+ export declare function getVersionMetadata(version: string): ObsidianVersionMetadata | undefined;