valtech-components 2.0.382 → 2.0.383

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,386 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, forwardRef, inject, Input, ViewChild, signal, computed } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
+ import { IonicModule } from '@ionic/angular';
5
+ import { LangService } from '../../../services/lang-provider/lang-provider.service';
6
+ import { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';
7
+ import { replaceSpecialChars } from '../../../shared/utils/text';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@ionic/angular";
11
+ import * as i3 from "@angular/forms";
12
+ export class MultiSelectSimpleComponent {
13
+ constructor() {
14
+ this.labelProperty = 'name';
15
+ this.valueProperty = 'id';
16
+ this.placeholder = '';
17
+ this.langService = inject(LangService);
18
+ // Signals for reactive state management
19
+ this.isOpen = signal(false);
20
+ this.searchTerm = signal('');
21
+ this.selectedValues = signal([]);
22
+ // Computed signals
23
+ this.displayValue = computed(() => {
24
+ const selected = this.selectedValues();
25
+ if (selected.length === 0) {
26
+ return '';
27
+ }
28
+ if (selected.length === 1) {
29
+ const option = this.getOptionByValue(selected[0]);
30
+ return option ? option[this.labelProperty] : '';
31
+ }
32
+ return `${selected.length} elementos seleccionados`;
33
+ });
34
+ this.filteredOptions = computed(() => {
35
+ const options = this.props?.options || [];
36
+ const search = this.searchTerm().toLowerCase();
37
+ if (!search) {
38
+ return options;
39
+ }
40
+ return options.filter(option => {
41
+ const label = option[this.labelProperty]
42
+ ? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
43
+ : '';
44
+ const value = option[this.valueProperty]
45
+ ? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
46
+ : '';
47
+ const searchTerm = replaceSpecialChars(search);
48
+ return label.includes(searchTerm) || value.includes(searchTerm);
49
+ });
50
+ });
51
+ this.searchPlaceholder = '';
52
+ // ControlValueAccessor
53
+ this.onChange = (value) => { };
54
+ this.onTouched = () => { };
55
+ this.placeholder = this.langService.getText('_global', 'selectOptions', 'Seleccione opciones');
56
+ this.searchPlaceholder = this.langService.getText('_global', 'search', 'Buscar');
57
+ // Close dropdown when clicking outside
58
+ document.addEventListener('click', this.handleClickOutside.bind(this));
59
+ }
60
+ ngOnInit() {
61
+ this.applyDefaultValue();
62
+ this.syncSelectedValues();
63
+ }
64
+ ngOnDestroy() {
65
+ document.removeEventListener('click', this.handleClickOutside.bind(this));
66
+ }
67
+ // ControlValueAccessor implementation
68
+ writeValue(value) {
69
+ const valueArray = this.parseValue(value);
70
+ this.selectedValues.set(valueArray);
71
+ }
72
+ registerOnChange(fn) {
73
+ this.onChange = fn;
74
+ }
75
+ registerOnTouched(fn) {
76
+ this.onTouched = fn;
77
+ }
78
+ setDisabledState(isDisabled) {
79
+ // Handle disabled state if needed
80
+ }
81
+ // Component methods
82
+ toggleDropdown(event) {
83
+ event.stopPropagation();
84
+ this.isOpen.update(value => !value);
85
+ if (this.isOpen()) {
86
+ this.onTouched();
87
+ // Focus search bar when opening
88
+ setTimeout(() => {
89
+ const searchbar = this.dropdownRef?.nativeElement?.querySelector('ion-searchbar');
90
+ if (searchbar) {
91
+ searchbar.setFocus();
92
+ }
93
+ }, 100);
94
+ }
95
+ }
96
+ onSearch(event) {
97
+ this.searchTerm.set(event.detail.value || '');
98
+ }
99
+ toggleOption(option) {
100
+ const value = option[this.valueProperty];
101
+ const currentSelected = this.selectedValues();
102
+ if (this.isSelected(option)) {
103
+ // Remove from selection
104
+ this.selectedValues.set(currentSelected.filter(v => v !== value));
105
+ }
106
+ else {
107
+ // Add to selection
108
+ this.selectedValues.set([...currentSelected, value]);
109
+ }
110
+ this.emitValue();
111
+ }
112
+ selectAll() {
113
+ const allValues = this.filteredOptions().map(option => option[this.valueProperty]);
114
+ const currentSelected = this.selectedValues();
115
+ // Add only new values to avoid duplicates
116
+ const newValues = allValues.filter(value => !currentSelected.includes(value));
117
+ this.selectedValues.set([...currentSelected, ...newValues]);
118
+ this.emitValue();
119
+ }
120
+ clearAll() {
121
+ this.selectedValues.set([]);
122
+ this.emitValue();
123
+ }
124
+ isSelected(option) {
125
+ return this.selectedValues().includes(option[this.valueProperty]);
126
+ }
127
+ trackByFn(index, option) {
128
+ return option[this.valueProperty];
129
+ }
130
+ handleClickOutside(event) {
131
+ if (this.isOpen() &&
132
+ !this.mainInputRef?.nativeElement?.contains(event.target) &&
133
+ !this.dropdownRef?.nativeElement?.contains(event.target)) {
134
+ this.isOpen.set(false);
135
+ this.searchTerm.set('');
136
+ }
137
+ }
138
+ parseValue(value) {
139
+ if (!value)
140
+ return [];
141
+ if (Array.isArray(value))
142
+ return value.map(v => String(v));
143
+ if (typeof value === 'string') {
144
+ return value.split(',').map(v => v.trim()).filter(v => v !== '');
145
+ }
146
+ return [String(value)];
147
+ }
148
+ emitValue() {
149
+ const value = this.selectedValues().join(',');
150
+ this.onChange(value);
151
+ if (this.props?.control) {
152
+ this.props.control.setValue(value);
153
+ this.props.control.markAsDirty();
154
+ this.props.control.markAsTouched();
155
+ }
156
+ }
157
+ getOptionByValue(value) {
158
+ return this.props?.options?.find(option => option[this.valueProperty] === value);
159
+ }
160
+ applyDefaultValue() {
161
+ if (this.props) {
162
+ applyDefaultValueToControl(this.props);
163
+ }
164
+ }
165
+ syncSelectedValues() {
166
+ if (this.props?.control?.value) {
167
+ const valueArray = this.parseValue(this.props.control.value);
168
+ this.selectedValues.set(valueArray);
169
+ }
170
+ }
171
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSimpleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
172
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiSelectSimpleComponent, isStandalone: true, selector: "val-multi-select-simple", inputs: { props: "props", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder" }, providers: [
173
+ {
174
+ provide: NG_VALUE_ACCESSOR,
175
+ useExisting: forwardRef(() => MultiSelectSimpleComponent),
176
+ multi: true
177
+ }
178
+ ], viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "mainInputRef", first: true, predicate: ["mainInput"], descendants: true }], ngImport: i0, template: `
179
+ <div class="multi-select-container" (click)="toggleDropdown($event)">
180
+ <!-- Main input display -->
181
+ <ion-input
182
+ #mainInput
183
+ type="text"
184
+ [value]="displayValue()"
185
+ [placeholder]="props?.placeholder || placeholder"
186
+ readonly
187
+ class="main-input"
188
+ [class.is-open]="isOpen()"
189
+ />
190
+
191
+ <!-- Dropdown icon -->
192
+ <ion-icon
193
+ name="chevron-down-outline"
194
+ class="dropdown-icon"
195
+ [class.rotated]="isOpen()"
196
+ ></ion-icon>
197
+
198
+ <!-- Hidden input for form control -->
199
+ <ion-input
200
+ style="position: absolute; opacity: 0; pointer-events: none;"
201
+ [formControl]="props?.control"
202
+ type="hidden"
203
+ />
204
+ </div>
205
+
206
+ <!-- Dropdown overlay -->
207
+ <div
208
+ class="dropdown-overlay"
209
+ [class.visible]="isOpen()"
210
+ #dropdown
211
+ >
212
+ <!-- Search bar -->
213
+ <div class="search-container">
214
+ <ion-searchbar
215
+ #searchbar
216
+ [placeholder]="searchPlaceholder"
217
+ (ionInput)="onSearch($event)"
218
+ [value]="searchTerm()"
219
+ show-clear-button="focus"
220
+ ></ion-searchbar>
221
+ </div>
222
+
223
+ <!-- Action buttons -->
224
+ <div class="actions-container">
225
+ <ion-button
226
+ fill="clear"
227
+ size="small"
228
+ (click)="selectAll()"
229
+ [disabled]="filteredOptions().length === 0"
230
+ >
231
+ Seleccionar todos
232
+ </ion-button>
233
+ <ion-button
234
+ fill="clear"
235
+ size="small"
236
+ color="medium"
237
+ (click)="clearAll()"
238
+ [disabled]="selectedValues().length === 0"
239
+ >
240
+ Limpiar
241
+ </ion-button>
242
+ </div>
243
+
244
+ <!-- Options list -->
245
+ <div class="options-container">
246
+ <ion-list class="options-list">
247
+ <ion-item
248
+ *ngFor="let option of filteredOptions(); trackBy: trackByFn"
249
+ button
250
+ (click)="toggleOption(option)"
251
+ class="option-item"
252
+ >
253
+ <ion-checkbox
254
+ slot="start"
255
+ [checked]="isSelected(option)"
256
+ ></ion-checkbox>
257
+ <ion-label>{{ option[labelProperty] }}</ion-label>
258
+ </ion-item>
259
+
260
+ <!-- No results message -->
261
+ <ion-item *ngIf="filteredOptions().length === 0" class="no-results">
262
+ <ion-label color="medium">
263
+ {{ searchTerm() ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
264
+ </ion-label>
265
+ </ion-item>
266
+ </ion-list>
267
+ </div>
268
+ </div>
269
+ `, isInline: true, styles: [":host{display:block;position:relative;width:100%}.multi-select-container{position:relative;display:flex;align-items:center;cursor:pointer}.multi-select-container .main-input{flex:1;cursor:pointer}.multi-select-container .main-input.is-open{--border-color: var(--ion-color-primary)}.multi-select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none;z-index:2}.multi-select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;background:var(--ion-background-color);border:1px solid var(--ion-color-light);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:1000;max-height:400px;opacity:0;transform:translateY(-8px);pointer-events:none;transition:all .2s ease}.dropdown-overlay.visible{opacity:1;transform:translateY(4px);pointer-events:all}.search-container{padding:12px;border-bottom:1px solid var(--ion-color-light)}.search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 8px;--box-shadow: none;--padding-start: 12px;--padding-end: 12px;height:40px}.actions-container{display:flex;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--ion-color-light)}.actions-container ion-button{--padding-start: 8px;--padding-end: 8px;height:32px;font-size:14px}.options-container{max-height:240px;overflow-y:auto}.options-container .options-list{padding:0}.options-container .option-item{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;cursor:pointer}.options-container .option-item:hover{--background: var(--ion-color-light)}.options-container .option-item ion-checkbox{--size: 20px;margin-right:12px}.options-container .option-item ion-label{font-size:16px;line-height:1.4}.options-container .no-results{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;text-align:center}.options-container .no-results ion-label{font-style:italic;font-size:14px}@media (max-width: 768px){.dropdown-overlay{max-height:300px}.options-container{max-height:200px}.actions-container ion-button{font-size:12px;--padding-start: 6px;--padding-end: 6px}}@media (prefers-color-scheme: dark){.dropdown-overlay{box-shadow:0 4px 16px #0000004d}}.option-item:focus-within{--background: var(--ion-color-primary-tint);outline:2px solid var(--ion-color-primary);outline-offset:-2px}.option-item{transition:background-color .15s ease}.dropdown-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSimpleComponent, decorators: [{
272
+ type: Component,
273
+ args: [{ selector: 'val-multi-select-simple', standalone: true, imports: [CommonModule, IonicModule, FormsModule, ReactiveFormsModule], providers: [
274
+ {
275
+ provide: NG_VALUE_ACCESSOR,
276
+ useExisting: forwardRef(() => MultiSelectSimpleComponent),
277
+ multi: true
278
+ }
279
+ ], template: `
280
+ <div class="multi-select-container" (click)="toggleDropdown($event)">
281
+ <!-- Main input display -->
282
+ <ion-input
283
+ #mainInput
284
+ type="text"
285
+ [value]="displayValue()"
286
+ [placeholder]="props?.placeholder || placeholder"
287
+ readonly
288
+ class="main-input"
289
+ [class.is-open]="isOpen()"
290
+ />
291
+
292
+ <!-- Dropdown icon -->
293
+ <ion-icon
294
+ name="chevron-down-outline"
295
+ class="dropdown-icon"
296
+ [class.rotated]="isOpen()"
297
+ ></ion-icon>
298
+
299
+ <!-- Hidden input for form control -->
300
+ <ion-input
301
+ style="position: absolute; opacity: 0; pointer-events: none;"
302
+ [formControl]="props?.control"
303
+ type="hidden"
304
+ />
305
+ </div>
306
+
307
+ <!-- Dropdown overlay -->
308
+ <div
309
+ class="dropdown-overlay"
310
+ [class.visible]="isOpen()"
311
+ #dropdown
312
+ >
313
+ <!-- Search bar -->
314
+ <div class="search-container">
315
+ <ion-searchbar
316
+ #searchbar
317
+ [placeholder]="searchPlaceholder"
318
+ (ionInput)="onSearch($event)"
319
+ [value]="searchTerm()"
320
+ show-clear-button="focus"
321
+ ></ion-searchbar>
322
+ </div>
323
+
324
+ <!-- Action buttons -->
325
+ <div class="actions-container">
326
+ <ion-button
327
+ fill="clear"
328
+ size="small"
329
+ (click)="selectAll()"
330
+ [disabled]="filteredOptions().length === 0"
331
+ >
332
+ Seleccionar todos
333
+ </ion-button>
334
+ <ion-button
335
+ fill="clear"
336
+ size="small"
337
+ color="medium"
338
+ (click)="clearAll()"
339
+ [disabled]="selectedValues().length === 0"
340
+ >
341
+ Limpiar
342
+ </ion-button>
343
+ </div>
344
+
345
+ <!-- Options list -->
346
+ <div class="options-container">
347
+ <ion-list class="options-list">
348
+ <ion-item
349
+ *ngFor="let option of filteredOptions(); trackBy: trackByFn"
350
+ button
351
+ (click)="toggleOption(option)"
352
+ class="option-item"
353
+ >
354
+ <ion-checkbox
355
+ slot="start"
356
+ [checked]="isSelected(option)"
357
+ ></ion-checkbox>
358
+ <ion-label>{{ option[labelProperty] }}</ion-label>
359
+ </ion-item>
360
+
361
+ <!-- No results message -->
362
+ <ion-item *ngIf="filteredOptions().length === 0" class="no-results">
363
+ <ion-label color="medium">
364
+ {{ searchTerm() ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
365
+ </ion-label>
366
+ </ion-item>
367
+ </ion-list>
368
+ </div>
369
+ </div>
370
+ `, styles: [":host{display:block;position:relative;width:100%}.multi-select-container{position:relative;display:flex;align-items:center;cursor:pointer}.multi-select-container .main-input{flex:1;cursor:pointer}.multi-select-container .main-input.is-open{--border-color: var(--ion-color-primary)}.multi-select-container .dropdown-icon{position:absolute;right:12px;font-size:16px;color:var(--ion-color-medium);transition:transform .2s ease;pointer-events:none;z-index:2}.multi-select-container .dropdown-icon.rotated{transform:rotate(180deg)}.dropdown-overlay{position:absolute;top:100%;left:0;right:0;background:var(--ion-background-color);border:1px solid var(--ion-color-light);border-radius:8px;box-shadow:0 4px 16px #0000001a;z-index:1000;max-height:400px;opacity:0;transform:translateY(-8px);pointer-events:none;transition:all .2s ease}.dropdown-overlay.visible{opacity:1;transform:translateY(4px);pointer-events:all}.search-container{padding:12px;border-bottom:1px solid var(--ion-color-light)}.search-container ion-searchbar{--background: var(--ion-color-light);--border-radius: 8px;--box-shadow: none;--padding-start: 12px;--padding-end: 12px;height:40px}.actions-container{display:flex;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--ion-color-light)}.actions-container ion-button{--padding-start: 8px;--padding-end: 8px;height:32px;font-size:14px}.options-container{max-height:240px;overflow-y:auto}.options-container .options-list{padding:0}.options-container .option-item{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;cursor:pointer}.options-container .option-item:hover{--background: var(--ion-color-light)}.options-container .option-item ion-checkbox{--size: 20px;margin-right:12px}.options-container .option-item ion-label{font-size:16px;line-height:1.4}.options-container .no-results{--padding-start: 16px;--padding-end: 16px;--min-height: 48px;text-align:center}.options-container .no-results ion-label{font-style:italic;font-size:14px}@media (max-width: 768px){.dropdown-overlay{max-height:300px}.options-container{max-height:200px}.actions-container ion-button{font-size:12px;--padding-start: 6px;--padding-end: 6px}}@media (prefers-color-scheme: dark){.dropdown-overlay{box-shadow:0 4px 16px #0000004d}}.option-item:focus-within{--background: var(--ion-color-primary-tint);outline:2px solid var(--ion-color-primary);outline-offset:-2px}.option-item{transition:background-color .15s ease}.dropdown-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}\n"] }]
371
+ }], ctorParameters: () => [], propDecorators: { dropdownRef: [{
372
+ type: ViewChild,
373
+ args: ['dropdown']
374
+ }], mainInputRef: [{
375
+ type: ViewChild,
376
+ args: ['mainInput']
377
+ }], props: [{
378
+ type: Input
379
+ }], labelProperty: [{
380
+ type: Input
381
+ }], valueProperty: [{
382
+ type: Input
383
+ }], placeholder: [{
384
+ type: Input
385
+ }] } });
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LXNpbXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tdWx0aS1zZWxlY3Qtc2ltcGxlL211bHRpLXNlbGVjdC1zaW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFNBQVMsRUFDVCxNQUFNLEVBQ04sUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7QUE0R2pFLE1BQU0sT0FBTywwQkFBMEI7SUF1RHJDO1FBbERTLGtCQUFhLEdBQVcsTUFBTSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsSUFBSSxDQUFDO1FBQzdCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBRTFCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFDLHdDQUF3QztRQUN4QyxXQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsbUJBQWMsR0FBRyxNQUFN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O3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3Q2hpbGQsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBMYW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvbGFuZy1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IGFwcGx5RGVmYXVsdFZhbHVlVG9Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2Zvcm0tZGVmYXVsdHMnO1xuaW1wb3J0IHsgcmVwbGFjZVNwZWNpYWxDaGFycyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy90ZXh0JztcbmltcG9ydCB7IElucHV0TWV0YWRhdGEsIElucHV0T3B0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbXVsdGktc2VsZWN0LXNpbXBsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvbmljTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RTaW1wbGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1jb250YWluZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgPCEtLSBNYWluIGlucHV0IGRpc3BsYXkgLS0+XG4gICAgICA8aW9uLWlucHV0XG4gICAgICAgICNtYWluSW5wdXRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbdmFsdWVdPVwiZGlzcGxheVZhbHVlKClcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicHJvcHM/LnBsYWNlaG9sZGVyIHx8IHBsYWNlaG9sZGVyXCJcbiAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgY2xhc3M9XCJtYWluLWlucHV0XCJcbiAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwiaXNPcGVuKClcIlxuICAgICAgLz5cbiAgICAgIFxuICAgICAgPCEtLSBEcm9wZG93biBpY29uIC0tPlxuICAgICAgPGlvbi1pY29uIFxuICAgICAgICBuYW1lPVwiY2hldnJvbi1kb3duLW91dGxpbmVcIiBcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pY29uXCIgXG4gICAgICAgIFtjbGFzcy5yb3RhdGVkXT1cImlzT3BlbigpXCJcbiAgICAgID48L2lvbi1pY29uPlxuICAgICAgXG4gICAgICA8IS0tIEhpZGRlbiBpbnB1dCBmb3IgZm9ybSBjb250cm9sIC0tPlxuICAgICAgPGlvbi1pbnB1dCBcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IG9wYWNpdHk6IDA7IHBvaW50ZXItZXZlbnRzOiBub25lO1wiIFxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwicHJvcHM/LmNvbnRyb2xcIiBcbiAgICAgICAgdHlwZT1cImhpZGRlblwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEcm9wZG93biBvdmVybGF5IC0tPlxuICAgIDxkaXYgXG4gICAgICBjbGFzcz1cImRyb3Bkb3duLW92ZXJsYXlcIiBcbiAgICAgIFtjbGFzcy52aXNpYmxlXT1cImlzT3BlbigpXCJcbiAgICAgICNkcm9wZG93blxuICAgID5cbiAgICAgIDwhLS0gU2VhcmNoIGJhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCI+XG4gICAgICAgIDxpb24tc2VhcmNoYmFyXG4gICAgICAgICAgI3NlYXJjaGJhclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgICAgKGlvbklucHV0KT1cIm9uU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtKClcIlxuICAgICAgICAgIHNob3ctY2xlYXItYnV0dG9uPVwiZm9jdXNcIlxuICAgICAgICA+PC9pb24tc2VhcmNoYmFyPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gQWN0aW9uIGJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1idXR0b24gXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCIgXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCIgXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID09PSAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIFNlbGVjY2lvbmFyIHRvZG9zXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPGlvbi1idXR0b24gXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCIgXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCIgXG4gICAgICAgICAgY29sb3I9XCJtZWRpdW1cIiBcbiAgICAgICAgICAoY2xpY2spPVwiY2xlYXJBbGwoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGVkVmFsdWVzKCkubGVuZ3RoID09PSAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIExpbXBpYXJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gT3B0aW9ucyBsaXN0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxpb24tbGlzdCBjbGFzcz1cIm9wdGlvbnMtbGlzdFwiPlxuICAgICAgICAgIDxpb24taXRlbSBcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFxuICAgICAgICAgICAgYnV0dG9uIFxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uLWl0ZW1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24tY2hlY2tib3hcbiAgICAgICAgICAgICAgc2xvdD1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgID48L2lvbi1jaGVja2JveD5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgb3B0aW9uW2xhYmVsUHJvcGVydHldIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIE5vIHJlc3VsdHMgbWVzc2FnZSAtLT5cbiAgICAgICAgICA8aW9uLWl0ZW0gKm5nSWY9XCJmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm5vLXJlc3VsdHNcIj5cbiAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAge3sgc2VhcmNoVGVybSgpID8gJ05vIHNlIGVuY29udHJhcm9uIHJlc3VsdGFkb3MnIDogJ05vIGhheSBvcGNpb25lcyBkaXNwb25pYmxlcycgfX1cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktc2VsZWN0LXNpbXBsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0U2ltcGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQFZpZXdDaGlsZCgnZHJvcGRvd24nKSBkcm9wZG93blJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ21haW5JbnB1dCcpIG1haW5JbnB1dFJlZiE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgcHJvcHMhOiBJbnB1dE1ldGFkYXRhO1xuICBASW5wdXQoKSBsYWJlbFByb3BlcnR5OiBzdHJpbmcgPSAnbmFtZSc7XG4gIEBJbnB1dCgpIHZhbHVlUHJvcGVydHk6IHN0cmluZyA9ICdpZCc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIGxhbmdTZXJ2aWNlID0gaW5qZWN0KExhbmdTZXJ2aWNlKTtcbiAgXG4gIC8vIFNpZ25hbHMgZm9yIHJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnRcbiAgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgc2VhcmNoVGVybSA9IHNpZ25hbCgnJyk7XG4gIHNlbGVjdGVkVmFsdWVzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIFxuICAvLyBDb21wdXRlZCBzaWduYWxzXG4gIGRpc3BsYXlWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZ2V0T3B0aW9uQnlWYWx1ZShzZWxlY3RlZFswXSk7XG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV0gOiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3NlbGVjdGVkLmxlbmd0aH0gZWxlbWVudG9zIHNlbGVjY2lvbmFkb3NgO1xuICB9KTtcblxuICBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucHJvcHM/Lm9wdGlvbnMgfHwgW107XG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hUZXJtKCkudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSBvcHRpb25bdGhpcy5sYWJlbFByb3BlcnR5XVxuICAgICAgICA/IHJlcGxhY2VTcGVjaWFsQ2hhcnMoU3RyaW5nKG9wdGlvblt0aGlzLmxhYmVsUHJvcGVydHldKS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XVxuICAgICAgICA/IHJlcGxhY2VTcGVjaWFsQ2hhcnMoU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHJlcGxhY2VTcGVjaWFsQ2hhcnMoc2VhcmNoKTtcbiAgICAgIHJldHVybiBsYWJlbC5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCB2YWx1ZS5pbmNsdWRlcyhzZWFyY2hUZXJtKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsICdzZWxlY3RPcHRpb25zJywgJ1NlbGVjY2lvbmUgb3BjaW9uZXMnKTtcbiAgICB0aGlzLnNlYXJjaFBsYWNlaG9sZGVyID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ3NlYXJjaCcsICdCdXNjYXInKTtcbiAgICBcbiAgICAvLyBDbG9zZSBkcm9wZG93biB3aGVuIGNsaWNraW5nIG91dHNpZGVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hcHBseURlZmF1bHRWYWx1ZSgpO1xuICAgIHRoaXMuc3luY1NlbGVjdGVkVmFsdWVzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWVBcnJheSA9IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQodmFsdWVBcnJheSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZSBpZiBuZWVkZWRcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBtZXRob2RzXG4gIHRvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNPcGVuLnVwZGF0ZSh2YWx1ZSA9PiAhdmFsdWUpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgLy8gRm9jdXMgc2VhcmNoIGJhciB3aGVuIG9wZW5pbmdcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hiYXIgPSB0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdpb24tc2VhcmNoYmFyJyk7XG4gICAgICAgIGlmIChzZWFyY2hiYXIpIHtcbiAgICAgICAgICBzZWFyY2hiYXIuc2V0Rm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChldmVudC5kZXRhaWwudmFsdWUgfHwgJycpO1xuICB9XG5cbiAgdG9nZ2xlT3B0aW9uKG9wdGlvbjogSW5wdXRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldO1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGlvblxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQoY3VycmVudFNlbGVjdGVkLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0byBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuc2V0KFsuLi5jdXJyZW50U2VsZWN0ZWQsIHZhbHVlXSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5tYXAob3B0aW9uID0+IG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKTtcbiAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkVmFsdWVzKCk7XG4gICAgXG4gICAgLy8gQWRkIG9ubHkgbmV3IHZhbHVlcyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgY29uc3QgbmV3VmFsdWVzID0gYWxsVmFsdWVzLmZpbHRlcih2YWx1ZSA9PiAhY3VycmVudFNlbGVjdGVkLmluY2x1ZGVzKHZhbHVlKSk7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQoWy4uLmN1cnJlbnRTZWxlY3RlZCwgLi4ubmV3VmFsdWVzXSk7XG4gICAgXG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgfVxuXG4gIGNsZWFyQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuc2V0KFtdKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChvcHRpb246IElucHV0T3B0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKS5pbmNsdWRlcyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSk7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgb3B0aW9uOiBJbnB1dE9wdGlvbik6IGFueSB7XG4gICAgcmV0dXJuIG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKCkgJiYgXG4gICAgICAgICF0aGlzLm1haW5JbnB1dFJlZj8ubmF0aXZlRWxlbWVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAhdGhpcy5kcm9wZG93blJlZj8ubmF0aXZlRWxlbWVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VhcmNoVGVybS5zZXQoJycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nW10ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAodiA9PiBTdHJpbmcodikpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAodiA9PiB2LnRyaW0oKSkuZmlsdGVyKHYgPT4gdiAhPT0gJycpO1xuICAgIH1cbiAgICByZXR1cm4gW1N0cmluZyh2YWx1ZSldO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkVmFsdWVzKCkuam9pbignLCcpO1xuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIFxuICAgIGlmICh0aGlzLnByb3BzPy5jb250cm9sKSB7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5wcm9wcy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3B0aW9uQnlWYWx1ZSh2YWx1ZTogc3RyaW5nKTogSW5wdXRPcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnByb3BzPy5vcHRpb25zPy5maW5kKG9wdGlvbiA9PiBvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSA9PT0gdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcykge1xuICAgICAgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wodGhpcy5wcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2VsZWN0ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvcHM/LmNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICBjb25zdCB2YWx1ZUFycmF5ID0gdGhpcy5wYXJzZVZhbHVlKHRoaXMucHJvcHMuY29udHJvbC52YWx1ZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnNldCh2YWx1ZUFycmF5KTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -127,7 +127,7 @@ export class PopoverSelectorComponent {
127
127
 
128
128
  <span class="trigger-text">{{ getDisplayText() }}</span>
129
129
 
130
- <ion-icon name="chevron-down" slot="end" class="chevron-icon"> </ion-icon>
130
+ <ion-icon name="chevron-down-outline" slot="end" class="chevron-icon"> </ion-icon>
131
131
  </ion-button>
132
132
 
133
133
  <ion-select-option *ngFor="let option of props.options" [value]="option.value" [disabled]="option.disabled">
@@ -169,7 +169,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
169
169
 
170
170
  <span class="trigger-text">{{ getDisplayText() }}</span>
171
171
 
172
- <ion-icon name="chevron-down" slot="end" class="chevron-icon"> </ion-icon>
172
+ <ion-icon name="chevron-down-outline" slot="end" class="chevron-icon"> </ion-icon>
173
173
  </ion-button>
174
174
 
175
175
  <ion-select-option *ngFor="let option of props.options" [value]="option.value" [disabled]="option.disabled">
@@ -186,4 +186,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
186
186
  }], selectionChange: [{
187
187
  type: Output
188
188
  }] } });
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9wb3BvdmVyLXNlbGVjdG9yL3BvcG92ZXItc2VsZWN0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1REFBdUQsQ0FBQzs7O0FBZ0RwRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQWlCbkM7UUFUQTs7O1dBR0c7UUFFSCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBRWhELGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBR3hDLDBCQUEwQjtRQUMxQixRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLEtBQVU7UUFDMUIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxxQkFBcUI7WUFDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDbkMsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLE9BQU8sTUFBTSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN0RixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCxtQkFBbUI7UUFDbkIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sY0FBYyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztJQUMzRCxDQUFDOytHQTlFVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2SkF4RXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDVCx1L01BdkNTLFlBQVksZ1FBQUUsU0FBUyxvUEFBRSxPQUFPLDJKQUFFLFNBQVMsdVRBQUUsZUFBZSw2RkFBRSxRQUFROzs0RkF5RXJFLHdCQUF3QjtrQkE1RXBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLFlBQ3ZFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDVDt3REF3Q0QsS0FBSztzQkFESixLQUFLO2dCQVFOLGVBQWU7c0JBRGQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkljb24sIElvbkxhYmVsLCBJb25TZWxlY3QsIElvblNlbGVjdE9wdGlvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjaGV2cm9uRG93biB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IExhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9wb3ZlclNlbGVjdG9yTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXBvcG92ZXItc2VsZWN0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25CdXR0b24sIElvbkljb24sIElvblNlbGVjdCwgSW9uU2VsZWN0T3B0aW9uLCBJb25MYWJlbF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInBvcG92ZXItc2VsZWN0b3ItY29udGFpbmVyXCI+XG4gICAgICA8aW9uLWxhYmVsICpuZ0lmPVwicHJvcHMubGFiZWxcIiBjbGFzcz1cInNlbGVjdG9yLWxhYmVsXCI+e3sgcHJvcHMubGFiZWwgfX08L2lvbi1sYWJlbD5cbiAgICAgIDxpb24tc2VsZWN0XG4gICAgICAgIFt2YWx1ZV09XCJwcm9wcy5zZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyVGV4dCgpXCJcbiAgICAgICAgW2ludGVyZmFjZV09XCJwcm9wcy5pbnRlcmZhY2UgfHwgJ3BvcG92ZXInXCJcbiAgICAgICAgW211bHRpcGxlXT1cInByb3BzLm11bHRpcGxlIHx8IGZhbHNlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInByb3BzLmRpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgW2NhbmNlbFRleHRdPVwiZ2V0Q2FuY2VsVGV4dCgpXCJcbiAgICAgICAgW29rVGV4dF09XCJnZXRPa1RleHQoKVwiXG4gICAgICAgIChpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwicG9wb3Zlci1zZWxlY3Rvci1zZWxlY3RcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNsb3Q9XCJ0cmlnZ2VyXCJcbiAgICAgICAgICBbZmlsbF09XCJwcm9wcy5maWxsIHx8ICdjbGVhcidcIlxuICAgICAgICAgIFtzaXplXT1cInByb3BzLnNpemUgfHwgJ2RlZmF1bHQnXCJcbiAgICAgICAgICBbc2hhcGVdPVwiJ3JvdW5kJ1wiXG4gICAgICAgICAgW2NvbG9yXT1cInByb3BzLmNvbG9yIHx8ICdtZWRpdW0nXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicHJvcHMuZGlzYWJsZWQgfHwgZmFsc2VcIlxuICAgICAgICAgIGNsYXNzPVwic2VsZWN0b3ItdHJpZ2dlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJwcm9wcy5pY29uXCIgW25hbWVdPVwicHJvcHMuaWNvblwiIHNsb3Q9XCJzdGFydFwiPiA8L2lvbi1pY29uPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLXRleHRcIj57eyBnZXREaXNwbGF5VGV4dCgpIH19PC9zcGFuPlxuXG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd25cIiBzbG90PVwiZW5kXCIgY2xhc3M9XCJjaGV2cm9uLWljb25cIj4gPC9pb24taWNvbj5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3BzLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCIgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwib3B0aW9uLmljb25cIiBbbmFtZV09XCJvcHRpb24uaWNvblwiIGNsYXNzPVwib3B0aW9uLWljb25cIj4gPC9pb24taWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdGlvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vcG9wb3Zlci1zZWxlY3Rvci5jb21wb25lbnQuc2NzcyddLFxufSlcbi8qKlxuICogdmFsLXBvcG92ZXItc2VsZWN0b3JcbiAqXG4gKiBBIGdlbmVyaWMgcmV1c2FibGUgcG9wb3ZlciBzZWxlY3RvciBjb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYW55IHR5cGUgb2Ygc2VsZWN0aW9uLlxuICogUHJvdmlkZXMgYSBidXR0b24gdHJpZ2dlciB0aGF0IG9wZW5zIGEgcG9wb3ZlciB3aXRoIHNlbGVjdGFibGUgb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2VcbiAqIDx2YWwtcG9wb3Zlci1zZWxlY3RvclxuICogICBbcHJvcHNdPVwic2VsZWN0b3JQcm9wc1wiXG4gKiAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICogPC92YWwtcG9wb3Zlci1zZWxlY3Rvcj5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2l0aCBpY29uIGFuZCBjdXN0b20gc3R5bGluZ1xuICogY29uc3Qgc2VsZWN0b3JQcm9wczogUG9wb3ZlclNlbGVjdG9yTWV0YWRhdGEgPSB7XG4gKiAgIG9wdGlvbnM6IFtcbiAqICAgICB7IHZhbHVlOiAnb3B0aW9uMScsIGxhYmVsOiAnT3B0aW9uIDEnLCBpY29uOiAnc3RhcicgfSxcbiAqICAgICB7IHZhbHVlOiAnb3B0aW9uMicsIGxhYmVsOiAnT3B0aW9uIDInLCBpY29uOiAnaGVhcnQnIH1cbiAqICAgXSxcbiAqICAgc2VsZWN0ZWRWYWx1ZTogJ29wdGlvbjEnLFxuICogICBsYWJlbDogJ0Nob29zZSBvcHRpb24nLFxuICogICBpY29uOiAnc2V0dGluZ3MnLFxuICogICBjb2xvcjogJ3ByaW1hcnknLFxuICogICBzaXplOiAnbGFyZ2UnLFxuICogICBmaWxsOiAnc29saWQnXG4gKiB9O1xuICpcbiAqIEBpbnB1dCBwcm9wczogUG9wb3ZlclNlbGVjdG9yTWV0YWRhdGEgLSBDb25maWd1cmF0aW9uIGZvciB0aGUgc2VsZWN0b3JcbiAqIEBvdXRwdXQgc2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgc3RyaW5nW10+IC0gRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3BvdmVyU2VsZWN0b3JDb21wb25lbnQge1xuICAvKipcbiAgICogUG9wb3ZlciBzZWxlY3RvciBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHR5cGUge1BvcG92ZXJTZWxlY3Rvck1ldGFkYXRhfVxuICAgKi9cbiAgQElucHV0KClcbiAgcHJvcHM6IFBvcG92ZXJTZWxlY3Rvck1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLlxuICAgKiBFbWl0cyB0aGUgc2VsZWN0ZWQgdmFsdWUocykuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBzdHJpbmdbXT4oKTtcblxuICBwcml2YXRlIGxhbmdTZXJ2aWNlID0gaW5qZWN0KExhbmdTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWdpc3RlciByZXF1aXJlZCBpY29uc1xuICAgIGFkZEljb25zKHsgY2hldnJvbkRvd24gfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlYWN0aXZlIHBsYWNlaG9sZGVyIHRleHQuXG4gICAqL1xuICBnZXRQbGFjZWhvbGRlclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5wbGFjZWhvbGRlciB8fCB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoJ19nbG9iYWwnLCAnc2VsZWN0JywgJ1NlbGVjY2lvbmFyLi4uJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlYWN0aXZlIGNhbmNlbCB0ZXh0LlxuICAgKi9cbiAgZ2V0Q2FuY2VsVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNhbmNlbFRleHQgfHwgdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ2NhbmNlbCcsICdDYW5jZWxhcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWFjdGl2ZSBvayB0ZXh0LlxuICAgKi9cbiAgZ2V0T2tUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMub2tUZXh0IHx8IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsICdvaycsICdBY2VwdGFyJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNlbGVjdGlvbiBjaGFuZ2UgZnJvbSB0aGUgaW9uLXNlbGVjdC5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGlvbi1zZWxlY3QgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGVkVmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGlzcGxheSB0ZXh0IGZvciB0aGUgdHJpZ2dlciBidXR0b24uXG4gICAqIFNob3dzIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbCBvciBwbGFjZWhvbGRlci5cbiAgICogQHJldHVybnMgVGhlIGRpc3BsYXkgdGV4dFxuICAgKi9cbiAgZ2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UGxhY2Vob2xkZXJUZXh0KCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlKSkge1xuICAgICAgLy8gTXVsdGlwbGUgc2VsZWN0aW9uXG4gICAgICBpZiAodGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb3BzLnNlbGVjdGVkVmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHRoaXMucHJvcHMuc2VsZWN0ZWRWYWx1ZVswXSk7XG4gICAgICAgIHJldHVybiBvcHRpb24/LmxhYmVsIHx8IHRoaXMucHJvcHMuc2VsZWN0ZWRWYWx1ZVswXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsICdzZWxlY3RlZCcsICdzZWxlY2Npb25hZG9zJyk7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlLmxlbmd0aH0gJHtzZWxlY3RlZFRleHR9YDtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgc2VsZWN0aW9uXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLnByb3BzLm9wdGlvbnMuZmluZChvcHQgPT4gb3B0LnZhbHVlID09PSB0aGlzLnByb3BzLnNlbGVjdGVkVmFsdWUpO1xuICAgIHJldHVybiBzZWxlY3RlZE9wdGlvbj8ubGFiZWwgfHwgdGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlO1xuICB9XG59XG4iXX0=
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9wb3BvdmVyLXNlbGVjdG9yL3BvcG92ZXItc2VsZWN0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1REFBdUQsQ0FBQzs7O0FBZ0RwRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQWlCbkM7UUFUQTs7O1dBR0c7UUFFSCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBRWhELGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBR3hDLDBCQUEwQjtRQUMxQixRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFR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QkFESixLQUFLO2dCQVFOLGVBQWU7c0JBRGQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkljb24sIElvbkxhYmVsLCBJb25TZWxlY3QsIElvblNlbGVjdE9wdGlvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjaGV2cm9uRG93biB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IExhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9wb3ZlclNlbGVjdG9yTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXBvcG92ZXItc2VsZWN0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25CdXR0b24sIElvbkljb24sIElvblNlbGVjdCwgSW9uU2VsZWN0T3B0aW9uLCBJb25MYWJlbF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInBvcG92ZXItc2VsZWN0b3ItY29udGFpbmVyXCI+XG4gICAgICA8aW9uLWxhYmVsICpuZ0lmPVwicHJvcHMubGFiZWxcIiBjbGFzcz1cInNlbGVjdG9yLWxhYmVsXCI+e3sgcHJvcHMubGFiZWwgfX08L2lvbi1sYWJlbD5cbiAgICAgIDxpb24tc2VsZWN0XG4gICAgICAgIFt2YWx1ZV09XCJwcm9wcy5zZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyVGV4dCgpXCJcbiAgICAgICAgW2ludGVyZmFjZV09XCJwcm9wcy5pbnRlcmZhY2UgfHwgJ3BvcG92ZXInXCJcbiAgICAgICAgW211bHRpcGxlXT1cInByb3BzLm11bHRpcGxlIHx8IGZhbHNlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInByb3BzLmRpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgW2NhbmNlbFRleHRdPVwiZ2V0Q2FuY2VsVGV4dCgpXCJcbiAgICAgICAgW29rVGV4dF09XCJnZXRPa1RleHQoKVwiXG4gICAgICAgIChpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwicG9wb3Zlci1zZWxlY3Rvci1zZWxlY3RcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHNsb3Q9XCJ0cmlnZ2VyXCJcbiAgICAgICAgICBbZmlsbF09XCJwcm9wcy5maWxsIHx8ICdjbGVhcidcIlxuICAgICAgICAgIFtzaXplXT1cInByb3BzLnNpemUgfHwgJ2RlZmF1bHQnXCJcbiAgICAgICAgICBbc2hhcGVdPVwiJ3JvdW5kJ1wiXG4gICAgICAgICAgW2NvbG9yXT1cInByb3BzLmNvbG9yIHx8ICdtZWRpdW0nXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicHJvcHMuZGlzYWJsZWQgfHwgZmFsc2VcIlxuICAgICAgICAgIGNsYXNzPVwic2VsZWN0b3ItdHJpZ2dlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJwcm9wcy5pY29uXCIgW25hbWVdPVwicHJvcHMuaWNvblwiIHNsb3Q9XCJzdGFydFwiPiA8L2lvbi1pY29uPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLXRleHRcIj57eyBnZXREaXNwbGF5VGV4dCgpIH19PC9zcGFuPlxuXG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWRvd24tb3V0bGluZVwiIHNsb3Q9XCJlbmRcIiBjbGFzcz1cImNoZXZyb24taWNvblwiPiA8L2lvbi1pY29uPlxuICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcHMub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIiBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJvcHRpb24uaWNvblwiIFtuYW1lXT1cIm9wdGlvbi5pY29uXCIgY2xhc3M9XCJvcHRpb24taWNvblwiPiA8L2lvbi1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgb3B0aW9uLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgPC9pb24tc2VsZWN0PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9wb3BvdmVyLXNlbGVjdG9yLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuLyoqXG4gKiB2YWwtcG9wb3Zlci1zZWxlY3RvclxuICpcbiAqIEEgZ2VuZXJpYyByZXVzYWJsZSBwb3BvdmVyIHNlbGVjdG9yIGNvbXBvbmVudCB0aGF0IGNhbiBiZSB1c2VkIGZvciBhbnkgdHlwZSBvZiBzZWxlY3Rpb24uXG4gKiBQcm92aWRlcyBhIGJ1dHRvbiB0cmlnZ2VyIHRoYXQgb3BlbnMgYSBwb3BvdmVyIHdpdGggc2VsZWN0YWJsZSBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZVxuICogPHZhbC1wb3BvdmVyLXNlbGVjdG9yXG4gKiAgIFtwcm9wc109XCJzZWxlY3RvclByb3BzXCJcbiAqICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+XG4gKiA8L3ZhbC1wb3BvdmVyLXNlbGVjdG9yPlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaXRoIGljb24gYW5kIGN1c3RvbSBzdHlsaW5nXG4gKiBjb25zdCBzZWxlY3RvclByb3BzOiBQb3BvdmVyU2VsZWN0b3JNZXRhZGF0YSA9IHtcbiAqICAgb3B0aW9uczogW1xuICogICAgIHsgdmFsdWU6ICdvcHRpb24xJywgbGFiZWw6ICdPcHRpb24gMScsIGljb246ICdzdGFyJyB9LFxuICogICAgIHsgdmFsdWU6ICdvcHRpb24yJywgbGFiZWw6ICdPcHRpb24gMicsIGljb246ICdoZWFydCcgfVxuICogICBdLFxuICogICBzZWxlY3RlZFZhbHVlOiAnb3B0aW9uMScsXG4gKiAgIGxhYmVsOiAnQ2hvb3NlIG9wdGlvbicsXG4gKiAgIGljb246ICdzZXR0aW5ncycsXG4gKiAgIGNvbG9yOiAncHJpbWFyeScsXG4gKiAgIHNpemU6ICdsYXJnZScsXG4gKiAgIGZpbGw6ICdzb2xpZCdcbiAqIH07XG4gKlxuICogQGlucHV0IHByb3BzOiBQb3BvdmVyU2VsZWN0b3JNZXRhZGF0YSAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZWxlY3RvclxuICogQG91dHB1dCBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBzdHJpbmdbXT4gLSBFbWl0dGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFBvcG92ZXJTZWxlY3RvckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBQb3BvdmVyIHNlbGVjdG9yIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAdHlwZSB7UG9wb3ZlclNlbGVjdG9yTWV0YWRhdGF9XG4gICAqL1xuICBASW5wdXQoKVxuICBwcm9wczogUG9wb3ZlclNlbGVjdG9yTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuXG4gICAqIEVtaXRzIHRoZSBzZWxlY3RlZCB2YWx1ZShzKS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IHN0cmluZ1tdPigpO1xuXG4gIHByaXZhdGUgbGFuZ1NlcnZpY2UgPSBpbmplY3QoTGFuZ1NlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFJlZ2lzdGVyIHJlcXVpcmVkIGljb25zXG4gICAgYWRkSWNvbnMoeyBjaGV2cm9uRG93biB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVhY3RpdmUgcGxhY2Vob2xkZXIgdGV4dC5cbiAgICovXG4gIGdldFBsYWNlaG9sZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnBsYWNlaG9sZGVyIHx8IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsICdzZWxlY3QnLCAnU2VsZWNjaW9uYXIuLi4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVhY3RpdmUgY2FuY2VsIHRleHQuXG4gICAqL1xuICBnZXRDYW5jZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2FuY2VsVGV4dCB8fCB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoJ19nbG9iYWwnLCAnY2FuY2VsJywgJ0NhbmNlbGFyJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlYWN0aXZlIG9rIHRleHQuXG4gICAqL1xuICBnZXRPa1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5va1RleHQgfHwgdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ29rJywgJ0FjZXB0YXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW9uIGNoYW5nZSBmcm9tIHRoZSBpb24tc2VsZWN0LlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgaW9uLXNlbGVjdCBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0ZWRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkaXNwbGF5IHRleHQgZm9yIHRoZSB0cmlnZ2VyIGJ1dHRvbi5cbiAgICogU2hvd3MgdGhlIHNlbGVjdGVkIG9wdGlvbidzIGxhYmVsIG9yIHBsYWNlaG9sZGVyLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzcGxheSB0ZXh0XG4gICAqL1xuICBnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnByb3BzLnNlbGVjdGVkVmFsdWUpKSB7XG4gICAgICAvLyBNdWx0aXBsZSBzZWxlY3Rpb25cbiAgICAgIGlmICh0aGlzLnByb3BzLnNlbGVjdGVkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBsYWNlaG9sZGVyVGV4dCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucHJvcHMuc2VsZWN0ZWRWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gdGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlWzBdKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbj8ubGFiZWwgfHwgdGhpcy5wcm9wcy5zZWxlY3RlZFZhbHVlWzBdO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ3NlbGVjdGVkJywgJ3NlbGVjY2lvbmFkb3MnKTtcbiAgICAgIHJldHVybiBgJHt0aGlzLnByb3BzLnNlbGVjdGVkVmFsdWUubGVuZ3RofSAke3NlbGVjdGVkVGV4dH1gO1xuICAgIH1cblxuICAgIC8vIFNpbmdsZSBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHRoaXMucHJvcHMuc2VsZWN0ZWRWYWx1ZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uPy5sYWJlbCB8fCB0aGlzLnByb3BzLnNlbGVjdGVkVmFsdWU7XG4gIH1cbn1cbiJdfQ==