obsidian-integration-testing 12.2.0 → 12.3.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 (50) hide show
  1. package/README.md +1 -5
  2. package/dist/lib/cjs/appium-session-config.cjs +3 -5
  3. package/dist/lib/cjs/appium-session-config.d.cts +6 -9
  4. package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
  5. package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
  6. package/dist/lib/cjs/emulator-device-id.cjs +1 -1
  7. package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
  8. package/dist/lib/cjs/eval-cap.cjs +29 -0
  9. package/dist/lib/cjs/eval-cap.d.cts +43 -0
  10. package/dist/lib/cjs/index.cjs +4 -1
  11. package/dist/lib/cjs/index.d.cts +1 -0
  12. package/dist/lib/cjs/library.cjs +1 -1
  13. package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
  14. package/dist/lib/cjs/poll-in-obsidian.d.cts +4 -3
  15. package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
  16. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
  17. package/dist/lib/cjs/soft-keyboard.cjs +7 -4
  18. package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
  19. package/dist/lib/cjs/transport-appium.cjs +5 -5
  20. package/dist/lib/cjs/transport-desktop-cdp.cjs +77 -13
  21. package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
  22. package/dist/lib/cjs/transport-options.cjs +1 -1
  23. package/dist/lib/cjs/transport-options.d.cts +11 -1
  24. package/dist/lib/cjs/webview-cdp.cjs +45 -14
  25. package/dist/lib/cjs/webview-cdp.d.cts +17 -0
  26. package/dist/lib/esm/appium-session-config.d.mts +6 -9
  27. package/dist/lib/esm/appium-session-config.mjs +3 -4
  28. package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
  29. package/dist/lib/esm/connect-to-cdp.mjs +1 -1
  30. package/dist/lib/esm/emulator-device-id.d.mts +7 -6
  31. package/dist/lib/esm/emulator-device-id.mjs +1 -1
  32. package/dist/lib/esm/eval-cap.d.mts +43 -0
  33. package/dist/lib/esm/eval-cap.mjs +5 -0
  34. package/dist/lib/esm/index.d.mts +1 -0
  35. package/dist/lib/esm/index.mjs +3 -1
  36. package/dist/lib/esm/library.mjs +1 -1
  37. package/dist/lib/esm/poll-in-obsidian.d.mts +4 -3
  38. package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
  39. package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
  40. package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
  41. package/dist/lib/esm/soft-keyboard.d.mts +16 -2
  42. package/dist/lib/esm/soft-keyboard.mjs +7 -4
  43. package/dist/lib/esm/transport-appium.mjs +5 -5
  44. package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
  45. package/dist/lib/esm/transport-desktop-cdp.mjs +77 -13
  46. package/dist/lib/esm/transport-options.d.mts +11 -1
  47. package/dist/lib/esm/transport-options.mjs +1 -1
  48. package/dist/lib/esm/webview-cdp.d.mts +17 -0
  49. package/dist/lib/esm/webview-cdp.mjs +45 -14
  50. package/package.json +1 -1
@@ -29,21 +29,27 @@ const DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS = 100;
29
29
  const INPUT_METHOD_STATE_REG_EXP = /mInputShown|mIsInputViewShown|mHaveConnection|mShowRequested/;
30
30
  const CENTER_DIVISOR = 2;
31
31
  function buildSoftKeyboardDiagnosticMessage(params) {
32
- const { inputRect } = params.snapshot;
33
- const inputBottom = inputRect ? inputRect.top + inputRect.height : null;
34
- return [
32
+ const baselineTop = params.baselineSnapshot.inputRect?.top ?? null;
33
+ const currentTop = params.snapshot.inputRect?.top ?? null;
34
+ const lift = baselineTop === null || currentTop === null ? null : baselineTop - currentTop;
35
+ const lines = [
35
36
  `raiseSoftKeyboard: the keyboard did not come up. Device framebuffer written to ${params.screenshotPath}.`,
36
- `page: innerHeight=${String(params.snapshot.innerHeight)} inputBottom=${inputBottom === null ? "(no input)" : String(inputBottom)}`,
37
+ `page: innerHeight=${String(params.snapshot.innerHeight)} baselineInputTop=${formatMeasurement(baselineTop)} inputTop=${formatMeasurement(currentTop)} lift=${formatMeasurement(lift)}`,
37
38
  `device: ${params.inputMethodState || "(no input_method state reported)"}`
38
- ].join("\n");
39
+ ];
40
+ if (lift === 0) {
41
+ 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.");
42
+ }
43
+ return lines.join("\n");
39
44
  }
