system-testing 1.0.109 → 1.0.111

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.
@@ -1,8 +1,30 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { Builder, By } from "selenium-webdriver";
4
+ import { Origin } from "selenium-webdriver/lib/input.js";
5
+ import { wait } from "awaitery";
4
6
  import timeout from "awaitery/build/timeout.js";
5
7
  import WebDriverDriver from "./webdriver-driver.js";
8
+ /**
9
+ * Appium timeout values returned by Selenium.
10
+ * @typedef {{implicit: number, pageLoad?: number, script?: number}} NativeTimeouts
11
+ */
12
+ /**
13
+ * Appium timeout update shape accepted by Selenium.
14
+ * @typedef {{implicit?: number, pageLoad?: number, script?: number}} NativeTimeoutOptions
15
+ */
16
+ /**
17
+ * Native Appium window dimensions.
18
+ * @typedef {{x: number, y: number, width: number, height: number}} NativeWindowRect
19
+ */
20
+ /**
21
+ * Tracks native scroll fallbacks that already reported no movement.
22
+ * @typedef {{tryElementScroll: boolean, tryViewportScroll: boolean}} NativeViewportScrollState
23
+ */
24
+ /**
25
+ * Native Android lookup work executed by the scrolling poller.
26
+ * @typedef {{description: string, directFind: () => Promise<import("selenium-webdriver").WebElement>, scrollSelectors: string[]}} NativeControlLookup
27
+ */
6
28
  /**
7
29
  * @param {string} message
8
30
  * @param {unknown} cause
@@ -37,6 +59,44 @@ function escapeJavaString(value) {
37
59
  export function androidResourceIdSelector(testId) {
38
60
  return `new UiSelector().resourceIdMatches("(^|.*:id/)${escapeJavaString(escapeRegExp(testId))}$")`;
39
61
  }
62
+ /**
63
+ * Builds a UiAutomator selector that matches visible text.
64
+ * @param {string} expectedText Text to locate.
65
+ * @returns {string} UiAutomator selector source.
66
+ */
67
+ export function androidTextContainsSelector(expectedText) {
68
+ return `new UiSelector().textContains("${escapeJavaString(expectedText)}")`;
69
+ }
70
+ /**
71
+ * Builds a UiAutomator selector that matches an accessibility label.
72
+ * @param {string} expectedText Text to locate.
73
+ * @returns {string} UiAutomator selector source.
74
+ */
75
+ export function androidDescriptionContainsSelector(expectedText) {
76
+ return `new UiSelector().descriptionContains("${escapeJavaString(expectedText)}")`;
77
+ }
78
+ /**
79
+ * Checks whether native lookup failed because the control is not currently mounted onscreen.
80
+ * @param {unknown} error Value thrown by Appium lookup.
81
+ * @returns {boolean} Whether native scrolling should be attempted.
82
+ */
83
+ function isNativeControlLookupMiss(error) {
84
+ if (!(error instanceof Error))
85
+ return false;
86
+ return error.message.includes("Element couldn't be found") || error.message.includes("Couldn't get elements");
87
+ }
88
+ /**
89
+ * Checks whether the hosted Appium driver lacks the mobile gesture extension.
90
+ * @param {unknown} error Value thrown by Appium.
91
+ * @returns {boolean} Whether W3C actions should be used instead.
92
+ */
93
+ function isUnsupportedMobileGestureError(error) {
94
+ if (!(error instanceof Error))
95
+ return false;
96
+ return error.message.includes("NotYetImplementedError") ||
97
+ error.message.includes("Method has not yet been implemented") ||
98
+ error.message.includes("Unknown mobile command");
99
+ }
40
100
  /**
41
101
  * Ensures Chrome Appium capabilities use a caller-owned user-data directory.
42
102
  * This avoids repeated sessions leaking temp profiles under `/tmp` in CI.
@@ -84,6 +144,7 @@ export async function ensureChromeUserDataDirCapability({ browserName, capabilit
84
144
  * @property {number} [timeout] Override timeout for lookup.
85
145
  * @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
86
146
  * @property {boolean} [scrollTo] Whether to scroll found elements into view before returning them.
147
+ * @property {string[]} [scrollContainerTestIDs] Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
87
148
  * @property {boolean} [useBaseSelector] Whether to scope by the base selector.
88
149
  */
89
150
  /**
@@ -267,7 +328,8 @@ export default class AppiumDriver extends WebDriverDriver {
267
328
  * @returns {Promise<import("selenium-webdriver").WebElement[]>}
268
329
  */
