obsidian-integration-testing 14.0.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +2 -0
  2. package/dist/lib/cjs/appium-dependencies.cjs +2 -5
  3. package/dist/lib/cjs/appium-server-marker.cjs +3 -9
  4. package/dist/lib/cjs/asar-fallback-detection.cjs +2 -5
  5. package/dist/lib/cjs/avd-probe-verdict.cjs +3 -9
  6. package/dist/lib/cjs/capture-obsidian-screenshot.cjs +9 -1
  7. package/dist/lib/cjs/capture-obsidian-screenshot.d.cts +21 -0
  8. package/dist/lib/cjs/capture-screenshot.cjs +2 -5
  9. package/dist/lib/cjs/cli.cjs +2 -5
  10. package/dist/lib/cjs/demo-vault-populate.cjs +7 -9
  11. package/dist/lib/cjs/device-setting-restore.cjs +2 -5
  12. package/dist/lib/cjs/electron-compatibility.cjs +8 -11
  13. package/dist/lib/cjs/emulator-arguments.cjs +14 -14
  14. package/dist/lib/cjs/emulator-marker.cjs +4 -13
  15. package/dist/lib/cjs/emulator-reaper.cjs +2 -5
  16. package/dist/lib/cjs/emulator-snapshot.cjs +3 -9
  17. package/dist/lib/cjs/eval-cap-exceeded-error.cjs +2 -5
  18. package/dist/lib/cjs/exec.cjs +12 -24
  19. package/dist/lib/cjs/function-expression.cjs +2 -5
  20. package/dist/lib/cjs/global-setup-core.cjs +53 -18
  21. package/dist/lib/cjs/hide-vault-name.cjs +45 -0
  22. package/dist/lib/cjs/hide-vault-name.d.cts +67 -0
  23. package/dist/lib/cjs/index.cjs +9 -1
  24. package/dist/lib/cjs/index.d.cts +6 -2
  25. package/dist/lib/cjs/installer-asset.cjs +3 -9
  26. package/dist/lib/cjs/installer-compatibility.cjs +9 -12
  27. package/dist/lib/cjs/label-screenshot.cjs +63 -4
  28. package/dist/lib/cjs/label-screenshot.d.cts +66 -2
  29. package/dist/lib/cjs/leftover-cleanup.cjs +2 -5
  30. package/dist/lib/cjs/library.cjs +1 -1
  31. package/dist/lib/cjs/mobile-input.cjs +17 -31
  32. package/dist/lib/cjs/namespace-bootstrap.cjs +3 -9
  33. package/dist/lib/cjs/obsidian-executable.cjs +2 -5
  34. package/dist/lib/cjs/obsidian-installer.cjs +3 -9
  35. package/dist/lib/cjs/obsidian-instance.cjs +1 -1
  36. package/dist/lib/cjs/obsidian-instance.d.cts +8 -0
  37. package/dist/lib/cjs/owned-instance-exit-marker.cjs +2 -5
  38. package/dist/lib/cjs/owned-instance-exited-error.cjs +13 -17
  39. package/dist/lib/cjs/process-exit-message.cjs +3 -9
  40. package/dist/lib/cjs/renderer-boot-detection.cjs +3 -9
  41. package/dist/lib/cjs/setup-lock.cjs +3 -9
  42. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  43. package/dist/lib/cjs/sharp-loader.d.cts +11 -0
  44. package/dist/lib/cjs/soft-keyboard-geometry.cjs +4 -9
  45. package/dist/lib/cjs/stale-build-detection.cjs +115 -0
  46. package/dist/lib/cjs/stale-build-detection.d.cts +108 -0
  47. package/dist/lib/cjs/stale-build-error.cjs +74 -0
  48. package/dist/lib/cjs/stale-build-error.d.cts +81 -0
  49. package/dist/lib/cjs/strict-proxy.cjs +3 -9
  50. package/dist/lib/cjs/transport-appium.cjs +3 -9
  51. package/dist/lib/cjs/transport-desktop-cdp.cjs +18 -32
  52. package/dist/lib/cjs/transport-factory.cjs +20 -25
  53. package/dist/lib/cjs/transport-options.cjs +2 -5
  54. package/dist/lib/cjs/transport-options.d.cts +36 -0
  55. package/dist/lib/cjs/vault-teardown-verdict.cjs +2 -5
  56. package/dist/lib/cjs/version-matrix.cjs +4 -13
  57. package/dist/lib/cjs/wedged-appium-server.cjs +3 -9
  58. package/dist/lib/esm/appium-dependencies.mjs +2 -5
  59. package/dist/lib/esm/appium-server-marker.mjs +3 -9
  60. package/dist/lib/esm/asar-fallback-detection.mjs +2 -5
  61. package/dist/lib/esm/avd-probe-verdict.mjs +3 -9
  62. package/dist/lib/esm/capture-obsidian-screenshot.d.mts +21 -0
  63. package/dist/lib/esm/capture-obsidian-screenshot.mjs +9 -1
  64. package/dist/lib/esm/capture-screenshot.mjs +2 -5
  65. package/dist/lib/esm/cli.mjs +2 -5
  66. package/dist/lib/esm/demo-vault-populate.mjs +7 -9
  67. package/dist/lib/esm/device-setting-restore.mjs +2 -5
  68. package/dist/lib/esm/electron-compatibility.mjs +8 -11
  69. package/dist/lib/esm/emulator-arguments.mjs +14 -14
  70. package/dist/lib/esm/emulator-marker.mjs +4 -13
  71. package/dist/lib/esm/emulator-reaper.mjs +2 -5
  72. package/dist/lib/esm/emulator-snapshot.mjs +3 -9
  73. package/dist/lib/esm/eval-cap-exceeded-error.mjs +2 -5
  74. package/dist/lib/esm/exec.mjs +12 -24
  75. package/dist/lib/esm/function-expression.mjs +2 -5
  76. package/dist/lib/esm/global-setup-core.mjs +60 -19
  77. package/dist/lib/esm/hide-vault-name.d.mts +67 -0
  78. package/dist/lib/esm/hide-vault-name.mjs +21 -0
  79. package/dist/lib/esm/index.d.mts +6 -2
  80. package/dist/lib/esm/index.mjs +8 -2
  81. package/dist/lib/esm/installer-asset.mjs +3 -9
  82. package/dist/lib/esm/installer-compatibility.mjs +9 -12
  83. package/dist/lib/esm/label-screenshot.d.mts +66 -2
  84. package/dist/lib/esm/label-screenshot.mjs +61 -3
  85. package/dist/lib/esm/leftover-cleanup.mjs +2 -5
  86. package/dist/lib/esm/library.mjs +1 -1
  87. package/dist/lib/esm/mobile-input.mjs +17 -31
  88. package/dist/lib/esm/namespace-bootstrap.mjs +3 -9
  89. package/dist/lib/esm/obsidian-executable.mjs +2 -5
  90. package/dist/lib/esm/obsidian-installer.mjs +3 -9
  91. package/dist/lib/esm/obsidian-instance.d.mts +8 -0
  92. package/dist/lib/esm/obsidian-instance.mjs +1 -1
  93. package/dist/lib/esm/owned-instance-exit-marker.mjs +2 -5
  94. package/dist/lib/esm/owned-instance-exited-error.mjs +13 -17
  95. package/dist/lib/esm/process-exit-message.mjs +3 -9
  96. package/dist/lib/esm/renderer-boot-detection.mjs +3 -9
  97. package/dist/lib/esm/setup-lock.mjs +3 -9
  98. package/dist/lib/esm/sharp-loader.d.mts +11 -0
  99. package/dist/lib/esm/sharp-loader.mjs +1 -1
  100. package/dist/lib/esm/soft-keyboard-geometry.mjs +4 -9
  101. package/dist/lib/esm/stale-build-detection.d.mts +108 -0
  102. package/dist/lib/esm/stale-build-detection.mjs +84 -0
  103. package/dist/lib/esm/stale-build-error.d.mts +81 -0
  104. package/dist/lib/esm/stale-build-error.mjs +50 -0
  105. package/dist/lib/esm/strict-proxy.mjs +3 -9
  106. package/dist/lib/esm/transport-appium.mjs +3 -9
  107. package/dist/lib/esm/transport-desktop-cdp.mjs +18 -32
  108. package/dist/lib/esm/transport-factory.mjs +20 -25
  109. package/dist/lib/esm/transport-options.d.mts +36 -0
  110. package/dist/lib/esm/transport-options.mjs +2 -5
  111. package/dist/lib/esm/vault-teardown-verdict.mjs +2 -5
  112. package/dist/lib/esm/version-matrix.mjs +4 -13
  113. package/dist/lib/esm/wedged-appium-server.mjs +3 -9
  114. package/package.json +20 -19
@@ -32,6 +32,7 @@ export interface SharpInstance {
32
32
  png: (this: void) => SharpInstance;
33
33
  resize: (this: void, width: number, height: number, options?: SharpResizeOptions) => SharpInstance;
34
34
  toBuffer: (this: void) => Promise<Buffer>;
35
+ trim: (this: void, options: SharpTrimOptions) => SharpInstance;
35
36
  }
