obsidian-integration-testing 3.0.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "3.0.3";
24
+ const LIBRARY_VERSION = false ? "dev" : "3.0.5";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -45,8 +45,8 @@ var import_transport_desktop_cli = require("./transport-desktop-cli.cjs");
45
45
  const APP_PACKAGE = "md.obsidian";
46
46
  const APP_ACTIVITY = `${APP_PACKAGE}.MainActivity`;
47
47
  const ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS = 5e3;
48
- const APPIUM_CONNECTION_RETRY_COUNT = 1;
49
- const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 6e4;
48
+ const APPIUM_CONNECTION_RETRY_COUNT = 3;
49
+ const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 18e4;
50
50
  const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
51
51
  const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
52
52
  const APPIUM_START_TIMEOUT_IN_MILLISECONDS = 6e4;
@@ -57,8 +57,8 @@ const EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
57
57
  const EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS = 12e4;
58
58
  const KEYCODE_MENU = 82;
59
59
  const KEYCODE_WAKEUP = 224;
60
- const SERVER_INSTALL_TIMEOUT_IN_MILLISECONDS = 6e4;
61
- const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 6e4;
60
+ const SERVER_INSTALL_TIMEOUT_IN_MILLISECONDS = 12e4;
61
+ const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 12e4;
62
62
  let cachedTransport;
