obsidian-integration-testing 15.0.0 → 17.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.
- package/dist/lib/cjs/adb.cjs +2 -2
- package/dist/lib/cjs/adb.d.cts +10 -0
- package/dist/lib/cjs/avd-name-channel.cjs +74 -0
- package/dist/lib/cjs/avd-name-channel.d.cts +152 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +11 -4
- package/dist/lib/cjs/avd-probe-verdict.d.cts +7 -0
- package/dist/lib/cjs/device-screenshot.cjs +1 -1
- package/dist/lib/cjs/device-screenshot.d.cts +3 -1
- package/dist/lib/cjs/emulator-backend.cjs +22 -1
- package/dist/lib/cjs/emulator-backend.d.cts +81 -0
- package/dist/lib/cjs/emulator-reclaim.cjs +78 -34
- package/dist/lib/cjs/emulator-reclaim.d.cts +57 -9
- package/dist/lib/cjs/enable-plugin.cjs +17 -8
- package/dist/lib/cjs/enable-plugin.d.cts +3 -1
- package/dist/lib/cjs/host-process-query-verdict.cjs +103 -0
- package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
- package/dist/lib/cjs/index.cjs +14 -1
- package/dist/lib/cjs/index.d.cts +3 -1
- package/dist/lib/cjs/label-screenshot.cjs +2 -2
- package/dist/lib/cjs/launched-device-selection.cjs +46 -0
- package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
- package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
- package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
- package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
- package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
- package/dist/lib/cjs/sharp-loader.cjs +1 -1
- package/dist/lib/cjs/sharp-loader.d.cts +67 -2
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
- package/dist/lib/cjs/soft-keyboard.cjs +130 -28
- package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
- package/dist/lib/cjs/transport-appium.cjs +74 -4
- package/dist/lib/cjs/transport-appium.d.cts +49 -2
- package/dist/lib/cjs/transport-factory.cjs +162 -42
- package/dist/lib/esm/adb.d.mts +10 -0
- package/dist/lib/esm/adb.mjs +2 -2
- package/dist/lib/esm/avd-name-channel.d.mts +152 -0
- package/dist/lib/esm/avd-name-channel.mjs +45 -0
- package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
- package/dist/lib/esm/device-screenshot.d.mts +3 -1
- package/dist/lib/esm/device-screenshot.mjs +1 -1
- package/dist/lib/esm/emulator-backend.d.mts +81 -0
- package/dist/lib/esm/emulator-backend.mjs +19 -1
- package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
- package/dist/lib/esm/emulator-reclaim.mjs +84 -36
- package/dist/lib/esm/enable-plugin.d.mts +3 -1
- package/dist/lib/esm/enable-plugin.mjs +17 -8
- package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
- package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
- package/dist/lib/esm/index.d.mts +3 -1
- package/dist/lib/esm/index.mjs +15 -1
- package/dist/lib/esm/label-screenshot.mjs +2 -2
- package/dist/lib/esm/launched-device-selection.d.mts +112 -0
- package/dist/lib/esm/launched-device-selection.mjs +21 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
- package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
- package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
- package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
- package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
- package/dist/lib/esm/sharp-loader.d.mts +67 -2
- package/dist/lib/esm/sharp-loader.mjs +1 -1
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
- package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
- package/dist/lib/esm/soft-keyboard.d.mts +65 -6
- package/dist/lib/esm/soft-keyboard.mjs +131 -28
- package/dist/lib/esm/transport-appium.d.mts +49 -2
- package/dist/lib/esm/transport-appium.mjs +74 -4
- package/dist/lib/esm/transport-factory.mjs +176 -44
- package/package.json +1 -1
|
@@ -22,6 +22,30 @@
|
|
|
22
22
|
* unrepresentable rather than merely corrected: the delta of the baseline
|
|
23
23
|
* against itself is zero, so the first iteration always taps.
|
|
24
24
|
*
|
|
25
|
+
* **A keyboard ALREADY up is put down first**, because a delta cannot see
|
|
26
|
+
* one: the field has already lifted, so it reads as a field that never moved.
|
|
27
|
+
* That was every frame after the first of a suite that takes several — the
|
|
28
|
+
* keyboard left up by one frame, or brought back by Obsidian focusing the
|
|
29
|
+
* next modal's field, made the next baseline already-lifted (measured
|
|
30
|
+
* 2026-09-20: frames 2-5 each failed `lift=0` beside `mInputShown=true`,
|
|
31
|
+
* each framebuffer showing a correctly lifted field under a fully drawn
|
|
32
|
+
* keyboard). The alternative was to accept `lift=0` whenever the device says
|
|
33
|
+
* a keyboard is showing, and it was refused: that is a frame the helper did
|
|
34
|
+
* not prove, which is the vacuous pass the delta was introduced to end,
|
|
35
|
+
* re-opened by a different door. So the device is asked, a showing IME is
|
|
36
|
+
* retracted with `KEYCODE_BACK`, and the lift is proved as before. It has to
|
|
37
|
+
* happen HERE, not after the previous capture: lowering it there was tried,
|
|
38
|
+
* and the IME came back on its own before the next baseline was read.
|
|
39
|
+
*
|
|
40
|
+
* 4. **That touch draws a selection handle when it lands inside TEXT**, and a
|
|
41
|
+
* device capture photographs it. Chromium shows the insertion handle on a tap
|
|
42
|
+
* into text and none on a tap into an EMPTY editable, and a value written by
|
|
43
|
+
* script raises none at all — so the field is emptied for the touch and its
|
|
44
|
+
* text written back afterwards. `obsidian-link-picker` shipped a teal handle
|
|
45
|
+
* in a store listing image twice before anyone worked out where it came from,
|
|
46
|
+
* and nothing in this module's own documentation of the touch hinted at it.
|
|
47
|
+
* See `shouldEmptyFieldForTouch`.
|
|
48
|
+
*
|
|
25
49
|
* The geometry that decides whether it worked is unit-tested in
|
|
26
50
|
* `soft-keyboard-geometry`; everything here drives a real device, so the whole
|
|
27
51
|
* module is integration-time code.
|
|
@@ -52,6 +76,25 @@ export interface RaiseSoftKeyboardParams {
|
|
|
52
76
|
* When omitted, `DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS` from `soft-keyboard-geometry` applies.
|
|
53
77
|
*/
|
|
54
78
|
readonly minimumKeyboardHeightInPixels?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Whether to empty the field before the touch, and write its text back afterwards.
|
|
81
|
+
*
|
|
82
|
+
* **On by default, because the touch that raises the keyboard also draws a selection handle when it
|
|
83
|
+
* lands inside TEXT.** Chromium shows the insertion handle on a tap into text and draws none on a tap
|
|
84
|
+
* into an EMPTY editable, and a device capture photographs it — which is how `obsidian-link-picker`
|
|
85
|
+
* shipped a teal handle in a store listing image twice before anyone understood where it came from. A
|
|
86
|
+
* value written by script raises no handle, so emptying the field, touching it, and writing the text
|
|
87
|
+
* back leaves the frame showing the same query with nothing hanging off it.
|
|
88
|
+
*
|
|
89
|
+
* Only an `<input>` or a `<textarea>` is emptied. A `contenteditable` holding text is REFUSED rather
|
|
90
|
+
* than written to: its content usually belongs to an editor that owns its own DOM, and blanking that
|
|
91
|
+
* by hand destroys it. Empty such a field yourself, or turn this off.
|
|
92
|
+
*
|
|
93
|
+
* Turning it off restores the pre-2026-09-23 behaviour exactly: the field is touched as it stands.
|
|
94
|
+
*
|
|
95
|
+
* @default true
|
|
96
|
+
*/
|
|
97
|
+
readonly shouldEmptyFieldForTouch?: boolean;
|
|
55
98
|
/**
|
|
56
99
|
* The vault to read the geometry from. When omitted, the current test context's vault is used.
|
|
57
100
|
*/
|
|
@@ -76,15 +119,31 @@ export interface TapDeviceParams {
|
|
|
76
119
|
* Call it inside `withSoftKeyboardEnabled` — the device setting alone does not raise the keyboard, and this
|
|
77
120
|
* touch alone cannot while the setting suppresses it.
|
|
78
121
|
*
|
|
79
|
-
* **
|
|
80
|
-
* so a keyboard
|
|
81
|
-
*
|
|
82
|
-
*
|
|
122
|
+
* **A keyboard that is already up is put DOWN first.** The first geometry read is the baseline every later
|
|
123
|
+
* read is compared against, so a keyboard already up would leave the field nothing to lift by and read as
|
|
124
|
+
* one that never came. The device is asked before anything else, and a showing IME is retracted with
|
|
125
|
+
* `KEYCODE_BACK` — asked FIRST because, with no IME showing, that key reaches the app and closes the very
|
|
126
|
+
* modal the frame is about to photograph. So the helper is safe to call once per frame of a multi-frame
|
|
127
|
+
* suite, and every call still proves its own lift. The other answer — accepting a zero lift whenever the
|
|
128
|
+
* device reports a keyboard — was refused, because it accepts a frame the helper did not prove.
|
|
129
|
+
*
|
|
130
|
+
* **The field is EMPTIED for the touch and written back afterwards**, because a touch that lands inside
|
|
131
|
+
* text draws Chromium's selection handle and the framebuffer photographs it — see
|
|
132
|
+
* {@link RaiseSoftKeyboardParams.shouldEmptyFieldForTouch}, which turns that off.
|
|
133
|
+
*
|
|
134
|
+
* **The geometry returned is read with the field still empty**, and the text is written back after it.
|
|
135
|
+
* That is the state the proven capture suites assert against, and it is deliberate rather than
|
|
136
|
+
* incidental: the baseline is read AFTER the field is emptied, so the lift is measured between two reads
|
|
137
|
+
* of the same field content. A field whose own text changes the layout around it — a suggester whose row
|
|
138
|
+
* count answers the query — moves when it is cleared, and a delta measured across that move is not a
|
|
139
|
+
* keyboard. Read the geometry again yourself if the restored text moves anything you are about to assert
|
|
140
|
+
* on.
|
|
83
141
|
*
|
|
84
142
|
* @param params - The device, the field to touch, and how far it must lift.
|
|
85
143
|
* @returns A {@link Promise} that resolves to the geometry read once the keyboard is up.
|
|
86
|
-
* @throws Error if
|
|
87
|
-
*
|
|
144
|
+
* @throws Error if a keyboard already up would not go down, if the field never matched, if it holds text
|
|
145
|
+
* this cannot empty and put back, or if it never lifted — the last after writing the device framebuffer
|
|
146
|
+
* and the device's own `input_method` state to the diagnostics directory.
|
|
88
147
|
*/
|
|
89
148
|
export declare function raiseSoftKeyboard(params: RaiseSoftKeyboardParams): Promise<SoftKeyboardViewportSnapshot>;
|
|
90
149
|
/**
|
|
@@ -10,36 +10,25 @@ import { captureDeviceScreenshot } from "./device-screenshot.mjs";
|
|
|
10
10
|
import { evalInObsidian } from "./eval-in-obsidian.mjs";
|
|
11
11
|
import {
|
|
12
12
|
buildSoftKeyboardDiagnosticMessage,
|
|
13
|
+
checkIsInputMethodShown,
|
|
13
14
|
checkIsSoftKeyboardUp,
|
|
14
15
|
parseInputMethodState,
|
|
15
16
|
resolveSoftKeyboardTapPoints
|
|
16
17
|
} from "./soft-keyboard-geometry.mjs";
|
|
17
18
|
const DEFAULT_DIAGNOSTICS_DIRECTORY = join(process.cwd(), "dist", "screenshots");
|
|
18
19
|
const KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS = 1500;
|
|
20
|
+
const KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS = 900;
|
|
21
|
+
const KEYBOARD_RETRACT_ATTEMPT_COUNT = 2;
|
|
22
|
+
const KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS = KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS;
|
|
19
23
|
async function raiseSoftKeyboard(params) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
break;
|
|
24
|
+
await lowerSoftKeyboardIfShown(params);
|
|
25
|
+
const textToRestore = await emptyFieldForTouch(params);
|
|
26
|
+
try {
|
|
27
|
+
return await tapUntilKeyboardIsUp(params);
|
|
28
|
+
} finally {
|
|
29
|
+
if (textToRestore !== null) {
|
|
30
|
+
await writeFieldText(params, textToRestore);
|
|
28
31
|
}
|
|
29
|
-
await tapDevice({ deviceId: params.deviceId, point });
|
|
30
|
-
await sleep(KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS);
|
|
31
|
-
snapshot = await readSoftKeyboardViewport(params);
|
|
32
|
-
}
|
|
33
|
-
if (!checkIsUp(snapshot)) {
|
|
34
|
-
throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
|
|
35
|
-
}
|
|
36
|
-
return snapshot;
|
|
37
|
-
function checkIsUp(current) {
|
|
38
|
-
return checkIsSoftKeyboardUp({
|
|
39
|
-
baselineSnapshot,
|
|
40
|
-
...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
|
|
41
|
-
snapshot: current
|
|
42
|
-
});
|
|
43
32
|
}
|
|
44
33
|
}
|
|
45
34
|
async function tapDevice(params) {
|
|
@@ -53,17 +42,91 @@ async function buildFailureMessage(params, baselineSnapshot, snapshot) {
|
|
|
53
42
|
mkdirSync(diagnosticsDirectory, { recursive: true });
|
|
54
43
|
const screenshotPath = join(diagnosticsDirectory, "keyboard-not-raised.png");
|
|
55
44
|
writeFileSync(screenshotPath, await captureDeviceScreenshot({ deviceId: params.deviceId }));
|
|
56
|
-
const dumpsysOutput = await runAdbText({
|
|
57
|
-
commandArguments: ["shell", "dumpsys", "input_method"],
|
|
58
|
-
deviceId: params.deviceId
|
|
59
|
-
});
|
|
60
45
|
return buildSoftKeyboardDiagnosticMessage({
|
|
61
46
|
baselineSnapshot,
|
|
62
|
-
inputMethodState:
|
|
47
|
+
inputMethodState: await readInputMethodState(params),
|
|
63
48
|
screenshotPath,
|
|
64
49
|
snapshot
|
|
65
50
|
});
|
|
66
51
|
}
|
|
52
|
+
async function checkIsFieldPresent(params) {
|
|
53
|
+
return await evalInObsidian({
|
|
54
|
+
callback({ inputSelector }) {
|
|
55
|
+
return document.querySelector(inputSelector) !== null;
|
|
56
|
+
},
|
|
57
|
+
input: { inputSelector: params.inputSelector },
|
|
58
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async function emptyFieldForTouch(params) {
|
|
62
|
+
if (params.shouldEmptyFieldForTouch === false) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const content = await readFieldContent(params);
|
|
66
|
+
if (!content || content.text === "") {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (!content.canWrite) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`raiseSoftKeyboard: "${params.inputSelector}" holds text but is not an <input> or a <textarea>, so it cannot be emptied for the touch and written back. The touch would land inside text and draw a selection handle, which a device capture photographs. Empty the field yourself before calling, or pass shouldEmptyFieldForTouch: false to touch it as it stands.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
await writeFieldText(params, "");
|
|
75
|
+
return content.text;
|
|
76
|
+
}
|
|
77
|
+
async function lowerSoftKeyboardIfShown(params) {
|
|
78
|
+
let inputMethodState = await readInputMethodState(params);
|
|
79
|
+
for (let attempt = 0; attempt < KEYBOARD_RETRACT_ATTEMPT_COUNT; attempt++) {
|
|
80
|
+
if (!checkIsInputMethodShown(inputMethodState)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await sleep(KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS);
|
|
84
|
+
inputMethodState = await readInputMethodState(params);
|
|
85
|
+
if (!checkIsInputMethodShown(inputMethodState)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const isFieldPresentBeforePress = await checkIsFieldPresent(params);
|
|
89
|
+
await runAdbText({
|
|
90
|
+
commandArguments: ["shell", "input", "keyevent", "KEYCODE_BACK"],
|
|
91
|
+
deviceId: params.deviceId
|
|
92
|
+
});
|
|
93
|
+
await sleep(KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS);
|
|
94
|
+
if (isFieldPresentBeforePress && !await checkIsFieldPresent(params)) {
|
|
95
|
+
throw new Error(
|
|
96
|
+
`raiseSoftKeyboard: KEYCODE_BACK, pressed to put down a keyboard the device reported showing, reached the app instead and closed the UI holding "${params.inputSelector}" \u2014 it matched before the press and matches nothing after it. The keyboard went down between the last read and the press. Let the previous keyboard settle before opening the UI to raise it on.
|
|
97
|
+
device before the press: ${inputMethodState}`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
inputMethodState = await readInputMethodState(params);
|
|
101
|
+
}
|
|
102
|
+
if (checkIsInputMethodShown(inputMethodState)) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`raiseSoftKeyboard: a keyboard was already up and did not go down after ${String(KEYBOARD_RETRACT_ATTEMPT_COUNT)} presses of KEYCODE_BACK, so the lift that proves a raise could not be measured. The field would read as one that never moved under a keyboard that is plainly showing.
|
|
105
|
+
device: ${inputMethodState}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function readFieldContent(params) {
|
|
110
|
+
return await evalInObsidian({
|
|
111
|
+
callback({ inputSelector }) {
|
|
112
|
+
const element = document.querySelector(inputSelector);
|
|
113
|
+
if (!element) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const canWrite = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement;
|
|
117
|
+
return { canWrite, text: canWrite ? element.value : element.textContent };
|
|
118
|
+
},
|
|
119
|
+
input: { inputSelector: params.inputSelector },
|
|
120
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async function readInputMethodState(params) {
|
|
124
|
+
const dumpsysOutput = await runAdbText({
|
|
125
|
+
commandArguments: ["shell", "dumpsys", "input_method"],
|
|
126
|
+
deviceId: params.deviceId
|
|
127
|
+
});
|
|
128
|
+
return parseInputMethodState(dumpsysOutput);
|
|
129
|
+
}
|
|
67
130
|
async function readSoftKeyboardViewport(params) {
|
|
68
131
|
return await evalInObsidian({
|
|
69
132
|
callback({ inputSelector }) {
|
|
@@ -87,8 +150,48 @@ async function readSoftKeyboardViewport(params) {
|
|
|
87
150
|
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
88
151
|
});
|
|
89
152
|
}
|
|
153
|
+
async function tapUntilKeyboardIsUp(params) {
|
|
154
|
+
const baselineSnapshot = await readSoftKeyboardViewport(params);
|
|
155
|
+
let snapshot = baselineSnapshot;
|
|
156
|
+
if (!snapshot.inputRect) {
|
|
157
|
+
throw new Error(`raiseSoftKeyboard: nothing matches "${params.inputSelector}", so there is no field to touch.`);
|
|
158
|
+
}
|
|
159
|
+
for (const point of resolveSoftKeyboardTapPoints({ snapshot })) {
|
|
160
|
+
if (checkIsUp(snapshot)) {
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
await tapDevice({ deviceId: params.deviceId, point });
|
|
164
|
+
await sleep(KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS);
|
|
165
|
+
snapshot = await readSoftKeyboardViewport(params);
|
|
166
|
+
}
|
|
167
|
+
if (!checkIsUp(snapshot)) {
|
|
168
|
+
throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
|
|
169
|
+
}
|
|
170
|
+
return snapshot;
|
|
171
|
+
function checkIsUp(current) {
|
|
172
|
+
return checkIsSoftKeyboardUp({
|
|
173
|
+
baselineSnapshot,
|
|
174
|
+
...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
|
|
175
|
+
snapshot: current
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function writeFieldText(params, text) {
|
|
180
|
+
await evalInObsidian({
|
|
181
|
+
callback({ inputSelector, text: value }) {
|
|
182
|
+
const element = document.querySelector(inputSelector);
|
|
183
|
+
if (!(element instanceof HTMLInputElement) && !(element instanceof HTMLTextAreaElement)) {
|
|
184
|
+
throw new TypeError(`raiseSoftKeyboard: "${inputSelector}" is not a field whose value can be written.`);
|
|
185
|
+
}
|
|
186
|
+
element.value = value;
|
|
187
|
+
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
188
|
+
},
|
|
189
|
+
input: { inputSelector: params.inputSelector, text },
|
|
190
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
191
|
+
});
|
|
192
|
+
}
|
|
90
193
|
export {
|
|
91
194
|
raiseSoftKeyboard,
|
|
92
195
|
tapDevice
|
|
93
196
|
};
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5tanMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc1NvZnRLZXlib2FyZFVwLFxuICBwYXJzZUlucHV0TWV0aG9kU3RhdGUsXG4gIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIHRvIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgYSBmYWlsZWQgYXR0ZW1wdCB3cml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlci5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBpdCBpcyBgZGlzdC9zY3JlZW5zaG90c2AgdW5kZXIgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IFx1MjAxNCByZXNvbHZlZCBhdCBsb2FkLCBzbyB0aGVyZSBpcyBub1xuICAgKiBsaXRlcmFsIGRlZmF1bHQgdG8gc3RhdGUgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIHNlbGVjdG9yIG9mIHRoZSBmaWVsZCB0byB0b3VjaCwgZS5nLiBgLnByb21wdC1pbnB1dGAuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNlbGVjdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsZWFzdCBhIHJhaXNlZCBrZXlib2FyZCBsaWZ0cyB0aGUgZmllbGQgYnkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTYCBmcm9tIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YCBhcHBsaWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0byByZWFkIHRoZSBnZW9tZXRyeSBmcm9tLiBXaGVuIG9taXR0ZWQsIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCdzIHZhdWx0IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRhcERldmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwRGV2aWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byB0b3VjaCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50OiBTb2Z0S2V5Ym9hcmRUYXBQb2ludDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBpdHMgZXZpZGVuY2UgXHUyMDE0IHVuZGVyIGBkaXN0L2AsIHdoaWNoIGEgcGx1Z2luIHJlcG8gdXNpbmcgdGhpcyBoYXJuZXNzIGdpdGlnbm9yZXMsIGxpa2UgdGhlIGNhcHR1cmUgc2NyYXRjaCBmaWxlcy5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlkgPSBqb2luKHByb2Nlc3MuY3dkKCksICdkaXN0JywgJ3NjcmVlbnNob3RzJyk7XG5cbi8qKlxuICogSG93IGxvbmcgdGhlIElNRSB0YWtlcyB0byBmaW5pc2ggYW5pbWF0aW5nIGluLCBhZnRlciB3aGljaCB0aGUgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICovXG5jb25zdCBLRVlCT0FSRF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTUwMDtcblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipDYWxsIGl0IHdpdGggdGhlIGtleWJvYXJkIERPV04uKiogVGhlIGZpcnN0IHJlYWQgaXMgdGhlIGJhc2VsaW5lIGV2ZXJ5IGxhdGVyIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCxcbiAqIHNvIGEga2V5Ym9hcmQgdGhhdCBpcyBhbHJlYWR5IHVwIGxlYXZlcyB0aGUgZmllbGQgbm90aGluZyB0byBsaWZ0IGJ5IGFuZCB0aGlzIHRocm93cy4gVGhhdCBpcyB0aGVcbiAqIGRlbGliZXJhdGUgdHJhZGUgZm9yIHdvcmtpbmcgb24gYSBjZW50cmVkIG1vZGFsIGFzIHdlbGwgYXMgYSBib3R0b20tYW5jaG9yZWQgb25lIFx1MjAxNCBzZWVcbiAqIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWVsZCBuZXZlciBtYXRjaGVkLCBvciBpZiBpdCBuZXZlciBsaWZ0ZWQsIHRoZSBsYXR0ZXIgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZGV2aWNlIGF0IGEgcG9pbnQsIHRoZSB3YXkgYSB0aHVtYiB3b3VsZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgd2hlcmUgdG8gdG91Y2ggaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHRvdWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YXBEZXZpY2UocGFyYW1zOiBUYXBEZXZpY2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCBTdHJpbmcocGFyYW1zLnBvaW50LnhJblBpeGVscyksIFN0cmluZyhwYXJhbXMucG9pbnQueUluUGl4ZWxzKV0sXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgcmVhZHMgdGhlIGRldmljZSdzIGBpbnB1dF9tZXRob2RgIHN0YXRlLCB0aGVuIGNvbXBvc2VzIHRoZSBmYWlsdXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5LlxuICogQHBhcmFtIGJhc2VsaW5lU25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoLCB3aGljaCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYWZ0ZXIgdGhlIGxhc3QgdG91Y2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtZXNzYWdlIHRvIHRocm93LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEZhaWx1cmVNZXNzYWdlKFxuICBwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLFxuICBiYXNlbGluZVNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90LFxuICBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NEaXJlY3RvcnkgPSBwYXJhbXMuZGlhZ25vc3RpY3NEaXJlY3RvcnkgPz8gREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlk7XG4gIG1rZGlyU3luYyhkaWFnbm9zdGljc0RpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBqb2luKGRpYWdub3N0aWNzRGlyZWN0b3J5LCAna2V5Ym9hcmQtbm90LXJhaXNlZC5wbmcnKTtcbiAgd3JpdGVGaWxlU3luYyhzY3JlZW5zaG90UGF0aCwgYXdhaXQgY2FwdHVyZURldmljZVNjcmVlbnNob3QoeyBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkIH0pKTtcblxuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgaW5wdXRNZXRob2RTdGF0ZTogcGFyc2VJbnB1dE1ldGhvZFN0YXRlKGR1bXBzeXNPdXRwdXQpLFxuICAgIHNjcmVlbnNob3RQYXRoLFxuICAgIHNuYXBzaG90XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBtZWFzdXJlIGFuZCB0aGUgdmF1bHQgdG8gcmVhZCBpdCBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmlld3BvcnQgYW5kIHRoZSBmaWVsZCdzIHJlY3QsIGluIENTUyBwaXhlbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTb2Z0S2V5Ym9hcmRWaWV3cG9ydChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90IHtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gVGhpcyBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgYW5kIGV2YWx1YXRlZCBpbiB0aGUgcmVuZGVyZXIsIHNvIGEgaGVscGVyIGhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHdvdWxkIG5vdCBleGlzdCB0aGVyZS5cbiAgICAgIGZ1bmN0aW9uIHRvUmVjdChyZWN0OiBET01SZWN0KTogRWxlbWVudFJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIGlubmVySGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgIGlucHV0UmVjdDogaW5wdXRFbCA/IHRvUmVjdChpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSA6IG51bGwsXG4gICAgICAgIHNjcmVlblk6IHdpbmRvdy5zY3JlZW5ZXG4gICAgICB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBK0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sYUFBYTtBQUNwQixTQUFTLGNBQWMsYUFBYTtBQVFwQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLCtCQUErQjtBQUN4QyxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBdURQLE1BQU0sZ0NBQWdDLEtBQUssUUFBUSxJQUFJLEdBQUcsUUFBUSxhQUFhO0FBSy9FLE1BQU0sd0NBQXdDO0FBa0I5QyxlQUFzQixrQkFBa0IsUUFBd0U7QUFDOUcsUUFBTSxtQkFBbUIsTUFBTSx5QkFBeUIsTUFBTTtBQUM5RCxNQUFJLFdBQVc7QUFFZixNQUFJLENBQUMsU0FBUyxXQUFXO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLHVDQUF1QyxPQUFPLGFBQWEsbUNBQW1DO0FBQUEsRUFDaEg7QUFFQSxhQUFXLFNBQVMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLEdBQUc7QUFDOUQsUUFBSSxVQUFVLFFBQVEsR0FBRztBQUN2QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQVUsRUFBRSxVQUFVLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDcEQsVUFBTSxNQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsV0FBTyxzQkFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQVFBLGVBQXNCLFVBQVUsUUFBd0M7QUFDdEUsUUFBTSxXQUFXO0FBQUEsSUFDZixrQkFBa0IsQ0FBQyxTQUFTLFNBQVMsT0FBTyxPQUFPLE9BQU8sTUFBTSxTQUFTLEdBQUcsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDMUcsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBVUEsZUFBZSxvQkFDYixRQUNBLGtCQUNBLFVBQ2lCO0FBQ2pCLFFBQU0sdUJBQXVCLE9BQU8sd0JBQXdCO0FBQzVELFlBQVUsc0JBQXNCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFFbkQsUUFBTSxpQkFBaUIsS0FBSyxzQkFBc0IseUJBQXlCO0FBQzNFLGdCQUFjLGdCQUFnQixNQUFNLHdCQUF3QixFQUFFLFVBQVUsT0FBTyxTQUFTLENBQUMsQ0FBQztBQUUxRixRQUFNLGdCQUFnQixNQUFNLFdBQVc7QUFBQSxJQUNyQyxrQkFBa0IsQ0FBQyxTQUFTLFdBQVcsY0FBYztBQUFBLElBQ3JELFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFFRCxTQUFPLG1DQUFtQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxrQkFBa0Isc0JBQXNCLGFBQWE7QUFBQSxJQUNyRDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVFBLGVBQWUseUJBQXlCLFFBQXdFO0FBQzlHLFNBQU8sTUFBTSxlQUFlO0FBQUEsSUFDMUIsU0FBUyxFQUFFLGNBQWMsR0FBaUM7QUFDeEQsWUFBTSxVQUFVLFNBQVMsY0FBYyxhQUFhO0FBR3BELGVBQVMsT0FBTyxNQUE0QjtBQUMxQyxlQUFPO0FBQUEsVUFDTCxRQUFRLEtBQUs7QUFBQSxVQUNiLE1BQU0sS0FBSztBQUFBLFVBQ1gsS0FBSyxLQUFLO0FBQUEsVUFDVixPQUFPLEtBQUs7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxRQUNMLGtCQUFrQixPQUFPO0FBQUEsUUFDekIsYUFBYSxPQUFPO0FBQUEsUUFDcEIsV0FBVyxVQUFVLE9BQU8sUUFBUSxzQkFBc0IsQ0FBQyxJQUFJO0FBQUEsUUFDL0QsU0FBUyxPQUFPO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLEVBQUUsZUFBZSxPQUFPLGNBQWM7QUFBQSxJQUM3QyxHQUFJLE9BQU8sY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFVBQVU7QUFBQSxFQUN0RSxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5tanMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc0lucHV0TWV0aG9kU2hvd24sXG4gIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcCxcbiAgcGFyc2VJbnB1dE1ldGhvZFN0YXRlLFxuICByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgd3JpdGVzIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgaXQgaXMgYGRpc3Qvc2NyZWVuc2hvdHNgIHVuZGVyIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBcdTIwMTQgcmVzb2x2ZWQgYXQgbG9hZCwgc28gdGhlcmUgaXMgbm9cbiAgICogbGl0ZXJhbCBkZWZhdWx0IHRvIHN0YXRlIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBkaWFnbm9zdGljc0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENTUyBzZWxlY3RvciBvZiB0aGUgZmllbGQgdG8gdG91Y2gsIGUuZy4gYC5wcm9tcHQtaW5wdXRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRTZWxlY3Rvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVhc3QgYSByYWlzZWQga2V5Ym9hcmQgbGlmdHMgdGhlIGZpZWxkIGJ5LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU2AgZnJvbSBgc29mdC1rZXlib2FyZC1nZW9tZXRyeWAgYXBwbGllcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtcHR5IHRoZSBmaWVsZCBiZWZvcmUgdGhlIHRvdWNoLCBhbmQgd3JpdGUgaXRzIHRleHQgYmFjayBhZnRlcndhcmRzLlxuICAgKlxuICAgKiAqKk9uIGJ5IGRlZmF1bHQsIGJlY2F1c2UgdGhlIHRvdWNoIHRoYXQgcmFpc2VzIHRoZSBrZXlib2FyZCBhbHNvIGRyYXdzIGEgc2VsZWN0aW9uIGhhbmRsZSB3aGVuIGl0XG4gICAqIGxhbmRzIGluc2lkZSBURVhULioqIENocm9taXVtIHNob3dzIHRoZSBpbnNlcnRpb24gaGFuZGxlIG9uIGEgdGFwIGludG8gdGV4dCBhbmQgZHJhd3Mgbm9uZSBvbiBhIHRhcFxuICAgKiBpbnRvIGFuIEVNUFRZIGVkaXRhYmxlLCBhbmQgYSBkZXZpY2UgY2FwdHVyZSBwaG90b2dyYXBocyBpdCBcdTIwMTQgd2hpY2ggaXMgaG93IGBvYnNpZGlhbi1saW5rLXBpY2tlcmBcbiAgICogc2hpcHBlZCBhIHRlYWwgaGFuZGxlIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHVuZGVyc3Rvb2Qgd2hlcmUgaXQgY2FtZSBmcm9tLiBBXG4gICAqIHZhbHVlIHdyaXR0ZW4gYnkgc2NyaXB0IHJhaXNlcyBubyBoYW5kbGUsIHNvIGVtcHR5aW5nIHRoZSBmaWVsZCwgdG91Y2hpbmcgaXQsIGFuZCB3cml0aW5nIHRoZSB0ZXh0XG4gICAqIGJhY2sgbGVhdmVzIHRoZSBmcmFtZSBzaG93aW5nIHRoZSBzYW1lIHF1ZXJ5IHdpdGggbm90aGluZyBoYW5naW5nIG9mZiBpdC5cbiAgICpcbiAgICogT25seSBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAgaXMgZW1wdGllZC4gQSBgY29udGVudGVkaXRhYmxlYCBob2xkaW5nIHRleHQgaXMgUkVGVVNFRCByYXRoZXJcbiAgICogdGhhbiB3cml0dGVuIHRvOiBpdHMgY29udGVudCB1c3VhbGx5IGJlbG9uZ3MgdG8gYW4gZWRpdG9yIHRoYXQgb3ducyBpdHMgb3duIERPTSwgYW5kIGJsYW5raW5nIHRoYXRcbiAgICogYnkgaGFuZCBkZXN0cm95cyBpdC4gRW1wdHkgc3VjaCBhIGZpZWxkIHlvdXJzZWxmLCBvciB0dXJuIHRoaXMgb2ZmLlxuICAgKlxuICAgKiBUdXJuaW5nIGl0IG9mZiByZXN0b3JlcyB0aGUgcHJlLTIwMjYtMDktMjMgYmVoYXZpb3VyIGV4YWN0bHk6IHRoZSBmaWVsZCBpcyB0b3VjaGVkIGFzIGl0IHN0YW5kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHRvIHJlYWQgdGhlIGdlb21ldHJ5IGZyb20uIFdoZW4gb21pdHRlZCwgdGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGFwRGV2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBEZXZpY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHRvdWNoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnQ6IFNvZnRLZXlib2FyZFRhcFBvaW50O1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgbGVhdmVzIGl0cyBldmlkZW5jZSBcdTIwMTQgdW5kZXIgYGRpc3QvYCwgd2hpY2ggYSBwbHVnaW4gcmVwbyB1c2luZyB0aGlzIGhhcm5lc3MgZ2l0aWdub3JlcywgbGlrZSB0aGUgY2FwdHVyZSBzY3JhdGNoIGZpbGVzLlxuICovXG5jb25zdCBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWSA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Rpc3QnLCAnc2NyZWVuc2hvdHMnKTtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgaW4sIGFmdGVyIHdoaWNoIHRoZSBsYXlvdXQgaGFzIHNldHRsZWQuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxNTAwO1xuXG4vKipcbiAqIEhvdyBsb25nIHRoZSBJTUUgdGFrZXMgdG8gZmluaXNoIGFuaW1hdGluZyBvdXQgYWZ0ZXIgYEtFWUNPREVfQkFDS2AsIG1lYXN1cmVkIGluIHRoZSBjYXB0dXJlIHN1aXRlIHRoaXNcbiAqIHdhcyBtb3ZlZCBvdXQgb2YuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gOTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYmVmb3JlIGEga2V5Ym9hcmQgdGhhdCB3aWxsIG5vdCBnbyBkb3duIGlzIHJlcG9ydGVkLlxuICpcbiAqIFR3bywgYmVjYXVzZSB0aGUgZmlyc3QgcHJlc3MgY2FuIGxhbmQgd2hpbGUgdGhlIElNRSBpcyBzdGlsbCBhbmltYXRpbmcgVVAgZnJvbSB0aGUgZm9jdXMgdGhhdCByYWlzZWRcbiAqIGl0LCBhbmQgYW4gSU1FIG1pZC1hbmltYXRpb24gc3dhbGxvd3MgdGhlIGtleSB3aXRob3V0IHJldHJhY3RpbmcuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCA9IDI7XG5cbi8qKlxuICogSG93IGxvbmcgYSBrZXlib2FyZCByZXBvcnRlZCBzaG93aW5nIGlzIHdhdGNoZWQgYmVmb3JlIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYXQgaXQuXG4gKlxuICogT25lIHJldHJhY3QgYW5pbWF0aW9uOiBhbiBJTUUgYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gXHUyMDE0IHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQgXHUyMDE0IGlzXG4gKiBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGJ5IGEgcmVhZCB0YWtlbiBhdCB0aGUgc3RhcnQgb2YgaXRzIHJldHJhY3QsIGFuZCBpcyBnb25lIGJ5IHRoZSBlbmQgb2YgaXQuIFByZXNzaW5nXG4gKiBhdCB0aGUgZmlyc3QgcmVhZCB0aGVuIGxhbmRzIHRoZSBrZXkgb24gdGhlIGFwcCBpbnN0ZWFkLCB3aGljaCBjbG9zZXMgdGhlIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0b1xuICogcGhvdG9ncmFwaC4gVHdvIHJlYWRzIHRoYXQgYWdyZWUgYWNyb3NzIHRoaXMgd2luZG93IHNheSB0aGUga2V5Ym9hcmQgaXMgc3RheWluZyB1cC5cbiAqL1xuY29uc3QgS0VZQk9BUkRfU0hPV05fQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTO1xuXG4vKipcbiAqIFdoYXQgYSBmaWVsZCBob2xkcywgYW5kIHdoZXRoZXIgaXQgaXMgb25lIHRoaXMgY2FuIHB1dCBiYWNrLlxuICovXG5pbnRlcmZhY2UgRmllbGRDb250ZW50IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgY2FuIGJlIHdyaXR0ZW4gXHUyMDE0IHRydWUgZm9yIGFuIGA8aW5wdXQ+YCBvciBhIGA8dGV4dGFyZWE+YCwgZmFsc2UgZm9yXG4gICAqIGFueXRoaW5nIGVsc2UsIHdob3NlIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00uXG4gICAqL1xuICByZWFkb25seSBjYW5Xcml0ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdGhlIGZpZWxkIGN1cnJlbnRseSBob2xkcy5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipBIGtleWJvYXJkIHRoYXQgaXMgYWxyZWFkeSB1cCBpcyBwdXQgRE9XTiBmaXJzdC4qKiBUaGUgZmlyc3QgZ2VvbWV0cnkgcmVhZCBpcyB0aGUgYmFzZWxpbmUgZXZlcnkgbGF0ZXJcbiAqIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCwgc28gYSBrZXlib2FyZCBhbHJlYWR5IHVwIHdvdWxkIGxlYXZlIHRoZSBmaWVsZCBub3RoaW5nIHRvIGxpZnQgYnkgYW5kIHJlYWQgYXNcbiAqIG9uZSB0aGF0IG5ldmVyIGNhbWUuIFRoZSBkZXZpY2UgaXMgYXNrZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UsIGFuZCBhIHNob3dpbmcgSU1FIGlzIHJldHJhY3RlZCB3aXRoXG4gKiBgS0VZQ09ERV9CQUNLYCBcdTIwMTQgYXNrZWQgRklSU1QgYmVjYXVzZSwgd2l0aCBubyBJTUUgc2hvd2luZywgdGhhdCBrZXkgcmVhY2hlcyB0aGUgYXBwIGFuZCBjbG9zZXMgdGhlIHZlcnlcbiAqIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0byBwaG90b2dyYXBoLiBTbyB0aGUgaGVscGVyIGlzIHNhZmUgdG8gY2FsbCBvbmNlIHBlciBmcmFtZSBvZiBhIG11bHRpLWZyYW1lXG4gKiBzdWl0ZSwgYW5kIGV2ZXJ5IGNhbGwgc3RpbGwgcHJvdmVzIGl0cyBvd24gbGlmdC4gVGhlIG90aGVyIGFuc3dlciBcdTIwMTQgYWNjZXB0aW5nIGEgemVybyBsaWZ0IHdoZW5ldmVyIHRoZVxuICogZGV2aWNlIHJlcG9ydHMgYSBrZXlib2FyZCBcdTIwMTQgd2FzIHJlZnVzZWQsIGJlY2F1c2UgaXQgYWNjZXB0cyBhIGZyYW1lIHRoZSBoZWxwZXIgZGlkIG5vdCBwcm92ZS5cbiAqXG4gKiAqKlRoZSBmaWVsZCBpcyBFTVBUSUVEIGZvciB0aGUgdG91Y2ggYW5kIHdyaXR0ZW4gYmFjayBhZnRlcndhcmRzKiosIGJlY2F1c2UgYSB0b3VjaCB0aGF0IGxhbmRzIGluc2lkZVxuICogdGV4dCBkcmF3cyBDaHJvbWl1bSdzIHNlbGVjdGlvbiBoYW5kbGUgYW5kIHRoZSBmcmFtZWJ1ZmZlciBwaG90b2dyYXBocyBpdCBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMuc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNofSwgd2hpY2ggdHVybnMgdGhhdCBvZmYuXG4gKlxuICogKipUaGUgZ2VvbWV0cnkgcmV0dXJuZWQgaXMgcmVhZCB3aXRoIHRoZSBmaWVsZCBzdGlsbCBlbXB0eSoqLCBhbmQgdGhlIHRleHQgaXMgd3JpdHRlbiBiYWNrIGFmdGVyIGl0LlxuICogVGhhdCBpcyB0aGUgc3RhdGUgdGhlIHByb3ZlbiBjYXB0dXJlIHN1aXRlcyBhc3NlcnQgYWdhaW5zdCwgYW5kIGl0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW5cbiAqIGluY2lkZW50YWw6IHRoZSBiYXNlbGluZSBpcyByZWFkIEFGVEVSIHRoZSBmaWVsZCBpcyBlbXB0aWVkLCBzbyB0aGUgbGlmdCBpcyBtZWFzdXJlZCBiZXR3ZWVuIHR3byByZWFkc1xuICogb2YgdGhlIHNhbWUgZmllbGQgY29udGVudC4gQSBmaWVsZCB3aG9zZSBvd24gdGV4dCBjaGFuZ2VzIHRoZSBsYXlvdXQgYXJvdW5kIGl0IFx1MjAxNCBhIHN1Z2dlc3RlciB3aG9zZSByb3dcbiAqIGNvdW50IGFuc3dlcnMgdGhlIHF1ZXJ5IFx1MjAxNCBtb3ZlcyB3aGVuIGl0IGlzIGNsZWFyZWQsIGFuZCBhIGRlbHRhIG1lYXN1cmVkIGFjcm9zcyB0aGF0IG1vdmUgaXMgbm90IGFcbiAqIGtleWJvYXJkLiBSZWFkIHRoZSBnZW9tZXRyeSBhZ2FpbiB5b3Vyc2VsZiBpZiB0aGUgcmVzdG9yZWQgdGV4dCBtb3ZlcyBhbnl0aGluZyB5b3UgYXJlIGFib3V0IHRvIGFzc2VydFxuICogb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBhbHJlYWR5IHVwIHdvdWxkIG5vdCBnbyBkb3duLCBpZiB0aGUgZmllbGQgbmV2ZXIgbWF0Y2hlZCwgaWYgaXQgaG9sZHMgdGV4dFxuICogICB0aGlzIGNhbm5vdCBlbXB0eSBhbmQgcHV0IGJhY2ssIG9yIGlmIGl0IG5ldmVyIGxpZnRlZCBcdTIwMTQgdGhlIGxhc3QgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyXG4gKiAgIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGF3YWl0IGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXMpO1xuXG4gIGNvbnN0IHRleHRUb1Jlc3RvcmUgPSBhd2FpdCBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXMpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFJlc3RvcmVkIGV2ZW4gd2hlbiB0aGUgcmFpc2UgZmFpbGVkOiBhIGNhbGxlciB0aGF0IGlzIGFib3V0IHRvIHJlYWQgaXRzIG93biBkaWFnbm9zdGljIHNob3VsZCBub3RcbiAgICAvLyBhbHNvIGhhdmUgdG8gZGlzY292ZXIgdGhhdCBpdHMgcXVlcnkgaXMgZ29uZS5cbiAgICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgd3JpdGVGaWVsZFRleHQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBkZXZpY2UgYXQgYSBwb2ludCwgdGhlIHdheSBhIHRodW1iIHdvdWxkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB3aGVyZSB0byB0b3VjaCBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdG91Y2ggaGFzIGJlZW4gZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhcERldmljZShwYXJhbXM6IFRhcERldmljZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ3RhcCcsIFN0cmluZyhwYXJhbXMucG9pbnQueEluUGl4ZWxzKSwgU3RyaW5nKHBhcmFtcy5wb2ludC55SW5QaXhlbHMpXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyIGFuZCByZWFkcyB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHRoZW4gY29tcG9zZXMgdGhlIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gYmFzZWxpbmVTbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2gsIHdoaWNoIHRoZSB2ZXJkaWN0IGlzIG1lYXN1cmVkIGFnYWluc3QuXG4gKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1lc3NhZ2UgdG8gdGhyb3cuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmFpbHVyZU1lc3NhZ2UoXG4gIHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsXG4gIGJhc2VsaW5lU25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QsXG4gIHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWFnbm9zdGljc0RpcmVjdG9yeSA9IHBhcmFtcy5kaWFnbm9zdGljc0RpcmVjdG9yeSA/PyBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWTtcbiAgbWtkaXJTeW5jKGRpYWdub3N0aWNzRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGpvaW4oZGlhZ25vc3RpY3NEaXJlY3RvcnksICdrZXlib2FyZC1ub3QtcmFpc2VkLnBuZycpO1xuICB3cml0ZUZpbGVTeW5jKHNjcmVlbnNob3RQYXRoLCBhd2FpdCBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQgfSkpO1xuXG4gIHJldHVybiBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlKHtcbiAgICBiYXNlbGluZVNuYXBzaG90LFxuICAgIGlucHV0TWV0aG9kU3RhdGU6IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyksXG4gICAgc2NyZWVuc2hvdFBhdGgsXG4gICAgc25hcHNob3RcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhbnl0aGluZyBpbiB0aGUgcGFnZSBtYXRjaGVzIHRoZSBmaWVsZCdzIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgaXQgbWF0Y2hlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpICE9PSBudWxsO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGZpZWxkIHRoZSB0b3VjaCBpcyBhYm91dCB0byBsYW5kIG9uLCBhbmQgcmVwb3J0cyB3aGF0IHRvIHdyaXRlIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBlbXB0eSwgYW5kIHdoZXRoZXIgdG8gZW1wdHkgaXQgYXQgYWxsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCB0byByZXN0b3JlLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdhcyBlbXB0aWVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgaG9sZHMgdGV4dCB0aGF0IGNhbm5vdCBiZSB3cml0dGVuIGJhY2sgXHUyMDE0IGEgYGNvbnRlbnRlZGl0YWJsZWAsIHdob3NlIGNvbnRlbnRcbiAqICAgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBpZiAocGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG5cbiAgLy8gTm90aGluZyBtYXRjaGVkLiBUaGUgZ2VvbWV0cnkgcmVhZCBkb2VzIHRoZSByZXBvcnRpbmcsIHdpdGggdGhlIG1lc3NhZ2UgaXQgYWx3YXlzIGhhZC5cbiAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY29udGVudC5jYW5Xcml0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGhvbGRzIHRleHQgYnV0IGlzIG5vdCBhbiA8aW5wdXQ+IG9yIGEgPHRleHRhcmVhPiwgc28gaXQgYFxuICAgICAgICArICdjYW5ub3QgYmUgZW1wdGllZCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2suIFRoZSB0b3VjaCB3b3VsZCBsYW5kIGluc2lkZSB0ZXh0IGFuZCBkcmF3IGEgJ1xuICAgICAgICArICdzZWxlY3Rpb24gaGFuZGxlLCB3aGljaCBhIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzLiBFbXB0eSB0aGUgZmllbGQgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcsIG9yICdcbiAgICAgICAgKyAncGFzcyBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2g6IGZhbHNlIHRvIHRvdWNoIGl0IGFzIGl0IHN0YW5kcy4nXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgJycpO1xuXG4gIHJldHVybiBjb250ZW50LnRleHQ7XG59XG5cbi8qKlxuICogUHV0cyB0aGUga2V5Ym9hcmQgZG93biB3aGVuIHRoZSBkZXZpY2UgcmVwb3J0cyBvbmUgc2hvd2luZywgc28gdGhlIGJhc2VsaW5lIHJlYWQgbmV4dCBpcyBvbmUgdGhlIHRvdWNoXG4gKiBjYW4gbGlmdCB0aGUgZmllbGQgZnJvbS5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgaXMgcHJlc3NlZCBhdCBvbmx5IG9uY2UgaXQgaGFzIGJlZW4gcmVwb3J0ZWQgc2hvd2luZyBUV0lDRSwgb25lIHJldHJhY3QgYW5pbWF0aW9uIGFwYXJ0LioqXG4gKiBgS0VZQ09ERV9CQUNLYCBpcyByZXRyYWN0ZWQgYnkgdGhlIElNRSBvbmx5IHdoaWxlIHRoZSBJTUUgaXMgdXA7IG9uY2UgaXQgaGFzIGdvbmUsIHRoZSBrZXkgcmVhY2hlcyB0aGVcbiAqIGFwcCwgYW5kIE9ic2lkaWFuIGNsb3NlcyB0aGUgbW9kYWwgb24gc2NyZWVuIFx1MjAxNCB0aGUgb25lIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gQSBrZXlib2FyZFxuICogYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gKHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQsIGFuZCB0aGUgY2FsbGVyIG9wZW5lZCBhIGZyZXNoIG9uZVxuICogc3RyYWlnaHQgYWZ0ZXIpIGlzIHN0aWxsIHJlcG9ydGVkIHNob3dpbmcgYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBzbyBwcmVzc2luZyBhdCB0aGUgZmlyc3QgcmVhZFxuICogcmFjZWQgaXQuIEl0IGlzIHdhdGNoZWQgZm9yIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBmaXJzdCwgYW5kIGEga2V5Ym9hcmQgdGhhdCB3ZW50IGRvd24gb24gaXRzIG93biBpc1xuICogbGVmdCBhbG9uZS5cbiAqXG4gKiAqKkFuZCBhIHByZXNzIHRoYXQgcmVhY2hlZCB0aGUgYXBwIGFueXdheSBpcyBuYW1lZCBhcyB0aGF0LioqIFRoZSBmaWVsZCBpcyBsb29rZWQgdXAgYmVmb3JlIHRoZSBwcmVzc1xuICogYW5kIGFmdGVyIGl0OyBvbmUgdGhhdCBtYXRjaGVkIGJlZm9yZSBhbmQgbm90IGFmdGVyIHdhcyBjbG9zZWQgYnkgdGhlIGtleSwgYW5kIHNheWluZyBzbyBiZWF0cyB0aGVcbiAqIGBub3RoaW5nIG1hdGNoZXNgIHRoYXQgdGhlIHJhaXNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBzdGVwIGxhdGVyLCBhYm91dCBhIHNlbGVjdG9yIHRoYXQgd2FzIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIGFzaywgYW5kIHRoZSBmaWVsZCB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgcHJlc3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8ga2V5Ym9hcmQgaXMgc2hvd2luZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBpcyBzdGlsbCBzaG93aW5nIGFmdGVyIHtAbGluayBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlR9IHByZXNzZXMgb2ZcbiAqICAgYEtFWUNPREVfQkFDS2AgXHUyMDE0IHRoZSByYWlzZSB0aGF0IGZvbGxvd3MgY291bGQgcHJvdmUgbm90aGluZywgYW5kIGl0cyBvd24gZmFpbHVyZSB3b3VsZCBibGFtZSBhIGtleWJvYXJkXG4gKiAgIHRoYXQgbmV2ZXIgY2FtZSB3aGVuIHRoZSB0cnV0aCBpcyBvbmUgdGhhdCBuZXZlciBsZWZ0IFx1MjAxNCBvciBpZiBhIHByZXNzIGNsb3NlZCB0aGUgZmllbGQncyBvd24gVUkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuXG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmllbGRQcmVzZW50QmVmb3JlUHJlc3MgPSBhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcyk7XG4gICAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgJ0tFWUNPREVfQkFDSyddLFxuICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICAgIH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmIChpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzICYmICFhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JhaXNlU29mdEtleWJvYXJkOiBLRVlDT0RFX0JBQ0ssIHByZXNzZWQgdG8gcHV0IGRvd24gYSBrZXlib2FyZCB0aGUgZGV2aWNlIHJlcG9ydGVkIHNob3dpbmcsIHJlYWNoZWQgdGhlIGFwcCBpbnN0ZWFkIGFuZCAnXG4gICAgICAgICAgKyBgY2xvc2VkIHRoZSBVSSBob2xkaW5nIFwiJHtwYXJhbXMuaW5wdXRTZWxlY3Rvcn1cIiBcdTIwMTQgaXQgbWF0Y2hlZCBiZWZvcmUgdGhlIHByZXNzIGFuZCBtYXRjaGVzIG5vdGhpbmcgYWZ0ZXIgaXQuIFRoZSBgXG4gICAgICAgICAgKyAna2V5Ym9hcmQgd2VudCBkb3duIGJldHdlZW4gdGhlIGxhc3QgcmVhZCBhbmQgdGhlIHByZXNzLiBMZXQgdGhlIHByZXZpb3VzIGtleWJvYXJkIHNldHRsZSBiZWZvcmUgb3BlbmluZyB0aGUgVUkgJ1xuICAgICAgICAgICsgYHRvIHJhaXNlIGl0IG9uLlxuZGV2aWNlIGJlZm9yZSB0aGUgcHJlc3M6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuICB9XG5cbiAgaWYgKGNoZWNrSXNJbnB1dE1ldGhvZFNob3duKGlucHV0TWV0aG9kU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBhIGtleWJvYXJkIHdhcyBhbHJlYWR5IHVwIGFuZCBkaWQgbm90IGdvIGRvd24gYWZ0ZXIgJHtTdHJpbmcoS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UKX0gcHJlc3NlcyBvZiBgXG4gICAgICAgICsgJ0tFWUNPREVfQkFDSywgc28gdGhlIGxpZnQgdGhhdCBwcm92ZXMgYSByYWlzZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuIFRoZSBmaWVsZCB3b3VsZCByZWFkIGFzIG9uZSB0aGF0IG5ldmVyICdcbiAgICAgICAgKyBgbW92ZWQgdW5kZXIgYSBrZXlib2FyZCB0aGF0IGlzIHBsYWlubHkgc2hvd2luZy5cbmRldmljZTogJHtpbnB1dE1ldGhvZFN0YXRlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgZmllbGQgaG9sZHMsIGFuZCB3aGV0aGVyIGl0IGlzIG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbiBiYWNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgbWF0Y2hlZCB0aGUgc2VsZWN0b3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWVsZENvbnRlbnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8RmllbGRDb250ZW50IHwgbnVsbD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogRmllbGRDb250ZW50IHwgbnVsbCB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW5Xcml0ZSA9IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuXG4gICAgICByZXR1cm4geyBjYW5Xcml0ZSwgdGV4dDogY2FuV3JpdGUgPyBlbGVtZW50LnZhbHVlIDogZWxlbWVudC50ZXh0Q29udGVudCB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEFza3MgdGhlIGRldmljZSB3aGF0IGl0cyBJTUUgaXMgZG9pbmcgXHUyMDE0IHRoZSBvbmx5IHBsYWNlIHRoYXQga25vd3MsIHNpbmNlIG5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSB0byBhc2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWVsZHMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0ga2VlcHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGF0IHRoZSByZW5kZXJlciBrbm93cyBhYm91dCBpdHMgb3duIGdlb21ldHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbWVhc3VyZSBhbmQgdGhlIHZhdWx0IHRvIHJlYWQgaXQgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZpZXdwb3J0IGFuZCB0aGUgZmllbGQncyByZWN0LCBpbiBDU1MgcGl4ZWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIFRoaXMgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGFuZCBldmFsdWF0ZWQgaW4gdGhlIHJlbmRlcmVyLCBzbyBhIGhlbHBlciBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSB3b3VsZCBub3QgZXhpc3QgdGhlcmUuXG4gICAgICBmdW5jdGlvbiB0b1JlY3QocmVjdDogRE9NUmVjdCk6IEVsZW1lbnRSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZVBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICBpbm5lckhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgICBpbnB1dFJlY3Q6IGlucHV0RWwgPyB0b1JlY3QoaW5wdXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkgOiBudWxsLFxuICAgICAgICBzY3JlZW5ZOiB3aW5kb3cuc2NyZWVuWVxuICAgICAgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBmaWVsZCB1bnRpbCB0aGUga2V5Ym9hcmQgaXMgdXAsIGFuZCBzYXlzIHNvIHdoZW4gaXQgbmV2ZXIgY2FtZS5cbiAqXG4gKiBUaGUgYmFzZWxpbmUgaXMgcmVhZCBoZXJlIHJhdGhlciB0aGFuIGJ5IHRoZSBjYWxsZXIsIHNvIGl0IGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgaW4gdGhlIHN0YXRlIHRoZVxuICogdGFwcyBhcmUgZGlzcGF0Y2hlZCBhZ2FpbnN0IFx1MjAxNCBzZWUge0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfSBmb3Igd2h5IHRoZSB0d28gaGF2ZSB0byBtYXRjaC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSwgdGhlIGZpZWxkIHRvIHRvdWNoLCBhbmQgaG93IGZhciBpdCBtdXN0IGxpZnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBnZW9tZXRyeSByZWFkIG9uY2UgdGhlIGtleWJvYXJkIGlzIHVwLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgbmV2ZXIgbWF0Y2hlZCwgb3IgaWYgaXQgbmV2ZXIgbGlmdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZmllbGQncyB2YWx1ZSBhbmQgdGVsbHMgdGhlIHBhZ2UgaXQgY2hhbmdlZC5cbiAqXG4gKiBUaGUgYGlucHV0YCBldmVudCBpcyB3aGF0IGEgc2NyaXB0ZWQgd3JpdGUgb3dlcyB0aGUgcGFnZTogd2l0aG91dCBpdCBhIHN1Z2dlc3RlciBrZWVwcyB0aGUgcm93cyBpdCBoYWRcbiAqIGZvciB0aGUgdGV4dCB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZS4gSXQgYnViYmxlcywgYmVjYXVzZSB0aGF0IGlzIGhvdyBhIGZyYW1ld29yayBsaXN0ZW5pbmcgb24gYVxuICogY29udGFpbmVyIGhlYXJzIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgdG8gd3JpdGUgaW50byBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgd3JpdGUgaGFzIGJlZW4gbWFkZS5cbiAqIEB0aHJvd3MgVHlwZUVycm9yIGlmIHRoZSBmaWVsZCBpcyBub3Qgb25lIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciwgdGV4dDogdmFsdWUgfSk6IHZvaWQge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGByYWlzZVNvZnRLZXlib2FyZDogXCIke2lucHV0U2VsZWN0b3J9XCIgaXMgbm90IGEgZmllbGQgd2hvc2UgdmFsdWUgY2FuIGJlIHdyaXR0ZW4uYCk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yLCB0ZXh0IH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBw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
|
|
@@ -303,7 +303,11 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
303
303
|
* Registers a vault on mobile by pushing files and configuring localStorage.
|
|
304
304
|
*
|
|
305
305
|
* The registration flow:
|
|
306
|
-
* 1. Push a minimal `.obsidian/app.json` to the device so Obsidian recognizes the vault
|
|
306
|
+
* 1. Push a minimal `.obsidian/app.json` to the device so Obsidian recognizes the vault —
|
|
307
|
+
* **unless one is already there**, which is the usual case, since `register` pushes the
|
|
308
|
+
* whole vault first and that carries the run's real `app.json` across. See
|
|
309
|
+
* {@link pushObsidianMarker}: the marker is a truncating overwrite, so pushing it
|
|
310
|
+
* unconditionally destroyed the headless defaults it had just been handed.
|
|
307
311
|
* 2. Switch to the WebView context
|
|
308
312
|
* 3. Add the vault to localStorage (`mobile-external-vaults`, `mobile-selected-vault`,
|
|
309
313
|
* `enable-plugin-<path>`)
|
|
@@ -398,6 +402,19 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
398
402
|
* @param payload - The raw JSON payload the binding was called with.
|
|
399
403
|
*/
|
|
400
404
|
private handleInputRequest;
|
|
405
|
+
/**
|
|
406
|
+
* Answers whether the device already holds a usable `app.json` at the given path.
|
|
407
|
+
*
|
|
408
|
+
* Reads the file rather than testing for it, for the reason
|
|
409
|
+
* {@link pushObsidianMarker} spells out: only output that parses as a JSON
|
|
410
|
+
* **object** counts as present, so a merged stderr, an empty file, or a read that
|
|
411
|
+
* failed outright all answer `false` and let the caller push. Never throws — a
|
|
412
|
+
* probe that cannot answer is an answer of `false`.
|
|
413
|
+
*
|
|
414
|
+
* @param remoteMarker - The device-side `app.json` path.
|
|
415
|
+
* @returns `true` when the device holds an `app.json` that parses as a JSON object.
|
|
416
|
+
*/
|
|
417
|
+
private hasDeviceAppJson;
|
|
401
418
|
/**
|
|
402
419
|
* Probes the WebView once for how far Obsidian's startup has got.
|
|
403
420
|
*
|
|
@@ -409,13 +426,43 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
409
426
|
*/
|
|
410
427
|
private probeStartup;
|
|
411
428
|
/**
|
|
412
|
-
* Pushes the minimal `.obsidian/app.json` vault marker via `adb push
|
|
429
|
+
* Pushes the minimal `.obsidian/app.json` vault marker via `adb push` — but
|
|
430
|
+
* only over a device that has not got one already.
|
|
413
431
|
*
|
|
414
432
|
* `browser.pushFile` (WebDriver base64) is an order of magnitude slower on a
|
|
415
433
|
* cold or loaded emulator — measured at 9–21s per call for this 2-byte marker,
|
|
416
434
|
* versus sub-second over `adb`. This mirrors {@link pushFiles}, which switched
|
|
417
435
|
* to `adb` for the same reason. `mkdir -p` guarantees the parent directory.
|
|
418
436
|
*
|
|
437
|
+
* ### Why it has to skip rather than always push
|
|
438
|
+
*
|
|
439
|
+
* `adb push` is a **truncating overwrite**, not a merge, and the marker is `{}`.
|
|
440
|
+
* `register` runs {@link pushFiles} first, which tars the whole host vault —
|
|
441
|
+
* dotfiles included — so by the time this runs the device is already holding the
|
|
442
|
+
* real `app.json` `ensureHeadlessVaultConfig` wrote for this run. Pushing the
|
|
443
|
+
* marker over it threw `alwaysUpdateLinks: true` away one call after it arrived,
|
|
444
|
+
* and Obsidian then opened the vault with the shipped default (off): every
|
|
445
|
+
* Android rename that touched links stopped on the interactive *"Update links?"*
|
|
446
|
+
* sheet, hanging the singleton `FileManager.updateQueue` behind it. That is the
|
|
447
|
+
* rename wall `src/headless-vault-config.ts` exists to remove, live on Android
|
|
448
|
+
* only, from 6.0.0 (when this push arrived) to 16.0.1. It cost two projects
|
|
449
|
+
* several runs apiece, and it surfaced as `EvalCapExceededError` naming the
|
|
450
|
+
* transport cap, which sends the reader after the waiting rather than the sheet.
|
|
451
|
+
*
|
|
452
|
+
* The marker exists solely to make Obsidian **recognize** the directory as a
|
|
453
|
+
* vault, and a real `app.json` does that better than `{}` does. So an existing
|
|
454
|
+
* one is left exactly as it is.
|
|
455
|
+
*
|
|
456
|
+
* ### Why the probe is `cat` and not the teardown's `ls -d`
|
|
457
|
+
*
|
|
458
|
+
* `adb shell` merges the device's stderr into stdout on a legacy shell protocol,
|
|
459
|
+
* and `ls`'s failure message *contains the path it was asked about* — so an
|
|
460
|
+
* `includes(path)` test can read **absent** as **present**, skip the push, and
|
|
461
|
+
* leave a genuinely unmarked vault that Obsidian will not open. Reading the file
|
|
462
|
+
* instead makes the ambiguity harmless: an error message does not parse as a JSON
|
|
463
|
+
* object, so anything unexpected falls through to the push, which is exactly the
|
|
464
|
+
* behaviour this replaces.
|
|
465
|
+
*
|
|
419
466
|
* @param deviceVaultPath - The device-side vault directory path.
|
|
420
467
|
*/
|
|
421
468
|
private pushObsidianMarker;
|