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
@@ -42,6 +42,12 @@ import { exec } from "./exec.mjs";
42
42
  import { IncompatibleInstallerVersionError } from "./incompatible-installer-version-error.mjs";
43
43
  import { checkInstallerCompatibility } from "./installer-compatibility.mjs";
44
44
  import { killProcessTree } from "./kill-process-tree.mjs";
45
+ import {
46
+ HARNESS_TEMP_DIR_NAME,
47
+ OWNED_USER_DATA_DIR_PREFIX,
48
+ resolveShouldSweepLeftovers,
49
+ sweepDeviceLeftovers
50
+ } from "./leftover-cleanup.mjs";
45
51
  import { log } from "./log.mjs";
46
52
  import { normalizeOptionalProperties } from "./normalize-optional-properties.mjs";
47
53
  import { getObsidianConfigDir } from "./obsidian-config.mjs";
@@ -63,7 +69,10 @@ import {
63
69
  resolveAppiumSpawnFlags,
64
70
  resolveEmulatorSpawnFlags
65
71
  } from "./spawn-options.mjs";
66
- import { AppiumTransport } from "./transport-appium.mjs";
72
+ import {
73
+ AppiumTransport,
74
+ DEFAULT_ANDROID_VAULT_BASE_PATH
75
+ } from "./transport-appium.mjs";
67
76
  import { DesktopCdpTransport } from "./transport-desktop-cdp.mjs";
68
77
  import { ensureNonNullable } from "./type-guards.mjs";
