valtech-components 2.0.829 → 2.0.831

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.
@@ -0,0 +1,44 @@
1
+ /**
2
+ * DebugConsole Provider
3
+ *
4
+ * Provider e injection token para el overlay de logs `val-debug-console`.
5
+ */
6
+ import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
7
+ import { DEFAULT_DEBUG_CONSOLE_CONFIG } from './types';
8
+ /**
9
+ * Token de inyección para la configuración de DebugConsole.
10
+ */
11
+ export const VALTECH_DEBUG_CONSOLE = new InjectionToken('ValtechDebugConsole');
12
+ /**
13
+ * Provee el overlay de logs `val-debug-console` a la aplicación Angular.
14
+ *
15
+ * El componente parchea `console.*` para espejar cada llamada a un panel en
16
+ * pantalla — útil para leer logs en un PWA iOS añadido al home screen, donde
17
+ * la consola del navegador no es accesible.
18
+ *
19
+ * El gate `enabled` lo decide la app (la lib no puede importar su
20
+ * `environment`). Sin provider, el componente queda inerte (`enabled: false`).
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * // main.ts
25
+ * import { provideValtechDebugConsole } from 'valtech-components';
26
+ * import { environment } from './environments/environment';
27
+ *
28
+ * bootstrapApplication(AppComponent, {
29
+ * providers: [
30
+ * provideValtechDebugConsole({ enabled: !environment.production }),
31
+ * ],
32
+ * });
33
+ * ```
34
+ *
35
+ * Luego declarar `<val-debug-console />` una vez en el componente raíz.
36
+ */
37
+ export function provideValtechDebugConsole(config = {}) {
38
+ const mergedConfig = {
39
+ ...DEFAULT_DEBUG_CONSOLE_CONFIG,
40
+ ...config,
41
+ };
42
+ return makeEnvironmentProviders([{ provide: VALTECH_DEBUG_CONSOLE, useValue: mergedConfig }]);
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9kZWJ1Zy1jb25zb2xlL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUF3QixjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0YsT0FBTyxFQUFzQiw0QkFBNEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUNyRCxxQkFBcUIsQ0FDdEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsU0FBNkIsRUFBRTtJQUN4RSxNQUFNLFlBQVksR0FBaUM7UUFDakQsR0FBRyw0QkFBNEI7UUFDL0IsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUVGLE9BQU8sd0JBQXdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlYnVnQ29uc29sZSBQcm92aWRlclxuICpcbiAqIFByb3ZpZGVyIGUgaW5qZWN0aW9uIHRva2VuIHBhcmEgZWwgb3ZlcmxheSBkZSBsb2dzIGB2YWwtZGVidWctY29uc29sZWAuXG4gKi9cblxuaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIEluamVjdGlvblRva2VuLCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRGVidWdDb25zb2xlQ29uZmlnLCBERUZBVUxUX0RFQlVHX0NPTlNPTEVfQ09ORklHIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVG9rZW4gZGUgaW55ZWNjacOzbiBwYXJhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIERlYnVnQ29uc29sZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTFRFQ0hfREVCVUdfQ09OU09MRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxSZXF1aXJlZDxEZWJ1Z0NvbnNvbGVDb25maWc+PihcbiAgJ1ZhbHRlY2hEZWJ1Z0NvbnNvbGUnXG4pO1xuXG4vKipcbiAqIFByb3ZlZSBlbCBvdmVybGF5IGRlIGxvZ3MgYHZhbC1kZWJ1Zy1jb25zb2xlYCBhIGxhIGFwbGljYWNpw7NuIEFuZ3VsYXIuXG4gKlxuICogRWwgY29tcG9uZW50ZSBwYXJjaGVhIGBjb25zb2xlLipgIHBhcmEgZXNwZWphciBjYWRhIGxsYW1hZGEgYSB1biBwYW5lbCBlblxuICogcGFudGFsbGEg4oCUIMO6dGlsIHBhcmEgbGVlciBsb2dzIGVuIHVuIFBXQSBpT1MgYcOxYWRpZG8gYWwgaG9tZSBzY3JlZW4sIGRvbmRlXG4gKiBsYSBjb25zb2xhIGRlbCBuYXZlZ2Fkb3Igbm8gZXMgYWNjZXNpYmxlLlxuICpcbiAqIEVsIGdhdGUgYGVuYWJsZWRgIGxvIGRlY2lkZSBsYSBhcHAgKGxhIGxpYiBubyBwdWVkZSBpbXBvcnRhciBzdVxuICogYGVudmlyb25tZW50YCkuIFNpbiBwcm92aWRlciwgZWwgY29tcG9uZW50ZSBxdWVkYSBpbmVydGUgKGBlbmFibGVkOiBmYWxzZWApLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBtYWluLnRzXG4gKiBpbXBvcnQgeyBwcm92aWRlVmFsdGVjaERlYnVnQ29uc29sZSB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKiBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbiAqXG4gKiBib290c3RyYXBBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgcHJvdmlkZVZhbHRlY2hEZWJ1Z0NvbnNvbGUoeyBlbmFibGVkOiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbiB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogTHVlZ28gZGVjbGFyYXIgYDx2YWwtZGVidWctY29uc29sZSAvPmAgdW5hIHZleiBlbiBlbCBjb21wb25lbnRlIHJhw616LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVZhbHRlY2hEZWJ1Z0NvbnNvbGUoY29uZmlnOiBEZWJ1Z0NvbnNvbGVDb25maWcgPSB7fSk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgY29uc3QgbWVyZ2VkQ29uZmlnOiBSZXF1aXJlZDxEZWJ1Z0NvbnNvbGVDb25maWc+ID0ge1xuICAgIC4uLkRFRkFVTFRfREVCVUdfQ09OU09MRV9DT05GSUcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW3sgcHJvdmlkZTogVkFMVEVDSF9ERUJVR19DT05TT0xFLCB1c2VWYWx1ZTogbWVyZ2VkQ29uZmlnIH1dKTtcbn1cbiJdfQ==
@@ -0,0 +1,237 @@
1
+ import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
2
+ import { VALTECH_DEBUG_CONSOLE } from './config';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * `val-debug-console` — overlay de logs en pantalla para diagnóstico.
6
+ *
7
+ * Herramienta de desarrollo. Permite leer los `console.*` desde un PWA en iOS
8
+ * añadido a la pantalla de inicio, donde la consola del navegador no es
9
+ * accesible.
10
+ *
11
+ * Comportamiento:
12
+ * - Monkey-patch de `console.log/warn/error/info`: cada llamada también empuja
13
+ * una entrada al buffer (últimas ~150) además de llamar al `console` original.
14
+ * - Botón flotante (esquina) que abre/cierra un panel scrollable con las
15
+ * entradas más nuevas abajo, coloreadas por nivel.
16
+ * - Botones "copiar" (al portapapeles) y "limpiar".
17
+ *
18
+ * Gate maestro vía `provideValtechDebugConsole({ enabled })` en `main.ts`. Sin
19
+ * provider — o con `enabled: false` — el componente NO parchea `console` y NO
20
+ * renderiza nada. La app decide el valor (normalmente `!environment.production`).
21
+ *
22
+ * i18n: NO usa i18n a propósito — es un dev-tool que ningún end-user ve;
23
+ * los labels van en español plano.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * // main.ts
28
+ * provideValtechDebugConsole({ enabled: !environment.production }),
29
+ * ```
30
+ * ```html
31
+ * <!-- componente raíz, una sola vez -->
32
+ * <val-debug-console />
33
+ * ```
34
+ */
35
+ /** Máximo de entradas retenidas en el buffer. */
36
+ const MAX_ENTRIES = 150;
37
+ export class DebugConsoleComponent {
38
+ constructor() {
39
+ /** Gate maestro: `false` (sin provider o `enabled: false`) → todo inerte. */
40
+ this.enabled = inject(VALTECH_DEBUG_CONSOLE, { optional: true })?.enabled ?? false;
41
+ this.open = signal(false);
42
+ this.entries = signal([]);
43
+ /**
44
+ * Buffer plano (NO signal). `console.log` puede invocarse dentro de un
45
+ * `effect()`/`computed()`; escribir el signal `entries` ahí mismo dispara
46
+ * NG0600. Acumulamos en este array y volcamos al signal en un microtask,
47
+ * fuera de todo contexto reactivo.
48
+ */
49
+ this.buffer = [];
50
+ this.flushScheduled = false;
51
+ /** Referencias a los métodos originales para restaurarlos en destroy. */
52
+ this.original = {};
53
+ }
54
+ ngOnInit() {
55
+ if (!this.enabled)
56
+ return;
57
+ this.patchConsole();
58
+ }
59
+ ngOnDestroy() {
60
+ if (!this.enabled)
61
+ return;
62
+ this.restoreConsole();
63
+ }
64
+ toggle() {
65
+ this.open.update(v => !v);
66
+ }
67
+ clear() {
68
+ this.buffer = [];
69
+ this.entries.set([]);
70
+ }
71
+ async copy() {
72
+ const text = this.entries()
73
+ .map(e => `${e.ts} [${e.level}] ${e.text}`)
74
+ .join('\n');
75
+ try {
76
+ await navigator.clipboard.writeText(text);
77
+ }
78
+ catch {
79
+ // Fallback para WebViews sin Clipboard API.
80
+ const ta = document.createElement('textarea');
81
+ ta.value = text;
82
+ ta.style.position = 'fixed';
83
+ ta.style.opacity = '0';
84
+ document.body.appendChild(ta);
85
+ ta.select();
86
+ try {
87
+ document.execCommand('copy');
88
+ }
89
+ catch {
90
+ /* sin recurso de copia disponible */
91
+ }
92
+ document.body.removeChild(ta);
93
+ }
94
+ }
95
+ /** Reemplaza los métodos de `console` para espejar cada llamada al buffer. */
96
+ patchConsole() {
97
+ const levels = ['log', 'warn', 'error', 'info'];
98
+ for (const level of levels) {
99
+ const orig = console[level].bind(console);
100
+ this.original[level] = orig;
101
+ console[level] = (...args) => {
102
+ orig(...args);
103
+ this.push(level, args);
104
+ };
105
+ }
106
+ }
107
+ /** Restaura los métodos originales de `console`. */
108
+ restoreConsole() {
109
+ for (const level of Object.keys(this.original)) {
110
+ const orig = this.original[level];
111
+ if (orig) {
112
+ console[level] = orig;
113
+ }
114
+ }
115
+ this.original = {};
116
+ }
117
+ /**
118
+ * Agrega una entrada al buffer plano y programa el volcado al signal.
119
+ * El volcado se difiere a un microtask: `console.log` puede llamarse desde
120
+ * dentro de un `effect()`, y escribir un signal ahí lanzaría NG0600.
121
+ */
122
+ push(level, args) {
123
+ const text = args.map(a => this.stringify(a)).join(' ');
124
+ const ts = new Date().toISOString().slice(11, 23);
125
+ this.buffer.push({ ts, level, text });
126
+ if (this.buffer.length > MAX_ENTRIES) {
127
+ this.buffer = this.buffer.slice(this.buffer.length - MAX_ENTRIES);
128
+ }
129
+ this.scheduleFlush();
130
+ }
131
+ /**
132
+ * Vuelca el buffer al signal `entries` en un microtask — fuera del contexto
133
+ * reactivo desde el que se haya llamado `console.log`. Batchea: múltiples
134
+ * logs del mismo tick resultan en una sola escritura del signal.
135
+ */
136
+ scheduleFlush() {
137
+ if (this.flushScheduled)
138
+ return;
139
+ this.flushScheduled = true;
140
+ queueMicrotask(() => {
141
+ this.flushScheduled = false;
142
+ this.entries.set([...this.buffer]);
143
+ });
144
+ }
145
+ /** Convierte cualquier argumento a una representación legible de una línea. */
146
+ stringify(value) {
147
+ if (typeof value === 'string')
148
+ return value;
149
+ if (value instanceof Error)
150
+ return `${value.name}: ${value.message}`;
151
+ try {
152
+ return JSON.stringify(value);
153
+ }
154
+ catch {
155
+ return String(value);
156
+ }
157
+ }
158
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DebugConsoleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
159
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DebugConsoleComponent, isStandalone: true, selector: "val-debug-console", ngImport: i0, template: `
160
+ @if (enabled) {
161
+ <button
162
+ type="button"
163
+ class="dbg-fab"
164
+ (click)="toggle()"
165
+ [attr.aria-label]="open() ? 'Cerrar consola' : 'Abrir consola'"
166
+ >
167
+ {{ open() ? '×' : '‹/›' }}
168
+ @if (!open() && entries().length) {
169
+ <span class="dbg-fab__count">{{ entries().length }}</span>
170
+ }
171
+ </button>
172
+
173
+ @if (open()) {
174
+ <div class="dbg-panel" role="log">
175
+ <div class="dbg-panel__bar">
176
+ <span class="dbg-panel__title"> Debug · {{ entries().length }} </span>
177
+ <span class="dbg-panel__actions">
178
+ <button type="button" (click)="copy()">copiar</button>
179
+ <button type="button" (click)="clear()">limpiar</button>
180
+ </span>
181
+ </div>
182
+ <div class="dbg-panel__body">
183
+ @for (e of entries(); track $index) {
184
+ <div class="dbg-line" [class]="'dbg-line--' + e.level">
185
+ <span class="dbg-line__ts">{{ e.ts }}</span>
186
+ <span class="dbg-line__text">{{ e.text }}</span>
187
+ </div>
188
+ } @empty {
189
+ <div class="dbg-empty">Sin logs todavía.</div>
190
+ }
191
+ </div>
192
+ </div>
193
+ }
194
+ }
195
+ `, isInline: true, styles: [":host{position:fixed;z-index:2147483000;inset:auto 0 0 auto;pointer-events:none}.dbg-fab,.dbg-panel{pointer-events:auto}.dbg-fab{position:fixed;right:calc(12px + env(safe-area-inset-right,0px));bottom:calc(12px + env(safe-area-inset-bottom,0px));width:48px;height:48px;border-radius:50%;border:0;background:#1a1a1a;color:#fff;font-size:16px;font-weight:700;cursor:pointer;box-shadow:0 2px 10px #0006;display:flex;align-items:center;justify-content:center}.dbg-fab__count{position:absolute;top:-4px;right:-4px;min-width:18px;height:18px;padding:0 4px;border-radius:9px;background:#d33;color:#fff;font-size:11px;line-height:18px;text-align:center}.dbg-panel{position:fixed;right:calc(8px + env(safe-area-inset-right,0px));left:calc(8px + env(safe-area-inset-left,0px));bottom:calc(68px + env(safe-area-inset-bottom,0px));max-width:560px;margin:0 auto;max-height:55vh;display:flex;flex-direction:column;background:#101010;color:#eee;border-radius:10px;box-shadow:0 6px 24px #00000080;overflow:hidden;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.dbg-panel__bar{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;background:#1c1c1c;border-bottom:1px solid #2c2c2c}.dbg-panel__title{font-size:12px;font-weight:700}.dbg-panel__actions button{margin-left:8px;background:#2c2c2c;color:#eee;border:0;border-radius:6px;padding:4px 10px;font-size:11px;cursor:pointer}.dbg-panel__body{overflow-y:auto;padding:6px 8px;-webkit-overflow-scrolling:touch}.dbg-line{display:flex;gap:6px;padding:3px 0;font-size:11px;line-height:1.4;border-bottom:1px solid rgba(255,255,255,.04);word-break:break-word}.dbg-line__ts{flex-shrink:0;color:#777}.dbg-line__text{white-space:pre-wrap}.dbg-line--log .dbg-line__text{color:#ddd}.dbg-line--info .dbg-line__text{color:#6cb6ff}.dbg-line--warn .dbg-line__text{color:#f1c40f}.dbg-line--error .dbg-line__text{color:#ff6b6b}.dbg-empty{padding:12px;font-size:11px;color:#777;text-align:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
196
+ }
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DebugConsoleComponent, decorators: [{
198
+ type: Component,
199
+ args: [{ selector: 'val-debug-console', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
200
+ @if (enabled) {
201
+ <button
202
+ type="button"
203
+ class="dbg-fab"
204
+ (click)="toggle()"
205
+ [attr.aria-label]="open() ? 'Cerrar consola' : 'Abrir consola'"
206
+ >
207
+ {{ open() ? '×' : '‹/›' }}
208
+ @if (!open() && entries().length) {
209
+ <span class="dbg-fab__count">{{ entries().length }}</span>
210
+ }
211
+ </button>
212
+
213
+ @if (open()) {
214
+ <div class="dbg-panel" role="log">
215
+ <div class="dbg-panel__bar">
216
+ <span class="dbg-panel__title"> Debug · {{ entries().length }} </span>
217
+ <span class="dbg-panel__actions">
218
+ <button type="button" (click)="copy()">copiar</button>
219
+ <button type="button" (click)="clear()">limpiar</button>
220
+ </span>
221
+ </div>
222
+ <div class="dbg-panel__body">
223
+ @for (e of entries(); track $index) {
224
+ <div class="dbg-line" [class]="'dbg-line--' + e.level">
225
+ <span class="dbg-line__ts">{{ e.ts }}</span>
226
+ <span class="dbg-line__text">{{ e.text }}</span>
227
+ </div>
228
+ } @empty {
229
+ <div class="dbg-empty">Sin logs todavía.</div>
230
+ }
231
+ </div>
232
+ </div>
233
+ }
234
+ }
235
+ `, styles: [":host{position:fixed;z-index:2147483000;inset:auto 0 0 auto;pointer-events:none}.dbg-fab,.dbg-panel{pointer-events:auto}.dbg-fab{position:fixed;right:calc(12px + env(safe-area-inset-right,0px));bottom:calc(12px + env(safe-area-inset-bottom,0px));width:48px;height:48px;border-radius:50%;border:0;background:#1a1a1a;color:#fff;font-size:16px;font-weight:700;cursor:pointer;box-shadow:0 2px 10px #0006;display:flex;align-items:center;justify-content:center}.dbg-fab__count{position:absolute;top:-4px;right:-4px;min-width:18px;height:18px;padding:0 4px;border-radius:9px;background:#d33;color:#fff;font-size:11px;line-height:18px;text-align:center}.dbg-panel{position:fixed;right:calc(8px + env(safe-area-inset-right,0px));left:calc(8px + env(safe-area-inset-left,0px));bottom:calc(68px + env(safe-area-inset-bottom,0px));max-width:560px;margin:0 auto;max-height:55vh;display:flex;flex-direction:column;background:#101010;color:#eee;border-radius:10px;box-shadow:0 6px 24px #00000080;overflow:hidden;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.dbg-panel__bar{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;background:#1c1c1c;border-bottom:1px solid #2c2c2c}.dbg-panel__title{font-size:12px;font-weight:700}.dbg-panel__actions button{margin-left:8px;background:#2c2c2c;color:#eee;border:0;border-radius:6px;padding:4px 10px;font-size:11px;cursor:pointer}.dbg-panel__body{overflow-y:auto;padding:6px 8px;-webkit-overflow-scrolling:touch}.dbg-line{display:flex;gap:6px;padding:3px 0;font-size:11px;line-height:1.4;border-bottom:1px solid rgba(255,255,255,.04);word-break:break-word}.dbg-line__ts{flex-shrink:0;color:#777}.dbg-line__text{white-space:pre-wrap}.dbg-line--log .dbg-line__text{color:#ddd}.dbg-line--info .dbg-line__text{color:#6cb6ff}.dbg-line--warn .dbg-line__text{color:#f1c40f}.dbg-line--error .dbg-line__text{color:#ff6b6b}.dbg-empty{padding:12px;font-size:11px;color:#777;text-align:center}\n"] }]
236
+ }] });
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctY29uc29sZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2RlYnVnLWNvbnNvbGUvZGVidWctY29uc29sZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBR2pEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFFSCxpREFBaUQ7QUFDakQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBNkN4QixNQUFNLE9BQU8scUJBQXFCO0lBM0NsQztRQTRDRSw2RUFBNkU7UUFDcEUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUM7UUFFOUUsU0FBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixZQUFPLEdBQUcsTUFBTSxDQUFrQixFQUFFLENBQUMsQ0FBQztRQUUvQzs7Ozs7V0FLRztRQUNLLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBQzdCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRS9CLHlFQUF5RTtRQUNqRSxhQUFRLEdBQWlFLEVBQUUsQ0FBQztLQTJHckY7SUF6R0MsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsY0FBYyxFQUFFLENB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T0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQzsrR0EzSFUscUJBQXFCO21HQUFyQixxQkFBcUIsNkVBdkN0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NUOzs0RkFHVSxxQkFBcUI7a0JBM0NqQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBWQUxURUNIX0RFQlVHX0NPTlNPTEUgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBEZWJ1Z0xvZ0VudHJ5LCBEZWJ1Z0xvZ0xldmVsIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYHZhbC1kZWJ1Zy1jb25zb2xlYCDigJQgb3ZlcmxheSBkZSBsb2dzIGVuIHBhbnRhbGxhIHBhcmEgZGlhZ27Ds3N0aWNvLlxuICpcbiAqIEhlcnJhbWllbnRhIGRlIGRlc2Fycm9sbG8uIFBlcm1pdGUgbGVlciBsb3MgYGNvbnNvbGUuKmAgZGVzZGUgdW4gUFdBIGVuIGlPU1xuICogYcOxYWRpZG8gYSBsYSBwYW50YWxsYSBkZSBpbmljaW8sIGRvbmRlIGxhIGNvbnNvbGEgZGVsIG5hdmVnYWRvciBubyBlc1xuICogYWNjZXNpYmxlLlxuICpcbiAqIENvbXBvcnRhbWllbnRvOlxuICogIC0gTW9ua2V5LXBhdGNoIGRlIGBjb25zb2xlLmxvZy93YXJuL2Vycm9yL2luZm9gOiBjYWRhIGxsYW1hZGEgdGFtYmnDqW4gZW1wdWphXG4gKiAgICB1bmEgZW50cmFkYSBhbCBidWZmZXIgKMO6bHRpbWFzIH4xNTApIGFkZW3DoXMgZGUgbGxhbWFyIGFsIGBjb25zb2xlYCBvcmlnaW5hbC5cbiAqICAtIEJvdMOzbiBmbG90YW50ZSAoZXNxdWluYSkgcXVlIGFicmUvY2llcnJhIHVuIHBhbmVsIHNjcm9sbGFibGUgY29uIGxhc1xuICogICAgZW50cmFkYXMgbcOhcyBudWV2YXMgYWJham8sIGNvbG9yZWFkYXMgcG9yIG5pdmVsLlxuICogIC0gQm90b25lcyBcImNvcGlhclwiIChhbCBwb3J0YXBhcGVsZXMpIHkgXCJsaW1waWFyXCIuXG4gKlxuICogR2F0ZSBtYWVzdHJvIHbDrWEgYHByb3ZpZGVWYWx0ZWNoRGVidWdDb25zb2xlKHsgZW5hYmxlZCB9KWAgZW4gYG1haW4udHNgLiBTaW5cbiAqIHByb3ZpZGVyIOKAlCBvIGNvbiBgZW5hYmxlZDogZmFsc2VgIOKAlCBlbCBjb21wb25lbnRlIE5PIHBhcmNoZWEgYGNvbnNvbGVgIHkgTk9cbiAqIHJlbmRlcml6YSBuYWRhLiBMYSBhcHAgZGVjaWRlIGVsIHZhbG9yIChub3JtYWxtZW50ZSBgIWVudmlyb25tZW50LnByb2R1Y3Rpb25gKS5cbiAqXG4gKiBpMThuOiBOTyB1c2EgaTE4biBhIHByb3DDs3NpdG8g4oCUIGVzIHVuIGRldi10b29sIHF1ZSBuaW5nw7puIGVuZC11c2VyIHZlO1xuICogbG9zIGxhYmVscyB2YW4gZW4gZXNwYcOxb2wgcGxhbm8uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIG1haW4udHNcbiAqIHByb3ZpZGVWYWx0ZWNoRGVidWdDb25zb2xlKHsgZW5hYmxlZDogIWVudmlyb25tZW50LnByb2R1Y3Rpb24gfSksXG4gKiBgYGBcbiAqIGBgYGh0bWxcbiAqIDwhLS0gY29tcG9uZW50ZSByYcOteiwgdW5hIHNvbGEgdmV6IC0tPlxuICogPHZhbC1kZWJ1Zy1jb25zb2xlIC8+XG4gKiBgYGBcbiAqL1xuXG4vKiogTcOheGltbyBkZSBlbnRyYWRhcyByZXRlbmlkYXMgZW4gZWwgYnVmZmVyLiAqL1xuY29uc3QgTUFYX0VOVFJJRVMgPSAxNTA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1kZWJ1Zy1jb25zb2xlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChlbmFibGVkKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImRiZy1mYWJcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm9wZW4oKSA/ICdDZXJyYXIgY29uc29sYScgOiAnQWJyaXIgY29uc29sYSdcIlxuICAgICAgPlxuICAgICAgICB7eyBvcGVuKCkgPyAnw5cnIDogJ+KAuS/igLonIH19XG4gICAgICAgIEBpZiAoIW9wZW4oKSAmJiBlbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctZmFiX19jb3VudFwiPnt7IGVudHJpZXMoKS5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICBAaWYgKG9wZW4oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXBhbmVsXCIgcm9sZT1cImxvZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctcGFuZWxfX2JhclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctcGFuZWxfX3RpdGxlXCI+IERlYnVnIMK3IHt7IGVudHJpZXMoKS5sZW5ndGggfX0gPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctcGFuZWxfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNvcHkoKVwiPmNvcGlhcjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXIoKVwiPmxpbXBpYXI8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXBhbmVsX19ib2R5XCI+XG4gICAgICAgICAgICBAZm9yIChlIG9mIGVudHJpZXMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctbGluZVwiIFtjbGFzc109XCInZGJnLWxpbmUtLScgKyBlLmxldmVsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctbGluZV9fdHNcIj57eyBlLnRzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLWxpbmVfX3RleHRcIj57eyBlLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLWVtcHR5XCI+U2luIGxvZ3MgdG9kYXbDrWEuPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZGVidWctY29uc29sZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEZWJ1Z0NvbnNvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBHYXRlIG1hZXN0cm86IGBmYWxzZWAgKHNpbiBwcm92aWRlciBvIGBlbmFibGVkOiBmYWxzZWApIOKGkiB0b2RvIGluZXJ0ZS4gKi9cbiAgcmVhZG9ubHkgZW5hYmxlZCA9IGluamVjdChWQUxURUNIX0RFQlVHX0NPTlNPTEUsIHsgb3B0aW9uYWw6IHRydWUgfSk/LmVuYWJsZWQgPz8gZmFsc2U7XG5cbiAgcmVhZG9ubHkgb3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGVudHJpZXMgPSBzaWduYWw8RGVidWdMb2dFbnRyeVtdPihbXSk7XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciBwbGFubyAoTk8gc2lnbmFsKS4gYGNvbnNvbGUubG9nYCBwdWVkZSBpbnZvY2Fyc2UgZGVudHJvIGRlIHVuXG4gICAqIGBlZmZlY3QoKWAvYGNvbXB1dGVkKClgOyBlc2NyaWJpciBlbCBzaWduYWwgYGVudHJpZXNgIGFow60gbWlzbW8gZGlzcGFyYVxuICAgKiBORzA2MDAuIEFjdW11bGFtb3MgZW4gZXN0ZSBhcnJheSB5IHZvbGNhbW9zIGFsIHNpZ25hbCBlbiB1biBtaWNyb3Rhc2ssXG4gICAqIGZ1ZXJhIGRlIHRvZG8gY29udGV4dG8gcmVhY3Rpdm8uXG4gICAqL1xuICBwcml2YXRlIGJ1ZmZlcjogRGVidWdMb2dFbnRyeVtdID0gW107XG4gIHByaXZhdGUgZmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvKiogUmVmZXJlbmNpYXMgYSBsb3MgbcOpdG9kb3Mgb3JpZ2luYWxlcyBwYXJhIHJlc3RhdXJhcmxvcyBlbiBkZXN0cm95LiAqL1xuICBwcml2YXRlIG9yaWdpbmFsOiBQYXJ0aWFsPFJlY29yZDxEZWJ1Z0xvZ0xldmVsLCAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkPj4gPSB7fTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMucGF0Y2hDb25zb2xlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzdG9yZUNvbnNvbGUoKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4udXBkYXRlKHYgPT4gIXYpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLmVudHJpZXMuc2V0KFtdKTtcbiAgfVxuXG4gIGFzeW5jIGNvcHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZW50cmllcygpXG4gICAgICAubWFwKGUgPT4gYCR7ZS50c30gWyR7ZS5sZXZlbH1dICR7ZS50ZXh0fWApXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbGJhY2sgcGFyYSBXZWJWaWV3cyBzaW4gQ2xpcGJvYXJkIEFQSS5cbiAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgIHRhLnZhbHVlID0gdGV4dDtcbiAgICAgIHRhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRhLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTtcbiAgICAgIHRhLnNlbGVjdCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBzaW4gcmVjdXJzbyBkZSBjb3BpYSBkaXNwb25pYmxlICovXG4gICAgICB9XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRhKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVlbXBsYXphIGxvcyBtw6l0b2RvcyBkZSBgY29uc29sZWAgcGFyYSBlc3BlamFyIGNhZGEgbGxhbWFkYSBhbCBidWZmZXIuICovXG4gIHByaXZhdGUgcGF0Y2hDb25zb2xlKCk6IHZvaWQge1xuICAgIGNvbnN0IGxldmVsczogRGVidWdMb2dMZXZlbFtdID0gWydsb2cnLCAnd2FybicsICdlcnJvcicsICdpbmZvJ107XG4gICAgZm9yIChjb25zdCBsZXZlbCBvZiBsZXZlbHMpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSBjb25zb2xlW2xldmVsXS5iaW5kKGNvbnNvbGUpIGFzICguLi5hOiB1bmtub3duW10pID0+IHZvaWQ7XG4gICAgICB0aGlzLm9yaWdpbmFsW2xldmVsXSA9IG9yaWc7XG4gICAgICBjb25zb2xlW2xldmVsXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgb3JpZyguLi5hcmdzKTtcbiAgICAgICAgdGhpcy5wdXNoKGxldmVsLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc3RhdXJhIGxvcyBtw6l0b2RvcyBvcmlnaW5hbGVzIGRlIGBjb25zb2xlYC4gKi9cbiAgcHJpdmF0ZSByZXN0b3JlQ29uc29sZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxldmVsIG9mIE9iamVjdC5rZXlzKHRoaXMub3JpZ2luYWwpIGFzIERlYnVnTG9nTGV2ZWxbXSkge1xuICAgICAgY29uc3Qgb3JpZyA9IHRoaXMub3JpZ2luYWxbbGV2ZWxdO1xuICAgICAgaWYgKG9yaWcpIHtcbiAgICAgICAgY29uc29sZVtsZXZlbF0gPSBvcmlnO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9yaWdpbmFsID0ge307XG4gIH1cblxuICAvKipcbiAgICogQWdyZWdhIHVuYSBlbnRyYWRhIGFsIGJ1ZmZlciBwbGFubyB5IHByb2dyYW1hIGVsIHZvbGNhZG8gYWwgc2lnbmFsLlxuICAgKiBFbCB2b2xjYWRvIHNlIGRpZmllcmUgYSB1biBtaWNyb3Rhc2s6IGBjb25zb2xlLmxvZ2AgcHVlZGUgbGxhbWFyc2UgZGVzZGVcbiAgICogZGVudHJvIGRlIHVuIGBlZmZlY3QoKWAsIHkgZXNjcmliaXIgdW4gc2lnbmFsIGFow60gbGFuemFyw61hIE5HMDYwMC5cbiAgICovXG4gIHByaXZhdGUgcHVzaChsZXZlbDogRGVidWdMb2dMZXZlbCwgYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IGFyZ3MubWFwKGEgPT4gdGhpcy5zdHJpbmdpZnkoYSkpLmpvaW4oJyAnKTtcbiAgICBjb25zdCB0cyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgxMSwgMjMpO1xuICAgIHRoaXMuYnVmZmVyLnB1c2goeyB0cywgbGV2ZWwsIHRleHQgfSk7XG4gICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+IE1BWF9FTlRSSUVTKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmxlbmd0aCAtIE1BWF9FTlRSSUVTKTtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZUZsdXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogVnVlbGNhIGVsIGJ1ZmZlciBhbCBzaWduYWwgYGVudHJpZXNgIGVuIHVuIG1pY3JvdGFzayDigJQgZnVlcmEgZGVsIGNvbnRleHRvXG4gICAqIHJlYWN0aXZvIGRlc2RlIGVsIHF1ZSBzZSBoYXlhIGxsYW1hZG8gYGNvbnNvbGUubG9nYC4gQmF0Y2hlYTogbcO6bHRpcGxlc1xuICAgKiBsb2dzIGRlbCBtaXNtbyB0aWNrIHJlc3VsdGFuIGVuIHVuYSBzb2xhIGVzY3JpdHVyYSBkZWwgc2lnbmFsLlxuICAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZUZsdXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZsdXNoU2NoZWR1bGVkKSByZXR1cm47XG4gICAgdGhpcy5mbHVzaFNjaGVkdWxlZCA9IHRydWU7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdGhpcy5mbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChbLi4udGhpcy5idWZmZXJdKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb252aWVydGUgY3VhbHF1aWVyIGFyZ3VtZW50byBhIHVuYSByZXByZXNlbnRhY2nDs24gbGVnaWJsZSBkZSB1bmEgbMOtbmVhLiAqL1xuICBwcml2YXRlIHN0cmluZ2lmeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGAke3ZhbHVlLm5hbWV9OiAke3ZhbHVlLm1lc3NhZ2V9YDtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,12 @@
1
+ /**
2
+ * DebugConsole Types
3
+ *
4
+ * Tipos para el overlay de logs en pantalla (`val-debug-console`).
5
+ */
6
+ /**
7
+ * Configuración por defecto: deshabilitado (inerte).
8
+ */
9
+ export const DEFAULT_DEBUG_CONSOLE_CONFIG = {
10
+ enabled: false,
11
+ };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2RlYnVnLWNvbnNvbGUvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQWFIOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlDO0lBQ3hFLE9BQU8sRUFBRSxLQUFLO0NBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVidWdDb25zb2xlIFR5cGVzXG4gKlxuICogVGlwb3MgcGFyYSBlbCBvdmVybGF5IGRlIGxvZ3MgZW4gcGFudGFsbGEgKGB2YWwtZGVidWctY29uc29sZWApLlxuICovXG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGVsIHByb3ZlZWRvciBkZSBEZWJ1Z0NvbnNvbGUuXG4gKlxuICogQHByb3BlcnR5IGVuYWJsZWQgLSBHYXRlIG1hZXN0cm8uIEN1YW5kbyBlcyBgZmFsc2VgIGVsIGNvbXBvbmVudGUgTk8gcGFyY2hlYVxuICogICBgY29uc29sZWAgeSBOTyByZW5kZXJpemEgbmFkYS4gTGEgYXBwIGRlY2lkZSBlbCB2YWxvciDigJQgbm9ybWFsbWVudGVcbiAqICAgYCFlbnZpcm9ubWVudC5wcm9kdWN0aW9uYC4gU2luIHByb3ZpZGVyLCBlbCBkZWZhdWx0IGVzIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdDb25zb2xlQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gcG9yIGRlZmVjdG86IGRlc2hhYmlsaXRhZG8gKGluZXJ0ZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RFQlVHX0NPTlNPTEVfQ09ORklHOiBSZXF1aXJlZDxEZWJ1Z0NvbnNvbGVDb25maWc+ID0ge1xuICBlbmFibGVkOiBmYWxzZSxcbn07XG5cbi8qKiBOaXZlbCBkZSBsb2cgY2FwdHVyYWRvLiAqL1xuZXhwb3J0IHR5cGUgRGVidWdMb2dMZXZlbCA9ICdsb2cnIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdpbmZvJztcblxuLyoqIEVudHJhZGEgZGVsIGJ1ZmZlciBkZSBsb2dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWJ1Z0xvZ0VudHJ5IHtcbiAgdHM6IHN0cmluZztcbiAgbGV2ZWw6IERlYnVnTG9nTGV2ZWw7XG4gIHRleHQ6IHN0cmluZztcbn1cbiJdfQ==
@@ -159,6 +159,15 @@ export class AppVersionService {
159
159
  this.swUpdate.versionUpdates
160
160
  .pipe(filter(evt => evt.type === 'VERSION_READY'), takeUntilDestroyed(this.destroyRef))
161
161
  .subscribe(() => this.swUpdateReady.set(true));
162
+ // SW en estado irrecuperable — la caché del service worker se corrompió o
163
+ // fue parcialmente evictada (común en PWAs standalone de iOS tras deploys
164
+ // repetidos). La app no puede cargar sus assets → pantalla en blanco.
165
+ // Recuperación recomendada por Angular: recargar para traer todo fresco
166
+ // desde la red.
167
+ this.swUpdate.unrecoverable.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {
168
+ console.error('[AppVersionService] SW unrecoverable — reloading:', event.reason);
169
+ this.document.defaultView?.location.reload();
170
+ });
162
171
  // Chequeo periódico.