40
45
  function checkIsSoftKeyboardUp(params) {
46
+ const baselineRect = params.baselineSnapshot.inputRect;
41
47
  const { inputRect } = params.snapshot;
42
- if (!inputRect) {
48
+ if (!baselineRect || !inputRect) {
43
49
  return false;
44
50
  }
45
51
  const minimumKeyboardHeightInPixels = params.minimumKeyboardHeightInPixels ?? DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS;
46
- return params.snapshot.innerHeight - (inputRect.top + inputRect.height) > minimumKeyboardHeightInPixels;
52
+ return baselineRect.top - inputRect.top > minimumKeyboardHeightInPixels;
47
53
  }
48
54
  function parseInputMethodState(dumpsysOutput) {
49
55
  return dumpsysOutput.split("\n").filter((line) => INPUT_METHOD_STATE_REG_EXP.test(line)).map((line) => line.trim()).join(" | ");
@@ -64,6 +70,9 @@ function resolveSoftKeyboardTapPoints(params) {
64
70
  { xInPixels, yInPixels: centerYInPixels }
65
71
  ];
66
72
  }
73
+ function formatMeasurement(value) {
74
+ return value === null ? "(no input)" : String(value);
75
+ }
67
76
  // Annotate the CommonJS export names for ESM import in node:
68
77
  0 && (module.exports = {
69
78
  DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
@@ -72,4 +81,4 @@ function resolveSoftKeyboardTapPoints(params) {
72
81
  parseInputMethodState,
73
82
  resolveSoftKeyboardTapPoints
74
83
  });
75
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhlIGZpZWxkJ3Mgb3duIG9mZnNldCBmcm9tIHRoZSBib3R0b20sIHdoaWNoIGlzIHdoeSB0aGUgZGV0ZWN0aW9uIGhlcmUgaXNcbiAqIGdlb21ldHJpYyByYXRoZXIgdGhhbiBhbiBBUEkgY2FsbC4gVHdvIHJ1bnMgZmFpbGVkIG9uIHRoYXQgYmVmb3JlIGEgZnJhbWVidWZmZXJcbiAqIGR1bXAgc2FpZCBzbywgd2hpY2ggaXMgYWxzbyB3aHkgdGhlIGRpYWdub3N0aWMgYmVsb3cgZXhpc3RzLlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbGVhc3QgYSByYWlzZWQga2V5Ym9hcmQgbGlmdHMgdGhlIGZpZWxkIGJ5LCBzbyBhIHN0cmF5IHJvdW5kaW5nIHBpeGVsIGlzIG5vdCByZWFkIGFzIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTfVxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW9tZXRyeSB0byBqdWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcmVjdGFuZ2xlIGFzIHRoZSByZW5kZXJlciByZXBvcnRzIGl0LCBpbiBDU1MgcGl4ZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRSZWN0IHtcbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyBoZWlnaHQuXG4gICAqL1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGZyb20gdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVjdGFuZ2xlJ3Mgd2lkdGguXG4gICAqL1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBnZW9tZXRyeSB0aGUgdGFwIGlzIGFpbWVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBBIHBvaW50IG9uIHRoZSBkZXZpY2UncyBzY3JlZW4sIGluIGRldmljZSBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVGFwUG9pbnQge1xuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGZyb20gdGhlIHNjcmVlbidzIGxlZnQgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHhJblBpeGVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgdG9wIGVkZ2UuXG4gICAqL1xuICByZWFkb25seSB5SW5QaXhlbHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBrbm93cyBhYm91dCBpdHMgb3duIGdlb21ldHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Qge1xuICAvKipcbiAgICogVGhlIHJhdGlvIGJldHdlZW4gQ1NTIHBpeGVscyBhbmQgdGhlIGRldmljZSBwaXhlbHMgYGFkYiBzaGVsbCBpbnB1dCB0YXBgIHNwZWFrcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZVBpeGVsUmF0aW86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0J3MgaGVpZ2h0IGluIENTUyBwaXhlbHMuXG4gICAqXG4gICAqIEtlcHQgZm9yIHRoZSBkaWFnbm9zdGljIGFzIG11Y2ggYXMgdGhlIGRlY2lzaW9uOiBpdCBkb2VzICoqbm90Kiogc2hyaW5rIHdoZW4gdGhlIGtleWJvYXJkIGNvbWVzIHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5uZXJIZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZpZWxkJ3MgcmVjdCwgd2hpY2ggaXMgd2hhdCBzYXlzIHdoZXRoZXIgdGhlIGtleWJvYXJkIGlzIHVwLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3Qgb24gc2NyZWVuLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRSZWN0OiBFbGVtZW50UmVjdCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSB3aW5kb3cncyBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSBzY3JlZW4sIGFzIHRoZSBwYWdlIHVuZGVyc3RhbmRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2NyZWVuWTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBsZWFzdCBhIHJhaXNlZCBrZXlib2FyZCBsaWZ0cyB0aGUgZmllbGQgYnksIHNvIGEgc3RyYXkgcm91bmRpbmcgcGl4ZWwgaXMgbm90IHJlYWQgYXMgb25lLlxuICpcbiAqIEV4cG9ydGVkIGJlY2F1c2UgaXQgaXMgdGhlIG51bWJlciBib3RoIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9IGFuZCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRlZmF1bHQgdG8sXG4gKiBhbmQgYSBzdWl0ZSB0aWdodGVuaW5nIGl0IHdhbnRzIHRvIHNheSBzbyByZWxhdGl2ZSB0byB0aGlzIHJhdGhlciB0aGFuIGluIHRoZSBhYnN0cmFjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTID0gMTAwO1xuXG4vKipcbiAqIFRoZSBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgYWN0dWFsbHkgc2hvd2luZy5cbiAqL1xuY29uc3QgSU5QVVRfTUVUSE9EX1NUQVRFX1JFR19FWFAgPSAvbUlucHV0U2hvd258bUlzSW5wdXRWaWV3U2hvd258bUhhdmVDb25uZWN0aW9ufG1TaG93UmVxdWVzdGVkLztcblxuLyoqXG4gKiBIb3cgbWFueSBlcXVhbCBwYXJ0cyB0aGUgZmllbGQgaXMgc3BsaXQgaW50byB0byBmaW5kIGl0cyBjZW50cmUuXG4gKi9cbmNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgcmFpc2UgcmVwb3J0cy5cbiAqXG4gKiBBIGJhcmUgXCJ0aGUga2V5Ym9hcmQgZGlkIG5vdCBjb21lIHVwXCIgaXMgdW5yZWFkYWJsZSBcdTIwMTQgd2hhdCB0aGUgcmVhZGVyIG5lZWRzIGlzIHdoYXQgdGhlIHBhZ2Ugc2F3IGFuZCB3aGF0XG4gKiB0aGUgZGV2aWNlIHRob3VnaHQsIHNpZGUgYnkgc2lkZSwgYmVjYXVzZSB0aGUgdHdvIGRpc2FncmVlaW5nIGlzIHRoZSB3aG9sZSBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBldmlkZW5jZSBnYXRoZXJlZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlLCByZWFkeSB0byB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2UocGFyYW1zOiBCdWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBpbnB1dFJlY3QgfSA9IHBhcmFtcy5zbmFwc2hvdDtcbiAgY29uc3QgaW5wdXRCb3R0b20gPSBpbnB1dFJlY3QgPyBpbnB1dFJlY3QudG9wICsgaW5wdXRSZWN0LmhlaWdodCA6IG51bGw7XG5cbiAgcmV0dXJuIFtcbiAgICBgcmFpc2VTb2Z0S2V5Ym9hcmQ6IHRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXAuIERldmljZSBmcmFtZWJ1ZmZlciB3cml0dGVuIHRvICR7cGFyYW1zLnNjcmVlbnNob3RQYXRofS5gLFxuICAgIGBwYWdlOiBpbm5lckhlaWdodD0ke1N0cmluZyhwYXJhbXMuc25hcHNob3QuaW5uZXJIZWlnaHQpfSBpbnB1dEJvdHRvbT0ke2lucHV0Qm90dG9tID09PSBudWxsID8gJyhubyBpbnB1dCknIDogU3RyaW5nKGlucHV0Qm90dG9tKX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gXG4gIF0uam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gdGhlIHBhZ2UncyBvd24gZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSB0byBqdWRnZSwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgc3RvcHBlZCBzaG9ydCBvZiB0aGUgYm90dG9tIHRvIG1ha2Ugcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGlucHV0UmVjdCB9ID0gcGFyYW1zLnNuYXBzaG90O1xuICBpZiAoIWlucHV0UmVjdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzID0gcGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzID8/IERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTO1xuICByZXR1cm4gcGFyYW1zLnNuYXBzaG90LmlubmVySGVpZ2h0IC0gKGlucHV0UmVjdC50b3AgKyBpbnB1dFJlY3QuaGVpZ2h0KSA+IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgYGR1bXBzeXMgaW5wdXRfbWV0aG9kYCB0byB0aGUgaGFuZGZ1bCBvZiBmaWVsZHMgdGhhdCBzYXkgd2hldGhlciB0aGUgSU1FIGlzIHNob3dpbmcuXG4gKlxuICogQHBhcmFtIGR1bXBzeXNPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZHVtcHN5cyBpbnB1dF9tZXRob2RgLlxuICogQHJldHVybnMgVGhlIGludGVyZXN0aW5nIGZpZWxkcywgdHJpbW1lZCBhbmQgam9pbmVkLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBub25lIHdlcmUgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlucHV0TWV0aG9kU3RhdGUoZHVtcHN5c091dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGR1bXBzeXNPdXRwdXRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcigobGluZSkgPT4gSU5QVVRfTUVUSE9EX1NUQVRFX1JFR19FWFAudGVzdChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAuam9pbignIHwgJyk7XG59XG5cbi8qKlxuICogV29ya3Mgb3V0IHdoZXJlIHRvIHRvdWNoLCBpbiB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzLlxuICpcbiAqIFR3byBjYW5kaWRhdGVzLCBub3Qgb25lOiB0aGUgV2ViVmlldyBtYXkgb3IgbWF5IG5vdCBzdGFydCBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4sIGFuZCB0aGUgcGFnZSBjYW5ub3RcbiAqIHRlbGwgd2hpY2guIEJvdGggbGFuZCBpbnNpZGUgdGhlIGZpZWxkIFx1MjAxNCBpdCBpcyB0YWxsZXIgdGhhbiB0aGUgb2Zmc2V0IFx1MjAxNCBzbyBhIHdyb25nIGd1ZXNzIGNvc3RzIG9uZSB0b3VjaFxuICogcmF0aGVyIHRoYW4gYSBtaXMtdGFwIG9uIHdoYXRldmVyIHNpdHMgYmVsb3cuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSB0aGUgdGFwIGlzIGFpbWVkIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgcG9pbnRzIHRvIHRyeSwgaW4gb3JkZXIsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIGZpZWxkIGlzIG5vdCBvbiBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHBhcmFtczogUmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1BhcmFtcyk6IFNvZnRLZXlib2FyZFRhcFBvaW50W10ge1xuICBjb25zdCB7IGRldmljZVBpeGVsUmF0aW8sIGlucHV0UmVjdCwgc2NyZWVuWSB9ID0gcGFyYW1zLnNuYXBzaG90O1xuICBpZiAoIWlucHV0UmVjdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHhJblBpeGVscyA9IE1hdGgucm91bmQoKGlucHV0UmVjdC5sZWZ0ICsgaW5wdXRSZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IpICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIGNvbnN0IGNlbnRlcllJblBpeGVscyA9IE1hdGgucm91bmQoKGlucHV0UmVjdC50b3AgKyBpbnB1dFJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IpICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIGNvbnN0IHRvcE9mZnNldEluUGl4ZWxzID0gTWF0aC5yb3VuZChzY3JlZW5ZICogZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgaWYgKHRvcE9mZnNldEluUGl4ZWxzID09PSAwKSB7XG4gICAgcmV0dXJuIFt7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfV07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyArIHRvcE9mZnNldEluUGl4ZWxzIH0sXG4gICAgeyB4SW5QaXhlbHMsIHlJblBpeGVsczogY2VudGVyWUluUGl4ZWxzIH1cbiAgXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlJTyxNQUFNLDRDQUE0QztBQUt6RCxNQUFNLDZCQUE2QjtBQUtuQyxNQUFNLGlCQUFpQjtBQVdoQixTQUFTLG1DQUFtQyxRQUEwRDtBQUMzRyxRQUFNLEVBQUUsVUFBVSxJQUFJLE9BQU87QUFDN0IsUUFBTSxjQUFjLFlBQVksVUFBVSxNQUFNLFVBQVUsU0FBUztBQUVuRSxTQUFPO0FBQUEsSUFDTCxrRkFBa0YsT0FBTyxjQUFjO0FBQUEsSUFDdkcscUJBQXFCLE9BQU8sT0FBTyxTQUFTLFdBQVcsQ0FBQyxnQkFBZ0IsZ0JBQWdCLE9BQU8sZUFBZSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pJLFdBQVcsT0FBTyxvQkFBb0Isa0NBQWtDO0FBQUEsRUFDMUUsRUFBRSxLQUFLLElBQUk7QUFDYjtBQVFPLFNBQVMsc0JBQXNCLFFBQThDO0FBQ2xGLFFBQU0sRUFBRSxVQUFVLElBQUksT0FBTztBQUM3QixNQUFJLENBQUMsV0FBVztBQUNkLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxPQUFPLFNBQVMsZUFBZSxVQUFVLE1BQU0sVUFBVSxVQUFVO0FBQzVFO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxNQUFJLHNCQUFzQixHQUFHO0FBQzNCLFdBQU8sQ0FBQyxFQUFFLFdBQVcsV0FBVyxnQkFBZ0IsQ0FBQztBQUFBLEVBQ25EO0FBRUEsU0FBTztBQUFBLElBQ0wsRUFBRSxXQUFXLFdBQVcsa0JBQWtCLGtCQUFrQjtBQUFBLElBQzVELEVBQUUsV0FBVyxXQUFXLGdCQUFnQjtBQUFBLEVBQzFDO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
84
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgYmVpbmcgdGhlIG9uZSByZWFkaW5nIHRoYXQgYW4gYWxyZWFkeS11cCBrZXlib2FyZCBhbHNvIHByb2R1Y2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gXG4gIF07XG5cbiAgaWYgKGxpZnQgPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCdUaGUgZmllbGQgZGlkIG5vdCBtb3ZlIGF0IGFsbC4gSWYgdGhlIGRldmljZSBzYXlzIHRoZSBrZXlib2FyZCBpcyBzaG93aW5nLCBpdCB3YXMgYWxyZWFkeSB1cCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoIFx1MjAxNCB0aGlzIGNoZWNrIGNhbm5vdCB0ZWxsIHRoYXQgZnJvbSBhIGZpZWxkIHRoYXQgbmV2ZXIgbGlmdHMuJyk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gaG93IGZhciB0aGUgZmllbGQgbW92ZWQuXG4gKlxuICogVGhlIHZlcmRpY3QgaXMgYSAqKmRlbHRhKio6IHRoZSBmaWVsZCBtdXN0IGhhdmUgcmlzZW4gZnJvbSB3aGVyZSBpdCBzYXQgYmVmb3JlIHRoZSB0b3VjaCwgYnkgYXQgbGVhc3RcbiAqIGBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsc2AuIE9ic2lkaWFuIE1vYmlsZSBsaWZ0cyB3aGF0ZXZlciBpcyBvbiBzY3JlZW4gdG8gbWFrZSByb29tIGZvciB0aGUgSU1FLFxuICogc28gYSBmaWVsZCB0aGF0IGhhcyBub3QgbW92ZWQgaGFzIGhhZCBubyBrZXlib2FyZCBhcnJpdmUgdW5kZXIgaXQgXHUyMDE0IHdoZXRoZXIgaXQgaXMgYSBib3R0b20tYW5jaG9yZWRcbiAqIHN1Z2dlc3RlciBvciBhIGNlbnRyZWQgbW9kYWwuXG4gKlxuICogKipUaGUgb25lIGNhc2UgdGhpcyBnZXRzIHdyb25nLCBkZWxpYmVyYXRlbHk6KiogYSBrZXlib2FyZCB0aGF0IHdhcyAqYWxyZWFkeSogdXAgYmVmb3JlIHRoZSBiYXNlbGluZSB3YXNcbiAqIHJlYWQuIFRoZSBmaWVsZCBoYXMgbm93aGVyZSBsZWZ0IHRvIGxpZnQgdG8sIHNvIHRoZSBhbnN3ZXIgaXMgYGZhbHNlYC4gTm8gYW1vdW50IG9mIGdlb21ldHJ5IHNlcGFyYXRlc1xuICogdGhhdCBmcm9tIGEgY2VudHJlZCBtb2RhbCB3aXRoIG5vIGtleWJvYXJkIFx1MjAxNCBib3RoIHJlYWQgYXMgXCJjbGVhciBvZiB0aGUgYm90dG9tIGFuZCBub3QgbW92aW5nXCIgXHUyMDE0IGFuZCBvZlxuICogdGhlIHR3byBwb3NzaWJsZSB3cm9uZyBhbnN3ZXJzLCBhIGxvdWQgYGZhbHNlYCBpcyB0aGUgb25lIHdvcnRoIGtlZXBpbmc6IGl0IGZhaWxzIGEgY2FwdHVyZSByYXRoZXIgdGhhblxuICogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2NyZWVuc2hvdCBvZiBhIGtleWJvYXJkIHRoYXQgaXMgbm90IHRoZXJlLiBSZWFkIHRoZSBiYXNlbGluZSB3aXRoIHRoZSBrZXlib2FyZFxuICogZG93biwgd2hpY2ggaXMgd2hhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICBpZiAodG9wT2Zmc2V0SW5QaXhlbHMgPT09IDApIHtcbiAgICByZXR1cm4gW3sgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyB9XTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyB4SW5QaXhlbHMsIHlJblBpeGVsczogY2VudGVyWUluUGl4ZWxzICsgdG9wT2Zmc2V0SW5QaXhlbHMgfSxcbiAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICBdO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBtZWFzdXJlbWVudCBmb3IgdGhlIGRpYWdub3N0aWMsIHNheWluZyBzbyByYXRoZXIgdGhhbiBwcmludGluZyBhIG51bWJlciB3aGVuIHRoZXJlIHdhcyBub25lLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtZWFzdXJlbWVudCwgb3IgYG51bGxgIHdoZW4gdGhlIGZpZWxkIHdhcyBub3Qgb24gc2NyZWVuIHRvIG1lYXN1cmUuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIHRleHQsIG9yIGAobm8gaW5wdXQpYC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TWVhc3VyZW1lbnQodmFsdWU6IG51bGwgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyAnKG5vIGlucHV0KScgOiBTdHJpbmcodmFsdWUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0tPLE1BQU0sNENBQTRDO0FBS3pELE1BQU0sNkJBQTZCO0FBS25DLE1BQU0saUJBQWlCO0FBYWhCLFNBQVMsbUNBQW1DLFFBQTBEO0FBQzNHLFFBQU0sY0FBYyxPQUFPLGlCQUFpQixXQUFXLE9BQU87QUFDOUQsUUFBTSxhQUFhLE9BQU8sU0FBUyxXQUFXLE9BQU87QUFDckQsUUFBTSxPQUFPLGdCQUFnQixRQUFRLGVBQWUsT0FBTyxPQUFPLGNBQWM7QUFFaEYsUUFBTSxRQUFRO0FBQUEsSUFDWixrRkFBa0YsT0FBTyxjQUFjO0FBQUEsSUFDdkcscUJBQXFCLE9BQU8sT0FBTyxTQUFTLFdBQVcsQ0FBQyxxQkFBcUIsa0JBQWtCLFdBQVcsQ0FBQyxhQUFhLGtCQUFrQixVQUFVLENBQUMsU0FBUyxrQkFBa0IsSUFBSSxDQUFDO0FBQUEsSUFDckwsV0FBVyxPQUFPLG9CQUFvQixrQ0FBa0M7QUFBQSxFQUMxRTtBQUVBLE1BQUksU0FBUyxHQUFHO0FBQ2QsVUFBTSxLQUFLLHVMQUFrTDtBQUFBLEVBQy9MO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQW9CTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxNQUFJLHNCQUFzQixHQUFHO0FBQzNCLFdBQU8sQ0FBQyxFQUFFLFdBQVcsV0FBVyxnQkFBZ0IsQ0FBQztBQUFBLEVBQ25EO0FBRUEsU0FBTztBQUFBLElBQ0wsRUFBRSxXQUFXLFdBQVcsa0JBQWtCLGtCQUFrQjtBQUFBLElBQzVELEVBQUUsV0FBVyxXQUFXLGdCQUFnQjtBQUFBLEVBQzFDO0FBQ0Y7QUFRQSxTQUFTLGtCQUFrQixPQUE4QjtBQUN2RCxTQUFPLFVBQVUsT0FBTyxlQUFlLE9BQU8sS0FBSztBQUNyRDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -8,9 +8,21 @@
8
8
  * and the modal container all stay at their full height with the keyboard shown
9
9
  * and `dumpsys input_method` reporting `mInputShown=true` — Obsidian Mobile keeps
10
10
  * a full-screen container and lifts its contents inside it. The only signal is
11
- * the field's own offset from the bottom, which is why the detection here is
12
- * geometric rather than an API call. Two runs failed on that before a framebuffer
13
- * dump said so, which is also why the diagnostic below exists.
11
+ * that the field *moves*, which is why the detection here is geometric rather
12
+ * than an API call. Two runs failed on that before a framebuffer dump said so,
13
+ * which is also why the diagnostic below exists.
14
+ *
15
+ * **The signal is a DELTA against a baseline read before the touch, not the
16
+ * field's absolute offset from the bottom.** The absolute offset was the original
17
+ * test and it is right only for a **bottom-anchored** field — a suggester, a
18
+ * command palette — where "clear of the bottom" and "lifted" are the same
19
+ * sentence. For a **centred modal** the condition is already true with no
20
+ * keyboard at all, so the test passed vacuously and `raiseSoftKeyboard` returned
21
+ * success having dispatched no touch (measured 2026-09-12 against a centred
22
+ * prompt modal: the field's `top` read `352.4453125` before and after real taps
23
+ * and the check said the keyboard was up both times). A delta is the same public
24
+ * API for both shapes, and it costs a field that cannot move its verdict — see
25
+ * {@link checkIsSoftKeyboardUp} for the one case that trades away.
14
26
  *
15
27
  * Pure and unit-tested; the touching and the capture live in `soft-keyboard`.
16
28
  */
@@ -18,6 +30,10 @@
18
30
  * Parameters for {@link buildSoftKeyboardDiagnosticMessage}.
19
31
  */
20
32
  export interface BuildSoftKeyboardDiagnosticMessageParams {
33
+ /**
34
+ * The geometry read before the first touch, which is what the verdict is measured against.
35
+ */
36
+ readonly baselineSnapshot: SoftKeyboardViewportSnapshot;
21
37
  /**
22
38
  * The lines of `dumpsys input_method` worth reading, as {@link parseInputMethodState} returned them.
23
39
  */
@@ -35,6 +51,13 @@ export interface BuildSoftKeyboardDiagnosticMessageParams {
35
51
  * Parameters for {@link checkIsSoftKeyboardUp}.
36
52
  */
37
53
  export interface CheckIsSoftKeyboardUpParams {
54
+ /**
55
+ * The geometry read **before** the first touch, with the keyboard still down.
56
+ *
57
+ * Required, and deliberately not optional: an absent baseline could only mean falling back to the
58
+ * absolute-offset test, which is the vacuous pass this parameter exists to make unrepresentable.
59
+ */
60
+ readonly baselineSnapshot: SoftKeyboardViewportSnapshot;
38
61
  /**
39
62
  * The least a raised keyboard lifts the field by, so a stray rounding pixel is not read as one.
40
63
  *
@@ -42,7 +65,7 @@ export interface CheckIsSoftKeyboardUpParams {
42
65
  */
43
66
  readonly minimumKeyboardHeightInPixels?: number;
44
67
  /**
45
- * The geometry to judge.
68
+ * The geometry to judge, read after the touch.
46
69
  */
47
70
  readonly snapshot: SoftKeyboardViewportSnapshot;
48
71
  }
@@ -123,17 +146,31 @@ export declare const DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS = 100;
123
146
  * Builds the message a failed raise reports.
124
147
  *
125
148
  * A bare "the keyboard did not come up" is unreadable — what the reader needs is what the page saw and what
126
- * the device thought, side by side, because the two disagreeing is the whole diagnosis.
149
+ * the device thought, side by side, because the two disagreeing is the whole diagnosis. The page's half is
150
+ * the lift and the two tops it came from, since the lift is the verdict; a lift of zero gets a sentence of
151
+ * its own, being the one reading that an already-up keyboard also produces.
127
152
  *
128
- * @param params - The evidence gathered after the last touch.
153
+ * @param params - The evidence gathered before the first touch and after the last one.
129
154
  * @returns The message, ready to throw.
130
155
  */
131
156
  export declare function buildSoftKeyboardDiagnosticMessage(params: BuildSoftKeyboardDiagnosticMessageParams): string;
132
157
  /**
133
- * Decides whether the IME is up, from the page's own geometry.
158
+ * Decides whether the IME is up, from how far the field moved.
159
+ *
160
+ * The verdict is a **delta**: the field must have risen from where it sat before the touch, by at least
161
+ * `minimumKeyboardHeightInPixels`. Obsidian Mobile lifts whatever is on screen to make room for the IME,
162
+ * so a field that has not moved has had no keyboard arrive under it — whether it is a bottom-anchored
163
+ * suggester or a centred modal.
164
+ *
165
+ * **The one case this gets wrong, deliberately:** a keyboard that was *already* up before the baseline was
166
+ * read. The field has nowhere left to lift to, so the answer is `false`. No amount of geometry separates
167
+ * that from a centred modal with no keyboard — both read as "clear of the bottom and not moving" — and of
168
+ * the two possible wrong answers, a loud `false` is the one worth keeping: it fails a capture rather than
169
+ * silently returning a screenshot of a keyboard that is not there. Read the baseline with the keyboard
170
+ * down, which is what `raiseSoftKeyboard` does.
134
171
  *
135
- * @param params - The geometry to judge, and how far the field must have lifted.
136
- * @returns Whether the field has stopped short of the bottom to make room for a keyboard.
172
+ * @param params - The geometry before and after the touch, and how far the field must have lifted.
173
+ * @returns Whether the field lifted far enough to have made room for a keyboard.
137
174
  */
138
175
  export declare function checkIsSoftKeyboardUp(params: CheckIsSoftKeyboardUpParams): boolean;
139
176
  /**
@@ -43,7 +43,8 @@ var import_soft_keyboard_geometry = require("./soft-keyboard-geometry.cjs");
43
43
  const DEFAULT_DIAGNOSTICS_DIRECTORY = (0, import_node_path.join)(import_node_process.default.cwd(), "dist", "screenshots");
44
44
  const KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS = 1500;
45
45
  async function raiseSoftKeyboard(params) {
46
- let snapshot = await readSoftKeyboardViewport(params);
46
+ const baselineSnapshot = await readSoftKeyboardViewport(params);
47
+ let snapshot = baselineSnapshot;
47
48
  if (!snapshot.inputRect) {
48
49
  throw new Error(`raiseSoftKeyboard: nothing matches "${params.inputSelector}", so there is no field to touch.`);
49
50
  }
@@ -56,11 +57,12 @@ async function raiseSoftKeyboard(params) {
56
57
  snapshot = await readSoftKeyboardViewport(params);
57
58
  }
58
59
  if (!checkIsUp(snapshot)) {
59
- throw new Error(await buildFailureMessage(params, snapshot));
60
+ throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
60
61
  }
61
62
  return snapshot;
62
63
  function checkIsUp(current) {
63
64
  return (0, import_soft_keyboard_geometry.checkIsSoftKeyboardUp)({
65
+ baselineSnapshot,
64
66
  ...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
65
67
  snapshot: current
66
68
  });
@@ -72,7 +74,7 @@ async function tapDevice(params) {
72
74
  deviceId: params.deviceId
73
75
  });
74
76
  }
75
- async function buildFailureMessage(params, snapshot) {
77
+ async function buildFailureMessage(params, baselineSnapshot, snapshot) {
76
78
  const diagnosticsDirectory = params.diagnosticsDirectory ?? DEFAULT_DIAGNOSTICS_DIRECTORY;
77
79
  (0, import_node_fs.mkdirSync)(diagnosticsDirectory, { recursive: true });
78
80
  const screenshotPath = (0, import_node_path.join)(diagnosticsDirectory, "keyboard-not-raised.png");
@@ -82,6 +84,7 @@ async function buildFailureMessage(params, snapshot) {
82
84
  deviceId: params.deviceId
83
85
  });
84
86
  return (0, import_soft_keyboard_geometry.buildSoftKeyboardDiagnosticMessage)({
87
+ baselineSnapshot,
85
88
  inputMethodState: (0, import_soft_keyboard_geometry.parseInputMethodState)(dumpsysOutput),
86
89
  screenshotPath,
87
90
  snapshot
@@ -115,4 +118,4 @@ async function readSoftKeyboardViewport(params) {
115
118
  raiseSoftKeyboard,
116
119
  tapDevice
117
120
  });
118
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogVGhlIGdlb21ldHJ5IHRoYXQgZGVjaWRlcyB3aGV0aGVyIGl0IHdvcmtlZCBpcyB1bml0LXRlc3RlZCBpblxuICogYHNvZnQta2V5Ym9hcmQtZ2VvbWV0cnlgOyBldmVyeXRoaW5nIGhlcmUgZHJpdmVzIGEgcmVhbCBkZXZpY2UsIHNvIHRoZSB3aG9sZVxuICogbW9kdWxlIGlzIGludGVncmF0aW9uLXRpbWUgY29kZS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChkcml2ZXMgYSBsaXZlIE9ic2lkaWFuIG9uIGEgcmVhbCBkZXZpY2UpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVsZW1lbnRSZWN0LFxuICBTb2Z0S2V5Ym9hcmRUYXBQb2ludCxcbiAgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdFxufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkuY2pzJztcblxuaW1wb3J0IHsgcnVuQWRiVGV4dCB9IGZyb20gJy4vYWRiLmNqcyc7XG5pbXBvcnQgeyBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCB9IGZyb20gJy4vZGV2aWNlLXNjcmVlbnNob3QuY2pzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5pbXBvcnQge1xuICBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIHBhcnNlSW5wdXRNZXRob2RTdGF0ZSxcbiAgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1xufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmFpc2VTb2Z0S2V5Ym9hcmR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IHdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGl0IGlzIGBkaXN0L3NjcmVlbnNob3RzYCB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgXHUyMDE0IHJlc29sdmVkIGF0IGxvYWQsIHNvIHRoZXJlIGlzIG5vXG4gICAqIGxpdGVyYWwgZGVmYXVsdCB0byBzdGF0ZSBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1Mgc2VsZWN0b3Igb2YgdGhlIGZpZWxkIHRvIHRvdWNoLCBlLmcuIGAucHJvbXB0LWlucHV0YC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VsZWN0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieS5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFNgIGZyb20gYHNvZnQta2V5Ym9hcmQtZ2VvbWV0cnlgIGFwcGxpZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHRvIHJlYWQgdGhlIGdlb21ldHJ5IGZyb20uIFdoZW4gb21pdHRlZCwgdGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGFwRGV2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBEZXZpY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHRvdWNoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnQ6IFNvZnRLZXlib2FyZFRhcFBvaW50O1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgbGVhdmVzIGl0cyBldmlkZW5jZSBcdTIwMTQgZ2l0aWdub3JlZCBhY3Jvc3MgdGhlIGZsZWV0LCBsaWtlIHRoZSBjYXB0dXJlIHNjcmF0Y2ggZmlsZXMuXG4gKi9cbmNvbnN0IERFRkFVTFRfRElBR05PU1RJQ1NfRElSRUNUT1JZID0gam9pbihwcm9jZXNzLmN3ZCgpLCAnZGlzdCcsICdzY3JlZW5zaG90cycpO1xuXG4vKipcbiAqIEhvdyBsb25nIHRoZSBJTUUgdGFrZXMgdG8gZmluaXNoIGFuaW1hdGluZyBpbiwgYWZ0ZXIgd2hpY2ggdGhlIGxheW91dCBoYXMgc2V0dGxlZC5cbiAqL1xuY29uc3QgS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDE1MDA7XG5cbi8qKlxuICogUmFpc2VzIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQgd2l0aCBhIHJlYWwgdG91Y2ggb24gYSBmaWVsZCwgYW5kIGNvbmZpcm1zIGl0IGNhbWUgdXAuXG4gKlxuICogQ2FsbCBpdCBpbnNpZGUgYHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkYCBcdTIwMTQgdGhlIGRldmljZSBzZXR0aW5nIGFsb25lIGRvZXMgbm90IHJhaXNlIHRoZSBrZXlib2FyZCwgYW5kIHRoaXNcbiAqIHRvdWNoIGFsb25lIGNhbm5vdCB3aGlsZSB0aGUgc2V0dGluZyBzdXBwcmVzc2VzIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBrZXlib2FyZCBuZXZlciBjYW1lIHVwLCBhZnRlciB3cml0aW5nIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIgYW5kIHRoZSBkZXZpY2UncyBvd25cbiAqICAgYGlucHV0X21ldGhvZGAgc3RhdGUgdG8gdGhlIGRpYWdub3N0aWNzIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhaXNlU29mdEtleWJvYXJkKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgbGV0IHNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG5cbiAgaWYgKCFzbmFwc2hvdC5pbnB1dFJlY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhaXNlU29mdEtleWJvYXJkOiBub3RoaW5nIG1hdGNoZXMgXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiLCBzbyB0aGVyZSBpcyBubyBmaWVsZCB0byB0b3VjaC5gKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcG9pbnQgb2YgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50cyh7IHNuYXBzaG90IH0pKSB7XG4gICAgaWYgKGNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IHRhcERldmljZSh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsIHBvaW50IH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIH1cblxuICBpZiAoIWNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgYnVpbGRGYWlsdXJlTWVzc2FnZShwYXJhbXMsIHNuYXBzaG90KSk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG5cbiAgZnVuY3Rpb24gY2hlY2tJc1VwKGN1cnJlbnQ6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hlY2tJc1NvZnRLZXlib2FyZFVwKHtcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZGV2aWNlIGF0IGEgcG9pbnQsIHRoZSB3YXkgYSB0aHVtYiB3b3VsZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgd2hlcmUgdG8gdG91Y2ggaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHRvdWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YXBEZXZpY2UocGFyYW1zOiBUYXBEZXZpY2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCBTdHJpbmcocGFyYW1zLnBvaW50LnhJblBpeGVscyksIFN0cmluZyhwYXJhbXMucG9pbnQueUluUGl4ZWxzKV0sXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgcmVhZHMgdGhlIGRldmljZSdzIGBpbnB1dF9tZXRob2RgIHN0YXRlLCB0aGVuIGNvbXBvc2VzIHRoZSBmYWlsdXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5LlxuICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYWZ0ZXIgdGhlIGxhc3QgdG91Y2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtZXNzYWdlIHRvIHRocm93LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsIHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NEaXJlY3RvcnkgPSBwYXJhbXMuZGlhZ25vc3RpY3NEaXJlY3RvcnkgPz8gREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlk7XG4gIG1rZGlyU3luYyhkaWFnbm9zdGljc0RpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBqb2luKGRpYWdub3N0aWNzRGlyZWN0b3J5LCAna2V5Ym9hcmQtbm90LXJhaXNlZC5wbmcnKTtcbiAgd3JpdGVGaWxlU3luYyhzY3JlZW5zaG90UGF0aCwgYXdhaXQgY2FwdHVyZURldmljZVNjcmVlbnNob3QoeyBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkIH0pKTtcblxuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGlucHV0TWV0aG9kU3RhdGU6IHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0KSxcbiAgICBzY3JlZW5zaG90UGF0aCxcbiAgICBzbmFwc2hvdFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGF0IHRoZSByZW5kZXJlciBrbm93cyBhYm91dCBpdHMgb3duIGdlb21ldHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbWVhc3VyZSBhbmQgdGhlIHZhdWx0IHRvIHJlYWQgaXQgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZpZXdwb3J0IGFuZCB0aGUgZmllbGQncyByZWN0LCBpbiBDU1MgcGl4ZWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIFRoaXMgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGFuZCBldmFsdWF0ZWQgaW4gdGhlIHJlbmRlcmVyLCBzbyBhIGhlbHBlciBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSB3b3VsZCBub3QgZXhpc3QgdGhlcmUuXG4gICAgICBmdW5jdGlvbiB0b1JlY3QocmVjdDogRE9NUmVjdCk6IEVsZW1lbnRSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZVBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICBpbm5lckhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgICBpbnB1dFJlY3Q6IGlucHV0RWwgPyB0b1JlY3QoaW5wdXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkgOiBudWxsLFxuICAgICAgICBzY3JlZW5ZOiB3aW5kb3cuc2NyZWVuWVxuICAgICAgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQkEscUJBR087QUFDUCx1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLHNCQUFvQztBQVFwQyxpQkFBMkI7QUFDM0IsK0JBQXdDO0FBQ3hDLDhCQUErQjtBQUMvQixvQ0FLTztBQXVEUCxNQUFNLG9DQUFnQyx1QkFBSyxvQkFBQUEsUUFBUSxJQUFJLEdBQUcsUUFBUSxhQUFhO0FBSy9FLE1BQU0sd0NBQXdDO0FBYTlDLGVBQXNCLGtCQUFrQixRQUF3RTtBQUM5RyxNQUFJLFdBQVcsTUFBTSx5QkFBeUIsTUFBTTtBQUVwRCxNQUFJLENBQUMsU0FBUyxXQUFXO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLHVDQUF1QyxPQUFPLGFBQWEsbUNBQW1DO0FBQUEsRUFDaEg7QUFFQSxhQUFXLGFBQVMsNERBQTZCLEVBQUUsU0FBUyxDQUFDLEdBQUc7QUFDOUQsUUFBSSxVQUFVLFFBQVEsR0FBRztBQUN2QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQVUsRUFBRSxVQUFVLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDcEQsY0FBTSxnQkFBQUMsWUFBTSxxQ0FBcUM7QUFDakQsZUFBVyxNQUFNLHlCQUF5QixNQUFNO0FBQUEsRUFDbEQ7QUFFQSxNQUFJLENBQUMsVUFBVSxRQUFRLEdBQUc7QUFDeEIsVUFBTSxJQUFJLE1BQU0sTUFBTSxvQkFBb0IsUUFBUSxRQUFRLENBQUM7QUFBQSxFQUM3RDtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsZUFBTyxxREFBc0I7QUFBQSxNQUMzQixHQUFJLE9BQU8sa0NBQWtDLFVBQWEsRUFBRSwrQkFBK0IsT0FBTyw4QkFBOEI7QUFBQSxNQUNoSSxVQUFVO0FBQUEsSUFDWixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBUUEsZUFBc0IsVUFBVSxRQUF3QztBQUN0RSxZQUFNLHVCQUFXO0FBQUEsSUFDZixrQkFBa0IsQ0FBQyxTQUFTLFNBQVMsT0FBTyxPQUFPLE9BQU8sTUFBTSxTQUFTLEdBQUcsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDMUcsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBU0EsZUFBZSxvQkFBb0IsUUFBaUMsVUFBeUQ7QUFDM0gsUUFBTSx1QkFBdUIsT0FBTyx3QkFBd0I7QUFDNUQsZ0NBQVUsc0JBQXNCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFFbkQsUUFBTSxxQkFBaUIsdUJBQUssc0JBQXNCLHlCQUF5QjtBQUMzRSxvQ0FBYyxnQkFBZ0IsVUFBTSxrREFBd0IsRUFBRSxVQUFVLE9BQU8sU0FBUyxDQUFDLENBQUM7QUFFMUYsUUFBTSxnQkFBZ0IsVUFBTSx1QkFBVztBQUFBLElBQ3JDLGtCQUFrQixDQUFDLFNBQVMsV0FBVyxjQUFjO0FBQUEsSUFDckQsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUVELGFBQU8sa0VBQW1DO0FBQUEsSUFDeEMsc0JBQWtCLHFEQUFzQixhQUFhO0FBQUEsSUFDckQ7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRQSxlQUFlLHlCQUF5QixRQUF3RTtBQUM5RyxTQUFPLFVBQU0sd0NBQWU7QUFBQSxJQUMxQixTQUFTLEVBQUUsY0FBYyxHQUFpQztBQUN4RCxZQUFNLFVBQVUsU0FBUyxjQUFjLGFBQWE7QUFHcEQsZUFBUyxPQUFPLE1BQTRCO0FBQzFDLGVBQU87QUFBQSxVQUNMLFFBQVEsS0FBSztBQUFBLFVBQ2IsTUFBTSxLQUFLO0FBQUEsVUFDWCxLQUFLLEtBQUs7QUFBQSxVQUNWLE9BQU8sS0FBSztBQUFBLFFBQ2Q7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLFFBQ0wsa0JBQWtCLE9BQU87QUFBQSxRQUN6QixhQUFhLE9BQU87QUFBQSxRQUNwQixXQUFXLFVBQVUsT0FBTyxRQUFRLHNCQUFzQixDQUFDLElBQUk7QUFBQSxRQUMvRCxTQUFTLE9BQU87QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sRUFBRSxlQUFlLE9BQU8sY0FBYztBQUFBLElBQzdDLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQ3RFLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsicHJvY2VzcyIsICJzbGVlcCJdCn0K
121
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5janMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc1NvZnRLZXlib2FyZFVwLFxuICBwYXJzZUlucHV0TWV0aG9kU3RhdGUsXG4gIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIHRvIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgYSBmYWlsZWQgYXR0ZW1wdCB3cml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlci5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBpdCBpcyBgZGlzdC9zY3JlZW5zaG90c2AgdW5kZXIgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IFx1MjAxNCByZXNvbHZlZCBhdCBsb2FkLCBzbyB0aGVyZSBpcyBub1xuICAgKiBsaXRlcmFsIGRlZmF1bHQgdG8gc3RhdGUgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIHNlbGVjdG9yIG9mIHRoZSBmaWVsZCB0byB0b3VjaCwgZS5nLiBgLnByb21wdC1pbnB1dGAuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNlbGVjdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsZWFzdCBhIHJhaXNlZCBrZXlib2FyZCBsaWZ0cyB0aGUgZmllbGQgYnkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTYCBmcm9tIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YCBhcHBsaWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0byByZWFkIHRoZSBnZW9tZXRyeSBmcm9tLiBXaGVuIG9taXR0ZWQsIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCdzIHZhdWx0IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRhcERldmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwRGV2aWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byB0b3VjaCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50OiBTb2Z0S2V5Ym9hcmRUYXBQb2ludDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBpdHMgZXZpZGVuY2UgXHUyMDE0IHVuZGVyIGBkaXN0L2AsIHdoaWNoIGEgcGx1Z2luIHJlcG8gdXNpbmcgdGhpcyBoYXJuZXNzIGdpdGlnbm9yZXMsIGxpa2UgdGhlIGNhcHR1cmUgc2NyYXRjaCBmaWxlcy5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlkgPSBqb2luKHByb2Nlc3MuY3dkKCksICdkaXN0JywgJ3NjcmVlbnNob3RzJyk7XG5cbi8qKlxuICogSG93IGxvbmcgdGhlIElNRSB0YWtlcyB0byBmaW5pc2ggYW5pbWF0aW5nIGluLCBhZnRlciB3aGljaCB0aGUgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICovXG5jb25zdCBLRVlCT0FSRF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTUwMDtcblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipDYWxsIGl0IHdpdGggdGhlIGtleWJvYXJkIERPV04uKiogVGhlIGZpcnN0IHJlYWQgaXMgdGhlIGJhc2VsaW5lIGV2ZXJ5IGxhdGVyIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCxcbiAqIHNvIGEga2V5Ym9hcmQgdGhhdCBpcyBhbHJlYWR5IHVwIGxlYXZlcyB0aGUgZmllbGQgbm90aGluZyB0byBsaWZ0IGJ5IGFuZCB0aGlzIHRocm93cy4gVGhhdCBpcyB0aGVcbiAqIGRlbGliZXJhdGUgdHJhZGUgZm9yIHdvcmtpbmcgb24gYSBjZW50cmVkIG1vZGFsIGFzIHdlbGwgYXMgYSBib3R0b20tYW5jaG9yZWQgb25lIFx1MjAxNCBzZWVcbiAqIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWVsZCBuZXZlciBtYXRjaGVkLCBvciBpZiBpdCBuZXZlciBsaWZ0ZWQsIHRoZSBsYXR0ZXIgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZGV2aWNlIGF0IGEgcG9pbnQsIHRoZSB3YXkgYSB0aHVtYiB3b3VsZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgd2hlcmUgdG8gdG91Y2ggaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHRvdWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YXBEZXZpY2UocGFyYW1zOiBUYXBEZXZpY2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCBTdHJpbmcocGFyYW1zLnBvaW50LnhJblBpeGVscyksIFN0cmluZyhwYXJhbXMucG9pbnQueUluUGl4ZWxzKV0sXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgcmVhZHMgdGhlIGRldmljZSdzIGBpbnB1dF9tZXRob2RgIHN0YXRlLCB0aGVuIGNvbXBvc2VzIHRoZSBmYWlsdXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5LlxuICogQHBhcmFtIGJhc2VsaW5lU25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoLCB3aGljaCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYWZ0ZXIgdGhlIGxhc3QgdG91Y2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtZXNzYWdlIHRvIHRocm93LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEZhaWx1cmVNZXNzYWdlKFxuICBwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLFxuICBiYXNlbGluZVNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90LFxuICBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NEaXJlY3RvcnkgPSBwYXJhbXMuZGlhZ25vc3RpY3NEaXJlY3RvcnkgPz8gREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlk7XG4gIG1rZGlyU3luYyhkaWFnbm9zdGljc0RpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBqb2luKGRpYWdub3N0aWNzRGlyZWN0b3J5LCAna2V5Ym9hcmQtbm90LXJhaXNlZC5wbmcnKTtcbiAgd3JpdGVGaWxlU3luYyhzY3JlZW5zaG90UGF0aCwgYXdhaXQgY2FwdHVyZURldmljZVNjcmVlbnNob3QoeyBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkIH0pKTtcblxuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgaW5wdXRNZXRob2RTdGF0ZTogcGFyc2VJbnB1dE1ldGhvZFN0YXRlKGR1bXBzeXNPdXRwdXQpLFxuICAgIHNjcmVlbnNob3RQYXRoLFxuICAgIHNuYXBzaG90XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBtZWFzdXJlIGFuZCB0aGUgdmF1bHQgdG8gcmVhZCBpdCBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmlld3BvcnQgYW5kIHRoZSBmaWVsZCdzIHJlY3QsIGluIENTUyBwaXhlbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTb2Z0S2V5Ym9hcmRWaWV3cG9ydChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90IHtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gVGhpcyBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgYW5kIGV2YWx1YXRlZCBpbiB0aGUgcmVuZGVyZXIsIHNvIGEgaGVscGVyIGhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHdvdWxkIG5vdCBleGlzdCB0aGVyZS5cbiAgICAgIGZ1bmN0aW9uIHRvUmVjdChyZWN0OiBET01SZWN0KTogRWxlbWVudFJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIGlubmVySGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgIGlucHV0UmVjdDogaW5wdXRFbCA/IHRvUmVjdChpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSA6IG51bGwsXG4gICAgICAgIHNjcmVlblk6IHdpbmRvdy5zY3JlZW5ZXG4gICAgICB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQStCQSxxQkFHTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFDcEIsc0JBQW9DO0FBUXBDLGlCQUEyQjtBQUMzQiwrQkFBd0M7QUFDeEMsOEJBQStCO0FBQy9CLG9DQUtPO0FBdURQLE1BQU0sb0NBQWdDLHVCQUFLLG9CQUFBQSxRQUFRLElBQUksR0FBRyxRQUFRLGFBQWE7QUFLL0UsTUFBTSx3Q0FBd0M7QUFrQjlDLGVBQXNCLGtCQUFrQixRQUF3RTtBQUM5RyxRQUFNLG1CQUFtQixNQUFNLHlCQUF5QixNQUFNO0FBQzlELE1BQUksV0FBVztBQUVmLE1BQUksQ0FBQyxTQUFTLFdBQVc7QUFDdkIsVUFBTSxJQUFJLE1BQU0sdUNBQXVDLE9BQU8sYUFBYSxtQ0FBbUM7QUFBQSxFQUNoSDtBQUVBLGFBQVcsYUFBUyw0REFBNkIsRUFBRSxTQUFTLENBQUMsR0FBRztBQUM5RCxRQUFJLFVBQVUsUUFBUSxHQUFHO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBVSxFQUFFLFVBQVUsT0FBTyxVQUFVLE1BQU0sQ0FBQztBQUNwRCxjQUFNLGdCQUFBQyxZQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsZUFBTyxxREFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQVFBLGVBQXNCLFVBQVUsUUFBd0M7QUFDdEUsWUFBTSx1QkFBVztBQUFBLElBQ2Ysa0JBQWtCLENBQUMsU0FBUyxTQUFTLE9BQU8sT0FBTyxPQUFPLE1BQU0sU0FBUyxHQUFHLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUFBLElBQzFHLFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFDSDtBQVVBLGVBQWUsb0JBQ2IsUUFDQSxrQkFDQSxVQUNpQjtBQUNqQixRQUFNLHVCQUF1QixPQUFPLHdCQUF3QjtBQUM1RCxnQ0FBVSxzQkFBc0IsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUVuRCxRQUFNLHFCQUFpQix1QkFBSyxzQkFBc0IseUJBQXlCO0FBQzNFLG9DQUFjLGdCQUFnQixVQUFNLGtEQUF3QixFQUFFLFVBQVUsT0FBTyxTQUFTLENBQUMsQ0FBQztBQUUxRixRQUFNLGdCQUFnQixVQUFNLHVCQUFXO0FBQUEsSUFDckMsa0JBQWtCLENBQUMsU0FBUyxXQUFXLGNBQWM7QUFBQSxJQUNyRCxVQUFVLE9BQU87QUFBQSxFQUNuQixDQUFDO0FBRUQsYUFBTyxrRUFBbUM7QUFBQSxJQUN4QztBQUFBLElBQ0Esc0JBQWtCLHFEQUFzQixhQUFhO0FBQUEsSUFDckQ7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRQSxlQUFlLHlCQUF5QixRQUF3RTtBQUM5RyxTQUFPLFVBQU0sd0NBQWU7QUFBQSxJQUMxQixTQUFTLEVBQUUsY0FBYyxHQUFpQztBQUN4RCxZQUFNLFVBQVUsU0FBUyxjQUFjLGFBQWE7QUFHcEQsZUFBUyxPQUFPLE1BQTRCO0FBQzFDLGVBQU87QUFBQSxVQUNMLFFBQVEsS0FBSztBQUFBLFVBQ2IsTUFBTSxLQUFLO0FBQUEsVUFDWCxLQUFLLEtBQUs7QUFBQSxVQUNWLE9BQU8sS0FBSztBQUFBLFFBQ2Q7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLFFBQ0wsa0JBQWtCLE9BQU87QUFBQSxRQUN6QixhQUFhLE9BQU87QUFBQSxRQUNwQixXQUFXLFVBQVUsT0FBTyxRQUFRLHNCQUFzQixDQUFDLElBQUk7QUFBQSxRQUMvRCxTQUFTLE9BQU87QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sRUFBRSxlQUFlLE9BQU8sY0FBYztBQUFBLElBQzdDLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQ3RFLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsicHJvY2VzcyIsICJzbGVlcCJdCn0K
@@ -13,6 +13,15 @@
13
13
  * real touch, and a run with the setting flipped and no touch comes back with
14
14
  * exactly the empty band it had before. `adb shell input tap` is that gesture.
15
15
  *
16
+ * 3. The proof that it arrived is that the field **moved**, measured against a
17
+ * baseline read here before the first touch. An absolute offset from the
18
+ * viewport bottom is the same test only for a bottom-anchored field; for a
19
+ * centred modal it is already true with no keyboard, which used to break the
20
+ * loop below before it had dispatched a single touch and return success
21
+ * having done nothing. Reading the baseline first also makes that shape
22
+ * unrepresentable rather than merely corrected: the delta of the baseline
23
+ * against itself is zero, so the first iteration always taps.
24
+ *
16
25
  * The geometry that decides whether it worked is unit-tested in
17
26
  * `soft-keyboard-geometry`; everything here drives a real device, so the whole
18
27
  * module is integration-time code.
@@ -67,10 +76,15 @@ export interface TapDeviceParams {
67
76
  * Call it inside `withSoftKeyboardEnabled` — the device setting alone does not raise the keyboard, and this
68
77
  * touch alone cannot while the setting suppresses it.
69
78
  *
79
+ * **Call it with the keyboard DOWN.** The first read is the baseline every later read is compared against,
80
+ * so a keyboard that is already up leaves the field nothing to lift by and this throws. That is the
81
+ * deliberate trade for working on a centred modal as well as a bottom-anchored one — see
82
+ * {@link checkIsSoftKeyboardUp}.
83
+ *
70
84
  * @param params - The device, the field to touch, and how far it must lift.
71
85
  * @returns A {@link Promise} that resolves to the geometry read once the keyboard is up.
72
- * @throws Error if the keyboard never came up, after writing the device framebuffer and the device's own
73
- * `input_method` state to the diagnostics directory.
86
+ * @throws Error if the field never matched, or if it never lifted, the latter after writing the device
87
+ * framebuffer and the device's own `input_method` state to the diagnostics directory.
74
88
  */
75
89
  export declare function raiseSoftKeyboard(params: RaiseSoftKeyboardParams): Promise<SoftKeyboardViewportSnapshot>;
76
90
  /**