69
78
  import {
@@ -77,7 +86,7 @@ const APPIUM_CONNECTION_RETRY_COUNT = 3;
77
86
  const APPIUM_OUTPUT_TAIL_MAX_LENGTH = 8e3;
78
87
  const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
79
88
  const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
80
- const OWNED_USER_DATA_PREFIX = "userdata-";
89
+ const ADB_VAULT_SWEEP_TIMEOUT_IN_MILLISECONDS = 3e4;
81
90
  const CHROMEDRIVER_AUTODOWNLOAD_FEATURE = "uiautomator2:chromedriver_autodownload";
82
91
  const COMMAND_TIMEOUT_IN_MILLISECONDS = 300;
83
92
  const DEFAULT_TRANSPORT_TYPE = "obsidian-cdp";
@@ -135,6 +144,7 @@ class AppiumTransportFactory {
135
144
  deviceId,
136
145
  isSessionOwner: false,
137
146
  platform: "android",
147
+ shouldSweepLeftovers: resolveShouldSweepLeftovers(options),
138
148
  ...options.layoutReadyTimeoutInMilliseconds !== void 0 && { layoutReadyTimeoutInMilliseconds: options.layoutReadyTimeoutInMilliseconds },
139
149
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath },
140
150
  ...options.webviewTimeoutInMilliseconds !== void 0 && { webviewTimeoutInMilliseconds: options.webviewTimeoutInMilliseconds }
@@ -200,6 +210,12 @@ class AppiumTransportFactory {
200
210
  appiumProcess = result.appiumProcess;
201
211
  emulatorProcess = result.emulatorProcess;
202
212
  const actualDeviceId = result.actualDeviceId;
213
+ if (resolveShouldSweepLeftovers(options)) {
214
+ await this.sweepDeviceLeftoverVaults({
215
+ deviceId: actualDeviceId,
216
+ vaultBasePath: options.vaultBasePath ?? DEFAULT_ANDROID_VAULT_BASE_PATH
217
+ });
218
+ }
203
219
  const sessionConnectionRetryTimeout = resolveSessionConnectionRetryTimeoutInMilliseconds(options);
204
220
  this.log(
205
221
  `Connecting to Appium (device=${actualDeviceId}, app=${appId}, retryTimeout: ${String(sessionConnectionRetryTimeout)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
@@ -231,6 +247,7 @@ class AppiumTransportFactory {
231
247
  browser,
232
248
  deviceId: actualDeviceId,
233
249
  platform: "android",
250
+ shouldSweepLeftovers: resolveShouldSweepLeftovers(options),
234
251
  ...options.layoutReadyTimeoutInMilliseconds !== void 0 && { layoutReadyTimeoutInMilliseconds: options.layoutReadyTimeoutInMilliseconds },
235
252
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath },
236
253
  ...options.webviewTimeoutInMilliseconds !== void 0 && { webviewTimeoutInMilliseconds: options.webviewTimeoutInMilliseconds }
@@ -614,6 +631,59 @@ class AppiumTransportFactory {
614
631
  );
615
632
  });
616
633
  }
634
+ /**
635
+ * Removes the `temp-vault-*` directories earlier runs left on the device.
636
+ *
637
+ * Runs **before** `remote()` launches Obsidian — the last moment at which
638
+ * nothing has to enumerate the device's vaults yet, and the only sweep that
639
+ * does not depend on a healthy WebView. That independence is the whole point:
640
+ * a run whose WebView died cannot unregister or delete its own vault, so
641
+ * without this each failure leaves residue that slows the next run's startup
642
+ * enumeration and makes the next failure likelier.
643
+ *
644
+ * Unconditional (no age gate) — Android runs hold the exclusive `android`
645
+ * setup lock, so no concurrent run can own a device vault, and an age gate
646
+ * would let a vault leaked minutes ago survive into this run. Best-effort: a
647
+ * failure is logged, not thrown.
648
+ *
649
+ * The removals go one directory at a time and the outcome is re-listed rather
650
+ * than inferred; {@link sweepDeviceLeftovers} explains why.
651
+ *
652
+ * @param params - The device and vault base path to sweep.
653
+ */
654
+ async sweepDeviceLeftoverVaults(params) {
655
+ const { deviceId, vaultBasePath } = params;
656
+ try {
657
+ const result = await sweepDeviceLeftovers({
658
+ listNames: async () => {
659
+ const listing = await exec(
660
+ ["adb", "-s", deviceId, "shell", "ls", "-1", vaultBasePath],
661
+ { isQuiet: true, shouldIgnoreExitCode: true, timeoutInMilliseconds: ADB_VAULT_SWEEP_TIMEOUT_IN_MILLISECONDS }
662
+ );
663
+ return listing.split("\n");
664
+ },
665
+ removeDir: async (path) => {
666
+ await exec(
667
+ ["adb", "-s", deviceId, "shell", "rm", "-rf", path],
668
+ { isQuiet: true, shouldIgnoreExitCode: true, timeoutInMilliseconds: ADB_VAULT_SWEEP_TIMEOUT_IN_MILLISECONDS }
669
+ );
670
+ },
671
+ vaultBasePath
672
+ });
673
+ if (result.removedCount === 0 && result.failedNames.length === 0) {
674
+ this.log(`No leftover temp vaults on device ${deviceId}.`);
675
+ return;
676
+ }
677
+ this.log(`Removed ${String(result.removedCount)} leftover temp vault(s) from ${vaultBasePath} on device ${deviceId}.`);
678
+ if (result.failedNames.length > 0) {
679
+ this.log(
680
+ `Warning: ${String(result.failedNames.length)} leftover temp vault(s) could not be removed and will be retried next run: ${result.failedNames.join(", ")}`
681
+ );
682
+ }
683
+ } catch (error) {
684
+ this.log(`Warning: failed to sweep leftover temp vaults: ${error instanceof Error ? error.message : "unknown error"}`);
685
+ }
686
+ }
617
687
  async waitForAppiumReady(url, timeoutInMilliseconds, launch) {
618
688
  const start = Date.now();
619
689
  this.log(
@@ -852,9 +922,9 @@ async function createCdpTransport(options) {
852
922
  }));
853
923
  }
854
924
  function createOwnedUserDataDir() {
855
- const root = join(tmpdir(), "obsidian-integration-testing");
925
+ const root = join(tmpdir(), HARNESS_TEMP_DIR_NAME);
856
926
  mkdirSync(root, { recursive: true });
857
- return mkdtempSync(join(root, OWNED_USER_DATA_PREFIX));
927
+ return mkdtempSync(join(root, OWNED_USER_DATA_DIR_PREFIX));
858
928
  }
859
929
  async function resolveAsarPlan(options, shellVersion) {
860
930
  if (options?.obsidianVersion !== void 0) {
@@ -926,4 +996,4 @@ export {
926
996
  createTransportFromOptions,
927
997
  getOrCreateTransport
928
998
  };
929
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUNvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLm1qcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLm1qcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpciB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzLFxuICByZXNvbHZlRW11bGF0b3JTcGF3bkZsYWdzXG59IGZyb20gJy4vc3Bhd24tb3B0aW9ucy5tanMnO1xuaW1wb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5tanMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUsXG4gIHNob3VsZEhpZGVFbXVsYXRvcldpbmRvd1xufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgT1dORURfVVNFUl9EQVRBX1BSRUZJWCA9ICd1c2VyZGF0YS0nO1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIENocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBFTVVMQVRPUl9MSVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5jb25zdCBFTVVMQVRPUl9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogSG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZCBpbnN0YW5jZTsgYXRcbiAqIG1vc3Qgb25lIGZpZWxkIGlzIHNldCAoc2VlIHtAbGluayByZXNvbHZlQXNhclBsYW59KS5cbiAqL1xuaW50ZXJmYWNlIEFzYXJQbGFuIHtcbiAgLyoqIFRoZSB1c2VyJ3MgbmV3ZXN0IGluc3RhbGxlZCBhc2FyIHRvIHByb3Zpc2lvbiBhcy1pcyAobm8gZG93bmxvYWQpLiAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUNvbmZpZ1snYXNhciddO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gdG8gZG93bmxvYWQgYW5kIGFzYXItc3dhcCBvbnRvIHRoZSBzaGVsbC4gKi9cbiAgcmVhZG9ubHkgYXNhclZlcnNpb25Ub1N3YXA/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/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcbiAgICB1c2VyRGF0YURpcjogY3JlYXRlT3duZWRVc2VyRGF0YURpcigpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgQ29ubmVjdGlvbmAgYW5kIGBDb250ZW50LUxlbmd0aGAgZnJvbSBhIFdlYkRyaXZlciByZXF1ZXN0J3MgaGVhZGVycy5cbiAqXG4gKiBUaGUgYnVuZGxlZCBgd2ViZHJpdmVyYCBwYWNrYWdlIHNldHMgYm90aCBoZWFkZXJzIGV4cGxpY2l0bHkuIFRoZXkgYXJlXG4gKiBmb3JiaWRkZW4gcmVxdWVzdCBoZWFkZXJzIHBlciB0aGUgRmV0Y2ggc3BlYzogTm9kZSB1cCB0byAyNSBhY2NlcHRlZCB0aGVtXG4gKiBzaWxlbnRseSwgYnV0IE5vZGUgMjYgcmVqZWN0cyB0aGVtIHdpdGggYFVORF9FUlJfSU5WQUxJRF9BUkdgLCBicmVha2luZyB0aGVcbiAqIEFwcGl1bSBgL3Nlc3Npb25gIHJlcXVlc3QuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWFuYWdlcyBjb25uZWN0aW9uIHJldXNlIGFuZFxuICogdGhlIEZldGNoIEFQSSBjb21wdXRlcyBgQ29udGVudC1MZW5ndGhgIGZyb20gdGhlIGJvZHksIHNvIGRyb3BwaW5nIGJvdGggaXNcbiAqIHNhZmUgb24gZXZlcnkgTm9kZSB2ZXJzaW9uLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJkcml2ZXJpby93ZWJkcml2ZXJpby9pc3N1ZXMvMTUyNjV9LlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyAtIFRoZSByZXF1ZXN0IG9wdGlvbnMgYWJvdXQgdG8gYmUgc2VudCBieSBXZWJEcml2ZXJJTy5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIHJlcXVlc3Qgb3B0aW9ucyB3aXRoIHRoZSBmb3JiaWRkZW4gaGVhZGVycyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVycyhyZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQpOiBSZXF1ZXN0SW5pdCB7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb25uZWN0aW9uJyk7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFVQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBZVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsWUFBWTtBQUNyQixTQUFTLHlDQUF5QztBQUNsRCxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLCtCQUErQjtBQUN4QyxTQUFTLDBDQUEwQztBQUNuRDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMseUJBQXlCO0FBQ2xDO0FB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WUFBWSxLQUFLLElBQUk7QUFDaEcsYUFBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sTUFBTSxTQUFTLE9BQU8sUUFBUSxFQUFFO0FBQUEsSUFDaEU7QUFBQSxFQUNGO0FBRUEsU0FBTyxDQUFDO0FBQ1Y7QUFhQSxlQUFlLDhCQUFtRTtBQUNoRixNQUFJO0FBQ0YsVUFBTSxVQUFVLE1BQU0sMEJBQTBCO0FBQ2hELFdBQU8sRUFBRSxTQUFTLGNBQWMsNEJBQTRCLE9BQU8sRUFBRTtBQUFBLEVBQ3ZFLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBeUJBLGVBQWUsMkJBQTJCLFNBQXFFO0FBSzdHLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUksU0FBUyw2QkFBNkIsUUFBVztBQUNuRCxjQUFVLE1BQU0sMEJBQTBCO0FBQzFDLG1CQUFlLDRCQUE0QixPQUFPO0FBQUEsRUFDcEQsT0FBTztBQUdMLDZCQUF5QixNQUFNLHVCQUF1QixRQUFRLHdCQUF3QjtBQUN0RixtQkFBZTtBQUFBLEVBQ2pCO0FBR0EsUUFBTSxPQUFPLE1BQU0sZ0JBQWdCLFNBQVMsWUFBWTtBQUt4RCxRQUFNLGlCQUFpQixLQUFLLHFCQUFxQixLQUFLLE1BQU07QUFDNUQsUUFBTSxnQkFBZ0IsNEJBQTRCO0FBQUEsSUFDaEQsWUFBWTtBQUFBLElBQ1osa0JBQWtCO0FBQUEsSUFDbEIsb0NBQW9DLDBDQUEwQyxTQUFTLGtDQUFrQztBQUFBLElBQ3pILGlDQUFpQyx1Q0FBdUMsU0FBUywrQkFBK0I7QUFBQSxFQUNsSCxDQUFDO0FBS0QsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxVQUFNLFlBQVksTUFBTSw0QkFBNEI7QUFDcEQsY0FBVSxXQUFXLGlCQUFpQix5QkFBeUIsVUFBVSxVQUFVLE1BQU0sa0JBQWtCLHNCQUFzQjtBQUFBLEVBQ25JO0FBQ0EsTUFBSSxLQUFLLDhCQUE4QixRQUFXO0FBQ2hELGNBQVUsTUFBTSxrQkFBa0IsS0FBSyx5QkFBeUI7QUFBQSxFQUNsRTtBQUVBLFFBQU0sT0FBTyxLQUFLLHNCQUFzQixTQUNwQyxLQUFLLE9BQ0wsRUFBRSxNQUFNLE1BQU0saUJBQWlCLEtBQUssaUJBQWlCLEdBQUcsU0FBUyxLQUFLLGtCQUFrQjtBQUU1RixTQUFPO0FBQUEsSUFDTCxHQUFJLFFBQVEsRUFBRSxLQUFLO0FBQUEsSUFDbkIsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsU0FBUyxrQkFBa0IsT0FBTztBQUFBLElBQ2xDLGFBQWEsdUJBQXVCO0FBQUEsRUFDdEM7QUFDRjtBQWVBLFNBQVMsMkJBQTJCLGdCQUEwQztBQUM1RSxNQUFJLGVBQWUsbUJBQW1CLFNBQVM7QUFDN0MsbUJBQWUsUUFBUSxPQUFPLFlBQVk7QUFDMUMsbUJBQWUsUUFBUSxPQUFPLGdCQUFnQjtBQUFBLEVBQ2hEO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiXQp9Cg==
999
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUNvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLm1qcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUubWpzJztcbmltcG9ydCB7XG4gIEhBUk5FU1NfVEVNUF9ESVJfTkFNRSxcbiAgT1dORURfVVNFUl9EQVRBX0RJUl9QUkVGSVgsXG4gIHJlc29sdmVTaG91bGRTd2VlcExlZnRvdmVycyxcbiAgc3dlZXBEZXZpY2VMZWZ0b3ZlcnNcbn0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5Db25maWdEaXIgfSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5tanMnO1xuaW1wb3J0IHtcbiAgZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uLFxuICBlbnN1cmVTaGVsbENhY2hlZFxufSBmcm9tICcuL29ic2lkaWFuLWluc3RhbGxlci5tanMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlQXNhckNhY2hlZCxcbiAgZmluZE5ld2VzdEFzYXIsXG4gIHJlc29sdmVDb25jcmV0ZVZlcnNpb25cbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5tanMnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5pbXBvcnQgeyBidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcbmltcG9ydCB7IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyxcbiAgcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFnc1xufSBmcm9tICcuL3NwYXduLW9wdGlvbnMubWpzJztcbmltcG9ydCB7XG4gIEFwcGl1bVRyYW5zcG9ydCxcbiAgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSFxufSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5pbXBvcnQge1xuICBzaG91bGRIaWRlQXBwaXVtQ29uc29sZSxcbiAgc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93XG59IGZyb20gJy4vdmlzaWJpbGl0eS5tanMnO1xuXG5jb25zdCBBUFBfUEFDS0FHRSA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBUFBfQUNUSVZJVFkgPSBgJHtBUFBfUEFDS0FHRX0uTWFpbkFjdGl2aXR5YDtcbmNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgQVBQSVVNX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBREJfVkFVTFRfU1dFRVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfTElTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMge1xuICAvKiogQVZEIG5hbWUgdG8gY29ubmVjdCB0byAoc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IgaWYgbm90IGFscmVhZHkgcnVubmluZykuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCByZXNvbHZlZCBieSB7QGxpbmsgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxlZFNoZWxsIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGluc3RhbGxlZCBzaGVsbCBleGVjdXRhYmxlLiAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXRlY3RlZCBzaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICByZWFkb25seSBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNwYXduZWQgY2hpbGQgcHJvY2VzcyAodGhlIEFuZHJvaWQgZW11bGF0b3Igb3IgdGhlIEFwcGl1bSBzZXJ2ZXIpIHRvZ2V0aGVyXG4gKiB3aXRoIGhlbHBlcnMgdG8gaW5zcGVjdCBpdHMgY2FwdHVyZWQgb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIFByb2Nlc3NMYXVuY2gge1xuICAvKiogVGhlIHNwYXduZWQgcHJvY2Vzcy4gKi9cbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBleGl0IC8gc3Bhd24tZmFpbHVyZSBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZEV4aXRJbmZvOiAoKSA9PiBQcm9jZXNzRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+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/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMpXG4gIH0pO1xuXG4gIC8vIFRoZSBwaW4gaXMga25vd24gcnVubmFibGUgXHUyMDE0IHJlc29sdmUvZG93bmxvYWQgdGhlIGRlZmVycmVkIHNoZWxsICsgYXNhciBub3cuXG4gIC8vIFJldXNlIHRoZSBpbnN0YWxsZWQgc2hlbGwgb25seSB3aGVuIGl0IGFscmVhZHkgbWF0Y2hlcyB0aGUgcGluIChzYXZlcyB0aGVcbiAgLy8gRG93bmxvYWQpOyBvdGhlcndpc2UgZG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIHBpbm5lZCBpbnN0YWxsZXIuXG4gIGlmIChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTtcbiAgICBleGVQYXRoID0gaW5zdGFsbGVkPy5zaGVsbFZlcnNpb24gPT09IHBpbm5lZEluc3RhbGxlclZlcnNpb24gPyBpbnN0YWxsZWQuZXhlUGF0aCA6IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBpbm5lZEluc3RhbGxlclZlcnNpb24pO1xuICB9XG4gIGlmIChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwbGFuLmRvd25ncmFkZUluc3RhbGxlclZlcnNpb24pO1xuICB9XG5cbiAgY29uc3QgYXNhciA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPT09IHVuZGVmaW5lZFxuICAgID8gcGxhbi5hc2FyXG4gICAgOiB7IHBhdGg6IGF3YWl0IGVuc3VyZUFzYXJDYWNoZWQocGxhbi5hc2FyVmVyc2lvblRvU3dhcCksIHZlcnNpb246IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLihhc2FyICYmIHsgYXNhciB9KSxcbiAgICAuLi4oY29tcGF0aWJpbGl0eSAmJiB7IGNvbXBhdGliaWxpdHkgfSksXG4gICAgZXhlUGF0aDogZW5zdXJlTm9uTnVsbGFibGUoZXhlUGF0aCksXG4gICAgdXNlckRhdGFEaXI6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sVUFBVTtBQUNqQixTQUFTLGNBQWM7QUFDdkIsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sYUFBYTtBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWVQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLFlBQVk7QUFDckIsU0FBUyx5Q0FBeUM7QUFDbEQsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyx1QkFBdUI7QUFDaEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsV0FBVztBQUNwQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJB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