163
172
  const intervalMs = this.serviceConfig?.checkIntervalMs ?? DEFAULT_APP_VERSION_SERVICE_CONFIG.checkIntervalMs;
164
173
  interval(intervalMs)
@@ -184,4 +193,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
184
193
  type: Injectable,
185
194
  args: [{ providedIn: 'root' }]
186
195
  }], ctorParameters: () => [] });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXZlcnNpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYXBwLXZlcnNpb24vYXBwLXZlcnNpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQyxPQUFPLEVBQW9CLGtDQUFrQyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUUvRTs7O0dBR0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMxQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxN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LEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpELHFCQUFxQjtRQUNyQixNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsYUFBYSxFQUFFLGVBQWUsSUFBSSxrQ0FBa0MsQ0FBQyxlQUFlLENBQUM7UUFFNUYsUUFBUSxDQUFDLFVBQVUsQ0FBQzthQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLHlDQUF5QztRQUN6QyxNQUFNLFNBQVMsR0FBRyxHQUFTLEVBQUU7WUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEQsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxtQkFBbUI7UUFDbkIsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkIsQ0FBQzsrR0F6SlUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNOzs0RkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwVmVyc2lvblNlcnZpY2VcbiAqXG4gKiBWZXJpZmljYWNpw7NuIGRlIHZlcnNpw7NuIGRlIGxhIGFwcCBwYXJhIFBXQSAvIHdlYi5cbiAqXG4gKiBVbmlmaWNhIGRvcyBzZcOxYWxlcyBwYXJhIGRldGVjdGFyIGFjdHVhbGl6YWNpb25lczpcbiAqXG4gKiAxLiBgU3dVcGRhdGVgIChgQGFuZ3VsYXIvc2VydmljZS13b3JrZXJgKSDigJQgZWwgZXZlbnRvIGBWRVJTSU9OX1JFQURZYCBpbmRpY2FcbiAqICAgIHF1ZSB1biBidW5kbGUgbnVldm8gZnVlIGRlc2NhcmdhZG8geSBlc3TDoSBsaXN0byBwYXJhIGFjdGl2YXJzZS4gU29sbyBlc3TDoVxuICogICAgZGlzcG9uaWJsZSBjdWFuZG8gZWwgc2VydmljZSB3b3JrZXIgZXN0w6EgcmVnaXN0cmFkbyAoYnVpbGQgZGUgcHJvZHVjY2nDs24pLlxuICogICAgQWRlbcOhcyBzZSBjaGVxdWVhIHByb2FjdGl2YW1lbnRlIGNhZGEgYGNoZWNrSW50ZXJ2YWxNc2AgeSBjYWRhIHZleiBxdWUgbGFcbiAqICAgIGFwcCB2dWVsdmUgYSBmb3JlZ3JvdW5kIChgdmlzaWJpbGl0eWNoYW5nZWApLlxuICpcbiAqIDIuIGBBcHBDb25maWdTZXJ2aWNlYCAoY29uZmlnIHJlbW90byBlbiBGaXJlc3RvcmUpIOKAlCBleHBvbmUgYHZlcnNpb25gXG4gKiAgICAow7psdGltYSB2ZXJzacOzbiBwdWJsaWNhZGEpIHkgYG1pblZlcnNpb25gICh2ZXJzacOzbiBtw61uaW1hIHNvcG9ydGFkYSkuXG4gKiAgICBTZSB1c2EgcGFyYSBsYSBwb2zDrXRpY2EgZGUgYWN0dWFsaXphY2nDs24gb2JsaWdhdG9yaWEgKGhhcmQgZ2F0ZSkuXG4gKlxuICogQW1iYXMgZGVwZW5kZW5jaWFzIHNlIGlueWVjdGFuIGNvbW8gb3BjaW9uYWxlczogZWwgc2VydmljaW8gZGVncmFkYSBjb25cbiAqIGdyYWNpYSBzaSBlbCBTVyBubyBlc3TDoSBoYWJpbGl0YWRvIChkZXYgbW9kZSkgbyBzaSBgQXBwQ29uZmlnU2VydmljZWAgbm9cbiAqIGVzdMOhIHdpcmVhZG8gZW4gbGEgYXBwLlxuICovXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlc3Ryb3lSZWYsIEluamVjdGFibGUsIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBTd1VwZGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3NlcnZpY2Utd29ya2VyJztcbmltcG9ydCB7IGZpbHRlciwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXBwQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL2FwcC1jb25maWcvYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFZBTFRFQ0hfQVBQX1ZFUlNJT04gfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBBcHBWZXJzaW9uU3RhdHVzLCBERUZBVUxUX0FQUF9WRVJTSU9OX1NFUlZJQ0VfQ09ORklHIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ29tcGFyYSBkb3MgdmVyc2lvbmVzIHNlbXZlci4gUmV0b3JuYSB0cnVlIHNpIGBhYCBlcyBlc3RyaWN0YW1lbnRlIG1lbm9yXG4gKiBxdWUgYGJgLiBUb2xlcmFudGUgYSBsb25naXR1ZGVzIGRpc3RpbnRhcyB5IGEgcGFydGVzIG5vIG51bcOpcmljYXMuXG4gKi9cbmZ1bmN0aW9uIGlzVmVyc2lvbkxvd2VyKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhID0gYS5zcGxpdCgnLicpLm1hcChuID0+IE51bWJlcihuKSB8fCAwKTtcbiAgY29uc3QgcGIgPSBiLnNwbGl0KCcuJykubWFwKG4gPT4gTnVtYmVyKG4pIHx8IDApO1xuICBjb25zdCBsZW4gPSBNYXRoLm1heChwYS5sZW5ndGgsIHBiLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHggPSBwYVtpXSB8fCAwO1xuICAgIGNvbnN0IHkgPSBwYltpXSB8fCAwO1xuICAgIGlmICh4IDwgeSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHggPiB5KSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXBwVmVyc2lvblNlcnZpY2Uge1xuICAvKiogU3dVcGRhdGUgc29sbyBleGlzdGUgc2kgZWwgU1cgZXN0w6EgcmVnaXN0cmFkbyAocHJvZCBidWlsZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3dVcGRhdGUgPSBpbmplY3QoU3dVcGRhdGUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIC8qKiBBcHBDb25maWdTZXJ2aWNlIGVzIG9wY2lvbmFsOiBsYSBhcHAgcHVlZGUgbm8gd2lyZWFybG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwQ29uZmlnID0gaW5qZWN0KEFwcENvbmZpZ1NlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZUNvbmZpZyA9IGluamVjdChWQUxURUNIX0FQUF9WRVJTSU9OLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8qKiBUcnVlIGN1YW5kbyBlbCBTVyByZXBvcnTDsyB1biBidW5kbGUgbnVldm8gbGlzdG8gKGBWRVJTSU9OX1JFQURZYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3dVcGRhdGVSZWFkeSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLyoqXG4gICAqIFRydWUgY3VhbmRvIGVsIHVzdWFyaW8gZGVzY2FydMOzIGVsIGJhbm5lciBkZSBhY3R1YWxpemFjacOzbiBvcGNpb25hbC5cbiAgICogRWwgYmFubmVyIG9ibGlnYXRvcmlvIChgdXBkYXRlLXJlcXVpcmVkYCkgaWdub3JhIGVzdGUgZmxhZy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc21pc3NlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc21pc3NlZDogU2lnbmFsPGJvb2xlYW4+ID0gdGhpcy5fZGlzbWlzc2VkLmFzUmVhZG9ubHkoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU0lHTkFMUyBQw5pCTElDT1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZlcnNpw7NuIGxvY2FsIGRlbCBidWlsZCBhY3R1YWwgZGUgbGEgYXBwLlxuICAgKiBQcm92aWVuZSBkZWwgcHJvdmlkZXIgYHByb3ZpZGVWYWx0ZWNoQXBwVmVyc2lvbih7IGN1cnJlbnRWZXJzaW9uIH0pYC5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRWZXJzaW9uOiBTaWduYWw8c3RyaW5nPiA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuc2VydmljZUNvbmZpZz8uY3VycmVudFZlcnNpb24gPz8gJzAuMC4wJ1xuICApO1xuXG4gIC8qKlxuICAgKiDDmmx0aW1hIHZlcnNpw7NuIHB1YmxpY2FkYSBzZWfDum4gZWwgY29uZmlnIHJlbW90by5cbiAgICogYG51bGxgIHNpIGBBcHBDb25maWdTZXJ2aWNlYCBubyBlc3TDoSBkaXNwb25pYmxlIG8gYcO6biBubyBjYXJnw7MuXG4gICAqL1xuICByZWFkb25seSBsYXRlc3RWZXJzaW9uOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4gPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmFwcENvbmZpZz8ucmVtb3RlVmVyc2lvbigpID8/IG51bGxcbiAgKTtcblxuICAvKipcbiAgICogRXN0YWRvIGRlIGxhIHZlcnNpw7NuOlxuICAgKiAtIGB1cGRhdGUtcmVxdWlyZWRgIOKAlCBsYSB2ZXJzacOzbiBsb2NhbCBxdWVkw7MgcG9yIGRlYmFqbyBkZSBgbWluVmVyc2lvbmBcbiAgICogICBkZWwgY29uZmlnIHJlbW90by4gSGFyZCBnYXRlLiBTb2xvIHNpIGBBcHBDb25maWdTZXJ2aWNlYCB0aWVuZSBkYXRvcy5cbiAgICogLSBgdXBkYXRlLWF2YWlsYWJsZWAg4oCUIGVsIFNXIGRlc2NhcmfDsyB1biBidW5kbGUgbnVldm8gKGBWRVJTSU9OX1JFQURZYClcbiAgICogICBvIGBBcHBDb25maWdTZXJ2aWNlLmhhc1VwZGF0ZWAgZXMgdHJ1ZS5cbiAgICogLSBgdXAtdG8tZGF0ZWAg4oCUIGVuIGN1YWxxdWllciBvdHJvIGNhc28uXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6IFNpZ25hbDxBcHBWZXJzaW9uU3RhdHVzPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyAxLiBIYXJkIGdhdGUg4oCUIG1pblZlcnNpb24gZGVsIGNvbmZpZyByZW1vdG8uXG4gICAgaWYgKHRoaXMuYXBwQ29uZmlnKSB7XG4gICAgICBjb25zdCBtaW5WZXJzaW9uID0gdGhpcy5hcHBDb25maWcuYXBwQ29uZmlnKCk/Lm1pblZlcnNpb247XG4gICAgICBpZiAobWluVmVyc2lvbiAmJiBpc1ZlcnNpb25Mb3dlcih0aGlzLmN1cnJlbnRWZXJzaW9uKCksIG1pblZlcnNpb24pKSB7XG4gICAgICAgIHJldHVybiAndXBkYXRlLXJlcXVpcmVkJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBVcGRhdGUgb3BjaW9uYWwg4oCUIFNXIGJ1bmRsZSBsaXN0byBvIGNvbmZpZyByZW1vdG8gbcOhcyBudWV2by5cbiAgICBpZiAodGhpcy5zd1VwZGF0ZVJlYWR5KCkgfHwgdGhpcy5hcHBDb25maWc/Lmhhc1VwZGF0ZSgpKSB7XG4gICAgICByZXR1cm4gJ3VwZGF0ZS1hdmFpbGFibGUnO1xuICAgIH1cblxuICAgIHJldHVybiAndXAtdG8tZGF0ZSc7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMud2lyZVNlcnZpY2VXb3JrZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNw4lUT0RPUyBQw5pCTElDT1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwbGljYSBsYSBhY3R1YWxpemFjacOzbiBwZW5kaWVudGUuXG4gICAqXG4gICAqIFNpIGVsIFNXIGVzdMOhIGhhYmlsaXRhZG8sIGFjdGl2YSBsYSB2ZXJzacOzbiBkZXNjYXJnYWRhIHkgcmVjYXJnYTsgc2kgbm8sXG4gICAqIHNvbG8gcmVjYXJnYSBsYSBww6FnaW5hIChsYSB3ZWIgb2J0aWVuZSBlbCBidW5kbGUgbnVldm8gZGVsIHNlcnZpZG9yKS5cbiAgICovXG4gIGFzeW5jIGFwcGx5VXBkYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zd1VwZGF0ZT8uaXNFbmFibGVkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dVcGRhdGUuYWN0aXZhdGVVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0FwcFZlcnNpb25TZXJ2aWNlXSBhY3RpdmF0ZVVwZGF0ZSBmYWlsZWQ6JywgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldz8ubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2NhcnRhIGVsIGJhbm5lciBkZSBhY3R1YWxpemFjacOzbiBvcGNpb25hbC5cbiAgICogTm8gdGllbmUgZWZlY3RvIHNvYnJlIGVsIGVzdGFkbyBgdXBkYXRlLXJlcXVpcmVkYCAoaGFyZCBnYXRlKS5cbiAgICovXG4gIGRpc21pc3MoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzbWlzc2VkLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWVyemEgdW4gY2hlcXVlbyBkZSBhY3R1YWxpemFjacOzbiBkZWwgc2VydmljZSB3b3JrZXIuXG4gICAqIE5vLW9wIHNpIGVsIFNXIG5vIGVzdMOhIGhhYmlsaXRhZG8uXG4gICAqL1xuICBhc3luYyBjaGVja05vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc3dVcGRhdGU/LmlzRW5hYmxlZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN3VXBkYXRlLmNoZWNrRm9yVXBkYXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tBcHBWZXJzaW9uU2VydmljZV0gY2hlY2tGb3JVcGRhdGUgZmFpbGVkOicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBRE9cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN1c2NyaWJlIGB2ZXJzaW9uVXBkYXRlc2AsIHByb2dyYW1hIGNoZXF1ZW9zIHBlcmnDs2RpY29zIHkgcmVhY2Npb25hIGFsXG4gICAqIHZvbHZlciBsYSBhcHAgYSBmb3JlZ3JvdW5kLiBTb2xvIGFjdMO6YSBzaSBlbCBTVyBlc3TDoSBoYWJpbGl0YWRvLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlU2VydmljZVdvcmtlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3dVcGRhdGU/LmlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgLy8gQnVuZGxlIG51ZXZvIGRlc2NhcmdhZG8geSBsaXN0by5cbiAgICB0aGlzLnN3VXBkYXRlLnZlcnNpb25VcGRhdGVzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2dCA9PiBldnQudHlwZSA9PT0gJ1ZFUlNJT05fUkVBRFknKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zd1VwZGF0ZVJlYWR5LnNldCh0cnVlKSk7XG5cbiAgICAvLyBDaGVxdWVvIHBlcmnDs2RpY28uXG4gICAgY29uc3QgaW50ZXJ2YWxNcyA9XG4gICAgICB0aGlzLnNlcnZpY2VDb25maWc/LmNoZWNrSW50ZXJ2YWxNcyA/PyBERUZBVUxUX0FQUF9WRVJTSU9OX1NFUlZJQ0VfQ09ORklHLmNoZWNrSW50ZXJ2YWxNcztcblxuICAgIGludGVydmFsKGludGVydmFsTXMpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdm9pZCB0aGlzLmNoZWNrTm93KCkpO1xuXG4gICAgLy8gQ2hlcXVlbyBhbCB2b2x2ZXIgbGEgYXBwIGEgZm9yZWdyb3VuZC5cbiAgICBjb25zdCBvblZpc2libGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgICB2b2lkIHRoaXMuY2hlY2tOb3coKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uVmlzaWJsZSk7XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2libGUpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlcXVlbyBpbmljaWFsLlxuICAgIHZvaWQgdGhpcy5jaGVja05vdygpO1xuICB9XG59XG4iXX0=
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXZlcnNpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvYXBwLXZlcnNpb24vYXBwLXZlcnNpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQyxPQUFPLEVBQW9CLGtDQUFrQyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUUvRTs7O0dBR0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMxQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxN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QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBRUgsbUJBQW1CO1FBQ25CLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7K0dBbktVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBREosTUFBTTs7NEZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcFZlcnNpb25TZXJ2aWNlXG4gKlxuICogVmVyaWZpY2FjacOzbiBkZSB2ZXJzacOzbiBkZSBsYSBhcHAgcGFyYSBQV0EgLyB3ZWIuXG4gKlxuICogVW5pZmljYSBkb3Mgc2XDsWFsZXMgcGFyYSBkZXRlY3RhciBhY3R1YWxpemFjaW9uZXM6XG4gKlxuICogMS4gYFN3VXBkYXRlYCAoYEBhbmd1bGFyL3NlcnZpY2Utd29ya2VyYCkg4oCUIGVsIGV2ZW50byBgVkVSU0lPTl9SRUFEWWAgaW5kaWNhXG4gKiAgICBxdWUgdW4gYnVuZGxlIG51ZXZvIGZ1ZSBkZXNjYXJnYWRvIHkgZXN0w6EgbGlzdG8gcGFyYSBhY3RpdmFyc2UuIFNvbG8gZXN0w6FcbiAqICAgIGRpc3BvbmlibGUgY3VhbmRvIGVsIHNlcnZpY2Ugd29ya2VyIGVzdMOhIHJlZ2lzdHJhZG8gKGJ1aWxkIGRlIHByb2R1Y2Npw7NuKS5cbiAqICAgIEFkZW3DoXMgc2UgY2hlcXVlYSBwcm9hY3RpdmFtZW50ZSBjYWRhIGBjaGVja0ludGVydmFsTXNgIHkgY2FkYSB2ZXogcXVlIGxhXG4gKiAgICBhcHAgdnVlbHZlIGEgZm9yZWdyb3VuZCAoYHZpc2liaWxpdHljaGFuZ2VgKS5cbiAqXG4gKiAyLiBgQXBwQ29uZmlnU2VydmljZWAgKGNvbmZpZyByZW1vdG8gZW4gRmlyZXN0b3JlKSDigJQgZXhwb25lIGB2ZXJzaW9uYFxuICogICAgKMO6bHRpbWEgdmVyc2nDs24gcHVibGljYWRhKSB5IGBtaW5WZXJzaW9uYCAodmVyc2nDs24gbcOtbmltYSBzb3BvcnRhZGEpLlxuICogICAgU2UgdXNhIHBhcmEgbGEgcG9sw610aWNhIGRlIGFjdHVhbGl6YWNpw7NuIG9ibGlnYXRvcmlhIChoYXJkIGdhdGUpLlxuICpcbiAqIEFtYmFzIGRlcGVuZGVuY2lhcyBzZSBpbnllY3RhbiBjb21vIG9wY2lvbmFsZXM6IGVsIHNlcnZpY2lvIGRlZ3JhZGEgY29uXG4gKiBncmFjaWEgc2kgZWwgU1cgbm8gZXN0w6EgaGFiaWxpdGFkbyAoZGV2IG1vZGUpIG8gc2kgYEFwcENvbmZpZ1NlcnZpY2VgIG5vXG4gKiBlc3TDoSB3aXJlYWRvIGVuIGxhIGFwcC5cbiAqL1xuXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZXN0cm95UmVmLCBJbmplY3RhYmxlLCBTaWduYWwsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgU3dVcGRhdGUgfSBmcm9tICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlcic7XG5pbXBvcnQgeyBmaWx0ZXIsIGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9hcHAtY29uZmlnL2FwcC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBWQUxURUNIX0FQUF9WRVJTSU9OIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgQXBwVmVyc2lvblN0YXR1cywgREVGQVVMVF9BUFBfVkVSU0lPTl9TRVJWSUNFX0NPTkZJRyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENvbXBhcmEgZG9zIHZlcnNpb25lcyBzZW12ZXIuIFJldG9ybmEgdHJ1ZSBzaSBgYWAgZXMgZXN0cmljdGFtZW50ZSBtZW5vclxuICogcXVlIGBiYC4gVG9sZXJhbnRlIGEgbG9uZ2l0dWRlcyBkaXN0aW50YXMgeSBhIHBhcnRlcyBubyBudW3DqXJpY2FzLlxuICovXG5mdW5jdGlvbiBpc1ZlcnNpb25Mb3dlcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYSA9IGEuc3BsaXQoJy4nKS5tYXAobiA9PiBOdW1iZXIobikgfHwgMCk7XG4gIGNvbnN0IHBiID0gYi5zcGxpdCgnLicpLm1hcChuID0+IE51bWJlcihuKSB8fCAwKTtcbiAgY29uc3QgbGVuID0gTWF0aC5tYXgocGEubGVuZ3RoLCBwYi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB4ID0gcGFbaV0gfHwgMDtcbiAgICBjb25zdCB5ID0gcGJbaV0gfHwgMDtcbiAgICBpZiAoeCA8IHkpIHJldHVybiB0cnVlO1xuICAgIGlmICh4ID4geSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFwcFZlcnNpb25TZXJ2aWNlIHtcbiAgLyoqIFN3VXBkYXRlIHNvbG8gZXhpc3RlIHNpIGVsIFNXIGVzdMOhIHJlZ2lzdHJhZG8gKHByb2QgYnVpbGQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN3VXBkYXRlID0gaW5qZWN0KFN3VXBkYXRlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICAvKiogQXBwQ29uZmlnU2VydmljZSBlcyBvcGNpb25hbDogbGEgYXBwIHB1ZWRlIG5vIHdpcmVhcmxvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcENvbmZpZyA9IGluamVjdChBcHBDb25maWdTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VDb25maWcgPSBpbmplY3QoVkFMVEVDSF9BUFBfVkVSU0lPTiwge1xuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvKiogVHJ1ZSBjdWFuZG8gZWwgU1cgcmVwb3J0w7MgdW4gYnVuZGxlIG51ZXZvIGxpc3RvIChgVkVSU0lPTl9SRUFEWWApLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN3VXBkYXRlUmVhZHkgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBUcnVlIGN1YW5kbyBlbCB1c3VhcmlvIGRlc2NhcnTDsyBlbCBiYW5uZXIgZGUgYWN0dWFsaXphY2nDs24gb3BjaW9uYWwuXG4gICAqIEVsIGJhbm5lciBvYmxpZ2F0b3JpbyAoYHVwZGF0ZS1yZXF1aXJlZGApIGlnbm9yYSBlc3RlIGZsYWcuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNtaXNzZWQgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBkaXNtaXNzZWQ6IFNpZ25hbDxib29sZWFuPiA9IHRoaXMuX2Rpc21pc3NlZC5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNJR05BTFMgUMOaQkxJQ09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWZXJzacOzbiBsb2NhbCBkZWwgYnVpbGQgYWN0dWFsIGRlIGxhIGFwcC5cbiAgICogUHJvdmllbmUgZGVsIHByb3ZpZGVyIGBwcm92aWRlVmFsdGVjaEFwcFZlcnNpb24oeyBjdXJyZW50VmVyc2lvbiB9KWAuXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50VmVyc2lvbjogU2lnbmFsPHN0cmluZz4gPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLnNlcnZpY2VDb25maWc/LmN1cnJlbnRWZXJzaW9uID8/ICcwLjAuMCdcbiAgKTtcblxuICAvKipcbiAgICogw5psdGltYSB2ZXJzacOzbiBwdWJsaWNhZGEgc2Vnw7puIGVsIGNvbmZpZyByZW1vdG8uXG4gICAqIGBudWxsYCBzaSBgQXBwQ29uZmlnU2VydmljZWAgbm8gZXN0w6EgZGlzcG9uaWJsZSBvIGHDum4gbm8gY2FyZ8OzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGF0ZXN0VmVyc2lvbjogU2lnbmFsPHN0cmluZyB8IG51bGw+ID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5hcHBDb25maWc/LnJlbW90ZVZlcnNpb24oKSA/PyBudWxsXG4gICk7XG5cbiAgLyoqXG4gICAqIEVzdGFkbyBkZSBsYSB2ZXJzacOzbjpcbiAgICogLSBgdXBkYXRlLXJlcXVpcmVkYCDigJQgbGEgdmVyc2nDs24gbG9jYWwgcXVlZMOzIHBvciBkZWJham8gZGUgYG1pblZlcnNpb25gXG4gICAqICAgZGVsIGNvbmZpZyByZW1vdG8uIEhhcmQgZ2F0ZS4gU29sbyBzaSBgQXBwQ29uZmlnU2VydmljZWAgdGllbmUgZGF0b3MuXG4gICAqIC0gYHVwZGF0ZS1hdmFpbGFibGVgIOKAlCBlbCBTVyBkZXNjYXJnw7MgdW4gYnVuZGxlIG51ZXZvIChgVkVSU0lPTl9SRUFEWWApXG4gICAqICAgbyBgQXBwQ29uZmlnU2VydmljZS5oYXNVcGRhdGVgIGVzIHRydWUuXG4gICAqIC0gYHVwLXRvLWRhdGVgIOKAlCBlbiBjdWFscXVpZXIgb3RybyBjYXNvLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBTaWduYWw8QXBwVmVyc2lvblN0YXR1cz4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgLy8gMS4gSGFyZCBnYXRlIOKAlCBtaW5WZXJzaW9uIGRlbCBjb25maWcgcmVtb3RvLlxuICAgIGlmICh0aGlzLmFwcENvbmZpZykge1xuICAgICAgY29uc3QgbWluVmVyc2lvbiA9IHRoaXMuYXBwQ29uZmlnLmFwcENvbmZpZygpPy5taW5WZXJzaW9uO1xuICAgICAgaWYgKG1pblZlcnNpb24gJiYgaXNWZXJzaW9uTG93ZXIodGhpcy5jdXJyZW50VmVyc2lvbigpLCBtaW5WZXJzaW9uKSkge1xuICAgICAgICByZXR1cm4gJ3VwZGF0ZS1yZXF1aXJlZCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gVXBkYXRlIG9wY2lvbmFsIOKAlCBTVyBidW5kbGUgbGlzdG8gbyBjb25maWcgcmVtb3RvIG3DoXMgbnVldm8uXG4gICAgaWYgKHRoaXMuc3dVcGRhdGVSZWFkeSgpIHx8IHRoaXMuYXBwQ29uZmlnPy5oYXNVcGRhdGUoKSkge1xuICAgICAgcmV0dXJuICd1cGRhdGUtYXZhaWxhYmxlJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ3VwLXRvLWRhdGUnO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLndpcmVTZXJ2aWNlV29ya2VyKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTcOJVE9ET1MgUMOaQkxJQ09TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBcGxpY2EgbGEgYWN0dWFsaXphY2nDs24gcGVuZGllbnRlLlxuICAgKlxuICAgKiBTaSBlbCBTVyBlc3TDoSBoYWJpbGl0YWRvLCBhY3RpdmEgbGEgdmVyc2nDs24gZGVzY2FyZ2FkYSB5IHJlY2FyZ2E7IHNpIG5vLFxuICAgKiBzb2xvIHJlY2FyZ2EgbGEgcMOhZ2luYSAobGEgd2ViIG9idGllbmUgZWwgYnVuZGxlIG51ZXZvIGRlbCBzZXJ2aWRvcikuXG4gICAqL1xuICBhc3luYyBhcHBseVVwZGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc3dVcGRhdGU/LmlzRW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN3VXBkYXRlLmFjdGl2YXRlVXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tBcHBWZXJzaW9uU2VydmljZV0gYWN0aXZhdGVVcGRhdGUgZmFpbGVkOicsIGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc/LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjYXJ0YSBlbCBiYW5uZXIgZGUgYWN0dWFsaXphY2nDs24gb3BjaW9uYWwuXG4gICAqIE5vIHRpZW5lIGVmZWN0byBzb2JyZSBlbCBlc3RhZG8gYHVwZGF0ZS1yZXF1aXJlZGAgKGhhcmQgZ2F0ZSkuXG4gICAqL1xuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX2Rpc21pc3NlZC5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRnVlcnphIHVuIGNoZXF1ZW8gZGUgYWN0dWFsaXphY2nDs24gZGVsIHNlcnZpY2Ugd29ya2VyLlxuICAgKiBOby1vcCBzaSBlbCBTVyBubyBlc3TDoSBoYWJpbGl0YWRvLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tOb3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnN3VXBkYXRlPy5pc0VuYWJsZWQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zd1VwZGF0ZS5jaGVja0ZvclVwZGF0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbQXBwVmVyc2lvblNlcnZpY2VdIGNoZWNrRm9yVXBkYXRlIGZhaWxlZDonLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQURPXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdXNjcmliZSBgdmVyc2lvblVwZGF0ZXNgLCBwcm9ncmFtYSBjaGVxdWVvcyBwZXJpw7NkaWNvcyB5IHJlYWNjaW9uYSBhbFxuICAgKiB2b2x2ZXIgbGEgYXBwIGEgZm9yZWdyb3VuZC4gU29sbyBhY3TDumEgc2kgZWwgU1cgZXN0w6EgaGFiaWxpdGFkby5cbiAgICovXG4gIHByaXZhdGUgd2lyZVNlcnZpY2VXb3JrZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN3VXBkYXRlPy5pc0VuYWJsZWQpIHJldHVybjtcblxuICAgIC8vIEJ1bmRsZSBudWV2byBkZXNjYXJnYWRvIHkgbGlzdG8uXG4gICAgdGhpcy5zd1VwZGF0ZS52ZXJzaW9uVXBkYXRlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihldnQgPT4gZXZ0LnR5cGUgPT09ICdWRVJTSU9OX1JFQURZJyksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3dVcGRhdGVSZWFkeS5zZXQodHJ1ZSkpO1xuXG4gICAgLy8gU1cgZW4gZXN0YWRvIGlycmVjdXBlcmFibGUg4oCUIGxhIGNhY2jDqSBkZWwgc2VydmljZSB3b3JrZXIgc2UgY29ycm9tcGnDsyBvXG4gICAgLy8gZnVlIHBhcmNpYWxtZW50ZSBldmljdGFkYSAoY29tw7puIGVuIFBXQXMgc3RhbmRhbG9uZSBkZSBpT1MgdHJhcyBkZXBsb3lzXG4gICAgLy8gcmVwZXRpZG9zKS4gTGEgYXBwIG5vIHB1ZWRlIGNhcmdhciBzdXMgYXNzZXRzIOKGkiBwYW50YWxsYSBlbiBibGFuY28uXG4gICAgLy8gUmVjdXBlcmFjacOzbiByZWNvbWVuZGFkYSBwb3IgQW5ndWxhcjogcmVjYXJnYXIgcGFyYSB0cmFlciB0b2RvIGZyZXNjb1xuICAgIC8vIGRlc2RlIGxhIHJlZC5cbiAgICB0aGlzLnN3VXBkYXRlLnVucmVjb3ZlcmFibGUucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tBcHBWZXJzaW9uU2VydmljZV0gU1cgdW5yZWNvdmVyYWJsZSDigJQgcmVsb2FkaW5nOicsIGV2ZW50LnJlYXNvbik7XG4gICAgICB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8vIENoZXF1ZW8gcGVyacOzZGljby5cbiAgICBjb25zdCBpbnRlcnZhbE1zID1cbiAgICAgIHRoaXMuc2VydmljZUNvbmZpZz8uY2hlY2tJbnRlcnZhbE1zID8/IERFRkFVTFRfQVBQX1ZFUlNJT05fU0VSVklDRV9DT05GSUcuY2hlY2tJbnRlcnZhbE1zO1xuXG4gICAgaW50ZXJ2YWwoaW50ZXJ2YWxNcylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB2b2lkIHRoaXMuY2hlY2tOb3coKSk7XG5cbiAgICAvLyBDaGVxdWVvIGFsIHZvbHZlciBsYSBhcHAgYSBmb3JlZ3JvdW5kLlxuICAgIGNvbnN0IG9uVmlzaWJsZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICAgIHZvaWQgdGhpcy5jaGVja05vdygpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25WaXNpYmxlKTtcbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uVmlzaWJsZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVxdWVvIGluaWNpYWwuXG4gICAgdm9pZCB0aGlzLmNoZWNrTm93KCk7XG4gIH1cbn1cbiJdfQ==