63
63
  class AppiumTransportFactory {
64
64
  type;
@@ -72,7 +72,7 @@ class AppiumTransportFactory {
72
72
  * @returns A configured Appium transport.
73
73
  */
74
74
  async create(options) {
75
- this.log(`Creating AppiumTransport (url=${options.appiumUrl}, device=${options.deviceId})`);
75
+ this.log(`Creating AppiumTransport (url=${options.appiumUrl}, avd=${options.avdName})`);
76
76
  const url = new URL(options.appiumUrl);
77
77
  const port = Number(url.port);
78
78
  if (isNaN(port)) {
@@ -93,15 +93,17 @@ class AppiumTransportFactory {
93
93
  }
94
94
  };
95
95
  var killAutoStartedProcesses = killAutoStartedProcesses2;
96
- [appiumProcess, emulatorProcess] = await this.startAppiumAndEmulator({
96
+ const result = await this.startAppiumAndEmulator({
97
97
  appiumUrl: url,
98
98
  avdName: options.avdName,
99
- deviceId: options.deviceId,
100
99
  port,
101
100
  shouldAutoStartAppium: options.shouldAutoStartAppium
102
101
  });
102
+ appiumProcess = result.appiumProcess;
103
+ emulatorProcess = result.emulatorProcess;
104
+ const actualDeviceId = result.actualDeviceId;
103
105
  this.log(
104
- `Connecting to Appium (device=${options.deviceId}, app=${appId}, retryTimeout: ${String(APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
106
+ `Connecting to Appium (device=${actualDeviceId}, app=${appId}, retryTimeout: ${String(APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
105
107
  );
106
108
  const browser = await (0, import_webdriverio.remote)({
107
109
  capabilities: {
@@ -114,7 +116,7 @@ class AppiumTransportFactory {
114
116
  "appium:settings": {
115
117
  "appium:chromedriverAutodownload": true
116
118
  },
117
- "appium:udid": options.deviceId,
119
+ "appium:udid": actualDeviceId,
118
120
  "appium:uiautomator2ServerInstallTimeout": SERVER_INSTALL_TIMEOUT_IN_MILLISECONDS,
119
121
  "appium:uiautomator2ServerLaunchTimeout": SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS,
120
122
  "platformName": "Android"
@@ -130,7 +132,7 @@ class AppiumTransportFactory {
130
132
  const appiumTransport = new import_transport_appium.AppiumTransport({
131
133
  appId,
132
134
  browser,
133
- deviceId: options.deviceId,
135
+ deviceId: actualDeviceId,
134
136
  platform: "android",
135
137
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath },
136
138
  ...options.webviewTimeoutInMilliseconds !== void 0 && { webviewTimeoutInMilliseconds: options.webviewTimeoutInMilliseconds }
@@ -184,7 +186,15 @@ class AppiumTransportFactory {
184
186
  });
185
187
  });
186
188
  }
187
- async checkDeviceConnected(deviceId) {
189
+ async ensureDeviceConnected(avdName) {
190
+ const deviceIdsBefore = await this.getConnectedDeviceIds();
191
+ this.log(`Starting emulator AVD "${avdName}"... (existing devices: [${deviceIdsBefore.join(", ")}])`);
192
+ const emulatorProcess = this.startEmulator(avdName);
193
+ const actualDeviceId = await this.waitForNewDevice(deviceIdsBefore);
194
+ this.log(`Emulator "${avdName}" started, device ${actualDeviceId} is connected.`);
195
+ return { actualDeviceId, emulatorProcess };
196
+ }
197
+ async getConnectedDeviceIds() {
188
198
  const output = await new Promise((resolve, reject) => {
189
199
  (0, import_node_child_process.execFile)("adb", ["devices"], { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS }, (error, stdout, stderr) => {
190
200
  if (error) {
@@ -198,25 +208,7 @@ class AppiumTransportFactory {
198
208
  });
199
209
  });
200
210
  const lines = output.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
201
- const deviceLine = lines.find((line) => line.startsWith(deviceId));
202
- return deviceLine?.includes(" device") ?? false;
203
- }
204
- async ensureDeviceConnected(avdName, deviceId) {
205
- this.log(`Checking device ${deviceId} is connected via ADB...`);
206
- if (await this.checkDeviceConnected(deviceId)) {
207
- this.log(`Device ${deviceId} is connected.`);
208
- return void 0;
209
- }
210
- if (!avdName) {
211
- throw new Error(
212
- `Device "${deviceId}" is not connected. Start the emulator before running integration tests, or set avdName in transport options to auto-start it.`
213
- );
214
- }
215
- this.log(`Device ${deviceId} not found, starting emulator AVD "${avdName}"...`);
216
- const emulatorProcess = this.startEmulator(avdName);
217
- await this.waitForDevice(deviceId);
218
- this.log(`Emulator "${avdName}" started, device ${deviceId} is connected.`);
219
- return emulatorProcess;
211
+ return lines.filter((line) => line.includes(" device")).map((line) => line.split(" ")[0] ?? "");
220
212
  }
221
213
  log(message) {
222
214
  (0, import_log.log)(`[transport-factory:${this.type}] ${message}`);
@@ -248,7 +240,7 @@ class AppiumTransportFactory {
248
240
  });
249
241
  }
250
242
  async startAppiumAndEmulator(params) {
251
- const { appiumUrl, avdName, deviceId, port, shouldAutoStartAppium } = params;
243
+ const { appiumUrl, avdName, port, shouldAutoStartAppium } = params;
252
244
  let needsAppiumStart = false;
253
245
  this.log(`Checking Appium server at ${appiumUrl.href}...`);
254
246
  try {
@@ -265,13 +257,25 @@ class AppiumTransportFactory {
265
257
  this.log(`Appium not reachable, auto-starting on port ${String(port)}...`);
266
258
  appiumProcess = this.startAppiumServer(port);
267
259
  }
268
- const [, emulatorProcess] = await Promise.all([
269
- needsAppiumStart ? this.waitForAppiumReady(appiumUrl).then(() => {
270
- this.log("Auto-started Appium server is ready.");
271
- }) : Promise.resolve(),
272
- this.ensureDeviceConnected(avdName, deviceId)
273
- ]);
274
- return [appiumProcess, emulatorProcess];
260
+ try {
261
+ const [, deviceResult] = await Promise.all([
262
+ needsAppiumStart ? this.waitForAppiumReady(appiumUrl).then(() => {
263
+ this.log("Auto-started Appium server is ready.");
264
+ }) : Promise.resolve(),
265
+ this.ensureDeviceConnected(avdName)
266
+ ]);
267
+ return {
268
+ actualDeviceId: deviceResult.actualDeviceId,
269
+ appiumProcess,
270
+ emulatorProcess: deviceResult.emulatorProcess
271
+ };
272
+ } catch (error) {
273
+ if (appiumProcess) {
274
+ killProcessTree(appiumProcess);
275
+ this.log("Killed auto-started Appium server after startup failure.");
276
+ }
277
+ throw error;
278
+ }
275
279
  }
276
280
  startAppiumServer(port) {
277
281
  const child = (0, import_node_child_process.spawn)(`npx appium --log-timestamp --port ${String(port)}`, {
@@ -340,24 +344,27 @@ class AppiumTransportFactory {
340
344
  `Device "${deviceId}" connected but did not finish booting within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
341
345
  );
342
346
  }
343
- async waitForDevice(deviceId) {
347
+ async waitForNewDevice(deviceIdsBefore) {
344
348
  this.log(
345
- `Waiting for device ${deviceId} to appear in ADB (timeout: ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
349
+ `Waiting for a new device to appear in ADB (timeout: ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
346
350
  );
347
351
  const deadline = Date.now() + EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS;
348
352
  while (Date.now() < deadline) {
349
- if (await this.checkDeviceConnected(deviceId)) {
350
- this.log(`Device ${deviceId} appeared in ADB, waiting for boot to complete...`);
351
- await this.waitForBoot(deviceId, deadline);
352
- await this.wakeScreen(deviceId);
353
- return;
353
+ const currentIds = await this.getConnectedDeviceIds();
354
+ const newIds = currentIds.filter((id) => !deviceIdsBefore.includes(id));
355
+ if (newIds.length > 0) {
356
+ const actualDeviceId = newIds[0] ?? "";
357
+ this.log(`Device ${actualDeviceId} appeared in ADB, waiting for boot to complete...`);
358
+ await this.waitForBoot(actualDeviceId, deadline);
359
+ await this.wakeScreen(actualDeviceId);
360
+ return actualDeviceId;
354
361
  }
355
362
  await new Promise((resolve) => {
356
363
  setTimeout(resolve, EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS);
357
364
  });
358
365
  }
359
366
  throw new Error(
360
- `Emulator device "${deviceId}" did not appear within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
367
+ `No new emulator device appeared within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
361
368
  );
362
369
  }
363
370
  async wakeScreen(deviceId) {
@@ -413,4 +420,4 @@ function killProcessTree(child) {
413
420
  createTransportFromOptions,
414
421
  getOrCreateTransport
415
422
  });
416
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIGV4ZWNGaWxlU3luYyxcbiAgc3Bhd25cbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jbGknO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zIHtcbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIGF1dG8tc3RhcnQgaWYgdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkLiAqL1xuICBhdmROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBEZXZpY2UgVURJRC4gKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW11bGF0b3JQcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBkZXZpY2VJZDogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtOiBvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKFxuICAgICAgICBgQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke29wdGlvbnMuZGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCByZXRyaWVzOiAke1xuICAgICAgICAgIFN0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVClcbiAgICAgICAgfSkuLi5gXG4gICAgICApO1xuICAgICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHJlbW90ZSh7XG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICdhcHBpdW06YXBwQWN0aXZpdHknOiBBUFBfQUNUSVZJVFksXG4gICAgICAgICAgJ2FwcGl1bTphcHBQYWNrYWdlJzogYXBwSWQsXG4gICAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICAgJ2FwcGl1bTphdXRvbWF0aW9uTmFtZSc6ICdVaUF1dG9tYXRvcjInLFxuICAgICAgICAgICdhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXQnOiBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICAgJ2FwcGl1bTpzZXR0aW5ncyc6IHtcbiAgICAgICAgICAgICdhcHBpdW06Y2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkJzogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gYXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2UuYmluZChhcHBpdW1UcmFuc3BvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRyYW5zcG9ydDtcblxuICAgICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgICAvLyBDYW5ub3QgdXNlIHRoaXMubG9nIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gXHUyMDE0IGB0aGlzYCBpcyBub3QgY2FwdHVyZWQuXG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke29wdGlvbnMudHlwZX1dIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShlbXVsYXRvclByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBkZXZpY2VMaW5lID0gbGluZXMuZmluZCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKGRldmljZUlkKSk7XG4gICAgcmV0dXJuIGRldmljZUxpbmU/LmluY2x1ZGVzKCdcXHRkZXZpY2UnKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKGF2ZE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tEZXZpY2VDb25uZWN0ZWQoZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFhdmROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGlzIG5vdCBjb25uZWN0ZWQuIFN0YXJ0IHRoZSBlbXVsYXRvciBiZWZvcmUgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cyxgXG4gICAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3JQcm9jZXNzID0gdGhpcy5zdGFydEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZShkZXZpY2VJZCk7XG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHthdmROYW1lfVwiIHN0YXJ0ZWQsIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQuYCk7XG4gICAgcmV0dXJuIGVtdWxhdG9yUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICAgIGNvbnN0IHsgYXBwaXVtVXJsLCBhdmROYW1lLCBkZXZpY2VJZCwgcG9ydCwgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICB9KVxuICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoYXZkTmFtZSwgZGV2aWNlSWQpXG4gICAgXSk7XG5cbiAgICByZXR1cm4gW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc107XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZyk6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSB0aGlzLnJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEVtdWxhdG9yQXJncyhhdmROYW1lKTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBhcmdzLCB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ11cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7XG4gICAgICAgIFN0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgICB9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCBkZWFkbGluZSAtIERhdGUubm93KCkpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIGRldmljZSAke2RldmljZUlkfSB0byBmaW5pc2ggYm9vdGluZyAocmVtYWluaW5nOiAke1N0cmluZyhyZW1haW5pbmdNcyl9bXMsIHBvbGw6ICR7XG4gICAgICAgIFN0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKVxuICAgICAgfW1zKS4uLmBcbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNCb290ZWQpIHtcbiAgICAgICAgdGhpcy5sb2coYERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgY29ubmVjdGVkIGJ1dCBkaWQgbm90IGZpbmlzaCBib290aW5nIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tEZXZpY2VDb25uZWN0ZWQoZGV2aWNlSWQpKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoZGV2aWNlSWQsIGRlYWRsaW5lKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVtdWxhdG9yIGRldmljZSBcIiR7ZGV2aWNlSWR9XCIgZGlkIG5vdCBhcHBlYXIgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBBIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBjb25zdCB0eXBlID0gb3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuXG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jbGknKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0eXBlfV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydGApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENsaVRyYW5zcG9ydCgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3R5cGV9XSBDcmVhdGluZyBEZXNrdG9wQ2RwVHJhbnNwb3J0IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQgPz8gQ0RQX0RFRkFVTFRfUE9SVCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICAuLi4ob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBQb3J0OiBvcHRpb25zLnBvcnQgfSksXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSh0eXBlKTtcbiAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWNoZWQgdHJhbnNwb3J0IGluc3RhbmNlLCBjcmVhdGluZyBvbmUgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9uc1xuICogaWYgbm90IGFscmVhZHkgY2FjaGVkLlxuICpcbiAqIFRoZSB0cmFuc3BvcnQgaXMgY2FjaGVkIHBlciB3b3JrZXIgcHJvY2VzcyBzbyBXZWJTb2NrZXQvQXBwaXVtIHNlc3Npb25zXG4gKiBhcmUgcmV1c2VkIGFjcm9zcyBjYWxscyB3aXRoaW4gdGhlIHNhbWUgdGVzdCB3b3JrZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgY3JlYXRlZCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAoY2FjaGVkVHJhbnNwb3J0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zcG9ydDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBTaW5nbGUtdGhyZWFkZWQgd29ya2VyOyBubyBjb25jdXJyZW50IHdyaXRlcy5cbiAgY2FjaGVkVHJhbnNwb3J0ID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEtpbGxzIGEgY2hpbGQgcHJvY2VzcyBhbmQgaXRzIGVudGlyZSBwcm9jZXNzIHRyZWUuXG4gKlxuICogT24gV2luZG93cywgYGNoaWxkLmtpbGwoKWAgb25seSBzZW5kcyBTSUdURVJNIHRvIHRoZSBkaXJlY3QgcHJvY2VzcyxcbiAqIGxlYXZpbmcgc3Bhd25lZCBncmFuZGNoaWxkcmVuIChlLmcuIFFFTVUsIFVpQXV0b21hdG9yKSBhbGl2ZS5cbiAqIGB0YXNra2lsbCAvRiAvVCAvUElEYCBmb3JjZWZ1bGx5IHRlcm1pbmF0ZXMgdGhlIGVudGlyZSB0cmVlLlxuICpcbiAqIEBwYXJhbSBjaGlsZCAtIFRoZSBjaGlsZCBwcm9jZXNzIHRvIGtpbGwuXG4gKi9cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzVHJlZShjaGlsZDogQ2hpbGRQcm9jZXNzKTogdm9pZCB7XG4gIGlmIChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNGaWxlU3luYygndGFza2tpbGwnLCBbJy9GJywgJy9UJywgJy9QSUQnLCBTdHJpbmcoY2hpbGQucGlkKV0sIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbdHJhbnNwb3J0LWZhY3RvcnldIHRhc2traWxsIGZvciBQSUQgJHtTdHJpbmcoY2hpbGQucGlkKX0gZmFpbGVkIChtYXkgaGF2ZSBhbHJlYWR5IGV4aXRlZCk6ICR7XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcidcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLGdDQUlPO0FBQ1AsdUJBQWlCO0FBQ2pCLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFDcEIseUJBQXVCO0FBUXZCLDJCQUFrQztBQUNsQyxpQkFBb0I7QUFDcEIsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyxtQ0FBb0M7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSxlQUFlO0FBQ3JCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0seUNBQXlDO0FB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QUFBLE1BQzFELEdBQUksUUFBUSxpQ0FBaUMsVUFBYSxFQUFFLDhCQUE4QixRQUFRLDZCQUE2QjtBQUFBLElBQ2pJLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxVQUFVLElBQUksdUJBQXVCLElBQUk7QUFDL0MsU0FBTyxRQUFRLE9BQU8sT0FBTztBQUMvQjtBQVlBLGVBQXNCLHFCQUFxQixTQUFnRTtBQUN6RyxNQUFJLGlCQUFpQjtBQUNuQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxNQUFNLDJCQUEyQixPQUFPO0FBRXZELG9CQUFrQjtBQUNsQixTQUFPO0FBQ1Q7QUFXQSxTQUFTLGdCQUFnQixPQUEyQjtBQUNsRCxNQUFJLE1BQU0sUUFBUSxRQUFXO0FBQzNCO0FBQUEsRUFDRjtBQUVBLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFFBQUk7QUFDRixrREFBYSxZQUFZLENBQUMsTUFBTSxNQUFNLFFBQVEsT0FBTyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFBQSxJQUN2RixTQUFTLE9BQWdCO0FBQ3ZCO0FBQUEsUUFDRSx3Q0FBd0MsT0FBTyxNQUFNLEdBQUcsQ0FBQyxzQ0FDdkQsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLGVBQzNDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGLE9BQU87QUFDTCxVQUFNLEtBQUssU0FBUztBQUFBLEVBQ3RCO0FBQ0Y7IiwKICAibmFtZXMiOiBbImtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcyIsICJodHRwIiwgInByb2Nlc3MiXQp9Cg==
423
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIGV4ZWNGaWxlU3luYyxcbiAgc3Bhd25cbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkuY2pzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwMDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDAwMDtcbmNvbnN0IENEUF9ERUZBVUxUX1BPUlQgPSA4MzE1O1xuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDtcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2xpJztcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBVUkwuICovXG4gIGFwcGl1bVVybDogVVJMO1xuXG4gIC8qKiBBVkQgbmFtZSB0byBzdGFydC4gKi9cbiAgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHtcbiAgLyoqIFRoZSBhY3R1YWwgZGV2aWNlIElEIHRoYXQgaXMgY29ubmVjdGVkIChtYXkgZGlmZmVyIGZyb20gdGhlIHJlcXVlc3RlZCBvbmUpLiAqL1xuICBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBhdmQ9JHtvcHRpb25zLmF2ZE5hbWV9KWApO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHJldHJpZXM6ICR7XG4gICAgICAgICAgU3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKVxuICAgICAgICB9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnNldHRpbmdzJzoge1xuICAgICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn0gZGlkIG5vdCByZXNwb25kIHdpdGhpbiAke1N0cmluZyhBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKGF2ZE5hbWU6IHN0cmluZyk6IFByb21pc2U8RW5zdXJlRGV2aWNlQ29ubmVjdGVkUmVzdWx0PiB7XG4gICAgY29uc3QgZGV2aWNlSWRzQmVmb3JlID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICB0aGlzLmxvZyhgU3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uIChleGlzdGluZyBkZXZpY2VzOiBbJHtkZXZpY2VJZHNCZWZvcmUuam9pbignLCAnKX1dKWApO1xuICAgIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lKTtcbiAgICBjb25zdCBhY3R1YWxEZXZpY2VJZCA9IGF3YWl0IHRoaXMud2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmUpO1xuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiIGRldmljZXMnOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHRoaXMubG9nKGBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIHJldHVybiBsaW5lc1xuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygnXFx0ZGV2aWNlJykpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNwbGl0KCdcXHQnKVswXSA/PyAnJyk7XG4gIH1cblxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3RoaXMudHlwZX1dICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2RrUm9vdCA9IHByb2Nlc3MuZW52WydBTkRST0lEX0hPTUUnXSA/PyBwcm9jZXNzLmVudlsnQU5EUk9JRF9TREtfUk9PVCddO1xuICAgIGlmICghc2RrUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGZpbmQgQW5kcm9pZCBlbXVsYXRvcjogbmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBqb2luKHNka1Jvb3QsICdlbXVsYXRvcicsICdlbXVsYXRvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5RXZlbnQoZGV2aWNlSWQ6IHN0cmluZywga2V5Q29kZTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgICAgYFdhcm5pbmc6IGZhaWxlZCB0byAke2Rlc2NyaXB0aW9ufSAoa2V5ZXZlbnQgJHtTdHJpbmcoa2V5Q29kZSl9KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcihwYXJhbXM6IFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgcG9ydCwgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgWywgZGV2aWNlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICAgID8gdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICAgIHRoaXMuZW5zdXJlRGV2aWNlQ29ubmVjdGVkKGF2ZE5hbWUpXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIpOiBDaGlsZFByb2Nlc3Mge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYG5weCBhcHBpdW0gLS1sb2ctdGltZXN0YW1wIC0tcG9ydCAke1N0cmluZyhwb3J0KX1gLCB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddXG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBhcmdzID0gYnVpbGRFbXVsYXRvckFyZ3MoYXZkTmFtZSk7XG4gICAgdGhpcy5sb2coYFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihlbXVsYXRvckJpbmFyeSwgYXJncywge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddXG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcGl1bVJlYWR5KHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKVxuICAgICAgfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYm9vdCBjb21wbGV0ZWQuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JOZXdEZXZpY2UoZGV2aWNlSWRzQmVmb3JlOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FrZVNjcmVlbihhY3R1YWxEZXZpY2VJZCk7XG4gICAgICAgIHJldHVybiBhY3R1YWxEZXZpY2VJZDtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBuZXcgZW11bGF0b3IgZGV2aWNlIGFwcGVhcmVkIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FrZVNjcmVlbihkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYFdha2luZyBzY3JlZW4gb24gZGV2aWNlICR7ZGV2aWNlSWR9Li4uYCk7XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9XQUtFVVAsICd3YWtlIHNjcmVlbicpO1xuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgICB0aGlzLmxvZyhgU2NyZWVuIHdha2UgY29tcGxldGUgb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcblxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2xpJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dHlwZX1dIENyZWF0aW5nIERlc2t0b3BDbGlUcmFuc3BvcnRgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0eXBlfV0gQ3JlYXRpbmcgRGVza3RvcENkcFRyYW5zcG9ydCAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0ID8/IENEUF9ERUZBVUxUX1BPUlQpfSlgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgICAgLi4uKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgICAgLi4uKG9wdGlvbnMucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwUG9ydDogb3B0aW9ucy5wb3J0IH0pLFxuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkodHlwZSk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBLaWxscyBhIGNoaWxkIHByb2Nlc3MgYW5kIGl0cyBlbnRpcmUgcHJvY2VzcyB0cmVlLlxuICpcbiAqIE9uIFdpbmRvd3MsIGBjaGlsZC5raWxsKClgIG9ubHkgc2VuZHMgU0lHVEVSTSB0byB0aGUgZGlyZWN0IHByb2Nlc3MsXG4gKiBsZWF2aW5nIHNwYXduZWQgZ3JhbmRjaGlsZHJlbiAoZS5nLiBRRU1VLCBVaUF1dG9tYXRvcikgYWxpdmUuXG4gKiBgdGFza2tpbGwgL0YgL1QgL1BJRGAgZm9yY2VmdWxseSB0ZXJtaW5hdGVzIHRoZSBlbnRpcmUgdHJlZS5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgLSBUaGUgY2hpbGQgcHJvY2VzcyB0byBraWxsLlxuICovXG5mdW5jdGlvbiBraWxsUHJvY2Vzc1RyZWUoY2hpbGQ6IENoaWxkUHJvY2Vzcyk6IHZvaWQge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ3Rhc2traWxsJywgWycvRicsICcvVCcsICcvUElEJywgU3RyaW5nKGNoaWxkLnBpZCldLCB7IHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSB0YXNra2lsbCBmb3IgUElEICR7U3RyaW5nKGNoaWxkLnBpZCl9IGZhaWxlZCAobWF5IGhhdmUgYWxyZWFkeSBleGl0ZWQpOiAke1xuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjaGlsZC5raWxsKCdTSUdLSUxMJyk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FJTztBQUNQLHVCQUFpQjtBQUNqQix1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLHlCQUF1QjtBQVF2QiwyQkFBa0M7QUFDbEMsaUJBQW9CO0FBQ3BCLDhCQUFnQztBQUNoQyxtQ0FBb0M7QUFDcEMsbUNBQW9DO0FBRXBDLE1BQU0sY0FBYztBQUNwQixNQUFNLGVBQWUsR0FBRyxXQUFXO0FBQ25DLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sa0RBQWtEO0FBQ3hELE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0sNkNBQTZDO0FBQ25ELE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sa0NBQWtDO0FBQ3hDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sOENBQThDO0FBQ3BELE1BQU0sd0NBQXdDO0FBQzlDLE1BQU0sZUFBZTtB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
@@ -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_options_exports = {};
16
16
  module.exports = __toCommonJS(transport_options_exports);
17
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gc2VydmVyIFVSTCAoZS5nLiBgJ2h0dHA6Ly9sb2NhbGhvc3Q6NDcyMydgKS5cbiAgICovXG4gIGFwcGl1bVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQW5kcm9pZCBBVkQgKEFuZHJvaWQgVmlydHVhbCBEZXZpY2UpIG5hbWUgdG8gYXV0by1zdGFydCBpZlxuICAgKiB0aGUgZGV2aWNlIHNwZWNpZmllZCBieSB7QGxpbmsgZGV2aWNlSWR9IGlzIG5vdCBjb25uZWN0ZWQuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQgYW5kIHRoZSBkZXZpY2UgaXMgbm90IGZvdW5kIHZpYSBgYWRiIGRldmljZXNgLCB0aGVcbiAgICogdHJhbnNwb3J0IGZhY3RvcnkgbGF1bmNoZXMgYGVtdWxhdG9yIC1hdmQgPGF2ZE5hbWU+YCBhcyBhIGJhY2tncm91bmRcbiAgICogcHJvY2VzcyBhbmQgcG9sbHMgdW50aWwgdGhlIGRldmljZSBhcHBlYXJzLiBUaGUgZW11bGF0b3IgaXMga2lsbGVkXG4gICAqIG9uIHRyYW5zcG9ydCBkaXNwb3NhbC5cbiAgICpcbiAgICogUnVuIGBlbXVsYXRvciAtbGlzdC1hdmRzYCB0byBzZWUgYXZhaWxhYmxlIEFWRCBuYW1lcy5cbiAgICovXG4gIGF2ZE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIEFwcGl1bSBzZXJ2ZXIgaWYgaXQgaXMgbm90IHJlYWNoYWJsZS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHNwYXducyBgbnB4IGFwcGl1bWBcbiAgICogYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgd2hlbiB0aGUgcHJlZmxpZ2h0IGNoZWNrIGZhaWxzLCBhbmQga2lsbHMgaXRcbiAgICogb24gdHJhbnNwb3J0IGRpc3Bvc2FsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgdHlwZTogJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIG9uIHRoZSBkZXZpY2Ugd2hlcmUgT2JzaWRpYW4gc3RvcmVzIHZhdWx0cy5cbiAgICpcbiAgICogRGVmYXVsdHM6XG4gICAqIC0gQW5kcm9pZDogYC9zZGNhcmQvRG9jdW1lbnRzL2BcbiAgICogLSBpT1M6IGBAbWQub2JzaWRpYW46ZG9jdW1lbnRzL2BcbiAgICovXG4gIHZhdWx0QmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgV2ViVmlldyBjb250ZXh0IHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIE9uIHNsb3cgZW11bGF0b3JzLCB0aGUgQ2hyb21lRHJpdmVyIHByb3h5IHRoYXQgaGFuZGxlcyBXZWJWaWV3IGNvbW1hbmRzXG4gICAqIG1heSBub3QgYmUgcmVhZHkgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIHN0YXJ0cy4gVGhpcyB0aW1lb3V0XG4gICAqIGNvbnRyb2xzIGhvdyBsb25nIHRvIHBvbGwgYmVmb3JlIGdpdmluZyB1cC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgb3B0aW9ucyBmb3IgZGVza3RvcCB0ZXN0aW5nIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gMzAwMDBcbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydC5cbiAgICogRGVmYXVsdHMgdG8gODMxNVxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICB0eXBlOiAnb2JzaWRpYW4tY2RwJztcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgb3B0aW9ucyBmb3IgZGVza3RvcCB0ZXN0aW5nIHZpYSB0aGUgT2JzaWRpYW4gQ0xJLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHJhbnNwb3J0IHdoZW4gbm8gYG9ic2lkaWFuVHJhbnNwb3J0YCBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuQ2xpVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQgZm9yIHRoZSB0cmFuc3BvcnQgdHlwZS5cbiAgICovXG4gIHR5cGU6ICdvYnNpZGlhbi1jbGknO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gb2YgYWxsIHN1cHBvcnRlZCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVXNlZCBpbiB2aXRlc3QgYGVudmlyb25tZW50T3B0aW9ucy5vYnNpZGlhblRyYW5zcG9ydGAgdG8gc2VsZWN0IGFuZFxuICogY29uZmlndXJlIHRoZSB0cmFuc3BvcnQgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgPVxuICB8IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbiAgfCBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnNcbiAgfCBPYnNpZGlhbkNsaVRyYW5zcG9ydE9wdGlvbnM7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gc2VydmVyIFVSTCAoZS5nLiBgJ2h0dHA6Ly9sb2NhbGhvc3Q6NDcyMydgKS5cbiAgICovXG4gIGFwcGl1bVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQW5kcm9pZCBBVkQgKEFuZHJvaWQgVmlydHVhbCBEZXZpY2UpIG5hbWUuXG4gICAqXG4gICAqIFRoZSB0cmFuc3BvcnQgZmFjdG9yeSBsYXVuY2hlcyBgZW11bGF0b3IgLWF2ZCA8YXZkTmFtZT5gIGFzIGEgYmFja2dyb3VuZFxuICAgKiBwcm9jZXNzIGFuZCBwb2xscyB1bnRpbCB0aGUgZGV2aWNlIGFwcGVhcnMuIFRoZSBlbXVsYXRvciBpcyBraWxsZWRcbiAgICogb24gdHJhbnNwb3J0IGRpc3Bvc2FsLlxuICAgKlxuICAgKiBSdW4gYGVtdWxhdG9yIC1saXN0LWF2ZHNgIHRvIHNlZSBhdmFpbGFibGUgQVZEIG5hbWVzLlxuICAgKi9cbiAgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIEFwcGl1bSBzZXJ2ZXIgaWYgaXQgaXMgbm90IHJlYWNoYWJsZS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCBmYWN0b3J5IHNwYXducyBgbnB4IGFwcGl1bWBcbiAgICogYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgd2hlbiB0aGUgcHJlZmxpZ2h0IGNoZWNrIGZhaWxzLCBhbmQga2lsbHMgaXRcbiAgICogb24gdHJhbnNwb3J0IGRpc3Bvc2FsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgdHlwZTogJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIG9uIHRoZSBkZXZpY2Ugd2hlcmUgT2JzaWRpYW4gc3RvcmVzIHZhdWx0cy5cbiAgICpcbiAgICogRGVmYXVsdHM6XG4gICAqIC0gQW5kcm9pZDogYC9zZGNhcmQvRG9jdW1lbnRzL2BcbiAgICogLSBpT1M6IGBAbWQub2JzaWRpYW46ZG9jdW1lbnRzL2BcbiAgICovXG4gIHZhdWx0QmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgV2ViVmlldyBjb250ZXh0IHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIE9uIHNsb3cgZW11bGF0b3JzLCB0aGUgQ2hyb21lRHJpdmVyIHByb3h5IHRoYXQgaGFuZGxlcyBXZWJWaWV3IGNvbW1hbmRzXG4gICAqIG1heSBub3QgYmUgcmVhZHkgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIHN0YXJ0cy4gVGhpcyB0aW1lb3V0XG4gICAqIGNvbnRyb2xzIGhvdyBsb25nIHRvIHBvbGwgYmVmb3JlIGdpdmluZyB1cC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgb3B0aW9ucyBmb3IgZGVza3RvcCB0ZXN0aW5nIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gMzAwMDBcbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydC5cbiAgICogRGVmYXVsdHMgdG8gODMxNVxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICB0eXBlOiAnb2JzaWRpYW4tY2RwJztcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgb3B0aW9ucyBmb3IgZGVza3RvcCB0ZXN0aW5nIHZpYSB0aGUgT2JzaWRpYW4gQ0xJLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHJhbnNwb3J0IHdoZW4gbm8gYG9ic2lkaWFuVHJhbnNwb3J0YCBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuQ2xpVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQgZm9yIHRoZSB0cmFuc3BvcnQgdHlwZS5cbiAgICovXG4gIHR5cGU6ICdvYnNpZGlhbi1jbGknO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24gb2YgYWxsIHN1cHBvcnRlZCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVXNlZCBpbiB2aXRlc3QgYGVudmlyb25tZW50T3B0aW9ucy5vYnNpZGlhblRyYW5zcG9ydGAgdG8gc2VsZWN0IGFuZFxuICogY29uZmlndXJlIHRoZSB0cmFuc3BvcnQgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgPVxuICB8IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbiAgfCBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnNcbiAgfCBPYnNpZGlhbkNsaVRyYW5zcG9ydE9wdGlvbnM7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -18,21 +18,15 @@ export interface ObsidianAndroidAppiumTransportOptions {
18
18
  */
19
19
  appiumUrl: string;
20
20
  /**
21
- * The Android AVD (Android Virtual Device) name to auto-start if
22
- * the device specified by {@link deviceId} is not connected.
21
+ * The Android AVD (Android Virtual Device) name.
23
22
  *
24
- * When provided and the device is not found via `adb devices`, the
25
- * transport factory launches `emulator -avd <avdName>` as a background
23
+ * The transport factory launches `emulator -avd <avdName>` as a background
26
24
  * process and polls until the device appears. The emulator is killed
27
25
  * on transport disposal.
28
26
  *
29
27
  * Run `emulator -list-avds` to see available AVD names.
30
28
  */
31
- avdName?: string;
32
- /**
33
- * The device UDID (e.g. `'emulator-5554'`).
34
- */
35
- deviceId: string;
29
+ avdName: string;
36
30
  /**
37
31
  * Whether to automatically start the Appium server if it is not reachable.
38
32
  *
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = false ? "dev" : "3.0.3";
1
+ const LIBRARY_VERSION = false ? "dev" : "3.0.5";
2
2
  export {
3
3
  LIBRARY_VERSION
4
4
  };
@@ -15,8 +15,8 @@ import { DesktopCliTransport } from "./transport-desktop-cli.mjs";
15
15
  const APP_PACKAGE = "md.obsidian";
16
16
  const APP_ACTIVITY = `${APP_PACKAGE}.MainActivity`;
17
17
  const ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS = 5e3;
18
- const APPIUM_CONNECTION_RETRY_COUNT = 1;
19
- const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 6e4;
18
+ const APPIUM_CONNECTION_RETRY_COUNT = 3;
19
+ const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 18e4;
20
20
  const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
21
21
  const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
22
22
  const APPIUM_START_TIMEOUT_IN_MILLISECONDS = 6e4;
@@ -27,8 +27,8 @@ const EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
27
27
  const EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS = 12e4;
28
28
  const KEYCODE_MENU = 82;
29
29
  const KEYCODE_WAKEUP = 224;
30
- const SERVER_INSTALL_TIMEOUT_IN_MILLISECONDS = 6e4;
31
- const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 6e4;
30
+ const SERVER_INSTALL_TIMEOUT_IN_MILLISECONDS = 12e4;
31
+ const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 12e4;
32
32
  let cachedTransport;
33
33
  class AppiumTransportFactory {
34
34
  type;
@@ -42,7 +42,7 @@ class AppiumTransportFactory {
42
42
  * @returns A configured Appium transport.
43
43
  */
44
44
  async create(options) {
45
- this.log(`Creating AppiumTransport (url=${options.appiumUrl}, device=${options.deviceId})`);
45
+ this.log(`Creating AppiumTransport (url=${options.appiumUrl}, avd=${options.avdName})`);
46
46
  const url = new URL(options.appiumUrl);
47
47
  const port = Number(url.port);
48
48
  if (isNaN(port)) {
@@ -63,15 +63,17 @@ class AppiumTransportFactory {
63
63
  }
64
64
  };
65
65
  var killAutoStartedProcesses = killAutoStartedProcesses2;
66
- [appiumProcess, emulatorProcess] = await this.startAppiumAndEmulator({
66
+ const result = await this.startAppiumAndEmulator({
67
67
  appiumUrl: url,
68
68
  avdName: options.avdName,
69
- deviceId: options.deviceId,
70
69
  port,
71
70
  shouldAutoStartAppium: options.shouldAutoStartAppium
72
71
  });
72
+ appiumProcess = result.appiumProcess;
73
+ emulatorProcess = result.emulatorProcess;
74
+ const actualDeviceId = result.actualDeviceId;
73
75
  this.log(
74
- `Connecting to Appium (device=${options.deviceId}, app=${appId}, retryTimeout: ${String(APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
76
+ `Connecting to Appium (device=${actualDeviceId}, app=${appId}, retryTimeout: ${String(APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS)}ms, retries: ${String(APPIUM_CONNECTION_RETRY_COUNT)})...`
75
77
  );
76
78
  const browser = await remote({
77
79
  capabilities: {
@@ -84,7 +86,7 @@ class AppiumTransportFactory {
84
86
  "appium:settings": {
85
87
  "appium:chromedriverAutodownload": true
86
88
  },
87
- "appium:udid": options.deviceId,
89
+ "appium:udid": actualDeviceId,
88
90
  "appium:uiautomator2ServerInstallTimeout": SERVER_INSTALL_TIMEOUT_IN_MILLISECONDS,
89
91
  "appium:uiautomator2ServerLaunchTimeout": SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS,
90
92
  "platformName": "Android"
@@ -100,7 +102,7 @@ class AppiumTransportFactory {
100
102
  const appiumTransport = new AppiumTransport({
101
103
  appId,
102
104
  browser,
103
- deviceId: options.deviceId,
105
+ deviceId: actualDeviceId,
104
106
  platform: "android",
105
107
  ...options.vaultBasePath !== void 0 && { vaultBasePath: options.vaultBasePath },
106
108
  ...options.webviewTimeoutInMilliseconds !== void 0 && { webviewTimeoutInMilliseconds: options.webviewTimeoutInMilliseconds }
@@ -154,7 +156,15 @@ class AppiumTransportFactory {
154
156
  });
155
157
  });
156
158
  }
157
- async checkDeviceConnected(deviceId) {
159
+ async ensureDeviceConnected(avdName) {
160
+ const deviceIdsBefore = await this.getConnectedDeviceIds();
161
+ this.log(`Starting emulator AVD "${avdName}"... (existing devices: [${deviceIdsBefore.join(", ")}])`);
162
+ const emulatorProcess = this.startEmulator(avdName);
163
+ const actualDeviceId = await this.waitForNewDevice(deviceIdsBefore);
164
+ this.log(`Emulator "${avdName}" started, device ${actualDeviceId} is connected.`);
165
+ return { actualDeviceId, emulatorProcess };
166
+ }
167
+ async getConnectedDeviceIds() {
158
168
  const output = await new Promise((resolve, reject) => {
159
169
  execFile("adb", ["devices"], { timeout: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS }, (error, stdout, stderr) => {
160
170
  if (error) {
@@ -168,25 +178,7 @@ class AppiumTransportFactory {
168
178
  });
169
179
  });
170
180
  const lines = output.split("\n").map((line) => line.trim()).filter((line) => line.length > 0);
171
- const deviceLine = lines.find((line) => line.startsWith(deviceId));
172
- return deviceLine?.includes(" device") ?? false;
173
- }
174
- async ensureDeviceConnected(avdName, deviceId) {
175
- this.log(`Checking device ${deviceId} is connected via ADB...`);
176
- if (await this.checkDeviceConnected(deviceId)) {
177
- this.log(`Device ${deviceId} is connected.`);
178
- return void 0;
179
- }
180
- if (!avdName) {
181
- throw new Error(
182
- `Device "${deviceId}" is not connected. Start the emulator before running integration tests, or set avdName in transport options to auto-start it.`
183
- );
184
- }
185
- this.log(`Device ${deviceId} not found, starting emulator AVD "${avdName}"...`);
186
- const emulatorProcess = this.startEmulator(avdName);
187
- await this.waitForDevice(deviceId);
188
- this.log(`Emulator "${avdName}" started, device ${deviceId} is connected.`);
189
- return emulatorProcess;
181
+ return lines.filter((line) => line.includes(" device")).map((line) => line.split(" ")[0] ?? "");
190
182
  }
191
183
  log(message) {
192
184
  log(`[transport-factory:${this.type}] ${message}`);
@@ -218,7 +210,7 @@ class AppiumTransportFactory {
218
210
  });
219
211
  }
220
212
  async startAppiumAndEmulator(params) {
221
- const { appiumUrl, avdName, deviceId, port, shouldAutoStartAppium } = params;
213
+ const { appiumUrl, avdName, port, shouldAutoStartAppium } = params;
222
214
  let needsAppiumStart = false;
223
215
  this.log(`Checking Appium server at ${appiumUrl.href}...`);
224
216
  try {
@@ -235,13 +227,25 @@ class AppiumTransportFactory {
235
227
  this.log(`Appium not reachable, auto-starting on port ${String(port)}...`);
236
228
  appiumProcess = this.startAppiumServer(port);
237
229
  }
238
- const [, emulatorProcess] = await Promise.all([
239
- needsAppiumStart ? this.waitForAppiumReady(appiumUrl).then(() => {
240
- this.log("Auto-started Appium server is ready.");
241
- }) : Promise.resolve(),
242
- this.ensureDeviceConnected(avdName, deviceId)
243
- ]);
244
- return [appiumProcess, emulatorProcess];
230
+ try {
231
+ const [, deviceResult] = await Promise.all([
232
+ needsAppiumStart ? this.waitForAppiumReady(appiumUrl).then(() => {
233
+ this.log("Auto-started Appium server is ready.");
234
+ }) : Promise.resolve(),
235
+ this.ensureDeviceConnected(avdName)
236
+ ]);
237
+ return {
238
+ actualDeviceId: deviceResult.actualDeviceId,
239
+ appiumProcess,
240
+ emulatorProcess: deviceResult.emulatorProcess
241
+ };
242
+ } catch (error) {
243
+ if (appiumProcess) {
244
+ killProcessTree(appiumProcess);
245
+ this.log("Killed auto-started Appium server after startup failure.");
246
+ }
247
+ throw error;
248
+ }
245
249
  }
246
250
  startAppiumServer(port) {
247
251
  const child = spawn(`npx appium --log-timestamp --port ${String(port)}`, {
@@ -310,24 +314,27 @@ class AppiumTransportFactory {
310
314
  `Device "${deviceId}" connected but did not finish booting within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
311
315
  );
312
316
  }
313
- async waitForDevice(deviceId) {
317
+ async waitForNewDevice(deviceIdsBefore) {
314
318
  this.log(
315
- `Waiting for device ${deviceId} to appear in ADB (timeout: ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
319
+ `Waiting for a new device to appear in ADB (timeout: ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms, poll: ${String(EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
316
320
  );
317
321
  const deadline = Date.now() + EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS;
318
322
  while (Date.now() < deadline) {
319
- if (await this.checkDeviceConnected(deviceId)) {
320
- this.log(`Device ${deviceId} appeared in ADB, waiting for boot to complete...`);
321
- await this.waitForBoot(deviceId, deadline);
322
- await this.wakeScreen(deviceId);
323
- return;
323
+ const currentIds = await this.getConnectedDeviceIds();
324
+ const newIds = currentIds.filter((id) => !deviceIdsBefore.includes(id));
325
+ if (newIds.length > 0) {
326
+ const actualDeviceId = newIds[0] ?? "";
327
+ this.log(`Device ${actualDeviceId} appeared in ADB, waiting for boot to complete...`);
328
+ await this.waitForBoot(actualDeviceId, deadline);
329
+ await this.wakeScreen(actualDeviceId);
330
+ return actualDeviceId;
324
331
  }
325
332
  await new Promise((resolve) => {
326
333
  setTimeout(resolve, EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS);
327
334
  });
328
335
  }
329
336
  throw new Error(
330
- `Emulator device "${deviceId}" did not appear within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
337
+ `No new emulator device appeared within ${String(EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS)}ms.`
331
338
  );
332
339
  }
333
340
  async wakeScreen(deviceId) {
@@ -382,4 +389,4 @@ export {
382
389
  createTransportFromOptions,
383
390
  getOrCreateTransport
384
391
  };
385
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIGV4ZWNGaWxlU3luYyxcbiAgc3Bhd25cbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMTtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgQ0RQX0RFRkFVTFRfUE9SVCA9IDgzMTU7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jbGknO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zIHtcbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIGF1dG8tc3RhcnQgaWYgdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkLiAqL1xuICBhdmROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBEZXZpY2UgVURJRC4gKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQuICovXG4gIHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW11bGF0b3JQcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc10gPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBkZXZpY2VJZDogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtOiBvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKFxuICAgICAgICBgQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke29wdGlvbnMuZGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCByZXRyaWVzOiAke1xuICAgICAgICAgIFN0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVClcbiAgICAgICAgfSkuLi5gXG4gICAgICApO1xuICAgICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHJlbW90ZSh7XG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICdhcHBpdW06YXBwQWN0aXZpdHknOiBBUFBfQUNUSVZJVFksXG4gICAgICAgICAgJ2FwcGl1bTphcHBQYWNrYWdlJzogYXBwSWQsXG4gICAgICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAgICAgJ2FwcGl1bTphdXRvbWF0aW9uTmFtZSc6ICdVaUF1dG9tYXRvcjInLFxuICAgICAgICAgICdhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXQnOiBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICAgJ2FwcGl1bTpzZXR0aW5ncyc6IHtcbiAgICAgICAgICAgICdhcHBpdW06Y2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkJzogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IG9wdGlvbnMuZGV2aWNlSWQsXG4gICAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gYXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2UuYmluZChhcHBpdW1UcmFuc3BvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRyYW5zcG9ydDtcblxuICAgICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgICAvLyBDYW5ub3QgdXNlIHRoaXMubG9nIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gXHUyMDE0IGB0aGlzYCBpcyBub3QgY2FwdHVyZWQuXG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke29wdGlvbnMudHlwZX1dIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShlbXVsYXRvclByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0RldmljZUNvbm5lY3RlZChkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBkZXZpY2VMaW5lID0gbGluZXMuZmluZCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKGRldmljZUlkKSk7XG4gICAgcmV0dXJuIGRldmljZUxpbmU/LmluY2x1ZGVzKCdcXHRkZXZpY2UnKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKGF2ZE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkPiB7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQgdmlhIEFEQi4uLmApO1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tEZXZpY2VDb25uZWN0ZWQoZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFhdmROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGlzIG5vdCBjb25uZWN0ZWQuIFN0YXJ0IHRoZSBlbXVsYXRvciBiZWZvcmUgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cyxgXG4gICAgICAgICAgKyAnIG9yIHNldCBhdmROYW1lIGluIHRyYW5zcG9ydCBvcHRpb25zIHRvIGF1dG8tc3RhcnQgaXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBmb3VuZCwgc3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3JQcm9jZXNzID0gdGhpcy5zdGFydEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZShkZXZpY2VJZCk7XG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHthdmROYW1lfVwiIHN0YXJ0ZWQsIGRldmljZSAke2RldmljZUlkfSBpcyBjb25uZWN0ZWQuYCk7XG4gICAgcmV0dXJuIGVtdWxhdG9yUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8W0NoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZCwgQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkXT4ge1xuICAgIGNvbnN0IHsgYXBwaXVtVXJsLCBhdmROYW1lLCBkZXZpY2VJZCwgcG9ydCwgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBlbXVsYXRvclByb2Nlc3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICB9KVxuICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoYXZkTmFtZSwgZGV2aWNlSWQpXG4gICAgXSk7XG5cbiAgICByZXR1cm4gW2FwcGl1bVByb2Nlc3MsIGVtdWxhdG9yUHJvY2Vzc107XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfWAsIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J11cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZyk6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSB0aGlzLnJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEVtdWxhdG9yQXJncyhhdmROYW1lKTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBhcmdzLCB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ11cbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7XG4gICAgICAgIFN0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpXG4gICAgICB9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCBkZWFkbGluZSAtIERhdGUubm93KCkpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIGRldmljZSAke2RldmljZUlkfSB0byBmaW5pc2ggYm9vdGluZyAocmVtYWluaW5nOiAke1N0cmluZyhyZW1haW5pbmdNcyl9bXMsIHBvbGw6ICR7XG4gICAgICAgIFN0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKVxuICAgICAgfW1zKS4uLmBcbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNCb290ZWQpIHtcbiAgICAgICAgdGhpcy5sb2coYERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERldmljZSBcIiR7ZGV2aWNlSWR9XCIgY29ubmVjdGVkIGJ1dCBkaWQgbm90IGZpbmlzaCBib290aW5nIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tEZXZpY2VDb25uZWN0ZWQoZGV2aWNlSWQpKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoZGV2aWNlSWQsIGRlYWRsaW5lKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGRldmljZUlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVtdWxhdG9yIGRldmljZSBcIiR7ZGV2aWNlSWR9XCIgZGlkIG5vdCBhcHBlYXIgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBBIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBjb25zdCB0eXBlID0gb3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuXG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jbGknKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0eXBlfV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydGApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENsaVRyYW5zcG9ydCgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3R5cGV9XSBDcmVhdGluZyBEZXNrdG9wQ2RwVHJhbnNwb3J0IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQgPz8gQ0RQX0RFRkFVTFRfUE9SVCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICAuLi4ob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBQb3J0OiBvcHRpb25zLnBvcnQgfSksXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSh0eXBlKTtcbiAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWNoZWQgdHJhbnNwb3J0IGluc3RhbmNlLCBjcmVhdGluZyBvbmUgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9uc1xuICogaWYgbm90IGFscmVhZHkgY2FjaGVkLlxuICpcbiAqIFRoZSB0cmFuc3BvcnQgaXMgY2FjaGVkIHBlciB3b3JrZXIgcHJvY2VzcyBzbyBXZWJTb2NrZXQvQXBwaXVtIHNlc3Npb25zXG4gKiBhcmUgcmV1c2VkIGFjcm9zcyBjYWxscyB3aXRoaW4gdGhlIHNhbWUgdGVzdCB3b3JrZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgY3JlYXRlZCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAoY2FjaGVkVHJhbnNwb3J0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zcG9ydDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBTaW5nbGUtdGhyZWFkZWQgd29ya2VyOyBubyBjb25jdXJyZW50IHdyaXRlcy5cbiAgY2FjaGVkVHJhbnNwb3J0ID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEtpbGxzIGEgY2hpbGQgcHJvY2VzcyBhbmQgaXRzIGVudGlyZSBwcm9jZXNzIHRyZWUuXG4gKlxuICogT24gV2luZG93cywgYGNoaWxkLmtpbGwoKWAgb25seSBzZW5kcyBTSUdURVJNIHRvIHRoZSBkaXJlY3QgcHJvY2VzcyxcbiAqIGxlYXZpbmcgc3Bhd25lZCBncmFuZGNoaWxkcmVuIChlLmcuIFFFTVUsIFVpQXV0b21hdG9yKSBhbGl2ZS5cbiAqIGB0YXNra2lsbCAvRiAvVCAvUElEYCBmb3JjZWZ1bGx5IHRlcm1pbmF0ZXMgdGhlIGVudGlyZSB0cmVlLlxuICpcbiAqIEBwYXJhbSBjaGlsZCAtIFRoZSBjaGlsZCBwcm9jZXNzIHRvIGtpbGwuXG4gKi9cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzVHJlZShjaGlsZDogQ2hpbGRQcm9jZXNzKTogdm9pZCB7XG4gIGlmIChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNGaWxlU3luYygndGFza2tpbGwnLCBbJy9GJywgJy9UJywgJy9QSUQnLCBTdHJpbmcoY2hpbGQucGlkKV0sIHsgc3RkaW86ICdpZ25vcmUnIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbdHJhbnNwb3J0LWZhY3RvcnldIHRhc2traWxsIGZvciBQSUQgJHtTdHJpbmcoY2hpbGQucGlkKX0gZmFpbGVkIChtYXkgaGF2ZSBhbHJlYWR5IGV4aXRlZCk6ICR7XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcidcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxjQUFjO0FBUXZCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsV0FBVztBQUNwQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsV0FBVztBQUNuQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGtEQUFrRDtBQUN4RCxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtDQUFrQztBQUN4QyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLDhDQUE4QztBQUNwRCxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFB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
392
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIGV4ZWNGaWxlU3luYyxcbiAgc3Bhd25cbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwMDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDAwMDtcbmNvbnN0IENEUF9ERUZBVUxUX1BPUlQgPSA4MzE1O1xuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDtcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2xpJztcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBVUkwuICovXG4gIGFwcGl1bVVybDogVVJMO1xuXG4gIC8qKiBBVkQgbmFtZSB0byBzdGFydC4gKi9cbiAgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwb3J0LiAqL1xuICBwb3J0OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHtcbiAgLyoqIFRoZSBhY3R1YWwgZGV2aWNlIElEIHRoYXQgaXMgY29ubmVjdGVkIChtYXkgZGlmZmVyIGZyb20gdGhlIHJlcXVlc3RlZCBvbmUpLiAqL1xuICBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgdGhpcy5sb2coYENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBhdmQ9JHtvcHRpb25zLmF2ZE5hbWV9KWApO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICBhcHBpdW1Vcmw6IHVybCxcbiAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHJldHJpZXM6ICR7XG4gICAgICAgICAgU3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKVxuICAgICAgICB9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnNldHRpbmdzJzoge1xuICAgICAgICAgICAgJ2FwcGl1bTpjaHJvbWVkcml2ZXJBdXRvZG93bmxvYWQnOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn0gZGlkIG5vdCByZXNwb25kIHdpdGhpbiAke1N0cmluZyhBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKGF2ZE5hbWU6IHN0cmluZyk6IFByb21pc2U8RW5zdXJlRGV2aWNlQ29ubmVjdGVkUmVzdWx0PiB7XG4gICAgY29uc3QgZGV2aWNlSWRzQmVmb3JlID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICB0aGlzLmxvZyhgU3RhcnRpbmcgZW11bGF0b3IgQVZEIFwiJHthdmROYW1lfVwiLi4uIChleGlzdGluZyBkZXZpY2VzOiBbJHtkZXZpY2VJZHNCZWZvcmUuam9pbignLCAnKX1dKWApO1xuICAgIGNvbnN0IGVtdWxhdG9yUHJvY2VzcyA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lKTtcbiAgICBjb25zdCBhY3R1YWxEZXZpY2VJZCA9IGF3YWl0IHRoaXMud2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmUpO1xuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiIGRldmljZXMnOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHRoaXMubG9nKGBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIHJldHVybiBsaW5lc1xuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygnXFx0ZGV2aWNlJykpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNwbGl0KCdcXHQnKVswXSA/PyAnJyk7XG4gIH1cblxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3RoaXMudHlwZX1dICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2RrUm9vdCA9IHByb2Nlc3MuZW52WydBTkRST0lEX0hPTUUnXSA/PyBwcm9jZXNzLmVudlsnQU5EUk9JRF9TREtfUk9PVCddO1xuICAgIGlmICghc2RrUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGZpbmQgQW5kcm9pZCBlbXVsYXRvcjogbmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBqb2luKHNka1Jvb3QsICdlbXVsYXRvcicsICdlbXVsYXRvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5RXZlbnQoZGV2aWNlSWQ6IHN0cmluZywga2V5Q29kZTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgICAgYFdhcm5pbmc6IGZhaWxlZCB0byAke2Rlc2NyaXB0aW9ufSAoa2V5ZXZlbnQgJHtTdHJpbmcoa2V5Q29kZSl9KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcihwYXJhbXM6IFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGFwcGl1bVVybCwgYXZkTmFtZSwgcG9ydCwgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgWywgZGV2aWNlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICAgID8gdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICAgIHRoaXMuZW5zdXJlRGV2aWNlQ29ubmVjdGVkKGF2ZE5hbWUpXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIpOiBDaGlsZFByb2Nlc3Mge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYG5weCBhcHBpdW0gLS1sb2ctdGltZXN0YW1wIC0tcG9ydCAke1N0cmluZyhwb3J0KX1gLCB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddXG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcpOiBDaGlsZFByb2Nlc3Mge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBhcmdzID0gYnVpbGRFbXVsYXRvckFyZ3MoYXZkTmFtZSk7XG4gICAgdGhpcy5sb2coYFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihlbXVsYXRvckJpbmFyeSwgYXJncywge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddXG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcGl1bVJlYWR5KHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyhBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKVxuICAgICAgfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYm9vdCBjb21wbGV0ZWQuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JOZXdEZXZpY2UoZGV2aWNlSWRzQmVmb3JlOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1xuICAgICAgICBTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUylcbiAgICAgIH1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FrZVNjcmVlbihhY3R1YWxEZXZpY2VJZCk7XG4gICAgICAgIHJldHVybiBhY3R1YWxEZXZpY2VJZDtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBuZXcgZW11bGF0b3IgZGV2aWNlIGFwcGVhcmVkIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FrZVNjcmVlbihkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYFdha2luZyBzY3JlZW4gb24gZGV2aWNlICR7ZGV2aWNlSWR9Li4uYCk7XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9XQUtFVVAsICd3YWtlIHNjcmVlbicpO1xuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgICB0aGlzLmxvZyhgU2NyZWVuIHdha2UgY29tcGxldGUgb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcblxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2xpJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dHlwZX1dIENyZWF0aW5nIERlc2t0b3BDbGlUcmFuc3BvcnRgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0eXBlfV0gQ3JlYXRpbmcgRGVza3RvcENkcFRyYW5zcG9ydCAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0ID8/IENEUF9ERUZBVUxUX1BPUlQpfSlgKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgICAgLi4uKG9wdGlvbnMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwSG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgICAgLi4uKG9wdGlvbnMucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgY2RwUG9ydDogb3B0aW9ucy5wb3J0IH0pLFxuICAgICAgLi4uKG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkodHlwZSk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBLaWxscyBhIGNoaWxkIHByb2Nlc3MgYW5kIGl0cyBlbnRpcmUgcHJvY2VzcyB0cmVlLlxuICpcbiAqIE9uIFdpbmRvd3MsIGBjaGlsZC5raWxsKClgIG9ubHkgc2VuZHMgU0lHVEVSTSB0byB0aGUgZGlyZWN0IHByb2Nlc3MsXG4gKiBsZWF2aW5nIHNwYXduZWQgZ3JhbmRjaGlsZHJlbiAoZS5nLiBRRU1VLCBVaUF1dG9tYXRvcikgYWxpdmUuXG4gKiBgdGFza2tpbGwgL0YgL1QgL1BJRGAgZm9yY2VmdWxseSB0ZXJtaW5hdGVzIHRoZSBlbnRpcmUgdHJlZS5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgLSBUaGUgY2hpbGQgcHJvY2VzcyB0byBraWxsLlxuICovXG5mdW5jdGlvbiBraWxsUHJvY2Vzc1RyZWUoY2hpbGQ6IENoaWxkUHJvY2Vzcyk6IHZvaWQge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ3Rhc2traWxsJywgWycvRicsICcvVCcsICcvUElEJywgU3RyaW5nKGNoaWxkLnBpZCldLCB7IHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW3RyYW5zcG9ydC1mYWN0b3J5XSB0YXNra2lsbCBmb3IgUElEICR7U3RyaW5nKGNoaWxkLnBpZCl9IGZhaWxlZCAobWF5IGhhdmUgYWxyZWFkeSBleGl0ZWQpOiAke1xuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjaGlsZC5raWxsKCdTSUdLSUxMJyk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sVUFBVTtBQUNqQixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBQ3BCLFNBQVMsY0FBYztBQVF2QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLFdBQVc7QUFDcEIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUywyQkFBMkI7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSx3Q0FBd0M7QUFDOUMs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
@@ -18,21 +18,15 @@ export interface ObsidianAndroidAppiumTransportOptions {
18
18
  */
19
19
  appiumUrl: string;
20
20
  /**
21
- * The Android AVD (Android Virtual Device) name to auto-start if
22
- * the device specified by {@link deviceId} is not connected.
21
+ * The Android AVD (Android Virtual Device) name.
23
22
  *
24
- * When provided and the device is not found via `adb devices`, the
25
- * transport factory launches `emulator -avd <avdName>` as a background
23
+ * The transport factory launches `emulator -avd <avdName>` as a background
26
24
  * process and polls until the device appears. The emulator is killed
27
25
  * on transport disposal.
28
26
  *
29
27
  * Run `emulator -list-avds` to see available AVD names.
30
28
  */
31
- avdName?: string;
32
- /**
33
- * The device UDID (e.g. `'emulator-5554'`).
34
- */
35
- deviceId: string;
29
+ avdName: string;
36
30
  /**
37
31
  * Whether to automatically start the Appium server if it is not reachable.
38
32
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "3.0.4",
3
+ "version": "4.0.0",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",