i-tech-shared-components 1.0.1 → 1.0.3

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,392 @@
1
+ import { Component, ViewChild, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
+ import { MatFormField, MatLabel, MatOption, MatPrefix, MatSelect } from "@angular/material/select";
3
+ import { ReactiveFormsModule } from "@angular/forms";
4
+ import { ButtonType } from '../../interfaces/button-types.enum';
5
+ import { NgClass, NgIf, NgOptimizedImage } from "@angular/common";
6
+ import { MatTooltip } from "@angular/material/tooltip";
7
+ import { TranslateModule } from "@ngx-translate/core";
8
+ import { IconButtonComponent } from "../icon-button/icon-button.component";
9
+ import { ButtonComponent } from "../button/button.component";
10
+ import { GetValueByKeyFromObjectPipe } from "../../pipes/get-value-by-key-from-object.pipe";
11
+ import { ArrayToStringPipe } from "../../pipes/array-to-string.pipe";
12
+ import { MatIcon } from "@angular/material/icon";
13
+ import { GenerateErrorMessagesPipe } from "../../pipes/generate-error-messages.pipe";
14
+ import { ClearValueComponent } from "../clear-value/clear-value.component";
15
+ import { MatError } from "@angular/material/form-field";
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../../services/input.service";
18
+ import * as i2 from "@ngx-translate/core";
19
+ import * as i3 from "@angular/forms";
20
+ export class AutocompleteSelectComponent {
21
+ set configs(data) {
22
+ this.selectConfig = data;
23
+ if (!data) {
24
+ return;
25
+ }
26
+ if ((typeof this.selectConfig.paginate) === 'function') {
27
+ if (this.firstRequest) {
28
+ return;
29
+ }
30
+ this.getData();
31
+ this.firstRequest = true;
32
+ return;
33
+ }
34
+ this.data = this.selectConfig.paginate;
35
+ this.findAndSetDefaultValueFromData();
36
+ }
37
+ ;
38
+ handleVisibilityChange() {
39
+ this.tabVisibility = !document.hidden;
40
+ if (this.ngControl.control.value) {
41
+ return;
42
+ }
43
+ this.closePanelAndUnsetFocus();
44
+ if (!document.hidden) {
45
+ this.isNeededForRecall = true;
46
+ this.pending = true;
47
+ setTimeout(() => {
48
+ this.pending = false;
49
+ }, 4000);
50
+ }
51
+ }
52
+ constructor(inputService) {
53
+ this.inputService = inputService;
54
+ this.selectionChange = new EventEmitter();
55
+ this.emitAction = new EventEmitter();
56
+ this.pending = false;
57
+ this.data = [];
58
+ this.paginationData = { current: 1, last: 0 };
59
+ this.firstRequest = false;
60
+ this.showPlaceholder = true;
61
+ this.isNeededForRecall = false;
62
+ this.accessToNextRequest = true;
63
+ this.disabled = false;
64
+ this.blockRecallDefaultValueSetter = false;
65
+ this.requestLoading = false;
66
+ this.ButtonType = ButtonType;
67
+ this.customErrorStateMatcher = {
68
+ isErrorState: (control, form) => {
69
+ return !!(control && control.invalid && this.submitValue);
70
+ }
71
+ };
72
+ this.ngControl = this.inputService.injectNgControl();
73
+ }
74
+ ngOnChanges(changes) {
75
+ if (changes['selectConfig'] && this.selectConfig) {
76
+ if ((typeof this.selectConfig.paginate) === 'function') {
77
+ this.getData();
78
+ }
79
+ }
80
+ }
81
+ ngAfterViewInit() {
82
+ this.ngControl.control.valueChanges.subscribe((res) => {
83
+ if (this.data.length && res && !this.blockRecallDefaultValueSetter) {
84
+ this.findAndSetDefaultValueFromData();
85
+ }
86
+ });
87
+ }
88
+ hardReload() {
89
+ this.getData('', true);
90
+ }
91
+ getData(searchText, fromSearch) {
92
+ if (!fromSearch && !this.accessToNextRequest) {
93
+ return;
94
+ }
95
+ if (this.requestLoading) {
96
+ return;
97
+ }
98
+ if (fromSearch) {
99
+ this.paginationData.current = 1;
100
+ this.accessToNextRequest = true;
101
+ }
102
+ const functionToDo = this.selectConfig.paginate(this.paginationData.current, searchText);
103
+ this.requestLoading = true;
104
+ functionToDo?.subscribe((data) => {
105
+ const dataToAdd = ('content' in data) ? data.content : data;
106
+ if ('content' in data) {
107
+ this.accessToNextRequest = !data.last || (data.totalPages > this.paginationData.current);
108
+ }
109
+ this.data = (fromSearch || this.selectConfig?.blockPagination) ? dataToAdd : [...this.data, ...dataToAdd];
110
+ this.pending = false;
111
+ this.requestLoading = false;
112
+ if (!dataToAdd.length) {
113
+ this.paginationData.last = this.paginationData.current;
114
+ return;
115
+ }
116
+ this.paginationData.current += 1;
117
+ this.paginationData.last += 1;
118
+ setTimeout(() => {
119
+ this.findAndSetDefaultValueFromData();
120
+ }, 10);
121
+ }, () => {
122
+ this.pending = false;
123
+ this.requestLoading = false;
124
+ });
125
+ }
126
+ findAndSetDefaultValueFromData() {
127
+ if (this.selectConfig.multiple) {
128
+ if (this.ngControl.value && this.ngControl.value.length == 1) {
129
+ this.setShowingValue(this.data.find((item) => item.id === this.ngControl.value[0]));
130
+ }
131
+ }
132
+ else {
133
+ const isDisabled = this.ngControl.disabled;
134
+ if (isDisabled) {
135
+ // TODO Remove after migrating all selects
136
+ // this.ngControl.control.enable();
137
+ // if (!this.ngControl.value && !this.data.length) {
138
+ // this.ngControl.control.disable();
139
+ // return;
140
+ // }
141
+ // this.setDefaultValue();
142
+ // this.ngControl.control.disable();
143
+ }
144
+ else {
145
+ if (!this.ngControl.value && !this.data) {
146
+ return;
147
+ }
148
+ this.setDefaultValue();
149
+ }
150
+ }
151
+ }
152
+ setDefaultValue() {
153
+ this.defaultValue = this.data.find((item) => item.id === this.ngControl.value);
154
+ this.baseData = this.defaultValue;
155
+ if (!this.defaultValue) {
156
+ return;
157
+ }
158
+ this.selectionChange.emit();
159
+ this.setShowingValue(this.defaultValue);
160
+ }
161
+ optionClick(showingData) {
162
+ this.baseData = showingData;
163
+ if (!this.selectConfig.multiple) {
164
+ this.setShowingValue(showingData);
165
+ this.matSelect.close();
166
+ return;
167
+ }
168
+ if (this.searchInput) {
169
+ if (this.selectConfig.multiple) {
170
+ this.searchInput?.nativeElement?.focus();
171
+ }
172
+ else {
173
+ this.inputFocusOut();
174
+ }
175
+ }
176
+ this.setShowingValue(showingData);
177
+ this.showPlaceholder = false;
178
+ }
179
+ addNewItemEvent() {
180
+ this.isNeededForRecall = true;
181
+ this.emitAction.emit();
182
+ }
183
+ setShowingValue(data) {
184
+ if (!data) {
185
+ return;
186
+ }
187
+ // TODO refactor this part fully
188
+ let include = data;
189
+ let includeOptional = data;
190
+ if (this.selectConfig.valueToShowByKey) {
191
+ this.selectConfig.valueToShowByKey.forEach((param) => {
192
+ if (typeof param === 'object') {
193
+ param.forEach((key) => {
194
+ include = (include) ? include[key] : null;
195
+ });
196
+ }
197
+ else {
198
+ include = include[param];
199
+ }
200
+ });
201
+ if (this.selectConfig.showFullTextWithOptionalOnSelectedValue) {
202
+ this.selectConfig.valueToShowByParam?.forEach((param) => {
203
+ if (typeof param === 'object') {
204
+ param.forEach((key) => {
205
+ includeOptional = (includeOptional) ? includeOptional[key] : null;
206
+ });
207
+ }
208
+ else {
209
+ includeOptional = includeOptional[param];
210
+ }
211
+ });
212
+ if (this.selectConfig.valueToShowByParam && typeof includeOptional === 'string') {
213
+ include += (this.selectConfig.withParamSymbol || '') + includeOptional;
214
+ }
215
+ }
216
+ }
217
+ this.showingValue = include;
218
+ this.blockRecallDefaultValueSetter = true;
219
+ }
220
+ preventDefault(event) {
221
+ if (!this.selectConfig.multiple) {
222
+ return;
223
+ }
224
+ event.preventDefault();
225
+ }
226
+ registerPanelScrollEvent(element) {
227
+ if (this.selectConfig.paginateOnScroll === false) {
228
+ return;
229
+ }
230
+ const panel = element.panel.nativeElement;
231
+ panel.addEventListener('scroll', (event) => this.loadDataOnScroll(event));
232
+ }
233
+ loadDataOnScroll(event) {
234
+ const pos = (event.target.scrollTop || event.target.scrollTop) + event.target.offsetHeight;
235
+ const max = event.target.scrollHeight;
236
+ if ((pos + 1) >= max) {
237
+ if (this.paginationData.current === this.paginationData.last || this.selectConfig.blockPagination) {
238
+ return;
239
+ }
240
+ this.getData();
241
+ }
242
+ }
243
+ focusSearchInput() {
244
+ if (this.selectConfig.search && this.searchInput) {
245
+ this.searchInput.nativeElement.focus();
246
+ }
247
+ }
248
+ inputFocusOut() {
249
+ this.isNeededForRecall = !!this.searchInput.nativeElement.value;
250
+ this.searchInput.nativeElement.value = '';
251
+ this.showPlaceholder = true;
252
+ this.clearTimeoutForSearch();
253
+ }
254
+ resetValue() {
255
+ this.selectionChange.emit(null);
256
+ this.ngControl.reset(null);
257
+ this.inputFocusOut();
258
+ }
259
+ getDataWithSearch(value, event) {
260
+ this.clearTimeoutForSearch();
261
+ if (value.length >= 1) {
262
+ this.searchTimeoutId = setTimeout(() => {
263
+ this.getData(value, true);
264
+ }, 800);
265
+ }
266
+ else if (value.length <= 1 && event.keyCode === 8) {
267
+ this.getData(value, true);
268
+ }
269
+ }
270
+ clearTimeoutForSearch() {
271
+ if (this.searchTimeoutId) {
272
+ clearTimeout(this.searchTimeoutId);
273
+ this.searchTimeoutId = 0;
274
+ }
275
+ }
276
+ openSelection() {
277
+ if (this.selectConfig.disabled || this.ngControl.control.disabled) {
278
+ return;
279
+ }
280
+ this.showPlaceholder ? this.matSelect.open() : this.closePanelAndUnsetFocus();
281
+ this.showPlaceholder = !this.showPlaceholder;
282
+ if (!this.showPlaceholder) {
283
+ this.reCallData();
284
+ }
285
+ }
286
+ closePanelAndUnsetFocus() {
287
+ this.matSelect.close();
288
+ if (this.searchInput) {
289
+ this.searchInput.nativeElement.blur();
290
+ }
291
+ }
292
+ openedChange(event) {
293
+ if (event) {
294
+ if (this.isNeededForRecall) {
295
+ this.reCallData();
296
+ return;
297
+ }
298
+ if (!this.selectConfig.search) {
299
+ this.pending = false;
300
+ this.reCallData();
301
+ }
302
+ return;
303
+ }
304
+ this.showPlaceholder = true;
305
+ }
306
+ reCallData() {
307
+ // TODO refactor this part
308
+ if (!this.isNeededForRecall) {
309
+ return;
310
+ }
311
+ this.data = [];
312
+ this.pending = true;
313
+ this.paginationData = {
314
+ current: 1,
315
+ last: 0
316
+ };
317
+ this.accessToNextRequest = true;
318
+ if ((typeof this.selectConfig.paginate) === 'function') {
319
+ this.getData();
320
+ }
321
+ else {
322
+ this.pending = false;
323
+ this.data = this.selectConfig.paginate;
324
+ }
325
+ this.isNeededForRecall = false;
326
+ }
327
+ emitSelectionChangeAndClose(event) {
328
+ this.selectionChange.emit(event.value);
329
+ if (this.selectConfig.multiple) {
330
+ if (!event.value?.length) {
331
+ this.ngControl.control.reset();
332
+ }
333
+ return;
334
+ }
335
+ this.matSelect.close();
336
+ }
337
+ iconClick(matSelect, searchInput) {
338
+ matSelect.open();
339
+ searchInput?.nativeElement?.focus();
340
+ }
341
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteSelectComponent, deps: [{ token: i1.InputService }], target: i0.ɵɵFactoryTarget.Component }); }
342
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AutocompleteSelectComponent, isStandalone: true, selector: "i-tech-autocomplete-select", inputs: { className: "className", submitValue: "submitValue", configs: "configs", detectChanges: "detectChanges" }, outputs: { selectionChange: "selectionChange", emitAction: "emitAction" }, host: { listeners: { "document:visibilitychange": "handleVisibilityChange()" } }, viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "allSelected", first: true, predicate: ["allSelected"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"new-mat-autocomplete\" id=\"mat_autocomplete\"\r\n [ngClass]=\"{\r\n 'mat-select-without_icon': !selectConfig.iconUrl && !selectConfig.activeStateIconUrl,\r\n 'mat-select-with-search': selectConfig.search,\r\n 'without-label': selectConfig.hideLabel,\r\n 'invalid_field': ngControl.control.errors && submitValue,\r\n 'readonly-field': selectConfig.readOnly || ngControl.control.disabled\r\n }\"\r\n [matTooltip]=\"(selectConfig.hover && !ngControl.control.disabled ? ((selectConfig.hover || '') | translate) : '')\"\r\n [matTooltipClass]=\"'mat-mdc-tooltip big-td-mat-tooltip'\"\r\n [matTooltipPosition]=\"'above'\"\r\n *ngIf=\"selectConfig && ngControl\">\r\n\r\n <div class=\"w-100\" *ngIf=\"!selectConfig.hideLabel\">\r\n <mat-label [ngClass]=\"{'readonly-color' : selectConfig.readOnly || ngControl.control.disabled}\">\r\n {{ selectConfig.label | translate }}\r\n </mat-label>\r\n <span *ngIf=\"selectConfig.required\" class=\"required-input\" [ngClass]=\"{'readonly-color' : ngControl.control.disabled}\">*</span>\r\n </div>\r\n\r\n\r\n <!-- Search Input -->\r\n <div class=\"search-input w-100\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault()\"\r\n [ngClass]=\"{ hide_input_placeholder: showPlaceholder || ngControl.control.disabled }\"\r\n *ngIf=\"selectConfig.search\"\r\n >\r\n <input autocomplete=\"off\"\r\n id=\"searchInput\"\r\n type=\"text\"\r\n [ngClass]=\"{'pr-25': !selectConfig.iconUrl}\"\r\n #searchInput\r\n [disabled]=\"ngControl.control.disabled || selectConfig.hover\"\r\n [placeholder]=\"(ngControl.control.disabled || selectConfig.hover) ? '' : 'Search'\"\r\n (focusout)=\"inputFocusOut()\"\r\n (focus)=\"openSelection()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (keyup)=\"getDataWithSearch(searchInput.value,$event)\">\r\n\r\n <!-- Search Icon -->\r\n <span class=\"search-icon\">\r\n <i-tech-icon-button\r\n class=\"mr-10\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n *ngIf=\"selectConfig.iconPrefix && !showPlaceholder\"\r\n [iconName]=\"selectConfig.iconPrefix || ''\"\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n matPrefix\r\n >\r\n </i-tech-icon-button>\r\n </span>\r\n </div>\r\n\r\n <!-- Placeholder/Selected Value Display -->\r\n <ng-container *ngIf=\"showPlaceholder && selectConfig.search\">\r\n <div class=\"custom-placeholder\"\r\n *ngIf=\"(!ngControl?.value && !ngControl?.value?.length) ||\r\n (selectConfig.multiple && ngControl?.value && !ngControl?.value?.length)\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n >\r\n {{ ((selectConfig.placeholder || '') | translate) }}\r\n </div>\r\n <div class=\"custom-placeholder custom-value ellipsis\"\r\n [ngClass]=\"{\r\n 'pr-42': selectConfig.iconUrl,\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n *ngIf=\"ngControl?.value\"\r\n >\r\n {{ selectConfig?.multiple ? (ngControl.value | arrayToString) : showingValue }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Custom Icon -->\r\n <img class=\"left_icon_new pointer\"\r\n (click)=\"iconClick(matSelect, searchInput)\"\r\n *ngIf=\"!selectConfig.matIconName && (selectConfig.iconUrl || selectConfig.activeStateIconUrl)\"\r\n [src]=\"'assets/images/icons/global/' + (ngControl.control?.value && selectConfig?.activeStateIconUrl ? selectConfig.activeStateIconUrl : selectConfig.iconUrl)\">\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\" (click)=\"selectConfig?.search ? focusSearchInput() : null\">\r\n <!-- Material Select -->\r\n <mat-select #matSelect=\"matSelect\"\r\n [panelClass]=\"'autocomplete-transform-panel-location'\"\r\n [attr.aria-placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [aria-label]=\"selectConfig.label | translate\"\r\n [id]=\"selectConfig.filtrationKey || ''\"\r\n (opened)=\"registerPanelScrollEvent(matSelect)\"\r\n (openedChange)=\"openedChange($event)\"\r\n [formControl]=\"ngControl.control\"\r\n [multiple]=\"selectConfig.multiple\"\r\n (selectionChange)=\"emitSelectionChangeAndClose($event)\"\r\n [errorStateMatcher]=\"customErrorStateMatcher\"\r\n [placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [disabled]=\"ngControl.control.disabled\"\r\n >\r\n\r\n <!-- Loading State -->\r\n <mat-option *ngIf=\"pending\" class=\"option_loading relative\">\r\n <div class=\"request_loading\">\r\n <img ngSrc=\"./loader.svg\" alt=\"\" height=\"200\" width=\"200\"/>\r\n </div>\r\n </mat-option>\r\n\r\n <!-- Options -->\r\n <ng-container *ngIf=\"data?.length && !pending\">\r\n <!-- Add New Option -->\r\n <mat-option *ngIf=\"selectConfig.actions\"\r\n class=\"pointer add_new\"\r\n disabled\r\n (click)=\"closePanelAndUnsetFocus();addNewItemEvent()\">\r\n<!-- (click)=\"ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus();addNewItemEvent()\">-->\r\n <i-tech-button\r\n [type]=\"ButtonType.OUTLINE\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \"\r\n [customClass]=\"'w-100 mat-autocomplete-select-button'\">\r\n </i-tech-button>\r\n </mat-option>\r\n\r\n <!-- Regular Options -->\r\n <ng-container *ngIf=\"!selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\">\r\n {{ ((selectConfig.valueToShowByKey | getValueByKeyFromObject : item : selectConfig.valueToShowByParam : selectConfig.withParamSymbol) || '') | translate }}\r\n </mat-option>\r\n </ng-container>\r\n\r\n <!-- Custom Text Options -->\r\n <ng-container *ngIf=\"selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\"\r\n [disabled]=\"selectConfig?.changeText[item].disabled\">\r\n {{ selectConfig?.changeText[item].text | translate }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Empty State -->\r\n <ng-container *ngIf=\"!pending && !data.length\">\r\n <mat-option disabled class=\"empty_selection_state\">\r\n <div class=\"actions_and_tile add_new flex_column w-100 flex_center_align_center\">\r\n <span>{{ 'dropdown_no_items' | translate }}</span>\r\n <div class=\"mt-10\">\r\n <i-tech-button\r\n *ngIf=\"selectConfig?.actions\"\r\n [type]=\"ButtonType.OUTLINE\"\r\n (buttonClick)=\"closePanelAndUnsetFocus();addNewItemEvent()\"\r\n [customClass]=\"'mat-autocomplete-select-button'\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \">\r\n </i-tech-button>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-icon *ngIf=\"selectConfig.iconPrefix\"\r\n matPrefix\r\n [ngClass]=\"{\r\n 'readonly-color' : !selectConfig['iconPrefixColor'] && (selectConfig.readOnly || ngControl.control.disabled),\r\n 'default-form-icon-color' : !selectConfig['iconPrefixColor'] && !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n >{{ selectConfig.iconPrefix }}\r\n </mat-icon>\r\n\r\n <mat-icon *ngIf=\"selectConfig['iconPrefixSvg']\"\r\n matPrefix\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n [svgIcon]=\"selectConfig['iconPrefixSvg'] || ''\"\r\n ></mat-icon>\r\n\r\n <i-tech-icon-button\r\n *ngIf=\"selectConfig.search && selectConfig.clearable && !ngControl.control.disabled && !!ngControl.control.value\"\r\n iconName=\"cancel\"\r\n matSuffix\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault();ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus()\"\r\n >\r\n </i-tech-icon-button>\r\n <mat-icon\r\n matSuffix\r\n class=\"select-arrow\"\r\n [class.open]=\"matSelect.panelOpen\"\r\n [ngClass]=\"{\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled),\r\n 'mt-8': !!ngControl.control.value && selectConfig.clearable\r\n }\"\r\n >\r\n keyboard_arrow_down\r\n </mat-icon>\r\n <!-- Error Message -->\r\n <mat-error *ngIf=\"!!(ngControl.control.errors && submitValue)\">\r\n {{ ngControl.control | generateErrorMessages : selectConfig.label : selectConfig.defaultPatternKey}}\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- Reset Button -->\r\n <i-tech-clear-value *ngIf=\"selectConfig.reset\" (reset)=\"resetValue()\"></i-tech-clear-value>\r\n</div>\r\n", styles: [".left_icon_new{position:absolute;right:2px;top:1px}::ng-deep .request_loading{width:40px;height:40px;background-color:#fff!important}::ng-deep .request_loading:hover{background-color:var(--primary99)!important}::ng-deep .request_loading:focus{background-color:var(--primary99)!important}::ng-deep .request_loading img{position:absolute;left:50%;top:50%;width:100%;height:100%;transform:translate(-50%,-50%)}::ng-deep .mat-mdc-option.add_new{opacity:1!important;pointer-events:auto!important}::ng-deep .mat-mdc-option.add_new .mat-pseudo-checkbox{display:none!important}::ng-deep .mat-mdc-option.add_new .mdc-list-item__primary-text{display:inline-block!important;width:100%!important}::ng-deep .mat-mdc-option.add_new span{color:unset!important;font-size:unset!important;margin:unset!important;opacity:1!important}@media (min-width: 1920px) and (max-width: 2500px){.mat-autocomplete{height:90px!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: IconButtonComponent, selector: "i-tech-icon-button", inputs: ["size", "type", "iconSvg", "iconName", "tooltip", "disabled"], outputs: ["buttonClick"] }, { kind: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: ButtonComponent, selector: "i-tech-button", inputs: ["text", "data_cy", "fontIcon", "svgIcon", "type", "customClass", "submit", "disabled", "activated", "color"], outputs: ["buttonClick"] }, { kind: "pipe", type: GetValueByKeyFromObjectPipe, name: "getValueByKeyFromObject" }, { kind: "pipe", type: ArrayToStringPipe, name: "arrayToString" }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: GenerateErrorMessagesPipe, name: "generateErrorMessages" }, { kind: "component", type: ClearValueComponent, selector: "i-tech-clear-value", inputs: ["className", "additionalClass"], outputs: ["reset"] }] }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteSelectComponent, decorators: [{
345
+ type: Component,
346
+ args: [{ selector: 'i-tech-autocomplete-select', imports: [
347
+ NgClass,
348
+ MatTooltip,
349
+ NgIf,
350
+ TranslateModule,
351
+ MatLabel,
352
+ IconButtonComponent,
353
+ MatPrefix,
354
+ MatFormField,
355
+ MatSelect,
356
+ ReactiveFormsModule,
357
+ MatOption,
358
+ MatError,
359
+ ButtonComponent,
360
+ GetValueByKeyFromObjectPipe,
361
+ ArrayToStringPipe,
362
+ NgOptimizedImage,
363
+ MatIcon,
364
+ GenerateErrorMessagesPipe,
365
+ ClearValueComponent
366
+ ], standalone: true, template: "<div class=\"new-mat-autocomplete\" id=\"mat_autocomplete\"\r\n [ngClass]=\"{\r\n 'mat-select-without_icon': !selectConfig.iconUrl && !selectConfig.activeStateIconUrl,\r\n 'mat-select-with-search': selectConfig.search,\r\n 'without-label': selectConfig.hideLabel,\r\n 'invalid_field': ngControl.control.errors && submitValue,\r\n 'readonly-field': selectConfig.readOnly || ngControl.control.disabled\r\n }\"\r\n [matTooltip]=\"(selectConfig.hover && !ngControl.control.disabled ? ((selectConfig.hover || '') | translate) : '')\"\r\n [matTooltipClass]=\"'mat-mdc-tooltip big-td-mat-tooltip'\"\r\n [matTooltipPosition]=\"'above'\"\r\n *ngIf=\"selectConfig && ngControl\">\r\n\r\n <div class=\"w-100\" *ngIf=\"!selectConfig.hideLabel\">\r\n <mat-label [ngClass]=\"{'readonly-color' : selectConfig.readOnly || ngControl.control.disabled}\">\r\n {{ selectConfig.label | translate }}\r\n </mat-label>\r\n <span *ngIf=\"selectConfig.required\" class=\"required-input\" [ngClass]=\"{'readonly-color' : ngControl.control.disabled}\">*</span>\r\n </div>\r\n\r\n\r\n <!-- Search Input -->\r\n <div class=\"search-input w-100\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault()\"\r\n [ngClass]=\"{ hide_input_placeholder: showPlaceholder || ngControl.control.disabled }\"\r\n *ngIf=\"selectConfig.search\"\r\n >\r\n <input autocomplete=\"off\"\r\n id=\"searchInput\"\r\n type=\"text\"\r\n [ngClass]=\"{'pr-25': !selectConfig.iconUrl}\"\r\n #searchInput\r\n [disabled]=\"ngControl.control.disabled || selectConfig.hover\"\r\n [placeholder]=\"(ngControl.control.disabled || selectConfig.hover) ? '' : 'Search'\"\r\n (focusout)=\"inputFocusOut()\"\r\n (focus)=\"openSelection()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (keyup)=\"getDataWithSearch(searchInput.value,$event)\">\r\n\r\n <!-- Search Icon -->\r\n <span class=\"search-icon\">\r\n <i-tech-icon-button\r\n class=\"mr-10\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n *ngIf=\"selectConfig.iconPrefix && !showPlaceholder\"\r\n [iconName]=\"selectConfig.iconPrefix || ''\"\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n matPrefix\r\n >\r\n </i-tech-icon-button>\r\n </span>\r\n </div>\r\n\r\n <!-- Placeholder/Selected Value Display -->\r\n <ng-container *ngIf=\"showPlaceholder && selectConfig.search\">\r\n <div class=\"custom-placeholder\"\r\n *ngIf=\"(!ngControl?.value && !ngControl?.value?.length) ||\r\n (selectConfig.multiple && ngControl?.value && !ngControl?.value?.length)\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n >\r\n {{ ((selectConfig.placeholder || '') | translate) }}\r\n </div>\r\n <div class=\"custom-placeholder custom-value ellipsis\"\r\n [ngClass]=\"{\r\n 'pr-42': selectConfig.iconUrl,\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n *ngIf=\"ngControl?.value\"\r\n >\r\n {{ selectConfig?.multiple ? (ngControl.value | arrayToString) : showingValue }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Custom Icon -->\r\n <img class=\"left_icon_new pointer\"\r\n (click)=\"iconClick(matSelect, searchInput)\"\r\n *ngIf=\"!selectConfig.matIconName && (selectConfig.iconUrl || selectConfig.activeStateIconUrl)\"\r\n [src]=\"'assets/images/icons/global/' + (ngControl.control?.value && selectConfig?.activeStateIconUrl ? selectConfig.activeStateIconUrl : selectConfig.iconUrl)\">\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\" (click)=\"selectConfig?.search ? focusSearchInput() : null\">\r\n <!-- Material Select -->\r\n <mat-select #matSelect=\"matSelect\"\r\n [panelClass]=\"'autocomplete-transform-panel-location'\"\r\n [attr.aria-placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [aria-label]=\"selectConfig.label | translate\"\r\n [id]=\"selectConfig.filtrationKey || ''\"\r\n (opened)=\"registerPanelScrollEvent(matSelect)\"\r\n (openedChange)=\"openedChange($event)\"\r\n [formControl]=\"ngControl.control\"\r\n [multiple]=\"selectConfig.multiple\"\r\n (selectionChange)=\"emitSelectionChangeAndClose($event)\"\r\n [errorStateMatcher]=\"customErrorStateMatcher\"\r\n [placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [disabled]=\"ngControl.control.disabled\"\r\n >\r\n\r\n <!-- Loading State -->\r\n <mat-option *ngIf=\"pending\" class=\"option_loading relative\">\r\n <div class=\"request_loading\">\r\n <img ngSrc=\"./loader.svg\" alt=\"\" height=\"200\" width=\"200\"/>\r\n </div>\r\n </mat-option>\r\n\r\n <!-- Options -->\r\n <ng-container *ngIf=\"data?.length && !pending\">\r\n <!-- Add New Option -->\r\n <mat-option *ngIf=\"selectConfig.actions\"\r\n class=\"pointer add_new\"\r\n disabled\r\n (click)=\"closePanelAndUnsetFocus();addNewItemEvent()\">\r\n<!-- (click)=\"ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus();addNewItemEvent()\">-->\r\n <i-tech-button\r\n [type]=\"ButtonType.OUTLINE\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \"\r\n [customClass]=\"'w-100 mat-autocomplete-select-button'\">\r\n </i-tech-button>\r\n </mat-option>\r\n\r\n <!-- Regular Options -->\r\n <ng-container *ngIf=\"!selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\">\r\n {{ ((selectConfig.valueToShowByKey | getValueByKeyFromObject : item : selectConfig.valueToShowByParam : selectConfig.withParamSymbol) || '') | translate }}\r\n </mat-option>\r\n </ng-container>\r\n\r\n <!-- Custom Text Options -->\r\n <ng-container *ngIf=\"selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\"\r\n [disabled]=\"selectConfig?.changeText[item].disabled\">\r\n {{ selectConfig?.changeText[item].text | translate }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Empty State -->\r\n <ng-container *ngIf=\"!pending && !data.length\">\r\n <mat-option disabled class=\"empty_selection_state\">\r\n <div class=\"actions_and_tile add_new flex_column w-100 flex_center_align_center\">\r\n <span>{{ 'dropdown_no_items' | translate }}</span>\r\n <div class=\"mt-10\">\r\n <i-tech-button\r\n *ngIf=\"selectConfig?.actions\"\r\n [type]=\"ButtonType.OUTLINE\"\r\n (buttonClick)=\"closePanelAndUnsetFocus();addNewItemEvent()\"\r\n [customClass]=\"'mat-autocomplete-select-button'\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \">\r\n </i-tech-button>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-icon *ngIf=\"selectConfig.iconPrefix\"\r\n matPrefix\r\n [ngClass]=\"{\r\n 'readonly-color' : !selectConfig['iconPrefixColor'] && (selectConfig.readOnly || ngControl.control.disabled),\r\n 'default-form-icon-color' : !selectConfig['iconPrefixColor'] && !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n >{{ selectConfig.iconPrefix }}\r\n </mat-icon>\r\n\r\n <mat-icon *ngIf=\"selectConfig['iconPrefixSvg']\"\r\n matPrefix\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n [svgIcon]=\"selectConfig['iconPrefixSvg'] || ''\"\r\n ></mat-icon>\r\n\r\n <i-tech-icon-button\r\n *ngIf=\"selectConfig.search && selectConfig.clearable && !ngControl.control.disabled && !!ngControl.control.value\"\r\n iconName=\"cancel\"\r\n matSuffix\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault();ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus()\"\r\n >\r\n </i-tech-icon-button>\r\n <mat-icon\r\n matSuffix\r\n class=\"select-arrow\"\r\n [class.open]=\"matSelect.panelOpen\"\r\n [ngClass]=\"{\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled),\r\n 'mt-8': !!ngControl.control.value && selectConfig.clearable\r\n }\"\r\n >\r\n keyboard_arrow_down\r\n </mat-icon>\r\n <!-- Error Message -->\r\n <mat-error *ngIf=\"!!(ngControl.control.errors && submitValue)\">\r\n {{ ngControl.control | generateErrorMessages : selectConfig.label : selectConfig.defaultPatternKey}}\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- Reset Button -->\r\n <i-tech-clear-value *ngIf=\"selectConfig.reset\" (reset)=\"resetValue()\"></i-tech-clear-value>\r\n</div>\r\n", styles: [".left_icon_new{position:absolute;right:2px;top:1px}::ng-deep .request_loading{width:40px;height:40px;background-color:#fff!important}::ng-deep .request_loading:hover{background-color:var(--primary99)!important}::ng-deep .request_loading:focus{background-color:var(--primary99)!important}::ng-deep .request_loading img{position:absolute;left:50%;top:50%;width:100%;height:100%;transform:translate(-50%,-50%)}::ng-deep .mat-mdc-option.add_new{opacity:1!important;pointer-events:auto!important}::ng-deep .mat-mdc-option.add_new .mat-pseudo-checkbox{display:none!important}::ng-deep .mat-mdc-option.add_new .mdc-list-item__primary-text{display:inline-block!important;width:100%!important}::ng-deep .mat-mdc-option.add_new span{color:unset!important;font-size:unset!important;margin:unset!important;opacity:1!important}@media (min-width: 1920px) and (max-width: 2500px){.mat-autocomplete{height:90px!important}}\n"] }]
367
+ }], ctorParameters: () => [{ type: i1.InputService }], propDecorators: { matSelect: [{
368
+ type: ViewChild,
369
+ args: ['matSelect']
370
+ }], searchInput: [{
371
+ type: ViewChild,
372
+ args: ['searchInput']
373
+ }], className: [{
374
+ type: Input
375
+ }], submitValue: [{
376
+ type: Input
377
+ }], configs: [{
378
+ type: Input
379
+ }], detectChanges: [{
380
+ type: Input
381
+ }], selectionChange: [{
382
+ type: Output
383
+ }], emitAction: [{
384
+ type: Output
385
+ }], allSelected: [{
386
+ type: ViewChild,
387
+ args: ['allSelected']
388
+ }], handleVisibilityChange: [{
389
+ type: HostListener,
390
+ args: ['document:visibilitychange']
391
+ }] } });
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlLXNlbGVjdC9hdXRvY29tcGxldGUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9hdXRvY29tcGxldGUtc2VsZWN0L2F1dG9jb21wbGV0ZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR0EsWUFBWSxFQUMzQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRWpHLE9BQU8sRUFBa0IsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUMxRixP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ZUFBZTt3QkFDZiwyQkFBMkI7d0JBQzNCLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLHlCQUF5Qjt3QkFDekIsbUJBQW1CO3FCQUNwQixjQUNXLElBQUk7aUZBR1UsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNJLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDZixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ08sT0FBTztzQkFBbkIsS0FBSztnQkFtQkcsYUFBYTtzQkFBckIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ21CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFxQnhCLHNCQUFzQjtzQkFEckIsWUFBWTt1QkFBQywyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBBZnRlclZpZXdJbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCwgTWF0T3B0aW9uLCBNYXRQcmVmaXgsIE1hdFNlbGVjdH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NlbGVjdFwiO1xyXG5pbXBvcnQge0F1dG9jb21wbGV0ZUNvbmZpZ3NJbnRlcmZhY2V9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2F1dG9jb21wbGV0ZS1jb25maWdzLmludGVyZmFjZVwiO1xyXG5pbXBvcnQge0Zvcm1Db250cm9sTmFtZSwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IElucHV0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2lucHV0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCdXR0b25UeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9idXR0b24tdHlwZXMuZW51bSc7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdJZiwgTmdPcHRpbWl6ZWRJbWFnZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdFRvb2x0aXB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge0ljb25CdXR0b25Db21wb25lbnR9IGZyb20gXCIuLi9pY29uLWJ1dHRvbi9pY29uLWJ1dHRvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtCdXR0b25Db21wb25lbnR9IGZyb20gXCIuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0dldFZhbHVlQnlLZXlGcm9tT2JqZWN0UGlwZX0gZnJvbSBcIi4uLy4uL3BpcGVzL2dldC12YWx1ZS1ieS1rZXktZnJvbS1vYmplY3QucGlwZVwiO1xyXG5pbXBvcnQge0FycmF5VG9TdHJpbmdQaXBlfSBmcm9tIFwiLi4vLi4vcGlwZXMvYXJyYXktdG8tc3RyaW5nLnBpcGVcIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge0dlbmVyYXRlRXJyb3JNZXNzYWdlc1BpcGV9IGZyb20gXCIuLi8uLi9waXBlcy9nZW5lcmF0ZS1lcnJvci1tZXNzYWdlcy5waXBlXCI7XHJcbmltcG9ydCB7Q2xlYXJWYWx1ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NsZWFyLXZhbHVlL2NsZWFyLXZhbHVlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge01hdEVycm9yfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpLXRlY2gtYXV0b2NvbXBsZXRlLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2F1dG9jb21wbGV0ZS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBOZ0NsYXNzLFxyXG4gICAgTWF0VG9vbHRpcCxcclxuICAgIE5nSWYsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBNYXRMYWJlbCxcclxuICAgIEljb25CdXR0b25Db21wb25lbnQsXHJcbiAgICBNYXRQcmVmaXgsXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXRTZWxlY3QsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0T3B0aW9uLFxyXG4gICAgTWF0RXJyb3IsXHJcbiAgICBCdXR0b25Db21wb25lbnQsXHJcbiAgICBHZXRWYWx1ZUJ5S2V5RnJvbU9iamVjdFBpcGUsXHJcbiAgICBBcnJheVRvU3RyaW5nUGlwZSxcclxuICAgIE5nT3B0aW1pemVkSW1hZ2UsXHJcbiAgICBNYXRJY29uLFxyXG4gICAgR2VuZXJhdGVFcnJvck1lc3NhZ2VzUGlwZSxcclxuICAgIENsZWFyVmFsdWVDb21wb25lbnRcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICBAVmlld0NoaWxkKCdtYXRTZWxlY3QnKSBtYXRTZWxlY3QhOiBNYXRTZWxlY3Q7XHJcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHNlYXJjaElucHV0ITogRWxlbWVudFJlZjtcclxuICAgIEBJbnB1dCgpIGNsYXNzTmFtZSE6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHN1Ym1pdFZhbHVlITogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHNldCBjb25maWdzKGRhdGE6IEF1dG9jb21wbGV0ZUNvbmZpZ3NJbnRlcmZhY2UpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdENvbmZpZyA9IGRhdGE7XHJcbiAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgodHlwZW9mIHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdFJlcXVlc3QpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5maXJzdFJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlO1xyXG4gICAgICAgIHRoaXMuZmluZEFuZFNldERlZmF1bHRWYWx1ZUZyb21EYXRhKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIGRldGVjdENoYW5nZXMhOiBib29sZWFuO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGVtaXRBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBWaWV3Q2hpbGQoJ2FsbFNlbGVjdGVkJykgYWxsU2VsZWN0ZWQhOiBNYXRTZWxlY3Q7XHJcbiAgICBwZW5kaW5nID0gZmFsc2U7XHJcbiAgICBkZWZhdWx0VmFsdWUhOiBhbnk7XHJcbiAgICBkYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBwYWdpbmF0aW9uRGF0YTogYW55ID0ge2N1cnJlbnQ6IDEsIGxhc3Q6IDB9O1xyXG4gICAgbmdDb250cm9sOiBGb3JtQ29udHJvbE5hbWU7XHJcbiAgICBzZWxlY3RDb25maWchOiBBdXRvY29tcGxldGVDb25maWdzSW50ZXJmYWNlO1xyXG4gICAgZmlyc3RSZXF1ZXN0ID0gZmFsc2U7XHJcbiAgICBzaG93UGxhY2Vob2xkZXIgPSB0cnVlO1xyXG4gICAgaXNOZWVkZWRGb3JSZWNhbGwgPSBmYWxzZTtcclxuICAgIHNob3dpbmdWYWx1ZTogYW55O1xyXG4gICAgc2VhcmNoVGltZW91dElkOiBhbnk7XHJcbiAgICB0YWJWaXNpYmlsaXR5ITogYm9vbGVhbjtcclxuICAgIGFjY2Vzc1RvTmV4dFJlcXVlc3QgPSB0cnVlO1xyXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIGJsb2NrUmVjYWxsRGVmYXVsdFZhbHVlU2V0dGVyID0gZmFsc2U7XHJcbiAgICBiYXNlRGF0YTogYW55O1xyXG4gICAgcmVxdWVzdExvYWRpbmcgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBCdXR0b25UeXBlID0gQnV0dG9uVHlwZTtcclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp2aXNpYmlsaXR5Y2hhbmdlJylcclxuICAgIGhhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50YWJWaXNpYmlsaXR5ID0gIWRvY3VtZW50LmhpZGRlbjtcclxuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWx1ZSkgeyByZXR1cm47fVxyXG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbEFuZFVuc2V0Rm9jdXMoKTtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbikge1xyXG4gICAgICAgICAgICB0aGlzLmlzTmVlZGVkRm9yUmVjYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9LCA0MDAwKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlucHV0U2VydmljZTogSW5wdXRTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmlucHV0U2VydmljZS5pbmplY3ROZ0NvbnRyb2woKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdENvbmZpZyddICYmIHRoaXMuc2VsZWN0Q29uZmlnKSB7XHJcbiAgICAgICAgICAgIGlmICgodHlwZW9mIHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggJiYgcmVzICYmICF0aGlzLmJsb2NrUmVjYWxsRGVmYXVsdFZhbHVlU2V0dGVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXREZWZhdWx0VmFsdWVGcm9tRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBoYXJkUmVsb2FkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgnJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YShzZWFyY2hUZXh0Pzogc3RyaW5nLCBmcm9tU2VhcmNoPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICghZnJvbVNlYXJjaCAmJiAhdGhpcy5hY2Nlc3NUb05leHRSZXF1ZXN0KSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0TG9hZGluZykgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKGZyb21TZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YS5jdXJyZW50ID0gMTtcclxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb05leHRSZXF1ZXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uVG9EbyA9IHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlKHRoaXMucGFnaW5hdGlvbkRhdGEuY3VycmVudCwgc2VhcmNoVGV4dCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVxdWVzdExvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGZ1bmN0aW9uVG9Ebz8uc3Vic2NyaWJlKChkYXRhOiBBcnJheTxhbnk+IHwgYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUb0FkZCA9ICgnY29udGVudCcgaW4gZGF0YSkgPyBkYXRhLmNvbnRlbnQgOiBkYXRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKCdjb250ZW50JyBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzc1RvTmV4dFJlcXVlc3QgPSAhZGF0YS5sYXN0IHx8IChkYXRhLnRvdGFsUGFnZXMgPiB0aGlzLnBhZ2luYXRpb25EYXRhLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSAoZnJvbVNlYXJjaCB8fCB0aGlzLnNlbGVjdENvbmZpZz8uYmxvY2tQYWdpbmF0aW9uKSA/IGRhdGFUb0FkZCA6IFsuLi50aGlzLmRhdGEsIC4uLmRhdGFUb0FkZF07XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWRhdGFUb0FkZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEubGFzdCA9IHRoaXMucGFnaW5hdGlvbkRhdGEuY3VycmVudDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YS5jdXJyZW50ICs9IDE7XHJcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEubGFzdCArPSAxO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmluZEFuZFNldERlZmF1bHRWYWx1ZUZyb21EYXRhKCk7XHJcbiAgICAgICAgICAgIH0sMTApXHJcbiAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZmluZEFuZFNldERlZmF1bHRWYWx1ZUZyb21EYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdENvbmZpZy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wudmFsdWUgJiYgdGhpcy5uZ0NvbnRyb2wudmFsdWUubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2hvd2luZ1ZhbHVlKHRoaXMuZGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLm5nQ29udHJvbC52YWx1ZVswXSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQ7XHJcbiAgICAgICAgICAgIGlmIChpc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPIFJlbW92ZSBhZnRlciBtaWdyYXRpbmcgYWxsIHNlbGVjdHNcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoIXRoaXMubmdDb250cm9sLnZhbHVlICYmICF0aGlzLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC52YWx1ZSAmJiAhdGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGVmYXVsdFZhbHVlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMubmdDb250cm9sLnZhbHVlKTtcclxuICAgICAgICB0aGlzLmJhc2VEYXRhID0gdGhpcy5kZWZhdWx0VmFsdWVcclxuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFZhbHVlKSB7IHJldHVybjt9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCgpXHJcbiAgICAgICAgdGhpcy5zZXRTaG93aW5nVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wdGlvbkNsaWNrKHNob3dpbmdEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJhc2VEYXRhID0gc2hvd2luZ0RhdGFcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0Q29uZmlnLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd2luZ1ZhbHVlKHNob3dpbmdEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5tYXRTZWxlY3QuY2xvc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGb2N1c091dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFNob3dpbmdWYWx1ZShzaG93aW5nRGF0YSk7XHJcbiAgICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhZGROZXdJdGVtRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc05lZWRlZEZvclJlY2FsbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lbWl0QWN0aW9uLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTaG93aW5nVmFsdWUoZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyByZWZhY3RvciB0aGlzIHBhcnQgZnVsbHlcclxuICAgICAgICBsZXQgaW5jbHVkZSA9IGRhdGE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVPcHRpb25hbCA9IGRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdENvbmZpZy52YWx1ZVRvU2hvd0J5S2V5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q29uZmlnLnZhbHVlVG9TaG93QnlLZXkuZm9yRWFjaCgocGFyYW06IEFycmF5PHN0cmluZyB8IG51bWJlcj4gfCBzdHJpbmcpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtLmZvckVhY2goKGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSAoaW5jbHVkZSkgPyBpbmNsdWRlW2tleV0gOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBpbmNsdWRlW3BhcmFtXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLnNob3dGdWxsVGV4dFdpdGhPcHRpb25hbE9uU2VsZWN0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb25maWcudmFsdWVUb1Nob3dCeVBhcmFtPy5mb3JFYWNoKChwYXJhbTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5mb3JFYWNoKChrZXk6IHN0cmluZyB8IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZU9wdGlvbmFsID0gKGluY2x1ZGVPcHRpb25hbCkgPyBpbmNsdWRlT3B0aW9uYWxba2V5XSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZU9wdGlvbmFsID0gaW5jbHVkZU9wdGlvbmFsW3BhcmFtXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLnZhbHVlVG9TaG93QnlQYXJhbSAmJiB0eXBlb2YgaW5jbHVkZU9wdGlvbmFsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgKz0gKHRoaXMuc2VsZWN0Q29uZmlnLndpdGhQYXJhbVN5bWJvbCB8fCAnJykgKyBpbmNsdWRlT3B0aW9uYWxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zaG93aW5nVmFsdWUgPSBpbmNsdWRlO1xyXG4gICAgICAgIHRoaXMuYmxvY2tSZWNhbGxEZWZhdWx0VmFsdWVTZXR0ZXIgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXZlbnREZWZhdWx0KGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0Q29uZmlnLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyUGFuZWxTY3JvbGxFdmVudChlbGVtZW50OiBNYXRTZWxlY3QpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcucGFnaW5hdGVPblNjcm9sbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFuZWwgPSBlbGVtZW50LnBhbmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgcGFuZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKGV2ZW50OiBhbnkpID0+IHRoaXMubG9hZERhdGFPblNjcm9sbChldmVudCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWREYXRhT25TY3JvbGwoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBvcyA9IChldmVudC50YXJnZXQuc2Nyb2xsVG9wIHx8IGV2ZW50LnRhcmdldC5zY3JvbGxUb3ApICsgZXZlbnQudGFyZ2V0Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBjb25zdCBtYXggPSBldmVudC50YXJnZXQuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgIGlmICgocG9zICsgMSkgPj0gbWF4KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRpb25EYXRhLmN1cnJlbnQgPT09IHRoaXMucGFnaW5hdGlvbkRhdGEubGFzdCB8fCB0aGlzLnNlbGVjdENvbmZpZy5ibG9ja1BhZ2luYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXNTZWFyY2hJbnB1dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcuc2VhcmNoICYmIHRoaXMuc2VhcmNoSW5wdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlucHV0Rm9jdXNPdXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc05lZWRlZEZvclJlY2FsbCA9ICEhdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZvclNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0VmFsdWUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5yZXNldChudWxsKTtcclxuICAgICAgICB0aGlzLmlucHV0Rm9jdXNPdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhV2l0aFNlYXJjaCh2YWx1ZTogYW55LCBldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGb3JTZWFyY2goKTtcclxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSh2YWx1ZSwgdHJ1ZSlcclxuICAgICAgICAgICAgfSwgODAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA8PSAxICYmIGV2ZW50LmtleUNvZGUgPT09IDgpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKHZhbHVlLCB0cnVlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhclRpbWVvdXRGb3JTZWFyY2goKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZW91dElkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaFRpbWVvdXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZW91dElkID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3BlblNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcuZGlzYWJsZWQgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyID8gdGhpcy5tYXRTZWxlY3Qub3BlbigpIDogdGhpcy5jbG9zZVBhbmVsQW5kVW5zZXRGb2N1cygpO1xyXG4gICAgICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyID0gIXRoaXMuc2hvd1BsYWNlaG9sZGVyO1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZUNhbGxEYXRhKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VQYW5lbEFuZFVuc2V0Rm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tYXRTZWxlY3QuY2xvc2UoKTtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5lZENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTmVlZGVkRm9yUmVjYWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlQ2FsbERhdGEoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0Q29uZmlnLnNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMucmVDYWxsRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVDYWxsRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBUT0RPIHJlZmFjdG9yIHRoaXMgcGFydFxyXG4gICAgICAgIGlmICghdGhpcy5pc05lZWRlZEZvclJlY2FsbCkgeyByZXR1cm47IH1cclxuICAgICAgICB0aGlzLmRhdGEgPSBbXTtcclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEgPSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQ6IDEsXHJcbiAgICAgICAgICAgIGxhc3Q6IDBcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9OZXh0UmVxdWVzdCA9IHRydWU7XHJcbiAgICAgICAgaWYgKCh0eXBlb2YgdGhpcy5zZWxlY3RDb25maWcucGFnaW5hdGUpID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnNlbGVjdENvbmZpZy5wYWdpbmF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc05lZWRlZEZvclJlY2FsbCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2VBbmRDbG9zZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChldmVudC52YWx1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5yZXNldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tYXRTZWxlY3QuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBpY29uQ2xpY2sobWF0U2VsZWN0OiBNYXRTZWxlY3QsIHNlYXJjaElucHV0PzogRWxlbWVudFJlZik6IHZvaWQge1xyXG4gICAgICAgIG1hdFNlbGVjdC5vcGVuKCk7XHJcbiAgICAgICAgc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3VzdG9tRXJyb3JTdGF0ZU1hdGNoZXIgPSB7XHJcbiAgICAgICAgaXNFcnJvclN0YXRlOiAoY29udHJvbDogYW55LCBmb3JtOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICEhKGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuc3VibWl0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm5ldy1tYXQtYXV0b2NvbXBsZXRlXCIgaWQ9XCJtYXRfYXV0b2NvbXBsZXRlXCJcclxuICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICdtYXQtc2VsZWN0LXdpdGhvdXRfaWNvbic6ICFzZWxlY3RDb25maWcuaWNvblVybCAmJiAhc2VsZWN0Q29uZmlnLmFjdGl2ZVN0YXRlSWNvblVybCxcclxuICAgICAgICAgICAgJ21hdC1zZWxlY3Qtd2l0aC1zZWFyY2gnOiBzZWxlY3RDb25maWcuc2VhcmNoLFxyXG4gICAgICAgICAgICAnd2l0aG91dC1sYWJlbCc6IHNlbGVjdENvbmZpZy5oaWRlTGFiZWwsXHJcbiAgICAgICAgICAgICdpbnZhbGlkX2ZpZWxkJzogbmdDb250cm9sLmNvbnRyb2wuZXJyb3JzICYmIHN1Ym1pdFZhbHVlLFxyXG4gICAgICAgICAgICAncmVhZG9ubHktZmllbGQnOiBzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWRcclxuICAgICAgICAgfVwiXHJcbiAgICAgW21hdFRvb2x0aXBdPVwiKHNlbGVjdENvbmZpZy5ob3ZlciAmJiAhbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQgPyAoKHNlbGVjdENvbmZpZy5ob3ZlciB8fCAnJykgfCB0cmFuc2xhdGUpIDogJycpXCJcclxuICAgICBbbWF0VG9vbHRpcENsYXNzXT1cIidtYXQtbWRjLXRvb2x0aXAgYmlnLXRkLW1hdC10b29sdGlwJ1wiXHJcbiAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcclxuICAgICAqbmdJZj1cInNlbGVjdENvbmZpZyAmJiBuZ0NvbnRyb2xcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIiAqbmdJZj1cIiFzZWxlY3RDb25maWcuaGlkZUxhYmVsXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbCBbbmdDbGFzc109XCJ7J3JlYWRvbmx5LWNvbG9yJyA6IHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZH1cIj5cclxuICAgICAgICAgICAge3sgc2VsZWN0Q29uZmlnLmxhYmVsIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RDb25maWcucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWlucHV0XCIgW25nQ2xhc3NdPVwieydyZWFkb25seS1jb2xvcicgOiBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZH1cIj4qPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDwhLS0gU2VhcmNoIElucHV0IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dCB3LTEwMFwiXHJcbiAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJ7IGhpZGVfaW5wdXRfcGxhY2Vob2xkZXI6IHNob3dQbGFjZWhvbGRlciB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCB9XCJcclxuICAgICAgICAgKm5nSWY9XCJzZWxlY3RDb25maWcuc2VhcmNoXCJcclxuICAgID5cclxuICAgICAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICAgaWQ9XCJzZWFyY2hJbnB1dFwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwci0yNSc6ICFzZWxlY3RDb25maWcuaWNvblVybH1cIlxyXG4gICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkIHx8IHNlbGVjdENvbmZpZy5ob3ZlclwiXHJcbiAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIobmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQgfHwgc2VsZWN0Q29uZmlnLmhvdmVyKSA/ICcnIDogJ1NlYXJjaCdcIlxyXG4gICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwiaW5wdXRGb2N1c091dCgpXCJcclxuICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9wZW5TZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgIChrZXl1cCk9XCJnZXREYXRhV2l0aFNlYXJjaChzZWFyY2hJbnB1dC52YWx1ZSwkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgIDwhLS0gU2VhcmNoIEljb24gLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtaWNvblwiPlxyXG4gICAgICAgICAgICA8aS10ZWNoLWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtci0xMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkID8gJ3JlYWRvbmx5LWNvbG9yJyA6ICdkZWZhdWx0LWZvcm0taWNvbi1jb2xvcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0Q29uZmlnLmljb25QcmVmaXggJiYgIXNob3dQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25OYW1lXT1cInNlbGVjdENvbmZpZy5pY29uUHJlZml4IHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXRQcmVmaXhcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2ktdGVjaC1pY29uLWJ1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFBsYWNlaG9sZGVyL1NlbGVjdGVkIFZhbHVlIERpc3BsYXkgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1BsYWNlaG9sZGVyICYmIHNlbGVjdENvbmZpZy5zZWFyY2hcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiKCFuZ0NvbnRyb2w/LnZhbHVlICYmICFuZ0NvbnRyb2w/LnZhbHVlPy5sZW5ndGgpIHx8XHJcbiAgICAgICAgICAgICAgICAgKHNlbGVjdENvbmZpZy5tdWx0aXBsZSAmJiBuZ0NvbnRyb2w/LnZhbHVlICYmICFuZ0NvbnRyb2w/LnZhbHVlPy5sZW5ndGgpXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCA/ICdyZWFkb25seS1jb2xvcicgOiAnZGVmYXVsdC1mb3JtLWljb24tY29sb3InXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7ICgoc2VsZWN0Q29uZmlnLnBsYWNlaG9sZGVyIHx8ICcnKSB8IHRyYW5zbGF0ZSkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXBsYWNlaG9sZGVyIGN1c3RvbS12YWx1ZSBlbGxpcHNpc1wiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAncHItNDInOiBzZWxlY3RDb25maWcuaWNvblVybCxcclxuICAgICAgICAgICAgICAgICdyZWFkb25seS1jb2xvcic6IHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCxcclxuICAgICAgICAgICAgICAgICdkZWZhdWx0LWZvcm0taWNvbi1jb2xvcic6ICEoc2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkKVxyXG4gICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAqbmdJZj1cIm5nQ29udHJvbD8udmFsdWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAge3sgc2VsZWN0Q29uZmlnPy5tdWx0aXBsZSA/IChuZ0NvbnRyb2wudmFsdWUgfCBhcnJheVRvU3RyaW5nKSA6IHNob3dpbmdWYWx1ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBDdXN0b20gSWNvbiAtLT5cclxuICAgIDxpbWcgY2xhc3M9XCJsZWZ0X2ljb25fbmV3IHBvaW50ZXJcIlxyXG4gICAgICAgICAoY2xpY2spPVwiaWNvbkNsaWNrKG1hdFNlbGVjdCwgc2VhcmNoSW5wdXQpXCJcclxuICAgICAgICAgKm5nSWY9XCIhc2VsZWN0Q29uZmlnLm1hdEljb25OYW1lICYmIChzZWxlY3RDb25maWcuaWNvblVybCB8fCBzZWxlY3RDb25maWcuYWN0aXZlU3RhdGVJY29uVXJsKVwiXHJcbiAgICAgICAgIFtzcmNdPVwiJ2Fzc2V0cy9pbWFnZXMvaWNvbnMvZ2xvYmFsLycgKyAobmdDb250cm9sLmNvbnRyb2w/LnZhbHVlICYmIHNlbGVjdENvbmZpZz8uYWN0aXZlU3RhdGVJY29uVXJsID8gc2VsZWN0Q29uZmlnLmFjdGl2ZVN0YXRlSWNvblVybCA6IHNlbGVjdENvbmZpZy5pY29uVXJsKVwiPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy0xMDBcIiAoY2xpY2spPVwic2VsZWN0Q29uZmlnPy5zZWFyY2ggPyBmb2N1c1NlYXJjaElucHV0KCkgOiBudWxsXCI+XHJcbiAgICAgICAgPCEtLSBNYXRlcmlhbCBTZWxlY3QgLS0+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgI21hdFNlbGVjdD1cIm1hdFNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhbmVsQ2xhc3NdPVwiJ2F1dG9jb21wbGV0ZS10cmFuc2Zvcm0tcGFuZWwtbG9jYXRpb24nXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cIihzZWxlY3RDb25maWcucGxhY2Vob2xkZXIgfHwgJycpIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJzZWxlY3RDb25maWcubGFiZWwgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJzZWxlY3RDb25maWcuZmlsdHJhdGlvbktleSB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9wZW5lZCk9XCJyZWdpc3RlclBhbmVsU2Nyb2xsRXZlbnQobWF0U2VsZWN0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvcGVuZWRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm5nQ29udHJvbC5jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwic2VsZWN0Q29uZmlnLm11bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImVtaXRTZWxlY3Rpb25DaGFuZ2VBbmRDbG9zZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZXJyb3JTdGF0ZU1hdGNoZXJdPVwiY3VzdG9tRXJyb3JTdGF0ZU1hdGNoZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIoc2VsZWN0Q29uZmlnLnBsYWNlaG9sZGVyIHx8ICcnKSB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkXCJcclxuICAgICAgICA+XHJcblxyXG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwicGVuZGluZ1wiIGNsYXNzPVwib3B0aW9uX2xvYWRpbmcgcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1ZXN0X2xvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIG5nU3JjPVwiLi9sb2FkZXIuc3ZnXCIgYWx0PVwiXCIgaGVpZ2h0PVwiMjAwXCIgd2lkdGg9XCIyMDBcIi8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubGVuZ3RoICYmICFwZW5kaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEFkZCBOZXcgT3B0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJzZWxlY3RDb25maWcuYWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXIgYWRkX25ld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlUGFuZWxBbmRVbnNldEZvY3VzKCk7YWRkTmV3SXRlbUV2ZW50KClcIj5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmdDb250cm9sLmNvbnRyb2wucmVzZXQobnVsbCk7bWF0U2VsZWN0Ll9vbkJsdXIoKTtjbG9zZVBhbmVsQW5kVW5zZXRGb2N1cygpO2FkZE5ld0l0ZW1FdmVudCgpXCI+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGktdGVjaC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIkJ1dHRvblR5cGUuT1VUTElORVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9udEljb25dPVwiJ2FkZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiKCdkcm9wZG93bl9hZGRfaXRlbScgfCB0cmFuc2xhdGUgOiB7SU5QVVRfTkFNRTogKHNlbGVjdENvbmZpZy5sYWJlbCB8IHRyYW5zbGF0ZSl9KSBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIid3LTEwMCBtYXQtYXV0b2NvbXBsZXRlLXNlbGVjdC1idXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9pLXRlY2gtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUmVndWxhciBPcHRpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RDb25maWc/LmNoYW5nZVRleHQgJiYgZGF0YS5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0Q29uZmlnLnZhbHVlQnlLZXkgfCBnZXRWYWx1ZUJ5S2V5RnJvbU9iamVjdCA6IGl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9wdGlvbkNsaWNrKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInByZXZlbnREZWZhdWx0KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKChzZWxlY3RDb25maWcudmFsdWVUb1Nob3dCeUtleSB8IGdldFZhbHVlQnlLZXlGcm9tT2JqZWN0IDogaXRlbSA6IHNlbGVjdENvbmZpZy52YWx1ZVRvU2hvd0J5UGFyYW0gOiBzZWxlY3RDb25maWcud2l0aFBhcmFtU3ltYm9sKSB8fCAnJykgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBUZXh0IE9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0Q29uZmlnPy5jaGFuZ2VUZXh0ICYmIGRhdGEubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdENvbmZpZy52YWx1ZUJ5S2V5IHwgZ2V0VmFsdWVCeUtleUZyb21PYmplY3QgOiBpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2V1cCk9XCJvcHRpb25DbGljayhpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJwcmV2ZW50RGVmYXVsdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0Q29uZmlnPy5jaGFuZ2VUZXh0W2l0ZW1dLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlbGVjdENvbmZpZz8uY2hhbmdlVGV4dFtpdGVtXS50ZXh0IHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwZW5kaW5nICYmICFkYXRhLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgY2xhc3M9XCJlbXB0eV9zZWxlY3Rpb25fc3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc19hbmRfdGlsZSBhZGRfbmV3IGZsZXhfY29sdW1uIHctMTAwIGZsZXhfY2VudGVyX2FsaWduX2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnZHJvcGRvd25fbm9faXRlbXMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpLXRlY2gtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0Q29uZmlnPy5hY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiQnV0dG9uVHlwZS5PVVRMSU5FXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cImNsb3NlUGFuZWxBbmRVbnNldEZvY3VzKCk7YWRkTmV3SXRlbUV2ZW50KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ21hdC1hdXRvY29tcGxldGUtc2VsZWN0LWJ1dHRvbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9udEljb25dPVwiJ2FkZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCIoJ2Ryb3Bkb3duX2FkZF9pdGVtJyB8IHRyYW5zbGF0ZSA6IHtJTlBVVF9OQU1FOiAoc2VsZWN0Q29uZmlnLmxhYmVsIHwgdHJhbnNsYXRlKX0pIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pLXRlY2gtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNlbGVjdENvbmZpZy5pY29uUHJlZml4XCJcclxuICAgICAgICAgICAgICAgICAgbWF0UHJlZml4XHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAncmVhZG9ubHktY29sb3InIDogIXNlbGVjdENvbmZpZ1snaWNvblByZWZpeENvbG9yJ10gJiYgKHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQtZm9ybS1pY29uLWNvbG9yJyA6ICFzZWxlY3RDb25maWdbJ2ljb25QcmVmaXhDb2xvciddICYmICEoc2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoKHNlbGVjdENvbmZpZz8uWydpY29uUHJlZml4VG9vbHRpcCddIHx8ICcnKSB8IHRyYW5zbGF0ZSlcIlxyXG4gICAgICAgID57eyBzZWxlY3RDb25maWcuaWNvblByZWZpeCB9fVxyXG4gICAgICAgIDwvbWF0LWljb24+XHJcblxyXG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNlbGVjdENvbmZpZ1snaWNvblByZWZpeFN2ZyddXCJcclxuICAgICAgICAgICAgICAgICAgbWF0UHJlZml4XHJcbiAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIigoc2VsZWN0Q29uZmlnPy5bJ2ljb25QcmVmaXhUb29sdGlwJ10gfHwgJycpIHwgdHJhbnNsYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdmdJY29uXT1cInNlbGVjdENvbmZpZ1snaWNvblByZWZpeFN2ZyddIHx8ICcnXCJcclxuICAgICAgICA+PC9tYXQtaWNvbj5cclxuXHJcbiAgICAgICAgPGktdGVjaC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RDb25maWcuc2VhcmNoICYmIHNlbGVjdENvbmZpZy5jbGVhcmFibGUgJiYgIW5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkICYmICEhbmdDb250cm9sLmNvbnRyb2wudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgaWNvbk5hbWU9XCJjYW5jZWxcIlxyXG4gICAgICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCA/ICdyZWFkb25seS1jb2xvcicgOiAnZGVmYXVsdC1mb3JtLWljb24tY29sb3InXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7bmdDb250cm9sLmNvbnRyb2wucmVzZXQobnVsbCk7bWF0U2VsZWN0Ll9vbkJsdXIoKTtjbG9zZVBhbmVsQW5kVW5zZXRGb2N1cygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9pLXRlY2gtaWNvbi1idXR0b24+XHJcbiAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0LWFycm93XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cIm1hdFNlbGVjdC5wYW5lbE9wZW5cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAncmVhZG9ubHktY29sb3InOiBzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICdkZWZhdWx0LWZvcm0taWNvbi1jb2xvcic6ICEoc2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkKSxcclxuICAgICAgICAgICAgJ210LTgnOiAhIW5nQ29udHJvbC5jb250cm9sLnZhbHVlICYmIHNlbGVjdENvbmZpZy5jbGVhcmFibGVcclxuICAgICAgICAgfVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICBrZXlib2FyZF9hcnJvd19kb3duXHJcbiAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICA8IS0tIEVycm9yIE1lc3NhZ2UgLS0+XHJcbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cIiEhKG5nQ29udHJvbC5jb250cm9sLmVycm9ycyAmJiBzdWJtaXRWYWx1ZSlcIj5cclxuICAgICAgICAgICAge3sgbmdDb250cm9sLmNvbnRyb2wgfCBnZW5lcmF0ZUVycm9yTWVzc2FnZXMgOiBzZWxlY3RDb25maWcubGFiZWwgOiBzZWxlY3RDb25maWcuZGVmYXVsdFBhdHRlcm5LZXl9fVxyXG4gICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8IS0tIFJlc2V0IEJ1dHRvbiAtLT5cclxuICAgIDxpLXRlY2gtY2xlYXItdmFsdWUgKm5nSWY9XCJzZWxlY3RDb25maWcucmVzZXRcIiAocmVzZXQpPVwicmVzZXRWYWx1ZSgpXCI+PC9pLXRlY2gtY2xlYXItdmFsdWU+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -4,7 +4,7 @@ import { NgClass, NgIf } from "@angular/common";
4
4
  import { MatProgressSpinner } from "@angular/material/progress-spinner";