36
37
  /**
37
38
  * The subset of `sharp`'s metadata the image helpers read.
@@ -46,6 +47,16 @@ export interface SharpMetadata {
46
47
  export interface SharpResizeOptions {
47
48
  readonly fit: 'cover' | 'fill';
48
49
  }
50
+ /**
51
+ * The subset of `sharp`'s trim options the image helpers set.
52
+ */
53
+ export interface SharpTrimOptions {
54
+ /**
55
+ * How far a pixel may differ from the trimmed-away color before it counts as
56
+ * content.
57
+ */
58
+ readonly threshold: number;
59
+ }
49
60
  /**
50
61
  * Loads `sharp` on demand.
51
62
  *
@@ -13,4 +13,4 @@ async function importSharp(caller) {
13
13
  export {
14
14
  importSharp
15
15
  };
16
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NoYXJwLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExhemlseSBsb2FkcyBgc2hhcnBgLCB0aGUgT1BUSU9OQUwgcGVlciBkZXBlbmRlbmN5IHRoZSBpbWFnZSBoZWxwZXJzIG5lZWQsIGFuZFxuICogZGVzY3JpYmVzIHRoZSBzbGljZSBvZiBpdHMgc3VyZmFjZSB0aGV5IHVzZS5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGBzaGFycGAnc1xuICogcGxhdGZvcm0tc3BlY2lmaWMgbmF0aXZlIGJpbmFyaWVzIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsXG4gKiB3aGVuIG9ubHkgc2NyZWVuc2hvdCBwb3N0LXByb2Nlc3NpbmcgbmVlZHMgdGhlbS4gVGhlIHR5cGUgaXMgc3RydWN0dXJhbCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhpcyBtb2R1bGUgdHlwZS1jaGVja3Mgd2l0aG91dCBgc2hhcnBgJ3Mgb3duIHR5cGVzIGJlaW5nXG4gKiByZXNvbHZhYmxlLlxuICovXG5cbi8qKlxuICogQSBsYXllciBwYXNzZWQgdG8gYHNoYXJwYCdzIGBjb21wb3NpdGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwQ29tcG9zaXRlTGF5ZXIge1xuICByZWFkb25seSBpbnB1dDogQnVmZmVyO1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBpbWFnZSBoZWxwZXJzIHVzZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcnBGYWN0b3J5ID0gKGlucHV0OiBVaW50OEFycmF5KSA9PiBTaGFycEluc3RhbmNlO1xuXG4vKipcbiAqIE9uZSBgc2hhcnBgIHBpcGVsaW5lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwSW5zdGFuY2Uge1xuICBibHVyOiAodGhpczogdm9pZCwgc2lnbWE6IG51bWJlcikgPT4gU2hhcnBJbnN0YW5jZTtcbiAgY29tcG9zaXRlOiAodGhpczogdm9pZCwgbGF5ZXJzOiBTaGFycENvbXBvc2l0ZUxheWVyW10pID0+IFNoYXJwSW5zdGFuY2U7XG4gIG1ldGFkYXRhOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxTaGFycE1ldGFkYXRhPjtcbiAgcG5nOiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmVzaXplOiAodGhpczogdm9pZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM/OiBTaGFycFJlc2l6ZU9wdGlvbnMpID0+IFNoYXJwSW5zdGFuY2U7XG4gIHRvQnVmZmVyOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxCdWZmZXI+O1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYHNoYXJwYCdzIG1ldGFkYXRhIHRoZSBpbWFnZSBoZWxwZXJzIHJlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcnBNZXRhZGF0YSB7XG4gIHJlYWRvbmx5IGhlaWdodD86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgd2lkdGg/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgc2hhcnBgJ3MgcmVzaXplIG9wdGlvbnMgdGhlIGltYWdlIGhlbHBlcnMgc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwUmVzaXplT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZpdDogJ2NvdmVyJyB8ICdmaWxsJztcbn1cblxuLyoqXG4gKiBMb2FkcyBgc2hhcnBgIG9uIGRlbWFuZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGVyIC0gTmFtZSBvZiB0aGUgY2FsbGluZyBoZWxwZXIsIHNvIHRoZSBlcnJvciBzYXlzIHdoaWNoIG9uZSBuZWVkcyBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGBzaGFycGAgZmFjdG9yeS5cbiAqIEB0aHJvd3MgRXJyb3IgbmFtaW5nIHRoZSBtaXNzaW5nIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNoYXJwKGNhbGxlcjogc3RyaW5nKTogUHJvbWlzZTxTaGFycEZhY3Rvcnk+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gYHNoYXJwYCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyBpdCBtdXN0IGJlIGxvYWRlZCBsYXppbHk6IGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGl0cyBuYXRpdmUgYmluYXJpZXMgaW50byBldmVyeSBjb25zdW1lciBvZiB0aGlzIHBhY2thZ2UncyBpbmRleC5cbiAgICBjb25zdCBzaGFycE1vZHVsZSA9IGF3YWl0IGltcG9ydCgnc2hhcnAnKTtcbiAgICBjb25zdCBmYWN0b3J5OiB1bmtub3duID0gc2hhcnBNb2R1bGUuZGVmYXVsdDtcbiAgICByZXR1cm4gZmFjdG9yeSBhcyBTaGFycEZhY3Rvcnk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFJlYWNoZWQgb25seSB3aGVuIHRoZSBvcHRpb25hbCBwZWVyIGlzIGFic2VudCwgd2hpY2ggaXQgbmV2ZXIgaXMgaW4gdGhpcyBwYWNrYWdlJ3Mgb3duIHRlc3QgcnVuLiAqL1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NhbGxlcn0gbmVlZHMgdGhlIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSBcInNoYXJwXCIuIGBcbiAgICAgICAgKyAnSW5zdGFsbCBpdCBpbiB0aGUgY29uc3VtaW5nIHByb2plY3QgKG5wbSBpIC1EIHNoYXJwKS4nLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICk7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNkRBLGVBQXNCLFlBQVksUUFBdUM7QUFDdkUsTUFBSTtBQUVGLFVBQU0sY0FBYyxNQUFNLE9BQU8sT0FBTztBQUN4QyxVQUFNLFVBQW1CLFlBQVk7QUFDckMsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFnQjtBQUV2QixVQUFNLElBQUk7QUFBQSxNQUNSLEdBQUcsTUFBTTtBQUFBLE1BRVQsRUFBRSxPQUFPLE1BQU07QUFBQSxJQUNqQjtBQUFBLEVBRUY7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
16
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NoYXJwLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExhemlseSBsb2FkcyBgc2hhcnBgLCB0aGUgT1BUSU9OQUwgcGVlciBkZXBlbmRlbmN5IHRoZSBpbWFnZSBoZWxwZXJzIG5lZWQsIGFuZFxuICogZGVzY3JpYmVzIHRoZSBzbGljZSBvZiBpdHMgc3VyZmFjZSB0aGV5IHVzZS5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGBzaGFycGAnc1xuICogcGxhdGZvcm0tc3BlY2lmaWMgbmF0aXZlIGJpbmFyaWVzIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsXG4gKiB3aGVuIG9ubHkgc2NyZWVuc2hvdCBwb3N0LXByb2Nlc3NpbmcgbmVlZHMgdGhlbS4gVGhlIHR5cGUgaXMgc3RydWN0dXJhbCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhpcyBtb2R1bGUgdHlwZS1jaGVja3Mgd2l0aG91dCBgc2hhcnBgJ3Mgb3duIHR5cGVzIGJlaW5nXG4gKiByZXNvbHZhYmxlLlxuICovXG5cbi8qKlxuICogQSBsYXllciBwYXNzZWQgdG8gYHNoYXJwYCdzIGBjb21wb3NpdGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwQ29tcG9zaXRlTGF5ZXIge1xuICByZWFkb25seSBpbnB1dDogQnVmZmVyO1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBpbWFnZSBoZWxwZXJzIHVzZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcnBGYWN0b3J5ID0gKGlucHV0OiBVaW50OEFycmF5KSA9PiBTaGFycEluc3RhbmNlO1xuXG4vKipcbiAqIE9uZSBgc2hhcnBgIHBpcGVsaW5lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwSW5zdGFuY2Uge1xuICBibHVyOiAodGhpczogdm9pZCwgc2lnbWE6IG51bWJlcikgPT4gU2hhcnBJbnN0YW5jZTtcbiAgY29tcG9zaXRlOiAodGhpczogdm9pZCwgbGF5ZXJzOiBTaGFycENvbXBvc2l0ZUxheWVyW10pID0+IFNoYXJwSW5zdGFuY2U7XG4gIG1ldGFkYXRhOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxTaGFycE1ldGFkYXRhPjtcbiAgcG5nOiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmVzaXplOiAodGhpczogdm9pZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM/OiBTaGFycFJlc2l6ZU9wdGlvbnMpID0+IFNoYXJwSW5zdGFuY2U7XG4gIHRvQnVmZmVyOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxCdWZmZXI+O1xuICB0cmltOiAodGhpczogdm9pZCwgb3B0aW9uczogU2hhcnBUcmltT3B0aW9ucykgPT4gU2hhcnBJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBzaGFycGAncyBtZXRhZGF0YSB0aGUgaW1hZ2UgaGVscGVycyByZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwTWV0YWRhdGEge1xuICByZWFkb25seSBoZWlnaHQ/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHdpZHRoPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYHNoYXJwYCdzIHJlc2l6ZSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFJlc2l6ZU9wdGlvbnMge1xuICByZWFkb25seSBmaXQ6ICdjb3ZlcicgfCAnZmlsbCc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgc2hhcnBgJ3MgdHJpbSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFRyaW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvdyBmYXIgYSBwaXhlbCBtYXkgZGlmZmVyIGZyb20gdGhlIHRyaW1tZWQtYXdheSBjb2xvciBiZWZvcmUgaXQgY291bnRzIGFzXG4gICAqIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMb2FkcyBgc2hhcnBgIG9uIGRlbWFuZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGVyIC0gTmFtZSBvZiB0aGUgY2FsbGluZyBoZWxwZXIsIHNvIHRoZSBlcnJvciBzYXlzIHdoaWNoIG9uZSBuZWVkcyBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGBzaGFycGAgZmFjdG9yeS5cbiAqIEB0aHJvd3MgRXJyb3IgbmFtaW5nIHRoZSBtaXNzaW5nIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNoYXJwKGNhbGxlcjogc3RyaW5nKTogUHJvbWlzZTxTaGFycEZhY3Rvcnk+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gYHNoYXJwYCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyBpdCBtdXN0IGJlIGxvYWRlZCBsYXppbHk6IGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGl0cyBuYXRpdmUgYmluYXJpZXMgaW50byBldmVyeSBjb25zdW1lciBvZiB0aGlzIHBhY2thZ2UncyBpbmRleC5cbiAgICBjb25zdCBzaGFycE1vZHVsZSA9IGF3YWl0IGltcG9ydCgnc2hhcnAnKTtcbiAgICBjb25zdCBmYWN0b3J5OiB1bmtub3duID0gc2hhcnBNb2R1bGUuZGVmYXVsdDtcbiAgICByZXR1cm4gZmFjdG9yeSBhcyBTaGFycEZhY3Rvcnk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFJlYWNoZWQgb25seSB3aGVuIHRoZSBvcHRpb25hbCBwZWVyIGlzIGFic2VudCwgd2hpY2ggaXQgbmV2ZXIgaXMgaW4gdGhpcyBwYWNrYWdlJ3Mgb3duIHRlc3QgcnVuLiAqL1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NhbGxlcn0gbmVlZHMgdGhlIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSBcInNoYXJwXCIuIGBcbiAgICAgICAgKyAnSW5zdGFsbCBpdCBpbiB0aGUgY29uc3VtaW5nIHByb2plY3QgKG5wbSBpIC1EIHNoYXJwKS4nLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICk7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBeUVBLGVBQXNCLFlBQVksUUFBdUM7QUFDdkUsTUFBSTtBQUVGLFVBQU0sY0FBYyxNQUFNLE9BQU8sT0FBTztBQUN4QyxVQUFNLFVBQW1CLFlBQVk7QUFDckMsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFnQjtBQUV2QixVQUFNLElBQUk7QUFBQSxNQUNSLEdBQUcsTUFBTTtBQUFBLE1BRVQsRUFBRSxPQUFPLE1BQU07QUFBQSxJQUNqQjtBQUFBLEVBRUY7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -8,11 +8,9 @@ function buildSoftKeyboardDiagnosticMessage(params) {
8
8
  const lines = [
9
9
  `raiseSoftKeyboard: the keyboard did not come up. Device framebuffer written to ${params.screenshotPath}.`,
10
10
  `page: innerHeight=${String(params.snapshot.innerHeight)} baselineInputTop=${formatMeasurement(baselineTop)} inputTop=${formatMeasurement(currentTop)} lift=${formatMeasurement(lift)}`,
11
- `device: ${params.inputMethodState || "(no input_method state reported)"}`
11
+ `device: ${params.inputMethodState || "(no input_method state reported)"}`,
12
+ ...lift === 0 ? ["The field did not move at all. If the device says the keyboard is showing, it was already up before the first touch \u2014 this check cannot tell that from a field that never lifts."] : []
12
13
  ];
13
- if (lift === 0) {
14
- lines.push("The field did not move at all. If the device says the keyboard is showing, it was already up before the first touch \u2014 this check cannot tell that from a field that never lifts.");
15
- }
16
14
  return lines.join("\n");
17
15
  }
18
16
  function checkIsSoftKeyboardUp(params) {
@@ -35,10 +33,7 @@ function resolveSoftKeyboardTapPoints(params) {
35
33
  const xInPixels = Math.round((inputRect.left + inputRect.width / CENTER_DIVISOR) * devicePixelRatio);
36
34
  const centerYInPixels = Math.round((inputRect.top + inputRect.height / CENTER_DIVISOR) * devicePixelRatio);
37
35
  const topOffsetInPixels = Math.round(screenY * devicePixelRatio);
38
- if (topOffsetInPixels === 0) {
39
- return [{ xInPixels, yInPixels: centerYInPixels }];
40
- }
41
- return [
36
+ return topOffsetInPixels === 0 ? [{ xInPixels, yInPixels: centerYInPixels }] : [
42
37
  { xInPixels, yInPixels: centerYInPixels + topOffsetInPixels },
43
38
  { xInPixels, yInPixels: centerYInPixels }
44
39
  ];
@@ -53,4 +48,4 @@ export {
53
48
  parseInputMethodState,
54
49
  resolveSoftKeyboardTapPoints
55
50
  };
56
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgYmVpbmcgdGhlIG9uZSByZWFkaW5nIHRoYXQgYW4gYWxyZWFkeS11cCBrZXlib2FyZCBhbHNvIHByb2R1Y2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gXG4gIF07XG5cbiAgaWYgKGxpZnQgPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCdUaGUgZmllbGQgZGlkIG5vdCBtb3ZlIGF0IGFsbC4gSWYgdGhlIGRldmljZSBzYXlzIHRoZSBrZXlib2FyZCBpcyBzaG93aW5nLCBpdCB3YXMgYWxyZWFkeSB1cCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoIFx1MjAxNCB0aGlzIGNoZWNrIGNhbm5vdCB0ZWxsIHRoYXQgZnJvbSBhIGZpZWxkIHRoYXQgbmV2ZXIgbGlmdHMuJyk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gaG93IGZhciB0aGUgZmllbGQgbW92ZWQuXG4gKlxuICogVGhlIHZlcmRpY3QgaXMgYSAqKmRlbHRhKio6IHRoZSBmaWVsZCBtdXN0IGhhdmUgcmlzZW4gZnJvbSB3aGVyZSBpdCBzYXQgYmVmb3JlIHRoZSB0b3VjaCwgYnkgYXQgbGVhc3RcbiAqIGBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsc2AuIE9ic2lkaWFuIE1vYmlsZSBsaWZ0cyB3aGF0ZXZlciBpcyBvbiBzY3JlZW4gdG8gbWFrZSByb29tIGZvciB0aGUgSU1FLFxuICogc28gYSBmaWVsZCB0aGF0IGhhcyBub3QgbW92ZWQgaGFzIGhhZCBubyBrZXlib2FyZCBhcnJpdmUgdW5kZXIgaXQgXHUyMDE0IHdoZXRoZXIgaXQgaXMgYSBib3R0b20tYW5jaG9yZWRcbiAqIHN1Z2dlc3RlciBvciBhIGNlbnRyZWQgbW9kYWwuXG4gKlxuICogKipUaGUgb25lIGNhc2UgdGhpcyBnZXRzIHdyb25nLCBkZWxpYmVyYXRlbHk6KiogYSBrZXlib2FyZCB0aGF0IHdhcyAqYWxyZWFkeSogdXAgYmVmb3JlIHRoZSBiYXNlbGluZSB3YXNcbiAqIHJlYWQuIFRoZSBmaWVsZCBoYXMgbm93aGVyZSBsZWZ0IHRvIGxpZnQgdG8sIHNvIHRoZSBhbnN3ZXIgaXMgYGZhbHNlYC4gTm8gYW1vdW50IG9mIGdlb21ldHJ5IHNlcGFyYXRlc1xuICogdGhhdCBmcm9tIGEgY2VudHJlZCBtb2RhbCB3aXRoIG5vIGtleWJvYXJkIFx1MjAxNCBib3RoIHJlYWQgYXMgXCJjbGVhciBvZiB0aGUgYm90dG9tIGFuZCBub3QgbW92aW5nXCIgXHUyMDE0IGFuZCBvZlxuICogdGhlIHR3byBwb3NzaWJsZSB3cm9uZyBhbnN3ZXJzLCBhIGxvdWQgYGZhbHNlYCBpcyB0aGUgb25lIHdvcnRoIGtlZXBpbmc6IGl0IGZhaWxzIGEgY2FwdHVyZSByYXRoZXIgdGhhblxuICogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2NyZWVuc2hvdCBvZiBhIGtleWJvYXJkIHRoYXQgaXMgbm90IHRoZXJlLiBSZWFkIHRoZSBiYXNlbGluZSB3aXRoIHRoZSBrZXlib2FyZFxuICogZG93biwgd2hpY2ggaXMgd2hhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICBpZiAodG9wT2Zmc2V0SW5QaXhlbHMgPT09IDApIHtcbiAgICByZXR1cm4gW3sgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyB9XTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyB4SW5QaXhlbHMsIHlJblBpeGVsczogY2VudGVyWUluUGl4ZWxzICsgdG9wT2Zmc2V0SW5QaXhlbHMgfSxcbiAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICBdO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBtZWFzdXJlbWVudCBmb3IgdGhlIGRpYWdub3N0aWMsIHNheWluZyBzbyByYXRoZXIgdGhhbiBwcmludGluZyBhIG51bWJlciB3aGVuIHRoZXJlIHdhcyBub25lLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtZWFzdXJlbWVudCwgb3IgYG51bGxgIHdoZW4gdGhlIGZpZWxkIHdhcyBub3Qgb24gc2NyZWVuIHRvIG1lYXN1cmUuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIHRleHQsIG9yIGAobm8gaW5wdXQpYC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TWVhc3VyZW1lbnQodmFsdWU6IG51bGwgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyAnKG5vIGlucHV0KScgOiBTdHJpbmcodmFsdWUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBa0tPLE1BQU0sNENBQTRDO0FBS3pELE1BQU0sNkJBQTZCO0FBS25DLE1BQU0saUJBQWlCO0FBYWhCLFNBQVMsbUNBQW1DLFFBQTBEO0FBQzNHLFFBQU0sY0FBYyxPQUFPLGlCQUFpQixXQUFXLE9BQU87QUFDOUQsUUFBTSxhQUFhLE9BQU8sU0FBUyxXQUFXLE9BQU87QUFDckQsUUFBTSxPQUFPLGdCQUFnQixRQUFRLGVBQWUsT0FBTyxPQUFPLGNBQWM7QUFFaEYsUUFBTSxRQUFRO0FBQUEsSUFDWixrRkFBa0YsT0FBTyxjQUFjO0FBQUEsSUFDdkcscUJBQXFCLE9BQU8sT0FBTyxTQUFTLFdBQVcsQ0FBQyxxQkFBcUIsa0JBQWtCLFdBQVcsQ0FBQyxhQUFhLGtCQUFrQixVQUFVLENBQUMsU0FBUyxrQkFBa0IsSUFBSSxDQUFDO0FBQUEsSUFDckwsV0FBVyxPQUFPLG9CQUFvQixrQ0FBa0M7QUFBQSxFQUMxRTtBQUVBLE1BQUksU0FBUyxHQUFHO0FBQ2QsVUFBTSxLQUFLLHVMQUFrTDtBQUFBLEVBQy9MO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQW9CTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxNQUFJLHNCQUFzQixHQUFHO0FBQzNCLFdBQU8sQ0FBQyxFQUFFLFdBQVcsV0FBVyxnQkFBZ0IsQ0FBQztBQUFBLEVBQ25EO0FBRUEsU0FBTztBQUFBLElBQ0wsRUFBRSxXQUFXLFdBQVcsa0JBQWtCLGtCQUFrQjtBQUFBLElBQzVELEVBQUUsV0FBVyxXQUFXLGdCQUFnQjtBQUFBLEVBQzFDO0FBQ0Y7QUFRQSxTQUFTLGtCQUFrQixPQUE4QjtBQUN2RCxTQUFPLFVBQVUsT0FBTyxlQUFlLE9BQU8sS0FBSztBQUNyRDsiLAogICJuYW1lcyI6IFtdCn0K
51
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgYmVpbmcgdGhlIG9uZSByZWFkaW5nIHRoYXQgYW4gYWxyZWFkeS11cCBrZXlib2FyZCBhbHNvIHByb2R1Y2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gLFxuICAgIC4uLihsaWZ0ID09PSAwID8gWydUaGUgZmllbGQgZGlkIG5vdCBtb3ZlIGF0IGFsbC4gSWYgdGhlIGRldmljZSBzYXlzIHRoZSBrZXlib2FyZCBpcyBzaG93aW5nLCBpdCB3YXMgYWxyZWFkeSB1cCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoIFx1MjAxNCB0aGlzIGNoZWNrIGNhbm5vdCB0ZWxsIHRoYXQgZnJvbSBhIGZpZWxkIHRoYXQgbmV2ZXIgbGlmdHMuJ10gOiBbXSlcbiAgXTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gaG93IGZhciB0aGUgZmllbGQgbW92ZWQuXG4gKlxuICogVGhlIHZlcmRpY3QgaXMgYSAqKmRlbHRhKio6IHRoZSBmaWVsZCBtdXN0IGhhdmUgcmlzZW4gZnJvbSB3aGVyZSBpdCBzYXQgYmVmb3JlIHRoZSB0b3VjaCwgYnkgYXQgbGVhc3RcbiAqIGBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsc2AuIE9ic2lkaWFuIE1vYmlsZSBsaWZ0cyB3aGF0ZXZlciBpcyBvbiBzY3JlZW4gdG8gbWFrZSByb29tIGZvciB0aGUgSU1FLFxuICogc28gYSBmaWVsZCB0aGF0IGhhcyBub3QgbW92ZWQgaGFzIGhhZCBubyBrZXlib2FyZCBhcnJpdmUgdW5kZXIgaXQgXHUyMDE0IHdoZXRoZXIgaXQgaXMgYSBib3R0b20tYW5jaG9yZWRcbiAqIHN1Z2dlc3RlciBvciBhIGNlbnRyZWQgbW9kYWwuXG4gKlxuICogKipUaGUgb25lIGNhc2UgdGhpcyBnZXRzIHdyb25nLCBkZWxpYmVyYXRlbHk6KiogYSBrZXlib2FyZCB0aGF0IHdhcyAqYWxyZWFkeSogdXAgYmVmb3JlIHRoZSBiYXNlbGluZSB3YXNcbiAqIHJlYWQuIFRoZSBmaWVsZCBoYXMgbm93aGVyZSBsZWZ0IHRvIGxpZnQgdG8sIHNvIHRoZSBhbnN3ZXIgaXMgYGZhbHNlYC4gTm8gYW1vdW50IG9mIGdlb21ldHJ5IHNlcGFyYXRlc1xuICogdGhhdCBmcm9tIGEgY2VudHJlZCBtb2RhbCB3aXRoIG5vIGtleWJvYXJkIFx1MjAxNCBib3RoIHJlYWQgYXMgXCJjbGVhciBvZiB0aGUgYm90dG9tIGFuZCBub3QgbW92aW5nXCIgXHUyMDE0IGFuZCBvZlxuICogdGhlIHR3byBwb3NzaWJsZSB3cm9uZyBhbnN3ZXJzLCBhIGxvdWQgYGZhbHNlYCBpcyB0aGUgb25lIHdvcnRoIGtlZXBpbmc6IGl0IGZhaWxzIGEgY2FwdHVyZSByYXRoZXIgdGhhblxuICogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2NyZWVuc2hvdCBvZiBhIGtleWJvYXJkIHRoYXQgaXMgbm90IHRoZXJlLiBSZWFkIHRoZSBiYXNlbGluZSB3aXRoIHRoZSBrZXlib2FyZFxuICogZG93biwgd2hpY2ggaXMgd2hhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICByZXR1cm4gdG9wT2Zmc2V0SW5QaXhlbHMgPT09IDBcbiAgICA/IFt7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfV1cbiAgICA6IFtcbiAgICAgIHsgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyArIHRvcE9mZnNldEluUGl4ZWxzIH0sXG4gICAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICAgIF07XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIG1lYXN1cmVtZW50IGZvciB0aGUgZGlhZ25vc3RpYywgc2F5aW5nIHNvIHJhdGhlciB0aGFuIHByaW50aW5nIGEgbnVtYmVyIHdoZW4gdGhlcmUgd2FzIG5vbmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG1lYXN1cmVtZW50LCBvciBgbnVsbGAgd2hlbiB0aGUgZmllbGQgd2FzIG5vdCBvbiBzY3JlZW4gdG8gbWVhc3VyZS5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgYXMgdGV4dCwgb3IgYChubyBpbnB1dClgLlxuICovXG5mdW5jdGlvbiBmb3JtYXRNZWFzdXJlbWVudCh2YWx1ZTogbnVsbCB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/ICcobm8gaW5wdXQpJyA6IFN0cmluZyh2YWx1ZSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrS08sTUFBTSw0Q0FBNEM7QUFLekQsTUFBTSw2QkFBNkI7QUFLbkMsTUFBTSxpQkFBaUI7QUFhaEIsU0FBUyxtQ0FBbUMsUUFBMEQ7QUFDM0csUUFBTSxjQUFjLE9BQU8saUJBQWlCLFdBQVcsT0FBTztBQUM5RCxRQUFNLGFBQWEsT0FBTyxTQUFTLFdBQVcsT0FBTztBQUNyRCxRQUFNLE9BQU8sZ0JBQWdCLFFBQVEsZUFBZSxPQUFPLE9BQU8sY0FBYztBQUVoRixRQUFNLFFBQVE7QUFBQSxJQUNaLGtGQUFrRixPQUFPLGNBQWM7QUFBQSxJQUN2RyxxQkFBcUIsT0FBTyxPQUFPLFNBQVMsV0FBVyxDQUFDLHFCQUFxQixrQkFBa0IsV0FBVyxDQUFDLGFBQWEsa0JBQWtCLFVBQVUsQ0FBQyxTQUFTLGtCQUFrQixJQUFJLENBQUM7QUFBQSxJQUNyTCxXQUFXLE9BQU8sb0JBQW9CLGtDQUFrQztBQUFBLElBQ3hFLEdBQUksU0FBUyxJQUFJLENBQUMsdUxBQWtMLElBQUksQ0FBQztBQUFBLEVBQzNNO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQW9CTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxTQUFPLHNCQUFzQixJQUN6QixDQUFDLEVBQUUsV0FBVyxXQUFXLGdCQUFnQixDQUFDLElBQzFDO0FBQUEsSUFDQSxFQUFFLFdBQVcsV0FBVyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDNUQsRUFBRSxXQUFXLFdBQVcsZ0JBQWdCO0FBQUEsRUFDMUM7QUFDSjtBQVFBLFNBQVMsa0JBQWtCLE9BQThCO0FBQ3ZELFNBQU8sVUFBVSxPQUFPLGVBQWUsT0FBTyxLQUFLO0FBQ3JEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Decides whether the `dist/` folder the global setup is about to install
5
+ * predates the sources it was built from, so a run cannot silently test an old
6
+ * plugin. See {@link StaleBuildError} for why this is an error rather than a
7
+ * warning.
8
+ *
9
+ * **What counts as a source.** Everything under `<projectRoot>/src/` that is not
10
+ * a test file, plus `manifest.json` and `styles.css` at the root when they exist.
11
+ * Test files are excluded because they are not build inputs — the bundler's entry
12
+ * graph starts at `src/main.ts` and never reaches a `*.test.ts` — and a guard
13
+ * that fires when editing a test, where rebuilding would change nothing, is a
14
+ * guard people learn to switch off. `package.json` is excluded for the same
15
+ * reason from the other side: it is edited for scripts and dependency ranges far
16
+ * more often than for anything that reaches the bundle, and the one field of it
17
+ * that ships is read back out of `manifest.json` anyway.
18
+ *
19
+ * **mtime, not content.** A `git switch` rewrites mtimes without changing
20
+ * content, so a branch switch can report a stale build against a `dist/` that
21
+ * would hash identically. That direction is deliberate: the remedy is a rebuild,
22
+ * which is what the reader wanted after switching branches anyway, and the
23
+ * alternative — hashing the entry graph — needs the bundler's own input list,
24
+ * which the harness does not have and cannot get from `main.js` in both the
25
+ * `dev` and `build` shapes.
26
+ */
27
+ import type { ObsidianTransportOptions } from './transport-options.mjs';
28
+ /**
29
+ * The environment variable that downgrades a stale-build failure to a warning
30
+ * for a single run.
31
+ *
32
+ * The {@link ObsidianTransportOptions.shouldFailOnStaleBuild} option cannot serve
33
+ * that case on its own: it lives in a tracked config file, so a one-off
34
+ * "test what is in `dist/` right now" run would need an edit and a revert — which
35
+ * is how a guard ends up switched off permanently by accident.
36
+ */
37
+ export declare const ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME = "OBSIDIAN_TEST_ALLOW_STALE_BUILD";
38
+ /**
39
+ * Parameters for {@link checkIsBuildStale}.
40
+ */
41
+ export interface CheckIsBuildStaleParams {
42
+ /**
43
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
44
+ */
45
+ readonly buildModifiedAtInMilliseconds: number;
46
+ /**
47
+ The newest source found, or `undefined` when the project has none to compare against.
48
+ */
49
+ readonly newestSource: SourceModification | undefined;
50
+ }
51
+ /**
52
+ * One source file and when it last changed.
53
+ */
54
+ export interface SourceModification {
55
+ /**
56
+ When the file was last written, in epoch milliseconds.
57
+ */
58
+ readonly modifiedAtInMilliseconds: number;
59
+ /**
60
+ The file's path relative to the project root, with `/` separators.
61
+ */
62
+ readonly path: string;
63
+ }
64
+ /**
65
+ * Decides whether a build predates its sources.
66
+ *
67
+ * `false` when there is no source to compare against: a project whose sources do
68
+ * not live under `src/` is not a project whose build is provably old, and
69
+ * claiming staleness there would fail every run of it.
70
+ *
71
+ * Strictly newer, so a source written in the same millisecond as the build — or
72
+ * by the build itself — is not stale.
73
+ *
74
+ * @param params - The build's modification time and the newest source.
75
+ * @returns `true` when the newest source is newer than the build.
76
+ */
77
+ export declare function checkIsBuildStale(params: CheckIsBuildStaleParams): boolean;
78
+ /**
79
+ * Whether a file name is one the build reads.
80
+ *
81
+ * @param fileName - The bare file name, without a directory.
82
+ * @returns `true` unless it is a test file.
83
+ */
84
+ export declare function checkIsSourceFileName(fileName: string): boolean;
85
+ /**
86
+ * Finds the most recently modified source of the plugin at `projectRoot`.
87
+ *
88
+ * Walks `src/` recursively and adds the root-level files the build also reads.
89
+ * Anything unreadable is skipped rather than thrown: a file that vanished
90
+ * mid-walk cannot make a build stale, and this check must never be the reason a
91
+ * run fails.
92
+ *
93
+ * @param projectRoot - The absolute path to the project root.
94
+ * @returns The newest source, or `undefined` when the project has none.
95
+ */
96
+ export declare function findNewestSourceModification(projectRoot: string): Promise<SourceModification | undefined>;
97
+ /**
98
+ * Resolves whether a stale build fails the run, applying the default when
99
+ * neither escape hatch is used.
100
+ *
101
+ * The environment variable wins over the option, because it is the narrower
102
+ * statement: a project that sets the option has decided permanently, while the
103
+ * variable is set for one command line.
104
+ *
105
+ * @param options - The transport options.
106
+ * @returns `true` when a stale build should throw.
107
+ */
108
+ export declare function willFailOnStaleBuild(options: ObsidianTransportOptions | undefined): boolean;
@@ -0,0 +1,84 @@
1
+ import {
2
+ readdir,
3
+ stat
4
+ } from "node:fs/promises";
5
+ import {
6
+ join,
7
+ relative,
8
+ sep
9
+ } from "node:path";
10
+ import process from "node:process";
11
+ const ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME = "OBSIDIAN_TEST_ALLOW_STALE_BUILD";
12
+ const ROOT_SOURCE_FILE_NAMES = ["manifest.json", "styles.css"];
13
+ const SOURCE_DIRECTORY_NAME = "src";
14
+ const EXCLUDED_DIRECTORY_NAMES = /* @__PURE__ */ new Set([".git", "node_modules"]);
15
+ function checkIsBuildStale(params) {
16
+ const { buildModifiedAtInMilliseconds, newestSource } = params;
17
+ return newestSource ? newestSource.modifiedAtInMilliseconds > buildModifiedAtInMilliseconds : false;
18
+ }
19
+ function checkIsSourceFileName(fileName) {
20
+ return !fileName.includes(".test.");
21
+ }
22
+ async function findNewestSourceModification(projectRoot) {
23
+ const paths = [
24
+ ...await listSourcePaths(join(projectRoot, SOURCE_DIRECTORY_NAME)),
25
+ ...ROOT_SOURCE_FILE_NAMES.map((fileName) => join(projectRoot, fileName))
26
+ ];
27
+ let newestSource;
28
+ for (const path of paths) {
29
+ const modifiedAtInMilliseconds = await readModifiedAtInMilliseconds(path);
30
+ if (modifiedAtInMilliseconds === void 0 || newestSource && newestSource.modifiedAtInMilliseconds >= modifiedAtInMilliseconds) {
31
+ continue;
32
+ }
33
+ newestSource = {
34
+ modifiedAtInMilliseconds,
35
+ path: relative(projectRoot, path).split(sep).join("/")
36
+ };
37
+ }
38
+ return newestSource;
39
+ }
40
+ function willFailOnStaleBuild(options) {
41
+ return checkIsStaleBuildAllowedByEnvironment() ? false : options?.shouldFailOnStaleBuild ?? true;
42
+ }
43
+ function checkIsStaleBuildAllowedByEnvironment() {
44
+ const value = process.env[ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME]?.trim().toLowerCase() ?? "";
45
+ return value !== "" && value !== "0" && value !== "false";
46
+ }
47
+ async function listSourcePaths(directory) {
48
+ let entries;
49
+ try {
50
+ entries = await readdir(directory, { withFileTypes: true });
51
+ } catch {
52
+ return [];
53
+ }
54
+ const paths = [];
55
+ for (const entry of entries) {
56
+ const path = join(directory, entry.name);
57
+ if (entry.isDirectory()) {
58
+ if (!EXCLUDED_DIRECTORY_NAMES.has(entry.name)) {
59
+ paths.push(...await listSourcePaths(path));
60
+ }
61
+ continue;
62
+ }
63
+ if (checkIsSourceFileName(entry.name)) {
64
+ paths.push(path);
65
+ }
66
+ }
67
+ return paths;
68
+ }
69
+ async function readModifiedAtInMilliseconds(path) {
70
+ try {
71
+ const stats = await stat(path);
72
+ return stats.mtimeMs;
73
+ } catch {
74
+ return void 0;
75
+ }
76
+ }
77
+ export {
78
+ ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME,
79
+ checkIsBuildStale,
80
+ checkIsSourceFileName,
81
+ findNewestSourceModification,
82
+ willFailOnStaleBuild
83
+ };
84
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YWxlLWJ1aWxkLWRldGVjdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlY2lkZXMgd2hldGhlciB0aGUgYGRpc3QvYCBmb2xkZXIgdGhlIGdsb2JhbCBzZXR1cCBpcyBhYm91dCB0byBpbnN0YWxsXG4gKiBwcmVkYXRlcyB0aGUgc291cmNlcyBpdCB3YXMgYnVpbHQgZnJvbSwgc28gYSBydW4gY2Fubm90IHNpbGVudGx5IHRlc3QgYW4gb2xkXG4gKiBwbHVnaW4uIFNlZSB7QGxpbmsgU3RhbGVCdWlsZEVycm9yfSBmb3Igd2h5IHRoaXMgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYVxuICogd2FybmluZy5cbiAqXG4gKiAqKldoYXQgY291bnRzIGFzIGEgc291cmNlLioqIEV2ZXJ5dGhpbmcgdW5kZXIgYDxwcm9qZWN0Um9vdD4vc3JjL2AgdGhhdCBpcyBub3RcbiAqIGEgdGVzdCBmaWxlLCBwbHVzIGBtYW5pZmVzdC5qc29uYCBhbmQgYHN0eWxlcy5jc3NgIGF0IHRoZSByb290IHdoZW4gdGhleSBleGlzdC5cbiAqIFRlc3QgZmlsZXMgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgdGhleSBhcmUgbm90IGJ1aWxkIGlucHV0cyBcdTIwMTQgdGhlIGJ1bmRsZXIncyBlbnRyeVxuICogZ3JhcGggc3RhcnRzIGF0IGBzcmMvbWFpbi50c2AgYW5kIG5ldmVyIHJlYWNoZXMgYSBgKi50ZXN0LnRzYCBcdTIwMTQgYW5kIGEgZ3VhcmRcbiAqIHRoYXQgZmlyZXMgd2hlbiBlZGl0aW5nIGEgdGVzdCwgd2hlcmUgcmVidWlsZGluZyB3b3VsZCBjaGFuZ2Ugbm90aGluZywgaXMgYVxuICogZ3VhcmQgcGVvcGxlIGxlYXJuIHRvIHN3aXRjaCBvZmYuIGBwYWNrYWdlLmpzb25gIGlzIGV4Y2x1ZGVkIGZvciB0aGUgc2FtZVxuICogcmVhc29uIGZyb20gdGhlIG90aGVyIHNpZGU6IGl0IGlzIGVkaXRlZCBmb3Igc2NyaXB0cyBhbmQgZGVwZW5kZW5jeSByYW5nZXMgZmFyXG4gKiBtb3JlIG9mdGVuIHRoYW4gZm9yIGFueXRoaW5nIHRoYXQgcmVhY2hlcyB0aGUgYnVuZGxlLCBhbmQgdGhlIG9uZSBmaWVsZCBvZiBpdFxuICogdGhhdCBzaGlwcyBpcyByZWFkIGJhY2sgb3V0IG9mIGBtYW5pZmVzdC5qc29uYCBhbnl3YXkuXG4gKlxuICogKiptdGltZSwgbm90IGNvbnRlbnQuKiogQSBgZ2l0IHN3aXRjaGAgcmV3cml0ZXMgbXRpbWVzIHdpdGhvdXQgY2hhbmdpbmdcbiAqIGNvbnRlbnQsIHNvIGEgYnJhbmNoIHN3aXRjaCBjYW4gcmVwb3J0IGEgc3RhbGUgYnVpbGQgYWdhaW5zdCBhIGBkaXN0L2AgdGhhdFxuICogd291bGQgaGFzaCBpZGVudGljYWxseS4gVGhhdCBkaXJlY3Rpb24gaXMgZGVsaWJlcmF0ZTogdGhlIHJlbWVkeSBpcyBhIHJlYnVpbGQsXG4gKiB3aGljaCBpcyB3aGF0IHRoZSByZWFkZXIgd2FudGVkIGFmdGVyIHN3aXRjaGluZyBicmFuY2hlcyBhbnl3YXksIGFuZCB0aGVcbiAqIGFsdGVybmF0aXZlIFx1MjAxNCBoYXNoaW5nIHRoZSBlbnRyeSBncmFwaCBcdTIwMTQgbmVlZHMgdGhlIGJ1bmRsZXIncyBvd24gaW5wdXQgbGlzdCxcbiAqIHdoaWNoIHRoZSBoYXJuZXNzIGRvZXMgbm90IGhhdmUgYW5kIGNhbm5vdCBnZXQgZnJvbSBgbWFpbi5qc2AgaW4gYm90aCB0aGVcbiAqIGBkZXZgIGFuZCBgYnVpbGRgIHNoYXBlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpcmVudCB9IGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQge1xuICByZWFkZGlyLFxuICBzdGF0XG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHNlcFxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgZG93bmdyYWRlcyBhIHN0YWxlLWJ1aWxkIGZhaWx1cmUgdG8gYSB3YXJuaW5nXG4gKiBmb3IgYSBzaW5nbGUgcnVuLlxuICpcbiAqIFRoZSB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zLnNob3VsZEZhaWxPblN0YWxlQnVpbGR9IG9wdGlvbiBjYW5ub3Qgc2VydmVcbiAqIHRoYXQgY2FzZSBvbiBpdHMgb3duOiBpdCBsaXZlcyBpbiBhIHRyYWNrZWQgY29uZmlnIGZpbGUsIHNvIGEgb25lLW9mZlxuICogXCJ0ZXN0IHdoYXQgaXMgaW4gYGRpc3QvYCByaWdodCBub3dcIiBydW4gd291bGQgbmVlZCBhbiBlZGl0IGFuZCBhIHJldmVydCBcdTIwMTQgd2hpY2hcbiAqIGlzIGhvdyBhIGd1YXJkIGVuZHMgdXAgc3dpdGNoZWQgb2ZmIHBlcm1hbmVudGx5IGJ5IGFjY2lkZW50LlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dfU1RBTEVfQlVJTERfRU5WSVJPTk1FTlRfVkFSSUFCTEVfTkFNRSA9ICdPQlNJRElBTl9URVNUX0FMTE9XX1NUQUxFX0JVSUxEJztcblxuLyoqXG4gKiBSb290LWxldmVsIGZpbGVzIHRoZSBwbHVnaW4gYnVpbGQgcmVhZHMgYmVzaWRlcyBgc3JjL2AuXG4gKi9cbmNvbnN0IFJPT1RfU09VUkNFX0ZJTEVfTkFNRVMgPSBbJ21hbmlmZXN0Lmpzb24nLCAnc3R5bGVzLmNzcyddO1xuXG4vKipcbiAqIFRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgcGx1Z2luJ3Mgc291cmNlcywgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuY29uc3QgU09VUkNFX0RJUkVDVE9SWV9OQU1FID0gJ3NyYyc7XG5cbi8qKlxuICogRGlyZWN0b3J5IG5hbWVzIG5ldmVyIGRlc2NlbmRlZCBpbnRvIHdoaWxlIGxvb2tpbmcgZm9yIHNvdXJjZXMuIE5laXRoZXJcbiAqIGJlbG9uZ3MgdG8gYSBwbHVnaW4ncyBvd24gYHNyYy9gLCBidXQgYm90aCB0dXJuIHVwIGluIHJlcG9zIHRoYXQgdmVuZG9yIG9yXG4gKiBnZW5lcmF0ZSBpbnRvIGl0LCBhbmQgZWl0aGVyIHdvdWxkIG1ha2UgdGhlIHdhbGsgYXJiaXRyYXJpbHkgZXhwZW5zaXZlLlxuICovXG5jb25zdCBFWENMVURFRF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsnLmdpdCcsICdub2RlX21vZHVsZXMnXSk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSXNCdWlsZFN0YWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0lzQnVpbGRTdGFsZVBhcmFtcyB7XG4gIC8qKlxuICBXaGVuIGBtYWluLmpzYCBpbiB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyIHdhcyBsYXN0IHdyaXR0ZW4sIGluIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBuZXdlc3Qgc291cmNlIGZvdW5kLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IG5ld2VzdFNvdXJjZTogU291cmNlTW9kaWZpY2F0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9uZSBzb3VyY2UgZmlsZSBhbmQgd2hlbiBpdCBsYXN0IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlTW9kaWZpY2F0aW9uIHtcbiAgLyoqXG4gIFdoZW4gdGhlIGZpbGUgd2FzIGxhc3Qgd3JpdHRlbiwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBmaWxlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LCB3aXRoIGAvYCBzZXBhcmF0b3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciBhIGJ1aWxkIHByZWRhdGVzIGl0cyBzb3VyY2VzLlxuICpcbiAqIGBmYWxzZWAgd2hlbiB0aGVyZSBpcyBubyBzb3VyY2UgdG8gY29tcGFyZSBhZ2FpbnN0OiBhIHByb2plY3Qgd2hvc2Ugc291cmNlcyBkb1xuICogbm90IGxpdmUgdW5kZXIgYHNyYy9gIGlzIG5vdCBhIHByb2plY3Qgd2hvc2UgYnVpbGQgaXMgcHJvdmFibHkgb2xkLCBhbmRcbiAqIGNsYWltaW5nIHN0YWxlbmVzcyB0aGVyZSB3b3VsZCBmYWlsIGV2ZXJ5IHJ1biBvZiBpdC5cbiAqXG4gKiBTdHJpY3RseSBuZXdlciwgc28gYSBzb3VyY2Ugd3JpdHRlbiBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCBhcyB0aGUgYnVpbGQgXHUyMDE0IG9yXG4gKiBieSB0aGUgYnVpbGQgaXRzZWxmIFx1MjAxNCBpcyBub3Qgc3RhbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBidWlsZCdzIG1vZGlmaWNhdGlvbiB0aW1lIGFuZCB0aGUgbmV3ZXN0IHNvdXJjZS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBuZXdlc3Qgc291cmNlIGlzIG5ld2VyIHRoYW4gdGhlIGJ1aWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0J1aWxkU3RhbGUocGFyYW1zOiBDaGVja0lzQnVpbGRTdGFsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzLCBuZXdlc3RTb3VyY2UgfSA9IHBhcmFtcztcbiAgcmV0dXJuIG5ld2VzdFNvdXJjZSA/IG5ld2VzdFNvdXJjZS5tb2RpZmllZEF0SW5NaWxsaXNlY29uZHMgPiBidWlsZE1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA6IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmaWxlIG5hbWUgaXMgb25lIHRoZSBidWlsZCByZWFkcy5cbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgYmFyZSBmaWxlIG5hbWUsIHdpdGhvdXQgYSBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgdW5sZXNzIGl0IGlzIGEgdGVzdCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1NvdXJjZUZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFmaWxlTmFtZS5pbmNsdWRlcygnLnRlc3QuJyk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG1vc3QgcmVjZW50bHkgbW9kaWZpZWQgc291cmNlIG9mIHRoZSBwbHVnaW4gYXQgYHByb2plY3RSb290YC5cbiAqXG4gKiBXYWxrcyBgc3JjL2AgcmVjdXJzaXZlbHkgYW5kIGFkZHMgdGhlIHJvb3QtbGV2ZWwgZmlsZXMgdGhlIGJ1aWxkIGFsc28gcmVhZHMuXG4gKiBBbnl0aGluZyB1bnJlYWRhYmxlIGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gdGhyb3duOiBhIGZpbGUgdGhhdCB2YW5pc2hlZFxuICogbWlkLXdhbGsgY2Fubm90IG1ha2UgYSBidWlsZCBzdGFsZSwgYW5kIHRoaXMgY2hlY2sgbXVzdCBuZXZlciBiZSB0aGUgcmVhc29uIGFcbiAqIHJ1biBmYWlscy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIG5ld2VzdCBzb3VyY2UsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kTmV3ZXN0U291cmNlTW9kaWZpY2F0aW9uKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZU1vZGlmaWNhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYXRocyA9IFtcbiAgICAuLi5hd2FpdCBsaXN0U291cmNlUGF0aHMoam9pbihwcm9qZWN0Um9vdCwgU09VUkNFX0RJUkVDVE9SWV9OQU1FKSksXG4gICAgLi4uUk9PVF9TT1VSQ0VfRklMRV9OQU1FUy5tYXAoKGZpbGVOYW1lKSA9PiBqb2luKHByb2plY3RSb290LCBmaWxlTmFtZSkpXG4gIF07XG5cbiAgbGV0IG5ld2VzdFNvdXJjZTogU291cmNlTW9kaWZpY2F0aW9uIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBjb25zdCBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHMgPSBhd2FpdCByZWFkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzKHBhdGgpO1xuICAgIGlmICgobW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQpIHx8IChuZXdlc3RTb3VyY2UgJiYgbmV3ZXN0U291cmNlLm1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA+PSBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdlc3RTb3VyY2UgPSB7XG4gICAgICBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHMsXG4gICAgICBwYXRoOiByZWxhdGl2ZShwcm9qZWN0Um9vdCwgcGF0aCkuc3BsaXQoc2VwKS5qb2luKCcvJylcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5ld2VzdFNvdXJjZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aGV0aGVyIGEgc3RhbGUgYnVpbGQgZmFpbHMgdGhlIHJ1biwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlblxuICogbmVpdGhlciBlc2NhcGUgaGF0Y2ggaXMgdXNlZC5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lucyBvdmVyIHRoZSBvcHRpb24sIGJlY2F1c2UgaXQgaXMgdGhlIG5hcnJvd2VyXG4gKiBzdGF0ZW1lbnQ6IGEgcHJvamVjdCB0aGF0IHNldHMgdGhlIG9wdGlvbiBoYXMgZGVjaWRlZCBwZXJtYW5lbnRseSwgd2hpbGUgdGhlXG4gKiB2YXJpYWJsZSBpcyBzZXQgZm9yIG9uZSBjb21tYW5kIGxpbmUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBhIHN0YWxlIGJ1aWxkIHNob3VsZCB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpbGxGYWlsT25TdGFsZUJ1aWxkKG9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJc1N0YWxlQnVpbGRBbGxvd2VkQnlFbnZpcm9ubWVudCgpID8gZmFsc2UgOiBvcHRpb25zPy5zaG91bGRGYWlsT25TdGFsZUJ1aWxkID8/IHRydWU7XG59XG5cbi8qKlxuICogV2hldGhlciB7QGxpbmsgQUxMT1dfU1RBTEVfQlVJTERfRU5WSVJPTk1FTlRfVkFSSUFCTEVfTkFNRX0gaXMgc2V0IHRvIHNvbWV0aGluZ1xuICogbWVhbmluZyBcInllc1wiLlxuICpcbiAqIEFuIGVtcHR5IHZhbHVlIGFuZCBhIGxpdGVyYWwgYDBgIC8gYGZhbHNlYCBjb3VudCBhcyB1bnNldCwgc28gYSBgLmVudmAgbGluZVxuICogbGVmdCBiZWhpbmQgYXMgYE9CU0lESUFOX1RFU1RfQUxMT1dfU1RBTEVfQlVJTEQ9MGAgZG9lcyBub3Qgc2lsZW50bHkga2VlcCB0aGVcbiAqIGd1YXJkIG9mZi5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgdmFyaWFibGUgYXNrcyBmb3IgdGhlIGd1YXJkIHRvIGJlIGRvd25ncmFkZWQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrSXNTdGFsZUJ1aWxkQWxsb3dlZEJ5RW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbQUxMT1dfU1RBTEVfQlVJTERfRU5WSVJPTk1FTlRfVkFSSUFCTEVfTkFNRV0/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID8/ICcnO1xuICByZXR1cm4gdmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSAnMCcgJiYgdmFsdWUgIT09ICdmYWxzZSc7XG59XG5cbi8qKlxuICogTGlzdHMgZXZlcnkgc291cmNlIGZpbGUgdW5kZXIgYSBkaXJlY3RvcnksIHJlY3Vyc2l2ZWx5LlxuICpcbiAqIEEgbWlzc2luZyBvciB1bnJlYWRhYmxlIGRpcmVjdG9yeSB5aWVsZHMgbm90aGluZyBcdTIwMTQgYSBwcm9qZWN0IHdob3NlIHNvdXJjZXMgYXJlXG4gKiBlbHNld2hlcmUgaXMgbm90IGFuIGVycm9yIGhlcmUuXG4gKlxuICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHdhbGsuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aHMgb2YgdGhlIHNvdXJjZSBmaWxlcyBmb3VuZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFNvdXJjZVBhdGhzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZW50cmllczogRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAoIUVYQ0xVREVEX0RJUkVDVE9SWV9OQU1FUy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgcGF0aHMucHVzaCguLi5hd2FpdCBsaXN0U291cmNlUGF0aHMocGF0aCkpO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1NvdXJjZUZpbGVOYW1lKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRocztcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gc3RhdC5cbiAqIEByZXR1cm5zIFRoZSBlcG9jaCBtaWxsaXNlY29uZHMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyBvciB1bnJlYWRhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5tdGltZU1zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUE2QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLGFBQWE7QUFhYixNQUFNLDhDQUE4QztBQUszRCxNQUFNLHlCQUF5QixDQUFDLGlCQUFpQixZQUFZO0FBSzdELE1BQU0sd0JBQXdCO0FBTzlCLE1BQU0sMkJBQTJCLG9CQUFJLElBQUksQ0FBQyxRQUFRLGNBQWMsQ0FBQztBQTZDMUQsU0FBUyxrQkFBa0IsUUFBMEM7QUFDMUUsUUFBTSxFQUFFLCtCQUErQixhQUFhLElBQUk7QUFDeEQsU0FBTyxlQUFlLGFBQWEsMkJBQTJCLGdDQUFnQztBQUNoRztBQVFPLFNBQVMsc0JBQXNCLFVBQTJCO0FBQy9ELFNBQU8sQ0FBQyxTQUFTLFNBQVMsUUFBUTtBQUNwQztBQWFBLGVBQXNCLDZCQUE2QixhQUE4RDtBQUMvRyxRQUFNLFFBQVE7QUFBQSxJQUNaLEdBQUcsTUFBTSxnQkFBZ0IsS0FBSyxhQUFhLHFCQUFxQixDQUFDO0FBQUEsSUFDakUsR0FBRyx1QkFBdUIsSUFBSSxDQUFDLGFBQWEsS0FBSyxhQUFhLFFBQVEsQ0FBQztBQUFBLEVBQ3pFO0FBRUEsTUFBSTtBQUNKLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFVBQU0sMkJBQTJCLE1BQU0sNkJBQTZCLElBQUk7QUFDeEUsUUFBSyw2QkFBNkIsVUFBZSxnQkFBZ0IsYUFBYSw0QkFBNEIsMEJBQTJCO0FBQ25JO0FBQUEsSUFDRjtBQUVBLG1CQUFlO0FBQUEsTUFDYjtBQUFBLE1BQ0EsTUFBTSxTQUFTLGFBQWEsSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLEtBQUssR0FBRztBQUFBLElBQ3ZEO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQWFPLFNBQVMscUJBQXFCLFNBQXdEO0FBQzNGLFNBQU8sc0NBQXNDLElBQUksUUFBUSxTQUFTLDBCQUEwQjtBQUM5RjtBQVlBLFNBQVMsd0NBQWlEO0FBQ3hELFFBQU0sUUFBUSxRQUFRLElBQUksMkNBQTJDLEdBQUcsS0FBSyxFQUFFLFlBQVksS0FBSztBQUNoRyxTQUFPLFVBQVUsTUFBTSxVQUFVLE9BQU8sVUFBVTtBQUNwRDtBQVdBLGVBQWUsZ0JBQWdCLFdBQXNDO0FBQ25FLE1BQUk7QUFDSixNQUFJO0FBQ0YsY0FBVSxNQUFNLFFBQVEsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQUEsRUFDNUQsUUFBUTtBQUNOLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFFBQWtCLENBQUM7QUFDekIsYUFBVyxTQUFTLFNBQVM7QUFDM0IsVUFBTSxPQUFPLEtBQUssV0FBVyxNQUFNLElBQUk7QUFDdkMsUUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixVQUFJLENBQUMseUJBQXlCLElBQUksTUFBTSxJQUFJLEdBQUc7QUFDN0MsY0FBTSxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsSUFBSSxDQUFDO0FBQUEsTUFDM0M7QUFFQTtBQUFBLElBQ0Y7QUFFQSxRQUFJLHNCQUFzQixNQUFNLElBQUksR0FBRztBQUNyQyxZQUFNLEtBQUssSUFBSTtBQUFBLElBQ2pCO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVFBLGVBQWUsNkJBQTZCLE1BQTJDO0FBQ3JGLE1BQUk7QUFDRixVQUFNLFFBQVEsTUFBTSxLQUFLLElBQUk7QUFDN0IsV0FBTyxNQUFNO0FBQUEsRUFDZixRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when the `dist/` the harness is about to install is
5
+ * **older than the sources it was built from** — the plugin in the vault is not
6
+ * the plugin in the working tree.
7
+ *
8
+ * The failure it prevents has two directions and the cheap one is not the reason
9
+ * this exists. A suite that FAILS against a stale build costs one confusing run:
10
+ * the symptom is whatever the missing code would have provided, so it reads as a
11
+ * defect in the code under test (observed 2026-09-19: a `waitUntil timed out: the
12
+ * enabled event to arrive` against a build five hours old, with the plugin
13
+ * loading and registering perfectly — it simply had no component to publish the
14
+ * event). A suite that PASSES against a stale build costs nothing visible and
15
+ * proves nothing: an integration suite exists to be the one test that can fail
16
+ * for the right reason, and a stale artifact silently converts it into a test of
17
+ * last week's code. Nothing at all reports that direction, which is why the
18
+ * verdict is an error rather than a warning.
19
+ *
20
+ * Exported so a consumer can `instanceof`-match this specific setup failure —
21
+ * the same reason `ConfigDirectoryFallbackError` is.
22
+ */
23
+ /**
24
+ * Parameters for the {@link StaleBuildError} constructor.
25
+ */
26
+ export interface StaleBuildErrorConstructorParams {
27
+ /**
28
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
29
+ */
30
+ readonly buildModifiedAtInMilliseconds: number;
31
+ /**
32
+ Absolute path to the dist folder the run was about to install from.
33
+ */
34
+ readonly distPath: string;
35
+ /**
36
+ When the newest source was last written, in epoch milliseconds.
37
+ */
38
+ readonly sourceModifiedAtInMilliseconds: number;
39
+ /**
40
+ Path to the newest source found, relative to the project root.
41
+ */
42
+ readonly sourcePath: string;
43
+ }
44
+ /**
45
+ * Thrown by the global setup when the built plugin predates its sources.
46
+ *
47
+ * Carries both timestamps and the newest source's path, so the message names the
48
+ * file that makes the build stale rather than leaving the reader to find it.
49
+ */
50
+ export declare class StaleBuildError extends Error {
51
+ /**
52
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
53
+ */
54
+ readonly buildModifiedAtInMilliseconds: number;
55
+ /**
56
+ Which build is stale and what outdated it, with **no remedy attached** — the opening of
57
+ {@link StaleBuildError.message}, and what the warning path logs when the failure is switched off. The two
58
+ readers need different halves: somebody whose run just FAILED needs the remedy, while somebody who
59
+ deliberately escaped the failure has already applied it, and repeating *"set `shouldFailOnStaleBuild:
60
+ false`"* at a reader who just did exactly that is the noise that teaches people to skim the line.
61
+ */
62
+ readonly description: string;
63
+ /**
64
+ Absolute path to the dist folder the run was about to install from.
65
+ */
66
+ readonly distPath: string;
67
+ /**
68
+ When the newest source was last written, in epoch milliseconds.
69
+ */
70
+ readonly sourceModifiedAtInMilliseconds: number;
71
+ /**
72
+ Path to the newest source found, relative to the project root.
73
+ */
74
+ readonly sourcePath: string;
75
+ /**
76
+ * Creates the error from the dist folder and the newest source that outdates it.
77
+ *
78
+ * @param params - The dist path, both modification times, and the newest source's path.
79
+ */
80
+ constructor(params: StaleBuildErrorConstructorParams);
81
+ }
@@ -0,0 +1,50 @@
1
+ const MINUTE_IN_MILLISECONDS = 6e4;
2
+ class StaleBuildError extends Error {
3
+ /**
4
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
5
+ */
6
+ buildModifiedAtInMilliseconds;
7
+ /**
8
+ Which build is stale and what outdated it, with **no remedy attached** — the opening of
9
+ {@link StaleBuildError.message}, and what the warning path logs when the failure is switched off. The two
10
+ readers need different halves: somebody whose run just FAILED needs the remedy, while somebody who
11
+ deliberately escaped the failure has already applied it, and repeating *"set `shouldFailOnStaleBuild:
12
+ false`"* at a reader who just did exactly that is the noise that teaches people to skim the line.
13
+ */
14
+ description;
15
+ /**
16
+ Absolute path to the dist folder the run was about to install from.
17
+ */
18
+ distPath;
19
+ /**
20
+ When the newest source was last written, in epoch milliseconds.
21
+ */
22
+ sourceModifiedAtInMilliseconds;
23
+ /**
24
+ Path to the newest source found, relative to the project root.
25
+ */
26
+ sourcePath;
27
+ /**
28
+ * Creates the error from the dist folder and the newest source that outdates it.
29
+ *
30
+ * @param params - The dist path, both modification times, and the newest source's path.
31
+ */
32
+ constructor(params) {
33
+ const { buildModifiedAtInMilliseconds, distPath, sourceModifiedAtInMilliseconds, sourcePath } = params;
34
+ const ageInMinutes = Math.round((sourceModifiedAtInMilliseconds - buildModifiedAtInMilliseconds) / MINUTE_IN_MILLISECONDS);
35
+ const description = `The build is stale: ${distPath}/main.js was written at ${new Date(buildModifiedAtInMilliseconds).toISOString()}, but ${sourcePath} changed at ${new Date(sourceModifiedAtInMilliseconds).toISOString()} \u2014 ${String(ageInMinutes)} minute(s) later. The vault would be given a plugin built before that change, so this run tests code that is not in the working tree.`;
36
+ super(
37
+ `${description} Run \`npm run build\` (or \`npm run dev\`) and try again. To test the built artifact deliberately, set \`shouldFailOnStaleBuild: false\` in the transport options, or \`OBSIDIAN_TEST_ALLOW_STALE_BUILD=1\` for a single run.`
38
+ );
39
+ this.name = "StaleBuildError";
40
+ this.description = description;
41
+ this.buildModifiedAtInMilliseconds = buildModifiedAtInMilliseconds;
42
+ this.distPath = distPath;
43
+ this.sourceModifiedAtInMilliseconds = sourceModifiedAtInMilliseconds;
44
+ this.sourcePath = sourcePath;
45
+ }
46
+ }
47
+ export {
48
+ StaleBuildError
49
+ };
50
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YWxlLWJ1aWxkLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRpc3RpbmN0IGVycm9yIHRocm93biB3aGVuIHRoZSBgZGlzdC9gIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGluc3RhbGwgaXNcbiAqICoqb2xkZXIgdGhhbiB0aGUgc291cmNlcyBpdCB3YXMgYnVpbHQgZnJvbSoqIFx1MjAxNCB0aGUgcGx1Z2luIGluIHRoZSB2YXVsdCBpcyBub3RcbiAqIHRoZSBwbHVnaW4gaW4gdGhlIHdvcmtpbmcgdHJlZS5cbiAqXG4gKiBUaGUgZmFpbHVyZSBpdCBwcmV2ZW50cyBoYXMgdHdvIGRpcmVjdGlvbnMgYW5kIHRoZSBjaGVhcCBvbmUgaXMgbm90IHRoZSByZWFzb25cbiAqIHRoaXMgZXhpc3RzLiBBIHN1aXRlIHRoYXQgRkFJTFMgYWdhaW5zdCBhIHN0YWxlIGJ1aWxkIGNvc3RzIG9uZSBjb25mdXNpbmcgcnVuOlxuICogdGhlIHN5bXB0b20gaXMgd2hhdGV2ZXIgdGhlIG1pc3NpbmcgY29kZSB3b3VsZCBoYXZlIHByb3ZpZGVkLCBzbyBpdCByZWFkcyBhcyBhXG4gKiBkZWZlY3QgaW4gdGhlIGNvZGUgdW5kZXIgdGVzdCAob2JzZXJ2ZWQgMjAyNi0wOS0xOTogYSBgd2FpdFVudGlsIHRpbWVkIG91dDogdGhlXG4gKiBlbmFibGVkIGV2ZW50IHRvIGFycml2ZWAgYWdhaW5zdCBhIGJ1aWxkIGZpdmUgaG91cnMgb2xkLCB3aXRoIHRoZSBwbHVnaW5cbiAqIGxvYWRpbmcgYW5kIHJlZ2lzdGVyaW5nIHBlcmZlY3RseSBcdTIwMTQgaXQgc2ltcGx5IGhhZCBubyBjb21wb25lbnQgdG8gcHVibGlzaCB0aGVcbiAqIGV2ZW50KS4gQSBzdWl0ZSB0aGF0IFBBU1NFUyBhZ2FpbnN0IGEgc3RhbGUgYnVpbGQgY29zdHMgbm90aGluZyB2aXNpYmxlIGFuZFxuICogcHJvdmVzIG5vdGhpbmc6IGFuIGludGVncmF0aW9uIHN1aXRlIGV4aXN0cyB0byBiZSB0aGUgb25lIHRlc3QgdGhhdCBjYW4gZmFpbFxuICogZm9yIHRoZSByaWdodCByZWFzb24sIGFuZCBhIHN0YWxlIGFydGlmYWN0IHNpbGVudGx5IGNvbnZlcnRzIGl0IGludG8gYSB0ZXN0IG9mXG4gKiBsYXN0IHdlZWsncyBjb2RlLiBOb3RoaW5nIGF0IGFsbCByZXBvcnRzIHRoYXQgZGlyZWN0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gKiB2ZXJkaWN0IGlzIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgd2FybmluZy5cbiAqXG4gKiBFeHBvcnRlZCBzbyBhIGNvbnN1bWVyIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggdGhpcyBzcGVjaWZpYyBzZXR1cCBmYWlsdXJlIFx1MjAxNFxuICogdGhlIHNhbWUgcmVhc29uIGBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yYCBpcy5cbiAqL1xuXG5jb25zdCBNSU5VVEVfSU5fTUlMTElTRUNPTkRTID0gNjBfMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgU3RhbGVCdWlsZEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFsZUJ1aWxkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBXaGVuIGBtYWluLmpzYCBpbiB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyIHdhcyBsYXN0IHdyaXR0ZW4sIGluIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIGRpc3QgZm9sZGVyIHRoZSBydW4gd2FzIGFib3V0IHRvIGluc3RhbGwgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZW4gdGhlIG5ld2VzdCBzb3VyY2Ugd2FzIGxhc3Qgd3JpdHRlbiwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFBhdGggdG8gdGhlIG5ld2VzdCBzb3VyY2UgZm91bmQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSBnbG9iYWwgc2V0dXAgd2hlbiB0aGUgYnVpbHQgcGx1Z2luIHByZWRhdGVzIGl0cyBzb3VyY2VzLlxuICpcbiAqIENhcnJpZXMgYm90aCB0aW1lc3RhbXBzIGFuZCB0aGUgbmV3ZXN0IHNvdXJjZSdzIHBhdGgsIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZVxuICogZmlsZSB0aGF0IG1ha2VzIHRoZSBidWlsZCBzdGFsZSByYXRoZXIgdGhhbiBsZWF2aW5nIHRoZSByZWFkZXIgdG8gZmluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWxlQnVpbGRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFdoZW4gYG1haW4uanNgIGluIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIgd2FzIGxhc3Qgd3JpdHRlbiwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoaWNoIGJ1aWxkIGlzIHN0YWxlIGFuZCB3aGF0IG91dGRhdGVkIGl0LCB3aXRoICoqbm8gcmVtZWR5IGF0dGFjaGVkKiogXHUyMDE0IHRoZSBvcGVuaW5nIG9mXG4gIHtAbGluayBTdGFsZUJ1aWxkRXJyb3IubWVzc2FnZX0sIGFuZCB3aGF0IHRoZSB3YXJuaW5nIHBhdGggbG9ncyB3aGVuIHRoZSBmYWlsdXJlIGlzIHN3aXRjaGVkIG9mZi4gVGhlIHR3b1xuICByZWFkZXJzIG5lZWQgZGlmZmVyZW50IGhhbHZlczogc29tZWJvZHkgd2hvc2UgcnVuIGp1c3QgRkFJTEVEIG5lZWRzIHRoZSByZW1lZHksIHdoaWxlIHNvbWVib2R5IHdob1xuICBkZWxpYmVyYXRlbHkgZXNjYXBlZCB0aGUgZmFpbHVyZSBoYXMgYWxyZWFkeSBhcHBsaWVkIGl0LCBhbmQgcmVwZWF0aW5nICpcInNldCBgc2hvdWxkRmFpbE9uU3RhbGVCdWlsZDpcbiAgZmFsc2VgXCIqIGF0IGEgcmVhZGVyIHdobyBqdXN0IGRpZCBleGFjdGx5IHRoYXQgaXMgdGhlIG5vaXNlIHRoYXQgdGVhY2hlcyBwZW9wbGUgdG8gc2tpbSB0aGUgbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkaXN0IGZvbGRlciB0aGUgcnVuIHdhcyBhYm91dCB0byBpbnN0YWxsIGZyb20uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlzdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgV2hlbiB0aGUgbmV3ZXN0IHNvdXJjZSB3YXMgbGFzdCB3cml0dGVuLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFBhdGggdG8gdGhlIG5ld2VzdCBzb3VyY2UgZm91bmQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBmcm9tIHRoZSBkaXN0IGZvbGRlciBhbmQgdGhlIG5ld2VzdCBzb3VyY2UgdGhhdCBvdXRkYXRlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkaXN0IHBhdGgsIGJvdGggbW9kaWZpY2F0aW9uIHRpbWVzLCBhbmQgdGhlIG5ld2VzdCBzb3VyY2UncyBwYXRoLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogU3RhbGVCdWlsZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB7IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzLCBkaXN0UGF0aCwgc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzLCBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgYWdlSW5NaW51dGVzID0gTWF0aC5yb3VuZCgoc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzIC0gYnVpbGRNb2RpZmllZEF0SW5NaWxsaXNlY29uZHMpIC8gTUlOVVRFX0lOX01JTExJU0VDT05EUyk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBgVGhlIGJ1aWxkIGlzIHN0YWxlOiAke2Rpc3RQYXRofS9tYWluLmpzIHdhcyB3cml0dGVuIGF0ICR7bmV3IERhdGUoYnVpbGRNb2RpZmllZEF0SW5NaWxsaXNlY29uZHMpLnRvSVNPU3RyaW5nKCl9LCBgXG4gICAgICArIGBidXQgJHtzb3VyY2VQYXRofSBjaGFuZ2VkIGF0ICR7bmV3IERhdGUoc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzKS50b0lTT1N0cmluZygpfSBcdTIwMTQgJHtTdHJpbmcoYWdlSW5NaW51dGVzKX0gbWludXRlKHMpIGxhdGVyLiBgXG4gICAgICArICdUaGUgdmF1bHQgd291bGQgYmUgZ2l2ZW4gYSBwbHVnaW4gYnVpbHQgYmVmb3JlIHRoYXQgY2hhbmdlLCBzbyB0aGlzIHJ1biB0ZXN0cyBjb2RlIHRoYXQgaXMgbm90IGluIHRoZSB3b3JraW5nIHRyZWUuJztcbiAgICBzdXBlcihcbiAgICAgIGAke2Rlc2NyaXB0aW9ufSBgXG4gICAgICAgICsgJ1J1biBgbnBtIHJ1biBidWlsZGAgKG9yIGBucG0gcnVuIGRldmApIGFuZCB0cnkgYWdhaW4uICdcbiAgICAgICAgKyAnVG8gdGVzdCB0aGUgYnVpbHQgYXJ0aWZhY3QgZGVsaWJlcmF0ZWx5LCBzZXQgYHNob3VsZEZhaWxPblN0YWxlQnVpbGQ6IGZhbHNlYCBpbiB0aGUgdHJhbnNwb3J0IG9wdGlvbnMsICdcbiAgICAgICAgKyAnb3IgYE9CU0lESUFOX1RFU1RfQUxMT1dfU1RBTEVfQlVJTEQ9MWAgZm9yIGEgc2luZ2xlIHJ1bi4nXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RhbGVCdWlsZEVycm9yJztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5idWlsZE1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA9IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuZGlzdFBhdGggPSBkaXN0UGF0aDtcbiAgICB0aGlzLnNvdXJjZU1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA9IHNvdXJjZU1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUF1QkEsTUFBTSx5QkFBeUI7QUFpQ3hCLE1BQU0sd0JBQXdCLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULFlBQVksUUFBMEM7QUFDM0QsVUFBTSxFQUFFLCtCQUErQixVQUFVLGdDQUFnQyxXQUFXLElBQUk7QUFDaEcsVUFBTSxlQUFlLEtBQUssT0FBTyxpQ0FBaUMsaUNBQWlDLHNCQUFzQjtBQUN6SCxVQUFNLGNBQWMsdUJBQXVCLFFBQVEsMkJBQTJCLElBQUksS0FBSyw2QkFBNkIsRUFBRSxZQUFZLENBQUMsU0FDeEgsVUFBVSxlQUFlLElBQUksS0FBSyw4QkFBOEIsRUFBRSxZQUFZLENBQUMsV0FBTSxPQUFPLFlBQVksQ0FBQztBQUVwSDtBQUFBLE1BQ0UsR0FBRyxXQUFXO0FBQUEsSUFJaEI7QUFDQSxTQUFLLE9BQU87QUFDWixTQUFLLGNBQWM7QUFDbkIsU0FBSyxnQ0FBZ0M7QUFDckMsU0FBSyxXQUFXO0FBQ2hCLFNBQUssaUNBQWlDO0FBQ3RDLFNBQUssYUFBYTtBQUFBLEVBQ3BCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -11,10 +11,7 @@ function bypassStrictProxy(object) {
11
11
  if (!isObjectLike(object)) {
12
12
  return object;
13
13
  }
14
- if (!(STRICT_PROXY_TARGET_SYMBOL in object)) {
15
- return object;
16
- }
17
- return object[STRICT_PROXY_TARGET_SYMBOL];
14
+ return STRICT_PROXY_TARGET_SYMBOL in object ? object[STRICT_PROXY_TARGET_SYMBOL] : object;
18
15
  }
