obsidian-integration-testing 17.1.1 → 17.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "17.1.1";
24
+ const LIBRARY_VERSION = false ? "dev" : "17.2.0";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -47,6 +47,8 @@ const KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS = 1500;
47
47
  const KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS = 900;
48
48
  const KEYBOARD_RETRACT_ATTEMPT_COUNT = 2;
49
49
  const KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS = KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS;
50
+ const CARET_PARK_ATTEMPT_COUNT = 3;
51
+ const CARET_PARK_CONFIRMATION_DELAY_IN_MILLISECONDS = 300;
50
52
  async function raiseSoftKeyboard(params) {
51
53
  await lowerSoftKeyboardIfShown(params);
52
54
  const textToRestore = await emptyFieldForTouch(params);
@@ -62,6 +64,9 @@ async function raiseSoftKeyboard(params) {
62
64
  if (textToRestore !== null) {
63
65
  await restoreFieldText(params, textToRestore);
64
66
  }
67
+ if (params.shouldPinKeyboardToolbar !== false) {
68
+ await parkCaretAtStart(params);
69
+ }
65
70
  return snapshot;
66
71
  }
67
72
  async function tapDevice(params) {
@@ -158,6 +163,36 @@ device: ${inputMethodState}`
158
163
  );
159
164
  }
160
165
  }
166
+ async function parkCaretAtStart(params) {
167
+ const selections = [];
168
+ for (let attempt = 0; attempt < CARET_PARK_ATTEMPT_COUNT; attempt++) {
169
+ const isParked = await (0, import_eval_in_obsidian.evalInObsidian)({
170
+ callback({ inputSelector }) {
171
+ const element = document.querySelector(inputSelector);
172
+ if (!(element instanceof HTMLInputElement) && !(element instanceof HTMLTextAreaElement)) {
173
+ return false;
174
+ }
175
+ element.setSelectionRange(0, 0);
176
+ return true;
177
+ },
178
+ input: { inputSelector: params.inputSelector },
179
+ ...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
180
+ });
181
+ if (!isParked) {
182
+ return;
183
+ }
184
+ await (0, import_promises.setTimeout)(CARET_PARK_CONFIRMATION_DELAY_IN_MILLISECONDS);
185
+ const selection = await readFieldSelection(params);
186
+ selections.push(selection);
187
+ if (selection?.selectionStart === 0 && selection.selectionEnd === 0) {
188
+ return;
189
+ }
190
+ }
191
+ throw new Error(
192
+ `raiseSoftKeyboard: the caret parked at offset 0 in "${params.inputSelector}" did not stay there, so Gboard's strip would show word predictions rather than its toolbar. ${String(CARET_PARK_ATTEMPT_COUNT)} attempt(s); the field read ${JSON.stringify(selections)}. Pass shouldPinKeyboardToolbar: false to leave the caret alone.
193
+ device: ${await readInputMethodState(params)}`
194
+ );
195
+ }
161
196
  async function readFieldContent(params) {
162
197
  return await (0, import_eval_in_obsidian.evalInObsidian)({
163
198
  callback({ inputSelector }) {
@@ -172,6 +207,16 @@ async function readFieldContent(params) {
172
207
  ...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
173
208
  });
174
209
  }
210
+ async function readFieldSelection(params) {
211
+ return await (0, import_eval_in_obsidian.evalInObsidian)({
212
+ callback({ inputSelector }) {
213
+ const element = document.querySelector(inputSelector);
214
+ return element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement ? { selectionEnd: element.selectionEnd, selectionStart: element.selectionStart } : null;
215
+ },
216
+ input: { inputSelector: params.inputSelector },
217
+ ...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
218
+ });
219
+ }
175
220
  async function readInputMethodState(params) {
176
221
  const dumpsysOutput = await (0, import_adb.runAdbText)({
177
222
  commandArguments: ["shell", "dumpsys", "input_method"],
@@ -261,4 +306,4 @@ async function writeFieldText(params, text) {
261
306
  raiseSoftKeyboard,
262
307
  tapDevice
263
308
  });
264
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqICAgICoqQW5kIHRoZSB0ZXh0IHdyaXR0ZW4gYmFjayBoYXMgdG8gYmUgSEVMRCwgbm90IGp1c3Qgd3JpdHRlbi4qKiBUaGUgSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb21cbiAqICAgIHRoZSBlbXB0aWVkIGZpZWxkLCBhbmQgYWJvdXQgb25lIHRpbWUgaW4gZml2ZSBpdCB3cm90ZSB0aGF0IGVtcHR5IHN0YXRlIGJhY2sgb3ZlciB0aGUgaGFybmVzcydzIHdyaXRlLFxuICogICAgc28gdGhlIGNhcHR1cmUgc3RyYWlnaHQgYWZ0ZXIgc2hvd2VkIHRoZSBwbGFjZWhvbGRlci4gVGhlIGZpZWxkIGlzIHJlLXJlYWQgdW50aWwgaXQgaG9sZHMsIGFuZCB3cml0dGVuXG4gKiAgICBhZ2FpbiB3aGVuIGl0IGRvZXMgbm90LlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBIb2xkRmllbGRUZXh0UmVzdWx0IH0gZnJvbSAnLi9maWVsZC10ZXh0LWhvbGQuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgRWxlbWVudFJlY3QsXG4gIFNvZnRLZXlib2FyZFRhcFBvaW50LFxuICBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5janMnO1xuXG5pbXBvcnQgeyBydW5BZGJUZXh0IH0gZnJvbSAnLi9hZGIuY2pzJztcbmltcG9ydCB7IGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90IH0gZnJvbSAnLi9kZXZpY2Utc2NyZWVuc2hvdC5janMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7IGhvbGRGaWVsZFRleHQgfSBmcm9tICcuL2ZpZWxkLXRleHQtaG9sZC5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2UsXG4gIGNoZWNrSXNJbnB1dE1ldGhvZFNob3duLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIHBhcnNlSW5wdXRNZXRob2RTdGF0ZSxcbiAgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1xufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmFpc2VTb2Z0S2V5Ym9hcmR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IHdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGl0IGlzIGBkaXN0L3NjcmVlbnNob3RzYCB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgXHUyMDE0IHJlc29sdmVkIGF0IGxvYWQsIHNvIHRoZXJlIGlzIG5vXG4gICAqIGxpdGVyYWwgZGVmYXVsdCB0byBzdGF0ZSBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1Mgc2VsZWN0b3Igb2YgdGhlIGZpZWxkIHRvIHRvdWNoLCBlLmcuIGAucHJvbXB0LWlucHV0YC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VsZWN0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieS5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFNgIGZyb20gYHNvZnQta2V5Ym9hcmQtZ2VvbWV0cnlgIGFwcGxpZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbXB0eSB0aGUgZmllbGQgYmVmb3JlIHRoZSB0b3VjaCwgYW5kIHdyaXRlIGl0cyB0ZXh0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogKipPbiBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZSB0b3VjaCB0aGF0IHJhaXNlcyB0aGUga2V5Ym9hcmQgYWxzbyBkcmF3cyBhIHNlbGVjdGlvbiBoYW5kbGUgd2hlbiBpdFxuICAgKiBsYW5kcyBpbnNpZGUgVEVYVC4qKiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcCBpbnRvIHRleHQgYW5kIGRyYXdzIG5vbmUgb24gYSB0YXBcbiAgICogaW50byBhbiBFTVBUWSBlZGl0YWJsZSwgYW5kIGEgZGV2aWNlIGNhcHR1cmUgcGhvdG9ncmFwaHMgaXQgXHUyMDE0IHdoaWNoIGlzIGhvdyBgb2JzaWRpYW4tbGluay1waWNrZXJgXG4gICAqIHNoaXBwZWQgYSB0ZWFsIGhhbmRsZSBpbiBhIHN0b3JlIGxpc3RpbmcgaW1hZ2UgdHdpY2UgYmVmb3JlIGFueW9uZSB1bmRlcnN0b29kIHdoZXJlIGl0IGNhbWUgZnJvbS4gQVxuICAgKiB2YWx1ZSB3cml0dGVuIGJ5IHNjcmlwdCByYWlzZXMgbm8gaGFuZGxlLCBzbyBlbXB0eWluZyB0aGUgZmllbGQsIHRvdWNoaW5nIGl0LCBhbmQgd3JpdGluZyB0aGUgdGV4dFxuICAgKiBiYWNrIGxlYXZlcyB0aGUgZnJhbWUgc2hvd2luZyB0aGUgc2FtZSBxdWVyeSB3aXRoIG5vdGhpbmcgaGFuZ2luZyBvZmYgaXQuXG4gICAqXG4gICAqIE9ubHkgYW4gYDxpbnB1dD5gIG9yIGEgYDx0ZXh0YXJlYT5gIGlzIGVtcHRpZWQuIEEgYGNvbnRlbnRlZGl0YWJsZWAgaG9sZGluZyB0ZXh0IGlzIFJFRlVTRUQgcmF0aGVyXG4gICAqIHRoYW4gd3JpdHRlbiB0bzogaXRzIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00sIGFuZCBibGFua2luZyB0aGF0XG4gICAqIGJ5IGhhbmQgZGVzdHJveXMgaXQuIEVtcHR5IHN1Y2ggYSBmaWVsZCB5b3Vyc2VsZiwgb3IgdHVybiB0aGlzIG9mZi5cbiAgICpcbiAgICogVHVybmluZyBpdCBvZmYgcmVzdG9yZXMgdGhlIHByZS0yMDI2LTA5LTIzIGJlaGF2aW91ciBleGFjdGx5OiB0aGUgZmllbGQgaXMgdG91Y2hlZCBhcyBpdCBzdGFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVtcHR5RmllbGRGb3JUb3VjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0byByZWFkIHRoZSBnZW9tZXRyeSBmcm9tLiBXaGVuIG9taXR0ZWQsIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCdzIHZhdWx0IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRhcERldmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwRGV2aWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byB0b3VjaCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50OiBTb2Z0S2V5Ym9hcmRUYXBQb2ludDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBpdHMgZXZpZGVuY2UgXHUyMDE0IHVuZGVyIGBkaXN0L2AsIHdoaWNoIGEgcGx1Z2luIHJlcG8gdXNpbmcgdGhpcyBoYXJuZXNzIGdpdGlnbm9yZXMsIGxpa2UgdGhlIGNhcHR1cmUgc2NyYXRjaCBmaWxlcy5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlkgPSBqb2luKHByb2Nlc3MuY3dkKCksICdkaXN0JywgJ3NjcmVlbnNob3RzJyk7XG5cbi8qKlxuICogSG93IGxvbmcgdGhlIElNRSB0YWtlcyB0byBmaW5pc2ggYW5pbWF0aW5nIGluLCBhZnRlciB3aGljaCB0aGUgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICovXG5jb25zdCBLRVlCT0FSRF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTUwMDtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgb3V0IGFmdGVyIGBLRVlDT0RFX0JBQ0tgLCBtZWFzdXJlZCBpbiB0aGUgY2FwdHVyZSBzdWl0ZSB0aGlzXG4gKiB3YXMgbW92ZWQgb3V0IG9mLlxuICovXG5jb25zdCBLRVlCT0FSRF9SRVRSQUNUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDkwMDtcblxuLyoqXG4gKiBIb3cgbWFueSB0aW1lcyBgS0VZQ09ERV9CQUNLYCBpcyBwcmVzc2VkIGJlZm9yZSBhIGtleWJvYXJkIHRoYXQgd2lsbCBub3QgZ28gZG93biBpcyByZXBvcnRlZC5cbiAqXG4gKiBUd28sIGJlY2F1c2UgdGhlIGZpcnN0IHByZXNzIGNhbiBsYW5kIHdoaWxlIHRoZSBJTUUgaXMgc3RpbGwgYW5pbWF0aW5nIFVQIGZyb20gdGhlIGZvY3VzIHRoYXQgcmFpc2VkXG4gKiBpdCwgYW5kIGFuIElNRSBtaWQtYW5pbWF0aW9uIHN3YWxsb3dzIHRoZSBrZXkgd2l0aG91dCByZXRyYWN0aW5nLlxuICovXG5jb25zdCBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIEhvdyBsb25nIGEga2V5Ym9hcmQgcmVwb3J0ZWQgc2hvd2luZyBpcyB3YXRjaGVkIGJlZm9yZSBgS0VZQ09ERV9CQUNLYCBpcyBwcmVzc2VkIGF0IGl0LlxuICpcbiAqIE9uZSByZXRyYWN0IGFuaW1hdGlvbjogYW4gSU1FIGFscmVhZHkgb24gaXRzIHdheSBkb3duIFx1MjAxNCB0aGUgbW9kYWwgdGhhdCByYWlzZWQgaXQgaGFzIGp1c3QgY2xvc2VkIFx1MjAxNCBpc1xuICogc3RpbGwgcmVwb3J0ZWQgc2hvd2luZyBieSBhIHJlYWQgdGFrZW4gYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBhbmQgaXMgZ29uZSBieSB0aGUgZW5kIG9mIGl0LiBQcmVzc2luZ1xuICogYXQgdGhlIGZpcnN0IHJlYWQgdGhlbiBsYW5kcyB0aGUga2V5IG9uIHRoZSBhcHAgaW5zdGVhZCwgd2hpY2ggY2xvc2VzIHRoZSBtb2RhbCB0aGUgZnJhbWUgaXMgYWJvdXQgdG9cbiAqIHBob3RvZ3JhcGguIFR3byByZWFkcyB0aGF0IGFncmVlIGFjcm9zcyB0aGlzIHdpbmRvdyBzYXkgdGhlIGtleWJvYXJkIGlzIHN0YXlpbmcgdXAuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSBLRVlCT0FSRF9SRVRSQUNUX0RFTEFZX0lOX01JTExJU0VDT05EUztcblxuLyoqXG4gKiBXaGF0IGEgZmllbGQgaG9sZHMsIGFuZCB3aGV0aGVyIGl0IGlzIG9uZSB0aGlzIGNhbiBwdXQgYmFjay5cbiAqL1xuaW50ZXJmYWNlIEZpZWxkQ29udGVudCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmaWVsZCdzIHZhbHVlIGNhbiBiZSB3cml0dGVuIFx1MjAxNCB0cnVlIGZvciBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAsIGZhbHNlIGZvclxuICAgKiBhbnl0aGluZyBlbHNlLCB3aG9zZSBjb250ZW50IHVzdWFsbHkgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuV3JpdGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRoZSBmaWVsZCBjdXJyZW50bHkgaG9sZHMuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmFpc2VzIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQgd2l0aCBhIHJlYWwgdG91Y2ggb24gYSBmaWVsZCwgYW5kIGNvbmZpcm1zIGl0IGNhbWUgdXAuXG4gKlxuICogQ2FsbCBpdCBpbnNpZGUgYHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkYCBcdTIwMTQgdGhlIGRldmljZSBzZXR0aW5nIGFsb25lIGRvZXMgbm90IHJhaXNlIHRoZSBrZXlib2FyZCwgYW5kIHRoaXNcbiAqIHRvdWNoIGFsb25lIGNhbm5vdCB3aGlsZSB0aGUgc2V0dGluZyBzdXBwcmVzc2VzIGl0LlxuICpcbiAqICoqQSBrZXlib2FyZCB0aGF0IGlzIGFscmVhZHkgdXAgaXMgcHV0IERPV04gZmlyc3QuKiogVGhlIGZpcnN0IGdlb21ldHJ5IHJlYWQgaXMgdGhlIGJhc2VsaW5lIGV2ZXJ5IGxhdGVyXG4gKiByZWFkIGlzIGNvbXBhcmVkIGFnYWluc3QsIHNvIGEga2V5Ym9hcmQgYWxyZWFkeSB1cCB3b3VsZCBsZWF2ZSB0aGUgZmllbGQgbm90aGluZyB0byBsaWZ0IGJ5IGFuZCByZWFkIGFzXG4gKiBvbmUgdGhhdCBuZXZlciBjYW1lLiBUaGUgZGV2aWNlIGlzIGFza2VkIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBhbmQgYSBzaG93aW5nIElNRSBpcyByZXRyYWN0ZWQgd2l0aFxuICogYEtFWUNPREVfQkFDS2AgXHUyMDE0IGFza2VkIEZJUlNUIGJlY2F1c2UsIHdpdGggbm8gSU1FIHNob3dpbmcsIHRoYXQga2V5IHJlYWNoZXMgdGhlIGFwcCBhbmQgY2xvc2VzIHRoZSB2ZXJ5XG4gKiBtb2RhbCB0aGUgZnJhbWUgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gU28gdGhlIGhlbHBlciBpcyBzYWZlIHRvIGNhbGwgb25jZSBwZXIgZnJhbWUgb2YgYSBtdWx0aS1mcmFtZVxuICogc3VpdGUsIGFuZCBldmVyeSBjYWxsIHN0aWxsIHByb3ZlcyBpdHMgb3duIGxpZnQuIFRoZSBvdGhlciBhbnN3ZXIgXHUyMDE0IGFjY2VwdGluZyBhIHplcm8gbGlmdCB3aGVuZXZlciB0aGVcbiAqIGRldmljZSByZXBvcnRzIGEga2V5Ym9hcmQgXHUyMDE0IHdhcyByZWZ1c2VkLCBiZWNhdXNlIGl0IGFjY2VwdHMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZCBub3QgcHJvdmUuXG4gKlxuICogKipUaGUgZmllbGQgaXMgRU1QVElFRCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcyoqLCBiZWNhdXNlIGEgdG91Y2ggdGhhdCBsYW5kcyBpbnNpZGVcbiAqIHRleHQgZHJhd3MgQ2hyb21pdW0ncyBzZWxlY3Rpb24gaGFuZGxlIGFuZCB0aGUgZnJhbWVidWZmZXIgcGhvdG9ncmFwaHMgaXQgXHUyMDE0IHNlZVxuICoge0BsaW5rIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaH0sIHdoaWNoIHR1cm5zIHRoYXQgb2ZmLlxuICpcbiAqICoqVGhlIGdlb21ldHJ5IHJldHVybmVkIGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgc3RpbGwgZW1wdHkqKiwgYW5kIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gYmFjayBhZnRlciBpdC5cbiAqIFRoYXQgaXMgdGhlIHN0YXRlIHRoZSBwcm92ZW4gY2FwdHVyZSBzdWl0ZXMgYXNzZXJ0IGFnYWluc3QsIGFuZCBpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuXG4gKiBpbmNpZGVudGFsOiB0aGUgYmFzZWxpbmUgaXMgcmVhZCBBRlRFUiB0aGUgZmllbGQgaXMgZW1wdGllZCwgc28gdGhlIGxpZnQgaXMgbWVhc3VyZWQgYmV0d2VlbiB0d28gcmVhZHNcbiAqIG9mIHRoZSBzYW1lIGZpZWxkIGNvbnRlbnQuIEEgZmllbGQgd2hvc2Ugb3duIHRleHQgY2hhbmdlcyB0aGUgbGF5b3V0IGFyb3VuZCBpdCBcdTIwMTQgYSBzdWdnZXN0ZXIgd2hvc2Ugcm93XG4gKiBjb3VudCBhbnN3ZXJzIHRoZSBxdWVyeSBcdTIwMTQgbW92ZXMgd2hlbiBpdCBpcyBjbGVhcmVkLCBhbmQgYSBkZWx0YSBtZWFzdXJlZCBhY3Jvc3MgdGhhdCBtb3ZlIGlzIG5vdCBhXG4gKiBrZXlib2FyZC4gUmVhZCB0aGUgZ2VvbWV0cnkgYWdhaW4geW91cnNlbGYgaWYgdGhlIHJlc3RvcmVkIHRleHQgbW92ZXMgYW55dGhpbmcgeW91IGFyZSBhYm91dCB0byBhc3NlcnRcbiAqIG9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEga2V5Ym9hcmQgYWxyZWFkeSB1cCB3b3VsZCBub3QgZ28gZG93biwgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIGlmIGl0IGhvbGRzIHRleHRcbiAqICAgdGhpcyBjYW5ub3QgZW1wdHkgYW5kIHB1dCBiYWNrLCBpZiBpdCBuZXZlciBsaWZ0ZWQgXHUyMDE0IGFmdGVyIHdyaXRpbmcgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgdGhlXG4gKiAgIGRldmljZSdzIG93biBgaW5wdXRfbWV0aG9kYCBzdGF0ZSB0byB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IFx1MjAxNCBvciBpZiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgd291bGQgbm90XG4gKiAgIHN0YXkgaW4gdGhlIGZpZWxkLiBBIHdyaXRlLWJhY2sgdGhlIElNRSB1bmRvZXMgaXMgd3JpdHRlbiBhZ2FpbiB1bnRpbCBpdCBob2xkczsgc2VlIGByZXN0b3JlRmllbGRUZXh0YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhaXNlU29mdEtleWJvYXJkKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgYXdhaXQgbG93ZXJTb2Z0S2V5Ym9hcmRJZlNob3duKHBhcmFtcyk7XG5cbiAgY29uc3QgdGV4dFRvUmVzdG9yZSA9IGF3YWl0IGVtcHR5RmllbGRGb3JUb3VjaChwYXJhbXMpO1xuXG4gIGxldCBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICB0cnkge1xuICAgIHNuYXBzaG90ID0gYXdhaXQgdGFwVW50aWxLZXlib2FyZElzVXAocGFyYW1zKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXN0b3JlZCBldmVuIHdoZW4gdGhlIHJhaXNlIGZhaWxlZDogYSBjYWxsZXIgdGhhdCBpcyBhYm91dCB0byByZWFkIGl0cyBvd24gZGlhZ25vc3RpYyBzaG91bGQgbm90XG4gICAgLy8gYWxzbyBoYXZlIHRvIGRpc2NvdmVyIHRoYXQgaXRzIHF1ZXJ5IGlzIGdvbmUuIEJlc3QtZWZmb3J0LCBzbyB0aGUgcmFpc2UncyBvd24gZXJyb3IgaXMgdGhlIG9uZSB0aHJvd24uXG4gICAgaWYgKHRleHRUb1Jlc3RvcmUgIT09IG51bGwpIHtcbiAgICAgIGF3YWl0IGhvbGRGaWVsZFRleHRCZXN0RWZmb3J0KHBhcmFtcywgdGV4dFRvUmVzdG9yZSk7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgIGF3YWl0IHJlc3RvcmVGaWVsZFRleHQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBkZXZpY2UgYXQgYSBwb2ludCwgdGhlIHdheSBhIHRodW1iIHdvdWxkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB3aGVyZSB0byB0b3VjaCBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdG91Y2ggaGFzIGJlZW4gZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhcERldmljZShwYXJhbXM6IFRhcERldmljZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ3RhcCcsIFN0cmluZyhwYXJhbXMucG9pbnQueEluUGl4ZWxzKSwgU3RyaW5nKHBhcmFtcy5wb2ludC55SW5QaXhlbHMpXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyIGFuZCByZWFkcyB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHRoZW4gY29tcG9zZXMgdGhlIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gYmFzZWxpbmVTbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2gsIHdoaWNoIHRoZSB2ZXJkaWN0IGlzIG1lYXN1cmVkIGFnYWluc3QuXG4gKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1lc3NhZ2UgdG8gdGhyb3cuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmFpbHVyZU1lc3NhZ2UoXG4gIHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsXG4gIGJhc2VsaW5lU25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QsXG4gIHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWFnbm9zdGljc0RpcmVjdG9yeSA9IHBhcmFtcy5kaWFnbm9zdGljc0RpcmVjdG9yeSA/PyBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWTtcbiAgbWtkaXJTeW5jKGRpYWdub3N0aWNzRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGpvaW4oZGlhZ25vc3RpY3NEaXJlY3RvcnksICdrZXlib2FyZC1ub3QtcmFpc2VkLnBuZycpO1xuICB3cml0ZUZpbGVTeW5jKHNjcmVlbnNob3RQYXRoLCBhd2FpdCBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQgfSkpO1xuXG4gIHJldHVybiBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlKHtcbiAgICBiYXNlbGluZVNuYXBzaG90LFxuICAgIGlucHV0TWV0aG9kU3RhdGU6IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyksXG4gICAgc2NyZWVuc2hvdFBhdGgsXG4gICAgc25hcHNob3RcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhbnl0aGluZyBpbiB0aGUgcGFnZSBtYXRjaGVzIHRoZSBmaWVsZCdzIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgaXQgbWF0Y2hlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpICE9PSBudWxsO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGZpZWxkIHRoZSB0b3VjaCBpcyBhYm91dCB0byBsYW5kIG9uLCBhbmQgcmVwb3J0cyB3aGF0IHRvIHdyaXRlIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBlbXB0eSwgYW5kIHdoZXRoZXIgdG8gZW1wdHkgaXQgYXQgYWxsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCB0byByZXN0b3JlLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdhcyBlbXB0aWVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgaG9sZHMgdGV4dCB0aGF0IGNhbm5vdCBiZSB3cml0dGVuIGJhY2sgXHUyMDE0IGEgYGNvbnRlbnRlZGl0YWJsZWAsIHdob3NlIGNvbnRlbnRcbiAqICAgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBpZiAocGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG5cbiAgLy8gTm90aGluZyBtYXRjaGVkLiBUaGUgZ2VvbWV0cnkgcmVhZCBkb2VzIHRoZSByZXBvcnRpbmcsIHdpdGggdGhlIG1lc3NhZ2UgaXQgYWx3YXlzIGhhZC5cbiAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY29udGVudC5jYW5Xcml0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGhvbGRzIHRleHQgYnV0IGlzIG5vdCBhbiA8aW5wdXQ+IG9yIGEgPHRleHRhcmVhPiwgc28gaXQgYFxuICAgICAgICArICdjYW5ub3QgYmUgZW1wdGllZCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2suIFRoZSB0b3VjaCB3b3VsZCBsYW5kIGluc2lkZSB0ZXh0IGFuZCBkcmF3IGEgJ1xuICAgICAgICArICdzZWxlY3Rpb24gaGFuZGxlLCB3aGljaCBhIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzLiBFbXB0eSB0aGUgZmllbGQgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcsIG9yICdcbiAgICAgICAgKyAncGFzcyBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2g6IGZhbHNlIHRvIHRvdWNoIGl0IGFzIGl0IHN0YW5kcy4nXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgJycpO1xuXG4gIHJldHVybiBjb250ZW50LnRleHQ7XG59XG5cbi8qKlxuICogSG9sZHMgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHdpdGhvdXQgZXZlciB0aHJvd2luZyBcdTIwMTQgdGhlIHJlc3RvcmUgb24gYSByYWlzZSB0aGF0IGFscmVhZHkgZmFpbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgaXQgbXVzdCBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBob2xkIGhhcyBydW4sIHdoYXRldmVyIGl0IGZvdW5kLlxuICovXG5hc3luYyBmdW5jdGlvbiBob2xkRmllbGRUZXh0QmVzdEVmZm9ydChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBob2xkVGV4dEluRmllbGQocGFyYW1zLCB0ZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIHJhaXNlJ3Mgb3duIGZhaWx1cmUgaXMgd2hhdCB0aGUgY2FsbGVyIG5lZWRzIHRvIHNlZTsgYSBmaWVsZCB0aGF0IGlzIGdvbmUgYXMgd2VsbCBhZGRzIG5vdGhpbmcgdG8gaXQuXG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIHRleHQgaW50byB0aGUgZmllbGQgYW5kIGhvbGRzIGl0IHRoZXJlLCBwZXIge0BsaW5rIGhvbGRGaWVsZFRleHR9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgaXQgbXVzdCBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGF0IHRoZSBob2xkIGZvdW5kLlxuICovXG5hc3luYyBmdW5jdGlvbiBob2xkVGV4dEluRmllbGQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTxIb2xkRmllbGRUZXh0UmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBob2xkRmllbGRUZXh0KHtcbiAgICBleHBlY3RlZFRleHQ6IHRleHQsXG4gICAgYXN5bmMgcmVhZFRleHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpZWxkQ29udGVudChwYXJhbXMpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQ/LnRleHQgPz8gbnVsbDtcbiAgICB9LFxuICAgIHNsZWVwLFxuICAgIGFzeW5jIHdyaXRlVGV4dCh2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB3cml0ZUZpZWxkVGV4dChwYXJhbXMsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFB1dHMgdGhlIGtleWJvYXJkIGRvd24gd2hlbiB0aGUgZGV2aWNlIHJlcG9ydHMgb25lIHNob3dpbmcsIHNvIHRoZSBiYXNlbGluZSByZWFkIG5leHQgaXMgb25lIHRoZSB0b3VjaFxuICogY2FuIGxpZnQgdGhlIGZpZWxkIGZyb20uXG4gKlxuICogKipBIGtleWJvYXJkIGlzIHByZXNzZWQgYXQgb25seSBvbmNlIGl0IGhhcyBiZWVuIHJlcG9ydGVkIHNob3dpbmcgVFdJQ0UsIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBhcGFydC4qKlxuICogYEtFWUNPREVfQkFDS2AgaXMgcmV0cmFjdGVkIGJ5IHRoZSBJTUUgb25seSB3aGlsZSB0aGUgSU1FIGlzIHVwOyBvbmNlIGl0IGhhcyBnb25lLCB0aGUga2V5IHJlYWNoZXMgdGhlXG4gKiBhcHAsIGFuZCBPYnNpZGlhbiBjbG9zZXMgdGhlIG1vZGFsIG9uIHNjcmVlbiBcdTIwMTQgdGhlIG9uZSB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIHBob3RvZ3JhcGguIEEga2V5Ym9hcmRcbiAqIGFscmVhZHkgb24gaXRzIHdheSBkb3duICh0aGUgbW9kYWwgdGhhdCByYWlzZWQgaXQgaGFzIGp1c3QgY2xvc2VkLCBhbmQgdGhlIGNhbGxlciBvcGVuZWQgYSBmcmVzaCBvbmVcbiAqIHN0cmFpZ2h0IGFmdGVyKSBpcyBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGF0IHRoZSBzdGFydCBvZiBpdHMgcmV0cmFjdCwgc28gcHJlc3NpbmcgYXQgdGhlIGZpcnN0IHJlYWRcbiAqIHJhY2VkIGl0LiBJdCBpcyB3YXRjaGVkIGZvciBvbmUgcmV0cmFjdCBhbmltYXRpb24gZmlyc3QsIGFuZCBhIGtleWJvYXJkIHRoYXQgd2VudCBkb3duIG9uIGl0cyBvd24gaXNcbiAqIGxlZnQgYWxvbmUuXG4gKlxuICogKipBbmQgYSBwcmVzcyB0aGF0IHJlYWNoZWQgdGhlIGFwcCBhbnl3YXkgaXMgbmFtZWQgYXMgdGhhdC4qKiBUaGUgZmllbGQgaXMgbG9va2VkIHVwIGJlZm9yZSB0aGUgcHJlc3NcbiAqIGFuZCBhZnRlciBpdDsgb25lIHRoYXQgbWF0Y2hlZCBiZWZvcmUgYW5kIG5vdCBhZnRlciB3YXMgY2xvc2VkIGJ5IHRoZSBrZXksIGFuZCBzYXlpbmcgc28gYmVhdHMgdGhlXG4gKiBgbm90aGluZyBtYXRjaGVzYCB0aGF0IHRoZSByYWlzZSB3b3VsZCBvdGhlcndpc2UgcmVwb3J0IGEgc3RlcCBsYXRlciwgYWJvdXQgYSBzZWxlY3RvciB0aGF0IHdhcyByaWdodC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSB0byBhc2ssIGFuZCB0aGUgZmllbGQgdGhhdCBtdXN0IHN1cnZpdmUgdGhlIHByZXNzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIG5vIGtleWJvYXJkIGlzIHNob3dpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEga2V5Ym9hcmQgaXMgc3RpbGwgc2hvd2luZyBhZnRlciB7QGxpbmsgS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UfSBwcmVzc2VzIG9mXG4gKiAgIGBLRVlDT0RFX0JBQ0tgIFx1MjAxNCB0aGUgcmFpc2UgdGhhdCBmb2xsb3dzIGNvdWxkIHByb3ZlIG5vdGhpbmcsIGFuZCBpdHMgb3duIGZhaWx1cmUgd291bGQgYmxhbWUgYSBrZXlib2FyZFxuICogICB0aGF0IG5ldmVyIGNhbWUgd2hlbiB0aGUgdHJ1dGggaXMgb25lIHRoYXQgbmV2ZXIgbGVmdCBcdTIwMTQgb3IgaWYgYSBwcmVzcyBjbG9zZWQgdGhlIGZpZWxkJ3Mgb3duIFVJLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb3dlclNvZnRLZXlib2FyZElmU2hvd24ocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgaW5wdXRNZXRob2RTdGF0ZSA9IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgIGlmICghY2hlY2tJc0lucHV0TWV0aG9kU2hvd24oaW5wdXRNZXRob2RTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBzbGVlcChLRVlCT0FSRF9TSE9XTl9DT05GSVJNQVRJT05fREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICAgIGlmICghY2hlY2tJc0lucHV0TWV0aG9kU2hvd24oaW5wdXRNZXRob2RTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzID0gYXdhaXQgY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXMpO1xuICAgIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsICdLRVlDT0RFX0JBQ0snXSxcbiAgICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgICB9KTtcbiAgICBhd2FpdCBzbGVlcChLRVlCT0FSRF9SRVRSQUNUX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBpZiAoaXNGaWVsZFByZXNlbnRCZWZvcmVQcmVzcyAmJiAhYXdhaXQgY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdyYWlzZVNvZnRLZXlib2FyZDogS0VZQ09ERV9CQUNLLCBwcmVzc2VkIHRvIHB1dCBkb3duIGEga2V5Ym9hcmQgdGhlIGRldmljZSByZXBvcnRlZCBzaG93aW5nLCByZWFjaGVkIHRoZSBhcHAgaW5zdGVhZCBhbmQgJ1xuICAgICAgICAgICsgYGNsb3NlZCB0aGUgVUkgaG9sZGluZyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgXHUyMDE0IGl0IG1hdGNoZWQgYmVmb3JlIHRoZSBwcmVzcyBhbmQgbWF0Y2hlcyBub3RoaW5nIGFmdGVyIGl0LiBUaGUgYFxuICAgICAgICAgICsgJ2tleWJvYXJkIHdlbnQgZG93biBiZXR3ZWVuIHRoZSBsYXN0IHJlYWQgYW5kIHRoZSBwcmVzcy4gTGV0IHRoZSBwcmV2aW91cyBrZXlib2FyZCBzZXR0bGUgYmVmb3JlIG9wZW5pbmcgdGhlIFVJICdcbiAgICAgICAgICArIGB0byByYWlzZSBpdCBvbi5cbmRldmljZSBiZWZvcmUgdGhlIHByZXNzOiAke2lucHV0TWV0aG9kU3RhdGV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcbiAgfVxuXG4gIGlmIChjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogYSBrZXlib2FyZCB3YXMgYWxyZWFkeSB1cCBhbmQgZGlkIG5vdCBnbyBkb3duIGFmdGVyICR7U3RyaW5nKEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCl9IHByZXNzZXMgb2YgYFxuICAgICAgICArICdLRVlDT0RFX0JBQ0ssIHNvIHRoZSBsaWZ0IHRoYXQgcHJvdmVzIGEgcmFpc2UgY291bGQgbm90IGJlIG1lYXN1cmVkLiBUaGUgZmllbGQgd291bGQgcmVhZCBhcyBvbmUgdGhhdCBuZXZlciAnXG4gICAgICAgICsgYG1vdmVkIHVuZGVyIGEga2V5Ym9hcmQgdGhhdCBpcyBwbGFpbmx5IHNob3dpbmcuXG5kZXZpY2U6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHdoYXQgdGhlIGZpZWxkIGhvbGRzLCBhbmQgd2hldGhlciBpdCBpcyBvbmUgd2hvc2UgdmFsdWUgY2FuIGJlIHdyaXR0ZW4gYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50LCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkRmllbGRDb250ZW50KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPEZpZWxkQ29udGVudCB8IG51bGw+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IEZpZWxkQ29udGVudCB8IG51bGwge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuV3JpdGUgPSBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudDtcblxuICAgICAgcmV0dXJuIHsgY2FuV3JpdGUsIHRleHQ6IGNhbldyaXRlID8gZWxlbWVudC52YWx1ZSA6IGVsZW1lbnQudGV4dENvbnRlbnQgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBBc2tzIHRoZSBkZXZpY2Ugd2hhdCBpdHMgSU1FIGlzIGRvaW5nIFx1MjAxNCB0aGUgb25seSBwbGFjZSB0aGF0IGtub3dzLCBzaW5jZSBub3RoaW5nIGluIHRoZSBwYWdlIHJlcG9ydHMgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgdG8gYXNrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmllbGRzIHtAbGluayBwYXJzZUlucHV0TWV0aG9kU3RhdGV9IGtlZXBzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZHVtcHN5c091dHB1dCA9IGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IFsnc2hlbGwnLCAnZHVtcHN5cycsICdpbnB1dF9tZXRob2QnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZUlucHV0TWV0aG9kU3RhdGUoZHVtcHN5c091dHB1dCk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgcmVuZGVyZXIga25vd3MgYWJvdXQgaXRzIG93biBnZW9tZXRyeS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIG1lYXN1cmUgYW5kIHRoZSB2YXVsdCB0byByZWFkIGl0IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2aWV3cG9ydCBhbmQgdGhlIGZpZWxkJ3MgcmVjdCwgaW4gQ1NTIHBpeGVscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Qge1xuICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBUaGlzIGNsb3N1cmUgaXMgc2VyaWFsaXplZCBhbmQgZXZhbHVhdGVkIGluIHRoZSByZW5kZXJlciwgc28gYSBoZWxwZXIgaG9pc3RlZCB0byBtb2R1bGUgc2NvcGUgd291bGQgbm90IGV4aXN0IHRoZXJlLlxuICAgICAgZnVuY3Rpb24gdG9SZWN0KHJlY3Q6IERPTVJlY3QpOiBFbGVtZW50UmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiByZWN0LnRvcCxcbiAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgaW5uZXJIZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgaW5wdXRSZWN0OiBpbnB1dEVsID8gdG9SZWN0KGlucHV0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIDogbnVsbCxcbiAgICAgICAgc2NyZWVuWTogd2luZG93LnNjcmVlbllcbiAgICAgIH07XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBlbXB0aWVkIGZpZWxkJ3MgdGV4dCBiYWNrLCBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0IGhhcyBzdGF5ZWQgdGhlcmUuXG4gKlxuICogKipXcml0aW5nIGl0IG9uY2UgaXMgbm90IGVub3VnaC4qKiBUaGUgdG91Y2ggdGhhdCByYWlzZWQgdGhlIGtleWJvYXJkIGxhbmRlZCBvbiB0aGUgRU1QVFkgZmllbGQsIHNvIHRoZVxuICogSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb20gYW4gZW1wdHkgZmllbGQsIGFuZCBhYm91dCBvbmUgdGltZSBpbiBmaXZlIGEgbGF0ZXIgdXBkYXRlIGZyb20gaXQgd3JvdGVcbiAqIHRoYXQgZW1wdHkgc3RhdGUgYmFjayBvdmVyIHRoaXMgd3JpdGUgKG1lYXN1cmVkIDIwMjYtMDktMjUgaW4gYG9ic2lkaWFuLWFsaWFzLXF1aWNrLXN3aXRjaGVyYCdzIGNhcHR1cmVcbiAqIHN1aXRlOiAyIG9mIDEwIGZyYW1lcyBzaG93ZWQgdGhlIHBsYWNlaG9sZGVyLCB3aGlsZSB0aGUgR2JvYXJkIHN0cmlwIHN0aWxsIG9mZmVyZWQgdGhlIHdvcmQgdGhhdCBoYWQgYmVlblxuICogd3JpdHRlbikuIFRoZSBjYXB0dXJlIHRha2VuIHN0cmFpZ2h0IGFmdGVyIHBob3RvZ3JhcGhlZCB0aGUgZW1wdHkgZmllbGQsIGFuZCBub3RoaW5nIHNhaWQgc28uIFNvIHRoZSBmaWVsZCBpc1xuICogcmUtcmVhZCB1bnRpbCBzZXZlcmFsIHJlYWRzIGFncmVlLCBhbmQgd3JpdHRlbiBhZ2FpbiB3aGVuZXZlciBvbmUgZG9lcyBub3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZSwgYW5kIHRoZSBkZXZpY2UgdG8gYXNrIGFib3V0IGl0cyBJTUUgd2hlbiB0aGUgdGV4dCB3aWxsIG5vdCBob2xkLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRoZSBmaWVsZCBoZWxkIGJlZm9yZSBpdCB3YXMgZW1wdGllZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdGV4dCBoYXMgaGVsZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRleHQgZGlkIG5vdCBob2xkIGFmdGVyIGV2ZXJ5IHJld3JpdGUsIG9yIHRoZSBmaWVsZCB3ZW50IGF3YXkgXHUyMDE0IG5hbWluZyBldmVyeSByZWFkIGFuZFxuICogICB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHJhdGhlciB0aGFuIHJldHVybmluZyB3aXRoIHRoZSBmaWVsZCBzaWxlbnRseSBlbXB0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaG9sZFRleHRJbkZpZWxkKHBhcmFtcywgdGV4dCk7XG5cbiAgaWYgKHJlc3VsdC53cml0ZUNvdW50ID4gMSkge1xuICAgIGxvZyhcbiAgICAgIGBbc29mdC1rZXlib2FyZF0gVGhlIHRleHQgd3JpdHRlbiBiYWNrIGludG8gXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIHdhcyBsb3N0ICR7U3RyaW5nKHJlc3VsdC53cml0ZUNvdW50IC0gMSl9IHRpbWUocykgYFxuICAgICAgICArIGBhbmQgd3JpdHRlbiBhZ2FpbjsgcmVhZHM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LnJlYWRUZXh0cyl9LmBcbiAgICApO1xuICB9XG5cbiAgaWYgKCFyZXN1bHQuaXNIZWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgaW50byBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgYWZ0ZXIgdGhlIHRvdWNoIGRpZCBub3Qgc3RheSB0aGVyZS4gYFxuICAgICAgICArIGBFeHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KHRleHQpfTsgJHtTdHJpbmcocmVzdWx0LndyaXRlQ291bnQpfSB3cml0ZShzKSwgYW5kIHRoZSBmaWVsZCByZWFkIGBcbiAgICAgICAgKyBgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQucmVhZFRleHRzKX0uIEEgY2FwdHVyZSB0YWtlbiBub3cgd291bGQgc2hvdyB0aGUgZmllbGQgd2l0aG91dCBpdHMgdGV4dC5cbmRldmljZTogJHthd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZmllbGQgdW50aWwgdGhlIGtleWJvYXJkIGlzIHVwLCBhbmQgc2F5cyBzbyB3aGVuIGl0IG5ldmVyIGNhbWUuXG4gKlxuICogVGhlIGJhc2VsaW5lIGlzIHJlYWQgaGVyZSByYXRoZXIgdGhhbiBieSB0aGUgY2FsbGVyLCBzbyBpdCBpcyByZWFkIHdpdGggdGhlIGZpZWxkIGluIHRoZSBzdGF0ZSB0aGVcbiAqIHRhcHMgYXJlIGRpc3BhdGNoZWQgYWdhaW5zdCBcdTIwMTQgc2VlIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0gZm9yIHdoeSB0aGUgdHdvIGhhdmUgdG8gbWF0Y2guXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIG9yIGlmIGl0IG5ldmVyIGxpZnRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFwVW50aWxLZXlib2FyZElzVXAocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICBjb25zdCBiYXNlbGluZVNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIGxldCBzbmFwc2hvdCA9IGJhc2VsaW5lU25hcHNob3Q7XG5cbiAgaWYgKCFzbmFwc2hvdC5pbnB1dFJlY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhaXNlU29mdEtleWJvYXJkOiBub3RoaW5nIG1hdGNoZXMgXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiLCBzbyB0aGVyZSBpcyBubyBmaWVsZCB0byB0b3VjaC5gKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcG9pbnQgb2YgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50cyh7IHNuYXBzaG90IH0pKSB7XG4gICAgaWYgKGNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IHRhcERldmljZSh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsIHBvaW50IH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIH1cblxuICBpZiAoIWNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgYnVpbGRGYWlsdXJlTWVzc2FnZShwYXJhbXMsIGJhc2VsaW5lU25hcHNob3QsIHNuYXBzaG90KSk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG5cbiAgZnVuY3Rpb24gY2hlY2tJc1VwKGN1cnJlbnQ6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hlY2tJc1NvZnRLZXlib2FyZFVwKHtcbiAgICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgICAuLi4ocGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzICE9PSB1bmRlZmluZWQgJiYgeyBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsczogcGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzIH0pLFxuICAgICAgc25hcHNob3Q6IGN1cnJlbnRcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBhIGZpZWxkJ3MgdmFsdWUgYW5kIHRlbGxzIHRoZSBwYWdlIGl0IGNoYW5nZWQuXG4gKlxuICogVGhlIGBpbnB1dGAgZXZlbnQgaXMgd2hhdCBhIHNjcmlwdGVkIHdyaXRlIG93ZXMgdGhlIHBhZ2U6IHdpdGhvdXQgaXQgYSBzdWdnZXN0ZXIga2VlcHMgdGhlIHJvd3MgaXQgaGFkXG4gKiBmb3IgdGhlIHRleHQgdGhhdCBpcyBubyBsb25nZXIgdGhlcmUuIEl0IGJ1YmJsZXMsIGJlY2F1c2UgdGhhdCBpcyBob3cgYSBmcmFtZXdvcmsgbGlzdGVuaW5nIG9uIGFcbiAqIGNvbnRhaW5lciBoZWFycyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIHdyaXRlLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRvIHdyaXRlIGludG8gaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHdyaXRlIGhhcyBiZWVuIG1hZGUuXG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0aGUgZmllbGQgaXMgbm90IG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWVsZFRleHQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IsIHRleHQ6IHZhbHVlIH0pOiB2b2lkIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IFwiJHtpbnB1dFNlbGVjdG9yfVwiIGlzIG5vdCBhIGZpZWxkIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLmApO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciwgdGV4dCB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNERBLHFCQUdPO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQUNwQixzQkFBb0M7QUFTcEMsaUJBQTJCO0FBQzNCLCtCQUF3QztBQUN4Qyw4QkFBK0I7QUFDL0IsNkJBQThCO0FBQzlCLGlCQUFvQjtBQUNwQixvQ0FNTztBQTJFUCxNQUFNLG9DQUFnQyx1QkFBSyxvQkFBQUEsUUFBUSxJQUFJLEdBQUcsUUFBUSxhQUFhO0FBSy9FLE1BQU0sd0NBQXdD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QVMsQ0FBQztBQUFBLElBQ25FO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxPQUFPLFFBQVE7QUFDbEIsVUFBTSxJQUFJO0FBQUEsTUFDUixrREFBa0QsT0FBTyxhQUFhLGtEQUN0RCxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssT0FBTyxPQUFPLFVBQVUsQ0FBQyxpQ0FDM0QsS0FBSyxVQUFVLE9BQU8sU0FBUyxDQUFDO0FBQUEsVUFDbkMsTUFBTSxxQkFBcUIsTUFBTSxDQUFDO0FBQUEsSUFDeEM7QUFBQSxFQUNGO0FBQ0Y7QUFZQSxlQUFlLHFCQUFxQixRQUF3RTtBQUMxRyxRQUFNLG1CQUFtQixNQUFNLHlCQUF5QixNQUFNO0FBQzlELE1BQUksV0FBVztBQUVmLE1BQUksQ0FBQyxTQUFTLFdBQVc7QUFDdkIsVUFBTSxJQUFJLE1BQU0sdUNBQXVDLE9BQU8sYUFBYSxtQ0FBbUM7QUFBQSxFQUNoSDtBQUVBLGFBQVcsYUFBUyw0REFBNkIsRUFBRSxTQUFTLENBQUMsR0FBRztBQUM5RCxRQUFJLFVBQVUsUUFBUSxHQUFHO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBVSxFQUFFLFVBQVUsT0FBTyxVQUFVLE1BQU0sQ0FBQztBQUNwRCxjQUFNLGdCQUFBQSxZQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsZUFBTyxxREFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQWNBLGVBQWUsZUFBZSxRQUFpQyxNQUE2QjtBQUMxRixZQUFNLHdDQUFlO0FBQUEsSUFDbkIsU0FBUyxFQUFFLGVBQWUsTUFBTSxNQUFNLEdBQVM7QUFDN0MsWUFBTSxVQUFVLFNBQVMsY0FBYyxhQUFhO0FBRXBELFVBQUksRUFBRSxtQkFBbUIscUJBQXFCLEVBQUUsbUJBQW1CLHNCQUFzQjtBQUN2RixjQUFNLElBQUksVUFBVSx1QkFBdUIsYUFBYSw4Q0FBOEM7QUFBQSxNQUN4RztBQUVBLGNBQVEsUUFBUTtBQUNoQixjQUFRLGNBQWMsSUFBSSxNQUFNLFNBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQyxDQUFDO0FBQUEsSUFDN0Q7QUFBQSxJQUNBLE9BQU8sRUFBRSxlQUFlLE9BQU8sZUFBZSxLQUFLO0FBQUEsSUFDbkQsR0FBSSxPQUFPLGNBQWMsVUFBYSxFQUFFLFdBQVcsT0FBTyxVQUFVO0FBQUEsRUFDdEUsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIiwgInNsZWVwIl0KfQo=
309
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqICAgICoqQW5kIHRoZSB0ZXh0IHdyaXR0ZW4gYmFjayBoYXMgdG8gYmUgSEVMRCwgbm90IGp1c3Qgd3JpdHRlbi4qKiBUaGUgSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb21cbiAqICAgIHRoZSBlbXB0aWVkIGZpZWxkLCBhbmQgYWJvdXQgb25lIHRpbWUgaW4gZml2ZSBpdCB3cm90ZSB0aGF0IGVtcHR5IHN0YXRlIGJhY2sgb3ZlciB0aGUgaGFybmVzcydzIHdyaXRlLFxuICogICAgc28gdGhlIGNhcHR1cmUgc3RyYWlnaHQgYWZ0ZXIgc2hvd2VkIHRoZSBwbGFjZWhvbGRlci4gVGhlIGZpZWxkIGlzIHJlLXJlYWQgdW50aWwgaXQgaG9sZHMsIGFuZCB3cml0dGVuXG4gKiAgICBhZ2FpbiB3aGVuIGl0IGRvZXMgbm90LlxuICpcbiAqIDUuICoqR2JvYXJkJ3Mgc3VnZ2VzdGlvbiBzdHJpcCBpcyBhIHNlY29uZCByYWNlLCBhbmQgcGFya2luZyB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgZW5kcyBpdC4qKiBXaXRoIHRoZVxuICogICAga2V5Ym9hcmQgdXAsIEdib2FyZCBkcmF3cyBlaXRoZXIgaXRzIHRvb2xiYXIgKGFwcHMsIHN0aWNrZXJzLCBHSUYsIGNsaXBib2FyZCwgc2V0dGluZ3MsIHRoZW1lLCBtaWMpIG9yIHdvcmRcbiAqICAgIHByZWRpY3Rpb25zIGZvciB0aGUgdGV4dCBiZWZvcmUgdGhlIGNhcmV0LiBUaGUgdG91Y2ggbGFuZGVkIG9uIHRoZSBlbXB0aWVkIGZpZWxkLCB3aGljaCBnZXRzIHRoZSB0b29sYmFyLFxuICogICAgYW5kIHRoZSB3cml0ZS1iYWNrIHB1dHMgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgdGhlIHRleHQsIHdoaWNoIGdldHMgcHJlZGljdGlvbnMgXHUyMDE0IG9uY2UgR2JvYXJkIGhlYXJzIGFib3V0XG4gKiAgICBpdCwgd2hpY2ggaXMgYSBtYXR0ZXIgb2YgdGltaW5nLiBUaGUgcHJlZGljdGlvbnMgdGhlbXNlbHZlcyBjb21lIGZyb20gdGhlIGtleWJvYXJkJ3MgbGVhcm5lZCBkaWN0aW9uYXJ5XG4gKiAgICBhbmQgZGlmZmVyIGJldHdlZW4gcnVucy4gU28gYSBjYXB0dXJlIHNob3dlZCBvbmUgb2YgdHdvIHN0cmlwcywgYW5kIHR3byBkaWZmZXJlbnQgc2V0cyBvZiBwcmVkaWN0aW9uc1xuICogICAgd2hlbiBpdCBzaG93ZWQgdGhlIHNlY29uZC4gU3VnZ2VzdGlvbnMgY2Fubm90IGJlIHN3aXRjaGVkIG9mZiBmcm9tIHRoZSBwYWdlOiBPYnNpZGlhbidzIGAucHJvbXB0LWlucHV0YFxuICogICAgYWxyZWFkeSBjYXJyaWVzIGBzcGVsbGNoZWNrPVwiZmFsc2VcImAsIGFuZCB0aGUgSU1FIGFscmVhZHkgcmVjZWl2ZXMgYFRZUEVfVEVYVF9GTEFHX05PX1NVR0dFU1RJT05TYFxuICogICAgKGBpbnB1dFR5cGU9MHgyMDgwYTFgKS4gR2JvYXJkIHN0aWxsIHByZWRpY3RzIChtZWFzdXJlZCAyMDI2LTA5LTI1KS4gV2l0aCB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgdGhlcmUgaXNcbiAqICAgIG5vIHRleHQgYmVmb3JlIGl0LCB3aGljaCBpcyB0aGUgZW1wdHktZmllbGQgc3RhdGUsIHNvIHdoaWNoZXZlciB3YXkgdGhlIHJhY2UgZ29lcywgdGhlIHN0cmlwIGlzIHRoZVxuICogICAgdG9vbGJhci4gU2VlIGBzaG91bGRQaW5LZXlib2FyZFRvb2xiYXJgLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBIb2xkRmllbGRUZXh0UmVzdWx0IH0gZnJvbSAnLi9maWVsZC10ZXh0LWhvbGQuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgRWxlbWVudFJlY3QsXG4gIFNvZnRLZXlib2FyZFRhcFBvaW50LFxuICBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5janMnO1xuXG5pbXBvcnQgeyBydW5BZGJUZXh0IH0gZnJvbSAnLi9hZGIuY2pzJztcbmltcG9ydCB7IGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90IH0gZnJvbSAnLi9kZXZpY2Utc2NyZWVuc2hvdC5janMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7IGhvbGRGaWVsZFRleHQgfSBmcm9tICcuL2ZpZWxkLXRleHQtaG9sZC5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2UsXG4gIGNoZWNrSXNJbnB1dE1ldGhvZFNob3duLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIHBhcnNlSW5wdXRNZXRob2RTdGF0ZSxcbiAgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1xufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmFpc2VTb2Z0S2V5Ym9hcmR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IHdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGl0IGlzIGBkaXN0L3NjcmVlbnNob3RzYCB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgXHUyMDE0IHJlc29sdmVkIGF0IGxvYWQsIHNvIHRoZXJlIGlzIG5vXG4gICAqIGxpdGVyYWwgZGVmYXVsdCB0byBzdGF0ZSBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1Mgc2VsZWN0b3Igb2YgdGhlIGZpZWxkIHRvIHRvdWNoLCBlLmcuIGAucHJvbXB0LWlucHV0YC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VsZWN0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieS5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFNgIGZyb20gYHNvZnQta2V5Ym9hcmQtZ2VvbWV0cnlgIGFwcGxpZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbXB0eSB0aGUgZmllbGQgYmVmb3JlIHRoZSB0b3VjaCwgYW5kIHdyaXRlIGl0cyB0ZXh0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogKipPbiBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZSB0b3VjaCB0aGF0IHJhaXNlcyB0aGUga2V5Ym9hcmQgYWxzbyBkcmF3cyBhIHNlbGVjdGlvbiBoYW5kbGUgd2hlbiBpdFxuICAgKiBsYW5kcyBpbnNpZGUgVEVYVC4qKiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcCBpbnRvIHRleHQgYW5kIGRyYXdzIG5vbmUgb24gYSB0YXBcbiAgICogaW50byBhbiBFTVBUWSBlZGl0YWJsZSwgYW5kIGEgZGV2aWNlIGNhcHR1cmUgcGhvdG9ncmFwaHMgaXQgXHUyMDE0IHdoaWNoIGlzIGhvdyBgb2JzaWRpYW4tbGluay1waWNrZXJgXG4gICAqIHNoaXBwZWQgYSB0ZWFsIGhhbmRsZSBpbiBhIHN0b3JlIGxpc3RpbmcgaW1hZ2UgdHdpY2UgYmVmb3JlIGFueW9uZSB1bmRlcnN0b29kIHdoZXJlIGl0IGNhbWUgZnJvbS4gQVxuICAgKiB2YWx1ZSB3cml0dGVuIGJ5IHNjcmlwdCByYWlzZXMgbm8gaGFuZGxlLCBzbyBlbXB0eWluZyB0aGUgZmllbGQsIHRvdWNoaW5nIGl0LCBhbmQgd3JpdGluZyB0aGUgdGV4dFxuICAgKiBiYWNrIGxlYXZlcyB0aGUgZnJhbWUgc2hvd2luZyB0aGUgc2FtZSBxdWVyeSB3aXRoIG5vdGhpbmcgaGFuZ2luZyBvZmYgaXQuXG4gICAqXG4gICAqIE9ubHkgYW4gYDxpbnB1dD5gIG9yIGEgYDx0ZXh0YXJlYT5gIGlzIGVtcHRpZWQuIEEgYGNvbnRlbnRlZGl0YWJsZWAgaG9sZGluZyB0ZXh0IGlzIFJFRlVTRUQgcmF0aGVyXG4gICAqIHRoYW4gd3JpdHRlbiB0bzogaXRzIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00sIGFuZCBibGFua2luZyB0aGF0XG4gICAqIGJ5IGhhbmQgZGVzdHJveXMgaXQuIEVtcHR5IHN1Y2ggYSBmaWVsZCB5b3Vyc2VsZiwgb3IgdHVybiB0aGlzIG9mZi5cbiAgICpcbiAgICogVHVybmluZyBpdCBvZmYgcmVzdG9yZXMgdGhlIHByZS0yMDI2LTA5LTIzIGJlaGF2aW91ciBleGFjdGx5OiB0aGUgZmllbGQgaXMgdG91Y2hlZCBhcyBpdCBzdGFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVtcHR5RmllbGRGb3JUb3VjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyayB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAsIHNvIEdib2FyZCdzIHN1Z2dlc3Rpb24gc3RyaXAgc2hvd3MgaXRzXG4gICAqIHRvb2xiYXIgcmF0aGVyIHRoYW4gd29yZCBwcmVkaWN0aW9ucy5cbiAgICpcbiAgICogKipPbiBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZSBzdHJpcCBpcyBvdGhlcndpc2UgYSByYWNlIGJldHdlZW4gdHdvIHN0YXRlcywgYW5kIG9uZSBvZiB0aGVtIHZhcmllcy4qKlxuICAgKiBHYm9hcmQgc2hvd3MgaXRzIHRvb2xiYXIgd2hpbGUgbm90aGluZyBzaXRzIGJlZm9yZSB0aGUgY2FyZXQsIGFuZCBwcmVkaWN0aW9ucyBmb3IgdGhlIHdvcmQgYmVmb3JlIGl0XG4gICAqIG90aGVyd2lzZS4gVGhlIHRvdWNoIGxhbmRzIG9uIHRoZSBlbXB0aWVkIGZpZWxkICh0b29sYmFyKS4gVGhlIHdyaXRlLWJhY2sgbGVhdmVzIHRoZSBjYXJldCBhZnRlciB0aGUgdGV4dFxuICAgKiAocHJlZGljdGlvbnMpLCBidXQgb25seSBvbmNlIEdib2FyZCBoYXMgcHJvY2Vzc2VkIHRoYXQgdXBkYXRlLiBBbmQgdGhlIHByZWRpY3Rpb25zIGNvbWUgZnJvbSB0aGVcbiAgICoga2V5Ym9hcmQncyBsZWFybmVkIGRpY3Rpb25hcnksIHNvIHRoZXkgZGlmZmVyIGZyb20gb25lIHJ1biB0byB0aGUgbmV4dC4gV2l0aCB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgYm90aFxuICAgKiBvdXRjb21lcyBvZiB0aGUgcmFjZSBhcmUgdGhlIHRvb2xiYXI6IG1lYXN1cmVkIDIwMjYtMDktMjUsIHNpeCByYWlzZXMgd2l0aCB0aGUgY2FyZXQgcGFya2VkIGFsbCBnYXZlXG4gICAqIGJ5dGUtaWRlbnRpY2FsIHN0cmlwIHJvd3Mgc2hvd2luZyB0aGUgdG9vbGJhciwgd2hpbGUgdGhlIHNhbWUgZmllbGQgd2l0aCB0aGUgY2FyZXQgYXQgdGhlIGVuZCBzaG93ZWRcbiAgICogYG11bHRpcGxlYCAvIGBtdWx0aXBsZXNgIC8gYG11bHRpcGxleGAuXG4gICAqXG4gICAqIFR1cm5pbmcgc3VnZ2VzdGlvbnMgb2ZmIGRvZXMgbm90IGRvIHRoaXMuIE9ic2lkaWFuJ3MgcHJvbXB0IGlucHV0IGFscmVhZHkgaGFzIGBzcGVsbGNoZWNrPVwiZmFsc2VcImAsXG4gICAqIGFuZCB0aGUgSU1FIGFscmVhZHkgcmVjZWl2ZXMgYFRZUEVfVEVYVF9GTEFHX05PX1NVR0dFU1RJT05TYCwgeWV0IEdib2FyZCBzdGlsbCBwcmVkaWN0cy5cbiAgICpcbiAgICogT25seSBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAgaXMgcGFya2VkOyBhbnkgb3RoZXIgZmllbGQgaXMgbGVmdCBhcyBpdCBpcy4gVGhlIGNhcmV0IGlzIHZpc2libGUgYXRcbiAgICogb2Zmc2V0IDAgdW5sZXNzIHRoZSBjYXB0dXJlIGhpZGVzIGl0LCB3aGljaCBhIGRldmljZSBjYXB0dXJlIGhhcyB0byBhc2sgZm9yIHdpdGggYGhpZGVDYXJldGAuXG4gICAqXG4gICAqIFR1cm5pbmcgaXQgb2ZmIGxlYXZlcyB0aGUgY2FyZXQgd2hlcmUgdGhlIHdyaXRlLWJhY2sgb3IgdGhlIHRvdWNoIHB1dCBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGluS2V5Ym9hcmRUb29sYmFyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHRvIHJlYWQgdGhlIGdlb21ldHJ5IGZyb20uIFdoZW4gb21pdHRlZCwgdGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGFwRGV2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBEZXZpY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHRvdWNoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnQ6IFNvZnRLZXlib2FyZFRhcFBvaW50O1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgbGVhdmVzIGl0cyBldmlkZW5jZSBcdTIwMTQgdW5kZXIgYGRpc3QvYCwgd2hpY2ggYSBwbHVnaW4gcmVwbyB1c2luZyB0aGlzIGhhcm5lc3MgZ2l0aWdub3JlcywgbGlrZSB0aGUgY2FwdHVyZSBzY3JhdGNoIGZpbGVzLlxuICovXG5jb25zdCBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWSA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Rpc3QnLCAnc2NyZWVuc2hvdHMnKTtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgaW4sIGFmdGVyIHdoaWNoIHRoZSBsYXlvdXQgaGFzIHNldHRsZWQuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxNTAwO1xuXG4vKipcbiAqIEhvdyBsb25nIHRoZSBJTUUgdGFrZXMgdG8gZmluaXNoIGFuaW1hdGluZyBvdXQgYWZ0ZXIgYEtFWUNPREVfQkFDS2AsIG1lYXN1cmVkIGluIHRoZSBjYXB0dXJlIHN1aXRlIHRoaXNcbiAqIHdhcyBtb3ZlZCBvdXQgb2YuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gOTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYmVmb3JlIGEga2V5Ym9hcmQgdGhhdCB3aWxsIG5vdCBnbyBkb3duIGlzIHJlcG9ydGVkLlxuICpcbiAqIFR3bywgYmVjYXVzZSB0aGUgZmlyc3QgcHJlc3MgY2FuIGxhbmQgd2hpbGUgdGhlIElNRSBpcyBzdGlsbCBhbmltYXRpbmcgVVAgZnJvbSB0aGUgZm9jdXMgdGhhdCByYWlzZWRcbiAqIGl0LCBhbmQgYW4gSU1FIG1pZC1hbmltYXRpb24gc3dhbGxvd3MgdGhlIGtleSB3aXRob3V0IHJldHJhY3RpbmcuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCA9IDI7XG5cbi8qKlxuICogSG93IGxvbmcgYSBrZXlib2FyZCByZXBvcnRlZCBzaG93aW5nIGlzIHdhdGNoZWQgYmVmb3JlIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYXQgaXQuXG4gKlxuICogT25lIHJldHJhY3QgYW5pbWF0aW9uOiBhbiBJTUUgYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gXHUyMDE0IHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQgXHUyMDE0IGlzXG4gKiBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGJ5IGEgcmVhZCB0YWtlbiBhdCB0aGUgc3RhcnQgb2YgaXRzIHJldHJhY3QsIGFuZCBpcyBnb25lIGJ5IHRoZSBlbmQgb2YgaXQuIFByZXNzaW5nXG4gKiBhdCB0aGUgZmlyc3QgcmVhZCB0aGVuIGxhbmRzIHRoZSBrZXkgb24gdGhlIGFwcCBpbnN0ZWFkLCB3aGljaCBjbG9zZXMgdGhlIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0b1xuICogcGhvdG9ncmFwaC4gVHdvIHJlYWRzIHRoYXQgYWdyZWUgYWNyb3NzIHRoaXMgd2luZG93IHNheSB0aGUga2V5Ym9hcmQgaXMgc3RheWluZyB1cC5cbiAqL1xuY29uc3QgS0VZQk9BUkRfU0hPV05fQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIHRoZSBjYXJldCBpcyBwYXJrZWQgYXQgb2Zmc2V0IDAgYmVmb3JlIGEgY2FyZXQgdGhhdCB3aWxsIG5vdCBzdGF5IHRoZXJlIGlzIHJlcG9ydGVkLlxuICovXG5jb25zdCBDQVJFVF9QQVJLX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4vKipcbiAqIEhvdyBsb25nIGEgcGFya2VkIGNhcmV0IGlzIGxlZnQgYmVmb3JlIGl0IGlzIHJlYWQgYmFjayBcdTIwMTQgbG9uZyBlbm91Z2ggZm9yIHRoZSBJTUUgdG8gYW5zd2VyIHRoZSBzZWxlY3Rpb25cbiAqIGNoYW5nZSwgd2hpY2ggaXMgd2hhdCB3b3VsZCBtb3ZlIGl0IGFnYWluLlxuICovXG5jb25zdCBDQVJFVF9QQVJLX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5cbi8qKlxuICogV2hhdCBhIGZpZWxkIGhvbGRzLCBhbmQgd2hldGhlciBpdCBpcyBvbmUgdGhpcyBjYW4gcHV0IGJhY2suXG4gKi9cbmludGVyZmFjZSBGaWVsZENvbnRlbnQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZmllbGQncyB2YWx1ZSBjYW4gYmUgd3JpdHRlbiBcdTIwMTQgdHJ1ZSBmb3IgYW4gYDxpbnB1dD5gIG9yIGEgYDx0ZXh0YXJlYT5gLCBmYWxzZSBmb3JcbiAgICogYW55dGhpbmcgZWxzZSwgd2hvc2UgY29udGVudCB1c3VhbGx5IGJlbG9uZ3MgdG8gYW4gZWRpdG9yIHRoYXQgb3ducyBpdHMgb3duIERPTS5cbiAgICovXG4gIHJlYWRvbmx5IGNhbldyaXRlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGUgZmllbGQgY3VycmVudGx5IGhvbGRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmllbGQncyBjYXJldCBpcywgYXMgdGhlIHNlbGVjdGlvbiBvZmZzZXRzIGFuIGA8aW5wdXQ+YCBvciBhIGA8dGV4dGFyZWE+YCByZXBvcnRzLlxuICovXG5pbnRlcmZhY2UgRmllbGRTZWxlY3Rpb24ge1xuICAvKipcbiAgICogV2hlcmUgdGhlIHNlbGVjdGlvbiBlbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0aW9uRW5kOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc2VsZWN0aW9uIHN0YXJ0cy5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0YXJ0OiBudWxsIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFJhaXNlcyB0aGUgb24tc2NyZWVuIGtleWJvYXJkIHdpdGggYSByZWFsIHRvdWNoIG9uIGEgZmllbGQsIGFuZCBjb25maXJtcyBpdCBjYW1lIHVwLlxuICpcbiAqIENhbGwgaXQgaW5zaWRlIGB3aXRoU29mdEtleWJvYXJkRW5hYmxlZGAgXHUyMDE0IHRoZSBkZXZpY2Ugc2V0dGluZyBhbG9uZSBkb2VzIG5vdCByYWlzZSB0aGUga2V5Ym9hcmQsIGFuZCB0aGlzXG4gKiB0b3VjaCBhbG9uZSBjYW5ub3Qgd2hpbGUgdGhlIHNldHRpbmcgc3VwcHJlc3NlcyBpdC5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgdGhhdCBpcyBhbHJlYWR5IHVwIGlzIHB1dCBET1dOIGZpcnN0LioqIFRoZSBmaXJzdCBnZW9tZXRyeSByZWFkIGlzIHRoZSBiYXNlbGluZSBldmVyeSBsYXRlclxuICogcmVhZCBpcyBjb21wYXJlZCBhZ2FpbnN0LCBzbyBhIGtleWJvYXJkIGFscmVhZHkgdXAgd291bGQgbGVhdmUgdGhlIGZpZWxkIG5vdGhpbmcgdG8gbGlmdCBieSBhbmQgcmVhZCBhc1xuICogb25lIHRoYXQgbmV2ZXIgY2FtZS4gVGhlIGRldmljZSBpcyBhc2tlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSwgYW5kIGEgc2hvd2luZyBJTUUgaXMgcmV0cmFjdGVkIHdpdGhcbiAqIGBLRVlDT0RFX0JBQ0tgIFx1MjAxNCBhc2tlZCBGSVJTVCBiZWNhdXNlLCB3aXRoIG5vIElNRSBzaG93aW5nLCB0aGF0IGtleSByZWFjaGVzIHRoZSBhcHAgYW5kIGNsb3NlcyB0aGUgdmVyeVxuICogbW9kYWwgdGhlIGZyYW1lIGlzIGFib3V0IHRvIHBob3RvZ3JhcGguIFNvIHRoZSBoZWxwZXIgaXMgc2FmZSB0byBjYWxsIG9uY2UgcGVyIGZyYW1lIG9mIGEgbXVsdGktZnJhbWVcbiAqIHN1aXRlLCBhbmQgZXZlcnkgY2FsbCBzdGlsbCBwcm92ZXMgaXRzIG93biBsaWZ0LiBUaGUgb3RoZXIgYW5zd2VyIFx1MjAxNCBhY2NlcHRpbmcgYSB6ZXJvIGxpZnQgd2hlbmV2ZXIgdGhlXG4gKiBkZXZpY2UgcmVwb3J0cyBhIGtleWJvYXJkIFx1MjAxNCB3YXMgcmVmdXNlZCwgYmVjYXVzZSBpdCBhY2NlcHRzIGEgZnJhbWUgdGhlIGhlbHBlciBkaWQgbm90IHByb3ZlLlxuICpcbiAqICoqVGhlIGZpZWxkIGlzIEVNUFRJRUQgZm9yIHRoZSB0b3VjaCBhbmQgd3JpdHRlbiBiYWNrIGFmdGVyd2FyZHMqKiwgYmVjYXVzZSBhIHRvdWNoIHRoYXQgbGFuZHMgaW5zaWRlXG4gKiB0ZXh0IGRyYXdzIENocm9taXVtJ3Mgc2VsZWN0aW9uIGhhbmRsZSBhbmQgdGhlIGZyYW1lYnVmZmVyIHBob3RvZ3JhcGhzIGl0IFx1MjAxNCBzZWVcbiAqIHtAbGluayBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcy5zaG91bGRFbXB0eUZpZWxkRm9yVG91Y2h9LCB3aGljaCB0dXJucyB0aGF0IG9mZi5cbiAqXG4gKiAqKlRoZSBjYXJldCBpcyB0aGVuIHBhcmtlZCBhdCBvZmZzZXQgMCoqLCBzbyBHYm9hcmQncyBzdWdnZXN0aW9uIHN0cmlwIGlzIGl0cyB0b29sYmFyIHJhdGhlciB0aGFuIHdvcmRcbiAqIHByZWRpY3Rpb25zIHRoYXQgcmFjZSB0aGUgd3JpdGUtYmFjayBhbmQgdmFyeSBiZXR3ZWVuIHJ1bnMgXHUyMDE0IHNlZVxuICoge0BsaW5rIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLnNob3VsZFBpbktleWJvYXJkVG9vbGJhcn0sIHdoaWNoIHR1cm5zIHRoYXQgb2ZmLlxuICpcbiAqICoqVGhlIGdlb21ldHJ5IHJldHVybmVkIGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgc3RpbGwgZW1wdHkqKiwgYW5kIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gYmFjayBhZnRlciBpdC5cbiAqIFRoYXQgaXMgdGhlIHN0YXRlIHRoZSBwcm92ZW4gY2FwdHVyZSBzdWl0ZXMgYXNzZXJ0IGFnYWluc3QsIGFuZCBpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuXG4gKiBpbmNpZGVudGFsOiB0aGUgYmFzZWxpbmUgaXMgcmVhZCBBRlRFUiB0aGUgZmllbGQgaXMgZW1wdGllZCwgc28gdGhlIGxpZnQgaXMgbWVhc3VyZWQgYmV0d2VlbiB0d28gcmVhZHNcbiAqIG9mIHRoZSBzYW1lIGZpZWxkIGNvbnRlbnQuIEEgZmllbGQgd2hvc2Ugb3duIHRleHQgY2hhbmdlcyB0aGUgbGF5b3V0IGFyb3VuZCBpdCBcdTIwMTQgYSBzdWdnZXN0ZXIgd2hvc2Ugcm93XG4gKiBjb3VudCBhbnN3ZXJzIHRoZSBxdWVyeSBcdTIwMTQgbW92ZXMgd2hlbiBpdCBpcyBjbGVhcmVkLCBhbmQgYSBkZWx0YSBtZWFzdXJlZCBhY3Jvc3MgdGhhdCBtb3ZlIGlzIG5vdCBhXG4gKiBrZXlib2FyZC4gUmVhZCB0aGUgZ2VvbWV0cnkgYWdhaW4geW91cnNlbGYgaWYgdGhlIHJlc3RvcmVkIHRleHQgbW92ZXMgYW55dGhpbmcgeW91IGFyZSBhYm91dCB0byBhc3NlcnRcbiAqIG9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEga2V5Ym9hcmQgYWxyZWFkeSB1cCB3b3VsZCBub3QgZ28gZG93biwgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIGlmIGl0IGhvbGRzIHRleHRcbiAqICAgdGhpcyBjYW5ub3QgZW1wdHkgYW5kIHB1dCBiYWNrLCBpZiBpdCBuZXZlciBsaWZ0ZWQgXHUyMDE0IGFmdGVyIHdyaXRpbmcgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgdGhlXG4gKiAgIGRldmljZSdzIG93biBgaW5wdXRfbWV0aG9kYCBzdGF0ZSB0byB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IFx1MjAxNCBpZiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgd291bGQgbm90XG4gKiAgIHN0YXkgaW4gdGhlIGZpZWxkLCBvciBpZiB0aGUgY2FyZXQgd291bGQgbm90IHN0YXkgYXQgb2Zmc2V0IDAuIEEgd3JpdGUtYmFjayB0aGUgSU1FIHVuZG9lcyBpcyB3cml0dGVuXG4gKiAgIGFnYWluIHVudGlsIGl0IGhvbGRzOyBzZWUgYHJlc3RvcmVGaWVsZFRleHRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmFpc2VTb2Z0S2V5Ym9hcmQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICBhd2FpdCBsb3dlclNvZnRLZXlib2FyZElmU2hvd24ocGFyYW1zKTtcblxuICBjb25zdCB0ZXh0VG9SZXN0b3JlID0gYXdhaXQgZW1wdHlGaWVsZEZvclRvdWNoKHBhcmFtcyk7XG5cbiAgbGV0IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xuXG4gIHRyeSB7XG4gICAgc25hcHNob3QgPSBhd2FpdCB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFJlc3RvcmVkIGV2ZW4gd2hlbiB0aGUgcmFpc2UgZmFpbGVkOiBhIGNhbGxlciB0aGF0IGlzIGFib3V0IHRvIHJlYWQgaXRzIG93biBkaWFnbm9zdGljIHNob3VsZCBub3RcbiAgICAvLyBhbHNvIGhhdmUgdG8gZGlzY292ZXIgdGhhdCBpdHMgcXVlcnkgaXMgZ29uZS4gQmVzdC1lZmZvcnQsIHNvIHRoZSByYWlzZSdzIG93biBlcnJvciBpcyB0aGUgb25lIHRocm93bi5cbiAgICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgaG9sZEZpZWxkVGV4dEJlc3RFZmZvcnQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGlmICh0ZXh0VG9SZXN0b3JlICE9PSBudWxsKSB7XG4gICAgYXdhaXQgcmVzdG9yZUZpZWxkVGV4dChwYXJhbXMsIHRleHRUb1Jlc3RvcmUpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5zaG91bGRQaW5LZXlib2FyZFRvb2xiYXIgIT09IGZhbHNlKSB7XG4gICAgYXdhaXQgcGFya0NhcmV0QXRTdGFydChwYXJhbXMpO1xuICB9XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIFRvdWNoZXMgdGhlIGRldmljZSBhdCBhIHBvaW50LCB0aGUgd2F5IGEgdGh1bWIgd291bGQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHdoZXJlIHRvIHRvdWNoIGl0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0b3VjaCBoYXMgYmVlbiBkaXNwYXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGFwRGV2aWNlKHBhcmFtczogVGFwRGV2aWNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IFsnc2hlbGwnLCAnaW5wdXQnLCAndGFwJywgU3RyaW5nKHBhcmFtcy5wb2ludC54SW5QaXhlbHMpLCBTdHJpbmcocGFyYW1zLnBvaW50LnlJblBpeGVscyldLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIgYW5kIHJlYWRzIHRoZSBkZXZpY2UncyBgaW5wdXRfbWV0aG9kYCBzdGF0ZSwgdGhlbiBjb21wb3NlcyB0aGUgZmFpbHVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgdGhlIGRpYWdub3N0aWNzIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBiYXNlbGluZVNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggdGhlIHZlcmRpY3QgaXMgbWVhc3VyZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSBzbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGFmdGVyIHRoZSBsYXN0IHRvdWNoLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbWVzc2FnZSB0byB0aHJvdy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRGYWlsdXJlTWVzc2FnZShcbiAgcGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyxcbiAgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCxcbiAgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpYWdub3N0aWNzRGlyZWN0b3J5ID0gcGFyYW1zLmRpYWdub3N0aWNzRGlyZWN0b3J5ID8/IERFRkFVTFRfRElBR05PU1RJQ1NfRElSRUNUT1JZO1xuICBta2RpclN5bmMoZGlhZ25vc3RpY3NEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHNjcmVlbnNob3RQYXRoID0gam9pbihkaWFnbm9zdGljc0RpcmVjdG9yeSwgJ2tleWJvYXJkLW5vdC1yYWlzZWQucG5nJyk7XG4gIHdyaXRlRmlsZVN5bmMoc2NyZWVuc2hvdFBhdGgsIGF3YWl0IGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90KHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCB9KSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgaW5wdXRNZXRob2RTdGF0ZTogYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKSxcbiAgICBzY3JlZW5zaG90UGF0aCxcbiAgICBzbmFwc2hvdFxuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFueXRoaW5nIGluIHRoZSBwYWdlIG1hdGNoZXMgdGhlIGZpZWxkJ3Mgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBsb29rIGZvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gd2hldGhlciBpdCBtYXRjaGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3RvcikgIT09IG51bGw7XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogRW1wdGllcyB0aGUgZmllbGQgdGhlIHRvdWNoIGlzIGFib3V0IHRvIGxhbmQgb24sIGFuZCByZXBvcnRzIHdoYXQgdG8gd3JpdGUgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIGVtcHR5LCBhbmQgd2hldGhlciB0byBlbXB0eSBpdCBhdCBhbGwuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB0ZXh0IHRvIHJlc3RvcmUsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgd2FzIGVtcHRpZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWVsZCBob2xkcyB0ZXh0IHRoYXQgY2Fubm90IGJlIHdyaXR0ZW4gYmFjayBcdTIwMTQgYSBgY29udGVudGVkaXRhYmxlYCwgd2hvc2UgY29udGVudFxuICogICBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtcHR5RmllbGRGb3JUb3VjaChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGlmIChwYXJhbXMuc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNoID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWVsZENvbnRlbnQocGFyYW1zKTtcblxuICAvLyBOb3RoaW5nIG1hdGNoZWQuIFRoZSBnZW9tZXRyeSByZWFkIGRvZXMgdGhlIHJlcG9ydGluZywgd2l0aCB0aGUgbWVzc2FnZSBpdCBhbHdheXMgaGFkLlxuICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50ZXh0ID09PSAnJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFjb250ZW50LmNhbldyaXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgaG9sZHMgdGV4dCBidXQgaXMgbm90IGFuIDxpbnB1dD4gb3IgYSA8dGV4dGFyZWE+LCBzbyBpdCBgXG4gICAgICAgICsgJ2Nhbm5vdCBiZSBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIHdyaXR0ZW4gYmFjay4gVGhlIHRvdWNoIHdvdWxkIGxhbmQgaW5zaWRlIHRleHQgYW5kIGRyYXcgYSAnXG4gICAgICAgICsgJ3NlbGVjdGlvbiBoYW5kbGUsIHdoaWNoIGEgZGV2aWNlIGNhcHR1cmUgcGhvdG9ncmFwaHMuIEVtcHR5IHRoZSBmaWVsZCB5b3Vyc2VsZiBiZWZvcmUgY2FsbGluZywgb3IgJ1xuICAgICAgICArICdwYXNzIHNob3VsZEVtcHR5RmllbGRGb3JUb3VjaDogZmFsc2UgdG8gdG91Y2ggaXQgYXMgaXQgc3RhbmRzLidcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVGaWVsZFRleHQocGFyYW1zLCAnJyk7XG5cbiAgcmV0dXJuIGNvbnRlbnQudGV4dDtcbn1cblxuLyoqXG4gKiBIb2xkcyB0aGUgdGV4dCBpbiB0aGUgZmllbGQgd2l0aG91dCBldmVyIHRocm93aW5nIFx1MjAxNCB0aGUgcmVzdG9yZSBvbiBhIHJhaXNlIHRoYXQgYWxyZWFkeSBmYWlsZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZS5cbiAqIEBwYXJhbSB0ZXh0IC0gV2hhdCBpdCBtdXN0IGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGhvbGQgaGFzIHJ1biwgd2hhdGV2ZXIgaXQgZm91bmQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhvbGRGaWVsZFRleHRCZXN0RWZmb3J0KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGhvbGRUZXh0SW5GaWVsZChwYXJhbXMsIHRleHQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUaGUgcmFpc2UncyBvd24gZmFpbHVyZSBpcyB3aGF0IHRoZSBjYWxsZXIgbmVlZHMgdG8gc2VlOyBhIGZpZWxkIHRoYXQgaXMgZ29uZSBhcyB3ZWxsIGFkZHMgbm90aGluZyB0byBpdC5cbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgdGV4dCBpbnRvIHRoZSBmaWVsZCBhbmQgaG9sZHMgaXQgdGhlcmUsIHBlciB7QGxpbmsgaG9sZEZpZWxkVGV4dH0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZS5cbiAqIEBwYXJhbSB0ZXh0IC0gV2hhdCBpdCBtdXN0IGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoYXQgdGhlIGhvbGQgZm91bmQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhvbGRUZXh0SW5GaWVsZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPEhvbGRGaWVsZFRleHRSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IGhvbGRGaWVsZFRleHQoe1xuICAgIGV4cGVjdGVkVGV4dDogdGV4dCxcbiAgICBhc3luYyByZWFkVGV4dCgpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG4gICAgICByZXR1cm4gY29udGVudD8udGV4dCA/PyBudWxsO1xuICAgIH0sXG4gICAgc2xlZXAsXG4gICAgYXN5bmMgd3JpdGVUZXh0KHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUHV0cyB0aGUga2V5Ym9hcmQgZG93biB3aGVuIHRoZSBkZXZpY2UgcmVwb3J0cyBvbmUgc2hvd2luZywgc28gdGhlIGJhc2VsaW5lIHJlYWQgbmV4dCBpcyBvbmUgdGhlIHRvdWNoXG4gKiBjYW4gbGlmdCB0aGUgZmllbGQgZnJvbS5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgaXMgcHJlc3NlZCBhdCBvbmx5IG9uY2UgaXQgaGFzIGJlZW4gcmVwb3J0ZWQgc2hvd2luZyBUV0lDRSwgb25lIHJldHJhY3QgYW5pbWF0aW9uIGFwYXJ0LioqXG4gKiBgS0VZQ09ERV9CQUNLYCBpcyByZXRyYWN0ZWQgYnkgdGhlIElNRSBvbmx5IHdoaWxlIHRoZSBJTUUgaXMgdXA7IG9uY2UgaXQgaGFzIGdvbmUsIHRoZSBrZXkgcmVhY2hlcyB0aGVcbiAqIGFwcCwgYW5kIE9ic2lkaWFuIGNsb3NlcyB0aGUgbW9kYWwgb24gc2NyZWVuIFx1MjAxNCB0aGUgb25lIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gQSBrZXlib2FyZFxuICogYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gKHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQsIGFuZCB0aGUgY2FsbGVyIG9wZW5lZCBhIGZyZXNoIG9uZVxuICogc3RyYWlnaHQgYWZ0ZXIpIGlzIHN0aWxsIHJlcG9ydGVkIHNob3dpbmcgYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBzbyBwcmVzc2luZyBhdCB0aGUgZmlyc3QgcmVhZFxuICogcmFjZWQgaXQuIEl0IGlzIHdhdGNoZWQgZm9yIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBmaXJzdCwgYW5kIGEga2V5Ym9hcmQgdGhhdCB3ZW50IGRvd24gb24gaXRzIG93biBpc1xuICogbGVmdCBhbG9uZS5cbiAqXG4gKiAqKkFuZCBhIHByZXNzIHRoYXQgcmVhY2hlZCB0aGUgYXBwIGFueXdheSBpcyBuYW1lZCBhcyB0aGF0LioqIFRoZSBmaWVsZCBpcyBsb29rZWQgdXAgYmVmb3JlIHRoZSBwcmVzc1xuICogYW5kIGFmdGVyIGl0OyBvbmUgdGhhdCBtYXRjaGVkIGJlZm9yZSBhbmQgbm90IGFmdGVyIHdhcyBjbG9zZWQgYnkgdGhlIGtleSwgYW5kIHNheWluZyBzbyBiZWF0cyB0aGVcbiAqIGBub3RoaW5nIG1hdGNoZXNgIHRoYXQgdGhlIHJhaXNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBzdGVwIGxhdGVyLCBhYm91dCBhIHNlbGVjdG9yIHRoYXQgd2FzIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIGFzaywgYW5kIHRoZSBmaWVsZCB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgcHJlc3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8ga2V5Ym9hcmQgaXMgc2hvd2luZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBpcyBzdGlsbCBzaG93aW5nIGFmdGVyIHtAbGluayBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlR9IHByZXNzZXMgb2ZcbiAqICAgYEtFWUNPREVfQkFDS2AgXHUyMDE0IHRoZSByYWlzZSB0aGF0IGZvbGxvd3MgY291bGQgcHJvdmUgbm90aGluZywgYW5kIGl0cyBvd24gZmFpbHVyZSB3b3VsZCBibGFtZSBhIGtleWJvYXJkXG4gKiAgIHRoYXQgbmV2ZXIgY2FtZSB3aGVuIHRoZSB0cnV0aCBpcyBvbmUgdGhhdCBuZXZlciBsZWZ0IFx1MjAxNCBvciBpZiBhIHByZXNzIGNsb3NlZCB0aGUgZmllbGQncyBvd24gVUkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuXG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmllbGRQcmVzZW50QmVmb3JlUHJlc3MgPSBhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcyk7XG4gICAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgJ0tFWUNPREVfQkFDSyddLFxuICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICAgIH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmIChpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzICYmICFhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JhaXNlU29mdEtleWJvYXJkOiBLRVlDT0RFX0JBQ0ssIHByZXNzZWQgdG8gcHV0IGRvd24gYSBrZXlib2FyZCB0aGUgZGV2aWNlIHJlcG9ydGVkIHNob3dpbmcsIHJlYWNoZWQgdGhlIGFwcCBpbnN0ZWFkIGFuZCAnXG4gICAgICAgICAgKyBgY2xvc2VkIHRoZSBVSSBob2xkaW5nIFwiJHtwYXJhbXMuaW5wdXRTZWxlY3Rvcn1cIiBcdTIwMTQgaXQgbWF0Y2hlZCBiZWZvcmUgdGhlIHByZXNzIGFuZCBtYXRjaGVzIG5vdGhpbmcgYWZ0ZXIgaXQuIFRoZSBgXG4gICAgICAgICAgKyAna2V5Ym9hcmQgd2VudCBkb3duIGJldHdlZW4gdGhlIGxhc3QgcmVhZCBhbmQgdGhlIHByZXNzLiBMZXQgdGhlIHByZXZpb3VzIGtleWJvYXJkIHNldHRsZSBiZWZvcmUgb3BlbmluZyB0aGUgVUkgJ1xuICAgICAgICAgICsgYHRvIHJhaXNlIGl0IG9uLlxuZGV2aWNlIGJlZm9yZSB0aGUgcHJlc3M6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuICB9XG5cbiAgaWYgKGNoZWNrSXNJbnB1dE1ldGhvZFNob3duKGlucHV0TWV0aG9kU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBhIGtleWJvYXJkIHdhcyBhbHJlYWR5IHVwIGFuZCBkaWQgbm90IGdvIGRvd24gYWZ0ZXIgJHtTdHJpbmcoS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UKX0gcHJlc3NlcyBvZiBgXG4gICAgICAgICsgJ0tFWUNPREVfQkFDSywgc28gdGhlIGxpZnQgdGhhdCBwcm92ZXMgYSByYWlzZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuIFRoZSBmaWVsZCB3b3VsZCByZWFkIGFzIG9uZSB0aGF0IG5ldmVyICdcbiAgICAgICAgKyBgbW92ZWQgdW5kZXIgYSBrZXlib2FyZCB0aGF0IGlzIHBsYWlubHkgc2hvd2luZy5cbmRldmljZTogJHtpbnB1dE1ldGhvZFN0YXRlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUGFya3MgdGhlIGZpZWxkJ3MgY2FyZXQgYXQgb2Zmc2V0IDAsIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgaXQgaGFzIHN0YXllZCB0aGVyZS5cbiAqXG4gKiBSZWFkIGJhY2sgYWZ0ZXIge0BsaW5rIENBUkVUX1BBUktfQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EU30sIGFuZCBwYXJrZWQgYWdhaW4gd2hlbiBpdCBtb3ZlZDogdGhlIElNRVxuICogYW5zd2VycyBhIHNlbGVjdGlvbiBjaGFuZ2UsIGFuZCBhIGNhcmV0IGl0IG1vdmVkIGJhY2sgdG8gdGhlIGVuZCB3b3VsZCBicmluZyB0aGUgcHJlZGljdGlvbnMgYmFjayB3aXRoIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgd2hvc2UgY2FyZXQgdG8gcGFyay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2FyZXQgaGFzIHN0YXllZCBhdCBvZmZzZXQgMCwgb3IgYXQgb25jZSBmb3IgYSBmaWVsZCB0aGF0XG4gKiAgIGlzIG5vdCBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjYXJldCBkaWQgbm90IHN0YXkgYXQgb2Zmc2V0IDAgYWZ0ZXIge0BsaW5rIENBUkVUX1BBUktfQVRURU1QVF9DT1VOVH0gYXR0ZW1wdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhcmtDYXJldEF0U3RhcnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzZWxlY3Rpb25zOiAoRmllbGRTZWxlY3Rpb24gfCBudWxsKVtdID0gW107XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBDQVJFVF9QQVJLX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IGlzUGFya2VkID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgICB9KTtcblxuICAgIGlmICghaXNQYXJrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBzbGVlcChDQVJFVF9QQVJLX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGF3YWl0IHJlYWRGaWVsZFNlbGVjdGlvbihwYXJhbXMpO1xuICAgIHNlbGVjdGlvbnMucHVzaChzZWxlY3Rpb24pO1xuXG4gICAgaWYgKHNlbGVjdGlvbj8uc2VsZWN0aW9uU3RhcnQgPT09IDAgJiYgc2VsZWN0aW9uLnNlbGVjdGlvbkVuZCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgcmFpc2VTb2Z0S2V5Ym9hcmQ6IHRoZSBjYXJldCBwYXJrZWQgYXQgb2Zmc2V0IDAgaW4gXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGRpZCBub3Qgc3RheSB0aGVyZSwgc28gR2JvYXJkJ3MgYFxuICAgICAgKyBgc3RyaXAgd291bGQgc2hvdyB3b3JkIHByZWRpY3Rpb25zIHJhdGhlciB0aGFuIGl0cyB0b29sYmFyLiAke1N0cmluZyhDQVJFVF9QQVJLX0FUVEVNUFRfQ09VTlQpfSBhdHRlbXB0KHMpOyBgXG4gICAgICArIGB0aGUgZmllbGQgcmVhZCAke0pTT04uc3RyaW5naWZ5KHNlbGVjdGlvbnMpfS4gUGFzcyBzaG91bGRQaW5LZXlib2FyZFRvb2xiYXI6IGZhbHNlIHRvIGxlYXZlIHRoZSBjYXJldCBhbG9uZS5cbmRldmljZTogJHthd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpfWBcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGF0IHRoZSBmaWVsZCBob2xkcywgYW5kIHdoZXRoZXIgaXQgaXMgb25lIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCwgb3IgYG51bGxgIHdoZW4gbm90aGluZyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEZpZWxkQ29udGVudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxGaWVsZENvbnRlbnQgfCBudWxsPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBGaWVsZENvbnRlbnQgfCBudWxsIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbldyaXRlID0gZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbiAgICAgIHJldHVybiB7IGNhbldyaXRlLCB0ZXh0OiBjYW5Xcml0ZSA/IGVsZW1lbnQudmFsdWUgOiBlbGVtZW50LnRleHRDb250ZW50IH07XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hlcmUgdGhlIGZpZWxkJ3MgY2FyZXQgaXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2VsZWN0aW9uLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdyaXRhYmxlIG1hdGNoZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWVsZFNlbGVjdGlvbihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxGaWVsZFNlbGVjdGlvbiB8IG51bGw+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IEZpZWxkU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50XG4gICAgICAgID8geyBzZWxlY3Rpb25FbmQ6IGVsZW1lbnQuc2VsZWN0aW9uRW5kLCBzZWxlY3Rpb25TdGFydDogZWxlbWVudC5zZWxlY3Rpb25TdGFydCB9XG4gICAgICAgIDogbnVsbDtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBBc2tzIHRoZSBkZXZpY2Ugd2hhdCBpdHMgSU1FIGlzIGRvaW5nIFx1MjAxNCB0aGUgb25seSBwbGFjZSB0aGF0IGtub3dzLCBzaW5jZSBub3RoaW5nIGluIHRoZSBwYWdlIHJlcG9ydHMgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgdG8gYXNrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmllbGRzIHtAbGluayBwYXJzZUlucHV0TWV0aG9kU3RhdGV9IGtlZXBzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZHVtcHN5c091dHB1dCA9IGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IFsnc2hlbGwnLCAnZHVtcHN5cycsICdpbnB1dF9tZXRob2QnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZUlucHV0TWV0aG9kU3RhdGUoZHVtcHN5c091dHB1dCk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgcmVuZGVyZXIga25vd3MgYWJvdXQgaXRzIG93biBnZW9tZXRyeS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIG1lYXN1cmUgYW5kIHRoZSB2YXVsdCB0byByZWFkIGl0IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2aWV3cG9ydCBhbmQgdGhlIGZpZWxkJ3MgcmVjdCwgaW4gQ1NTIHBpeGVscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Qge1xuICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBUaGlzIGNsb3N1cmUgaXMgc2VyaWFsaXplZCBhbmQgZXZhbHVhdGVkIGluIHRoZSByZW5kZXJlciwgc28gYSBoZWxwZXIgaG9pc3RlZCB0byBtb2R1bGUgc2NvcGUgd291bGQgbm90IGV4aXN0IHRoZXJlLlxuICAgICAgZnVuY3Rpb24gdG9SZWN0KHJlY3Q6IERPTVJlY3QpOiBFbGVtZW50UmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiByZWN0LnRvcCxcbiAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgaW5uZXJIZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgaW5wdXRSZWN0OiBpbnB1dEVsID8gdG9SZWN0KGlucHV0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIDogbnVsbCxcbiAgICAgICAgc2NyZWVuWTogd2luZG93LnNjcmVlbllcbiAgICAgIH07XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBlbXB0aWVkIGZpZWxkJ3MgdGV4dCBiYWNrLCBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0IGhhcyBzdGF5ZWQgdGhlcmUuXG4gKlxuICogKipXcml0aW5nIGl0IG9uY2UgaXMgbm90IGVub3VnaC4qKiBUaGUgdG91Y2ggdGhhdCByYWlzZWQgdGhlIGtleWJvYXJkIGxhbmRlZCBvbiB0aGUgRU1QVFkgZmllbGQsIHNvIHRoZVxuICogSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb20gYW4gZW1wdHkgZmllbGQsIGFuZCBhYm91dCBvbmUgdGltZSBpbiBmaXZlIGEgbGF0ZXIgdXBkYXRlIGZyb20gaXQgd3JvdGVcbiAqIHRoYXQgZW1wdHkgc3RhdGUgYmFjayBvdmVyIHRoaXMgd3JpdGUgKG1lYXN1cmVkIDIwMjYtMDktMjUgaW4gYG9ic2lkaWFuLWFsaWFzLXF1aWNrLXN3aXRjaGVyYCdzIGNhcHR1cmVcbiAqIHN1aXRlOiAyIG9mIDEwIGZyYW1lcyBzaG93ZWQgdGhlIHBsYWNlaG9sZGVyLCB3aGlsZSB0aGUgR2JvYXJkIHN0cmlwIHN0aWxsIG9mZmVyZWQgdGhlIHdvcmQgdGhhdCBoYWQgYmVlblxuICogd3JpdHRlbikuIFRoZSBjYXB0dXJlIHRha2VuIHN0cmFpZ2h0IGFmdGVyIHBob3RvZ3JhcGhlZCB0aGUgZW1wdHkgZmllbGQsIGFuZCBub3RoaW5nIHNhaWQgc28uIFNvIHRoZSBmaWVsZCBpc1xuICogcmUtcmVhZCB1bnRpbCBzZXZlcmFsIHJlYWRzIGFncmVlLCBhbmQgd3JpdHRlbiBhZ2FpbiB3aGVuZXZlciBvbmUgZG9lcyBub3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZSwgYW5kIHRoZSBkZXZpY2UgdG8gYXNrIGFib3V0IGl0cyBJTUUgd2hlbiB0aGUgdGV4dCB3aWxsIG5vdCBob2xkLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRoZSBmaWVsZCBoZWxkIGJlZm9yZSBpdCB3YXMgZW1wdGllZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdGV4dCBoYXMgaGVsZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRleHQgZGlkIG5vdCBob2xkIGFmdGVyIGV2ZXJ5IHJld3JpdGUsIG9yIHRoZSBmaWVsZCB3ZW50IGF3YXkgXHUyMDE0IG5hbWluZyBldmVyeSByZWFkIGFuZFxuICogICB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHJhdGhlciB0aGFuIHJldHVybmluZyB3aXRoIHRoZSBmaWVsZCBzaWxlbnRseSBlbXB0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaG9sZFRleHRJbkZpZWxkKHBhcmFtcywgdGV4dCk7XG5cbiAgaWYgKHJlc3VsdC53cml0ZUNvdW50ID4gMSkge1xuICAgIGxvZyhcbiAgICAgIGBbc29mdC1rZXlib2FyZF0gVGhlIHRleHQgd3JpdHRlbiBiYWNrIGludG8gXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIHdhcyBsb3N0ICR7U3RyaW5nKHJlc3VsdC53cml0ZUNvdW50IC0gMSl9IHRpbWUocykgYFxuICAgICAgICArIGBhbmQgd3JpdHRlbiBhZ2FpbjsgcmVhZHM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LnJlYWRUZXh0cyl9LmBcbiAgICApO1xuICB9XG5cbiAgaWYgKCFyZXN1bHQuaXNIZWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgaW50byBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgYWZ0ZXIgdGhlIHRvdWNoIGRpZCBub3Qgc3RheSB0aGVyZS4gYFxuICAgICAgICArIGBFeHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KHRleHQpfTsgJHtTdHJpbmcocmVzdWx0LndyaXRlQ291bnQpfSB3cml0ZShzKSwgYW5kIHRoZSBmaWVsZCByZWFkIGBcbiAgICAgICAgKyBgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQucmVhZFRleHRzKX0uIEEgY2FwdHVyZSB0YWtlbiBub3cgd291bGQgc2hvdyB0aGUgZmllbGQgd2l0aG91dCBpdHMgdGV4dC5cbmRldmljZTogJHthd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZmllbGQgdW50aWwgdGhlIGtleWJvYXJkIGlzIHVwLCBhbmQgc2F5cyBzbyB3aGVuIGl0IG5ldmVyIGNhbWUuXG4gKlxuICogVGhlIGJhc2VsaW5lIGlzIHJlYWQgaGVyZSByYXRoZXIgdGhhbiBieSB0aGUgY2FsbGVyLCBzbyBpdCBpcyByZWFkIHdpdGggdGhlIGZpZWxkIGluIHRoZSBzdGF0ZSB0aGVcbiAqIHRhcHMgYXJlIGRpc3BhdGNoZWQgYWdhaW5zdCBcdTIwMTQgc2VlIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0gZm9yIHdoeSB0aGUgdHdvIGhhdmUgdG8gbWF0Y2guXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIG9yIGlmIGl0IG5ldmVyIGxpZnRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFwVW50aWxLZXlib2FyZElzVXAocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICBjb25zdCBiYXNlbGluZVNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIGxldCBzbmFwc2hvdCA9IGJhc2VsaW5lU25hcHNob3Q7XG5cbiAgaWYgKCFzbmFwc2hvdC5pbnB1dFJlY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhaXNlU29mdEtleWJvYXJkOiBub3RoaW5nIG1hdGNoZXMgXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiLCBzbyB0aGVyZSBpcyBubyBmaWVsZCB0byB0b3VjaC5gKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcG9pbnQgb2YgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50cyh7IHNuYXBzaG90IH0pKSB7XG4gICAgaWYgKGNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IHRhcERldmljZSh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsIHBvaW50IH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIH1cblxuICBpZiAoIWNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgYnVpbGRGYWlsdXJlTWVzc2FnZShwYXJhbXMsIGJhc2VsaW5lU25hcHNob3QsIHNuYXBzaG90KSk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG5cbiAgZnVuY3Rpb24gY2hlY2tJc1VwKGN1cnJlbnQ6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hlY2tJc1NvZnRLZXlib2FyZFVwKHtcbiAgICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgICAuLi4ocGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzICE9PSB1bmRlZmluZWQgJiYgeyBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsczogcGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzIH0pLFxuICAgICAgc25hcHNob3Q6IGN1cnJlbnRcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBhIGZpZWxkJ3MgdmFsdWUgYW5kIHRlbGxzIHRoZSBwYWdlIGl0IGNoYW5nZWQuXG4gKlxuICogVGhlIGBpbnB1dGAgZXZlbnQgaXMgd2hhdCBhIHNjcmlwdGVkIHdyaXRlIG93ZXMgdGhlIHBhZ2U6IHdpdGhvdXQgaXQgYSBzdWdnZXN0ZXIga2VlcHMgdGhlIHJvd3MgaXQgaGFkXG4gKiBmb3IgdGhlIHRleHQgdGhhdCBpcyBubyBsb25nZXIgdGhlcmUuIEl0IGJ1YmJsZXMsIGJlY2F1c2UgdGhhdCBpcyBob3cgYSBmcmFtZXdvcmsgbGlzdGVuaW5nIG9uIGFcbiAqIGNvbnRhaW5lciBoZWFycyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIHdyaXRlLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRvIHdyaXRlIGludG8gaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHdyaXRlIGhhcyBiZWVuIG1hZGUuXG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0aGUgZmllbGQgaXMgbm90IG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWVsZFRleHQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IsIHRleHQ6IHZhbHVlIH0pOiB2b2lkIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IFwiJHtpbnB1dFNlbGVjdG9yfVwiIGlzIG5vdCBhIGZpZWxkIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLmApO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciwgdGV4dCB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0VBLHFCQUdPO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQUNwQixzQkFBb0M7QUFTcEMsaUJBQTJCO0FBQzNCLCtCQUF3QztBQUN4Qyw4QkFBK0I7QUFDL0IsNkJBQThCO0FBQzlCLGlCQUFvQjtBQUNwQixvQ0FNTztBQW9HUCxNQUFNLG9DQUFnQyx1QkFBSyxvQkFBQUEsUUFBUSxJQUFJLEdBQUcsUUFBUSxhQUFhO0FBSy9FLE1BQU0sd0NBQXdDO0FBTTlDLE1BQU0seUNBQXlDO0FBUS9DLE1BQU0saUNBQWlDO0FBVXZDLE1BQU0sb0RBQW9EO0FBSzFELE1BQU0sMkJBQTJCO0FBTWpDLE1BQU0sZ0RBQWdEO0FBdUV0RCxlQUFzQixrQkFBa0IsUUFBd0U7QUFDOUcsUUFBTSx5QkFBeUIsTUFBTTtBQUVyQyxRQUFNLGdCQUFnQixNQUFNLG1CQUFtQixNQUFNO0FBRXJELE1BQUk7QUFFSixNQUFJO0FBQ0YsZUFBVyxNQUFNLHFCQUFxQixNQUFNO0FBQUEsRUFDOUMsU0FBUyxPQUFPO0FBR2QsUUFBSSxrQkFBa0IsTUFBTTtBQUMxQixZQUFNLHdCQUF3QixRQUFRLGFBQWE7QUFBQSxJQUNyRDtBQUVBLFVBQU07QUFBQSxFQUNSO0FBRUEsTUFBSSxrQkFBa0IsTUFBTTtBQUMxQixVQUFNLGlCQUFpQixRQUFRLGFBQWE7QUFBQSxFQUM5QztBQUVBLE1BQUksT0FBTyw2QkFBNkIsT0FBTztBQUM3QyxVQUFNLGlCQUFpQixNQUFNO0FBQUEsRUFDL0I7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SUFDeEM7QUFBQSxFQUNGO0FBQ0Y7QUFZQSxlQUFlLHFCQUFxQixRQUF3RTtBQUMxRyxRQUFNLG1CQUFtQixNQUFNLHlCQUF5QixNQUFNO0FBQzlELE1BQUksV0FBVztBQUVmLE1BQUksQ0FBQyxTQUFTLFdBQVc7QUFDdkIsVUFBTSxJQUFJLE1BQU0sdUNBQXVDLE9BQU8sYUFBYSxtQ0FBbUM7QUFBQSxFQUNoSDtBQUVBLGFBQVcsYUFBUyw0REFBNkIsRUFBRSxTQUFTLENBQUMsR0FBRztBQUM5RCxRQUFJLFVBQVUsUUFBUSxHQUFHO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBVSxFQUFFLFVBQVUsT0FBTyxVQUFVLE1BQU0sQ0FBQztBQUNwRCxjQUFNLGdCQUFBQSxZQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsZUFBTyxxREFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQWNBLGVBQWUsZUFBZSxRQUFpQyxNQUE2QjtBQUMxRixZQUFNLHdDQUFlO0FBQUEsSUFDbkIsU0FBUyxFQUFFLGVBQWUsTUFBTSxNQUFNLEdBQVM7QUFDN0MsWUFBTSxVQUFVLFNBQVMsY0FBYyxhQUFhO0FBRXBELFVBQUksRUFBRSxtQkFBbUIscUJBQXFCLEVBQUUsbUJBQW1CLHNCQUFzQjtBQUN2RixjQUFNLElBQUksVUFBVSx1QkFBdUIsYUFBYSw4Q0FBOEM7QUFBQSxNQUN4RztBQUVBLGNBQVEsUUFBUTtBQUNoQixjQUFRLGNBQWMsSUFBSSxNQUFNLFNBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQyxDQUFDO0FBQUEsSUFDN0Q7QUFBQSxJQUNBLE9BQU8sRUFBRSxlQUFlLE9BQU8sZUFBZSxLQUFLO0FBQUEsSUFDbkQsR0FBSSxPQUFPLGNBQWMsVUFBYSxFQUFFLFdBQVcsT0FBTyxVQUFVO0FBQUEsRUFDdEUsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIiwgInNsZWVwIl0KfQo=
@@ -51,6 +51,18 @@
51
51
  * so the capture straight after showed the placeholder. The field is re-read until it holds, and written
52
52
  * again when it does not.
53
53
  *
54
+ * 5. **Gboard's suggestion strip is a second race, and parking the caret at offset 0 ends it.** With the
55
+ * keyboard up, Gboard draws either its toolbar (apps, stickers, GIF, clipboard, settings, theme, mic) or word
56
+ * predictions for the text before the caret. The touch landed on the emptied field, which gets the toolbar,
57
+ * and the write-back puts the caret at the end of the text, which gets predictions — once Gboard hears about
58
+ * it, which is a matter of timing. The predictions themselves come from the keyboard's learned dictionary
59
+ * and differ between runs. So a capture showed one of two strips, and two different sets of predictions
60
+ * when it showed the second. Suggestions cannot be switched off from the page: Obsidian's `.prompt-input`
61
+ * already carries `spellcheck="false"`, and the IME already receives `TYPE_TEXT_FLAG_NO_SUGGESTIONS`
62
+ * (`inputType=0x2080a1`). Gboard still predicts (measured 2026-09-25). With the caret at offset 0 there is
63
+ * no text before it, which is the empty-field state, so whichever way the race goes, the strip is the
64
+ * toolbar. See `shouldPinKeyboardToolbar`.
65
+ *
54
66
  * The geometry that decides whether it worked is unit-tested in
55
67
  * `soft-keyboard-geometry`; everything here drives a real device, so the whole
56
68
  * module is integration-time code.
@@ -100,6 +112,30 @@ export interface RaiseSoftKeyboardParams {
100
112
  * @default true
101
113
  */
102
114
  readonly shouldEmptyFieldForTouch?: boolean;
115
+ /**
116
+ * Whether to park the caret at offset 0 once the keyboard is up, so Gboard's suggestion strip shows its
117
+ * toolbar rather than word predictions.
118
+ *
119
+ * **On by default, because the strip is otherwise a race between two states, and one of them varies.**
120
+ * Gboard shows its toolbar while nothing sits before the caret, and predictions for the word before it
121
+ * otherwise. The touch lands on the emptied field (toolbar). The write-back leaves the caret after the text
122
+ * (predictions), but only once Gboard has processed that update. And the predictions come from the
123
+ * keyboard's learned dictionary, so they differ from one run to the next. With the caret at offset 0 both
124
+ * outcomes of the race are the toolbar: measured 2026-09-25, six raises with the caret parked all gave
125
+ * byte-identical strip rows showing the toolbar, while the same field with the caret at the end showed
126
+ * `multiple` / `multiples` / `multiplex`.
127
+ *
128
+ * Turning suggestions off does not do this. Obsidian's prompt input already has `spellcheck="false"`,
129
+ * and the IME already receives `TYPE_TEXT_FLAG_NO_SUGGESTIONS`, yet Gboard still predicts.
130
+ *
131
+ * Only an `<input>` or a `<textarea>` is parked; any other field is left as it is. The caret is visible at
132
+ * offset 0 unless the capture hides it, which a device capture has to ask for with `hideCaret`.
133
+ *
134
+ * Turning it off leaves the caret where the write-back or the touch put it.
135
+ *
136
+ * @default true
137
+ */
138
+ readonly shouldPinKeyboardToolbar?: boolean;
103
139
  /**
104
140
  * The vault to read the geometry from. When omitted, the current test context's vault is used.
105
141
  */
@@ -136,6 +172,10 @@ export interface TapDeviceParams {
136
172
  * text draws Chromium's selection handle and the framebuffer photographs it — see
137
173
  * {@link RaiseSoftKeyboardParams.shouldEmptyFieldForTouch}, which turns that off.
138
174
  *
175
+ * **The caret is then parked at offset 0**, so Gboard's suggestion strip is its toolbar rather than word
176
+ * predictions that race the write-back and vary between runs — see
177
+ * {@link RaiseSoftKeyboardParams.shouldPinKeyboardToolbar}, which turns that off.
178
+ *
139
179
  * **The geometry returned is read with the field still empty**, and the text is written back after it.
140
180
  * That is the state the proven capture suites assert against, and it is deliberate rather than
141
181
  * incidental: the baseline is read AFTER the field is emptied, so the lift is measured between two reads
@@ -148,8 +188,9 @@ export interface TapDeviceParams {
148
188
  * @returns A {@link Promise} that resolves to the geometry read once the keyboard is up.
149
189
  * @throws Error if a keyboard already up would not go down, if the field never matched, if it holds text
150
190
  * this cannot empty and put back, if it never lifted — after writing the device framebuffer and the
151
- * device's own `input_method` state to the diagnostics directory — or if the text written back would not
152
- * stay in the field. A write-back the IME undoes is written again until it holds; see `restoreFieldText`.
191
+ * device's own `input_method` state to the diagnostics directory — if the text written back would not
192
+ * stay in the field, or if the caret would not stay at offset 0. A write-back the IME undoes is written
193
+ * again until it holds; see `restoreFieldText`.
153
194
  */
154
195
  export declare function raiseSoftKeyboard(params: RaiseSoftKeyboardParams): Promise<SoftKeyboardViewportSnapshot>;
155
196
  /**
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = false ? "dev" : "17.1.1";
1
+ const LIBRARY_VERSION = false ? "dev" : "17.2.0";
2
2
  export {
3
3
  LIBRARY_VERSION
4
4
  };
@@ -51,6 +51,18 @@
51
51
  * so the capture straight after showed the placeholder. The field is re-read until it holds, and written
52
52
  * again when it does not.
53
53
  *
54
+ * 5. **Gboard's suggestion strip is a second race, and parking the caret at offset 0 ends it.** With the
55
+ * keyboard up, Gboard draws either its toolbar (apps, stickers, GIF, clipboard, settings, theme, mic) or word
56
+ * predictions for the text before the caret. The touch landed on the emptied field, which gets the toolbar,
57
+ * and the write-back puts the caret at the end of the text, which gets predictions — once Gboard hears about
58
+ * it, which is a matter of timing. The predictions themselves come from the keyboard's learned dictionary
59
+ * and differ between runs. So a capture showed one of two strips, and two different sets of predictions
60
+ * when it showed the second. Suggestions cannot be switched off from the page: Obsidian's `.prompt-input`
61
+ * already carries `spellcheck="false"`, and the IME already receives `TYPE_TEXT_FLAG_NO_SUGGESTIONS`
62
+ * (`inputType=0x2080a1`). Gboard still predicts (measured 2026-09-25). With the caret at offset 0 there is
63
+ * no text before it, which is the empty-field state, so whichever way the race goes, the strip is the
64
+ * toolbar. See `shouldPinKeyboardToolbar`.
65
+ *
54
66
  * The geometry that decides whether it worked is unit-tested in
55
67
  * `soft-keyboard-geometry`; everything here drives a real device, so the whole
56
68
  * module is integration-time code.
@@ -100,6 +112,30 @@ export interface RaiseSoftKeyboardParams {
100
112
  * @default true
101
113
  */
102
114
  readonly shouldEmptyFieldForTouch?: boolean;
115
+ /**
116
+ * Whether to park the caret at offset 0 once the keyboard is up, so Gboard's suggestion strip shows its
117
+ * toolbar rather than word predictions.
118
+ *
119
+ * **On by default, because the strip is otherwise a race between two states, and one of them varies.**
120
+ * Gboard shows its toolbar while nothing sits before the caret, and predictions for the word before it
121
+ * otherwise. The touch lands on the emptied field (toolbar). The write-back leaves the caret after the text
122
+ * (predictions), but only once Gboard has processed that update. And the predictions come from the
123
+ * keyboard's learned dictionary, so they differ from one run to the next. With the caret at offset 0 both
124
+ * outcomes of the race are the toolbar: measured 2026-09-25, six raises with the caret parked all gave
125
+ * byte-identical strip rows showing the toolbar, while the same field with the caret at the end showed
126
+ * `multiple` / `multiples` / `multiplex`.
127
+ *
128
+ * Turning suggestions off does not do this. Obsidian's prompt input already has `spellcheck="false"`,
129
+ * and the IME already receives `TYPE_TEXT_FLAG_NO_SUGGESTIONS`, yet Gboard still predicts.
130
+ *
131
+ * Only an `<input>` or a `<textarea>` is parked; any other field is left as it is. The caret is visible at
132
+ * offset 0 unless the capture hides it, which a device capture has to ask for with `hideCaret`.
133
+ *
134
+ * Turning it off leaves the caret where the write-back or the touch put it.
135
+ *
136
+ * @default true
137
+ */
138
+ readonly shouldPinKeyboardToolbar?: boolean;
103
139
  /**
104
140
  * The vault to read the geometry from. When omitted, the current test context's vault is used.
105
141
  */
@@ -136,6 +172,10 @@ export interface TapDeviceParams {
136
172
  * text draws Chromium's selection handle and the framebuffer photographs it — see
137
173
  * {@link RaiseSoftKeyboardParams.shouldEmptyFieldForTouch}, which turns that off.
138
174
  *
175
+ * **The caret is then parked at offset 0**, so Gboard's suggestion strip is its toolbar rather than word
176
+ * predictions that race the write-back and vary between runs — see
177
+ * {@link RaiseSoftKeyboardParams.shouldPinKeyboardToolbar}, which turns that off.
178
+ *
139
179
  * **The geometry returned is read with the field still empty**, and the text is written back after it.
140
180
  * That is the state the proven capture suites assert against, and it is deliberate rather than
141
181
  * incidental: the baseline is read AFTER the field is emptied, so the lift is measured between two reads
@@ -148,8 +188,9 @@ export interface TapDeviceParams {
148
188
  * @returns A {@link Promise} that resolves to the geometry read once the keyboard is up.
149
189
  * @throws Error if a keyboard already up would not go down, if the field never matched, if it holds text
150
190
  * this cannot empty and put back, if it never lifted — after writing the device framebuffer and the
151
- * device's own `input_method` state to the diagnostics directory — or if the text written back would not
152
- * stay in the field. A write-back the IME undoes is written again until it holds; see `restoreFieldText`.
191
+ * device's own `input_method` state to the diagnostics directory — if the text written back would not
192
+ * stay in the field, or if the caret would not stay at offset 0. A write-back the IME undoes is written
193
+ * again until it holds; see `restoreFieldText`.
153
194
  */
154
195
  export declare function raiseSoftKeyboard(params: RaiseSoftKeyboardParams): Promise<SoftKeyboardViewportSnapshot>;
155
196
  /**
@@ -22,6 +22,8 @@ const KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS = 1500;
22
22
  const KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS = 900;
23
23
  const KEYBOARD_RETRACT_ATTEMPT_COUNT = 2;
24
24
  const KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS = KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS;
25
+ const CARET_PARK_ATTEMPT_COUNT = 3;
26
+ const CARET_PARK_CONFIRMATION_DELAY_IN_MILLISECONDS = 300;
25
27
  async function raiseSoftKeyboard(params) {
26
28
  await lowerSoftKeyboardIfShown(params);
27
29
  const textToRestore = await emptyFieldForTouch(params);
@@ -37,6 +39,9 @@ async function raiseSoftKeyboard(params) {
37
39
  if (textToRestore !== null) {
38
40
  await restoreFieldText(params, textToRestore);
39
41
  }
42
+ if (params.shouldPinKeyboardToolbar !== false) {
43
+ await parkCaretAtStart(params);
44
+ }
40
45
  return snapshot;
41
46
  }
42
47
  async function tapDevice(params) {
@@ -133,6 +138,36 @@ device: ${inputMethodState}`
133
138
  );
134
139
  }
