obsidian-integration-testing 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,6 +41,7 @@ var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
41
41
  var import_log = require("./log.cjs");
42
42
  var import_temp_vault = require("./temp-vault.cjs");
43
43
  var import_transport_factory = require("./transport-factory.cjs");
44
+ const DEFAULT_TRANSPORT_TYPE = "obsidian-cli";
44
45
  const DIST_DEV = "dist/dev";
45
46
  const DIST_BUILD = "dist/build";
46
47
  const MAIN_JS = "main.js";
@@ -56,12 +57,13 @@ async function coreSetup(params) {
56
57
  (0, import_node_process.loadEnvFile)(envFilePath);
57
58
  }
58
59
  const transportOptions = params?.transportOptions;
59
- (0, import_log.log)("[integration-setup] Creating transport...");
60
+ const label = transportOptions?.type ?? DEFAULT_TRANSPORT_TYPE;
61
+ (0, import_log.log)(`[integration-setup:${label}] Creating transport...`);
60
62
  const transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
61
- (0, import_log.log)(`[integration-setup] Transport created: ${transport.constructor.name}`);
63
+ (0, import_log.log)(`[integration-setup:${label}] Transport created: ${transport.constructor.name}`);
62
64
  let tempVault;
63
65
  try {
64
- (0, import_log.log)(`[integration-setup] Project root: ${projectRoot}`);
66
+ (0, import_log.log)(`[integration-setup:${label}] Project root: ${projectRoot}`);
65
67
  const distPath = await resolveDistPath(projectRoot);
66
68
  const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
67
69
  const pluginId = manifestJson.id;
@@ -72,19 +74,19 @@ async function coreSetup(params) {
72
74
  }
73
75
  const mainJs = (0, import_node_path.join)(distPath, MAIN_JS);
74
76
  const buildStat = await (0, import_promises.stat)(mainJs);
75
- (0, import_log.log)(`[integration-setup] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
77
+ (0, import_log.log)(`[integration-setup:${label}] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
76
78
  tempVault = new import_temp_vault.TempVault();
77
- (0, import_log.log)(`[integration-setup] Created temp vault: ${tempVault.path}`);
79
+ (0, import_log.log)(`[integration-setup:${label}] Created temp vault: ${tempVault.path}`);
78
80
  const pluginDir = (0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
79
81
  await (0, import_promises.mkdir)(pluginDir, { recursive: true });
80
82
  await (0, import_promises.cp)(distPath, pluginDir, { recursive: true });
81
83
  await (0, import_promises.writeFile)((0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
82
- (0, import_log.log)("[integration-setup] Syncing vault to device...");
84
+ (0, import_log.log)(`[integration-setup:${label}] Syncing vault to device...`);
83
85
  await tempVault.syncToDevice(transport);
84
- (0, import_log.log)("[integration-setup] Registering vault...");
86
+ (0, import_log.log)(`[integration-setup:${label}] Registering vault...`);
85
87
  await tempVault.register(transport);
86
- (0, import_log.log)("[integration-setup] Vault registered.");
87
- (0, import_log.log)(`[integration-setup] Enabling plugin "${pluginId}"...`);
88
+ (0, import_log.log)(`[integration-setup:${label}] Vault registered.`);
89
+ (0, import_log.log)(`[integration-setup:${label}] Enabling plugin "${pluginId}"...`);
88
90
  const { errorMessage } = await (0, import_eval_in_obsidian.evalInObsidian)({
89
91
  args: { pluginId },
90
92
  fn: import_enable_plugin.enablePluginWithErrorCapture,
@@ -95,25 +97,29 @@ async function coreSetup(params) {
95
97
  if (errorMessage) {
96
98
  throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
97
99
  }
98
- (0, import_log.log)(`[integration-setup] Plugin "${pluginId}" enabled successfully.`);
100
+ (0, import_log.log)(`[integration-setup:${label}] Plugin "${pluginId}" enabled successfully.`);
99
101
  } catch (error) {
100
- (0, import_log.log)("[integration-setup] Setup failed, cleaning up...");
102
+ (0, import_log.log)(`[integration-setup:${label}] Setup failed, cleaning up...`);
101
103
  try {
102
104
  if (tempVault) {
103
105
  await tempVault.dispose(transport);
104
106
  }
105
107
  } catch (cleanupError) {
106
- (0, import_log.log)(`[integration-setup] Vault cleanup error (non-fatal): ${String(cleanupError)}`);
108
+ (0, import_log.log)(`[integration-setup:${label}] Vault cleanup error (non-fatal): ${String(cleanupError)}`);
107
109
  }
108
110
  try {
109
111
  await transport.dispose?.();
110
112
  } catch (cleanupError) {
111
- (0, import_log.log)(`[integration-setup] Transport cleanup error (non-fatal): ${String(cleanupError)}`);
113
+ (0, import_log.log)(`[integration-setup:${label}] Transport cleanup error (non-fatal): ${String(cleanupError)}`);
112
114
  }
113
- (0, import_log.log)('[integration-setup] NOTE: If the test runner reports "No test files found", ignore it \u2014 it is a side effect of the setup failure above.');
115
+ for (const activeResult of [...activeSetups]) {
116
+ (0, import_log.log)(`[integration-setup:${label}] Tearing down previously successful setup (${activeResult.transportLabel})...`);
117
+ await coreTeardown(activeResult);
118
+ }
119
+ (0, import_log.log)(`[integration-setup:${label}] NOTE: If the test runner reports "No test files found", ignore it \u2014 it is a side effect of the setup failure above.`);
114
120
  throw error;
115
121
  }
116
- const result = { tempVault, transport, transportOptions };
122
+ const result = { tempVault, transport, transportLabel: label, transportOptions };
117
123
  activeSetups.add(result);
118
124
  registerProcessCleanupHandler();
119
125
  return result;
@@ -126,12 +132,12 @@ async function coreTeardown(result) {
126
132
  try {
127
133
  await result.tempVault.dispose(result.transport);
128
134
  } catch (error) {
129
- (0, import_log.log)(`[integration-teardown] Vault cleanup error (non-fatal): ${String(error)}`);
135
+ (0, import_log.log)(`[integration-teardown:${result.transportLabel}] Vault cleanup error (non-fatal): ${String(error)}`);
130
136
  }
131
137
  try {
132
138
  await result.transport.dispose?.();
133
139
  } catch (error) {
134
- (0, import_log.log)(`[integration-teardown] Transport cleanup error (non-fatal): ${String(error)}`);
140
+ (0, import_log.log)(`[integration-teardown:${result.transportLabel}] Transport cleanup error (non-fatal): ${String(error)}`);
135
141
  }
136
142
  }
137
143
  function findProjectRoot() {
@@ -163,6 +169,36 @@ function registerProcessCleanupHandler() {
163
169
  });
164
170
  }
165
171
  });
172
+ import_node_process.default.on("unhandledRejection", () => {
173
+ if (activeSetups.size === 0) {
174
+ return;
175
+ }
176
+ (0, import_log.log)(`[integration-teardown] Unhandled rejection detected. Tearing down ${String(activeSetups.size)} active setup(s)...`);
177
+ for (const result of [...activeSetups]) {
178
+ coreTeardown(result).catch((error) => {
179
+ (0, import_log.log)(`[integration-teardown] Rejection cleanup error (non-fatal): ${String(error)}`);
180
+ });
181
+ }
182
+ });
183
+ import_node_process.default.on("exit", () => {
184
+ if (activeSetups.size === 0) {
185
+ return;
186
+ }
187
+ (0, import_log.log)(`[integration-teardown] Sync cleanup: ${String(activeSetups.size)} orphaned setup(s).`);
188
+ for (const result of [...activeSetups]) {
189
+ try {
190
+ result.transport.disposeSync?.();
191
+ } catch (error) {
192
+ (0, import_log.log)(`[integration-teardown:${result.transportLabel}] Sync transport cleanup error (non-fatal): ${String(error)}`);
193
+ }
194
+ try {
195
+ (0, import_node_fs.rmSync)(result.tempVault.path, { force: true, recursive: true });
196
+ } catch (error) {
197
+ (0, import_log.log)(`[integration-teardown:${result.transportLabel}] Sync vault cleanup error (non-fatal): ${String(error)}`);
198
+ }
199
+ }
200
+ activeSetups.clear();
201
+ });
166
202
  }
167
203
  async function resolveDistPath(projectRoot) {
168
204
  const devPath = (0, import_node_path.join)(projectRoot, DIST_DEV);
@@ -187,4 +223,4 @@ async function resolveDistPath(projectRoot) {
187
223
  coreSetup,
188
224
  coreTeardown
189
225
  });
190
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuXG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0aGF0IHdlcmUgcmVzb2x2ZWQuICovXG4gIHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNvcGllcyB0aGUgYnVpbHRcbiAqIHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCByZWdpc3RlcnMgdGhlIHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZFxuICogZW5hYmxlcyB0aGUgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBTZXR1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHNldHVwIHJlc3VsdCBjb250YWluaW5nIHRoZSB0ZW1wIHZhdWx0LCB0cmFuc3BvcnQsIGFuZCByZXNvbHZlZCBvcHRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVNldHVwKHBhcmFtcz86IENvcmVTZXR1cFBhcmFtcyk6IFByb21pc2U8Q29yZVNldHVwUmVzdWx0PiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnN0IGVudkZpbGVQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJy5lbnYnKTtcbiAgaWYgKGV4aXN0c1N5bmMoZW52RmlsZVBhdGgpKSB7XG4gICAgbG9hZEVudkZpbGUoZW52RmlsZVBhdGgpO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IHBhcmFtcz8udHJhbnNwb3J0T3B0aW9ucztcbiAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0aW5nIHRyYW5zcG9ydC4uLicpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gIGxldCB0ZW1wVmF1bHQ6IFRlbXBWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gICAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgICBjb25zdCBidWlsZFN0YXQgPSBhd2FpdCBzdGF0KG1haW5Kcyk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICAgIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIENPTU1VTklUWV9QTFVHSU5TX0pTT04pLCBKU09OLnN0cmluZ2lmeShbcGx1Z2luSWRdKSk7XG5cbiAgICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi4nKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIFJlZ2lzdGVyaW5nIHZhdWx0Li4uJyk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIFZhdWx0IHJlZ2lzdGVyZWQuJyk7XG5cbiAgICAvLyBFbmFibGUgdGhlIHBsdWdpbiBhbmQgdmVyaWZ5IGl0IGxvYWRlZC4gT2JzaWRpYW4ncyBlbmFibGVQbHVnaW4oKSB3cmFwc1xuICAgIC8vIExvYWRQbHVnaW4oKSBpbiBhIHRyeS1jYXRjaCB0aGF0IHN3YWxsb3dzIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZS5cbiAgICAvLyBXZSBtb25rZXktcGF0Y2ggbG9hZFBsdWdpbigpIHRvIGNhcHR1cmUgdGhlIGVycm9yIGJlZm9yZSBpdCdzIHN3YWxsb3dlZC5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gRW5hYmxpbmcgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGNvbnN0IHsgZXJyb3JNZXNzYWdlIH0gPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICBmbjogZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSxcbiAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB2YXVsdFBhdGg6IHRlbXBWYXVsdC5wYXRoXG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZmFpbGVkIHRvIGxvYWQ6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZygnW2ludGVncmF0aW9uLXNldHVwXSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQpIHtcbiAgICAgICAgYXdhaXQgdGVtcFZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gTk9URTogSWYgdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMgXCJObyB0ZXN0IGZpbGVzIGZvdW5kXCIsIGlnbm9yZSBpdCBcdTIwMTQgaXQgaXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgc2V0dXAgZmFpbHVyZSBhYm92ZS4nKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQ29yZVNldHVwUmVzdWx0ID0geyB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9O1xuICBhY3RpdmVTZXR1cHMuYWRkKHJlc3VsdCk7XG4gIHJlZ2lzdGVyUHJvY2Vzc0NsZWFudXBIYW5kbGVyKCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50ZW1wVmF1bHQuZGlzcG9zZShyZXN1bHQudHJhbnNwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYGJlZm9yZUV4aXRgIGhhbmRsZXIgdGhhdCB0ZWFycyBkb3duIGFueSBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyXG4gKiBleHBsaWNpdGx5IHRvcm4gZG93bi4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB0ZXN0IHByb2plY3QncyBzZXR1cFxuICogZmFpbHMgYW5kIHRoZSBydW5uZXIgZXhpdHMgd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIGZvciBhbHJlYWR5LWluaXRpYWxpemVkXG4gKiBwcm9qZWN0cy5cbiAqXG4gKiBVc2VzIGBiZWZvcmVFeGl0YCBiZWNhdXNlIHRlYXJkb3duIGlzIGFzeW5jLiBVbmxpa2UgYGV4aXRgLCBgYmVmb3JlRXhpdGBcbiAqIGFsbG93cyBhc3luYyB3b3JrIFx1MjAxNCB0aGUgZXZlbnQgbG9vcCBzdGF5cyBhbGl2ZSB1bnRpbCB0aGUgY2xlYW51cCBjb21wbGV0ZXMuXG4gKiBOb3RlOiBgYmVmb3JlRXhpdGAgZG9lcyBub3QgZmlyZSB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxxQkFBMkI7QUFDM0Isc0JBTU87QUFDUCx1QkFBcUI7QUFDckIsMEJBQXFDO0FBS3JDLDJCQUE2QztBQUM3Qyw4QkFBK0I7QUFDL0IsaUJBQW9CO0FBQ3BCLHdC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
226
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuXG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNsaSc7XG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2xpXCJgLCBgXCJvYnNpZGlhbi1jZHBcImApLiAqL1xuICB0cmFuc3BvcnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IG9wdGlvbnMgdGhhdCB3ZXJlIHJlc29sdmVkLiAqL1xuICB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWx0XG4gKiBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgcmVnaXN0ZXJzIHRoZSB2YXVsdCB3aXRoIE9ic2lkaWFuLCBhbmRcbiAqIGVuYWJsZXMgdGhlIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2V0dXAgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzZXR1cCByZXN1bHQgY29udGFpbmluZyB0aGUgdGVtcCB2YXVsdCwgdHJhbnNwb3J0LCBhbmQgcmVzb2x2ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVTZXR1cChwYXJhbXM/OiBDb3JlU2V0dXBQYXJhbXMpOiBQcm9taXNlPENvcmVTZXR1cFJlc3VsdD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBlbnZGaWxlUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsICcuZW52Jyk7XG4gIGlmIChleGlzdHNTeW5jKGVudkZpbGVQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudkZpbGVQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnM7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uYCk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gICAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBtYW5pZmVzdEpzb24uaWQ7XG5cbiAgICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBpc0Rlc2t0b3BPbmx5OiB0cnVlIGluIG1hbmlmZXN0Lmpzb24uIE1vYmlsZSBpbnRlZ3JhdGlvbiB0ZXN0cyBjYW5ub3QgcnVuIGZvciBkZXNrdG9wLW9ubHkgcGx1Z2lucy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5KcyA9IGpvaW4oZGlzdFBhdGgsIE1BSU5fSlMpO1xuICAgIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBVc2luZyAke2Rpc3RQYXRofSAoJHtidWlsZFN0YXQubXRpbWUudG9JU09TdHJpbmcoKX0pLiBJZiBvdXRkYXRlZCwgcmVidWlsZC5gKTtcblxuICAgIHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBWYXVsdC5wYXRofWApO1xuICAgIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gICAgYXdhaXQgbWtkaXIocGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBjcChkaXN0UGF0aCwgcGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTeW5jaW5nIHZhdWx0IHRvIGRldmljZS4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUmVnaXN0ZXJpbmcgdmF1bHQuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgcmVnaXN0ZXJlZC5gKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gICAgLy8gTG9hZFBsdWdpbigpIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3MgZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLlxuICAgIC8vIFdlIG1vbmtleS1wYXRjaCBsb2FkUGx1Z2luKCkgdG8gY2FwdHVyZSB0aGUgZXJyb3IgYmVmb3JlIGl0J3Mgc3dhbGxvd2VkLlxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gICAgY29uc3QgeyBlcnJvck1lc3NhZ2UgfSA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgIGFyZ3M6IHsgcGx1Z2luSWQgfSxcbiAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIHRyYW5zcG9ydCxcbiAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICB9KTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkuYCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi5gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBWYXVsdCkge1xuICAgICAgICBhd2FpdCB0ZW1wVmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gVGVhciBkb3duIGFueSBwcmV2aW91c2x5IHN1Y2Nlc3NmdWwgc2V0dXBzLiBUaGUgdGVzdCBydW5uZXIgd2lsbCBhYm9ydFxuICAgIC8vIEFmdGVyIHRoaXMgZXJyb3IgYW5kIHdvbid0IGNhbGwgdGhlaXIgdGVhcmRvd24gZnVuY3Rpb25zLiBEb2luZyBpdCBoZXJlXG4gICAgLy8gV2hpbGUgd2UncmUgc3RpbGwgaW4gYXN5bmMgY29udGV4dCBhdm9pZHMgcmVseWluZyBvbiB0aGUgc3luYyBgZXhpdGBcbiAgICAvLyBIYW5kbGVyICh3aGljaCBjYW4gb25seSBkbyBiZXN0LWVmZm9ydCBjbGVhbnVwKS5cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZVJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRlYXJpbmcgZG93biBwcmV2aW91c2x5IHN1Y2Nlc3NmdWwgc2V0dXAgKCR7YWN0aXZlUmVzdWx0LnRyYW5zcG9ydExhYmVsfSkuLi5gKTtcbiAgICAgIGF3YWl0IGNvcmVUZWFyZG93bihhY3RpdmVSZXN1bHQpO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgPSB7IHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRMYWJlbDogbGFiZWwsIHRyYW5zcG9ydE9wdGlvbnMgfTtcbiAgYWN0aXZlU2V0dXBzLmFkZChyZXN1bHQpO1xuICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVTZXR1cHMuZGVsZXRlKHJlc3VsdCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3RlZC4gVGVhcmluZyBkb3duICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gYWN0aXZlIHNldHVwKHMpLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcm1TeW5jKHJlc3VsdC50ZW1wVmF1bHQucGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxxQkFHTztBQUNQLHNCQU1PO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFxQztBQUtyQywyQkFBNkM7QUFDN0MsOEJBQStCO0FBQy9CLGlCQUFvQjtBQUNwQix3QkFBMEI7QUFDMUIsK0JBQTJDO0FBRTNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sV0FBVztBQUNqQixNQUFNLGFBQWE7QUFDbkIsTUFBTSxVQUFVO0FB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
@@ -24,6 +24,8 @@ export interface CoreSetupResult {
24
24
  tempVault: TempVault;
25
25
  /** The transport instance used during setup. */
26
26
  transport: ObsidianTransport;
27
+ /** Short label for log messages (e.g. `"obsidian-cli"`, `"obsidian-cdp"`). */
28
+ transportLabel: string;
27
29
  /** The transport options that were resolved. */
28
30
  transportOptions: ObsidianTransportOptions | undefined;
29
31
  }
@@ -132,6 +132,17 @@ async function createAppiumTransport(options) {
132
132
  let appiumProcess;
133
133
  let emulatorProcess;
134
134
  try {
135
+ let killAutoStartedProcesses2 = function() {
136
+ if (appiumProcess) {
137
+ appiumProcess.kill();
138
+ (0, import_log.log)("[transport-factory] Auto-started Appium server stopped.");
139
+ }
140
+ if (emulatorProcess) {
141
+ emulatorProcess.kill();
142
+ (0, import_log.log)("[transport-factory] Auto-started emulator stopped.");
143
+ }
144
+ };
145
+ var killAutoStartedProcesses = killAutoStartedProcesses2;
135
146
  [appiumProcess, emulatorProcess] = await startAppiumAndEmulator({
136
147
  appiumUrl: url,
137
148
  avdName: options.avdName,
@@ -166,27 +177,24 @@ async function createAppiumTransport(options) {
166
177
  port
167
178
  });
168
179
  (0, import_log.log)("[transport-factory] Appium session established.");
169
- const transport = new import_transport_appium.AppiumTransport({
180
+ const appiumTransport = new import_transport_appium.AppiumTransport({
170
181
  appId,
171
182
  browser,
172
183
  platform: "android",
173
184
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath }
174
185
  });
175
- const originalDispose = transport.dispose.bind(transport);
186
+ const originalDispose = appiumTransport.dispose.bind(appiumTransport);
187
+ const transport = appiumTransport;
176
188
  transport.dispose = async () => {
177
189
  try {
178
190
  await originalDispose();
179
191
  } finally {
180
- if (appiumProcess) {
181
- appiumProcess.kill();
182
- (0, import_log.log)("[transport-factory] Auto-started Appium server stopped.");
183
- }
184
- if (emulatorProcess) {
185
- emulatorProcess.kill();
186
- (0, import_log.log)("[transport-factory] Auto-started emulator stopped.");
187
- }
192
+ killAutoStartedProcesses2();
188
193
  }
189
194
  };
195
+ transport.disposeSync = () => {
196
+ killAutoStartedProcesses2();
197
+ };
190
198
  return transport;
191
199
  } catch (error) {
192
200
  if (appiumProcess) {
@@ -367,4 +375,4 @@ async function wakeScreen(deviceId) {
367
375
  createTransportFromOptions,
368
376
  getOrCreateTransport
369
377
  });
370
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPEFwcGl1bVRyYW5zcG9ydD4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICB9XG5cbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBvcHRpb25zLmRldmljZUlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICB9KTtcblxuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3RvcnldIENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSwgYXBwPSR7YXBwSWR9LCByZXRyeVRpbWVvdXQ6ICR7XG4gICAgICAgIFN0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcywgcmV0cmllczogJHtTdHJpbmcoQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQpfSkuLi5gXG4gICAgKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06c2V0dGluZ3MnOiB7XG4gICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgICdhcHBpdW06c2tpcFNlcnZlckluc3RhbGxhdGlvbic6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydFxuICAgIH0pO1xuXG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBzZXNzaW9uIGVzdGFibGlzaGVkLicpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgYXBwSWQsXG4gICAgICBicm93c2VyLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KVxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gdHJhbnNwb3J0LmRpc3Bvc2UuYmluZCh0cmFuc3BvcnQpO1xuICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNwb3NlKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBrZXkgZXZlbnQgdG8gYSBkZXZpY2UgdmlhIEFEQi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyB3YXJuaW5nc1xuICogaW5zdGVhZCBvZiB0aHJvd2luZywgc2luY2Uga2V5IGV2ZW50cyBhcmUgYmVzdC1lZmZvcnQgKGUuZy4sIHRoZSBzY3JlZW5cbiAqIG1heSBhbHJlYWR5IGJlIG9uKS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ga2V5Q29kZSAtIFRoZSBBbmRyb2lkIGtleWNvZGUgdG8gc2VuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBsb2cgbWVzc2FnZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBleGVjRmlsZShcbiAgICAgICdhZGInLFxuICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgbG9nKFxuICAgICAgICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlciBhbmQgZW11bGF0b3IgaW4gcGFyYWxsZWwgd2hlbiBib3RoIG5lZWQgYXV0by1zdGFydGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gQ29uZmlndXJhdGlvbiBmb3IgQXBwaXVtIGFuZCBlbXVsYXRvciBzdGFydHVwLlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc11gLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIGB1bmRlZmluZWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWQsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgfVxuXG4gIGNvbnN0IFssIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgPyB3YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWQgfSlcbiAgXSk7XG5cbiAgcmV0dXJuIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBcHBpdW0gc2VydmVyIGFzIGEgZGV0YWNoZWQgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gc3RhcnQgQXBwaXVtIG9uLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBbmRyb2lkIGVtdWxhdG9yIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBuYW1lIHRvIHN0YXJ0LlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gLWF2ZCAke2F2ZE5hbWV9IC1uby1zbmFwc2hvdC1zYXZlYCk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIFsnLWF2ZCcsIGF2ZE5hbWUsICctbm8tc25hcHNob3Qtc2F2ZSddLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdW50aWwgaXQgcmVzcG9uZHMgdG8gYC9zdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICB9bXMpLi4uYFxuICApO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBwb2xsaW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSBkZWFkbGluZSAtIEFic29sdXRlIHRpbWVzdGFtcCBkZWFkbGluZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gIGxvZyhcbiAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGBhZGIgZGV2aWNlc2AgdW50aWwgdGhlIHNwZWNpZmllZCBkZXZpY2UgYXBwZWFycyBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKlxuICogQWxzbyB3YWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBjaGVja2luZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gd2FpdCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICBhd2FpdCB3YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRW11bGF0b3IgZGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBkaWQgbm90IGFwcGVhciB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFdha2VzIHRoZSBlbXVsYXRvciBzY3JlZW4gYW5kIGRpc21pc3NlcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQWZ0ZXIgYm9vdCwgdGhlIGVtdWxhdG9yIHNjcmVlbiBtYXkgYmUgb2ZmLiBTZW5kcyBgS0VZQ09ERV9XQUtFVVBgIHRvIHR1cm5cbiAqIG9uIHRoZSBkaXNwbGF5IGFuZCBgS0VZQ09ERV9NRU5VYCB0byBkaXNtaXNzIHRoZSBsb2NrIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICBhd2FpdCBzZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgYXdhaXQgc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FHTztBQUNQLHVCQUFpQjtBQUNqQix1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLHlCQUF1QjtBQVF2QixpQkFBb0I7QUFDcEIsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBb0M7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSxlQUFlO0FBQ3JCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sd0NBQXdDO0FBaUM5QyxJQUFJO0FBUUosZUFBc0IsMkJBQTJCLFNBQWdFO0FBQy9HLE1BQUksQ0FBQyxXQUFXLFFBQVEsU0FBUyxnQkFBZ0I7QUFDL0Msd0JBQUksb0ZBQW9GO0FBQ3hGLFdBQU8sSUFBSSxpREFBb0I7QUFBQSxFQUNqQztBQUVBLE1BQUksUUFBUSxTQUFTLGdCQUFnQjtBQUNuQyx3QkFBSSwwREFBMEQsUUFBUSxRQUFRLFdBQVcsVUFBVSxPQUFPLFFBQVEsUUFBUSxnQkFBZ0IsQ0FBQyxHQUFHO0FBQzlJLFdBQU8sSUFBSSxpREFBb0I7QUFBQSxNQUM3QixHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJ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
378
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gIH1cblxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHtcbiAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgZGV2aWNlSWQ6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICBwb3J0LFxuICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtOiBvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bVxuICAgIH0pO1xuXG4gICAgbG9nKFxuICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke29wdGlvbnMuZGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtcbiAgICAgICAgU3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKVxuICAgICAgfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICdhcHBpdW06YXBwQWN0aXZpdHknOiBBUFBfQUNUSVZJVFksXG4gICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTphdXRvbWF0aW9uTmFtZSc6ICdVaUF1dG9tYXRvcjInLFxuICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTpzZXR0aW5ncyc6IHtcbiAgICAgICAgICAnYXBwaXVtOmNocm9tZWRyaXZlckF1dG9kb3dubG9hZCc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2FwcGl1bTpza2lwU2VydmVySW5zdGFsbGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0XG4gICAgfSk7XG5cbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgY29uc3QgYXBwaXVtVHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSBhcHBpdW1UcmFuc3BvcnQuZGlzcG9zZS5iaW5kKGFwcGl1bVRyYW5zcG9ydCk7XG4gICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyYW5zcG9ydC5kaXNwb3NlU3luYyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuXG4gICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgYXBwaXVtUHJvY2Vzcy5raWxsKCk7XG4gICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIGVtdWxhdG9yIHN0b3BwZWQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBrZXkgZXZlbnQgdG8gYSBkZXZpY2UgdmlhIEFEQi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyB3YXJuaW5nc1xuICogaW5zdGVhZCBvZiB0aHJvd2luZywgc2luY2Uga2V5IGV2ZW50cyBhcmUgYmVzdC1lZmZvcnQgKGUuZy4sIHRoZSBzY3JlZW5cbiAqIG1heSBhbHJlYWR5IGJlIG9uKS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ga2V5Q29kZSAtIFRoZSBBbmRyb2lkIGtleWNvZGUgdG8gc2VuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBsb2cgbWVzc2FnZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBleGVjRmlsZShcbiAgICAgICdhZGInLFxuICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgbG9nKFxuICAgICAgICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlciBhbmQgZW11bGF0b3IgaW4gcGFyYWxsZWwgd2hlbiBib3RoIG5lZWQgYXV0by1zdGFydGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gQ29uZmlndXJhdGlvbiBmb3IgQXBwaXVtIGFuZCBlbXVsYXRvciBzdGFydHVwLlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc11gLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIGB1bmRlZmluZWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWQsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgfVxuXG4gIGNvbnN0IFssIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgPyB3YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWQgfSlcbiAgXSk7XG5cbiAgcmV0dXJuIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBcHBpdW0gc2VydmVyIGFzIGEgZGV0YWNoZWQgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gc3RhcnQgQXBwaXVtIG9uLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBbmRyb2lkIGVtdWxhdG9yIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBuYW1lIHRvIHN0YXJ0LlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gLWF2ZCAke2F2ZE5hbWV9IC1uby1zbmFwc2hvdC1zYXZlYCk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIFsnLWF2ZCcsIGF2ZE5hbWUsICctbm8tc25hcHNob3Qtc2F2ZSddLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdW50aWwgaXQgcmVzcG9uZHMgdG8gYC9zdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICB9bXMpLi4uYFxuICApO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBwb2xsaW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSBkZWFkbGluZSAtIEFic29sdXRlIHRpbWVzdGFtcCBkZWFkbGluZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gIGxvZyhcbiAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGBhZGIgZGV2aWNlc2AgdW50aWwgdGhlIHNwZWNpZmllZCBkZXZpY2UgYXBwZWFycyBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKlxuICogQWxzbyB3YWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBjaGVja2luZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gd2FpdCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICBhd2FpdCB3YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRW11bGF0b3IgZGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBkaWQgbm90IGFwcGVhciB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFdha2VzIHRoZSBlbXVsYXRvciBzY3JlZW4gYW5kIGRpc21pc3NlcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQWZ0ZXIgYm9vdCwgdGhlIGVtdWxhdG9yIHNjcmVlbiBtYXkgYmUgb2ZmLiBTZW5kcyBgS0VZQ09ERV9XQUtFVVBgIHRvIHR1cm5cbiAqIG9uIHRoZSBkaXNwbGF5IGFuZCBgS0VZQ09ERV9NRU5VYCB0byBkaXNtaXNzIHRoZSBsb2NrIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICBhd2FpdCBzZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgYXdhaXQgc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FHTztBQUNQLHVCQUFpQjtBQUNqQix1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLHlCQUF1QjtBQVF2QixpQkFBb0I7QUFDcEIsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBb0M7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSxlQUFlO0FBQ3JCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sd0NBQXdDO0FBaUM5QyxJQUFJO0FBUUosZUFBc0IsMkJBQTJCLFNBQWdFO0FBQy9HLE1BQUksQ0FBQyxXQUFXLFFBQVEsU0FBUyxnQkFBZ0I7QUFDL0Msd0JBQUksb0ZBQW9GO0FBQ3hGLFdBQU8sSUFBSSxpREFBb0I7QUFBQSxFQUNqQztBQUVBLE1BQUksUUFBUSxTQUFTLGdCQUFnQjtBQUNuQyx3QkFBSSwwREFBMEQsUUFBUSxRQUFRLFdBQVcsVUFBVSxPQUFPLFFBQVEsUUFBUSxnQkFBZ0IsQ0FBQyxHQUFHO0FBQzlJLFdBQU8sSUFBSSxpREFBb0I7QUFBQSxNQUM3QixHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsaUNBQWlDLFVBQWEsRUFBRSw4QkFBOEIsUUFBUSw2QkFBNkI7QUFBQSxJQUNqSSxDQUFDO0FBQUEsRUFDSDtBQUVBLHNCQUFJLHFEQUFxRCxRQUFRLFNBQVMsWUFBWSxRQUFRLFFBQVEsR0FBRztBQUN6RyxTQUFPLHNCQUFzQixPQUFPO0FBQ3RDO0FBWUEsZUFBc0IscUJBQXFCLFNBQWdFO0FBQ3pHLE1BQUksaUJBQWlCO0FBQ25CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxTQUFTLE1BQU0sMkJBQTJCLE9BQU87QUFFdkQsb0JBQWtCO0FBQ2xCLFNBQU87QUFDVDtBQVVBLFNBQVMscUJBQXFCLEtBQXlCO0FBQ3JELFNBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3RDLFVBQU0sWUFBWSxJQUFJLElBQUksV0FBVyxHQUFHO0FBQ3hDLFVBQU0sTUFBTSxpQkFBQUEsUUFBSyxJQUFJLFdBQVcsRUFBRSxTQUFTLHlDQUF5QyxHQUFHLENBQUMsUUFBUTtBQUM5RixVQUFJLE9BQU87QUFDWCxjQUFRO0FBQUEsSUFDVixDQUFDO0FBQ0QsUUFBSSxHQUFHLFdBQVcsTUFBTTtBQUN0QixVQUFJLFFBQVE7QUFDWjtBQUFBLFFBQ0UsSUFBSTtBQUFBLFVBQ0Ysb0JBQW9CLElBQUksTUFBTSwyQkFBMkIsT0FBTyx3Q0FBd0MsQ0FBQztBQUFBLFFBQzNHO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNELFFBQUksR0FBRyxTQUFTLENBQUMsUUFBUTtBQUN2QjtBQUFBLFFBQ0UsSUFBSTtBQUFBLFVBQ0YsaUNBQWlDLElBQUksTUFBTSxLQUFLLElBQUksT0FBTztBQUFBLFFBQzdEO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBUUEsZUFBZSxxQkFBcUIsVUFBb0M7QUFDdEUsUUFBTSxTQUFTLE1BQU0sSUFBSSxRQUFnQixDQUFDLFNBQVMsV0FBVztBQUM1RCw0Q0FBUyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsU0FBUyx5Q0FBeUMsR0FBRyxDQUFDLE9BQU8sUUFBUSxXQUFXO0FBQzdHLFVBQUksT0FBTztBQUNULGVBQU8sSUFBSSxNQUFNLGdDQUFnQyxNQUFNLE9BQU8saUNBQWlDLENBQUM7QUFDaEc7QUFBQSxNQUNGO0FBQ0EsVUFBSSxRQUFRO0FBQ1YsNEJBQUksbUNBQW1DLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUN4RDtBQUNBLGNBQVEsTUFBTTtBQUFBLElBQ2hCLENBQUM7QUFBQSxFQUNILENBQUM7QUFFRCxRQUFNLFFBQVEsT0FBTyxNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO0FBQzVGLFFBQU0sYUFBYSxNQUFNLEtBQUssQ0FBQyxTQUFTLEtBQUssV0FBVyxRQUFRLENBQUM7QUFDakUsU0FBTyxZQUFZLFNBQVMsU0FBVSxLQUFLO0FBQzdDO0FBUUEsZUFBZSxzQkFBc0IsU0FBNEU7QUFDL0csUUFBTSxNQUFNLElBQUksSUFBSSxRQUFRLFNBQVM7QUFFckMsUUFBTSxPQUFPLE9BQU8sSUFBSSxJQUFJO0FBQzVCLE1BQUksTUFBTSxJQUFJLEdBQUc7QUFDZixVQUFNLElBQUksTUFBTSw4QkFBOEIsSUFBSSxJQUFJLEVBQUU7QUFBQSxFQUMxRDtBQUVBLFFBQU0sUUFBUSxRQUFRLFNBQVM7QUFFL0IsTUFBSTtBQUNKLE1BQUk7QUFFSixNQUFJO0FBOERGLFFBQVNDLDRCQUFULFdBQTBDO0FBQ3hDLFVBQUksZUFBZTtBQUNqQixzQkFBYyxLQUFLO0FBQ25CLDRCQUFJLHlEQUF5RDtBQUFBLE1BQy9EO0FBQ0EsVUFBSSxpQkFBaUI7QUFDbkIsd0JBQWdCLEtBQUs7QUFDckIsNEJBQUksb0RBQW9EO0FBQUEsTUFDMUQ7QUFBQSxJQUNGO0FBVFMsbUNBQUFBO0FBN0RULEtBQUMsZUFBZSxlQUFlLElBQUksTUFBTSx1QkFBdUI7QUFBQSxNQUM5RCxXQUFXO0FBQUEsTUFDWCxTQUFTLFFBQVE7QUFBQSxNQUNqQixVQUFVLFFBQVE7QUFBQSxNQUNsQjtBQUFBLE1BQ0EsdUJBQXVCLFFBQVE7QUFBQSxJQUNqQyxDQUFDO0FBRUQ7QUFBQSxNQUNFLG9EQUFvRCxRQUFRLFFBQVEsU0FBUyxLQUFLLG1CQUNoRixPQUFPLCtDQUErQyxDQUN4RCxnQkFBZ0IsT0FBTyw2QkFBNkIsQ0FBQztBQUFBLElBQ3ZEO0FBQ0EsVUFBTSxVQUFVLFVBQU0sMkJBQU87QUFBQSxNQUMzQixjQUFjO0FBQUEsUUFDWixzQkFBc0I7QUFBQSxRQUN0QixxQkFBcUI7QUFBQSxRQUNyQiwrQkFBK0I7QUFBQSxRQUMvQix5QkFBeUI7QUFBQSxRQUN6Qiw0QkFBNEI7QUFBQSxRQUM1QixrQkFBa0I7QUFBQSxRQUNsQixtQkFBbUI7QUFBQSxVQUNqQixtQ0FBbUM7QUFBQSxRQUNyQztBQUFBLFFBQ0EsaUNBQWlDO0FBQUEsUUFDakMsZUFBZSxRQUFRO0FBQUEsUUFDdkIsMENBQTBDO0FBQUEsUUFDMUMsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxNQUNBLHNCQUFzQjtBQUFBLE1BQ3RCLHdCQUF3QjtBQUFBLE1BQ3hCLFVBQVUsSUFBSTtBQUFBLE1BQ2QsVUFBVTtBQUFBLE1BQ1YsTUFBTSxJQUFJO0FBQUEsTUFDVjtBQUFBLElBQ0YsQ0FBQztBQUVELHdCQUFJLGlEQUFpRDtBQUNyRCxVQUFNLGtCQUFrQixJQUFJLHdDQUFnQjtBQUFBLE1BQzFDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsR0FBSSxRQUFRLGtCQUFrQixVQUFhLEVBQUUsZUFBZSxRQUFRLGNBQWM7QUFBQSxJQUNwRixDQUFDO0FBRUQsVUFBTSxrQkFBa0IsZ0JBQWdCLFFBQVEsS0FBSyxlQUFlO0FBQ3BFLFVBQU0sWUFBK0I7QUFDckMsY0FBVSxVQUFVLFlBQTJCO0FBQzdDLFVBQUk7QUFDRixjQUFNLGdCQUFnQjtBQUFBLE1BQ3hCLFVBQUU7QUFDQSxRQUFBQSwwQkFBeUI7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFFQSxjQUFVLGNBQWMsTUFBWTtBQUNsQyxNQUFBQSwwQkFBeUI7QUFBQSxJQUMzQjtBQUVBLFdBQU87QUFBQSxFQVlULFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSxlQUFlO0FBQ2pCLG9CQUFjLEtBQUs7QUFDbkIsMEJBQUksaUZBQWlGO0FBQUEsSUFDdkY7QUFDQSxRQUFJLGlCQUFpQjtBQUNuQixzQkFBZ0IsS0FBSztBQUNyQiwwQkFBSSw0RUFBNEU7QUFBQSxJQUNsRjtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFXQSxlQUFlLHNCQUFzQixRQUF3RTtBQUMzRyxRQUFNLEVBQUUsU0FBUyxTQUFTLElBQUk7QUFDOUIsc0JBQUksdUNBQXVDLFFBQVEsMEJBQTBCO0FBRTdFLE1BQUksTUFBTSxxQkFBcUIsUUFBUSxHQUFHO0FBQ3hDLHdCQUFJLDhCQUE4QixRQUFRLGdCQUFnQjtBQUMxRCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJO0FBQUEsTUFDUixXQUFXLFFBQVE7QUFBQSxJQUVyQjtBQUFBLEVBQ0Y7QUFFQSxzQkFBSSw4QkFBOEIsUUFBUSxzQ0FBc0MsT0FBTyxNQUFNO0FBQzdGLFFBQU0sa0JBQWtCLGNBQWMsT0FBTztBQUM3QyxRQUFNLGNBQWMsUUFBUTtBQUM1QixzQkFBSSxpQ0FBaUMsT0FBTyxxQkFBcUIsUUFBUSxnQkFBZ0I7QUFDekYsU0FBTztBQUNUO0FBVUEsU0FBUyx3QkFBZ0M7QUFDdkMsUUFBTSxVQUFVLG9CQUFBQyxRQUFRLElBQUksY0FBYyxLQUFLLG9CQUFBQSxRQUFRLElBQUksa0JBQWtCO0FBQzdFLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsYUFBTyx1QkFBSyxTQUFTLFlBQVksVUFBVTtBQUM3QztBQVdBLGVBQWUsYUFBYSxVQUFrQixTQUFpQixhQUFvQztBQUNqRyxRQUFNLElBQUksUUFBYyxDQUFDLFlBQVk7QUFDbkM7QUFBQSxNQUNFO0FBQUEsTUFDQSxDQUFDLE1BQU0sVUFBVSxTQUFTLFNBQVMsWUFBWSxPQUFPLE9BQU8sQ0FBQztBQUFBLE1BQzlELEVBQUUsU0FBUyx5Q0FBeUM7QUFBQSxNQUNwRCxDQUFDLFVBQVU7QUFDVCxZQUFJLE9BQU87QUFDVDtBQUFBLFlBQ0UsMENBQTBDLFdBQVcsY0FBYyxPQUFPLE9BQU8sQ0FBQyxNQUFNLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxlQUFlO0FBQUEsVUFDbEo7QUFBQSxRQUNGO0FBRUEsZ0JBQVE7QUFBQSxNQUNWO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBUUEsZUFBZSx1QkFBdUIsUUFBcUc7QUFDekksUUFBTSxFQUFFLFdBQVcsU0FBUyxVQUFVLE1BQU0sc0JBQXNCLElBQUk7QUFFdEUsTUFBSSxtQkFBbUI7QUFFdkIsc0JBQUksaURBQWlELFVBQVUsSUFBSSxLQUFLO0FBQ3hFLE1BQUk7QUFDRixVQUFNLHFCQUFxQixTQUFTO0FBQ3BDLHdCQUFJLGlEQUFpRDtBQUFBLEVBQ3ZELFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSwwQkFBMEIsT0FBTztBQUNuQyxZQUFNO0FBQUEsSUFDUjtBQUNBLHVCQUFtQjtBQUFBLEVBQ3JCO0FBRUEsTUFBSTtBQUVKLE1BQUksa0JBQWtCO0FBQ3BCLHdCQUFJLG1FQUFtRSxPQUFPLElBQUksQ0FBQyxLQUFLO0FBQ3hGLG9CQUFnQixrQkFBa0IsSUFBSTtBQUFBLEVBQ3hDO0FBRUEsUUFBTSxDQUFDLEVBQUUsZUFBZSxJQUFJLE1BQU0sUUFBUSxJQUFJO0FBQUEsSUFDNUMsbUJBQ0ksbUJBQW1CLFNBQVMsRUFBRSxLQUFLLE1BQU07QUFDekMsMEJBQUksMERBQTBEO0FBQUEsSUFDaEUsQ0FBQyxJQUNDLFFBQVEsUUFBUTtBQUFBLElBQ3BCLHNCQUFzQixFQUFFLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDN0MsQ0FBQztBQUVELFNBQU8sQ0FBQyxlQUFlLGVBQWU7QUFDeEM7QUFRQSxTQUFTLGtCQUFrQixNQUE0QjtBQUNyRCxRQUFNLFlBQVEsaUNBQU0scUNBQXFDLE9BQU8sSUFBSSxDQUFDLElBQUk7QUFBQSxJQUN2RSxVQUFVO0FBQUEsSUFDVixPQUFPO0FBQUEsSUFDUCxPQUFPLENBQUMsVUFBVSxXQUFXLFNBQVM7QUFBQSxFQUN4QyxDQUFDO0FBRUQsUUFBTSxNQUFNO0FBQ1osU0FBTztBQUNUO0FBUUEsU0FBUyxjQUFjLFNBQStCO0FBQ3BELFFBQU0saUJBQWlCLHNCQUFzQjtBQUM3QyxzQkFBSSxnQ0FBZ0MsY0FBYyxTQUFTLE9BQU8sb0JBQW9CO0FBQ3RGLFFBQU0sWUFBUSxpQ0FBTSxnQkFBZ0IsQ0FBQyxRQUFRLFNBQVMsbUJBQW1CLEdBQUc7QUFBQSxJQUMxRSxVQUFVO0FBQUEsSUFDVixPQUFPLENBQUMsVUFBVSxVQUFVLFFBQVE7QUFBQSxFQUN0QyxDQUFDO0FBRUQsUUFBTSxNQUFNO0FBQ1osU0FBTztBQUNUO0FBT0EsZUFBZSxtQkFBbUIsS0FBeUI7QUFDekQ7QUFBQSxJQUNFLDZDQUE2QyxJQUFJLElBQUksY0FBYyxPQUFPLG9DQUFvQyxDQUFDLGFBQzdHLE9BQU8sMENBQTBDLENBQ25EO0FBQUEsRUFDRjtBQUNBLFFBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUU5QixTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSTtBQUNGLFlBQU0scUJBQXFCLEdBQUc7QUFDOUI7QUFBQSxJQUNGLFFBQVE7QUFDTixZQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsbUJBQVcsU0FBUywwQ0FBMEM7QUFBQSxNQUNoRSxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLDBEQUEwRCxPQUFPLG9DQUFvQyxDQUFDO0FBQUEsRUFDeEc7QUFDRjtBQVFBLGVBQWUsWUFBWSxVQUFrQixVQUFpQztBQUM1RSxRQUFNLGNBQWMsS0FBSyxJQUFJLEdBQUcsV0FBVyxLQUFLLElBQUksQ0FBQztBQUNyRDtBQUFBLElBQ0UsMENBQTBDLFFBQVEsa0NBQWtDLE9BQU8sV0FBVyxDQUFDLGFBQ3JHLE9BQU8sMkNBQTJDLENBQ3BEO0FBQUEsRUFDRjtBQUVBLFNBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFNLFdBQVcsTUFBTSxJQUFJLFFBQWlCLENBQUMsWUFBWTtBQUN2RDtBQUFBLFFBQ0U7QUFBQSxRQUNBLENBQUMsTUFBTSxVQUFVLFNBQVMsV0FBVyxvQkFBb0I7QUFBQSxRQUN6RCxFQUFFLFNBQVMseUNBQXlDO0FBQUEsUUFDcEQsQ0FBQyxRQUFRLFdBQVc7QUFDbEIsa0JBQVEsT0FBTyxLQUFLLE1BQU0sR0FBRztBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUVELFFBQUksVUFBVTtBQUNaLDBCQUFJLDhCQUE4QixRQUFRLGtCQUFrQjtBQUM1RDtBQUFBLElBQ0Y7QUFFQSxVQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsaUJBQVcsU0FBUywyQ0FBMkM7QUFBQSxJQUNqRSxDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sSUFBSTtBQUFBLElBQ1IsV0FBVyxRQUFRLGlEQUFpRCxPQUFPLHFDQUFxQyxDQUFDO0FBQUEsRUFDbkg7QUFDRjtBQVNBLGVBQWUsY0FBYyxVQUFpQztBQUM1RDtBQUFBLElBQ0UsMENBQTBDLFFBQVEsK0JBQStCLE9BQU8scUNBQXFDLENBQUMsYUFDNUgsT0FBTywyQ0FBMkMsQ0FDcEQ7QUFBQSxFQUNGO0FBQ0EsUUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBRTlCLFNBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixRQUFJLE1BQU0scUJBQXFCLFFBQVEsR0FBRztBQUN4QywwQkFBSSw4QkFBOEIsUUFBUSxtREFBbUQ7QUFDN0YsWUFBTSxZQUFZLFVBQVUsUUFBUTtBQUNwQyxZQUFNLFdBQVcsUUFBUTtBQUN6QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsaUJBQVcsU0FBUywyQ0FBMkM7QUFBQSxJQUNqRSxDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sSUFBSTtBQUFBLElBQ1Isb0JBQW9CLFFBQVEsMkJBQTJCLE9BQU8scUNBQXFDLENBQUM7QUFBQSxFQUN0RztBQUNGO0FBVUEsZUFBZSxXQUFXLFVBQWlDO0FBQ3pELHNCQUFJLCtDQUErQyxRQUFRLEtBQUs7QUFFaEUsUUFBTSxhQUFhLFVBQVUsZ0JBQWdCLGFBQWE7QUFDMUQsUUFBTSxhQUFhLFVBQVUsY0FBYyxxQkFBcUI7QUFFaEUsc0JBQUksc0RBQXNELFFBQVEsR0FBRztBQUN2RTsiLAogICJuYW1lcyI6IFsiaHR0cCIsICJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiLCAicHJvY2VzcyJdCn0K
@@ -14,4 +14,4 @@ var __copyProps = (to, from, except, desc) => {
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
15
  var transport_exports = {};
16
16
  module.exports = __toCommonJS(transport_exports);
17
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlZmluZXMgdGhlIHRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cblxuLyoqXG4gKiBBIHBsdWdnYWJsZSB0cmFuc3BvcnQgdGhhdCBldmFsdWF0ZXMgSmF2YVNjcmlwdCBleHByZXNzaW9ucyBpbnNpZGUgYSBydW5uaW5nXG4gKiBPYnNpZGlhbiBpbnN0YW5jZSBhbmQgbWFuYWdlcyB2YXVsdCBsaWZlY3ljbGUuXG4gKlxuICogSW1wbGVtZW50YXRpb25zIGhhbmRsZSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZGV0YWlsczpcbiAqIC0ge0BsaW5rIERlc2t0b3BDbGlUcmFuc3BvcnR9IFx1MjAxNCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDTEkgKGBvYnNpZGlhbiBldmFsYClcbiAqIC0ge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnR9IFx1MjAxNCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIC0ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydH0gXHUyMDE0IE1vYmlsZSBPYnNpZGlhbiB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdHJhbnNwb3J0IHJlc291cmNlcyAoZS5nLiBXZWJTb2NrZXQgY29ubmVjdGlvbnMsIEFwcGl1bSBzZXNzaW9ucykuXG4gICAqL1xuICBkaXNwb3NlPygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gc3RyaW5nIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogcmF3IHN0cmluZyByZXN1bHQuXG4gICAqXG4gICAqIFRoZSB0cmFuc3BvcnQgbm9ybWFsaXplcyB0aGUgb3V0cHV0IFx1MjAxNCBzdHJpcHBpbmcgdHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzXG4gICAqIGFuZCBoYW5kbGluZyB0cmFuc3BvcnQtc3BlY2lmaWMgZXJyb3JzIFx1MjAxNCBzbyBjYWxsZXJzIHJlY2VpdmUgYSBjbGVhbiByZXN1bHRcbiAgICogc3RyaW5nIChlLmcuIGEgSlNPTiBzdHJpbmcsIG9yIGAobm8gb3V0cHV0KWApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uICh0eXBpY2FsbHkgYW4gYXN5bmMgSUlGRSkuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zIGluY2x1ZGluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgcmVzdWx0IHN0cmluZyBmcm9tIE9ic2lkaWFuLlxuICAgKi9cbiAgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCB0YXJnZXRzIGEgbW9iaWxlIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwgZGVza3RvcC1vbmx5IHBsdWdpbnMgKHdpdGggYGlzRGVza3RvcE9ubHk6IHRydWVgIGluIG1hbmlmZXN0KVxuICAgKiB3aWxsIHJlZnVzZSB0byBydW4gaW50ZWdyYXRpb24gdGVzdHMuXG4gICAqL1xuICBpc01vYmlsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUnVucyB0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZmxpZ2h0IGNoZWNrcyBiZWZvcmUgZXZhbHVhdGlvbi5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHRoZSBDTEkgdHJhbnNwb3J0IHZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsXG4gICAqIHRoZSBDTEkgaXMgZW5hYmxlZCwgYW5kIHRoZSBDTEkgYmluYXJ5IGlzIGluIFBBVEguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgZmlsZXMgaW50byBhIHZhdWx0IGRpcmVjdG9yeSBvbiB0aGUgdGFyZ2V0IGRldmljZS5cbiAgICpcbiAgICogT24gZGVza3RvcCB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBsb2NhbCBmaWxlc3lzdGVtIGRpcmVjdGx5KS5cbiAgICogT24gbW9iaWxlIHRoaXMgdXNlcyB0aGUgZGV2aWNlJ3MgZmlsZSB0cmFuc2ZlciBtZWNoYW5pc20gKGUuZy4gQXBwaXVtIGBwdXNoRmlsZWApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBzdHJpbmdzLlxuICAgKi9cbiAgcHVzaEZpbGVzPyh2YXVsdFBhdGg6IHN0cmluZywgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCBwYXRoIHNvIE9ic2lkaWFuIGNhbiB0YXJnZXQgaXQuXG4gICAqXG4gICAqIE9uIGRlc2t0b3A6IHVzZXMgRWxlY3Ryb24gSVBDIHRvIG9wZW4gdGhlIHZhdWx0IGFuZCBwb2xscyBmb3IgcmVhZGluZXNzLlxuICAgKiBPbiBtb2JpbGU6IHB1c2hlcyB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIGFuZCByZXN0YXJ0cyB0aGUgYXBwLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IHBhdGggZnJvbSB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZS5cbiAgICpcbiAgICogT24gZGVza3RvcDogY2xvc2VzIHRoZSB2YXVsdCB3aW5kb3cgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqIE9uIG1vYmlsZTogcmVtb3ZlcyB2YXVsdCBmaWxlcyBmcm9tIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuZXZhbHVhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydEV2YWxPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkgZm9yIHRoZSBldmFsdWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlZmluZXMgdGhlIHRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cblxuLyoqXG4gKiBBIHBsdWdnYWJsZSB0cmFuc3BvcnQgdGhhdCBldmFsdWF0ZXMgSmF2YVNjcmlwdCBleHByZXNzaW9ucyBpbnNpZGUgYSBydW5uaW5nXG4gKiBPYnNpZGlhbiBpbnN0YW5jZSBhbmQgbWFuYWdlcyB2YXVsdCBsaWZlY3ljbGUuXG4gKlxuICogSW1wbGVtZW50YXRpb25zIGhhbmRsZSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZGV0YWlsczpcbiAqIC0ge0BsaW5rIERlc2t0b3BDbGlUcmFuc3BvcnR9IFx1MjAxNCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDTEkgKGBvYnNpZGlhbiBldmFsYClcbiAqIC0ge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnR9IFx1MjAxNCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIC0ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydH0gXHUyMDE0IE1vYmlsZSBPYnNpZGlhbiB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdHJhbnNwb3J0IHJlc291cmNlcyAoZS5nLiBXZWJTb2NrZXQgY29ubmVjdGlvbnMsIEFwcGl1bSBzZXNzaW9ucykuXG4gICAqL1xuICBkaXNwb3NlPygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBkaXNwb3NhbCBmb3IgdXNlIGluIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXJzIHdoZXJlXG4gICAqIGFzeW5jIHdvcmsgaXMgbm90IHBvc3NpYmxlLlxuICAgKlxuICAgKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHBlcmZvcm0gb25seSBzeW5jaHJvbm91cyBjbGVhbnVwIGhlcmUgKGUuZy4ga2lsbGluZ1xuICAgKiBjaGlsZCBwcm9jZXNzZXMpLiBBc3luYyBvcGVyYXRpb25zIGxpa2UgdW5yZWdpc3RlcmluZyB2YXVsdHMgYXJlIHNraXBwZWQuXG4gICAqL1xuICBkaXNwb3NlU3luYz8oKTogdm9pZDtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIHN0cmluZyBpbnNpZGUgT2JzaWRpYW4gYW5kIHJldHVybnMgdGhlXG4gICAqIHJhdyBzdHJpbmcgcmVzdWx0LlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IG5vcm1hbGl6ZXMgdGhlIG91dHB1dCBcdTIwMTQgc3RyaXBwaW5nIHRyYW5zcG9ydC1zcGVjaWZpYyBwcmVmaXhlc1xuICAgKiBhbmQgaGFuZGxpbmcgdHJhbnNwb3J0LXNwZWNpZmljIGVycm9ycyBcdTIwMTQgc28gY2FsbGVycyByZWNlaXZlIGEgY2xlYW4gcmVzdWx0XG4gICAqIHN0cmluZyAoZS5nLiBhIEpTT04gc3RyaW5nLCBvciBgKG5vIG91dHB1dClgKS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBBIHNlbGYtY29udGFpbmVkIEphdmFTY3JpcHQgZXhwcmVzc2lvbiAodHlwaWNhbGx5IGFuIGFzeW5jIElJRkUpLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IHJlc3VsdCBzdHJpbmcgZnJvbSBPYnNpZGlhbi5cbiAgICovXG4gIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgdGFyZ2V0cyBhIG1vYmlsZSBPYnNpZGlhbiBpbnN0YW5jZS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAsIGRlc2t0b3Atb25seSBwbHVnaW5zICh3aXRoIGBpc0Rlc2t0b3BPbmx5OiB0cnVlYCBpbiBtYW5pZmVzdClcbiAgICogd2lsbCByZWZ1c2UgdG8gcnVuIGludGVncmF0aW9uIHRlc3RzLlxuICAgKi9cbiAgaXNNb2JpbGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJ1bnMgdHJhbnNwb3J0LXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MgYmVmb3JlIGV2YWx1YXRpb24uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB0aGUgQ0xJIHRyYW5zcG9ydCB2ZXJpZmllcyB0aGF0IHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLFxuICAgKiB0aGUgQ0xJIGlzIGVuYWJsZWQsIGFuZCB0aGUgQ0xJIGJpbmFyeSBpcyBpbiBQQVRILlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUHVzaGVzIGZpbGVzIGludG8gYSB2YXVsdCBkaXJlY3Rvcnkgb24gdGhlIHRhcmdldCBkZXZpY2UuXG4gICAqXG4gICAqIE9uIGRlc2t0b3AgdGhpcyBpcyBhIG5vLW9wIChmaWxlcyBhcmUgd3JpdHRlbiB0byB0aGUgbG9jYWwgZmlsZXN5c3RlbSBkaXJlY3RseSkuXG4gICAqIE9uIG1vYmlsZSB0aGlzIHVzZXMgdGhlIGRldmljZSdzIGZpbGUgdHJhbnNmZXIgbWVjaGFuaXNtIChlLmcuIEFwcGl1bSBgcHVzaEZpbGVgKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBmaWxlcyAtIE1hcCBvZiByZWxhdGl2ZSBmaWxlIHBhdGhzIHRvIGNvbnRlbnQgc3RyaW5ncy5cbiAgICovXG4gIHB1c2hGaWxlcz8odmF1bHRQYXRoOiBzdHJpbmcsIGZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgcGF0aCBzbyBPYnNpZGlhbiBjYW4gdGFyZ2V0IGl0LlxuICAgKlxuICAgKiBPbiBkZXNrdG9wOiB1c2VzIEVsZWN0cm9uIElQQyB0byBvcGVuIHRoZSB2YXVsdCBhbmQgcG9sbHMgZm9yIHJlYWRpbmVzcy5cbiAgICogT24gbW9iaWxlOiBwdXNoZXMgdmF1bHQgZmlsZXMgdG8gdGhlIGRldmljZSBhbmQgcmVzdGFydHMgdGhlIGFwcC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBwYXRoIGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIE9uIGRlc2t0b3A6IGNsb3NlcyB0aGUgdmF1bHQgd2luZG93IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBPbiBtb2JpbGU6IHJlbW92ZXMgdmF1bHQgZmlsZXMgZnJvbSB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmV2YWx1YXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnRFdmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgKHZhdWx0IHBhdGgpIGZvciB0aGUgZXZhbHVhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -17,6 +17,14 @@ export interface ObsidianTransport {
17
17
  * Disposes of transport resources (e.g. WebSocket connections, Appium sessions).
18
18
  */
19
19
  dispose?(): Promise<void>;
20
+ /**
21
+ * Synchronous disposal for use in `process.on('exit')` handlers where
22
+ * async work is not possible.
23
+ *
24
+ * Implementations should perform only synchronous cleanup here (e.g. killing
25
+ * child processes). Async operations like unregistering vaults are skipped.
26
+ */
27
+ disposeSync?(): void;
20
28
  /**
21
29
  * Evaluates a JavaScript expression string inside Obsidian and returns the
22
30
  * raw string result.
@@ -24,6 +24,8 @@ export interface CoreSetupResult {
24
24
  tempVault: TempVault;
25
25
  /** The transport instance used during setup. */
26
26
  transport: ObsidianTransport;
27
+ /** Short label for log messages (e.g. `"obsidian-cli"`, `"obsidian-cdp"`). */
28
+ transportLabel: string;
27
29
  /** The transport options that were resolved. */
28
30
  transportOptions: ObsidianTransportOptions | undefined;
29
31
  }
@@ -1,4 +1,7 @@
1
- import { existsSync } from "node:fs";
1
+ import {
2
+ existsSync,
3
+ rmSync
4
+ } from "node:fs";
2
5
  import {
3
6
  cp,
4
7
  mkdir,
@@ -13,6 +16,7 @@ import { evalInObsidian } from "./eval-in-obsidian.mjs";
13
16
  import { log } from "./log.mjs";
14
17
  import { TempVault } from "./temp-vault.mjs";
15
18
  import { createTransportFromOptions } from "./transport-factory.mjs";
19
+ const DEFAULT_TRANSPORT_TYPE = "obsidian-cli";
16
20
  const DIST_DEV = "dist/dev";
17
21
  const DIST_BUILD = "dist/build";
18
22
  const MAIN_JS = "main.js";
@@ -28,12 +32,13 @@ async function coreSetup(params) {
28
32
  loadEnvFile(envFilePath);
29
33
  }
30
34
  const transportOptions = params?.transportOptions;
31
- log("[integration-setup] Creating transport...");
35
+ const label = transportOptions?.type ?? DEFAULT_TRANSPORT_TYPE;
36
+ log(`[integration-setup:${label}] Creating transport...`);
32
37
  const transport = await createTransportFromOptions(transportOptions);
33
- log(`[integration-setup] Transport created: ${transport.constructor.name}`);
38
+ log(`[integration-setup:${label}] Transport created: ${transport.constructor.name}`);
34
39
  let tempVault;
35
40
  try {
36
- log(`[integration-setup] Project root: ${projectRoot}`);
41
+ log(`[integration-setup:${label}] Project root: ${projectRoot}`);
37
42
  const distPath = await resolveDistPath(projectRoot);
38
43
  const manifestJson = JSON.parse(await readFile(join(distPath, "manifest.json"), "utf-8"));
39
44
  const pluginId = manifestJson.id;
@@ -44,19 +49,19 @@ async function coreSetup(params) {
44
49
  }
45
50
  const mainJs = join(distPath, MAIN_JS);
46
51
  const buildStat = await stat(mainJs);
47
- log(`[integration-setup] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
52
+ log(`[integration-setup:${label}] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
48
53
  tempVault = new TempVault();
49
- log(`[integration-setup] Created temp vault: ${tempVault.path}`);
54
+ log(`[integration-setup:${label}] Created temp vault: ${tempVault.path}`);
50
55
  const pluginDir = join(tempVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
51
56
  await mkdir(pluginDir, { recursive: true });
52
57
  await cp(distPath, pluginDir, { recursive: true });
53
58
  await writeFile(join(tempVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
54
- log("[integration-setup] Syncing vault to device...");
59
+ log(`[integration-setup:${label}] Syncing vault to device...`);
55
60
  await tempVault.syncToDevice(transport);
56
- log("[integration-setup] Registering vault...");
61
+ log(`[integration-setup:${label}] Registering vault...`);
57
62
  await tempVault.register(transport);
58
- log("[integration-setup] Vault registered.");
59
- log(`[integration-setup] Enabling plugin "${pluginId}"...`);
63
+ log(`[integration-setup:${label}] Vault registered.`);
64
+ log(`[integration-setup:${label}] Enabling plugin "${pluginId}"...`);
60
65
  const { errorMessage } = await evalInObsidian({
61
66
  args: { pluginId },
62
67
  fn: enablePluginWithErrorCapture,
@@ -67,25 +72,29 @@ async function coreSetup(params) {
67
72
  if (errorMessage) {
68
73
  throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
69
74
  }
70
- log(`[integration-setup] Plugin "${pluginId}" enabled successfully.`);
75
+ log(`[integration-setup:${label}] Plugin "${pluginId}" enabled successfully.`);
71
76
  } catch (error) {
72
- log("[integration-setup] Setup failed, cleaning up...");
77
+ log(`[integration-setup:${label}] Setup failed, cleaning up...`);
73
78
  try {
74
79
  if (tempVault) {
75
80
  await tempVault.dispose(transport);
76
81
  }
77
82
  } catch (cleanupError) {
78
- log(`[integration-setup] Vault cleanup error (non-fatal): ${String(cleanupError)}`);
83
+ log(`[integration-setup:${label}] Vault cleanup error (non-fatal): ${String(cleanupError)}`);
79
84
  }
80
85
  try {
81
86
  await transport.dispose?.();
82
87
  } catch (cleanupError) {
83
- log(`[integration-setup] Transport cleanup error (non-fatal): ${String(cleanupError)}`);
88
+ log(`[integration-setup:${label}] Transport cleanup error (non-fatal): ${String(cleanupError)}`);
89
+ }
90
+ for (const activeResult of [...activeSetups]) {
91
+ log(`[integration-setup:${label}] Tearing down previously successful setup (${activeResult.transportLabel})...`);
92
+ await coreTeardown(activeResult);
84
93
  }
85
- log('[integration-setup] NOTE: If the test runner reports "No test files found", ignore it \u2014 it is a side effect of the setup failure above.');
94
+ log(`[integration-setup:${label}] NOTE: If the test runner reports "No test files found", ignore it \u2014 it is a side effect of the setup failure above.`);
86
95
  throw error;
87
96
  }
88
- const result = { tempVault, transport, transportOptions };
97
+ const result = { tempVault, transport, transportLabel: label, transportOptions };
89
98
  activeSetups.add(result);
90
99
  registerProcessCleanupHandler();
91
100
  return result;
@@ -98,12 +107,12 @@ async function coreTeardown(result) {
98
107
  try {
99
108
  await result.tempVault.dispose(result.transport);
100
109
  } catch (error) {
101
- log(`[integration-teardown] Vault cleanup error (non-fatal): ${String(error)}`);
110
+ log(`[integration-teardown:${result.transportLabel}] Vault cleanup error (non-fatal): ${String(error)}`);
102
111
  }
103
112
  try {
104
113
  await result.transport.dispose?.();
105
114
  } catch (error) {
106
- log(`[integration-teardown] Transport cleanup error (non-fatal): ${String(error)}`);
115
+ log(`[integration-teardown:${result.transportLabel}] Transport cleanup error (non-fatal): ${String(error)}`);
107
116
  }
108
117
  }
109
118
  function findProjectRoot() {
@@ -135,6 +144,36 @@ function registerProcessCleanupHandler() {
135
144
  });
136
145
  }
137
146
  });
147
+ process.on("unhandledRejection", () => {
148
+ if (activeSetups.size === 0) {
149
+ return;
150
+ }
151
+ log(`[integration-teardown] Unhandled rejection detected. Tearing down ${String(activeSetups.size)} active setup(s)...`);
152
+ for (const result of [...activeSetups]) {
153
+ coreTeardown(result).catch((error) => {
154
+ log(`[integration-teardown] Rejection cleanup error (non-fatal): ${String(error)}`);
155
+ });
156
+ }
157
+ });
158
+ process.on("exit", () => {
159
+ if (activeSetups.size === 0) {
160
+ return;
161
+ }
162
+ log(`[integration-teardown] Sync cleanup: ${String(activeSetups.size)} orphaned setup(s).`);
163
+ for (const result of [...activeSetups]) {
164
+ try {
165
+ result.transport.disposeSync?.();
166
+ } catch (error) {
167
+ log(`[integration-teardown:${result.transportLabel}] Sync transport cleanup error (non-fatal): ${String(error)}`);
168
+ }
169
+ try {
170
+ rmSync(result.tempVault.path, { force: true, recursive: true });
171
+ } catch (error) {
172
+ log(`[integration-teardown:${result.transportLabel}] Sync vault cleanup error (non-fatal): ${String(error)}`);
173
+ }
174
+ }
175
+ activeSetups.clear();
176
+ });
138
177
  }
139
178
  async function resolveDistPath(projectRoot) {
140
179
  const devPath = join(projectRoot, DIST_DEV);
@@ -158,4 +197,4 @@ export {
158
197
  coreSetup,
159
198
  coreTeardown
160
199
  };
161
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuXG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0aGF0IHdlcmUgcmVzb2x2ZWQuICovXG4gIHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNvcGllcyB0aGUgYnVpbHRcbiAqIHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCByZWdpc3RlcnMgdGhlIHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZFxuICogZW5hYmxlcyB0aGUgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBTZXR1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHNldHVwIHJlc3VsdCBjb250YWluaW5nIHRoZSB0ZW1wIHZhdWx0LCB0cmFuc3BvcnQsIGFuZCByZXNvbHZlZCBvcHRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVNldHVwKHBhcmFtcz86IENvcmVTZXR1cFBhcmFtcyk6IFByb21pc2U8Q29yZVNldHVwUmVzdWx0PiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnN0IGVudkZpbGVQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJy5lbnYnKTtcbiAgaWYgKGV4aXN0c1N5bmMoZW52RmlsZVBhdGgpKSB7XG4gICAgbG9hZEVudkZpbGUoZW52RmlsZVBhdGgpO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IHBhcmFtcz8udHJhbnNwb3J0T3B0aW9ucztcbiAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0aW5nIHRyYW5zcG9ydC4uLicpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gIGxldCB0ZW1wVmF1bHQ6IFRlbXBWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gICAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgICBjb25zdCBidWlsZFN0YXQgPSBhd2FpdCBzdGF0KG1haW5Kcyk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICAgIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIENPTU1VTklUWV9QTFVHSU5TX0pTT04pLCBKU09OLnN0cmluZ2lmeShbcGx1Z2luSWRdKSk7XG5cbiAgICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi4nKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIFJlZ2lzdGVyaW5nIHZhdWx0Li4uJyk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKCdbaW50ZWdyYXRpb24tc2V0dXBdIFZhdWx0IHJlZ2lzdGVyZWQuJyk7XG5cbiAgICAvLyBFbmFibGUgdGhlIHBsdWdpbiBhbmQgdmVyaWZ5IGl0IGxvYWRlZC4gT2JzaWRpYW4ncyBlbmFibGVQbHVnaW4oKSB3cmFwc1xuICAgIC8vIExvYWRQbHVnaW4oKSBpbiBhIHRyeS1jYXRjaCB0aGF0IHN3YWxsb3dzIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZS5cbiAgICAvLyBXZSBtb25rZXktcGF0Y2ggbG9hZFBsdWdpbigpIHRvIGNhcHR1cmUgdGhlIGVycm9yIGJlZm9yZSBpdCdzIHN3YWxsb3dlZC5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cF0gRW5hYmxpbmcgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGNvbnN0IHsgZXJyb3JNZXNzYWdlIH0gPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICBmbjogZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSxcbiAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB2YXVsdFBhdGg6IHRlbXBWYXVsdC5wYXRoXG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZmFpbGVkIHRvIGxvYWQ6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZygnW2ludGVncmF0aW9uLXNldHVwXSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQpIHtcbiAgICAgICAgYXdhaXQgdGVtcFZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwXSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXBdIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICBsb2coJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gTk9URTogSWYgdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMgXCJObyB0ZXN0IGZpbGVzIGZvdW5kXCIsIGlnbm9yZSBpdCBcdTIwMTQgaXQgaXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgc2V0dXAgZmFpbHVyZSBhYm92ZS4nKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQ29yZVNldHVwUmVzdWx0ID0geyB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9O1xuICBhY3RpdmVTZXR1cHMuYWRkKHJlc3VsdCk7XG4gIHJlZ2lzdGVyUHJvY2Vzc0NsZWFudXBIYW5kbGVyKCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50ZW1wVmF1bHQuZGlzcG9zZShyZXN1bHQudHJhbnNwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYGJlZm9yZUV4aXRgIGhhbmRsZXIgdGhhdCB0ZWFycyBkb3duIGFueSBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyXG4gKiBleHBsaWNpdGx5IHRvcm4gZG93bi4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB0ZXN0IHByb2plY3QncyBzZXR1cFxuICogZmFpbHMgYW5kIHRoZSBydW5uZXIgZXhpdHMgd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIGZvciBhbHJlYWR5LWluaXRpYWxpemVkXG4gKiBwcm9qZWN0cy5cbiAqXG4gKiBVc2VzIGBiZWZvcmVFeGl0YCBiZWNhdXNlIHRlYXJkb3duIGlzIGFzeW5jLiBVbmxpa2UgYGV4aXRgLCBgYmVmb3JlRXhpdGBcbiAqIGFsbG93cyBhc3luYyB3b3JrIFx1MjAxNCB0aGUgZXZlbnQgbG9vcCBzdGF5cyBhbGl2ZSB1bnRpbCB0aGUgY2xlYW51cCBjb21wbGV0ZXMuXG4gKiBOb3RlOiBgYmVmb3JlRXhpdGAgZG9lcyBub3QgZmlyZSB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVlBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sV0FBVyxtQkFBbUI7QUFLckMsU0FBUyxvQ0FBb0M7QUFDN0MsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsa0NBQWtDO0FBRTNDLE1BQU0sV0FBVztBQUNqQixNQUFNLGFBQWE7QUFDbkIsTUFBTSxVQUFVO0FBQ2hCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixNQUFNLHlCQUF5QjtBQVEvQixNQUFNLGVBQWUsb0JBQUksSUFBcUI7QUFDOUMsSUFBSSw2QkFBNkI7QUFtQ2pDLGVBQXNCLFVBQVUsUUFBb0Q7QUFDbEYsUUFBTSxjQUFjLGdCQUFnQjtBQUNwQyxRQUFNLGNBQWMsS0FBSyxhQUFhLE1BQU07QUFDNUMsTUFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQixnQkFBWSxXQUFXO0FBQUEsRUFDekI7QUFFQSxRQUFNLG1CQUFtQixRQUFRO0FBQ2pDLE1BQUksMkNBQTJDO0FBQy9DLFFBQU0sWUFBWSxNQUFNLDJCQUEyQixnQkFBZ0I7QUFDbkUsTUFBSSwwQ0FBMEMsVUFBVSxZQUFZLElBQUksRUFBRTtBQUUxRSxNQUFJO0FBRUosTUFBSTtBQUNGLFFBQUkscUNBQXFDLFdBQVcsRUFBRTtBQUN0RCxVQUFNLFdBQVcsTUFBTSxnQkFBZ0IsV0FBVztBQUNsRCxVQUFNLGVBQWUsS0FBSyxNQUFNLE1BQU0sU0FBUyxLQUFLLFVBQVUsZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUN4RixVQUFNLFdBQVcsYUFBYTtBQUU5QixRQUFJLFVBQVUsWUFBWSxhQUFhLGVBQWU7QUFDcEQsWUFBTSxJQUFJO0FBQUEsUUFDUixXQUFXLFFBQVE7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFNBQVMsS0FBSyxVQUFVLE9BQU87QUFDckMsVUFBTSxZQUFZLE1BQU0sS0FBSyxNQUFNO0FBRW5DLFFBQUksNkJBQTZCLFFBQVEsS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDLDBCQUEwQjtBQUVyRyxnQkFBWSxJQUFJLFVBQVU7QUFDMUIsUUFBSSwyQ0FBMkMsVUFBVSxJQUFJLEVBQUU7QUFDL0QsVUFBTSxZQUFZLEtBQUssVUFBVSxNQUFNLHFCQUFxQixhQUFhLFFBQVE7QUFDakYsVUFBTSxNQUFNLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUMxQyxVQUFNLEdBQUcsVUFBVSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDakQsVUFBTSxVQUFVLEtBQUssVUFBVSxNQUFNLHFCQUFxQixzQkFBc0IsR0FBRyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU3RyxRQUFJLGdEQUFnRDtBQUNwRCxVQUFNLFVBQVUsYUFBYSxTQUFTO0FBQ3RDLFFBQUksMENBQTBDO0FBQzlDLFVBQU0sVUFBVSxTQUFTLFNBQVM7QUFDbEMsUUFBSSx1Q0FBdUM7QUFLM0MsUUFBSSx3Q0FBd0MsUUFBUSxNQUFNO0FBQzFELFVBQU0sRUFBRSxhQUFhLElBQUksTUFBTSxlQUFlO0FBQUEsTUFDNUMsTUFBTSxFQUFFLFNBQVM7QUFBQSxNQUNqQixJQUFJO0FBQUEsTUFDSiwyQkFBMkI7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsV0FBVyxVQUFVO0FBQUEsSUFDdkIsQ0FBQztBQUVELFFBQUksY0FBYztBQUNoQixZQUFNLElBQUksTUFBTSxXQUFXLFFBQVEscUJBQXFCLFlBQVksRUFBRTtBQUFBLElBQ3hFO0FBRUEsUUFBSSwrQkFBK0IsUUFBUSx5QkFBeUI7QUFBQSxFQUN0RSxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksa0RBQWtEO0FBQ3RELFFBQUk7QUFDRixVQUFJLFdBQVc7QUFDYixjQUFNLFVBQVUsUUFBUSxTQUFTO0FBQUEsTUFDbkM7QUFBQSxJQUNGLFNBQVMsY0FBdUI7QUFDOUIsVUFBSSx3REFBd0QsT0FBTyxZQUFZLENBQUMsRUFBRTtBQUFBLElBQ3BGO0FBQ0EsUUFBSTtBQUNGLFlBQU0sVUFBVSxVQUFVO0FBQUEsSUFDNUIsU0FBUyxjQUF1QjtBQUM5QixVQUFJLDREQUE0RCxPQUFPLFlBQVksQ0FBQyxFQUFFO0FBQUEsSUFDeEY7QUFDQSxRQUFJLDhJQUF5STtBQUM3SSxVQUFNO0FBQUEsRUFDUjtBQUVBLFFBQU0sU0FBMEIsRUFBRSxXQUFXLFdBQVcsaUJBQWlCO0FBQ3pFLGVBQWEsSUFBSSxNQUFNO0FBQ3ZCLGdDQUE4QjtBQUM5QixTQUFPO0FBQ1Q7QUFTQSxlQUFzQixhQUFhLFFBQXlDO0FBQzFFLE1BQUksQ0FBQyxRQUFRO0FBQ1g7QUFBQSxFQUNGO0FBRUEsZUFBYSxPQUFPLE1BQU07QUFFMUIsTUFBSTtBQUNGLFVBQU0sT0FBTyxVQUFVLFFBQVEsT0FBTyxTQUFTO0FBQUEsRUFDakQsU0FBUyxPQUFnQjtBQUN2QixRQUFJLDJEQUEyRCxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDaEY7QUFFQSxNQUFJO0FBQ0YsVUFBTSxPQUFPLFVBQVUsVUFBVTtBQUFBLEVBQ25DLFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSwrREFBK0QsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3BGO0FBQ0Y7QUFPQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLE1BQU0sUUFBUSxJQUFJO0FBR3RCLFNBQU8sTUFBTTtBQUNYLFFBQUksV0FBVyxLQUFLLEtBQUssY0FBYyxDQUFDLEdBQUc7QUFDekMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFDN0IsUUFBSSxXQUFXLEtBQUs7QUFDbEIsWUFBTSxJQUFJLE1BQU0sc0RBQXNEO0FBQUEsSUFDeEU7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBWUEsU0FBUyxnQ0FBc0M7QUFDN0MsTUFBSSw0QkFBNEI7QUFDOUI7QUFBQSxFQUNGO0FBQ0EsK0JBQTZCO0FBRTdCLFVBQVEsR0FBRyxjQUFjLE1BQU07QUFDN0IsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSxRQUFJLCtDQUErQyxPQUFPLGFBQWEsSUFBSSxDQUFDLHlDQUF5QztBQUNySCxlQUFXLFVBQVUsQ0FBQyxHQUFHLFlBQVksR0FBRztBQUN0QyxtQkFBYSxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQW1CO0FBQzdDLFlBQUksNkRBQTZELE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUNsRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBV0EsZUFBZSxnQkFBZ0IsYUFBc0M7QUFDbkUsUUFBTSxVQUFVLEtBQUssYUFBYSxRQUFRO0FBQzFDLFFBQU0sWUFBWSxLQUFLLGFBQWEsVUFBVTtBQUM5QyxRQUFNLFlBQVksS0FBSyxTQUFTLE9BQU87QUFDdkMsUUFBTSxjQUFjLEtBQUssV0FBVyxPQUFPO0FBQzNDLFFBQU0sVUFBVSxXQUFXLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJO0FBQ2hFLFFBQU0sWUFBWSxXQUFXLFdBQVcsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJO0FBRXRFLE1BQUksV0FBVyxXQUFXO0FBQ3hCLFdBQU8sUUFBUSxRQUFRLFVBQVUsUUFBUSxVQUFVO0FBQUEsRUFDckQ7QUFFQSxNQUFJLFNBQVM7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksV0FBVztBQUNiLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQy9FOyIsCiAgIm5hbWVzIjogW10KfQo=
200
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuXG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNsaSc7XG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2xpXCJgLCBgXCJvYnNpZGlhbi1jZHBcImApLiAqL1xuICB0cmFuc3BvcnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IG9wdGlvbnMgdGhhdCB3ZXJlIHJlc29sdmVkLiAqL1xuICB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWx0XG4gKiBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgcmVnaXN0ZXJzIHRoZSB2YXVsdCB3aXRoIE9ic2lkaWFuLCBhbmRcbiAqIGVuYWJsZXMgdGhlIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2V0dXAgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzZXR1cCByZXN1bHQgY29udGFpbmluZyB0aGUgdGVtcCB2YXVsdCwgdHJhbnNwb3J0LCBhbmQgcmVzb2x2ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVTZXR1cChwYXJhbXM/OiBDb3JlU2V0dXBQYXJhbXMpOiBQcm9taXNlPENvcmVTZXR1cFJlc3VsdD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBlbnZGaWxlUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsICcuZW52Jyk7XG4gIGlmIChleGlzdHNTeW5jKGVudkZpbGVQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudkZpbGVQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnM7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uYCk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gICAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBtYW5pZmVzdEpzb24uaWQ7XG5cbiAgICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBpc0Rlc2t0b3BPbmx5OiB0cnVlIGluIG1hbmlmZXN0Lmpzb24uIE1vYmlsZSBpbnRlZ3JhdGlvbiB0ZXN0cyBjYW5ub3QgcnVuIGZvciBkZXNrdG9wLW9ubHkgcGx1Z2lucy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5KcyA9IGpvaW4oZGlzdFBhdGgsIE1BSU5fSlMpO1xuICAgIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBVc2luZyAke2Rpc3RQYXRofSAoJHtidWlsZFN0YXQubXRpbWUudG9JU09TdHJpbmcoKX0pLiBJZiBvdXRkYXRlZCwgcmVidWlsZC5gKTtcblxuICAgIHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBWYXVsdC5wYXRofWApO1xuICAgIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gICAgYXdhaXQgbWtkaXIocGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBjcChkaXN0UGF0aCwgcGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTeW5jaW5nIHZhdWx0IHRvIGRldmljZS4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUmVnaXN0ZXJpbmcgdmF1bHQuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgcmVnaXN0ZXJlZC5gKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gICAgLy8gTG9hZFBsdWdpbigpIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3MgZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLlxuICAgIC8vIFdlIG1vbmtleS1wYXRjaCBsb2FkUGx1Z2luKCkgdG8gY2FwdHVyZSB0aGUgZXJyb3IgYmVmb3JlIGl0J3Mgc3dhbGxvd2VkLlxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gICAgY29uc3QgeyBlcnJvck1lc3NhZ2UgfSA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgIGFyZ3M6IHsgcGx1Z2luSWQgfSxcbiAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIHRyYW5zcG9ydCxcbiAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICB9KTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkuYCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi5gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBWYXVsdCkge1xuICAgICAgICBhd2FpdCB0ZW1wVmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gVGVhciBkb3duIGFueSBwcmV2aW91c2x5IHN1Y2Nlc3NmdWwgc2V0dXBzLiBUaGUgdGVzdCBydW5uZXIgd2lsbCBhYm9ydFxuICAgIC8vIEFmdGVyIHRoaXMgZXJyb3IgYW5kIHdvbid0IGNhbGwgdGhlaXIgdGVhcmRvd24gZnVuY3Rpb25zLiBEb2luZyBpdCBoZXJlXG4gICAgLy8gV2hpbGUgd2UncmUgc3RpbGwgaW4gYXN5bmMgY29udGV4dCBhdm9pZHMgcmVseWluZyBvbiB0aGUgc3luYyBgZXhpdGBcbiAgICAvLyBIYW5kbGVyICh3aGljaCBjYW4gb25seSBkbyBiZXN0LWVmZm9ydCBjbGVhbnVwKS5cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZVJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRlYXJpbmcgZG93biBwcmV2aW91c2x5IHN1Y2Nlc3NmdWwgc2V0dXAgKCR7YWN0aXZlUmVzdWx0LnRyYW5zcG9ydExhYmVsfSkuLi5gKTtcbiAgICAgIGF3YWl0IGNvcmVUZWFyZG93bihhY3RpdmVSZXN1bHQpO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgPSB7IHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRMYWJlbDogbGFiZWwsIHRyYW5zcG9ydE9wdGlvbnMgfTtcbiAgYWN0aXZlU2V0dXBzLmFkZChyZXN1bHQpO1xuICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVTZXR1cHMuZGVsZXRlKHJlc3VsdCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3RlZC4gVGVhcmluZyBkb3duICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gYWN0aXZlIHNldHVwKHMpLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcm1TeW5jKHJlc3VsdC50ZW1wVmF1bHQucGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVlBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxXQUFXLG1CQUFtQjtBQUtyQyxTQUFTLG9DQUFvQztBQUM3QyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLFdBQVc7QUFDcEIsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxrQ0FBa0M7QUFFM0MsTUFBTSx5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
@@ -101,6 +101,17 @@ async function createAppiumTransport(options) {
101
101
  let appiumProcess;
102
102
  let emulatorProcess;
103
103
  try {
104
+ let killAutoStartedProcesses2 = function() {
105
+ if (appiumProcess) {
106
+ appiumProcess.kill();
107
+ log("[transport-factory] Auto-started Appium server stopped.");
108
+ }
109
+ if (emulatorProcess) {
110
+ emulatorProcess.kill();
111
+ log("[transport-factory] Auto-started emulator stopped.");
112
+ }
113
+ };
114
+ var killAutoStartedProcesses = killAutoStartedProcesses2;
104
115
  [appiumProcess, emulatorProcess] = await startAppiumAndEmulator({
105
116
  appiumUrl: url,
106
117
  avdName: options.avdName,
@@ -135,27 +146,24 @@ async function createAppiumTransport(options) {
135
146
  port
136
147
  });
137
148
  log("[transport-factory] Appium session established.");
138
- const transport = new AppiumTransport({
149
+ const appiumTransport = new AppiumTransport({
139
150
  appId,
140
151
  browser,
141
152
  platform: "android",
142
153
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath }
143
154
  });
144
- const originalDispose = transport.dispose.bind(transport);
155
+ const originalDispose = appiumTransport.dispose.bind(appiumTransport);
156
+ const transport = appiumTransport;
145
157
  transport.dispose = async () => {
146
158
  try {
147
159
  await originalDispose();
148
160
  } finally {
149
- if (appiumProcess) {
150
- appiumProcess.kill();
151
- log("[transport-factory] Auto-started Appium server stopped.");
152
- }
153
- if (emulatorProcess) {
154
- emulatorProcess.kill();
155
- log("[transport-factory] Auto-started emulator stopped.");
156
- }
161
+ killAutoStartedProcesses2();
157
162
  }
158
163
  };
164
+ transport.disposeSync = () => {
165
+ killAutoStartedProcesses2();
166
+ };
159
167
  return transport;
160
168
  } catch (error) {
161
169
  if (appiumProcess) {
@@ -335,4 +343,4 @@ export {
335
343
  createTransportFromOptions,
336
344
  getOrCreateTransport
337
345
  };
338
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPEFwcGl1bVRyYW5zcG9ydD4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICB9XG5cbiAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBvcHRpb25zLmRldmljZUlkLFxuICAgICAgcG9ydCxcbiAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICB9KTtcblxuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3RvcnldIENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSwgYXBwPSR7YXBwSWR9LCByZXRyeVRpbWVvdXQ6ICR7XG4gICAgICAgIFN0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcywgcmV0cmllczogJHtTdHJpbmcoQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQpfSkuLi5gXG4gICAgKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06c2V0dGluZ3MnOiB7XG4gICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgICdhcHBpdW06c2tpcFNlcnZlckluc3RhbGxhdGlvbic6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydFxuICAgIH0pO1xuXG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBzZXNzaW9uIGVzdGFibGlzaGVkLicpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgYXBwSWQsXG4gICAgICBicm93c2VyLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KVxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gdHJhbnNwb3J0LmRpc3Bvc2UuYmluZCh0cmFuc3BvcnQpO1xuICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNwb3NlKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBrZXkgZXZlbnQgdG8gYSBkZXZpY2UgdmlhIEFEQi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyB3YXJuaW5nc1xuICogaW5zdGVhZCBvZiB0aHJvd2luZywgc2luY2Uga2V5IGV2ZW50cyBhcmUgYmVzdC1lZmZvcnQgKGUuZy4sIHRoZSBzY3JlZW5cbiAqIG1heSBhbHJlYWR5IGJlIG9uKS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ga2V5Q29kZSAtIFRoZSBBbmRyb2lkIGtleWNvZGUgdG8gc2VuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBsb2cgbWVzc2FnZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBleGVjRmlsZShcbiAgICAgICdhZGInLFxuICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgbG9nKFxuICAgICAgICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlciBhbmQgZW11bGF0b3IgaW4gcGFyYWxsZWwgd2hlbiBib3RoIG5lZWQgYXV0by1zdGFydGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gQ29uZmlndXJhdGlvbiBmb3IgQXBwaXVtIGFuZCBlbXVsYXRvciBzdGFydHVwLlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc11gLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIGB1bmRlZmluZWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWQsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgfVxuXG4gIGNvbnN0IFssIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgPyB3YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWQgfSlcbiAgXSk7XG5cbiAgcmV0dXJuIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBcHBpdW0gc2VydmVyIGFzIGEgZGV0YWNoZWQgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gc3RhcnQgQXBwaXVtIG9uLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBbmRyb2lkIGVtdWxhdG9yIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBuYW1lIHRvIHN0YXJ0LlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gLWF2ZCAke2F2ZE5hbWV9IC1uby1zbmFwc2hvdC1zYXZlYCk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIFsnLWF2ZCcsIGF2ZE5hbWUsICctbm8tc25hcHNob3Qtc2F2ZSddLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdW50aWwgaXQgcmVzcG9uZHMgdG8gYC9zdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICB9bXMpLi4uYFxuICApO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBwb2xsaW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSBkZWFkbGluZSAtIEFic29sdXRlIHRpbWVzdGFtcCBkZWFkbGluZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gIGxvZyhcbiAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGBhZGIgZGV2aWNlc2AgdW50aWwgdGhlIHNwZWNpZmllZCBkZXZpY2UgYXBwZWFycyBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKlxuICogQWxzbyB3YWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBjaGVja2luZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gd2FpdCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICBhd2FpdCB3YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRW11bGF0b3IgZGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBkaWQgbm90IGFwcGVhciB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFdha2VzIHRoZSBlbXVsYXRvciBzY3JlZW4gYW5kIGRpc21pc3NlcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQWZ0ZXIgYm9vdCwgdGhlIGVtdWxhdG9yIHNjcmVlbiBtYXkgYmUgb2ZmLiBTZW5kcyBgS0VZQ09ERV9XQUtFVVBgIHRvIHR1cm5cbiAqIG9uIHRoZSBkaXNwbGF5IGFuZCBgS0VZQ09ERV9NRU5VYCB0byBkaXNtaXNzIHRoZSBsb2NrIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICBhd2FpdCBzZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgYXdhaXQgc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxjQUFjO0FBUXZCLFNBQVMsV0FBVztBQUNwQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsV0FBVztBQUNuQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGtEQUFrRDtBQUN4RCxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtDQUFrQztBQUN4QyxNQUFNLDhDQUE4QztBQUNwRCxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSx3Q0FBd0M7QUFpQzlDLElBQUk7QUFRSixlQUFzQiwyQkFBMkIsU0FBZ0U7QUFDL0csTUFBSSxDQUFDLFdBQVcsUUFBUSxTQUFTLGdCQUFnQjtBQUMvQyxRQUFJLG9GQUFvRjtBQUN4RixXQUFPLElBQUksb0JBQW9CO0FBQUEsRUFDakM7QUFFQSxNQUFJLFFBQVEsU0FBUyxnQkFBZ0I7QUFDbkMsUUFBSSwwREFBMEQsUUFBUSxRQUFRLFdBQVcsVUFBVSxPQUFPLFFBQVEsUUFBUSxnQkFBZ0IsQ0FBQyxHQUFHO0FBQzlJLFdBQU8sSUFBSSxvQkFBb0I7QUFBQSxNQUM3QixHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsU0FBUyxVQUFhLEVBQUUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUMxRCxHQUFJLFFBQVEsaUNBQWlDLFVBQWEsRUFBRSw4QkFBOEIsUUFBUSw2QkFBNkI7QUFBQSxJQUNqSSxDQUFDO0FBQUEsRUFDSDtBQUVBLE1BQUkscURBQXFELFFBQVEsU0FBUyxZQUFZLFFBQVEsUUFBUSxHQUFHO0FBQ3pHLFNBQU8sc0JBQXNCLE9BQU87QUFDdEM7QUFZQSxlQUFzQixxQkFBcUIsU0FBZ0U7QUFDekcsTUFBSSxpQkFBaUI7QUFDbkIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFNBQVMsTUFBTSwyQkFBMkIsT0FBTztBQUV2RCxvQkFBa0I7QUFDbEIsU0FBTztBQUNUO0FBVUEsU0FBUyxxQkFBcUIsS0FBeUI7QUFDckQsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsVUFBTSxZQUFZLElBQUksSUFBSSxXQUFXLEdBQUc7QUFDeEMsVUFBTSxNQUFNLEtBQUssSUFBSSxXQUFXLEVBQUUsU0FBUyx5Q0FBeUMsR0FBRyxDQUFDLFFBQVE7QUFDOUYsVUFBSSxPQUFPO0FBQ1gsY0FBUTtBQUFBLElBQ1YsQ0FBQztBQUNELFFBQUksR0FBRyxXQUFXLE1BQU07QUFDdEIsVUFBSSxRQUFRO0FBQ1o7QUFBQSxRQUNFLElBQUk7QUFBQSxVQUNGLG9CQUFvQixJQUFJLE1BQU0sMkJBQTJCLE9BQU8sd0NBQXdDLENBQUM7QUFBQSxRQUMzRztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRCxRQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVE7QUFDdkI7QUFBQSxRQUNFLElBQUk7QUFBQSxVQUNGLGlDQUFpQyxJQUFJLE1BQU0sS0FBSyxJQUFJLE9BQU87QUFBQSxRQUM3RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQVFBLGVBQWUscUJBQXFCLFVBQW9DO0FBQ3RFLFFBQU0sU0FBUyxNQUFNLElBQUksUUFBZ0IsQ0FBQyxTQUFTLFdBQVc7QUFDNUQsYUFBUyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsU0FBUyx5Q0FBeUMsR0FBRyxDQUFDLE9BQU8sUUFBUSxXQUFXO0FBQzdHLFVBQUksT0FBTztBQUNULGVBQU8sSUFBSSxNQUFNLGdDQUFnQyxNQUFNLE9BQU8saUNBQWlDLENBQUM7QUFDaEc7QUFBQSxNQUNGO0FBQ0EsVUFBSSxRQUFRO0FBQ1YsWUFBSSxtQ0FBbUMsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3hEO0FBQ0EsY0FBUSxNQUFNO0FBQUEsSUFDaEIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUVELFFBQU0sUUFBUSxPQUFPLE1BQU0sSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7QUFDNUYsUUFBTSxhQUFhLE1BQU0sS0FBSyxDQUFDLFNBQVMsS0FBSyxXQUFXLFFBQVEsQ0FBQztBQUNqRSxTQUFPLFlBQVksU0FBUyxTQUFVLEtBQUs7QUFDN0M7QUFRQSxlQUFlLHNCQUFzQixTQUEwRTtBQUM3RyxRQUFNLE1BQU0sSUFBSSxJQUFJLFFBQVEsU0FBUztBQUVyQyxRQUFNLE9BQU8sT0FBTyxJQUFJLElBQUk7QUFDNUIsTUFBSSxNQUFNLElBQUksR0FBRztBQUNmLFVBQU0sSUFBSSxNQUFNLDhCQUE4QixJQUFJLElBQUksRUFBRTtBQUFBLEVBQzFEO0FBRUEsUUFBTSxRQUFRLFFBQVEsU0FBUztBQUUvQixNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUk7QUFDRixLQUFDLGVBQWUsZUFBZSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsTUFDOUQsV0FBVztBQUFBLE1BQ1gsU0FBUyxRQUFRO0FBQUEsTUFDakIsVUFBVSxRQUFRO0FBQUEsTUFDbEI7QUFBQSxNQUNBLHVCQUF1QixRQUFRO0FBQUEsSUFDakMsQ0FBQztBQUVEO0FBQUEsTUFDRSxvREFBb0QsUUFBUSxRQUFRLFNBQVMsS0FBSyxtQkFDaEYsT0FBTywrQ0FBK0MsQ0FDeEQsZ0JBQWdCLE9BQU8sNkJBQTZCLENBQUM7QUFBQSxJQUN2RDtBQUNBLFVBQU0sVUFBVSxNQUFNLE9BQU87QUFBQSxNQUMzQixjQUFjO0FBQUEsUUFDWixzQkFBc0I7QUFBQSxRQUN0QixxQkFBcUI7QUFBQSxRQUNyQiwrQkFBK0I7QUFBQSxRQUMvQix5QkFBeUI7QUFBQSxRQUN6Qiw0QkFBNEI7QUFBQSxRQUM1QixrQkFBa0I7QUFBQSxRQUNsQixtQkFBbUI7QUFBQSxVQUNqQixtQ0FBbUM7QUFBQSxRQUNyQztBQUFBLFFBQ0EsaUNBQWlDO0FBQUEsUUFDakMsZUFBZSxRQUFRO0FBQUEsUUFDdkIsMENBQTBDO0FBQUEsUUFDMUMsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxNQUNBLHNCQUFzQjtBQUFBLE1BQ3RCLHdCQUF3QjtBQUFBLE1BQ3hCLFVBQVUsSUFBSTtBQUFBLE1BQ2QsVUFBVTtBQUFBLE1BQ1YsTUFBTSxJQUFJO0FBQUEsTUFDVjtBQUFBLElBQ0YsQ0FBQztBQUVELFFBQUksaURBQWlEO0FBQ3JELFVBQU0sWUFBWSxJQUFJLGdCQUFnQjtBQUFBLE1BQ3BDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsR0FBSSxRQUFRLGtCQUFrQixVQUFhLEVBQUUsZUFBZSxRQUFRLGNBQWM7QUFBQSxJQUNwRixDQUFDO0FBRUQsVUFBTSxrQkFBa0IsVUFBVSxRQUFRLEtBQUssU0FBUztBQUN4RCxjQUFVLFVBQVUsWUFBMkI7QUFDN0MsVUFBSTtBQUNGLGNBQU0sZ0JBQWdCO0FBQUEsTUFDeEIsVUFBRTtBQUNBLFlBQUksZUFBZTtBQUNqQix3QkFBYyxLQUFLO0FBQ25CLGNBQUkseURBQXlEO0FBQUEsUUFDL0Q7QUFDQSxZQUFJLGlCQUFpQjtBQUNuQiwwQkFBZ0IsS0FBSztBQUNyQixjQUFJLG9EQUFvRDtBQUFBLFFBQzFEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVCxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksZUFBZTtBQUNqQixvQkFBYyxLQUFLO0FBQ25CLFVBQUksaUZBQWlGO0FBQUEsSUFDdkY7QUFDQSxRQUFJLGlCQUFpQjtBQUNuQixzQkFBZ0IsS0FBSztBQUNyQixVQUFJLDRFQUE0RTtBQUFBLElBQ2xGO0FBQ0EsVUFBTTtBQUFBLEVBQ1I7QUFDRjtBQVdBLGVBQWUsc0JBQXNCLFFBQXdFO0FBQzNHLFFBQU0sRUFBRSxTQUFTLFNBQVMsSUFBSTtBQUM5QixNQUFJLHVDQUF1QyxRQUFRLDBCQUEwQjtBQUU3RSxNQUFJLE1BQU0scUJBQXFCLFFBQVEsR0FBRztBQUN4QyxRQUFJLDhCQUE4QixRQUFRLGdCQUFnQjtBQUMxRCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJO0FBQUEsTUFDUixXQUFXLFFBQVE7QUFBQSxJQUVyQjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLDhCQUE4QixRQUFRLHNDQUFzQyxPQUFPLE1BQU07QUFDN0YsUUFBTSxrQkFBa0IsY0FBYyxPQUFPO0FBQzdDLFFBQU0sY0FBYyxRQUFRO0FBQzVCLE1BQUksaUNBQWlDLE9BQU8scUJBQXFCLFFBQVEsZ0JBQWdCO0FBQ3pGLFNBQU87QUFDVDtBQVVBLFNBQVMsd0JBQWdDO0FBQ3ZDLFFBQU0sVUFBVSxRQUFRLElBQUksY0FBYyxLQUFLLFFBQVEsSUFBSSxrQkFBa0I7QUFDN0UsTUFBSSxDQUFDLFNBQVM7QUFDWixVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPLEtBQUssU0FBUyxZQUFZLFVBQVU7QUFDN0M7QUFXQSxlQUFlLGFBQWEsVUFBa0IsU0FBaUIsYUFBb0M7QUFDakcsUUFBTSxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQ25DO0FBQUEsTUFDRTtBQUFBLE1BQ0EsQ0FBQyxNQUFNLFVBQVUsU0FBUyxTQUFTLFlBQVksT0FBTyxPQUFPLENBQUM7QUFBQSxNQUM5RCxFQUFFLFNBQVMseUNBQXlDO0FBQUEsTUFDcEQsQ0FBQyxVQUFVO0FBQ1QsWUFBSSxPQUFPO0FBQ1Q7QUFBQSxZQUNFLDBDQUEwQyxXQUFXLGNBQWMsT0FBTyxPQUFPLENBQUMsTUFBTSxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsZUFBZTtBQUFBLFVBQ2xKO0FBQUEsUUFDRjtBQUVBLGdCQUFRO0FBQUEsTUFDVjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVFBLGVBQWUsdUJBQXVCLFFBQXFHO0FBQ3pJLFFBQU0sRUFBRSxXQUFXLFNBQVMsVUFBVSxNQUFNLHNCQUFzQixJQUFJO0FBRXRFLE1BQUksbUJBQW1CO0FBRXZCLE1BQUksaURBQWlELFVBQVUsSUFBSSxLQUFLO0FBQ3hFLE1BQUk7QUFDRixVQUFNLHFCQUFxQixTQUFTO0FBQ3BDLFFBQUksaURBQWlEO0FBQUEsRUFDdkQsU0FBUyxPQUFnQjtBQUN2QixRQUFJLDBCQUEwQixPQUFPO0FBQ25DLFlBQU07QUFBQSxJQUNSO0FBQ0EsdUJBQW1CO0FBQUEsRUFDckI7QUFFQSxNQUFJO0FBRUosTUFBSSxrQkFBa0I7QUFDcEIsUUFBSSxtRUFBbUUsT0FBTyxJQUFJLENBQUMsS0FBSztBQUN4RixvQkFBZ0Isa0JBQWtCLElBQUk7QUFBQSxFQUN4QztBQUVBLFFBQU0sQ0FBQyxFQUFFLGVBQWUsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQzVDLG1CQUNJLG1CQUFtQixTQUFTLEVBQUUsS0FBSyxNQUFNO0FBQ3pDLFVBQUksMERBQTBEO0FBQUEsSUFDaEUsQ0FBQyxJQUNDLFFBQVEsUUFBUTtBQUFBLElBQ3BCLHNCQUFzQixFQUFFLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDN0MsQ0FBQztBQUVELFNBQU8sQ0FBQyxlQUFlLGVBQWU7QUFDeEM7QUFRQSxTQUFTLGtCQUFrQixNQUE0QjtBQUNyRCxRQUFNLFFBQVEsTUFBTSxxQ0FBcUMsT0FBTyxJQUFJLENBQUMsSUFBSTtBQUFBLElBQ3ZFLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxJQUNQLE9BQU8sQ0FBQyxVQUFVLFdBQVcsU0FBUztBQUFBLEVBQ3hDLENBQUM7QUFFRCxRQUFNLE1BQU07QUFDWixTQUFPO0FBQ1Q7QUFRQSxTQUFTLGNBQWMsU0FBK0I7QUFDcEQsUUFBTSxpQkFBaUIsc0JBQXNCO0FBQzdDLE1BQUksZ0NBQWdDLGNBQWMsU0FBUyxPQUFPLG9CQUFvQjtBQUN0RixRQUFNLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLFNBQVMsbUJBQW1CLEdBQUc7QUFBQSxJQUMxRSxVQUFVO0FBQUEsSUFDVixPQUFPLENBQUMsVUFBVSxVQUFVLFFBQVE7QUFBQSxFQUN0QyxDQUFDO0FBRUQsUUFBTSxNQUFNO0FBQ1osU0FBTztBQUNUO0FBT0EsZUFBZSxtQkFBbUIsS0FBeUI7QUFDekQ7QUFBQSxJQUNFLDZDQUE2QyxJQUFJLElBQUksY0FBYyxPQUFPLG9DQUFvQyxDQUFDLGFBQzdHLE9BQU8sMENBQTBDLENBQ25EO0FBQUEsRUFDRjtBQUNBLFFBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUU5QixTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSTtBQUNGLFlBQU0scUJBQXFCLEdBQUc7QUFDOUI7QUFBQSxJQUNGLFFBQVE7QUFDTixZQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsbUJBQVcsU0FBUywwQ0FBMEM7QUFBQSxNQUNoRSxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLDBEQUEwRCxPQUFPLG9DQUFvQyxDQUFDO0FBQUEsRUFDeEc7QUFDRjtBQVFBLGVBQWUsWUFBWSxVQUFrQixVQUFpQztBQUM1RSxRQUFNLGNBQWMsS0FBSyxJQUFJLEdBQUcsV0FBVyxLQUFLLElBQUksQ0FBQztBQUNyRDtBQUFBLElBQ0UsMENBQTBDLFFBQVEsa0NBQWtDLE9BQU8sV0FBVyxDQUFDLGFBQ3JHLE9BQU8sMkNBQTJDLENBQ3BEO0FBQUEsRUFDRjtBQUVBLFNBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFNLFdBQVcsTUFBTSxJQUFJLFFBQWlCLENBQUMsWUFBWTtBQUN2RDtBQUFBLFFBQ0U7QUFBQSxRQUNBLENBQUMsTUFBTSxVQUFVLFNBQVMsV0FBVyxvQkFBb0I7QUFBQSxRQUN6RCxFQUFFLFNBQVMseUNBQXlDO0FBQUEsUUFDcEQsQ0FBQyxRQUFRLFdBQVc7QUFDbEIsa0JBQVEsT0FBTyxLQUFLLE1BQU0sR0FBRztBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUVELFFBQUksVUFBVTtBQUNaLFVBQUksOEJBQThCLFFBQVEsa0JBQWtCO0FBQzVEO0FBQUEsSUFDRjtBQUVBLFVBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3QixpQkFBVyxTQUFTLDJDQUEyQztBQUFBLElBQ2pFLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxJQUFJO0FBQUEsSUFDUixXQUFXLFFBQVEsaURBQWlELE9BQU8scUNBQXFDLENBQUM7QUFBQSxFQUNuSDtBQUNGO0FBU0EsZUFBZSxjQUFjLFVBQWlDO0FBQzVEO0FBQUEsSUFDRSwwQ0FBMEMsUUFBUSwrQkFBK0IsT0FBTyxxQ0FBcUMsQ0FBQyxhQUM1SCxPQUFPLDJDQUEyQyxDQUNwRDtBQUFBLEVBQ0Y7QUFDQSxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFFOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUksTUFBTSxxQkFBcUIsUUFBUSxHQUFHO0FBQ3hDLFVBQUksOEJBQThCLFFBQVEsbURBQW1EO0FBQzdGLFlBQU0sWUFBWSxVQUFVLFFBQVE7QUFDcEMsWUFBTSxXQUFXLFFBQVE7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLGlCQUFXLFNBQVMsMkNBQTJDO0FBQUEsSUFDakUsQ0FBQztBQUFBLEVBQ0g7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLG9CQUFvQixRQUFRLDJCQUEyQixPQUFPLHFDQUFxQyxDQUFDO0FBQUEsRUFDdEc7QUFDRjtBQVVBLGVBQWUsV0FBVyxVQUFpQztBQUN6RCxNQUFJLCtDQUErQyxRQUFRLEtBQUs7QUFFaEUsUUFBTSxhQUFhLFVBQVUsZ0JBQWdCLGFBQWE7QUFDMUQsUUFBTSxhQUFhLFVBQVUsY0FBYyxxQkFBcUI7QUFFaEUsTUFBSSxzREFBc0QsUUFBUSxHQUFHO0FBQ3ZFOyIsCiAgIm5hbWVzIjogW10KfQo=
346
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBhdXRvLXN0YXJ0IGlmIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi9cbiAgYXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuICovXG4gIGF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERldmljZSBVRElELiAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRldmljZSBpcyBjb25uZWN0ZWQgdmlhIEFEQi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY2hlY2sgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgY29uc3QgZGV2aWNlTGluZSA9IGxpbmVzLmZpbmQoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChkZXZpY2VJZCkpO1xuICByZXR1cm4gZGV2aWNlTGluZT8uaW5jbHVkZXMoJ1xcdGRldmljZScpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXBwaXVtVHJhbnNwb3J0KG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gIH1cblxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHtcbiAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgZGV2aWNlSWQ6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICBwb3J0LFxuICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtOiBvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bVxuICAgIH0pO1xuXG4gICAgbG9nKFxuICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke29wdGlvbnMuZGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtcbiAgICAgICAgU3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKVxuICAgICAgfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICdhcHBpdW06YXBwQWN0aXZpdHknOiBBUFBfQUNUSVZJVFksXG4gICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTphdXRvbWF0aW9uTmFtZSc6ICdVaUF1dG9tYXRvcjInLFxuICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTpzZXR0aW5ncyc6IHtcbiAgICAgICAgICAnYXBwaXVtOmNocm9tZWRyaXZlckF1dG9kb3dubG9hZCc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgJ2FwcGl1bTpza2lwU2VydmVySW5zdGFsbGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICBwb3J0XG4gICAgfSk7XG5cbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgY29uc3QgYXBwaXVtVHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSBhcHBpdW1UcmFuc3BvcnQuZGlzcG9zZS5iaW5kKGFwcGl1bVRyYW5zcG9ydCk7XG4gICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyYW5zcG9ydC5kaXNwb3NlU3luYyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNwb3J0O1xuXG4gICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgYXBwaXVtUHJvY2Vzcy5raWxsKCk7XG4gICAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIGVtdWxhdG9yIHN0b3BwZWQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhcHBpdW1Qcm9jZXNzLmtpbGwoKTtcbiAgICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICBlbXVsYXRvclByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEtpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIHNwZWNpZmllZCBkZXZpY2UgaXMgY29ubmVjdGVkLCBvcHRpb25hbGx5IGF1dG8tc3RhcnRpbmcgYW5cbiAqIGVtdWxhdG9yIGlmIGFuIEFWRCBuYW1lIGlzIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBEZXZpY2UgYW5kIG9wdGlvbmFsIEFWRCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHBhcmFtcy5hdmROYW1lIC0gQVZEIG5hbWUgdG8gYXV0by1zdGFydCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQuXG4gKiBAcGFyYW0gcGFyYW1zLmRldmljZUlkIC0gRGV2aWNlIFVESUQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgZW11bGF0b3IgY2hpbGQgcHJvY2VzcyBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gIGlmIChhd2FpdCBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZCkpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFhdmROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgaXMgbm90IGNvbm5lY3RlZC4gU3RhcnQgdGhlIGVtdWxhdG9yIGJlZm9yZSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzLGBcbiAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHN0YXJ0RW11bGF0b3IoYXZkTmFtZSk7XG4gIGF3YWl0IHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgcmV0dXJuIGVtdWxhdG9yUHJvY2Vzcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcnkuXG4gKlxuICogVXNlcyBgQU5EUk9JRF9IT01FYCBvciBgQU5EUk9JRF9TREtfUk9PVGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgc2V0LFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYGVtdWxhdG9yYCAoYXNzdW1lcyBpdCdzIGluIFBBVEgpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBlbXVsYXRvciBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gIGlmICghc2RrUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBrZXkgZXZlbnQgdG8gYSBkZXZpY2UgdmlhIEFEQi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyB3YXJuaW5nc1xuICogaW5zdGVhZCBvZiB0aHJvd2luZywgc2luY2Uga2V5IGV2ZW50cyBhcmUgYmVzdC1lZmZvcnQgKGUuZy4sIHRoZSBzY3JlZW5cbiAqIG1heSBhbHJlYWR5IGJlIG9uKS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ga2V5Q29kZSAtIFRoZSBBbmRyb2lkIGtleWNvZGUgdG8gc2VuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBsb2cgbWVzc2FnZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBleGVjRmlsZShcbiAgICAgICdhZGInLFxuICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgbG9nKFxuICAgICAgICAgICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlciBhbmQgZW11bGF0b3IgaW4gcGFyYWxsZWwgd2hlbiBib3RoIG5lZWQgYXV0by1zdGFydGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gQ29uZmlndXJhdGlvbiBmb3IgQXBwaXVtIGFuZCBlbXVsYXRvciBzdGFydHVwLlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc11gLCBlaXRoZXIgb2Ygd2hpY2ggbWF5IGJlIGB1bmRlZmluZWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWQsIHBvcnQsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgfVxuXG4gIGNvbnN0IFssIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgPyB3YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWQgfSlcbiAgXSk7XG5cbiAgcmV0dXJuIFthcHBpdW1Qcm9jZXNzLCBlbXVsYXRvclByb2Nlc3NdO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBcHBpdW0gc2VydmVyIGFzIGEgZGV0YWNoZWQgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gc3RhcnQgQXBwaXVtIG9uLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFNwYXducyBhbiBBbmRyb2lkIGVtdWxhdG9yIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBuYW1lIHRvIHN0YXJ0LlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gLWF2ZCAke2F2ZE5hbWV9IC1uby1zbmFwc2hvdC1zYXZlYCk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIFsnLWF2ZCcsIGF2ZE5hbWUsICctbm8tc25hcHNob3Qtc2F2ZSddLCB7XG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ2lnbm9yZScsICdpZ25vcmUnXVxuICB9KTtcblxuICBjaGlsZC51bnJlZigpO1xuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICogUG9sbHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdW50aWwgaXQgcmVzcG9uZHMgdG8gYC9zdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICB9bXMpLi4uYFxuICApO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBwb2xsaW5nIGBzeXMuYm9vdF9jb21wbGV0ZWRgLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwYXJhbSBkZWFkbGluZSAtIEFic29sdXRlIHRpbWVzdGFtcCBkZWFkbGluZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gIGxvZyhcbiAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFBvbGxzIGBhZGIgZGV2aWNlc2AgdW50aWwgdGhlIHNwZWNpZmllZCBkZXZpY2UgYXBwZWFycyBpbiB0aGUgYGRldmljZWAgc3RhdGUuXG4gKlxuICogQWxzbyB3YWl0cyBmb3IgdGhlIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyBieSBjaGVja2luZyBgc3lzLmJvb3RfY29tcGxldGVkYC5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gd2FpdCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coXG4gICAgYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgU3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgfW1zKS4uLmBcbiAgKTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKGF3YWl0IGNoZWNrRGV2aWNlQ29ubmVjdGVkKGRldmljZUlkKSkge1xuICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIERldmljZSAke2RldmljZUlkfSBhcHBlYXJlZCBpbiBBREIsIHdhaXRpbmcgZm9yIGJvb3QgdG8gY29tcGxldGUuLi5gKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JCb290KGRldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICBhd2FpdCB3YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRW11bGF0b3IgZGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBkaWQgbm90IGFwcGVhciB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKipcbiAqIFdha2VzIHRoZSBlbXVsYXRvciBzY3JlZW4gYW5kIGRpc21pc3NlcyB0aGUgbG9jayBzY3JlZW4uXG4gKlxuICogQWZ0ZXIgYm9vdCwgdGhlIGVtdWxhdG9yIHNjcmVlbiBtYXkgYmUgb2ZmLiBTZW5kcyBgS0VZQ09ERV9XQUtFVVBgIHRvIHR1cm5cbiAqIG9uIHRoZSBkaXNwbGF5IGFuZCBgS0VZQ09ERV9NRU5VYCB0byBkaXNtaXNzIHRoZSBsb2NrIHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICBhd2FpdCBzZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgYXdhaXQgc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxjQUFjO0FBUXZCLFNBQVMsV0FBVztBQUNwQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsV0FBVztBQUNuQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGtEQUFrRDtBQUN4RCxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtDQUFrQztBQUN4QyxNQUFNLDhDQUE4QztBQUNwRCxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSx3Q0FBd0M7QUFpQzlDLElBQUk7QUFRSixlQUFzQiwyQkFBMkIsU0FBZ0U7QUFDL0csTUFBSSxDQUFDLFdBQVcsUUFBUSxTQUFTLGdCQUFnQjtBQUMvQyxRQUFJLG9GQUFvRjtBQUN4RixXQUFPLElBQUksb0JBQW9CO0FBQUEsRUFD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QUEsRUFDeEc7QUFDRjtBQVFBLGVBQWUsWUFBWSxVQUFrQixVQUFpQztBQUM1RSxRQUFNLGNBQWMsS0FBSyxJQUFJLEdBQUcsV0FBVyxLQUFLLElBQUksQ0FBQztBQUNyRDtBQUFBLElBQ0UsMENBQTBDLFFBQVEsa0NBQWtDLE9BQU8sV0FBVyxDQUFDLGFBQ3JHLE9BQU8sMkNBQTJDLENBQ3BEO0FBQUEsRUFDRjtBQUVBLFNBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFNLFdBQVcsTUFBTSxJQUFJLFFBQWlCLENBQUMsWUFBWTtBQUN2RDtBQUFBLFFBQ0U7QUFBQSxRQUNBLENBQUMsTUFBTSxVQUFVLFNBQVMsV0FBVyxvQkFBb0I7QUFBQSxRQUN6RCxFQUFFLFNBQVMseUNBQXlDO0FBQUEsUUFDcEQsQ0FBQyxRQUFRLFdBQVc7QUFDbEIsa0JBQVEsT0FBTyxLQUFLLE1BQU0sR0FBRztBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUVELFFBQUksVUFBVTtBQUNaLFVBQUksOEJBQThCLFFBQVEsa0JBQWtCO0FBQzVEO0FBQUEsSUFDRjtBQUVBLFVBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3QixpQkFBVyxTQUFTLDJDQUEyQztBQUFBLElBQ2pFLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxJQUFJO0FBQUEsSUFDUixXQUFXLFFBQVEsaURBQWlELE9BQU8scUNBQXFDLENBQUM7QUFBQSxFQUNuSDtBQUNGO0FBU0EsZUFBZSxjQUFjLFVBQWlDO0FBQzVEO0FBQUEsSUFDRSwwQ0FBMEMsUUFBUSwrQkFBK0IsT0FBTyxxQ0FBcUMsQ0FBQyxhQUM1SCxPQUFPLDJDQUEyQyxDQUNwRDtBQUFBLEVBQ0Y7QUFDQSxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFFOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUksTUFBTSxxQkFBcUIsUUFBUSxHQUFHO0FBQ3hDLFVBQUksOEJBQThCLFFBQVEsbURBQW1EO0FBQzdGLFlBQU0sWUFBWSxVQUFVLFFBQVE7QUFDcEMsWUFBTSxXQUFXLFFBQVE7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLGlCQUFXLFNBQVMsMkNBQTJDO0FBQUEsSUFDakUsQ0FBQztBQUFBLEVBQ0g7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLG9CQUFvQixRQUFRLDJCQUEyQixPQUFPLHFDQUFxQyxDQUFDO0FBQUEsRUFDdEc7QUFDRjtBQVVBLGVBQWUsV0FBVyxVQUFpQztBQUN6RCxNQUFJLCtDQUErQyxRQUFRLEtBQUs7QUFFaEUsUUFBTSxhQUFhLFVBQVUsZ0JBQWdCLGFBQWE7QUFDMUQsUUFBTSxhQUFhLFVBQVUsY0FBYyxxQkFBcUI7QUFFaEUsTUFBSSxzREFBc0QsUUFBUSxHQUFHO0FBQ3ZFOyIsCiAgIm5hbWVzIjogWyJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiXQp9Cg==
@@ -17,6 +17,14 @@ export interface ObsidianTransport {
17
17
  * Disposes of transport resources (e.g. WebSocket connections, Appium sessions).
18
18
  */
19
19
  dispose?(): Promise<void>;
20
+ /**
21
+ * Synchronous disposal for use in `process.on('exit')` handlers where
22
+ * async work is not possible.
23
+ *
24
+ * Implementations should perform only synchronous cleanup here (e.g. killing
25
+ * child processes). Async operations like unregistering vaults are skipped.
26
+ */
27
+ disposeSync?(): void;
20
28
  /**
21
29
  * Evaluates a JavaScript expression string inside Obsidian and returns the
22
30
  * raw string result.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",