valtech-components 4.0.61 → 4.0.63

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.
@@ -7,39 +7,57 @@ import * as i0 from "@angular/core";
7
7
  * app (p.ej. el callback OAuth) que deben verse iguales al arranque, en vez de
8
8
  * un segundo loader casi-duplicado.
9
9
  *
10
- * El logo apunta por defecto a `assets/images/main-{light,dark}.svg` los mismos
11
- * assets de la app consumer que usa el splash de `index.html` y resuelven en
12
- * runtime contra la app. Override por inputs si hace falta. Fondo overridable con
10
+ * Por defecto renderiza el logo de la app via la CSS var `--main-logo` (un `<div>`
11
+ * con `background-image`) cada frontend del factory define `--main-logo` y la
12
+ * flipea en dark, asi el splash toma el logo correcto sin que el consumer pase nada.
13
+ * Override opcional: si se pasan `logoLight`/`logoDark` (no vacios), renderiza un
14
+ * `<img>` con ese src (comportamiento clasico, back-compat). Fondo overridable con
13
15
  * las CSS vars `--val-splash-bg` / `--val-splash-bg-dark`.
14
16
  */
15
17
  export class SplashComponent {
16
18
  constructor() {
17
- /** Logo para tema claro. Default = asset de la app (igual que index.html). */
18
- this.logoLight = input('assets/images/main-light.svg');
19
- /** Logo para tema oscuro (vía prefers-color-scheme). */
20
- this.logoDark = input('assets/images/main-dark.svg');
19
+ /**
20
+ * Override opcional — src del logo para tema claro. Vacío (default) activa el
21
+ * modo `--main-logo` (un `<div>` con `background-image: var(--main-logo)` que
22
+ * toma el logo de la app y respeta dark). Pasalo (no vacío) para forzar `<img>`.
23
+ */
24
+ this.logoLight = input('');
25
+ /** Override opcional — src del logo para tema oscuro (vía prefers-color-scheme). Solo aplica si `logoLight` no es vacío. */
26
+ this.logoDark = input('');
21
27
  /** Texto alternativo del logo. */
22
28
  this.alt = input('Valtech');
23
29
  }
24
30
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SplashComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: SplashComponent, isStandalone: true, selector: "val-splash", inputs: { logoLight: { classPropertyName: "logoLight", publicName: "logoLight", isSignal: true, isRequired: false, transformFunction: null }, logoDark: { classPropertyName: "logoDark", publicName: "logoDark", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
31
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SplashComponent, isStandalone: true, selector: "val-splash", inputs: { logoLight: { classPropertyName: "logoLight", publicName: "logoLight", isSignal: true, isRequired: false, transformFunction: null }, logoDark: { classPropertyName: "logoDark", publicName: "logoDark", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
26
32
  <div class="val-splash">
27
- <picture>
28
- <source media="(prefers-color-scheme: dark)" [srcset]="logoDark()" />
29
- <img class="val-splash__logo" [src]="logoLight()" [alt]="alt()" />
30
- </picture>
33
+ @if (logoLight()) {
34
+ <picture>
35
+ @if (logoDark()) {
36
+ <source media="(prefers-color-scheme: dark)" [srcset]="logoDark()" />
37
+ }
38
+ <img class="val-splash__logo" [src]="logoLight()" [alt]="alt()" />
39
+ </picture>
40
+ } @else {
41
+ <div class="val-splash__logo val-splash__logo--var" role="img" [attr.aria-label]="alt()"></div>
42
+ }
31
43
  </div>
32
- `, isInline: true, styles: [".val-splash{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--val-splash-bg, #fbfbfb);z-index:9999;animation:val-splash-in .25s ease}.val-splash__logo{width:180px;max-width:50vw;animation:val-splash-pulse 1.8s ease-in-out infinite}@keyframes val-splash-in{0%{opacity:0}to{opacity:1}}@keyframes val-splash-pulse{0%,to{opacity:1}50%{opacity:.55}}@media (prefers-color-scheme: dark){.val-splash{background:var(--val-splash-bg-dark, #0e0420)}}\n"] }); }
44
+ `, isInline: true, styles: [".val-splash{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--val-splash-bg, #fbfbfb);z-index:9999;animation:val-splash-in .25s ease}.val-splash__logo{width:180px;max-width:50vw;animation:val-splash-pulse 1.8s ease-in-out infinite}.val-splash__logo--var{height:180px;background-image:var(--main-logo);background-size:contain;background-repeat:no-repeat;background-position:center}@keyframes val-splash-in{0%{opacity:0}to{opacity:1}}@keyframes val-splash-pulse{0%,to{opacity:1}50%{opacity:.55}}@media (prefers-color-scheme: dark){.val-splash{background:var(--val-splash-bg-dark, #0e0420)}}\n"] }); }
33
45
  }
34
46
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SplashComponent, decorators: [{
35
47
  type: Component,
36
48
  args: [{ selector: 'val-splash', standalone: true, template: `
37
49
  <div class="val-splash">
38
- <picture>
39
- <source media="(prefers-color-scheme: dark)" [srcset]="logoDark()" />
40
- <img class="val-splash__logo" [src]="logoLight()" [alt]="alt()" />
41
- </picture>
50
+ @if (logoLight()) {
51
+ <picture>
52
+ @if (logoDark()) {
53
+ <source media="(prefers-color-scheme: dark)" [srcset]="logoDark()" />
54
+ }
55
+ <img class="val-splash__logo" [src]="logoLight()" [alt]="alt()" />
56
+ </picture>
57
+ } @else {
58
+ <div class="val-splash__logo val-splash__logo--var" role="img" [attr.aria-label]="alt()"></div>
59
+ }
42
60
  </div>
43
- `, styles: [".val-splash{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--val-splash-bg, #fbfbfb);z-index:9999;animation:val-splash-in .25s ease}.val-splash__logo{width:180px;max-width:50vw;animation:val-splash-pulse 1.8s ease-in-out infinite}@keyframes val-splash-in{0%{opacity:0}to{opacity:1}}@keyframes val-splash-pulse{0%,to{opacity:1}50%{opacity:.55}}@media (prefers-color-scheme: dark){.val-splash{background:var(--val-splash-bg-dark, #0e0420)}}\n"] }]
61
+ `, styles: [".val-splash{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--val-splash-bg, #fbfbfb);z-index:9999;animation:val-splash-in .25s ease}.val-splash__logo{width:180px;max-width:50vw;animation:val-splash-pulse 1.8s ease-in-out infinite}.val-splash__logo--var{height:180px;background-image:var(--main-logo);background-size:contain;background-repeat:no-repeat;background-position:center}@keyframes val-splash-in{0%{opacity:0}to{opacity:1}}@keyframes val-splash-pulse{0%,to{opacity:1}50%{opacity:.55}}@media (prefers-color-scheme: dark){.val-splash{background:var(--val-splash-bg-dark, #0e0420)}}\n"] }]
44
62
  }] });
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsYXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdG9tcy9zcGxhc2gvc3BsYXNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFakQ7Ozs7Ozs7Ozs7O0dBV0c7QUFzREgsTUFBTSxPQUFPLGVBQWU7SUFyRDVCO1FBc0RFLDhFQUE4RTtRQUNyRSxjQUFTLEdBQUcsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDM0Qsd0RBQXdEO1FBQy9DLGFBQVEsR0FBRyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN6RCxrQ0FBa0M7UUFDekIsUUFBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNqQzsrR0FQWSxlQUFlO21HQUFmLGVBQWUseWNBbERoQjs7Ozs7OztHQU9UOzs0RkEyQ1UsZUFBZTtrQkFyRDNCLFNBQVM7K0JBQ0UsWUFBWSxjQUNWLElBQUksWUFDTjs7Ozs7OztHQU9UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIGB2YWwtc3BsYXNoYCDigJQgc3BsYXNoIGEgcGFudGFsbGEgY29tcGxldGEgcmV1dGlsaXphYmxlLCBpZMOpbnRpY28gYWwgZGUgYXJyYW5xdWVcbiAqIGRlIGxhIGFwcCAoYC5hcHAtc3BsYXNoYCBkZWwgYGluZGV4Lmh0bWxgKTogbG9nbyBjZW50cmFkbyBjb24gcHVsc2UsIGZvbmRvXG4gKiBjbGFyby9vc2N1cm8gdsOtYSBgcHJlZmVycy1jb2xvci1zY2hlbWVgLiBQYXJhIGNhcmdhcyBmdW5kYW1lbnRhbGVzIGRlbnRybyBkZSBsYVxuICogYXBwIChwLmVqLiBlbCBjYWxsYmFjayBPQXV0aCkgcXVlIGRlYmVuIHZlcnNlIGlndWFsZXMgYWwgYXJyYW5xdWUsIGVuIHZleiBkZVxuICogdW4gc2VndW5kbyBsb2FkZXIgY2FzaS1kdXBsaWNhZG8uXG4gKlxuICogRWwgbG9nbyBhcHVudGEgcG9yIGRlZmVjdG8gYSBgYXNzZXRzL2ltYWdlcy9tYWluLXtsaWdodCxkYXJrfS5zdmdgIOKAlCBsb3MgbWlzbW9zXG4gKiBhc3NldHMgZGUgbGEgYXBwIGNvbnN1bWVyIHF1ZSB1c2EgZWwgc3BsYXNoIGRlIGBpbmRleC5odG1sYCDigJQgeSByZXN1ZWx2ZW4gZW5cbiAqIHJ1bnRpbWUgY29udHJhIGxhIGFwcC4gT3ZlcnJpZGUgcG9yIGlucHV0cyBzaSBoYWNlIGZhbHRhLiBGb25kbyBvdmVycmlkYWJsZSBjb25cbiAqIGxhcyBDU1MgdmFycyBgLS12YWwtc3BsYXNoLWJnYCAvIGAtLXZhbC1zcGxhc2gtYmctZGFya2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1zcGxhc2gnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJ2YWwtc3BsYXNoXCI+XG4gICAgICA8cGljdHVyZT5cbiAgICAgICAgPHNvdXJjZSBtZWRpYT1cIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiBbc3Jjc2V0XT1cImxvZ29EYXJrKClcIiAvPlxuICAgICAgICA8aW1nIGNsYXNzPVwidmFsLXNwbGFzaF9fbG9nb1wiIFtzcmNdPVwibG9nb0xpZ2h0KClcIiBbYWx0XT1cImFsdCgpXCIgLz5cbiAgICAgIDwvcGljdHVyZT5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnZhbC1zcGxhc2gge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGluc2V0OiAwO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdmFsLXNwbGFzaC1iZywgI2ZiZmJmYik7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIGFuaW1hdGlvbjogdmFsLXNwbGFzaC1pbiAwLjI1cyBlYXNlO1xuICAgICAgfVxuICAgICAgLnZhbC1zcGxhc2hfX2xvZ28ge1xuICAgICAgICB3aWR0aDogMTgwcHg7XG4gICAgICAgIG1heC13aWR0aDogNTB2dztcbiAgICAgICAgYW5pbWF0aW9uOiB2YWwtc3BsYXNoLXB1bHNlIDEuOHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHZhbC1zcGxhc2gtaW4ge1xuICAgICAgICBmcm9tIHtcbiAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB9XG4gICAgICAgIHRvIHtcbiAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHZhbC1zcGxhc2gtcHVsc2Uge1xuICAgICAgICAwJSxcbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgfVxuICAgICAgICA1MCUge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcbiAgICAgICAgLnZhbC1zcGxhc2gge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXZhbC1zcGxhc2gtYmctZGFyaywgIzBlMDQyMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTcGxhc2hDb21wb25lbnQge1xuICAvKiogTG9nbyBwYXJhIHRlbWEgY2xhcm8uIERlZmF1bHQgPSBhc3NldCBkZSBsYSBhcHAgKGlndWFsIHF1ZSBpbmRleC5odG1sKS4gKi9cbiAgcmVhZG9ubHkgbG9nb0xpZ2h0ID0gaW5wdXQoJ2Fzc2V0cy9pbWFnZXMvbWFpbi1saWdodC5zdmcnKTtcbiAgLyoqIExvZ28gcGFyYSB0ZW1hIG9zY3VybyAodsOtYSBwcmVmZXJzLWNvbG9yLXNjaGVtZSkuICovXG4gIHJlYWRvbmx5IGxvZ29EYXJrID0gaW5wdXQoJ2Fzc2V0cy9pbWFnZXMvbWFpbi1kYXJrLnN2ZycpO1xuICAvKiogVGV4dG8gYWx0ZXJuYXRpdm8gZGVsIGxvZ28uICovXG4gIHJlYWRvbmx5IGFsdCA9IGlucHV0KCdWYWx0ZWNoJyk7XG59XG4iXX0=
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsYXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdG9tcy9zcGxhc2gvc3BsYXNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFakQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQW1FSCxNQUFNLE9BQU8sZUFBZTtJQWxFNUI7UUFtRUU7Ozs7V0FJRztRQUNNLGNBQVMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsNEhBQTRIO1FBQ25ILGFBQVEsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsa0NBQWtDO1FBQ3pCLFFBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDakM7K0dBWFksZUFBZTttR0FBZixlQUFlLHljQS9EaEI7Ozs7Ozs7Ozs7Ozs7R0FhVDs7NEZBa0RVLGVBQWU7a0JBbEUzQixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFlBQ047Ozs7Ozs7Ozs7Ozs7R0FhVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBgdmFsLXNwbGFzaGAg4oCUIHNwbGFzaCBhIHBhbnRhbGxhIGNvbXBsZXRhIHJldXRpbGl6YWJsZSwgaWTDqW50aWNvIGFsIGRlIGFycmFucXVlXG4gKiBkZSBsYSBhcHAgKGAuYXBwLXNwbGFzaGAgZGVsIGBpbmRleC5odG1sYCk6IGxvZ28gY2VudHJhZG8gY29uIHB1bHNlLCBmb25kb1xuICogY2xhcm8vb3NjdXJvIHbDrWEgYHByZWZlcnMtY29sb3Itc2NoZW1lYC4gUGFyYSBjYXJnYXMgZnVuZGFtZW50YWxlcyBkZW50cm8gZGUgbGFcbiAqIGFwcCAocC5lai4gZWwgY2FsbGJhY2sgT0F1dGgpIHF1ZSBkZWJlbiB2ZXJzZSBpZ3VhbGVzIGFsIGFycmFucXVlLCBlbiB2ZXogZGVcbiAqIHVuIHNlZ3VuZG8gbG9hZGVyIGNhc2ktZHVwbGljYWRvLlxuICpcbiAqIFBvciBkZWZlY3RvIHJlbmRlcml6YSBlbCBsb2dvIGRlIGxhIGFwcCB2aWEgbGEgQ1NTIHZhciBgLS1tYWluLWxvZ29gICh1biBgPGRpdj5gXG4gKiBjb24gYGJhY2tncm91bmQtaW1hZ2VgKSDigJQgY2FkYSBmcm9udGVuZCBkZWwgZmFjdG9yeSBkZWZpbmUgYC0tbWFpbi1sb2dvYCB5IGxhXG4gKiBmbGlwZWEgZW4gZGFyaywgYXNpIGVsIHNwbGFzaCB0b21hIGVsIGxvZ28gY29ycmVjdG8gc2luIHF1ZSBlbCBjb25zdW1lciBwYXNlIG5hZGEuXG4gKiBPdmVycmlkZSBvcGNpb25hbDogc2kgc2UgcGFzYW4gYGxvZ29MaWdodGAvYGxvZ29EYXJrYCAobm8gdmFjaW9zKSwgcmVuZGVyaXphIHVuXG4gKiBgPGltZz5gIGNvbiBlc2Ugc3JjIChjb21wb3J0YW1pZW50byBjbGFzaWNvLCBiYWNrLWNvbXBhdCkuIEZvbmRvIG92ZXJyaWRhYmxlIGNvblxuICogbGFzIENTUyB2YXJzIGAtLXZhbC1zcGxhc2gtYmdgIC8gYC0tdmFsLXNwbGFzaC1iZy1kYXJrYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXNwbGFzaCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInZhbC1zcGxhc2hcIj5cbiAgICAgIEBpZiAobG9nb0xpZ2h0KCkpIHtcbiAgICAgICAgPHBpY3R1cmU+XG4gICAgICAgICAgQGlmIChsb2dvRGFyaygpKSB7XG4gICAgICAgICAgICA8c291cmNlIG1lZGlhPVwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiIFtzcmNzZXRdPVwibG9nb0RhcmsoKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxpbWcgY2xhc3M9XCJ2YWwtc3BsYXNoX19sb2dvXCIgW3NyY109XCJsb2dvTGlnaHQoKVwiIFthbHRdPVwiYWx0KClcIiAvPlxuICAgICAgICA8L3BpY3R1cmU+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhbC1zcGxhc2hfX2xvZ28gdmFsLXNwbGFzaF9fbG9nby0tdmFyXCIgcm9sZT1cImltZ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiYWx0KClcIj48L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnZhbC1zcGxhc2gge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGluc2V0OiAwO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdmFsLXNwbGFzaC1iZywgI2ZiZmJmYik7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIGFuaW1hdGlvbjogdmFsLXNwbGFzaC1pbiAwLjI1cyBlYXNlO1xuICAgICAgfVxuICAgICAgLnZhbC1zcGxhc2hfX2xvZ28ge1xuICAgICAgICB3aWR0aDogMTgwcHg7XG4gICAgICAgIG1heC13aWR0aDogNTB2dztcbiAgICAgICAgYW5pbWF0aW9uOiB2YWwtc3BsYXNoLXB1bHNlIDEuOHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gICAgICB9XG4gICAgICAudmFsLXNwbGFzaF9fbG9nby0tdmFyIHtcbiAgICAgICAgaGVpZ2h0OiAxODBweDtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tbWFpbi1sb2dvKTtcbiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHZhbC1zcGxhc2gtaW4ge1xuICAgICAgICBmcm9tIHtcbiAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB9XG4gICAgICAgIHRvIHtcbiAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHZhbC1zcGxhc2gtcHVsc2Uge1xuICAgICAgICAwJSxcbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgfVxuICAgICAgICA1MCUge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcbiAgICAgICAgLnZhbC1zcGxhc2gge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXZhbC1zcGxhc2gtYmctZGFyaywgIzBlMDQyMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTcGxhc2hDb21wb25lbnQge1xuICAvKipcbiAgICogT3ZlcnJpZGUgb3BjaW9uYWwg4oCUIHNyYyBkZWwgbG9nbyBwYXJhIHRlbWEgY2xhcm8uIFZhY8OtbyAoZGVmYXVsdCkgYWN0aXZhIGVsXG4gICAqIG1vZG8gYC0tbWFpbi1sb2dvYCAodW4gYDxkaXY+YCBjb24gYGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLW1haW4tbG9nbylgIHF1ZVxuICAgKiB0b21hIGVsIGxvZ28gZGUgbGEgYXBwIHkgcmVzcGV0YSBkYXJrKS4gUGFzYWxvIChubyB2YWPDrW8pIHBhcmEgZm9yemFyIGA8aW1nPmAuXG4gICAqL1xuICByZWFkb25seSBsb2dvTGlnaHQgPSBpbnB1dCgnJyk7XG4gIC8qKiBPdmVycmlkZSBvcGNpb25hbCDigJQgc3JjIGRlbCBsb2dvIHBhcmEgdGVtYSBvc2N1cm8gKHbDrWEgcHJlZmVycy1jb2xvci1zY2hlbWUpLiBTb2xvIGFwbGljYSBzaSBgbG9nb0xpZ2h0YCBubyBlcyB2YWPDrW8uICovXG4gIHJlYWRvbmx5IGxvZ29EYXJrID0gaW5wdXQoJycpO1xuICAvKiogVGV4dG8gYWx0ZXJuYXRpdm8gZGVsIGxvZ28uICovXG4gIHJlYWRvbmx5IGFsdCA9IGlucHV0KCdWYWx0ZWNoJyk7XG59XG4iXX0=
@@ -0,0 +1,147 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, computed, EventEmitter, input, Output } from '@angular/core';
3
+ import { IonIcon } from '@ionic/angular/standalone';
4
+ import { addIcons } from 'ionicons';
5
+ import { chevronForward } from 'ionicons/icons';
6
+ import { ButtonComponent } from '../../atoms/button/button.component';
7
+ import { PillComponent } from '../pill/pill.component';
8
+ import * as i0 from "@angular/core";
9
+ addIcons({ chevronForward });
10
+ /**
11
+ * val-entity-card
12
+ *
13
+ * Generic entity card / list row. Two use-cases in one component:
14
+ *
15
+ * 1. **Navigable entity** (`clickable: true`, no `actions`) — the whole card is
16
+ * a button: chevron on the right, `role="button"` + keyboard support, emits
17
+ * `(cardClick)` with the `token`.
18
+ * 2. **Row with action(s)** (`actions: ButtonMetadata[]`) — buttons on the
19
+ * right, each emits `(actionClick)` with its own token.
20
+ *
21
+ * Presentational — all text fields are already-resolved strings (no i18n of its
22
+ * own). Dark-safe: surface/borders/text use theme tokens only.
23
+ *
24
+ * @example
25
+ * ```html
26
+ * <val-entity-card
27
+ * [props]="{ chip: { label: 'En vivo', color: 'success' }, title: 'Bingo', subtitle: 'Hoy 20:00', clickable: true, token: 'evt-1' }"
28
+ * (cardClick)="open($event)" />
29
+ * ```
30
+ */
31
+ export class EntityCardComponent {
32
+ constructor() {
33
+ /** Component configuration (object-first). */
34
+ this.props = input({});
35
+ /** Emits the `token` when the card is navigable and gets clicked/activated. */
36
+ this.cardClick = new EventEmitter();
37
+ /** Emits the token of the clicked action button. */
38
+ this.actionClick = new EventEmitter();
39
+ /** Merged config. */
40
+ this.config = computed(() => this.props());
41
+ /** Action buttons (empty array when none). */
42
+ this.actions = computed(() => this.config().actions ?? []);
43
+ /**
44
+ * Badge-mode pill props for the status chip, or null when absent.
45
+ * `chip.color` is a free-form string (Ionic color name or CSS) per the public
46
+ * contract; cast to satisfy `PillMetadata.color` (Ionic `Color` union).
47
+ */
48
+ this.chipPillProps = computed(() => {
49
+ const chip = this.config().chip;
50
+ if (!chip)
51
+ return null;
52
+ return { label: chip.label, color: (chip.color || 'medium') };
53
+ });
54
+ /** Card is navigable only when `clickable` and there are no actions. */
55
+ this.isNavigable = computed(() => !!this.config().clickable && this.actions().length === 0);
56
+ }
57
+ onCardClick() {
58
+ if (!this.isNavigable())
59
+ return;
60
+ this.cardClick.emit(this.config().token);
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
63
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: EntityCardComponent, isStandalone: true, selector: "val-entity-card", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cardClick: "cardClick", actionClick: "actionClick" }, ngImport: i0, template: `
64
+ <div
65
+ class="entity-card"
66
+ [class.entity-card--clickable]="isNavigable()"
67
+ [attr.role]="isNavigable() ? 'button' : null"
68
+ [attr.tabindex]="isNavigable() ? 0 : null"
69
+ (click)="onCardClick()"
70
+ (keyup.enter)="onCardClick()"
71
+ >
72
+ @if (chipPillProps(); as chip) {
73
+ <div class="entity-card__eyebrow">
74
+ <val-pill [props]="chip" />
75
+ </div>
76
+ }
77
+
78
+ <div class="entity-card__row">
79
+ <div class="entity-card__text">
80
+ <span class="entity-card__title">{{ config().title }}</span>
81
+ @if (config().subtitle) {
82
+ <span class="entity-card__subtitle">{{ config().subtitle }}</span>
83
+ }
84
+ @if (config().endNote) {
85
+ <span class="entity-card__end-note">{{ config().endNote }}</span>
86
+ }
87
+ </div>
88
+
89
+ @if (actions().length) {
90
+ <div class="entity-card__actions" (click)="$event.stopPropagation()">
91
+ @for (action of actions(); track action.token || $index) {
92
+ <val-button [props]="action" (onClick)="actionClick.emit($event)" />
93
+ }
94
+ </div>
95
+ } @else if (isNavigable()) {
96
+ <ion-icon class="entity-card__chevron" name="chevron-forward" aria-hidden="true" />
97
+ }
98
+ </div>
99
+ </div>
100
+ `, isInline: true, styles: [":host{display:block}.entity-card{background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, var(--ion-color-light-shade, rgba(0, 0, 0, .1)));border-radius:16px;box-shadow:0 1px 3px #0000000f;padding:16px;transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease}.entity-card--clickable{cursor:pointer}.entity-card--clickable:hover{border-color:var(--ion-color-medium, #92949c);box-shadow:0 4px 12px #0000001a}.entity-card--clickable:active{transform:scale(.99)}.entity-card--clickable:focus-visible{outline:2px solid var(--ion-color-primary);outline-offset:2px}.entity-card__eyebrow{display:flex;margin-bottom:10px}.entity-card__row{display:flex;align-items:center;gap:12px}.entity-card__text{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-width:0}.entity-card__title{font-size:1rem;font-weight:700;line-height:1.3;color:var(--ion-text-color, #000)}.entity-card__subtitle{font-size:.875rem;line-height:1.35;color:var(--ion-color-medium, #92949c)}.entity-card__end-note{font-size:.8125rem;line-height:1.35;color:var(--ion-color-medium, #92949c)}.entity-card__actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.entity-card__actions val-button{display:inline-block}.entity-card__chevron{font-size:1.25rem;color:var(--ion-color-medium, #92949c);flex-shrink:0}:host-context(body.dark) .entity-card,:host-context(html.ion-palette-dark) .entity-card,:host-context([data-theme=dark]) .entity-card{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: PillComponent, selector: "val-pill", inputs: ["preset", "props"], outputs: ["pillClick", "pillAction"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }] }); }
101
+ }
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityCardComponent, decorators: [{
103
+ type: Component,
104
+ args: [{ selector: 'val-entity-card', standalone: true, imports: [CommonModule, IonIcon, PillComponent, ButtonComponent], template: `
105
+ <div
106
+ class="entity-card"
107
+ [class.entity-card--clickable]="isNavigable()"
108
+ [attr.role]="isNavigable() ? 'button' : null"
109
+ [attr.tabindex]="isNavigable() ? 0 : null"
110
+ (click)="onCardClick()"
111
+ (keyup.enter)="onCardClick()"
112
+ >
113
+ @if (chipPillProps(); as chip) {
114
+ <div class="entity-card__eyebrow">
115
+ <val-pill [props]="chip" />
116
+ </div>
117
+ }
118
+
119
+ <div class="entity-card__row">
120
+ <div class="entity-card__text">
121
+ <span class="entity-card__title">{{ config().title }}</span>
122
+ @if (config().subtitle) {
123
+ <span class="entity-card__subtitle">{{ config().subtitle }}</span>
124
+ }
125
+ @if (config().endNote) {
126
+ <span class="entity-card__end-note">{{ config().endNote }}</span>
127
+ }
128
+ </div>
129
+
130
+ @if (actions().length) {
131
+ <div class="entity-card__actions" (click)="$event.stopPropagation()">
132
+ @for (action of actions(); track action.token || $index) {
133
+ <val-button [props]="action" (onClick)="actionClick.emit($event)" />
134
+ }
135
+ </div>
136
+ } @else if (isNavigable()) {
137
+ <ion-icon class="entity-card__chevron" name="chevron-forward" aria-hidden="true" />
138
+ }
139
+ </div>
140
+ </div>
141
+ `, styles: [":host{display:block}.entity-card{background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, var(--ion-color-light-shade, rgba(0, 0, 0, .1)));border-radius:16px;box-shadow:0 1px 3px #0000000f;padding:16px;transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease}.entity-card--clickable{cursor:pointer}.entity-card--clickable:hover{border-color:var(--ion-color-medium, #92949c);box-shadow:0 4px 12px #0000001a}.entity-card--clickable:active{transform:scale(.99)}.entity-card--clickable:focus-visible{outline:2px solid var(--ion-color-primary);outline-offset:2px}.entity-card__eyebrow{display:flex;margin-bottom:10px}.entity-card__row{display:flex;align-items:center;gap:12px}.entity-card__text{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-width:0}.entity-card__title{font-size:1rem;font-weight:700;line-height:1.3;color:var(--ion-text-color, #000)}.entity-card__subtitle{font-size:.875rem;line-height:1.35;color:var(--ion-color-medium, #92949c)}.entity-card__end-note{font-size:.8125rem;line-height:1.35;color:var(--ion-color-medium, #92949c)}.entity-card__actions{display:flex;align-items:center;gap:4px;flex-shrink:0}.entity-card__actions val-button{display:inline-block}.entity-card__chevron{font-size:1.25rem;color:var(--ion-color-medium, #92949c);flex-shrink:0}:host-context(body.dark) .entity-card,:host-context(html.ion-palette-dark) .entity-card,:host-context([data-theme=dark]) .entity-card{box-shadow:none}\n"] }]
142
+ }], propDecorators: { cardClick: [{
143
+ type: Output
144
+ }], actionClick: [{
145
+ type: Output
146
+ }] } });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9lbnRpdHktY2FyZC9lbnRpdHktY2FyZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUl2RCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBRTdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQTZDSCxNQUFNLE9BQU8sbUJBQW1CO0lBNUNoQztRQTZDRSw4Q0FBOEM7UUFDckMsVUFBSyxHQUFHLEtBQUssQ0FBOEIsRUFBRSxDQUFDLENBQUM7UUFFeEQsK0VBQStFO1FBQ3JFLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWpELG9EQUFvRDtRQUMxQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFbkQscUJBQXFCO1FBQ1osV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUF3QixDQUFDLENBQUM7UUFFckUsOENBQThDO1FBQ3JDLFlBQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvRDs7OztXQUlHO1FBQ00sa0JBQWEsR0FBRyxRQUFRLENBQStCLEdBQUcsRUFBRTtZQUNuRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBMEIsRUFBRSxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0VBQXdFO1FBQy9ELGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FNakc7SUFKQyxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDOytHQWpDVSxtQkFBbUI7bUdBQW5CLG1CQUFtQixnUkF4Q3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNULDBpREF0Q1MsWUFBWSwrQkFBRSxPQUFPLDJKQUFFLGFBQWEsd0hBQUUsZUFBZTs7NEZBeUNwRCxtQkFBbUI7a0JBNUMvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBQyxZQUN0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDVDs4QkFRUyxTQUFTO3NCQUFsQixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgRXZlbnRFbWl0dGVyLCBpbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoZXZyb25Gb3J3YXJkIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGlsbENvbXBvbmVudCB9IGZyb20gJy4uL3BpbGwvcGlsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGlsbE1ldGFkYXRhIH0gZnJvbSAnLi4vcGlsbC90eXBlcyc7XG5pbXBvcnQgeyBFbnRpdHlDYXJkTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuYWRkSWNvbnMoeyBjaGV2cm9uRm9yd2FyZCB9KTtcblxuLyoqXG4gKiB2YWwtZW50aXR5LWNhcmRcbiAqXG4gKiBHZW5lcmljIGVudGl0eSBjYXJkIC8gbGlzdCByb3cuIFR3byB1c2UtY2FzZXMgaW4gb25lIGNvbXBvbmVudDpcbiAqXG4gKiAxLiAqKk5hdmlnYWJsZSBlbnRpdHkqKiAoYGNsaWNrYWJsZTogdHJ1ZWAsIG5vIGBhY3Rpb25zYCkg4oCUIHRoZSB3aG9sZSBjYXJkIGlzXG4gKiAgICBhIGJ1dHRvbjogY2hldnJvbiBvbiB0aGUgcmlnaHQsIGByb2xlPVwiYnV0dG9uXCJgICsga2V5Ym9hcmQgc3VwcG9ydCwgZW1pdHNcbiAqICAgIGAoY2FyZENsaWNrKWAgd2l0aCB0aGUgYHRva2VuYC5cbiAqIDIuICoqUm93IHdpdGggYWN0aW9uKHMpKiogKGBhY3Rpb25zOiBCdXR0b25NZXRhZGF0YVtdYCkg4oCUIGJ1dHRvbnMgb24gdGhlXG4gKiAgICByaWdodCwgZWFjaCBlbWl0cyBgKGFjdGlvbkNsaWNrKWAgd2l0aCBpdHMgb3duIHRva2VuLlxuICpcbiAqIFByZXNlbnRhdGlvbmFsIOKAlCBhbGwgdGV4dCBmaWVsZHMgYXJlIGFscmVhZHktcmVzb2x2ZWQgc3RyaW5ncyAobm8gaTE4biBvZiBpdHNcbiAqIG93bikuIERhcmstc2FmZTogc3VyZmFjZS9ib3JkZXJzL3RleHQgdXNlIHRoZW1lIHRva2VucyBvbmx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLWVudGl0eS1jYXJkXG4gKiAgIFtwcm9wc109XCJ7IGNoaXA6IHsgbGFiZWw6ICdFbiB2aXZvJywgY29sb3I6ICdzdWNjZXNzJyB9LCB0aXRsZTogJ0JpbmdvJywgc3VidGl0bGU6ICdIb3kgMjA6MDAnLCBjbGlja2FibGU6IHRydWUsIHRva2VuOiAnZXZ0LTEnIH1cIlxuICogICAoY2FyZENsaWNrKT1cIm9wZW4oJGV2ZW50KVwiIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWVudGl0eS1jYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uSWNvbiwgUGlsbENvbXBvbmVudCwgQnV0dG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImVudGl0eS1jYXJkXCJcbiAgICAgIFtjbGFzcy5lbnRpdHktY2FyZC0tY2xpY2thYmxlXT1cImlzTmF2aWdhYmxlKClcIlxuICAgICAgW2F0dHIucm9sZV09XCJpc05hdmlnYWJsZSgpID8gJ2J1dHRvbicgOiBudWxsXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzTmF2aWdhYmxlKCkgPyAwIDogbnVsbFwiXG4gICAgICAoY2xpY2spPVwib25DYXJkQ2xpY2soKVwiXG4gICAgICAoa2V5dXAuZW50ZXIpPVwib25DYXJkQ2xpY2soKVwiXG4gICAgPlxuICAgICAgQGlmIChjaGlwUGlsbFByb3BzKCk7IGFzIGNoaXApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImVudGl0eS1jYXJkX19leWVicm93XCI+XG4gICAgICAgICAgPHZhbC1waWxsIFtwcm9wc109XCJjaGlwXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJlbnRpdHktY2FyZF9fcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbnRpdHktY2FyZF9fdGV4dFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW50aXR5LWNhcmRfX3RpdGxlXCI+e3sgY29uZmlnKCkudGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgQGlmIChjb25maWcoKS5zdWJ0aXRsZSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHktY2FyZF9fc3VidGl0bGVcIj57eyBjb25maWcoKS5zdWJ0aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChjb25maWcoKS5lbmROb3RlKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVudGl0eS1jYXJkX19lbmQtbm90ZVwiPnt7IGNvbmZpZygpLmVuZE5vdGUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGFjdGlvbnMoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW50aXR5LWNhcmRfX2FjdGlvbnNcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICBAZm9yIChhY3Rpb24gb2YgYWN0aW9ucygpOyB0cmFjayBhY3Rpb24udG9rZW4gfHwgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx2YWwtYnV0dG9uIFtwcm9wc109XCJhY3Rpb25cIiAob25DbGljayk9XCJhY3Rpb25DbGljay5lbWl0KCRldmVudClcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIGlmIChpc05hdmlnYWJsZSgpKSB7XG4gICAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiZW50aXR5LWNhcmRfX2NoZXZyb25cIiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEVudGl0eUNhcmRDb21wb25lbnQge1xuICAvKiogQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24gKG9iamVjdC1maXJzdCkuICovXG4gIHJlYWRvbmx5IHByb3BzID0gaW5wdXQ8UGFydGlhbDxFbnRpdHlDYXJkTWV0YWRhdGE+Pih7fSk7XG5cbiAgLyoqIEVtaXRzIHRoZSBgdG9rZW5gIHdoZW4gdGhlIGNhcmQgaXMgbmF2aWdhYmxlIGFuZCBnZXRzIGNsaWNrZWQvYWN0aXZhdGVkLiAqL1xuICBAT3V0cHV0KCkgY2FyZENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXRzIHRoZSB0b2tlbiBvZiB0aGUgY2xpY2tlZCBhY3Rpb24gYnV0dG9uLiAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogTWVyZ2VkIGNvbmZpZy4gKi9cbiAgcmVhZG9ubHkgY29uZmlnID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wcm9wcygpIGFzIEVudGl0eUNhcmRNZXRhZGF0YSk7XG5cbiAgLyoqIEFjdGlvbiBidXR0b25zIChlbXB0eSBhcnJheSB3aGVuIG5vbmUpLiAqL1xuICByZWFkb25seSBhY3Rpb25zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWcoKS5hY3Rpb25zID8/IFtdKTtcblxuICAvKipcbiAgICogQmFkZ2UtbW9kZSBwaWxsIHByb3BzIGZvciB0aGUgc3RhdHVzIGNoaXAsIG9yIG51bGwgd2hlbiBhYnNlbnQuXG4gICAqIGBjaGlwLmNvbG9yYCBpcyBhIGZyZWUtZm9ybSBzdHJpbmcgKElvbmljIGNvbG9yIG5hbWUgb3IgQ1NTKSBwZXIgdGhlIHB1YmxpY1xuICAgKiBjb250cmFjdDsgY2FzdCB0byBzYXRpc2Z5IGBQaWxsTWV0YWRhdGEuY29sb3JgIChJb25pYyBgQ29sb3JgIHVuaW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IGNoaXBQaWxsUHJvcHMgPSBjb21wdXRlZDxQYXJ0aWFsPFBpbGxNZXRhZGF0YT4gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgY2hpcCA9IHRoaXMuY29uZmlnKCkuY2hpcDtcbiAgICBpZiAoIWNoaXApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IGxhYmVsOiBjaGlwLmxhYmVsLCBjb2xvcjogKGNoaXAuY29sb3IgfHwgJ21lZGl1bScpIGFzIFBpbGxNZXRhZGF0YVsnY29sb3InXSB9O1xuICB9KTtcblxuICAvKiogQ2FyZCBpcyBuYXZpZ2FibGUgb25seSB3aGVuIGBjbGlja2FibGVgIGFuZCB0aGVyZSBhcmUgbm8gYWN0aW9ucy4gKi9cbiAgcmVhZG9ubHkgaXNOYXZpZ2FibGUgPSBjb21wdXRlZCgoKSA9PiAhIXRoaXMuY29uZmlnKCkuY2xpY2thYmxlICYmIHRoaXMuYWN0aW9ucygpLmxlbmd0aCA9PT0gMCk7XG5cbiAgb25DYXJkQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTmF2aWdhYmxlKCkpIHJldHVybjtcbiAgICB0aGlzLmNhcmRDbGljay5lbWl0KHRoaXMuY29uZmlnKCkudG9rZW4pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2VudGl0eS1jYXJkL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBgQnV0dG9uTWV0YWRhdGFgIGlzIHRoZSBsaWIncyBidXR0b24gY29uZmlnIHR5cGUg4oCUIGFscmVhZHkgZXhwb3J0ZWQgZnJvbSB0aGVcbi8vIHBhY2thZ2Ugcm9vdCwgc28gY29uc3VtZXJzIGNhbiBpbXBvcnQgYm90aCBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnLlxuaW1wb3J0IHsgQnV0dG9uTWV0YWRhdGEgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbi8qKlxuICogT3B0aW9uYWwgc3RhdHVzIGNoaXAgcmVuZGVyZWQgYXMgYW4gZXllYnJvdyBhdCB0aGUgdG9wLWxlZnQgb2YgdGhlIGNhcmQuXG4gKiBSZW5kZXJlZCB2aWEgYHZhbC1waWxsYCAoYmFkZ2UgbW9kZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5Q2FyZENoaXAge1xuICAvKiogQWxyZWFkeS1yZXNvbHZlZCBsYWJlbCBzdHJpbmcuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBJb25pYyBjb2xvciBuYW1lIChgcHJpbWFyeWDigKZgZGFya2ApIG9yIENTUyBjb2xvci4gRGVmYXVsdDogYG1lZGl1bWAuICovXG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGB2YWwtZW50aXR5LWNhcmRgLlxuICpcbiAqIFByZXNlbnRhdGlvbmFsIG1vbGVjdWxlIOKAlCBldmVyeSB0ZXh0IGZpZWxkIGlzIGFuIGFscmVhZHktcmVzb2x2ZWQgc3RyaW5nXG4gKiAodGhlIGNvbnN1bWVyIHRyYW5zbGF0ZXMgdmlhIGBJMThuU2VydmljZS50KClgKS4gTm8gaTE4biBvZiBpdHMgb3duLlxuICpcbiAqIENvdmVycyB0d28gcmVhbCB1c2UtY2FzZXM6XG4gKlxuICogMS4gKipOYXZpZ2FibGUgZW50aXR5Kiog4oCUIHNldCBgY2xpY2thYmxlOiB0cnVlYCAoYW5kIG5vIGBhY3Rpb25zYCkuIFRoZSB3aG9sZVxuICogICAgY2FyZCBiZWNvbWVzIGEgYnV0dG9uOiBzaG93cyBhIGNoZXZyb24sIGdhaW5zIGByb2xlPVwiYnV0dG9uXCJgICsga2V5Ym9hcmRcbiAqICAgIHN1cHBvcnQsIGFuZCBlbWl0cyBgKGNhcmRDbGljaylgIHdpdGggYHRva2VuYC5cbiAqXG4gKiAyLiAqKlJvdyB3aXRoIGFjdGlvbihzKSoqIOKAlCBwcm92aWRlIGBhY3Rpb25zYCAoZS5nLiBhIHByaXplIHJvdyB3aXRoIGFuXG4gKiAgICBcImVkaXRcIi9cImFzc2lnblwiIGJ1dHRvbikuIEVhY2ggYnV0dG9uIGVtaXRzIGAoYWN0aW9uQ2xpY2spYCB3aXRoIGl0cyB0b2tlbi5cbiAqICAgIFdoZW4gYGFjdGlvbnNgIGlzIHByZXNlbnQgdGhlIGNhcmQgaXMgTk9UIG5hdmlnYWJsZSAobm8gY2hldnJvbikuXG4gKlxuICogQGV4YW1wbGUgTmF2aWdhYmxlIGV2ZW50XG4gKiBgYGBodG1sXG4gKiA8dmFsLWVudGl0eS1jYXJkXG4gKiAgIFtwcm9wc109XCJ7XG4gKiAgICAgY2hpcDogeyBsYWJlbDogJ0VuIHZpdm8nLCBjb2xvcjogJ3N1Y2Nlc3MnIH0sXG4gKiAgICAgdGl0bGU6ICdCaW5nbyBTb2xpZGFyaW8nLFxuICogICAgIHN1YnRpdGxlOiAnSG95IDIwOjAwIMK3IDEyMCBqdWdhZG9yZXMnLFxuICogICAgIGNsaWNrYWJsZTogdHJ1ZSxcbiAqICAgICB0b2tlbjogJ2V2dC0xJ1xuICogICB9XCJcbiAqICAgKGNhcmRDbGljayk9XCJvcGVuKCRldmVudClcIiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgUHJpemUgcm93IHdpdGggYW4gYWN0aW9uXG4gKiBgYGBodG1sXG4gKiA8dmFsLWVudGl0eS1jYXJkXG4gKiAgIFtwcm9wc109XCJ7XG4gKiAgICAgdGl0bGU6ICdMw61uZWEnLFxuICogICAgIHN1YnRpdGxlOiAnU21hcnQgVFYgNTBcXFwiJyxcbiAqICAgICBlbmROb3RlOiAnR2FuYWRvcjogTWFyw61hIFAuJyxcbiAqICAgICBhY3Rpb25zOiBbXG4gKiAgICAgICB7IHRleHQ6ICdFZGl0YXInLCBjb2xvcjogJ2RhcmsnLCBmaWxsOiAnY2xlYXInLCB0eXBlOiAnYnV0dG9uJywgc3RhdGU6ICdFTkFCTEVEJywgdG9rZW46ICdwcml6ZS0xJyB9XG4gKiAgICAgXVxuICogICB9XCJcbiAqICAgKGFjdGlvbkNsaWNrKT1cImVkaXQoJGV2ZW50KVwiIC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlDYXJkTWV0YWRhdGEge1xuICAvKiogT3B0aW9uYWwgc3RhdHVzIGJhZGdlLCB0b3AtbGVmdCBvZiB0aGUgY2FyZC4gUmVuZGVyZWQgd2l0aCBgdmFsLXBpbGxgLiAqL1xuICBjaGlwPzogRW50aXR5Q2FyZENoaXA7XG4gIC8qKiBNYWluIHRleHQgKHdlaWdodCA3MDApLiBBbHJlYWR5IHJlc29sdmVkLiAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogU2Vjb25kYXJ5IG11dGVkIGxpbmUuIEFscmVhZHkgcmVzb2x2ZWQuICovXG4gIHN1YnRpdGxlPzogc3RyaW5nO1xuICAvKiogQWRkaXRpb25hbCBzZWNvbmRhcnkgbm90ZSAoZS5nLiBcIkdhbmFkb3I6IFhcIiksIG11dGVkLCBiZWxvdyBgc3VidGl0bGVgLiAqL1xuICBlbmROb3RlPzogc3RyaW5nO1xuICAvKiogQWN0aW9uIGJ1dHRvbnMgcmVuZGVyZWQgb24gdGhlIHJpZ2h0IChvbmUgYHZhbC1idXR0b25gIGVhY2gpLiAqL1xuICBhY3Rpb25zPzogQnV0dG9uTWV0YWRhdGFbXTtcbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIGFuZCB0aGVyZSBhcmUgTk8gYGFjdGlvbnNgLCB0aGUgd2hvbGUgY2FyZCBpcyBuYXZpZ2FibGU6XG4gICAqIHNob3dzIGEgY2hldnJvbiwgYHJvbGU9XCJidXR0b25cImAgKyBgdGFiaW5kZXhgLCBrZXlib2FyZCBhY3RpdmF0aW9uLCBhbmRcbiAgICogZW1pdHMgYChjYXJkQ2xpY2spYC5cbiAgICovXG4gIGNsaWNrYWJsZT86IGJvb2xlYW47XG4gIC8qKiBJZGVudGlmaWVyIGVtaXR0ZWQgb24gYChjYXJkQ2xpY2spYC4gKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG59XG4iXX0=
@@ -46,12 +46,24 @@ export class OAuthCallbackComponent {
46
46
  }
47
47
  /**
48
48
  * Indica si este callback corre como la VENTANA PRINCIPAL (flujo redirect),
49
- * no como popup. El popup se abre con window.name 'oauth'/'oauth-link'
50
- * (OAuthService), nombre que persiste aunque COOP anule window.opener tras el
51
- * bounce cross-origin. En la ventana principal nadie consume el localStorage,
52
- * así que el callback debe instalar la sesión y navegar él mismo.
49
+ * no como popup.
50
+ *
51
+ * NO usamos window.name ni window.opener como indicadores primarios:
52
+ * - Chrome/Firefox borran window.name al navegar cross-origin (privacidad),
53
+ * por lo que ya no vale para el flujo OAuth que pasa por Google/MS.
54
+ * - window.opener queda null cuando el proveedor tiene COOP:same-origin
55
+ * (Google lo usa), que sever la referencia en el bounce.
56
+ *
57
+ * Indicador confiable: `popup=true` en la URL. OAuthService lo inyecta en
58
+ * el redirect_uri antes del /start; el backend lo reenvía intacto en el
59
+ * redirect final vía appendParams → sobrevive todo el round-trip sin
60
+ * depender de estado de la ventana del navegador.
53
61
  */
54
62
  isMainWindow() {
63
+ const params = new URLSearchParams(window.location.search);
64
+ if (params.get('popup') === 'true')
65
+ return false;
66
+ // Compatibilidad con flujos sin popup=true (redirect directo, tests, legacy).
55
67
  if (window.name === 'oauth' || window.name === 'oauth-link')
56
68
  return false;
57
69
  return !window.opener && window.parent === window;
@@ -214,13 +226,12 @@ export class OAuthCallbackComponent {
214
226
  }
215
227
  }
216
228
  closeAfterDelay() {
217
- // Dar tiempo para que el mensaje se envíe antes de cerrar.
218
- // window.opener puede ser null si COOP severa la referencia durante el bounce
219
- // cross-origin (Google → api backend → app). window.name='oauth' se preserva
220
- // a través del bounce y es el indicador confiable de que somos popup OAuth.
229
+ // popup=true en la URL es el indicador confiable de que somos popup OAuth
230
+ // (window.name se borra en cross-origin nav; window.opener sever por COOP).
221
231
  setTimeout(() => {
222
- const isOAuthPopup = window.name === 'oauth' || window.name === 'oauth-link';
223
- if (window.opener || isOAuthPopup) {
232
+ const params = new URLSearchParams(window.location.search);
233
+ const isPopup = params.get('popup') === 'true' || window.name === 'oauth' || window.name === 'oauth-link';
234
+ if (window.opener || isPopup) {
224
235
  window.close();
225
236
  }
226
237
  }, 500);
@@ -246,4 +257,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
246
257
  type: Inject,
247
258
  args: [VALTECH_AUTH_CONFIG]
248
259
  }] }] });
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgtY2FsbGJhY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL29hdXRoLWNhbGxiYWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7QUFFakY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFTSCxNQUFNLE9BQU8sc0JBQXNCO0lBVWpDLFlBQ1UsTUFBYyxFQUNGLFdBQStCLEVBQ0YsTUFBZ0M7UUFGekUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNGLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUNGLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBWm5GLFlBQU8sR0FBRyw2QkFBNkIsQ0FBQztRQUV4Qzs7OztXQUlHO1FBQ0ssZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO0lBTXZDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxZQUFZO1FBQ2xCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQixDQUFDLE1BQW1CO1FBQzlDLElBQUks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QUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsMkRBQTJEO1FBQzNELDhFQUE4RTtRQUM5RSw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQztZQUM3RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQzsrR0FuTlUsc0JBQXNCLG1GQWFYLG1CQUFtQjttR0FiOUIsc0JBQXNCLDhFQUZ2QixnQkFBZ0IsMkRBSGhCLFlBQVksK0JBQUUsZUFBZTs7NEZBSzVCLHNCQUFzQjtrQkFSbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQztvQkFDeEMsK0VBQStFO29CQUMvRSxpRkFBaUY7b0JBQ2pGLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzswQkFhSSxRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1GQU1ldGhvZCwgT0F1dGhDYWxsYmFja0RhdGEsIE9BdXRoUmVzdWx0LCBPQXV0aEVycm9yLCBWYWx0ZWNoQXV0aENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVkFMVEVDSF9BVVRIX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BsYXNoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hdG9tcy9zcGxhc2gvc3BsYXNoLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQ29tcG9uZW50ZSBkZSBjYWxsYmFjayBwYXJhIE9BdXRoLlxuICpcbiAqIEVzdGUgY29tcG9uZW50ZSBwcm9jZXNhIGxhIHJlc3B1ZXN0YSBkZWwgc2Vydmlkb3IgT0F1dGggeSBlbnbDrWFcbiAqIGxvcyB0b2tlbnMgYSBsYSB2ZW50YW5hIHBhZHJlIHZpYSBwb3N0TWVzc2FnZS5cbiAqXG4gKiBEZWJlIGFncmVnYXJzZSBhIGxhcyBydXRhcyBkZSBsYSBhcGxpY2FjacOzbjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIGFwcC5yb3V0ZXMudHNcbiAqIGltcG9ydCB7IE9BdXRoQ2FsbGJhY2tDb21wb25lbnQgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIGV4cG9ydCBjb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAqICAgeyBwYXRoOiAnYXV0aC9vYXV0aC9jYWxsYmFjaycsIGNvbXBvbmVudDogT0F1dGhDYWxsYmFja0NvbXBvbmVudCB9LFxuICogICAvLyAuLi4gb3RyYXMgcnV0YXNcbiAqIF07XG4gKiBgYGBcbiAqXG4gKiBFbCBiYWNrZW5kIHJlZGlyaWdlIGEgZXN0YSBydXRhIGNvbiBsb3MgdG9rZW5zIGVuIHF1ZXJ5IHBhcmFtczpcbiAqIGAvYXV0aC9vYXV0aC9jYWxsYmFjaz9hY2Nlc3NfdG9rZW49eHh4JnJlZnJlc2hfdG9rZW49eHh4JmV4cGlyZXNfaW49OTAwYFxuICpcbiAqIE8gY29uIGVycm9yOlxuICogYC9hdXRoL29hdXRoL2NhbGxiYWNrP2Vycm9yPUlOVkFMSURfQ09ERSZlcnJvcl9kZXNjcmlwdGlvbj0uLi5gXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1vYXV0aC1jYWxsYmFjaycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNwbGFzaENvbXBvbmVudF0sXG4gIC8vIE1pc21vIHNwbGFzaCBkZSBhcnJhbnF1ZSBkZSBsYSBhcHAgKGxvZ28gKyBwdWxzZSkgZW4gdmV6IGRlIHVuIGxvYWRlciBwcm9waW9cbiAgLy8gY2FzaS1kdXBsaWNhZG86IGVsIGNhbGxiYWNrIE9BdXRoIGVzIHVuYSBjYXJnYSBmdW5kYW1lbnRhbCB5IGRlYmUgdmVyc2UgaWd1YWwuXG4gIHRlbXBsYXRlOiBgPHZhbC1zcGxhc2ggLz5gLFxufSlcbmV4cG9ydCBjbGFzcyBPQXV0aENhbGxiYWNrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbWVzc2FnZSA9ICdQcm9jZXNhbmRvIGF1dGVudGljYWNpw7NuLi4uJztcblxuICAvKipcbiAgICogTm9uY2UgcXVlIGVsIG9wZW5lciBnZW5lcsOzIHkgcGFzw7MgcG9yIGVsIGZsdWpvIChyb3VuZC10cmlwIGJhY2tlbmQpLiBTZVxuICAgKiByZWVudsOtYSBhbCBvcGVuZXIgZW4gY2FkYSBtZW5zYWplIHBhcmEgcXVlIHZlcmlmaXF1ZSBlbCBvcmlnZW4gZGVsIGNhbGxiYWNrXG4gICAqIHkgcmVjaGFjZSB1biBvYXV0aF9jYWxsYmFja19kYXRhIGZvcmphZG8gZW4gbG9jYWxTdG9yYWdlIHBvciBYU1MgKE0tMDcpLlxuICAgKi9cbiAgcHJpdmF0ZSBjbGllbnROb25jZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWQUxURUNIX0FVVEhfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVmFsdGVjaEF1dGhDb25maWcgfCBudWxsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NDYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYSBzaSBlc3RlIGNhbGxiYWNrIGNvcnJlIGNvbW8gbGEgVkVOVEFOQSBQUklOQ0lQQUwgKGZsdWpvIHJlZGlyZWN0KSxcbiAgICogbm8gY29tbyBwb3B1cC4gRWwgcG9wdXAgc2UgYWJyZSBjb24gd2luZG93Lm5hbWUgJ29hdXRoJy8nb2F1dGgtbGluaydcbiAgICogKE9BdXRoU2VydmljZSksIG5vbWJyZSBxdWUgcGVyc2lzdGUgYXVucXVlIENPT1AgYW51bGUgd2luZG93Lm9wZW5lciB0cmFzIGVsXG4gICAqIGJvdW5jZSBjcm9zcy1vcmlnaW4uIEVuIGxhIHZlbnRhbmEgcHJpbmNpcGFsIG5hZGllIGNvbnN1bWUgZWwgbG9jYWxTdG9yYWdlLFxuICAgKiBhc8OtIHF1ZSBlbCBjYWxsYmFjayBkZWJlIGluc3RhbGFyIGxhIHNlc2nDs24geSBuYXZlZ2FyIMOpbCBtaXNtby5cbiAgICovXG4gIHByaXZhdGUgaXNNYWluV2luZG93KCk6IGJvb2xlYW4ge1xuICAgIGlmICh3aW5kb3cubmFtZSA9PT0gJ29hdXRoJyB8fCB3aW5kb3cubmFtZSA9PT0gJ29hdXRoLWxpbmsnKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICF3aW5kb3cub3BlbmVyICYmIHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0YSBlbCBsb2dpbiBlbiBsYSB2ZW50YW5hIHByaW5jaXBhbDogaW5zdGFsYSBsYSBzZXNpw7NuIGRlc2RlIGxvc1xuICAgKiB0b2tlbnMgZGVsIGNhbGxiYWNrIHkgbmF2ZWdhIGFsIGhvbWUuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlSW5NYWluV2luZG93KHJlc3VsdDogT0F1dGhSZXN1bHQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldEV4dGVybmFsQXV0aCh7XG4gICAgICBhY2Nlc3NUb2tlbjogcmVzdWx0LmFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiByZXN1bHQucmVmcmVzaFRva2VuLFxuICAgICAgZmlyZWJhc2VUb2tlbjogcmVzdWx0LmZpcmViYXNlVG9rZW4sXG4gICAgICBleHBpcmVzSW46IHJlc3VsdC5leHBpcmVzSW4sXG4gICAgICByb2xlczogcmVzdWx0LnJvbGVzLFxuICAgICAgcGVybWlzc2lvbnM6IHJlc3VsdC5wZXJtaXNzaW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuY29uZmlnPy5ob21lUm91dGUgfHwgJy8nLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIHRoaXMuY2xpZW50Tm9uY2UgPSBwYXJhbXMuZ2V0KCdjbGllbnRfbm9uY2UnKTtcblxuICAgIC8vIERFQlVHOiBMb2cgYWxsIHJlY2VpdmVkIHBhcmFtc1xuICAgIGNvbnNvbGUubG9nKCdbT0F1dGhDYWxsYmFja10gVVJMIHBhcmFtcyByZWNlaXZlZDonLCB7XG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgaGFzQWNjZXNzVG9rZW46IHBhcmFtcy5oYXMoJ2FjY2Vzc190b2tlbicpLFxuICAgICAgaGFzUmVmcmVzaFRva2VuOiBwYXJhbXMuaGFzKCdyZWZyZXNoX3Rva2VuJyksXG4gICAgICBoYXNGaXJlYmFzZVRva2VuOiBwYXJhbXMuaGFzKCdmaXJlYmFzZV90b2tlbicpLFxuICAgICAgZmlyZWJhc2VUb2tlbkxlbmd0aDogcGFyYW1zLmdldCgnZmlyZWJhc2VfdG9rZW4nKT8ubGVuZ3RoIHx8IDAsXG4gICAgICBlcnJvcjogcGFyYW1zLmdldCgnZXJyb3InKSxcbiAgICB9KTtcblxuICAgIC8vIFZlcmlmaWNhciBzaSBoYXkgZXJyb3JcbiAgICBjb25zdCBlcnJvciA9IHBhcmFtcy5nZXQoJ2Vycm9yJyk7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aGlzLnNlbmRUb1BhcmVudCh7XG4gICAgICAgIHR5cGU6ICdvYXV0aC1jYWxsYmFjaycsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgY29kZTogZXJyb3IsXG4gICAgICAgICAgbWVzc2FnZTogcGFyYW1zLmdldCgnZXJyb3JfZGVzY3JpcHRpb24nKSB8fCAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24nLFxuICAgICAgICB9IGFzIE9BdXRoRXJyb3IsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbic7XG4gICAgICB0aGlzLmNsb3NlQWZ0ZXJEZWxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1GQSByZXF1ZXJpZG8g4oCUIGVsIGJhY2tlbmQgcmVkaXJpZ2Ugc2luIHRva2VucywgY29uIG1mYV90b2tlbi4gRWwgZmx1am9cbiAgICAvLyBjb250aW7DumEgY29uIGVsIGNoYWxsZW5nZSBNRkEgKEF1dGhTZXJ2aWNlLnNldE1GQVBlbmRpbmcg4oaSIG1vZGFsIHZlcmlmeSkuXG4gICAgaWYgKHBhcmFtcy5nZXQoJ21mYV9yZXF1aXJlZCcpID09PSAndHJ1ZScpIHtcbiAgICAgIHRoaXMuc2VuZFRvUGFyZW50KHtcbiAgICAgICAgdHlwZTogJ29hdXRoLWNhbGxiYWNrJyxcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgYWNjZXNzVG9rZW46ICcnLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogJycsXG4gICAgICAgICAgZXhwaXJlc0luOiAwLFxuICAgICAgICAgIG1mYVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG1mYVRva2VuOiBwYXJhbXMuZ2V0KCdtZmFfdG9rZW4nKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgbWZhTWV0aG9kOiAocGFyYW1zLmdldCgnbWZhX21ldGhvZCcpIGFzIE1GQU1ldGhvZCkgfHwgdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSAnVmVyaWZpY2FjacOzbiBhZGljaW9uYWwgcmVxdWVyaWRhJztcbiAgICAgIHRoaXMuY2xvc2VBZnRlckRlbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXh0cmFlciB0b2tlbnNcbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IHBhcmFtcy5nZXQoJ2FjY2Vzc190b2tlbicpO1xuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHBhcmFtcy5nZXQoJ3JlZnJlc2hfdG9rZW4nKTtcbiAgICBjb25zdCBleHBpcmVzSW4gPSBwYXJhbXMuZ2V0KCdleHBpcmVzX2luJyk7XG4gICAgY29uc3QgZmlyZWJhc2VUb2tlbiA9IHBhcmFtcy5nZXQoJ2ZpcmViYXNlX3Rva2VuJyk7XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuIHx8ICFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRoaXMuc2VuZFRvUGFyZW50KHtcbiAgICAgICAgdHlwZTogJ29hdXRoLWNhbGxiYWNrJyxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBjb2RlOiAnTUlTU0lOR19UT0tFTlMnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdObyBzZSByZWNpYmllcm9uIGxvcyB0b2tlbnMgZGUgYXV0ZW50aWNhY2nDs24nLFxuICAgICAgICB9IGFzIE9BdXRoRXJyb3IsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdFcnJvcjogdG9rZW5zIG5vIHJlY2liaWRvcyc7XG4gICAgICB0aGlzLmNsb3NlQWZ0ZXJEZWxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4dHJhZXIgcm9sZXMgeSBwZXJtaXNvcyAocHVlZGVuIHZlbmlyIGNvbW8gSlNPTiBlbiBiYXNlNjQpXG4gICAgbGV0IHJvbGVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcGVybWlzc2lvbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgcm9sZXNQYXJhbSA9IHBhcmFtcy5nZXQoJ3JvbGVzJyk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNQYXJhbSA9IHBhcmFtcy5nZXQoJ3Blcm1pc3Npb25zJyk7XG5cbiAgICBpZiAocm9sZXNQYXJhbSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcm9sZXMgPSBKU09OLnBhcnNlKGF0b2Iocm9sZXNQYXJhbSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJvbGVzID0gcm9sZXNQYXJhbS5zcGxpdCgnLCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZXJtaXNzaW9uc1BhcmFtKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwZXJtaXNzaW9ucyA9IEpTT04ucGFyc2UoYXRvYihwZXJtaXNzaW9uc1BhcmFtKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uc1BhcmFtLnNwbGl0KCcsJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW52aWFyIHRva2VucyBhIGxhIHZlbnRhbmEgcGFkcmVcbiAgICBjb25zdCByZXN1bHQ6IE9BdXRoUmVzdWx0ID0ge1xuICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzSW46IGV4cGlyZXNJbiA/IHBhcnNlSW50KGV4cGlyZXNJbiwgMTApIDogOTAwLFxuICAgICAgZmlyZWJhc2VUb2tlbjogZmlyZWJhc2VUb2tlbiB8fCB1bmRlZmluZWQsXG4gICAgICByb2xlcyxcbiAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgaXNOZXdVc2VyOiBwYXJhbXMuZ2V0KCdpc19uZXdfdXNlcicpID09PSAndHJ1ZScsXG4gICAgICBsaW5rZWQ6IHBhcmFtcy5nZXQoJ2xpbmtlZCcpID09PSAndHJ1ZScsXG4gICAgfTtcblxuICAgIHRoaXMuc2VuZFRvUGFyZW50KHtcbiAgICAgIHR5cGU6ICdvYXV0aC1jYWxsYmFjaycsXG4gICAgICB0b2tlbnM6IHJlc3VsdCxcbiAgICB9KTtcblxuICAgIC8vIEZsdWpvIHJlZGlyZWN0ICh2ZW50YW5hIHByaW5jaXBhbCwgc2luIG9wZW5lciBxdWUgY29uc3VtYSBlbCBsb2NhbFN0b3JhZ2UpOlxuICAgIC8vIGluc3RhbGFyIGxhIHNlc2nDs24gYWPDoSBtaXNtbyB5IG5hdmVnYXIgYWwgaG9tZSwgZW4gdmV6IGRlIHF1ZWRhciBwZWdhZG8uXG4gICAgaWYgKHRoaXMuaXNNYWluV2luZG93KCkgJiYgdGhpcy5jb21wbGV0ZUluTWFpbldpbmRvdyhyZXN1bHQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tZXNzYWdlID0gJ0F1dGVudGljYWNpw7NuIGV4aXRvc2EnO1xuICAgIHRoaXMuY2xvc2VBZnRlckRlbGF5KCk7XG4gIH1cblxuICBwcml2YXRlIHNlbmRUb1BhcmVudChkYXRhOiBPQXV0aENhbGxiYWNrRGF0YSk6IHZvaWQge1xuICAgIC8vIEFkanVudGFyIGVsIG5vbmNlIGRlbCBvcGVuZXIgKE0tMDcpIGEgVE9ETyBtZW5zYWplIChzdWNjZXNzLCBNRkEsIGVycm9yKVxuICAgIC8vIHBhcmEgcXVlIGVsIG9wZW5lciB2ZXJpZmlxdWUgcXVlIGVsIGNhbGxiYWNrIGVzIGRlIHN1IHByb3BpbyBmbHVqby5cbiAgICBpZiAodGhpcy5jbGllbnROb25jZSkge1xuICAgICAgZGF0YS5ub25jZSA9IHRoaXMuY2xpZW50Tm9uY2U7XG4gICAgfVxuXG4gICAgLy8gU2llbXByZSBndWFyZGFyIGVuIGxvY2FsU3RvcmFnZSBjb21vIGZhbGxiYWNrIChwYXJhIENPT1AgaXNzdWVzKVxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnb2F1dGhfY2FsbGJhY2tfZGF0YScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdvYXV0aF9jYWxsYmFja190aW1lc3RhbXAnLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpO1xuICAgICAgY29uc29sZS5sb2coJ1tPQXV0aENhbGxiYWNrXSBTYXZlZCB0byBsb2NhbFN0b3JhZ2UgYXMgZmFsbGJhY2snKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPQXV0aENhbGxiYWNrXSBDb3VsZCBub3Qgc2F2ZSB0byBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgfVxuXG4gICAgLy8gSW50ZW50YXIgcG9zdE1lc3NhZ2UgKHB1ZWRlIGZhbGxhciBwb3IgQ09PUClcbiAgICB0cnkge1xuICAgICAgaWYgKHdpbmRvdy5vcGVuZXIgJiYgIXdpbmRvdy5vcGVuZXIuY2xvc2VkKSB7XG4gICAgICAgIHdpbmRvdy5vcGVuZXIucG9zdE1lc3NhZ2UoZGF0YSwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbT0F1dGhDYWxsYmFja10gcG9zdE1lc3NhZ2Ugc2VudCB0byBvcGVuZXInKTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93LnBhcmVudCAhPT0gd2luZG93KSB7XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoZGF0YSwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbT0F1dGhDYWxsYmFja10gcG9zdE1lc3NhZ2Ugc2VudCB0byBwYXJlbnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbT0F1dGhDYWxsYmFja10gTm8gb3BlbmVyL3BhcmVudCBhdmFpbGFibGUsIHVzaW5nIGxvY2FsU3RvcmFnZSBvbmx5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ09PUCBibG9ja3MgcG9zdE1lc3NhZ2UgLSBsb2NhbFN0b3JhZ2UgZmFsbGJhY2sgYWxyZWFkeSBzYXZlZFxuICAgICAgY29uc29sZS53YXJuKCdbT0F1dGhDYWxsYmFja10gcG9zdE1lc3NhZ2UgYmxvY2tlZCAoQ09PUCksIHVzaW5nIGxvY2FsU3RvcmFnZSBmYWxsYmFjazonLCBlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlQWZ0ZXJEZWxheSgpOiB2b2lkIHtcbiAgICAvLyBEYXIgdGllbXBvIHBhcmEgcXVlIGVsIG1lbnNhamUgc2UgZW52w61lIGFudGVzIGRlIGNlcnJhci5cbiAgICAvLyB3aW5kb3cub3BlbmVyIHB1ZWRlIHNlciBudWxsIHNpIENPT1Agc2V2ZXJhIGxhIHJlZmVyZW5jaWEgZHVyYW50ZSBlbCBib3VuY2VcbiAgICAvLyBjcm9zcy1vcmlnaW4gKEdvb2dsZSDihpIgYXBpIGJhY2tlbmQg4oaSIGFwcCkuIHdpbmRvdy5uYW1lPSdvYXV0aCcgc2UgcHJlc2VydmFcbiAgICAvLyBhIHRyYXbDqXMgZGVsIGJvdW5jZSB5IGVzIGVsIGluZGljYWRvciBjb25maWFibGUgZGUgcXVlIHNvbW9zIHBvcHVwIE9BdXRoLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaXNPQXV0aFBvcHVwID0gd2luZG93Lm5hbWUgPT09ICdvYXV0aCcgfHwgd2luZG93Lm5hbWUgPT09ICdvYXV0aC1saW5rJztcbiAgICAgIGlmICh3aW5kb3cub3BlbmVyIHx8IGlzT0F1dGhQb3B1cCkge1xuICAgICAgICB3aW5kb3cuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9LCA1MDApO1xuICB9XG59XG4iXX0=
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgtY2FsbGJhY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoL29hdXRoLWNhbGxiYWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7Ozs7QUFFakY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFTSCxNQUFNLE9BQU8sc0JBQXNCO0lBVWpDLFlBQ1UsTUFBYyxFQUNGLFdBQStCLEVBQ0YsTUFBZ0M7UUFGekUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNGLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUNGLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBWm5GLFlBQU8sR0FBRyw2QkFBNkIsQ0FBQztRQUV4Qzs7OztXQUlHO1FBQ0ssZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO0lBTXZDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLFlBQVk7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2pELDhFQUE4RTtRQUM5RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLE1BQU0s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b21wb25lbnQsIEluamVjdCwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNRkFNZXRob2QsIE9BdXRoQ2FsbGJhY2tEYXRhLCBPQXV0aFJlc3VsdCwgT0F1dGhFcnJvciwgVmFsdGVjaEF1dGhDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFZBTFRFQ0hfQVVUSF9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFNwbGFzaENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvc3BsYXNoL3NwbGFzaC5jb21wb25lbnQnO1xuXG4vKipcbiAqIENvbXBvbmVudGUgZGUgY2FsbGJhY2sgcGFyYSBPQXV0aC5cbiAqXG4gKiBFc3RlIGNvbXBvbmVudGUgcHJvY2VzYSBsYSByZXNwdWVzdGEgZGVsIHNlcnZpZG9yIE9BdXRoIHkgZW52w61hXG4gKiBsb3MgdG9rZW5zIGEgbGEgdmVudGFuYSBwYWRyZSB2aWEgcG9zdE1lc3NhZ2UuXG4gKlxuICogRGViZSBhZ3JlZ2Fyc2UgYSBsYXMgcnV0YXMgZGUgbGEgYXBsaWNhY2nDs246XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBhcHAucm91dGVzLnRzXG4gKiBpbXBvcnQgeyBPQXV0aENhbGxiYWNrQ29tcG9uZW50IH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqXG4gKiBleHBvcnQgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gKiAgIHsgcGF0aDogJ2F1dGgvb2F1dGgvY2FsbGJhY2snLCBjb21wb25lbnQ6IE9BdXRoQ2FsbGJhY2tDb21wb25lbnQgfSxcbiAqICAgLy8gLi4uIG90cmFzIHJ1dGFzXG4gKiBdO1xuICogYGBgXG4gKlxuICogRWwgYmFja2VuZCByZWRpcmlnZSBhIGVzdGEgcnV0YSBjb24gbG9zIHRva2VucyBlbiBxdWVyeSBwYXJhbXM6XG4gKiBgL2F1dGgvb2F1dGgvY2FsbGJhY2s/YWNjZXNzX3Rva2VuPXh4eCZyZWZyZXNoX3Rva2VuPXh4eCZleHBpcmVzX2luPTkwMGBcbiAqXG4gKiBPIGNvbiBlcnJvcjpcbiAqIGAvYXV0aC9vYXV0aC9jYWxsYmFjaz9lcnJvcj1JTlZBTElEX0NPREUmZXJyb3JfZGVzY3JpcHRpb249Li4uYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtb2F1dGgtY2FsbGJhY2snLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTcGxhc2hDb21wb25lbnRdLFxuICAvLyBNaXNtbyBzcGxhc2ggZGUgYXJyYW5xdWUgZGUgbGEgYXBwIChsb2dvICsgcHVsc2UpIGVuIHZleiBkZSB1biBsb2FkZXIgcHJvcGlvXG4gIC8vIGNhc2ktZHVwbGljYWRvOiBlbCBjYWxsYmFjayBPQXV0aCBlcyB1bmEgY2FyZ2EgZnVuZGFtZW50YWwgeSBkZWJlIHZlcnNlIGlndWFsLlxuICB0ZW1wbGF0ZTogYDx2YWwtc3BsYXNoIC8+YCxcbn0pXG5leHBvcnQgY2xhc3MgT0F1dGhDYWxsYmFja0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIG1lc3NhZ2UgPSAnUHJvY2VzYW5kbyBhdXRlbnRpY2FjacOzbi4uLic7XG5cbiAgLyoqXG4gICAqIE5vbmNlIHF1ZSBlbCBvcGVuZXIgZ2VuZXLDsyB5IHBhc8OzIHBvciBlbCBmbHVqbyAocm91bmQtdHJpcCBiYWNrZW5kKS4gU2VcbiAgICogcmVlbnbDrWEgYWwgb3BlbmVyIGVuIGNhZGEgbWVuc2FqZSBwYXJhIHF1ZSB2ZXJpZmlxdWUgZWwgb3JpZ2VuIGRlbCBjYWxsYmFja1xuICAgKiB5IHJlY2hhY2UgdW4gb2F1dGhfY2FsbGJhY2tfZGF0YSBmb3JqYWRvIGVuIGxvY2FsU3RvcmFnZSBwb3IgWFNTIChNLTA3KS5cbiAgICovXG4gIHByaXZhdGUgY2xpZW50Tm9uY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVkFMVEVDSF9BVVRIX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hBdXRoQ29uZmlnIHwgbnVsbFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2Egc2kgZXN0ZSBjYWxsYmFjayBjb3JyZSBjb21vIGxhIFZFTlRBTkEgUFJJTkNJUEFMIChmbHVqbyByZWRpcmVjdCksXG4gICAqIG5vIGNvbW8gcG9wdXAuXG4gICAqXG4gICAqIE5PIHVzYW1vcyB3aW5kb3cubmFtZSBuaSB3aW5kb3cub3BlbmVyIGNvbW8gaW5kaWNhZG9yZXMgcHJpbWFyaW9zOlxuICAgKiAtIENocm9tZS9GaXJlZm94IGJvcnJhbiB3aW5kb3cubmFtZSBhbCBuYXZlZ2FyIGNyb3NzLW9yaWdpbiAocHJpdmFjaWRhZCksXG4gICAqICAgcG9yIGxvIHF1ZSB5YSBubyB2YWxlIHBhcmEgZWwgZmx1am8gT0F1dGggcXVlIHBhc2EgcG9yIEdvb2dsZS9NUy5cbiAgICogLSB3aW5kb3cub3BlbmVyIHF1ZWRhIG51bGwgY3VhbmRvIGVsIHByb3ZlZWRvciB0aWVuZSBDT09QOnNhbWUtb3JpZ2luXG4gICAqICAgKEdvb2dsZSBsbyB1c2EpLCBxdWUgc2V2ZXIgbGEgcmVmZXJlbmNpYSBlbiBlbCBib3VuY2UuXG4gICAqXG4gICAqIEluZGljYWRvciBjb25maWFibGU6IGBwb3B1cD10cnVlYCBlbiBsYSBVUkwuIE9BdXRoU2VydmljZSBsbyBpbnllY3RhIGVuXG4gICAqIGVsIHJlZGlyZWN0X3VyaSBhbnRlcyBkZWwgL3N0YXJ0OyBlbCBiYWNrZW5kIGxvIHJlZW52w61hIGludGFjdG8gZW4gZWxcbiAgICogcmVkaXJlY3QgZmluYWwgdsOtYSBhcHBlbmRQYXJhbXMg4oaSIHNvYnJldml2ZSB0b2RvIGVsIHJvdW5kLXRyaXAgc2luXG4gICAqIGRlcGVuZGVyIGRlIGVzdGFkbyBkZSBsYSB2ZW50YW5hIGRlbCBuYXZlZ2Fkb3IuXG4gICAqL1xuICBwcml2YXRlIGlzTWFpbldpbmRvdygpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIGlmIChwYXJhbXMuZ2V0KCdwb3B1cCcpID09PSAndHJ1ZScpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDb21wYXRpYmlsaWRhZCBjb24gZmx1am9zIHNpbiBwb3B1cD10cnVlIChyZWRpcmVjdCBkaXJlY3RvLCB0ZXN0cywgbGVnYWN5KS5cbiAgICBpZiAod2luZG93Lm5hbWUgPT09ICdvYXV0aCcgfHwgd2luZG93Lm5hbWUgPT09ICdvYXV0aC1saW5rJykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhd2luZG93Lm9wZW5lciAmJiB3aW5kb3cucGFyZW50ID09PSB3aW5kb3c7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGEgZWwgbG9naW4gZW4gbGEgdmVudGFuYSBwcmluY2lwYWw6IGluc3RhbGEgbGEgc2VzacOzbiBkZXNkZSBsb3NcbiAgICogdG9rZW5zIGRlbCBjYWxsYmFjayB5IG5hdmVnYSBhbCBob21lLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wbGV0ZUluTWFpbldpbmRvdyhyZXN1bHQ6IE9BdXRoUmVzdWx0KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5hdXRoU2VydmljZS5zZXRFeHRlcm5hbEF1dGgoe1xuICAgICAgYWNjZXNzVG9rZW46IHJlc3VsdC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVzdWx0LnJlZnJlc2hUb2tlbixcbiAgICAgIGZpcmViYXNlVG9rZW46IHJlc3VsdC5maXJlYmFzZVRva2VuLFxuICAgICAgZXhwaXJlc0luOiByZXN1bHQuZXhwaXJlc0luLFxuICAgICAgcm9sZXM6IHJlc3VsdC5yb2xlcyxcbiAgICAgIHBlcm1pc3Npb25zOiByZXN1bHQucGVybWlzc2lvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmNvbmZpZz8uaG9tZVJvdXRlIHx8ICcvJywgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICB0aGlzLmNsaWVudE5vbmNlID0gcGFyYW1zLmdldCgnY2xpZW50X25vbmNlJyk7XG5cbiAgICAvLyBERUJVRzogTG9nIGFsbCByZWNlaXZlZCBwYXJhbXNcbiAgICBjb25zb2xlLmxvZygnW09BdXRoQ2FsbGJhY2tdIFVSTCBwYXJhbXMgcmVjZWl2ZWQ6Jywge1xuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIGhhc0FjY2Vzc1Rva2VuOiBwYXJhbXMuaGFzKCdhY2Nlc3NfdG9rZW4nKSxcbiAgICAgIGhhc1JlZnJlc2hUb2tlbjogcGFyYW1zLmhhcygncmVmcmVzaF90b2tlbicpLFxuICAgICAgaGFzRmlyZWJhc2VUb2tlbjogcGFyYW1zLmhhcygnZmlyZWJhc2VfdG9rZW4nKSxcbiAgICAgIGZpcmViYXNlVG9rZW5MZW5ndGg6IHBhcmFtcy5nZXQoJ2ZpcmViYXNlX3Rva2VuJyk/Lmxlbmd0aCB8fCAwLFxuICAgICAgZXJyb3I6IHBhcmFtcy5nZXQoJ2Vycm9yJyksXG4gICAgfSk7XG5cbiAgICAvLyBWZXJpZmljYXIgc2kgaGF5IGVycm9yXG4gICAgY29uc3QgZXJyb3IgPSBwYXJhbXMuZ2V0KCdlcnJvcicpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgdGhpcy5zZW5kVG9QYXJlbnQoe1xuICAgICAgICB0eXBlOiAnb2F1dGgtY2FsbGJhY2snLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIGNvZGU6IGVycm9yLFxuICAgICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5nZXQoJ2Vycm9yX2Rlc2NyaXB0aW9uJykgfHwgJ0Vycm9yIGRlIGF1dGVudGljYWNpw7NuJyxcbiAgICAgICAgfSBhcyBPQXV0aEVycm9yLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24nO1xuICAgICAgdGhpcy5jbG9zZUFmdGVyRGVsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNRkEgcmVxdWVyaWRvIOKAlCBlbCBiYWNrZW5kIHJlZGlyaWdlIHNpbiB0b2tlbnMsIGNvbiBtZmFfdG9rZW4uIEVsIGZsdWpvXG4gICAgLy8gY29udGluw7phIGNvbiBlbCBjaGFsbGVuZ2UgTUZBIChBdXRoU2VydmljZS5zZXRNRkFQZW5kaW5nIOKGkiBtb2RhbCB2ZXJpZnkpLlxuICAgIGlmIChwYXJhbXMuZ2V0KCdtZmFfcmVxdWlyZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLnNlbmRUb1BhcmVudCh7XG4gICAgICAgIHR5cGU6ICdvYXV0aC1jYWxsYmFjaycsXG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIGFjY2Vzc1Rva2VuOiAnJyxcbiAgICAgICAgICByZWZyZXNoVG9rZW46ICcnLFxuICAgICAgICAgIGV4cGlyZXNJbjogMCxcbiAgICAgICAgICBtZmFSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBtZmFUb2tlbjogcGFyYW1zLmdldCgnbWZhX3Rva2VuJykgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1mYU1ldGhvZDogKHBhcmFtcy5nZXQoJ21mYV9tZXRob2QnKSBhcyBNRkFNZXRob2QpIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tZXNzYWdlID0gJ1ZlcmlmaWNhY2nDs24gYWRpY2lvbmFsIHJlcXVlcmlkYSc7XG4gICAgICB0aGlzLmNsb3NlQWZ0ZXJEZWxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4dHJhZXIgdG9rZW5zXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBwYXJhbXMuZ2V0KCdhY2Nlc3NfdG9rZW4nKTtcbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBwYXJhbXMuZ2V0KCdyZWZyZXNoX3Rva2VuJyk7XG4gICAgY29uc3QgZXhwaXJlc0luID0gcGFyYW1zLmdldCgnZXhwaXJlc19pbicpO1xuICAgIGNvbnN0IGZpcmViYXNlVG9rZW4gPSBwYXJhbXMuZ2V0KCdmaXJlYmFzZV90b2tlbicpO1xuXG4gICAgaWYgKCFhY2Nlc3NUb2tlbiB8fCAhcmVmcmVzaFRva2VuKSB7XG4gICAgICB0aGlzLnNlbmRUb1BhcmVudCh7XG4gICAgICAgIHR5cGU6ICdvYXV0aC1jYWxsYmFjaycsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgY29kZTogJ01JU1NJTkdfVE9LRU5TJyxcbiAgICAgICAgICBtZXNzYWdlOiAnTm8gc2UgcmVjaWJpZXJvbiBsb3MgdG9rZW5zIGRlIGF1dGVudGljYWNpw7NuJyxcbiAgICAgICAgfSBhcyBPQXV0aEVycm9yLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSAnRXJyb3I6IHRva2VucyBubyByZWNpYmlkb3MnO1xuICAgICAgdGhpcy5jbG9zZUFmdGVyRGVsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWVyIHJvbGVzIHkgcGVybWlzb3MgKHB1ZWRlbiB2ZW5pciBjb21vIEpTT04gZW4gYmFzZTY0KVxuICAgIGxldCByb2xlczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHBlcm1pc3Npb25zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJvbGVzUGFyYW0gPSBwYXJhbXMuZ2V0KCdyb2xlcycpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zUGFyYW0gPSBwYXJhbXMuZ2V0KCdwZXJtaXNzaW9ucycpO1xuXG4gICAgaWYgKHJvbGVzUGFyYW0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvbGVzID0gSlNPTi5wYXJzZShhdG9iKHJvbGVzUGFyYW0pKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByb2xlcyA9IHJvbGVzUGFyYW0uc3BsaXQoJywnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGVybWlzc2lvbnNQYXJhbSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGVybWlzc2lvbnMgPSBKU09OLnBhcnNlKGF0b2IocGVybWlzc2lvbnNQYXJhbSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHBlcm1pc3Npb25zID0gcGVybWlzc2lvbnNQYXJhbS5zcGxpdCgnLCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVudmlhciB0b2tlbnMgYSBsYSB2ZW50YW5hIHBhZHJlXG4gICAgY29uc3QgcmVzdWx0OiBPQXV0aFJlc3VsdCA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgZXhwaXJlc0luOiBleHBpcmVzSW4gPyBwYXJzZUludChleHBpcmVzSW4sIDEwKSA6IDkwMCxcbiAgICAgIGZpcmViYXNlVG9rZW46IGZpcmViYXNlVG9rZW4gfHwgdW5kZWZpbmVkLFxuICAgICAgcm9sZXMsXG4gICAgICBwZXJtaXNzaW9ucyxcbiAgICAgIGlzTmV3VXNlcjogcGFyYW1zLmdldCgnaXNfbmV3X3VzZXInKSA9PT0gJ3RydWUnLFxuICAgICAgbGlua2VkOiBwYXJhbXMuZ2V0KCdsaW5rZWQnKSA9PT0gJ3RydWUnLFxuICAgIH07XG5cbiAgICB0aGlzLnNlbmRUb1BhcmVudCh7XG4gICAgICB0eXBlOiAnb2F1dGgtY2FsbGJhY2snLFxuICAgICAgdG9rZW5zOiByZXN1bHQsXG4gICAgfSk7XG5cbiAgICAvLyBGbHVqbyByZWRpcmVjdCAodmVudGFuYSBwcmluY2lwYWwsIHNpbiBvcGVuZXIgcXVlIGNvbnN1bWEgZWwgbG9jYWxTdG9yYWdlKTpcbiAgICAvLyBpbnN0YWxhciBsYSBzZXNpw7NuIGFjw6EgbWlzbW8geSBuYXZlZ2FyIGFsIGhvbWUsIGVuIHZleiBkZSBxdWVkYXIgcGVnYWRvLlxuICAgIGlmICh0aGlzLmlzTWFpbldpbmRvdygpICYmIHRoaXMuY29tcGxldGVJbk1haW5XaW5kb3cocmVzdWx0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWVzc2FnZSA9ICdBdXRlbnRpY2FjacOzbiBleGl0b3NhJztcbiAgICB0aGlzLmNsb3NlQWZ0ZXJEZWxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVG9QYXJlbnQoZGF0YTogT0F1dGhDYWxsYmFja0RhdGEpOiB2b2lkIHtcbiAgICAvLyBBZGp1bnRhciBlbCBub25jZSBkZWwgb3BlbmVyIChNLTA3KSBhIFRPRE8gbWVuc2FqZSAoc3VjY2VzcywgTUZBLCBlcnJvcilcbiAgICAvLyBwYXJhIHF1ZSBlbCBvcGVuZXIgdmVyaWZpcXVlIHF1ZSBlbCBjYWxsYmFjayBlcyBkZSBzdSBwcm9waW8gZmx1am8uXG4gICAgaWYgKHRoaXMuY2xpZW50Tm9uY2UpIHtcbiAgICAgIGRhdGEubm9uY2UgPSB0aGlzLmNsaWVudE5vbmNlO1xuICAgIH1cblxuICAgIC8vIFNpZW1wcmUgZ3VhcmRhciBlbiBsb2NhbFN0b3JhZ2UgY29tbyBmYWxsYmFjayAocGFyYSBDT09QIGlzc3VlcylcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ29hdXRoX2NhbGxiYWNrX2RhdGEnLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnb2F1dGhfY2FsbGJhY2tfdGltZXN0YW1wJywgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcbiAgICAgIGNvbnNvbGUubG9nKCdbT0F1dGhDYWxsYmFja10gU2F2ZWQgdG8gbG9jYWxTdG9yYWdlIGFzIGZhbGxiYWNrJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbT0F1dGhDYWxsYmFja10gQ291bGQgbm90IHNhdmUgdG8gbG9jYWxTdG9yYWdlOicsIGUpO1xuICAgIH1cblxuICAgIC8vIEludGVudGFyIHBvc3RNZXNzYWdlIChwdWVkZSBmYWxsYXIgcG9yIENPT1ApXG4gICAgdHJ5IHtcbiAgICAgIGlmICh3aW5kb3cub3BlbmVyICYmICF3aW5kb3cub3BlbmVyLmNsb3NlZCkge1xuICAgICAgICB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKGRhdGEsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICBjb25zb2xlLmxvZygnW09BdXRoQ2FsbGJhY2tdIHBvc3RNZXNzYWdlIHNlbnQgdG8gb3BlbmVyJyk7XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKGRhdGEsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICBjb25zb2xlLmxvZygnW09BdXRoQ2FsbGJhY2tdIHBvc3RNZXNzYWdlIHNlbnQgdG8gcGFyZW50Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnW09BdXRoQ2FsbGJhY2tdIE5vIG9wZW5lci9wYXJlbnQgYXZhaWxhYmxlLCB1c2luZyBsb2NhbFN0b3JhZ2Ugb25seScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENPT1AgYmxvY2tzIHBvc3RNZXNzYWdlIC0gbG9jYWxTdG9yYWdlIGZhbGxiYWNrIGFscmVhZHkgc2F2ZWRcbiAgICAgIGNvbnNvbGUud2FybignW09BdXRoQ2FsbGJhY2tdIHBvc3RNZXNzYWdlIGJsb2NrZWQgKENPT1ApLCB1c2luZyBsb2NhbFN0b3JhZ2UgZmFsbGJhY2s6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUFmdGVyRGVsYXkoKTogdm9pZCB7XG4gICAgLy8gcG9wdXA9dHJ1ZSBlbiBsYSBVUkwgZXMgZWwgaW5kaWNhZG9yIGNvbmZpYWJsZSBkZSBxdWUgc29tb3MgcG9wdXAgT0F1dGhcbiAgICAvLyAod2luZG93Lm5hbWUgc2UgYm9ycmEgZW4gY3Jvc3Mtb3JpZ2luIG5hdjsgd2luZG93Lm9wZW5lciBzZXZlciBwb3IgQ09PUCkuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgY29uc3QgaXNQb3B1cCA9IHBhcmFtcy5nZXQoJ3BvcHVwJykgPT09ICd0cnVlJyB8fCB3aW5kb3cubmFtZSA9PT0gJ29hdXRoJyB8fCB3aW5kb3cubmFtZSA9PT0gJ29hdXRoLWxpbmsnO1xuICAgICAgaWYgKHdpbmRvdy5vcGVuZXIgfHwgaXNQb3B1cCkge1xuICAgICAgICB3aW5kb3cuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9LCA1MDApO1xuICB9XG59XG4iXX0=