135
140
  }
141
+ async function parkCaretAtStart(params) {
142
+ const selections = [];
143
+ for (let attempt = 0; attempt < CARET_PARK_ATTEMPT_COUNT; attempt++) {
144
+ const isParked = await evalInObsidian({
145
+ callback({ inputSelector }) {
146
+ const element = document.querySelector(inputSelector);
147
+ if (!(element instanceof HTMLInputElement) && !(element instanceof HTMLTextAreaElement)) {
148
+ return false;
149
+ }
150
+ element.setSelectionRange(0, 0);
151
+ return true;
152
+ },
153
+ input: { inputSelector: params.inputSelector },
154
+ ...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
155
+ });
156
+ if (!isParked) {
157
+ return;
158
+ }
159
+ await sleep(CARET_PARK_CONFIRMATION_DELAY_IN_MILLISECONDS);
160
+ const selection = await readFieldSelection(params);
161
+ selections.push(selection);
162
+ if (selection?.selectionStart === 0 && selection.selectionEnd === 0) {
163
+ return;
164
+ }
165
+ }
166
+ throw new Error(
167
+ `raiseSoftKeyboard: the caret parked at offset 0 in "${params.inputSelector}" did not stay there, so Gboard's strip would show word predictions rather than its toolbar. ${String(CARET_PARK_ATTEMPT_COUNT)} attempt(s); the field read ${JSON.stringify(selections)}. Pass shouldPinKeyboardToolbar: false to leave the caret alone.
168
+ device: ${await readInputMethodState(params)}`
169
+ );
170
+ }
136
171
  async function readFieldContent(params) {
137
172
  return await evalInObsidian({
138
173
  callback({ inputSelector }) {
@@ -147,6 +182,16 @@ async function readFieldContent(params) {
147
182
  ...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
148
183
  });
149
184
  }
185
+ async function readFieldSelection(params) {
186
+ return await evalInObsidian({
187
+ callback({ inputSelector }) {
188
+ const element = document.querySelector(inputSelector);
189
+ return element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement ? { selectionEnd: element.selectionEnd, selectionStart: element.selectionStart } : null;
190
+ },
191
+ input: { inputSelector: params.inputSelector },
192
+ ...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
193
+ });
194
+ }
150
195
  async function readInputMethodState(params) {
151
196
  const dumpsysOutput = await runAdbText({
152
197
  commandArguments: ["shell", "dumpsys", "input_method"],
@@ -235,4 +280,4 @@ export {
235
280
  raiseSoftKeyboard,
236
281
  tapDevice
237
282
  };
238
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqICAgICoqQW5kIHRoZSB0ZXh0IHdyaXR0ZW4gYmFjayBoYXMgdG8gYmUgSEVMRCwgbm90IGp1c3Qgd3JpdHRlbi4qKiBUaGUgSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb21cbiAqICAgIHRoZSBlbXB0aWVkIGZpZWxkLCBhbmQgYWJvdXQgb25lIHRpbWUgaW4gZml2ZSBpdCB3cm90ZSB0aGF0IGVtcHR5IHN0YXRlIGJhY2sgb3ZlciB0aGUgaGFybmVzcydzIHdyaXRlLFxuICogICAgc28gdGhlIGNhcHR1cmUgc3RyYWlnaHQgYWZ0ZXIgc2hvd2VkIHRoZSBwbGFjZWhvbGRlci4gVGhlIGZpZWxkIGlzIHJlLXJlYWQgdW50aWwgaXQgaG9sZHMsIGFuZCB3cml0dGVuXG4gKiAgICBhZ2FpbiB3aGVuIGl0IGRvZXMgbm90LlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBIb2xkRmllbGRUZXh0UmVzdWx0IH0gZnJvbSAnLi9maWVsZC10ZXh0LWhvbGQubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgRWxlbWVudFJlY3QsXG4gIFNvZnRLZXlib2FyZFRhcFBvaW50LFxuICBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5tanMnO1xuXG5pbXBvcnQgeyBydW5BZGJUZXh0IH0gZnJvbSAnLi9hZGIubWpzJztcbmltcG9ydCB7IGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90IH0gZnJvbSAnLi9kZXZpY2Utc2NyZWVuc2hvdC5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IGhvbGRGaWVsZFRleHQgfSBmcm9tICcuL2ZpZWxkLXRleHQtaG9sZC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2UsXG4gIGNoZWNrSXNJbnB1dE1ldGhvZFNob3duLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIHBhcnNlSW5wdXRNZXRob2RTdGF0ZSxcbiAgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1xufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmFpc2VTb2Z0S2V5Ym9hcmR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IHdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGl0IGlzIGBkaXN0L3NjcmVlbnNob3RzYCB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgXHUyMDE0IHJlc29sdmVkIGF0IGxvYWQsIHNvIHRoZXJlIGlzIG5vXG4gICAqIGxpdGVyYWwgZGVmYXVsdCB0byBzdGF0ZSBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1Mgc2VsZWN0b3Igb2YgdGhlIGZpZWxkIHRvIHRvdWNoLCBlLmcuIGAucHJvbXB0LWlucHV0YC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VsZWN0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieS5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFNgIGZyb20gYHNvZnQta2V5Ym9hcmQtZ2VvbWV0cnlgIGFwcGxpZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbXB0eSB0aGUgZmllbGQgYmVmb3JlIHRoZSB0b3VjaCwgYW5kIHdyaXRlIGl0cyB0ZXh0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogKipPbiBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZSB0b3VjaCB0aGF0IHJhaXNlcyB0aGUga2V5Ym9hcmQgYWxzbyBkcmF3cyBhIHNlbGVjdGlvbiBoYW5kbGUgd2hlbiBpdFxuICAgKiBsYW5kcyBpbnNpZGUgVEVYVC4qKiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcCBpbnRvIHRleHQgYW5kIGRyYXdzIG5vbmUgb24gYSB0YXBcbiAgICogaW50byBhbiBFTVBUWSBlZGl0YWJsZSwgYW5kIGEgZGV2aWNlIGNhcHR1cmUgcGhvdG9ncmFwaHMgaXQgXHUyMDE0IHdoaWNoIGlzIGhvdyBgb2JzaWRpYW4tbGluay1waWNrZXJgXG4gICAqIHNoaXBwZWQgYSB0ZWFsIGhhbmRsZSBpbiBhIHN0b3JlIGxpc3RpbmcgaW1hZ2UgdHdpY2UgYmVmb3JlIGFueW9uZSB1bmRlcnN0b29kIHdoZXJlIGl0IGNhbWUgZnJvbS4gQVxuICAgKiB2YWx1ZSB3cml0dGVuIGJ5IHNjcmlwdCByYWlzZXMgbm8gaGFuZGxlLCBzbyBlbXB0eWluZyB0aGUgZmllbGQsIHRvdWNoaW5nIGl0LCBhbmQgd3JpdGluZyB0aGUgdGV4dFxuICAgKiBiYWNrIGxlYXZlcyB0aGUgZnJhbWUgc2hvd2luZyB0aGUgc2FtZSBxdWVyeSB3aXRoIG5vdGhpbmcgaGFuZ2luZyBvZmYgaXQuXG4gICAqXG4gICAqIE9ubHkgYW4gYDxpbnB1dD5gIG9yIGEgYDx0ZXh0YXJlYT5gIGlzIGVtcHRpZWQuIEEgYGNvbnRlbnRlZGl0YWJsZWAgaG9sZGluZyB0ZXh0IGlzIFJFRlVTRUQgcmF0aGVyXG4gICAqIHRoYW4gd3JpdHRlbiB0bzogaXRzIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00sIGFuZCBibGFua2luZyB0aGF0XG4gICAqIGJ5IGhhbmQgZGVzdHJveXMgaXQuIEVtcHR5IHN1Y2ggYSBmaWVsZCB5b3Vyc2VsZiwgb3IgdHVybiB0aGlzIG9mZi5cbiAgICpcbiAgICogVHVybmluZyBpdCBvZmYgcmVzdG9yZXMgdGhlIHByZS0yMDI2LTA5LTIzIGJlaGF2aW91ciBleGFjdGx5OiB0aGUgZmllbGQgaXMgdG91Y2hlZCBhcyBpdCBzdGFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVtcHR5RmllbGRGb3JUb3VjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0byByZWFkIHRoZSBnZW9tZXRyeSBmcm9tLiBXaGVuIG9taXR0ZWQsIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCdzIHZhdWx0IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRhcERldmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwRGV2aWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byB0b3VjaCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50OiBTb2Z0S2V5Ym9hcmRUYXBQb2ludDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBpdHMgZXZpZGVuY2UgXHUyMDE0IHVuZGVyIGBkaXN0L2AsIHdoaWNoIGEgcGx1Z2luIHJlcG8gdXNpbmcgdGhpcyBoYXJuZXNzIGdpdGlnbm9yZXMsIGxpa2UgdGhlIGNhcHR1cmUgc2NyYXRjaCBmaWxlcy5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlkgPSBqb2luKHByb2Nlc3MuY3dkKCksICdkaXN0JywgJ3NjcmVlbnNob3RzJyk7XG5cbi8qKlxuICogSG93IGxvbmcgdGhlIElNRSB0YWtlcyB0byBmaW5pc2ggYW5pbWF0aW5nIGluLCBhZnRlciB3aGljaCB0aGUgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICovXG5jb25zdCBLRVlCT0FSRF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTUwMDtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgb3V0IGFmdGVyIGBLRVlDT0RFX0JBQ0tgLCBtZWFzdXJlZCBpbiB0aGUgY2FwdHVyZSBzdWl0ZSB0aGlzXG4gKiB3YXMgbW92ZWQgb3V0IG9mLlxuICovXG5jb25zdCBLRVlCT0FSRF9SRVRSQUNUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDkwMDtcblxuLyoqXG4gKiBIb3cgbWFueSB0aW1lcyBgS0VZQ09ERV9CQUNLYCBpcyBwcmVzc2VkIGJlZm9yZSBhIGtleWJvYXJkIHRoYXQgd2lsbCBub3QgZ28gZG93biBpcyByZXBvcnRlZC5cbiAqXG4gKiBUd28sIGJlY2F1c2UgdGhlIGZpcnN0IHByZXNzIGNhbiBsYW5kIHdoaWxlIHRoZSBJTUUgaXMgc3RpbGwgYW5pbWF0aW5nIFVQIGZyb20gdGhlIGZvY3VzIHRoYXQgcmFpc2VkXG4gKiBpdCwgYW5kIGFuIElNRSBtaWQtYW5pbWF0aW9uIHN3YWxsb3dzIHRoZSBrZXkgd2l0aG91dCByZXRyYWN0aW5nLlxuICovXG5jb25zdCBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIEhvdyBsb25nIGEga2V5Ym9hcmQgcmVwb3J0ZWQgc2hvd2luZyBpcyB3YXRjaGVkIGJlZm9yZSBgS0VZQ09ERV9CQUNLYCBpcyBwcmVzc2VkIGF0IGl0LlxuICpcbiAqIE9uZSByZXRyYWN0IGFuaW1hdGlvbjogYW4gSU1FIGFscmVhZHkgb24gaXRzIHdheSBkb3duIFx1MjAxNCB0aGUgbW9kYWwgdGhhdCByYWlzZWQgaXQgaGFzIGp1c3QgY2xvc2VkIFx1MjAxNCBpc1xuICogc3RpbGwgcmVwb3J0ZWQgc2hvd2luZyBieSBhIHJlYWQgdGFrZW4gYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBhbmQgaXMgZ29uZSBieSB0aGUgZW5kIG9mIGl0LiBQcmVzc2luZ1xuICogYXQgdGhlIGZpcnN0IHJlYWQgdGhlbiBsYW5kcyB0aGUga2V5IG9uIHRoZSBhcHAgaW5zdGVhZCwgd2hpY2ggY2xvc2VzIHRoZSBtb2RhbCB0aGUgZnJhbWUgaXMgYWJvdXQgdG9cbiAqIHBob3RvZ3JhcGguIFR3byByZWFkcyB0aGF0IGFncmVlIGFjcm9zcyB0aGlzIHdpbmRvdyBzYXkgdGhlIGtleWJvYXJkIGlzIHN0YXlpbmcgdXAuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSBLRVlCT0FSRF9SRVRSQUNUX0RFTEFZX0lOX01JTExJU0VDT05EUztcblxuLyoqXG4gKiBXaGF0IGEgZmllbGQgaG9sZHMsIGFuZCB3aGV0aGVyIGl0IGlzIG9uZSB0aGlzIGNhbiBwdXQgYmFjay5cbiAqL1xuaW50ZXJmYWNlIEZpZWxkQ29udGVudCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmaWVsZCdzIHZhbHVlIGNhbiBiZSB3cml0dGVuIFx1MjAxNCB0cnVlIGZvciBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAsIGZhbHNlIGZvclxuICAgKiBhbnl0aGluZyBlbHNlLCB3aG9zZSBjb250ZW50IHVzdWFsbHkgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuV3JpdGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRoZSBmaWVsZCBjdXJyZW50bHkgaG9sZHMuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmFpc2VzIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQgd2l0aCBhIHJlYWwgdG91Y2ggb24gYSBmaWVsZCwgYW5kIGNvbmZpcm1zIGl0IGNhbWUgdXAuXG4gKlxuICogQ2FsbCBpdCBpbnNpZGUgYHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkYCBcdTIwMTQgdGhlIGRldmljZSBzZXR0aW5nIGFsb25lIGRvZXMgbm90IHJhaXNlIHRoZSBrZXlib2FyZCwgYW5kIHRoaXNcbiAqIHRvdWNoIGFsb25lIGNhbm5vdCB3aGlsZSB0aGUgc2V0dGluZyBzdXBwcmVzc2VzIGl0LlxuICpcbiAqICoqQSBrZXlib2FyZCB0aGF0IGlzIGFscmVhZHkgdXAgaXMgcHV0IERPV04gZmlyc3QuKiogVGhlIGZpcnN0IGdlb21ldHJ5IHJlYWQgaXMgdGhlIGJhc2VsaW5lIGV2ZXJ5IGxhdGVyXG4gKiByZWFkIGlzIGNvbXBhcmVkIGFnYWluc3QsIHNvIGEga2V5Ym9hcmQgYWxyZWFkeSB1cCB3b3VsZCBsZWF2ZSB0aGUgZmllbGQgbm90aGluZyB0byBsaWZ0IGJ5IGFuZCByZWFkIGFzXG4gKiBvbmUgdGhhdCBuZXZlciBjYW1lLiBUaGUgZGV2aWNlIGlzIGFza2VkIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBhbmQgYSBzaG93aW5nIElNRSBpcyByZXRyYWN0ZWQgd2l0aFxuICogYEtFWUNPREVfQkFDS2AgXHUyMDE0IGFza2VkIEZJUlNUIGJlY2F1c2UsIHdpdGggbm8gSU1FIHNob3dpbmcsIHRoYXQga2V5IHJlYWNoZXMgdGhlIGFwcCBhbmQgY2xvc2VzIHRoZSB2ZXJ5XG4gKiBtb2RhbCB0aGUgZnJhbWUgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gU28gdGhlIGhlbHBlciBpcyBzYWZlIHRvIGNhbGwgb25jZSBwZXIgZnJhbWUgb2YgYSBtdWx0aS1mcmFtZVxuICogc3VpdGUsIGFuZCBldmVyeSBjYWxsIHN0aWxsIHByb3ZlcyBpdHMgb3duIGxpZnQuIFRoZSBvdGhlciBhbnN3ZXIgXHUyMDE0IGFjY2VwdGluZyBhIHplcm8gbGlmdCB3aGVuZXZlciB0aGVcbiAqIGRldmljZSByZXBvcnRzIGEga2V5Ym9hcmQgXHUyMDE0IHdhcyByZWZ1c2VkLCBiZWNhdXNlIGl0IGFjY2VwdHMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZCBub3QgcHJvdmUuXG4gKlxuICogKipUaGUgZmllbGQgaXMgRU1QVElFRCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcyoqLCBiZWNhdXNlIGEgdG91Y2ggdGhhdCBsYW5kcyBpbnNpZGVcbiAqIHRleHQgZHJhd3MgQ2hyb21pdW0ncyBzZWxlY3Rpb24gaGFuZGxlIGFuZCB0aGUgZnJhbWVidWZmZXIgcGhvdG9ncmFwaHMgaXQgXHUyMDE0IHNlZVxuICoge0BsaW5rIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaH0sIHdoaWNoIHR1cm5zIHRoYXQgb2ZmLlxuICpcbiAqICoqVGhlIGdlb21ldHJ5IHJldHVybmVkIGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgc3RpbGwgZW1wdHkqKiwgYW5kIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gYmFjayBhZnRlciBpdC5cbiAqIFRoYXQgaXMgdGhlIHN0YXRlIHRoZSBwcm92ZW4gY2FwdHVyZSBzdWl0ZXMgYXNzZXJ0IGFnYWluc3QsIGFuZCBpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuXG4gKiBpbmNpZGVudGFsOiB0aGUgYmFzZWxpbmUgaXMgcmVhZCBBRlRFUiB0aGUgZmllbGQgaXMgZW1wdGllZCwgc28gdGhlIGxpZnQgaXMgbWVhc3VyZWQgYmV0d2VlbiB0d28gcmVhZHNcbiAqIG9mIHRoZSBzYW1lIGZpZWxkIGNvbnRlbnQuIEEgZmllbGQgd2hvc2Ugb3duIHRleHQgY2hhbmdlcyB0aGUgbGF5b3V0IGFyb3VuZCBpdCBcdTIwMTQgYSBzdWdnZXN0ZXIgd2hvc2Ugcm93XG4gKiBjb3VudCBhbnN3ZXJzIHRoZSBxdWVyeSBcdTIwMTQgbW92ZXMgd2hlbiBpdCBpcyBjbGVhcmVkLCBhbmQgYSBkZWx0YSBtZWFzdXJlZCBhY3Jvc3MgdGhhdCBtb3ZlIGlzIG5vdCBhXG4gKiBrZXlib2FyZC4gUmVhZCB0aGUgZ2VvbWV0cnkgYWdhaW4geW91cnNlbGYgaWYgdGhlIHJlc3RvcmVkIHRleHQgbW92ZXMgYW55dGhpbmcgeW91IGFyZSBhYm91dCB0byBhc3NlcnRcbiAqIG9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEga2V5Ym9hcmQgYWxyZWFkeSB1cCB3b3VsZCBub3QgZ28gZG93biwgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIGlmIGl0IGhvbGRzIHRleHRcbiAqICAgdGhpcyBjYW5ub3QgZW1wdHkgYW5kIHB1dCBiYWNrLCBpZiBpdCBuZXZlciBsaWZ0ZWQgXHUyMDE0IGFmdGVyIHdyaXRpbmcgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgdGhlXG4gKiAgIGRldmljZSdzIG93biBgaW5wdXRfbWV0aG9kYCBzdGF0ZSB0byB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IFx1MjAxNCBvciBpZiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgd291bGQgbm90XG4gKiAgIHN0YXkgaW4gdGhlIGZpZWxkLiBBIHdyaXRlLWJhY2sgdGhlIElNRSB1bmRvZXMgaXMgd3JpdHRlbiBhZ2FpbiB1bnRpbCBpdCBob2xkczsgc2VlIGByZXN0b3JlRmllbGRUZXh0YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhaXNlU29mdEtleWJvYXJkKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgYXdhaXQgbG93ZXJTb2Z0S2V5Ym9hcmRJZlNob3duKHBhcmFtcyk7XG5cbiAgY29uc3QgdGV4dFRvUmVzdG9yZSA9IGF3YWl0IGVtcHR5RmllbGRGb3JUb3VjaChwYXJhbXMpO1xuXG4gIGxldCBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICB0cnkge1xuICAgIHNuYXBzaG90ID0gYXdhaXQgdGFwVW50aWxLZXlib2FyZElzVXAocGFyYW1zKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXN0b3JlZCBldmVuIHdoZW4gdGhlIHJhaXNlIGZhaWxlZDogYSBjYWxsZXIgdGhhdCBpcyBhYm91dCB0byByZWFkIGl0cyBvd24gZGlhZ25vc3RpYyBzaG91bGQgbm90XG4gICAgLy8gYWxzbyBoYXZlIHRvIGRpc2NvdmVyIHRoYXQgaXRzIHF1ZXJ5IGlzIGdvbmUuIEJlc3QtZWZmb3J0LCBzbyB0aGUgcmFpc2UncyBvd24gZXJyb3IgaXMgdGhlIG9uZSB0aHJvd24uXG4gICAgaWYgKHRleHRUb1Jlc3RvcmUgIT09IG51bGwpIHtcbiAgICAgIGF3YWl0IGhvbGRGaWVsZFRleHRCZXN0RWZmb3J0KHBhcmFtcywgdGV4dFRvUmVzdG9yZSk7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgIGF3YWl0IHJlc3RvcmVGaWVsZFRleHQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBkZXZpY2UgYXQgYSBwb2ludCwgdGhlIHdheSBhIHRodW1iIHdvdWxkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB3aGVyZSB0byB0b3VjaCBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdG91Y2ggaGFzIGJlZW4gZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhcERldmljZShwYXJhbXM6IFRhcERldmljZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ3RhcCcsIFN0cmluZyhwYXJhbXMucG9pbnQueEluUGl4ZWxzKSwgU3RyaW5nKHBhcmFtcy5wb2ludC55SW5QaXhlbHMpXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyIGFuZCByZWFkcyB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHRoZW4gY29tcG9zZXMgdGhlIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gYmFzZWxpbmVTbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2gsIHdoaWNoIHRoZSB2ZXJkaWN0IGlzIG1lYXN1cmVkIGFnYWluc3QuXG4gKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1lc3NhZ2UgdG8gdGhyb3cuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmFpbHVyZU1lc3NhZ2UoXG4gIHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsXG4gIGJhc2VsaW5lU25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QsXG4gIHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWFnbm9zdGljc0RpcmVjdG9yeSA9IHBhcmFtcy5kaWFnbm9zdGljc0RpcmVjdG9yeSA/PyBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWTtcbiAgbWtkaXJTeW5jKGRpYWdub3N0aWNzRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGpvaW4oZGlhZ25vc3RpY3NEaXJlY3RvcnksICdrZXlib2FyZC1ub3QtcmFpc2VkLnBuZycpO1xuICB3cml0ZUZpbGVTeW5jKHNjcmVlbnNob3RQYXRoLCBhd2FpdCBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQgfSkpO1xuXG4gIHJldHVybiBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlKHtcbiAgICBiYXNlbGluZVNuYXBzaG90LFxuICAgIGlucHV0TWV0aG9kU3RhdGU6IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyksXG4gICAgc2NyZWVuc2hvdFBhdGgsXG4gICAgc25hcHNob3RcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhbnl0aGluZyBpbiB0aGUgcGFnZSBtYXRjaGVzIHRoZSBmaWVsZCdzIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgaXQgbWF0Y2hlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpICE9PSBudWxsO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGZpZWxkIHRoZSB0b3VjaCBpcyBhYm91dCB0byBsYW5kIG9uLCBhbmQgcmVwb3J0cyB3aGF0IHRvIHdyaXRlIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBlbXB0eSwgYW5kIHdoZXRoZXIgdG8gZW1wdHkgaXQgYXQgYWxsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCB0byByZXN0b3JlLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdhcyBlbXB0aWVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgaG9sZHMgdGV4dCB0aGF0IGNhbm5vdCBiZSB3cml0dGVuIGJhY2sgXHUyMDE0IGEgYGNvbnRlbnRlZGl0YWJsZWAsIHdob3NlIGNvbnRlbnRcbiAqICAgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBpZiAocGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG5cbiAgLy8gTm90aGluZyBtYXRjaGVkLiBUaGUgZ2VvbWV0cnkgcmVhZCBkb2VzIHRoZSByZXBvcnRpbmcsIHdpdGggdGhlIG1lc3NhZ2UgaXQgYWx3YXlzIGhhZC5cbiAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY29udGVudC5jYW5Xcml0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGhvbGRzIHRleHQgYnV0IGlzIG5vdCBhbiA8aW5wdXQ+IG9yIGEgPHRleHRhcmVhPiwgc28gaXQgYFxuICAgICAgICArICdjYW5ub3QgYmUgZW1wdGllZCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2suIFRoZSB0b3VjaCB3b3VsZCBsYW5kIGluc2lkZSB0ZXh0IGFuZCBkcmF3IGEgJ1xuICAgICAgICArICdzZWxlY3Rpb24gaGFuZGxlLCB3aGljaCBhIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzLiBFbXB0eSB0aGUgZmllbGQgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcsIG9yICdcbiAgICAgICAgKyAncGFzcyBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2g6IGZhbHNlIHRvIHRvdWNoIGl0IGFzIGl0IHN0YW5kcy4nXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgJycpO1xuXG4gIHJldHVybiBjb250ZW50LnRleHQ7XG59XG5cbi8qKlxuICogSG9sZHMgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHdpdGhvdXQgZXZlciB0aHJvd2luZyBcdTIwMTQgdGhlIHJlc3RvcmUgb24gYSByYWlzZSB0aGF0IGFscmVhZHkgZmFpbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgaXQgbXVzdCBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBob2xkIGhhcyBydW4sIHdoYXRldmVyIGl0IGZvdW5kLlxuICovXG5hc3luYyBmdW5jdGlvbiBob2xkRmllbGRUZXh0QmVzdEVmZm9ydChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBob2xkVGV4dEluRmllbGQocGFyYW1zLCB0ZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIHJhaXNlJ3Mgb3duIGZhaWx1cmUgaXMgd2hhdCB0aGUgY2FsbGVyIG5lZWRzIHRvIHNlZTsgYSBmaWVsZCB0aGF0IGlzIGdvbmUgYXMgd2VsbCBhZGRzIG5vdGhpbmcgdG8gaXQuXG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIHRleHQgaW50byB0aGUgZmllbGQgYW5kIGhvbGRzIGl0IHRoZXJlLCBwZXIge0BsaW5rIGhvbGRGaWVsZFRleHR9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgaXQgbXVzdCBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGF0IHRoZSBob2xkIGZvdW5kLlxuICovXG5hc3luYyBmdW5jdGlvbiBob2xkVGV4dEluRmllbGQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTxIb2xkRmllbGRUZXh0UmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBob2xkRmllbGRUZXh0KHtcbiAgICBleHBlY3RlZFRleHQ6IHRleHQsXG4gICAgYXN5bmMgcmVhZFRleHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpZWxkQ29udGVudChwYXJhbXMpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQ/LnRleHQgPz8gbnVsbDtcbiAgICB9LFxuICAgIHNsZWVwLFxuICAgIGFzeW5jIHdyaXRlVGV4dCh2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB3cml0ZUZpZWxkVGV4dChwYXJhbXMsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFB1dHMgdGhlIGtleWJvYXJkIGRvd24gd2hlbiB0aGUgZGV2aWNlIHJlcG9ydHMgb25lIHNob3dpbmcsIHNvIHRoZSBiYXNlbGluZSByZWFkIG5leHQgaXMgb25lIHRoZSB0b3VjaFxuICogY2FuIGxpZnQgdGhlIGZpZWxkIGZyb20uXG4gKlxuICogKipBIGtleWJvYXJkIGlzIHByZXNzZWQgYXQgb25seSBvbmNlIGl0IGhhcyBiZWVuIHJlcG9ydGVkIHNob3dpbmcgVFdJQ0UsIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBhcGFydC4qKlxuICogYEtFWUNPREVfQkFDS2AgaXMgcmV0cmFjdGVkIGJ5IHRoZSBJTUUgb25seSB3aGlsZSB0aGUgSU1FIGlzIHVwOyBvbmNlIGl0IGhhcyBnb25lLCB0aGUga2V5IHJlYWNoZXMgdGhlXG4gKiBhcHAsIGFuZCBPYnNpZGlhbiBjbG9zZXMgdGhlIG1vZGFsIG9uIHNjcmVlbiBcdTIwMTQgdGhlIG9uZSB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIHBob3RvZ3JhcGguIEEga2V5Ym9hcmRcbiAqIGFscmVhZHkgb24gaXRzIHdheSBkb3duICh0aGUgbW9kYWwgdGhhdCByYWlzZWQgaXQgaGFzIGp1c3QgY2xvc2VkLCBhbmQgdGhlIGNhbGxlciBvcGVuZWQgYSBmcmVzaCBvbmVcbiAqIHN0cmFpZ2h0IGFmdGVyKSBpcyBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGF0IHRoZSBzdGFydCBvZiBpdHMgcmV0cmFjdCwgc28gcHJlc3NpbmcgYXQgdGhlIGZpcnN0IHJlYWRcbiAqIHJhY2VkIGl0LiBJdCBpcyB3YXRjaGVkIGZvciBvbmUgcmV0cmFjdCBhbmltYXRpb24gZmlyc3QsIGFuZCBhIGtleWJvYXJkIHRoYXQgd2VudCBkb3duIG9uIGl0cyBvd24gaXNcbiAqIGxlZnQgYWxvbmUuXG4gKlxuICogKipBbmQgYSBwcmVzcyB0aGF0IHJlYWNoZWQgdGhlIGFwcCBhbnl3YXkgaXMgbmFtZWQgYXMgdGhhdC4qKiBUaGUgZmllbGQgaXMgbG9va2VkIHVwIGJlZm9yZSB0aGUgcHJlc3NcbiAqIGFuZCBhZnRlciBpdDsgb25lIHRoYXQgbWF0Y2hlZCBiZWZvcmUgYW5kIG5vdCBhZnRlciB3YXMgY2xvc2VkIGJ5IHRoZSBrZXksIGFuZCBzYXlpbmcgc28gYmVhdHMgdGhlXG4gKiBgbm90aGluZyBtYXRjaGVzYCB0aGF0IHRoZSByYWlzZSB3b3VsZCBvdGhlcndpc2UgcmVwb3J0IGEgc3RlcCBsYXRlciwgYWJvdXQgYSBzZWxlY3RvciB0aGF0IHdhcyByaWdodC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSB0byBhc2ssIGFuZCB0aGUgZmllbGQgdGhhdCBtdXN0IHN1cnZpdmUgdGhlIHByZXNzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIG5vIGtleWJvYXJkIGlzIHNob3dpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEga2V5Ym9hcmQgaXMgc3RpbGwgc2hvd2luZyBhZnRlciB7QGxpbmsgS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UfSBwcmVzc2VzIG9mXG4gKiAgIGBLRVlDT0RFX0JBQ0tgIFx1MjAxNCB0aGUgcmFpc2UgdGhhdCBmb2xsb3dzIGNvdWxkIHByb3ZlIG5vdGhpbmcsIGFuZCBpdHMgb3duIGZhaWx1cmUgd291bGQgYmxhbWUgYSBrZXlib2FyZFxuICogICB0aGF0IG5ldmVyIGNhbWUgd2hlbiB0aGUgdHJ1dGggaXMgb25lIHRoYXQgbmV2ZXIgbGVmdCBcdTIwMTQgb3IgaWYgYSBwcmVzcyBjbG9zZWQgdGhlIGZpZWxkJ3Mgb3duIFVJLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb3dlclNvZnRLZXlib2FyZElmU2hvd24ocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgaW5wdXRNZXRob2RTdGF0ZSA9IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgIGlmICghY2hlY2tJc0lucHV0TWV0aG9kU2hvd24oaW5wdXRNZXRob2RTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBzbGVlcChLRVlCT0FSRF9TSE9XTl9DT05GSVJNQVRJT05fREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICAgIGlmICghY2hlY2tJc0lucHV0TWV0aG9kU2hvd24oaW5wdXRNZXRob2RTdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzID0gYXdhaXQgY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXMpO1xuICAgIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsICdLRVlDT0RFX0JBQ0snXSxcbiAgICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgICB9KTtcbiAgICBhd2FpdCBzbGVlcChLRVlCT0FSRF9SRVRSQUNUX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBpZiAoaXNGaWVsZFByZXNlbnRCZWZvcmVQcmVzcyAmJiAhYXdhaXQgY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdyYWlzZVNvZnRLZXlib2FyZDogS0VZQ09ERV9CQUNLLCBwcmVzc2VkIHRvIHB1dCBkb3duIGEga2V5Ym9hcmQgdGhlIGRldmljZSByZXBvcnRlZCBzaG93aW5nLCByZWFjaGVkIHRoZSBhcHAgaW5zdGVhZCBhbmQgJ1xuICAgICAgICAgICsgYGNsb3NlZCB0aGUgVUkgaG9sZGluZyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgXHUyMDE0IGl0IG1hdGNoZWQgYmVmb3JlIHRoZSBwcmVzcyBhbmQgbWF0Y2hlcyBub3RoaW5nIGFmdGVyIGl0LiBUaGUgYFxuICAgICAgICAgICsgJ2tleWJvYXJkIHdlbnQgZG93biBiZXR3ZWVuIHRoZSBsYXN0IHJlYWQgYW5kIHRoZSBwcmVzcy4gTGV0IHRoZSBwcmV2aW91cyBrZXlib2FyZCBzZXR0bGUgYmVmb3JlIG9wZW5pbmcgdGhlIFVJICdcbiAgICAgICAgICArIGB0byByYWlzZSBpdCBvbi5cbmRldmljZSBiZWZvcmUgdGhlIHByZXNzOiAke2lucHV0TWV0aG9kU3RhdGV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcbiAgfVxuXG4gIGlmIChjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogYSBrZXlib2FyZCB3YXMgYWxyZWFkeSB1cCBhbmQgZGlkIG5vdCBnbyBkb3duIGFmdGVyICR7U3RyaW5nKEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCl9IHByZXNzZXMgb2YgYFxuICAgICAgICArICdLRVlDT0RFX0JBQ0ssIHNvIHRoZSBsaWZ0IHRoYXQgcHJvdmVzIGEgcmFpc2UgY291bGQgbm90IGJlIG1lYXN1cmVkLiBUaGUgZmllbGQgd291bGQgcmVhZCBhcyBvbmUgdGhhdCBuZXZlciAnXG4gICAgICAgICsgYG1vdmVkIHVuZGVyIGEga2V5Ym9hcmQgdGhhdCBpcyBwbGFpbmx5IHNob3dpbmcuXG5kZXZpY2U6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHdoYXQgdGhlIGZpZWxkIGhvbGRzLCBhbmQgd2hldGhlciBpdCBpcyBvbmUgd2hvc2UgdmFsdWUgY2FuIGJlIHdyaXR0ZW4gYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50LCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkRmllbGRDb250ZW50KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPEZpZWxkQ29udGVudCB8IG51bGw+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IEZpZWxkQ29udGVudCB8IG51bGwge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuV3JpdGUgPSBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudDtcblxuICAgICAgcmV0dXJuIHsgY2FuV3JpdGUsIHRleHQ6IGNhbldyaXRlID8gZWxlbWVudC52YWx1ZSA6IGVsZW1lbnQudGV4dENvbnRlbnQgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBBc2tzIHRoZSBkZXZpY2Ugd2hhdCBpdHMgSU1FIGlzIGRvaW5nIFx1MjAxNCB0aGUgb25seSBwbGFjZSB0aGF0IGtub3dzLCBzaW5jZSBub3RoaW5nIGluIHRoZSBwYWdlIHJlcG9ydHMgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgdG8gYXNrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmllbGRzIHtAbGluayBwYXJzZUlucHV0TWV0aG9kU3RhdGV9IGtlZXBzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZHVtcHN5c091dHB1dCA9IGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IFsnc2hlbGwnLCAnZHVtcHN5cycsICdpbnB1dF9tZXRob2QnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZUlucHV0TWV0aG9kU3RhdGUoZHVtcHN5c091dHB1dCk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgcmVuZGVyZXIga25vd3MgYWJvdXQgaXRzIG93biBnZW9tZXRyeS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIG1lYXN1cmUgYW5kIHRoZSB2YXVsdCB0byByZWFkIGl0IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2aWV3cG9ydCBhbmQgdGhlIGZpZWxkJ3MgcmVjdCwgaW4gQ1NTIHBpeGVscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Qge1xuICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBUaGlzIGNsb3N1cmUgaXMgc2VyaWFsaXplZCBhbmQgZXZhbHVhdGVkIGluIHRoZSByZW5kZXJlciwgc28gYSBoZWxwZXIgaG9pc3RlZCB0byBtb2R1bGUgc2NvcGUgd291bGQgbm90IGV4aXN0IHRoZXJlLlxuICAgICAgZnVuY3Rpb24gdG9SZWN0KHJlY3Q6IERPTVJlY3QpOiBFbGVtZW50UmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiByZWN0LnRvcCxcbiAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgaW5uZXJIZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgaW5wdXRSZWN0OiBpbnB1dEVsID8gdG9SZWN0KGlucHV0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIDogbnVsbCxcbiAgICAgICAgc2NyZWVuWTogd2luZG93LnNjcmVlbllcbiAgICAgIH07XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBlbXB0aWVkIGZpZWxkJ3MgdGV4dCBiYWNrLCBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0IGhhcyBzdGF5ZWQgdGhlcmUuXG4gKlxuICogKipXcml0aW5nIGl0IG9uY2UgaXMgbm90IGVub3VnaC4qKiBUaGUgdG91Y2ggdGhhdCByYWlzZWQgdGhlIGtleWJvYXJkIGxhbmRlZCBvbiB0aGUgRU1QVFkgZmllbGQsIHNvIHRoZVxuICogSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb20gYW4gZW1wdHkgZmllbGQsIGFuZCBhYm91dCBvbmUgdGltZSBpbiBmaXZlIGEgbGF0ZXIgdXBkYXRlIGZyb20gaXQgd3JvdGVcbiAqIHRoYXQgZW1wdHkgc3RhdGUgYmFjayBvdmVyIHRoaXMgd3JpdGUgKG1lYXN1cmVkIDIwMjYtMDktMjUgaW4gYG9ic2lkaWFuLWFsaWFzLXF1aWNrLXN3aXRjaGVyYCdzIGNhcHR1cmVcbiAqIHN1aXRlOiAyIG9mIDEwIGZyYW1lcyBzaG93ZWQgdGhlIHBsYWNlaG9sZGVyLCB3aGlsZSB0aGUgR2JvYXJkIHN0cmlwIHN0aWxsIG9mZmVyZWQgdGhlIHdvcmQgdGhhdCBoYWQgYmVlblxuICogd3JpdHRlbikuIFRoZSBjYXB0dXJlIHRha2VuIHN0cmFpZ2h0IGFmdGVyIHBob3RvZ3JhcGhlZCB0aGUgZW1wdHkgZmllbGQsIGFuZCBub3RoaW5nIHNhaWQgc28uIFNvIHRoZSBmaWVsZCBpc1xuICogcmUtcmVhZCB1bnRpbCBzZXZlcmFsIHJlYWRzIGFncmVlLCBhbmQgd3JpdHRlbiBhZ2FpbiB3aGVuZXZlciBvbmUgZG9lcyBub3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZSwgYW5kIHRoZSBkZXZpY2UgdG8gYXNrIGFib3V0IGl0cyBJTUUgd2hlbiB0aGUgdGV4dCB3aWxsIG5vdCBob2xkLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRoZSBmaWVsZCBoZWxkIGJlZm9yZSBpdCB3YXMgZW1wdGllZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdGV4dCBoYXMgaGVsZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRleHQgZGlkIG5vdCBob2xkIGFmdGVyIGV2ZXJ5IHJld3JpdGUsIG9yIHRoZSBmaWVsZCB3ZW50IGF3YXkgXHUyMDE0IG5hbWluZyBldmVyeSByZWFkIGFuZFxuICogICB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHJhdGhlciB0aGFuIHJldHVybmluZyB3aXRoIHRoZSBmaWVsZCBzaWxlbnRseSBlbXB0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaG9sZFRleHRJbkZpZWxkKHBhcmFtcywgdGV4dCk7XG5cbiAgaWYgKHJlc3VsdC53cml0ZUNvdW50ID4gMSkge1xuICAgIGxvZyhcbiAgICAgIGBbc29mdC1rZXlib2FyZF0gVGhlIHRleHQgd3JpdHRlbiBiYWNrIGludG8gXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIHdhcyBsb3N0ICR7U3RyaW5nKHJlc3VsdC53cml0ZUNvdW50IC0gMSl9IHRpbWUocykgYFxuICAgICAgICArIGBhbmQgd3JpdHRlbiBhZ2FpbjsgcmVhZHM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LnJlYWRUZXh0cyl9LmBcbiAgICApO1xuICB9XG5cbiAgaWYgKCFyZXN1bHQuaXNIZWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgaW50byBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgYWZ0ZXIgdGhlIHRvdWNoIGRpZCBub3Qgc3RheSB0aGVyZS4gYFxuICAgICAgICArIGBFeHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KHRleHQpfTsgJHtTdHJpbmcocmVzdWx0LndyaXRlQ291bnQpfSB3cml0ZShzKSwgYW5kIHRoZSBmaWVsZCByZWFkIGBcbiAgICAgICAgKyBgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQucmVhZFRleHRzKX0uIEEgY2FwdHVyZSB0YWtlbiBub3cgd291bGQgc2hvdyB0aGUgZmllbGQgd2l0aG91dCBpdHMgdGV4dC5cbmRldmljZTogJHthd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZmllbGQgdW50aWwgdGhlIGtleWJvYXJkIGlzIHVwLCBhbmQgc2F5cyBzbyB3aGVuIGl0IG5ldmVyIGNhbWUuXG4gKlxuICogVGhlIGJhc2VsaW5lIGlzIHJlYWQgaGVyZSByYXRoZXIgdGhhbiBieSB0aGUgY2FsbGVyLCBzbyBpdCBpcyByZWFkIHdpdGggdGhlIGZpZWxkIGluIHRoZSBzdGF0ZSB0aGVcbiAqIHRhcHMgYXJlIGRpc3BhdGNoZWQgYWdhaW5zdCBcdTIwMTQgc2VlIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0gZm9yIHdoeSB0aGUgdHdvIGhhdmUgdG8gbWF0Y2guXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIG9yIGlmIGl0IG5ldmVyIGxpZnRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFwVW50aWxLZXlib2FyZElzVXAocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICBjb25zdCBiYXNlbGluZVNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIGxldCBzbmFwc2hvdCA9IGJhc2VsaW5lU25hcHNob3Q7XG5cbiAgaWYgKCFzbmFwc2hvdC5pbnB1dFJlY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhaXNlU29mdEtleWJvYXJkOiBub3RoaW5nIG1hdGNoZXMgXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiLCBzbyB0aGVyZSBpcyBubyBmaWVsZCB0byB0b3VjaC5gKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcG9pbnQgb2YgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50cyh7IHNuYXBzaG90IH0pKSB7XG4gICAgaWYgKGNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IHRhcERldmljZSh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsIHBvaW50IH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIH1cblxuICBpZiAoIWNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgYnVpbGRGYWlsdXJlTWVzc2FnZShwYXJhbXMsIGJhc2VsaW5lU25hcHNob3QsIHNuYXBzaG90KSk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG5cbiAgZnVuY3Rpb24gY2hlY2tJc1VwKGN1cnJlbnQ6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hlY2tJc1NvZnRLZXlib2FyZFVwKHtcbiAgICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgICAuLi4ocGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzICE9PSB1bmRlZmluZWQgJiYgeyBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsczogcGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzIH0pLFxuICAgICAgc25hcHNob3Q6IGN1cnJlbnRcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBhIGZpZWxkJ3MgdmFsdWUgYW5kIHRlbGxzIHRoZSBwYWdlIGl0IGNoYW5nZWQuXG4gKlxuICogVGhlIGBpbnB1dGAgZXZlbnQgaXMgd2hhdCBhIHNjcmlwdGVkIHdyaXRlIG93ZXMgdGhlIHBhZ2U6IHdpdGhvdXQgaXQgYSBzdWdnZXN0ZXIga2VlcHMgdGhlIHJvd3MgaXQgaGFkXG4gKiBmb3IgdGhlIHRleHQgdGhhdCBpcyBubyBsb25nZXIgdGhlcmUuIEl0IGJ1YmJsZXMsIGJlY2F1c2UgdGhhdCBpcyBob3cgYSBmcmFtZXdvcmsgbGlzdGVuaW5nIG9uIGFcbiAqIGNvbnRhaW5lciBoZWFycyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIHdyaXRlLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRvIHdyaXRlIGludG8gaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHdyaXRlIGhhcyBiZWVuIG1hZGUuXG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0aGUgZmllbGQgaXMgbm90IG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWVsZFRleHQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IsIHRleHQ6IHZhbHVlIH0pOiB2b2lkIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IFwiJHtpbnB1dFNlbGVjdG9yfVwiIGlzIG5vdCBhIGZpZWxkIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLmApO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciwgdGV4dCB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUE0REE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBQ3BCLFNBQVMsY0FBYyxhQUFhO0FBU3BDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsV0FBVztBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQTJFUCxNQUFNLGdDQUFn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
283
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqICAgICoqQW5kIHRoZSB0ZXh0IHdyaXR0ZW4gYmFjayBoYXMgdG8gYmUgSEVMRCwgbm90IGp1c3Qgd3JpdHRlbi4qKiBUaGUgSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb21cbiAqICAgIHRoZSBlbXB0aWVkIGZpZWxkLCBhbmQgYWJvdXQgb25lIHRpbWUgaW4gZml2ZSBpdCB3cm90ZSB0aGF0IGVtcHR5IHN0YXRlIGJhY2sgb3ZlciB0aGUgaGFybmVzcydzIHdyaXRlLFxuICogICAgc28gdGhlIGNhcHR1cmUgc3RyYWlnaHQgYWZ0ZXIgc2hvd2VkIHRoZSBwbGFjZWhvbGRlci4gVGhlIGZpZWxkIGlzIHJlLXJlYWQgdW50aWwgaXQgaG9sZHMsIGFuZCB3cml0dGVuXG4gKiAgICBhZ2FpbiB3aGVuIGl0IGRvZXMgbm90LlxuICpcbiAqIDUuICoqR2JvYXJkJ3Mgc3VnZ2VzdGlvbiBzdHJpcCBpcyBhIHNlY29uZCByYWNlLCBhbmQgcGFya2luZyB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgZW5kcyBpdC4qKiBXaXRoIHRoZVxuICogICAga2V5Ym9hcmQgdXAsIEdib2FyZCBkcmF3cyBlaXRoZXIgaXRzIHRvb2xiYXIgKGFwcHMsIHN0aWNrZXJzLCBHSUYsIGNsaXBib2FyZCwgc2V0dGluZ3MsIHRoZW1lLCBtaWMpIG9yIHdvcmRcbiAqICAgIHByZWRpY3Rpb25zIGZvciB0aGUgdGV4dCBiZWZvcmUgdGhlIGNhcmV0LiBUaGUgdG91Y2ggbGFuZGVkIG9uIHRoZSBlbXB0aWVkIGZpZWxkLCB3aGljaCBnZXRzIHRoZSB0b29sYmFyLFxuICogICAgYW5kIHRoZSB3cml0ZS1iYWNrIHB1dHMgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgdGhlIHRleHQsIHdoaWNoIGdldHMgcHJlZGljdGlvbnMgXHUyMDE0IG9uY2UgR2JvYXJkIGhlYXJzIGFib3V0XG4gKiAgICBpdCwgd2hpY2ggaXMgYSBtYXR0ZXIgb2YgdGltaW5nLiBUaGUgcHJlZGljdGlvbnMgdGhlbXNlbHZlcyBjb21lIGZyb20gdGhlIGtleWJvYXJkJ3MgbGVhcm5lZCBkaWN0aW9uYXJ5XG4gKiAgICBhbmQgZGlmZmVyIGJldHdlZW4gcnVucy4gU28gYSBjYXB0dXJlIHNob3dlZCBvbmUgb2YgdHdvIHN0cmlwcywgYW5kIHR3byBkaWZmZXJlbnQgc2V0cyBvZiBwcmVkaWN0aW9uc1xuICogICAgd2hlbiBpdCBzaG93ZWQgdGhlIHNlY29uZC4gU3VnZ2VzdGlvbnMgY2Fubm90IGJlIHN3aXRjaGVkIG9mZiBmcm9tIHRoZSBwYWdlOiBPYnNpZGlhbidzIGAucHJvbXB0LWlucHV0YFxuICogICAgYWxyZWFkeSBjYXJyaWVzIGBzcGVsbGNoZWNrPVwiZmFsc2VcImAsIGFuZCB0aGUgSU1FIGFscmVhZHkgcmVjZWl2ZXMgYFRZUEVfVEVYVF9GTEFHX05PX1NVR0dFU1RJT05TYFxuICogICAgKGBpbnB1dFR5cGU9MHgyMDgwYTFgKS4gR2JvYXJkIHN0aWxsIHByZWRpY3RzIChtZWFzdXJlZCAyMDI2LTA5LTI1KS4gV2l0aCB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgdGhlcmUgaXNcbiAqICAgIG5vIHRleHQgYmVmb3JlIGl0LCB3aGljaCBpcyB0aGUgZW1wdHktZmllbGQgc3RhdGUsIHNvIHdoaWNoZXZlciB3YXkgdGhlIHJhY2UgZ29lcywgdGhlIHN0cmlwIGlzIHRoZVxuICogICAgdG9vbGJhci4gU2VlIGBzaG91bGRQaW5LZXlib2FyZFRvb2xiYXJgLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBIb2xkRmllbGRUZXh0UmVzdWx0IH0gZnJvbSAnLi9maWVsZC10ZXh0LWhvbGQubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgRWxlbWVudFJlY3QsXG4gIFNvZnRLZXlib2FyZFRhcFBvaW50LFxuICBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5tanMnO1xuXG5pbXBvcnQgeyBydW5BZGJUZXh0IH0gZnJvbSAnLi9hZGIubWpzJztcbmltcG9ydCB7IGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90IH0gZnJvbSAnLi9kZXZpY2Utc2NyZWVuc2hvdC5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IGhvbGRGaWVsZFRleHQgfSBmcm9tICcuL2ZpZWxkLXRleHQtaG9sZC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2UsXG4gIGNoZWNrSXNJbnB1dE1ldGhvZFNob3duLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIHBhcnNlSW5wdXRNZXRob2RTdGF0ZSxcbiAgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1xufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmFpc2VTb2Z0S2V5Ym9hcmR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IHdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGl0IGlzIGBkaXN0L3NjcmVlbnNob3RzYCB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgXHUyMDE0IHJlc29sdmVkIGF0IGxvYWQsIHNvIHRoZXJlIGlzIG5vXG4gICAqIGxpdGVyYWwgZGVmYXVsdCB0byBzdGF0ZSBoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1Mgc2VsZWN0b3Igb2YgdGhlIGZpZWxkIHRvIHRvdWNoLCBlLmcuIGAucHJvbXB0LWlucHV0YC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0U2VsZWN0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieS5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFNgIGZyb20gYHNvZnQta2V5Ym9hcmQtZ2VvbWV0cnlgIGFwcGxpZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbXB0eSB0aGUgZmllbGQgYmVmb3JlIHRoZSB0b3VjaCwgYW5kIHdyaXRlIGl0cyB0ZXh0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAgICpcbiAgICogKipPbiBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZSB0b3VjaCB0aGF0IHJhaXNlcyB0aGUga2V5Ym9hcmQgYWxzbyBkcmF3cyBhIHNlbGVjdGlvbiBoYW5kbGUgd2hlbiBpdFxuICAgKiBsYW5kcyBpbnNpZGUgVEVYVC4qKiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcCBpbnRvIHRleHQgYW5kIGRyYXdzIG5vbmUgb24gYSB0YXBcbiAgICogaW50byBhbiBFTVBUWSBlZGl0YWJsZSwgYW5kIGEgZGV2aWNlIGNhcHR1cmUgcGhvdG9ncmFwaHMgaXQgXHUyMDE0IHdoaWNoIGlzIGhvdyBgb2JzaWRpYW4tbGluay1waWNrZXJgXG4gICAqIHNoaXBwZWQgYSB0ZWFsIGhhbmRsZSBpbiBhIHN0b3JlIGxpc3RpbmcgaW1hZ2UgdHdpY2UgYmVmb3JlIGFueW9uZSB1bmRlcnN0b29kIHdoZXJlIGl0IGNhbWUgZnJvbS4gQVxuICAgKiB2YWx1ZSB3cml0dGVuIGJ5IHNjcmlwdCByYWlzZXMgbm8gaGFuZGxlLCBzbyBlbXB0eWluZyB0aGUgZmllbGQsIHRvdWNoaW5nIGl0LCBhbmQgd3JpdGluZyB0aGUgdGV4dFxuICAgKiBiYWNrIGxlYXZlcyB0aGUgZnJhbWUgc2hvd2luZyB0aGUgc2FtZSBxdWVyeSB3aXRoIG5vdGhpbmcgaGFuZ2luZyBvZmYgaXQuXG4gICAqXG4gICAqIE9ubHkgYW4gYDxpbnB1dD5gIG9yIGEgYDx0ZXh0YXJlYT5gIGlzIGVtcHRpZWQuIEEgYGNvbnRlbnRlZGl0YWJsZWAgaG9sZGluZyB0ZXh0IGlzIFJFRlVTRUQgcmF0aGVyXG4gICAqIHRoYW4gd3JpdHRlbiB0bzogaXRzIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00sIGFuZCBibGFua2luZyB0aGF0XG4gICAqIGJ5IGhhbmQgZGVzdHJveXMgaXQuIEVtcHR5IHN1Y2ggYSBmaWVsZCB5b3Vyc2VsZiwgb3IgdHVybiB0aGlzIG9mZi5cbiAgICpcbiAgICogVHVybmluZyBpdCBvZmYgcmVzdG9yZXMgdGhlIHByZS0yMDI2LTA5LTIzIGJlaGF2aW91ciBleGFjdGx5OiB0aGUgZmllbGQgaXMgdG91Y2hlZCBhcyBpdCBzdGFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVtcHR5RmllbGRGb3JUb3VjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyayB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAsIHNvIEdib2FyZCdzIHN1Z2dlc3Rpb24gc3RyaXAgc2hvd3MgaXRzXG4gICAqIHRvb2xiYXIgcmF0aGVyIHRoYW4gd29yZCBwcmVkaWN0aW9ucy5cbiAgICpcbiAgICogKipPbiBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZSBzdHJpcCBpcyBvdGhlcndpc2UgYSByYWNlIGJldHdlZW4gdHdvIHN0YXRlcywgYW5kIG9uZSBvZiB0aGVtIHZhcmllcy4qKlxuICAgKiBHYm9hcmQgc2hvd3MgaXRzIHRvb2xiYXIgd2hpbGUgbm90aGluZyBzaXRzIGJlZm9yZSB0aGUgY2FyZXQsIGFuZCBwcmVkaWN0aW9ucyBmb3IgdGhlIHdvcmQgYmVmb3JlIGl0XG4gICAqIG90aGVyd2lzZS4gVGhlIHRvdWNoIGxhbmRzIG9uIHRoZSBlbXB0aWVkIGZpZWxkICh0b29sYmFyKS4gVGhlIHdyaXRlLWJhY2sgbGVhdmVzIHRoZSBjYXJldCBhZnRlciB0aGUgdGV4dFxuICAgKiAocHJlZGljdGlvbnMpLCBidXQgb25seSBvbmNlIEdib2FyZCBoYXMgcHJvY2Vzc2VkIHRoYXQgdXBkYXRlLiBBbmQgdGhlIHByZWRpY3Rpb25zIGNvbWUgZnJvbSB0aGVcbiAgICoga2V5Ym9hcmQncyBsZWFybmVkIGRpY3Rpb25hcnksIHNvIHRoZXkgZGlmZmVyIGZyb20gb25lIHJ1biB0byB0aGUgbmV4dC4gV2l0aCB0aGUgY2FyZXQgYXQgb2Zmc2V0IDAgYm90aFxuICAgKiBvdXRjb21lcyBvZiB0aGUgcmFjZSBhcmUgdGhlIHRvb2xiYXI6IG1lYXN1cmVkIDIwMjYtMDktMjUsIHNpeCByYWlzZXMgd2l0aCB0aGUgY2FyZXQgcGFya2VkIGFsbCBnYXZlXG4gICAqIGJ5dGUtaWRlbnRpY2FsIHN0cmlwIHJvd3Mgc2hvd2luZyB0aGUgdG9vbGJhciwgd2hpbGUgdGhlIHNhbWUgZmllbGQgd2l0aCB0aGUgY2FyZXQgYXQgdGhlIGVuZCBzaG93ZWRcbiAgICogYG11bHRpcGxlYCAvIGBtdWx0aXBsZXNgIC8gYG11bHRpcGxleGAuXG4gICAqXG4gICAqIFR1cm5pbmcgc3VnZ2VzdGlvbnMgb2ZmIGRvZXMgbm90IGRvIHRoaXMuIE9ic2lkaWFuJ3MgcHJvbXB0IGlucHV0IGFscmVhZHkgaGFzIGBzcGVsbGNoZWNrPVwiZmFsc2VcImAsXG4gICAqIGFuZCB0aGUgSU1FIGFscmVhZHkgcmVjZWl2ZXMgYFRZUEVfVEVYVF9GTEFHX05PX1NVR0dFU1RJT05TYCwgeWV0IEdib2FyZCBzdGlsbCBwcmVkaWN0cy5cbiAgICpcbiAgICogT25seSBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAgaXMgcGFya2VkOyBhbnkgb3RoZXIgZmllbGQgaXMgbGVmdCBhcyBpdCBpcy4gVGhlIGNhcmV0IGlzIHZpc2libGUgYXRcbiAgICogb2Zmc2V0IDAgdW5sZXNzIHRoZSBjYXB0dXJlIGhpZGVzIGl0LCB3aGljaCBhIGRldmljZSBjYXB0dXJlIGhhcyB0byBhc2sgZm9yIHdpdGggYGhpZGVDYXJldGAuXG4gICAqXG4gICAqIFR1cm5pbmcgaXQgb2ZmIGxlYXZlcyB0aGUgY2FyZXQgd2hlcmUgdGhlIHdyaXRlLWJhY2sgb3IgdGhlIHRvdWNoIHB1dCBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUGluS2V5Ym9hcmRUb29sYmFyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHRvIHJlYWQgdGhlIGdlb21ldHJ5IGZyb20uIFdoZW4gb21pdHRlZCwgdGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGFwRGV2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBEZXZpY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHRvdWNoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnQ6IFNvZnRLZXlib2FyZFRhcFBvaW50O1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgbGVhdmVzIGl0cyBldmlkZW5jZSBcdTIwMTQgdW5kZXIgYGRpc3QvYCwgd2hpY2ggYSBwbHVnaW4gcmVwbyB1c2luZyB0aGlzIGhhcm5lc3MgZ2l0aWdub3JlcywgbGlrZSB0aGUgY2FwdHVyZSBzY3JhdGNoIGZpbGVzLlxuICovXG5jb25zdCBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWSA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Rpc3QnLCAnc2NyZWVuc2hvdHMnKTtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgaW4sIGFmdGVyIHdoaWNoIHRoZSBsYXlvdXQgaGFzIHNldHRsZWQuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxNTAwO1xuXG4vKipcbiAqIEhvdyBsb25nIHRoZSBJTUUgdGFrZXMgdG8gZmluaXNoIGFuaW1hdGluZyBvdXQgYWZ0ZXIgYEtFWUNPREVfQkFDS2AsIG1lYXN1cmVkIGluIHRoZSBjYXB0dXJlIHN1aXRlIHRoaXNcbiAqIHdhcyBtb3ZlZCBvdXQgb2YuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gOTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYmVmb3JlIGEga2V5Ym9hcmQgdGhhdCB3aWxsIG5vdCBnbyBkb3duIGlzIHJlcG9ydGVkLlxuICpcbiAqIFR3bywgYmVjYXVzZSB0aGUgZmlyc3QgcHJlc3MgY2FuIGxhbmQgd2hpbGUgdGhlIElNRSBpcyBzdGlsbCBhbmltYXRpbmcgVVAgZnJvbSB0aGUgZm9jdXMgdGhhdCByYWlzZWRcbiAqIGl0LCBhbmQgYW4gSU1FIG1pZC1hbmltYXRpb24gc3dhbGxvd3MgdGhlIGtleSB3aXRob3V0IHJldHJhY3RpbmcuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCA9IDI7XG5cbi8qKlxuICogSG93IGxvbmcgYSBrZXlib2FyZCByZXBvcnRlZCBzaG93aW5nIGlzIHdhdGNoZWQgYmVmb3JlIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYXQgaXQuXG4gKlxuICogT25lIHJldHJhY3QgYW5pbWF0aW9uOiBhbiBJTUUgYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gXHUyMDE0IHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQgXHUyMDE0IGlzXG4gKiBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGJ5IGEgcmVhZCB0YWtlbiBhdCB0aGUgc3RhcnQgb2YgaXRzIHJldHJhY3QsIGFuZCBpcyBnb25lIGJ5IHRoZSBlbmQgb2YgaXQuIFByZXNzaW5nXG4gKiBhdCB0aGUgZmlyc3QgcmVhZCB0aGVuIGxhbmRzIHRoZSBrZXkgb24gdGhlIGFwcCBpbnN0ZWFkLCB3aGljaCBjbG9zZXMgdGhlIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0b1xuICogcGhvdG9ncmFwaC4gVHdvIHJlYWRzIHRoYXQgYWdyZWUgYWNyb3NzIHRoaXMgd2luZG93IHNheSB0aGUga2V5Ym9hcmQgaXMgc3RheWluZyB1cC5cbiAqL1xuY29uc3QgS0VZQk9BUkRfU0hPV05fQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIHRoZSBjYXJldCBpcyBwYXJrZWQgYXQgb2Zmc2V0IDAgYmVmb3JlIGEgY2FyZXQgdGhhdCB3aWxsIG5vdCBzdGF5IHRoZXJlIGlzIHJlcG9ydGVkLlxuICovXG5jb25zdCBDQVJFVF9QQVJLX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4vKipcbiAqIEhvdyBsb25nIGEgcGFya2VkIGNhcmV0IGlzIGxlZnQgYmVmb3JlIGl0IGlzIHJlYWQgYmFjayBcdTIwMTQgbG9uZyBlbm91Z2ggZm9yIHRoZSBJTUUgdG8gYW5zd2VyIHRoZSBzZWxlY3Rpb25cbiAqIGNoYW5nZSwgd2hpY2ggaXMgd2hhdCB3b3VsZCBtb3ZlIGl0IGFnYWluLlxuICovXG5jb25zdCBDQVJFVF9QQVJLX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5cbi8qKlxuICogV2hhdCBhIGZpZWxkIGhvbGRzLCBhbmQgd2hldGhlciBpdCBpcyBvbmUgdGhpcyBjYW4gcHV0IGJhY2suXG4gKi9cbmludGVyZmFjZSBGaWVsZENvbnRlbnQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZmllbGQncyB2YWx1ZSBjYW4gYmUgd3JpdHRlbiBcdTIwMTQgdHJ1ZSBmb3IgYW4gYDxpbnB1dD5gIG9yIGEgYDx0ZXh0YXJlYT5gLCBmYWxzZSBmb3JcbiAgICogYW55dGhpbmcgZWxzZSwgd2hvc2UgY29udGVudCB1c3VhbGx5IGJlbG9uZ3MgdG8gYW4gZWRpdG9yIHRoYXQgb3ducyBpdHMgb3duIERPTS5cbiAgICovXG4gIHJlYWRvbmx5IGNhbldyaXRlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGUgZmllbGQgY3VycmVudGx5IGhvbGRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmllbGQncyBjYXJldCBpcywgYXMgdGhlIHNlbGVjdGlvbiBvZmZzZXRzIGFuIGA8aW5wdXQ+YCBvciBhIGA8dGV4dGFyZWE+YCByZXBvcnRzLlxuICovXG5pbnRlcmZhY2UgRmllbGRTZWxlY3Rpb24ge1xuICAvKipcbiAgICogV2hlcmUgdGhlIHNlbGVjdGlvbiBlbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0aW9uRW5kOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc2VsZWN0aW9uIHN0YXJ0cy5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0YXJ0OiBudWxsIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFJhaXNlcyB0aGUgb24tc2NyZWVuIGtleWJvYXJkIHdpdGggYSByZWFsIHRvdWNoIG9uIGEgZmllbGQsIGFuZCBjb25maXJtcyBpdCBjYW1lIHVwLlxuICpcbiAqIENhbGwgaXQgaW5zaWRlIGB3aXRoU29mdEtleWJvYXJkRW5hYmxlZGAgXHUyMDE0IHRoZSBkZXZpY2Ugc2V0dGluZyBhbG9uZSBkb2VzIG5vdCByYWlzZSB0aGUga2V5Ym9hcmQsIGFuZCB0aGlzXG4gKiB0b3VjaCBhbG9uZSBjYW5ub3Qgd2hpbGUgdGhlIHNldHRpbmcgc3VwcHJlc3NlcyBpdC5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgdGhhdCBpcyBhbHJlYWR5IHVwIGlzIHB1dCBET1dOIGZpcnN0LioqIFRoZSBmaXJzdCBnZW9tZXRyeSByZWFkIGlzIHRoZSBiYXNlbGluZSBldmVyeSBsYXRlclxuICogcmVhZCBpcyBjb21wYXJlZCBhZ2FpbnN0LCBzbyBhIGtleWJvYXJkIGFscmVhZHkgdXAgd291bGQgbGVhdmUgdGhlIGZpZWxkIG5vdGhpbmcgdG8gbGlmdCBieSBhbmQgcmVhZCBhc1xuICogb25lIHRoYXQgbmV2ZXIgY2FtZS4gVGhlIGRldmljZSBpcyBhc2tlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSwgYW5kIGEgc2hvd2luZyBJTUUgaXMgcmV0cmFjdGVkIHdpdGhcbiAqIGBLRVlDT0RFX0JBQ0tgIFx1MjAxNCBhc2tlZCBGSVJTVCBiZWNhdXNlLCB3aXRoIG5vIElNRSBzaG93aW5nLCB0aGF0IGtleSByZWFjaGVzIHRoZSBhcHAgYW5kIGNsb3NlcyB0aGUgdmVyeVxuICogbW9kYWwgdGhlIGZyYW1lIGlzIGFib3V0IHRvIHBob3RvZ3JhcGguIFNvIHRoZSBoZWxwZXIgaXMgc2FmZSB0byBjYWxsIG9uY2UgcGVyIGZyYW1lIG9mIGEgbXVsdGktZnJhbWVcbiAqIHN1aXRlLCBhbmQgZXZlcnkgY2FsbCBzdGlsbCBwcm92ZXMgaXRzIG93biBsaWZ0LiBUaGUgb3RoZXIgYW5zd2VyIFx1MjAxNCBhY2NlcHRpbmcgYSB6ZXJvIGxpZnQgd2hlbmV2ZXIgdGhlXG4gKiBkZXZpY2UgcmVwb3J0cyBhIGtleWJvYXJkIFx1MjAxNCB3YXMgcmVmdXNlZCwgYmVjYXVzZSBpdCBhY2NlcHRzIGEgZnJhbWUgdGhlIGhlbHBlciBkaWQgbm90IHByb3ZlLlxuICpcbiAqICoqVGhlIGZpZWxkIGlzIEVNUFRJRUQgZm9yIHRoZSB0b3VjaCBhbmQgd3JpdHRlbiBiYWNrIGFmdGVyd2FyZHMqKiwgYmVjYXVzZSBhIHRvdWNoIHRoYXQgbGFuZHMgaW5zaWRlXG4gKiB0ZXh0IGRyYXdzIENocm9taXVtJ3Mgc2VsZWN0aW9uIGhhbmRsZSBhbmQgdGhlIGZyYW1lYnVmZmVyIHBob3RvZ3JhcGhzIGl0IFx1MjAxNCBzZWVcbiAqIHtAbGluayBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcy5zaG91bGRFbXB0eUZpZWxkRm9yVG91Y2h9LCB3aGljaCB0dXJucyB0aGF0IG9mZi5cbiAqXG4gKiAqKlRoZSBjYXJldCBpcyB0aGVuIHBhcmtlZCBhdCBvZmZzZXQgMCoqLCBzbyBHYm9hcmQncyBzdWdnZXN0aW9uIHN0cmlwIGlzIGl0cyB0b29sYmFyIHJhdGhlciB0aGFuIHdvcmRcbiAqIHByZWRpY3Rpb25zIHRoYXQgcmFjZSB0aGUgd3JpdGUtYmFjayBhbmQgdmFyeSBiZXR3ZWVuIHJ1bnMgXHUyMDE0IHNlZVxuICoge0BsaW5rIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLnNob3VsZFBpbktleWJvYXJkVG9vbGJhcn0sIHdoaWNoIHR1cm5zIHRoYXQgb2ZmLlxuICpcbiAqICoqVGhlIGdlb21ldHJ5IHJldHVybmVkIGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgc3RpbGwgZW1wdHkqKiwgYW5kIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gYmFjayBhZnRlciBpdC5cbiAqIFRoYXQgaXMgdGhlIHN0YXRlIHRoZSBwcm92ZW4gY2FwdHVyZSBzdWl0ZXMgYXNzZXJ0IGFnYWluc3QsIGFuZCBpdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuXG4gKiBpbmNpZGVudGFsOiB0aGUgYmFzZWxpbmUgaXMgcmVhZCBBRlRFUiB0aGUgZmllbGQgaXMgZW1wdGllZCwgc28gdGhlIGxpZnQgaXMgbWVhc3VyZWQgYmV0d2VlbiB0d28gcmVhZHNcbiAqIG9mIHRoZSBzYW1lIGZpZWxkIGNvbnRlbnQuIEEgZmllbGQgd2hvc2Ugb3duIHRleHQgY2hhbmdlcyB0aGUgbGF5b3V0IGFyb3VuZCBpdCBcdTIwMTQgYSBzdWdnZXN0ZXIgd2hvc2Ugcm93XG4gKiBjb3VudCBhbnN3ZXJzIHRoZSBxdWVyeSBcdTIwMTQgbW92ZXMgd2hlbiBpdCBpcyBjbGVhcmVkLCBhbmQgYSBkZWx0YSBtZWFzdXJlZCBhY3Jvc3MgdGhhdCBtb3ZlIGlzIG5vdCBhXG4gKiBrZXlib2FyZC4gUmVhZCB0aGUgZ2VvbWV0cnkgYWdhaW4geW91cnNlbGYgaWYgdGhlIHJlc3RvcmVkIHRleHQgbW92ZXMgYW55dGhpbmcgeW91IGFyZSBhYm91dCB0byBhc3NlcnRcbiAqIG9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEga2V5Ym9hcmQgYWxyZWFkeSB1cCB3b3VsZCBub3QgZ28gZG93biwgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIGlmIGl0IGhvbGRzIHRleHRcbiAqICAgdGhpcyBjYW5ub3QgZW1wdHkgYW5kIHB1dCBiYWNrLCBpZiBpdCBuZXZlciBsaWZ0ZWQgXHUyMDE0IGFmdGVyIHdyaXRpbmcgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgdGhlXG4gKiAgIGRldmljZSdzIG93biBgaW5wdXRfbWV0aG9kYCBzdGF0ZSB0byB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IFx1MjAxNCBpZiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgd291bGQgbm90XG4gKiAgIHN0YXkgaW4gdGhlIGZpZWxkLCBvciBpZiB0aGUgY2FyZXQgd291bGQgbm90IHN0YXkgYXQgb2Zmc2V0IDAuIEEgd3JpdGUtYmFjayB0aGUgSU1FIHVuZG9lcyBpcyB3cml0dGVuXG4gKiAgIGFnYWluIHVudGlsIGl0IGhvbGRzOyBzZWUgYHJlc3RvcmVGaWVsZFRleHRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmFpc2VTb2Z0S2V5Ym9hcmQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICBhd2FpdCBsb3dlclNvZnRLZXlib2FyZElmU2hvd24ocGFyYW1zKTtcblxuICBjb25zdCB0ZXh0VG9SZXN0b3JlID0gYXdhaXQgZW1wdHlGaWVsZEZvclRvdWNoKHBhcmFtcyk7XG5cbiAgbGV0IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xuXG4gIHRyeSB7XG4gICAgc25hcHNob3QgPSBhd2FpdCB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFJlc3RvcmVkIGV2ZW4gd2hlbiB0aGUgcmFpc2UgZmFpbGVkOiBhIGNhbGxlciB0aGF0IGlzIGFib3V0IHRvIHJlYWQgaXRzIG93biBkaWFnbm9zdGljIHNob3VsZCBub3RcbiAgICAvLyBhbHNvIGhhdmUgdG8gZGlzY292ZXIgdGhhdCBpdHMgcXVlcnkgaXMgZ29uZS4gQmVzdC1lZmZvcnQsIHNvIHRoZSByYWlzZSdzIG93biBlcnJvciBpcyB0aGUgb25lIHRocm93bi5cbiAgICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgaG9sZEZpZWxkVGV4dEJlc3RFZmZvcnQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGlmICh0ZXh0VG9SZXN0b3JlICE9PSBudWxsKSB7XG4gICAgYXdhaXQgcmVzdG9yZUZpZWxkVGV4dChwYXJhbXMsIHRleHRUb1Jlc3RvcmUpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5zaG91bGRQaW5LZXlib2FyZFRvb2xiYXIgIT09IGZhbHNlKSB7XG4gICAgYXdhaXQgcGFya0NhcmV0QXRTdGFydChwYXJhbXMpO1xuICB9XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIFRvdWNoZXMgdGhlIGRldmljZSBhdCBhIHBvaW50LCB0aGUgd2F5IGEgdGh1bWIgd291bGQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHdoZXJlIHRvIHRvdWNoIGl0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB0b3VjaCBoYXMgYmVlbiBkaXNwYXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGFwRGV2aWNlKHBhcmFtczogVGFwRGV2aWNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IFsnc2hlbGwnLCAnaW5wdXQnLCAndGFwJywgU3RyaW5nKHBhcmFtcy5wb2ludC54SW5QaXhlbHMpLCBTdHJpbmcocGFyYW1zLnBvaW50LnlJblBpeGVscyldLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIgYW5kIHJlYWRzIHRoZSBkZXZpY2UncyBgaW5wdXRfbWV0aG9kYCBzdGF0ZSwgdGhlbiBjb21wb3NlcyB0aGUgZmFpbHVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgdGhlIGRpYWdub3N0aWNzIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBiYXNlbGluZVNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggdGhlIHZlcmRpY3QgaXMgbWVhc3VyZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSBzbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGFmdGVyIHRoZSBsYXN0IHRvdWNoLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbWVzc2FnZSB0byB0aHJvdy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRGYWlsdXJlTWVzc2FnZShcbiAgcGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyxcbiAgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCxcbiAgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpYWdub3N0aWNzRGlyZWN0b3J5ID0gcGFyYW1zLmRpYWdub3N0aWNzRGlyZWN0b3J5ID8/IERFRkFVTFRfRElBR05PU1RJQ1NfRElSRUNUT1JZO1xuICBta2RpclN5bmMoZGlhZ25vc3RpY3NEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHNjcmVlbnNob3RQYXRoID0gam9pbihkaWFnbm9zdGljc0RpcmVjdG9yeSwgJ2tleWJvYXJkLW5vdC1yYWlzZWQucG5nJyk7XG4gIHdyaXRlRmlsZVN5bmMoc2NyZWVuc2hvdFBhdGgsIGF3YWl0IGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90KHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCB9KSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgaW5wdXRNZXRob2RTdGF0ZTogYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKSxcbiAgICBzY3JlZW5zaG90UGF0aCxcbiAgICBzbmFwc2hvdFxuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFueXRoaW5nIGluIHRoZSBwYWdlIG1hdGNoZXMgdGhlIGZpZWxkJ3Mgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBsb29rIGZvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gd2hldGhlciBpdCBtYXRjaGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3RvcikgIT09IG51bGw7XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogRW1wdGllcyB0aGUgZmllbGQgdGhlIHRvdWNoIGlzIGFib3V0IHRvIGxhbmQgb24sIGFuZCByZXBvcnRzIHdoYXQgdG8gd3JpdGUgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIGVtcHR5LCBhbmQgd2hldGhlciB0byBlbXB0eSBpdCBhdCBhbGwuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB0ZXh0IHRvIHJlc3RvcmUsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgd2FzIGVtcHRpZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWVsZCBob2xkcyB0ZXh0IHRoYXQgY2Fubm90IGJlIHdyaXR0ZW4gYmFjayBcdTIwMTQgYSBgY29udGVudGVkaXRhYmxlYCwgd2hvc2UgY29udGVudFxuICogICBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtcHR5RmllbGRGb3JUb3VjaChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGlmIChwYXJhbXMuc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNoID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWVsZENvbnRlbnQocGFyYW1zKTtcblxuICAvLyBOb3RoaW5nIG1hdGNoZWQuIFRoZSBnZW9tZXRyeSByZWFkIGRvZXMgdGhlIHJlcG9ydGluZywgd2l0aCB0aGUgbWVzc2FnZSBpdCBhbHdheXMgaGFkLlxuICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50ZXh0ID09PSAnJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFjb250ZW50LmNhbldyaXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgaG9sZHMgdGV4dCBidXQgaXMgbm90IGFuIDxpbnB1dD4gb3IgYSA8dGV4dGFyZWE+LCBzbyBpdCBgXG4gICAgICAgICsgJ2Nhbm5vdCBiZSBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIHdyaXR0ZW4gYmFjay4gVGhlIHRvdWNoIHdvdWxkIGxhbmQgaW5zaWRlIHRleHQgYW5kIGRyYXcgYSAnXG4gICAgICAgICsgJ3NlbGVjdGlvbiBoYW5kbGUsIHdoaWNoIGEgZGV2aWNlIGNhcHR1cmUgcGhvdG9ncmFwaHMuIEVtcHR5IHRoZSBmaWVsZCB5b3Vyc2VsZiBiZWZvcmUgY2FsbGluZywgb3IgJ1xuICAgICAgICArICdwYXNzIHNob3VsZEVtcHR5RmllbGRGb3JUb3VjaDogZmFsc2UgdG8gdG91Y2ggaXQgYXMgaXQgc3RhbmRzLidcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVGaWVsZFRleHQocGFyYW1zLCAnJyk7XG5cbiAgcmV0dXJuIGNvbnRlbnQudGV4dDtcbn1cblxuLyoqXG4gKiBIb2xkcyB0aGUgdGV4dCBpbiB0aGUgZmllbGQgd2l0aG91dCBldmVyIHRocm93aW5nIFx1MjAxNCB0aGUgcmVzdG9yZSBvbiBhIHJhaXNlIHRoYXQgYWxyZWFkeSBmYWlsZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZS5cbiAqIEBwYXJhbSB0ZXh0IC0gV2hhdCBpdCBtdXN0IGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGhvbGQgaGFzIHJ1biwgd2hhdGV2ZXIgaXQgZm91bmQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhvbGRGaWVsZFRleHRCZXN0RWZmb3J0KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGhvbGRUZXh0SW5GaWVsZChwYXJhbXMsIHRleHQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUaGUgcmFpc2UncyBvd24gZmFpbHVyZSBpcyB3aGF0IHRoZSBjYWxsZXIgbmVlZHMgdG8gc2VlOyBhIGZpZWxkIHRoYXQgaXMgZ29uZSBhcyB3ZWxsIGFkZHMgbm90aGluZyB0byBpdC5cbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgdGV4dCBpbnRvIHRoZSBmaWVsZCBhbmQgaG9sZHMgaXQgdGhlcmUsIHBlciB7QGxpbmsgaG9sZEZpZWxkVGV4dH0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZS5cbiAqIEBwYXJhbSB0ZXh0IC0gV2hhdCBpdCBtdXN0IGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoYXQgdGhlIGhvbGQgZm91bmQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhvbGRUZXh0SW5GaWVsZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPEhvbGRGaWVsZFRleHRSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IGhvbGRGaWVsZFRleHQoe1xuICAgIGV4cGVjdGVkVGV4dDogdGV4dCxcbiAgICBhc3luYyByZWFkVGV4dCgpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG4gICAgICByZXR1cm4gY29udGVudD8udGV4dCA/PyBudWxsO1xuICAgIH0sXG4gICAgc2xlZXAsXG4gICAgYXN5bmMgd3JpdGVUZXh0KHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUHV0cyB0aGUga2V5Ym9hcmQgZG93biB3aGVuIHRoZSBkZXZpY2UgcmVwb3J0cyBvbmUgc2hvd2luZywgc28gdGhlIGJhc2VsaW5lIHJlYWQgbmV4dCBpcyBvbmUgdGhlIHRvdWNoXG4gKiBjYW4gbGlmdCB0aGUgZmllbGQgZnJvbS5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgaXMgcHJlc3NlZCBhdCBvbmx5IG9uY2UgaXQgaGFzIGJlZW4gcmVwb3J0ZWQgc2hvd2luZyBUV0lDRSwgb25lIHJldHJhY3QgYW5pbWF0aW9uIGFwYXJ0LioqXG4gKiBgS0VZQ09ERV9CQUNLYCBpcyByZXRyYWN0ZWQgYnkgdGhlIElNRSBvbmx5IHdoaWxlIHRoZSBJTUUgaXMgdXA7IG9uY2UgaXQgaGFzIGdvbmUsIHRoZSBrZXkgcmVhY2hlcyB0aGVcbiAqIGFwcCwgYW5kIE9ic2lkaWFuIGNsb3NlcyB0aGUgbW9kYWwgb24gc2NyZWVuIFx1MjAxNCB0aGUgb25lIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gQSBrZXlib2FyZFxuICogYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gKHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQsIGFuZCB0aGUgY2FsbGVyIG9wZW5lZCBhIGZyZXNoIG9uZVxuICogc3RyYWlnaHQgYWZ0ZXIpIGlzIHN0aWxsIHJlcG9ydGVkIHNob3dpbmcgYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBzbyBwcmVzc2luZyBhdCB0aGUgZmlyc3QgcmVhZFxuICogcmFjZWQgaXQuIEl0IGlzIHdhdGNoZWQgZm9yIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBmaXJzdCwgYW5kIGEga2V5Ym9hcmQgdGhhdCB3ZW50IGRvd24gb24gaXRzIG93biBpc1xuICogbGVmdCBhbG9uZS5cbiAqXG4gKiAqKkFuZCBhIHByZXNzIHRoYXQgcmVhY2hlZCB0aGUgYXBwIGFueXdheSBpcyBuYW1lZCBhcyB0aGF0LioqIFRoZSBmaWVsZCBpcyBsb29rZWQgdXAgYmVmb3JlIHRoZSBwcmVzc1xuICogYW5kIGFmdGVyIGl0OyBvbmUgdGhhdCBtYXRjaGVkIGJlZm9yZSBhbmQgbm90IGFmdGVyIHdhcyBjbG9zZWQgYnkgdGhlIGtleSwgYW5kIHNheWluZyBzbyBiZWF0cyB0aGVcbiAqIGBub3RoaW5nIG1hdGNoZXNgIHRoYXQgdGhlIHJhaXNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBzdGVwIGxhdGVyLCBhYm91dCBhIHNlbGVjdG9yIHRoYXQgd2FzIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIGFzaywgYW5kIHRoZSBmaWVsZCB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgcHJlc3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8ga2V5Ym9hcmQgaXMgc2hvd2luZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBpcyBzdGlsbCBzaG93aW5nIGFmdGVyIHtAbGluayBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlR9IHByZXNzZXMgb2ZcbiAqICAgYEtFWUNPREVfQkFDS2AgXHUyMDE0IHRoZSByYWlzZSB0aGF0IGZvbGxvd3MgY291bGQgcHJvdmUgbm90aGluZywgYW5kIGl0cyBvd24gZmFpbHVyZSB3b3VsZCBibGFtZSBhIGtleWJvYXJkXG4gKiAgIHRoYXQgbmV2ZXIgY2FtZSB3aGVuIHRoZSB0cnV0aCBpcyBvbmUgdGhhdCBuZXZlciBsZWZ0IFx1MjAxNCBvciBpZiBhIHByZXNzIGNsb3NlZCB0aGUgZmllbGQncyBvd24gVUkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuXG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmllbGRQcmVzZW50QmVmb3JlUHJlc3MgPSBhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcyk7XG4gICAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgJ0tFWUNPREVfQkFDSyddLFxuICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICAgIH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmIChpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzICYmICFhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JhaXNlU29mdEtleWJvYXJkOiBLRVlDT0RFX0JBQ0ssIHByZXNzZWQgdG8gcHV0IGRvd24gYSBrZXlib2FyZCB0aGUgZGV2aWNlIHJlcG9ydGVkIHNob3dpbmcsIHJlYWNoZWQgdGhlIGFwcCBpbnN0ZWFkIGFuZCAnXG4gICAgICAgICAgKyBgY2xvc2VkIHRoZSBVSSBob2xkaW5nIFwiJHtwYXJhbXMuaW5wdXRTZWxlY3Rvcn1cIiBcdTIwMTQgaXQgbWF0Y2hlZCBiZWZvcmUgdGhlIHByZXNzIGFuZCBtYXRjaGVzIG5vdGhpbmcgYWZ0ZXIgaXQuIFRoZSBgXG4gICAgICAgICAgKyAna2V5Ym9hcmQgd2VudCBkb3duIGJldHdlZW4gdGhlIGxhc3QgcmVhZCBhbmQgdGhlIHByZXNzLiBMZXQgdGhlIHByZXZpb3VzIGtleWJvYXJkIHNldHRsZSBiZWZvcmUgb3BlbmluZyB0aGUgVUkgJ1xuICAgICAgICAgICsgYHRvIHJhaXNlIGl0IG9uLlxuZGV2aWNlIGJlZm9yZSB0aGUgcHJlc3M6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuICB9XG5cbiAgaWYgKGNoZWNrSXNJbnB1dE1ldGhvZFNob3duKGlucHV0TWV0aG9kU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBhIGtleWJvYXJkIHdhcyBhbHJlYWR5IHVwIGFuZCBkaWQgbm90IGdvIGRvd24gYWZ0ZXIgJHtTdHJpbmcoS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UKX0gcHJlc3NlcyBvZiBgXG4gICAgICAgICsgJ0tFWUNPREVfQkFDSywgc28gdGhlIGxpZnQgdGhhdCBwcm92ZXMgYSByYWlzZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuIFRoZSBmaWVsZCB3b3VsZCByZWFkIGFzIG9uZSB0aGF0IG5ldmVyICdcbiAgICAgICAgKyBgbW92ZWQgdW5kZXIgYSBrZXlib2FyZCB0aGF0IGlzIHBsYWlubHkgc2hvd2luZy5cbmRldmljZTogJHtpbnB1dE1ldGhvZFN0YXRlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUGFya3MgdGhlIGZpZWxkJ3MgY2FyZXQgYXQgb2Zmc2V0IDAsIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgaXQgaGFzIHN0YXllZCB0aGVyZS5cbiAqXG4gKiBSZWFkIGJhY2sgYWZ0ZXIge0BsaW5rIENBUkVUX1BBUktfQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EU30sIGFuZCBwYXJrZWQgYWdhaW4gd2hlbiBpdCBtb3ZlZDogdGhlIElNRVxuICogYW5zd2VycyBhIHNlbGVjdGlvbiBjaGFuZ2UsIGFuZCBhIGNhcmV0IGl0IG1vdmVkIGJhY2sgdG8gdGhlIGVuZCB3b3VsZCBicmluZyB0aGUgcHJlZGljdGlvbnMgYmFjayB3aXRoIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgd2hvc2UgY2FyZXQgdG8gcGFyay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2FyZXQgaGFzIHN0YXllZCBhdCBvZmZzZXQgMCwgb3IgYXQgb25jZSBmb3IgYSBmaWVsZCB0aGF0XG4gKiAgIGlzIG5vdCBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjYXJldCBkaWQgbm90IHN0YXkgYXQgb2Zmc2V0IDAgYWZ0ZXIge0BsaW5rIENBUkVUX1BBUktfQVRURU1QVF9DT1VOVH0gYXR0ZW1wdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhcmtDYXJldEF0U3RhcnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzZWxlY3Rpb25zOiAoRmllbGRTZWxlY3Rpb24gfCBudWxsKVtdID0gW107XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBDQVJFVF9QQVJLX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IGlzUGFya2VkID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgICB9KTtcblxuICAgIGlmICghaXNQYXJrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBzbGVlcChDQVJFVF9QQVJLX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGF3YWl0IHJlYWRGaWVsZFNlbGVjdGlvbihwYXJhbXMpO1xuICAgIHNlbGVjdGlvbnMucHVzaChzZWxlY3Rpb24pO1xuXG4gICAgaWYgKHNlbGVjdGlvbj8uc2VsZWN0aW9uU3RhcnQgPT09IDAgJiYgc2VsZWN0aW9uLnNlbGVjdGlvbkVuZCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgcmFpc2VTb2Z0S2V5Ym9hcmQ6IHRoZSBjYXJldCBwYXJrZWQgYXQgb2Zmc2V0IDAgaW4gXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGRpZCBub3Qgc3RheSB0aGVyZSwgc28gR2JvYXJkJ3MgYFxuICAgICAgKyBgc3RyaXAgd291bGQgc2hvdyB3b3JkIHByZWRpY3Rpb25zIHJhdGhlciB0aGFuIGl0cyB0b29sYmFyLiAke1N0cmluZyhDQVJFVF9QQVJLX0FUVEVNUFRfQ09VTlQpfSBhdHRlbXB0KHMpOyBgXG4gICAgICArIGB0aGUgZmllbGQgcmVhZCAke0pTT04uc3RyaW5naWZ5KHNlbGVjdGlvbnMpfS4gUGFzcyBzaG91bGRQaW5LZXlib2FyZFRvb2xiYXI6IGZhbHNlIHRvIGxlYXZlIHRoZSBjYXJldCBhbG9uZS5cbmRldmljZTogJHthd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpfWBcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGF0IHRoZSBmaWVsZCBob2xkcywgYW5kIHdoZXRoZXIgaXQgaXMgb25lIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCwgb3IgYG51bGxgIHdoZW4gbm90aGluZyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEZpZWxkQ29udGVudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxGaWVsZENvbnRlbnQgfCBudWxsPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBGaWVsZENvbnRlbnQgfCBudWxsIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbldyaXRlID0gZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbiAgICAgIHJldHVybiB7IGNhbldyaXRlLCB0ZXh0OiBjYW5Xcml0ZSA/IGVsZW1lbnQudmFsdWUgOiBlbGVtZW50LnRleHRDb250ZW50IH07XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hlcmUgdGhlIGZpZWxkJ3MgY2FyZXQgaXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2VsZWN0aW9uLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdyaXRhYmxlIG1hdGNoZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWVsZFNlbGVjdGlvbihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxGaWVsZFNlbGVjdGlvbiB8IG51bGw+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IEZpZWxkU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50XG4gICAgICAgID8geyBzZWxlY3Rpb25FbmQ6IGVsZW1lbnQuc2VsZWN0aW9uRW5kLCBzZWxlY3Rpb25TdGFydDogZWxlbWVudC5zZWxlY3Rpb25TdGFydCB9XG4gICAgICAgIDogbnVsbDtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBBc2tzIHRoZSBkZXZpY2Ugd2hhdCBpdHMgSU1FIGlzIGRvaW5nIFx1MjAxNCB0aGUgb25seSBwbGFjZSB0aGF0IGtub3dzLCBzaW5jZSBub3RoaW5nIGluIHRoZSBwYWdlIHJlcG9ydHMgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgdG8gYXNrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmllbGRzIHtAbGluayBwYXJzZUlucHV0TWV0aG9kU3RhdGV9IGtlZXBzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZHVtcHN5c091dHB1dCA9IGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IFsnc2hlbGwnLCAnZHVtcHN5cycsICdpbnB1dF9tZXRob2QnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZUlucHV0TWV0aG9kU3RhdGUoZHVtcHN5c091dHB1dCk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgcmVuZGVyZXIga25vd3MgYWJvdXQgaXRzIG93biBnZW9tZXRyeS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIG1lYXN1cmUgYW5kIHRoZSB2YXVsdCB0byByZWFkIGl0IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2aWV3cG9ydCBhbmQgdGhlIGZpZWxkJ3MgcmVjdCwgaW4gQ1NTIHBpeGVscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q+IHtcbiAgcmV0dXJuIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IgfSk6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Qge1xuICAgICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBUaGlzIGNsb3N1cmUgaXMgc2VyaWFsaXplZCBhbmQgZXZhbHVhdGVkIGluIHRoZSByZW5kZXJlciwgc28gYSBoZWxwZXIgaG9pc3RlZCB0byBtb2R1bGUgc2NvcGUgd291bGQgbm90IGV4aXN0IHRoZXJlLlxuICAgICAgZnVuY3Rpb24gdG9SZWN0KHJlY3Q6IERPTVJlY3QpOiBFbGVtZW50UmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiByZWN0LnRvcCxcbiAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgaW5uZXJIZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgaW5wdXRSZWN0OiBpbnB1dEVsID8gdG9SZWN0KGlucHV0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIDogbnVsbCxcbiAgICAgICAgc2NyZWVuWTogd2luZG93LnNjcmVlbllcbiAgICAgIH07XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBlbXB0aWVkIGZpZWxkJ3MgdGV4dCBiYWNrLCBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0IGhhcyBzdGF5ZWQgdGhlcmUuXG4gKlxuICogKipXcml0aW5nIGl0IG9uY2UgaXMgbm90IGVub3VnaC4qKiBUaGUgdG91Y2ggdGhhdCByYWlzZWQgdGhlIGtleWJvYXJkIGxhbmRlZCBvbiB0aGUgRU1QVFkgZmllbGQsIHNvIHRoZVxuICogSU1FJ3MgaW5wdXQgY29ubmVjdGlvbiBzdGFydGVkIGZyb20gYW4gZW1wdHkgZmllbGQsIGFuZCBhYm91dCBvbmUgdGltZSBpbiBmaXZlIGEgbGF0ZXIgdXBkYXRlIGZyb20gaXQgd3JvdGVcbiAqIHRoYXQgZW1wdHkgc3RhdGUgYmFjayBvdmVyIHRoaXMgd3JpdGUgKG1lYXN1cmVkIDIwMjYtMDktMjUgaW4gYG9ic2lkaWFuLWFsaWFzLXF1aWNrLXN3aXRjaGVyYCdzIGNhcHR1cmVcbiAqIHN1aXRlOiAyIG9mIDEwIGZyYW1lcyBzaG93ZWQgdGhlIHBsYWNlaG9sZGVyLCB3aGlsZSB0aGUgR2JvYXJkIHN0cmlwIHN0aWxsIG9mZmVyZWQgdGhlIHdvcmQgdGhhdCBoYWQgYmVlblxuICogd3JpdHRlbikuIFRoZSBjYXB0dXJlIHRha2VuIHN0cmFpZ2h0IGFmdGVyIHBob3RvZ3JhcGhlZCB0aGUgZW1wdHkgZmllbGQsIGFuZCBub3RoaW5nIHNhaWQgc28uIFNvIHRoZSBmaWVsZCBpc1xuICogcmUtcmVhZCB1bnRpbCBzZXZlcmFsIHJlYWRzIGFncmVlLCBhbmQgd3JpdHRlbiBhZ2FpbiB3aGVuZXZlciBvbmUgZG9lcyBub3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byB3cml0ZSwgYW5kIHRoZSBkZXZpY2UgdG8gYXNrIGFib3V0IGl0cyBJTUUgd2hlbiB0aGUgdGV4dCB3aWxsIG5vdCBob2xkLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRoZSBmaWVsZCBoZWxkIGJlZm9yZSBpdCB3YXMgZW1wdGllZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdGV4dCBoYXMgaGVsZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHRleHQgZGlkIG5vdCBob2xkIGFmdGVyIGV2ZXJ5IHJld3JpdGUsIG9yIHRoZSBmaWVsZCB3ZW50IGF3YXkgXHUyMDE0IG5hbWluZyBldmVyeSByZWFkIGFuZFxuICogICB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHJhdGhlciB0aGFuIHJldHVybmluZyB3aXRoIHRoZSBmaWVsZCBzaWxlbnRseSBlbXB0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaG9sZFRleHRJbkZpZWxkKHBhcmFtcywgdGV4dCk7XG5cbiAgaWYgKHJlc3VsdC53cml0ZUNvdW50ID4gMSkge1xuICAgIGxvZyhcbiAgICAgIGBbc29mdC1rZXlib2FyZF0gVGhlIHRleHQgd3JpdHRlbiBiYWNrIGludG8gXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIHdhcyBsb3N0ICR7U3RyaW5nKHJlc3VsdC53cml0ZUNvdW50IC0gMSl9IHRpbWUocykgYFxuICAgICAgICArIGBhbmQgd3JpdHRlbiBhZ2FpbjsgcmVhZHM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LnJlYWRUZXh0cyl9LmBcbiAgICApO1xuICB9XG5cbiAgaWYgKCFyZXN1bHQuaXNIZWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiB0aGUgdGV4dCB3cml0dGVuIGJhY2sgaW50byBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIgYWZ0ZXIgdGhlIHRvdWNoIGRpZCBub3Qgc3RheSB0aGVyZS4gYFxuICAgICAgICArIGBFeHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KHRleHQpfTsgJHtTdHJpbmcocmVzdWx0LndyaXRlQ291bnQpfSB3cml0ZShzKSwgYW5kIHRoZSBmaWVsZCByZWFkIGBcbiAgICAgICAgKyBgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQucmVhZFRleHRzKX0uIEEgY2FwdHVyZSB0YWtlbiBub3cgd291bGQgc2hvdyB0aGUgZmllbGQgd2l0aG91dCBpdHMgdGV4dC5cbmRldmljZTogJHthd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZmllbGQgdW50aWwgdGhlIGtleWJvYXJkIGlzIHVwLCBhbmQgc2F5cyBzbyB3aGVuIGl0IG5ldmVyIGNhbWUuXG4gKlxuICogVGhlIGJhc2VsaW5lIGlzIHJlYWQgaGVyZSByYXRoZXIgdGhhbiBieSB0aGUgY2FsbGVyLCBzbyBpdCBpcyByZWFkIHdpdGggdGhlIGZpZWxkIGluIHRoZSBzdGF0ZSB0aGVcbiAqIHRhcHMgYXJlIGRpc3BhdGNoZWQgYWdhaW5zdCBcdTIwMTQgc2VlIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0gZm9yIHdoeSB0aGUgdHdvIGhhdmUgdG8gbWF0Y2guXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpZWxkIG5ldmVyIG1hdGNoZWQsIG9yIGlmIGl0IG5ldmVyIGxpZnRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFwVW50aWxLZXlib2FyZElzVXAocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICBjb25zdCBiYXNlbGluZVNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIGxldCBzbmFwc2hvdCA9IGJhc2VsaW5lU25hcHNob3Q7XG5cbiAgaWYgKCFzbmFwc2hvdC5pbnB1dFJlY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhaXNlU29mdEtleWJvYXJkOiBub3RoaW5nIG1hdGNoZXMgXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiLCBzbyB0aGVyZSBpcyBubyBmaWVsZCB0byB0b3VjaC5gKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcG9pbnQgb2YgcmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50cyh7IHNuYXBzaG90IH0pKSB7XG4gICAgaWYgKGNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGF3YWl0IHRhcERldmljZSh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsIHBvaW50IH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHNuYXBzaG90ID0gYXdhaXQgcmVhZFNvZnRLZXlib2FyZFZpZXdwb3J0KHBhcmFtcyk7XG4gIH1cblxuICBpZiAoIWNoZWNrSXNVcChzbmFwc2hvdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXdhaXQgYnVpbGRGYWlsdXJlTWVzc2FnZShwYXJhbXMsIGJhc2VsaW5lU25hcHNob3QsIHNuYXBzaG90KSk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG5cbiAgZnVuY3Rpb24gY2hlY2tJc1VwKGN1cnJlbnQ6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hlY2tJc1NvZnRLZXlib2FyZFVwKHtcbiAgICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgICAuLi4ocGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzICE9PSB1bmRlZmluZWQgJiYgeyBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsczogcGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzIH0pLFxuICAgICAgc25hcHNob3Q6IGN1cnJlbnRcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBhIGZpZWxkJ3MgdmFsdWUgYW5kIHRlbGxzIHRoZSBwYWdlIGl0IGNoYW5nZWQuXG4gKlxuICogVGhlIGBpbnB1dGAgZXZlbnQgaXMgd2hhdCBhIHNjcmlwdGVkIHdyaXRlIG93ZXMgdGhlIHBhZ2U6IHdpdGhvdXQgaXQgYSBzdWdnZXN0ZXIga2VlcHMgdGhlIHJvd3MgaXQgaGFkXG4gKiBmb3IgdGhlIHRleHQgdGhhdCBpcyBubyBsb25nZXIgdGhlcmUuIEl0IGJ1YmJsZXMsIGJlY2F1c2UgdGhhdCBpcyBob3cgYSBmcmFtZXdvcmsgbGlzdGVuaW5nIG9uIGFcbiAqIGNvbnRhaW5lciBoZWFycyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZpZWxkIHRvIHdyaXRlLlxuICogQHBhcmFtIHRleHQgLSBXaGF0IHRvIHdyaXRlIGludG8gaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHdyaXRlIGhhcyBiZWVuIG1hZGUuXG4gKiBAdGhyb3dzIFR5cGVFcnJvciBpZiB0aGUgZmllbGQgaXMgbm90IG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVGaWVsZFRleHQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcywgdGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICBjYWxsYmFjayh7IGlucHV0U2VsZWN0b3IsIHRleHQ6IHZhbHVlIH0pOiB2b2lkIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IFwiJHtpbnB1dFNlbGVjdG9yfVwiIGlzIG5vdCBhIGZpZWxkIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLmApO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgfSxcbiAgICBpbnB1dDogeyBpbnB1dFNlbGVjdG9yOiBwYXJhbXMuaW5wdXRTZWxlY3RvciwgdGV4dCB9LFxuICAgIC4uLihwYXJhbXMudmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdFBhdGg6IHBhcmFtcy52YXVsdFBhdGggfSlcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUF3RUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBQ3BCLFNBQVMsY0FBYyxhQUFhO0FBU3BDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsV0FBVztBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQW9HUCxNQUFNLGdDQUFnQyxLQUFLLFFBQVEsSUFBSSxHQUFHLFFBQVEsYUFBYTtBQUsvRSxNQUFNLHdDQUF3QztBQU05QyxNQUFNLHlDQUF5QztBQVEvQyxNQUFNLGlDQUFpQztBQVV2QyxNQUFNLG9EQUFvRDtBQUsxRCxNQUFNLDJCQUEyQjtBQU1qQyxNQUFNLGdEQUFnRDtBQXVFdEQsZUFBc0Isa0JBQWtCLFFBQXdFO0FBQzlHLFFBQU0seUJBQXlCLE1BQU07QUFFckMsUUFBTSxnQkFBZ0IsTUFBTSxtQkFBbUIsTUFBTTtBQUVyRCxNQUFJO0FBRUosTUFBSTtBQUNGLGVBQVcsTUFBTSxxQkFBcUIsTUFBTTtBQUFBLEVBQzlDLFNBQVMsT0FBTztBQUdkLFFBQUksa0JBQWtCLE1BQU07QUFDMUIsWUFBTSx3QkFBd0IsUUFBUSxhQUFhO0FBQUEsSUFDckQ7QUFFQSxVQUFNO0FBQUEsRUFDUjtBQUVBLE1BQUksa0JBQWtCLE1BQU07QUFDMUIsVUFBTSxpQkFBaUIsUUFBUSxhQUFhO0FBQUEsRUFDOUM7QUFFQSxNQUFJLE9B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Q0FBQztBQUFBLElBQ3hDO0FBQUEsRUFDRjtBQUNGO0FBWUEsZUFBZSxxQkFBcUIsUUFBd0U7QUFDMUcsUUFBTSxtQkFBbUIsTUFBTSx5QkFBeUIsTUFBTTtBQUM5RCxNQUFJLFdBQVc7QUFFZixNQUFJLENBQUMsU0FBUyxXQUFXO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLHVDQUF1QyxPQUFPLGFBQWEsbUNBQW1DO0FBQUEsRUFDaEg7QUFFQSxhQUFXLFNBQVMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLEdBQUc7QUFDOUQsUUFBSSxVQUFVLFFBQVEsR0FBRztBQUN2QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQVUsRUFBRSxVQUFVLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDcEQsVUFBTSxNQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsV0FBTyxzQkFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQWNBLGVBQWUsZUFBZSxRQUFpQyxNQUE2QjtBQUMxRixRQUFNLGVBQWU7QUFBQSxJQUNuQixTQUFTLEVBQUUsZUFBZSxNQUFNLE1BQU0sR0FBUztBQUM3QyxZQUFNLFVBQVUsU0FBUyxjQUFjLGFBQWE7QUFFcEQsVUFBSSxFQUFFLG1CQUFtQixxQkFBcUIsRUFBRSxtQkFBbUIsc0JBQXNCO0FBQ3ZGLGNBQU0sSUFBSSxVQUFVLHVCQUF1QixhQUFhLDhDQUE4QztBQUFBLE1BQ3hHO0FBRUEsY0FBUSxRQUFRO0FBQ2hCLGNBQVEsY0FBYyxJQUFJLE1BQU0sU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUM7QUFBQSxJQUM3RDtBQUFBLElBQ0EsT0FBTyxFQUFFLGVBQWUsT0FBTyxlQUFlLEtBQUs7QUFBQSxJQUNuRCxHQUFJLE9BQU8sY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFVBQVU7QUFBQSxFQUN0RSxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "17.1.1",
3
+ "version": "17.2.0",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",