5
5
  import { MatIconModule } from "@angular/material/icon";
6
6
  import { TranslateModule, TranslatePipe, TranslateService } from "@ngx-translate/core";
7
- import { ButtonType } from '../../interfaces/button-types.constants';
7
+ import { ButtonType } from '../../interfaces/button-types.enum';
8
8
  import { NgxMaskDirective, NgxMaskPipe } from 'ngx-mask';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@angular/material/icon";
@@ -74,4 +74,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
74
74
  }], buttonClick: [{
75
75
  type: Output
76
76
  }] } });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7QUFzQnhELE1BQU0sT0FBTyxlQUFlO0lBYzFCO1FBYlMsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixTQUFJLEdBQWUsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUVyQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixVQUFLLEdBQXVCLFNBQVMsQ0FBQztRQUNyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDOUIsZUFBVSxHQUFHLFVBQVUsQ0FBQztJQUU1QixDQUFDO0lBRWhCLE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDOytHQXBCVSxlQUFlO21HQUFmLGVBQWUsdVRBUGY7WUFDVCxnQkFBZ0I7WUFDaEIsV0FBVztZQUNYLGFBQWE7WUFDYixnQkFBZ0I7U0FDakIsMEJDM0JILHlpRUFnREEsMEREbkNJLFNBQVMsaUxBQ1QsT0FBTyxvRkFDUCxrQkFBa0IsK0tBQ2xCLElBQUksNEZBQ0osYUFBYSxtTEFDYixlQUFlOzs0RkFXTixlQUFlO2tCQXBCM0IsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLElBQUk7d0JBQ0osYUFBYTt3QkFDYixlQUFlO3FCQUNoQixhQUdVO3dCQUNULGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxhQUFhO3dCQUNiLGdCQUFnQjtxQkFDakI7d0RBR1EsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0QnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdJZn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXJcIjtcclxuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHsgQnV0dG9uVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYnV0dG9uLXR5cGVzLmNvbnN0YW50cyc7XHJcbmltcG9ydCB7Tmd4TWFza0RpcmVjdGl2ZSwgTmd4TWFza1BpcGUgfSBmcm9tICduZ3gtbWFzayc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ktdGVjaC1idXR0b24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0QnV0dG9uLFxyXG4gICAgTmdDbGFzcyxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lcixcclxuICAgIE5nSWYsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgVHJhbnNsYXRlTW9kdWxlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYnV0dG9uLmNvbXBvbmVudC5jc3MnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgTmd4TWFza0RpcmVjdGl2ZSxcclxuICAgIE5neE1hc2tQaXBlLFxyXG4gICAgVHJhbnNsYXRlUGlwZSxcclxuICAgIFRyYW5zbGF0ZVNlcnZpY2VcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdXR0b25Db21wb25lbnQge1xyXG4gIEBJbnB1dCgpIHRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGRhdGFfY3k6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGZvbnRJY29uOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzdmdJY29uOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB0eXBlOiBCdXR0b25UeXBlID0gQnV0dG9uVHlwZS5GSUxMRUQ7XHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3MhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3VibWl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhY3RpdmF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjb2xvcjogJ3ByaW1hcnknIHwgJ3dhcm4nID0gJ3ByaW1hcnknO1xyXG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQnV0dG9uVHlwZSA9IEJ1dHRvblR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLnN1Ym1pdCkge1xyXG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGJ1dHRvbiAqbmdJZj1cIltCdXR0b25UeXBlLkZJTExFRCxCdXR0b25UeXBlLldBUk5JTkddLmluY2x1ZGVzKHR5cGUpXCJcclxuICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICBbYXR0ci5kYXRhLWN5XT1cImRhdGFfY3lcIlxyXG4gICAgICAgIFtjb2xvcl09XCJ0eXBlID09PSBCdXR0b25UeXBlLldBUk5JTkcgPyAnd2FybicgOiBjb2xvclwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2YXRlZF09XCJhY3RpdmF0ZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIihjdXN0b21DbGFzcyB8fCAnJylcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdWJtaXRcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxyXG4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJzdWJtaXRcIiBjbGFzcz1cInNwaW5uZXItb3ZlcmxheVwiPlxyXG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIxNlwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gIDxtYXQtaWNvbiAqbmdJZj1cImZvbnRJY29uICYmICFzdWJtaXRcIj57e2ZvbnRJY29ufX08L21hdC1pY29uPlxyXG4gIDxtYXQtaWNvbiAqbmdJZj1cInN2Z0ljb24gJiYgIXN1Ym1pdFwiIFtzdmdJY29uXT1cInN2Z0ljb25cIj48L21hdC1pY29uPlxyXG4gIDxzcGFuPnt7dGV4dCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG48L2J1dHRvbj5cclxuPGJ1dHRvbiAqbmdJZj1cIltCdXR0b25UeXBlLlRPTkFMLEJ1dHRvblR5cGUuVEVYVF0uaW5jbHVkZXModHlwZSlcIlxyXG4gICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICBbYXR0ci5kYXRhLWN5XT1cImRhdGFfY3lcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIih0eXBlID09PSBCdXR0b25UeXBlLlRPTkFMID8gJ3RlcnRpYXJ5ICcgOiAnJykgKyAoY3VzdG9tQ2xhc3MgfHwgJycpXCJcclxuICAgICAgICBbY2xhc3MuYWN0aXZhdGVkXT1cImFjdGl2YXRlZFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN1Ym1pdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXHJcbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cInN1Ym1pdFwiICBjbGFzcz1cInNwaW5uZXItb3ZlcmxheVwiPlxyXG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIxNlwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gIDxtYXQtaWNvbiAqbmdJZj1cImZvbnRJY29uICYmICFzdWJtaXRcIj57e2ZvbnRJY29ufX08L21hdC1pY29uPlxyXG4gIDxtYXQtaWNvbiAqbmdJZj1cInN2Z0ljb24gJiYgIXN1Ym1pdFwiIFtzdmdJY29uXT1cInN2Z0ljb25cIj48L21hdC1pY29uPlxyXG5cclxuICA8c3Bhbj57e3RleHQgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuPC9idXR0b24+XHJcbjxidXR0b24gKm5nSWY9XCJ0eXBlID09PSBCdXR0b25UeXBlLk9VVExJTkVcIlxyXG4gICAgICAgIFtjb2xvcl09XCJjb2xvclwiXHJcbiAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXHJcbiAgICAgICAgW2F0dHIuZGF0YS1jeV09XCJkYXRhX2N5XCJcclxuICAgICAgICBbbmdDbGFzc109XCIoY3VzdG9tQ2xhc3MgfHwgJycpIFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN1Ym1pdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2YXRlZF09XCJhY3RpdmF0ZWRcIlxyXG4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJzdWJtaXRcIiAgY2xhc3M9XCJzcGlubmVyLW92ZXJsYXlcIj5cclxuICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICA8bWF0LWljb24gKm5nSWY9XCJmb250SWNvbiAmJiAhc3VibWl0XCIgPnt7Zm9udEljb259fTwvbWF0LWljb24+XHJcbiAgPG1hdC1pY29uICpuZ0lmPVwic3ZnSWNvbiAmJiAhc3VibWl0XCIgW3N2Z0ljb25dPVwic3ZnSWNvblwiPjwvbWF0LWljb24+XHJcbiAgPHNwYW4+e3t0ZXh0IHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbjwvYnV0dG9uPlxyXG4iXX0=
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7QUFzQnhELE1BQU0sT0FBTyxlQUFlO0lBYzFCO1FBYlMsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixTQUFJLEdBQWUsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUVyQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixVQUFLLEdBQXVCLFNBQVMsQ0FBQztRQUNyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDOUIsZUFBVSxHQUFHLFVBQVUsQ0FBQztJQUU1QixDQUFDO0lBRWhCLE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDOytHQXBCVSxlQUFlO21HQUFmLGVBQWUsdVRBUGY7WUFDVCxnQkFBZ0I7WUFDaEIsV0FBVztZQUNYLGFBQWE7WUFDYixnQkFBZ0I7U0FDakIsMEJDM0JILHlpRUFnREEsMEREbkNJLFNBQVMsaUxBQ1QsT0FBTyxvRkFDUCxrQkFBa0IsK0tBQ2xCLElBQUksNEZBQ0osYUFBYSxtTEFDYixlQUFlOzs0RkFXTixlQUFlO2tCQXBCM0IsU0FBUzsrQkFDRSxlQUFlLGNBQ2IsSUFBSSxXQUNQO3dCQUNQLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLElBQUk7d0JBQ0osYUFBYTt3QkFDYixlQUFlO3FCQUNoQixhQUdVO3dCQUNULGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxhQUFhO3dCQUNiLGdCQUFnQjtxQkFDakI7d0RBR1EsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0QnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdJZn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXJcIjtcclxuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHsgQnV0dG9uVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYnV0dG9uLXR5cGVzLmVudW0nO1xyXG5pbXBvcnQge05neE1hc2tEaXJlY3RpdmUsIE5neE1hc2tQaXBlIH0gZnJvbSAnbmd4LW1hc2snO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpLXRlY2gtYnV0dG9uJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdEJ1dHRvbixcclxuICAgIE5nQ2xhc3MsXHJcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXHJcbiAgICBOZ0lmLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2J1dHRvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2J1dHRvbi5jb21wb25lbnQuY3NzJyxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIE5neE1hc2tEaXJlY3RpdmUsXHJcbiAgICBOZ3hNYXNrUGlwZSxcclxuICAgIFRyYW5zbGF0ZVBpcGUsXHJcbiAgICBUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnV0dG9uQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSB0ZXh0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBkYXRhX2N5OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBmb250SWNvbjogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgc3ZnSWNvbjogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdHlwZTogQnV0dG9uVHlwZSA9IEJ1dHRvblR5cGUuRklMTEVEO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHN1Ym1pdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYWN0aXZhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY29sb3I6ICdwcmltYXJ5JyB8ICd3YXJuJyA9ICdwcmltYXJ5JztcclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEJ1dHRvblR5cGUgPSBCdXR0b25UeXBlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5zdWJtaXQpIHtcclxuICAgICAgdGhpcy5idXR0b25DbGljay5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxidXR0b24gKm5nSWY9XCJbQnV0dG9uVHlwZS5GSUxMRUQsQnV0dG9uVHlwZS5XQVJOSU5HXS5pbmNsdWRlcyh0eXBlKVwiXHJcbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgICAgW2F0dHIuZGF0YS1jeV09XCJkYXRhX2N5XCJcclxuICAgICAgICBbY29sb3JdPVwidHlwZSA9PT0gQnV0dG9uVHlwZS5XQVJOSU5HID8gJ3dhcm4nIDogY29sb3JcIlxyXG4gICAgICAgIFtjbGFzcy5hY3RpdmF0ZWRdPVwiYWN0aXZhdGVkXCJcclxuICAgICAgICBbbmdDbGFzc109XCIoY3VzdG9tQ2xhc3MgfHwgJycpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3VibWl0XCJcclxuICAgICAgICAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcclxuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic3VibWl0XCIgY2xhc3M9XCJzcGlubmVyLW92ZXJsYXlcIj5cclxuICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICA8bWF0LWljb24gKm5nSWY9XCJmb250SWNvbiAmJiAhc3VibWl0XCI+e3tmb250SWNvbn19PC9tYXQtaWNvbj5cclxuICA8bWF0LWljb24gKm5nSWY9XCJzdmdJY29uICYmICFzdWJtaXRcIiBbc3ZnSWNvbl09XCJzdmdJY29uXCI+PC9tYXQtaWNvbj5cclxuICA8c3Bhbj57e3RleHQgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuPC9idXR0b24+XHJcbjxidXR0b24gKm5nSWY9XCJbQnV0dG9uVHlwZS5UT05BTCxCdXR0b25UeXBlLlRFWFRdLmluY2x1ZGVzKHR5cGUpXCJcclxuICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgW2F0dHIuZGF0YS1jeV09XCJkYXRhX2N5XCJcclxuICAgICAgICBbbmdDbGFzc109XCIodHlwZSA9PT0gQnV0dG9uVHlwZS5UT05BTCA/ICd0ZXJ0aWFyeSAnIDogJycpICsgKGN1c3RvbUNsYXNzIHx8ICcnKVwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2YXRlZF09XCJhY3RpdmF0ZWRcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdWJtaXRcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxyXG4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJzdWJtaXRcIiAgY2xhc3M9XCJzcGlubmVyLW92ZXJsYXlcIj5cclxuICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICA8bWF0LWljb24gKm5nSWY9XCJmb250SWNvbiAmJiAhc3VibWl0XCI+e3tmb250SWNvbn19PC9tYXQtaWNvbj5cclxuICA8bWF0LWljb24gKm5nSWY9XCJzdmdJY29uICYmICFzdWJtaXRcIiBbc3ZnSWNvbl09XCJzdmdJY29uXCI+PC9tYXQtaWNvbj5cclxuXHJcbiAgPHNwYW4+e3t0ZXh0IHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbjwvYnV0dG9uPlxyXG48YnV0dG9uICpuZ0lmPVwidHlwZSA9PT0gQnV0dG9uVHlwZS5PVVRMSU5FXCJcclxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxyXG4gICAgICAgIFthdHRyLmRhdGEtY3ldPVwiZGF0YV9jeVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiKGN1c3RvbUNsYXNzIHx8ICcnKSBcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdWJtaXRcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIFtjbGFzcy5hY3RpdmF0ZWRdPVwiYWN0aXZhdGVkXCJcclxuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic3VibWl0XCIgIGNsYXNzPVwic3Bpbm5lci1vdmVybGF5XCI+XHJcbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE2XCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgPG1hdC1pY29uICpuZ0lmPVwiZm9udEljb24gJiYgIXN1Ym1pdFwiID57e2ZvbnRJY29ufX08L21hdC1pY29uPlxyXG4gIDxtYXQtaWNvbiAqbmdJZj1cInN2Z0ljb24gJiYgIXN1Ym1pdFwiIFtzdmdJY29uXT1cInN2Z0ljb25cIj48L21hdC1pY29uPlxyXG4gIDxzcGFuPnt7dGV4dCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG48L2J1dHRvbj5cclxuIl19