@unifylib/ui-lib 1.2.12 → 1.2.14

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.
@@ -4,18 +4,16 @@ import { MatAutocomplete, MatAutocompleteTrigger, MatOption } from "@angular/mat
4
4
  import { of } from "rxjs";
5
5
  import { FormControl, ReactiveFormsModule, Validators } from "@angular/forms";
6
6
  import { MatFormField } from "@angular/material/form-field";
7
- import { MatChip, MatChipGrid, MatChipInput, MatChipListbox } from "@angular/material/chips";
7
+ import { MatChip, MatChipListbox } from "@angular/material/chips";
8
8
  import { AsyncPipe, NgForOf, NgIf } from "@angular/common";
9
9
  import { MatIcon } from "@angular/material/icon";
10
10
  import { MatInput } from "@angular/material/input";
11
- import { MatLabel } from '@angular/material/form-field';
12
11
  import { buildItemsList } from "../../utils/base-utils";
13
12
  import { FilterRequest } from "../../base-model";
14
13
  import { Filter } from "../../base-model";
15
14
  import { RequireMatch } from "../../validators";
16
15
  import { MatChipsModule } from '@angular/material/chips';
17
16
  import { MatIconModule } from '@angular/material/icon';
18
- import { MatIconButton } from '@angular/material/button';
19
17
  import { TranslateModule } from '@ngx-translate/core';
20
18
  import * as i0 from "@angular/core";
21
19
  import * as i1 from "../../services";
@@ -38,16 +36,13 @@ export class MultiAutoCompleteComponent {
38
36
  this._columns = ['id', 'code', 'englishName', 'arabicName'];
39
37
  }
