obsidian-integration-testing 9.1.1 → 9.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +223 -18
  2. package/dist/lib/cjs/connect-to-cdp.cjs +23 -2
  3. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  4. package/dist/lib/cjs/eval-in-obsidian.d.cts +44 -1
  5. package/dist/lib/cjs/global-setup-core.cjs +28 -1
  6. package/dist/lib/cjs/index.cjs +12 -1
  7. package/dist/lib/cjs/index.d.cts +5 -0
  8. package/dist/lib/cjs/leftover-cleanup.cjs +134 -0
  9. package/dist/lib/cjs/leftover-cleanup.d.cts +216 -0
  10. package/dist/lib/cjs/library.cjs +1 -1
  11. package/dist/lib/cjs/namespace-bootstrap.cjs +20 -2
  12. package/dist/lib/cjs/obsidian-metadata.cjs +18 -1
  13. package/dist/lib/cjs/run-version-matrix.cjs +64 -0
  14. package/dist/lib/cjs/run-version-matrix.d.cts +49 -0
  15. package/dist/lib/cjs/setup-lock.cjs +145 -32
  16. package/dist/lib/cjs/setup-lock.d.cts +9 -3
  17. package/dist/lib/cjs/temp-vault.cjs +3 -2
  18. package/dist/lib/cjs/transport-appium.cjs +102 -30
  19. package/dist/lib/cjs/transport-appium.d.cts +50 -3
  20. package/dist/lib/cjs/transport-factory.cjs +66 -4
  21. package/dist/lib/cjs/transport-options.cjs +1 -1
  22. package/dist/lib/cjs/transport-options.d.cts +57 -0
  23. package/dist/lib/cjs/version-matrix.cjs +175 -0
  24. package/dist/lib/cjs/version-matrix.d.cts +224 -0
  25. package/dist/lib/esm/connect-to-cdp.mjs +27 -2
  26. package/dist/lib/esm/eval-in-obsidian.d.mts +44 -1
  27. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  28. package/dist/lib/esm/global-setup-core.mjs +36 -2
  29. package/dist/lib/esm/index.d.mts +5 -0
  30. package/dist/lib/esm/index.mjs +11 -1
  31. package/dist/lib/esm/leftover-cleanup.d.mts +216 -0
  32. package/dist/lib/esm/leftover-cleanup.mjs +105 -0
  33. package/dist/lib/esm/library.mjs +1 -1
  34. package/dist/lib/esm/namespace-bootstrap.mjs +20 -2
  35. package/dist/lib/esm/obsidian-metadata.mjs +18 -1
  36. package/dist/lib/esm/run-version-matrix.d.mts +49 -0
  37. package/dist/lib/esm/run-version-matrix.mjs +48 -0
  38. package/dist/lib/esm/setup-lock.d.mts +9 -3
  39. package/dist/lib/esm/setup-lock.mjs +145 -32
  40. package/dist/lib/esm/temp-vault.mjs +3 -2
  41. package/dist/lib/esm/transport-appium.d.mts +50 -3
  42. package/dist/lib/esm/transport-appium.mjs +100 -29
  43. package/dist/lib/esm/transport-factory.mjs +75 -5
  44. package/dist/lib/esm/transport-options.d.mts +57 -0
  45. package/dist/lib/esm/version-matrix.d.mts +224 -0
  46. package/dist/lib/esm/version-matrix.mjs +147 -0
  47. package/dist/obsidian-integration-testing-9.2.1.tgz +0 -0
  48. package/package.json +18 -25
  49. package/dist/obsidian-integration-testing-9.1.1.tgz +0 -0
@@ -49,6 +49,7 @@ var import_exec = require("./exec.cjs");
49
49
  var import_incompatible_installer_version_error = require("./incompatible-installer-version-error.cjs");
50
50
  var import_installer_compatibility = require("./installer-compatibility.cjs");
51
51
  var import_kill_process_tree = require("./kill-process-tree.cjs");
52
+ var import_leftover_cleanup = require("./leftover-cleanup.cjs");
52
53
  var import_log = require("./log.cjs");
53
54
  var import_normalize_optional_properties = require("./normalize-optional-properties.cjs");
54
55
  var import_obsidian_config = require("./obsidian-config.cjs");
@@ -71,7 +72,7 @@ const APPIUM_CONNECTION_RETRY_COUNT = 3;
71
72
  const APPIUM_OUTPUT_TAIL_MAX_LENGTH = 8e3;
72
73
  const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
73
74
  const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
74
- const OWNED_USER_DATA_PREFIX = "userdata-";
75
+ const ADB_VAULT_SWEEP_TIMEOUT_IN_MILLISECONDS = 3e4;
75
76
  const CHROMEDRIVER_AUTODOWNLOAD_FEATURE = "uiautomator2:chromedriver_autodownload";
76
77
  const COMMAND_TIMEOUT_IN_MILLISECONDS = 300;
77
78
  const DEFAULT_TRANSPORT_TYPE = "obsidian-cdp";
@@ -129,6 +130,7 @@ class AppiumTransportFactory {
129
130
  deviceId,
130
131
  isSessionOwner: false,
131
132
  platform: "android",
133
+ shouldSweepLeftovers: (0, import_leftover_cleanup.resolveShouldSweepLeftovers)(options),
132
134
  ...options.layoutReadyTimeoutInMilliseconds !== void 0 && { layoutReadyTimeoutInMilliseconds: options.layoutReadyTimeoutInMilliseconds },
133
135
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath },
134
136
  ...options.webviewTimeoutInMilliseconds !== void 0 && { webviewTimeoutInMilliseconds: options.webviewTimeoutInMilliseconds }