269
330
  async allByAccessibilityId(testId, args = {}) {
270
- const { scrollTo = false, visible = true, timeout, ...restArgs } = args;
331
+ const { scrollContainerTestIDs, scrollTo = false, visible = true, timeout, ...restArgs } = args;
332
+ void scrollContainerTestIDs;
271
333
  const restArgsKeys = Object.keys(restArgs).filter((key) => key !== "useBaseSelector");
272
334
  let actualTimeout;
273
335
  if (timeout === undefined) {
@@ -346,6 +408,9 @@ export default class AppiumDriver extends WebDriverDriver {
346
408
  * @returns {Promise<import("selenium-webdriver").WebElement>}
347
409
  */
348
410
  async findById(testId, args = {}) {
411
+ if (this.isAndroidNativeAppContext() && args.scrollTo) {
412
+ return await this.findNativeControlById(testId, args);
413
+ }
349
414
  const startTime = Date.now();
350
415
  /** @type {import("selenium-webdriver").WebElement[]} */
351
416
  let elements;
@@ -373,7 +438,8 @@ export default class AppiumDriver extends WebDriverDriver {
373
438
  * @returns {Promise<import("selenium-webdriver").WebElement[]>}
374
439
  */
375
440
  async allById(testId, args = {}) {
376
- const { scrollTo = false, visible = true, timeout, ...restArgs } = args;
441
+ const { scrollContainerTestIDs, scrollTo = false, visible = true, timeout, ...restArgs } = args;
442
+ void scrollContainerTestIDs;
377
443
  const restArgsKeys = Object.keys(restArgs).filter((key) => key !== "useBaseSelector");
378
444
  let actualTimeout;
379
445
  if (timeout === undefined) {
@@ -443,6 +509,229 @@ export default class AppiumDriver extends WebDriverDriver {
443
509
  }
444
510
  return By.id(testId);
445
511
  }
512
+ /**
513
+ * Finds native Android visible text or an accessibility label, scrolling it into view when needed.
514
+ * @param {string} expectedText Text to locate.
515
+ * @param {FindArgs} [args] Optional lookup settings.
516
+ * @returns {Promise<import("selenium-webdriver").WebElement>} Native element containing the text.
517
+ */
518
+ async findByNativeText(expectedText, args = {}) {
519
+ if (!this.isAndroidNativeAppContext()) {
520
+ throw new Error("findByNativeText is only supported for native Android Appium sessions");
521
+ }
522
+ const selectors = [androidTextContainsSelector(expectedText), androidDescriptionContainsSelector(expectedText)];
523
+ const directFind = async () => {
524
+ for (const selector of selectors) {
525
+ const elements = await this.getWebDriver().findElements(new By("-android uiautomator", selector));
526
+ if (elements.length > 0)
527
+ return elements[0];
528
+ }
529
+ throw new Error(`Element couldn't be found by text or accessibility label: ${expectedText}`);
530
+ };
531
+ return await this.withNativeImplicitWait(0, async () => {
532
+ return await this.findNativeControlWithScrolling({
533
+ description: `text or accessibility label: ${expectedText}`,
534
+ directFind,
535
+ scrollSelectors: selectors
536
+ }, { ...args, scrollTo: args.scrollTo ?? true });
537
+ });
538
+ }
539
+ /**
540
+ * Finds a native Android control by resource id, scrolling it into view first when requested.
541
+ * @param {string} testId Stable native resource id suffix.
542
+ * @param {FindArgs} [args] Optional lookup settings.
543
+ * @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
544
+ */
545
+ async findNativeControlById(testId, args = {}) {
546
+ const directFind = async () => await this.findById(testId, { ...args, timeout: 0, scrollTo: false });
547
+ return await this.withNativeImplicitWait(0, async () => {
548
+ return await this.findNativeControlWithScrolling({
549
+ description: `id: ${testId}`,
550
+ directFind,
551
+ scrollSelectors: [androidResourceIdSelector(testId)]
552
+ }, args);
553
+ });
554
+ }
555
+ /**
556
+ * Finds a native control, trying direct lookup, UiScrollable, and viewport gesture scrolling.
557
+ * @param {NativeControlLookup} lookup Lookup callbacks and diagnostics.
558
+ * @param {FindArgs} [args] Optional lookup settings.
559
+ * @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
560
+ */
561
+ async findNativeControlWithScrolling(lookup, args = {}) {
562
+ const { scrollContainerTestIDs = [], scrollTo = true, timeout = 10000 } = args;
563
+ const startTime = Date.now();
564
+ const viewportScrollState = {
565
+ tryElementScroll: true,
566
+ tryViewportScroll: true
567
+ };
568
+ let attemptedUiSelectorScroll = false;
569
+ /** @type {unknown} */
570
+ let lastError;
571
+ do {
572
+ try {
573
+ return await lookup.directFind();
574
+ }
575
+ catch (error) {
576
+ if (!isNativeControlLookupMiss(error))
577
+ throw error;
578
+ lastError = error;
579
+ }
580
+ if (scrollTo) {
581
+ if (!attemptedUiSelectorScroll) {
582
+ attemptedUiSelectorScroll = true;
583
+ for (const scrollSelector of lookup.scrollSelectors) {
584
+ try {
585
+ await this.scrollNativeUiSelectorIntoView(scrollSelector, scrollContainerTestIDs);
586
+ }
587
+ catch (error) {
588
+ void error;
589
+ }
590
+ }
591
+ }
592
+ try {
593
+ return await lookup.directFind();
594
+ }
595
+ catch (error) {
596
+ if (!isNativeControlLookupMiss(error))
597
+ throw error;
598
+ void error;
599
+ }
600
+ await this.scrollNativeViewportDown(viewportScrollState, scrollContainerTestIDs);
601
+ try {
602
+ return await lookup.directFind();
603
+ }
604
+ catch (error) {
605
+ if (!isNativeControlLookupMiss(error))
606
+ throw error;
607
+ lastError = error;
608
+ }
609
+ }
610
+ if (timeout === 0)
611
+ break;
612
+ await wait(100);
613
+ } while (Date.now() - startTime < timeout);
614
+ const elapsedSeconds = (Date.now() - startTime) / 1000;
615
+ throw errorWithCause(`Element couldn't be found after ${elapsedSeconds.toFixed(2)}s by ${lookup.description}`, lastError);
616
+ }
617
+ /**
618
+ * Runs explicit native polling without Appium's implicit wait extending every failed probe.
619
+ * @template TResult Result type.
620
+ * @param {number} implicitWaitMs Implicit wait duration to apply during the callback.
621
+ * @param {() => Promise<TResult>} callback Work that owns its own polling timeout.
622
+ * @returns {Promise<TResult>} Callback result.
623
+ */
624
+ async withNativeImplicitWait(implicitWaitMs, callback) {
625
+ const timeouts = /** @type {NativeTimeouts} */ (await this.getWebDriver().manage().getTimeouts());
626
+ await this.getWebDriver().manage().setTimeouts(/** @type {NativeTimeoutOptions} */ ({ implicit: implicitWaitMs }));
627
+ try {
628
+ return await callback();
629
+ }
630
+ finally {
631
+ await this.getWebDriver().manage().setTimeouts(/** @type {NativeTimeoutOptions} */ ({ implicit: timeouts.implicit }));
632
+ }
633
+ }
634
+ /**
635
+ * Scrolls the visible native viewport down when UiScrollable cannot identify the owning ScrollView.
636
+ * @param {NativeViewportScrollState} scrollState Per-lookup Appium scroll state.
637
+ * @param {string[]} scrollContainerTestIDs Native test IDs that may identify scroll containers.
638
+ * @returns {Promise<void>} Resolves after Appium performs the gesture.
639
+ */
640
+ async scrollNativeViewportDown(scrollState, scrollContainerTestIDs) {
641
+ const windowRect = /** @type {NativeWindowRect} */ (await this.getWebDriver().manage().window().getRect());
642
+ const horizontalInset = Math.max(1, Math.floor(windowRect.width * 0.1));
643
+ const top = Math.max(1, Math.floor(windowRect.height * 0.2));
644
+ const width = Math.max(1, windowRect.width - horizontalInset * 2);
645
+ const height = Math.max(1, Math.floor(windowRect.height * 0.6));
646
+ if (scrollState.tryElementScroll && scrollContainerTestIDs.length > 0) {
647
+ for (const scrollContainerTestID of scrollContainerTestIDs) {
648
+ try {
649
+ const didScroll = await this.scrollNativeElementDown(scrollContainerTestID);
650
+ if (didScroll)
651
+ return;
652
+ }
653
+ catch (error) {
654
+ scrollState.tryElementScroll = false;
655
+ if (!isUnsupportedMobileGestureError(error))
656
+ throw error;
657
+ }
658
+ }
659
+ scrollState.tryElementScroll = false;
660
+ }
661
+ if (scrollState.tryViewportScroll) {
662
+ try {
663
+ const didScroll = await this.getWebDriver().executeScript("mobile: scrollGesture", {
664
+ direction: "down",
665
+ height,
666
+ left: horizontalInset,
667
+ percent: 0.75,
668
+ top,
669
+ width
670
+ });
671
+ if (didScroll === true)
672
+ return;
673
+ scrollState.tryViewportScroll = false;
674
+ }
675
+ catch (error) {
676
+ scrollState.tryViewportScroll = false;
677
+ if (!isUnsupportedMobileGestureError(error))
678
+ throw error;
679
+ }
680
+ }
681
+ const centerX = Math.floor(windowRect.x + windowRect.width / 2);
682
+ const startY = Math.floor(windowRect.y + windowRect.height * 0.78);
683
+ const endY = Math.floor(windowRect.y + windowRect.height * 0.28);
684
+ await this.getWebDriver()
685
+ .actions({ async: true })
686
+ .move({ origin: Origin.VIEWPORT, x: centerX, y: startY })
687
+ .press()
688
+ .move({ duration: 250, origin: Origin.VIEWPORT, x: centerX, y: endY })
689
+ .release()
690
+ .perform();
691
+ }
692
+ /**
693
+ * Scrolls a specific native Android element by test id when Appium exposes it as a scroll container.
694
+ * @param {string} testId Stable native resource id suffix.
695
+ * @returns {Promise<boolean>} Whether Appium reported more content to scroll.
696
+ */
697
+ async scrollNativeElementDown(testId) {
698
+ const elements = await this.getWebDriver().findElements(new By("-android uiautomator", androidResourceIdSelector(testId)));
699
+ const scrollElement = elements[0];
700
+ if (!scrollElement)
701
+ return false;
702
+ const didScroll = await this.getWebDriver().executeScript("mobile: scrollGesture", {
703
+ direction: "down",
704
+ elementId: await scrollElement.getId(),
705
+ percent: 0.75
706
+ });
707
+ return didScroll === true;
708
+ }
709
+ /**
710
+ * Moves an offscreen Android control into a ScrollView-backed native hierarchy.
711
+ * @param {string} uiSelector UiAutomator selector for the target control.
712
+ * @param {string[]} scrollContainerTestIDs Native test IDs that may identify scroll containers.
713
+ * @returns {Promise<void>} Resolves after UiAutomator attempts the scroll.
714
+ */
715
+ async scrollNativeUiSelectorIntoView(uiSelector, scrollContainerTestIDs) {
716
+ const scrollableSelectors = [
717
+ ...scrollContainerTestIDs.map((scrollContainerTestID) => androidResourceIdSelector(scrollContainerTestID)),
718
+ "new UiSelector().scrollable(true)"
719
+ ];
720
+ /** @type {unknown} */
721
+ let lastError;
722
+ for (const scrollableSelector of scrollableSelectors) {
723
+ try {
724
+ const elements = await this.getWebDriver().findElements(new By("-android uiautomator", `new UiScrollable(${scrollableSelector}).scrollIntoView(${uiSelector})`));
725
+ if (elements.length > 0)
726
+ return;
727
+ }
728
+ catch (error) {
729
+ lastError = error;
730
+ }
731
+ }
732
+ if (lastError)
733
+ throw lastError;
734
+ }
446
735
  /**
447
736
  * Checks whether the current session is a native Android app, not Android Chrome.
448
737
  * @returns {boolean} True when UiAutomator resource-id lookup should be used.
@@ -463,4 +752,4 @@ export default class AppiumDriver extends WebDriverDriver {
463
752
  return `http://${address}:${port}${basePath}`;
464
753
  }
465
754
  }
466
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFFbkQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLHVDQUF1QyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUMxRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNuQixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDckQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQUs7SUFDN0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQzFELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE1BQU07SUFDOUMsT0FBTyxpREFBaUQsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUNyRyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMs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QUFJLElBQUksQ0FBQTtRQUNwQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFbkksT0FBTyxVQUFVLE9BQU8sSUFBSSxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyLCBCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgV2ViRHJpdmVyRHJpdmVyIGZyb20gXCIuL3dlYmRyaXZlci1kcml2ZXIuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBFbnN1cmVzIENocm9tZSBBcHBpdW0gY2FwYWJpbGl0aWVzIHVzZSBhIGNhbGxlci1vd25lZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICogVGhpcyBhdm9pZHMgcmVwZWF0ZWQgc2Vzc2lvbnMgbGVha2luZyB0ZW1wIHByb2ZpbGVzIHVuZGVyIGAvdG1wYCBpbiBDSS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYnJvd3Nlck5hbWVdXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MuY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGVtcFJvb3REaXJdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ2hyb21lVXNlckRhdGFEaXJDYXBhYmlsaXR5KHticm93c2VyTmFtZSwgY2FwYWJpbGl0aWVzLCB0ZW1wUm9vdERpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRtcFwiLCBcImFwcGl1bS1jaHJvbWUtdXNlci1kYXRhXCIpfSkge1xuICBjb25zdCByZXNvbHZlZEJyb3dzZXJOYW1lID0gY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID8/IGJyb3dzZXJOYW1lXG5cbiAgaWYgKHR5cGVvZiByZXNvbHZlZEJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IHJlc29sdmVkQnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJjaHJvbWVcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBjaHJvbWVPcHRpb25zID0gY2FwYWJpbGl0aWVzW1wiZ29vZzpjaHJvbWVPcHRpb25zXCJdXG4gIGNvbnN0IGFyZ3MgPSBBcnJheS5pc0FycmF5KGNocm9tZU9wdGlvbnM/LmFyZ3MpID8gWy4uLmNocm9tZU9wdGlvbnMuYXJnc10gOiBbXVxuXG4gIGlmIChhcmdzLnNvbWUoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiAmJiBhcmcuc3RhcnRzV2l0aChcIi0tdXNlci1kYXRhLWRpcj1cIikpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgYXdhaXQgZnMubWtkaXIodGVtcFJvb3REaXIsIHtyZWN1cnNpdmU6IHRydWV9KVxuXG4gIGNvbnN0IHVzZXJEYXRhRGlyID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4odGVtcFJvb3REaXIsIFwicHJvZmlsZS1cIikpXG5cbiAgYXJncy5wdXNoKGAtLXVzZXItZGF0YS1kaXI9JHt1c2VyRGF0YURpcn1gKVxuICBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl0gPSB7XG4gICAgLi4uKGNocm9tZU9wdGlvbnMgPz8ge30pLFxuICAgIGFyZ3NcbiAgfVxuXG4gIHJldHVybiB1c2VyRGF0YURpclxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1Nb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhcHBpdW1cIilcbiAgICAgIGNvbnN0IGFwcGl1bU1haW4gPSBhcHBpdW1Nb2R1bGUubWFpbiA/PyBhcHBpdW1Nb2R1bGUuZGVmYXVsdD8ubWFpblxuXG4gICAgICBpZiAoIWFwcGl1bU1haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGl1bVNlcnZlciA9IGF3YWl0IGFwcGl1bU1haW4oc2VydmVyQXJncylcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5idWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMgPyB7Li4udGhpcy5vcHRpb25zLmNhcGFiaWxpdGllc30gOiB7fVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSAmJiAhY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSBcIlwiXG4gICAgfVxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IGF3YWl0IGVuc3VyZUNocm9tZVVzZXJEYXRhRGlyQ2FwYWJpbGl0eSh7XG4gICAgICBicm93c2VyTmFtZTogdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lLFxuICAgICAgY2FwYWJpbGl0aWVzXG4gICAgfSlcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpLnVzaW5nU2VydmVyKHRoaXMuc2VydmVyVXJsKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhcGFiaWxpdGllcykubGVuZ3RoID4gMCkge1xuICAgICAgYnVpbGRlci53aXRoQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViRHJpdmVyID0gYXdhaXQgYnVpbGRlci5idWlsZCgpXG5cbiAgICAgIHRoaXMuc2V0V2ViRHJpdmVyKHdlYkRyaXZlcilcbiAgICAgIHRoaXMuaW5zdGFsbEV4aXRIYW5kbGVycygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuc3RvcCgpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLmFwcGl1bVNlcnZlcj8uY2xvc2UpIHtcbiAgICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSBjbG9zaW5nIEFwcGl1bSBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuYXBwaXVtU2VydmVyPn0gKi8gKHRoaXMuYXBwaXVtU2VydmVyKS5jbG9zZSgpKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGl1bVNlcnZlciA9IHVuZGVmaW5lZFxuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKCkge1xuICAgIGlmICghdGhpcy5jaHJvbWVVc2VyRGF0YURpcikgcmV0dXJuXG5cbiAgICBjb25zdCBjaHJvbWVVc2VyRGF0YURpciA9IHRoaXMuY2hyb21lVXNlckRhdGFEaXJcblxuICAgIHRoaXMuY2hyb21lVXNlckRhdGFEaXIgPSB1bmRlZmluZWRcbiAgICBhd2FpdCBmcy5ybShjaHJvbWVVc2VyRGF0YURpciwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGNvb2tpZXMuIFNraXBwZWQgZm9yIG5hdGl2ZSBhcHAgY29udGV4dHMgd2hlcmUgY29va2llXG4gICAqIG1hbmFnZW1lbnQgaXMgbm90IHN1cHBvcnRlZCBieSBVaUF1dG9tYXRvcjIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsQ29va2llcygpIHtcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuXG4gICAgaWYgKCFicm93c2VyTmFtZSkgcmV0dXJuXG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGVBbGxDb29raWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBnZXRCcm93c2VyTG9ncygpIHtcbiAgICBjb25zdCBwbGF0Zm9ybU5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5wbGF0Zm9ybU5hbWVcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuICAgIGNvbnN0IGlzQW5kcm9pZCA9IHR5cGVvZiBwbGF0Zm9ybU5hbWUgPT09IFwic3RyaW5nXCIgJiYgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYW5kcm9pZFwiXG5cbiAgICBpZiAoaXNBbmRyb2lkICYmICFicm93c2VyTmFtZSkge1xuICAgICAgbGV0IGVudHJpZXNcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZW50cmllcyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkubG9ncygpLmdldChcImxvZ2NhdFwiKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2djYXRMb2dzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VNYXRjaCA9IGVudHJ5Lm1lc3NhZ2UubWF0Y2goL14oLispIChcXGQrKTooXFxkKykgKC4rKSQvKVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZU1hdGNoID8gbWVzc2FnZU1hdGNoWzRdIDogZW50cnkubWVzc2FnZVxuXG4gICAgICAgIGxvZ2NhdExvZ3MucHVzaChgJHtlbnRyeS5sZXZlbC5uYW1lfTogJHttZXNzYWdlfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2djYXRMb2dzXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmdldEJyb3dzZXJMb2dzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICBjb25zdCB0ZXN0SWRTdHJhdGVneSA9IHRoaXMub3B0aW9ucy50ZXN0SWRTdHJhdGVneSA/PyBcImFjY2Vzc2liaWxpdHlJZFwiXG5cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiY3NzXCIpIHtcbiAgICAgIGNvbnN0IHRlc3RJZEF0dHJpYnV0ZSA9IHRoaXMub3B0aW9ucy50ZXN0SWRBdHRyaWJ1dGUgPz8gXCJkYXRhLXRlc3RpZFwiXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kKGBbJHt0ZXN0SWRBdHRyaWJ1dGV9PScke3Rlc3RJRH0nXWAsIGFyZ3MpXG4gICAgfVxuICAgIGlmICh0ZXN0SWRTdHJhdGVneSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kQnlJZCh0ZXN0SUQsIGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQodGVzdElELCB7Li4uYXJncywgdGltZW91dDogMH0pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHNcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfSAtICR7ZXJyb3IubWVzc2FnZX0gKGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7dHlwZW9mIGVycm9yfSAtICR7ZXJyb3J9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50c1swXSkge1xuICAgICAgY29uc3QgZWxhcHNlZFNlY29uZHMgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkgLyAxMDAwXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgJHtlbGFwc2VkU2Vjb25kcy50b0ZpeGVkKDIpfXMgYnkgYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3Njcm9sbFRvID0gZmFsc2UsIHZpc2libGUgPSB0cnVlLCB0aW1lb3V0LCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IFwidXNlQmFzZVNlbGVjdG9yXCIpXG4gICAgbGV0IGFjdHVhbFRpbWVvdXRcblxuICAgIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aGlzLl9kcml2ZXJUaW1lb3V0c1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGltZW91dFxuICAgIH1cblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgY29uc3QgZ2V0VGltZUxlZnQgPSAoKSA9PiBNYXRoLm1heChhY3R1YWxUaW1lb3V0IC0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpLCAwKVxuICAgIGNvbnN0IGdldEVsZW1lbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm91bmRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcImFjY2Vzc2liaWxpdHkgaWRcIiwgdGVzdElkKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgdGhpcy5pc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudClcblxuICAgICAgICBpZiAodmlzaWJsZSAmJiAhaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG4gICAgICAgIGlmICghdmlzaWJsZSAmJiBpc0Rpc3BsYXllZCkgY29udGludWVcblxuICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRWxlbWVudHNcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50cyA9IFtdXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGltZUxlZnQgPSBhY3R1YWxUaW1lb3V0ID09IDAgPyAwIDogZ2V0VGltZUxlZnQoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGltZUxlZnQgPT0gMCkge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9LCB0aW1lTGVmdClcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlRpbWVvdXRFcnJvclwiICYmIGdldFRpbWVMZWZ0KCkgPiAwKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGlzIGRpc3BsYXllZC4gRm9yIG5hdGl2ZSBhcHAgY29udGV4dHMsIGFsd2F5c1xuICAgKiByZXR1cm5zIHRydWUgYmVjYXVzZSBTZWxlbml1bSdzIGlzRGlzcGxheWVkKCkgSlMgYXRvbSBpcyBub3Qgc3VwcG9ydGVkXG4gICAqIGJ5IFVpQXV0b21hdG9yMiBpbiBuYXRpdmUgbW9kZSwgYW5kIGVsZW1lbnRzIGZvdW5kIGJ5IFVpQXV0b21hdG9yMidzXG4gICAqIGFjY2Vzc2liaWxpdHkgaWQgLyBpZCBzZWFyY2ggYXJlIGFscmVhZHkgaW4gdGhlIHJlbmRlcmVkIHZpZXcgaGllcmFyY2h5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpIHtcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuXG4gICAgaWYgKCFicm93c2VyTmFtZSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBhd2FpdCBlbGVtZW50LmlzRGlzcGxheWVkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5SWQodGVzdElkLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfSAtICR7ZXJyb3IubWVzc2FnZX0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50c1swXSkge1xuICAgICAgY29uc3QgZWxhcHNlZFNlY29uZHMgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkgLyAxMDAwXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgJHtlbGFwc2VkU2Vjb25kcy50b0ZpeGVkKDIpfXMgYnkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3Njcm9sbFRvID0gZmFsc2UsIHZpc2libGUgPSB0cnVlLCB0aW1lb3V0LCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IFwidXNlQmFzZVNlbGVjdG9yXCIpXG4gICAgbGV0IGFjdHVhbFRpbWVvdXRcblxuICAgIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aGlzLl9kcml2ZXJUaW1lb3V0c1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGltZW91dFxuICAgIH1cblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgY29uc3QgZ2V0VGltZUxlZnQgPSAoKSA9PiBNYXRoLm1heChhY3R1YWxUaW1lb3V0IC0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpLCAwKVxuICAgIGNvbnN0IGdldEVsZW1lbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm91bmRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKHRoaXMuaWRMb2NhdG9yKHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggaWQ6ICR7dGVzdElkfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGlkIGxvY2F0b3IgZm9yIHRoZSBhY3RpdmUgQXBwaXVtIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgVGVzdCBpZCBvciBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcmV0dXJucyB7Qnl9IFNlbGVuaXVtL0FwcGl1bSBsb2NhdG9yLlxuICAgKi9cbiAgaWRMb2NhdG9yKHRlc3RJZCkge1xuICAgIGlmICh0aGlzLmlzQW5kcm9pZE5hdGl2ZUFwcENvbnRleHQoKSkge1xuICAgICAgcmV0dXJuIG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSlcbiAgICB9XG5cbiAgICByZXR1cm4gQnkuaWQodGVzdElkKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgYSBuYXRpdmUgQW5kcm9pZCBhcHAsIG5vdCBBbmRyb2lkIENocm9tZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBVaUF1dG9tYXRvciByZXNvdXJjZS1pZCBsb29rdXAgc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBpc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICByZXR1cm4gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIgJiYgIWJyb3dzZXJOYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzZXJ2ZXJBcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlckFyZ3MuYWRkcmVzcyA/PyBcIjEyNy4wLjAuMVwiXG4gICAgY29uc3QgcG9ydCA9IHNlcnZlckFyZ3MucG9ydCA/PyA0NzIzXG4gICAgY29uc3QgYmFzZVBhdGggPSBzZXJ2ZXJBcmdzLmJhc2VQYXRoID8gKHNlcnZlckFyZ3MuYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBzZXJ2ZXJBcmdzLmJhc2VQYXRoIDogYC8ke3NlcnZlckFyZ3MuYmFzZVBhdGh9YCkgOiBcIlwiXG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0ke2Jhc2VQYXRofWBcbiAgfVxufVxuIl19
755
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3RELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDN0IsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFFbkQ7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLHVDQUF1QyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUMxRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNuQixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDckQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQUs7SUFDN0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQzFELENBQUM7QUFFRDs7OztH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O1lBQ2pDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLFNBQVMsR0FBRyxLQUFLLENBQUE7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFNBQVM7WUFBRSxNQUFNLFNBQVMsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gseUJBQXlCO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQTtRQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUE7UUFFdEYsT0FBTyxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQTtJQUNyRyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFVBQVU7UUFDdkIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUE7UUFDakQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUE7UUFDcEMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRW5JLE9BQU8sVUFBVSxPQUFPLElBQUksSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFBO0lBQy9DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7QnVpbGRlciwgQnl9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuaW1wb3J0IHtPcmlnaW59IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2lucHV0LmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIEFuZHJvaWQgbG9va3VwIHdvcmsgZXhlY3V0ZWQgYnkgdGhlIHNjcm9sbGluZyBwb2xsZXIuXG4gKiBAdHlwZWRlZiB7e2Rlc2NyaXB0aW9uOiBzdHJpbmcsIGRpcmVjdEZpbmQ6ICgpID0+IFByb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+LCBzY3JvbGxTZWxlY3RvcnM6IHN0cmluZ1tdfX0gTmF0aXZlQ29udHJvbExvb2t1cFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2F1c2VcbiAqIEByZXR1cm5zIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19XG4gKi9cbmZ1bmN0aW9uIGVycm9yV2l0aENhdXNlKG1lc3NhZ2UsIGNhdXNlKSB7XG4gIGNvbnN0IGVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19ICovIChuZXcgRXJyb3IobWVzc2FnZSkpXG4gIGVycm9yLmNhdXNlID0gY2F1c2VcbiAgcmV0dXJuIGVycm9yXG59XG5cbi8qKlxuICogRXNjYXBlcyB0ZXh0IGZvciB1c2UgaW5zaWRlIGEgSmF2YSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVW5lc2NhcGVkIHJlZ2V4IHRleHQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZWdleC1zYWZlIHRleHQuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csIFwiXFxcXCQmXCIpXG59XG5cbi8qKlxuICogRXNjYXBlcyB0ZXh0IGZvciB1c2UgaW5zaWRlIGEgcXVvdGVkIFVpQXV0b21hdG9yIEphdmEgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBKYXZhIHN0cmluZyB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gSmF2YS1zdHJpbmctc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVKYXZhU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpXG59XG5cbi8qKlxuICogQnVpbGRzIGEgVWlBdXRvbWF0b3Igc2VsZWN0b3IgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgcGFja2FnZS1xdWFsaWZpZWQgcmVzb3VyY2UgSURzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkucmVzb3VyY2VJZE1hdGNoZXMoXCIoXnwuKjppZC8pJHtlc2NhcGVKYXZhU3RyaW5nKGVzY2FwZVJlZ0V4cCh0ZXN0SWQpKX0kXCIpYFxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyB2aXNpYmxlIHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFRleHRDb250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkudGV4dENvbnRhaW5zKFwiJHtlc2NhcGVKYXZhU3RyaW5nKGV4cGVjdGVkVGV4dCl9XCIpYFxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWREZXNjcmlwdGlvbkNvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSB7XG4gIHJldHVybiBgbmV3IFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbkNvbnRhaW5zKFwiJHtlc2NhcGVKYXZhU3RyaW5nKGV4cGVjdGVkVGV4dCl9XCIpYFxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIG5hdGl2ZSBsb29rdXAgZmFpbGVkIGJlY2F1c2UgdGhlIGNvbnRyb2wgaXMgbm90IGN1cnJlbnRseSBtb3VudGVkIG9uc2NyZWVuLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciBWYWx1ZSB0aHJvd24gYnkgQXBwaXVtIGxvb2t1cC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG5hdGl2ZSBzY3JvbGxpbmcgc2hvdWxkIGJlIGF0dGVtcHRlZC5cbiAqL1xuZnVuY3Rpb24gaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kXCIpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJDb3VsZG4ndCBnZXQgZWxlbWVudHNcIilcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgaG9zdGVkIEFwcGl1bSBkcml2ZXIgbGFja3MgdGhlIG1vYmlsZSBnZXN0dXJlIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIFczQyBhY3Rpb25zIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIGlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTm90WWV0SW1wbGVtZW50ZWRFcnJvclwiKSB8fFxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJNZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZFwiKSB8fFxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJVbmtub3duIG1vYmlsZSBjb21tYW5kXCIpXG59XG5cbi8qKlxuICogRW5zdXJlcyBDaHJvbWUgQXBwaXVtIGNhcGFiaWxpdGllcyB1c2UgYSBjYWxsZXItb3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAqIFRoaXMgYXZvaWRzIHJlcGVhdGVkIHNlc3Npb25zIGxlYWtpbmcgdGVtcCBwcm9maWxlcyB1bmRlciBgL3RtcGAgaW4gQ0kuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJyb3dzZXJOYW1lXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLmNhcGFiaWxpdGllc1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnRlbXBSb290RGlyXVxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNocm9tZVVzZXJEYXRhRGlyQ2FwYWJpbGl0eSh7YnJvd3Nlck5hbWUsIGNhcGFiaWxpdGllcywgdGVtcFJvb3REaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ0bXBcIiwgXCJhcHBpdW0tY2hyb21lLXVzZXItZGF0YVwiKX0pIHtcbiAgY29uc3QgcmVzb2x2ZWRCcm93c2VyTmFtZSA9IGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA/PyBicm93c2VyTmFtZVxuXG4gIGlmICh0eXBlb2YgcmVzb2x2ZWRCcm93c2VyTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCByZXNvbHZlZEJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiY2hyb21lXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBwbGF0Zm9ybU5hbWUgPSBjYXBhYmlsaXRpZXMucGxhdGZvcm1OYW1lXG5cbiAgaWYgKHR5cGVvZiBwbGF0Zm9ybU5hbWUgPT09IFwic3RyaW5nXCIgJiYgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYW5kcm9pZFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgY2hyb21lT3B0aW9ucyA9IGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXVxuICBjb25zdCBhcmdzID0gQXJyYXkuaXNBcnJheShjaHJvbWVPcHRpb25zPy5hcmdzKSA/IFsuLi5jaHJvbWVPcHRpb25zLmFyZ3NdIDogW11cblxuICBpZiAoYXJncy5zb21lKChhcmcpID0+IHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgJiYgYXJnLnN0YXJ0c1dpdGgoXCItLXVzZXItZGF0YS1kaXI9XCIpKSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGF3YWl0IGZzLm1rZGlyKHRlbXBSb290RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICBjb25zdCB1c2VyRGF0YURpciA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKHRlbXBSb290RGlyLCBcInByb2ZpbGUtXCIpKVxuXG4gIGFyZ3MucHVzaChgLS11c2VyLWRhdGEtZGlyPSR7dXNlckRhdGFEaXJ9YClcbiAgY2FwYWJpbGl0aWVzW1wiZ29vZzpjaHJvbWVPcHRpb25zXCJdID0ge1xuICAgIC4uLihjaHJvbWVPcHRpb25zID8/IHt9KSxcbiAgICBhcmdzXG4gIH1cblxuICByZXR1cm4gdXNlckRhdGFEaXJcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcHBpdW1Ecml2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlcnZlclVybF0gUmVtb3RlIEFwcGl1bSBzZXJ2ZXIgVVJMIHRvIGNvbm5lY3QgdG8uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtzZXJ2ZXJBcmdzXSBPcHRpb25zIHBhc3NlZCB0byB0aGUgQXBwaXVtIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFt1c2VEcml2ZXJzXSBBcHBpdW0gZHJpdmVyIG5hbWVzIHRvIGxvYWQgd2hlbiBzdGFydGluZyB0aGUgc2VydmVyLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY2FwYWJpbGl0aWVzXSBEZXNpcmVkIGNhcGFiaWxpdGllcyBmb3IgdGhlIHNlc3Npb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jyb3dzZXJOYW1lXSBCcm93c2VyIG5hbWUgZm9yIHdlYiBzZXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7XCJhY2Nlc3NpYmlsaXR5SWRcInxcImNzc1wifFwiaWRcIn0gW3Rlc3RJZFN0cmF0ZWd5XSBTdHJhdGVneSBmb3IgcmVzb2x2aW5nIHRlc3QgSURzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0ZXN0SWRBdHRyaWJ1dGVdIEF0dHJpYnV0ZSBuYW1lIHdoZW4gdXNpbmcgdGhlIENTUyB0ZXN0IElEIHN0cmF0ZWd5LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbmRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZSAoYHRydWVgKSBvciBoaWRkZW4gKGBmYWxzZWApLiBVc2UgYG51bGxgIHRvIGRpc2FibGUgdmlzaWJpbGl0eSBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY3JvbGxUb10gV2hldGhlciB0byBzY3JvbGwgZm91bmQgZWxlbWVudHMgaW50byB2aWV3IGJlZm9yZSByZXR1cm5pbmcgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzY3JvbGxDb250YWluZXJUZXN0SURzXSBOYXRpdmUgdGVzdCBJRHMgdGhhdCBzaG91bGQgYmUgdHJpZWQgYXMgc2Nyb2xsIGNvbnRhaW5lcnMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB2aWV3cG9ydCBnZXN0dXJlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuXG4vKipcbiAqIEFwcGl1bSBkcml2ZXIgYmFja2VkIGJ5IHRoZSBBcHBpdW0gc2VydmVyIHBhY2thZ2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwcGl1bURyaXZlciBleHRlbmRzIFdlYkRyaXZlckRyaXZlciB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBjaHJvbWVVc2VyRGF0YURpciA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSB7Li4uKHRoaXMub3B0aW9ucy5zZXJ2ZXJBcmdzID8/IHt9KX1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudXNlRHJpdmVycyAmJiAhc2VydmVyQXJncy51c2VEcml2ZXJzKSB7XG4gICAgICBzZXJ2ZXJBcmdzLnVzZURyaXZlcnMgPSB0aGlzLm9wdGlvbnMudXNlRHJpdmVyc1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VydmVyVXJsKSB7XG4gICAgICB0aGlzLnNlcnZlclVybCA9IHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmxcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYXBwaXVtTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiYXBwaXVtXCIpXG4gICAgICBjb25zdCBhcHBpdW1NYWluID0gYXBwaXVtTW9kdWxlLm1haW4gPz8gYXBwaXVtTW9kdWxlLmRlZmF1bHQ/Lm1haW5cblxuICAgICAgaWYgKCFhcHBpdW1NYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFwcGl1bSBtYWluKCkgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgYXBwaXVtIHBhY2thZ2VcIilcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBpdW1TZXJ2ZXIgPSBhd2FpdCBhcHBpdW1NYWluKHNlcnZlckFyZ3MpXG4gICAgICB0aGlzLnNlcnZlclVybCA9IHRoaXMuYnVpbGRTZXJ2ZXJVcmwoc2VydmVyQXJncylcbiAgICB9XG5cbiAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzID8gey4uLnRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXN9IDoge31cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUgJiYgIWNhcGFiaWxpdGllcy5icm93c2VyTmFtZSkge1xuICAgICAgY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG4gICAgfVxuICAgIGlmIChjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID0gXCJcIlxuICAgIH1cblxuICAgIHRoaXMuY2hyb21lVXNlckRhdGFEaXIgPSBhd2FpdCBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe1xuICAgICAgYnJvd3Nlck5hbWU6IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSxcbiAgICAgIGNhcGFiaWxpdGllc1xuICAgIH0pXG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS51c2luZ1NlcnZlcih0aGlzLnNlcnZlclVybClcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYXBhYmlsaXRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGJ1aWxkZXIud2l0aENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYkRyaXZlciA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKVxuXG4gICAgICB0aGlzLnNldFdlYkRyaXZlcih3ZWJEcml2ZXIpXG4gICAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnN0b3AoKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5hcHBpdW1TZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBBcHBpdW0gc2VydmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmFwcGl1bVNlcnZlcj59ICovICh0aGlzLmFwcGl1bVNlcnZlcikuY2xvc2UoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBpdW1TZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpIHtcbiAgICBpZiAoIXRoaXMuY2hyb21lVXNlckRhdGFEaXIpIHJldHVyblxuXG4gICAgY29uc3QgY2hyb21lVXNlckRhdGFEaXIgPSB0aGlzLmNocm9tZVVzZXJEYXRhRGlyXG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgZnMucm0oY2hyb21lVXNlckRhdGFEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBjb29raWVzLiBTa2lwcGVkIGZvciBuYXRpdmUgYXBwIGNvbnRleHRzIHdoZXJlIGNvb2tpZVxuICAgKiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVWlBdXRvbWF0b3IyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVyblxuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgY29uc3QgcGxhdGZvcm1OYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8ucGxhdGZvcm1OYW1lXG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICBjb25zdCBpc0FuZHJvaWQgPSB0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIlxuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiAhYnJvd3Nlck5hbWUpIHtcbiAgICAgIGxldCBlbnRyaWVzXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQoXCJsb2djYXRcIilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nY2F0TG9ncyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaCA/IG1lc3NhZ2VNYXRjaFs0XSA6IGVudHJ5Lm1lc3NhZ2VcblxuICAgICAgICBsb2djYXRMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9nY2F0TG9nc1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgdGVzdElkU3RyYXRlZ3kgPSB0aGlzLm9wdGlvbnMudGVzdElkU3RyYXRlZ3kgPz8gXCJhY2Nlc3NpYmlsaXR5SWRcIlxuXG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImNzc1wiKSB7XG4gICAgICBjb25zdCB0ZXN0SWRBdHRyaWJ1dGUgPSB0aGlzLm9wdGlvbnMudGVzdElkQXR0cmlidXRlID8/IFwiZGF0YS10ZXN0aWRcIlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgWyR7dGVzdElkQXR0cmlidXRlfT0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuICAgIH1cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElELCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCJhY2Nlc3NpYmlsaXR5IGlkXCIsIHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBkaXNwbGF5ZWQuIEZvciBuYXRpdmUgYXBwIGNvbnRleHRzLCBhbHdheXNcbiAgICogcmV0dXJucyB0cnVlIGJlY2F1c2UgU2VsZW5pdW0ncyBpc0Rpc3BsYXllZCgpIEpTIGF0b20gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBieSBVaUF1dG9tYXRvcjIgaW4gbmF0aXZlIG1vZGUsIGFuZCBlbGVtZW50cyBmb3VuZCBieSBVaUF1dG9tYXRvcjInc1xuICAgKiBhY2Nlc3NpYmlsaXR5IGlkIC8gaWQgc2VhcmNoIGFyZSBhbHJlYWR5IGluIHRoZSByZW5kZXJlZCB2aWV3IGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkgJiYgYXJncy5zY3JvbGxUbykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyh0aGlzLmlkTG9jYXRvcih0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpZCBsb2NhdG9yIGZvciB0aGUgYWN0aXZlIEFwcGl1bSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFRlc3QgaWQgb3IgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge0J5fSBTZWxlbml1bS9BcHBpdW0gbG9jYXRvci5cbiAgICovXG4gIGlkTG9jYXRvcih0ZXN0SWQpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIEJ5LmlkKHRlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBOYXRpdmUgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZXh0LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeU5hdGl2ZVRleHQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBBbmRyb2lkIEFwcGl1bSBzZXNzaW9uc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFthbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpXVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGVsZW1lbnRzWzBdXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBieSB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYHRleHQgb3IgYWNjZXNzaWJpbGl0eSBsYWJlbDogJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBzZWxlY3RvcnNcbiAgICAgIH0sIHsuLi5hcmdzLCBzY3JvbGxUbzogYXJncy5zY3JvbGxUbyA/PyB0cnVlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgbmF0aXZlIEFuZHJvaWQgY29udHJvbCBieSByZXNvdXJjZSBpZCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyBmaXJzdCB3aGVuIHJlcXVlc3RlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBNYXRjaGluZyBuYXRpdmUgZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZpbmRCeUlkKHRlc3RJZCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDAsIHNjcm9sbFRvOiBmYWxzZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy53aXRoTmF0aXZlSW1wbGljaXRXYWl0KDAsIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgaWQ6ICR7dGVzdElkfWAsXG4gICAgICAgIGRpcmVjdEZpbmQsXG4gICAgICAgIHNjcm9sbFNlbGVjdG9yczogW2FuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKV1cbiAgICAgIH0sIGFyZ3MpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG5hdGl2ZSBjb250cm9sLCB0cnlpbmcgZGlyZWN0IGxvb2t1cCwgVWlTY3JvbGxhYmxlLCBhbmQgdmlld3BvcnQgZ2VzdHVyZSBzY3JvbGxpbmcuXG4gICAqIEBwYXJhbSB7TmF0aXZlQ29udHJvbExvb2t1cH0gbG9va3VwIExvb2t1cCBjYWxsYmFja3MgYW5kIGRpYWdub3N0aWNzLlxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKGxvb2t1cCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3Njcm9sbENvbnRhaW5lclRlc3RJRHMgPSBbXSwgc2Nyb2xsVG8gPSB0cnVlLCB0aW1lb3V0ID0gMTAwMDB9ID0gYXJnc1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCB2aWV3cG9ydFNjcm9sbFN0YXRlID0ge1xuICAgICAgdHJ5RWxlbWVudFNjcm9sbDogdHJ1ZSxcbiAgICAgIHRyeVZpZXdwb3J0U2Nyb2xsOiB0cnVlXG4gICAgfVxuICAgIGxldCBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gZmFsc2VcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IGxhc3RFcnJvclxuXG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGxvb2t1cC5kaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgICBpZiAoIWF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwpIHtcbiAgICAgICAgICBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gdHJ1ZVxuICAgICAgICAgIGZvciAoY29uc3Qgc2Nyb2xsU2VsZWN0b3Igb2YgbG9va3VwLnNjcm9sbFNlbGVjdG9ycykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVVaVNlbGVjdG9ySW50b1ZpZXcoc2Nyb2xsU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgICAgdm9pZCBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVWaWV3cG9ydERvd24odmlld3BvcnRTY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBsb29rdXAuZGlyZWN0RmluZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lb3V0ID09PSAwKSBicmVha1xuICAgICAgYXdhaXQgd2FpdCgxMDApXG4gICAgfSB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpXG5cbiAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSAke2xvb2t1cC5kZXNjcmlwdGlvbn1gLCBsYXN0RXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBsaWNpdCBuYXRpdmUgcG9sbGluZyB3aXRob3V0IEFwcGl1bSdzIGltcGxpY2l0IHdhaXQgZXh0ZW5kaW5nIGV2ZXJ5IGZhaWxlZCBwcm9iZS5cbiAgICogQHRlbXBsYXRlIFRSZXN1bHQgUmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbXBsaWNpdFdhaXRNcyBJbXBsaWNpdCB3YWl0IGR1cmF0aW9uIHRvIGFwcGx5IGR1cmluZyB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUUmVzdWx0Pn0gY2FsbGJhY2sgV29yayB0aGF0IG93bnMgaXRzIG93biBwb2xsaW5nIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRSZXN1bHQ+fSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoTmF0aXZlSW1wbGljaXRXYWl0KGltcGxpY2l0V2FpdE1zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHRpbWVvdXRzID0gLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0c30gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuZ2V0VGltZW91dHMoKSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0T3B0aW9uc30gKi8gKHtpbXBsaWNpdDogaW1wbGljaXRXYWl0TXN9KSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiB0aW1lb3V0cy5pbXBsaWNpdH0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSB2aXNpYmxlIG5hdGl2ZSB2aWV3cG9ydCBkb3duIHdoZW4gVWlTY3JvbGxhYmxlIGNhbm5vdCBpZGVudGlmeSB0aGUgb3duaW5nIFNjcm9sbFZpZXcuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZX0gc2Nyb2xsU3RhdGUgUGVyLWxvb2t1cCBBcHBpdW0gc2Nyb2xsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY3JvbGxDb250YWluZXJUZXN0SURzIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IG1heSBpZGVudGlmeSBzY3JvbGwgY29udGFpbmVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIGFmdGVyIEFwcGl1bSBwZXJmb3JtcyB0aGUgZ2VzdHVyZS5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZVZpZXdwb3J0RG93bihzY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgIGNvbnN0IHdpbmRvd1JlY3QgPSAvKiogQHR5cGUge05hdGl2ZVdpbmRvd1JlY3R9ICovIChhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLndpbmRvdygpLmdldFJlY3QoKSlcbiAgICBjb25zdCBob3Jpem9udGFsSW5zZXQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3Qud2lkdGggKiAwLjEpKVxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC5oZWlnaHQgKiAwLjIpKVxuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgd2luZG93UmVjdC53aWR0aCAtIGhvcml6b250YWxJbnNldCAqIDIpXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuNikpXG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCAmJiBzY3JvbGxDb250YWluZXJUZXN0SURzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgc2Nyb2xsQ29udGFpbmVyVGVzdElEIG9mIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkaWRTY3JvbGwgPSBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZUVsZW1lbnREb3duKHNjcm9sbENvbnRhaW5lclRlc3RJRClcbiAgICAgICAgICBpZiAoZGlkU2Nyb2xsKSByZXR1cm5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFN0YXRlLnRyeUVsZW1lbnRTY3JvbGwgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlWaWV3cG9ydFNjcm9sbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgICAgICBkaXJlY3Rpb246IFwiZG93blwiLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBsZWZ0OiBob3Jpem9udGFsSW5zZXQsXG4gICAgICAgICAgcGVyY2VudDogMC43NSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgd2lkdGhcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGRpZFNjcm9sbCA9PT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjZW50ZXJYID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnggKyB3aW5kb3dSZWN0LndpZHRoIC8gMilcbiAgICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueSArIHdpbmRvd1JlY3QuaGVpZ2h0ICogMC43OClcbiAgICBjb25zdCBlbmRZID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnkgKyB3aW5kb3dSZWN0LmhlaWdodCAqIDAuMjgpXG5cbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpXG4gICAgICAuYWN0aW9ucyh7YXN5bmM6IHRydWV9KVxuICAgICAgLm1vdmUoe29yaWdpbjogT3JpZ2luLlZJRVdQT1JULCB4OiBjZW50ZXJYLCB5OiBzdGFydFl9KVxuICAgICAgLnByZXNzKClcbiAgICAgIC5tb3ZlKHtkdXJhdGlvbjogMjUwLCBvcmlnaW46IE9yaWdpbi5WSUVXUE9SVCwgeDogY2VudGVyWCwgeTogZW5kWX0pXG4gICAgICAucmVsZWFzZSgpXG4gICAgICAucGVyZm9ybSgpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBhIHNwZWNpZmljIG5hdGl2ZSBBbmRyb2lkIGVsZW1lbnQgYnkgdGVzdCBpZCB3aGVuIEFwcGl1bSBleHBvc2VzIGl0IGFzIGEgc2Nyb2xsIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgQXBwaXVtIHJlcG9ydGVkIG1vcmUgY29udGVudCB0byBzY3JvbGwuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVFbGVtZW50RG93bih0ZXN0SWQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSkpXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnRzWzBdXG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgIGRpcmVjdGlvbjogXCJkb3duXCIsXG4gICAgICBlbGVtZW50SWQ6IGF3YWl0IHNjcm9sbEVsZW1lbnQuZ2V0SWQoKSxcbiAgICAgIHBlcmNlbnQ6IDAuNzVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRpZFNjcm9sbCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGFuIG9mZnNjcmVlbiBBbmRyb2lkIGNvbnRyb2wgaW50byBhIFNjcm9sbFZpZXctYmFja2VkIG5hdGl2ZSBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aVNlbGVjdG9yIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgVWlBdXRvbWF0b3IgYXR0ZW1wdHMgdGhlIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyh1aVNlbGVjdG9yLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAgIC4uLnNjcm9sbENvbnRhaW5lclRlc3RJRHMubWFwKChzY3JvbGxDb250YWluZXJUZXN0SUQpID0+IGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3Ioc2Nyb2xsQ29udGFpbmVyVGVzdElEKSksXG4gICAgICBcIm5ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKVwiXG4gICAgXVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBmb3IgKGNvbnN0IHNjcm9sbGFibGVTZWxlY3RvciBvZiBzY3JvbGxhYmxlU2VsZWN0b3JzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGBuZXcgVWlTY3JvbGxhYmxlKCR7c2Nyb2xsYWJsZVNlbGVjdG9yfSkuc2Nyb2xsSW50b1ZpZXcoJHt1aVNlbGVjdG9yfSlgKSlcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGFzdEVycm9yKSB0aHJvdyBsYXN0RXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGEgbmF0aXZlIEFuZHJvaWQgYXBwLCBub3QgQW5kcm9pZCBDaHJvbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIHdoZW4gVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgbG9va3VwIHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybU5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5wbGF0Zm9ybU5hbWVcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuXG4gICAgcmV0dXJuIHR5cGVvZiBwbGF0Zm9ybU5hbWUgPT09IFwic3RyaW5nXCIgJiYgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYW5kcm9pZFwiICYmICFicm93c2VyTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gc2VydmVyQXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgYnVpbGRTZXJ2ZXJVcmwoc2VydmVyQXJncykge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXJBcmdzLmFkZHJlc3MgPz8gXCIxMjcuMC4wLjFcIlxuICAgIGNvbnN0IHBvcnQgPSBzZXJ2ZXJBcmdzLnBvcnQgPz8gNDcyM1xuICAgIGNvbnN0IGJhc2VQYXRoID0gc2VydmVyQXJncy5iYXNlUGF0aCA/IChzZXJ2ZXJBcmdzLmJhc2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gc2VydmVyQXJncy5iYXNlUGF0aCA6IGAvJHtzZXJ2ZXJBcmdzLmJhc2VQYXRofWApIDogXCJcIlxuXG4gICAgcmV0dXJuIGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9JHtiYXNlUGF0aH1gXG4gIH1cbn1cbiJdfQ==
@@ -135,6 +135,13 @@ export default class WebDriverDriver {
135
135
  * @returns {Promise<import("selenium-webdriver").WebElement>}
136
136
  */
137
137
  findByTestID(testID: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
138
+ /**
139
+ * Finds native Android visible text or an accessibility label.
140
+ * @param {string} expectedText Text to locate.
141
+ * @param {FindArgs} [args] Optional lookup settings.
142
+ * @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
143
+ */
144
+ findByNativeText(expectedText: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
138
145
  /**
139
146
  * Checks whether an element with the given test ID is currently rendered.
140
147
  * @param {string} testID
@@ -289,6 +296,10 @@ export type FindArgs = {
289
296
  * Whether to scroll found elements into view before returning them.
290
297
  */
291
298
  scrollTo?: boolean | undefined;
299
+ /**
300
+ * Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
301
+ */
302
+ scrollContainerTestIDs?: string[] | undefined;
292
303
  /**
293
304
  * Whether to scope by the base selector.
294
305
  */