@snabcentr/client-ui 3.51.2 → 3.51.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/banner/sc-banner.component.d.ts +10 -13
- package/configurators/sandwich/sc-sandwich.component.d.ts +10 -6
- package/esm2022/banner/sc-banner.component.mjs +23 -29
- package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +30 -24
- package/esm2022/order/draft/sc-draft.component.mjs +3 -3
- package/fesm2022/snabcentr-client-ui.mjs +48 -48
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventEmitter, QueryList, TemplateRef } from '@angular/core';
|
|
1
|
+
import { EventEmitter, InputSignal, QueryList, TemplateRef } from '@angular/core';
|
|
2
2
|
import { ScBanner } from '@snabcentr/client-core';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
@@ -16,7 +16,7 @@ export declare class ScBannerComponent {
|
|
|
16
16
|
/**
|
|
17
17
|
* Местоположение баннера.
|
|
18
18
|
*/
|
|
19
|
-
bannerLocation
|
|
19
|
+
bannerLocation: InputSignal<string | undefined>;
|
|
20
20
|
/**
|
|
21
21
|
* Признак, что компонент должен растягиваться.
|
|
22
22
|
*/
|
|
@@ -52,7 +52,14 @@ export declare class ScBannerComponent {
|
|
|
52
52
|
/**
|
|
53
53
|
* Список баннеров.
|
|
54
54
|
*/
|
|
55
|
+
protected readonly banners$: import("rxjs").Observable<ScBanner[]>;
|
|
55
56
|
protected readonly banners: import("@angular/core").Signal<ScBanner[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Общее количество слайдов (баннеры + контент-проекция).
|
|
59
|
+
* Используется для отключения автоскролла при 0–1 слайдах, чтобы не вызывать
|
|
60
|
+
* tuiClamp с max < min в TuiCarouselComponent.onAutoscroll → updateIndex.
|
|
61
|
+
*/
|
|
62
|
+
readonly totalItems: import("@angular/core").Signal<number>;
|
|
56
63
|
/**
|
|
57
64
|
* trackBy для *ngFor баннеров: сохраняет узлы при обновлении списка,
|
|
58
65
|
* чтобы карусель не видела 0 слайдов между тиками и не вызывала tuiClamp(…, -1).
|
|
@@ -61,16 +68,6 @@ export declare class ScBannerComponent {
|
|
|
61
68
|
* @param banner Данные о баннере.
|
|
62
69
|
*/
|
|
63
70
|
trackByBannerId(_index: number, banner: ScBanner): number;
|
|
64
|
-
/**
|
|
65
|
-
* Общее количество слайдов (баннеры + контент-проекция).
|
|
66
|
-
* Используется для отключения автоскролла при 0–1 слайдах, чтобы не вызывать
|
|
67
|
-
* tuiClamp с max < min в TuiCarouselComponent.onAutoscroll → updateIndex.
|
|
68
|
-
*/
|
|
69
|
-
get totalItems(): number;
|
|
70
|
-
/**
|
|
71
|
-
* Свойство, от которого зависит наличие класса `!hidden` у `:host` компонента.
|
|
72
|
-
*/
|
|
73
|
-
private get isHidden();
|
|
74
71
|
/**
|
|
75
72
|
* Обработчик нажатия на баннер.
|
|
76
73
|
*
|
|
@@ -78,5 +75,5 @@ export declare class ScBannerComponent {
|
|
|
78
75
|
*/
|
|
79
76
|
onClick(banner: ScBanner): void;
|
|
80
77
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScBannerComponent, never>;
|
|
81
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ScBannerComponent, "sc-banner", never, { "navigateButton": { "alias": "navigateButton"; "required": false; }; "duration": { "alias": "duration"; "required": false; }; "bannerLocation": { "alias": "bannerLocation"; "required": false; }; "resizable": { "alias": "resizable"; "required": false; }; }, { "loadBannersEvent": "loadBannersEvent"; "clickBannerEvent": "clickBannerEvent"; }, ["bannersListRef"], never, false, never>;
|
|
78
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ScBannerComponent, "sc-banner", never, { "navigateButton": { "alias": "navigateButton"; "required": false; }; "duration": { "alias": "duration"; "required": false; }; "bannerLocation": { "alias": "bannerLocation"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; }; }, { "loadBannersEvent": "loadBannersEvent"; "clickBannerEvent": "clickBannerEvent"; }, ["bannersListRef"], never, false, never>;
|
|
82
79
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { FormArray, FormControl, FormGroup, ValidatorFn } from '@angular/forms';
|
|
3
|
-
import { ScIConfiguratorCalculateResult, ScOrderItem, ScProduct } from '@snabcentr/client-core';
|
|
3
|
+
import { ScCart, ScIConfiguratorCalculateResult, ScIOrderEditorLoader, ScOrderDraft, ScOrderItem, ScProduct } from '@snabcentr/client-core';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
5
|
import { ScISandwichSettings } from '../models/sandwich/sc-i-sandwich-settings';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
@@ -27,7 +27,11 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
27
27
|
/**
|
|
28
28
|
* Позиция товара/услуги в корзине.
|
|
29
29
|
*/
|
|
30
|
-
readonly
|
|
30
|
+
readonly orderItem: import("@angular/core").InputSignal<ScOrderItem | undefined>;
|
|
31
|
+
/**
|
|
32
|
+
* Идентификатор заказа.
|
|
33
|
+
*/
|
|
34
|
+
orderId?: number;
|
|
31
35
|
/**
|
|
32
36
|
* Событие переключения отображения товаров.
|
|
33
37
|
*/
|
|
@@ -39,7 +43,7 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
39
43
|
productCategoryId: FormControl<number | null>;
|
|
40
44
|
configurator: FormControl<string | null>;
|
|
41
45
|
quantity: FormControl<number | null>;
|
|
42
|
-
marker: FormControl<string>;
|
|
46
|
+
marker: FormControl<string | null>;
|
|
43
47
|
items: FormArray<FormGroup<{
|
|
44
48
|
width: FormControl<number>;
|
|
45
49
|
length: FormControl<number>;
|
|
@@ -48,9 +52,9 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
48
52
|
calculationId: FormControl<string | null>;
|
|
49
53
|
}>;
|
|
50
54
|
/**
|
|
51
|
-
* Сервис
|
|
55
|
+
* Сервис получения и редактирования списка товаров заказа (корзина / заказ / черновик = заказ).
|
|
52
56
|
*/
|
|
53
|
-
|
|
57
|
+
protected readonly orderService: ScIOrderEditorLoader<ScOrderItem, ScCart | ScOrderDraft>;
|
|
54
58
|
/**
|
|
55
59
|
* Сервис конвертации данных.
|
|
56
60
|
*/
|
|
@@ -142,5 +146,5 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
142
146
|
*/
|
|
143
147
|
private setDefaultFormValue;
|
|
144
148
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScSandwichComponent, never>;
|
|
145
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ScSandwichComponent, "sc-sandwich", never, { "settings": { "alias": "settings"; "required": false; "isSignal": true; }; "categoryId": { "alias": "categoryId"; "required": true; "isSignal": true; }; "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "
|
|
149
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ScSandwichComponent, "sc-sandwich", never, { "settings": { "alias": "settings"; "required": false; "isSignal": true; }; "categoryId": { "alias": "categoryId"; "required": true; "isSignal": true; }; "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "orderItem": { "alias": "orderItem"; "required": true; "isSignal": true; }; "orderId": { "alias": "orderId"; "required": false; }; }, { "toggleShowEvent": "toggleShowEvent"; }, never, never, true, never>;
|
|
146
150
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, inject, Input, Output } from '@angular/core';
|
|
2
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, ContentChildren, EventEmitter, HostBinding, inject, Input, input, Output, } from '@angular/core';
|
|
2
|
+
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { IntersectionObserverService } from '@ng-web-apis/intersection-observer';
|
|
4
4
|
import { ScBannerService, ScUserMetrikaGoalsEnum, ScUserMetrikaService } from '@snabcentr/client-core';
|
|
5
|
-
import { map, shareReplay, tap } from 'rxjs';
|
|
5
|
+
import { map, shareReplay, switchMap, tap } from 'rxjs';
|
|
6
6
|
import { SC_BANNER_DURATION } from '../providers';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "@angular/common";
|
|
@@ -23,6 +23,10 @@ export class ScBannerComponent {
|
|
|
23
23
|
* Интервал автоматической смены слайдов в миллисекундах (используйте 0, чтобы отключить автоматическую смену слайда).
|
|
24
24
|
*/
|
|
25
25
|
this.duration = inject(SC_BANNER_DURATION);
|
|
26
|
+
/**
|
|
27
|
+
* Местоположение баннера.
|
|
28
|
+
*/
|
|
29
|
+
this.bannerLocation = input();
|
|
26
30
|
/**
|
|
27
31
|
* Признак, что компонент должен растягиваться.
|
|
28
32
|
*/
|
|
@@ -54,14 +58,21 @@ export class ScBannerComponent {
|
|
|
54
58
|
/**
|
|
55
59
|
* Список баннеров.
|
|
56
60
|
*/
|
|
57
|
-
this.banners =
|
|
61
|
+
this.banners$ = toObservable(this.bannerLocation).pipe(switchMap((bannerLocation) => this.bannerService.banners$.pipe(map((banners) => banners.filter((banner) => banner.location === bannerLocation)), tap((banners) => {
|
|
58
62
|
if (banners.length > 0 && !this.resizable) {
|
|
59
63
|
this.aspectRatio = `${banners[0].width} / ${banners[0].height}`;
|
|
60
64
|
}
|
|
61
65
|
this.loadBannersEvent.emit(banners.length);
|
|
62
|
-
}),
|
|
66
|
+
}))),
|
|
63
67
|
// eslint-disable-next-line rxjs/no-sharereplay
|
|
64
|
-
shareReplay(1))
|
|
68
|
+
shareReplay(1));
|
|
69
|
+
this.banners = toSignal(this.banners$, { initialValue: [] });
|
|
70
|
+
/**
|
|
71
|
+
* Общее количество слайдов (баннеры + контент-проекция).
|
|
72
|
+
* Используется для отключения автоскролла при 0–1 слайдах, чтобы не вызывать
|
|
73
|
+
* tuiClamp с max < min в TuiCarouselComponent.onAutoscroll → updateIndex.
|
|
74
|
+
*/
|
|
75
|
+
this.totalItems = computed(() => this.banners().length + this.bannersListRef.length);
|
|
65
76
|
}
|
|
66
77
|
/**
|
|
67
78
|
* trackBy для *ngFor баннеров: сохраняет узлы при обновлении списка,
|
|
@@ -75,21 +86,6 @@ export class ScBannerComponent {
|
|
|
75
86
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
76
87
|
return banner.id ?? _index;
|
|
77
88
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Общее количество слайдов (баннеры + контент-проекция).
|
|
80
|
-
* Используется для отключения автоскролла при 0–1 слайдах, чтобы не вызывать
|
|
81
|
-
* tuiClamp с max < min в TuiCarouselComponent.onAutoscroll → updateIndex.
|
|
82
|
-
*/
|
|
83
|
-
get totalItems() {
|
|
84
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
85
|
-
return (this.banners()?.length ?? 0) + (this.bannersListRef?.length ?? 0);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Свойство, от которого зависит наличие класса `!hidden` у `:host` компонента.
|
|
89
|
-
*/
|
|
90
|
-
get isHidden() {
|
|
91
|
-
return this.totalItems === 0;
|
|
92
|
-
}
|
|
93
89
|
/**
|
|
94
90
|
* Обработчик нажатия на баннер.
|
|
95
91
|
*
|
|
@@ -107,17 +103,18 @@ export class ScBannerComponent {
|
|
|
107
103
|
}
|
|
108
104
|
}
|
|
109
105
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
110
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScBannerComponent, selector: "sc-banner", inputs: { navigateButton: "navigateButton", duration: "duration", bannerLocation: "bannerLocation", resizable: "resizable" }, outputs: { loadBannersEvent: "loadBannersEvent", clickBannerEvent: "clickBannerEvent" }, host: { attributes: { "ngSkipHydration": "true" }, properties: { "
|
|
106
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScBannerComponent, selector: "sc-banner", inputs: { navigateButton: { classPropertyName: "navigateButton", publicName: "navigateButton", isSignal: false, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: false, isRequired: false, transformFunction: null }, bannerLocation: { classPropertyName: "bannerLocation", publicName: "bannerLocation", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { loadBannersEvent: "loadBannersEvent", clickBannerEvent: "clickBannerEvent" }, host: { attributes: { "ngSkipHydration": "true" }, properties: { "class.!hidden": "totalItems() === 0", "style.aspect-ratio": "this.aspectRatio" } }, providers: [IntersectionObserverService], queries: [{ propertyName: "bannersListRef", predicate: ["banner"] }], ngImport: i0, template: "@let effectiveDuration = totalItems() > 1 ? duration : 0;\n\n<tui-carousel\n [duration]=\"effectiveDuration\"\n #carousel\n [attr.resizable]=\"resizable\"\n class=\"size-full overflow-hidden rounded-xl bg-white\"\n [(index)]=\"currentBannerId\"\n>\n @for (banner of banners(); track trackByBannerId($index, banner)) {\n @switch (banner.mediaType) {\n @case ('image') {\n <a\n *tuiItem\n (click)=\"onClick(banner)\"\n target=\"_blank\"\n [title]=\"banner.title\"\n [style.aspect-ratio]=\"aspectRatio\"\n [attr.href]=\"banner.url ? banner.url : null\"\n class=\"size-full\"\n >\n <picture>\n @if (banner.mediaFileWebp) {\n <source\n type=\"image/webp\"\n [srcset]=\"banner.mediaFileWebp | scMediaImageTransformer\"\n />\n }\n <img\n [src]=\"banner.mediaFile | scMediaImageTransformer: true\"\n [alt]=\"banner.title\"\n class=\"size-full object-cover\"\n />\n </picture>\n </a>\n }\n }\n }\n @for (item of bannersListRef; track $index) {\n <div\n *tuiItem\n [style.aspect-ratio]=\"aspectRatio\"\n class=\"size-full overflow-hidden\"\n >\n <ng-container [ngTemplateOutlet]=\"item\"></ng-container>\n </div>\n }\n</tui-carousel>\n\n@if (navigateButton && duration && banners() && totalItems() > 1) {\n <div\n tuiTheme=\"light\"\n class=\"flex items-center\"\n >\n <button\n tuiIconButton\n iconStart=\"@tui.chevron-left\"\n size=\"m\"\n [style.border-radius.%]=\"100\"\n appearance=\"flat\"\n (click)=\"carousel.prev()\"\n class=\"!absolute left-2\"\n ></button>\n <button\n tuiIconButton\n iconStart=\"@tui.chevron-right\"\n size=\"m\"\n [style.border-radius.%]=\"100\"\n appearance=\"flat\"\n (click)=\"carousel.next()\"\n class=\"!absolute right-2\"\n ></button>\n </div>\n}\n", styles: [":host{--tui-carousel-padding: 0;display:flex;position:relative}::ng-deep tui-carousel[resizable=true] .t-scroller,::ng-deep tui-carousel[resizable=true] .t-items{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i3.TuiItem, selector: "[tuiItem]" }, { kind: "component", type: i4.TuiCarouselComponent, selector: "tui-carousel", inputs: ["draggable", "itemsCount", "index"], outputs: ["indexChange", "shift"] }, { kind: "pipe", type: i5.ScMediaImageTransformerPipe, name: "scMediaImageTransformer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
111
107
|
}
|
|
112
108
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScBannerComponent, decorators: [{
|
|
113
109
|
type: Component,
|
|
114
|
-
args: [{ selector: 'sc-banner', providers: [IntersectionObserverService], host: {
|
|
110
|
+
args: [{ selector: 'sc-banner', providers: [IntersectionObserverService], host: {
|
|
111
|
+
ngSkipHydration: 'true',
|
|
112
|
+
'[class.!hidden]': 'totalItems() === 0',
|
|
113
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let effectiveDuration = totalItems() > 1 ? duration : 0;\n\n<tui-carousel\n [duration]=\"effectiveDuration\"\n #carousel\n [attr.resizable]=\"resizable\"\n class=\"size-full overflow-hidden rounded-xl bg-white\"\n [(index)]=\"currentBannerId\"\n>\n @for (banner of banners(); track trackByBannerId($index, banner)) {\n @switch (banner.mediaType) {\n @case ('image') {\n <a\n *tuiItem\n (click)=\"onClick(banner)\"\n target=\"_blank\"\n [title]=\"banner.title\"\n [style.aspect-ratio]=\"aspectRatio\"\n [attr.href]=\"banner.url ? banner.url : null\"\n class=\"size-full\"\n >\n <picture>\n @if (banner.mediaFileWebp) {\n <source\n type=\"image/webp\"\n [srcset]=\"banner.mediaFileWebp | scMediaImageTransformer\"\n />\n }\n <img\n [src]=\"banner.mediaFile | scMediaImageTransformer: true\"\n [alt]=\"banner.title\"\n class=\"size-full object-cover\"\n />\n </picture>\n </a>\n }\n }\n }\n @for (item of bannersListRef; track $index) {\n <div\n *tuiItem\n [style.aspect-ratio]=\"aspectRatio\"\n class=\"size-full overflow-hidden\"\n >\n <ng-container [ngTemplateOutlet]=\"item\"></ng-container>\n </div>\n }\n</tui-carousel>\n\n@if (navigateButton && duration && banners() && totalItems() > 1) {\n <div\n tuiTheme=\"light\"\n class=\"flex items-center\"\n >\n <button\n tuiIconButton\n iconStart=\"@tui.chevron-left\"\n size=\"m\"\n [style.border-radius.%]=\"100\"\n appearance=\"flat\"\n (click)=\"carousel.prev()\"\n class=\"!absolute left-2\"\n ></button>\n <button\n tuiIconButton\n iconStart=\"@tui.chevron-right\"\n size=\"m\"\n [style.border-radius.%]=\"100\"\n appearance=\"flat\"\n (click)=\"carousel.next()\"\n class=\"!absolute right-2\"\n ></button>\n </div>\n}\n", styles: [":host{--tui-carousel-padding: 0;display:flex;position:relative}::ng-deep tui-carousel[resizable=true] .t-scroller,::ng-deep tui-carousel[resizable=true] .t-items{width:100%;height:100%}\n"] }]
|
|
115
114
|
}], propDecorators: { navigateButton: [{
|
|
116
115
|
type: Input
|
|
117
116
|
}], duration: [{
|
|
118
117
|
type: Input
|
|
119
|
-
}], bannerLocation: [{
|
|
120
|
-
type: Input
|
|
121
118
|
}], resizable: [{
|
|
122
119
|
type: Input
|
|
123
120
|
}], loadBannersEvent: [{
|
|
@@ -130,8 +127,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
130
127
|
}], aspectRatio: [{
|
|
131
128
|
type: HostBinding,
|
|
132
129
|
args: ['style.aspect-ratio']
|
|
133
|
-
}], isHidden: [{
|
|
134
|
-
type: HostBinding,
|
|
135
|
-
args: ['class.!hidden']
|
|
136
130
|
}] } });
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYmFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9iYW5uZXIvc2MtYmFubmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9iYW5uZXIvc2MtYmFubmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQzlKLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRixPQUFPLEVBQVksZUFBZSxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakgsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7OztBQUVsRDs7R0FFRztBQVNILE1BQU0sT0FBTyxpQkFBaUI7SUFSOUI7UUFTSTs7V0FFRztRQUVJLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBRXRDOztXQUVHO1FBRUksYUFBUSxHQUFXLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBUXJEOztXQUVHO1FBRUksY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVsQzs7V0FFRztRQUVJLHFCQUFnQixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTNFOztXQUVHO1FBRUkscUJBQWdCLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFTL0U7O1dBRUc7UUFFSSxnQkFBVyxHQUFXLEVB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QVc7dUJBQUMsb0JBQW9CO2dCQWdFckIsUUFBUTtzQkFEbkIsV0FBVzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnQG5nLXdlYi1hcGlzL2ludGVyc2VjdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQgeyBTY0Jhbm5lciwgU2NCYW5uZXJTZXJ2aWNlLCBTY1VzZXJNZXRyaWthR29hbHNFbnVtLCBTY1VzZXJNZXRyaWthU2VydmljZSB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNDX0JBTk5FUl9EVVJBVElPTiB9IGZyb20gJy4uL3Byb3ZpZGVycyc7XG5cbi8qKlxuICog0JHQsNC90L3QtdGAINGBINC/0YDQvtC60YDRg9GC0LrQvtC5INC/0LXRgNC10LTQsNC90L3Ri9GFIHtAbGluayBUZW1wbGF0ZVJlZn0g0Y3Qu9C10LzQtdC90YLQvtCyLCDQuCDQsdCw0L3QvdC10YDQvtCyINC70L7QutCw0YbQuNC4LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLWJhbm5lcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWJhbm5lci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2MtYmFubmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbSW50ZXJzZWN0aW9uT2JzZXJ2ZXJTZXJ2aWNlXSxcbiAgICBob3N0OiB7IG5nU2tpcEh5ZHJhdGlvbjogJ3RydWUnIH0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjQmFubmVyQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INC90LXQvtCx0YXQvtC00LjQvNC+INC/0L7QutCw0LfRi9Cy0LDRgtGMINC60L3QvtC/0LrQuCDQvdCw0LLQuNCz0LDRhtC40LguXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbmF2aWdhdGVCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdGC0LXRgNCy0LDQuyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtC5INGB0LzQtdC90Ysg0YHQu9Cw0LnQtNC+0LIg0LIg0LzQuNC70LvQuNGB0LXQutGD0L3QtNCw0YUgKNC40YHQv9C+0LvRjNC30YPQudGC0LUgMCwg0YfRgtC+0LHRiyDQvtGC0LrQu9GO0YfQuNGC0Ywg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60YPRjiDRgdC80LXQvdGDINGB0LvQsNC50LTQsCkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZHVyYXRpb246IG51bWJlciA9IGluamVjdChTQ19CQU5ORVJfRFVSQVRJT04pO1xuXG4gICAgLyoqXG4gICAgICog0JzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjQtSDQsdCw0L3QvdC10YDQsC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBiYW5uZXJMb2NhdGlvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LrQvtC80L/QvtC90LXQvdGCINC00L7Qu9C20LXQvSDRgNCw0YHRgtGP0LPQuNCy0LDRgtGM0YHRjy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZXNpemFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC30LDQs9GA0YPQt9C60Lgg0LHQsNC90L3QtdGA0L7QsiDRgSDQutC+0LvQuNGH0LXRgdGC0LLQvtC8INC/0L7Qu9GD0YfQtdC90L3Ri9GFINCx0LDQvdC90LXRgNC+0LIuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGxvYWRCYW5uZXJzRXZlbnQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINC40LfQvtCx0YDQsNC20LXQvdC40LUg0LHQsNC90L3QtdGA0LAuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNsaWNrQmFubmVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxTY0Jhbm5lcj4gPSBuZXcgRXZlbnRFbWl0dGVyPFNjQmFubmVyPigpO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQvdCwINGN0LvQtdC80LXQvdGCINC/0YDQtdC00YHRgtCw0LLQu9C10L3QuNC5INGI0LDQsdC70L7QvdC+0LIuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbignYmFubmVyJylcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHB1YmxpYyBiYW5uZXJzTGlzdFJlZjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgLyoqXG4gICAgICog0KHQstC+0LnRgdGC0LLQviwg0L7RgiDQutC+0YLQvtGA0L7Qs9C+INC30LDQstC40YHQuNGCINGB0L7QvtGC0L3QvtGI0LXQvdC40LUgYDpob3N0YCDQutC+0LzQv9C+0L3QtdC90YLQsC5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmFzcGVjdC1yYXRpbycpXG4gICAgcHVibGljIGFzcGVjdFJhdGlvOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGC0LXQutGD0YnQtdCz0L4g0LHQsNC90L3QtdGA0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGN1cnJlbnRCYW5uZXJJZDogbnVtYmVyID0gMDtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC00LDQvdC90YvQvNC4INC+INCx0LDQvdC90LXRgNCw0YUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBiYW5uZXJTZXJ2aWNlID0gaW5qZWN0KFNjQmFubmVyU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGB0LHQvtGA0LAg0LzQtdGC0YDQuNC6INC+INC00LXQudGB0YLQstC40Y/RhSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJNZXRyaWthU2VydmljZSA9IGluamVjdChTY1VzZXJNZXRyaWthU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0LHQsNC90L3QtdGA0L7Qsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmFubmVycyA9IHRvU2lnbmFsKFxuICAgICAgICB0aGlzLmJhbm5lclNlcnZpY2UuYmFubmVycyQucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFubmVycykgPT4gYmFubmVycy5maWx0ZXIoKGJhbm5lcikgPT4gYmFubmVyLmxvY2F0aW9uID09PSB0aGlzLmJhbm5lckxvY2F0aW9uKS5yZXZlcnNlKCkpLFxuICAgICAgICAgICAgdGFwKChiYW5uZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGJhbm5lcnMubGVuZ3RoID4gMCAmJiAhdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3BlY3RSYXRpbyA9IGAke2Jhbm5lcnNbMF0ud2lkdGh9IC8gJHtiYW5uZXJzWzBdLmhlaWdodH1gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZEJhbm5lcnNFdmVudC5lbWl0KGJhbm5lcnMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMvbm8tc2hhcmVyZXBsYXlcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICksXG4gICAgICAgIHsgaW5pdGlhbFZhbHVlOiBbXSBhcyBTY0Jhbm5lcltdIH1cbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogdHJhY2tCeSDQtNC70Y8gKm5nRm9yINCx0LDQvdC90LXRgNC+0LI6INGB0L7RhdGA0LDQvdGP0LXRgiDRg9C30LvRiyDQv9GA0Lgg0L7QsdC90L7QstC70LXQvdC40Lgg0YHQv9C40YHQutCwLFxuICAgICAqINGH0YLQvtCx0Ysg0LrQsNGA0YPRgdC10LvRjCDQvdC1INCy0LjQtNC10LvQsCAwINGB0LvQsNC50LTQvtCyINC80LXQttC00YMg0YLQuNC60LDQvNC4INC4INC90LUg0LLRi9C30YvQstCw0LvQsCB0dWlDbGFtcCjigKYsIC0xKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfaW5kZXgg0JjQvdC00LXQutGBLlxuICAgICAqIEBwYXJhbSBiYW5uZXIg0JTQsNC90L3Ri9C1INC+INCx0LDQvdC90LXRgNC1LlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgcHVibGljIHRyYWNrQnlCYW5uZXJJZChfaW5kZXg6IG51bWJlciwgYmFubmVyOiBTY0Jhbm5lcik6IG51bWJlciB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICAgIHJldHVybiBiYW5uZXIuaWQgPz8gX2luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRidC10LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHQu9Cw0LnQtNC+0LIgKNCx0LDQvdC90LXRgNGLICsg0LrQvtC90YLQtdC90YIt0L/RgNC+0LXQutGG0LjRjykuXG4gICAgICog0JjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC00LvRjyDQvtGC0LrQu9GO0YfQtdC90LjRjyDQsNCy0YLQvtGB0LrRgNC+0LvQu9CwINC/0YDQuCAw4oCTMSDRgdC70LDQudC00LDRhSwg0YfRgtC+0LHRiyDQvdC1INCy0YvQt9GL0LLQsNGC0YxcbiAgICAgKiB0dWlDbGFtcCDRgSBtYXggPCBtaW4g0LIgVHVpQ2Fyb3VzZWxDb21wb25lbnQub25BdXRvc2Nyb2xsIOKGkiB1cGRhdGVJbmRleC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSXRlbXMoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgICAgcmV0dXJuICh0aGlzLmJhbm5lcnMoKT8ubGVuZ3RoID8/IDApICsgKHRoaXMuYmFubmVyc0xpc3RSZWY/Lmxlbmd0aCA/PyAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCy0L7QudGB0YLQstC+LCDQvtGCINC60L7RgtC+0YDQvtCz0L4g0LfQsNCy0LjRgdC40YIg0L3QsNC70LjRh9C40LUg0LrQu9Cw0YHRgdCwIGAhaGlkZGVuYCDRgyBgOmhvc3RgINC60L7QvNC/0L7QvdC10L3RgtCwLlxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuIWhpZGRlbicpXG4gICAgcHJpdmF0ZSBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvdGFsSXRlbXMgPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdC+0YLRh9C40Log0L3QsNC20LDRgtC40Y8g0L3QsCDQsdCw0L3QvdC10YAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmFubmVyINCR0LDQvdC90LXRgCwg0L/QviDRgdGB0YvQu9C60LUg0LrQvtGC0L7RgNC+0LPQviDRgdC+0LLQtdGA0YjRkdC9INC/0LXRgNC10YXQvtC0LlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNsaWNrKGJhbm5lcjogU2NCYW5uZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VyTWV0cmlrYVNlcnZpY2UuZW1pdFVzZXJNZXRyaWthRXZlbnQoe1xuICAgICAgICAgICAgdGFyZ2V0OiBTY1VzZXJNZXRyaWthR29hbHNFbnVtLmJhbm5lckNsaWNrLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgYmFubmVyX2lkOiBiYW5uZXIuaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYmFubmVyLnVybCkge1xuICAgICAgICAgICAgdGhpcy5jbGlja0Jhbm5lckV2ZW50LmVtaXQoYmFubmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBsZXQgZWZmZWN0aXZlRHVyYXRpb24gPSB0b3RhbEl0ZW1zID4gMSA/IGR1cmF0aW9uIDogMDtcbjx0dWktY2Fyb3VzZWxcbiAgICBbZHVyYXRpb25dPVwiZWZmZWN0aXZlRHVyYXRpb25cIlxuICAgICNjYXJvdXNlbFxuICAgIFthdHRyLnJlc2l6YWJsZV09XCJyZXNpemFibGVcIlxuICAgIGNsYXNzPVwic2l6ZS1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsIGJnLXdoaXRlXCJcbiAgICBbKGluZGV4KV09XCJjdXJyZW50QmFubmVySWRcIlxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJhbm5lciBvZiBiYW5uZXJzKCk7IGxldCBpbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5QmFubmVySWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYmFubmVyLm1lZGlhVHlwZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlJ1wiPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICp0dWlJdGVtXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrKGJhbm5lcilcIlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiYmFubmVyLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmFzcGVjdC1yYXRpb109XCJhc3BlY3RSYXRpb1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiYmFubmVyLnVybCA/IGJhbm5lci51cmwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaXplLWZ1bGxcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBpY3R1cmU+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGJhbm5lci5tZWRpYUZpbGVXZWJwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiaW1hZ2Uvd2VicFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNzZXRdPVwiYmFubmVyLm1lZGlhRmlsZVdlYnAgfCBzY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImJhbm5lci5tZWRpYUZpbGUgfCBzY01lZGlhSW1hZ2VUcmFuc2Zvcm1lcjogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJiYW5uZXIudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2l6ZS1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3BpY3R1cmU+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYmFubmVyc0xpc3RSZWZcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKnR1aUl0ZW1cbiAgICAgICAgICAgIFtzdHlsZS5hc3BlY3QtcmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxuICAgICAgICAgICAgY2xhc3M9XCJzaXplLWZ1bGwgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC90dWktY2Fyb3VzZWw+XG5cbjxkaXZcbiAgICAqbmdJZj1cIm5hdmlnYXRlQnV0dG9uICYmIGR1cmF0aW9uICYmIGJhbm5lcnMoKSAmJiB0b3RhbEl0ZW1zID4gMVwiXG4gICAgdHVpVGhlbWU9XCJsaWdodFwiXG4gICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiXG4+XG4gICAgPGJ1dHRvblxuICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgIGljb25TdGFydD1cIkB0dWkuY2hldnJvbi1sZWZ0XCJcbiAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1cy4lXT1cIjEwMFwiXG4gICAgICAgIGFwcGVhcmFuY2U9XCJmbGF0XCJcbiAgICAgICAgKGNsaWNrKT1cImNhcm91c2VsLnByZXYoKVwiXG4gICAgICAgIGNsYXNzPVwiIWFic29sdXRlIGxlZnQtMlwiXG4gICAgPjwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLmNoZXZyb24tcmlnaHRcIlxuICAgICAgICBzaXplPVwibVwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzLiVdPVwiMTAwXCJcbiAgICAgICAgYXBwZWFyYW5jZT1cImZsYXRcIlxuICAgICAgICAoY2xpY2spPVwiY2Fyb3VzZWwubmV4dCgpXCJcbiAgICAgICAgY2xhc3M9XCIhYWJzb2x1dGUgcmlnaHQtMlwiXG4gICAgPjwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYmFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9iYW5uZXIvc2MtYmFubmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9iYW5uZXIvc2MtYmFubmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEdBR1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRixPQUFPLEVBQVksZUFBZSxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakgsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7QUFFbEQ7O0dBRUc7QUFZSCxNQUFNLE9BQU8saUJBQWlCO0lBWDlCO1FBWUk7O1dBRUc7UUFFSSxtQkFBYyxHQUFZLElBQUksQ0FBQztRQUV0Qzs7V0FFRztRQUVJLGFBQVEsR0FBVyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNJLG1CQUFjLEdBQW9DLEtBQUssRUFBVSxDQUFDO1FBRXpFOztXQUVHO1FBRUksY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVsQzs7V0FFRztRQUVJLHFCQUFnQixHQUF5QixJQUFJLFlBQVksRUFBVSxD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QUFnQjtzQkFEdEIsTUFBTTtnQkFRQSxjQUFjO3NCQUZwQixlQUFlO3VCQUFDLFFBQVE7Z0JBUWxCLFdBQVc7c0JBRGpCLFdBQVc7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgaW5wdXQsXG4gICAgSW5wdXRTaWduYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnQG5nLXdlYi1hcGlzL2ludGVyc2VjdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQgeyBTY0Jhbm5lciwgU2NCYW5uZXJTZXJ2aWNlLCBTY1VzZXJNZXRyaWthR29hbHNFbnVtLCBTY1VzZXJNZXRyaWthU2VydmljZSB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU0NfQkFOTkVSX0RVUkFUSU9OIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiDQkdCw0L3QvdC10YAg0YEg0L/RgNC+0LrRgNGD0YLQutC+0Lkg0L/QtdGA0LXQtNCw0L3QvdGL0YUge0BsaW5rIFRlbXBsYXRlUmVmfSDRjdC70LXQvNC10L3RgtC+0LIsINC4INCx0LDQvdC90LXRgNC+0LIg0LvQvtC60LDRhtC40LguXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2MtYmFubmVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2MtYmFubmVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zYy1iYW5uZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtJbnRlcnNlY3Rpb25PYnNlcnZlclNlcnZpY2VdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgbmdTa2lwSHlkcmF0aW9uOiAndHJ1ZScsXG4gICAgICAgICdbY2xhc3MuIWhpZGRlbl0nOiAndG90YWxJdGVtcygpID09PSAwJyxcbiAgICB9LFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY0Jhbm5lckNvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQvdC10L7QsdGF0L7QtNC40LzQviDQv9C+0LrQsNC30YvQstCw0YLRjCDQutC90L7Qv9C60Lgg0L3QsNCy0LjQs9Cw0YbQuNC4LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG5hdmlnYXRlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqINCY0L3RgtC10YDQstCw0Lsg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60L7QuSDRgdC80LXQvdGLINGB0LvQsNC50LTQvtCyINCyINC80LjQu9C70LjRgdC10LrRg9C90LTQsNGFICjQuNGB0L/QvtC70YzQt9GD0LnRgtC1IDAsINGH0YLQvtCx0Ysg0L7RgtC60LvRjtGH0LjRgtGMINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutGD0Y4g0YHQvNC10L3RgyDRgdC70LDQudC00LApLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGR1cmF0aW9uOiBudW1iZXIgPSBpbmplY3QoU0NfQkFOTkVSX0RVUkFUSU9OKTtcblxuICAgIC8qKlxuICAgICAqINCc0LXRgdGC0L7Qv9C+0LvQvtC20LXQvdC40LUg0LHQsNC90L3QtdGA0LAuXG4gICAgICovXG4gICAgcHVibGljIGJhbm5lckxvY2F0aW9uOiBJbnB1dFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+ID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQutC+0LzQv9C+0L3QtdC90YIg0LTQvtC70LbQtdC9INGA0LDRgdGC0Y/Qs9C40LLQsNGC0YzRgdGPLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlc2l6YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICog0KHQvtCx0YvRgtC40LUg0LfQsNCz0YDRg9C30LrQuCDQsdCw0L3QvdC10YDQvtCyINGBINC60L7Qu9C40YfQtdGB0YLQstC+0Lwg0L/QvtC70YPRh9C10L3QvdGL0YUg0LHQsNC90L3QtdGA0L7Qsi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbG9hZEJhbm5lcnNFdmVudDogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0LjQt9C+0LHRgNCw0LbQtdC90LjQtSDQsdCw0L3QvdC10YDQsC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xpY2tCYW5uZXJFdmVudDogRXZlbnRFbWl0dGVyPFNjQmFubmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8U2NCYW5uZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0YHRgdGL0LvQvtC6INC90LAg0Y3Qu9C10LzQtdC90YIg0L/RgNC10LTRgdGC0LDQstC70LXQvdC40Lkg0YjQsNCx0LvQvtC90L7Qsi5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKCdiYW5uZXInKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIGJhbm5lcnNMaXN0UmVmOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG5cbiAgICAvKipcbiAgICAgKiDQodCy0L7QudGB0YLQstC+LCDQvtGCINC60L7RgtC+0YDQvtCz0L4g0LfQsNCy0LjRgdC40YIg0YHQvtC+0YLQvdC+0YjQtdC90LjQtSBgOmhvc3RgINC60L7QvNC/0L7QvdC10L3RgtCwLlxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuYXNwZWN0LXJhdGlvJylcbiAgICBwdWJsaWMgYXNwZWN0UmF0aW86IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICog0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQtdC60YPRidC10LPQviDQsdCw0L3QvdC10YDQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3VycmVudEJhbm5lcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LTQsNC90L3Ri9C80Lgg0L4g0LHQsNC90L3QtdGA0LDRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhbm5lclNlcnZpY2UgPSBpbmplY3QoU2NCYW5uZXJTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YHQsdC+0YDQsCDQvNC10YLRgNC40Log0L4g0LTQtdC50YHRgtCy0LjRj9GFINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlck1ldHJpa2FTZXJ2aWNlID0gaW5qZWN0KFNjVXNlck1ldHJpa2FTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0L/QuNGB0L7QuiDQsdCw0L3QvdC10YDQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBiYW5uZXJzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmJhbm5lckxvY2F0aW9uKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGJhbm5lckxvY2F0aW9uKSA9PlxuICAgICAgICAgICAgdGhpcy5iYW5uZXJTZXJ2aWNlLmJhbm5lcnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChiYW5uZXJzKSA9PiBiYW5uZXJzLmZpbHRlcigoYmFubmVyKSA9PiBiYW5uZXIubG9jYXRpb24gPT09IGJhbm5lckxvY2F0aW9uKSksXG4gICAgICAgICAgICAgICAgdGFwKChiYW5uZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiYW5uZXJzLmxlbmd0aCA+IDAgJiYgIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzcGVjdFJhdGlvID0gYCR7YmFubmVyc1swXS53aWR0aH0gLyAke2Jhbm5lcnNbMF0uaGVpZ2h0fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRCYW5uZXJzRXZlbnQuZW1pdChiYW5uZXJzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMvbm8tc2hhcmVyZXBsYXlcbiAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhbm5lcnMgPSB0b1NpZ25hbCh0aGlzLmJhbm5lcnMkLCB7IGluaXRpYWxWYWx1ZTogW10gYXMgU2NCYW5uZXJbXSB9KTtcblxuICAgIC8qKlxuICAgICAqINCe0LHRidC10LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHQu9Cw0LnQtNC+0LIgKNCx0LDQvdC90LXRgNGLICsg0LrQvtC90YLQtdC90YIt0L/RgNC+0LXQutGG0LjRjykuXG4gICAgICog0JjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC00LvRjyDQvtGC0LrQu9GO0YfQtdC90LjRjyDQsNCy0YLQvtGB0LrRgNC+0LvQu9CwINC/0YDQuCAw4oCTMSDRgdC70LDQudC00LDRhSwg0YfRgtC+0LHRiyDQvdC1INCy0YvQt9GL0LLQsNGC0YxcbiAgICAgKiB0dWlDbGFtcCDRgSBtYXggPCBtaW4g0LIgVHVpQ2Fyb3VzZWxDb21wb25lbnQub25BdXRvc2Nyb2xsIOKGkiB1cGRhdGVJbmRleC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgdG90YWxJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYmFubmVycygpLmxlbmd0aCArIHRoaXMuYmFubmVyc0xpc3RSZWYubGVuZ3RoKTtcblxuICAgIC8qKlxuICAgICAqIHRyYWNrQnkg0LTQu9GPICpuZ0ZvciDQsdCw0L3QvdC10YDQvtCyOiDRgdC+0YXRgNCw0L3Rj9C10YIg0YPQt9C70Ysg0L/RgNC4INC+0LHQvdC+0LLQu9C10L3QuNC4INGB0L/QuNGB0LrQsCxcbiAgICAgKiDRh9GC0L7QsdGLINC60LDRgNGD0YHQtdC70Ywg0L3QtSDQstC40LTQtdC70LAgMCDRgdC70LDQudC00L7QsiDQvNC10LbQtNGDINGC0LjQutCw0LzQuCDQuCDQvdC1INCy0YvQt9GL0LLQsNC70LAgdHVpQ2xhbXAo4oCmLCAtMSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX2luZGV4INCY0L3QtNC10LrRgS5cbiAgICAgKiBAcGFyYW0gYmFubmVyINCU0LDQvdC90YvQtSDQviDQsdCw0L3QvdC10YDQtS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHB1YmxpYyB0cmFja0J5QmFubmVySWQoX2luZGV4OiBudW1iZXIsIGJhbm5lcjogU2NCYW5uZXIpOiBudW1iZXIge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICByZXR1cm4gYmFubmVyLmlkID8/IF9pbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDQvdCw0LbQsNGC0LjRjyDQvdCwINCx0LDQvdC90LXRgC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYW5uZXIg0JHQsNC90L3QtdGALCDQv9C+INGB0YHRi9C70LrQtSDQutC+0YLQvtGA0L7Qs9C+INGB0L7QstC10YDRiNGR0L0g0L/QtdGA0LXRhdC+0LQuXG4gICAgICovXG4gICAgcHVibGljIG9uQ2xpY2soYmFubmVyOiBTY0Jhbm5lcik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZXJNZXRyaWthU2VydmljZS5lbWl0VXNlck1ldHJpa2FFdmVudCh7XG4gICAgICAgICAgICB0YXJnZXQ6IFNjVXNlck1ldHJpa2FHb2Fsc0VudW0uYmFubmVyQ2xpY2ssXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBiYW5uZXJfaWQ6IGJhbm5lci5pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChiYW5uZXIudXJsKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWNrQmFubmVyRXZlbnQuZW1pdChiYW5uZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGxldCBlZmZlY3RpdmVEdXJhdGlvbiA9IHRvdGFsSXRlbXMoKSA+IDEgPyBkdXJhdGlvbiA6IDA7XG5cbjx0dWktY2Fyb3VzZWxcbiAgICBbZHVyYXRpb25dPVwiZWZmZWN0aXZlRHVyYXRpb25cIlxuICAgICNjYXJvdXNlbFxuICAgIFthdHRyLnJlc2l6YWJsZV09XCJyZXNpemFibGVcIlxuICAgIGNsYXNzPVwic2l6ZS1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsIGJnLXdoaXRlXCJcbiAgICBbKGluZGV4KV09XCJjdXJyZW50QmFubmVySWRcIlxuPlxuICAgIEBmb3IgKGJhbm5lciBvZiBiYW5uZXJzKCk7IHRyYWNrIHRyYWNrQnlCYW5uZXJJZCgkaW5kZXgsIGJhbm5lcikpIHtcbiAgICAgICAgQHN3aXRjaCAoYmFubmVyLm1lZGlhVHlwZSkge1xuICAgICAgICAgICAgQGNhc2UgKCdpbWFnZScpIHtcbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAqdHVpSXRlbVxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGljayhiYW5uZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImJhbm5lci50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5hc3BlY3QtcmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cImJhbm5lci51cmwgPyBiYW5uZXIudXJsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2l6ZS1mdWxsXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwaWN0dXJlPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChiYW5uZXIubWVkaWFGaWxlV2VicCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImltYWdlL3dlYnBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3Jjc2V0XT1cImJhbm5lci5tZWRpYUZpbGVXZWJwIHwgc2NNZWRpYUltYWdlVHJhbnNmb3JtZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJiYW5uZXIubWVkaWFGaWxlIHwgc2NNZWRpYUltYWdlVHJhbnNmb3JtZXI6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwiYmFubmVyLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNpemUtZnVsbCBvYmplY3QtY292ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9waWN0dXJlPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBAZm9yIChpdGVtIG9mIGJhbm5lcnNMaXN0UmVmOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKnR1aUl0ZW1cbiAgICAgICAgICAgIFtzdHlsZS5hc3BlY3QtcmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxuICAgICAgICAgICAgY2xhc3M9XCJzaXplLWZ1bGwgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbjwvdHVpLWNhcm91c2VsPlxuXG5AaWYgKG5hdmlnYXRlQnV0dG9uICYmIGR1cmF0aW9uICYmIGJhbm5lcnMoKSAmJiB0b3RhbEl0ZW1zKCkgPiAxKSB7XG4gICAgPGRpdlxuICAgICAgICB0dWlUaGVtZT1cImxpZ2h0XCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLmNoZXZyb24tbGVmdFwiXG4gICAgICAgICAgICBzaXplPVwibVwiXG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyLXJhZGl1cy4lXT1cIjEwMFwiXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwiZmxhdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2Fyb3VzZWwucHJldigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiIWFic29sdXRlIGxlZnQtMlwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5jaGV2cm9uLXJpZ2h0XCJcbiAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzLiVdPVwiMTAwXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJmbGF0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYXJvdXNlbC5uZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCIhYWJzb2x1dGUgcmlnaHQtMlwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbn1cbiJdfQ==
|