@@ -194,6 +196,12 @@ class AppiumTransportFactory {
194
196
  appiumProcess = result.appiumProcess;
195
197
  emulatorProcess = result.emulatorProcess;
196
198
  const actualDeviceId = result.actualDeviceId;
199
+ if ((0, import_leftover_cleanup.resolveShouldSweepLeftovers)(options)) {
200
+ await this.sweepDeviceLeftoverVaults({
201
+ deviceId: actualDeviceId,
202
+ vaultBasePath: options.vaultBasePath ?? import_transport_appium.DEFAULT_ANDROID_VAULT_BASE_PATH
203
+ });
204
+ }
197
205
  const sessionConnectionRetryTimeout = (0, import_appium_session_config.resolveSessionConnectionRetryTimeoutInMilliseconds)(options);
198
206
  this.log(
199
207
  `Connecting to Appium (device=${actualDeviceId}, app=${appId}, retryTimeout: ${String(sessionConnectionRetryTimeout)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
@@ -225,6 +233,7 @@ class AppiumTransportFactory {
225
233
  browser,
226
234
  deviceId: actualDeviceId,
227
235
  platform: "android",
236
+ shouldSweepLeftovers: (0, import_leftover_cleanup.resolveShouldSweepLeftovers)(options),
228
237
  ...options.layoutReadyTimeoutInMilliseconds !== void 0 && { layoutReadyTimeoutInMilliseconds: options.layoutReadyTimeoutInMilliseconds },
229
238
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath },
230
239
  ...options.webviewTimeoutInMilliseconds !== void 0 && { webviewTimeoutInMilliseconds: options.webviewTimeoutInMilliseconds }
@@ -608,6 +617,59 @@ class AppiumTransportFactory {
608
617
  );
609
618
  });
610
619
  }
620
+ /**
621
+ * Removes the `temp-vault-*` directories earlier runs left on the device.
622
+ *
623
+ * Runs **before** `remote()` launches Obsidian — the last moment at which
624
+ * nothing has to enumerate the device's vaults yet, and the only sweep that
625
+ * does not depend on a healthy WebView. That independence is the whole point:
626
+ * a run whose WebView died cannot unregister or delete its own vault, so
627
+ * without this each failure leaves residue that slows the next run's startup
628
+ * enumeration and makes the next failure likelier.
629
+ *
630
+ * Unconditional (no age gate) — Android runs hold the exclusive `android`
631
+ * setup lock, so no concurrent run can own a device vault, and an age gate
632
+ * would let a vault leaked minutes ago survive into this run. Best-effort: a
633
+ * failure is logged, not thrown.
634
+ *
635
+ * The removals go one directory at a time and the outcome is re-listed rather
636
+ * than inferred; {@link sweepDeviceLeftovers} explains why.
637
+ *
638
+ * @param params - The device and vault base path to sweep.
639
+ */
640
+ async sweepDeviceLeftoverVaults(params) {
641
+ const { deviceId, vaultBasePath } = params;
642
+ try {
643
+ const result = await (0, import_leftover_cleanup.sweepDeviceLeftovers)({
644
+ listNames: async () => {
645
+ const listing = await (0, import_exec.exec)(
646
+ ["adb", "-s", deviceId, "shell", "ls", "-1", vaultBasePath],
647
+ { isQuiet: true, shouldIgnoreExitCode: true, timeoutInMilliseconds: ADB_VAULT_SWEEP_TIMEOUT_IN_MILLISECONDS }
648
+ );
649
+ return listing.split("\n");
650
+ },
651
+ removeDir: async (path) => {
652
+ await (0, import_exec.exec)(
653
+ ["adb", "-s", deviceId, "shell", "rm", "-rf", path],
654
+ { isQuiet: true, shouldIgnoreExitCode: true, timeoutInMilliseconds: ADB_VAULT_SWEEP_TIMEOUT_IN_MILLISECONDS }
655
+ );
656
+ },
657
+ vaultBasePath
658
+ });
659
+ if (result.removedCount === 0 && result.failedNames.length === 0) {
660
+ this.log(`No leftover temp vaults on device ${deviceId}.`);
661
+ return;
662
+ }
663
+ this.log(`Removed ${String(result.removedCount)} leftover temp vault(s) from ${vaultBasePath} on device ${deviceId}.`);
664
+ if (result.failedNames.length > 0) {
665
+ this.log(
666
+ `Warning: ${String(result.failedNames.length)} leftover temp vault(s) could not be removed and will be retried next run: ${result.failedNames.join(", ")}`
667
+ );
668
+ }
669
+ } catch (error) {
670
+ this.log(`Warning: failed to sweep leftover temp vaults: ${error instanceof Error ? error.message : "unknown error"}`);
671
+ }
672
+ }
611
673
  async waitForAppiumReady(url, timeoutInMilliseconds, launch) {
612
674
  const start = Date.now();
613
675
  this.log(
@@ -846,9 +908,9 @@ async function createCdpTransport(options) {
846
908
  }));
847
909
  }
848
910
  function createOwnedUserDataDir() {
849
- const root = (0, import_node_path.join)((0, import_node_os.tmpdir)(), "obsidian-integration-testing");
911
+ const root = (0, import_node_path.join)((0, import_node_os.tmpdir)(), import_leftover_cleanup.HARNESS_TEMP_DIR_NAME);
850
912
  (0, import_node_fs.mkdirSync)(root, { recursive: true });
851
- return (0, import_node_fs.mkdtempSync)((0, import_node_path.join)(root, OWNED_USER_DATA_PREFIX));
913
+ return (0, import_node_fs.mkdtempSync)((0, import_node_path.join)(root, import_leftover_cleanup.OWNED_USER_DATA_DIR_PREFIX));
852
914
  }
853
915
  async function resolveAsarPlan(options, shellVersion) {
854
916
  if (options?.obsidianVersion !== void 0) {
@@ -921,4 +983,4 @@ function stripForbiddenFetchHeaders(requestOptions) {
921
983
  createTransportFromOptions,
922
984
  getOrCreateTransport
923
985
  });
924
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUNvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLmNqcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLmNqcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IuY2pzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLmNqcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpciB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLmNqcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcbmltcG9ydCB7IGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzLFxuICByZXNvbHZlRW11bGF0b3JTcGF3bkZsYWdzXG59IGZyb20gJy4vc3Bhd24tb3B0aW9ucy5janMnO1xuaW1wb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5janMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUsXG4gIHNob3VsZEhpZGVFbXVsYXRvcldpbmRvd1xufSBmcm9tICcuL3Zpc2liaWxpdHkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgT1dORURfVVNFUl9EQVRBX1BSRUZJWCA9ICd1c2VyZGF0YS0nO1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIENocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBFTVVMQVRPUl9MSVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5jb25zdCBFTVVMQVRPUl9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogSG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZCBpbnN0YW5jZTsgYXRcbiAqIG1vc3Qgb25lIGZpZWxkIGlzIHNldCAoc2VlIHtAbGluayByZXNvbHZlQXNhclBsYW59KS5cbiAqL1xuaW50ZXJmYWNlIEFzYXJQbGFuIHtcbiAgLyoqIFRoZSB1c2VyJ3MgbmV3ZXN0IGluc3RhbGxlZCBhc2FyIHRvIHByb3Zpc2lvbiBhcy1pcyAobm8gZG93bmxvYWQpLiAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUNvbmZpZ1snYXNhciddO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gdG8gZG93bmxvYWQgYW5kIGFzYXItc3dhcCBvbnRvIHRoZSBzaGVsbC4gKi9cbiAgcmVhZG9ubHkgYXNhclZlcnNpb25Ub1N3YXA/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBhcHAgdmVyc2lvbiB3aG9zZSBvd24gaW5zdGFsbGVyIHNoZWxsIHRvIGRvd25sb2FkIChhIGRvd25ncmFkZSkuICovXG4gIHJlYWRvbmx5IGRvd25ncmFkZUluc3RhbGxlclZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBjaGlsZCBwcm9jZXNzICh0aGUgQW5kcm9pZCBlbXVsYXRvciBvciB0aGUgQXBwaXVtIHNlcnZlcikgdG9nZXRoZXJcbiAqIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZCBvdXRwdXQgYW5kIGV4aXQgc3RhdHVzLlxuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xhdW5jaCB7XG4gIC8qKiBUaGUgc3Bhd25lZCBwcm9jZXNzLiAqL1xuICBwcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgLyoqIFJldHVybnMgdGhlIGV4aXQgLyBzcGF3bi1mYWlsdXJlIGRldGFpbHMgb25jZSB0aGUgcHJvY2VzcyBpcyBubyBsb25nZXIgcnVubmluZywgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcblxuICAvKiogUmV0dXJucyB0aGUgY2FwdHVyZWQgc3Rkb3V0K3N0ZGVyciAoYm91bmRlZCB0byB0aGUgbW9zdCByZWNlbnQgb3V0cHV0KS4gKi9cbiAgcmVhZE91dHB1dDogKCkgPT4gc3RyaW5nO1xuXG4gIC8qKiBTdG9wcyBhY2N1bXVsYXRpbmcgb3V0cHV0LiBDYWxsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLiAqL1xuICBzdG9wQ2FwdHVyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuICovXG4gIHJlYWRvbmx5IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIHN0YXJ0LiAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuICovXG4gIHJlYWRvbmx5IGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKiogV2hldGhlciBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgbWF5IGJlIGF1dG8taW5zdGFsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHtcbiAgLyoqIFRoZSBhY3R1YWwgZGV2aWNlIElEIHRoYXQgaXMgY29ubmVjdGVkIChtYXkgZGlmZmVyIGZyb20gdGhlIHJlcXVlc3RlZCBvbmUpLiAqL1xuICByZWFkb25seSBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHl9LlxuICovXG5pbnRlcmZhY2UgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHAgKGFzYXIpIHZlcnNpb24gdGhhdCB3aWxsIGJlIHN3YXBwZWQgb250byB0aGUgc2hlbGwsIG9yIGB1bmRlZmluZWRgXG4gICAqIHdoZW4gbm8gYXNhci1zd2FwIHdpbGwgaGFwcGVuIChub3RoaW5nIGlzIGNoZWNrZWQgdGhlbikuXG4gICAqL1xuICByZWFkb25seSBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfVxuICAgKiAoYHRydWVgKSBvciBwcm9jZWVkcyB0byBsYXVuY2ggd2l0aCB0aGUgdmVyZGljdCBzdXJmYWNlZCBhcyBkYXRhIChgZmFsc2VgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgYSBgJ25hZ2dlZCdgIChvciBwcm9jZWVkaW5nLWAndW5ydW5uYWJsZSdgKSB2ZXJkaWN0IGlzIGxvZ2dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIEFwcGl1bSB0b29sY2hhaW4gaXMgcHJlc2VudCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQ6XG4gICAqIEFwcGl1bSBpdHNlbGYsIHRoZW4gdGhlIGB1aWF1dG9tYXRvcjJgIGRyaXZlci4gRWFjaCBpcyBjaGVja2VkIGZpcnN0IGFuZFxuICAgKiBpbnN0YWxsZWQgb25seSB3aGVuIG1pc3NpbmcsIHNvIGEgZnVsbHktcHJvdmlzaW9uZWQgbWFjaGluZSBpbmN1cnMganVzdCB0d29cbiAgICogZmFzdCB2ZXJzaW9uL2xpc3QgcHJvYmVzLlxuICAgKlxuICAgKiBPbmx5IGludm9rZWQgd2hlbiB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kXG4gICAqIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzfVxuICAgKiBpcyBlbmFibGVkLiBDb21tYW5kcyBhcmUgcGFzc2VkIGFzIHN0cmluZ3Mgc28gYGV4ZWNgIHJ1bnMgdGhlbSB0aHJvdWdoIHRoZVxuICAgKiBzaGVsbCwgd2hpY2ggcmVzb2x2ZXMgdGhlIGBucG1gL2BucHhgIGAuY21kYCBzaGltcyBvbiBXaW5kb3dzICh0aGUgYXJyYXlcbiAgICogcGF0aCBzcGF3bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBjYW5ub3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1EZXBlbmRlbmNpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVVpYXV0b21hdG9yMkRyaXZlckluc3RhbGxlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coJ0NoZWNraW5nIHdoZXRoZXIgQXBwaXVtIGlzIGluc3RhbGxlZC4uLicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIGlzIGluc3RhbGxlZCAodmVyc2lvbiAke3Jlc3VsdC5zdGRvdXQudHJpbSgpIHx8ICd1bmtub3duJ30pLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKCdBcHBpdW0gaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyBnbG9iYWxseSB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWAuLi4nKTtcbiAgICBhd2FpdCBleGVjKCducG0gaW5zdGFsbCAtZyBhcHBpdW0nKTtcblxuICAgIC8qXG4gICAgICogUmUtdmVyaWZ5OiBhIGdsb2JhbCBpbnN0YWxsIGNhbiBsYW5kIHVuZGVyIGFuIG5wbSBwcmVmaXggd2hvc2UgYmluIGRpciBpc1xuICAgICAqIG5vdCBvbiB0aGUgc3Bhd24gUEFUSCAoZS5nLiBhIHNjb29wL252bS1tYW5hZ2VkIHByZWZpeCksIGluIHdoaWNoIGNhc2VcbiAgICAgKiBgbnB4IC0tbm8taW5zdGFsbCBhcHBpdW1gIHN0aWxsIGNhbm5vdCByZXNvbHZlIGl0LiBGYWlsIGZhc3Qgd2l0aCBhblxuICAgICAqIGFjdGlvbmFibGUgbWVzc2FnZSByYXRoZXIgdGhhbiBwcm9jZWVkaW5nIHRvIGF1dG8tc3RhcnQgYSBzZXJ2ZXIgdGhhdCBjYW5cbiAgICAgKiBuZXZlciBjb21lIHVwICh3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3BpbiBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzIHRpbWVvdXQpLlxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeSA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKHZlcmlmeS5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQXBwaXVtIHdhcyBpbnN0YWxsZWQgdmlhIGBucG0gaW5zdGFsbCAtZyBhcHBpdW1gIGJ1dCBpcyBzdGlsbCBub3QgcmVzb2x2YWJsZSB2aWEgYG5weCAtLW5vLWluc3RhbGwgYXBwaXVtYC4gJ1xuICAgICAgICAgICsgJ1RoZSBucG0gZ2xvYmFsIGJpbiBkaXJlY3RvcnkgKHNlZSBgbnBtIGNvbmZpZyBnZXQgcHJlZml4YCkgaXMgbGlrZWx5IG5vdCBvbiBQQVRILiBBZGQgaXQgdG8gUEFUSCwgb3Igc2V0ICdcbiAgICAgICAgICArICdgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGZhbHNlYCBhbmQgaW5zdGFsbC9tYW5hZ2UgQXBwaXVtIHlvdXJzZWxmLidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nKGBBcHBpdW0gaW5zdGFsbGVkICh2ZXJzaW9uICR7dmVyaWZ5LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gIH1cblxuICAvKipcbiAgICogRmFpbHMgZmFzdCB3aGVuIHRoZSByZXF1ZXN0ZWQgQVZEIGRvZXMgbm90IGV4aXN0LCBiZWZvcmUgYW4gZW11bGF0b3IgaXNcbiAgICogc3Bhd25lZC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHByZWZsaWdodCBhIG1pc3NpbmcgQVZEIG5hbWUgaXMgb25seSBkaXNjb3ZlcmVkIGFmdGVyXG4gICAqIHtAbGluayBzdGFydEVtdWxhdG9yfSBzcGF3bnMgYGVtdWxhdG9yIC1hdmQgPG5hbWU+YCBhbmQgdGhlIGJvb3QgbmV2ZXJcbiAgICogY29tcGxldGVzIFx1MjAxNCBhIGZ1bGwge0BsaW5rIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9IHNwaW4gZW5kaW5nXG4gICAqIGluIGEgZ2VuZXJpYyBcIm5vIG5ldyBkZXZpY2UgYXBwZWFyZWRcIi4gSW5zdGVhZCB0aGlzIGxpc3RzIHRoZSBjb25maWd1cmVkXG4gICAqIEFWRHMgdXAgZnJvbnQgYW5kIHRocm93cyBhbiBhY3Rpb25hYmxlIGVycm9yIG5hbWluZyB0aGUgYXZhaWxhYmxlIG9uZXMuIEFWRFxuICAgKiBjcmVhdGlvbiBpcyBkZWxpYmVyYXRlbHkgbm90IGF1dG9tYXRlZCAoaXQgcmVxdWlyZXMgYSBzeXN0ZW0taW1hZ2UgZG93bmxvYWQsXG4gICAqIGxpY2Vuc2UgYWNjZXB0YW5jZSwgYW5kIGhhcmR3YXJlL0FQSS1sZXZlbCBjaG9pY2VzKS5cbiAgICpcbiAgICogQHBhcmFtIGF2ZE5hbWUgLSBUaGUgcmVxdWVzdGVkIEFWRCBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBdmRFeGlzdHMoYXZkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSB0aGlzLnJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICAgIHRoaXMubG9nKGBWZXJpZnlpbmcgQVZEIFwiJHthdmROYW1lfVwiIGV4aXN0cyAoJHtlbXVsYXRvckJpbmFyeX0gLWxpc3QtYXZkcykuLi5gKTtcblxuICAgIGNvbnN0IFtlcnJvciwgc3Rkb3V0XSA9IGF3YWl0IG5ldyBQcm9taXNlPFtFcnJvciB8IG51bGwsIHN0cmluZ10+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShlbXVsYXRvckJpbmFyeSwgWyctbGlzdC1hdmRzJ10sIHsgdGltZW91dDogRU1VTEFUT1JfTElTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXhlY0Vycm9yLCBleGVjU3Rkb3V0KSA9PiB7XG4gICAgICAgIHJlc29sdmUoW2V4ZWNFcnJvciwgZXhlY1N0ZG91dF0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsaXN0IEFWRHMgdmlhIFxcYCR7ZW11bGF0b3JCaW5hcnl9IC1saXN0LWF2ZHNcXGA6ICR7ZXJyb3IubWVzc2FnZX0uIGBcbiAgICAgICAgICArICdJcyB0aGUgQW5kcm9pZCBTREsgZW11bGF0b3IgaW5zdGFsbGVkIGFuZCBBTkRST0lEX0hPTUUvQU5EUk9JRF9TREtfUk9PVCBjb3JyZWN0PydcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjaGVja0F2ZEV4aXN0cyh7IGF2ZExpc3RPdXRwdXQ6IHN0ZG91dCwgYXZkTmFtZSB9KSkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlID0gbGlzdEF2YWlsYWJsZUF2ZHMoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFuZHJvaWQgQVZEIFwiJHthdmROYW1lfVwiIG5vdCBmb3VuZC4gQXZhaWxhYmxlIEFWRHM6ICR7YXZhaWxhYmxlLmxlbmd0aCA+IDAgPyBhdmFpbGFibGUuam9pbignLCAnKSA6ICcobm9uZSknfS4gYFxuICAgICAgICAgICsgJ0NyZWF0ZSBpdCAoZS5nLiBpbiB0aGUgQW5kcm9pZCBTdHVkaW8gRGV2aWNlIE1hbmFnZXIsIG9yIHZpYSBgYXZkbWFuYWdlciBjcmVhdGUgYXZkYCksIG9yIHNldCBgYXZkTmFtZWAgdG8gYW4gZXhpc3RpbmcgQVZELidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBleGlzdHMuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8RW5zdXJlRGV2aWNlQ29ubmVjdGVkUmVzdWx0PiB7XG4gICAgY29uc3QgeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGRldmljZUlkc0JlZm9yZSA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIGV4aXN0aW5nIGRldmljZXMgZm9yIEFWRCBcIiR7YXZkTmFtZX1cIi4uLiAoY29ubmVjdGVkOiBbJHtkZXZpY2VJZHNCZWZvcmUuam9pbignLCAnKX1dKWApO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2VJZCA9IGF3YWl0IHRoaXMuZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lLCBkZXZpY2VJZHNCZWZvcmUpO1xuXG4gICAgaWYgKGV4aXN0aW5nRGV2aWNlSWQpIHtcbiAgICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2V4aXN0aW5nRGV2aWNlSWR9LCByZXVzaW5nLmApO1xuICAgICAgYXdhaXQgdGhpcy5zdXBwcmVzc0Vycm9yRGlhbG9ncyhleGlzdGluZ0RldmljZUlkKTtcbiAgICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkOiBleGlzdGluZ0RldmljZUlkIH07XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lLCBpc0VtdWxhdG9yVmlzaWJsZSk7XG5cbiAgICBsZXQgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgYWN0dWFsRGV2aWNlSWQgPSBhd2FpdCB0aGlzLndhaXRGb3JOZXdEZXZpY2UoZGV2aWNlSWRzQmVmb3JlLCBlbXVsYXRvciwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVtdWxhdG9yLnN0b3BDYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHthdmROYW1lfVwiIHN0YXJ0ZWQsIGRldmljZSAke2FjdHVhbERldmljZUlkfSBpcyBjb25uZWN0ZWQuYCk7XG4gICAgYXdhaXQgdGhpcy5zdXBwcmVzc0Vycm9yRGlhbG9ncyhhY3R1YWxEZXZpY2VJZCk7XG4gICAgcmV0dXJuIHsgYWN0dWFsRGV2aWNlSWQsIGVtdWxhdG9yUHJvY2VzczogZW11bGF0b3IucHJvY2VzcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVaWF1dG9tYXRvcjJEcml2ZXJJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIHdoZXRoZXIgdGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgaW5zdGFsbGVkLi4uYCk7XG4gICAgY29uc3QgZHJpdmVyTGlzdEpzb24gPSBhd2FpdCBleGVjKCducHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgbGlzdCAtLWluc3RhbGxlZCAtLWpzb24nLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjaGVja0lzQXBwaXVtRHJpdmVySW5zdGFsbGVkKHsgZHJpdmVyTGlzdEpzb24sIGRyaXZlck5hbWU6IFVJQVVUT01BVE9SMl9EUklWRVJfTkFNRSB9KSkge1xuICAgICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyB2aWEgXFxgYXBwaXVtIGRyaXZlciBpbnN0YWxsICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfVxcYC4uLmApO1xuICAgIGF3YWl0IGV4ZWMoYG5weCAtLW5vLWluc3RhbGwgYXBwaXVtIGRyaXZlciBpbnN0YWxsICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfWApO1xuICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpbnN0YWxsZWQuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBmb3IgKGNvbnN0IGRldmljZUlkIG9mIGRldmljZUlkcykge1xuICAgICAgY29uc3QgcnVubmluZ0F2ZCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnZW11JywgJ2F2ZCcsICduYW1lJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC5zcGxpdCgnXFxuJylbMF0/LnRyaW0oKSA/PyAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChydW5uaW5nQXZkID09PSBhdmROYW1lKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb25uZWN0ZWREZXZpY2VJZHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2coYEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIGxpbmVzXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKCdcXHRkZXZpY2UnKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc3BsaXQoJ1xcdCcpWzBdID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGV2aWNlUHJvcChkZXZpY2VJZDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgcHJvcF0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiBubyBvdXRwdXQgb24gdGltZW91dC9lcnJvciAobm90IHBhcnRpYWwgc3Rkb3V0KSBzbyBhIG5vbi1yZXNwb25zaXZlIGd1ZXN0IHJlYWRzIGFzIFwibm90IGlkbGVcIi5cbiAgICAgICAgICByZXNvbHZlKGVycm9yID8gJycgOiBzdGRvdXQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2NtZCcsICdwYWNrYWdlJywgJ2xpc3QnLCAncGFja2FnZXMnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIHNvIGEgY2h1cm5pbmcgZ3Vlc3QncyBzbG93L3BhcnRpYWwgcGFja2FnZSBsaXN0IGNhbid0IGZhbHNlbHkgcmVhZCBhcyBpZGxlLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3RoaXMudHlwZX1dICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2RrUm9vdCA9IHByb2Nlc3MuZW52WydBTkRST0lEX0hPTUUnXSA/PyBwcm9jZXNzLmVudlsnQU5EUk9JRF9TREtfUk9PVCddO1xuICAgIGlmICghc2RrUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGZpbmQgQW5kcm9pZCBlbXVsYXRvcjogbmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBqb2luKHNka1Jvb3QsICdlbXVsYXRvcicsICdlbXVsYXRvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5RXZlbnQoZGV2aWNlSWQ6IHN0cmluZywga2V5Q29kZTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgICAgYFdhcm5pbmc6IGZhaWxlZCB0byAke2Rlc2NyaXB0aW9ufSAoa2V5ZXZlbnQgJHtTdHJpbmcoa2V5Q29kZSl9KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcihwYXJhbXM6IFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBhcHBpdW1VcmwsIGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzQXBwaXVtQ29uc29sZVZpc2libGUsIGlzRW11bGF0b3JWaXNpYmxlLCBwb3J0LCBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcywgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1MYXVuY2g6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgaWYgKHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwaXVtRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bUxhdW5jaCA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwaXVtUHJvY2VzcyA9IGFwcGl1bUxhdW5jaD8ucHJvY2VzcztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCBkZXZpY2VSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcHBpdW1MYXVuY2hcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bUxhdW5jaCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLmVuc3VyZURldmljZUNvbm5lY3RlZCh7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0pXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogUHJvY2Vzc0xhdW5jaCB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzKGlzQ29uc29sZUhpZGRlbik7XG4gICAgLypcbiAgICAgKiBgLS1uby1pbnN0YWxsYDogQXBwaXVtIGlzIGd1YXJhbnRlZWQgcHJlc2VudCBieSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYFxuICAgICAqIGJlZm9yZSB3ZSByZWFjaCBoZXJlLCBzbyBwaW4gbnB4IHRvIHRoZSBpbnN0YWxsZWQgY29weS4gV2l0aG91dCBpdCwgbnB4XG4gICAgICogd291bGQgc2lsZW50bHkgdHJ5IHRvIGRvd25sb2FkIEFwcGl1bSBmcmVzaCBmcm9tIHRoZSByZWdpc3RyeSBcdTIwMTQgYVxuICAgICAqIHNsb3cvaHVuZyBmYWlsdXJlIGluIGEgaGlkZGVuIGNvbnNvbGUgXHUyMDE0IHdoZW5ldmVyIGl0IGNvdWxkIG5vdCByZXNvbHZlIHRoZVxuICAgICAqIGdsb2JhbCBpbnN0YWxsIChlLmcuIGEgZ2xvYmFsIHByZWZpeCBub3Qgb24gUEFUSCkuIFNlZSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYC5cbiAgICAgKlxuICAgICAqIFBpcGUgc3Rkb3V0L3N0ZGVyciBldmVuIHdoZW4gaGlkZGVuIChyYXRoZXIgdGhhbiBkaXNjYXJkaW5nKSBzbyBhbiBlYXJseVxuICAgICAqIGZhaWx1cmUgc3VjaCBhcyBhIGNyYXNoIG9yIGEgbWlzc2luZyBkcml2ZXIgaXMgY2FwdHVyZWQgYW5kIHN1cmZhY2VkXG4gICAgICogaW1tZWRpYXRlbHkgYnkgYHdhaXRGb3JBcHBpdW1SZWFkeWAsIG1pcnJvcmluZyBgc3RhcnRFbXVsYXRvcmA7XG4gICAgICogYHdpbmRvd3NIaWRlYCBzdGlsbCBzdXBwcmVzc2VzIHRoZSBjb25zb2xlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUFQUElVTV9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RW11bGF0b3IoYXZkTmFtZTogc3RyaW5nLCBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4pOiBQcm9jZXNzTGF1bmNoIHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHRoaXMucmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gICAgY29uc3QgaXNXaW5kb3dIaWRkZW4gPSBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3coaXNFbXVsYXRvclZpc2libGUpO1xuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEVtdWxhdG9yQXJncyh7IGF2ZE5hbWUsIGlzSGlkZGVuOiBpc1dpbmRvd0hpZGRlbiB9KTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFncyhpc1dpbmRvd0hpZGRlbik7XG4gICAgdGhpcy5sb2coYFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgLypcbiAgICAgKiBQaXBlIChyYXRoZXIgdGhhbiBpZ25vcmUpIHN0ZG91dC9zdGRlcnIgc28gYW4gZWFybHkgZmFpbHVyZSBzdWNoIGFzXG4gICAgICogXCJ4ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb25cIiBjYW4gYmVcbiAgICAgKiBzdXJmYWNlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBhcmdzLCB7XG4gICAgICBkZXRhY2hlZCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG4gICAgLypcbiAgICAgKiBBIHNwYXduIGZhaWx1cmUgKGUuZy4gRU5PRU5UIGZvciBhIG1pc3NpbmcvYnJva2VuIGVtdWxhdG9yIGJpbmFyeSkgZW1pdHNcbiAgICAgKiAnZXJyb3InLCBub3QgJ2V4aXQnLiBSZWNvcmQgaXQgYXMgYSBzeW50aGV0aWMgZXhpdCBzbyB0aGUgYm9vdC9uZXctZGV2aWNlXG4gICAgICogcG9sbHMgZmFpbCBmYXN0IGluc3RlYWQgb2Ygc3Bpbm5pbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIsIGxhdW5jaDogUHJvY2Vzc0xhdW5jaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJZiB0aGUgc2VydmVyIHByb2Nlc3MgYWxyZWFkeSBkaWVkIChjcmFzaGVkLCBvciBuZXZlciBzdGFydGVkKSwgc3RvcFxuICAgICAgICogcG9sbGluZyBhbmQgc3VyZmFjZSB3aHkgXHUyMDE0IG90aGVyd2lzZSBhIGRvb21lZCBzZXJ2ZXIgc3BpbnMgb3V0IHRoZSB3aG9sZVxuICAgICAgICogcmVhZGluZXNzIHRpbWVvdXQgd2l0aCBubyBkaWFnbm9zdGljcyAodGhlIG9yaWdpbmFsIFQ4NCBzeW1wdG9tKS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZXhpdEluZm8gPSBsYXVuY2gucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgYnVpbGREZWF0aEVycm9yKGV4aXRJbmZvKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICBsYXVuY2guc3RvcENhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ6ICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxFeGl0SW5mbyA9IGxhdW5jaC5yZWFkRXhpdEluZm8oKTtcbiAgICBpZiAoZmluYWxFeGl0SW5mbykge1xuICAgICAgdGhyb3cgYnVpbGREZWF0aEVycm9yKGZpbmFsRXhpdEluZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFRhaWwgPSBsYXVuY2gucmVhZE91dHB1dCgpLnRyaW0oKTtcbiAgICBjb25zdCBvdXRwdXRTZWN0aW9uID0gb3V0cHV0VGFpbC5sZW5ndGggPiAwID8gYFxcblxcbkFwcGl1bSBzZXJ2ZXIgb3V0cHV0ICh0YWlsKTpcXG4ke291dHB1dFRhaWx9YCA6ICcnO1xuICAgIHRocm93IG5ldyBFcnJvcihgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuJHtvdXRwdXRTZWN0aW9ufWApO1xuXG4gICAgZnVuY3Rpb24gYnVpbGREZWF0aEVycm9yKGV4aXRJbmZvOiBQcm9jZXNzRXhpdEluZm8pOiBFcnJvciB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgZXhpdEluZm8sXG4gICAgICAgIG91dHB1dDogbGF1bmNoLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgb3V0cHV0TGFiZWw6ICdBcHBpdW0gc2VydmVyIG91dHB1dCcsXG4gICAgICAgIHN1YmplY3Q6ICdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlcidcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIsIGVtdWxhdG9yOiBQcm9jZXNzTGF1bmNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCBkZWFkbGluZSAtIERhdGUubm93KCkpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIGRldmljZSAke2RldmljZUlkfSB0byBmaW5pc2ggYm9vdGluZyAocmVtYWluaW5nOiAke1N0cmluZyhyZW1haW5pbmdNcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNCb290ZWQpIHtcbiAgICAgICAgdGhpcy5sb2coYERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSh7XG4gICAgICAgICAgZXhpdEluZm8sXG4gICAgICAgICAgb3V0cHV0OiBlbXVsYXRvci5yZWFkT3V0cHV0KCksXG4gICAgICAgICAgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnLFxuICAgICAgICAgIHN1YmplY3Q6ICdBbmRyb2lkIGVtdWxhdG9yJ1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogUHJvY2Vzc0xhdW5jaCwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoYWN0dWFsRGV2aWNlSWQsIGRlYWRsaW5lLCBlbXVsYXRvcik7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZUlkbGUoYWN0dWFsRGV2aWNlSWQsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgICBvdXRwdXQ6IGVtdWxhdG9yLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgICBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcsXG4gICAgICAgICAgc3ViamVjdDogJ0FuZHJvaWQgZW11bGF0b3InXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBuZXcgZW11bGF0b3IgZGV2aWNlIGFwcGVhcmVkIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FrZVNjcmVlbihkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYFdha2luZyBzY3JlZW4gb24gZGV2aWNlICR7ZGV2aWNlSWR9Li4uYCk7XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9XQUtFVVAsICd3YWtlIHNjcmVlbicpO1xuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgICB0aGlzLmxvZyhgU2NyZWVuIHdha2UgY29tcGxldGUgb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBhbiBvd25lZCBkZXNrdG9wIENEUCB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBBIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBjb25zdCB0eXBlID0gb3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuXG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNkcFRyYW5zcG9ydChvcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSh0eXBlKTtcbiAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWNoZWQgdHJhbnNwb3J0IGluc3RhbmNlLCBjcmVhdGluZyBvbmUgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9uc1xuICogaWYgbm90IGFscmVhZHkgY2FjaGVkLlxuICpcbiAqIFRoZSB0cmFuc3BvcnQgaXMgY2FjaGVkIHBlciB3b3JrZXIgcHJvY2VzcyBzbyBXZWJTb2NrZXQvQXBwaXVtIHNlc3Npb25zXG4gKiBhcmUgcmV1c2VkIGFjcm9zcyBjYWxscyB3aXRoaW4gdGhlIHNhbWUgdGVzdCB3b3JrZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgY3JlYXRlZCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAoY2FjaGVkVHJhbnNwb3J0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zcG9ydDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBTaW5nbGUtdGhyZWFkZWQgd29ya2VyOyBubyBjb25jdXJyZW50IHdyaXRlcy5cbiAgY2FjaGVkVHJhbnNwb3J0ID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogZm9yIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIGVpdGhlciB0aHJvd3NcbiAqIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9ICh3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KVxuICogb3IgcHJvY2VlZHMgdG8gbGF1bmNoIHdpdGggYSB3YXJuaW5nOyBmb3IgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gQm90aCB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZCB3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXN9IGlzXG4gKiBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSB3YXJuL3Rocm93IGtub2JzLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkocGFyYW1zOiBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uLCBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLCBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzIH0gPSBwYXJhbXM7XG4gIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24oe1xuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0aWVyOiBjb21wYXRpYmlsaXR5LnRpZXJcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi11bnJ1bm5hYmxlJykge1xuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBPYnNpZGlhbiBpbnN0YWxsZXIgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lmluc3RhbGxlclZlcnNpb24pfSBpcyBiZWxvdyB0aGUgYFxuICAgICAgICArIGBydW4gZmxvb3IgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbil9IGZvciBPYnNpZGlhbiAke2NvbXBhdGliaWxpdHkuYXBwVmVyc2lvbn07IGBcbiAgICAgICAgKyAncHJvY2VlZGluZyB0byBsYXVuY2ggKHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIgaXMgZmFsc2UpIFx1MjAxNCB0aGUgYm9vdCB3aWxsIGxpa2VseSBkZWFkLWJvb3QuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi1uYWdnZWQnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSAke2Vuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWVzc2FnZSl9YCk7XG4gIH1cblxuICByZXR1cm4gY29tcGF0aWJpbGl0eTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVza3RvcCBDRFAgdHJhbnNwb3J0LiBXaGVuIGFuIGV4cGxpY2l0IGBwb3J0YCBpcyBnaXZlbiB0aGVcbiAqIHRyYW5zcG9ydCBhdHRhY2hlcyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gb24gdGhhdCBwb3J0OyBvdGhlcndpc2UgaXRcbiAqIGxhdW5jaGVzIGFuZCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlICh0aGUgZGVmYXVsdCwgaGVybWV0aWMgbW9kZSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvd25lZFN1ZmZpeCA9IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/ICcgKGhhcm5lc3Mtb3duZWQpJyA6ICcnO1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQXR0YWNoaW5nIHRvIHJ1bm5pbmcgT2JzaWRpYW4ke293bmVkU3VmZml4fSAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0KX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgICBjZHBIb3N0OiBvcHRpb25zLmhvc3QsXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2VcbiAgICB9KSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgY2RwSG9zdDogb3B0aW9ucz8uaG9zdCxcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUsXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogcmVzb2x2ZVNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sob3B0aW9ucz8uc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uOiBzd2FwQXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uOiBzaGVsbFZlcnNpb24sXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogcmVzb2x2ZVNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIob3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSk7XG5cbiAgLy8gVGhlIHBpbiBpcyBrbm93biBydW5uYWJsZSBcdTIwMTQgcmVzb2x2ZS9kb3dubG9hZCB0aGUgZGVmZXJyZWQgc2hlbGwgKyBhc2FyIG5vdy5cbiAgLy8gUmV1c2UgdGhlIGluc3RhbGxlZCBzaGVsbCBvbmx5IHdoZW4gaXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBwaW4gKHNhdmVzIHRoZVxuICAvLyBEb3dubG9hZCk7IG90aGVyd2lzZSBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGlubmVkIGluc3RhbGxlci5cbiAgaWYgKHBpbm5lZEluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpO1xuICAgIGV4ZVBhdGggPSBpbnN0YWxsZWQ/LnNoZWxsVmVyc2lvbiA9PT0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcbiAgICB1c2VyRGF0YURpcjogY3JlYXRlT3duZWRVc2VyRGF0YURpcigpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgQ29ubmVjdGlvbmAgYW5kIGBDb250ZW50LUxlbmd0aGAgZnJvbSBhIFdlYkRyaXZlciByZXF1ZXN0J3MgaGVhZGVycy5cbiAqXG4gKiBUaGUgYnVuZGxlZCBgd2ViZHJpdmVyYCBwYWNrYWdlIHNldHMgYm90aCBoZWFkZXJzIGV4cGxpY2l0bHkuIFRoZXkgYXJlXG4gKiBmb3JiaWRkZW4gcmVxdWVzdCBoZWFkZXJzIHBlciB0aGUgRmV0Y2ggc3BlYzogTm9kZSB1cCB0byAyNSBhY2NlcHRlZCB0aGVtXG4gKiBzaWxlbnRseSwgYnV0IE5vZGUgMjYgcmVqZWN0cyB0aGVtIHdpdGggYFVORF9FUlJfSU5WQUxJRF9BUkdgLCBicmVha2luZyB0aGVcbiAqIEFwcGl1bSBgL3Nlc3Npb25gIHJlcXVlc3QuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWFuYWdlcyBjb25uZWN0aW9uIHJldXNlIGFuZFxuICogdGhlIEZldGNoIEFQSSBjb21wdXRlcyBgQ29udGVudC1MZW5ndGhgIGZyb20gdGhlIGJvZHksIHNvIGRyb3BwaW5nIGJvdGggaXNcbiAqIHNhZmUgb24gZXZlcnkgTm9kZSB2ZXJzaW9uLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJkcml2ZXJpby93ZWJkcml2ZXJpby9pc3N1ZXMvMTUyNjV9LlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyAtIFRoZSByZXF1ZXN0IG9wdGlvbnMgYWJvdXQgdG8gYmUgc2VudCBieSBXZWJEcml2ZXJJTy5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIHJlcXVlc3Qgb3B0aW9ucyB3aXRoIHRoZSBmb3JiaWRkZW4gaGVhZGVycyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVycyhyZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQpOiBSZXF1ZXN0SW5pdCB7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb25uZWN0aW9uJyk7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsZ0NBR087QUFDUCxxQkFHTztBQUNQLHVCQUFpQjtBQUNqQixxQkFBdUI7QUFDdkIsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQUNwQix5QkFHTztBQWVQLGlDQUlPO0FBQ1AsbUNBR087QUFDUCxzQkFHTztBQUNQLG1DQUtPO0FBQ1AsOEJBR087QUFDUCwyQkFBa0M7QUFDbEMsa0JBQXFCO0FBQ3JCLGtEQUFrRDtBQUNsRCxxQ0FBNEM7QUFDNUMsK0JBQWdDO0FBQ2hDLGlCQUFvQjtBQUNwQiwyQ0FBNEM7QUFDNUMsNkJBQXFDO0FBQ3JDLGlDQUEwQztBQUMxQyxnQ0FHTztBQUNQLCtCQUFtQztBQUNuQyxxQ0FJTztBQUNQLDhCQUFnQztBQUNoQyxrQ0FBd0M7QUFDeEMscUNBQW1EO0FBQ25ELDJCQUdPO0FBQ1AsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyx5QkFBa0M7QUFDbEMsd0JBR087QUFFUCxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsV0FBVztBQUNuQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLHlCQUF5QjtBQUsvQixNQUFNLG9DQUFvQztBQUMxQyxNQUFNLGtDQUFrQztBQUN4QyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLDRDQUE0QztBQUNsRCxNQUFNLDhDQUE4QztBQUNwRCxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLGtDQUFrQztBQUN4QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFD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
986
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUNvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLmNqcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLmNqcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IuY2pzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUuY2pzJztcbmltcG9ydCB7XG4gIEhBUk5FU1NfVEVNUF9ESVJfTkFNRSxcbiAgT1dORURfVVNFUl9EQVRBX0RJUl9QUkVGSVgsXG4gIHJlc29sdmVTaG91bGRTd2VlcExlZnRvdmVycyxcbiAgc3dlZXBEZXZpY2VMZWZ0b3ZlcnNcbn0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5janMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5Db25maWdEaXIgfSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5janMnO1xuaW1wb3J0IHtcbiAgZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uLFxuICBlbnN1cmVTaGVsbENhY2hlZFxufSBmcm9tICcuL29ic2lkaWFuLWluc3RhbGxlci5janMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5janMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlQXNhckNhY2hlZCxcbiAgZmluZE5ld2VzdEFzYXIsXG4gIHJlc29sdmVDb25jcmV0ZVZlcnNpb25cbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5janMnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLmNqcyc7XG5pbXBvcnQgeyBidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UuY2pzJztcbmltcG9ydCB7IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyxcbiAgcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFnc1xufSBmcm9tICcuL3NwYXduLW9wdGlvbnMuY2pzJztcbmltcG9ydCB7XG4gIEFwcGl1bVRyYW5zcG9ydCxcbiAgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSFxufSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQge1xuICBzaG91bGRIaWRlQXBwaXVtQ29uc29sZSxcbiAgc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93XG59IGZyb20gJy4vdmlzaWJpbGl0eS5janMnO1xuXG5jb25zdCBBUFBfUEFDS0FHRSA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBUFBfQUNUSVZJVFkgPSBgJHtBUFBfUEFDS0FHRX0uTWFpbkFjdGl2aXR5YDtcbmNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgQVBQSVVNX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBREJfVkFVTFRfU1dFRVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfTElTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMge1xuICAvKiogQVZEIG5hbWUgdG8gY29ubmVjdCB0byAoc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IgaWYgbm90IGFscmVhZHkgcnVubmluZykuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCByZXNvbHZlZCBieSB7QGxpbmsgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxlZFNoZWxsIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGluc3RhbGxlZCBzaGVsbCBleGVjdXRhYmxlLiAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXRlY3RlZCBzaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICByZWFkb25seSBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNwYXduZWQgY2hpbGQgcHJvY2VzcyAodGhlIEFuZHJvaWQgZW11bGF0b3Igb3IgdGhlIEFwcGl1bSBzZXJ2ZXIpIHRvZ2V0aGVyXG4gKiB3aXRoIGhlbHBlcnMgdG8gaW5zcGVjdCBpdHMgY2FwdHVyZWQgb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIFByb2Nlc3NMYXVuY2gge1xuICAvKiogVGhlIHNwYXduZWQgcHJvY2Vzcy4gKi9cbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBleGl0IC8gc3Bhd24tZmFpbHVyZSBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZEV4aXRJbmZvOiAoKSA9PiBQcm9jZXNzRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zIHtcbiAgLyoqIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5LiAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBVUkwuICovXG4gIHJlYWRvbmx5IGFwcGl1bVVybDogVVJMO1xuXG4gIC8qKiBBVkQgbmFtZSB0byBzdGFydC4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGNvbnNvbGUgd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgbWlzc2luZyBBcHBpdW0gZGVwZW5kZW5jaWVzIG1heSBiZSBhdXRvLWluc3RhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzOiBib29sZWFuO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHN9LlxuICovXG5pbnRlcmZhY2UgU3dlZXBEZXZpY2VMZWZ0b3ZlclZhdWx0c1BhcmFtcyB7XG4gIC8qKiBUaGUgZGV2aWNlIFVESUQgdG8gc3dlZXAuICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXZpY2Utc2lkZSBkaXJlY3RvcnkgT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHRzIGluLiAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHl9LlxuICovXG5pbnRlcmZhY2UgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHAgKGFzYXIpIHZlcnNpb24gdGhhdCB3aWxsIGJlIHN3YXBwZWQgb250byB0aGUgc2hlbGwsIG9yIGB1bmRlZmluZWRgXG4gICAqIHdoZW4gbm8gYXNhci1zd2FwIHdpbGwgaGFwcGVuIChub3RoaW5nIGlzIGNoZWNrZWQgdGhlbikuXG4gICAqL1xuICByZWFkb25seSBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfVxuICAgKiAoYHRydWVgKSBvciBwcm9jZWVkcyB0byBsYXVuY2ggd2l0aCB0aGUgdmVyZGljdCBzdXJmYWNlZCBhcyBkYXRhIChgZmFsc2VgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgYSBgJ25hZ2dlZCdgIChvciBwcm9jZWVkaW5nLWAndW5ydW5uYWJsZSdgKSB2ZXJkaWN0IGlzIGxvZ2dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICBzaG91bGRTd2VlcExlZnRvdmVyczogcmVzb2x2ZVNob3VsZFN3ZWVwTGVmdG92ZXJzKG9wdGlvbnMpLFxuICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pLFxuICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBhdmQ9JHtvcHRpb25zLmF2ZE5hbWV9KWApO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICAgICAgaXNBcHBpdW1Db25zb2xlVmlzaWJsZTogb3B0aW9ucy5pc0FwcGl1bUNvbnNvbGVWaXNpYmxlLFxuICAgICAgICBpc0VtdWxhdG9yVmlzaWJsZTogb3B0aW9ucy5pc0VtdWxhdG9yVmlzaWJsZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IHJlc29sdmVTaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcyhvcHRpb25zKSxcbiAgICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtOiBvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bVxuICAgICAgfSk7XG5cbiAgICAgIGFwcGl1bVByb2Nlc3MgPSByZXN1bHQuYXBwaXVtUHJvY2VzcztcbiAgICAgIGVtdWxhdG9yUHJvY2VzcyA9IHJlc3VsdC5lbXVsYXRvclByb2Nlc3M7XG4gICAgICBjb25zdCBhY3R1YWxEZXZpY2VJZCA9IHJlc3VsdC5hY3R1YWxEZXZpY2VJZDtcblxuICAgICAgLypcbiAgICAgICAqIEJlZm9yZSBgcmVtb3RlKClgIGxhdW5jaGVzIE9ic2lkaWFuIFx1MjAxNCB0aGUgbGFzdCBwb2ludCBhdCB3aGljaCBub3RoaW5nXG4gICAgICAgKiBoYXMgdG8gZW51bWVyYXRlIHRoZSBkZXZpY2UncyB2YXVsdHMgeWV0LlxuICAgICAgICovXG4gICAgICBpZiAocmVzb2x2ZVNob3VsZFN3ZWVwTGVmdG92ZXJzKG9wdGlvbnMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dlZXBEZXZpY2VMZWZ0b3ZlclZhdWx0cyh7XG4gICAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgIHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCA/PyBERUZBVUxUX0FORFJPSURfVkFVTFRfQkFTRV9QQVRIXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM6IHJlc29sdmVTaG91bGRTd2VlcExlZnRvdmVycyhvcHRpb25zKSxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIEFwcGl1bSB0b29sY2hhaW4gaXMgcHJlc2VudCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQ6XG4gICAqIEFwcGl1bSBpdHNlbGYsIHRoZW4gdGhlIGB1aWF1dG9tYXRvcjJgIGRyaXZlci4gRWFjaCBpcyBjaGVja2VkIGZpcnN0IGFuZFxuICAgKiBpbnN0YWxsZWQgb25seSB3aGVuIG1pc3NpbmcsIHNvIGEgZnVsbHktcHJvdmlzaW9uZWQgbWFjaGluZSBpbmN1cnMganVzdCB0d29cbiAgICogZmFzdCB2ZXJzaW9uL2xpc3QgcHJvYmVzLlxuICAgKlxuICAgKiBPbmx5IGludm9rZWQgd2hlbiB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kXG4gICAqIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzfVxuICAgKiBpcyBlbmFibGVkLiBDb21tYW5kcyBhcmUgcGFzc2VkIGFzIHN0cmluZ3Mgc28gYGV4ZWNgIHJ1bnMgdGhlbSB0aHJvdWdoIHRoZVxuICAgKiBzaGVsbCwgd2hpY2ggcmVzb2x2ZXMgdGhlIGBucG1gL2BucHhgIGAuY21kYCBzaGltcyBvbiBXaW5kb3dzICh0aGUgYXJyYXlcbiAgICogcGF0aCBzcGF3bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBjYW5ub3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1EZXBlbmRlbmNpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVVpYXV0b21hdG9yMkRyaXZlckluc3RhbGxlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coJ0NoZWNraW5nIHdoZXRoZXIgQXBwaXVtIGlzIGluc3RhbGxlZC4uLicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIGlzIGluc3RhbGxlZCAodmVyc2lvbiAke3Jlc3VsdC5zdGRvdXQudHJpbSgpIHx8ICd1bmtub3duJ30pLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKCdBcHBpdW0gaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyBnbG9iYWxseSB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWAuLi4nKTtcbiAgICBhd2FpdCBleGVjKCducG0gaW5zdGFsbCAtZyBhcHBpdW0nKTtcblxuICAgIC8qXG4gICAgICogUmUtdmVyaWZ5OiBhIGdsb2JhbCBpbnN0YWxsIGNhbiBsYW5kIHVuZGVyIGFuIG5wbSBwcmVmaXggd2hvc2UgYmluIGRpciBpc1xuICAgICAqIG5vdCBvbiB0aGUgc3Bhd24gUEFUSCAoZS5nLiBhIHNjb29wL252bS1tYW5hZ2VkIHByZWZpeCksIGluIHdoaWNoIGNhc2VcbiAgICAgKiBgbnB4IC0tbm8taW5zdGFsbCBhcHBpdW1gIHN0aWxsIGNhbm5vdCByZXNvbHZlIGl0LiBGYWlsIGZhc3Qgd2l0aCBhblxuICAgICAqIGFjdGlvbmFibGUgbWVzc2FnZSByYXRoZXIgdGhhbiBwcm9jZWVkaW5nIHRvIGF1dG8tc3RhcnQgYSBzZXJ2ZXIgdGhhdCBjYW5cbiAgICAgKiBuZXZlciBjb21lIHVwICh3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3BpbiBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzIHRpbWVvdXQpLlxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeSA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKHZlcmlmeS5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQXBwaXVtIHdhcyBpbnN0YWxsZWQgdmlhIGBucG0gaW5zdGFsbCAtZyBhcHBpdW1gIGJ1dCBpcyBzdGlsbCBub3QgcmVzb2x2YWJsZSB2aWEgYG5weCAtLW5vLWluc3RhbGwgYXBwaXVtYC4gJ1xuICAgICAgICAgICsgJ1RoZSBucG0gZ2xvYmFsIGJpbiBkaXJlY3RvcnkgKHNlZSBgbnBtIGNvbmZpZyBnZXQgcHJlZml4YCkgaXMgbGlrZWx5IG5vdCBvbiBQQVRILiBBZGQgaXQgdG8gUEFUSCwgb3Igc2V0ICdcbiAgICAgICAgICArICdgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGZhbHNlYCBhbmQgaW5zdGFsbC9tYW5hZ2UgQXBwaXVtIHlvdXJzZWxmLidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nKGBBcHBpdW0gaW5zdGFsbGVkICh2ZXJzaW9uICR7dmVyaWZ5LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gIH1cblxuICAvKipcbiAgICogRmFpbHMgZmFzdCB3aGVuIHRoZSByZXF1ZXN0ZWQgQVZEIGRvZXMgbm90IGV4aXN0LCBiZWZvcmUgYW4gZW11bGF0b3IgaXNcbiAgICogc3Bhd25lZC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHByZWZsaWdodCBhIG1pc3NpbmcgQVZEIG5hbWUgaXMgb25seSBkaXNjb3ZlcmVkIGFmdGVyXG4gICAqIHtAbGluayBzdGFydEVtdWxhdG9yfSBzcGF3bnMgYGVtdWxhdG9yIC1hdmQgPG5hbWU+YCBhbmQgdGhlIGJvb3QgbmV2ZXJcbiAgICogY29tcGxldGVzIFx1MjAxNCBhIGZ1bGwge0BsaW5rIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9IHNwaW4gZW5kaW5nXG4gICAqIGluIGEgZ2VuZXJpYyBcIm5vIG5ldyBkZXZpY2UgYXBwZWFyZWRcIi4gSW5zdGVhZCB0aGlzIGxpc3RzIHRoZSBjb25maWd1cmVkXG4gICAqIEFWRHMgdXAgZnJvbnQgYW5kIHRocm93cyBhbiBhY3Rpb25hYmxlIGVycm9yIG5hbWluZyB0aGUgYXZhaWxhYmxlIG9uZXMuIEFWRFxuICAgKiBjcmVhdGlvbiBpcyBkZWxpYmVyYXRlbHkgbm90IGF1dG9tYXRlZCAoaXQgcmVxdWlyZXMgYSBzeXN0ZW0taW1hZ2UgZG93bmxvYWQsXG4gICAqIGxpY2Vuc2UgYWNjZXB0YW5jZSwgYW5kIGhhcmR3YXJlL0FQSS1sZXZlbCBjaG9pY2VzKS5cbiAgICpcbiAgICogQHBhcmFtIGF2ZE5hbWUgLSBUaGUgcmVxdWVzdGVkIEFWRCBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBdmRFeGlzdHMoYXZkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSB0aGlzLnJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICAgIHRoaXMubG9nKGBWZXJpZnlpbmcgQVZEIFwiJHthdmROYW1lfVwiIGV4aXN0cyAoJHtlbXVsYXRvckJpbmFyeX0gLWxpc3QtYXZkcykuLi5gKTtcblxuICAgIGNvbnN0IFtlcnJvciwgc3Rkb3V0XSA9IGF3YWl0IG5ldyBQcm9taXNlPFtFcnJvciB8IG51bGwsIHN0cmluZ10+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShlbXVsYXRvckJpbmFyeSwgWyctbGlzdC1hdmRzJ10sIHsgdGltZW91dDogRU1VTEFUT1JfTElTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXhlY0Vycm9yLCBleGVjU3Rkb3V0KSA9PiB7XG4gICAgICAgIHJlc29sdmUoW2V4ZWNFcnJvciwgZXhlY1N0ZG91dF0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsaXN0IEFWRHMgdmlhIFxcYCR7ZW11bGF0b3JCaW5hcnl9IC1saXN0LWF2ZHNcXGA6ICR7ZXJyb3IubWVzc2FnZX0uIGBcbiAgICAgICAgICArICdJcyB0aGUgQW5kcm9pZCBTREsgZW11bGF0b3IgaW5zdGFsbGVkIGFuZCBBTkRST0lEX0hPTUUvQU5EUk9JRF9TREtfUk9PVCBjb3JyZWN0PydcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjaGVja0F2ZEV4aXN0cyh7IGF2ZExpc3RPdXRwdXQ6IHN0ZG91dCwgYXZkTmFtZSB9KSkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlID0gbGlzdEF2YWlsYWJsZUF2ZHMoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFuZHJvaWQgQVZEIFwiJHthdmROYW1lfVwiIG5vdCBmb3VuZC4gQXZhaWxhYmxlIEFWRHM6ICR7YXZhaWxhYmxlLmxlbmd0aCA+IDAgPyBhdmFpbGFibGUuam9pbignLCAnKSA6ICcobm9uZSknfS4gYFxuICAgICAgICAgICsgJ0NyZWF0ZSBpdCAoZS5nLiBpbiB0aGUgQW5kcm9pZCBTdHVkaW8gRGV2aWNlIE1hbmFnZXIsIG9yIHZpYSBgYXZkbWFuYWdlciBjcmVhdGUgYXZkYCksIG9yIHNldCBgYXZkTmFtZWAgdG8gYW4gZXhpc3RpbmcgQVZELidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBleGlzdHMuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8RW5zdXJlRGV2aWNlQ29ubmVjdGVkUmVzdWx0PiB7XG4gICAgY29uc3QgeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGRldmljZUlkc0JlZm9yZSA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIGV4aXN0aW5nIGRldmljZXMgZm9yIEFWRCBcIiR7YXZkTmFtZX1cIi4uLiAoY29ubmVjdGVkOiBbJHtkZXZpY2VJZHNCZWZvcmUuam9pbignLCAnKX1dKWApO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2VJZCA9IGF3YWl0IHRoaXMuZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lLCBkZXZpY2VJZHNCZWZvcmUpO1xuXG4gICAgaWYgKGV4aXN0aW5nRGV2aWNlSWQpIHtcbiAgICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2V4aXN0aW5nRGV2aWNlSWR9LCByZXVzaW5nLmApO1xuICAgICAgYXdhaXQgdGhpcy5zdXBwcmVzc0Vycm9yRGlhbG9ncyhleGlzdGluZ0RldmljZUlkKTtcbiAgICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkOiBleGlzdGluZ0RldmljZUlkIH07XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lLCBpc0VtdWxhdG9yVmlzaWJsZSk7XG5cbiAgICBsZXQgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgYWN0dWFsRGV2aWNlSWQgPSBhd2FpdCB0aGlzLndhaXRGb3JOZXdEZXZpY2UoZGV2aWNlSWRzQmVmb3JlLCBlbXVsYXRvciwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVtdWxhdG9yLnN0b3BDYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHthdmROYW1lfVwiIHN0YXJ0ZWQsIGRldmljZSAke2FjdHVhbERldmljZUlkfSBpcyBjb25uZWN0ZWQuYCk7XG4gICAgYXdhaXQgdGhpcy5zdXBwcmVzc0Vycm9yRGlhbG9ncyhhY3R1YWxEZXZpY2VJZCk7XG4gICAgcmV0dXJuIHsgYWN0dWFsRGV2aWNlSWQsIGVtdWxhdG9yUHJvY2VzczogZW11bGF0b3IucHJvY2VzcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVaWF1dG9tYXRvcjJEcml2ZXJJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIHdoZXRoZXIgdGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgaW5zdGFsbGVkLi4uYCk7XG4gICAgY29uc3QgZHJpdmVyTGlzdEpzb24gPSBhd2FpdCBleGVjKCducHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgbGlzdCAtLWluc3RhbGxlZCAtLWpzb24nLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjaGVja0lzQXBwaXVtRHJpdmVySW5zdGFsbGVkKHsgZHJpdmVyTGlzdEpzb24sIGRyaXZlck5hbWU6IFVJQVVUT01BVE9SMl9EUklWRVJfTkFNRSB9KSkge1xuICAgICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyB2aWEgXFxgYXBwaXVtIGRyaXZlciBpbnN0YWxsICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfVxcYC4uLmApO1xuICAgIGF3YWl0IGV4ZWMoYG5weCAtLW5vLWluc3RhbGwgYXBwaXVtIGRyaXZlciBpbnN0YWxsICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfWApO1xuICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpbnN0YWxsZWQuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBmb3IgKGNvbnN0IGRldmljZUlkIG9mIGRldmljZUlkcykge1xuICAgICAgY29uc3QgcnVubmluZ0F2ZCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnZW11JywgJ2F2ZCcsICduYW1lJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC5zcGxpdCgnXFxuJylbMF0/LnRyaW0oKSA/PyAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChydW5uaW5nQXZkID09PSBhdmROYW1lKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb25uZWN0ZWREZXZpY2VJZHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2coYEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIGxpbmVzXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKCdcXHRkZXZpY2UnKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc3BsaXQoJ1xcdCcpWzBdID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGV2aWNlUHJvcChkZXZpY2VJZDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgcHJvcF0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiBubyBvdXRwdXQgb24gdGltZW91dC9lcnJvciAobm90IHBhcnRpYWwgc3Rkb3V0KSBzbyBhIG5vbi1yZXNwb25zaXZlIGd1ZXN0IHJlYWRzIGFzIFwibm90IGlkbGVcIi5cbiAgICAgICAgICByZXNvbHZlKGVycm9yID8gJycgOiBzdGRvdXQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2NtZCcsICdwYWNrYWdlJywgJ2xpc3QnLCAncGFja2FnZXMnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIHNvIGEgY2h1cm5pbmcgZ3Vlc3QncyBzbG93L3BhcnRpYWwgcGFja2FnZSBsaXN0IGNhbid0IGZhbHNlbHkgcmVhZCBhcyBpZGxlLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3RoaXMudHlwZX1dICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2RrUm9vdCA9IHByb2Nlc3MuZW52WydBTkRST0lEX0hPTUUnXSA/PyBwcm9jZXNzLmVudlsnQU5EUk9JRF9TREtfUk9PVCddO1xuICAgIGlmICghc2RrUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGZpbmQgQW5kcm9pZCBlbXVsYXRvcjogbmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBqb2luKHNka1Jvb3QsICdlbXVsYXRvcicsICdlbXVsYXRvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5RXZlbnQoZGV2aWNlSWQ6IHN0cmluZywga2V5Q29kZTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgICAgYFdhcm5pbmc6IGZhaWxlZCB0byAke2Rlc2NyaXB0aW9ufSAoa2V5ZXZlbnQgJHtTdHJpbmcoa2V5Q29kZSl9KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcihwYXJhbXM6IFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBhcHBpdW1VcmwsIGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzQXBwaXVtQ29uc29sZVZpc2libGUsIGlzRW11bGF0b3JWaXNpYmxlLCBwb3J0LCBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcywgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1MYXVuY2g6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgaWYgKHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwaXVtRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bUxhdW5jaCA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwaXVtUHJvY2VzcyA9IGFwcGl1bUxhdW5jaD8ucHJvY2VzcztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCBkZXZpY2VSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcHBpdW1MYXVuY2hcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bUxhdW5jaCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLmVuc3VyZURldmljZUNvbm5lY3RlZCh7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0pXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogUHJvY2Vzc0xhdW5jaCB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzKGlzQ29uc29sZUhpZGRlbik7XG4gICAgLypcbiAgICAgKiBgLS1uby1pbnN0YWxsYDogQXBwaXVtIGlzIGd1YXJhbnRlZWQgcHJlc2VudCBieSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYFxuICAgICAqIGJlZm9yZSB3ZSByZWFjaCBoZXJlLCBzbyBwaW4gbnB4IHRvIHRoZSBpbnN0YWxsZWQgY29weS4gV2l0aG91dCBpdCwgbnB4XG4gICAgICogd291bGQgc2lsZW50bHkgdHJ5IHRvIGRvd25sb2FkIEFwcGl1bSBmcmVzaCBmcm9tIHRoZSByZWdpc3RyeSBcdTIwMTQgYVxuICAgICAqIHNsb3cvaHVuZyBmYWlsdXJlIGluIGEgaGlkZGVuIGNvbnNvbGUgXHUyMDE0IHdoZW5ldmVyIGl0IGNvdWxkIG5vdCByZXNvbHZlIHRoZVxuICAgICAqIGdsb2JhbCBpbnN0YWxsIChlLmcuIGEgZ2xvYmFsIHByZWZpeCBub3Qgb24gUEFUSCkuIFNlZSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYC5cbiAgICAgKlxuICAgICAqIFBpcGUgc3Rkb3V0L3N0ZGVyciBldmVuIHdoZW4gaGlkZGVuIChyYXRoZXIgdGhhbiBkaXNjYXJkaW5nKSBzbyBhbiBlYXJseVxuICAgICAqIGZhaWx1cmUgc3VjaCBhcyBhIGNyYXNoIG9yIGEgbWlzc2luZyBkcml2ZXIgaXMgY2FwdHVyZWQgYW5kIHN1cmZhY2VkXG4gICAgICogaW1tZWRpYXRlbHkgYnkgYHdhaXRGb3JBcHBpdW1SZWFkeWAsIG1pcnJvcmluZyBgc3RhcnRFbXVsYXRvcmA7XG4gICAgICogYHdpbmRvd3NIaWRlYCBzdGlsbCBzdXBwcmVzc2VzIHRoZSBjb25zb2xlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUFQUElVTV9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RW11bGF0b3IoYXZkTmFtZTogc3RyaW5nLCBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4pOiBQcm9jZXNzTGF1bmNoIHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHRoaXMucmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gICAgY29uc3QgaXNXaW5kb3dIaWRkZW4gPSBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3coaXNFbXVsYXRvclZpc2libGUpO1xuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEVtdWxhdG9yQXJncyh7IGF2ZE5hbWUsIGlzSGlkZGVuOiBpc1dpbmRvd0hpZGRlbiB9KTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFncyhpc1dpbmRvd0hpZGRlbik7XG4gICAgdGhpcy5sb2coYFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgLypcbiAgICAgKiBQaXBlIChyYXRoZXIgdGhhbiBpZ25vcmUpIHN0ZG91dC9zdGRlcnIgc28gYW4gZWFybHkgZmFpbHVyZSBzdWNoIGFzXG4gICAgICogXCJ4ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb25cIiBjYW4gYmVcbiAgICAgKiBzdXJmYWNlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBhcmdzLCB7XG4gICAgICBkZXRhY2hlZCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG4gICAgLypcbiAgICAgKiBBIHNwYXduIGZhaWx1cmUgKGUuZy4gRU5PRU5UIGZvciBhIG1pc3NpbmcvYnJva2VuIGVtdWxhdG9yIGJpbmFyeSkgZW1pdHNcbiAgICAgKiAnZXJyb3InLCBub3QgJ2V4aXQnLiBSZWNvcmQgaXQgYXMgYSBzeW50aGV0aWMgZXhpdCBzbyB0aGUgYm9vdC9uZXctZGV2aWNlXG4gICAgICogcG9sbHMgZmFpbCBmYXN0IGluc3RlYWQgb2Ygc3Bpbm5pbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYHRlbXAtdmF1bHQtKmAgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlZnQgb24gdGhlIGRldmljZS5cbiAgICpcbiAgICogUnVucyAqKmJlZm9yZSoqIGByZW1vdGUoKWAgbGF1bmNoZXMgT2JzaWRpYW4gXHUyMDE0IHRoZSBsYXN0IG1vbWVudCBhdCB3aGljaFxuICAgKiBub3RoaW5nIGhhcyB0byBlbnVtZXJhdGUgdGhlIGRldmljZSdzIHZhdWx0cyB5ZXQsIGFuZCB0aGUgb25seSBzd2VlcCB0aGF0XG4gICAqIGRvZXMgbm90IGRlcGVuZCBvbiBhIGhlYWx0aHkgV2ViVmlldy4gVGhhdCBpbmRlcGVuZGVuY2UgaXMgdGhlIHdob2xlIHBvaW50OlxuICAgKiBhIHJ1biB3aG9zZSBXZWJWaWV3IGRpZWQgY2Fubm90IHVucmVnaXN0ZXIgb3IgZGVsZXRlIGl0cyBvd24gdmF1bHQsIHNvXG4gICAqIHdpdGhvdXQgdGhpcyBlYWNoIGZhaWx1cmUgbGVhdmVzIHJlc2lkdWUgdGhhdCBzbG93cyB0aGUgbmV4dCBydW4ncyBzdGFydHVwXG4gICAqIGVudW1lcmF0aW9uIGFuZCBtYWtlcyB0aGUgbmV4dCBmYWlsdXJlIGxpa2VsaWVyLlxuICAgKlxuICAgKiBVbmNvbmRpdGlvbmFsIChubyBhZ2UgZ2F0ZSkgXHUyMDE0IEFuZHJvaWQgcnVucyBob2xkIHRoZSBleGNsdXNpdmUgYGFuZHJvaWRgXG4gICAqIHNldHVwIGxvY2ssIHNvIG5vIGNvbmN1cnJlbnQgcnVuIGNhbiBvd24gYSBkZXZpY2UgdmF1bHQsIGFuZCBhbiBhZ2UgZ2F0ZVxuICAgKiB3b3VsZCBsZXQgYSB2YXVsdCBsZWFrZWQgbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoaXMgcnVuLiBCZXN0LWVmZm9ydDogYVxuICAgKiBmYWlsdXJlIGlzIGxvZ2dlZCwgbm90IHRocm93bi5cbiAgICpcbiAgICogVGhlIHJlbW92YWxzIGdvIG9uZSBkaXJlY3RvcnkgYXQgYSB0aW1lIGFuZCB0aGUgb3V0Y29tZSBpcyByZS1saXN0ZWQgcmF0aGVyXG4gICAqIHRoYW4gaW5mZXJyZWQ7IHtAbGluayBzd2VlcERldmljZUxlZnRvdmVyc30gZXhwbGFpbnMgd2h5LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgdmF1bHQgYmFzZSBwYXRoIHRvIHN3ZWVwLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzd2VlcERldmljZUxlZnRvdmVyVmF1bHRzKHBhcmFtczogU3dlZXBEZXZpY2VMZWZ0b3ZlclZhdWx0c1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZGV2aWNlSWQsIHZhdWx0QmFzZVBhdGggfSA9IHBhcmFtcztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzd2VlcERldmljZUxlZnRvdmVycyh7XG4gICAgICAgIGxpc3ROYW1lczogYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgICAgICAgICBjb25zdCBsaXN0aW5nID0gYXdhaXQgZXhlYyhcbiAgICAgICAgICAgIFsnYWRiJywgJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdscycsICctMScsIHZhdWx0QmFzZVBhdGhdLFxuICAgICAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfU1dFRVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGxpc3Rpbmcuc3BsaXQoJ1xcbicpO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVEaXI6IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICBhd2FpdCBleGVjKFxuICAgICAgICAgICAgWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgJy1yZicsIHBhdGhdLFxuICAgICAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfU1dFRVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHZhdWx0QmFzZVBhdGhcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzdWx0LnJlbW92ZWRDb3VudCA9PT0gMCAmJiByZXN1bHQuZmFpbGVkTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9nKGBObyBsZWZ0b3ZlciB0ZW1wIHZhdWx0cyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2coYFJlbW92ZWQgJHtTdHJpbmcocmVzdWx0LnJlbW92ZWRDb3VudCl9IGxlZnRvdmVyIHRlbXAgdmF1bHQocykgZnJvbSAke3ZhdWx0QmFzZVBhdGh9IG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcblxuICAgICAgaWYgKHJlc3VsdC5mYWlsZWROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgIGBXYXJuaW5nOiAke1N0cmluZyhyZXN1bHQuZmFpbGVkTmFtZXMubGVuZ3RoKX0gbGVmdG92ZXIgdGVtcCB2YXVsdChzKSBjb3VsZCBub3QgYmUgcmVtb3ZlZCBhbmQgd2lsbCBiZSByZXRyaWVkIG5leHQgcnVuOiAke3Jlc3VsdC5mYWlsZWROYW1lcy5qb2luKCcsICcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2coYFdhcm5pbmc6IGZhaWxlZCB0byBzd2VlcCBsZWZ0b3ZlciB0ZW1wIHZhdWx0czogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIsIGxhdW5jaDogUHJvY2Vzc0xhdW5jaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJZiB0aGUgc2VydmVyIHByb2Nlc3MgYWxyZWFkeSBkaWVkIChjcmFzaGVkLCBvciBuZXZlciBzdGFydGVkKSwgc3RvcFxuICAgICAgICogcG9sbGluZyBhbmQgc3VyZmFjZSB3aHkgXHUyMDE0IG90aGVyd2lzZSBhIGRvb21lZCBzZXJ2ZXIgc3BpbnMgb3V0IHRoZSB3aG9sZVxuICAgICAgICogcmVhZGluZXNzIHRpbWVvdXQgd2l0aCBubyBkaWFnbm9zdGljcyAodGhlIG9yaWdpbmFsIFQ4NCBzeW1wdG9tKS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZXhpdEluZm8gPSBsYXVuY2gucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgYnVpbGREZWF0aEVycm9yKGV4aXRJbmZvKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICBsYXVuY2guc3RvcENhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ6ICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxFeGl0SW5mbyA9IGxhdW5jaC5yZWFkRXhpdEluZm8oKTtcbiAgICBpZiAoZmluYWxFeGl0SW5mbykge1xuICAgICAgdGhyb3cgYnVpbGREZWF0aEVycm9yKGZpbmFsRXhpdEluZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFRhaWwgPSBsYXVuY2gucmVhZE91dHB1dCgpLnRyaW0oKTtcbiAgICBjb25zdCBvdXRwdXRTZWN0aW9uID0gb3V0cHV0VGFpbC5sZW5ndGggPiAwID8gYFxcblxcbkFwcGl1bSBzZXJ2ZXIgb3V0cHV0ICh0YWlsKTpcXG4ke291dHB1dFRhaWx9YCA6ICcnO1xuICAgIHRocm93IG5ldyBFcnJvcihgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuJHtvdXRwdXRTZWN0aW9ufWApO1xuXG4gICAgZnVuY3Rpb24gYnVpbGREZWF0aEVycm9yKGV4aXRJbmZvOiBQcm9jZXNzRXhpdEluZm8pOiBFcnJvciB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgZXhpdEluZm8sXG4gICAgICAgIG91dHB1dDogbGF1bmNoLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgb3V0cHV0TGFiZWw6ICdBcHBpdW0gc2VydmVyIG91dHB1dCcsXG4gICAgICAgIHN1YmplY3Q6ICdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlcidcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIsIGVtdWxhdG9yOiBQcm9jZXNzTGF1bmNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCBkZWFkbGluZSAtIERhdGUubm93KCkpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIGRldmljZSAke2RldmljZUlkfSB0byBmaW5pc2ggYm9vdGluZyAocmVtYWluaW5nOiAke1N0cmluZyhyZW1haW5pbmdNcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNCb290ZWQpIHtcbiAgICAgICAgdGhpcy5sb2coYERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSh7XG4gICAgICAgICAgZXhpdEluZm8sXG4gICAgICAgICAgb3V0cHV0OiBlbXVsYXRvci5yZWFkT3V0cHV0KCksXG4gICAgICAgICAgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnLFxuICAgICAgICAgIHN1YmplY3Q6ICdBbmRyb2lkIGVtdWxhdG9yJ1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogUHJvY2Vzc0xhdW5jaCwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoYWN0dWFsRGV2aWNlSWQsIGRlYWRsaW5lLCBlbXVsYXRvcik7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZUlkbGUoYWN0dWFsRGV2aWNlSWQsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgICBvdXRwdXQ6IGVtdWxhdG9yLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgICBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcsXG4gICAgICAgICAgc3ViamVjdDogJ0FuZHJvaWQgZW11bGF0b3InXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBuZXcgZW11bGF0b3IgZGV2aWNlIGFwcGVhcmVkIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FrZVNjcmVlbihkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYFdha2luZyBzY3JlZW4gb24gZGV2aWNlICR7ZGV2aWNlSWR9Li4uYCk7XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9XQUtFVVAsICd3YWtlIHNjcmVlbicpO1xuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgICB0aGlzLmxvZyhgU2NyZWVuIHdha2UgY29tcGxldGUgb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBhbiBvd25lZCBkZXNrdG9wIENEUCB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBBIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBjb25zdCB0eXBlID0gb3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuXG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNkcFRyYW5zcG9ydChvcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSh0eXBlKTtcbiAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWNoZWQgdHJhbnNwb3J0IGluc3RhbmNlLCBjcmVhdGluZyBvbmUgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9uc1xuICogaWYgbm90IGFscmVhZHkgY2FjaGVkLlxuICpcbiAqIFRoZSB0cmFuc3BvcnQgaXMgY2FjaGVkIHBlciB3b3JrZXIgcHJvY2VzcyBzbyBXZWJTb2NrZXQvQXBwaXVtIHNlc3Npb25zXG4gKiBhcmUgcmV1c2VkIGFjcm9zcyBjYWxscyB3aXRoaW4gdGhlIHNhbWUgdGVzdCB3b3JrZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgY3JlYXRlZCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAoY2FjaGVkVHJhbnNwb3J0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zcG9ydDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBTaW5nbGUtdGhyZWFkZWQgd29ya2VyOyBubyBjb25jdXJyZW50IHdyaXRlcy5cbiAgY2FjaGVkVHJhbnNwb3J0ID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogZm9yIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIGVpdGhlciB0aHJvd3NcbiAqIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9ICh3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KVxuICogb3IgcHJvY2VlZHMgdG8gbGF1bmNoIHdpdGggYSB3YXJuaW5nOyBmb3IgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gQm90aCB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZCB3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXN9IGlzXG4gKiBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSB3YXJuL3Rocm93IGtub2JzLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkocGFyYW1zOiBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uLCBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLCBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzIH0gPSBwYXJhbXM7XG4gIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24oe1xuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0aWVyOiBjb21wYXRpYmlsaXR5LnRpZXJcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi11bnJ1bm5hYmxlJykge1xuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBPYnNpZGlhbiBpbnN0YWxsZXIgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lmluc3RhbGxlclZlcnNpb24pfSBpcyBiZWxvdyB0aGUgYFxuICAgICAgICArIGBydW4gZmxvb3IgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbil9IGZvciBPYnNpZGlhbiAke2NvbXBhdGliaWxpdHkuYXBwVmVyc2lvbn07IGBcbiAgICAgICAgKyAncHJvY2VlZGluZyB0byBsYXVuY2ggKHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIgaXMgZmFsc2UpIFx1MjAxNCB0aGUgYm9vdCB3aWxsIGxpa2VseSBkZWFkLWJvb3QuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi1uYWdnZWQnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSAke2Vuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWVzc2FnZSl9YCk7XG4gIH1cblxuICByZXR1cm4gY29tcGF0aWJpbGl0eTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVza3RvcCBDRFAgdHJhbnNwb3J0LiBXaGVuIGFuIGV4cGxpY2l0IGBwb3J0YCBpcyBnaXZlbiB0aGVcbiAqIHRyYW5zcG9ydCBhdHRhY2hlcyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gb24gdGhhdCBwb3J0OyBvdGhlcndpc2UgaXRcbiAqIGxhdW5jaGVzIGFuZCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlICh0aGUgZGVmYXVsdCwgaGVybWV0aWMgbW9kZSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvd25lZFN1ZmZpeCA9IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/ICcgKGhhcm5lc3Mtb3duZWQpJyA6ICcnO1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQXR0YWNoaW5nIHRvIHJ1bm5pbmcgT2JzaWRpYW4ke293bmVkU3VmZml4fSAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0KX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgICBjZHBIb3N0OiBvcHRpb25zLmhvc3QsXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2VcbiAgICB9KSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgY2RwSG9zdDogb3B0aW9ucz8uaG9zdCxcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUsXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogcmVzb2x2ZVNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sob3B0aW9ucz8uc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksIEhBUk5FU1NfVEVNUF9ESVJfTkFNRSk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX0RJUl9QUkVGSVgpKTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIGhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWRcbiAqIGluc3RhbmNlLCB3aXRob3V0IGRvd25sb2FkaW5nIGFueXRoaW5nIHlldDogYW4gdXBncmFkZS1vbmx5IGFzYXItc3dhcCBvbnRvIHRoZVxuICogc2hlbGwsIGEgZG93bmdyYWRlIHRvIHRoZSBhcHAncyBvd24gaW5zdGFsbGVyIHNoZWxsLCBvciB0aGUgdXNlcidzIG5ld2VzdFxuICogaW5zdGFsbGVkIGFzYXIgd2hlbiBuZWl0aGVyIHZlcnNpb24gaXMgcGlubmVkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHNoZWxsVmVyc2lvbiAtIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBUaGUgYXNhciBwbGFuIChhdCBtb3N0IG9uZSBvZiBpdHMgZmllbGRzIGlzIHNldCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBc2FyUGxhbihcbiAgb3B0aW9uczogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxBc2FyUGxhbj4ge1xuICBpZiAob3B0aW9ucz8ub2JzaWRpYW5WZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhc2FyVmVyc2lvbiA9IGF3YWl0IHJlc29sdmVDb25jcmV0ZVZlcnNpb24ob3B0aW9ucy5vYnNpZGlhblZlcnNpb24pO1xuICAgIGlmIChzaGVsbFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlVmVyc2lvbnMoYXNhclZlcnNpb24sIHNoZWxsVmVyc2lvbikgPj0gMCkge1xuICAgICAgcmV0dXJuIHsgYXNhclZlcnNpb25Ub1N3YXA6IGFzYXJWZXJzaW9uIH07XG4gICAgfVxuXG4gICAgLy8gQXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSwgc28gaXQgY2Fubm90IGFwcGx5IGEgdmVyc2lvbiBvbGRlciB0aGFuIHRoZVxuICAgIC8vIFNoZWxsJ3MgYnVuZGxlZCBvbmUgXHUyMDE0IGFuZCB3aGVuIHRoZSBzaGVsbCB2ZXJzaW9uIGlzIHVua25vd24gKGEgTGludXhcbiAgICAvLyBQYXRoLXBhcnNlIG1pc3MpIHdlIGNhbm5vdCBwcm92ZSB0aGUgc3dhcCB3b3VsZCBhcHBseSBhdCBhbGwuIEluIGJvdGhcbiAgICAvLyBDYXNlcyB1c2UgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgd2hvc2UgYnVuZGxlZCBhc2FyXG4gICAgLy8gSXMgZXhhY3RseSB0aGlzIHZlcnNpb24sIHNvIHRoZSBwaW4gaXMgYWx3YXlzIGhvbm9yZWQuXG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBVc2luZyB0aGUgJHthc2FyVmVyc2lvbn0gaW5zdGFsbGVyIHNoZWxsIChzaGVsbCB2ZXJzaW9uICR7c2hlbGxWZXJzaW9uID8/ICd1bmtub3duJ307IGFzYXItc3dhcCBpcyB1cGdyYWRlLW9ubHkpLmApO1xuICAgIHJldHVybiB7IGRvd25ncmFkZUluc3RhbGxlclZlcnNpb246IGFzYXJWZXJzaW9uIH07XG4gIH1cblxuICBpZiAob3B0aW9ucz8ub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuZXdlc3QgPSBmaW5kTmV3ZXN0QXNhcihnZXRPYnNpZGlhbkNvbmZpZ0RpcigpKTtcbiAgICBpZiAobmV3ZXN0ICYmIChzaGVsbFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBjb21wYXJlVmVyc2lvbnMobmV3ZXN0LnZlcnNpb24sIHNoZWxsVmVyc2lvbikgPj0gMCkpIHtcbiAgICAgIHJldHVybiB7IGFzYXI6IHsgcGF0aDogbmV3ZXN0LnBhdGgsIHZlcnNpb246IG5ld2VzdC52ZXJzaW9uIH0gfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsLCB0b2xlcmF0aW5nIGl0cyBhYnNlbmNlLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZX0gKHdoaWNoIHRocm93cyB3aGVuIE9ic2lkaWFuIGlzIG5vdFxuICogaW5zdGFsbGVkKSwgdGhpcyByZXR1cm5zIGB1bmRlZmluZWRgIGluIHRoYXQgY2FzZSwgc28gYSBjYWxsZXIgcGlubmluZyBhblxuICogaW5zdGFsbGVyIHZlcnNpb24gY2FuIGZhbGwgYmFjayB0byBkb3dubG9hZGluZyB0aGUgcGlubmVkIHNoZWxsIGluc3RlYWQgb2ZcbiAqIGZhaWxpbmcgb24gYSBob3N0IHdpdGggbm8gT2JzaWRpYW4gaW5zdGFsbGVkIChlLmcuIENJKS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgaW5zdGFsbGVkIHNoZWxsJ3MgcGF0aCBhbmQgZGV0ZWN0ZWQgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICogICBubyBPYnNpZGlhbiBpcyBpbnN0YWxsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpOiBQcm9taXNlPEluc3RhbGxlZFNoZWxsIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgICByZXR1cm4geyBleGVQYXRoLCBzaGVsbFZlcnNpb246IGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbihleGVQYXRoKSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNoZWxsIGV4ZWN1dGFibGUsIGFzYXIgcHJvdmlzaW9uaW5nLCBhbmQgaXNvbGF0ZWQgdXNlci1kYXRhIGRpclxuICogZm9yIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBmcm9tIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBrbm9icy5cbiAqXG4gKiAtIGBvYnNpZGlhbkluc3RhbGxlclZlcnNpb25gIHBpbnMgdGhlIEVsZWN0cm9uIHNoZWxsIChkb3dubG9hZHMgKyBleHRyYWN0cyBhXG4gKiAgIHBvcnRhYmxlIGJ1aWxkIHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBpbnN0YWxsZWQgc2hlbGwpLlxuICogLSBgb2JzaWRpYW5WZXJzaW9uYCBwaW5zIHRoZSBhcHA6IGFuIGFzYXItc3dhcCB3aGVuIGl0IGlzID49IHRoZSBzaGVsbCB2ZXJzaW9uXG4gKiAgIChjaGVhcCksIG90aGVyd2lzZSB0aGUgbWF0Y2hpbmcgaW5zdGFsbGVyIHNoZWxsIGlzIHVzZWQgKGRvd25ncmFkZSkuXG4gKiAtIFdoZW4gbmVpdGhlciBpcyBzZXQsIHRoZSB1c2VyJ3MgbmV3ZXN0IGluc3RhbGxlZCBhc2FyIGlzIGNvcGllZCBpbiAoc28gdGhlXG4gKiAgIG93bmVkIGluc3RhbmNlIG1hdGNoZXMgdGhlIHZlcnNpb24gdGhlIHVzZXIgY3VycmVudGx5IHJ1bnMpIHdpdGggemVybyBuZXR3b3JrLlxuICpcbiAqIFRoZSBjb25jcmV0ZSAoYXBwLCBpbnN0YWxsZXIpIHZlcnNpb24gcGFpciBpcyByZXNvbHZlZCAqYmVmb3JlKiBhbnkgc2hlbGwvYXNhclxuICogZG93bmxvYWQsIHNvIGEgcHJvYWN0aXZlIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IGNoZWNrXG4gKiAoe0BsaW5rIGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eX0pIGNhbiBmYWlsIGZhc3Q6IGFuIGluc3RhbGxlciBiZWxvdyB0aGVcbiAqIGFwcCdzIHJ1biBmbG9vciB0aHJvd3Mge0BsaW5rIEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcn0gYmVmb3JlXG4gKiBhbnl0aGluZyBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkIChzdXBlcnNlZGluZyB0aGUgcmVhY3RpdmUgZGVhZC1ib290XG4gKiBmYXN0LWZhaWwgZm9yIHRhYmxlLWtub3duIGNvbWJvcyksIGFuZCBhIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZFxuICogaW5zdGFsbGVyIGxvZ3MgYSB3YXJuaW5nLiBUaGUgdmVyZGljdCBpcyB0aHJlYWRlZCBvbnRvIHRoZSByZXR1cm5lZCBjb25maWcgc29cbiAqIHRoZSB0cmFuc3BvcnQgY2FuIHN1cmZhY2UgaXQgYXMgZGF0YS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBvd25lZC1pbnN0YW5jZSBjb25maWcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPd25lZEluc3RhbmNlQ29uZmlnKG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE93bmVkSW5zdGFuY2VDb25maWc+IHtcbiAgLy8gUmVzb2x2ZSB0aGUgY29uY3JldGUgc2hlbGwgKGluc3RhbGxlcikgdmVyc2lvbiBmaXJzdCwgYnV0IGZvciBhIHBpbm5lZFxuICAvLyBJbnN0YWxsZXIgREVGRVIgcmVzb2x2aW5nL2Rvd25sb2FkaW5nIHRoZSBhY3R1YWwgc2hlbGwgdW50aWwgYWZ0ZXIgdGhlXG4gIC8vIFByb2FjdGl2ZSBjb21wYXRpYmlsaXR5IGNoZWNrLCBzbyBhbiB1bnJ1bm5hYmxlIHBpbiBmYWlscyBmYXN0IFx1MjAxNCBiZWZvcmUgdGhlXG4gIC8vIChwb3NzaWJseSBzbG93KSBpbnN0YWxsZWQtc2hlbGwgZGV0ZWN0aW9uIGFuZCBhbnkgZG93bmxvYWQuXG4gIGxldCBleGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHBpbm5lZEluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAob3B0aW9ucz8ub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHNoZWxsVmVyc2lvbiA9IGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbihleGVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBIHBpbm5lZCBpbnN0YWxsZXIgdmVyc2lvbiBmdWxseSBkZXRlcm1pbmVzIHRoZSBzaGVsbCB2ZXJzaW9uIHVwIGZyb250LFxuICAgIC8vIFdpdGhvdXQgcmVxdWlyaW5nIGEgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gKGEgQ0kgcnVubmVyIGhhcyBub25lKS5cbiAgICBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbik7XG4gICAgc2hlbGxWZXJzaW9uID0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbjtcbiAgfVxuXG4gIC8vIERlY2lkZSBob3cgdGhlIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQsIHN0aWxsIFdJVEhPVVQgZG93bmxvYWRpbmcuXG4gIGNvbnN0IHBsYW4gPSBhd2FpdCByZXNvbHZlQXNhclBsYW4ob3B0aW9ucywgc2hlbGxWZXJzaW9uKTtcblxuICAvLyBUaGUgYXBwIHZlcnNpb24gdGhhdCB3aWxsIHJ1biBhcyBhbiBhc2FyLXN3YXAgb250byBgc2hlbGxWZXJzaW9uYCBcdTIwMTQgdGhlIG9ubHlcbiAgLy8gQ29tYmluYXRpb24gdGhhdCBjYW4gZGVhZC1ib290LiBUaGUgZG93bmdyYWRlIC8gb3duLWluc3RhbGxlciBwYXRocyBydW4gdGhlXG4gIC8vIEFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIHNvIHRoZXkgYWx3YXlzIGJvb3QgYW5kIGFyZSBub3QgY2hlY2tlZC5cbiAgY29uc3Qgc3dhcEFwcFZlcnNpb24gPSBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwID8/IHBsYW4uYXNhcj8udmVyc2lvbjtcbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGNoZWNrQW5kUmVwb3J0Q29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbjogc3dhcEFwcFZlcnNpb24sXG4gICAgaW5zdGFsbGVyVmVyc2lvbjogc2hlbGxWZXJzaW9uLFxuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyKG9wdGlvbnM/LnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIpLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IHJlc29sdmVTaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMpXG4gIH0pO1xuXG4gIC8vIFRoZSBwaW4gaXMga25vd24gcnVubmFibGUgXHUyMDE0IHJlc29sdmUvZG93bmxvYWQgdGhlIGRlZmVycmVkIHNoZWxsICsgYXNhciBub3cuXG4gIC8vIFJldXNlIHRoZSBpbnN0YWxsZWQgc2hlbGwgb25seSB3aGVuIGl0IGFscmVhZHkgbWF0Y2hlcyB0aGUgcGluIChzYXZlcyB0aGVcbiAgLy8gRG93bmxvYWQpOyBvdGhlcndpc2UgZG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBpbm5lZCBpbnN0YWxsZXIuXG4gIGlmIChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTtcbiAgICBleGVQYXRoID0gaW5zdGFsbGVkPy5zaGVsbFZlcnNpb24gPT09IHBpbm5lZEluc3RhbGxlclZlcnNpb24gPyBpbnN0YWxsZWQuZXhlUGF0aCA6IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBpbm5lZEluc3RhbGxlclZlcnNpb24pO1xuICB9XG4gIGlmIChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24pO1xuICB9XG5cbiAgY29uc3QgYXNhciA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPT09IHVuZGVmaW5lZFxuICAgID8gcGxhbi5hc2FyXG4gICAgOiB7IHBhdGg6IGF3YWl0IGVuc3VyZUFzYXJDYWNoZWQocGxhbi5hc2FyVmVyc2lvblRvU3dhcCksIHZlcnNpb246IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLihhc2FyICYmIHsgYXNhciB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgZXhlUGF0aDogZW5zdXJlTm9uTnVsbGFibGUoZXhlUGF0aCksXG4gICAgdXNlckRhdGFEaXI6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLGdDQUdPO0FBQ1AscUJBR087QUFDUCx1QkFBaUI7QUFDakIscUJBQXVCO0FBQ3ZCLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFDcEIseUJBR087QUFlUCxpQ0FJTztBQUNQLG1DQUdPO0FBQ1Asc0JBR087QUFDUCxtQ0FLTztBQUNQLDhCQUdPO0FBQ1AsMkJBQWtDO0FBQ2xDLGtCQUFxQjtBQUNyQixrREFBa0Q7QUFDbEQscUNBQTRDO0FBQzVDLCtCQUFnQztBQUNoQyw4QkFLTztBQUNQLGlCQUFvQjtBQUNwQiwyQ0FBNEM7QUFDNUMsNkJBQXFDO0FBQ3JDLGlDQUEwQztBQUMxQyxnQ0FHTztBQUNQLCtCQUFtQztBQUNuQyxxQ0FJTztBQUNQLDhCQUFnQztBQUNoQyxrQ0FBd0M7QUFDeEMscUNBQW1EO0FBQ25ELDJCQUdPO0FBQ1AsOEJBR087QUFDUCxtQ0FBb0M7QUFDcEMseUJBQWtDO0FBQ2xDLHdCQUdPO0FBRVAsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSwwQ0FBMEM7QUFLaEQsTUFBTSxvQ0FBb0M7QUFDMUMsTUFB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bkk7QUFDQSxNQUFJLEtBQUssOEJBQThCLFFBQVc7QUFDaEQsY0FBVSxVQUFNLDZDQUFrQixLQUFLLHlCQUF5QjtBQUFBLEVBQ2xFO0FBRUEsUUFBTSxPQUFPLEtBQUssc0JBQXNCLFNBQ3BDLEtBQUssT0FDTCxFQUFFLE1BQU0sVUFBTSxpREFBaUIsS0FBSyxpQkFBaUIsR0FBRyxTQUFTLEtBQUssa0JBQWtCO0FBRTVGLFNBQU87QUFBQSxJQUNMLEdBQUksUUFBUSxFQUFFLEtBQUs7QUFBQSxJQUNuQixHQUFJLGlCQUFpQixFQUFFLGNBQWM7QUFBQSxJQUNyQyxhQUFTLHNDQUFrQixPQUFPO0FBQUEsSUFDbEMsYUFBYSx1QkFBdUI7QUFBQSxFQUN0QztBQUNGO0FBZUEsU0FBUywyQkFBMkIsZ0JBQTBDO0FBQzVFLE1BQUksZUFBZSxtQkFBbUIsU0FBUztBQUM3QyxtQkFBZSxRQUFRLE9BQU8sWUFBWTtBQUMxQyxtQkFBZSxRQUFRLE9BQU8sZ0JBQWdCO0FBQUEsRUFDaEQ7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImh0dHAiLCAia2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzIiwgInByb2Nlc3MiXQp9Cg==