@byuhbll/components 0.0.18 → 0.0.20

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.
@@ -87,7 +87,7 @@ export class HbllMultiSelectComponent {
87
87
  }
88
88
  }
89
89
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
90
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllMultiSelectComponent, isStandalone: true, selector: "lib-hbll-multi-select", inputs: { allOptions: "allOptions", label: "label", selectedKeys: "selectedKeys" }, outputs: { selectedKeysChange: "selectedKeysChange" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"hbll-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <label class=\"hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".hbll-multi-select{font:inherit;font-size:1em}.hbll-multi-select mat-form-field{font-size:inherit;width:100%}.hbll-multi-select mat-form-field input{font:inherit}.hbll-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input{margin-left:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.hbll-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.hbll-multi-select .icon{font-size:1em}.hbll-multi-select mat-autocomplete{font-family:inherit}.hbll-multi-select .mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{font-family:inherit;font-size:inherit}.hbll-multi-select .hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i2.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.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: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllMultiSelectComponent, isStandalone: true, selector: "lib-hbll-multi-select", inputs: { allOptions: "allOptions", label: "label", selectedKeys: "selectedKeys" }, outputs: { selectedKeysChange: "selectedKeysChange" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"hbll-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <label class=\"hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".hbll-multi-select mat-form-field{font-size:inherit;width:100%}.hbll-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input{margin-left:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.hbll-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.hbll-multi-select .hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i2.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.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: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
91
91
  }
92
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, decorators: [{
93
93
  type: Component,
@@ -98,7 +98,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
98
98
  MatAutocompleteModule,
99
99
  ReactiveFormsModule,
100
100
  MatIconModule,
101
- ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"hbll-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <label class=\"hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".hbll-multi-select{font:inherit;font-size:1em}.hbll-multi-select mat-form-field{font-size:inherit;width:100%}.hbll-multi-select mat-form-field input{font:inherit}.hbll-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input{margin-left:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.hbll-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.hbll-multi-select .icon{font-size:1em}.hbll-multi-select mat-autocomplete{font-family:inherit}.hbll-multi-select .mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{font-family:inherit;font-size:inherit}.hbll-multi-select .hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"] }]
101
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"hbll-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <label class=\"hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".hbll-multi-select mat-form-field{font-size:inherit;width:100%}.hbll-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input{margin-left:0}.hbll-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.hbll-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.hbll-multi-select .hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"] }]
102
102
  }], propDecorators: { inputRef: [{
103
103
  type: ViewChild,
104
104
  args: ['input']
@@ -111,4 +111,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
111
111
  }], selectedKeysChange: [{
112
112
  type: Output
113
113
  }] } });
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtbXVsdGktc2VsZWN0L2hibGwtbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLW11bHRpLXNlbGVjdC9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gscUJBQXFCLEdBRXhCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFxQixjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQW9CaEQsTUFBTSxPQUFPLHdCQUF3QjtJQWxCckM7UUFvQmEsZUFBVSxHQUEyQixFQUFFLENBQUM7UUFDeEMsVUFBSyxH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Q0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7OEdBaERRLHdCQUF3QjtrR0FBeEIsd0JBQXdCLCtUQ3pDckMscXJEQXlDQSxxNkJEZFEsWUFBWSxnSkFDWixjQUFjLDR1QkFDZCxrQkFBa0IseU9BQ2xCLHFCQUFxQix3MUJBQ3JCLG1CQUFtQix5a0JBQ25CLGFBQWE7OzJGQVNSLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0ksdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsYUFBYTtxQkFDaEIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs4QkFLbkIsUUFBUTtzQkFBbkMsU0FBUzt1QkFBQyxPQUFPO2dCQUNULFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWhibGwtbXVsdGktc2VsZWN0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRDaGlwc01vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgXSxcbiAgICAvLyBOZWNlc3NhcnkgdG8gb3ZlcnJpZGUgbWF0ZXJpYWwgZGVzaWduIHN0eWxlcy5cbiAgICAvLyBJTVBPUlRBTlQ6IFRpZ2h0bHkgc2NvcGUgY2xhc3NlcyBhbmQgaWRzIHRvIHRoaXMgY29tcG9uZW50IGlmIHRoZXkgYXJlIG5lY2Vzc2FyeS5cbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IHtcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIEBJbnB1dCgpIGFsbE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGtleXMgYXJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBBbiBFdmVudEVtaXR0ZXIgdGhhdCBlbWl0cyBhbiBhcnJheSBvZiBrZXlzIGluZGljYXRpbmcgd2hpY2ggb3B0aW9ucyBhcmUgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3RlZEtleXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgcHJvdGVjdGVkIGZpbHRlcmVkT3B0aW9ucyQ6IE9ic2VydmFibGU8c3RyaW5nW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5c0NoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHN0YXJ0V2l0aChbXSkpLFxuICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW2tleV06IFtzdHJpbmcgfCBudWxsLCB1bmtub3duXSkgPT5cbiAgICAgICAgICAgIC8vIERpc3BsYXkgZmlsdGVyZWQgb3B0aW9ucyBpZiB0aGVyZSBpcyBhIHZhbHVlLCBlbHNlIGRpc3BsYXkgYWxsIG9wdGlvbnMgY3VycmVudGx5IG5vdCBzZWxlY3RlZC5cbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgID8gdGhpcy5maWx0ZXJPcHRpb25zKGtleSlcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5rZXlzKHRoaXMuYWxsT3B0aW9ucykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgIChrZXkpID0+ICF0aGlzLnNlbGVjdGVkS2V5cy5maW5kKChzZWxlY3RlZE9wdGlvbikgPT4ga2V5ID09PSBzZWxlY3RlZE9wdGlvbiksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleS5cbiAgICAgKiBUaGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbXVzdCBtYXRjaCBhIGtleSBmcm9tIHRoZSByZWNvcmQgb2YgYWxsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtNYXRDaGlwSW5wdXRFdmVudH0gZXZlbnQgTWF0Q2hpcElucHV0RXZlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkT3B0aW9uKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5IGZyb20gdGhlIGFycmF5IG9mIHNlbGVjdGVkIG9wdGlvbnMgYW5kIGVtaXRzIHRoZSBuZXcgc2VsZWN0ZWQga2V5cy5cbiAgICAgKiBAcGFyYW0ge011bHRpU2VsZWN0S2V5VmFsUGFpcn0ga2V5IGtleSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlT3B0aW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEtleXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBvcHRpb24gdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleXMgd2hlbiBhIHVzZXIgc2VsZWN0cyBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHtNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50fSBldmVudCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbiA9IChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIG9wdGlvbnMgYnkgdGhlIHN1cHBsaWVkIGtleSBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQga2V5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIGZpbHRlciBieS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IHRoZSBmaWx0ZXJlZCBrZXlzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zID0gKG5ld0tleTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hbGxPcHRpb25zKS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IHRoaXMuYWxsT3B0aW9uc1trZXldICE9PSBuZXdLZXkgJiYgIXRoaXMuc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKGtleSksXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgdG8gdGhlIHNlbGVjdGVkIGtleXMgYXJyYXkgaWYgdGhlIG9wdGlvbiBpcyB0cnV0aHkgYW5kIG5vdCBhbHJlYWR5IGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGUgaW5wdXQgaXMgYWxzbyBjbGVhcmVkIChpZiBhdmFpbGFibGUpLCBhbmQgdGhlIG5ldyBzZWxlY3RlZCBrZXlzIGFyZSBlbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7a2V5fSBvcHRpb24ga2V5IHRvIGFkZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkT3B0aW9uVG9TZWxlY3RlZE9wdGlvbnMgPSAoa2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5zZWxlY3RlZEtleXMuaW5jbHVkZXMoa2V5KSAmJiB0aGlzLmFsbE9wdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkS2V5cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFJlZikgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cImhibGwtbXVsdGktc2VsZWN0XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsICsgJyBzZWxlY3Rpb24nXCI+XG4gICAgICAgICAgICBAZm9yIChrZXkgb2Ygc2VsZWN0ZWRLZXlzOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZU9wdGlvbihrZXkpXCIgZGF0YS10ZXN0aWQ9XCJtYXRDaGlwUm93XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGFsbE9wdGlvbnNba2V5XSB9fVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRDaGlwUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGFsbE9wdGlvbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCIncmVtb3ZlJyArIGtleVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImhpZGRlblwiIGZvcj1cImlucHV0XCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbCB8IHRpdGxlY2FzZVwiXG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlkPVwiaW5wdXRcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlucHV0Q29udHJvbFwiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBHcmlkXCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcbiAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImlucHV0XCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGtleSBvZiBmaWx0ZXJlZE9wdGlvbnMkIHwgYXN5bmM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJrZXlcIiBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhbGxPcHRpb25zW2tleV0gfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtbXVsdGktc2VsZWN0L2hibGwtbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLW11bHRpLXNlbGVjdC9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gscUJBQXFCLEdBRXhCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFxQixjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQW9CaEQsTUFBTSxPQUFPLHdCQUF3QjtJQWxCckM7UUFvQmEsZUFBVSxHQUEyQixFQUFFLENBQUM7UUFDeEMsVUFBSyxH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Q0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7OEdBaERRLHdCQUF3QjtrR0FBeEIsd0JBQXdCLCtUQ3pDckMscXJEQXlDQSx3bEJEZFEsWUFBWSxnSkFDWixjQUFjLDR1QkFDZCxrQkFBa0IseU9BQ2xCLHFCQUFxQix3MUJBQ3JCLG1CQUFtQix5a0JBQ25CLGFBQWE7OzJGQVNSLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0ksdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsYUFBYTtxQkFDaEIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs4QkFLbkIsUUFBUTtzQkFBbkMsU0FBUzt1QkFBQyxPQUFPO2dCQUNULFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWhibGwtbXVsdGktc2VsZWN0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRDaGlwc01vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgXSxcbiAgICAvLyBOZWNlc3NhcnkgdG8gb3ZlcnJpZGUgbWF0ZXJpYWwgZGVzaWduIHN0eWxlcy5cbiAgICAvLyBJTVBPUlRBTlQ6IFRpZ2h0bHkgc2NvcGUgY2xhc3NlcyBhbmQgaWRzIHRvIHRoaXMgY29tcG9uZW50IGlmIHRoZXkgYXJlIG5lY2Vzc2FyeS5cbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IHtcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIEBJbnB1dCgpIGFsbE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGtleXMgYXJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBBbiBFdmVudEVtaXR0ZXIgdGhhdCBlbWl0cyBhbiBhcnJheSBvZiBrZXlzIGluZGljYXRpbmcgd2hpY2ggb3B0aW9ucyBhcmUgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3RlZEtleXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgcHJvdGVjdGVkIGZpbHRlcmVkT3B0aW9ucyQ6IE9ic2VydmFibGU8c3RyaW5nW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5c0NoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHN0YXJ0V2l0aChbXSkpLFxuICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW2tleV06IFtzdHJpbmcgfCBudWxsLCB1bmtub3duXSkgPT5cbiAgICAgICAgICAgIC8vIERpc3BsYXkgZmlsdGVyZWQgb3B0aW9ucyBpZiB0aGVyZSBpcyBhIHZhbHVlLCBlbHNlIGRpc3BsYXkgYWxsIG9wdGlvbnMgY3VycmVudGx5IG5vdCBzZWxlY3RlZC5cbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgID8gdGhpcy5maWx0ZXJPcHRpb25zKGtleSlcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5rZXlzKHRoaXMuYWxsT3B0aW9ucykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgIChrZXkpID0+ICF0aGlzLnNlbGVjdGVkS2V5cy5maW5kKChzZWxlY3RlZE9wdGlvbikgPT4ga2V5ID09PSBzZWxlY3RlZE9wdGlvbiksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleS5cbiAgICAgKiBUaGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbXVzdCBtYXRjaCBhIGtleSBmcm9tIHRoZSByZWNvcmQgb2YgYWxsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtNYXRDaGlwSW5wdXRFdmVudH0gZXZlbnQgTWF0Q2hpcElucHV0RXZlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkT3B0aW9uKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5IGZyb20gdGhlIGFycmF5IG9mIHNlbGVjdGVkIG9wdGlvbnMgYW5kIGVtaXRzIHRoZSBuZXcgc2VsZWN0ZWQga2V5cy5cbiAgICAgKiBAcGFyYW0ge011bHRpU2VsZWN0S2V5VmFsUGFpcn0ga2V5IGtleSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlT3B0aW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEtleXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBvcHRpb24gdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleXMgd2hlbiBhIHVzZXIgc2VsZWN0cyBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHtNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50fSBldmVudCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbiA9IChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIG9wdGlvbnMgYnkgdGhlIHN1cHBsaWVkIGtleSBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQga2V5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkga2V5IHRvIGZpbHRlciBieS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IHRoZSBmaWx0ZXJlZCBrZXlzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zID0gKG5ld0tleTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hbGxPcHRpb25zKS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5OiBzdHJpbmcpID0+IHRoaXMuYWxsT3B0aW9uc1trZXldICE9PSBuZXdLZXkgJiYgIXRoaXMuc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKGtleSksXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgdG8gdGhlIHNlbGVjdGVkIGtleXMgYXJyYXkgaWYgdGhlIG9wdGlvbiBpcyB0cnV0aHkgYW5kIG5vdCBhbHJlYWR5IGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGUgaW5wdXQgaXMgYWxzbyBjbGVhcmVkIChpZiBhdmFpbGFibGUpLCBhbmQgdGhlIG5ldyBzZWxlY3RlZCBrZXlzIGFyZSBlbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7a2V5fSBvcHRpb24ga2V5IHRvIGFkZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkT3B0aW9uVG9TZWxlY3RlZE9wdGlvbnMgPSAoa2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5zZWxlY3RlZEtleXMuaW5jbHVkZXMoa2V5KSAmJiB0aGlzLmFsbE9wdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkS2V5cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFJlZikgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cImhibGwtbXVsdGktc2VsZWN0XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsICsgJyBzZWxlY3Rpb24nXCI+XG4gICAgICAgICAgICBAZm9yIChrZXkgb2Ygc2VsZWN0ZWRLZXlzOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZU9wdGlvbihrZXkpXCIgZGF0YS10ZXN0aWQ9XCJtYXRDaGlwUm93XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGFsbE9wdGlvbnNba2V5XSB9fVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRDaGlwUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGFsbE9wdGlvbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCIncmVtb3ZlJyArIGtleVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBpY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImhpZGRlblwiIGZvcj1cImlucHV0XCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbCB8IHRpdGxlY2FzZVwiXG4gICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgIGlkPVwiaW5wdXRcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlucHV0Q29udHJvbFwiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBHcmlkXCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcbiAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImlucHV0XCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGtleSBvZiBmaWx0ZXJlZE9wdGlvbnMkIHwgYXN5bmM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJrZXlcIiBkYXRhLXRlc3RpZD1cImF1dG9jb21wbGV0ZU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhbGxPcHRpb25zW2tleV0gfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=
@@ -242,7 +242,7 @@ export class AdvancedSearchComponent {
242
242
  return this.advancedSearchForm.controls.expandResults.controls.applyEquivalentSubjects;
243
243
  }
244
244
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
245
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"hidden\">Field {{ queryIndex }}</label>\n <div class=\"select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"hidden\">Query {{ queryIndex }}</label>\n <div class=\"query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"config.localAdvancedSearch.availableResourceTypes\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"config.localAdvancedSearch.availableCollections\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply related words -->\n <label class=\"checkbox-label\" for=\"applyRelatedWords\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyRelatedWords\"\n type=\"checkbox\"\n [formControlName]=\"'applyRelatedWords'\"\n data-testid=\"applyRelatedWords\"\n />\n <lib-hbll-checkbox [isChecked]=\"applyRelatedWords.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Apply related words</span>\n </label>\n <!-- Apply equivalent subjects -->\n <label class=\"checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <div id=\"dateOptions\">\n <h4>Date Published</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n <!-- Language -->\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n }\n </div>\n <div id=\"advSearchFooter\">\n <button libHbllPillBtn [color]=\"'blue'\" type=\"submit\" data-testid=\"advSearchSubmitButton\">\n Search\n </button>\n </div>\n</form>\n", styles: ["select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.select-wrapper{position:relative}.select-wrapper select{cursor:pointer;padding-right:2em}.select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}:host{box-sizing:border-box}:host *{box-sizing:inherit}.select-wrapper{margin-right:.3em}.row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.row-cancel:hover{color:#666}.row-cancel .icon{font-size:1em}.hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em}h4{margin-bottom:.3em;font-weight:600}.adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.query-input{display:inline-block;width:100%;margin-top:.4rem}.query-input input{width:100%}.other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.other-options label{margin-right:1rem}.checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.checkbox-label:not(:last-of-type){margin-bottom:.75em}.checkbox-label .label-text{margin-top:-.1em;margin-left:.45em}.checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:flex-end;font-size:1.2em}@media screen and (min-width: 615px){.adv-search-row{flex-wrap:nowrap}.other-options{grid-template-columns:repeat(2,1fr)}.query-input{margin-top:0}#dateOptions{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-hbll-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-hbll-checkbox", inputs: ["isChecked"] }, { kind: "directive", type: HbllPillBtnDirective, selector: "[libHbllPillBtn]", inputs: ["isDestructiveStyle", "isDisabled", "isFullWidth", "color"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
245
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"hidden\">Field {{ queryIndex }}</label>\n <div class=\"select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"hidden\">Query {{ queryIndex }}</label>\n <div class=\"query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"config.localAdvancedSearch.availableResourceTypes\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"config.localAdvancedSearch.availableCollections\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply related words -->\n <label class=\"checkbox-label\" for=\"applyRelatedWords\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyRelatedWords\"\n type=\"checkbox\"\n [formControlName]=\"'applyRelatedWords'\"\n data-testid=\"applyRelatedWords\"\n />\n <lib-hbll-checkbox [isChecked]=\"applyRelatedWords.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Apply related words</span>\n </label>\n <!-- Apply equivalent subjects -->\n <label class=\"checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <div id=\"dateOptions\">\n <h4>Date Published</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n <!-- Language -->\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n }\n </div>\n <div id=\"advSearchFooter\">\n <button libHbllPillBtn [color]=\"'blue'\" type=\"submit\" data-testid=\"advSearchSubmitButton\">\n Search\n </button>\n </div>\n</form>\n", styles: ["select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.select-wrapper{position:relative}.select-wrapper select{cursor:pointer;padding-right:2em}.select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}:host{box-sizing:border-box}:host *{box-sizing:inherit}.select-wrapper{margin-right:.3em}.row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.row-cancel:hover{color:#666}.row-cancel .icon{font-size:1em}.hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em}h4{margin-bottom:0;font-weight:600}.adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.query-input{display:inline-block;width:100%;margin-top:.4rem}.query-input input{width:100%}.other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.other-options label{margin-right:1rem}.checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.checkbox-label:not(:last-of-type){margin-bottom:.75em}.checkbox-label .label-text{margin-top:-.1em;margin-left:.45em}.checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:flex-end;font-size:1.2em}@media screen and (min-width: 615px){.adv-search-row{flex-wrap:nowrap}.other-options{grid-template-columns:repeat(2,1fr)}.query-input{margin-top:0}#dateOptions{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-hbll-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-hbll-checkbox", inputs: ["isChecked"] }, { kind: "directive", type: HbllPillBtnDirective, selector: "[libHbllPillBtn]", inputs: ["isDestructiveStyle", "isDisabled", "isFullWidth", "color"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
246
246
  }
247
247
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
248
248
  type: Component,
@@ -255,7 +255,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
255
255
  HbllCheckboxComponent,
256
256
  HbllPillBtnDirective,
257
257
  DateRangeComponent,
258
- ], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"hidden\">Field {{ queryIndex }}</label>\n <div class=\"select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"hidden\">Query {{ queryIndex }}</label>\n <div class=\"query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"config.localAdvancedSearch.availableResourceTypes\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"config.localAdvancedSearch.availableCollections\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply related words -->\n <label class=\"checkbox-label\" for=\"applyRelatedWords\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyRelatedWords\"\n type=\"checkbox\"\n [formControlName]=\"'applyRelatedWords'\"\n data-testid=\"applyRelatedWords\"\n />\n <lib-hbll-checkbox [isChecked]=\"applyRelatedWords.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Apply related words</span>\n </label>\n <!-- Apply equivalent subjects -->\n <label class=\"checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <div id=\"dateOptions\">\n <h4>Date Published</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n <!-- Language -->\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n }\n </div>\n <div id=\"advSearchFooter\">\n <button libHbllPillBtn [color]=\"'blue'\" type=\"submit\" data-testid=\"advSearchSubmitButton\">\n Search\n </button>\n </div>\n</form>\n", styles: ["select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.select-wrapper{position:relative}.select-wrapper select{cursor:pointer;padding-right:2em}.select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}:host{box-sizing:border-box}:host *{box-sizing:inherit}.select-wrapper{margin-right:.3em}.row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.row-cancel:hover{color:#666}.row-cancel .icon{font-size:1em}.hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em}h4{margin-bottom:.3em;font-weight:600}.adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.query-input{display:inline-block;width:100%;margin-top:.4rem}.query-input input{width:100%}.other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.other-options label{margin-right:1rem}.checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.checkbox-label:not(:last-of-type){margin-bottom:.75em}.checkbox-label .label-text{margin-top:-.1em;margin-left:.45em}.checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:flex-end;font-size:1.2em}@media screen and (min-width: 615px){.adv-search-row{flex-wrap:nowrap}.other-options{grid-template-columns:repeat(2,1fr)}.query-input{margin-top:0}#dateOptions{grid-column:span 2}}\n"] }]
258
+ ], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"hidden\">Field {{ queryIndex }}</label>\n <div class=\"select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"hidden\">Query {{ queryIndex }}</label>\n <div class=\"query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"config.localAdvancedSearch.availableResourceTypes\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"config.localAdvancedSearch.availableCollections\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply related words -->\n <label class=\"checkbox-label\" for=\"applyRelatedWords\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyRelatedWords\"\n type=\"checkbox\"\n [formControlName]=\"'applyRelatedWords'\"\n data-testid=\"applyRelatedWords\"\n />\n <lib-hbll-checkbox [isChecked]=\"applyRelatedWords.value\"></lib-hbll-checkbox>\n <span class=\"label-text\">Apply related words</span>\n </label>\n <!-- Apply equivalent subjects -->\n <label class=\"checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <div id=\"dateOptions\">\n <h4>Date Published</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n <!-- Language -->\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n }\n </div>\n <div id=\"advSearchFooter\">\n <button libHbllPillBtn [color]=\"'blue'\" type=\"submit\" data-testid=\"advSearchSubmitButton\">\n Search\n </button>\n </div>\n</form>\n", styles: ["select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.select-wrapper{position:relative}.select-wrapper select{cursor:pointer;padding-right:2em}.select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}:host{box-sizing:border-box}:host *{box-sizing:inherit}.select-wrapper{margin-right:.3em}.row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.row-cancel:hover{color:#666}.row-cancel .icon{font-size:1em}.hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em}h4{margin-bottom:0;font-weight:600}.adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.query-input{display:inline-block;width:100%;margin-top:.4rem}.query-input input{width:100%}.other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.other-options label{margin-right:1rem}.checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.checkbox-label:not(:last-of-type){margin-bottom:.75em}.checkbox-label .label-text{margin-top:-.1em;margin-left:.45em}.checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:flex-end;font-size:1.2em}@media screen and (min-width: 615px){.adv-search-row{flex-wrap:nowrap}.other-options{grid-template-columns:repeat(2,1fr)}.query-input{margin-top:0}#dateOptions{grid-column:span 2}}\n"] }]
259
259
  }], propDecorators: { config: [{
260
260
  type: Input,
261
261
  args: [{ required: true }]
@@ -268,4 +268,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
268
268
  type: ViewChild,
269
269
  args: [MatTooltip]
270
270
  }] } });
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVB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Qy9FLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDNUUsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBQ3JGLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUMzRixDQUFDOzhHQTdHUSx1QkFBdUI7a0dBQXZCLHVCQUF1QiwwU0FpQnJCLFVBQVUsZ0RDOUZ6QixpMFZBbVBBLHFoRURoTFEsWUFBWSw4QkFDWixtQkFBbUIsNDFEQUNuQixnQkFBZ0IsNFRBQ2hCLGFBQWEsK0JBQ2Isd0JBQXdCLG9KQUN4QixxQkFBcUIscUZBQ3JCLG9CQUFvQixtSUFDcEIsa0JBQWtCOzsyRkFHYix1QkFBdUI7a0JBaEJuQyxTQUFTOytCQUNJLHdCQUF3QixjQUN0QixJQUFJLFdBR1A7d0JBQ0wsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix3QkFBd0I7d0JBQ3hCLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixrQkFBa0I7cUJBQ3JCOzhCQUs4QixNQUFNO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFPZixjQUFjO3NCQUF2QixNQUFNO2dCQUcyQixXQUFXO3NCQUE1QyxTQUFTO3VCQUFDLGFBQWE7Z0JBSU8sWUFBWTtzQkFBMUMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgRm9ybUNvbnRyb2wsXG4gICAgRm9ybUdyb3VwLFxuICAgIE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwLCBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXIsXG4gICAgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVlcnlSb3csXG4gICAgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvbixcbiAgICBpc0FkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24sXG59IGZyb20gJy4uL21vZGVscy9hZHZhbmNlZC1zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTZWFyY2hDb25maWcgfSBmcm9tICcuLi9zcy1zZWFyY2gtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFEVkFOQ0VEX1NFQVJDSF9GSUVMRF9NQVAsXG4gICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMsXG4gICAgQURWQU5DRURfU0VBUkNIX1FVQUxJRklFUl9NQVAsXG4gICAgQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBIYmxsTXVsdGlTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oYmxsLW11bHRpLXNlbGVjdC9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGJsbENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGJsbC1jaGVja2JveC9oYmxsLWNoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBIYmxsUGlsbEJ0bkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvaGJsbC1waWxsLWJ0bi9oYmxsLXBpbGwtYnRuLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50JztcblxudHlwZSBRdWVyeVJvdyA9IHtcbiAgICBib29sZWFuOiBGb3JtQ29udHJvbDxBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb24+O1xuICAgIGZpZWxkOiBGb3JtQ29udHJvbDxcbiAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uXG4gICAgPjtcbiAgICBxdWFsaWZpZXI6IEZvcm1Db250cm9sPEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uPjtcbiAgICBxdWVyeTogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbn07XG5cbmNvbnN0IERBVEVfVkFMSURBVE9SX1JFR0VYID0gJ15bMC05XXs0fSQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1zcy1hZHZhbmNlZC1zZWFyY2gnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIEhibGxNdWx0aVNlbGVjdENvbXBvbmVudCxcbiAgICAgICAgSGJsbENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBIYmxsUGlsbEJ0bkRpcmVjdGl2ZSxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgY29uZmlnKGNvbmZpZzogU2VhcmNoQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgQE91dHB1dCgpIGFkdmFuY2VkU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG5cbiAgICAvLyBUaG91Z2ggbXVsdGlwbGUgaW5zdGFuY2VzIGV4aXN0cywgdGhpcyByZXByZXNlbnQgcXVlcnkgMS5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIC8vIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAvLyBJdCBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQgaWYgYSB1c2VyIHNlYXJjaGVzIGFnYWluc3QgYW4gZW1wdHkgcXVlcnkgKHNpbXBsZSBvciBxMSkuXG4gICAgLy8gQW55IGNoYW5nZSB0byB0aGUgc2VhcmNoIGZpZWxkIGRpc2FibGVzIHRoZSB0b29sdGlwLlxuICAgIEBWaWV3Q2hpbGQoTWF0VG9vbHRpcCkgcHJpdmF0ZSBpbnB1dFRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGBGb3JtR3JvdXBgIGFuZCBzeW5jcyB1cCB0aGUgYGZpZWxkYCBhbmQgYHF1YWxpZmllcmAgdmFsdWVzLlxuICAgICAqIEFmdGVyIHN5bmNpbmcsIHdoZW4gdGhlIGBmaWVsZGAgdmFsdWUgY2hhbmdlcywgdGhlIGBxdWFsaWZpZXJgIHZhbHVlIHdpbGwgdXBkYXRlIGFwcHJvcHJpYXRlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jVXBGaWVsZEFuZFF1YWxpZmllciA9IChcbiAgICAgICAgZmc6IEZvcm1Hcm91cDx7XG4gICAgICAgICAgICBib29sZWFuOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIGZpZWxkOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWVyeTogRm9ybUNvbnRyb2w7XG4gICAgICAgIH0+LFxuICAgICAgICBzY29wZTogU2VhcmNoQ29uZmlnWydzY29wZSddLFxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICBmZy5jb250cm9scy5maWVsZC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHNjb3BlID09PSAnbG9jYWwnKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCh2YWw6IEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZmcuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbdmFsXVswXSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5PEZvcm1Hcm91cDxRdWVyeVJvdz4+KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQpXSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZXM6IFtbXSBhcyBzdHJpbmdbXV0sXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBsYW5ndWFnZXM6IFtbXSBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW11dLFxuICAgICAgICBkYXRlUHVibGlzaGVkOiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcygpIH0sXG4gICAgICAgICksXG4gICAgICAgIGxpbWl0UmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgICAgICBleHBhbmRSZXN1bHRzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGFwcGx5UmVsYXRlZFdvcmRzOiBbZmFsc2VdLFxuICAgICAgICAgICAgYXBwbHlFcXVpdmFsZW50U3ViamVjdHM6IFtmYWxzZV0sXG4gICAgICAgICAgICBmdWxsVGV4dDogW2ZhbHNlXSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hPcHRpb25zID0gQURWQU5DRURfU0VBUkNIX09QVElPTlM7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRmllbGRNYXAgPSBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaFF1YWxpZmllck1hcCA9IEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQO1xuXG4gICAgZ2V0IHF1ZXJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5xdWVyaWVzO1xuICAgIH1cbiAgICBnZXQgdHlwZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy50eXBlcztcbiAgICB9XG4gICAgZ2V0IGNvbGxlY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuY29sbGVjdGlvbnM7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5sYW5ndWFnZXM7XG4gICAgfVxuICAgIGdldCBmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZVB1Ymxpc2hlZC5jb250cm9scy5mcm9tO1xuICAgIH1cbiAgICBnZXQgdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlUHVibGlzaGVkLmNvbnRyb2xzLnRvO1xuICAgIH1cbiAgICBnZXQgcGVlclJldmlld2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMubGltaXRSZXN1bHRzLmNvbnRyb2xzLnBlZXJSZXZpZXdlZDtcbiAgICB9XG4gICAgZ2V0IGZ1bGxUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5mdWxsVGV4dDtcbiAgICB9XG4gICAgZ2V0IGFwcGx5UmVsYXRlZFdvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5hcHBseVJlbGF0ZWRXb3JkcztcbiAgICB9XG4gICAgZ2V0IGFwcGx5RXF1aXZhbGVudFN1YmplY3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBxdWVyeSB0byBgcXVlcmllc2AgYEZvcm1BcnJheWAuIFRoaXMgRm9ybUdyb3VwIGhhcyBhbiBhZGRpdGlvbmFsIGBib29sZWFuYCBjb250cm9sLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZGRRdWVyeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICBib29sZWFuOiBbQURWQU5DRURfU0VBUkNIX09QVElPTlMuYm9vbGVhblswXSBhcyBBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb25dLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBbXG4gICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmZpZWxkc1swXSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBxdWFsaWZpZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMucXVhbGlmaWVyc1tcbiAgICAgICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmxvY2FsRmllbGRzWzBdXG4gICAgICAgICAgICAgICAgICAgIF1bMF0gYXMgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBxdWVyeTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN5bmNVcEZpZWxkQW5kUXVhbGlmaWVyKHRoaXMucXVlcmllcy5hdCgtMSksIHRoaXMuY29uZmlnLnNjb3BlKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHJlbW92ZVF1ZXJ5ID0gKGk6IG51bWJlcikgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMucmVtb3ZlQXQoaSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFwcHJvcHJpYXRlIHF1ZXJ5IHBhcmFtcyBiZWZvcmUgcGVyZm9ybWluZyBhIGxvY2FsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9Mb2NhbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRvQWR2YW5jZWRTZWFyY2goe1xuICAgICAgICAgICAgbG9jYWxBZHZhbmNlZFNlYXJjaDoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2gsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVzOiB0aGlzLnR5cGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sbGVjdGlvbnM6IHRoaXMuY29sbGVjdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4dGVybmFsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICAvLyBDb21wYXJlcyAnZnJvbScgYW5kICd0bycgdG8gZW5zdXJlICd0bycgaXMgZ3JlYXRlciB0aGFuIC8gZXF1YWwgdG8gJ2Zyb20nLCBzd2FwcyB0aGVtIGlmIG5vdFxuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSkgPD0gcGFyc2VJbnQodGhpcy50by52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgLy8gQ29tcGFyZXMgJ2Zyb20nIGFuZCAndG8nIHRvIGVuc3VyZSAndG8nIGlzIGdyZWF0ZXIgdGhhbiAvIGVxdWFsIHRvICdmcm9tJywgc3dhcHMgdGhlbSBpZiBub3RcbiAgICAgICAgY29uc3QgdG8gPSB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMudG8udmFsdWUpID49IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGV4dGVybmFsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGRhdGVQdWJsaXNoZWQ6IHsgZnJvbSwgdG8gfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgbGltaXRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHBlZXJSZXZpZXdlZDogdGhpcy5wZWVyUmV2aWV3ZWQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBleHBhbmRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5UmVsYXRlZFdvcmRzOiB0aGlzLmFwcGx5UmVsYXRlZFdvcmRzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhcHBseUVxdWl2YWxlbnRTdWJqZWN0czogdGhpcy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbFRleHQ6IHRoaXMuZnVsbFRleHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyB0aGF0IHRoZXJlIGlzIGEgcXVlcnkgdG8gdXNlLCBnYXRoZXJzIGFsbCBvdGhlciBxdWVyeSBwYXJhbWV0ZXJzIG5lZWRlZCwgdGhlbiBwZXJmb3JtcyBhbiBhZHZhbmNlZCBzZWFyY2ggdmlhIGByb3V0ZXIubmF2aWdhdGUoKWAuXG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBxdWVyeVBhcmFtcyBiYXNlIHNldCBvZiBxdWVyeSBwYXJhbXMgdG8gbmF2aWdhdGUgd2l0aFxuICAgICAqL1xuICAgIHByaXZhdGUgZG9BZHZhbmNlZFNlYXJjaCA9ICh1cGRhdGVkUHJvcHM6IFBhcnRpYWw8U2VhcmNoQ29uZmlnPik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBhIHNlYXJjaCB1bmxlc3MgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHF1ZXJ5XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucXVlcmllcy5hdCgwKS5jb250cm9scy5xdWVyeS5pbnZhbGlkICYmXG4gICAgICAgICAgICAhdGhpcy5xdWVyaWVzLnZhbHVlLnNvbWUoKHYpID0+ICEhdi5xdWVyeSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hWYWxpZGF0aW9uVG9vbFRpcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IHBlcmZvcm0gYSBzZWFyY2ggdW5sZXNzIHRoZSBkYXRlIGZvcm0gaXMgdmFsaWRcbiAgICAgICAgaWYgKHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGVQdWJsaXNoZWQuaW52YWxpZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYWR2YW5jZWRTZWFyY2guZW1pdCh7XG4gICAgICAgICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgICAgICAgIC4uLnVwZGF0ZWRQcm9wcyxcbiAgICAgICAgICAgIGFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzOiB0aGlzLnF1ZXJpZXMudmFsdWUgYXMgQWR2YW5jZWRTZWFyY2hRdWVyeVJvd1tdLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNob3dTZWFyY2hWYWxpZGF0aW9uVG9vbFRpcCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuaW5wdXRUb29sdGlwLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5wdXRUb29sdGlwLnNob3coKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXR1cEZvcm0gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5jbGVhcigpO1xuICAgICAgICAvLyBBbHdheXMga2VlcCBhdCBsZWFzdCB0d28gcXVlcmllcyBhdmFpbGFibGVcbiAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHZhbGlkYXRpb24gdG9vbHRpcCBjbG9zZXMgd2hlbiB1c2VzIGVudGVycyBhIHF1ZXJ5XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMucXVlcmllc1xuICAgICAgICAgICAgICAgIC5hdCgwKVxuICAgICAgICAgICAgICAgIC5jb250cm9scy5xdWVyeS52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoJycpKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMuaW5wdXRUb29sdGlwKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmlucHV0VG9vbHRpcC5kaXNhYmxlZCA9IHRydWUpKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJZiBubyBgcXtOVU19YCB1c2UgYHFgIGZvciBmaXJzdCBxdWVyeVxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucXVlcmllcy5hdCgwKS5jb250cm9scy5xdWVyeS5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5xKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5hZHZhbmNlZFNlYXJjaFF1ZXJ5Um93cy5mb3JFYWNoKChxdWVyeVJvdywgaSkgPT4ge1xuICAgICAgICAgICAgLy8gQWRkIGEgcXVlcnkgZm9ybSBjb250cm9sIGZvciBldmVyeSBxe251bX0ga2V5IGFmdGVyIHRoZSBmaXJzdC5cbiAgICAgICAgICAgIGxldCBxdWVyeUNvbnRyb2wgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbCA9IHRoaXMucXVlcmllcy5hdChpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbCA9IHRoaXMucXVlcmllcy5hdCgtMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVlcnkgdmFsdWUuXG4gICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMucXVlcnkuc2V0VmFsdWUocXVlcnlSb3cucXVlcnkpO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGZpZWxkIHZhbHVlLCBpZiBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcXVlcnlSb3cuZmllbGQgJiYgLy8gT25seSBzZXQgdGhlIGZpZWxkIGlmIHRoZSB2YWx1ZSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICAgICAgICAgICAgKGlzQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uKHF1ZXJ5Um93LmZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0FkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZCkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5maWVsZC5zZXRWYWx1ZShxdWVyeVJvdy5maWVsZCk7XG4gICAgICAgICAgICBlbHNlIHF1ZXJ5Q29udHJvbC5jb250cm9scy5maWVsZC5zZXRWYWx1ZSh0aGlzLmFkdmFuY2VkU2VhcmNoT3B0aW9ucy5maWVsZHNbMF0pO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHF1YWxpZmllciB2YWx1ZSwgaWYgYXZhaWxhYmxlIGFuZCBhIGxvY2FsIHNlYXJjaC5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyAmJiBxdWVyeVJvdy5xdWFsaWZpZXIpXG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLnF1YWxpZmllci5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSb3cucXVhbGlmaWVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoT3B0aW9ucy5xdWFsaWZpZXJzW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5maWVsZC52YWx1ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBib29sZWFuLCBpZiBhdmFpbGFibGUgYW5kIG5vdCB0aGUgZmlyc3QgcXVlcnkuXG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiBxdWVyeVJvdy5ib29sZWFuKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5ib29sZWFuLnNldFZhbHVlKHF1ZXJ5Um93LmJvb2xlYW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGVzLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guc2VsZWN0ZWRSZXNvdXJjZVR5cGVzKTtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMuc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5zZWxlY3RlZENvbGxlY3Rpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnBlZXJSZXZpZXdlZC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmxpbWl0UmVzdWx0cy5wZWVyUmV2aWV3ZWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcHBseVJlbGF0ZWRXb3Jkcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmV4cGFuZFJlc3VsdHMuYXBwbHlSZWxhdGVkV29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmV4cGFuZFJlc3VsdHMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mdWxsVGV4dC5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmV4cGFuZFJlc3VsdHMuZnVsbFRleHQpO1xuICAgICAgICAgICAgdGhpcy5mcm9tLnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZGF0ZVB1Ymxpc2hlZC5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMudG8uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLnRvKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCI8Zm9ybVxuICAgIGRhdGEtdGVzdGlkPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICAoc3VibWl0KT1cImNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyA/IGRvTG9jYWxBZHZhbmNlZFNlYXJjaCgpIDogZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoKClcIlxuICAgIFtmb3JtR3JvdXBdPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICBjbGFzcz1cImFkdi1zZWFyY2gtd3JhcHBlclwiXG4+XG4gICAgPGgzPkFkdmFuY2VkIFNlYXJjaDwvaDM+XG4gICAgPCEtLSBRdWVyaWVzIC0tPlxuICAgIEBmb3IgKHF1ZXJ5IG9mIHF1ZXJpZXMuY29udHJvbHM7IHRyYWNrICRpbmRleDsgbGV0IHF1ZXJ5SW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFkdi1zZWFyY2gtcm93XCIgW2Zvcm1Hcm91cF09XCJxdWVyeVwiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIG9wZXJhdG9yIC0tPlxuICAgICAgICAgICAgPCEtLSBBZGQgYm9vbGVhbiBmb3IgZWFjaCByb3cgZXhjZXB0IGZvciBmaXJzdCAtLT5cbiAgICAgICAgICAgIEBpZiAoISRmaXJzdCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidib29sZWFuJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInYm9vbGVhbicgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYm9vbGVhbiBvZiBhZHZhbmNlZFNlYXJjaE9wdGlvbnMuYm9vbGVhbjsgdHJhY2sgYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiYm9vbGVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib29sZWFuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBGaWVsZCAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJoaWRkZW5cIj5GaWVsZCB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkczsgdHJhY2sgZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJyA/ICdPbmxpbmUnIDogJ0xpYnJhcnknKSArICcgU3BlY2lmaWMnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWR2YW5jZWRTZWFyY2hPcHRpb25zLmV4dGVybmFsRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxvY2FsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFkdmFuY2VkU2VhcmNoRmllbGRNYXBbZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUXVhbGlmaWVycyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHNlYXJjaGVzIC0tPlxuICAgICAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIiBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgID5NYXRjaCBDcml0ZXJpYSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidxdWFsaWZpZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJGFueSBiZWNhdXNlIGEgZmllbGQgY2FuIHRlY2huaWNhbGx5IGJlIGxvY2FsIG9yIGV4dGVybmFsLCB0aG91Z2ggdGhpcyBibG9jayBpcyBzY29wZWQgc3RyaWN0bHkgdG8gbG9jYWwgZmllbGRzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIG9mICRhbnkoYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnMpW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5jb250cm9scy5maWVsZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgcXVhbGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25JbmRleCA9ICRpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJxdWFsaWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWFsaWZpZXInICsgcXVlcnlJbmRleCArICctb3B0aW9uJyArIG9wdGlvbkluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwKVtxdWFsaWZpZXJdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBRdWVyeSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJoaWRkZW5cIj5RdWVyeSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWVyeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVlcnknXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3F1ZXJ5JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGaWxsIG91dCB0aGlzIGZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIHF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbnZhbGlkSW5wdXREZXNjXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93LWNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUXVlcnkocXVlcnlJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInY2FuY2VsUm93JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJhZGRRdWVyeSgpXCJcbiAgICAgICAgaWQ9XCJhZGRRdWVyeUJ0blwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYWRkUXVlcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicXVlcmllcy5sZW5ndGggPiAxMVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvblwiPiBhZGQgPC9zcGFuPlxuICAgICAgICBBZGQgYSByb3dcbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIE9USEVSIE9QVElPTlMgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm90aGVyLW9wdGlvbnNcIj5cbiAgICAgICAgPCEtLSBMT0NBTCAtLT5cbiAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIDwhLS0gVHlwZSAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXNvdXJjZVR5cGVcIj5cbiAgICAgICAgICAgICAgICA8aDQ+UmVzb3VyY2UgVHlwZTwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUmVzb3VyY2UgVHlwZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guYXZhaWxhYmxlUmVzb3VyY2VUeXBlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cInR5cGVzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwidHlwZXMuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1oYmxsLW11bHRpLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBDb2xsZWN0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImNvbGxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Q29sbGVjdGlvbjwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ29sbGVjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guYXZhaWxhYmxlQ29sbGVjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJjb2xsZWN0aW9ucy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRLZXlzQ2hhbmdlKT1cImNvbGxlY3Rpb25zLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYVEVSTkFMIC0tPlxuICAgICAgICBAaWYgKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJykge1xuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwibGltaXRSZXN1bHRzXCIgY2xhc3M9XCJjaGVja2JveC1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkZvciBGZXdlciBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBQZWVyIHJldmlld2VkIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgZm9yPVwicGVlclJldmlld2VkXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3BlZXJSZXZpZXdlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHRcIj5QZWVyIHJldmlld2VkIGpvdXJuYWwgYXJ0aWNsZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZXhwYW5kUmVzdWx0c1wiIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxoND5Gb3IgTW9yZSBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBBcHBseSByZWxhdGVkIHdvcmRzIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgZm9yPVwiYXBwbHlSZWxhdGVkV29yZHNcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFwcGx5UmVsYXRlZFdvcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidhcHBseVJlbGF0ZWRXb3JkcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhcHBseVJlbGF0ZWRXb3Jkc1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveCBbaXNDaGVja2VkXT1cImFwcGx5UmVsYXRlZFdvcmRzLnZhbHVlXCI+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCI+QXBwbHkgcmVsYXRlZCB3b3Jkczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gQXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0cyAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIGZvcj1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYXBwbHlFcXVpdmFsZW50U3ViamVjdHMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0NoZWNrZWRdPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCI+QXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gRnVsbCB0ZXh0IC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgZm9yPVwiZnVsbFRleHRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidmdWxsVGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmdWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveCBbaXNDaGVja2VkXT1cImZ1bGxUZXh0LnZhbHVlXCI+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5JbmNsdWRlIHJlc3VsdHMgdGhlIGxpYnJhcnkgZG9lc24ndCBoYXZlIGFjY2VzcyB0bzwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cImRhdGVPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGg0PkRhdGUgUHVibGlzaGVkPC9oND5cbiAgICAgICAgICAgICAgICA8bGliLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgW2Zyb21dPVwiZnJvbS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b109XCJ0by52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChmcm9tQ2hhbmdlKT1cImZyb20uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICh0b0NoYW5nZSk9XCJ0by5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9saWItZGF0ZS1yYW5nZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGg0Pkxhbmd1YWdlPC9oND5cbiAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInbGFuZ3VhZ2UnXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxhbmd1YWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwibGFuZ3VhZ2VzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJsYW5ndWFnZXMuc2V0VmFsdWUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gbGliSGJsbFBpbGxCdG4gW2NvbG9yXT1cIidibHVlJ1wiIHR5cGU9XCJzdWJtaXRcIiBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiPlxuICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuIl19
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVB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Qy9FLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDNUUsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBQ3JGLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUMzRixDQUFDOzhHQTdHUSx1QkFBdUI7a0dBQXZCLHVCQUF1QiwwU0FpQnJCLFVBQVUsZ0RDOUZ6QixpMFZBbVBBLGtoRURoTFEsWUFBWSw4QkFDWixtQkFBbUIsNDFEQUNuQixnQkFBZ0IsNFRBQ2hCLGFBQWEsK0JBQ2Isd0JBQXdCLG9KQUN4QixxQkFBcUIscUZBQ3JCLG9CQUFvQixtSUFDcEIsa0JBQWtCOzsyRkFHYix1QkFBdUI7a0JBaEJuQyxTQUFTOytCQUNJLHdCQUF3QixjQUN0QixJQUFJLFdBR1A7d0JBQ0wsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix3QkFBd0I7d0JBQ3hCLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixrQkFBa0I7cUJBQ3JCOzhCQUs4QixNQUFNO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFPZixjQUFjO3NCQUF2QixNQUFNO2dCQUcyQixXQUFXO3NCQUE1QyxTQUFTO3VCQUFDLGFBQWE7Z0JBSU8sWUFBWTtzQkFBMUMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgRm9ybUNvbnRyb2wsXG4gICAgRm9ybUdyb3VwLFxuICAgIE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwLCBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24sXG4gICAgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXIsXG4gICAgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVlcnlSb3csXG4gICAgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvbixcbiAgICBpc0FkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24sXG59IGZyb20gJy4uL21vZGVscy9hZHZhbmNlZC1zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTZWFyY2hDb25maWcgfSBmcm9tICcuLi9zcy1zZWFyY2gtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFEVkFOQ0VEX1NFQVJDSF9GSUVMRF9NQVAsXG4gICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMsXG4gICAgQURWQU5DRURfU0VBUkNIX1FVQUxJRklFUl9NQVAsXG4gICAgQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQsXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBIYmxsTXVsdGlTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oYmxsLW11bHRpLXNlbGVjdC9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGJsbENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGJsbC1jaGVja2JveC9oYmxsLWNoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBIYmxsUGlsbEJ0bkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvaGJsbC1waWxsLWJ0bi9oYmxsLXBpbGwtYnRuLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50JztcblxudHlwZSBRdWVyeVJvdyA9IHtcbiAgICBib29sZWFuOiBGb3JtQ29udHJvbDxBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb24+O1xuICAgIGZpZWxkOiBGb3JtQ29udHJvbDxcbiAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uXG4gICAgPjtcbiAgICBxdWFsaWZpZXI6IEZvcm1Db250cm9sPEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uPjtcbiAgICBxdWVyeTogRm9ybUNvbnRyb2w8c3RyaW5nPjtcbn07XG5cbmNvbnN0IERBVEVfVkFMSURBVE9SX1JFR0VYID0gJ15bMC05XXs0fSQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1zcy1hZHZhbmNlZC1zZWFyY2gnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIEhibGxNdWx0aVNlbGVjdENvbXBvbmVudCxcbiAgICAgICAgSGJsbENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBIYmxsUGlsbEJ0bkRpcmVjdGl2ZSxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgY29uZmlnKGNvbmZpZzogU2VhcmNoQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgQE91dHB1dCgpIGFkdmFuY2VkU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG5cbiAgICAvLyBUaG91Z2ggbXVsdGlwbGUgaW5zdGFuY2VzIGV4aXN0cywgdGhpcyByZXByZXNlbnQgcXVlcnkgMS5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIC8vIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAvLyBJdCBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQgaWYgYSB1c2VyIHNlYXJjaGVzIGFnYWluc3QgYW4gZW1wdHkgcXVlcnkgKHNpbXBsZSBvciBxMSkuXG4gICAgLy8gQW55IGNoYW5nZSB0byB0aGUgc2VhcmNoIGZpZWxkIGRpc2FibGVzIHRoZSB0b29sdGlwLlxuICAgIEBWaWV3Q2hpbGQoTWF0VG9vbHRpcCkgcHJpdmF0ZSBpbnB1dFRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGBGb3JtR3JvdXBgIGFuZCBzeW5jcyB1cCB0aGUgYGZpZWxkYCBhbmQgYHF1YWxpZmllcmAgdmFsdWVzLlxuICAgICAqIEFmdGVyIHN5bmNpbmcsIHdoZW4gdGhlIGBmaWVsZGAgdmFsdWUgY2hhbmdlcywgdGhlIGBxdWFsaWZpZXJgIHZhbHVlIHdpbGwgdXBkYXRlIGFwcHJvcHJpYXRlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jVXBGaWVsZEFuZFF1YWxpZmllciA9IChcbiAgICAgICAgZmc6IEZvcm1Hcm91cDx7XG4gICAgICAgICAgICBib29sZWFuOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIGZpZWxkOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWVyeTogRm9ybUNvbnRyb2w7XG4gICAgICAgIH0+LFxuICAgICAgICBzY29wZTogU2VhcmNoQ29uZmlnWydzY29wZSddLFxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICBmZy5jb250cm9scy5maWVsZC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHNjb3BlID09PSAnbG9jYWwnKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCh2YWw6IEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZmcuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbdmFsXVswXSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5PEZvcm1Hcm91cDxRdWVyeVJvdz4+KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQpXSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZXM6IFtbXSBhcyBzdHJpbmdbXV0sXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBsYW5ndWFnZXM6IFtbXSBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW11dLFxuICAgICAgICBkYXRlUHVibGlzaGVkOiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcygpIH0sXG4gICAgICAgICksXG4gICAgICAgIGxpbWl0UmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgICAgICBleHBhbmRSZXN1bHRzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGFwcGx5UmVsYXRlZFdvcmRzOiBbZmFsc2VdLFxuICAgICAgICAgICAgYXBwbHlFcXVpdmFsZW50U3ViamVjdHM6IFtmYWxzZV0sXG4gICAgICAgICAgICBmdWxsVGV4dDogW2ZhbHNlXSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hPcHRpb25zID0gQURWQU5DRURfU0VBUkNIX09QVElPTlM7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRmllbGRNYXAgPSBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaFF1YWxpZmllck1hcCA9IEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQO1xuXG4gICAgZ2V0IHF1ZXJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5xdWVyaWVzO1xuICAgIH1cbiAgICBnZXQgdHlwZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy50eXBlcztcbiAgICB9XG4gICAgZ2V0IGNvbGxlY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuY29sbGVjdGlvbnM7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5sYW5ndWFnZXM7XG4gICAgfVxuICAgIGdldCBmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZVB1Ymxpc2hlZC5jb250cm9scy5mcm9tO1xuICAgIH1cbiAgICBnZXQgdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlUHVibGlzaGVkLmNvbnRyb2xzLnRvO1xuICAgIH1cbiAgICBnZXQgcGVlclJldmlld2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMubGltaXRSZXN1bHRzLmNvbnRyb2xzLnBlZXJSZXZpZXdlZDtcbiAgICB9XG4gICAgZ2V0IGZ1bGxUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5mdWxsVGV4dDtcbiAgICB9XG4gICAgZ2V0IGFwcGx5UmVsYXRlZFdvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5hcHBseVJlbGF0ZWRXb3JkcztcbiAgICB9XG4gICAgZ2V0IGFwcGx5RXF1aXZhbGVudFN1YmplY3RzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZXhwYW5kUmVzdWx0cy5jb250cm9scy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBxdWVyeSB0byBgcXVlcmllc2AgYEZvcm1BcnJheWAuIFRoaXMgRm9ybUdyb3VwIGhhcyBhbiBhZGRpdGlvbmFsIGBib29sZWFuYCBjb250cm9sLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZGRRdWVyeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgICAgICBib29sZWFuOiBbQURWQU5DRURfU0VBUkNIX09QVElPTlMuYm9vbGVhblswXSBhcyBBZHZhbmNlZFNlYXJjaEJvb2xlYW5PcHRpb25dLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBbXG4gICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmZpZWxkc1swXSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBxdWFsaWZpZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMucXVhbGlmaWVyc1tcbiAgICAgICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmxvY2FsRmllbGRzWzBdXG4gICAgICAgICAgICAgICAgICAgIF1bMF0gYXMgQWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBxdWVyeTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnN5bmNVcEZpZWxkQW5kUXVhbGlmaWVyKHRoaXMucXVlcmllcy5hdCgtMSksIHRoaXMuY29uZmlnLnNjb3BlKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHJlbW92ZVF1ZXJ5ID0gKGk6IG51bWJlcikgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMucmVtb3ZlQXQoaSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFwcHJvcHJpYXRlIHF1ZXJ5IHBhcmFtcyBiZWZvcmUgcGVyZm9ybWluZyBhIGxvY2FsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9Mb2NhbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRvQWR2YW5jZWRTZWFyY2goe1xuICAgICAgICAgICAgbG9jYWxBZHZhbmNlZFNlYXJjaDoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2gsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVzOiB0aGlzLnR5cGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sbGVjdGlvbnM6IHRoaXMuY29sbGVjdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4dGVybmFsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICAvLyBDb21wYXJlcyAnZnJvbScgYW5kICd0bycgdG8gZW5zdXJlICd0bycgaXMgZ3JlYXRlciB0aGFuIC8gZXF1YWwgdG8gJ2Zyb20nLCBzd2FwcyB0aGVtIGlmIG5vdFxuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSkgPD0gcGFyc2VJbnQodGhpcy50by52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgLy8gQ29tcGFyZXMgJ2Zyb20nIGFuZCAndG8nIHRvIGVuc3VyZSAndG8nIGlzIGdyZWF0ZXIgdGhhbiAvIGVxdWFsIHRvICdmcm9tJywgc3dhcHMgdGhlbSBpZiBub3RcbiAgICAgICAgY29uc3QgdG8gPSB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMudG8udmFsdWUpID49IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGV4dGVybmFsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGRhdGVQdWJsaXNoZWQ6IHsgZnJvbSwgdG8gfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgbGltaXRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHBlZXJSZXZpZXdlZDogdGhpcy5wZWVyUmV2aWV3ZWQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBleHBhbmRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5UmVsYXRlZFdvcmRzOiB0aGlzLmFwcGx5UmVsYXRlZFdvcmRzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhcHBseUVxdWl2YWxlbnRTdWJqZWN0czogdGhpcy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbFRleHQ6IHRoaXMuZnVsbFRleHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyB0aGF0IHRoZXJlIGlzIGEgcXVlcnkgdG8gdXNlLCBnYXRoZXJzIGFsbCBvdGhlciBxdWVyeSBwYXJhbWV0ZXJzIG5lZWRlZCwgdGhlbiBwZXJmb3JtcyBhbiBhZHZhbmNlZCBzZWFyY2ggdmlhIGByb3V0ZXIubmF2aWdhdGUoKWAuXG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBxdWVyeVBhcmFtcyBiYXNlIHNldCBvZiBxdWVyeSBwYXJhbXMgdG8gbmF2aWdhdGUgd2l0aFxuICAgICAqL1xuICAgIHByaXZhdGUgZG9BZHZhbmNlZFNlYXJjaCA9ICh1cGRhdGVkUHJvcHM6IFBhcnRpYWw8U2VhcmNoQ29uZmlnPik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBhIHNlYXJjaCB1bmxlc3MgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHF1ZXJ5XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucXVlcmllcy5hdCgwKS5jb250cm9scy5xdWVyeS5pbnZhbGlkICYmXG4gICAgICAgICAgICAhdGhpcy5xdWVyaWVzLnZhbHVlLnNvbWUoKHYpID0+ICEhdi5xdWVyeSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dTZWFyY2hWYWxpZGF0aW9uVG9vbFRpcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IHBlcmZvcm0gYSBzZWFyY2ggdW5sZXNzIHRoZSBkYXRlIGZvcm0gaXMgdmFsaWRcbiAgICAgICAgaWYgKHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGVQdWJsaXNoZWQuaW52YWxpZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYWR2YW5jZWRTZWFyY2guZW1pdCh7XG4gICAgICAgICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgICAgICAgIC4uLnVwZGF0ZWRQcm9wcyxcbiAgICAgICAgICAgIGFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzOiB0aGlzLnF1ZXJpZXMudmFsdWUgYXMgQWR2YW5jZWRTZWFyY2hRdWVyeVJvd1tdLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNob3dTZWFyY2hWYWxpZGF0aW9uVG9vbFRpcCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuaW5wdXRUb29sdGlwLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5wdXRUb29sdGlwLnNob3coKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXR1cEZvcm0gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5jbGVhcigpO1xuICAgICAgICAvLyBBbHdheXMga2VlcCBhdCBsZWFzdCB0d28gcXVlcmllcyBhdmFpbGFibGVcbiAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHZhbGlkYXRpb24gdG9vbHRpcCBjbG9zZXMgd2hlbiB1c2VzIGVudGVycyBhIHF1ZXJ5XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgIHRoaXMucXVlcmllc1xuICAgICAgICAgICAgICAgIC5hdCgwKVxuICAgICAgICAgICAgICAgIC5jb250cm9scy5xdWVyeS52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoJycpKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMuaW5wdXRUb29sdGlwKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmlucHV0VG9vbHRpcC5kaXNhYmxlZCA9IHRydWUpKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJZiBubyBgcXtOVU19YCB1c2UgYHFgIGZvciBmaXJzdCBxdWVyeVxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucXVlcmllcy5hdCgwKS5jb250cm9scy5xdWVyeS5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5xKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5hZHZhbmNlZFNlYXJjaFF1ZXJ5Um93cy5mb3JFYWNoKChxdWVyeVJvdywgaSkgPT4ge1xuICAgICAgICAgICAgLy8gQWRkIGEgcXVlcnkgZm9ybSBjb250cm9sIGZvciBldmVyeSBxe251bX0ga2V5IGFmdGVyIHRoZSBmaXJzdC5cbiAgICAgICAgICAgIGxldCBxdWVyeUNvbnRyb2wgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbCA9IHRoaXMucXVlcmllcy5hdChpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbCA9IHRoaXMucXVlcmllcy5hdCgtMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVlcnkgdmFsdWUuXG4gICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMucXVlcnkuc2V0VmFsdWUocXVlcnlSb3cucXVlcnkpO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGZpZWxkIHZhbHVlLCBpZiBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcXVlcnlSb3cuZmllbGQgJiYgLy8gT25seSBzZXQgdGhlIGZpZWxkIGlmIHRoZSB2YWx1ZSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICAgICAgICAgICAgKGlzQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uKHF1ZXJ5Um93LmZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0FkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZCkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5maWVsZC5zZXRWYWx1ZShxdWVyeVJvdy5maWVsZCk7XG4gICAgICAgICAgICBlbHNlIHF1ZXJ5Q29udHJvbC5jb250cm9scy5maWVsZC5zZXRWYWx1ZSh0aGlzLmFkdmFuY2VkU2VhcmNoT3B0aW9ucy5maWVsZHNbMF0pO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHF1YWxpZmllciB2YWx1ZSwgaWYgYXZhaWxhYmxlIGFuZCBhIGxvY2FsIHNlYXJjaC5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyAmJiBxdWVyeVJvdy5xdWFsaWZpZXIpXG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLnF1YWxpZmllci5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSb3cucXVhbGlmaWVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoT3B0aW9ucy5xdWFsaWZpZXJzW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5maWVsZC52YWx1ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBib29sZWFuLCBpZiBhdmFpbGFibGUgYW5kIG5vdCB0aGUgZmlyc3QgcXVlcnkuXG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiBxdWVyeVJvdy5ib29sZWFuKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5ib29sZWFuLnNldFZhbHVlKHF1ZXJ5Um93LmJvb2xlYW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGVzLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guc2VsZWN0ZWRSZXNvdXJjZVR5cGVzKTtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbnMuc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5zZWxlY3RlZENvbGxlY3Rpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnBlZXJSZXZpZXdlZC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmxpbWl0UmVzdWx0cy5wZWVyUmV2aWV3ZWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcHBseVJlbGF0ZWRXb3Jkcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmV4cGFuZFJlc3VsdHMuYXBwbHlSZWxhdGVkV29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmV4cGFuZFJlc3VsdHMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mdWxsVGV4dC5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmV4cGFuZFJlc3VsdHMuZnVsbFRleHQpO1xuICAgICAgICAgICAgdGhpcy5mcm9tLnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZGF0ZVB1Ymxpc2hlZC5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMudG8uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLnRvKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCI8Zm9ybVxuICAgIGRhdGEtdGVzdGlkPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICAoc3VibWl0KT1cImNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyA/IGRvTG9jYWxBZHZhbmNlZFNlYXJjaCgpIDogZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoKClcIlxuICAgIFtmb3JtR3JvdXBdPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICBjbGFzcz1cImFkdi1zZWFyY2gtd3JhcHBlclwiXG4+XG4gICAgPGgzPkFkdmFuY2VkIFNlYXJjaDwvaDM+XG4gICAgPCEtLSBRdWVyaWVzIC0tPlxuICAgIEBmb3IgKHF1ZXJ5IG9mIHF1ZXJpZXMuY29udHJvbHM7IHRyYWNrICRpbmRleDsgbGV0IHF1ZXJ5SW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFkdi1zZWFyY2gtcm93XCIgW2Zvcm1Hcm91cF09XCJxdWVyeVwiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIG9wZXJhdG9yIC0tPlxuICAgICAgICAgICAgPCEtLSBBZGQgYm9vbGVhbiBmb3IgZWFjaCByb3cgZXhjZXB0IGZvciBmaXJzdCAtLT5cbiAgICAgICAgICAgIEBpZiAoISRmaXJzdCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidib29sZWFuJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInYm9vbGVhbicgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYm9vbGVhbiBvZiBhZHZhbmNlZFNlYXJjaE9wdGlvbnMuYm9vbGVhbjsgdHJhY2sgYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiYm9vbGVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib29sZWFuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBGaWVsZCAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJoaWRkZW5cIj5GaWVsZCB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkczsgdHJhY2sgZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJyA/ICdPbmxpbmUnIDogJ0xpYnJhcnknKSArICcgU3BlY2lmaWMnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWR2YW5jZWRTZWFyY2hPcHRpb25zLmV4dGVybmFsRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxvY2FsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFkdmFuY2VkU2VhcmNoRmllbGRNYXBbZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUXVhbGlmaWVycyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHNlYXJjaGVzIC0tPlxuICAgICAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIiBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgID5NYXRjaCBDcml0ZXJpYSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidxdWFsaWZpZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJGFueSBiZWNhdXNlIGEgZmllbGQgY2FuIHRlY2huaWNhbGx5IGJlIGxvY2FsIG9yIGV4dGVybmFsLCB0aG91Z2ggdGhpcyBibG9jayBpcyBzY29wZWQgc3RyaWN0bHkgdG8gbG9jYWwgZmllbGRzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIG9mICRhbnkoYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnMpW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5jb250cm9scy5maWVsZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgcXVhbGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25JbmRleCA9ICRpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJxdWFsaWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWFsaWZpZXInICsgcXVlcnlJbmRleCArICctb3B0aW9uJyArIG9wdGlvbkluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwKVtxdWFsaWZpZXJdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBRdWVyeSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJoaWRkZW5cIj5RdWVyeSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWVyeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVlcnknXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3F1ZXJ5JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGaWxsIG91dCB0aGlzIGZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIHF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbnZhbGlkSW5wdXREZXNjXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm93LWNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUXVlcnkocXVlcnlJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInY2FuY2VsUm93JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJhZGRRdWVyeSgpXCJcbiAgICAgICAgaWQ9XCJhZGRRdWVyeUJ0blwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYWRkUXVlcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicXVlcmllcy5sZW5ndGggPiAxMVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaWNvblwiPiBhZGQgPC9zcGFuPlxuICAgICAgICBBZGQgYSByb3dcbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIE9USEVSIE9QVElPTlMgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm90aGVyLW9wdGlvbnNcIj5cbiAgICAgICAgPCEtLSBMT0NBTCAtLT5cbiAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIDwhLS0gVHlwZSAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXNvdXJjZVR5cGVcIj5cbiAgICAgICAgICAgICAgICA8aDQ+UmVzb3VyY2UgVHlwZTwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUmVzb3VyY2UgVHlwZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guYXZhaWxhYmxlUmVzb3VyY2VUeXBlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cInR5cGVzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwidHlwZXMuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1oYmxsLW11bHRpLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBDb2xsZWN0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImNvbGxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Q29sbGVjdGlvbjwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ29sbGVjdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guYXZhaWxhYmxlQ29sbGVjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJjb2xsZWN0aW9ucy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRLZXlzQ2hhbmdlKT1cImNvbGxlY3Rpb25zLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYVEVSTkFMIC0tPlxuICAgICAgICBAaWYgKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJykge1xuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwibGltaXRSZXN1bHRzXCIgY2xhc3M9XCJjaGVja2JveC1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkZvciBGZXdlciBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBQZWVyIHJldmlld2VkIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgZm9yPVwicGVlclJldmlld2VkXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3BlZXJSZXZpZXdlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHRcIj5QZWVyIHJldmlld2VkIGpvdXJuYWwgYXJ0aWNsZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZXhwYW5kUmVzdWx0c1wiIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxoND5Gb3IgTW9yZSBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBBcHBseSByZWxhdGVkIHdvcmRzIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgZm9yPVwiYXBwbHlSZWxhdGVkV29yZHNcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFwcGx5UmVsYXRlZFdvcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidhcHBseVJlbGF0ZWRXb3JkcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhcHBseVJlbGF0ZWRXb3Jkc1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveCBbaXNDaGVja2VkXT1cImFwcGx5UmVsYXRlZFdvcmRzLnZhbHVlXCI+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCI+QXBwbHkgcmVsYXRlZCB3b3Jkczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gQXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0cyAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIGZvcj1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYXBwbHlFcXVpdmFsZW50U3ViamVjdHMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0NoZWNrZWRdPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCI+QXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gRnVsbCB0ZXh0IC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgZm9yPVwiZnVsbFRleHRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidmdWxsVGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmdWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveCBbaXNDaGVja2VkXT1cImZ1bGxUZXh0LnZhbHVlXCI+PC9saWItaGJsbC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5JbmNsdWRlIHJlc3VsdHMgdGhlIGxpYnJhcnkgZG9lc24ndCBoYXZlIGFjY2VzcyB0bzwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cImRhdGVPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGg0PkRhdGUgUHVibGlzaGVkPC9oND5cbiAgICAgICAgICAgICAgICA8bGliLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgW2Zyb21dPVwiZnJvbS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0b109XCJ0by52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChmcm9tQ2hhbmdlKT1cImZyb20uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICh0b0NoYW5nZSk9XCJ0by5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9saWItZGF0ZS1yYW5nZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGg0Pkxhbmd1YWdlPC9oND5cbiAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInbGFuZ3VhZ2UnXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxhbmd1YWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwibGFuZ3VhZ2VzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJsYW5ndWFnZXMuc2V0VmFsdWUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gbGliSGJsbFBpbGxCdG4gW2NvbG9yXT1cIidibHVlJ1wiIHR5cGU9XCJzdWJtaXRcIiBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiPlxuICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuIl19