@seniorsistemas/angular-components 19.9.1 → 19.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/spotlight/lib/spotlight/spotlight-overlay/rect-stability.mjs +61 -0
- package/esm2022/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.mjs +91 -21
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +150 -20
- package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -1
- package/package.json +7 -7
- package/spotlight/README.md +28 -0
- package/spotlight/lib/spotlight/spotlight-overlay/rect-stability.d.ts +32 -0
- package/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.d.ts +33 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitário puro (sem dependência de Angular/NgZone) para aguardar até que a posição
|
|
3
|
+
* e o tamanho de um elemento parem de mudar — usado para medir corretamente elementos
|
|
4
|
+
* que podem estar em transição/animação (ex: um menu abrindo) no momento em que o
|
|
5
|
+
* Spotlight precisa apontar para eles.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_RECT_STABILITY_OPTIONS = {
|
|
8
|
+
requiredStableSamples: 3,
|
|
9
|
+
tolerancePx: 0.5,
|
|
10
|
+
maxWaitMs: 600,
|
|
11
|
+
};
|
|
12
|
+
function isRectStable(a, b, tolerancePx) {
|
|
13
|
+
return (Math.abs(a.top - b.top) <= tolerancePx &&
|
|
14
|
+
Math.abs(a.left - b.left) <= tolerancePx &&
|
|
15
|
+
Math.abs(a.width - b.width) <= tolerancePx &&
|
|
16
|
+
Math.abs(a.height - b.height) <= tolerancePx);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Faz polling de `el.getBoundingClientRect()` em frames sucessivos até que
|
|
20
|
+
* `requiredStableSamples` amostras consecutivas sejam iguais (dentro de `tolerancePx`),
|
|
21
|
+
* ou até que `maxWaitMs` seja atingido — o que ocorrer primeiro.
|
|
22
|
+
*
|
|
23
|
+
* `scheduleFrame`/`cancelFrame`/`now` são injetáveis para permitir testes determinísticos;
|
|
24
|
+
* por padrão usam as APIs nativas do navegador.
|
|
25
|
+
*/
|
|
26
|
+
export function waitForStableRect(el, options = DEFAULT_RECT_STABILITY_OPTIONS, scheduleFrame = requestAnimationFrame, cancelFrame = cancelAnimationFrame, now = () => performance.now()) {
|
|
27
|
+
let cancelled = false;
|
|
28
|
+
let frameHandle = 0;
|
|
29
|
+
let resolveFn;
|
|
30
|
+
const promise = new Promise((resolve) => {
|
|
31
|
+
resolveFn = resolve;
|
|
32
|
+
});
|
|
33
|
+
const startedAt = now();
|
|
34
|
+
let lastRect = el.getBoundingClientRect();
|
|
35
|
+
let stableCount = 1;
|
|
36
|
+
const tick = () => {
|
|
37
|
+
if (cancelled)
|
|
38
|
+
return;
|
|
39
|
+
const rect = el.getBoundingClientRect();
|
|
40
|
+
stableCount = isRectStable(rect, lastRect, options.tolerancePx) ? stableCount + 1 : 1;
|
|
41
|
+
lastRect = rect;
|
|
42
|
+
if (stableCount >= options.requiredStableSamples) {
|
|
43
|
+
resolveFn({ rect, timedOut: false });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (now() - startedAt >= options.maxWaitMs) {
|
|
47
|
+
resolveFn({ rect, timedOut: true });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
frameHandle = scheduleFrame(tick);
|
|
51
|
+
};
|
|
52
|
+
frameHandle = scheduleFrame(tick);
|
|
53
|
+
return {
|
|
54
|
+
promise,
|
|
55
|
+
cancel: () => {
|
|
56
|
+
cancelled = true;
|
|
57
|
+
cancelFrame(frameHandle);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdC1zdGFiaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1vdmVybGF5L3JlY3Qtc3RhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBV0gsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQXlCO0lBQ2hFLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsU0FBUyxFQUFFLEdBQUc7Q0FDakIsQ0FBQztBQVlGLFNBQVMsWUFBWSxDQUFDLENBQVUsRUFBRSxDQUFVLEVBQUUsV0FBbUI7SUFDN0QsT0FBTyxDQUNILElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksV0FBVztRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVc7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxXQUFXO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUMvQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLEVBQWUsRUFDZixVQUFnQyw4QkFBOEIsRUFDOUQsZ0JBQXNELHFCQUFxQixFQUMzRSxjQUF3QyxvQkFBb0IsRUFDNUQsTUFBb0IsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtJQUUzQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLElBQUksU0FBOEMsQ0FBQztJQUVuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBbUIsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUN0RCxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDeEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDMUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLE1BQU0sSUFBSSxHQUFHLEdBQVMsRUFBRTtRQUNwQixJQUFJLFNBQVM7WUFBRSxPQUFPO1FBRXRCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3hDLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRWhCLElBQUksV0FBVyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNyQyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksR0FBRyxFQUFFLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEMsT0FBTztRQUNYLENBQUM7UUFDRCxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztJQUVGLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbEMsT0FBTztRQUNILE9BQU87UUFDUCxNQUFNLEVBQUUsR0FBUyxFQUFFO1lBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNqQixXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0IsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXTDoXJpbyBwdXJvIChzZW0gZGVwZW5kw6puY2lhIGRlIEFuZ3VsYXIvTmdab25lKSBwYXJhIGFndWFyZGFyIGF0w6kgcXVlIGEgcG9zacOnw6NvXG4gKiBlIG8gdGFtYW5obyBkZSB1bSBlbGVtZW50byBwYXJlbSBkZSBtdWRhciDigJQgdXNhZG8gcGFyYSBtZWRpciBjb3JyZXRhbWVudGUgZWxlbWVudG9zXG4gKiBxdWUgcG9kZW0gZXN0YXIgZW0gdHJhbnNpw6fDo28vYW5pbWHDp8OjbyAoZXg6IHVtIG1lbnUgYWJyaW5kbykgbm8gbW9tZW50byBlbSBxdWUgb1xuICogU3BvdGxpZ2h0IHByZWNpc2EgYXBvbnRhciBwYXJhIGVsZXMuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSZWN0U3RhYmlsaXR5T3B0aW9ucyB7XG4gICAgLyoqIFF1YW50YXMgYW1vc3RyYXMgY29uc2VjdXRpdmFzIGRlbnRybyBkYSB0b2xlcsOibmNpYSBkZWZpbmVtIFwiZXN0w6F2ZWxcIi4gKi9cbiAgICByZXF1aXJlZFN0YWJsZVNhbXBsZXM6IG51bWJlcjtcbiAgICAvKiogRGlmZXJlbsOnYSBtw6F4aW1hIChweCkgZW50cmUgZHVhcyBhbW9zdHJhcyBwYXJhIHNlcmVtIGNvbnNpZGVyYWRhcyBpZ3VhaXMuICovXG4gICAgdG9sZXJhbmNlUHg6IG51bWJlcjtcbiAgICAvKiogVGV0byBkZSBzZWd1cmFuw6dhIChtcykg4oCUIG51bmNhIGVzcGVyYXIgYWzDqW0gZGlzc28uICovXG4gICAgbWF4V2FpdE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFQ1RfU1RBQklMSVRZX09QVElPTlM6IFJlY3RTdGFiaWxpdHlPcHRpb25zID0ge1xuICAgIHJlcXVpcmVkU3RhYmxlU2FtcGxlczogMyxcbiAgICB0b2xlcmFuY2VQeDogMC41LFxuICAgIG1heFdhaXRNczogNjAwLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFibGVSZWN0UmVzdWx0IHtcbiAgICByZWN0OiBET01SZWN0O1xuICAgIHRpbWVkT3V0OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWJpbGl6ZUhhbmRsZSB7XG4gICAgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxTdGFibGVSZWN0UmVzdWx0PjtcbiAgICBjYW5jZWwoKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gaXNSZWN0U3RhYmxlKGE6IERPTVJlY3QsIGI6IERPTVJlY3QsIHRvbGVyYW5jZVB4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBNYXRoLmFicyhhLnRvcCAtIGIudG9wKSA8PSB0b2xlcmFuY2VQeCAmJlxuICAgICAgICBNYXRoLmFicyhhLmxlZnQgLSBiLmxlZnQpIDw9IHRvbGVyYW5jZVB4ICYmXG4gICAgICAgIE1hdGguYWJzKGEud2lkdGggLSBiLndpZHRoKSA8PSB0b2xlcmFuY2VQeCAmJlxuICAgICAgICBNYXRoLmFicyhhLmhlaWdodCAtIGIuaGVpZ2h0KSA8PSB0b2xlcmFuY2VQeFxuICAgICk7XG59XG5cbi8qKlxuICogRmF6IHBvbGxpbmcgZGUgYGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpYCBlbSBmcmFtZXMgc3VjZXNzaXZvcyBhdMOpIHF1ZVxuICogYHJlcXVpcmVkU3RhYmxlU2FtcGxlc2AgYW1vc3RyYXMgY29uc2VjdXRpdmFzIHNlamFtIGlndWFpcyAoZGVudHJvIGRlIGB0b2xlcmFuY2VQeGApLFxuICogb3UgYXTDqSBxdWUgYG1heFdhaXRNc2Agc2VqYSBhdGluZ2lkbyDigJQgbyBxdWUgb2NvcnJlciBwcmltZWlyby5cbiAqXG4gKiBgc2NoZWR1bGVGcmFtZWAvYGNhbmNlbEZyYW1lYC9gbm93YCBzw6NvIGluamV0w6F2ZWlzIHBhcmEgcGVybWl0aXIgdGVzdGVzIGRldGVybWluw61zdGljb3M7XG4gKiBwb3IgcGFkcsOjbyB1c2FtIGFzIEFQSXMgbmF0aXZhcyBkbyBuYXZlZ2Fkb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0Rm9yU3RhYmxlUmVjdChcbiAgICBlbDogSFRNTEVsZW1lbnQsXG4gICAgb3B0aW9uczogUmVjdFN0YWJpbGl0eU9wdGlvbnMgPSBERUZBVUxUX1JFQ1RfU1RBQklMSVRZX09QVElPTlMsXG4gICAgc2NoZWR1bGVGcmFtZTogKGNiOiBGcmFtZVJlcXVlc3RDYWxsYmFjaykgPT4gbnVtYmVyID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuICAgIGNhbmNlbEZyYW1lOiAoaGFuZGxlOiBudW1iZXIpID0+IHZvaWQgPSBjYW5jZWxBbmltYXRpb25GcmFtZSxcbiAgICBub3c6ICgpID0+IG51bWJlciA9ICgpID0+IHBlcmZvcm1hbmNlLm5vdygpLFxuKTogU3RhYmlsaXplSGFuZGxlIHtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgbGV0IGZyYW1lSGFuZGxlID0gMDtcbiAgICBsZXQgcmVzb2x2ZUZuITogKHJlc3VsdDogU3RhYmxlUmVjdFJlc3VsdCkgPT4gdm9pZDtcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxTdGFibGVSZWN0UmVzdWx0PigocmVzb2x2ZSkgPT4ge1xuICAgICAgICByZXNvbHZlRm4gPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbm93KCk7XG4gICAgbGV0IGxhc3RSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHN0YWJsZUNvdW50ID0gMTtcblxuICAgIGNvbnN0IHRpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHN0YWJsZUNvdW50ID0gaXNSZWN0U3RhYmxlKHJlY3QsIGxhc3RSZWN0LCBvcHRpb25zLnRvbGVyYW5jZVB4KSA/IHN0YWJsZUNvdW50ICsgMSA6IDE7XG4gICAgICAgIGxhc3RSZWN0ID0gcmVjdDtcblxuICAgICAgICBpZiAoc3RhYmxlQ291bnQgPj0gb3B0aW9ucy5yZXF1aXJlZFN0YWJsZVNhbXBsZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVGbih7IHJlY3QsIHRpbWVkT3V0OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm93KCkgLSBzdGFydGVkQXQgPj0gb3B0aW9ucy5tYXhXYWl0TXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVGbih7IHJlY3QsIHRpbWVkT3V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZyYW1lSGFuZGxlID0gc2NoZWR1bGVGcmFtZSh0aWNrKTtcbiAgICB9O1xuXG4gICAgZnJhbWVIYW5kbGUgPSBzY2hlZHVsZUZyYW1lKHRpY2spO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvbWlzZSxcbiAgICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2FuY2VsRnJhbWUoZnJhbWVIYW5kbGUpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbiJdfQ==
|
|
@@ -7,6 +7,7 @@ import { ComponentPortal } from '@angular/cdk/portal';
|
|
|
7
7
|
import { combineLatest, debounceTime, fromEvent } from 'rxjs';
|
|
8
8
|
import { SpotlightComponent } from '../spotlight.component';
|
|
9
9
|
import { SpotlightTourService } from '../spotlight-tour.service';
|
|
10
|
+
import { waitForStableRect } from './rect-stability';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
const POPOVER_WIDTH = 342;
|
|
12
13
|
const SPOTLIGHT_PADDING = 8;
|
|
@@ -17,6 +18,8 @@ const MASK_BG = 'rgba(0,0,0,0.5)';
|
|
|
17
18
|
const MASK_TRANSITION = 'all 0.2s ease';
|
|
18
19
|
const OVERLAY_Z = '10000';
|
|
19
20
|
const POPOVER_Z = '10001';
|
|
21
|
+
/** Tempo máximo de espera pelo registro do elemento-alvo (ex: criado dinamicamente dentro de `beforeNext`) antes de recorrer ao popover centralizado. */
|
|
22
|
+
const ELEMENT_WAIT_TIMEOUT_MS = 500;
|
|
20
23
|
function toConnectedPositions(position) {
|
|
21
24
|
const [direction, alignment] = position.split('-');
|
|
22
25
|
const p = SPOTLIGHT_PADDING + 2;
|
|
@@ -68,6 +71,13 @@ export class SpotlightOverlayComponent {
|
|
|
68
71
|
totalSteps = this.tourService.totalSteps;
|
|
69
72
|
/** @internal*/
|
|
70
73
|
targetRect = signal(null);
|
|
74
|
+
/**
|
|
75
|
+
* Controla se a máscara deve animar a transição entre retângulos (reposicionamento
|
|
76
|
+
* em vivo, ex: scroll/resize) ou saltar instantaneamente (chegada/saída de um passo).
|
|
77
|
+
* Ver `setTargetRectImmediate`.
|
|
78
|
+
*/
|
|
79
|
+
maskTransitionEnabled = signal(true);
|
|
80
|
+
maskTransitionStyle = computed(() => this.maskTransitionEnabled() ? MASK_TRANSITION : 'none');
|
|
71
81
|
/** @internal */
|
|
72
82
|
topMaskStyle = computed(() => {
|
|
73
83
|
const rect = this.targetRect();
|
|
@@ -75,7 +85,7 @@ export class SpotlightOverlayComponent {
|
|
|
75
85
|
position: 'fixed',
|
|
76
86
|
'z-index': OVERLAY_Z,
|
|
77
87
|
background: MASK_BG,
|
|
78
|
-
transition:
|
|
88
|
+
transition: this.maskTransitionStyle(),
|
|
79
89
|
cursor: 'default',
|
|
80
90
|
};
|
|
81
91
|
if (!rect) {
|
|
@@ -98,7 +108,7 @@ export class SpotlightOverlayComponent {
|
|
|
98
108
|
position: 'fixed',
|
|
99
109
|
'z-index': OVERLAY_Z,
|
|
100
110
|
background: MASK_BG,
|
|
101
|
-
transition:
|
|
111
|
+
transition: this.maskTransitionStyle(),
|
|
102
112
|
cursor: 'default',
|
|
103
113
|
top: `${top}px`,
|
|
104
114
|
left: '0',
|
|
@@ -120,7 +130,7 @@ export class SpotlightOverlayComponent {
|
|
|
120
130
|
position: 'fixed',
|
|
121
131
|
'z-index': OVERLAY_Z,
|
|
122
132
|
background: MASK_BG,
|
|
123
|
-
transition:
|
|
133
|
+
transition: this.maskTransitionStyle(),
|
|
124
134
|
cursor: 'default',
|
|
125
135
|
top: `${top}px`,
|
|
126
136
|
left: `${right}px`,
|
|
@@ -140,7 +150,7 @@ export class SpotlightOverlayComponent {
|
|
|
140
150
|
position: 'fixed',
|
|
141
151
|
'z-index': OVERLAY_Z,
|
|
142
152
|
background: MASK_BG,
|
|
143
|
-
transition:
|
|
153
|
+
transition: this.maskTransitionStyle(),
|
|
144
154
|
cursor: 'default',
|
|
145
155
|
top: `${bottom}px`,
|
|
146
156
|
left: '0',
|
|
@@ -164,6 +174,9 @@ export class SpotlightOverlayComponent {
|
|
|
164
174
|
popoverSubs = [];
|
|
165
175
|
focusTrap = null;
|
|
166
176
|
previouslyFocusedElement = null;
|
|
177
|
+
pendingArrival = null;
|
|
178
|
+
elementWaitTimerId = null;
|
|
179
|
+
stabilizeGeneration = 0;
|
|
167
180
|
constructor() {
|
|
168
181
|
combineLatest([
|
|
169
182
|
toObservable(this.currentStep),
|
|
@@ -173,34 +186,74 @@ export class SpotlightOverlayComponent {
|
|
|
173
186
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
174
187
|
.subscribe(([step, active]) => {
|
|
175
188
|
this.disconnectResizeObserver();
|
|
189
|
+
this.cancelPendingArrival();
|
|
190
|
+
const generation = ++this.stabilizeGeneration;
|
|
176
191
|
if (!step || !active) {
|
|
177
|
-
this.
|
|
192
|
+
this.setTargetRectImmediate(null);
|
|
178
193
|
this.destroyPopoverOverlay();
|
|
179
194
|
return;
|
|
180
195
|
}
|
|
181
196
|
const el = this.tourService.getElement(step.stepId);
|
|
182
197
|
if (el?.nativeElement) {
|
|
183
198
|
el.nativeElement.scrollIntoView({ block: 'nearest' });
|
|
184
|
-
|
|
185
|
-
this.zone.runOutsideAngular(() => {
|
|
186
|
-
requestAnimationFrame(() => {
|
|
187
|
-
this.zone.run(() => {
|
|
188
|
-
if (!this.isActive()) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
this.updateTargetRect(target);
|
|
192
|
-
this.observeElement(target);
|
|
193
|
-
this.updatePopoverOverlay(target, step);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
});
|
|
199
|
+
this.beginArrivalSequence(el.nativeElement, step, generation);
|
|
197
200
|
}
|
|
198
201
|
else {
|
|
199
|
-
this.
|
|
200
|
-
this.updatePopoverOverlay(null, step);
|
|
202
|
+
this.awaitElementRegistration(step, generation);
|
|
201
203
|
}
|
|
202
204
|
});
|
|
203
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Aguarda o layout do elemento-alvo estabilizar (ex: animação de abertura de um menu
|
|
208
|
+
* disparada pelo `beforeNext` do passo anterior) antes de medir sua posição definitiva
|
|
209
|
+
* e posicionar a máscara/popover. Substitui a antiga espera de um único frame, que
|
|
210
|
+
* capturava o retângulo no meio de animações de terceiros na tela.
|
|
211
|
+
*/
|
|
212
|
+
beginArrivalSequence(target, step, generation) {
|
|
213
|
+
this.zone.runOutsideAngular(() => {
|
|
214
|
+
const handle = waitForStableRect(target);
|
|
215
|
+
this.pendingArrival = handle;
|
|
216
|
+
handle.promise.then(({ rect, timedOut }) => {
|
|
217
|
+
this.zone.run(() => {
|
|
218
|
+
if (generation !== this.stabilizeGeneration || !this.isActive()) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (timedOut) {
|
|
222
|
+
console.warn(`[Spotlight] O layout do elemento do passo "${step.stepId}" não estabilizou a tempo; usando a última posição medida.`);
|
|
223
|
+
}
|
|
224
|
+
this.setTargetRectImmediate(rect);
|
|
225
|
+
this.observeElement(target);
|
|
226
|
+
this.updatePopoverOverlay(target, step);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Aguarda até `ELEMENT_WAIT_TIMEOUT_MS` pelo registro do elemento-alvo via
|
|
233
|
+
* `[sSpotlightStep]` (útil quando o `beforeNext` do passo anterior cria o elemento
|
|
234
|
+
* dinamicamente, ex: abrindo uma aba) antes de recorrer ao popover centralizado.
|
|
235
|
+
* Mantém o último quadro renderizado durante a espera para evitar um flash.
|
|
236
|
+
*/
|
|
237
|
+
awaitElementRegistration(step, generation) {
|
|
238
|
+
this.elementWaitTimerId = setTimeout(() => {
|
|
239
|
+
this.zone.run(() => {
|
|
240
|
+
if (generation !== this.stabilizeGeneration) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
console.warn(`[Spotlight] Elemento do passo "${step.stepId}" não foi registrado a tempo; exibindo popover centralizado sem destaque.`);
|
|
244
|
+
this.setTargetRectImmediate(null);
|
|
245
|
+
this.updatePopoverOverlay(null, step);
|
|
246
|
+
});
|
|
247
|
+
}, ELEMENT_WAIT_TIMEOUT_MS);
|
|
248
|
+
}
|
|
249
|
+
cancelPendingArrival() {
|
|
250
|
+
this.pendingArrival?.cancel();
|
|
251
|
+
this.pendingArrival = null;
|
|
252
|
+
if (this.elementWaitTimerId !== null) {
|
|
253
|
+
clearTimeout(this.elementWaitTimerId);
|
|
254
|
+
this.elementWaitTimerId = null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
204
257
|
ngOnInit() {
|
|
205
258
|
this.zone.runOutsideAngular(() => {
|
|
206
259
|
const scrollOpts = { capture: true, passive: true };
|
|
@@ -228,6 +281,7 @@ export class SpotlightOverlayComponent {
|
|
|
228
281
|
});
|
|
229
282
|
}
|
|
230
283
|
ngOnDestroy() {
|
|
284
|
+
this.cancelPendingArrival();
|
|
231
285
|
this.destroyPopoverOverlay();
|
|
232
286
|
}
|
|
233
287
|
/** @internal */
|
|
@@ -442,6 +496,22 @@ export class SpotlightOverlayComponent {
|
|
|
442
496
|
updateTargetRect(el) {
|
|
443
497
|
this.targetRect.set(el.getBoundingClientRect());
|
|
444
498
|
}
|
|
499
|
+
/**
|
|
500
|
+
* Aplica um novo `targetRect` sem animação de transição na máscara — usado ao
|
|
501
|
+
* chegar/saltar para um alvo novo, onde animar a partir da posição do passo
|
|
502
|
+
* anterior criaria a falsa impressão de "apontou errado e corrigiu depois".
|
|
503
|
+
* A transição é reabilitada no frame seguinte para reposicionamentos legítimos
|
|
504
|
+
* (scroll/resize de um alvo já visível).
|
|
505
|
+
*/
|
|
506
|
+
setTargetRectImmediate(rect) {
|
|
507
|
+
this.maskTransitionEnabled.set(false);
|
|
508
|
+
this.targetRect.set(rect);
|
|
509
|
+
this.zone.runOutsideAngular(() => {
|
|
510
|
+
requestAnimationFrame(() => {
|
|
511
|
+
this.zone.run(() => this.maskTransitionEnabled.set(true));
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
}
|
|
445
515
|
refreshRect() {
|
|
446
516
|
const step = this.currentStep();
|
|
447
517
|
if (!step || !this.isActive()) {
|
|
@@ -471,4 +541,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
471
541
|
type: Component,
|
|
472
542
|
args: [{ selector: 's-spotlight-overlay', standalone: true, imports: [NgStyle], template: "@if (isActive() && currentStep(); as step) {\n @if (step.showBackdrop !== false) {\n <div\n [ngStyle]=\"topMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n\n @if (targetRect()) {\n <div\n [ngStyle]=\"leftMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n <div\n [ngStyle]=\"rightMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n <div\n [ngStyle]=\"bottomMaskStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n }\n }\n\n @if (step.showBackdrop === false) {\n @if (step.dismissible === false) {\n <div [ngStyle]=\"transparentBlockerStyle()\"></div>\n } @else {\n <div\n [ngStyle]=\"transparentBlockerStyle()\"\n (click)=\"onDismiss()\"\n ></div>\n }\n }\n}\n\n" }]
|
|
473
543
|
}], ctorParameters: () => [] });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Nwb3RsaWdodC9zcmMvbGliL3Nwb3RsaWdodC9zcG90bGlnaHQtb3ZlcmxheS9zcG90bGlnaHQtb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0gsU0FBUyxFQUVULFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLE1BQU0sRUFDTixNQUFNLEVBR04sTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBSWpFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoRCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQztBQUNsQyxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDeEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQzFCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQztBQUUxQixTQUFTLG9CQUFvQixDQUFDLFFBQTJCO0lBQ3JELE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxNQUFNLENBQUMsR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsU0FBdUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBZ0QsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ2pILE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRLENBQUM7SUFFaEQsSUFBSSxPQUEwQixDQUFDO0lBQy9CLElBQUksUUFBMkIsQ0FBQztJQUVoQyxRQUFRLFNBQVMsRUFBRSxDQUFDO1FBQ2hCLEtBQUssS0FBSztZQUNOLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakcsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakcsTUFBTTtRQUNWLEtBQUssT0FBTztZQUNSLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9GLFFBQVEsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakcsTUFBTTtRQUNWLEtBQUssTUFBTTtZQUNQLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsUUFBUSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEcsTUFBTTtRQUNWLFNBQVMsV0FBVztZQUNoQixPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoRyxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFHLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTztRQUNQ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QUFHLElBQUksQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQzt3R0FyZVEseUJBQXlCOzRGQUF6Qix5QkFBeUIsK0VDOUV0QyxvOEJBbUNBLDRDRHlDYyxPQUFPOzs0RkFFUix5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0kscUJBQXFCLGNBRW5CLElBQUksV0FDUCxDQUFDLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBpbmplY3QsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9jdXNUcmFwLCBGb2N1c1RyYXBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNwb3RsaWdodENvbXBvbmVudCB9IGZyb20gJy4uL3Nwb3RsaWdodC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3BvdGxpZ2h0VG91clNlcnZpY2UgfSBmcm9tICcuLi9zcG90bGlnaHQtdG91ci5zZXJ2aWNlJztcbmltcG9ydCB7IFNwb3RsaWdodFBvc2l0aW9uIH0gZnJvbSAnLi4vdHlwZXMvc3BvdGxpZ2h0LXBvc2l0aW9uJztcbmltcG9ydCB7IFNwb3RsaWdodFN0ZXAgfSBmcm9tICcuLi90eXBlcy9zcG90bGlnaHQtc3RlcCc7XG5cbmNvbnN0IFBPUE9WRVJfV0lEVEggPSAzNDI7XG5jb25zdCBTUE9UTElHSFRfUEFERElORyA9IDg7XG5jb25zdCBBUlJPV19IQUxGX1NJWkUgPSA4O1xuY29uc3QgQVJST1dfT0ZGU0VUX01JTiA9IDQ7XG5jb25zdCBBUlJPV19PRkZTRVRfTUFYID0gUE9QT1ZFUl9XSURUSCAtIDQgLSAxNjtcbmNvbnN0IE1BU0tfQkcgPSAncmdiYSgwLDAsMCwwLjUpJztcbmNvbnN0IE1BU0tfVFJBTlNJVElPTiA9ICdhbGwgMC4ycyBlYXNlJztcbmNvbnN0IE9WRVJMQVlfWiA9ICcxMDAwMCc7XG5jb25zdCBQT1BPVkVSX1ogPSAnMTAwMDEnO1xuXG5mdW5jdGlvbiB0b0Nvbm5lY3RlZFBvc2l0aW9ucyhwb3NpdGlvbjogU3BvdGxpZ2h0UG9zaXRpb24pOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBbZGlyZWN0aW9uLCBhbGlnbm1lbnRdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwID0gU1BPVExJR0hUX1BBRERJTkcgKyAyO1xuICAgIGNvbnN0IGhBbGlnbiA9IGFsaWdubWVudCBhcyAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgICBjb25zdCB2QWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJz4gPSB7IHN0YXJ0OiAndG9wJywgY2VudGVyOiAnY2VudGVyJywgZW5kOiAnYm90dG9tJyB9O1xuICAgIGNvbnN0IHZBbGlnbiA9IHZBbGlnbk1hcFthbGlnbm1lbnRdID8/ICdjZW50ZXInO1xuXG4gICAgbGV0IHByaW1hcnk6IENvbm5lY3RlZFBvc2l0aW9uO1xuICAgIGxldCBvcHBvc2l0ZTogQ29ubmVjdGVkUG9zaXRpb247XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgcHJpbWFyeSA9IHsgb3JpZ2luWDogaEFsaWduLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6IGhBbGlnbiwgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtcCB9O1xuICAgICAgICAgICAgb3Bwb3NpdGUgPSB7IG9yaWdpblg6IGhBbGlnbiwgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiBoQWxpZ24sIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHByaW1hcnkgPSB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogdkFsaWduLCBvZmZzZXRYOiBwIH07XG4gICAgICAgICAgICBvcHBvc2l0ZSA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiB2QWxpZ24sIG9mZnNldFg6IC1wIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogLXAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vICdib3R0b20nXG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IHAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHJpbWFyeSxcbiAgICAgICAgb3Bwb3NpdGUsXG4gICAgICAgIHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiBwIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiAtcCB9LFxuICAgIF07XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zcG90bGlnaHQtb3ZlcmxheScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ1N0eWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvdXJTZXJ2aWNlID0gaW5qZWN0KFNwb3RsaWdodFRvdXJTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZGtPdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvY3VzVHJhcEZhY3RvcnkgPSBpbmplY3QoRm9jdXNUcmFwRmFjdG9yeSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgaXNBY3RpdmUgPSB0aGlzLnRvdXJTZXJ2aWNlLmlzQWN0aXZlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBjdXJyZW50U3RlcCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudFN0ZXA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGN1cnJlbnRJbmRleCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudEluZGV4O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSB0b3RhbFN0ZXBzID0gdGhpcy50b3VyU2VydmljZS50b3RhbFN0ZXBzO1xuXG4gICAgLyoqIEBpbnRlcm5hbCovXG4gICAgcmVhZG9ubHkgdGFyZ2V0UmVjdCA9IHNpZ25hbDxET01SZWN0IHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgdG9wTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGJvdHRvbTogJzAnIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBTUE9UTElHSFRfUEFERElORyk7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGhlaWdodDogYCR7dG9wfXB4YCB9O1xuICAgIH0pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGxlZnRNYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcCA9IFNQT1RMSUdIVF9QQURESU5HO1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCAtIHApO1xuICAgICAgICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgcCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heCgwLCByZWN0LmxlZnQgLSBwKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IE1BU0tfQkcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBNQVNLX1RSQU5TSVRJT04sXG4gICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgIHdpZHRoOiBgJHtsZWZ0fXB4YCxcbiAgICAgICAgICAgIGhlaWdodDogYCR7Ym90dG9tIC0gdG9wfXB4YCxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSByaWdodE1hc2tTdHlsZSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuXG4gICAgICAgIGlmICghcmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwID0gU1BPVExJR0hUX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wIC0gcCk7XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20gKyBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgcmVjdC5yaWdodCArIHApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgICAgICAgbGVmdDogYCR7cmlnaHR9cHhgLFxuICAgICAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgICAgIGhlaWdodDogYCR7Ym90dG9tIC0gdG9wfXB4YCxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBib3R0b21NYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcCA9IFNQT1RMSUdIVF9QQURESU5HO1xuICAgICAgICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgcCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgJ3otaW5kZXgnOiBPVkVSTEFZX1osXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogTUFTS19UUkFOU0lUSU9OLFxuICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0b3A6IGAke2JvdHRvbX1weGAsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgdHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiAoe1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICB9KSk7XG5cbiAgICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcG9wb3Zlck92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTcG90bGlnaHRDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwb3BvdmVyU3ViczogQXJyYXk8eyB1bnN1YnNjcmliZSgpOiB2b2lkIH0+ID0gW107XG4gICAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuY3VycmVudFN0ZXApLFxuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuaXNBY3RpdmUpLFxuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMudG91clNlcnZpY2UucmVnaXN0cmF0aW9uVmVyc2lvbiksXG4gICAgICAgIF0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKFtzdGVwLCBhY3RpdmVdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIoKTtcblxuICAgICAgICAgICAgICAgIGlmICghc3RlcCB8fCAhYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMudG91clNlcnZpY2UuZ2V0RWxlbWVudChzdGVwLnN0ZXBJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlRWxlbWVudCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJPdmVybGF5KHRhcmdldCwgc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRSZWN0LnNldChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheShudWxsLCBzdGVwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbE9wdHMgPSB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucztcblxuICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgc2Nyb2xsT3B0cylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25EaXNtaXNzKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvbk5leHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2UubmV4dCgpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvblByZXZpb3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnByZXZpb3VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCgpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvbkRpc21pc3MoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICAgICAgaWYgKCFzdGVwIHx8IHN0ZXAuZGlzbWlzc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnN0b3Aoe1xuICAgICAgICAgICAgcmVhc29uOiB0aGlzLnRvdGFsU3RlcHMoKSA9PT0gMSA/ICdkaXNtaXNzZWQnIDogJ2ludGVycnVwdGVkJyxcbiAgICAgICAgICAgIGRvTm90U2hvd0FnYWluOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQb3BvdmVyT3ZlcmxheSh0YXJnZXRFbDogSFRNTEVsZW1lbnQgfCBudWxsLCBzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGFyZ2V0RWxcbiAgICAgICAgICAgID8gdGhpcy5jZGtPdmVybGF5XG4gICAgICAgICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0RWwpXG4gICAgICAgICAgICAgICAgICAud2l0aFBvc2l0aW9ucyh0b0Nvbm5lY3RlZFBvc2l0aW9ucyhzdGVwLnBvc2l0aW9uID8/ICdib3R0b20tY2VudGVyJykpXG4gICAgICAgICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIC53aXRoUHVzaCh0cnVlKVxuICAgICAgICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgICAgICAgOiB0aGlzLmNka092ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPdmVybGF5UmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmID0gdGhpcy5jZGtPdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0YXJnZXRFbFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2RrT3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY2RrT3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgICAgICAgICAgICB3aWR0aDogUE9QT1ZFUl9XSURUSCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNldFBvcG92ZXJaSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoUG9wb3ZlclBvcnRhbChzdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb25TdHJhdGVneShzdHJhdGVneSk7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJJbnB1dHMoc3RlcCk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0RWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlU3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZvY3VzVHJhcFJlZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UG9wb3ZlclpJbmRleCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcG92ZXJPdmVybGF5UmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLnpJbmRleCA9IFBPUE9WRVJfWjtcblxuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi5ob3N0RWxlbWVudDtcblxuICAgICAgICBpZiAoaG9zdCAhPT0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudCkge1xuICAgICAgICAgICAgaG9zdC5zdHlsZS56SW5kZXggPSBQT1BPVkVSX1o7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaFBvcG92ZXJQb3J0YWwoc3RlcDogU3BvdGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChTcG90bGlnaHRDb21wb25lbnQsIG51bGwsIHRoaXMuZW52aXJvbm1lbnRJbmplY3Rvcik7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IHRoaXMucG9wb3Zlck92ZXJsYXlSZWYhLmF0dGFjaChwb3J0YWwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBvcG92ZXJJbnB1dHMoc3RlcCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudG90YWxTdGVwcygpID4gMSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVRvdXJNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3BvdmVyU3Vicy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLm5leHQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb05vdFNob3dBZ2FpbiA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZj8uaW5zdGFuY2UuaXNEb05vdFNob3dBZ2FpbkNoZWNrZWQoKSA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLm5leHQoZG9Ob3RTaG93QWdhaW4pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UucHJldmlvdXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKSksXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuY2xvc2VkLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogdGhpcy50b3RhbFN0ZXBzKCkgPT09IDEgPyAnZGlzbWlzc2VkJyA6ICdpbnRlcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRvTm90U2hvd0FnYWluOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UudW5kZXJzdGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvTm90U2hvd0FnYWluID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7IHJlYXNvbjogJ2NvbXBsZXRlZCcsIGRvTm90U2hvd0FnYWluIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXA6IFNwb3RsaWdodFN0ZXAgJiB7IHNob3dEb05vdFNob3dBZ2Fpbj86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWYgPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWY7XG5cbiAgICAgICAgaWYgKCFyZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZi5zZXRJbnB1dCgndGl0bGUnLCBzdGVwLnRpdGxlKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdtZXNzYWdlJywgc3RlcC5tZXNzYWdlKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdwb3NpdGlvbicsIHN0ZXAucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdjdXJyZW50U3RlcCcsIHRoaXMuY3VycmVudEluZGV4KCkgKyAxKTtcbiAgICAgICAgcmVmLnNldElucHV0KCd0b3RhbFN0ZXBzJywgdGhpcy50b3RhbFN0ZXBzKCkpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ2NvbnRlbnQnLCBzdGVwLmNvbnRlbnQgPz8gbnVsbCk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnYWN0aW9ucycsIHN0ZXAuYWN0aW9ucyA/PyBbXSk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnc2hvd0RvTm90U2hvd0FnYWluJywgc3RlcC5zaG93RG9Ob3RTaG93QWdhaW4gPz8gdHJ1ZSk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnYXJyb3dPZmZzZXRQeCcsIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVTeW5jKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5zeW5jRGlyZWN0aW9uQW5kQXJyb3coKSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlVG91ck1vZGUoKTogdm9pZCB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVFbCA9IHRoaXMucG9wb3Zlck92ZXJsYXlSZWY/Lm92ZXJsYXlFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZUVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMuZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUocGFuZUVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGEgc3RlcCBjaGFuZ2UsIG1vdmVzIGZvY3VzIGJhY2sgdG8gdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQgaW5zaWRlIHRoZVxuICAgICAqIHBvcG92ZXIgc28gdGhlIHVzZXIgZG9lcyBub3QgbG9zZSBrZXlib2FyZCBwb3NpdGlvbi5cbiAgICAgKiBOby1vcCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBmb2N1cyB0cmFwIChzaW1wbGUgc3BvdGxpZ2h0IG1vZGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2NoZWR1bGVGb2N1c1RyYXBSZWZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSByZXR1cm47XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c1RyYXA/LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jRGlyZWN0aW9uQW5kQXJyb3coKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZjtcbiAgICAgICAgY29uc3QgcGFuZUVsID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlZiB8fCAhcGFuZUVsIHx8ICFyZWN0KSB7XG4gICAgICAgICAgICByZWY/LnNldElucHV0KCdhcnJvd09mZnNldFB4JywgbnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYW5lID0gcGFuZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0b2wgPSBTUE9UTElHSFRfUEFERElORyArIDQ7XG5cbiAgICAgICAgbGV0IGRpcjogJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCc7XG5cbiAgICAgICAgaWYgKHBhbmUudG9wID49IHJlY3QuYm90dG9tIC0gdG9sKSB7XG4gICAgICAgICAgICBkaXIgPSAnYm90dG9tJztcbiAgICAgICAgfSBlbHNlIGlmIChwYW5lLmJvdHRvbSA8PSByZWN0LnRvcCArIHRvbCkge1xuICAgICAgICAgICAgZGlyID0gJ3RvcCc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFuZS5sZWZ0ID49IHJlY3QucmlnaHQgLSB0b2wpIHtcbiAgICAgICAgICAgIGRpciA9ICdyaWdodCc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFuZS5yaWdodCA8PSByZWN0LmxlZnQgKyB0b2wpIHtcbiAgICAgICAgICAgIGRpciA9ICdsZWZ0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gTWF0aC5hYnMocGFuZS50b3AgKyBwYW5lLmhlaWdodCAvIDIgLSAocmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDIpKTtcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gTWF0aC5hYnMocGFuZS5sZWZ0ICsgcGFuZS53aWR0aCAvIDIgLSAocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDIpKTtcbiAgICAgICAgICAgIGRpciA9XG4gICAgICAgICAgICAgICAgZHkgPj0gZHhcbiAgICAgICAgICAgICAgICAgICAgPyBwYW5lLnRvcCArIHBhbmUuaGVpZ2h0IC8gMiA8IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0b3AnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdib3R0b20nXG4gICAgICAgICAgICAgICAgICAgIDogcGFuZS5sZWZ0ICsgcGFuZS53aWR0aCAvIDIgPCByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMlxuICAgICAgICAgICAgICAgICAgICAgID8gJ2xlZnQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAncmlnaHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVkQWxpZ25tZW50ID0gKHRoaXMuY3VycmVudFN0ZXAoKT8ucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKS5zcGxpdCgnLScpWzFdO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ3Bvc2l0aW9uJywgYCR7ZGlyfS0ke3JlcXVlc3RlZEFsaWdubWVudH1gIGFzIFNwb3RsaWdodFBvc2l0aW9uKTtcblxuICAgICAgICBjb25zdCBBUlJPV19NQVJHSU4gPSAxMjtcbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRBbGlnbm1lbnQgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IEFSUk9XX01BUkdJTjtcbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRBbGlnbm1lbnQgPT09ICdlbmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsQXJyb3cgPSBkaXIgPT09ICdsZWZ0JyB8fCBkaXIgPT09ICdyaWdodCc7XG4gICAgICAgICAgICAvLyBTVkcgaGVpZ2h0IGluIGZsZXgtY29sIGxheW91dCA9IDhweDsgU1ZHIHdpZHRoIGluIGZsZXgtcm93IGxheW91dCA9IDE2cHhcbiAgICAgICAgICAgIG9mZnNldCA9IGlzVmVydGljYWxBcnJvdyA/IHBhbmUuaGVpZ2h0IC0gQVJST1dfTUFSR0lOIC0gOCA6IHBhbmUud2lkdGggLSBBUlJPV19NQVJHSU4gLSAxNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRndFggPSByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHRndFkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHJhd09mZnNldCA9XG4gICAgICAgICAgICAgICAgZGlyID09PSAndG9wJyB8fCBkaXIgPT09ICdib3R0b20nXG4gICAgICAgICAgICAgICAgICAgID8gdGd0WCAtIHBhbmUubGVmdCAtIEFSUk9XX0hBTEZfU0laRVxuICAgICAgICAgICAgICAgICAgICA6IHRndFkgLSBwYW5lLnRvcCAtIEFSUk9XX0hBTEZfU0laRTtcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWF4KEFSUk9XX09GRlNFVF9NSU4sIE1hdGgubWluKEFSUk9XX09GRlNFVF9NQVgsIHJhd09mZnNldCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVmLnNldElucHV0KCdhcnJvd09mZnNldFB4Jywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyU3Vicy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnBvcG92ZXJTdWJzID0gW107XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUYXJnZXRSZWN0KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhcmdldFJlY3Quc2V0KGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hSZWN0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGVwID0gdGhpcy5jdXJyZW50U3RlcCgpO1xuXG4gICAgICAgIGlmICghc3RlcCB8fCAhdGhpcy5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnRvdXJTZXJ2aWNlLmdldEVsZW1lbnQoc3RlcC5zdGVwSWQpO1xuXG4gICAgICAgIGlmIChlbD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYXJnZXRSZWN0KGVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudXBkYXRlVGFyZ2V0UmVjdChlbCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiIsIkBpZiAoaXNBY3RpdmUoKSAmJiBjdXJyZW50U3RlcCgpOyBhcyBzdGVwKSB7XG4gICAgQGlmIChzdGVwLnNob3dCYWNrZHJvcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgW25nU3R5bGVdPVwidG9wTWFza1N0eWxlKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgPjwvZGl2PlxuXG4gICAgICAgIEBpZiAodGFyZ2V0UmVjdCgpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwibGVmdE1hc2tTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EaXNtaXNzKClcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInJpZ2h0TWFza1N0eWxlKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYm90dG9tTWFza1N0eWxlKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgKHN0ZXAuc2hvd0JhY2tkcm9wID09PSBmYWxzZSkge1xuICAgICAgICBAaWYgKHN0ZXAuZGlzbWlzc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInRyYW5zcGFyZW50QmxvY2tlclN0eWxlKClcIj48L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwidHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgfVxuICAgIH1cbn1cblxuIl19
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Nwb3RsaWdodC9zcmMvbGliL3Nwb3RsaWdodC9zcG90bGlnaHQtb3ZlcmxheS9zcG90bGlnaHQtb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0gsU0FBUyxFQUVULFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLE1BQU0sRUFDTixNQUFNLEVBR04sTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHakUsT0FBTyxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUV0RSxNQUFNLGFB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QUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQzt3R0F2akJRLHlCQUF5Qjs0RkFBekIseUJBQXlCLCtFQ2pGdEMsbzhCQW1DQSw0Q0Q0Q2MsT0FBTzs7NEZBRVIseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNJLHFCQUFxQixjQUVuQixJQUFJLFdBQ1AsQ0FBQyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudFJlZixcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgaW5qZWN0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvY3VzVHJhcCwgRm9jdXNUcmFwRmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5LCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTcG90bGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi9zcG90bGlnaHQuY29tcG9uZW50JztcbmltcG9ydCB7IFNwb3RsaWdodFRvdXJTZXJ2aWNlIH0gZnJvbSAnLi4vc3BvdGxpZ2h0LXRvdXIuc2VydmljZSc7XG5pbXBvcnQgeyBTcG90bGlnaHRQb3NpdGlvbiB9IGZyb20gJy4uL3R5cGVzL3Nwb3RsaWdodC1wb3NpdGlvbic7XG5pbXBvcnQgeyBTcG90bGlnaHRTdGVwIH0gZnJvbSAnLi4vdHlwZXMvc3BvdGxpZ2h0LXN0ZXAnO1xuaW1wb3J0IHsgU3RhYmlsaXplSGFuZGxlLCB3YWl0Rm9yU3RhYmxlUmVjdCB9IGZyb20gJy4vcmVjdC1zdGFiaWxpdHknO1xuXG5jb25zdCBQT1BPVkVSX1dJRFRIID0gMzQyO1xuY29uc3QgU1BPVExJR0hUX1BBRERJTkcgPSA4O1xuY29uc3QgQVJST1dfSEFMRl9TSVpFID0gODtcbmNvbnN0IEFSUk9XX09GRlNFVF9NSU4gPSA0O1xuY29uc3QgQVJST1dfT0ZGU0VUX01BWCA9IFBPUE9WRVJfV0lEVEggLSA0IC0gMTY7XG5jb25zdCBNQVNLX0JHID0gJ3JnYmEoMCwwLDAsMC41KSc7XG5jb25zdCBNQVNLX1RSQU5TSVRJT04gPSAnYWxsIDAuMnMgZWFzZSc7XG5jb25zdCBPVkVSTEFZX1ogPSAnMTAwMDAnO1xuY29uc3QgUE9QT1ZFUl9aID0gJzEwMDAxJztcbi8qKiBUZW1wbyBtw6F4aW1vIGRlIGVzcGVyYSBwZWxvIHJlZ2lzdHJvIGRvIGVsZW1lbnRvLWFsdm8gKGV4OiBjcmlhZG8gZGluYW1pY2FtZW50ZSBkZW50cm8gZGUgYGJlZm9yZU5leHRgKSBhbnRlcyBkZSByZWNvcnJlciBhbyBwb3BvdmVyIGNlbnRyYWxpemFkby4gKi9cbmNvbnN0IEVMRU1FTlRfV0FJVF9USU1FT1VUX01TID0gNTAwO1xuXG5mdW5jdGlvbiB0b0Nvbm5lY3RlZFBvc2l0aW9ucyhwb3NpdGlvbjogU3BvdGxpZ2h0UG9zaXRpb24pOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBbZGlyZWN0aW9uLCBhbGlnbm1lbnRdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwID0gU1BPVExJR0hUX1BBRERJTkcgKyAyO1xuICAgIGNvbnN0IGhBbGlnbiA9IGFsaWdubWVudCBhcyAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgICBjb25zdCB2QWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJz4gPSB7IHN0YXJ0OiAndG9wJywgY2VudGVyOiAnY2VudGVyJywgZW5kOiAnYm90dG9tJyB9O1xuICAgIGNvbnN0IHZBbGlnbiA9IHZBbGlnbk1hcFthbGlnbm1lbnRdID8/ICdjZW50ZXInO1xuXG4gICAgbGV0IHByaW1hcnk6IENvbm5lY3RlZFBvc2l0aW9uO1xuICAgIGxldCBvcHBvc2l0ZTogQ29ubmVjdGVkUG9zaXRpb247XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgcHJpbWFyeSA9IHsgb3JpZ2luWDogaEFsaWduLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6IGhBbGlnbiwgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtcCB9O1xuICAgICAgICAgICAgb3Bwb3NpdGUgPSB7IG9yaWdpblg6IGhBbGlnbiwgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiBoQWxpZ24sIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHByaW1hcnkgPSB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogdkFsaWduLCBvZmZzZXRYOiBwIH07XG4gICAgICAgICAgICBvcHBvc2l0ZSA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiB2QWxpZ24sIG9mZnNldFg6IC1wIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiB2QWxpZ24sIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogLXAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogdkFsaWduLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6IHZBbGlnbiwgb2Zmc2V0WDogcCB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vICdib3R0b20nXG4gICAgICAgICAgICBwcmltYXJ5ID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IHAgfTtcbiAgICAgICAgICAgIG9wcG9zaXRlID0geyBvcmlnaW5YOiBoQWxpZ24sIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogaEFsaWduLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHJpbWFyeSxcbiAgICAgICAgb3Bwb3NpdGUsXG4gICAgICAgIHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogcCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC1wIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiBwIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiAtcCB9LFxuICAgIF07XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zcG90bGlnaHQtb3ZlcmxheScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ1N0eWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvdXJTZXJ2aWNlID0gaW5qZWN0KFNwb3RsaWdodFRvdXJTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZGtPdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvY3VzVHJhcEZhY3RvcnkgPSBpbmplY3QoRm9jdXNUcmFwRmFjdG9yeSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgaXNBY3RpdmUgPSB0aGlzLnRvdXJTZXJ2aWNlLmlzQWN0aXZlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBjdXJyZW50U3RlcCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudFN0ZXA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGN1cnJlbnRJbmRleCA9IHRoaXMudG91clNlcnZpY2UuY3VycmVudEluZGV4O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSB0b3RhbFN0ZXBzID0gdGhpcy50b3VyU2VydmljZS50b3RhbFN0ZXBzO1xuXG4gICAgLyoqIEBpbnRlcm5hbCovXG4gICAgcmVhZG9ubHkgdGFyZ2V0UmVjdCA9IHNpZ25hbDxET01SZWN0IHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sYSBzZSBhIG3DoXNjYXJhIGRldmUgYW5pbWFyIGEgdHJhbnNpw6fDo28gZW50cmUgcmV0w6JuZ3Vsb3MgKHJlcG9zaWNpb25hbWVudG9cbiAgICAgKiBlbSB2aXZvLCBleDogc2Nyb2xsL3Jlc2l6ZSkgb3Ugc2FsdGFyIGluc3RhbnRhbmVhbWVudGUgKGNoZWdhZGEvc2HDrWRhIGRlIHVtIHBhc3NvKS5cbiAgICAgKiBWZXIgYHNldFRhcmdldFJlY3RJbW1lZGlhdGVgLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFza1RyYW5zaXRpb25FbmFibGVkID0gc2lnbmFsKHRydWUpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXNrVHJhbnNpdGlvblN0eWxlID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbkVuYWJsZWQoKSA/IE1BU0tfVFJBTlNJVElPTiA6ICdub25lJyxcbiAgICApO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IHRvcE1hc2tTdHlsZSA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuICAgICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IE1BU0tfQkcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLm1hc2tUcmFuc2l0aW9uU3R5bGUoKSxcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGJvdHRvbTogJzAnIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBTUE9UTElHSFRfUEFERElORyk7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogJzAnLCBsZWZ0OiAnMCcsIHJpZ2h0OiAnMCcsIGhlaWdodDogYCR7dG9wfXB4YCB9O1xuICAgIH0pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IGxlZnRNYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcCA9IFNQT1RMSUdIVF9QQURESU5HO1xuICAgICAgICBjb25zdCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCAtIHApO1xuICAgICAgICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgcCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heCgwLCByZWN0LmxlZnQgLSBwKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IE1BU0tfQkcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLm1hc2tUcmFuc2l0aW9uU3R5bGUoKSxcbiAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgd2lkdGg6IGAke2xlZnR9cHhgLFxuICAgICAgICAgICAgaGVpZ2h0OiBgJHtib3R0b20gLSB0b3B9cHhgLFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IHJpZ2h0TWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG5cbiAgICAgICAgaWYgKCFyZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAgPSBTUE9UTElHSFRfUEFERElORztcbiAgICAgICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBwKTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSArIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCByZWN0LnJpZ2h0ICsgcCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgJ3otaW5kZXgnOiBPVkVSTEFZX1osXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5tYXNrVHJhbnNpdGlvblN0eWxlKCksXG4gICAgICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgICAgICAgIGxlZnQ6IGAke3JpZ2h0fXB4YCxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICAgICAgICBoZWlnaHQ6IGAke2JvdHRvbSAtIHRvcH1weGAsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgYm90dG9tTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG5cbiAgICAgICAgaWYgKCFyZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAgPSBTUE9UTElHSFRfUEFERElORztcbiAgICAgICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSArIHApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMubWFza1RyYW5zaXRpb25TdHlsZSgpLFxuICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0b3A6IGAke2JvdHRvbX1weGAsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgdHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiAoe1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0JyxcbiAgICB9KSk7XG5cbiAgICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcG9wb3Zlck92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTcG90bGlnaHRDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwb3BvdmVyU3ViczogQXJyYXk8eyB1bnN1YnNjcmliZSgpOiB2b2lkIH0+ID0gW107XG4gICAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcGVuZGluZ0Fycml2YWw6IFN0YWJpbGl6ZUhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZWxlbWVudFdhaXRUaW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgc3RhYmlsaXplR2VuZXJhdGlvbiA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5jdXJyZW50U3RlcCksXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5pc0FjdGl2ZSksXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy50b3VyU2VydmljZS5yZWdpc3RyYXRpb25WZXJzaW9uKSxcbiAgICAgICAgXSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3N0ZXAsIGFjdGl2ZV0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ0Fycml2YWwoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLnN0YWJpbGl6ZUdlbmVyYXRpb247XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXAgfHwgIWFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRhcmdldFJlY3RJbW1lZGlhdGUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMudG91clNlcnZpY2UuZ2V0RWxlbWVudChzdGVwLnN0ZXBJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luQXJyaXZhbFNlcXVlbmNlKGVsLm5hdGl2ZUVsZW1lbnQsIHN0ZXAsIGdlbmVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXdhaXRFbGVtZW50UmVnaXN0cmF0aW9uKHN0ZXAsIGdlbmVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFndWFyZGEgbyBsYXlvdXQgZG8gZWxlbWVudG8tYWx2byBlc3RhYmlsaXphciAoZXg6IGFuaW1hw6fDo28gZGUgYWJlcnR1cmEgZGUgdW0gbWVudVxuICAgICAqIGRpc3BhcmFkYSBwZWxvIGBiZWZvcmVOZXh0YCBkbyBwYXNzbyBhbnRlcmlvcikgYW50ZXMgZGUgbWVkaXIgc3VhIHBvc2nDp8OjbyBkZWZpbml0aXZhXG4gICAgICogZSBwb3NpY2lvbmFyIGEgbcOhc2NhcmEvcG9wb3Zlci4gU3Vic3RpdHVpIGEgYW50aWdhIGVzcGVyYSBkZSB1bSDDum5pY28gZnJhbWUsIHF1ZVxuICAgICAqIGNhcHR1cmF2YSBvIHJldMOibmd1bG8gbm8gbWVpbyBkZSBhbmltYcOnw7VlcyBkZSB0ZXJjZWlyb3MgbmEgdGVsYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJlZ2luQXJyaXZhbFNlcXVlbmNlKHRhcmdldDogSFRNTEVsZW1lbnQsIHN0ZXA6IFNwb3RsaWdodFN0ZXAsIGdlbmVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gd2FpdEZvclN0YWJsZVJlY3QodGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Fycml2YWwgPSBoYW5kbGU7XG5cbiAgICAgICAgICAgIGhhbmRsZS5wcm9taXNlLnRoZW4oKHsgcmVjdCwgdGltZWRPdXQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5zdGFiaWxpemVHZW5lcmF0aW9uIHx8ICF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBbU3BvdGxpZ2h0XSBPIGxheW91dCBkbyBlbGVtZW50byBkbyBwYXNzbyBcIiR7c3RlcC5zdGVwSWR9XCIgbsOjbyBlc3RhYmlsaXpvdSBhIHRlbXBvOyB1c2FuZG8gYSDDumx0aW1hIHBvc2nDp8OjbyBtZWRpZGEuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRhcmdldFJlY3RJbW1lZGlhdGUocmVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZUVsZW1lbnQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheSh0YXJnZXQsIHN0ZXApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFndWFyZGEgYXTDqSBgRUxFTUVOVF9XQUlUX1RJTUVPVVRfTVNgIHBlbG8gcmVnaXN0cm8gZG8gZWxlbWVudG8tYWx2byB2aWFcbiAgICAgKiBgW3NTcG90bGlnaHRTdGVwXWAgKMO6dGlsIHF1YW5kbyBvIGBiZWZvcmVOZXh0YCBkbyBwYXNzbyBhbnRlcmlvciBjcmlhIG8gZWxlbWVudG9cbiAgICAgKiBkaW5hbWljYW1lbnRlLCBleDogYWJyaW5kbyB1bWEgYWJhKSBhbnRlcyBkZSByZWNvcnJlciBhbyBwb3BvdmVyIGNlbnRyYWxpemFkby5cbiAgICAgKiBNYW50w6ltIG8gw7psdGltbyBxdWFkcm8gcmVuZGVyaXphZG8gZHVyYW50ZSBhIGVzcGVyYSBwYXJhIGV2aXRhciB1bSBmbGFzaC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGF3YWl0RWxlbWVudFJlZ2lzdHJhdGlvbihzdGVwOiBTcG90bGlnaHRTdGVwLCBnZW5lcmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbGVtZW50V2FpdFRpbWVySWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLnN0YWJpbGl6ZUdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgYFtTcG90bGlnaHRdIEVsZW1lbnRvIGRvIHBhc3NvIFwiJHtzdGVwLnN0ZXBJZH1cIiBuw6NvIGZvaSByZWdpc3RyYWRvIGEgdGVtcG87IGV4aWJpbmRvIHBvcG92ZXIgY2VudHJhbGl6YWRvIHNlbSBkZXN0YXF1ZS5gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUYXJnZXRSZWN0SW1tZWRpYXRlKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkobnVsbCwgc3RlcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgRUxFTUVOVF9XQUlUX1RJTUVPVVRfTVMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuY2VsUGVuZGluZ0Fycml2YWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVuZGluZ0Fycml2YWw/LmNhbmNlbCgpO1xuICAgICAgICB0aGlzLnBlbmRpbmdBcnJpdmFsID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50V2FpdFRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVsZW1lbnRXYWl0VGltZXJJZCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRXYWl0VGltZXJJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbE9wdHMgPSB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucztcblxuICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgc2Nyb2xsT3B0cylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25EaXNtaXNzKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbmNlbFBlbmRpbmdBcnJpdmFsKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveVBvcG92ZXJPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uTmV4dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3VyU2VydmljZS5uZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3VyU2VydmljZS5zdG9wKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uRGlzbWlzcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcblxuICAgICAgICBpZiAoIXN0ZXAgfHwgc3RlcC5kaXNtaXNzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7XG4gICAgICAgICAgICByZWFzb246IHRoaXMudG90YWxTdGVwcygpID09PSAxID8gJ2Rpc21pc3NlZCcgOiAnaW50ZXJydXB0ZWQnLFxuICAgICAgICAgICAgZG9Ob3RTaG93QWdhaW46IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBvcG92ZXJPdmVybGF5KHRhcmdldEVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHN0ZXA6IFNwb3RsaWdodFN0ZXApOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0YXJnZXRFbFxuICAgICAgICAgICAgPyB0aGlzLmNka092ZXJsYXlcbiAgICAgICAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0YXJnZXRFbClcbiAgICAgICAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKHRvQ29ubmVjdGVkUG9zaXRpb25zKHN0ZXAucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKSlcbiAgICAgICAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgLndpdGhQdXNoKHRydWUpXG4gICAgICAgICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKDgpXG4gICAgICAgICAgICA6IHRoaXMuY2RrT3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLmNlbnRlckhvcml6b250YWxseSgpLmNlbnRlclZlcnRpY2FsbHkoKTtcblxuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSB0aGlzLmNka092ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRhcmdldEVsXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5jZGtPdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5jZGtPdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBQT1BPVkVSX1dJRFRILFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0UG9wb3ZlclpJbmRleCgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hQb3BvdmVyUG9ydGFsKHN0ZXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9wb3ZlcklucHV0cyhzdGVwKTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRm9jdXNUcmFwUmVmb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRQb3BvdmVyWkluZGV4KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUuekluZGV4ID0gUE9QT1ZFUl9aO1xuXG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmhvc3RFbGVtZW50O1xuXG4gICAgICAgIGlmIChob3N0ICE9PSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50KSB7XG4gICAgICAgICAgICBob3N0LnN0eWxlLnpJbmRleCA9IFBPUE9WRVJfWjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoUG9wb3ZlclBvcnRhbChzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFNwb3RsaWdodENvbXBvbmVudCwgbnVsbCwgdGhpcy5lbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZiEuYXR0YWNoKHBvcnRhbCk7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wb3ZlcklucHV0cyhzdGVwKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVN5bmMoKTtcblxuICAgICAgICBpZiAodGhpcy50b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlVG91ck1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcG92ZXJTdWJzLnB1c2goXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UubmV4dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvTm90U2hvd0FnYWluID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudG91clNlcnZpY2UubmV4dChkb05vdFNob3dBZ2Fpbik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5wcmV2aW91cy5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b3VyU2VydmljZS5wcmV2aW91cygpKSxcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5jbG9zZWQuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyU2VydmljZS5zdG9wKHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiB0aGlzLnRvdGFsU3RlcHMoKSA9PT0gMSA/ICdkaXNtaXNzZWQnIDogJ2ludGVycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZG9Ob3RTaG93QWdhaW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS51bmRlcnN0YW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG9Ob3RTaG93QWdhaW4gPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWY/Lmluc3RhbmNlLmlzRG9Ob3RTaG93QWdhaW5DaGVja2VkKCkgPz8gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyU2VydmljZS5zdG9wKHsgcmVhc29uOiAnY29tcGxldGVkJywgZG9Ob3RTaG93QWdhaW4gfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBvcG92ZXJJbnB1dHMoc3RlcDogU3BvdGxpZ2h0U3RlcCAmIHsgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZjtcblxuICAgICAgICBpZiAoIXJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVmLnNldElucHV0KCd0aXRsZScsIHN0ZXAudGl0bGUpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ21lc3NhZ2UnLCBzdGVwLm1lc3NhZ2UpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ3Bvc2l0aW9uJywgc3RlcC5wb3NpdGlvbiA/PyAnYm90dG9tLWNlbnRlcicpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ2N1cnJlbnRTdGVwJywgdGhpcy5jdXJyZW50SW5kZXgoKSArIDEpO1xuICAgICAgICByZWYuc2V0SW5wdXQoJ3RvdGFsU3RlcHMnLCB0aGlzLnRvdGFsU3RlcHMoKSk7XG4gICAgICAgIHJlZi5zZXRJbnB1dCgnY29udGVudCcsIHN0ZXAuY29udGVudCA/PyBudWxsKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdhY3Rpb25zJywgc3RlcC5hY3Rpb25zID8/IFtdKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdzaG93RG9Ob3RTaG93QWdhaW4nLCBzdGVwLnNob3dEb05vdFNob3dBZ2FpbiA/PyB0cnVlKTtcbiAgICAgICAgcmVmLnNldElucHV0KCdhcnJvd09mZnNldFB4JywgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY2hlZHVsZVN5bmMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLnN5bmNEaXJlY3Rpb25BbmRBcnJvdygpKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVUb3VyTW9kZSgpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZUVsID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYW5lRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZShwYW5lRWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgYSBzdGVwIGNoYW5nZSwgbW92ZXMgZm9jdXMgYmFjayB0byB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudCBpbnNpZGUgdGhlXG4gICAgICogcG9wb3ZlciBzbyB0aGUgdXNlciBkb2VzIG5vdCBsb3NlIGtleWJvYXJkIHBvc2l0aW9uLlxuICAgICAqIE5vLW9wIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGZvY3VzIHRyYXAgKHNpbXBsZSBzcG90bGlnaHQgbW9kZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzY2hlZHVsZUZvY3VzVHJhcFJlZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb2N1c1RyYXApIHJldHVybjtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzVHJhcD8uZm9jdXNGaXJzdFRhYmJhYmxlRWxlbWVudCgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNEaXJlY3Rpb25BbmRBcnJvdygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmO1xuICAgICAgICBjb25zdCBwYW5lRWwgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudDtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuXG4gICAgICAgIGlmICghcmVmIHx8ICFwYW5lRWwgfHwgIXJlY3QpIHtcbiAgICAgICAgICAgIHJlZj8uc2V0SW5wdXQoJ2Fycm93T2Zmc2V0UHgnLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhbmUgPSBwYW5lRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvbCA9IFNQT1RMSUdIVF9QQURESU5HICsgNDtcblxuICAgICAgICBsZXQgZGlyOiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcblxuICAgICAgICBpZiAocGFuZS50b3AgPj0gcmVjdC5ib3R0b20gLSB0b2wpIHtcbiAgICAgICAgICAgIGRpciA9ICdib3R0b20nO1xuICAgICAgICB9IGVsc2UgaWYgKHBhbmUuYm90dG9tIDw9IHJlY3QudG9wICsgdG9sKSB7XG4gICAgICAgICAgICBkaXIgPSAndG9wJztcbiAgICAgICAgfSBlbHNlIGlmIChwYW5lLmxlZnQgPj0gcmVjdC5yaWdodCAtIHRvbCkge1xuICAgICAgICAgICAgZGlyID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmIChwYW5lLnJpZ2h0IDw9IHJlY3QubGVmdCArIHRvbCkge1xuICAgICAgICAgICAgZGlyID0gJ2xlZnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmFicyhwYW5lLnRvcCArIHBhbmUuaGVpZ2h0IC8gMiAtIChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMikpO1xuICAgICAgICAgICAgY29uc3QgZHggPSBNYXRoLmFicyhwYW5lLmxlZnQgKyBwYW5lLndpZHRoIC8gMiAtIChyZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMikpO1xuICAgICAgICAgICAgZGlyID1cbiAgICAgICAgICAgICAgICBkeSA+PSBkeFxuICAgICAgICAgICAgICAgICAgICA/IHBhbmUudG9wICsgcGFuZS5oZWlnaHQgLyAyIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RvcCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JvdHRvbSdcbiAgICAgICAgICAgICAgICAgICAgOiBwYW5lLmxlZnQgKyBwYW5lLndpZHRoIC8gMiA8IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnbGVmdCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdyaWdodCc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0ZWRBbGlnbm1lbnQgPSAodGhpcy5jdXJyZW50U3RlcCgpPy5wb3NpdGlvbiA/PyAnYm90dG9tLWNlbnRlcicpLnNwbGl0KCctJylbMV07XG4gICAgICAgIHJlZi5zZXRJbnB1dCgncG9zaXRpb24nLCBgJHtkaXJ9LSR7cmVxdWVzdGVkQWxpZ25tZW50fWAgYXMgU3BvdGxpZ2h0UG9zaXRpb24pO1xuXG4gICAgICAgIGNvbnN0IEFSUk9XX01BUkdJTiA9IDEyO1xuICAgICAgICBsZXQgb2Zmc2V0OiBudW1iZXI7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RlZEFsaWdubWVudCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgb2Zmc2V0ID0gQVJST1dfTUFSR0lOO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZEFsaWdubWVudCA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmVydGljYWxBcnJvdyA9IGRpciA9PT0gJ2xlZnQnIHx8IGRpciA9PT0gJ3JpZ2h0JztcbiAgICAgICAgICAgIC8vIFNWRyBoZWlnaHQgaW4gZmxleC1jb2wgbGF5b3V0ID0gOHB4OyBTVkcgd2lkdGggaW4gZmxleC1yb3cgbGF5b3V0ID0gMTZweFxuICAgICAgICAgICAgb2Zmc2V0ID0gaXNWZXJ0aWNhbEFycm93ID8gcGFuZS5oZWlnaHQgLSBBUlJPV19NQVJHSU4gLSA4IDogcGFuZS53aWR0aCAtIEFSUk9XX01BUkdJTiAtIDE2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGd0WCA9IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgY29uc3QgdGd0WSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICAgICAgY29uc3QgcmF3T2Zmc2V0ID1cbiAgICAgICAgICAgICAgICBkaXIgPT09ICd0b3AnIHx8IGRpciA9PT0gJ2JvdHRvbSdcbiAgICAgICAgICAgICAgICAgICAgPyB0Z3RYIC0gcGFuZS5sZWZ0IC0gQVJST1dfSEFMRl9TSVpFXG4gICAgICAgICAgICAgICAgICAgIDogdGd0WSAtIHBhbmUudG9wIC0gQVJST1dfSEFMRl9TSVpFO1xuICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoQVJST1dfT0ZGU0VUX01JTiwgTWF0aC5taW4oQVJST1dfT0ZGU0VUX01BWCwgcmF3T2Zmc2V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWYuc2V0SW5wdXQoJ2Fycm93T2Zmc2V0UHgnLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVBvcG92ZXJPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvcG92ZXJTdWJzLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMucG9wb3ZlclN1YnMgPSBbXTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcblxuICAgICAgICBpZiAodGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyT3ZlcmxheVJlZikge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRhcmdldFJlY3QoZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwbGljYSB1bSBub3ZvIGB0YXJnZXRSZWN0YCBzZW0gYW5pbWHDp8OjbyBkZSB0cmFuc2nDp8OjbyBuYSBtw6FzY2FyYSDigJQgdXNhZG8gYW9cbiAgICAgKiBjaGVnYXIvc2FsdGFyIHBhcmEgdW0gYWx2byBub3ZvLCBvbmRlIGFuaW1hciBhIHBhcnRpciBkYSBwb3Npw6fDo28gZG8gcGFzc29cbiAgICAgKiBhbnRlcmlvciBjcmlhcmlhIGEgZmFsc2EgaW1wcmVzc8OjbyBkZSBcImFwb250b3UgZXJyYWRvIGUgY29ycmlnaXUgZGVwb2lzXCIuXG4gICAgICogQSB0cmFuc2nDp8OjbyDDqSByZWFiaWxpdGFkYSBubyBmcmFtZSBzZWd1aW50ZSBwYXJhIHJlcG9zaWNpb25hbWVudG9zIGxlZ8OtdGltb3NcbiAgICAgKiAoc2Nyb2xsL3Jlc2l6ZSBkZSB1bSBhbHZvIGrDoSB2aXPDrXZlbCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRUYXJnZXRSZWN0SW1tZWRpYXRlKHJlY3Q6IERPTVJlY3QgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFza1RyYW5zaXRpb25FbmFibGVkLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQocmVjdCk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLm1hc2tUcmFuc2l0aW9uRW5hYmxlZC5zZXQodHJ1ZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaFJlY3QoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICAgICAgaWYgKCFzdGVwIHx8ICF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbCA9IHRoaXMudG91clNlcnZpY2UuZ2V0RWxlbWVudChzdGVwLnN0ZXBJZCk7XG5cbiAgICAgICAgaWYgKGVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QoZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVFbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy51cGRhdGVUYXJnZXRSZWN0KGVsKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY29ubmVjdFJlc2l6ZU9ic2VydmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiQGlmIChpc0FjdGl2ZSgpICYmIGN1cnJlbnRTdGVwKCk7IGFzIHN0ZXApIHtcbiAgICBAaWYgKHN0ZXAuc2hvd0JhY2tkcm9wICE9PSBmYWxzZSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0b3BNYXNrU3R5bGUoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EaXNtaXNzKClcIlxuICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgQGlmICh0YXJnZXRSZWN0KCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJsZWZ0TWFza1N0eWxlKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicmlnaHRNYXNrU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJib3R0b21NYXNrU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBpZiAoc3RlcC5zaG93QmFja2Ryb3AgPT09IGZhbHNlKSB7XG4gICAgICAgIEBpZiAoc3RlcC5kaXNtaXNzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwidHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUoKVwiPjwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ0cmFuc3BhcmVudEJsb2NrZXJTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EaXNtaXNzKClcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICB9XG4gICAgfVxufVxuXG4iXX0=
|