obsidian-integration-testing 16.0.0 → 17.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/lib/cjs/adb.cjs +2 -2
  2. package/dist/lib/cjs/adb.d.cts +10 -0
  3. package/dist/lib/cjs/avd-name-channel.cjs +74 -0
  4. package/dist/lib/cjs/avd-name-channel.d.cts +152 -0
  5. package/dist/lib/cjs/avd-probe-verdict.cjs +11 -4
  6. package/dist/lib/cjs/avd-probe-verdict.d.cts +7 -0
  7. package/dist/lib/cjs/device-screenshot.cjs +1 -1
  8. package/dist/lib/cjs/device-screenshot.d.cts +3 -1
  9. package/dist/lib/cjs/emulator-backend.cjs +22 -1
  10. package/dist/lib/cjs/emulator-backend.d.cts +81 -0
  11. package/dist/lib/cjs/emulator-reclaim.cjs +78 -34
  12. package/dist/lib/cjs/emulator-reclaim.d.cts +57 -9
  13. package/dist/lib/cjs/enable-plugin.cjs +17 -8
  14. package/dist/lib/cjs/enable-plugin.d.cts +3 -1
  15. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  16. package/dist/lib/cjs/eval-in-obsidian.d.cts +12 -0
  17. package/dist/lib/cjs/host-process-query-verdict.cjs +103 -0
  18. package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
  19. package/dist/lib/cjs/index.cjs +14 -1
  20. package/dist/lib/cjs/index.d.cts +3 -1
  21. package/dist/lib/cjs/launched-device-selection.cjs +46 -0
  22. package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
  23. package/dist/lib/cjs/library.cjs +1 -1
  24. package/dist/lib/cjs/namespace-bootstrap.cjs +62 -1
  25. package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
  26. package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
  27. package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
  28. package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
  29. package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
  30. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  31. package/dist/lib/cjs/sharp-loader.d.cts +67 -2
  32. package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
  33. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
  34. package/dist/lib/cjs/soft-keyboard.cjs +130 -28
  35. package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
  36. package/dist/lib/cjs/transport-appium.cjs +74 -4
  37. package/dist/lib/cjs/transport-appium.d.cts +49 -2
  38. package/dist/lib/cjs/transport-factory.cjs +162 -42
  39. package/dist/lib/esm/adb.d.mts +10 -0
  40. package/dist/lib/esm/adb.mjs +2 -2
  41. package/dist/lib/esm/avd-name-channel.d.mts +152 -0
  42. package/dist/lib/esm/avd-name-channel.mjs +45 -0
  43. package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
  44. package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
  45. package/dist/lib/esm/device-screenshot.d.mts +3 -1
  46. package/dist/lib/esm/device-screenshot.mjs +1 -1
  47. package/dist/lib/esm/emulator-backend.d.mts +81 -0
  48. package/dist/lib/esm/emulator-backend.mjs +19 -1
  49. package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
  50. package/dist/lib/esm/emulator-reclaim.mjs +84 -36
  51. package/dist/lib/esm/enable-plugin.d.mts +3 -1
  52. package/dist/lib/esm/enable-plugin.mjs +17 -8
  53. package/dist/lib/esm/eval-in-obsidian.d.mts +12 -0
  54. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  55. package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
  56. package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
  57. package/dist/lib/esm/index.d.mts +3 -1
  58. package/dist/lib/esm/index.mjs +15 -1
  59. package/dist/lib/esm/launched-device-selection.d.mts +112 -0
  60. package/dist/lib/esm/launched-device-selection.mjs +21 -0
  61. package/dist/lib/esm/library.mjs +1 -1
  62. package/dist/lib/esm/namespace-bootstrap.mjs +62 -1
  63. package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
  64. package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
  65. package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
  66. package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
  67. package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
  68. package/dist/lib/esm/sharp-loader.d.mts +67 -2
  69. package/dist/lib/esm/sharp-loader.mjs +1 -1
  70. package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
  71. package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
  72. package/dist/lib/esm/soft-keyboard.d.mts +65 -6
  73. package/dist/lib/esm/soft-keyboard.mjs +131 -28
  74. package/dist/lib/esm/transport-appium.d.mts +49 -2
  75. package/dist/lib/esm/transport-appium.mjs +74 -4
  76. package/dist/lib/esm/transport-factory.mjs +176 -44
  77. package/package.json +1 -1