19
16
  function strictProxy(value, mockClass) {
20
17
  return wrapProxy(value, mockClass);
@@ -53,10 +50,7 @@ function wrapProxy(value, mockClass) {
53
50
  }
54
51
  if (mockPrototype && typeof property === "string" && property.endsWith("__") && property in mockPrototype) {
55
52
  const value_ = mockPrototype[property];
56
- if (typeof value_ === "function") {
57
- return value_.bind(receiver);
58
- }
59
- return value_;
53
+ return typeof value_ === "function" ? value_.bind(receiver) : value_;
60
54
  }
61
55
  if (typeof property === "symbol" || PASSTHROUGH_PROPS.has(property)) {
62
56
  return Reflect.get(target, property, receiver);
@@ -69,4 +63,4 @@ export {
69
63
  bypassStrictProxy,
70
64
  strictProxy
71
65
  };
72
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0cmljdC1wcm94eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFN0cmljdCBwcm94eSBmb3IgbW9jayBvYmplY3RzLlxuICpcbiAqIFdyYXBzIGFuIG9iamVjdCBpbiBhIGBQcm94eWAgdGhhdCB0aHJvd3MgYSBkZXNjcmlwdGl2ZSBlcnJvciB3aGVuIGFueVxuICogdW5tb2NrZWQgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgcmV0dXJuaW5nIGB1bmRlZmluZWRgLlxuICpcbiAqIC0gSWRlbXBvdGVudCAoZG91YmxlLXdyYXBwaW5nIGlzIGEgbm8tb3ApLlxuICogLSBQYXNzdGhyb3VnaCBmb3Igd2VsbC1rbm93biBwcm9wcyAoYHRoZW5gLCBgdG9KU09OYCwgYFN5bWJvbC5pdGVyYXRvcmAsIGV0Yy4pLlxuICogLSBDbGFzcy1uYW1lLWF3YXJlIGVycm9yIG1lc3NhZ2VzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gKiAtIFJlY3Vyc2l2ZSBwcm94eWluZyBvZiBuZXN0ZWQgcGxhaW4gb2JqZWN0cyAoZm9yIHBhcnRpYWwgbW9ja3Mgb25seSkuXG4gKlxuICogT3ZlcmxvYWRzOlxuICogMS4gYHN0cmljdFByb3h5KHZhbHVlLCBNb2NrQ2xhc3MpYCBcdTIwMTQgaW5mZXJzIGBUYCBmcm9tIGBNb2NrQ2xhc3MucHJvdG90eXBlYCxcbiAqICAgIG92ZXJsYXlzIGBfX2Atc3VmZml4ZWQgbWV0aG9kcyB2aWEgdGhlIHByb3h5LlxuICogMi4gYHN0cmljdFByb3h5KHZhbHVlOiBUKWAgXHUyMDE0IGluZmVycyBgVGAgZnJvbSB0aGUgYXJndW1lbnQuXG4gKiAzLiBgc3RyaWN0UHJveHk8VD4ocGFydGlhbClgIFx1MjAxNCB0ZXN0IG1vY2tpbmc6IHR5cGVkIHZpYSBgUGFydGlhbERlZXA8VD5gLlxuICogNC4gYHN0cmljdFByb3h5PFQ+KHZhbHVlKWAgXHUyMDE0IGV4cGxpY2l0IGBUYCwgdW5jaGVja2VkIHZhbHVlIChjcm9zcy10eXBlIGNhc3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUGFydGlhbERlZXAgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbmltcG9ydCB7IGVuc3VyZUdlbmVyaWNPYmplY3QgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbmNvbnN0IFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MID0gU3ltYm9sLmZvcignc3RyaWN0UHJveHlUYXJnZXQnKTtcblxuY29uc3QgUEFTU1RIUk9VR0hfUFJPUFMgPSBuZXcgU2V0PHN0cmluZyB8IHN5bWJvbD4oW1xuICBTeW1ib2wuaXRlcmF0b3IsXG4gIFN5bWJvbC50b1ByaW1pdGl2ZSxcbiAgU3ltYm9sLnRvU3RyaW5nVGFnLFxuICAndGhlbicsXG4gICd0b0pTT04nXG5dKTtcblxudHlwZSBNb2NrQ2xhc3NMaWtlPFQ+ID0gTW9ja0NsYXNzUHJvdG90eXBlUmVmPFQ+ICYgTW9ja0NsYXNzUmVmO1xuXG5pbnRlcmZhY2UgTW9ja0NsYXNzUHJvdG90eXBlUmVmPFQ+IHtcbiAgcHJvdG90eXBlOiBUO1xufVxuXG5pbnRlcmZhY2UgTW9ja0NsYXNzUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm90b3R5cGU6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGEgc3RyaWN0LXByb3hpZWQgb2JqZWN0LCByZXR1cm5pbmcgdGhlIHVuZGVybHlpbmcgdGFyZ2V0LlxuICpcbiAqIEFjY2Vzc2luZyB1bm1vY2tlZCBwcm9wZXJ0aWVzIG9uIHRoZSByZXR1cm5lZCBvYmplY3QgeWllbGRzIGB1bmRlZmluZWRgXG4gKiBpbnN0ZWFkIG9mIHRocm93aW5nLiBOb24tcHJveGllZCB2YWx1ZXMgYXJlIHJldHVybmVkIGFzLWlzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byB1bndyYXAuXG4gKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyB0YXJnZXQsIG9yIGBvYmplY3RgIGlmIGl0IGlzIG5vdCBhIHN0cmljdCBwcm94eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5cGFzc1N0cmljdFByb3h5PFQ+KG9iamVjdDogVCk6IFQge1xuICBpZiAoIWlzT2JqZWN0TGlrZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1jb21wdXRlZC1wcm9wZXJ0eS1leGlzdGVuY2UtY2hlY2sgLS0gYGluYCBpcyByZXF1aXJlZCwgbm90IGEgc2hvcnRoYW5kOiBgb2JqZWN0YCBtYXkgYmUgYSBzdHJpY3QgcHJveHksIGFuZCBvbmx5IGBpbmAgcm91dGVzIHRocm91Z2ggaXRzIGBoYXNgIHRyYXAuIGBPYmplY3QuaGFzT3duYCB3b3VsZCBhc2sgdGhlIHRhcmdldCBmb3IgYW4gb3duIGRlc2NyaXB0b3IgYW5kIG1pc3MgdGhlIG1hcmtlci5cbiAgaWYgKCEoU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wgaW4gb2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFtTVFJJQ1RfUFJPWFlfVEFSR0VUX1NZTUJPTF0gYXMgVDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmlmaWVkLXNpZ25hdHVyZXMgLS0gVGhpcyBvdmVybG9hZCBpbmZlcnMgVCBmcm9tIG1vY2tDbGFzczsgdGhlIGB1bmtub3duYCBvdmVybG9hZCBiZWxvdyByZXF1aXJlcyBleHBsaWNpdCBULiBUaGV5IGNhbm5vdCBiZSBjb21iaW5lZC5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RQcm94eTxUPih2YWx1ZTogdW5rbm93biwgbW9ja0NsYXNzOiBNb2NrQ2xhc3NMaWtlPFQ+KTogVDtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RQcm94eTxUIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0UHJveHk8VD4odmFsdWU6IFBhcnRpYWxEZWVwPFQ+KTogVDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFBhcnRpYWxEZWVwPFQ+IGFib3ZlIGdpdmVzIHR5cGUgc2FmZXR5IGZvciBwYXJ0aWFsIG1vY2tzOyB0aGlzIG92ZXJsb2FkIGFjY2VwdHMgYW4gZXhwbGljaXQgVCB3aXRoIGFuIHVuY2hlY2tlZCB2YWx1ZSBmb3IgY3Jvc3MtdHlwZSBjYXN0cy5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RQcm94eTxUPih2YWx1ZTogdW5rbm93bik6IFQ7XG4vKipcbiAqIFdyYXBzIGEgbW9jayBvYmplY3QgaW4gYSBzdHJpY3Qge0BsaW5rIFByb3h5fSB0aGF0IHRocm93cyBvbiB1bm1vY2tlZCBhY2Nlc3MuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIHByb3h5IHByZXNlbnRzLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG9iamVjdCAob3IgcGFydGlhbCBtb2NrKSB0byB3cmFwLlxuICogQHBhcmFtIG1vY2tDbGFzcyAtIE9wdGlvbmFsIG1vY2sgY2xhc3MgcHJvdmlkaW5nIGBfX2Atc3VmZml4ZWQgb3ZlcmxheSBtZXRob2RzLlxuICogQHJldHVybnMgVGhlIHdyYXBwZWQgdmFsdWUgdHlwZWQgYXMgYFRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0UHJveHk8VD4odmFsdWU6IHVua25vd24sIG1vY2tDbGFzcz86IE1vY2tDbGFzc1JlZik6IFQge1xuICByZXR1cm4gd3JhcFByb3h5PFQ+KHZhbHVlLCBtb2NrQ2xhc3MpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBub24tYG51bGxgIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGEgbm9uLWBudWxsYCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QgKHByb3RvdHlwZSBpcyBgT2JqZWN0LnByb3RvdHlwZWApLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBHZW5lcmljT2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHRoZSBzdHJpY3QtcHJveHkgd3JhcHBpbmcgbG9naWMgc2hhcmVkIGJ5IGFsbCBvdmVybG9hZHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIHByb3h5IHByZXNlbnRzLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG9iamVjdCB0byB3cmFwLlxuICogQHBhcmFtIG1vY2tDbGFzcyAtIE9wdGlvbmFsIG1vY2sgY2xhc3MgcHJvdmlkaW5nIGBfX2Atc3VmZml4ZWQgb3ZlcmxheSBtZXRob2RzLlxuICogQHJldHVybnMgVGhlIHdyYXBwZWQgdmFsdWUgdHlwZWQgYXMgYFRgLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBUIHByb3ZpZGVzIHJldHVybi10eXBlIGluZmVyZW5jZSBhdCB0aGUgY2FsbCBzaXRlcy5cbmZ1bmN0aW9uIHdyYXBQcm94eTxUPih2YWx1ZTogdW5rbm93biwgbW9ja0NsYXNzPzogTW9ja0NsYXNzUmVmKTogVCB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSBhcyBUO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tY29tcHV0ZWQtcHJvcGVydHktZXhpc3RlbmNlLWNoZWNrIC0tIGBpbmAgaXMgcmVxdWlyZWQsIG5vdCBhIHNob3J0aGFuZDogYHZhbHVlYCBtYXkgYWxyZWFkeSBiZSBhIHN0cmljdCBwcm94eSwgYW5kIG9ubHkgYGluYCByb3V0ZXMgdGhyb3VnaCBpdHMgYGhhc2AgdHJhcC4gYE9iamVjdC5oYXNPd25gIHdvdWxkIGFzayB0aGUgdGFyZ2V0IGZvciBhbiBvd24gZGVzY3JpcHRvciBhbmQgcmUtd3JhcCBhbiBhbHJlYWR5LXdyYXBwZWQgdmFsdWUuXG4gIGlmIChTVFJJQ1RfUFJPWFlfVEFSR0VUX1NZTUJPTCBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBhcyBUO1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wsIHsgdmFsdWUgfSk7XG5cbiAgY29uc3QgaXNDbGFzcyA9ICFpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgY29uc3QgY2xhc3NOYW1lID0gbW9ja0NsYXNzPy5uYW1lID8/IChpc0NsYXNzID8gdmFsdWUuY29uc3RydWN0b3IubmFtZSA6ICcnKTtcbiAgY29uc3QgbW9ja1Byb3RvdHlwZSA9IG1vY2tDbGFzcyA/IGVuc3VyZUdlbmVyaWNPYmplY3QobW9ja0NsYXNzLnByb3RvdHlwZSkgOiBudWxsO1xuICBjb25zdCBwcm94aWVkQ2hpbGRyZW4gPSBpc0NsYXNzID8gbnVsbCA6IG5ldyBNYXA8c3RyaW5nIHwgc3ltYm9sPigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkodmFsdWUsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOiB1bmtub3duIHtcbiAgICAgIC8vIDEuIE93biBwcm9wZXJ0aWVzIGFuZCBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWNvbXB1dGVkLXByb3BlcnR5LWV4aXN0ZW5jZS1jaGVjayAtLSBXYWxraW5nIHRoZSBQUk9UT1RZUEUgQ0hBSU4gaXMgdGhlIHBvaW50LCBhcyB0aGUgY29tbWVudCBhYm92ZSBzYXlzOiBpbmhlcml0ZWQgbWV0aG9kcyBtdXN0IHJlc29sdmUgdGhyb3VnaCB0aGUgcHJveHkuIGBPYmplY3QuaGFzT3duYCB3b3VsZCBzZWUgb25seSBvd24gcHJvcGVydGllcyBhbmQgc2VuZCBldmVyeSBpbmhlcml0ZWQgbWVtYmVyIGRvd24gdGhlIFwibm90IG1vY2tlZFwiIHBhdGguXG4gICAgICBpZiAocHJvcGVydHkgaW4gdGFyZ2V0KSB7XG4gICAgICAgIGlmIChwcm94aWVkQ2hpbGRyZW4/Lmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJveGllZENoaWxkcmVuLmdldChwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZV86IHVua25vd24gPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwcm94aWVkQ2hpbGRyZW4gJiYgaXNQbGFpbk9iamVjdCh2YWx1ZV8pKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gd3JhcFByb3h5PHVua25vd24+KHZhbHVlXyk7XG4gICAgICAgICAgcHJveGllZENoaWxkcmVuLnNldChwcm9wZXJ0eSwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZV87XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIE1vY2sgcHJvdG90eXBlIGNoYWluIChmb3IgX18gbWV0aG9kcyBvbiB0aGUgbW9jayBjbGFzcykuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1jb21wdXRlZC1wcm9wZXJ0eS1leGlzdGVuY2UtY2hlY2sgLS0gV2Fsa2luZyB0aGUgbW9jaydzIFBST1RPVFlQRSBDSEFJTiBpcyB0aGUgcG9pbnQ6IGEgYF9fYCBtZXRob2QgaW5oZXJpdGVkIGZyb20gYSBtb2NrIGJhc2UgY2xhc3MgaGFzIHRvIHJlc29sdmUgaGVyZSwgYW5kIGBPYmplY3QuaGFzT3duYCB3b3VsZCBvbmx5IHNlZSB0aGUgbGVhZiBjbGFzcydzIG93biBtZW1iZXJzLlxuICAgICAgaWYgKG1vY2tQcm90b3R5cGUgJiYgdHlwZW9mIHByb3BlcnR5ID09PSAnc3RyaW5nJyAmJiBwcm9wZXJ0eS5lbmRzV2l0aCgnX18nKSAmJiBwcm9wZXJ0eSBpbiBtb2NrUHJvdG90eXBlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlXzogdW5rbm93biA9IG1vY2tQcm90b3R5cGVbcHJvcGVydHldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZV8uYmluZChyZWNlaXZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlXztcbiAgICAgIH1cblxuICAgICAgLy8gMy4gUGFzc3Rocm91Z2ggcHJvcHMgKHN5bWJvbHMsIHRoZW4sIHRvSlNPTiwgZXRjLikuXG4gICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnc3ltYm9sJyB8fCBQQVNTVEhST1VHSF9QUk9QUy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgXCIke3Byb3BlcnR5fVwiIGlzIG5vdCBtb2NrZWQgaW4gJHtjbGFzc05hbWV9LiBUbyBvdmVycmlkZSwgYXNzaWduIGEgdmFsdWUgZmlyc3Q6IG1vY2suJHtwcm9wZXJ0eX0gPSAuLi5gKTtcbiAgICB9XG4gIH0pIGFzIFQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUF5QkEsU0FBUywyQkFBMkI7QUFFcEMsTUFBTSw2QkFBNkIsdUJBQU8sSUFBSSxtQkFBbUI7QUFFakUsTUFBTSxvQkFBb0Isb0JBQUksSUFBcUI7QUFBQSxFQUNqRCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBdUJNLFNBQVMsa0JBQXFCLFFBQWM7QUFDakQsTUFBSSxDQUFDLGFBQWEsTUFBTSxHQUFHO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxFQUFFLDhCQUE4QixTQUFTO0FBQzNDLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxPQUFPLDBCQUEwQjtBQUMxQztBQWdCTyxTQUFTLFlBQWUsT0FBZ0IsV0FBNkI7QUFDMUUsU0FBTyxVQUFhLE9BQU8sU0FBUztBQUN0QztBQVFBLFNBQVMsYUFBYSxPQUFpQztBQUNyRCxTQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFDNUM7QUFRQSxTQUFTLGNBQWMsT0FBd0M7QUFDN0QsU0FBTyxVQUFVLFFBQVEsT0FBTyxVQUFVLFlBQVksT0FBTyxlQUFlLEtBQUssTUFBTSxPQUFPO0FBQ2hHO0FBV0EsU0FBUyxVQUFhLE9BQWdCLFdBQTZCO0FBQ2pFLE1BQUksQ0FBQyxhQUFhLEtBQUssR0FBRztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUdBLE1BQUksOEJBQThCLE9BQU87QUFDdkMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLGVBQWUsT0FBTyw0QkFBNEIsRUFBRSxNQUFNLENBQUM7QUFFbEUsUUFBTSxVQUFVLENBQUMsY0FBYyxLQUFLO0FBQ3BDLFFBQU0sWUFBWSxXQUFXLFNBQVMsVUFBVSxNQUFNLFlBQVksT0FBTztBQUN6RSxRQUFNLGdCQUFnQixZQUFZLG9CQUFvQixVQUFVLFNBQVMsSUFBSTtBQUM3RSxRQUFNLGtCQUFrQixVQUFVLE9BQU8sb0JBQUksSUFBcUI7QUFFbEUsU0FBTyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3RCLElBQUksUUFBUSxVQUFVLFVBQW1CO0FBR3ZDLFVBQUksWUFBWSxRQUFRO0FBQ3RCLFlBQUksaUJBQWlCLElBQUksUUFBUSxHQUFHO0FBQ2xDLGlCQUFPLGdCQUFnQixJQUFJLFFBQVE7QUFBQSxRQUNyQztBQUVBLGNBQU0sU0FBa0IsUUFBUSxJQUFJLFFBQVEsVUFBVSxRQUFRO0FBQzlELFlBQUksbUJBQW1CLGNBQWMsTUFBTSxHQUFHO0FBQzVDLGdCQUFNLFNBQVMsVUFBbUIsTUFBTTtBQUN4QywwQkFBZ0IsSUFBSSxVQUFVLE1BQU07QUFDcEMsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFJQSxVQUFJLGlCQUFpQixPQUFPLGFBQWEsWUFBWSxTQUFTLFNBQVMsSUFBSSxLQUFLLFlBQVksZUFBZTtBQUN6RyxjQUFNLFNBQWtCLGNBQWMsUUFBUTtBQUM5QyxZQUFJLE9BQU8sV0FBVyxZQUFZO0FBQ2hDLGlCQUFPLE9BQU8sS0FBSyxRQUFRO0FBQUEsUUFDN0I7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUdBLFVBQUksT0FBTyxhQUFhLFlBQVksa0JBQWtCLElBQUksUUFBUSxHQUFHO0FBQ25FLGVBQU8sUUFBUSxJQUFJLFFBQVEsVUFBVSxRQUFRO0FBQUEsTUFDL0M7QUFFQSxZQUFNLElBQUksTUFBTSxhQUFhLFFBQVEsc0JBQXNCLFNBQVMsNkNBQTZDLFFBQVEsUUFBUTtBQUFBLElBQ25JO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
66
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0cmljdC1wcm94eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFN0cmljdCBwcm94eSBmb3IgbW9jayBvYmplY3RzLlxuICpcbiAqIFdyYXBzIGFuIG9iamVjdCBpbiBhIGBQcm94eWAgdGhhdCB0aHJvd3MgYSBkZXNjcmlwdGl2ZSBlcnJvciB3aGVuIGFueVxuICogdW5tb2NrZWQgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgcmV0dXJuaW5nIGB1bmRlZmluZWRgLlxuICpcbiAqIC0gSWRlbXBvdGVudCAoZG91YmxlLXdyYXBwaW5nIGlzIGEgbm8tb3ApLlxuICogLSBQYXNzdGhyb3VnaCBmb3Igd2VsbC1rbm93biBwcm9wcyAoYHRoZW5gLCBgdG9KU09OYCwgYFN5bWJvbC5pdGVyYXRvcmAsIGV0Yy4pLlxuICogLSBDbGFzcy1uYW1lLWF3YXJlIGVycm9yIG1lc3NhZ2VzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gKiAtIFJlY3Vyc2l2ZSBwcm94eWluZyBvZiBuZXN0ZWQgcGxhaW4gb2JqZWN0cyAoZm9yIHBhcnRpYWwgbW9ja3Mgb25seSkuXG4gKlxuICogT3ZlcmxvYWRzOlxuICogMS4gYHN0cmljdFByb3h5KHZhbHVlLCBNb2NrQ2xhc3MpYCBcdTIwMTQgaW5mZXJzIGBUYCBmcm9tIGBNb2NrQ2xhc3MucHJvdG90eXBlYCxcbiAqICAgIG92ZXJsYXlzIGBfX2Atc3VmZml4ZWQgbWV0aG9kcyB2aWEgdGhlIHByb3h5LlxuICogMi4gYHN0cmljdFByb3h5KHZhbHVlOiBUKWAgXHUyMDE0IGluZmVycyBgVGAgZnJvbSB0aGUgYXJndW1lbnQuXG4gKiAzLiBgc3RyaWN0UHJveHk8VD4ocGFydGlhbClgIFx1MjAxNCB0ZXN0IG1vY2tpbmc6IHR5cGVkIHZpYSBgUGFydGlhbERlZXA8VD5gLlxuICogNC4gYHN0cmljdFByb3h5PFQ+KHZhbHVlKWAgXHUyMDE0IGV4cGxpY2l0IGBUYCwgdW5jaGVja2VkIHZhbHVlIChjcm9zcy10eXBlIGNhc3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUGFydGlhbERlZXAgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbmltcG9ydCB7IGVuc3VyZUdlbmVyaWNPYmplY3QgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbmNvbnN0IFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MID0gU3ltYm9sLmZvcignc3RyaWN0UHJveHlUYXJnZXQnKTtcblxuY29uc3QgUEFTU1RIUk9VR0hfUFJPUFMgPSBuZXcgU2V0PHN0cmluZyB8IHN5bWJvbD4oW1xuICBTeW1ib2wuaXRlcmF0b3IsXG4gIFN5bWJvbC50b1ByaW1pdGl2ZSxcbiAgU3ltYm9sLnRvU3RyaW5nVGFnLFxuICAndGhlbicsXG4gICd0b0pTT04nXG5dKTtcblxudHlwZSBNb2NrQ2xhc3NMaWtlPFQ+ID0gTW9ja0NsYXNzUHJvdG90eXBlUmVmPFQ+ICYgTW9ja0NsYXNzUmVmO1xuXG5pbnRlcmZhY2UgTW9ja0NsYXNzUHJvdG90eXBlUmVmPFQ+IHtcbiAgcHJvdG90eXBlOiBUO1xufVxuXG5pbnRlcmZhY2UgTW9ja0NsYXNzUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm90b3R5cGU6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGEgc3RyaWN0LXByb3hpZWQgb2JqZWN0LCByZXR1cm5pbmcgdGhlIHVuZGVybHlpbmcgdGFyZ2V0LlxuICpcbiAqIEFjY2Vzc2luZyB1bm1vY2tlZCBwcm9wZXJ0aWVzIG9uIHRoZSByZXR1cm5lZCBvYmplY3QgeWllbGRzIGB1bmRlZmluZWRgXG4gKiBpbnN0ZWFkIG9mIHRocm93aW5nLiBOb24tcHJveGllZCB2YWx1ZXMgYXJlIHJldHVybmVkIGFzLWlzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byB1bndyYXAuXG4gKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyB0YXJnZXQsIG9yIGBvYmplY3RgIGlmIGl0IGlzIG5vdCBhIHN0cmljdCBwcm94eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5cGFzc1N0cmljdFByb3h5PFQ+KG9iamVjdDogVCk6IFQge1xuICBpZiAoIWlzT2JqZWN0TGlrZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1jb21wdXRlZC1wcm9wZXJ0eS1leGlzdGVuY2UtY2hlY2sgLS0gYGluYCBpcyByZXF1aXJlZCwgbm90IGEgc2hvcnRoYW5kOiBgb2JqZWN0YCBtYXkgYmUgYSBzdHJpY3QgcHJveHksIGFuZCBvbmx5IGBpbmAgcm91dGVzIHRocm91Z2ggaXRzIGBoYXNgIHRyYXAuIGBPYmplY3QuaGFzT3duYCB3b3VsZCBhc2sgdGhlIHRhcmdldCBmb3IgYW4gb3duIGRlc2NyaXB0b3IgYW5kIG1pc3MgdGhlIG1hcmtlci5cbiAgcmV0dXJuIChTVFJJQ1RfUFJPWFlfVEFSR0VUX1NZTUJPTCBpbiBvYmplY3QpID8gKG9iamVjdFtTVFJJQ1RfUFJPWFlfVEFSR0VUX1NZTUJPTF0gYXMgVCkgOiBvYmplY3Q7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5pZmllZC1zaWduYXR1cmVzIC0tIFRoaXMgb3ZlcmxvYWQgaW5mZXJzIFQgZnJvbSBtb2NrQ2xhc3M7IHRoZSBgdW5rbm93bmAgb3ZlcmxvYWQgYmVsb3cgcmVxdWlyZXMgZXhwbGljaXQgVC4gVGhleSBjYW5ub3QgYmUgY29tYmluZWQuXG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0UHJveHk8VD4odmFsdWU6IHVua25vd24sIG1vY2tDbGFzczogTW9ja0NsYXNzTGlrZTxUPik6IFQ7XG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0UHJveHk8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdFByb3h5PFQ+KHZhbHVlOiBQYXJ0aWFsRGVlcDxUPik6IFQ7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuaWZpZWQtc2lnbmF0dXJlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBQYXJ0aWFsRGVlcDxUPiBhYm92ZSBnaXZlcyB0eXBlIHNhZmV0eSBmb3IgcGFydGlhbCBtb2NrczsgdGhpcyBvdmVybG9hZCBhY2NlcHRzIGFuIGV4cGxpY2l0IFQgd2l0aCBhbiB1bmNoZWNrZWQgdmFsdWUgZm9yIGNyb3NzLXR5cGUgY2FzdHMuXG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0UHJveHk8VD4odmFsdWU6IHVua25vd24pOiBUO1xuLyoqXG4gKiBXcmFwcyBhIG1vY2sgb2JqZWN0IGluIGEgc3RyaWN0IHtAbGluayBQcm94eX0gdGhhdCB0aHJvd3Mgb24gdW5tb2NrZWQgYWNjZXNzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBwcm94eSBwcmVzZW50cy5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvYmplY3QgKG9yIHBhcnRpYWwgbW9jaykgdG8gd3JhcC5cbiAqIEBwYXJhbSBtb2NrQ2xhc3MgLSBPcHRpb25hbCBtb2NrIGNsYXNzIHByb3ZpZGluZyBgX19gLXN1ZmZpeGVkIG92ZXJsYXkgbWV0aG9kcy5cbiAqIEByZXR1cm5zIFRoZSB3cmFwcGVkIHZhbHVlIHR5cGVkIGFzIGBUYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdFByb3h5PFQ+KHZhbHVlOiB1bmtub3duLCBtb2NrQ2xhc3M/OiBNb2NrQ2xhc3NSZWYpOiBUIHtcbiAgcmV0dXJuIHdyYXBQcm94eTxUPih2YWx1ZSwgbW9ja0NsYXNzKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGEgbm9uLWBudWxsYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1gbnVsbGAgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IChwcm90b3R5cGUgaXMgYE9iamVjdC5wcm90b3R5cGVgKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgR2VuZXJpY09iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyB0aGUgc3RyaWN0LXByb3h5IHdyYXBwaW5nIGxvZ2ljIHNoYXJlZCBieSBhbGwgb3ZlcmxvYWRzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBwcm94eSBwcmVzZW50cy5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gd3JhcC5cbiAqIEBwYXJhbSBtb2NrQ2xhc3MgLSBPcHRpb25hbCBtb2NrIGNsYXNzIHByb3ZpZGluZyBgX19gLXN1ZmZpeGVkIG92ZXJsYXkgbWV0aG9kcy5cbiAqIEByZXR1cm5zIFRoZSB3cmFwcGVkIHZhbHVlIHR5cGVkIGFzIGBUYC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gVCBwcm92aWRlcyByZXR1cm4tdHlwZSBpbmZlcmVuY2UgYXQgdGhlIGNhbGwgc2l0ZXMuXG5mdW5jdGlvbiB3cmFwUHJveHk8VD4odmFsdWU6IHVua25vd24sIG1vY2tDbGFzcz86IE1vY2tDbGFzc1JlZik6IFQge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgVDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWNvbXB1dGVkLXByb3BlcnR5LWV4aXN0ZW5jZS1jaGVjayAtLSBgaW5gIGlzIHJlcXVpcmVkLCBub3QgYSBzaG9ydGhhbmQ6IGB2YWx1ZWAgbWF5IGFscmVhZHkgYmUgYSBzdHJpY3QgcHJveHksIGFuZCBvbmx5IGBpbmAgcm91dGVzIHRocm91Z2ggaXRzIGBoYXNgIHRyYXAuIGBPYmplY3QuaGFzT3duYCB3b3VsZCBhc2sgdGhlIHRhcmdldCBmb3IgYW4gb3duIGRlc2NyaXB0b3IgYW5kIHJlLXdyYXAgYW4gYWxyZWFkeS13cmFwcGVkIHZhbHVlLlxuICBpZiAoU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgVDtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWUsIFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MLCB7IHZhbHVlIH0pO1xuXG4gIGNvbnN0IGlzQ2xhc3MgPSAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IG1vY2tDbGFzcz8ubmFtZSA/PyAoaXNDbGFzcyA/IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgOiAnJyk7XG4gIGNvbnN0IG1vY2tQcm90b3R5cGUgPSBtb2NrQ2xhc3MgPyBlbnN1cmVHZW5lcmljT2JqZWN0KG1vY2tDbGFzcy5wcm90b3R5cGUpIDogbnVsbDtcbiAgY29uc3QgcHJveGllZENoaWxkcmVuID0gaXNDbGFzcyA/IG51bGwgOiBuZXcgTWFwPHN0cmluZyB8IHN5bWJvbD4oKTtcblxuICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKTogdW5rbm93biB7XG4gICAgICAvLyAxLiBPd24gcHJvcGVydGllcyBhbmQgcHJvdG90eXBlIGNoYWluIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1jb21wdXRlZC1wcm9wZXJ0eS1leGlzdGVuY2UtY2hlY2sgLS0gV2Fsa2luZyB0aGUgUFJPVE9UWVBFIENIQUlOIGlzIHRoZSBwb2ludCwgYXMgdGhlIGNvbW1lbnQgYWJvdmUgc2F5czogaW5oZXJpdGVkIG1ldGhvZHMgbXVzdCByZXNvbHZlIHRocm91Z2ggdGhlIHByb3h5LiBgT2JqZWN0Lmhhc093bmAgd291bGQgc2VlIG9ubHkgb3duIHByb3BlcnRpZXMgYW5kIHNlbmQgZXZlcnkgaW5oZXJpdGVkIG1lbWJlciBkb3duIHRoZSBcIm5vdCBtb2NrZWRcIiBwYXRoLlxuICAgICAgaWYgKHByb3BlcnR5IGluIHRhcmdldCkge1xuICAgICAgICBpZiAocHJveGllZENoaWxkcmVuPy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3hpZWRDaGlsZHJlbi5nZXQocHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVfOiB1bmtub3duID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpO1xuICAgICAgICBpZiAocHJveGllZENoaWxkcmVuICYmIGlzUGxhaW5PYmplY3QodmFsdWVfKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBQcm94eTx1bmtub3duPih2YWx1ZV8pO1xuICAgICAgICAgIHByb3hpZWRDaGlsZHJlbi5zZXQocHJvcGVydHksIHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVfO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBNb2NrIHByb3RvdHlwZSBjaGFpbiAoZm9yIF9fIG1ldGhvZHMgb24gdGhlIG1vY2sgY2xhc3MpLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tY29tcHV0ZWQtcHJvcGVydHktZXhpc3RlbmNlLWNoZWNrIC0tIFdhbGtpbmcgdGhlIG1vY2sncyBQUk9UT1RZUEUgQ0hBSU4gaXMgdGhlIHBvaW50OiBhIGBfX2AgbWV0aG9kIGluaGVyaXRlZCBmcm9tIGEgbW9jayBiYXNlIGNsYXNzIGhhcyB0byByZXNvbHZlIGhlcmUsIGFuZCBgT2JqZWN0Lmhhc093bmAgd291bGQgb25seSBzZWUgdGhlIGxlYWYgY2xhc3MncyBvd24gbWVtYmVycy5cbiAgICAgIGlmIChtb2NrUHJvdG90eXBlICYmIHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycgJiYgcHJvcGVydHkuZW5kc1dpdGgoJ19fJykgJiYgcHJvcGVydHkgaW4gbW9ja1Byb3RvdHlwZSkge1xuICAgICAgICBjb25zdCB2YWx1ZV86IHVua25vd24gPSBtb2NrUHJvdG90eXBlW3Byb3BlcnR5XTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZV8gPT09ICdmdW5jdGlvbicgPyB2YWx1ZV8uYmluZChyZWNlaXZlcikgOiB2YWx1ZV87XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFBhc3N0aHJvdWdoIHByb3BzIChzeW1ib2xzLCB0aGVuLCB0b0pTT04sIGV0Yy4pLlxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N5bWJvbCcgfHwgUEFTU1RIUk9VR0hfUFJPUFMuaGFzKHByb3BlcnR5KSkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cIiBpcyBub3QgbW9ja2VkIGluICR7Y2xhc3NOYW1lfS4gVG8gb3ZlcnJpZGUsIGFzc2lnbiBhIHZhbHVlIGZpcnN0OiBtb2NrLiR7cHJvcGVydHl9ID0gLi4uYCk7XG4gICAgfVxuICB9KSBhcyBUO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBeUJBLFNBQVMsMkJBQTJCO0FBRXBDLE1BQU0sNkJBQTZCLHVCQUFPLElBQUksbUJBQW1CO0FBRWpFLE1BQU0sb0JBQW9CLG9CQUFJLElBQXFCO0FBQUEsRUFDakQsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQXVCTSxTQUFTLGtCQUFxQixRQUFjO0FBQ2pELE1BQUksQ0FBQyxhQUFhLE1BQU0sR0FBRztBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQVEsOEJBQThCLFNBQVcsT0FBTywwQkFBMEIsSUFBVTtBQUM5RjtBQWdCTyxTQUFTLFlBQWUsT0FBZ0IsV0FBNkI7QUFDMUUsU0FBTyxVQUFhLE9BQU8sU0FBUztBQUN0QztBQVFBLFNBQVMsYUFBYSxPQUFpQztBQUNyRCxTQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFDNUM7QUFRQSxTQUFTLGNBQWMsT0FBd0M7QUFDN0QsU0FBTyxVQUFVLFFBQVEsT0FBTyxVQUFVLFlBQVksT0FBTyxlQUFlLEtBQUssTUFBTSxPQUFPO0FBQ2hHO0FBV0EsU0FBUyxVQUFhLE9BQWdCLFdBQTZCO0FBQ2pFLE1BQUksQ0FBQyxhQUFhLEtBQUssR0FBRztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUdBLE1BQUksOEJBQThCLE9BQU87QUFDdkMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLGVBQWUsT0FBTyw0QkFBNEIsRUFBRSxNQUFNLENBQUM7QUFFbEUsUUFBTSxVQUFVLENBQUMsY0FBYyxLQUFLO0FBQ3BDLFFBQU0sWUFBWSxXQUFXLFNBQVMsVUFBVSxNQUFNLFlBQVksT0FBTztBQUN6RSxRQUFNLGdCQUFnQixZQUFZLG9CQUFvQixVQUFVLFNBQVMsSUFBSTtBQUM3RSxRQUFNLGtCQUFrQixVQUFVLE9BQU8sb0JBQUksSUFBcUI7QUFFbEUsU0FBTyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3RCLElBQUksUUFBUSxVQUFVLFVBQW1CO0FBR3ZDLFVBQUksWUFBWSxRQUFRO0FBQ3RCLFlBQUksaUJBQWlCLElBQUksUUFBUSxHQUFHO0FBQ2xDLGlCQUFPLGdCQUFnQixJQUFJLFFBQVE7QUFBQSxRQUNyQztBQUVBLGNBQU0sU0FBa0IsUUFBUSxJQUFJLFFBQVEsVUFBVSxRQUFRO0FBQzlELFlBQUksbUJBQW1CLGNBQWMsTUFBTSxHQUFHO0FBQzVDLGdCQUFNLFNBQVMsVUFBbUIsTUFBTTtBQUN4QywwQkFBZ0IsSUFBSSxVQUFVLE1BQU07QUFDcEMsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFJQSxVQUFJLGlCQUFpQixPQUFPLGFBQWEsWUFBWSxTQUFTLFNBQVMsSUFBSSxLQUFLLFlBQVksZUFBZTtBQUN6RyxjQUFNLFNBQWtCLGNBQWMsUUFBUTtBQUM5QyxlQUFPLE9BQU8sV0FBVyxhQUFhLE9BQU8sS0FBSyxRQUFRLElBQUk7QUFBQSxNQUNoRTtBQUdBLFVBQUksT0FBTyxhQUFhLFlBQVksa0JBQWtCLElBQUksUUFBUSxHQUFHO0FBQ25FLGVBQU8sUUFBUSxJQUFJLFFBQVEsVUFBVSxRQUFRO0FBQUEsTUFDL0M7QUFFQSxZQUFNLElBQUksTUFBTSxhQUFhLFFBQVEsc0JBQXNCLFNBQVMsNkNBQTZDLFFBQVEsUUFBUTtBQUFBLElBQ25JO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==