40
38
  ngOnInit() {
41
- // this.form = this.rootFormGroup.control;
42
39
  this.selectedItems = [];
43
- this.multiControl = new FormControl(this.form?.controls[this.field?.property]);
44
- this.multiControl.enable();
40
+ this.multiControl = new FormControl(null);
45
41
  this.updateFieldAttributes();
46
- if (!this.field.acceptNewItem) {
47
- // @ts-ignore
48
- this.multiControl.setValidators([RequireMatch]);
42
+ const initialValue = this.form?.controls[this.field?.property]?.value;
43
+ if (initialValue) {
44
+ this.patchLookupValue(initialValue);
49
45
  }
50
- this.multiControl.setValue(this.form?.controls[this.field?.property]?.value);
51
46
  this.multiControl.valueChanges.subscribe(v => {
52
47
  if (typeof v === 'string') {
53
48
  clearTimeout(this.timer);
@@ -56,10 +51,6 @@ export class MultiAutoCompleteComponent {
56
51
  }, 700);
57
52
  }
58
53
  });
59
- // this.multiControl.valueChanges.subscribe(v => {
60
- // if (typeof v === 'string') this.filterLookupItems(v, null);
61
- // })
62
- // this.filterAutoCompleteData(this.field.property);
63
54
  this.getLookupData();
64
55
  if (this.field.cascadedBy) {
65
56
  this.form?.get(this.field.cascadedBy)?.valueChanges.subscribe(v => {
@@ -70,15 +61,47 @@ export class MultiAutoCompleteComponent {
70
61
  updateFieldAttributes() {
71
62
  if (this.field.readonly) {
72
63
  this.multiControl.disable();
73
- this.isRequired = false;
64
+ }
65
+ else {
66
+ this.multiControl.enable();
67
+ }
68
+ this.syncFormControlState();
69
+ }
70
+ syncFormControlState() {
71
+ const control = this.form?.get(this.field?.property);
72
+ if (!control) {
73
+ return;
74
+ }
75
+ if (this.field.readonly) {
76
+ control.clearValidators();
74
77
  }
75
78
  else if (this.field.required) {
76
- this.form?.controls[this.field?.property].setValidators([Validators.required]);
77
- this.form?.controls[this.field?.property].updateValueAndValidity();
78
- this.multiControl.setValidators([Validators.required]);
79
- this.isRequired = true;
79
+ control.setValidators([Validators.required]);
80
+ }
81
+ else {
82
+ control.clearValidators();
80
83
  }
81
- this.multiControl.updateValueAndValidity();
84
+ control.updateValueAndValidity({ emitEvent: false });
85
+ this.updateInputValidators();
86
+ }
87
+ updateInputValidators() {
88
+ if (this.field.readonly) {
89
+ this.multiControl.clearValidators();
90
+ this.isRequired = false;
91
+ this.multiControl.updateValueAndValidity({ emitEvent: false });
92
+ return;
93
+ }
94
+ const validators = [];
95
+ if (!this.field.acceptNewItem) {
96
+ validators.push(RequireMatch);
97
+ }
98
+ const hasSelectedItems = (this.selectedItems?.length ?? 0) > 0;
99
+ if (this.field.required && !hasSelectedItems) {
100
+ validators.push(Validators.required);
101
+ }
102
+ this.multiControl.setValidators(validators);
103
+ this.isRequired = this.field.required && !hasSelectedItems;
104
+ this.multiControl.updateValueAndValidity({ emitEvent: false });
82
105
  }
83
106
  removeChildItemsIfCascadedByRemoved(v) {
84
107
  this.cascadedIdz = [];
@@ -95,6 +118,7 @@ export class MultiAutoCompleteComponent {
95
118
  if (toDeleteIdz) {
96
119
  this.selectedItems = this.selectedItems.filter(s => !toDeleteIdz.includes(s.id));
97
120
  this.form.get(this.field.property).patchValue(this.selectedItems, { emitEvent: true });
121
+ this.syncFormControlState();
98
122
  }
99
123
  }
100
124
  ngOnChanges({ defaultValue, field }) {
@@ -129,12 +153,12 @@ export class MultiAutoCompleteComponent {
129
153
  if (!this.form.get('id')?.value) {
130
154
  this.patchLookupValue(this.lookupItems?.find(l => l.defaultValue));
131
155
  }
132
- this.patchLookupValue(this.multiControl.value);
156
+ this.patchLookupValue(this.selectedItems);
133
157
  }
134
158
  }));
135
159
  }
136
160
  else {
137
- this.patchLookupValue(this.multiControl.value);
161
+ this.patchLookupValue(this.selectedItems.length ? this.selectedItems : this.form?.get(this.field.property)?.value);
138
162
  }
139
163
  }
140
164
  selected(value) {
@@ -142,9 +166,9 @@ export class MultiAutoCompleteComponent {
142
166
  this.selectedItems?.push(value);
143
167
  this.itemInput.nativeElement.value = '';
144
168
  this.form.get(this.field.property)?.setValue(this.selectedItems);
145
- // @ts-ignore
146
169
  this.selectedValue.emit(this.selectedItems);
147
- this.multiControl.setValue(null);
170
+ this.multiControl.setValue(null, { emitEvent: false });
171
+ this.syncFormControlState();
148
172
  }
149
173
  }
150
174
  displayFn(selected) {
@@ -213,10 +237,9 @@ export class MultiAutoCompleteComponent {
213
237
  }
214
238
  patchLookupValue(defaultValue) {
215
239
  if (defaultValue) {
216
- // this.form?.get(this.field.property)?.patchValue(defaultValue);
217
240
  this.selectedItems = defaultValue;
218
- this.multiControl.setValue(defaultValue);
219
- this.multiControl.patchValue(defaultValue, { emitEvent: true });
241
+ this.multiControl.setValue(null, { emitEvent: false });
242
+ this.syncFormControlState();
220
243
  }
221
244
  }
222
245
  remove(item) {
@@ -224,18 +247,36 @@ export class MultiAutoCompleteComponent {
224
247
  if (index >= 0) {
225
248
  this.selectedItems.splice(index, 1);
226
249
  this.form.get(this.field.property).patchValue(this.selectedItems, { emitEvent: true });
250
+ this.syncFormControlState();
227
251
  }
228
252
  }
229
- get matErrorDescribedBy() {
230
- const control = this.form?.get(this.field?.property);
231
- if (!control || !this.field?.property) {
232
- return null;
253
+ getPlaceholderKey() {
254
+ if (!this.field?.placeholder) {
255
+ return '';
233
256
  }
234
- const visible = (control.value || control.value === 0) && control.status === 'INVALID';
235
- return visible ? `error-${this.field.property}` : null;
257
+ const configuredKey = this.field.placeholder;
258
+ if (!this.labelsSection) {
259
+ return configuredKey;
260
+ }
261
+ return configuredKey.startsWith(this.labelsSection)
262
+ ? configuredKey
263
+ : `${this.labelsSection}.${configuredKey}`;
264
+ }
265
+ get showInputPlaceholder() {
266
+ return !!this.field?.placeholder && (this.selectedItems?.length ?? 0) === 0;
267
+ }
268
+ onInputClick(autocompleteTrigger) {
269
+ if (this.field?.readonly || this.readonly) {
270
+ return;
271
+ }
272
+ this.openLookupPanel(autocompleteTrigger);
236
273
  }
237
- getLabel() {
238
- return this.translateService.instant(this.field.label);
274
+ onTriggerClick(event, autocompleteTrigger) {
275
+ event.stopPropagation();
276
+ if (this.field?.readonly || this.readonly) {
277
+ return;
278
+ }
279
+ this.openLookupPanel(autocompleteTrigger);
239
280
  }
240
281
  onKeydown(event, autocompleteTrigger) {
241
282
  if (event.key === 'Enter') {
@@ -252,7 +293,7 @@ export class MultiAutoCompleteComponent {
252
293
  return this.field.property;
253
294
  }
254
295
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiAutoCompleteComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
255
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiAutoCompleteComponent, isStandalone: true, selector: "app-multi-auto-complete", inputs: { field: "field", form: "form", defaultValue: "defaultValue", pathParam: "pathParam", readonly: "readonly" }, outputs: { selectedValue: "selectedValue" }, viewQueries: [{ propertyName: "itemInput", first: true, predicate: ["itemInput"], descendants: true }, { propertyName: "matACTrigger", first: true, predicate: ["autocompleteTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"this.field\" class=\"main-multi-auto\">\r\n <div class=\"matField\">\r\n <mat-form-field class=\"full-width\" appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{ getLabel() }}</mat-label>\r\n <mat-chip-listbox #chipList [selectable]=\"true\">\r\n <mat-chip\r\n *ngFor=\"let item of selectedItems\"\r\n [removable]=\"true\"\r\n (removed)=\"remove(item)\">\r\n {{ itemNameByLag(item) }}\r\n <mat-icon *ngIf=\"!this.field.readonly\" matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input class=\"chip-input\" type=\"text\"\r\n [id]=\"getId()\" #itemInput\r\n [formControl]=\"multiControl\"\r\n [matAutocomplete]=\"auto\" matInput\r\n [readonly]=\"readonly\"\r\n [required]=\"isRequired\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [disabled]=\"field.readonly\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [attr.aria-describedby]=\"matErrorDescribedBy\"\r\n >\r\n </mat-chip-listbox>\r\n\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"arrow_drop_down_autocomplete\"\r\n [attr.aria-label]=\"'BASE_TABLE.openLookupOptions' | translate\"\r\n (click)=\"openLookupPanel(autocompleteTrigger)\">\r\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn\"\r\n (optionSelected)=\"selected($event.option.value)\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\"\r\n [disabled]=\"field.readonly || isSelected(item)\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n <ng-content select=\"mat-error\"></ng-content>\r\n </mat-form-field>\r\n </div>\r\n</ng-container>\r\n", styles: ["::ng-deep .main-multi-auto{.matField{margin-bottom:24px!important;.mat-form-field-wrapper{padding:0!important;margin-bottom:0!important}}}.full-width{width:100%}.chip-input{flex:1 1 auto}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
296
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiAutoCompleteComponent, isStandalone: true, selector: "app-multi-auto-complete", inputs: { field: "field", form: "form", defaultValue: "defaultValue", pathParam: "pathParam", readonly: "readonly", labelsSection: "labelsSection" }, outputs: { selectedValue: "selectedValue" }, viewQueries: [{ propertyName: "itemInput", first: true, predicate: ["itemInput"], descendants: true }, { propertyName: "matACTrigger", first: true, predicate: ["autocompleteTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"field\" class=\"main-multi-auto\">\r\n <div class=\"mat-field-wrapper\">\r\n <div class=\"label-and-asterisk-container\">\r\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{ field.property }}\">\r\n {{ field.label! | translate }}\r\n </span>\r\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\r\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\">\r\n {{ 'optional' | translate }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"multi-select-control\">\r\n <mat-form-field class=\"full-width multi-autocomplete-field\" appearance=\"outline\">\r\n <mat-chip-listbox #chipList class=\"chip-listbox\" [selectable]=\"true\">\r\n <mat-chip\r\n *ngFor=\"let item of selectedItems\"\r\n class=\"multi-select-chip\"\r\n [removable]=\"true\"\r\n (removed)=\"remove(item)\">\r\n {{ itemNameByLag(item) }}\r\n <mat-icon *ngIf=\"!field.readonly\" matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input\r\n class=\"chip-input app-input\"\r\n type=\"text\"\r\n [id]=\"getId()\"\r\n #itemInput\r\n [formControl]=\"multiControl\"\r\n [matAutocomplete]=\"auto\"\r\n matInput\r\n [placeholder]=\"showInputPlaceholder ? (getPlaceholderKey() | translate) : ''\"\r\n [readonly]=\"readonly\"\r\n [required]=\"isRequired\"\r\n (click)=\"onInputClick(autocompleteTrigger); $event.stopPropagation()\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [disabled]=\"field.readonly\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [attr.aria-labelledby]=\"'label-' + field.property\">\r\n </mat-chip-listbox>\r\n\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n autoActiveFirstOption\r\n [displayWith]=\"displayFn\"\r\n (optionSelected)=\"selected($event.option.value)\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option\r\n *ngFor=\"let item of lookupItems$ | async\"\r\n [value]=\"item\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"multi-select-arrow-trigger\"\r\n [disabled]=\"field.readonly || readonly\"\r\n [attr.aria-label]=\"'BASE_TABLE.openLookupOptions' | translate\"\r\n [attr.id]=\"'multi-select-trigger-' + field.property\"\r\n (click)=\"onTriggerClick($event, autocompleteTrigger)\">\r\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" focusable=\"false\" aria-hidden=\"true\">\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [".main-multi-auto,.mat-field-wrapper{display:flex;flex-direction:column;width:100%}.label-and-asterisk-container{display:flex;align-items:center;gap:4px;margin-bottom:4px}.custom-label{font-weight:500}.required-asterisk{color:red}.optional-text{color:#9b9b9b;font-size:11px;font-weight:400;line-height:1.4}.full-width{width:100%}.multi-select-control{position:relative;width:100%}.multi-select-arrow-trigger{position:absolute;top:0;right:4px;z-index:5;display:flex;align-items:center;justify-content:center;width:36px;height:44px;padding:0;margin:0;border:none;background:transparent;cursor:pointer;color:#0000008a}.multi-select-arrow-trigger:disabled{cursor:default;opacity:.38}.multi-select-arrow-trigger svg{width:24px;height:24px;fill:currentColor;pointer-events:none}:host ::ng-deep .multi-autocomplete-field{width:100%}:host ::ng-deep .multi-autocomplete-field .mat-mdc-form-field-error-wrapper,:host ::ng-deep .multi-autocomplete-field mat-error{display:none!important}:host ::ng-deep .multi-autocomplete-field .mat-mdc-text-field-wrapper{padding:0}:host ::ng-deep .multi-autocomplete-field .mat-mdc-form-field-flex{align-items:center;padding-right:36px}:host ::ng-deep .multi-autocomplete-field .mat-mdc-form-field-infix{min-height:44px!important;padding:12px 0 12px 12px!important;display:flex;align-items:center;flex:1 1 auto;min-width:0;width:100%}:host ::ng-deep .multi-autocomplete-field .chip-listbox{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;align-content:center;gap:4px;min-height:20px;min-width:0;width:100%;margin:0;padding:0;border:none;background:transparent}:host ::ng-deep .multi-autocomplete-field .multi-select-chip.mat-mdc-chip{height:24px;min-height:24px;margin:0;font-size:14px;font-weight:500;line-height:20px}:host ::ng-deep .multi-autocomplete-field .multi-select-chip .mat-mdc-chip-action-label{line-height:20px}:host ::ng-deep .multi-autocomplete-field .multi-select-chip .mat-icon{width:18px;height:18px;font-size:18px}:host ::ng-deep .multi-autocomplete-field .chip-input{flex:1 1 60px;min-width:60px;width:auto;height:20px!important;min-height:20px!important;line-height:20px!important;margin:0;padding:0;border:none;outline:none;background:transparent;font-size:14px;font-weight:500}:host ::ng-deep .multi-autocomplete-field .chip-listbox:has(.multi-select-chip) .chip-input{min-width:0;flex:0 1 40px}@media (max-width: 600px){.main-multi-auto,.mat-field-wrapper,.multi-autocomplete-field{width:100%}}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
256
297
  }
257
298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiAutoCompleteComponent, decorators: [{
258
299
  type: Component,
@@ -265,18 +306,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
265
306
  MatIcon,
266
307
  ReactiveFormsModule,
267
308
  MatAutocompleteTrigger,
268
- MatChipInput,
269
309
  MatInput,
270
310
  MatAutocomplete,
271
311
  MatOption,
272
312
  AsyncPipe,
273
313
  NgIf,
274
- MatChipGrid,
275
314
  MatChipListbox,
276
- MatLabel,
277
- MatIconButton,
278
315
  TranslateModule,
279
- ], template: "<ng-container *ngIf=\"this.field\" class=\"main-multi-auto\">\r\n <div class=\"matField\">\r\n <mat-form-field class=\"full-width\" appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{ getLabel() }}</mat-label>\r\n <mat-chip-listbox #chipList [selectable]=\"true\">\r\n <mat-chip\r\n *ngFor=\"let item of selectedItems\"\r\n [removable]=\"true\"\r\n (removed)=\"remove(item)\">\r\n {{ itemNameByLag(item) }}\r\n <mat-icon *ngIf=\"!this.field.readonly\" matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input class=\"chip-input\" type=\"text\"\r\n [id]=\"getId()\" #itemInput\r\n [formControl]=\"multiControl\"\r\n [matAutocomplete]=\"auto\" matInput\r\n [readonly]=\"readonly\"\r\n [required]=\"isRequired\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [disabled]=\"field.readonly\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [attr.aria-describedby]=\"matErrorDescribedBy\"\r\n >\r\n </mat-chip-listbox>\r\n\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n class=\"arrow_drop_down_autocomplete\"\r\n [attr.aria-label]=\"'BASE_TABLE.openLookupOptions' | translate\"\r\n (click)=\"openLookupPanel(autocompleteTrigger)\">\r\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn\"\r\n (optionSelected)=\"selected($event.option.value)\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\"\r\n [disabled]=\"field.readonly || isSelected(item)\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n <ng-content select=\"mat-error\"></ng-content>\r\n </mat-form-field>\r\n </div>\r\n</ng-container>\r\n", styles: ["::ng-deep .main-multi-auto{.matField{margin-bottom:24px!important;.mat-form-field-wrapper{padding:0!important;margin-bottom:0!important}}}.full-width{width:100%}.chip-input{flex:1 1 auto}\n"] }]
316
+ ], template: "<ng-container *ngIf=\"field\" class=\"main-multi-auto\">\r\n <div class=\"mat-field-wrapper\">\r\n <div class=\"label-and-asterisk-container\">\r\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{ field.property }}\">\r\n {{ field.label! | translate }}\r\n </span>\r\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\r\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\">\r\n {{ 'optional' | translate }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"multi-select-control\">\r\n <mat-form-field class=\"full-width multi-autocomplete-field\" appearance=\"outline\">\r\n <mat-chip-listbox #chipList class=\"chip-listbox\" [selectable]=\"true\">\r\n <mat-chip\r\n *ngFor=\"let item of selectedItems\"\r\n class=\"multi-select-chip\"\r\n [removable]=\"true\"\r\n (removed)=\"remove(item)\">\r\n {{ itemNameByLag(item) }}\r\n <mat-icon *ngIf=\"!field.readonly\" matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input\r\n class=\"chip-input app-input\"\r\n type=\"text\"\r\n [id]=\"getId()\"\r\n #itemInput\r\n [formControl]=\"multiControl\"\r\n [matAutocomplete]=\"auto\"\r\n matInput\r\n [placeholder]=\"showInputPlaceholder ? (getPlaceholderKey() | translate) : ''\"\r\n [readonly]=\"readonly\"\r\n [required]=\"isRequired\"\r\n (click)=\"onInputClick(autocompleteTrigger); $event.stopPropagation()\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [disabled]=\"field.readonly\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [attr.aria-labelledby]=\"'label-' + field.property\">\r\n </mat-chip-listbox>\r\n\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n autoActiveFirstOption\r\n [displayWith]=\"displayFn\"\r\n (optionSelected)=\"selected($event.option.value)\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option\r\n *ngFor=\"let item of lookupItems$ | async\"\r\n [value]=\"item\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"multi-select-arrow-trigger\"\r\n [disabled]=\"field.readonly || readonly\"\r\n [attr.aria-label]=\"'BASE_TABLE.openLookupOptions' | translate\"\r\n [attr.id]=\"'multi-select-trigger-' + field.property\"\r\n (click)=\"onTriggerClick($event, autocompleteTrigger)\">\r\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" focusable=\"false\" aria-hidden=\"true\">\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [".main-multi-auto,.mat-field-wrapper{display:flex;flex-direction:column;width:100%}.label-and-asterisk-container{display:flex;align-items:center;gap:4px;margin-bottom:4px}.custom-label{font-weight:500}.required-asterisk{color:red}.optional-text{color:#9b9b9b;font-size:11px;font-weight:400;line-height:1.4}.full-width{width:100%}.multi-select-control{position:relative;width:100%}.multi-select-arrow-trigger{position:absolute;top:0;right:4px;z-index:5;display:flex;align-items:center;justify-content:center;width:36px;height:44px;padding:0;margin:0;border:none;background:transparent;cursor:pointer;color:#0000008a}.multi-select-arrow-trigger:disabled{cursor:default;opacity:.38}.multi-select-arrow-trigger svg{width:24px;height:24px;fill:currentColor;pointer-events:none}:host ::ng-deep .multi-autocomplete-field{width:100%}:host ::ng-deep .multi-autocomplete-field .mat-mdc-form-field-error-wrapper,:host ::ng-deep .multi-autocomplete-field mat-error{display:none!important}:host ::ng-deep .multi-autocomplete-field .mat-mdc-text-field-wrapper{padding:0}:host ::ng-deep .multi-autocomplete-field .mat-mdc-form-field-flex{align-items:center;padding-right:36px}:host ::ng-deep .multi-autocomplete-field .mat-mdc-form-field-infix{min-height:44px!important;padding:12px 0 12px 12px!important;display:flex;align-items:center;flex:1 1 auto;min-width:0;width:100%}:host ::ng-deep .multi-autocomplete-field .chip-listbox{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;align-content:center;gap:4px;min-height:20px;min-width:0;width:100%;margin:0;padding:0;border:none;background:transparent}:host ::ng-deep .multi-autocomplete-field .multi-select-chip.mat-mdc-chip{height:24px;min-height:24px;margin:0;font-size:14px;font-weight:500;line-height:20px}:host ::ng-deep .multi-autocomplete-field .multi-select-chip .mat-mdc-chip-action-label{line-height:20px}:host ::ng-deep .multi-autocomplete-field .multi-select-chip .mat-icon{width:18px;height:18px;font-size:18px}:host ::ng-deep .multi-autocomplete-field .chip-input{flex:1 1 60px;min-width:60px;width:auto;height:20px!important;min-height:20px!important;line-height:20px!important;margin:0;padding:0;border:none;outline:none;background:transparent;font-size:14px;font-weight:500}:host ::ng-deep .multi-autocomplete-field .chip-listbox:has(.multi-select-chip) .chip-input{min-width:0;flex:0 1 40px}@media (max-width: 600px){.main-multi-auto,.mat-field-wrapper,.multi-autocomplete-field{width:100%}}\n"] }]
280
317
  }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }], propDecorators: { itemInput: [{
281
318
  type: ViewChild,
282
319
  args: ['itemInput']
@@ -293,7 +330,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
293
330
  type: Input
294
331
  }], readonly: [{
295
332
  type: Input
333
+ }], labelsSection: [{
334
+ type: Input
296
335
  }], selectedValue: [{
297
336
  type: Output
298
337
  }] } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFDLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUl2RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzNGLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsUUFBUSxFQUFD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QkFEUCxLQUFLO2dCQUlOLGFBQWE7c0JBRFosTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QUxMX0lURU0sIExvb2t1cEl0ZW19IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtGaWVsZEluZm99IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlc1wiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7R2V0SXRlbXNMaXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9nZXQtaXRlbXMtbGlzdFwiO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtNYXRDaGlwLCBNYXRDaGlwR3JpZCwgTWF0Q2hpcElucHV0LCBNYXRDaGlwTGlzdGJveH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoaXBzXCI7XHJcbmltcG9ydCB7QXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtNYXRJbnB1dH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XHJcbmltcG9ydCB7IE1hdExhYmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7YnVpbGRJdGVtc0xpc3R9IGZyb20gXCIuLi8uLi91dGlscy9iYXNlLXV0aWxzXCI7XHJcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7UmVxdWlyZU1hdGNofSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9yc1wiO1xyXG5pbXBvcnQgeyBNYXRDaGlwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtbXVsdGktYXV0by1jb21wbGV0ZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXRDaGlwLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdENoaXBzTW9kdWxlLFxyXG4gICAgTmdGb3JPZixcclxuICAgIE1hdEljb24sXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcixcclxuICAgIE1hdENoaXBJbnB1dCxcclxuICAgIE1hdElucHV0LFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlLFxyXG4gICAgTWF0T3B0aW9uLFxyXG4gICAgQXN5bmNQaXBlLFxyXG4gICAgTmdJZixcclxuICAgIE1hdENoaXBHcmlkLFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBNYXRMYWJlbCxcclxuICAgIE1hdEljb25CdXR0b24sXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL211bHRpLWF1dG8tY29tcGxldGUuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpQXV0b0NvbXBsZXRlQ29tcG9uZW50IHtcclxuLy8gQHRzLWlnbm9yZVxyXG4gIEBWaWV3Q2hpbGQoJ2l0ZW1JbnB1dCcpIGl0ZW1JbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdhdXRvY29tcGxldGVUcmlnZ2VyJykgbWF0QUNUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBsb29rdXBJdGVtcyQ6IE9ic2VydmFibGU8TG9va3VwSXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGxvb2t1cEl0ZW1zOiBMb29rdXBJdGVtW10gPSBbXTtcclxuXHJcbiAgc2VsZWN0ZWRJdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcbiAgY2FzY2FkZWRJZHo6IG51bWJlcltdID0gW107XHJcbiAgaXNSZXF1aXJlZDogYm9vbGVhbj0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBmaWVsZDogRmllbGRJbmZvO1xyXG4gIC8vXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBkZWZhdWx0VmFsdWU6IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICBwYXRoUGFyYW06IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICByZWFkb25seSA6IGJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkVmFsdWU6IEV2ZW50RW1pdHRlcjxMb29rdXBJdGVtW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBxdWVzdGlvbiA9ICdXb3VsZCB5b3UgbGlrZSB0byBhZGQgP1wiJztcclxuXHJcbiAgbXVsdGlDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLCBwcml2YXRlICB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuZm9ybSA9IHRoaXMucm9vdEZvcm1Hcm91cC5jb250cm9sO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICB0aGlzLm11bHRpQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCh0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZmllbGQ/LnByb3BlcnR5XSk7XHJcblxyXG4gICAgdGhpcy5tdWx0aUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpZWxkQXR0cmlidXRlcygpO1xyXG5cclxuICAgIGlmICghdGhpcy5maWVsZC5hY2NlcHROZXdJdGVtKXtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLm11bHRpQ29udHJvbC5zZXRWYWxpZGF0b3JzKFtSZXF1aXJlTWF0Y2hdKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm11bHRpQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZmllbGQ/LnByb3BlcnR5XT8udmFsdWUpO1xyXG5cclxuICAgIHRoaXMubXVsdGlDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoIHYgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcclxuICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJMb29rdXBJdGVtcyh2LCBudWxsKTt9LCA3MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyB0aGlzLm11bHRpQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgLy8gICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHRoaXMuZmlsdGVyTG9va3VwSXRlbXModiwgbnVsbCk7XHJcbiAgICAvLyB9KVxyXG4gICAgLy8gdGhpcy5maWx0ZXJBdXRvQ29tcGxldGVEYXRhKHRoaXMuZmllbGQucHJvcGVydHkpO1xyXG5cclxuICAgIHRoaXMuZ2V0TG9va3VwRGF0YSgpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICB0aGlzLmZvcm0/LmdldCh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGRJdGVtc0lmQ2FzY2FkZWRCeVJlbW92ZWQodik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRmllbGRBdHRyaWJ1dGVzKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGQucmVhZG9ubHkpIHtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICB0aGlzLmlzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZC5yZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZmllbGQ/LnByb3BlcnR5XS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgIHRoaXMuZm9ybT8uY29udHJvbHNbdGhpcy5maWVsZD8ucHJvcGVydHldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG4gICAgICB0aGlzLmlzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tdWx0aUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVDaGlsZEl0ZW1zSWZDYXNjYWRlZEJ5UmVtb3ZlZCh2KSB7XHJcbiAgICB0aGlzLmNhc2NhZGVkSWR6ID0gW107XHJcbiAgICB2LmZvckVhY2goYSA9PiB7XHJcbiAgICAgIHRoaXMuY2FzY2FkZWRJZHoucHVzaChhLmlkKTtcclxuICAgIH0pO1xyXG4gICAgbGV0IHRvRGVsZXRlSWR6ID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXM/LmZvckVhY2goeCA9PiB7XHJcbiAgICAgIGNvbnN0IGRlbCA9IHRoaXMuY2FzY2FkZWRJZHouZmluZEluZGV4KHkgPT4geSA9PT0geFt0aGlzLmZpZWxkLmNhc2NhZGVkQnldPy5pZCk7XHJcbiAgICAgIGlmIChkZWwgPCAwKSB7XHJcbiAgICAgICAgdG9EZWxldGVJZHoucHVzaCh4WydpZCddKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRvRGVsZXRlSWR6KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5maWx0ZXIocyA9PiAhdG9EZWxldGVJZHouaW5jbHVkZXMocy5pZCkpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpLnBhdGNoVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyh7ZGVmYXVsdFZhbHVlLCBmaWVsZH06IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMucGF0Y2hMb29rdXBWYWx1ZShkZWZhdWx0VmFsdWU/LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICBpZiAoZmllbGQ/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmZpZWxkID0gZmllbGQuY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb29rdXBEYXRhKCkge1xyXG4gICAgY29uc3QgbGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QgPSBidWlsZEl0ZW1zTGlzdCgnJywgdGhpcy5maWVsZC5sb29rdXBBcGlQYXRoKTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QoKTtcclxuICAgIGZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSk/LnZhbHVlPy5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZHoucHVzaChhLmlkKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkgJiYgdGhpcy5jYXNjYWRlZElkej8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICBrZXk6ICdpZCcsIGZpZWxkTmFtZTogdGhpcy5maWVsZC5jYXNjYWRlZEJ5LCBsYWJlbDogJycsXHJcbiAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUicsIG9wZXJhdG9yOiAnSU4nLFxyXG4gICAgICAgIHZhbHVlT2JqZWN0OiB0aGlzLmNhc2NhZGVkSWR6XHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJSZXF1ZXN0LmNvbHVtbnMgPSBbJ2lkJywnY29kZScsJ2VuZ2xpc2hOYW1lJywnYXJhYmljTmFtZSddO1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldExvb2t1cEl0ZW1zQnlNdWx0aUZpbHRlcihsaXN0SXRlbXMsIGZpbHRlclJlcXVlc3QpLnN1YnNjcmliZSgocmVzcCA9PiB7XHJcbiAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5sb29rdXBJdGVtcyA9IHRoaXMuZmllbGQuaW5jbHVkZUFsbE9wdGlvbiA/IFtBTExfSVRFTV0uY29uY2F0KHJlc3AuYm9keSkgOiByZXNwLmJvZHk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KCdpZCcpPy52YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wYXRjaExvb2t1cFZhbHVlKHRoaXMubG9va3VwSXRlbXM/LmZpbmQobCA9PiBsLmRlZmF1bHRWYWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUodGhpcy5tdWx0aUNvbnRyb2wudmFsdWUpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgIH0pKTtcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHRoaXMucGF0Y2hMb29rdXBWYWx1ZSh0aGlzLm11bHRpQ29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdGVkKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZS5pZCAhPT0gLTEgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChpID0+IGkuaWQgPT09IHZhbHVlLmlkKSA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5wdXNoKHZhbHVlKTtcclxuICAgICAgdGhpcy5pdGVtSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcGxheUZuKHNlbGVjdGVkOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWQuZW5nbGlzaE5hbWUgOiB1bmRlZmluZWQ7XHJcblxyXG4gIH1cclxuICBpc1NlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcz8uc29tZShzZWxlY3RlZCA9PiBzZWxlY3RlZC5pZCA9PT0gaXRlbS5pZCk7IC8vIFVzZSB5b3VyIHVuaXF1ZSBpZGVudGlmaWVyXHJcbiAgfVxyXG5cclxuICBfYWxsb3dTZWxlY3Rpb24ob3B0aW9uOiBMb29rdXBJdGVtKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ3ByZXZlbnQtc2VsZWN0aW9uJzogb3B0aW9uLmlkID09PSAtMSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGl0ZW1OYW1lQnlMYWcoaXRlbTogYW55KTogc3RyaW5nIHtcclxuICAgIC8vIHJldHVybiBpdGVtLmFyYWJpY05hbWU7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldERlZmF1bHRMYW5nKCkgPT09ICdlbicgPyBpdGVtLmVuZ2xpc2hOYW1lIDogaXRlbS5hcmFiaWNOYW1lXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2x1bW5zID0gWydpZCcsJ2NvZGUnLCdlbmdsaXNoTmFtZScsJ2FyYWJpY05hbWUnXTtcclxuXHJcbiAgZmlsdGVyTG9va3VwSXRlbXMobmFtZTogYW55LCB0cmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSB7XHJcbiAgICBpZiAodHJpZ2dlcikge1xyXG4gICAgICB0cmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBuYW1lID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QgPSBidWlsZEl0ZW1zTGlzdChuYW1lLCB0aGlzLmZpZWxkLmxvb2t1cEFwaVBhdGgpO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gdGhpcy5maWVsZC5sb29rdXBGaWx0ZXJMaXN0IHx8IFtdO1xyXG4gICAgZmlsdGVyUmVxdWVzdC5zZWFyY2hTdHIgPSBuYW1lO1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSk/LnZhbHVlPy5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZHoucHVzaChhLmlkKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkgJiYgdGhpcy5jYXNjYWRlZElkej8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICBrZXk6ICdpZCcsam9pbk9iamVjdE5hbWU6IHRoaXMuZmllbGQuY2FzY2FkZWRCeSwgZmllbGROYW1lOiB0aGlzLmZpZWxkLmNhc2NhZGVkQnksIGxhYmVsOiAnJyxcclxuICAgICAgICBmaWx0ZXJUeXBlOiAnRklMRURfRklMVEVSJywgb3BlcmF0b3I6ICdJTicsXHJcbiAgICAgICAgdmFsdWVPYmplY3Q6IHRoaXMuY2FzY2FkZWRJZHpcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlclJlcXVlc3QuY29sdW1ucyA9IFsuLi50aGlzLl9jb2x1bW5zLCAuLi4odGhpcy5maWVsZC5leHRyYUxvb2t1cHNDb2x1bW5zID8/IFtdKV07XHJcblxyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRMb29rdXBJdGVtc0J5TXVsdGlGaWx0ZXIobGlzdEl0ZW1zLCBmaWx0ZXJSZXF1ZXN0KS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXN1bHQgLS0+JywgcmVzcCk7XHJcbiAgICAgIGxldCBpdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcbiAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgLy8gcmVzcC5ib2R5LmZvckVhY2gociA9PiBpdGVtcy5wdXNoKHIpKTtcclxuICAgICAgICBpdGVtcyA9IHJlc3AuYm9keS5maWx0ZXIoaXRlbSA9PlxyXG4gICAgICAgICAgLy8gKGl0ZW0uZW5nbGlzaE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICAvLyBpdGVtLmFyYWJpY05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5maW5kSW5kZXgoIGk9PiBpLmlkID09PWl0ZW0uaWQgKSA9PT0tMSApO1xyXG4gICAgICAgIGlmICghaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWVsZC5hY2NlcHROZXdJdGVtID9cclxuICAgICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMiwgZW5nbGlzaE5hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lLCBhcmFiaWNOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZX0pKTpcclxuICAgICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpIDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmllbGQuYWNjZXB0TmV3SXRlbSA/XHJcbiAgICAgICAgICBpdGVtcz8ucHVzaChuZXcgTG9va3VwSXRlbSh7aWQ6IC0yLCBlbmdsaXNoTmFtZTogdGhpcy5xdWVzdGlvbiArIG5hbWUsIGFyYWJpY05hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lfSkpOlxyXG4gICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpIDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvb2t1cEl0ZW1zJCA9IG9mKGl0ZW1zKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaExvb2t1cFZhbHVlKGRlZmF1bHRWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgIC8vIHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5wYXRjaFZhbHVlKGRlZmF1bHRWYWx1ZSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wucGF0Y2hWYWx1ZShkZWZhdWx0VmFsdWUsIHtlbWl0RXZlbnQ6IHRydWV9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZShpdGVtOiBMb29rdXBJdGVtKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSkucGF0Y2hWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMsIHtlbWl0RXZlbnQ6IHRydWV9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBtYXRFcnJvckRlc2NyaWJlZEJ5KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQ/LnByb3BlcnR5KTtcclxuICAgIGlmICghY29udHJvbCB8fCAhdGhpcy5maWVsZD8ucHJvcGVydHkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCB2aXNpYmxlID1cclxuICAgICAgKGNvbnRyb2wudmFsdWUgfHwgY29udHJvbC52YWx1ZSA9PT0gMCkgJiYgY29udHJvbC5zdGF0dXMgPT09ICdJTlZBTElEJztcclxuICAgIHJldHVybiB2aXNpYmxlID8gYGVycm9yLSR7dGhpcy5maWVsZC5wcm9wZXJ0eX1gIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldExhYmVsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuZmllbGQubGFiZWwpO1xyXG4gIH1cclxuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgdGhpcy5maWx0ZXJMb29rdXBJdGVtcygnJywgYXV0b2NvbXBsZXRlVHJpZ2dlcik7XHJcbiAgICAgIGF1dG9jb21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuTG9va3VwUGFuZWwoYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcik6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJMb29rdXBJdGVtcygnJywgYXV0b2NvbXBsZXRlVHJpZ2dlcik7XHJcbiAgICBhdXRvY29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gIH1cclxuICBnZXRJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BlcnR5O1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5maWVsZFwiIGNsYXNzPVwibWFpbi1tdWx0aS1hdXRvXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1hdEZpZWxkXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBmbG9hdExhYmVsPVwiYWx3YXlzXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgZ2V0TGFiZWwoKSB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LWNoaXAtbGlzdGJveCAjY2hpcExpc3QgW3NlbGVjdGFibGVdPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxtYXQtY2hpcFxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtc1wiXHJcbiAgICAgICAgICBbcmVtb3ZhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgKHJlbW92ZWQpPVwicmVtb3ZlKGl0ZW0pXCI+XHJcbiAgICAgICAgICB7eyBpdGVtTmFtZUJ5TGFnKGl0ZW0pIH19XHJcbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhdGhpcy5maWVsZC5yZWFkb25seVwiIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgICAgICA8L21hdC1jaGlwPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImNoaXAtaW5wdXRcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgIFtpZF09XCJnZXRJZCgpXCIgI2l0ZW1JbnB1dFxyXG4gICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibXVsdGlDb250cm9sXCJcclxuICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCIgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50LCBhdXRvY29tcGxldGVUcmlnZ2VyKVwiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICNhdXRvY29tcGxldGVUcmlnZ2VyPVwibWF0QXV0b2NvbXBsZXRlVHJpZ2dlclwiXHJcbiAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibWF0RXJyb3JEZXNjcmliZWRCeVwiXHJcbiAgICAgICAgPlxyXG4gICAgICA8L21hdC1jaGlwLWxpc3Rib3g+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJhcnJvd19kcm9wX2Rvd25fYXV0b2NvbXBsZXRlXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLm9wZW5Mb29rdXBPcHRpb25zJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5Mb29rdXBQYW5lbChhdXRvY29tcGxldGVUcmlnZ2VyKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiBhdXRvQWN0aXZlRmlyc3RPcHRpb24gW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQub3B0aW9uLnZhbHVlKVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQucmVhZG9ubHlcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mICBsb29rdXBJdGVtcyQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5yZWFkb25seSB8fCBpc1NlbGVjdGVkKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgIHt7IGl0ZW1OYW1lQnlMYWcoaXRlbSkgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3JcIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFDLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUl2RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FB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O2tIQU11QixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1ksWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBV2hDLEtBQUs7c0JBREosS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixLQUFLO2dCQUlOLGFBQWE7c0JBRFosTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QUxMX0lURU0sIExvb2t1cEl0ZW19IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtGaWVsZEluZm99IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlc1wiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7R2V0SXRlbXNMaXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9nZXQtaXRlbXMtbGlzdFwiO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtNYXRDaGlwLCBNYXRDaGlwTGlzdGJveH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoaXBzXCI7XHJcbmltcG9ydCB7QXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtNYXRJbnB1dH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XHJcbmltcG9ydCB7YnVpbGRJdGVtc0xpc3R9IGZyb20gXCIuLi8uLi91dGlscy9iYXNlLXV0aWxzXCI7XHJcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XHJcbmltcG9ydCB7UmVxdWlyZU1hdGNofSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9yc1wiO1xyXG5pbXBvcnQgeyBNYXRDaGlwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1tdWx0aS1hdXRvLWNvbXBsZXRlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdEZvcm1GaWVsZCxcclxuICAgIE1hdENoaXAsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0Q2hpcHNNb2R1bGUsXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTWF0SWNvbixcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBNYXRBdXRvY29tcGxldGUsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBBc3luY1BpcGUsXHJcbiAgICBOZ0lmLFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL211bHRpLWF1dG8tY29tcGxldGUuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpQXV0b0NvbXBsZXRlQ29tcG9uZW50IHtcclxuLy8gQHRzLWlnbm9yZVxyXG4gIEBWaWV3Q2hpbGQoJ2l0ZW1JbnB1dCcpIGl0ZW1JbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdhdXRvY29tcGxldGVUcmlnZ2VyJykgbWF0QUNUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBsb29rdXBJdGVtcyQ6IE9ic2VydmFibGU8TG9va3VwSXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGxvb2t1cEl0ZW1zOiBMb29rdXBJdGVtW10gPSBbXTtcclxuXHJcbiAgc2VsZWN0ZWRJdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcbiAgY2FzY2FkZWRJZHo6IG51bWJlcltdID0gW107XHJcbiAgaXNSZXF1aXJlZDogYm9vbGVhbj0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBmaWVsZDogRmllbGRJbmZvO1xyXG4gIC8vXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBkZWZhdWx0VmFsdWU6IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICBwYXRoUGFyYW06IGFueTtcclxuXHJcbiAgQElucHV0KClcclxuICByZWFkb25seSA6IGJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgbGFiZWxzU2VjdGlvbj86IHN0cmluZztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWRWYWx1ZTogRXZlbnRFbWl0dGVyPExvb2t1cEl0ZW1bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRvIGFkZCA/XCInO1xyXG5cclxuICBtdWx0aUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYWNrZW5kU2VydmljZTogQmFja2VuZFNlcnZpY2UsIHByaXZhdGUgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICB0aGlzLm11bHRpQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChudWxsKTtcclxuICAgIHRoaXMudXBkYXRlRmllbGRBdHRyaWJ1dGVzKCk7XHJcblxyXG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmZpZWxkPy5wcm9wZXJ0eV0/LnZhbHVlO1xyXG4gICAgaWYgKGluaXRpYWxWYWx1ZSkge1xyXG4gICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUoaW5pdGlhbFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm11bHRpQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xyXG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyTG9va3VwSXRlbXModiwgbnVsbCk7XHJcbiAgICAgICAgfSwgNzAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5nZXRMb29rdXBEYXRhKCk7XHJcbiAgICBpZiAodGhpcy5maWVsZC5jYXNjYWRlZEJ5KSB7XHJcbiAgICAgIHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodiA9PiB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZEl0ZW1zSWZDYXNjYWRlZEJ5UmVtb3ZlZCh2KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpZWxkQXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zeW5jRm9ybUNvbnRyb2xTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jRm9ybUNvbnRyb2xTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0/LmdldCh0aGlzLmZpZWxkPy5wcm9wZXJ0eSk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICAgIGNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGQucmVxdWlyZWQpIHtcclxuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLnVwZGF0ZUlucHV0VmFsaWRhdG9ycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVJbnB1dFZhbGlkYXRvcnMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5yZWFkb25seSkge1xyXG4gICAgICB0aGlzLm11bHRpQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkLmFjY2VwdE5ld0l0ZW0pIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFJlcXVpcmVNYXRjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzU2VsZWN0ZWRJdGVtcyA9ICh0aGlzLnNlbGVjdGVkSXRlbXM/Lmxlbmd0aCA/PyAwKSA+IDA7XHJcbiAgICBpZiAodGhpcy5maWVsZC5yZXF1aXJlZCAmJiAhaGFzU2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgIHRoaXMuaXNSZXF1aXJlZCA9IHRoaXMuZmllbGQucmVxdWlyZWQgJiYgIWhhc1NlbGVjdGVkSXRlbXM7XHJcbiAgICB0aGlzLm11bHRpQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlQ2hpbGRJdGVtc0lmQ2FzY2FkZWRCeVJlbW92ZWQodikge1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgdi5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICB0aGlzLmNhc2NhZGVkSWR6LnB1c2goYS5pZCk7XHJcbiAgICB9KTtcclxuICAgIGxldCB0b0RlbGV0ZUlkeiA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICBjb25zdCBkZWwgPSB0aGlzLmNhc2NhZGVkSWR6LmZpbmRJbmRleCh5ID0+IHkgPT09IHhbdGhpcy5maWVsZC5jYXNjYWRlZEJ5XT8uaWQpO1xyXG4gICAgICBpZiAoZGVsIDwgMCkge1xyXG4gICAgICAgIHRvRGVsZXRlSWR6LnB1c2goeFsnaWQnXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0b0RlbGV0ZUlkeikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKHMgPT4gIXRvRGVsZXRlSWR6LmluY2x1ZGVzKHMuaWQpKTtcclxuICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLnByb3BlcnR5KS5wYXRjaFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcywge2VtaXRFdmVudDogdHJ1ZX0pO1xyXG4gICAgICB0aGlzLnN5bmNGb3JtQ29udHJvbFN0YXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyh7ZGVmYXVsdFZhbHVlLCBmaWVsZH06IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIHRoaXMucGF0Y2hMb29rdXBWYWx1ZShkZWZhdWx0VmFsdWU/LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICBpZiAoZmllbGQ/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmZpZWxkID0gZmllbGQuY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb29rdXBEYXRhKCkge1xyXG4gICAgY29uc3QgbGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QgPSBidWlsZEl0ZW1zTGlzdCgnJywgdGhpcy5maWVsZC5sb29rdXBBcGlQYXRoKTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QoKTtcclxuICAgIGZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSk/LnZhbHVlPy5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZHoucHVzaChhLmlkKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkgJiYgdGhpcy5jYXNjYWRlZElkej8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICBrZXk6ICdpZCcsIGZpZWxkTmFtZTogdGhpcy5maWVsZC5jYXNjYWRlZEJ5LCBsYWJlbDogJycsXHJcbiAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUicsIG9wZXJhdG9yOiAnSU4nLFxyXG4gICAgICAgIHZhbHVlT2JqZWN0OiB0aGlzLmNhc2NhZGVkSWR6XHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJSZXF1ZXN0LmNvbHVtbnMgPSBbJ2lkJywnY29kZScsJ2VuZ2xpc2hOYW1lJywnYXJhYmljTmFtZSddO1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldExvb2t1cEl0ZW1zQnlNdWx0aUZpbHRlcihsaXN0SXRlbXMsIGZpbHRlclJlcXVlc3QpLnN1YnNjcmliZSgocmVzcCA9PiB7XHJcbiAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5sb29rdXBJdGVtcyA9IHRoaXMuZmllbGQuaW5jbHVkZUFsbE9wdGlvbiA/IFtBTExfSVRFTV0uY29uY2F0KHJlc3AuYm9keSkgOiByZXNwLmJvZHk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KCdpZCcpPy52YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wYXRjaExvb2t1cFZhbHVlKHRoaXMubG9va3VwSXRlbXM/LmZpbmQobCA9PiBsLmRlZmF1bHRWYWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKTtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KSk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA/IHRoaXMuc2VsZWN0ZWRJdGVtcyA6IHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgc2VsZWN0ZWQodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlLmlkICE9PSAtMSAmJiB0aGlzLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KGkgPT4gaS5pZCA9PT0gdmFsdWUuaWQpID09PSAtMSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXM/LnB1c2godmFsdWUpO1xyXG4gICAgICB0aGlzLml0ZW1JbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSk/LnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgdGhpcy5zeW5jRm9ybUNvbnRyb2xTdGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcGxheUZuKHNlbGVjdGVkOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWQuZW5nbGlzaE5hbWUgOiB1bmRlZmluZWQ7XHJcblxyXG4gIH1cclxuICBpc1NlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcz8uc29tZShzZWxlY3RlZCA9PiBzZWxlY3RlZC5pZCA9PT0gaXRlbS5pZCk7IC8vIFVzZSB5b3VyIHVuaXF1ZSBpZGVudGlmaWVyXHJcbiAgfVxyXG5cclxuICBfYWxsb3dTZWxlY3Rpb24ob3B0aW9uOiBMb29rdXBJdGVtKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ3ByZXZlbnQtc2VsZWN0aW9uJzogb3B0aW9uLmlkID09PSAtMSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGl0ZW1OYW1lQnlMYWcoaXRlbTogYW55KTogc3RyaW5nIHtcclxuICAgIC8vIHJldHVybiBpdGVtLmFyYWJpY05hbWU7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldERlZmF1bHRMYW5nKCkgPT09ICdlbicgPyBpdGVtLmVuZ2xpc2hOYW1lIDogaXRlbS5hcmFiaWNOYW1lXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2x1bW5zID0gWydpZCcsJ2NvZGUnLCdlbmdsaXNoTmFtZScsJ2FyYWJpY05hbWUnXTtcclxuXHJcbiAgZmlsdGVyTG9va3VwSXRlbXMobmFtZTogYW55LCB0cmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSB7XHJcbiAgICBpZiAodHJpZ2dlcikge1xyXG4gICAgICB0cmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBuYW1lID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QgPSBidWlsZEl0ZW1zTGlzdChuYW1lLCB0aGlzLmZpZWxkLmxvb2t1cEFwaVBhdGgpO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gdGhpcy5maWVsZC5sb29rdXBGaWx0ZXJMaXN0IHx8IFtdO1xyXG4gICAgZmlsdGVyUmVxdWVzdC5zZWFyY2hTdHIgPSBuYW1lO1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSk/LnZhbHVlPy5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZHoucHVzaChhLmlkKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkgJiYgdGhpcy5jYXNjYWRlZElkej8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICBrZXk6ICdpZCcsam9pbk9iamVjdE5hbWU6IHRoaXMuZmllbGQuY2FzY2FkZWRCeSwgZmllbGROYW1lOiB0aGlzLmZpZWxkLmNhc2NhZGVkQnksIGxhYmVsOiAnJyxcclxuICAgICAgICBmaWx0ZXJUeXBlOiAnRklMRURfRklMVEVSJywgb3BlcmF0b3I6ICdJTicsXHJcbiAgICAgICAgdmFsdWVPYmplY3Q6IHRoaXMuY2FzY2FkZWRJZHpcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlclJlcXVlc3QuY29sdW1ucyA9IFsuLi50aGlzLl9jb2x1bW5zLCAuLi4odGhpcy5maWVsZC5leHRyYUxvb2t1cHNDb2x1bW5zID8/IFtdKV07XHJcblxyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRMb29rdXBJdGVtc0J5TXVsdGlGaWx0ZXIobGlzdEl0ZW1zLCBmaWx0ZXJSZXF1ZXN0KS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXN1bHQgLS0+JywgcmVzcCk7XHJcbiAgICAgIGxldCBpdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcbiAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgLy8gcmVzcC5ib2R5LmZvckVhY2gociA9PiBpdGVtcy5wdXNoKHIpKTtcclxuICAgICAgICBpdGVtcyA9IHJlc3AuYm9keS5maWx0ZXIoaXRlbSA9PlxyXG4gICAgICAgICAgLy8gKGl0ZW0uZW5nbGlzaE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICAvLyBpdGVtLmFyYWJpY05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5maW5kSW5kZXgoIGk9PiBpLmlkID09PWl0ZW0uaWQgKSA9PT0tMSApO1xyXG4gICAgICAgIGlmICghaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWVsZC5hY2NlcHROZXdJdGVtID9cclxuICAgICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMiwgZW5nbGlzaE5hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lLCBhcmFiaWNOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZX0pKTpcclxuICAgICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpIDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmllbGQuYWNjZXB0TmV3SXRlbSA/XHJcbiAgICAgICAgICBpdGVtcz8ucHVzaChuZXcgTG9va3VwSXRlbSh7aWQ6IC0yLCBlbmdsaXNoTmFtZTogdGhpcy5xdWVzdGlvbiArIG5hbWUsIGFyYWJpY05hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lfSkpOlxyXG4gICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpIDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvb2t1cEl0ZW1zJCA9IG9mKGl0ZW1zKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaExvb2t1cFZhbHVlKGRlZmF1bHRWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB0aGlzLnN5bmNGb3JtQ29udHJvbFN0YXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmUoaXRlbTogTG9va3VwSXRlbSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpLnBhdGNoVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XHJcbiAgICAgIHRoaXMuc3luY0Zvcm1Db250cm9sU3RhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBsYWNlaG9sZGVyS2V5KCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQ/LnBsYWNlaG9sZGVyKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbmZpZ3VyZWRLZXkgPSB0aGlzLmZpZWxkLnBsYWNlaG9sZGVyO1xyXG4gICAgaWYgKCF0aGlzLmxhYmVsc1NlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIGNvbmZpZ3VyZWRLZXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZmlndXJlZEtleS5zdGFydHNXaXRoKHRoaXMubGFiZWxzU2VjdGlvbilcclxuICAgICAgPyBjb25maWd1cmVkS2V5XHJcbiAgICAgIDogYCR7dGhpcy5sYWJlbHNTZWN0aW9ufS4ke2NvbmZpZ3VyZWRLZXl9YDtcclxuICB9XHJcblxyXG4gIGdldCBzaG93SW5wdXRQbGFjZWhvbGRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMuZmllbGQ/LnBsYWNlaG9sZGVyICYmICh0aGlzLnNlbGVjdGVkSXRlbXM/Lmxlbmd0aCA/PyAwKSA9PT0gMDtcclxuICB9XHJcblxyXG4gIG9uSW5wdXRDbGljayhhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWVsZD8ucmVhZG9ubHkgfHwgdGhpcy5yZWFkb25seSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZW5Mb29rdXBQYW5lbChhdXRvY29tcGxldGVUcmlnZ2VyKTtcclxuICB9XHJcblxyXG4gIG9uVHJpZ2dlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmZpZWxkPy5yZWFkb25seSB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMub3Blbkxvb2t1cFBhbmVsKGF1dG9jb21wbGV0ZVRyaWdnZXIpO1xyXG4gIH1cclxuXHJcbiAgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBhdXRvY29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyTG9va3VwSXRlbXMoJycsIGF1dG9jb21wbGV0ZVRyaWdnZXIpO1xyXG4gICAgICBhdXRvY29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3Blbkxvb2t1cFBhbmVsKGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyTG9va3VwSXRlbXMoJycsIGF1dG9jb21wbGV0ZVRyaWdnZXIpO1xyXG4gICAgYXV0b2NvbXBsZXRlVHJpZ2dlci5vcGVuUGFuZWwoKTtcclxuICB9XHJcbiAgZ2V0SWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wZXJ0eTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkXCIgY2xhc3M9XCJtYWluLW11bHRpLWF1dG9cIj5cclxuICA8ZGl2IGNsYXNzPVwibWF0LWZpZWxkLXdyYXBwZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiPlxyXG4gICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+XHJcbiAgICAgICAge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LWNvbnRyb2xcIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aCBtdWx0aS1hdXRvY29tcGxldGUtZmllbGRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgIDxtYXQtY2hpcC1saXN0Ym94ICNjaGlwTGlzdCBjbGFzcz1cImNoaXAtbGlzdGJveFwiIFtzZWxlY3RhYmxlXT1cInRydWVcIj5cclxuICAgICAgICAgIDxtYXQtY2hpcFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY2hpcFwiXHJcbiAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZShpdGVtKVwiPlxyXG4gICAgICAgICAgICB7eyBpdGVtTmFtZUJ5TGFnKGl0ZW0pIH19XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFmaWVsZC5yZWFkb25seVwiIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvbWF0LWNoaXA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgY2xhc3M9XCJjaGlwLWlucHV0IGFwcC1pbnB1dFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgW2lkXT1cImdldElkKClcIlxyXG4gICAgICAgICAgICAjaXRlbUlucHV0XHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJtdWx0aUNvbnRyb2xcIlxyXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2hvd0lucHV0UGxhY2Vob2xkZXIgPyAoZ2V0UGxhY2Vob2xkZXJLZXkoKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXHJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRDbGljayhhdXRvY29tcGxldGVUcmlnZ2VyKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudCwgYXV0b2NvbXBsZXRlVHJpZ2dlcilcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAjYXV0b2NvbXBsZXRlVHJpZ2dlcj1cIm1hdEF1dG9jb21wbGV0ZVRyaWdnZXJcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiPlxyXG4gICAgICAgIDwvbWF0LWNoaXAtbGlzdGJveD5cclxuXHJcbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcclxuICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgIGF1dG9BY3RpdmVGaXJzdE9wdGlvblxyXG4gICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiXHJcbiAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWQoJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQucmVhZG9ubHlcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsb29rdXBJdGVtcyQgfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICB7eyBpdGVtTmFtZUJ5TGFnKGl0ZW0pIH19XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cIm11bHRpLXNlbGVjdC1hcnJvdy10cmlnZ2VyXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHkgfHwgcmVhZG9ubHlcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUub3Blbkxvb2t1cE9wdGlvbnMnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICBbYXR0ci5pZF09XCInbXVsdGktc2VsZWN0LXRyaWdnZXItJyArIGZpZWxkLnByb3BlcnR5XCJcclxuICAgICAgICAoY2xpY2spPVwib25UcmlnZ2VyQ2xpY2soJGV2ZW50LCBhdXRvY29tcGxldGVUcmlnZ2VyKVwiPlxyXG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIGZvY3VzYWJsZT1cImZhbHNlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTcgMTBsNSA1IDUtNXpcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=