@@ -28,7 +28,7 @@ const OUTPUT_MAX_BUFFER_IN_BYTES = 67108864;
28
28
  async function runAdbBinary(params) {
29
29
  const commandArguments = ["-s", params.deviceId, ...params.commandArguments];
30
30
  return await new Promise((resolve, reject) => {
31
- (0, import_node_child_process.execFile)("adb", commandArguments, { encoding: "buffer", maxBuffer: OUTPUT_MAX_BUFFER_IN_BYTES }, (error, stdout) => {
31
+ (0, import_node_child_process.execFile)("adb", commandArguments, { encoding: "buffer", maxBuffer: OUTPUT_MAX_BUFFER_IN_BYTES, timeout: params.timeoutInMilliseconds }, (error, stdout) => {
32
32
  if (error) {
33
33
  reject(new Error(`Failed to run 'adb ${commandArguments.join(" ")}': ${error.message}. Is ADB installed and in PATH?`));
34
34
  return;
@@ -58,4 +58,4 @@ async function runAdbTextWithoutDevice(commandArguments) {
58
58
  runAdbText,
59
59
  runAdbTextWithoutDevice
60
60
  });
61
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FkYi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJ1bnMgYGFkYmAgYW5kIGhhbmRzIGJhY2sgd2hhdCBpdCBwcmludGVkIFx1MjAxNCBhcyB0ZXh0LCBvciBhcyByYXcgYnl0ZXMuXG4gKlxuICogVGhlIGhhcm5lc3MgYWxyZWFkeSBzaGVsbHMgb3V0IHRvIGBhZGJgIGluIGhhbGYgYSBkb3plbiBwbGFjZXMgaW5zaWRlXG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIC8gYHRyYW5zcG9ydC1hcHBpdW1gLCBidXQgYWx3YXlzIHRocm91Z2ggYGV4ZWNgLCB3aGljaFxuICogZGVjb2RlcyBzdGRvdXQgYXMgVVRGLTguIFRoYXQgaXMgZmluZSBmb3IgYGRldmljZXNgIGFuZCBgc2V0dGluZ3MgZ2V0YCBhbmRcbiAqIGZhdGFsbHkgd3JvbmcgZm9yIGBleGVjLW91dCBzY3JlZW5jYXAgLXBgLCB3aG9zZSBzdGRvdXQgaXMgYSBQTkc6IGRlY29kaW5nIGl0XG4gKiBhcyB0ZXh0IGNvcnJ1cHRzIGV2ZXJ5IGJ5dGUgYWJvdmUgMHg3Ri4gSGVuY2UgdGhlIHR3byBydW5uZXJzIGhlcmUgXHUyMDE0IHRoZSBzYW1lXG4gKiBjb21tYW5kIHNoYXBlLCBkaWZmZXJpbmcgb25seSBpbiB3aGV0aGVyIHRoZSBvdXRwdXQgaXMgZGVjb2RlZC5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIHByb2Nlc3MgbGF5ZXIgZm9yIHRoZSBkZXZpY2UtZmFjaW5nIGhlbHBlcnMgYSBjYXB0dXJlIHN1aXRlXG4gKiB1c2VzIChgZGV2aWNlLXNjcmVlbnNob3RgLCBgZGV2aWNlLXNldHRpbmdzYCwgYHNvZnQta2V5Ym9hcmRgKTsgdGhleSBhcmUgbm90IGFcbiAqIGdlbmVyYWwtcHVycG9zZSBhZGIgd3JhcHBlciBhbmQgZGVsaWJlcmF0ZWx5IGRvIG5vdCB0cnkgdG8gYmVjb21lIG9uZS5cbiAqXG4gKiBFdmVyeSBmdW5jdGlvbiBoZXJlIHNoZWxscyBvdXQsIHNvIHRoZSB3aG9sZSBtb2R1bGUgaXMgaW50ZWdyYXRpb24tdGltZSBjb2RlLlxuICogVGhhdCBpcyBhbHNvIHdoeSB0aGUgcGFyc2luZyBhbmQgZ2VvbWV0cnkgdGhlc2UgaGVscGVycyBkZXBlbmQgb24gbGl2ZSBpblxuICogdGhlaXIgb3duIG1vZHVsZXMgXHUyMDE0IHRoZSBzYW1lIHNwbGl0IGBhZGItZGV2aWNlLWxpc3RgIGFscmVhZHkgaGFzIGZyb20gdGhlXG4gKiB0cmFuc3BvcnQgZmFjdG9yeSwgc28gYSBzb3J0IHJ1bGUgY2FuIG5ldmVyIG1vdmUgYSB1bml0LXRlc3RlZCBmdW5jdGlvblxuICogaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jay5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChzaGVsbHMgb3V0IHRvIGEgcmVhbCBkZXZpY2UpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bkFkYkJpbmFyeX0gYW5kIHtAbGluayBydW5BZGJUZXh0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5BZGJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBwYXNzIGFmdGVyIGAtcyA8ZGV2aWNlSWQ+YCwgZS5nLiBgWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCAnMTAnLCAnMjAnXWAuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLCBhcyBgYWRiIGRldmljZXNgIGxpc3RzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNjcmVlbmNhcCBvZiBhIDkwMHgxNjAwIGRldmljZSBydW5zIHRvIGFib3V0IDEwMCBLQiwgYnV0IGEgdGFibGV0IEFWRCdzIGZyYW1lYnVmZmVyIGlzIHNldmVyYWwgTUIgYW5kXG4gKiB0aGUgZGVmYXVsdCAxIE1pQiBgbWF4QnVmZmVyYCBmYWlscyB0aGUgY2FsbCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSB1c2FibGUgaW1hZ2UuXG4gKi9cbmNvbnN0IE9VVFBVVF9NQVhfQlVGRkVSX0lOX0JZVEVTID0gNjdfMTA4Xzg2NDtcblxuLyoqXG4gKiBSdW5zIGBhZGIgLXMgPGRldmljZUlkPiA8Y29tbWFuZEFyZ3VtZW50cz5gIGFuZCByZXR1cm5zIHN0ZG91dCAqKnVuZGVjb2RlZCoqLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyBzdGRvdXQgYnl0ZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFkYiBjb3VsZCBub3QgYmUgcnVuLCBvciBleGl0ZWQgbm9uLXplcm8uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBSdW5BZGJQYXJhbXNgIGlzIG9uZSBiYWcgc2hhcmVkIGJ5IGBydW5BZGJCaW5hcnlgIGFuZCBgcnVuQWRiVGV4dGAsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWRiQmluYXJ5KHBhcmFtczogUnVuQWRiUGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBbJy1zJywgcGFyYW1zLmRldmljZUlkLCAuLi5wYXJhbXMuY29tbWFuZEFyZ3VtZW50c107XG5cbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnYWRiJywgY29tbWFuZEFyZ3VtZW50cywgeyBlbmNvZGluZzogJ2J1ZmZlcicsIG1heEJ1ZmZlcjogT1VUUFVUX01BWF9CVUZGRVJfSU5fQllURVMgfSwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgJHtjb21tYW5kQXJndW1lbnRzLmpvaW4oJyAnKX0nOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1bnMgYGFkYiAtcyA8ZGV2aWNlSWQ+IDxjb21tYW5kQXJndW1lbnRzPmAgYW5kIHJldHVybnMgc3Rkb3V0IGFzIHRyaW1tZWQgdGV4dC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgdGhlIGFyZ3VtZW50cyB0byBydW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHN0ZG91dCwgd2l0aCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFkYiBjb3VsZCBub3QgYmUgcnVuLCBvciBleGl0ZWQgbm9uLXplcm8uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBSdW5BZGJQYXJhbXNgIGlzIG9uZSBiYWcgc2hhcmVkIGJ5IGBydW5BZGJCaW5hcnlgIGFuZCBgcnVuQWRiVGV4dGAsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWRiVGV4dChwYXJhbXM6IFJ1bkFkYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHJ1bkFkYkJpbmFyeShwYXJhbXMpO1xuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHN0ZG91dCkudHJpbSgpO1xufVxuXG4vKipcbiAqIFJ1bnMgYGFkYiA8Y29tbWFuZEFyZ3VtZW50cz5gIHdpdGggbm8gZGV2aWNlIHNlbGVjdGVkLlxuICpcbiAqIE9ubHkgYGRldmljZXNgIG5lZWRzIHRoaXMgXHUyMDE0IGV2ZXJ5IG90aGVyIGNhbGwgaW4gdGhpcyBmYW1pbHkgYWRkcmVzc2VzIG9uZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIGNvbW1hbmRBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gc3Rkb3V0LCB3aXRoIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFkYlRleHRXaXRob3V0RGV2aWNlKGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnYWRiJywgWy4uLmNvbW1hbmRBcmd1bWVudHNdLCB7IGVuY29kaW5nOiAndXRmLTgnLCBtYXhCdWZmZXI6IE9VVFBVVF9NQVhfQlVGRkVSX0lOX0JZVEVTIH0sIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiICR7Y29tbWFuZEFyZ3VtZW50cy5qb2luKCcgJyl9JzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlCQSxnQ0FBeUI7QUFxQnpCLE1BQU0sNkJBQTZCO0FBVW5DLGVBQXNCLGFBQWEsUUFBMkM7QUFDNUUsUUFBTSxtQkFBbUIsQ0FBQyxNQUFNLE9BQU8sVUFBVSxHQUFHLE9BQU8sZ0JBQWdCO0FBRTNFLFNBQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUMsNENBQVMsT0FBTyxrQkFBa0IsRUFBRSxVQUFVLFVBQVUsV0FBVywyQkFBMkIsR0FBRyxDQUFDLE9BQU8sV0FBVztBQUNsSCxVQUFJLE9BQU87QUFDVCxlQUFPLElBQUksTUFBTSxzQkFBc0IsaUJBQWlCLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxPQUFPLGlDQUFpQyxDQUFDO0FBQ3RIO0FBQUEsTUFDRjtBQUVBLGNBQVEsTUFBTTtBQUFBLElBQ2hCLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQVVBLGVBQXNCLFdBQVcsUUFBdUM7QUFDdEUsUUFBTSxTQUFTLE1BQU0sYUFBYSxNQUFNO0FBQ3hDLFNBQU8sSUFBSSxZQUFZLEVBQUUsT0FBTyxNQUFNLEVBQUUsS0FBSztBQUMvQztBQVdBLGVBQXNCLHdCQUF3QixrQkFBc0Q7QUFDbEcsU0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1Qyw0Q0FBUyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFLFVBQVUsU0FBUyxXQUFXLDJCQUEyQixHQUFHLENBQUMsT0FBTyxXQUFXO0FBQ3RILFVBQUksT0FBTztBQUNULGVBQU8sSUFBSSxNQUFNLHNCQUFzQixpQkFBaUIsS0FBSyxHQUFHLENBQUMsTUFBTSxNQUFNLE9BQU8saUNBQWlDLENBQUM7QUFDdEg7QUFBQSxNQUNGO0FBRUEsY0FBUSxPQUFPLEtBQUssQ0FBQztBQUFBLElBQ3ZCLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
61
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FkYi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJ1bnMgYGFkYmAgYW5kIGhhbmRzIGJhY2sgd2hhdCBpdCBwcmludGVkIFx1MjAxNCBhcyB0ZXh0LCBvciBhcyByYXcgYnl0ZXMuXG4gKlxuICogVGhlIGhhcm5lc3MgYWxyZWFkeSBzaGVsbHMgb3V0IHRvIGBhZGJgIGluIGhhbGYgYSBkb3plbiBwbGFjZXMgaW5zaWRlXG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIC8gYHRyYW5zcG9ydC1hcHBpdW1gLCBidXQgYWx3YXlzIHRocm91Z2ggYGV4ZWNgLCB3aGljaFxuICogZGVjb2RlcyBzdGRvdXQgYXMgVVRGLTguIFRoYXQgaXMgZmluZSBmb3IgYGRldmljZXNgIGFuZCBgc2V0dGluZ3MgZ2V0YCBhbmRcbiAqIGZhdGFsbHkgd3JvbmcgZm9yIGBleGVjLW91dCBzY3JlZW5jYXAgLXBgLCB3aG9zZSBzdGRvdXQgaXMgYSBQTkc6IGRlY29kaW5nIGl0XG4gKiBhcyB0ZXh0IGNvcnJ1cHRzIGV2ZXJ5IGJ5dGUgYWJvdmUgMHg3Ri4gSGVuY2UgdGhlIHR3byBydW5uZXJzIGhlcmUgXHUyMDE0IHRoZSBzYW1lXG4gKiBjb21tYW5kIHNoYXBlLCBkaWZmZXJpbmcgb25seSBpbiB3aGV0aGVyIHRoZSBvdXRwdXQgaXMgZGVjb2RlZC5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIHByb2Nlc3MgbGF5ZXIgZm9yIHRoZSBkZXZpY2UtZmFjaW5nIGhlbHBlcnMgYSBjYXB0dXJlIHN1aXRlXG4gKiB1c2VzIChgZGV2aWNlLXNjcmVlbnNob3RgLCBgZGV2aWNlLXNldHRpbmdzYCwgYHNvZnQta2V5Ym9hcmRgKTsgdGhleSBhcmUgbm90IGFcbiAqIGdlbmVyYWwtcHVycG9zZSBhZGIgd3JhcHBlciBhbmQgZGVsaWJlcmF0ZWx5IGRvIG5vdCB0cnkgdG8gYmVjb21lIG9uZS5cbiAqXG4gKiBFdmVyeSBmdW5jdGlvbiBoZXJlIHNoZWxscyBvdXQsIHNvIHRoZSB3aG9sZSBtb2R1bGUgaXMgaW50ZWdyYXRpb24tdGltZSBjb2RlLlxuICogVGhhdCBpcyBhbHNvIHdoeSB0aGUgcGFyc2luZyBhbmQgZ2VvbWV0cnkgdGhlc2UgaGVscGVycyBkZXBlbmQgb24gbGl2ZSBpblxuICogdGhlaXIgb3duIG1vZHVsZXMgXHUyMDE0IHRoZSBzYW1lIHNwbGl0IGBhZGItZGV2aWNlLWxpc3RgIGFscmVhZHkgaGFzIGZyb20gdGhlXG4gKiB0cmFuc3BvcnQgZmFjdG9yeSwgc28gYSBzb3J0IHJ1bGUgY2FuIG5ldmVyIG1vdmUgYSB1bml0LXRlc3RlZCBmdW5jdGlvblxuICogaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jay5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChzaGVsbHMgb3V0IHRvIGEgcmVhbCBkZXZpY2UpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bkFkYkJpbmFyeX0gYW5kIHtAbGluayBydW5BZGJUZXh0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5BZGJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBwYXNzIGFmdGVyIGAtcyA8ZGV2aWNlSWQ+YCwgZS5nLiBgWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCAnMTAnLCAnMjAnXWAuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLCBhcyBgYWRiIGRldmljZXNgIGxpc3RzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gZ2l2ZSB0aGUgY2FsbCBiZWZvcmUga2lsbGluZyBpdCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBPbWl0dGVkIFx1MjAxNCB0aGUgZGVmYXVsdCBcdTIwMTQgdGhlIGNhbGwgd2FpdHMgaW5kZWZpbml0ZWx5LCB3aGljaCBpcyByaWdodCBmb3IgdGhlXG4gICAqIGNhcHR1cmUgaGVscGVyczogYSBzY3JlZW5jYXAgb2YgYSBiaWcgZnJhbWVidWZmZXIgaXMgc2xvdywgbm90IHN0dWNrLiBBXG4gICAqIGNhbGxlciB0aGF0IGlzICppZGVudGlmeWluZyogYSBkZXZpY2UgaXQgbWF5IG5vdCBvd24gcGFzc2VzIG9uZSwgYmVjYXVzZVxuICAgKiB0aGVyZSB0aGUgd2hvbGUgcG9pbnQgaXMgdG8gZ2l2ZSB1cCBvbiBhIHdlZGdlZCBndWVzdCByYXRoZXIgdGhhbiBoYW5nIHRoZVxuICAgKiBydW4gYmVoaW5kIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc2NyZWVuY2FwIG9mIGEgOTAweDE2MDAgZGV2aWNlIHJ1bnMgdG8gYWJvdXQgMTAwIEtCLCBidXQgYSB0YWJsZXQgQVZEJ3MgZnJhbWVidWZmZXIgaXMgc2V2ZXJhbCBNQiBhbmRcbiAqIHRoZSBkZWZhdWx0IDEgTWlCIGBtYXhCdWZmZXJgIGZhaWxzIHRoZSBjYWxsIHJhdGhlciB0aGFuIHJldHVybmluZyBhIHVzYWJsZSBpbWFnZS5cbiAqL1xuY29uc3QgT1VUUFVUX01BWF9CVUZGRVJfSU5fQllURVMgPSA2N18xMDhfODY0O1xuXG4vKipcbiAqIFJ1bnMgYGFkYiAtcyA8ZGV2aWNlSWQ+IDxjb21tYW5kQXJndW1lbnRzPmAgYW5kIHJldHVybnMgc3Rkb3V0ICoqdW5kZWNvZGVkKiouXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBhcmd1bWVudHMgdG8gcnVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmF3IHN0ZG91dCBieXRlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYFJ1bkFkYlBhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgYHJ1bkFkYkJpbmFyeWAgYW5kIGBydW5BZGJUZXh0YCwgc28gbm8gcGVyLW93bmVyIG5hbWUgY2FuIHNhdGlzZnkgYm90aC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BZGJCaW5hcnkocGFyYW1zOiBSdW5BZGJQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgY29tbWFuZEFyZ3VtZW50cyA9IFsnLXMnLCBwYXJhbXMuZGV2aWNlSWQsIC4uLnBhcmFtcy5jb21tYW5kQXJndW1lbnRzXTtcblxuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBjb21tYW5kQXJndW1lbnRzLCB7IGVuY29kaW5nOiAnYnVmZmVyJywgbWF4QnVmZmVyOiBPVVRQVVRfTUFYX0JVRkZFUl9JTl9CWVRFUywgdGltZW91dDogcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9LCAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiAke2NvbW1hbmRBcmd1bWVudHMuam9pbignICcpfSc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUnVucyBgYWRiIC1zIDxkZXZpY2VJZD4gPGNvbW1hbmRBcmd1bWVudHM+YCBhbmQgcmV0dXJucyBzdGRvdXQgYXMgdHJpbW1lZCB0ZXh0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gc3Rkb3V0LCB3aXRoIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYFJ1bkFkYlBhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgYHJ1bkFkYkJpbmFyeWAgYW5kIGBydW5BZGJUZXh0YCwgc28gbm8gcGVyLW93bmVyIG5hbWUgY2FuIHNhdGlzZnkgYm90aC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BZGJUZXh0KHBhcmFtczogUnVuQWRiUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgcnVuQWRiQmluYXJ5KHBhcmFtcyk7XG4gIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoc3Rkb3V0KS50cmltKCk7XG59XG5cbi8qKlxuICogUnVucyBgYWRiIDxjb21tYW5kQXJndW1lbnRzPmAgd2l0aCBubyBkZXZpY2Ugc2VsZWN0ZWQuXG4gKlxuICogT25seSBgZGV2aWNlc2AgbmVlZHMgdGhpcyBcdTIwMTQgZXZlcnkgb3RoZXIgY2FsbCBpbiB0aGlzIGZhbWlseSBhZGRyZXNzZXMgb25lIGRldmljZS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgdG8gcnVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBzdGRvdXQsIHdpdGggc3Vycm91bmRpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxuICogQHRocm93cyBFcnJvciBpZiBhZGIgY291bGQgbm90IGJlIHJ1biwgb3IgZXhpdGVkIG5vbi16ZXJvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWRiVGV4dFdpdGhvdXREZXZpY2UoY29tbWFuZEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBbLi4uY29tbWFuZEFyZ3VtZW50c10sIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIG1heEJ1ZmZlcjogT1VUUFVUX01BWF9CVUZGRVJfSU5fQllURVMgfSwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgJHtjb21tYW5kQXJndW1lbnRzLmpvaW4oJyAnKX0nOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBeUJBLGdDQUF5QjtBQWdDekIsTUFBTSw2QkFBNkI7QUFVbkMsZUFBc0IsYUFBYSxRQUEyQztBQUM1RSxRQUFNLG1CQUFtQixDQUFDLE1BQU0sT0FBTyxVQUFVLEdBQUcsT0FBTyxnQkFBZ0I7QUFFM0UsU0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1Qyw0Q0FBUyxPQUFPLGtCQUFrQixFQUFFLFVBQVUsVUFBVSxXQUFXLDRCQUE0QixTQUFTLE9BQU8sc0JBQXNCLEdBQUcsQ0FBQyxPQUFPLFdBQVc7QUFDekosVUFBSSxPQUFPO0FBQ1QsZUFBTyxJQUFJLE1BQU0sc0JBQXNCLGlCQUFpQixLQUFLLEdBQUcsQ0FBQyxNQUFNLE1BQU0sT0FBTyxpQ0FBaUMsQ0FBQztBQUN0SDtBQUFBLE1BQ0Y7QUFFQSxjQUFRLE1BQU07QUFBQSxJQUNoQixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFVQSxlQUFzQixXQUFXLFFBQXVDO0FBQ3RFLFFBQU0sU0FBUyxNQUFNLGFBQWEsTUFBTTtBQUN4QyxTQUFPLElBQUksWUFBWSxFQUFFLE9BQU8sTUFBTSxFQUFFLEtBQUs7QUFDL0M7QUFXQSxlQUFzQix3QkFBd0Isa0JBQXNEO0FBQ2xHLFNBQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUMsNENBQVMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsRUFBRSxVQUFVLFNBQVMsV0FBVywyQkFBMkIsR0FBRyxDQUFDLE9BQU8sV0FBVztBQUN0SCxVQUFJLE9BQU87QUFDVCxlQUFPLElBQUksTUFBTSxzQkFBc0IsaUJBQWlCLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxPQUFPLGlDQUFpQyxDQUFDO0FBQ3RIO0FBQUEsTUFDRjtBQUVBLGNBQVEsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUN2QixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -32,6 +32,16 @@ export interface RunAdbParams {
32
32
  * The device to address, as `adb devices` lists it.
33
33
  */
34
34
  readonly deviceId: string;
35
+ /**
36
+ * How long to give the call before killing it, in milliseconds.
37
+ *
38
+ * Omitted — the default — the call waits indefinitely, which is right for the
39
+ * capture helpers: a screencap of a big framebuffer is slow, not stuck. A
40
+ * caller that is *identifying* a device it may not own passes one, because
41
+ * there the whole point is to give up on a wedged guest rather than hang the
42
+ * run behind it.
43
+ */
44
+ readonly timeoutInMilliseconds?: number | undefined;
35
45
  }
36
46
  /**
37
47
  * Runs `adb -s <deviceId> <commandArguments>` and returns stdout **undecoded**.
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var avd_name_channel_exports = {};
20
+ __export(avd_name_channel_exports, {
21
+ FIRST_AVD_NAME_CHANNEL: () => FIRST_AVD_NAME_CHANNEL,
22
+ buildAvdNameChannelArguments: () => buildAvdNameChannelArguments,
23
+ buildAvdNameChannelCommand: () => buildAvdNameChannelCommand,
24
+ describeAdbCommand: () => describeAdbCommand,
25
+ parseAvdNameAnswer: () => parseAvdNameAnswer,
26
+ resolveNextAvdNameChannel: () => resolveNextAvdNameChannel
27
+ });
28
+ module.exports = __toCommonJS(avd_name_channel_exports);
29
+ var import_type_guards = require("./type-guards.cjs");
30
+ const FIRST_AVD_NAME_CHANNEL = "getprop-boot";
31
+ const AVD_NAME_PROPERTY_BY_CHANNEL = {
32
+ "getprop-boot": "ro.boot.qemu.avd_name",
33
+ "getprop-kernel": "ro.kernel.qemu.avd_name"
34
+ };
35
+ function buildAvdNameChannelArguments(params) {
36
+ return ["-s", params.deviceId, ...buildAvdNameChannelCommand(params.channel)];
37
+ }
38
+ function buildAvdNameChannelCommand(channel) {
39
+ return channel === "console" ? ["emu", "avd", "name"] : ["shell", "getprop", AVD_NAME_PROPERTY_BY_CHANNEL[channel]];
40
+ }
41
+ function describeAdbCommand(commandArguments) {
42
+ return `adb ${commandArguments.join(" ")}`;
43
+ }
44
+ function parseAvdNameAnswer(stdout) {
45
+ const lineBreakIndex = stdout.indexOf("\n");
46
+ const firstLine = lineBreakIndex === -1 ? stdout : stdout.slice(0, lineBreakIndex);
47
+ return firstLine.trim();
48
+ }
49
+ function resolveNextAvdNameChannel(params) {
50
+ switch (params.channel) {
51
+ case "console": {
52
+ return void 0;
53
+ }
54
+ case "getprop-boot": {
55
+ return params.didChannelRespond ? "getprop-kernel" : "console";
56
+ }
57
+ case "getprop-kernel": {
58
+ return "console";
59
+ }
60
+ default: {
61
+ return (0, import_type_guards.assertNever)(params.channel);
62
+ }
63
+ }
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ FIRST_AVD_NAME_CHANNEL,
68
+ buildAvdNameChannelArguments,
69
+ buildAvdNameChannelCommand,
70
+ describeAdbCommand,
71
+ parseAvdNameAnswer,
72
+ resolveNextAvdNameChannel
73
+ });
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1uYW1lLWNoYW5uZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgY2hhbm5lbHMgYSBydW4gY2FuIGFzayAqXCJ3aGljaCBBVkQgaXMgdGhpcyBkZXZpY2Ugc2VydmluZz9cIiosIGFuZCB0aGVcbiAqIG9yZGVyIHRvIGFzayB0aGVtIGluLlxuICpcbiAqICoqTDQ3KiogbWFkZSB0aGUgYWRvcHRpb24gcHJvYmUgcmVmdXNlIHJhdGhlciB0aGFuIGNvbGxpZGUgd2hlbiBhIGRldmljZSBkaWRcbiAqIG5vdCBhbnN3ZXIuIEl0IGFza2VkIHRoYXQgcXVlc3Rpb24gb3ZlciB0aGUgZW11bGF0b3IncyAqKmNvbnNvbGUqKiBcdTIwMTQgYSBzZWNvbmRcbiAqIFRDUCBwb3J0LCB3aXRoIGl0cyBvd24gYXV0aCB0b2tlbiBhbmQgaXRzIG93biB3YXlzIG9mIHdlZGdpbmcsIGVudGlyZWx5XG4gKiBzZXBhcmF0ZSBmcm9tIHRoZSBgYWRiZGAgY2hhbm5lbCBldmVyeSBvdGhlciBjYWxsIGluIHRoZSBydW4gdHJhdmVscy4gU28gYVxuICogc2luZ2xlIGVtdWxhdG9yIHdob3NlIGNvbnNvbGUgaXMgd2VkZ2VkIFx1MjAxNCByb3V0aW5lbHkgKiphbm90aGVyIHByb2plY3QncyoqLFxuICogd2l0aCB0aGUgYnVsayBydW5uZXIgc3dlZXBpbmcgc2V2ZXJhbCBwcm9qZWN0cyBhdCBvbmNlIFx1MjAxNCB0b29rIGV2ZXJ5IE9ic2lkaWFuXG4gKiBBbmRyb2lkIHN1aXRlIG9uIHRoZSBtYWNoaW5lIG91dCBvZiBzZXJ2aWNlOlxuICpcbiAqIGBgYHRleHRcbiAqIFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bV0gQVZEIHByb2JlOiBlbXVsYXRvci01NTcwPW5vLWFuc3dlci5cbiAqIEVycm9yOiBBVkQgXCJvYnNpZGlhbl90ZXN0XCI6IGRldmljZSBlbXVsYXRvci01NTcwIGRpZCBub3QgYW5zd2VyIGBhZGIgLXMgZW11bGF0b3ItNTU3MCBlbXUgYXZkIG5hbWVgIC4uLlxuICogYGBgXG4gKlxuICogYGFkYiBkZXZpY2VzYCBsaXN0ZWQgYGVtdWxhdG9yLTU1NzBgIGFzIGBkZXZpY2VgIGFuZCBhZGIgaXRzZWxmIHdhcyBwZXJmZWN0bHlcbiAqIHJlc3BvbnNpdmUgdGhyb3VnaG91dDsgb25seSBpdHMgY29uc29sZSB3YXMgZ29uZS4gVGhlIHJlZnVzYWwgd2FzIHJpZ2h0IFx1MjAxNFxuICogbGF1bmNoaW5nIGEgc2Vjb25kIGNvcHkgb2YgYW4gQVZEIGhpdHMgYEZBVEFMIHwgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnNcbiAqIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCBcdTIwMTQgYnV0IGl0IHdhcyBrZXllZCBvbiB0aGUgb25lXG4gKiBjaGFubmVsIHRoZSBydW4gZG9lcyAqKm5vdCoqIG90aGVyd2lzZSBkZXBlbmQgb24uXG4gKlxuICogVGhlIEFWRCBuYW1lIGlzIGFsc28gYSBndWVzdCBzeXN0ZW0gcHJvcGVydHksIHJlYWRhYmxlIG92ZXIgdGhlIHNhbWUgYGFkYmRgXG4gKiBjaGFubmVsIHRoZSBydW4gbmVlZHMgYW55d2F5LCBzbyBpdCBjYW5ub3QgYmUgd2VkZ2VkIGluZGVwZW5kZW50bHkgb2YgdGhlXG4gKiBjb25uZWN0aW9uIHRoZSBydW4gaXMgYWJvdXQgdG8gdXNlOlxuICpcbiAqIGBgYHRleHRcbiAqIGFkYiAtcyA8ZGV2aWNlPiBzaGVsbCBnZXRwcm9wIHJvLmJvb3QucWVtdS5hdmRfbmFtZSAgICAgIyBtb2Rlcm4gaW1hZ2VzXG4gKiBhZGIgLXMgPGRldmljZT4gc2hlbGwgZ2V0cHJvcCByby5rZXJuZWwucWVtdS5hdmRfbmFtZSAgICMgb2xkZXIgaW1hZ2VzXG4gKiBgYGBcbiAqXG4gKiBIZW5jZSB0aGlzIG9yZGVyaW5nOiBwcm9wZXJ0eSBmaXJzdCwgY29uc29sZSBvbmx5IGFzIGEgZmFsbGJhY2sgZm9yIGFuIGltYWdlXG4gKiB0aGF0IHJlcG9ydHMgbmVpdGhlci4gVGhlIGhhcmQgcmVmdXNhbCBzdGF5cyBmb3IgdGhlIGdlbnVpbmVseS11bmtub3dhYmxlXG4gKiBkZXZpY2UgXHUyMDE0IGEgc2lsZW50IG9uZSBtYXkgd2VsbCBiZSB0aGUgQVZEJ3MgaG9sZGVyIFx1MjAxNCBpdCBpcyBzaW1wbHkgcmVhY2hlZCBmYXJcbiAqIGxlc3Mgb2Z0ZW4uXG4gKlxuICogKipBIGRlYWQgY2hhbm5lbCBpcyBub3QgYXNrZWQgdHdpY2UuKiogV2hlbiB0aGUgYGFkYiBzaGVsbGAgY2FsbCBpdHNlbGYgZmFpbHNcbiAqIG9yIHRpbWVzIG91dCwgdGhlIHNlY29uZCBwcm9wZXJ0eSBrZXkgaXMgc2tpcHBlZDogaXQgdHJhdmVscyB0aGUgc2FtZSBjaGFubmVsXG4gKiB0aGF0IGhhcyBqdXN0IHByb3ZlZCB1bnVzYWJsZSwgYW5kIHdvdWxkIG9ubHkgc3BlbmQgYW5vdGhlciBmdWxsIHRpbWVvdXQgdG9cbiAqIGxlYXJuIHRoZSBzYW1lIHRoaW5nLiBBbiAqYW5zd2VyZWQqIGJ1dCBlbXB0eSBwcm9wZXJ0eSBpcyB0aGUgb3Bwb3NpdGUgXHUyMDE0IHRoZVxuICogY2hhbm5lbCBpcyBhbGl2ZSBhbmQgdGhlIGltYWdlIHNpbXBseSBkb2VzIG5vdCBjYXJyeSB0aGF0IGtleSBcdTIwMTQgc28gdGhlXG4gKiBjaGVhcGVyIHNpYmxpbmcga2V5IGlzIHdvcnRoIGFza2luZy4gVGhhdCBkaXN0aW5jdGlvbiBpcyB3aGF0IGtlZXBzIGEgd2VkZ2VkXG4gKiBkZXZpY2UncyB3b3JzdCBjYXNlIGF0IHR3byB0aW1lb3V0cyBwZXIgYXR0ZW1wdCByYXRoZXIgdGhhbiB0aHJlZS5cbiAqXG4gKiBQdXJlIGFuZCB1bml0LXRlc3RlZDsgdGhlIGBhZGJgIHJvdW5kLXRyaXBzIGxpdmUgaW4gYHRyYW5zcG9ydC1mYWN0b3J5YCBhbmRcbiAqIGByZXNvbHZlLWVtdWxhdG9yLWRldmljZS1pZGAsIHdoaWNoIGFyZSBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5cbi8qKlxuICogT25lIHdheSBvZiBhc2tpbmcgYSBkZXZpY2Ugd2hpY2ggQVZEIGl0IHdhcyBzdGFydGVkIGZyb20uXG4gKlxuICogYGdldHByb3AtYm9vdGAgYW5kIGBnZXRwcm9wLWtlcm5lbGAgdHJhdmVsIGBhZGJkYCBcdTIwMTQgdGhlIGNoYW5uZWwgdGhlIHJ1blxuICogZGVwZW5kcyBvbiBhbnl3YXk7IGBjb25zb2xlYCBpcyB0aGUgZW11bGF0b3IncyBvd24gVENQIGNvbnNvbGUsIHdoaWNoIGNhblxuICogd2VkZ2Ugb24gaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgQXZkTmFtZUNoYW5uZWwgPSAnY29uc29sZScgfCAnZ2V0cHJvcC1ib290JyB8ICdnZXRwcm9wLWtlcm5lbCc7XG5cbi8qKlxuICogV2hhdCBvbmUgY2hhbm5lbCBhbnN3ZXJlZC5cbiAqXG4gKiBUaGUgdHdvIGZpZWxkcyBhcmUgZGVsaWJlcmF0ZWx5IGluZGVwZW5kZW50OiBhIGNoYW5uZWwgY2FuIHJlc3BvbmQgYW5kIHJlcG9ydFxuICogKipub3RoaW5nKiogKGFuIGltYWdlIHdpdGhvdXQgdGhhdCBwcm9wZXJ0eSksIHdoaWNoIGlzIGEgZmFjdCBhYm91dCB0aGVcbiAqIGltYWdlLCB3aGlsZSBhIGNoYW5uZWwgdGhhdCBkaWQgbm90IHJlc3BvbmQgaXMgYSBmYWN0IGFib3V0IHRoZSBjaGFubmVsLlxuICogQ29sbGFwc2luZyB0aGVtIGlzIHRoZSBkZWZlY3QgKipMNDcqKiBmaXhlZCBvbmUgbGV2ZWwgdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkTmFtZUNoYW5uZWxBbnN3ZXIge1xuICAvKipcbiAgV2hldGhlciB0aGUgY29tbWFuZCBpdHNlbGYgY29tcGxldGVkIFx1MjAxNCByZWdhcmRsZXNzIG9mIHdoYXQgaXQgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSBkaWRSZXNwb25kOiBib29sZWFuO1xuXG4gIC8qKlxuICBUaGUgQVZEIG5hbWUgaXQgcmVwb3J0ZWQsIG9yIGAnJ2Agd2hlbiBpdCByZXBvcnRlZCBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0ZWRBdmROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHNQYXJhbXMge1xuICAvKipcbiAgVGhlIGNoYW5uZWwgdG8gYXNrLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogQXZkTmFtZUNoYW5uZWw7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2UgdG8gYWRkcmVzcywgb3IgYSBwbGFjZWhvbGRlciBzdWNoIGFzIGA8ZGV2aWNlPmAgd2hlbiBidWlsZGluZyBhIG1lc3NhZ2UgYWJvdXQgc2V2ZXJhbC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWxQYXJhbXMge1xuICAvKipcbiAgVGhlIGNoYW5uZWwgdGhhdCB3YXMganVzdCBhc2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWw6IEF2ZE5hbWVDaGFubmVsO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoYXQgY2hhbm5lbCdzIGNvbW1hbmQgY29tcGxldGVkIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IGRpZENoYW5uZWxSZXNwb25kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBjaGFubmVsIGEgcHJvYmUgc3RhcnRzIHdpdGg6IHRoZSBndWVzdCBwcm9wZXJ0eSwgb3ZlciBgYWRiZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBGSVJTVF9BVkRfTkFNRV9DSEFOTkVMOiBBdmROYW1lQ2hhbm5lbCA9ICdnZXRwcm9wLWJvb3QnO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gcHJvcGVydHkgZWFjaCBgZ2V0cHJvcGAgY2hhbm5lbCByZWFkcy5cbiAqXG4gKiBgcm8uYm9vdC5xZW11LmF2ZF9uYW1lYCBpcyB3aGF0IGN1cnJlbnQgc3lzdGVtIGltYWdlcyBjYXJyeTtcbiAqIGByby5rZXJuZWwucWVtdS5hdmRfbmFtZWAgaXMgdGhlIG9sZGVyIHNwZWxsaW5nLCBzdGlsbCBwcmVzZW50IG9uIGltYWdlcyB0aGVcbiAqIGhhcm5lc3Mgc3VwcG9ydHMuXG4gKi9cbmNvbnN0IEFWRF9OQU1FX1BST1BFUlRZX0JZX0NIQU5ORUwgPSB7XG4gICdnZXRwcm9wLWJvb3QnOiAncm8uYm9vdC5xZW11LmF2ZF9uYW1lJyxcbiAgJ2dldHByb3Ata2VybmVsJzogJ3JvLmtlcm5lbC5xZW11LmF2ZF9uYW1lJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGBhZGJgIGFyZ3VtZW50cyB0aGF0IGFzayBvbmUgY2hhbm5lbCBmb3IgdGhlIEFWRCBuYW1lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY2hhbm5lbCB0byBhc2sgYW5kIHRoZSBkZXZpY2UgdG8gYWRkcmVzcy5cbiAqIEByZXR1cm5zIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byBgYWRiYCwgc3RhcnRpbmcgd2l0aCBgLXMgPGRldmljZUlkPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZE5hbWVDaGFubmVsQXJndW1lbnRzKHBhcmFtczogQnVpbGRBdmROYW1lQ2hhbm5lbEFyZ3VtZW50c1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnLXMnLCBwYXJhbXMuZGV2aWNlSWQsIC4uLmJ1aWxkQXZkTmFtZUNoYW5uZWxDb21tYW5kKHBhcmFtcy5jaGFubmVsKV07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBgYWRiYCBhcmd1bWVudHMgdGhhdCBmb2xsb3cgYC1zIDxkZXZpY2VJZD5gLlxuICpcbiAqIFNwbGl0IGZyb20ge0BsaW5rIGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHN9IGJlY2F1c2UgdGhlIHR3byBjYWxsZXJzXG4gKiBhZGRyZXNzIHRoZWlyIGRldmljZSBkaWZmZXJlbnRseTogYHRyYW5zcG9ydC1mYWN0b3J5YCBzaGVsbHMgb3V0IHRvIGBhZGJgXG4gKiBpdHNlbGYsIHdoaWxlIGByZXNvbHZlLWVtdWxhdG9yLWRldmljZS1pZGAgZ29lcyB0aHJvdWdoIGBhZGIudHNgLCB3aGljaFxuICogcHJlcGVuZHMgYC1zIDxkZXZpY2VJZD5gIG9mIGl0cyBvd24uXG4gKlxuICogQHBhcmFtIGNoYW5uZWwgLSBUaGUgY2hhbm5lbCB0byBhc2suXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBhcmd1bWVudHMsIHdpdGhvdXQgYW55IGRldmljZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZE5hbWVDaGFubmVsQ29tbWFuZChjaGFubmVsOiBBdmROYW1lQ2hhbm5lbCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNoYW5uZWwgPT09ICdjb25zb2xlJyA/IFsnZW11JywgJ2F2ZCcsICduYW1lJ10gOiBbJ3NoZWxsJywgJ2dldHByb3AnLCBBVkRfTkFNRV9QUk9QRVJUWV9CWV9DSEFOTkVMW2NoYW5uZWxdXTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGBhZGJgIGFyZ3VtZW50cyBhcyB0aGUgY29tbWFuZCBsaW5lIGEgcmVhZGVyIGNhbiBwYXN0ZS5cbiAqXG4gKiBCdWlsdCBmcm9tIHRoZSBhcmd1bWVudHMgdGhlIHJ1biBhY3R1YWxseSBwYXNzZXMgcmF0aGVyIHRoYW4gd3JpdHRlbiBvdXQgYVxuICogc2Vjb25kIHRpbWUsIHNvIGEgbWVzc2FnZSBjYW4gbmV2ZXIgcXVvdGUgYSBjb21tYW5kIHRoZSBjb2RlIGRvZXMgbm90IHJ1bi5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGBhZGJgLlxuICogQHJldHVybnMgVGhlIGZ1bGwgY29tbWFuZCBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVBZGJDb21tYW5kKGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBhZGIgJHtjb21tYW5kQXJndW1lbnRzLmpvaW4oJyAnKX1gO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBBVkQgbmFtZSBvdXQgb2Ygd2hhdCBhIGNoYW5uZWwgcHJpbnRlZC5cbiAqXG4gKiBCb3RoIGNoYW5uZWxzIGFuc3dlciBvbiB0aGUgZmlyc3QgbGluZSBcdTIwMTQgYGdldHByb3BgIHByaW50cyB0aGUgdmFsdWUgKGFuIGVtcHR5XG4gKiBsaW5lIHdoZW4gdGhlIHByb3BlcnR5IGlzIHVuc2V0KSwgdGhlIGNvbnNvbGUgcHJpbnRzIHRoZSBuYW1lIGFuZCB0aGVuIGBPS2AuXG4gKlxuICogQHBhcmFtIHN0ZG91dCAtIFdoYXQgdGhlIGNvbW1hbmQgcHJpbnRlZC5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnRlZCBBVkQgbmFtZSwgb3IgYCcnYCB3aGVuIGl0IHJlcG9ydGVkIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF2ZE5hbWVBbnN3ZXIoc3Rkb3V0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvKlxuICAgKiBTbGljZWQgcmF0aGVyIHRoYW4gYW4gaW5kZXhlZCByZWFkIHdpdGggYSBgPz8gJydgIGZhbGxiYWNrOiBubyBpbnB1dCBjYW5cbiAgICogcmVhY2ggdGhhdCBmYWxsYmFjaywgYW5kIHRoZSBwZXItZmlsZSBjb3ZlcmFnZSBnYXRlIHRoZW4gcmVwb3J0cyBpdCBhcyBhblxuICAgKiB1bmNvdmVyZWQgYnJhbmNoIGZvciB0aGUgcmVzdCBvZiB0aGUgZmlsZSdzIGxpZmUuXG4gICAqL1xuICBjb25zdCBsaW5lQnJlYWtJbmRleCA9IHN0ZG91dC5pbmRleE9mKCdcXG4nKTtcbiAgY29uc3QgZmlyc3RMaW5lID0gbGluZUJyZWFrSW5kZXggPT09IC0xID8gc3Rkb3V0IDogc3Rkb3V0LnNsaWNlKDAsIGxpbmVCcmVha0luZGV4KTtcblxuICByZXR1cm4gZmlyc3RMaW5lLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgbmV4dCBjaGFubmVsIHRvIGFzayBhZnRlciBvbmUgZmFpbGVkIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjaGFubmVsIGp1c3QgYXNrZWQsIGFuZCB3aGV0aGVyIGl0cyBjb21tYW5kIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIFRoZSBuZXh0IGNoYW5uZWwsIG9yIGB1bmRlZmluZWRgIG9uY2UgZXZlcnkgY2hhbm5lbCBoYXMgYmVlbiBhc2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWwocGFyYW1zOiBSZXNvbHZlTmV4dEF2ZE5hbWVDaGFubmVsUGFyYW1zKTogQXZkTmFtZUNoYW5uZWwgfCB1bmRlZmluZWQge1xuICBzd2l0Y2ggKHBhcmFtcy5jaGFubmVsKSB7XG4gICAgY2FzZSAnY29uc29sZSc6IHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhc2UgJ2dldHByb3AtYm9vdCc6IHtcbiAgICAgIC8qXG4gICAgICAgKiBBIGBnZXRwcm9wYCB0aGF0IG5ldmVyIGNhbWUgYmFjayBzYXlzIHRoZSBgYWRiZGAgY2hhbm5lbCBpcyB1bnVzYWJsZSxcbiAgICAgICAqIHNvIHRoZSBzaWJsaW5nIGtleSBcdTIwMTQgd2hpY2ggdHJhdmVscyB0aGF0IHNhbWUgY2hhbm5lbCBcdTIwMTQgd291bGQgb25seSBzcGVuZFxuICAgICAgICogYW5vdGhlciBmdWxsIHRpbWVvdXQuIEEgY2hhbm5lbCB0aGF0IGFuc3dlcmVkIG5vdGhpbmcgc2F5cyBvbmx5IHRoYXRcbiAgICAgICAqIHRoaXMgaW1hZ2UgZG9lcyBub3QgY2FycnkgdGhhdCBrZXksIHdoaWNoIHRoZSBzaWJsaW5nIG1heSB3ZWxsIGNhcnJ5LlxuICAgICAgICovXG4gICAgICByZXR1cm4gcGFyYW1zLmRpZENoYW5uZWxSZXNwb25kID8gJ2dldHByb3Ata2VybmVsJyA6ICdjb25zb2xlJztcbiAgICB9XG4gICAgY2FzZSAnZ2V0cHJvcC1rZXJuZWwnOiB7XG4gICAgICByZXR1cm4gJ2NvbnNvbGUnO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIocGFyYW1zLmNoYW5uZWwpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtREEseUJBQTRCO0FBZ0VyQixNQUFNLHlCQUF5QztBQVN0RCxNQUFNLCtCQUErQjtBQUFBLEVBQ25DLGdCQUFnQjtBQUFBLEVBQ2hCLGtCQUFrQjtBQUNwQjtBQVFPLFNBQVMsNkJBQTZCLFFBQXNEO0FBQ2pHLFNBQU8sQ0FBQyxNQUFNLE9BQU8sVUFBVSxHQUFHLDJCQUEyQixPQUFPLE9BQU8sQ0FBQztBQUM5RTtBQWFPLFNBQVMsMkJBQTJCLFNBQW1DO0FBQzVFLFNBQU8sWUFBWSxZQUFZLENBQUMsT0FBTyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsV0FBVyw2QkFBNkIsT0FBTyxDQUFDO0FBQ3BIO0FBV08sU0FBUyxtQkFBbUIsa0JBQTZDO0FBQzlFLFNBQU8sT0FBTyxpQkFBaUIsS0FBSyxHQUFHLENBQUM7QUFDMUM7QUFXTyxTQUFTLG1CQUFtQixRQUF3QjtBQU16RCxRQUFNLGlCQUFpQixPQUFPLFFBQVEsSUFBSTtBQUMxQyxRQUFNLFlBQVksbUJBQW1CLEtBQUssU0FBUyxPQUFPLE1BQU0sR0FBRyxjQUFjO0FBRWpGLFNBQU8sVUFBVSxLQUFLO0FBQ3hCO0FBUU8sU0FBUywwQkFBMEIsUUFBcUU7QUFDN0csVUFBUSxPQUFPLFNBQVM7QUFBQSxJQUN0QixLQUFLLFdBQVc7QUFDZCxhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxnQkFBZ0I7QUFPbkIsYUFBTyxPQUFPLG9CQUFvQixtQkFBbUI7QUFBQSxJQUN2RDtBQUFBLElBQ0EsS0FBSyxrQkFBa0I7QUFDckIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVM7QUFDUCxpQkFBTyxnQ0FBWSxPQUFPLE9BQU87QUFBQSxJQUNuQztBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The channels a run can ask *"which AVD is this device serving?"*, and the
5
+ * order to ask them in.
6
+ *
7
+ * **L47** made the adoption probe refuse rather than collide when a device did
8
+ * not answer. It asked that question over the emulator's **console** — a second
9
+ * TCP port, with its own auth token and its own ways of wedging, entirely
10
+ * separate from the `adbd` channel every other call in the run travels. So a
11
+ * single emulator whose console is wedged — routinely **another project's**,
12
+ * with the bulk runner sweeping several projects at once — took every Obsidian
13
+ * Android suite on the machine out of service:
14
+ *
15
+ * ```text
16
+ * [transport-factory:obsidian-android-appium] AVD probe: emulator-5570=no-answer.
17
+ * Error: AVD "obsidian_test": device emulator-5570 did not answer `adb -s emulator-5570 emu avd name` ...
18
+ * ```
19
+ *
20
+ * `adb devices` listed `emulator-5570` as `device` and adb itself was perfectly
21
+ * responsive throughout; only its console was gone. The refusal was right —
22
+ * launching a second copy of an AVD hits `FATAL | Running multiple emulators
23
+ * with the same AVD is an experimental feature` — but it was keyed on the one
24
+ * channel the run does **not** otherwise depend on.
25
+ *
26
+ * The AVD name is also a guest system property, readable over the same `adbd`
27
+ * channel the run needs anyway, so it cannot be wedged independently of the
28
+ * connection the run is about to use:
29
+ *
30
+ * ```text
31
+ * adb -s <device> shell getprop ro.boot.qemu.avd_name # modern images
32
+ * adb -s <device> shell getprop ro.kernel.qemu.avd_name # older images
33
+ * ```
34
+ *
35
+ * Hence this ordering: property first, console only as a fallback for an image
36
+ * that reports neither. The hard refusal stays for the genuinely-unknowable
37
+ * device — a silent one may well be the AVD's holder — it is simply reached far
38
+ * less often.
39
+ *
40
+ * **A dead channel is not asked twice.** When the `adb shell` call itself fails
41
+ * or times out, the second property key is skipped: it travels the same channel
42
+ * that has just proved unusable, and would only spend another full timeout to
43
+ * learn the same thing. An *answered* but empty property is the opposite — the
44
+ * channel is alive and the image simply does not carry that key — so the
45
+ * cheaper sibling key is worth asking. That distinction is what keeps a wedged
46
+ * device's worst case at two timeouts per attempt rather than three.
47
+ *
48
+ * Pure and unit-tested; the `adb` round-trips live in `transport-factory` and
49
+ * `resolve-emulator-device-id`, which are integration-time code.
50
+ */
51
+ /**
52
+ * One way of asking a device which AVD it was started from.
53
+ *
54
+ * `getprop-boot` and `getprop-kernel` travel `adbd` — the channel the run
55
+ * depends on anyway; `console` is the emulator's own TCP console, which can
56
+ * wedge on its own.
57
+ */
58
+ export type AvdNameChannel = 'console' | 'getprop-boot' | 'getprop-kernel';
59
+ /**
60
+ * What one channel answered.
61
+ *
62
+ * The two fields are deliberately independent: a channel can respond and report
63
+ * **nothing** (an image without that property), which is a fact about the
64
+ * image, while a channel that did not respond is a fact about the channel.
65
+ * Collapsing them is the defect **L47** fixed one level up.
66
+ */
67
+ export interface AvdNameChannelAnswer {
68
+ /**
69
+ Whether the command itself completed — regardless of what it reported.
70
+ */
71
+ readonly didRespond: boolean;
72
+ /**
73
+ The AVD name it reported, or `''` when it reported none.
74
+ */
75
+ readonly reportedAvdName: string;
76
+ }
77
+ /**
78
+ * Parameters for {@link buildAvdNameChannelArguments}.
79
+ */
80
+ export interface BuildAvdNameChannelArgumentsParams {
81
+ /**
82
+ The channel to ask.
83
+ */
84
+ readonly channel: AvdNameChannel;
85
+ /**
86
+ The device to address, or a placeholder such as `<device>` when building a message about several.
87
+ */
88
+ readonly deviceId: string;
89
+ }
90
+ /**
91
+ * Parameters for {@link resolveNextAvdNameChannel}.
92
+ */
93
+ export interface ResolveNextAvdNameChannelParams {
94
+ /**
95
+ The channel that was just asked.
96
+ */
97
+ readonly channel: AvdNameChannel;
98
+ /**
99
+ Whether that channel's command completed at all.
100
+ */
101
+ readonly didChannelRespond: boolean;
102
+ }
103
+ /**
104
+ * The channel a probe starts with: the guest property, over `adbd`.
105
+ */
106
+ export declare const FIRST_AVD_NAME_CHANNEL: AvdNameChannel;
107
+ /**
108
+ * Builds the `adb` arguments that ask one channel for the AVD name.
109
+ *
110
+ * @param params - The channel to ask and the device to address.
111
+ * @returns The arguments to pass to `adb`, starting with `-s <deviceId>`.
112
+ */
113
+ export declare function buildAvdNameChannelArguments(params: BuildAvdNameChannelArgumentsParams): string[];
114
+ /**
115
+ * Builds the `adb` arguments that follow `-s <deviceId>`.
116
+ *
117
+ * Split from {@link buildAvdNameChannelArguments} because the two callers
118
+ * address their device differently: `transport-factory` shells out to `adb`
119
+ * itself, while `resolve-emulator-device-id` goes through `adb.ts`, which
120
+ * prepends `-s <deviceId>` of its own.
121
+ *
122
+ * @param channel - The channel to ask.
123
+ * @returns The command arguments, without any device selection.
124
+ */
125
+ export declare function buildAvdNameChannelCommand(channel: AvdNameChannel): string[];
126
+ /**
127
+ * Renders `adb` arguments as the command line a reader can paste.
128
+ *
129
+ * Built from the arguments the run actually passes rather than written out a
130
+ * second time, so a message can never quote a command the code does not run.
131
+ *
132
+ * @param commandArguments - The arguments passed to `adb`.
133
+ * @returns The full command line.
134
+ */
135
+ export declare function describeAdbCommand(commandArguments: readonly string[]): string;
136
+ /**
137
+ * Reads the AVD name out of what a channel printed.
138
+ *
139
+ * Both channels answer on the first line — `getprop` prints the value (an empty
140
+ * line when the property is unset), the console prints the name and then `OK`.
141
+ *
142
+ * @param stdout - What the command printed.
143
+ * @returns The reported AVD name, or `''` when it reported none.
144
+ */
145
+ export declare function parseAvdNameAnswer(stdout: string): string;
146
+ /**
147
+ * Picks the next channel to ask after one failed to identify the device.
148
+ *
149
+ * @param params - The channel just asked, and whether its command completed.
150
+ * @returns The next channel, or `undefined` once every channel has been asked.
151
+ */
152
+ export declare function resolveNextAvdNameChannel(params: ResolveNextAvdNameChannelParams): AvdNameChannel | undefined;
@@ -25,6 +25,7 @@ __export(avd_probe_verdict_exports, {
25
25
  resolveAvdProbeVerdict: () => resolveAvdProbeVerdict
26
26
  });
27
27
  module.exports = __toCommonJS(avd_probe_verdict_exports);
28
+ var import_avd_name_channel = require("./avd-name-channel.cjs");
28
29
  var import_type_guards = require("./type-guards.cjs");
29
30
  const EMULATOR_DEVICE_ID_PATTERN = /^emulator-\d+$/;
30
31
  function buildAvdProbeSummary(results) {
@@ -34,10 +35,16 @@ function buildUnreadableDevicesMessage(params) {
34
35
  const deviceList = params.unreadableDeviceIds.join(", ");
35
36
  const isSingle = params.unreadableDeviceIds.length === 1;
36
37
  const subject = isSingle ? `device ${deviceList}` : `devices ${deviceList}`;
37
- const command = isSingle ? `adb -s ${deviceList} emu avd name` : "adb -s <device> emu avd name";
38
+ const deviceLabel = isSingle ? deviceList : "<device>";
39
+ const propertyCommand = (0, import_avd_name_channel.describeAdbCommand)((0, import_avd_name_channel.buildAvdNameChannelArguments)({ channel: import_avd_name_channel.FIRST_AVD_NAME_CHANNEL, deviceId: deviceLabel }));
40
+ const consoleCommand = (0, import_avd_name_channel.describeAdbCommand)((0, import_avd_name_channel.buildAvdNameChannelArguments)({ channel: "console", deviceId: deviceLabel }));
38
41
  const holder = isSingle ? "it is" : "one of them is";
39
- const remedy = isSingle ? "Kill the unresponsive device" : "Kill the unresponsive devices";
40
- return `AVD "${params.avdName}": ${subject} did not answer \`${command}\` within ${String(params.probeTimeoutInMilliseconds)}ms (retried once), so this run cannot tell whether ${holder} already serving that AVD. Starting an emulator anyway would collide (\`FATAL | Running multiple emulators with the same AVD is an experimental feature\`), which the emulator reports only to its own stdout. ${remedy}, or run \`adb kill-server\`, then retry.`;
42
+ const identified = isSingle ? "identified itself" : "identified themselves";
43
+ const owner = isSingle ? "A device this run cannot read is most likely ANOTHER run's" : "Devices this run cannot read are most likely OTHER runs'";
44
+ const killing = isSingle ? "killing it" : "killing them";
45
+ const ownership = isSingle ? "the device is yours" : "the devices are yours";
46
+ const otherRun = isSingle ? "that run" : "those runs";
47
+ return `AVD "${params.avdName}": ${subject} ${identified} over neither \`${propertyCommand}\` (the guest property, over adbd) nor \`${consoleCommand}\` (the emulator's own console) within ${String(params.probeTimeoutInMilliseconds)}ms each (retried once), so this run cannot tell whether ${holder} already serving that AVD. Starting an emulator anyway would collide (\`FATAL | Running multiple emulators with the same AVD is an experimental feature\`), which the emulator reports only to its own stdout. ${owner}: ${killing}, or running \`adb kill-server\`, destroys work this run cannot see, so do that only once you know ${ownership}. Otherwise wait for ${otherRun} to finish, and retry once \`adb devices\` no longer lists it.`;
41
48
  }
42
49
  function checkIsEmulatorDeviceId(deviceId) {
43
50
  return EMULATOR_DEVICE_ID_PATTERN.test(deviceId);
@@ -81,4 +88,4 @@ function resolveAvdProbeVerdict(results) {
81
88
  classifyAvdProbe,
82
89
  resolveAvdProbeVerdict
83
90
  });
84
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1wcm9iZS12ZXJkaWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgQVZEIGFkb3B0aW9uIHByb2JlIFx1MjAxNCBkZWNpZGluZywgZnJvbSB3aGF0IGVhY2hcbiAqIGNvbm5lY3RlZCBkZXZpY2UgYW5zd2VyZWQsIHdoZXRoZXIgdGhpcyBydW4gbWF5IHJldXNlIG9uZSwgbXVzdCBzdGFydCBpdHNcbiAqIG93biBlbXVsYXRvciwgb3IgY2Fubm90IHNhZmVseSBkbyBlaXRoZXIuXG4gKlxuICogVGhlIHByb2JlIChgYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZWApIHVzZWQgdG8gZGlzY2FyZCBpdHMgZXJyb3IgYW5kXG4gKiByZXNvbHZlIGAnJ2AsIHNvIGEgY2FsbCB0aGF0ICoqbmV2ZXIgYW5zd2VyZWQqKiB3YXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAqIHRoYXQgYW5zd2VyZWQgKlwiYSBkaWZmZXJlbnQgQVZEXCIqLiBCb3RoIGZlbGwgdGhyb3VnaCB0byBcInN0YXJ0IGEgbmV3XG4gKiBlbXVsYXRvclwiLCB3aGljaCBjb2xsaWRlcyB3aXRoIHRoZSBlbXVsYXRvciBhbHJlYWR5IHNlcnZpbmcgdGhhdCBBVkQ6XG4gKlxuICogYGBgdGV4dFxuICogMTQ6Mjc6NTIuMTE0ICBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCJvYnNpZGlhbl90ZXN0XCIuLi4gKGNvbm5lY3RlZDogW2VtdWxhdG9yLTU1NTRdKVxuICogMTQ6Mjc6NTcuMTcwICBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uXG4gKiBgYGBcbiAqXG4gKiA1LjA1NnMgYXBhcnQgXHUyMDE0IGV4YWN0bHkgdGhlIHByb2JlJ3Mgb3duIHRpbWVvdXQuIFRoZSBsYXVuY2ggdGhhdCBmb2xsb3dlZCBoaXRcbiAqIGBGQVRBTCB8IFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbFxuICogZmVhdHVyZWAsIHdoaWNoIHRoZSBlbXVsYXRvciB3cml0ZXMgdG8gaXRzIG93biBzdGRvdXQuICoqQSBwcm9iZSB0aGF0IG5ldmVyXG4gKiBhbnN3ZXJlZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYW5zd2VyIGlzIG5vKiogXHUyMDE0IHRoZSBzYW1lIGRpc3RpbmN0aW9uXG4gKiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3cyBiZXR3ZWVuIGBvZmZsaW5lYCBhbmQgYWJzZW50LCBhbmQgdGhlIHNhbWUgb25lXG4gKiB0aGUgY29ubmVjdGl2aXR5IHByb2JlIGRyYXdzIGJldHdlZW4gYSBmYWlsZWQgZHVtcCBhbmQgYSBtaXNzaW5nIG5ldHdvcmsuXG4gKlxuICogV29yc2UsIHRoZSBwcm9iZSBpcyBhc2tlZCBpdHMgcXVlc3Rpb24gcHJlY2lzZWx5IHdoZW4gdGhlIGd1ZXN0IGlzIGxlYXN0IGFibGVcbiAqIHRvIGFuc3dlciBpdCBcdTIwMTQgYSB3ZWRnZWQgZW11bGF0b3IgdGltZXMgb3V0IGV2ZXJ5IGBhZGJgIGNhbGwgXHUyMDE0IHdoaWNoIGlzIHRoZVxuICogY29uZGl0aW9uIHVuZGVyIHdoaWNoIGEgY29sbGlkaW5nIGxhdW5jaCBkb2VzIHRoZSBtb3N0IGRhbWFnZS5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCAoZXhjbHVkZWQgZnJvbVxuICogdW5pdCB0ZXN0cykgc28gdGhlIGNsYXNzaWZpY2F0aW9uIHN0YXlzIHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZlxuICogc2hlbGxzIG91dCB0byBgYWRiYC5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcblxuLyoqXG4gKiBXaGF0IG9uZSBkZXZpY2UgYW5zd2VyZWQgd2hlbiBhc2tlZCB3aGljaCBBVkQgaXQgaXMgc2VydmluZy5cbiAqXG4gKiBgbm90LWFuLWVtdWxhdG9yYCBhbmQgYG90aGVyLWF2ZGAgYXJlIGJvdGggbGVnaXRpbWF0ZSBza2lwczsgb25seVxuICogYG5vLWFuc3dlcmAgaXMgdGhlIHNpbGVuY2UgdGhhdCBtdXN0IG5ldmVyIGJlIHJlYWQgYXMgb25lLlxuICovXG5leHBvcnQgdHlwZSBBdmRQcm9iZU91dGNvbWUgPSAnbWF0Y2gnIHwgJ25vLWFuc3dlcicgfCAnbm90LWFuLWVtdWxhdG9yJyB8ICdvdGhlci1hdmQnO1xuXG4vKipcbiAqIFRoZSBydW4gY2Fubm90IHRlbGwgd2hldGhlciB0aGUgQVZEIGlzIGFscmVhZHkgcnVubmluZywgc28gaXQgbXVzdCBub3QgbGF1bmNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlUmVmdXNlVmVyZGljdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlcyB0aGF0IGNvdWxkIG5vdCBiZSByZWFkLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBydWxlZCBvdXQgYXMgdGhlIEFWRCdzIGhvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHVucmVhZGFibGVEZXZpY2VJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAncmVmdXNlJztcbn1cblxuLyoqXG4gKiBPbmUgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVJlc3VsdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIFVESUQsIGUuZy4gYGVtdWxhdG9yLTU1NTRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgV2hhdCB0aGUgZGV2aWNlIGFuc3dlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0Y29tZTogQXZkUHJvYmVPdXRjb21lO1xufVxuXG4vKipcbiAqIFRoZSBBVkQgaXMgYWxyZWFkeSBydW5uaW5nLCBvbiBhIGRldmljZSB0aGlzIHJ1biBtYXkgYWRvcHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkUHJvYmVSZXVzZVZlcmRpY3Qge1xuICAvKipcbiAgVGhlIGRldmljZSBhbHJlYWR5IHNlcnZpbmcgdGhlIHJlcXVlc3RlZCBBVkQuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAncmV1c2UnO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGRldmljZSBhbnN3ZXJlZCwgbm9uZSBpcyBzZXJ2aW5nIHRoZSBBVkQsIHNvIGxhdW5jaGluZyBjYW5ub3QgY29sbGlkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVN0YXJ0TmV3VmVyZGljdCB7XG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAnc3RhcnQtbmV3Jztcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBydW4gbWF5IGRvLCBnaXZlbiBldmVyeSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICovXG5leHBvcnQgdHlwZSBBdmRQcm9iZVZlcmRpY3QgPSBBdmRQcm9iZVJlZnVzZVZlcmRpY3QgfCBBdmRQcm9iZVJldXNlVmVyZGljdCB8IEF2ZFByb2JlU3RhcnROZXdWZXJkaWN0O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB0aGUgcnVuIHdhbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGJ1ZGdldCBlYWNoIHByb2JlIGF0dGVtcHQgd2FzIGdpdmVuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlcyB0aGF0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZURldmljZUlkczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsYXNzaWZ5QXZkUHJvYmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzaWZ5QXZkUHJvYmVQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB0aGUgcnVuIHdhbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoYXQgd2FzIHByb2JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBBVkQgbmFtZSB0aGUgZGV2aWNlIGFuc3dlcmVkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGRpZCBub3QgYW5zd2VyIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JlZEF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZGV2aWNlIElEcyBhZGIgZ2l2ZXMgZW11bGF0b3JzIHN0YXJ0ZWQgdGhlIHdheSB0aGlzIGhhcm5lc3NcbiAqIHN0YXJ0cyB0aGVtOiBgZW11bGF0b3IgLWF2ZCA8bmFtZT5gLCB3aG9zZSBjb25zb2xlIGxhbmRzIG9uIGEgbG9jYWwgcG9ydC5cbiAqXG4gKiBPbmx5IHN1Y2ggYSBkZXZpY2UgY2FuIGNvbGxpZGUgd2l0aCB0aGlzIHJ1bidzIGxhdW5jaCwgc28gb25seSBzdWNoIGEgZGV2aWNlJ3NcbiAqIHNpbGVuY2UgaXMgd29ydGggcmVmdXNpbmcgb3Zlci4gQSBwaHlzaWNhbCBoYW5kc2V0IChhbiBhcmJpdHJhcnkgc2VyaWFsKSBvciBhXG4gKiBUQ1AtYXR0YWNoZWQgZGV2aWNlIGFuc3dlcnMgYGFkYiBcdTIwMjYgZW11IGF2ZCBuYW1lYCB3aXRoIGFuIGVycm9yIGhvd2V2ZXIgaGVhbHRoeVxuICogaXQgaXM7IHJlYWRpbmcgdGhhdCBhcyBcImRpZCBub3QgYW5zd2VyXCIgd291bGQgYmxvY2sgZXZlcnkgcnVuIG9uIGEgaG9zdCB3aXRoIGFcbiAqIHBob25lIHBsdWdnZWQgaW4sIHdoaWNoIGlzIGEgd29yc2UgZGVmZWN0IHRoYW4gdGhlIG9uZSB0aGlzIG1vZHVsZSBmaXhlcy5cbiAqL1xuY29uc3QgRU1VTEFUT1JfREVWSUNFX0lEX1BBVFRFUk4gPSAvXmVtdWxhdG9yLVxcZCskLztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN1bW1hcnkgbGluZSBuYW1pbmcgd2hhdCBlYWNoIGRldmljZSBhbnN3ZXJlZC5cbiAqXG4gKiBUaGUgb2xkIGxvZyBwcmludGVkIG9ubHkgdGhlIGNvbmNsdXNpb24gKGBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZWApLFxuICogd2hpY2ggaXMgZXhhY3RseSB0aGUgbGluZSB0aGF0IHdhcyB3cm9uZzsgcHJpbnRpbmcgdGhlIGV2aWRlbmNlIG5leHQgdG8gaXQgaXNcbiAqIHdoYXQgbWFrZXMgYSBiYWQgY29uY2x1c2lvbiB2aXNpYmxlIHdpdGhvdXQgYSBzZWNvbmQgcnVuLlxuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gRXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqIEByZXR1cm5zIFRoZSBzdW1tYXJ5LCBvciBgbm8gZGV2aWNlc2Agd2hlbiBub3RoaW5nIHdhcyBjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZFByb2JlU3VtbWFyeShyZXN1bHRzOiByZWFkb25seSBBdmRQcm9iZVJlc3VsdFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc3VsdHMubGVuZ3RoID09PSAwID8gJ25vIGRldmljZXMnIDogcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gYCR7cmVzdWx0LmRldmljZUlkfT0ke3Jlc3VsdC5vdXRjb21lfWApLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByZWZ1c2FsIG1lc3NhZ2UgZm9yIGRldmljZXMgdGhhdCBjb3VsZCBub3QgYmUgcmVhZC5cbiAqXG4gKiBOYW1lcyB0aGUgZGV2aWNlLCB0aGUgQVZELCB0aGUgYnVkZ2V0LCB0aGUgY29uc2VxdWVuY2UgYW5kIHRoZSByZWNvdmVyeSBcdTIwMTQgdGhlXG4gKiBzaGFwZSBgdGVhcmRvd24tdmVyZGljdC50c2AgdXNlcyBmb3IgaXRzIG93biB3YXJuaW5nLCBiZWNhdXNlIGEgbWVzc2FnZSB0aGF0XG4gKiBzdG9wcyBhIHJ1biBoYXMgdG8gbGVhdmUgdGhlIHJlYWRlciBhYmxlIHRvIHVuYmxvY2sgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQsIHRoZSBwcm9iZSBidWRnZXQsIGFuZCB0aGUgZGV2aWNlcyB0aGF0IGRpZCBub3QgYW5zd2VyLlxuICogQHJldHVybnMgVGhlIHJlZnVzYWwgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlKHBhcmFtczogQnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICAvKlxuICAgKiBXaGVuIHRoZXJlIGlzIGV4YWN0bHkgb25lIGRldmljZSB0aGUgam9pbmVkIGxpc3QgSVMgaXRzIElELCBzbyB0aGUgc2luZ3VsYXJcbiAgICogd29yZGluZyBuZWVkcyBubyBpbmRleCBhY2Nlc3MgXHUyMDE0IGFuZCBubyB1bnJlYWNoYWJsZSBmYWxsYmFjayBmb3Igb25lLlxuICAgKi9cbiAgY29uc3QgZGV2aWNlTGlzdCA9IHBhcmFtcy51bnJlYWRhYmxlRGV2aWNlSWRzLmpvaW4oJywgJyk7XG4gIGNvbnN0IGlzU2luZ2xlID0gcGFyYW1zLnVucmVhZGFibGVEZXZpY2VJZHMubGVuZ3RoID09PSAxO1xuXG4gIGNvbnN0IHN1YmplY3QgPSBpc1NpbmdsZSA/IGBkZXZpY2UgJHtkZXZpY2VMaXN0fWAgOiBgZGV2aWNlcyAke2RldmljZUxpc3R9YDtcbiAgY29uc3QgY29tbWFuZCA9IGlzU2luZ2xlID8gYGFkYiAtcyAke2RldmljZUxpc3R9IGVtdSBhdmQgbmFtZWAgOiAnYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZSc7XG4gIGNvbnN0IGhvbGRlciA9IGlzU2luZ2xlID8gJ2l0IGlzJyA6ICdvbmUgb2YgdGhlbSBpcyc7XG4gIGNvbnN0IHJlbWVkeSA9IGlzU2luZ2xlID8gJ0tpbGwgdGhlIHVucmVzcG9uc2l2ZSBkZXZpY2UnIDogJ0tpbGwgdGhlIHVucmVzcG9uc2l2ZSBkZXZpY2VzJztcblxuICByZXR1cm4gYEFWRCBcIiR7cGFyYW1zLmF2ZE5hbWV9XCI6ICR7c3ViamVjdH0gZGlkIG5vdCBhbnN3ZXIgXFxgJHtjb21tYW5kfVxcYCB3aXRoaW4gJHtTdHJpbmcocGFyYW1zLnByb2JlVGltZW91dEluTWlsbGlzZWNvbmRzKX1tcyAocmV0cmllZCBvbmNlKSwgYFxuICAgICsgYHNvIHRoaXMgcnVuIGNhbm5vdCB0ZWxsIHdoZXRoZXIgJHtob2xkZXJ9IGFscmVhZHkgc2VydmluZyB0aGF0IEFWRC4gU3RhcnRpbmcgYW4gZW11bGF0b3IgYW55d2F5IHdvdWxkIGNvbGxpZGUgYFxuICAgICsgJyhgRkFUQUwgfCBSdW5uaW5nIG11bHRpcGxlIGVtdWxhdG9ycyB3aXRoIHRoZSBzYW1lIEFWRCBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZWApLCB3aGljaCB0aGUgZW11bGF0b3IgcmVwb3J0cyBvbmx5IHRvIGl0cyBvd24gc3Rkb3V0LiAnXG4gICAgKyBgJHtyZW1lZHl9LCBvciBydW4gXFxgYWRiIGtpbGwtc2VydmVyXFxgLCB0aGVuIHJldHJ5LmA7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgZGV2aWNlIGNhbiBob2xkIGFuIEFWRCB0aGlzIHJ1biBjb3VsZCBjb2xsaWRlIHdpdGguXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIGp1ZGdlLlxuICogQHJldHVybnMgYHRydWVgIGZvciBhIGxvY2FsbHkgc3RhcnRlZCBlbXVsYXRvciwgd2hvc2UgY29uc29sZSB0aGlzIHJ1biBjYW4gYXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0VtdWxhdG9yRGV2aWNlSWQoZGV2aWNlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1VTEFUT1JfREVWSUNFX0lEX1BBVFRFUk4udGVzdChkZXZpY2VJZCk7XG59XG5cbi8qKlxuICogQ2xhc3NpZmllcyBvbmUgZGV2aWNlJ3MgcHJvYmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQgd2FudGVkLCB0aGUgZGV2aWNlIHByb2JlZCwgYW5kIHdoYXQgaXQgYW5zd2VyZWQuXG4gKiBAcmV0dXJucyBUaGUgb3V0Y29tZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5QXZkUHJvYmUocGFyYW1zOiBDbGFzc2lmeUF2ZFByb2JlUGFyYW1zKTogQXZkUHJvYmVPdXRjb21lIHtcbiAgaWYgKCFjaGVja0lzRW11bGF0b3JEZXZpY2VJZChwYXJhbXMuZGV2aWNlSWQpKSB7XG4gICAgcmV0dXJuICdub3QtYW4tZW11bGF0b3InO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5wcm9iZWRBdmROYW1lID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLnByb2JlZEF2ZE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICduby1hbnN3ZXInO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5wcm9iZWRBdmROYW1lID09PSBwYXJhbXMuYXZkTmFtZSA/ICdtYXRjaCcgOiAnb3RoZXItYXZkJztcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoYXQgdGhlIHJ1biBtYXkgZG8sIGZyb20gZXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqXG4gKiAqKkEgbWF0Y2ggd2lucyBvdmVyIGFuIHVucmVhZGFibGUgc2libGluZy4qKiBPbmNlIHRoZSByZXF1ZXN0ZWQgQVZEIGlzIGZvdW5kXG4gKiBhbmQgcmV1c2FibGUsIGFuIHVucmVsYXRlZCB3ZWRnZWQgZGV2aWNlIGlzIHNvbWVib2R5IGVsc2UncyBwcm9ibGVtIGFuZCBtdXN0XG4gKiBub3QgYmxvY2sgYSBydW4gdGhhdCBoYXMgZXZlcnl0aGluZyBpdCBuZWVkcyBcdTIwMTQgdGhlIHNhbWUgcmVzdHJhaW50XG4gKiBgZW11bGF0b3ItYmFja2VuZC50c2Agc2hvd3MgaW4gbmV2ZXIgc3dlZXBpbmcgYSBgcWVtdSpgIGl0IGRvZXMgbm90IG93bi4gT25seVxuICogd2hlbiBub3RoaW5nIG1hdGNoZWQgZG9lcyBzaWxlbmNlIGJlY29tZSBkZWNpc2l2ZSwgYmVjYXVzZSBvbmx5IHRoZW4gd291bGQgdGhlXG4gKiBydW4gZ28gb24gdG8gbGF1bmNoLlxuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gRXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqIEByZXR1cm5zIFRoZSB2ZXJkaWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF2ZFByb2JlVmVyZGljdChyZXN1bHRzOiByZWFkb25seSBBdmRQcm9iZVJlc3VsdFtdKTogQXZkUHJvYmVWZXJkaWN0IHtcbiAgY29uc3QgdW5yZWFkYWJsZURldmljZUlkczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgc3dpdGNoIChyZXN1bHQub3V0Y29tZSkge1xuICAgICAgY2FzZSAnbWF0Y2gnOiB7XG4gICAgICAgIHJldHVybiB7IGRldmljZUlkOiByZXN1bHQuZGV2aWNlSWQsIHZlcmRpY3Q6ICdyZXVzZScgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vLWFuc3dlcic6IHtcbiAgICAgICAgdW5yZWFkYWJsZURldmljZUlkcy5wdXNoKHJlc3VsdC5kZXZpY2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90LWFuLWVtdWxhdG9yJzpcbiAgICAgIGNhc2UgJ290aGVyLWF2ZCc6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBhc3NlcnROZXZlcihyZXN1bHQub3V0Y29tZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVucmVhZGFibGVEZXZpY2VJZHMubGVuZ3RoID4gMCA/IHsgdW5yZWFkYWJsZURldmljZUlkcywgdmVyZGljdDogJ3JlZnVzZScgfSA6IHsgdmVyZGljdDogJ3N0YXJ0LW5ldycgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlDQSx5QkFBNEI7QUF3SDVCLE1BQU0sNkJBQTZCO0FBWTVCLFNBQVMscUJBQXFCLFNBQTRDO0FBQy9FLFNBQU8sUUFBUSxXQUFXLElBQUksZUFBZSxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxRQUFRLElBQUksT0FBTyxPQUFPLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDeEg7QUFZTyxTQUFTLDhCQUE4QixRQUFxRDtBQUtqRyxRQUFNLGFBQWEsT0FBTyxvQkFBb0IsS0FBSyxJQUFJO0FBQ3ZELFFBQU0sV0FBVyxPQUFPLG9CQUFvQixXQUFXO0FBRXZELFFBQU0sVUFBVSxXQUFXLFVBQVUsVUFBVSxLQUFLLFdBQVcsVUFBVTtBQUN6RSxRQUFNLFVBQVUsV0FBVyxVQUFVLFVBQVUsa0JBQWtCO0FBQ2pFLFFBQU0sU0FBUyxXQUFXLFVBQVU7QUFDcEMsUUFBTSxTQUFTLFdBQVcsaUNBQWlDO0FBRTNELFNBQU8sUUFBUSxPQUFPLE9BQU8sTUFBTSxPQUFPLHFCQUFxQixPQUFPLGFBQWEsT0FBTyxPQUFPLDBCQUEwQixDQUFDLHNEQUNyRixNQUFNLGtOQUV0QyxNQUFNO0FBQ2Y7QUFRTyxTQUFTLHdCQUF3QixVQUEyQjtBQUNqRSxTQUFPLDJCQUEyQixLQUFLLFFBQVE7QUFDakQ7QUFRTyxTQUFTLGlCQUFpQixRQUFpRDtBQUNoRixNQUFJLENBQUMsd0JBQXdCLE9BQU8sUUFBUSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxPQUFPLGtCQUFrQixVQUFhLE9BQU8sY0FBYyxXQUFXLEdBQUc7QUFDM0UsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE9BQU8sa0JBQWtCLE9BQU8sVUFBVSxVQUFVO0FBQzdEO0FBZU8sU0FBUyx1QkFBdUIsU0FBcUQ7QUFDMUYsUUFBTSxzQkFBZ0MsQ0FBQztBQUV2QyxhQUFXLFVBQVUsU0FBUztBQUM1QixZQUFRLE9BQU8sU0FBUztBQUFBLE1BQ3RCLEtBQUssU0FBUztBQUNaLGVBQU8sRUFBRSxVQUFVLE9BQU8sVUFBVSxTQUFTLFFBQVE7QUFBQSxNQUN2RDtBQUFBLE1BQ0EsS0FBSyxhQUFhO0FBQ2hCLDRCQUFvQixLQUFLLE9BQU8sUUFBUTtBQUN4QztBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUssYUFBYTtBQUNoQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFNBQVM7QUFDUCxtQkFBTyxnQ0FBWSxPQUFPLE9BQU87QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxvQkFBb0IsU0FBUyxJQUFJLEVBQUUscUJBQXFCLFNBQVMsU0FBUyxJQUFJLEVBQUUsU0FBUyxZQUFZO0FBQzlHOyIsCiAgIm5hbWVzIjogW10KfQo=
91
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1wcm9iZS12ZXJkaWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgQVZEIGFkb3B0aW9uIHByb2JlIFx1MjAxNCBkZWNpZGluZywgZnJvbSB3aGF0IGVhY2hcbiAqIGNvbm5lY3RlZCBkZXZpY2UgYW5zd2VyZWQsIHdoZXRoZXIgdGhpcyBydW4gbWF5IHJldXNlIG9uZSwgbXVzdCBzdGFydCBpdHNcbiAqIG93biBlbXVsYXRvciwgb3IgY2Fubm90IHNhZmVseSBkbyBlaXRoZXIuXG4gKlxuICogVGhlIHByb2JlIChgYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZWApIHVzZWQgdG8gZGlzY2FyZCBpdHMgZXJyb3IgYW5kXG4gKiByZXNvbHZlIGAnJ2AsIHNvIGEgY2FsbCB0aGF0ICoqbmV2ZXIgYW5zd2VyZWQqKiB3YXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAqIHRoYXQgYW5zd2VyZWQgKlwiYSBkaWZmZXJlbnQgQVZEXCIqLiBCb3RoIGZlbGwgdGhyb3VnaCB0byBcInN0YXJ0IGEgbmV3XG4gKiBlbXVsYXRvclwiLCB3aGljaCBjb2xsaWRlcyB3aXRoIHRoZSBlbXVsYXRvciBhbHJlYWR5IHNlcnZpbmcgdGhhdCBBVkQ6XG4gKlxuICogYGBgdGV4dFxuICogMTQ6Mjc6NTIuMTE0ICBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCJvYnNpZGlhbl90ZXN0XCIuLi4gKGNvbm5lY3RlZDogW2VtdWxhdG9yLTU1NTRdKVxuICogMTQ6Mjc6NTcuMTcwICBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uXG4gKiBgYGBcbiAqXG4gKiA1LjA1NnMgYXBhcnQgXHUyMDE0IGV4YWN0bHkgdGhlIHByb2JlJ3Mgb3duIHRpbWVvdXQuIFRoZSBsYXVuY2ggdGhhdCBmb2xsb3dlZCBoaXRcbiAqIGBGQVRBTCB8IFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbFxuICogZmVhdHVyZWAsIHdoaWNoIHRoZSBlbXVsYXRvciB3cml0ZXMgdG8gaXRzIG93biBzdGRvdXQuICoqQSBwcm9iZSB0aGF0IG5ldmVyXG4gKiBhbnN3ZXJlZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYW5zd2VyIGlzIG5vKiogXHUyMDE0IHRoZSBzYW1lIGRpc3RpbmN0aW9uXG4gKiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3cyBiZXR3ZWVuIGBvZmZsaW5lYCBhbmQgYWJzZW50LCBhbmQgdGhlIHNhbWUgb25lXG4gKiB0aGUgY29ubmVjdGl2aXR5IHByb2JlIGRyYXdzIGJldHdlZW4gYSBmYWlsZWQgZHVtcCBhbmQgYSBtaXNzaW5nIG5ldHdvcmsuXG4gKlxuICogV29yc2UsIHRoZSBwcm9iZSBpcyBhc2tlZCBpdHMgcXVlc3Rpb24gcHJlY2lzZWx5IHdoZW4gdGhlIGd1ZXN0IGlzIGxlYXN0IGFibGVcbiAqIHRvIGFuc3dlciBpdCBcdTIwMTQgYSB3ZWRnZWQgZW11bGF0b3IgdGltZXMgb3V0IGV2ZXJ5IGBhZGJgIGNhbGwgXHUyMDE0IHdoaWNoIGlzIHRoZVxuICogY29uZGl0aW9uIHVuZGVyIHdoaWNoIGEgY29sbGlkaW5nIGxhdW5jaCBkb2VzIHRoZSBtb3N0IGRhbWFnZS5cbiAqXG4gKiAqKldoYXQgdGhlIHByb2JlIEFTS1MgbW92ZWQgc2luY2U7IHdoYXQgaXQgZGVjaWRlcyBkaWQgbm90LioqIFRoZSBxdWVzdGlvblxuICogbm93IHRyYXZlbHMgdGhlIGd1ZXN0IHByb3BlcnR5IG92ZXIgYGFkYmRgIGZpcnN0IGFuZCB0aGUgZW11bGF0b3IgY29uc29sZSBvbmx5XG4gKiBhcyBhIGZhbGxiYWNrIChgYXZkLW5hbWUtY2hhbm5lbC50c2ApLCBiZWNhdXNlIGtleWluZyBhIG1hY2hpbmUtd2lkZSByZWZ1c2FsXG4gKiBvbiB0aGUgY29uc29sZSBhbG9uZSBsZXQgb25lIHdlZGdlZCBlbXVsYXRvciBcdTIwMTQgdXN1YWxseSBhbm90aGVyIHByb2plY3QncyBcdTIwMTRcbiAqIHN0b3AgZXZlcnkgQW5kcm9pZCBydW4gb24gdGhlIGhvc3QuIFRoZSBmb3VyIG91dGNvbWVzIGFuZCB0aGUgdGhyZWUgdmVyZGljdHNcbiAqIGhlcmUgYXJlIHVuY2hhbmdlZDogc2lsZW5jZSBpcyBzdGlsbCBub3QgYSBza2lwLCBpdCBpcyBzaW1wbHkgZmFyIHJhcmVyLlxuICpcbiAqIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIChleGNsdWRlZCBmcm9tXG4gKiB1bml0IHRlc3RzKSBzbyB0aGUgY2xhc3NpZmljYXRpb24gc3RheXMgdW5pdC10ZXN0YWJsZSBcdTIwMTQgdGhlIGZhY3RvcnkgaXRzZWxmXG4gKiBzaGVsbHMgb3V0IHRvIGBhZGJgLlxuICovXG5cbmltcG9ydCB7XG4gIGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHMsXG4gIGRlc2NyaWJlQWRiQ29tbWFuZCxcbiAgRklSU1RfQVZEX05BTUVfQ0hBTk5FTFxufSBmcm9tICcuL2F2ZC1uYW1lLWNoYW5uZWwuY2pzJztcbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5janMnO1xuXG4vKipcbiAqIFdoYXQgb25lIGRldmljZSBhbnN3ZXJlZCB3aGVuIGFza2VkIHdoaWNoIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICpcbiAqIGBub3QtYW4tZW11bGF0b3JgIGFuZCBgb3RoZXItYXZkYCBhcmUgYm90aCBsZWdpdGltYXRlIHNraXBzOyBvbmx5XG4gKiBgbm8tYW5zd2VyYCBpcyB0aGUgc2lsZW5jZSB0aGF0IG11c3QgbmV2ZXIgYmUgcmVhZCBhcyBvbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEF2ZFByb2JlT3V0Y29tZSA9ICdtYXRjaCcgfCAnbm8tYW5zd2VyJyB8ICdub3QtYW4tZW11bGF0b3InIHwgJ290aGVyLWF2ZCc7XG5cbi8qKlxuICogVGhlIHJ1biBjYW5ub3QgdGVsbCB3aGV0aGVyIHRoZSBBVkQgaXMgYWxyZWFkeSBydW5uaW5nLCBzbyBpdCBtdXN0IG5vdCBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkUHJvYmVSZWZ1c2VWZXJkaWN0IHtcbiAgLyoqXG4gIFRoZSBkZXZpY2VzIHRoYXQgY291bGQgbm90IGJlIHJlYWQsIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIHJ1bGVkIG91dCBhcyB0aGUgQVZEJ3MgaG9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZURldmljZUlkczogc3RyaW5nW107XG5cbiAgLyoqXG4gIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdyZWZ1c2UnO1xufVxuXG4vKipcbiAqIE9uZSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlUmVzdWx0IHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCwgZS5nLiBgZW11bGF0b3ItNTU1NGAuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGF0IHRoZSBkZXZpY2UgYW5zd2VyZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiBBdmRQcm9iZU91dGNvbWU7XG59XG5cbi8qKlxuICogVGhlIEFWRCBpcyBhbHJlYWR5IHJ1bm5pbmcsIG9uIGEgZGV2aWNlIHRoaXMgcnVuIG1heSBhZG9wdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVJldXNlVmVyZGljdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIGFscmVhZHkgc2VydmluZyB0aGUgcmVxdWVzdGVkIEFWRC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdyZXVzZSc7XG59XG5cbi8qKlxuICogRXZlcnkgZGV2aWNlIGFuc3dlcmVkLCBub25lIGlzIHNlcnZpbmcgdGhlIEFWRCwgc28gbGF1bmNoaW5nIGNhbm5vdCBjb2xsaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlU3RhcnROZXdWZXJkaWN0IHtcbiAgLyoqXG4gIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdzdGFydC1uZXcnO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJ1biBtYXkgZG8sIGdpdmVuIGV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKi9cbmV4cG9ydCB0eXBlIEF2ZFByb2JlVmVyZGljdCA9IEF2ZFByb2JlUmVmdXNlVmVyZGljdCB8IEF2ZFByb2JlUmV1c2VWZXJkaWN0IHwgQXZkUHJvYmVTdGFydE5ld1ZlcmRpY3Q7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHRoZSBydW4gd2FudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYnVkZ2V0IGVhY2ggcHJvYmUgYXR0ZW1wdCB3YXMgZ2l2ZW4sIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2VzIHRoYXQgZGlkIG5vdCBhbnN3ZXIuXG4gICAqL1xuICByZWFkb25seSB1bnJlYWRhYmxlRGV2aWNlSWRzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2xhc3NpZnlBdmRQcm9iZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NpZnlBdmRQcm9iZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHRoZSBydW4gd2FudHMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2UgdGhhdCB3YXMgcHJvYmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIEFWRCBuYW1lIHRoZSBkZXZpY2UgYW5zd2VyZWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZGlkIG5vdCBhbnN3ZXIgYXQgYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmVkQXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNYXRjaGVzIHRoZSBkZXZpY2UgSURzIGFkYiBnaXZlcyBlbXVsYXRvcnMgc3RhcnRlZCB0aGUgd2F5IHRoaXMgaGFybmVzc1xuICogc3RhcnRzIHRoZW06IGBlbXVsYXRvciAtYXZkIDxuYW1lPmAsIHdob3NlIGNvbnNvbGUgbGFuZHMgb24gYSBsb2NhbCBwb3J0LlxuICpcbiAqIE9ubHkgc3VjaCBhIGRldmljZSBjYW4gY29sbGlkZSB3aXRoIHRoaXMgcnVuJ3MgbGF1bmNoLCBzbyBvbmx5IHN1Y2ggYSBkZXZpY2Unc1xuICogc2lsZW5jZSBpcyB3b3J0aCByZWZ1c2luZyBvdmVyLiBBIHBoeXNpY2FsIGhhbmRzZXQgKGFuIGFyYml0cmFyeSBzZXJpYWwpIG9yIGFcbiAqIFRDUC1hdHRhY2hlZCBkZXZpY2UgY2FycmllcyBubyBgcWVtdWAgQVZEIHByb3BlcnR5IGFuZCBlcnJvcnMgb24gYGFkYiBcdTIwMjYgZW11XG4gKiBhdmQgbmFtZWAgaG93ZXZlciBoZWFsdGh5IGl0IGlzOyByZWFkaW5nIGVpdGhlciBhcyBcImRpZCBub3QgYW5zd2VyXCIgd291bGRcbiAqIGJsb2NrIGV2ZXJ5IHJ1biBvbiBhIGhvc3Qgd2l0aCBhIHBob25lIHBsdWdnZWQgaW4sIHdoaWNoIGlzIGEgd29yc2UgZGVmZWN0XG4gKiB0aGFuIHRoZSBvbmUgdGhpcyBtb2R1bGUgZml4ZXMuXG4gKi9cbmNvbnN0IEVNVUxBVE9SX0RFVklDRV9JRF9QQVRURVJOID0gL15lbXVsYXRvci1cXGQrJC87XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdW1tYXJ5IGxpbmUgbmFtaW5nIHdoYXQgZWFjaCBkZXZpY2UgYW5zd2VyZWQuXG4gKlxuICogVGhlIG9sZCBsb2cgcHJpbnRlZCBvbmx5IHRoZSBjb25jbHVzaW9uIChgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2VgKSxcbiAqIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGxpbmUgdGhhdCB3YXMgd3Jvbmc7IHByaW50aW5nIHRoZSBldmlkZW5jZSBuZXh0IHRvIGl0IGlzXG4gKiB3aGF0IG1ha2VzIGEgYmFkIGNvbmNsdXNpb24gdmlzaWJsZSB3aXRob3V0IGEgc2Vjb25kIHJ1bi5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKiBAcmV0dXJucyBUaGUgc3VtbWFyeSwgb3IgYG5vIGRldmljZXNgIHdoZW4gbm90aGluZyB3YXMgY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBdmRQcm9iZVN1bW1hcnkocmVzdWx0czogcmVhZG9ubHkgQXZkUHJvYmVSZXN1bHRbXSk6IHN0cmluZyB7XG4gIHJldHVybiByZXN1bHRzLmxlbmd0aCA9PT0gMCA/ICdubyBkZXZpY2VzJyA6IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IGAke3Jlc3VsdC5kZXZpY2VJZH09JHtyZXN1bHQub3V0Y29tZX1gKS5qb2luKCcsICcpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVmdXNhbCBtZXNzYWdlIGZvciBkZXZpY2VzIHRoYXQgY291bGQgbm90IGJlIHJlYWQuXG4gKlxuICogTmFtZXMgdGhlIGRldmljZSwgdGhlIEFWRCwgdGhlIGJ1ZGdldCwgdGhlIGNvbnNlcXVlbmNlIGFuZCB0aGUgcmVjb3ZlcnkgXHUyMDE0IHRoZVxuICogc2hhcGUgYHRlYXJkb3duLXZlcmRpY3QudHNgIHVzZXMgZm9yIGl0cyBvd24gd2FybmluZywgYmVjYXVzZSBhIG1lc3NhZ2UgdGhhdFxuICogc3RvcHMgYSBydW4gaGFzIHRvIGxlYXZlIHRoZSByZWFkZXIgYWJsZSB0byB1bmJsb2NrIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZELCB0aGUgcHJvYmUgYnVkZ2V0LCBhbmQgdGhlIGRldmljZXMgdGhhdCBkaWQgbm90IGFuc3dlci5cbiAqIEByZXR1cm5zIFRoZSByZWZ1c2FsIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZShwYXJhbXM6IEJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgLypcbiAgICogV2hlbiB0aGVyZSBpcyBleGFjdGx5IG9uZSBkZXZpY2UgdGhlIGpvaW5lZCBsaXN0IElTIGl0cyBJRCwgc28gdGhlIHNpbmd1bGFyXG4gICAqIHdvcmRpbmcgbmVlZHMgbm8gaW5kZXggYWNjZXNzIFx1MjAxNCBhbmQgbm8gdW5yZWFjaGFibGUgZmFsbGJhY2sgZm9yIG9uZS5cbiAgICovXG4gIGNvbnN0IGRldmljZUxpc3QgPSBwYXJhbXMudW5yZWFkYWJsZURldmljZUlkcy5qb2luKCcsICcpO1xuICBjb25zdCBpc1NpbmdsZSA9IHBhcmFtcy51bnJlYWRhYmxlRGV2aWNlSWRzLmxlbmd0aCA9PT0gMTtcblxuICBjb25zdCBzdWJqZWN0ID0gaXNTaW5nbGUgPyBgZGV2aWNlICR7ZGV2aWNlTGlzdH1gIDogYGRldmljZXMgJHtkZXZpY2VMaXN0fWA7XG4gIGNvbnN0IGRldmljZUxhYmVsID0gaXNTaW5nbGUgPyBkZXZpY2VMaXN0IDogJzxkZXZpY2U+JztcbiAgY29uc3QgcHJvcGVydHlDb21tYW5kID0gZGVzY3JpYmVBZGJDb21tYW5kKGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHMoeyBjaGFubmVsOiBGSVJTVF9BVkRfTkFNRV9DSEFOTkVMLCBkZXZpY2VJZDogZGV2aWNlTGFiZWwgfSkpO1xuICBjb25zdCBjb25zb2xlQ29tbWFuZCA9IGRlc2NyaWJlQWRiQ29tbWFuZChidWlsZEF2ZE5hbWVDaGFubmVsQXJndW1lbnRzKHsgY2hhbm5lbDogJ2NvbnNvbGUnLCBkZXZpY2VJZDogZGV2aWNlTGFiZWwgfSkpO1xuICBjb25zdCBob2xkZXIgPSBpc1NpbmdsZSA/ICdpdCBpcycgOiAnb25lIG9mIHRoZW0gaXMnO1xuICBjb25zdCBpZGVudGlmaWVkID0gaXNTaW5nbGUgPyAnaWRlbnRpZmllZCBpdHNlbGYnIDogJ2lkZW50aWZpZWQgdGhlbXNlbHZlcyc7XG4gIGNvbnN0IG93bmVyID0gaXNTaW5nbGUgPyAnQSBkZXZpY2UgdGhpcyBydW4gY2Fubm90IHJlYWQgaXMgbW9zdCBsaWtlbHkgQU5PVEhFUiBydW5cXCdzJyA6ICdEZXZpY2VzIHRoaXMgcnVuIGNhbm5vdCByZWFkIGFyZSBtb3N0IGxpa2VseSBPVEhFUiBydW5zXFwnJztcbiAgY29uc3Qga2lsbGluZyA9IGlzU2luZ2xlID8gJ2tpbGxpbmcgaXQnIDogJ2tpbGxpbmcgdGhlbSc7XG4gIGNvbnN0IG93bmVyc2hpcCA9IGlzU2luZ2xlID8gJ3RoZSBkZXZpY2UgaXMgeW91cnMnIDogJ3RoZSBkZXZpY2VzIGFyZSB5b3Vycyc7XG4gIGNvbnN0IG90aGVyUnVuID0gaXNTaW5nbGUgPyAndGhhdCBydW4nIDogJ3Rob3NlIHJ1bnMnO1xuXG4gIHJldHVybiBgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIjogJHtzdWJqZWN0fSAke2lkZW50aWZpZWR9IG92ZXIgbmVpdGhlciBcXGAke3Byb3BlcnR5Q29tbWFuZH1cXGAgKHRoZSBndWVzdCBwcm9wZXJ0eSwgb3ZlciBhZGJkKSBgXG4gICAgKyBgbm9yIFxcYCR7Y29uc29sZUNvbW1hbmR9XFxgICh0aGUgZW11bGF0b3IncyBvd24gY29uc29sZSkgd2l0aGluICR7U3RyaW5nKHBhcmFtcy5wcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMgZWFjaCAocmV0cmllZCBvbmNlKSwgYFxuICAgICsgYHNvIHRoaXMgcnVuIGNhbm5vdCB0ZWxsIHdoZXRoZXIgJHtob2xkZXJ9IGFscmVhZHkgc2VydmluZyB0aGF0IEFWRC4gU3RhcnRpbmcgYW4gZW11bGF0b3IgYW55d2F5IHdvdWxkIGNvbGxpZGUgYFxuICAgICsgJyhgRkFUQUwgfCBSdW5uaW5nIG11bHRpcGxlIGVtdWxhdG9ycyB3aXRoIHRoZSBzYW1lIEFWRCBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZWApLCB3aGljaCB0aGUgZW11bGF0b3IgcmVwb3J0cyBvbmx5IHRvIGl0cyBvd24gc3Rkb3V0LiAnXG4gICAgKyBgJHtvd25lcn06ICR7a2lsbGluZ30sIG9yIHJ1bm5pbmcgXFxgYWRiIGtpbGwtc2VydmVyXFxgLCBkZXN0cm95cyB3b3JrIHRoaXMgcnVuIGNhbm5vdCBzZWUsIHNvIGRvIHRoYXQgb25seSBvbmNlIHlvdSBrbm93ICR7b3duZXJzaGlwfS4gYFxuICAgICsgYE90aGVyd2lzZSB3YWl0IGZvciAke290aGVyUnVufSB0byBmaW5pc2gsIGFuZCByZXRyeSBvbmNlIFxcYGFkYiBkZXZpY2VzXFxgIG5vIGxvbmdlciBsaXN0cyBpdC5gO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciBhIGRldmljZSBjYW4gaG9sZCBhbiBBVkQgdGhpcyBydW4gY291bGQgY29sbGlkZSB3aXRoLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBqdWRnZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBmb3IgYSBsb2NhbGx5IHN0YXJ0ZWQgZW11bGF0b3IsIHdob3NlIGNvbnNvbGUgdGhpcyBydW4gY2FuIGFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNFbXVsYXRvckRldmljZUlkKGRldmljZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNVUxBVE9SX0RFVklDRV9JRF9QQVRURVJOLnRlc3QoZGV2aWNlSWQpO1xufVxuXG4vKipcbiAqIENsYXNzaWZpZXMgb25lIGRldmljZSdzIHByb2JlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZEIHdhbnRlZCwgdGhlIGRldmljZSBwcm9iZWQsIGFuZCB3aGF0IGl0IGFuc3dlcmVkLlxuICogQHJldHVybnMgVGhlIG91dGNvbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUF2ZFByb2JlKHBhcmFtczogQ2xhc3NpZnlBdmRQcm9iZVBhcmFtcyk6IEF2ZFByb2JlT3V0Y29tZSB7XG4gIGlmICghY2hlY2tJc0VtdWxhdG9yRGV2aWNlSWQocGFyYW1zLmRldmljZUlkKSkge1xuICAgIHJldHVybiAnbm90LWFuLWVtdWxhdG9yJztcbiAgfVxuXG4gIGlmIChwYXJhbXMucHJvYmVkQXZkTmFtZSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5wcm9iZWRBdmROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnbm8tYW5zd2VyJztcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMucHJvYmVkQXZkTmFtZSA9PT0gcGFyYW1zLmF2ZE5hbWUgPyAnbWF0Y2gnIDogJ290aGVyLWF2ZCc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGF0IHRoZSBydW4gbWF5IGRvLCBmcm9tIGV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKlxuICogKipBIG1hdGNoIHdpbnMgb3ZlciBhbiB1bnJlYWRhYmxlIHNpYmxpbmcuKiogT25jZSB0aGUgcmVxdWVzdGVkIEFWRCBpcyBmb3VuZFxuICogYW5kIHJldXNhYmxlLCBhbiB1bnJlbGF0ZWQgd2VkZ2VkIGRldmljZSBpcyBzb21lYm9keSBlbHNlJ3MgcHJvYmxlbSBhbmQgbXVzdFxuICogbm90IGJsb2NrIGEgcnVuIHRoYXQgaGFzIGV2ZXJ5dGhpbmcgaXQgbmVlZHMgXHUyMDE0IHRoZSBzYW1lIHJlc3RyYWludFxuICogYGVtdWxhdG9yLWJhY2tlbmQudHNgIHNob3dzIGluIG5ldmVyIHN3ZWVwaW5nIGEgYHFlbXUqYCBpdCBkb2VzIG5vdCBvd24uIE9ubHlcbiAqIHdoZW4gbm90aGluZyBtYXRjaGVkIGRvZXMgc2lsZW5jZSBiZWNvbWUgZGVjaXNpdmUsIGJlY2F1c2Ugb25seSB0aGVuIHdvdWxkIHRoZVxuICogcnVuIGdvIG9uIHRvIGxhdW5jaC5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKiBAcmV0dXJucyBUaGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBdmRQcm9iZVZlcmRpY3QocmVzdWx0czogcmVhZG9ubHkgQXZkUHJvYmVSZXN1bHRbXSk6IEF2ZFByb2JlVmVyZGljdCB7XG4gIGNvbnN0IHVucmVhZGFibGVEZXZpY2VJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ21hdGNoJzoge1xuICAgICAgICByZXR1cm4geyBkZXZpY2VJZDogcmVzdWx0LmRldmljZUlkLCB2ZXJkaWN0OiAncmV1c2UnIH07XG4gICAgICB9XG4gICAgICBjYXNlICduby1hbnN3ZXInOiB7XG4gICAgICAgIHVucmVhZGFibGVEZXZpY2VJZHMucHVzaChyZXN1bHQuZGV2aWNlSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdC1hbi1lbXVsYXRvcic6XG4gICAgICBjYXNlICdvdGhlci1hdmQnOiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIocmVzdWx0Lm91dGNvbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bnJlYWRhYmxlRGV2aWNlSWRzLmxlbmd0aCA+IDAgPyB7IHVucmVhZGFibGVEZXZpY2VJZHMsIHZlcmRpY3Q6ICdyZWZ1c2UnIH0gOiB7IHZlcmRpY3Q6ICdzdGFydC1uZXcnIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3Q0EsOEJBSU87QUFDUCx5QkFBNEI7QUF5SDVCLE1BQU0sNkJBQTZCO0FBWTVCLFNBQVMscUJBQXFCLFNBQTRDO0FBQy9FLFNBQU8sUUFBUSxXQUFXLElBQUksZUFBZSxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxRQUFRLElBQUksT0FBTyxPQUFPLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDeEg7QUFZTyxTQUFTLDhCQUE4QixRQUFxRDtBQUtqRyxRQUFNLGFBQWEsT0FBTyxvQkFBb0IsS0FBSyxJQUFJO0FBQ3ZELFFBQU0sV0FBVyxPQUFPLG9CQUFvQixXQUFXO0FBRXZELFFBQU0sVUFBVSxXQUFXLFVBQVUsVUFBVSxLQUFLLFdBQVcsVUFBVTtBQUN6RSxRQUFNLGNBQWMsV0FBVyxhQUFhO0FBQzVDLFFBQU0sc0JBQWtCLGdEQUFtQixzREFBNkIsRUFBRSxTQUFTLGdEQUF3QixVQUFVLFlBQVksQ0FBQyxDQUFDO0FBQ25JLFFBQU0scUJBQWlCLGdEQUFtQixzREFBNkIsRUFBRSxTQUFTLFdBQVcsVUFBVSxZQUFZLENBQUMsQ0FBQztBQUNySCxRQUFNLFNBQVMsV0FBVyxVQUFVO0FBQ3BDLFFBQU0sYUFBYSxXQUFXLHNCQUFzQjtBQUNwRCxRQUFNLFFBQVEsV0FBVywrREFBZ0U7QUFDekYsUUFBTSxVQUFVLFdBQVcsZUFBZTtBQUMxQyxRQUFNLFlBQVksV0FBVyx3QkFBd0I7QUFDckQsUUFBTSxXQUFXLFdBQVcsYUFBYTtBQUV6QyxTQUFPLFFBQVEsT0FBTyxPQUFPLE1BQU0sT0FBTyxJQUFJLFVBQVUsbUJBQW1CLGVBQWUsNENBQzdFLGNBQWMsMENBQTBDLE9BQU8sT0FBTywwQkFBMEIsQ0FBQywyREFDdkUsTUFBTSxrTkFFdEMsS0FBSyxLQUFLLE9BQU8sc0dBQXNHLFNBQVMsd0JBQzdHLFFBQVE7QUFDcEM7QUFRTyxTQUFTLHdCQUF3QixVQUEyQjtBQUNqRSxTQUFPLDJCQUEyQixLQUFLLFFBQVE7QUFDakQ7QUFRTyxTQUFTLGlCQUFpQixRQUFpRDtBQUNoRixNQUFJLENBQUMsd0JBQXdCLE9BQU8sUUFBUSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxPQUFPLGtCQUFrQixVQUFhLE9BQU8sY0FBYyxXQUFXLEdBQUc7QUFDM0UsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE9BQU8sa0JBQWtCLE9BQU8sVUFBVSxVQUFVO0FBQzdEO0FBZU8sU0FBUyx1QkFBdUIsU0FBcUQ7QUFDMUYsUUFBTSxzQkFBZ0MsQ0FBQztBQUV2QyxhQUFXLFVBQVUsU0FBUztBQUM1QixZQUFRLE9BQU8sU0FBUztBQUFBLE1BQ3RCLEtBQUssU0FBUztBQUNaLGVBQU8sRUFBRSxVQUFVLE9BQU8sVUFBVSxTQUFTLFFBQVE7QUFBQSxNQUN2RDtBQUFBLE1BQ0EsS0FBSyxhQUFhO0FBQ2hCLDRCQUFvQixLQUFLLE9BQU8sUUFBUTtBQUN4QztBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUssYUFBYTtBQUNoQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFNBQVM7QUFDUCxtQkFBTyxnQ0FBWSxPQUFPLE9BQU87QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxvQkFBb0IsU0FBUyxJQUFJLEVBQUUscUJBQXFCLFNBQVMsU0FBUyxJQUFJLEVBQUUsU0FBUyxZQUFZO0FBQzlHOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -26,6 +26,13 @@
26
26
  * to answer it — a wedged emulator times out every `adb` call — which is the
27
27
  * condition under which a colliding launch does the most damage.
28
28
  *
29
+ * **What the probe ASKS moved since; what it decides did not.** The question
30
+ * now travels the guest property over `adbd` first and the emulator console only
31
+ * as a fallback (`avd-name-channel.ts`), because keying a machine-wide refusal
32
+ * on the console alone let one wedged emulator — usually another project's —
33
+ * stop every Android run on the host. The four outcomes and the three verdicts
34
+ * here are unchanged: silence is still not a skip, it is simply far rarer.
35
+ *
29
36
  * Kept separate from the integration-only `transport-factory` (excluded from
30
37
  * unit tests) so the classification stays unit-testable — the factory itself
31
38
  * shells out to `adb`.
@@ -39,4 +39,4 @@ async function captureDeviceScreenshot(params) {
39
39
  0 && (module.exports = {
40
40
  captureDeviceScreenshot
41
41
  });
42
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zY3JlZW5zaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGhvdG9ncmFwaHMgdGhlIERFVklDRSwgbm90IHRoZSB3ZWIgcGFnZS5cbiAqXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAgZ29lcyB0aHJvdWdoIEFwcGl1bSBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBzbyBvblxuICogQW5kcm9pZCBpdCBjYXB0dXJlcyB0aGUgcGFnZTogbm8gc3RhdHVzIGJhciwgYW5kIFx1MjAxNCB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIFx1MjAxNFxuICogbm8gc29mdCBrZXlib2FyZCwgYmVjYXVzZSB0aGUgSU1FIGlzIGEgc3lzdGVtIHdpbmRvdyBhbmQgbm90IHBhcnQgb2YgdGhlXG4gKiBwYWdlLiBBIGZyYW1lIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyB3aGF0IGEgcGhvbmUgbG9va3MgbGlrZSB0aGVyZWZvcmUgY2Fubm90XG4gKiBiZSB0YWtlbiB0aGF0IHdheS5cbiAqXG4gKiBgYWRiIGV4ZWMtb3V0IHNjcmVlbmNhcCAtcGAgcmVhZHMgdGhlIGZyYW1lYnVmZmVyIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiByb3V0ZSB0aGUgdHJ1c3RlZC1pbnB1dCBwYXNzZXMgYWxyZWFkeSB1c2UuIFRoZSB0cmFkZSBpcyBkZWxpYmVyYXRlIGFuZCB3b3J0aFxuICogd3JpdGluZyBkb3duIGF0IGV2ZXJ5IGNhbGwgc2l0ZTogYSBkZXZpY2UgY2FwdHVyZSBjYXJyaWVzIHRoZSBzdGF0dXMtYmFyIGNsb2NrXG4gKiBhbmQgYmF0dGVyeSwgc28gaXQgaXMgKipub3QgYnl0ZS1yZXByb2R1Y2libGUqKiB0aGUgd2F5IGEgcGFnZSBjYXB0dXJlIGlzLlxuICogUmVhY2ggZm9yIHRoaXMgb25seSBmb3IgdGhlIHNob3RzIHRoYXQgbmVlZCB0aGUga2V5Ym9hcmQ7IGxlYXZlIHRoZSByZXN0IG9uXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAuXG4gKi9cblxuaW1wb3J0IHsgcnVuQWRiQmluYXJ5IH0gZnJvbSAnLi9hZGIuY2pzJztcbmltcG9ydCB7IGlzUG5nIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2FwdHVyZURldmljZVNjcmVlbnNob3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gcGhvdG9ncmFwaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKHNoZWxscyBvdXQgdG8gYSByZWFsIGRldmljZSkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQ2FwdHVyZXMgdGhlIGRldmljZSdzIGZyYW1lYnVmZmVyIGFzIGEgUE5HLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIHBob3RvZ3JhcGguXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB3aGF0IGNhbWUgYmFjayBpcyBub3QgYSBQTkcgXHUyMDE0IHdoaWNoIGlzIHdoYXQgYSB0cnVuY2F0ZWQgb3IgdGV4dC1kZWNvZGVkIGNhcHR1cmUgbG9va3NcbiAqICAgbGlrZSwgYW5kIGlzIGZhciBjaGVhcGVyIHRvIGNhdGNoIGhlcmUgdGhhbiBpbiBhbiBpbWFnZSBkaWZmLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FwdHVyZURldmljZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlRGV2aWNlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBieXRlcyA9IGF3YWl0IHJ1bkFkYkJpbmFyeSh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydleGVjLW91dCcsICdzY3JlZW5jYXAnLCAnLXAnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIGlmICghaXNQbmcoYnl0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90OiAke3BhcmFtcy5kZXZpY2VJZH0gcmV0dXJuZWQgJHtTdHJpbmcoYnl0ZXMubGVuZ3RoKX0gYnl0ZXMgdGhhdCBhcmUgbm90IGEgUE5HLiBgXG4gICAgICAgICsgJ0EgZGV2aWNlIHRoYXQgaXMgc3RpbGwgYm9vdGluZywgb3IgYW4gYWRiIHRyYW5zcG9ydCB0aGF0IGRlY29kZWQgdGhlIHN0cmVhbSBhcyB0ZXh0LCBib3RoIGxvb2sgbGlrZSB0aGlzLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxpQkFBNkI7QUFDN0IsZ0NBQXNCO0FBc0J0QixlQUFzQix3QkFBd0IsUUFBNEQ7QUFDeEcsUUFBTSxRQUFRLFVBQU0seUJBQWE7QUFBQSxJQUMvQixrQkFBa0IsQ0FBQyxZQUFZLGFBQWEsSUFBSTtBQUFBLElBQ2hELFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFFRCxNQUFJLEtBQUMsaUNBQU0sS0FBSyxHQUFHO0FBQ2pCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsNEJBQTRCLE9BQU8sUUFBUSxhQUFhLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFBQSxJQUU5RTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
42
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zY3JlZW5zaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGhvdG9ncmFwaHMgdGhlIERFVklDRSwgbm90IHRoZSB3ZWIgcGFnZS5cbiAqXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAgZ29lcyB0aHJvdWdoIEFwcGl1bSBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBzbyBvblxuICogQW5kcm9pZCBpdCBjYXB0dXJlcyB0aGUgcGFnZTogbm8gc3RhdHVzIGJhciwgYW5kIFx1MjAxNCB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIFx1MjAxNFxuICogbm8gc29mdCBrZXlib2FyZCwgYmVjYXVzZSB0aGUgSU1FIGlzIGEgc3lzdGVtIHdpbmRvdyBhbmQgbm90IHBhcnQgb2YgdGhlXG4gKiBwYWdlLiBBIGZyYW1lIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyB3aGF0IGEgcGhvbmUgbG9va3MgbGlrZSB0aGVyZWZvcmUgY2Fubm90XG4gKiBiZSB0YWtlbiB0aGF0IHdheS5cbiAqXG4gKiBgYWRiIGV4ZWMtb3V0IHNjcmVlbmNhcCAtcGAgcmVhZHMgdGhlIGZyYW1lYnVmZmVyIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiByb3V0ZSB0aGUgdHJ1c3RlZC1pbnB1dCBwYXNzZXMgYWxyZWFkeSB1c2UuIFRoZSB0cmFkZSBpcyBkZWxpYmVyYXRlIGFuZCB3b3J0aFxuICogd3JpdGluZyBkb3duIGF0IGV2ZXJ5IGNhbGwgc2l0ZTogYSBkZXZpY2UgY2FwdHVyZSBjYXJyaWVzIHRoZSBzdGF0dXMtYmFyIGNsb2NrXG4gKiBhbmQgYmF0dGVyeSwgc28gaXQgaXMgKipub3QgYnl0ZS1yZXByb2R1Y2libGUgYXMgY2FwdHVyZWQqKiB0aGUgd2F5IGEgcGFnZVxuICogY2FwdHVyZSBpcy4gYHBhaW50T3V0U3RhdHVzQmFyYCBpcyB3aGF0IG1ha2VzIG9uZSBcdTIwMTQgaXQgcmVtb3ZlcyB0aGUgYmFuZCB0aG9zZVxuICogbGl2ZSBpbiBcdTIwMTQgYW5kIGEgZnJhbWUgdGhhdCBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgaGFzIHRvIGdvIHRocm91Z2ggaXQuXG4gKiBSZWFjaCBmb3IgdGhpcyBvbmx5IGZvciB0aGUgc2hvdHMgdGhhdCBuZWVkIHRoZSBrZXlib2FyZDsgbGVhdmUgdGhlIHJlc3Qgb25cbiAqIGBjYXB0dXJlT2JzaWRpYW5TY3JlZW5zaG90YC5cbiAqL1xuXG5pbXBvcnQgeyBydW5BZGJCaW5hcnkgfSBmcm9tICcuL2FkYi5janMnO1xuaW1wb3J0IHsgaXNQbmcgfSBmcm9tICcuL2NhcHR1cmUtc2NyZWVuc2hvdC5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZURldmljZVNjcmVlbnNob3RQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byBwaG90b2dyYXBoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoc2hlbGxzIG91dCB0byBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuLyoqXG4gKiBDYXB0dXJlcyB0aGUgZGV2aWNlJ3MgZnJhbWVidWZmZXIgYXMgYSBQTkcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgdG8gcGhvdG9ncmFwaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyBQTkcgYnl0ZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHdoYXQgY2FtZSBiYWNrIGlzIG5vdCBhIFBORyBcdTIwMTQgd2hpY2ggaXMgd2hhdCBhIHRydW5jYXRlZCBvciB0ZXh0LWRlY29kZWQgY2FwdHVyZSBsb29rc1xuICogICBsaWtlLCBhbmQgaXMgZmFyIGNoZWFwZXIgdG8gY2F0Y2ggaGVyZSB0aGFuIGluIGFuIGltYWdlIGRpZmYuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdChwYXJhbXM6IENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGJ5dGVzID0gYXdhaXQgcnVuQWRiQmluYXJ5KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ2V4ZWMtb3V0JywgJ3NjcmVlbmNhcCcsICctcCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgY2FwdHVyZURldmljZVNjcmVlbnNob3Q6ICR7cGFyYW1zLmRldmljZUlkfSByZXR1cm5lZCAke1N0cmluZyhieXRlcy5sZW5ndGgpfSBieXRlcyB0aGF0IGFyZSBub3QgYSBQTkcuIGBcbiAgICAgICAgKyAnQSBkZXZpY2UgdGhhdCBpcyBzdGlsbCBib290aW5nLCBvciBhbiBhZGIgdHJhbnNwb3J0IHRoYXQgZGVjb2RlZCB0aGUgc3RyZWFtIGFzIHRleHQsIGJvdGggbG9vayBsaWtlIHRoaXMuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJBLGlCQUE2QjtBQUM3QixnQ0FBc0I7QUFzQnRCLGVBQXNCLHdCQUF3QixRQUE0RDtBQUN4RyxRQUFNLFFBQVEsVUFBTSx5QkFBYTtBQUFBLElBQy9CLGtCQUFrQixDQUFDLFlBQVksYUFBYSxJQUFJO0FBQUEsSUFDaEQsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUVELE1BQUksS0FBQyxpQ0FBTSxLQUFLLEdBQUc7QUFDakIsVUFBTSxJQUFJO0FBQUEsTUFDUiw0QkFBNEIsT0FBTyxRQUFRLGFBQWEsT0FBTyxNQUFNLE1BQU0sQ0FBQztBQUFBLElBRTlFO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -12,7 +12,9 @@
12
12
  * `adb exec-out screencap -p` reads the framebuffer instead, which is the same
13
13
  * route the trusted-input passes already use. The trade is deliberate and worth
14
14
  * writing down at every call site: a device capture carries the status-bar clock
15
- * and battery, so it is **not byte-reproducible** the way a page capture is.
15
+ * and battery, so it is **not byte-reproducible as captured** the way a page
16
+ * capture is. `paintOutStatusBar` is what makes one — it removes the band those
17
+ * live in — and a frame that is going to be committed has to go through it.
16
18
  * Reach for this only for the shots that need the keyboard; leave the rest on
17
19
  * `captureObsidianScreenshot`.
18
20
  */
@@ -18,15 +18,33 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var emulator_backend_exports = {};
20
20
  __export(emulator_backend_exports, {
21
+ buildEmulatorProcessQueries: () => buildEmulatorProcessQueries,
22
+ checkIsNoMatchReported: () => checkIsNoMatchReported,
23
+ parseEmulatorProcessQueryOutput: () => parseEmulatorProcessQueryOutput,
21
24
  parsePosixProcessList: () => parsePosixProcessList,
22
25
  parseWindowsTaskList: () => parseWindowsTaskList,
23
26
  selectEmulatorBackendPids: () => selectEmulatorBackendPids
24
27
  });
25
28
  module.exports = __toCommonJS(emulator_backend_exports);
26
29
  const EMULATOR_BACKEND_NAME_PATTERN = /^(?:emulator|emulator64-[\w.-]+|qemu-system-[\w.-]+)$/;
30
+ const EMULATOR_IMAGE_NAME_PREFIXES = ["emulator", "qemu-system"];
31
+ const TASK_LIST_NO_MATCH_NOTICE_PATTERN = /^INFO: /m;
27
32
  const EXECUTABLE_SUFFIX_PATTERN = /\.exe$/;
28
33
  const RADIX_DECIMAL = 10;
29
34
  const TASK_LIST_FIELDS_READ = 2;
35
+ function buildEmulatorProcessQueries(platform) {
36
+ return platform === "win32" ? EMULATOR_IMAGE_NAME_PREFIXES.map((prefix) => ({
37
+ command: "tasklist",
38
+ commandArguments: ["/FO", "CSV", "/NH", "/FI", `IMAGENAME eq ${prefix}*`],
39
+ isFiltered: true
40
+ })) : [{ command: "ps", commandArguments: ["-eo", "pid=,comm="], isFiltered: false }];
41
+ }
42
+ function checkIsNoMatchReported(params) {
43
+ return params.query.isFiltered && TASK_LIST_NO_MATCH_NOTICE_PATTERN.test(params.output);
44
+ }
45
+ function parseEmulatorProcessQueryOutput(params) {
46
+ return params.query.command === "tasklist" ? parseWindowsTaskList(params.output) : parsePosixProcessList(params.output);
47
+ }
30
48
  function parsePosixProcessList(processListOutput) {
31
49
  const entries = [];
32
50
  for (const rawLine of processListOutput.split("\n")) {
@@ -64,8 +82,11 @@ function checkIsEmulatorBackendName(name) {
64
82
  }
65
83
  // Annotate the CommonJS export names for ESM import in node:
66
84
  0 && (module.exports = {
85
+ buildEmulatorProcessQueries,
86
+ checkIsNoMatchReported,
87
+ parseEmulatorProcessQueryOutput,
67
88
  parsePosixProcessList,
68
89
  parseWindowsTaskList,
69
90
  selectEmulatorBackendPids
70
91
  });
71
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWJhY2tlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGZpbmRpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvY2VzcyB0aGF0ICoqb3V0bGl2ZXMgdGhlIHBpZFxuICogdGhlIGhhcm5lc3Mga2lsbGVkKiouXG4gKlxuICogVW5kZXIgYC1uby13aW5kb3dgIHRoZSBlbXVsYXRvcidzIGJhY2tlbmQgcHJvY2VzcyBpc1xuICogYHFlbXUtc3lzdGVtLXg4Nl82NC1oZWFkbGVzc2AgKGBxZW11LXN5c3RlbS14ODZfNjRgIHdoZW4gd2luZG93ZWQpLCBub3QgdGhlXG4gKiBgZW11bGF0b3JgIGxhdW5jaGVyIHRoZSBoYXJuZXNzIHNwYXduZWQgYW5kIGhvbGRzIGEgYENoaWxkUHJvY2Vzc2AgZm9yLiBUaGVcbiAqIGxhdW5jaGVyIGV4aXRzIG9yIGlzIGtpbGxlZCwgYW5kIHRoZSBiYWNrZW5kIGlzIHdoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIEFWRCdzXG4gKiBgbXVsdGlpbnN0YW5jZS5sb2NrYCBhbmQgdGhlIGNvbnNvbGUvYWRiIHBvcnRzIFx1MjAxNCBzbyBgdGFza2tpbGwgL0YgL1RgIGFnYWluc3RcbiAqIHRoZSBsYXVuY2hlcidzIHBpZCByZXBvcnRzIHN1Y2Nlc3Mgd2hpbGUgdGhlIGVtdWxhdG9yIGtlZXBzIHJ1bm5pbmcuIEV2ZXJ5XG4gKiBsYXRlciBydW4gYWdhaW5zdCB0aGF0IEFWRCB0aGVuIGRpZXMgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGVcbiAqIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCwgd2hpY2ggbmV2ZXIgcmVhY2hlcyB0aGUgdXNlciBiZWNhdXNlIHRoZVxuICogZW11bGF0b3Igd3JpdGVzIGl0IHRvIGl0cyBvd24gc3Rkb3V0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBmaWx0ZXIgXHUyMDE0IGAtTmFtZSBxZW11LXN5c3RlbS14ODZfNjRgIC8gbWF0Y2hpbmcgdGhhdFxuICogZXhhY3QgaW1hZ2UgbmFtZSBcdTIwMTQgZG9lcyAqKm5vdCoqIG1hdGNoIHRoZSBgLWhlYWRsZXNzYCBidWlsZCwgd2hpY2ggaXMgaG93IHRoZVxuICogbGVmdG92ZXIgc3RheXMgaW52aXNpYmxlIHRocm91Z2ggc2V2ZXJhbCByb3VuZHMgb2YgXCJubyBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgYSAqKnByZS1sYXVuY2ggc25hcHNob3QqKjogYSBiYWNrZW5kIGFscmVhZHkgcnVubmluZ1xuICogYmVmb3JlIHRoaXMgcnVuIHN0YXJ0ZWQgaXRzIG93biBiZWxvbmdzIHRvIHNvbWVib2R5IGVsc2UgKGFub3RoZXIgQVZELCBvciBvbmVcbiAqIHRoZSB1c2VyIGJvb3RlZCBieSBoYW5kKSBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZVxuICogaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCB0aGUgc2VsZWN0aW9uIHN0YXlcbiAqIHVuaXQtdGVzdGFibGUuXG4gKi9cblxuLyoqXG4gKiBPbmUgcHJvY2VzcyBmcm9tIGEgaG9zdCBwcm9jZXNzIGxpc3RpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0xpc3RFbnRyeSB7XG4gIC8qKlxuICBUaGUgcHJvY2Vzcy9pbWFnZSBuYW1lLCBhcyB0aGUgcGxhdGZvcm0ncyBsaXN0aW5nIHJlcG9ydHMgaXQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwcm9jZXNzIElELlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMge1xuICAvKipcbiAgRW11bGF0b3IgYmFja2VuZCBQSURzIHNlZW4gKipiZWZvcmUqKiB0aGlzIHJ1biBsYXVuY2hlZCBpdHMgZW11bGF0b3IsIHdoaWNoIGl0IHRoZXJlZm9yZSBkb2VzIG5vdCBvd24uXG4gICAqL1xuICByZWFkb25seSBrbm93blBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBUaGUgaG9zdCdzIGN1cnJlbnQgcHJvY2VzcyBsaXN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzTGlzdEVudHJ5W107XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZW11bGF0b3IgbGF1bmNoZXIgYW5kIGJvdGggUUVNVSBiYWNrZW5kIGJ1aWxkcyBcdTIwMTQgY3J1Y2lhbGx5XG4gKiBpbmNsdWRpbmcgdGhlIGAtaGVhZGxlc3NgIHN1ZmZpeCBgLW5vLXdpbmRvd2AgcnVucyBwcm9kdWNlLlxuICovXG5jb25zdCBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTiA9IC9eKD86ZW11bGF0b3J8ZW11bGF0b3I2NC1bXFx3Li1dK3xxZW11LXN5c3RlbS1bXFx3Li1dKykkLztcbmNvbnN0IEVYRUNVVEFCTEVfU1VGRklYX1BBVFRFUk4gPSAvXFwuZXhlJC87XG5jb25zdCBSQURJWF9ERUNJTUFMID0gMTA7XG4vKipcbiAqIE9ubHkgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgYXJlIHJlYWQsIHNvIHRoZSBzcGxpdCBzdG9wcyBhZnRlciB0aGVtLlxuICovXG5jb25zdCBUQVNLX0xJU1RfRklFTERTX1JFQUQgPSAyO1xuXG4vKipcbiAqIFBhcnNlcyBgcHMgLWVvIHBpZD0sY29tbT1gIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0xpc3RPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIHRoZSBgcHNgIGxpc3RpbmcuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIHBhcnNhYmxlIHJvdywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3NpeFByb2Nlc3NMaXN0KHByb2Nlc3NMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgcHJvY2Vzc0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCcgJyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGlkID0gTnVtYmVyLnBhcnNlSW50KGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLCBSQURJWF9ERUNJTUFMKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHBpZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudHJpZXMucHVzaCh7IG5hbWU6IGxpbmUuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCksIHBpZCB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBgdGFza2xpc3QgL0ZPIENTViAvTkhgIG91dHB1dC5cbiAqXG4gKiBPbmx5IHRoZSBmaXJzdCB0d28gZmllbGRzIGFyZSByZWFkIFx1MjAxNCB0aGUgaW1hZ2UgbmFtZSBhbmQgdGhlIFBJRCBcdTIwMTQgc28gdGhlXG4gKiBtZW1vcnkgY29sdW1uJ3Mgb3duIGNvbW1hcyBjYW5ub3QgY29uZnVzZSB0aGUgc3BsaXQuXG4gKlxuICogQHBhcmFtIHRhc2tMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB0aGUgYHRhc2tsaXN0YCBsaXN0aW5nLlxuICogQHJldHVybnMgT25lIGVudHJ5IHBlciBwYXJzYWJsZSByb3csIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2luZG93c1Rhc2tMaXN0KHRhc2tMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgdGFza0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgW3Jhd05hbWUgPSAnJywgcmF3UGlkID0gJyddID0gcmF3TGluZS50cmltKCkucmVwbGFjZUFsbCgnXCInLCAnJykuc3BsaXQoJywnLCBUQVNLX0xJU1RfRklFTERTX1JFQUQpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChyYXdQaWQsIFJBRElYX0RFQ0lNQUwpO1xuICAgIGlmIChyYXdOYW1lLmxlbmd0aCA9PT0gMCB8fCBOdW1iZXIuaXNOYU4ocGlkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZW50cmllcy5wdXNoKHsgbmFtZTogcmF3TmFtZSwgcGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZW11bGF0b3IgcHJvY2Vzc2VzIHRoaXMgcnVuIGlzIHJlc3BvbnNpYmxlIGZvciBraWxsaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY3VycmVudCBsaXN0aW5nIHBsdXMgdGhlIFBJRHMgdGhhdCBwcmVkYXRlIHRoaXMgcnVuJ3MgZW11bGF0b3IuXG4gKiBAcmV0dXJucyBUaGUgUElEcyBvZiBlbXVsYXRvciBwcm9jZXNzZXMgdGhpcyBydW4gb3ducywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyhwYXJhbXM6IFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMpOiBudW1iZXJbXSB7XG4gIHJldHVybiBwYXJhbXMucHJvY2Vzc2VzXG4gICAgLmZpbHRlcigoZW50cnkpID0+IGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKGVudHJ5Lm5hbWUpICYmICFwYXJhbXMua25vd25QaWRzLmluY2x1ZGVzKGVudHJ5LnBpZCkpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnBpZCk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlTmFtZSA9IG5hbWUuc2xpY2UoTWF0aC5tYXgobmFtZS5sYXN0SW5kZXhPZignLycpLCBuYW1lLmxhc3RJbmRleE9mKCdcXFxcJykpICsgMSk7XG4gIHJldHVybiBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTi50ZXN0KGJhc2VOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZShFWEVDVVRBQkxFX1NVRkZJWF9QQVRURVJOLCAnJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE2REEsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxnQkFBZ0I7QUFJdEIsTUFBTSx3QkFBd0I7QUFRdkIsU0FBUyxzQkFBc0IsbUJBQStDO0FBQ25GLFFBQU0sVUFBOEIsQ0FBQztBQUVyQyxhQUFXLFdBQVcsa0JBQWtCLE1BQU0sSUFBSSxHQUFHO0FBQ25ELFVBQU0sT0FBTyxRQUFRLEtBQUs7QUFDMUIsVUFBTSxpQkFBaUIsS0FBSyxRQUFRLEdBQUc7QUFDdkMsUUFBSSxtQkFBbUIsSUFBSTtBQUN6QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLE1BQU0sT0FBTyxTQUFTLEtBQUssTUFBTSxHQUFHLGNBQWMsR0FBRyxhQUFhO0FBQ3hFLFFBQUksT0FBTyxNQUFNLEdBQUcsR0FBRztBQUNyQjtBQUFBLElBQ0Y7QUFFQSxZQUFRLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUM7QUFBQSxFQUNuRTtBQUVBLFNBQU87QUFDVDtBQVdPLFNBQVMscUJBQXFCLGdCQUE0QztBQUMvRSxRQUFNLFVBQThCLENBQUM7QUFFckMsYUFBVyxXQUFXLGVBQWUsTUFBTSxJQUFJLEdBQUc7QUFDaEQsVUFBTSxDQUFDLFVBQVUsSUFBSSxTQUFTLEVBQUUsSUFBSSxRQUFRLEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxFQUFFLE1BQU0sS0FBSyxxQkFBcUI7QUFDdkcsVUFBTSxNQUFNLE9BQU8sU0FBUyxRQUFRLGFBQWE7QUFDakQsUUFBSSxRQUFRLFdBQVcsS0FBSyxPQUFPLE1BQU0sR0FBRyxHQUFHO0FBQzdDO0FBQUEsSUFDRjtBQUVBLFlBQVEsS0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLENBQUM7QUFBQSxFQUNyQztBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsMEJBQTBCLFFBQW1EO0FBQzNGLFNBQU8sT0FBTyxVQUNYLE9BQU8sQ0FBQyxVQUFVLDJCQUEyQixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sVUFBVSxTQUFTLE1BQU0sR0FBRyxDQUFDLEVBQ2pHLElBQUksQ0FBQyxVQUFVLE1BQU0sR0FBRztBQUM3QjtBQUVBLFNBQVMsMkJBQTJCLE1BQXVCO0FBQ3pELFFBQU0sV0FBVyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssWUFBWSxHQUFHLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDdkYsU0FBTyw4QkFBOEIsS0FBSyxTQUFTLFlBQVksRUFBRSxRQUFRLDJCQUEyQixFQUFFLENBQUM7QUFDekc7IiwKICAibmFtZXMiOiBbXQp9Cg==
92
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWJhY2tlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGZpbmRpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvY2VzcyB0aGF0ICoqb3V0bGl2ZXMgdGhlIHBpZFxuICogdGhlIGhhcm5lc3Mga2lsbGVkKiouXG4gKlxuICogVW5kZXIgYC1uby13aW5kb3dgIHRoZSBlbXVsYXRvcidzIGJhY2tlbmQgcHJvY2VzcyBpc1xuICogYHFlbXUtc3lzdGVtLXg4Nl82NC1oZWFkbGVzc2AgKGBxZW11LXN5c3RlbS14ODZfNjRgIHdoZW4gd2luZG93ZWQpLCBub3QgdGhlXG4gKiBgZW11bGF0b3JgIGxhdW5jaGVyIHRoZSBoYXJuZXNzIHNwYXduZWQgYW5kIGhvbGRzIGEgYENoaWxkUHJvY2Vzc2AgZm9yLiBUaGVcbiAqIGxhdW5jaGVyIGV4aXRzIG9yIGlzIGtpbGxlZCwgYW5kIHRoZSBiYWNrZW5kIGlzIHdoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIEFWRCdzXG4gKiBgbXVsdGlpbnN0YW5jZS5sb2NrYCBhbmQgdGhlIGNvbnNvbGUvYWRiIHBvcnRzIFx1MjAxNCBzbyBgdGFza2tpbGwgL0YgL1RgIGFnYWluc3RcbiAqIHRoZSBsYXVuY2hlcidzIHBpZCByZXBvcnRzIHN1Y2Nlc3Mgd2hpbGUgdGhlIGVtdWxhdG9yIGtlZXBzIHJ1bm5pbmcuIEV2ZXJ5XG4gKiBsYXRlciBydW4gYWdhaW5zdCB0aGF0IEFWRCB0aGVuIGRpZXMgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGVcbiAqIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCwgd2hpY2ggbmV2ZXIgcmVhY2hlcyB0aGUgdXNlciBiZWNhdXNlIHRoZVxuICogZW11bGF0b3Igd3JpdGVzIGl0IHRvIGl0cyBvd24gc3Rkb3V0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBmaWx0ZXIgXHUyMDE0IGAtTmFtZSBxZW11LXN5c3RlbS14ODZfNjRgIC8gbWF0Y2hpbmcgdGhhdFxuICogZXhhY3QgaW1hZ2UgbmFtZSBcdTIwMTQgZG9lcyAqKm5vdCoqIG1hdGNoIHRoZSBgLWhlYWRsZXNzYCBidWlsZCwgd2hpY2ggaXMgaG93IHRoZVxuICogbGVmdG92ZXIgc3RheXMgaW52aXNpYmxlIHRocm91Z2ggc2V2ZXJhbCByb3VuZHMgb2YgXCJubyBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgYSAqKnByZS1sYXVuY2ggc25hcHNob3QqKjogYSBiYWNrZW5kIGFscmVhZHkgcnVubmluZ1xuICogYmVmb3JlIHRoaXMgcnVuIHN0YXJ0ZWQgaXRzIG93biBiZWxvbmdzIHRvIHNvbWVib2R5IGVsc2UgKGFub3RoZXIgQVZELCBvciBvbmVcbiAqIHRoZSB1c2VyIGJvb3RlZCBieSBoYW5kKSBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZVxuICogaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCB0aGUgc2VsZWN0aW9uIHN0YXlcbiAqIHVuaXQtdGVzdGFibGUuXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tJc05vTWF0Y2hSZXBvcnRlZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tJc05vTWF0Y2hSZXBvcnRlZFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgcXVlcnkncyBzdGRvdXQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHF1ZXJ5IHRoYXQgcHJvZHVjZWQgaXQuXG4gICAqL1xuICByZWFkb25seSBxdWVyeTogRW11bGF0b3JQcm9jZXNzUXVlcnk7XG59XG5cbi8qKlxuICogT25lIGNvbW1hbmQgdGhhdCBsaXN0cyAoc29tZSBvZikgdGhlIGhvc3QncyBlbXVsYXRvciBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW11bGF0b3JQcm9jZXNzUXVlcnkge1xuICAvKipcbiAgVGhlIGV4ZWN1dGFibGUuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gIEl0cyBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgV2hldGhlciB0aGUgY29tbWFuZCBhc2tzIG9ubHkgZm9yIGVtdWxhdG9yIGltYWdlIG5hbWVzIHJhdGhlciB0aGFuIGZvciBldmVyeSBwcm9jZXNzIG9uIHRoZSBob3N0IFx1MjAxNCB3aGljaCBpcyB3aGF0IG1ha2VzIGFuIGVtcHR5IGFuc3dlciBsZWdpdGltYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGaWx0ZXJlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcGFyc2VFbXVsYXRvclByb2Nlc3NRdWVyeU91dHB1dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VFbXVsYXRvclByb2Nlc3NRdWVyeU91dHB1dFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgcXVlcnkncyBzdGRvdXQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHF1ZXJ5IHRoYXQgcHJvZHVjZWQgaXQuXG4gICAqL1xuICByZWFkb25seSBxdWVyeTogRW11bGF0b3JQcm9jZXNzUXVlcnk7XG59XG5cbi8qKlxuICogT25lIHByb2Nlc3MgZnJvbSBhIGhvc3QgcHJvY2VzcyBsaXN0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NMaXN0RW50cnkge1xuICAvKipcbiAgVGhlIHByb2Nlc3MvaW1hZ2UgbmFtZSwgYXMgdGhlIHBsYXRmb3JtJ3MgbGlzdGluZyByZXBvcnRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvY2VzcyBJRC5cbiAgICovXG4gIHJlYWRvbmx5IHBpZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzUGFyYW1zIHtcbiAgLyoqXG4gIEVtdWxhdG9yIGJhY2tlbmQgUElEcyBzZWVuICoqYmVmb3JlKiogdGhpcyBydW4gbGF1bmNoZWQgaXRzIGVtdWxhdG9yLCB3aGljaCBpdCB0aGVyZWZvcmUgZG9lcyBub3Qgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkga25vd25QaWRzOiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgVGhlIGhvc3QncyBjdXJyZW50IHByb2Nlc3MgbGlzdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NlczogcmVhZG9ubHkgUHJvY2Vzc0xpc3RFbnRyeVtdO1xufVxuXG4vKipcbiAqIE1hdGNoZXMgdGhlIGVtdWxhdG9yIGxhdW5jaGVyIGFuZCBib3RoIFFFTVUgYmFja2VuZCBidWlsZHMgXHUyMDE0IGNydWNpYWxseVxuICogaW5jbHVkaW5nIHRoZSBgLWhlYWRsZXNzYCBzdWZmaXggYC1uby13aW5kb3dgIHJ1bnMgcHJvZHVjZS5cbiAqL1xuY29uc3QgRU1VTEFUT1JfQkFDS0VORF9OQU1FX1BBVFRFUk4gPSAvXig/OmVtdWxhdG9yfGVtdWxhdG9yNjQtW1xcdy4tXSt8cWVtdS1zeXN0ZW0tW1xcdy4tXSspJC87XG4vKipcbiAqIFRoZSBpbWFnZS1uYW1lIHByZWZpeGVzIGB0YXNrbGlzdGAgaXMgYXNrZWQgZm9yIFx1MjAxNCBldmVyeSBuYW1lXG4gKiBgRU1VTEFUT1JfQkFDS0VORF9OQU1FX1BBVFRFUk5gIGFjY2VwdHMgc3RhcnRzIHdpdGggb25lIG9mIHRoZW0uXG4gKlxuICogT25lIGNhbGwgcGVyIHByZWZpeCwgYmVjYXVzZSBgdGFza2xpc3RgJ3MgYC9GSWAgY2xhdXNlcyBhcmUgQU5EZWQ6IHRoZXJlIGlzXG4gKiBubyB3YXkgdG8gT1IgdHdvIGltYWdlIG5hbWVzIGluIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmNvbnN0IEVNVUxBVE9SX0lNQUdFX05BTUVfUFJFRklYRVMgPSBbJ2VtdWxhdG9yJywgJ3FlbXUtc3lzdGVtJ10gYXMgY29uc3Q7XG5cbi8qKlxuICogVGhlIG5vdGljZSBgdGFza2xpc3RgIHByaW50cyBvbiBzdGRvdXQsIHdpdGggZXhpdCAwLCB3aGVuIGEgZmlsdGVyIG1hdGNoZWRcbiAqIG5vdGhpbmc6IGBJTkZPOiBObyB0YXNrcyBhcmUgcnVubmluZyB3aGljaCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLmBcbiAqIE9ubHkgdGhlIGBJTkZPOmAgcHJlZml4IGlzIG1hdGNoZWQ7IGEgbG9jYWxpemVkIFdpbmRvd3MgdGhhdCB3b3JkcyBpdFxuICogZGlmZmVyZW50bHkgcmVhZHMgYXMgYSBzaWxlbnQgZW1wdHkgYW5zd2VyLCB3aGljaCBpcyByZXBvcnRlZCBhcyBhIGZhaWxlZFxuICogcXVlcnkgXHUyMDE0IHRoZSBzYWZlIGRpcmVjdGlvbiwgc2luY2UgYSBmYWlsZWQgcXVlcnkga2lsbHMgbm90aGluZy5cbiAqL1xuY29uc3QgVEFTS19MSVNUX05PX01BVENIX05PVElDRV9QQVRURVJOID0gL15JTkZPOiAvbTtcbmNvbnN0IEVYRUNVVEFCTEVfU1VGRklYX1BBVFRFUk4gPSAvXFwuZXhlJC87XG5jb25zdCBSQURJWF9ERUNJTUFMID0gMTA7XG4vKipcbiAqIE9ubHkgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgYXJlIHJlYWQsIHNvIHRoZSBzcGxpdCBzdG9wcyBhZnRlciB0aGVtLlxuICovXG5jb25zdCBUQVNLX0xJU1RfRklFTERTX1JFQUQgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZHMgdGhhdCBsaXN0IHRoZSBob3N0J3MgZW11bGF0b3IgcHJvY2Vzc2VzLlxuICpcbiAqICoqT24gV2luZG93cyB0aGUgcXVlcnkgaXMgZmlsdGVyZWQgdG8gdGhlIGVtdWxhdG9yIGltYWdlIG5hbWVzLCBhbmQgdGhhdCBpcyBhXG4gKiBtZWFzdXJlZCBkZWNpc2lvbi4qKiBBIHdob2xlLWhvc3QgYHRhc2tsaXN0YCBkb2VzIHBlci1wcm9jZXNzIHdvcmsgZm9yIGV2ZXJ5XG4gKiByb3csIHNvIGl0IHBheXMgdGhlIGhvc3QncyBjb250ZW50aW9uIG9uY2UgcGVyIHByb2Nlc3M6IGR1cmluZyBhbiBlbXVsYXRvclxuICogYm9vdCBpdCBtZWFzdXJlZCBwNTAgMi45cyBhbmQgbWF4IDkyLjJzIG92ZXIgfjUzMCByb3dzLCBhbmQgd2l0aCBldmVyeSBjb3JlXG4gKiBzYXR1cmF0ZWQgb25lIGNhbGwgc3RhbGxlZCBmb3IgMTIwLjlzIFx1MjAxNCB1bnRpbCB0aGUgbG9hZCBleGl0ZWQgXHUyMDE0IHdoZXJlIHRoZVxuICogZmlsdGVyZWQgY2FsbCBuZXZlciBleGNlZWRlZCA1MDVtcyAoMjAyNi0wOS0yMywgbj04IGVhY2gpLiBUaGUgcGVyLXJvdyBjb3N0IGlzXG4gKiB3b3JrIHRoZSBmaWx0ZXIgc2tpcHMsIHNvIHRoZSBmaWx0ZXJlZCBxdWVyeSBkb2VzIG5vdCBpbmhlcml0IGl0LlxuICpcbiAqICoqT24gUE9TSVggdGhlIHdob2xlLWhvc3QgYHBzYCBpcyBrZXB0LioqIEl0IHJlYWRzIGAvcHJvY2AgYW5kIHdhcyBuZXZlclxuICogbWVhc3VyZWQgc2xvdywgYW5kIGEgd2hvbGUtaG9zdCBsaXN0aW5nIGtlZXBzIHRoZSBpbnZhcmlhbnQgdGhhdCB6ZXJvIHJvd3NcbiAqIG1lYW5zIGEgZmFpbGVkIHF1ZXJ5IFx1MjAxNCB3aGljaCBgcGdyZXBgJ3MgZXhpdCAxIG9uIG5vIG1hdGNoIHdvdWxkIG11ZGR5LlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybSAtIFRoZSBob3N0IHBsYXRmb3JtLCBlLmcuIGBwcm9jZXNzLnBsYXRmb3JtYC5cbiAqIEByZXR1cm5zIFRoZSBxdWVyaWVzIHRvIHJ1bjsgdGhlaXIgcGFyc2VkIHJvd3MgdG9nZXRoZXIgYXJlIHRoZSBhbnN3ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVtdWxhdG9yUHJvY2Vzc1F1ZXJpZXMocGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSk6IEVtdWxhdG9yUHJvY2Vzc1F1ZXJ5W10ge1xuICByZXR1cm4gcGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICA/IEVNVUxBVE9SX0lNQUdFX05BTUVfUFJFRklYRVMubWFwKChwcmVmaXgpID0+ICh7XG4gICAgICBjb21tYW5kOiAndGFza2xpc3QnLFxuICAgICAgY29tbWFuZEFyZ3VtZW50czogWycvRk8nLCAnQ1NWJywgJy9OSCcsICcvRkknLCBgSU1BR0VOQU1FIGVxICR7cHJlZml4fSpgXSxcbiAgICAgIGlzRmlsdGVyZWQ6IHRydWVcbiAgICB9KSlcbiAgICA6IFt7IGNvbW1hbmQ6ICdwcycsIGNvbW1hbmRBcmd1bWVudHM6IFsnLWVvJywgJ3BpZD0sY29tbT0nXSwgaXNGaWx0ZXJlZDogZmFsc2UgfV07XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBxdWVyeSBhZmZpcm1hdGl2ZWx5IHJlcG9ydGVkIHRoYXQgbm90aGluZyBtYXRjaGVkLlxuICpcbiAqIE9ubHkgYSAqKmZpbHRlcmVkKiogcXVlcnkgY2FuIHNheSB0aGF0OiBhIHdob2xlLWhvc3QgbGlzdGluZyBhbHdheXMgaGFzIHJvd3MsXG4gKiBzbyBhbiBlbXB0eSBvbmUgaXMgbmV2ZXIgYW4gYW5zd2VyLiBBIGZpbHRlcmVkIHF1ZXJ5IHRoYXQgcHJpbnRlZCBub3RoaW5nIGF0XG4gKiBhbGwgaXMgbm90IGFuIGFuc3dlciBlaXRoZXIgXHUyMDE0IHNpbGVuY2UgYW5kIFwibm8gZW11bGF0b3IgaXMgcnVubmluZ1wiIG11c3Qgc3RheVxuICogZGlzdGluZ3Vpc2hhYmxlLCBvciBhIGZhaWxlZCBxdWVyeSByZWFkcyBhcyBhIGhvc3Qgd2l0aCBubyBlbXVsYXRvciBvbiBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHF1ZXJ5IGFuZCBpdHMgc3Rkb3V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcXVlcnkncyBvdXRwdXQgY2FycmllcyBpdHMgb3duIG5vLW1hdGNoIG5vdGljZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNOb01hdGNoUmVwb3J0ZWQocGFyYW1zOiBDaGVja0lzTm9NYXRjaFJlcG9ydGVkUGFyYW1zKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXJhbXMucXVlcnkuaXNGaWx0ZXJlZCAmJiBUQVNLX0xJU1RfTk9fTUFUQ0hfTk9USUNFX1BBVFRFUk4udGVzdChwYXJhbXMub3V0cHV0KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG91dHB1dCBvZiBvbmUgb2Yge0BsaW5rIGJ1aWxkRW11bGF0b3JQcm9jZXNzUXVlcmllc30nIGNvbW1hbmRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcXVlcnkgYW5kIGl0cyBzdGRvdXQuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIHBhcnNhYmxlIHJvdywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbXVsYXRvclByb2Nlc3NRdWVyeU91dHB1dChwYXJhbXM6IFBhcnNlRW11bGF0b3JQcm9jZXNzUXVlcnlPdXRwdXRQYXJhbXMpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICByZXR1cm4gcGFyYW1zLnF1ZXJ5LmNvbW1hbmQgPT09ICd0YXNrbGlzdCcgPyBwYXJzZVdpbmRvd3NUYXNrTGlzdChwYXJhbXMub3V0cHV0KSA6IHBhcnNlUG9zaXhQcm9jZXNzTGlzdChwYXJhbXMub3V0cHV0KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYHBzIC1lbyBwaWQ9LGNvbW09YCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHByb2Nlc3NMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB0aGUgYHBzYCBsaXN0aW5nLlxuICogQHJldHVybnMgT25lIGVudHJ5IHBlciBwYXJzYWJsZSByb3csIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG9zaXhQcm9jZXNzTGlzdChwcm9jZXNzTGlzdE91dHB1dDogc3RyaW5nKTogUHJvY2Vzc0xpc3RFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogUHJvY2Vzc0xpc3RFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIHByb2Nlc3NMaXN0T3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IGxpbmUgPSByYXdMaW5lLnRyaW0oKTtcbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignICcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChsaW5lLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KSwgUkFESVhfREVDSU1BTCk7XG4gICAgaWYgKE51bWJlci5pc05hTihwaWQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBlbnRyaWVzLnB1c2goeyBuYW1lOiBsaW5lLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSkudHJpbSgpLCBwaWQgfSk7XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqXG4gKiBQYXJzZXMgYHRhc2tsaXN0IC9GTyBDU1YgL05IYCBvdXRwdXQuXG4gKlxuICogT25seSB0aGUgZmlyc3QgdHdvIGZpZWxkcyBhcmUgcmVhZCBcdTIwMTQgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgXHUyMDE0IHNvIHRoZVxuICogbWVtb3J5IGNvbHVtbidzIG93biBjb21tYXMgY2Fubm90IGNvbmZ1c2UgdGhlIHNwbGl0LlxuICpcbiAqIEBwYXJhbSB0YXNrTGlzdE91dHB1dCAtIFJhdyBzdGRvdXQgb2YgdGhlIGB0YXNrbGlzdGAgbGlzdGluZy5cbiAqIEByZXR1cm5zIE9uZSBlbnRyeSBwZXIgcGFyc2FibGUgcm93LCBpbiBsaXN0ZWQgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdpbmRvd3NUYXNrTGlzdCh0YXNrTGlzdE91dHB1dDogc3RyaW5nKTogUHJvY2Vzc0xpc3RFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogUHJvY2Vzc0xpc3RFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIHRhc2tMaXN0T3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IFtyYXdOYW1lID0gJycsIHJhd1BpZCA9ICcnXSA9IHJhd0xpbmUudHJpbSgpLnJlcGxhY2VBbGwoJ1wiJywgJycpLnNwbGl0KCcsJywgVEFTS19MSVNUX0ZJRUxEU19SRUFEKTtcbiAgICBjb25zdCBwaWQgPSBOdW1iZXIucGFyc2VJbnQocmF3UGlkLCBSQURJWF9ERUNJTUFMKTtcbiAgICBpZiAocmF3TmFtZS5sZW5ndGggPT09IDAgfHwgTnVtYmVyLmlzTmFOKHBpZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudHJpZXMucHVzaCh7IG5hbWU6IHJhd05hbWUsIHBpZCB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGVtdWxhdG9yIHByb2Nlc3NlcyB0aGlzIHJ1biBpcyByZXNwb25zaWJsZSBmb3Iga2lsbGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGN1cnJlbnQgbGlzdGluZyBwbHVzIHRoZSBQSURzIHRoYXQgcHJlZGF0ZSB0aGlzIHJ1bidzIGVtdWxhdG9yLlxuICogQHJldHVybnMgVGhlIFBJRHMgb2YgZW11bGF0b3IgcHJvY2Vzc2VzIHRoaXMgcnVuIG93bnMsIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHMocGFyYW1zOiBTZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzUGFyYW1zKTogbnVtYmVyW10ge1xuICByZXR1cm4gcGFyYW1zLnByb2Nlc3Nlc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBjaGVja0lzRW11bGF0b3JCYWNrZW5kTmFtZShlbnRyeS5uYW1lKSAmJiAhcGFyYW1zLmtub3duUGlkcy5pbmNsdWRlcyhlbnRyeS5waWQpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5waWQpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzRW11bGF0b3JCYWNrZW5kTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnNsaWNlKE1hdGgubWF4KG5hbWUubGFzdEluZGV4T2YoJy8nKSwgbmFtZS5sYXN0SW5kZXhPZignXFxcXCcpKSArIDEpO1xuICByZXR1cm4gRU1VTEFUT1JfQkFDS0VORF9OQU1FX1BBVFRFUk4udGVzdChiYXNlTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoRVhFQ1VUQUJMRV9TVUZGSVhfUEFUVEVSTiwgJycpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBK0dBLE1BQU0sZ0NBQWdDO0FBUXRDLE1BQU0sK0JBQStCLENBQUMsWUFBWSxhQUFhO0FBUy9ELE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sZ0JBQWdCO0FBSXRCLE1BQU0sd0JBQXdCO0FBb0J2QixTQUFTLDRCQUE0QixVQUFtRDtBQUM3RixTQUFPLGFBQWEsVUFDaEIsNkJBQTZCLElBQUksQ0FBQyxZQUFZO0FBQUEsSUFDOUMsU0FBUztBQUFBLElBQ1Qsa0JBQWtCLENBQUMsT0FBTyxPQUFPLE9BQU8sT0FBTyxnQkFBZ0IsTUFBTSxHQUFHO0FBQUEsSUFDeEUsWUFBWTtBQUFBLEVBQ2QsRUFBRSxJQUNBLENBQUMsRUFBRSxTQUFTLE1BQU0sa0JBQWtCLENBQUMsT0FBTyxZQUFZLEdBQUcsWUFBWSxNQUFNLENBQUM7QUFDcEY7QUFhTyxTQUFTLHVCQUF1QixRQUErQztBQUNwRixTQUFPLE9BQU8sTUFBTSxjQUFjLGtDQUFrQyxLQUFLLE9BQU8sTUFBTTtBQUN4RjtBQVFPLFNBQVMsZ0NBQWdDLFFBQW1FO0FBQ2pILFNBQU8sT0FBTyxNQUFNLFlBQVksYUFBYSxxQkFBcUIsT0FBTyxNQUFNLElBQUksc0JBQXNCLE9BQU8sTUFBTTtBQUN4SDtBQVFPLFNBQVMsc0JBQXNCLG1CQUErQztBQUNuRixRQUFNLFVBQThCLENBQUM7QUFFckMsYUFBVyxXQUFXLGtCQUFrQixNQUFNLElBQUksR0FBRztBQUNuRCxVQUFNLE9BQU8sUUFBUSxLQUFLO0FBQzFCLFVBQU0saUJBQWlCLEtBQUssUUFBUSxHQUFHO0FBQ3ZDLFFBQUksbUJBQW1CLElBQUk7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNLE9BQU8sU0FBUyxLQUFLLE1BQU0sR0FBRyxjQUFjLEdBQUcsYUFBYTtBQUN4RSxRQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUc7QUFDckI7QUFBQSxJQUNGO0FBRUEsWUFBUSxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0saUJBQWlCLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQUEsRUFDbkU7QUFFQSxTQUFPO0FBQ1Q7QUFXTyxTQUFTLHFCQUFxQixnQkFBNEM7QUFDL0UsUUFBTSxVQUE4QixDQUFDO0FBRXJDLGFBQVcsV0FBVyxlQUFlLE1BQU0sSUFBSSxHQUFHO0FBQ2hELFVBQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLElBQUksUUFBUSxLQUFLLEVBQUUsV0FBVyxLQUFLLEVBQUUsRUFBRSxNQUFNLEtBQUsscUJBQXFCO0FBQ3ZHLFVBQU0sTUFBTSxPQUFPLFNBQVMsUUFBUSxhQUFhO0FBQ2pELFFBQUksUUFBUSxXQUFXLEtBQUssT0FBTyxNQUFNLEdBQUcsR0FBRztBQUM3QztBQUFBLElBQ0Y7QUFFQSxZQUFRLEtBQUssRUFBRSxNQUFNLFNBQVMsSUFBSSxDQUFDO0FBQUEsRUFDckM7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDBCQUEwQixRQUFtRDtBQUMzRixTQUFPLE9BQU8sVUFDWCxPQUFPLENBQUMsVUFBVSwyQkFBMkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLFVBQVUsU0FBUyxNQUFNLEdBQUcsQ0FBQyxFQUNqRyxJQUFJLENBQUMsVUFBVSxNQUFNLEdBQUc7QUFDN0I7QUFFQSxTQUFTLDJCQUEyQixNQUF1QjtBQUN6RCxRQUFNLFdBQVcsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLFlBQVksR0FBRyxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZGLFNBQU8sOEJBQThCLEtBQUssU0FBUyxZQUFZLEVBQUUsUUFBUSwyQkFBMkIsRUFBRSxDQUFDO0FBQ3pHOyIsCiAgIm5hbWVzIjogW10KfQo=