UNPKG

@engie-group/fluid-design-system-angular

Version:

Fluid Design System Angular

521 lines (518 loc) 71 kB
import { CommonModule, DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, forwardRef, Inject, Input, ViewChild, ViewChildren, ViewEncapsulation, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { fromEvent, race, Subject, takeUntil } from 'rxjs'; import { selectAnimations } from '../../shared/animations'; import { FormFieldDirective } from '../form-field/form-field.directive'; import { FormItemComponent } from '../form-item/form-item.component'; import { ListGroupComponent } from '../list-group/list-group.component'; import { ListItemComponent } from '../list-item/list-item.component'; import { TagComponent } from '../tag/tag.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class MultiSelectComponent extends FormItemComponent { static { this.ESCAPE_CODE = 'Escape'; } static { this.ENTER_CODE = 'Enter'; } static { this.UP_CODE = 'ArrowUp'; } static { this.DOWN_CODE = 'ArrowDown'; } /* Regex matching every alpha-numeric characters. \d : every digits \p{Letter} : every letters in the latin alphabet including letters with diacritics The "u" flag enables unicode mode required to use `\p{Letter}`. See : - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes#general_categories - https://unicode.org/reports/tr18/#General_Category_Property */ static { this.ALPHA_NUMERIC_REGEX = /^[\d\p{Letter}]$/u; } constructor(element, cdr, document) { super(); this.element = element; this.cdr = cdr; this.document = document; /** * @ignore */ this._onChange = (_) => { }; /** * @ignore */ this._onTouched = () => { }; /** * Notifier used to stop items click event subscription. * @ignore */ this.unsubscribe = new Subject(); this.childOptionsChange = new Subject(); /** * @ignore */ this.isOpen = false; /** * @ignore */ this.selectedIndexes = new Set(); /** * @ignore */ this.selectedValues = new Set(); /** * Icon name */ this.iconName = 'keyboard_arrow_down'; /** * Whether or no to display selected items. When set to `false` and number of selected > 1, * instead of displaying each selected item as tags it only display one tag `X selected` */ this.displaySelectedItems = true; /** * Selected text when `displaySelectedItems = false`: * @example '5 selected` */ this.selectedText = 'selected'; /** * Selected options tag color. Can only be grey or brand */ this.tagColor = 'grey'; /** * Tag close label for accessibility, default is `Deselect` and it will be followed by the tag label. So focusing the close icon will read `Remove tag label`. * Make sure to set a meaningful value and a translated one */ this.tagCloseLabel = 'Deselect'; /** * Tag close label for accessibility, default is `Deselect all`. So focusing the close icon will read `Deselect all`. * Make sure to set a meaningful value and a translated one */ this.tagResetSelectionLabel = 'Deselect all'; } ngOnInit() { fromEvent(this.document, 'click') .pipe(takeUntil(this.unsubscribe)) .subscribe((e) => this.handleOutsideClick(e)); } ngAfterViewInit() { this.setInputsAndListenersOnOptions(); this.updateSelectedIndexes(); this.cdr.detectChanges(); this.selectOptions?.changes .pipe(takeUntil(this.unsubscribe)) .subscribe(() => { setTimeout(() => { this.setInputsAndListenersOnOptions(); this.updateSelectedIndexes(); this.cdr.detectChanges(); }); }); } ngOnDestroy() { this.unsubscribe.next(); this.unsubscribe.complete(); } setInputsAndListenersOnOptions() { this.childOptionsChange.next(); const unsubscribeCond$ = race(this.unsubscribe, this.childOptionsChange); this.selectOptions?.forEach((item, index) => { item.role = 'option'; item.updateSelected(this.selectedIndexes.has(index)); item.isCheckboxContent = true; item.checkboxContentId = this.getOptionId(index); item.itemClick .pipe(takeUntil(unsubscribeCond$)) .subscribe(() => { this.toggleItem(item, index); }); }); } updateSelectedIndexes() { const selectOptionsArr = this.selectOptions?.toArray(); if (selectOptionsArr) { this.selectedValues = new Set([...this.selectedValues].filter(value => selectOptionsArr.some(opt => { return opt?.getValue() === value; }))); this.selectedIndexes = new Set(selectOptionsArr .map((opt, index) => { return this.selectedValues.has(opt.getValue()) ? index : -1; }) .filter(index => index >= 0)); } else { this.selectedIndexes.clear(); this.selectedValues.clear(); } this.updateOptionsActive(); } /** * @ignore */ toggleByIndex(e, index, tagIndex) { e?.stopPropagation(); const item = this.selectOptions.get(index); this.toggleItem(item, index); // When clicking with a mouse e.detail counts the number of clicks, however when using keyboard it is always 0 const isEventTriggeredWithKeyboard = e?.detail === 0; if (!isEventTriggeredWithKeyboard) { this.buttonEl?.nativeElement?.focus(); return; } // We use a set timeout to make sure the focus is done after is re-rendered setTimeout(() => { if (this.tags.length) { const indexToFocus = tagIndex === this.tags.length ? tagIndex - 1 : tagIndex; this.tags.get(indexToFocus)?.focusIconButton(); } else { this.buttonEl?.nativeElement?.focus(); } }); } /** * @ignore */ resetSelection(e) { e.stopPropagation(); this.buttonEl.nativeElement.focus(); this.selectedIndexes.clear(); this.selectedValues.clear(); this.updateOptionsActive(); this._onChange(Array.from(this.selectedValues)); } toggleItem(item, index) { if (!item) { return; } this.toggleValueInSelectedValue(item?.getValue()); this.toggleIndexInSelected(index); this.updateOptionsActive(); this.cdr.markForCheck(); this._onChange(Array.from(this.selectedValues)); } toggleValueInSelectedValue(value) { if (this.selectedValues.has(value)) { this.selectedValues.delete(value); } else { this.selectedValues.add(value); } } toggleIndexInSelected(index) { if (this.selectedIndexes.has(index)) { this.selectedIndexes.delete(index); } else { this.selectedIndexes.add(index); } } openList() { this.isOpen = true; this.focusedIndex = this.selectedIndexes.size ? Array.from(this.selectedIndexes)[this.selectedIndexes.size - 1] : 0; this.selectOptions?.toArray().forEach((el, i) => { if (!el) { return; } el.isActive = this.selectedIndexes.has(i); }); setTimeout(() => { if (!this.selectedIndexes?.size) { // Focus the `ul` element this.listEl?.rootEl.nativeElement.focus(); // The scrolling element is not the `ul` node but the `nj-list-group` this.listEl?.element.nativeElement.scrollTo({ top: 0 }); } }); } closeList() { this.isOpen = false; this.cdr.markForCheck(); } /** * @ignore */ toggleIsOpen() { if (this.isOpen) { this.closeList(); } else { this.openList(); } } /** * @ignore */ handleListKeydown(e) { // Escape key closes the list and focuses the button if (e.code === MultiSelectComponent.ESCAPE_CODE) { this.closeList(); setTimeout(() => { this.buttonEl?.nativeElement.focus(); }); } // Navigate between options and set `focusedIndex` if (e.code === MultiSelectComponent.UP_CODE) { e.preventDefault(); // Don't loop back to the end of the list if (this.focusedIndex > 0) { this.focusedIndex -= 1; } } if (e.code === MultiSelectComponent.DOWN_CODE) { e.preventDefault(); // Don't loop back to the begining of the list if (this.focusedIndex < this.selectOptions?.length - 1) { this.focusedIndex += 1; } } // Select the current `focusedIndex` option if (e.code === MultiSelectComponent.ENTER_CODE) { e.preventDefault(); if (this.focusedIndex !== -1) { this.toggleItem(this.selectOptions?.get(this.focusedIndex), this.focusedIndex); this._onChange(Array.from(this.selectedValues)); } } // Jump to first option matching first letter if (MultiSelectComponent.ALPHA_NUMERIC_REGEX.test(e.key)) { const goToIndex = this.selectOptions ?.toArray() .findIndex((item) => item.getValue()[0].toLowerCase() === e.key.toLowerCase()); if (goToIndex !== -1) { this.focusedIndex = goToIndex; } } } /** * @ignore */ handleFocusOut(e) { const relatedTarget = e?.relatedTarget; if (!relatedTarget) { return; } if (!this.element?.nativeElement?.contains(relatedTarget)) { this.closeList(); if (this._onTouched) { this._onTouched(); } } } /** * @ignore */ handleOutsideClick(e) { if (!this.element?.nativeElement?.contains(e.target)) { this.closeList(); if (this._onTouched) { this._onTouched(); } } } /** * Implemented as part of ControlValueAccessor. * @ignore */ registerOnChange(fn) { this._onChange = fn; } /** * Implemented as part of ControlValueAccessor. * @ignore */ registerOnTouched(fn) { this._onTouched = fn; } /** * Implemented as part of ControlValueAccessor. * @ignore */ setDisabledState(isDisabled) { this.isDisabled = isDisabled; } /** * Implemented as part of ControlValueAccessor. * @ignore */ writeValue(values) { this.selectedValues.clear(); this.selectedIndexes.clear(); if (values?.length) { for (const value of values) { this.selectedValues.add(value); const indexToAdd = this.selectOptions?.toArray()?.findIndex(item => item.getValue() === value); if (indexToAdd >= 0) { this.selectedIndexes.add(indexToAdd); } } } this.updateOptionsActive(); this.cdr.markForCheck(); } updateOptionsActive() { this.selectOptions?.forEach((item) => { item.updateSelected(this.selectedValues.has(item.getValue())); }); } /** * Label (≠ value) of selected option * @ignore */ getLabelAtIndex(index) { return this.selectOptions?.get(index)?.getLabel() ?? ''; } /** * Close aria Label of taf to close * @param index */ getTagCloseLabel(index) { return `${this.tagCloseLabel} ${this.getLabelAtIndex(index)}`; } /** * Aria-label for the trigger button element. * @ignore */ get buttonLabel() { return `${this.fieldLabel} - ${this.buttonDefaultValueLabel}`; } /** * @ignore */ get formattedInputValue() { if (!this.selectedValues) { return ''; } return Array.from(this.selectedValues).join(','); } /** * @ignore */ getAdditionalClass() { return `nj-form-item--select nj-form-item--custom-list nj-form-item--multi-select${this.isOpen ? ' nj-form-item--open' : ''}`; } /** * @ignore */ getSubscriptId() { return `${this.inputId}-subscript`; } /** * @ignore */ getInstructionsId() { return `${this.inputId}-instructions`; } /** * @ignore */ getDescriptionId() { return `${this.getSubscriptId()} ${this.getInstructionsId()}`; } /** * Index of the currently focused option. */ get focusedIndex() { return this.selectOptions ?.toArray() .findIndex((item) => this.document.activeElement === item.el.nativeElement); } set focusedIndex(value) { this.selectOptions?.forEach((el, i) => { el.ariaSelected = i === value; }); setTimeout(() => { if (value >= 0) { this.selectOptions?.get(value)?.el?.nativeElement?.focus(); } }); } /** * @ignore */ get selectedIndexesToShow() { if (!this.selectedIndexes) { return; } if (!this.maxTagsToDisplay) { return [...this.selectedIndexes]; } return [...this.selectedIndexes].splice(0, this.maxTagsToDisplay); } /** * @ignore */ get tagSize() { switch (this.size) { case 'xlarge': return 'md'; case 'small': return 'xs'; default: return 'sm'; } } /** * @ignore */ get selectIndexAsArray() { return [...this.selectedIndexes]; } getOptionId(index) { return `${this.inputId}_option-${index}`; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, isStandalone: true, selector: "nj-multi-select", inputs: { iconName: "iconName", fieldLabel: "fieldLabel", listNavigationLabel: "listNavigationLabel", buttonDefaultValueLabel: "buttonDefaultValueLabel", maxTagsToDisplay: "maxTagsToDisplay", displaySelectedItems: "displaySelectedItems", selectedText: "selectedText", tagColor: "tagColor", tagCloseLabel: "tagCloseLabel", tagResetSelectionLabel: "tagResetSelectionLabel" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultiSelectComponent), multi: true, }, ], queries: [{ propertyName: "selectOptions", predicate: ListItemComponent, descendants: true }], viewQueries: [{ propertyName: "buttonEl", first: true, predicate: ["button"], descendants: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "listEl", first: true, predicate: ListGroupComponent, descendants: true }, { propertyName: "tags", predicate: ["tags"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nj-form-item\n [hasError]=\"hasError\"\n [hasSuccess]=\"hasSuccess\"\n [hasHint]=\"hasHint\"\n [isDisabled]=\"isDisabled\"\n [hasCustomIcon]=\"hasCustomIcon\"\n [isFloatingLabel]=\"isFloatingLabel\"\n [iconName]=\"iconName\"\n [size]=\"size\"\n [isSelect]=\"true\"\n [additionalClass]=\"getAdditionalClass()\"\n [inputId]=\"inputId\"\n (focusout)=\"handleFocusOut($event)\"\n>\n <input\n #input\n type=\"text\"\n readonly\n [value]=\"formattedInputValue\"\n [attr.id]=\"inputId\"\n [disabled]=\"isDisabled\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n njFormField\n />\n <ng-content njFormLabel select=\"[njFormLabel]\"></ng-content>\n <ng-content njFormSubscript select=\"[njFormSubscript]\"></ng-content>\n <ng-container njFormAdditionalContent>\n <p [id]=\"getInstructionsId()\" hidden>{{ listNavigationLabel }}</p>\n <button\n #button\n type=\"button\"\n class=\"nj-form-item__custom-list-button\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isOpen\"\n role=\"combobox\"\n [attr.aria-label]=\"buttonLabel\"\n [attr.tabindex]=\"isOpen ? -1 : null\"\n [attr.aria-describedby]=\"getDescriptionId()\"\n (click)=\"toggleIsOpen()\">\n <span class=\"nj-sr-only\">{{buttonLabel}}</span>\n </button>\n <div class=\"nj-form-item__selected-tags\" (click)=\"toggleIsOpen()\">\n <ng-container *ngIf=\"selectIndexAsArray?.length as numOfSelected\">\n <ng-container *ngIf=\"displaySelectedItems\">\n <nj-tag *ngFor=\"let optionIndex of selectedIndexesToShow; let i = index\"\n #tags\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(optionIndex)\"\n (closeClick)=\"toggleByIndex($event, optionIndex, i)\">\n {{getLabelAtIndex(optionIndex)}}\n </nj-tag>\n <nj-tag *ngIf=\"maxTagsToDisplay && numOfSelected > maxTagsToDisplay\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\">\n +{{numOfSelected - maxTagsToDisplay}}\n </nj-tag>\n </ng-container>\n <ng-container *ngIf=\"!displaySelectedItems\">\n <nj-tag\n *ngIf=\"numOfSelected === 1\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(selectIndexAsArray?.[0])\"\n (closeClick)=\"toggleByIndex($event, selectIndexAsArray?.[0], 0)\">\n {{getLabelAtIndex(selectIndexAsArray?.[0])}}\n </nj-tag>\n <nj-tag\n *ngIf=\"numOfSelected > 1\"\n [variant]=\"tagColor\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [size]=\"tagSize\"\n [closeLabel]=\"tagResetSelectionLabel\"\n (closeClick)=\"resetSelection($event)\">\n {{numOfSelected}} {{selectedText}}\n </nj-tag>\n </ng-container>\n </ng-container>\n </div>\n <nj-list-group\n class=\"nj-form-item__list nj-form-item__list--no-animate\"\n [hidden]=\"!isOpen\"\n [@transformList]=\"isOpen ? 'open': 'void'\"\n [isDense]=\"true\"\n [hasBorder]=\"false\"\n [isClickable]=\"true\"\n [isCustomSelectList]=\"true\"\n [isCheckboxList]=\"true\"\n tabindex=\"-1\"\n [ariaLabel]=\"fieldLabel\"\n (keydown)=\"handleListKeydown($event)\"\n >\n <ng-content select=\"[njSelectOptions]\"></ng-content>\n </nj-list-group>\n </ng-container>\n</nj-form-item>\n", styles: [":host{display:block;width:100%;height:100%}.nj-form-item__custom-list-button{outline:none}\n"], dependencies: [{ kind: "component", type: TagComponent, selector: "nj-tag", inputs: ["variant", "size", "iconName", "href", "target", "isClickable", "isClosable", "shouldAutoDestruct", "closeLabel", "isDisabled", "hasCustomIcon"], outputs: ["tagClick", "closeClick"] }, { kind: "component", type: FormItemComponent, selector: "nj-form-item", inputs: ["inputId", "size", "isFloatingLabel", "isDisabled", "isRequired", "hasSuccess", "hasError", "hasHint", "hasCustomIcon", "isIconClickable", "iconName", "additionalClass", "passwordButtonLabelShow", "passwordButtonLabelHide", "passwordNoticeIsVisible", "passwordNoticeIsHidden", "isSelect"], outputs: ["iconClick", "iconKeydown", "wrapperClick"] }, { kind: "directive", type: FormFieldDirective, selector: "input[njFormField], textarea[njFormField], select[njFormField], nj-select[njFormField], div[njFormField]", exportAs: ["njFormField"] }, { kind: "component", type: ListGroupComponent, selector: "nj-list-group", inputs: ["listId", "isClickable", "isCheckboxList", "hasBorder", "isDense", "isCustomSelectList", "ariaLabel", "isMultiSelect"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [selectAnimations.transformList], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, decorators: [{ type: Component, args: [{ selector: 'nj-multi-select', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MultiSelectComponent), multi: true, }, ], animations: [selectAnimations.transformList], encapsulation: ViewEncapsulation.None, standalone: true, imports: [TagComponent, FormItemComponent, FormFieldDirective, ListGroupComponent, CommonModule], template: "<nj-form-item\n [hasError]=\"hasError\"\n [hasSuccess]=\"hasSuccess\"\n [hasHint]=\"hasHint\"\n [isDisabled]=\"isDisabled\"\n [hasCustomIcon]=\"hasCustomIcon\"\n [isFloatingLabel]=\"isFloatingLabel\"\n [iconName]=\"iconName\"\n [size]=\"size\"\n [isSelect]=\"true\"\n [additionalClass]=\"getAdditionalClass()\"\n [inputId]=\"inputId\"\n (focusout)=\"handleFocusOut($event)\"\n>\n <input\n #input\n type=\"text\"\n readonly\n [value]=\"formattedInputValue\"\n [attr.id]=\"inputId\"\n [disabled]=\"isDisabled\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n njFormField\n />\n <ng-content njFormLabel select=\"[njFormLabel]\"></ng-content>\n <ng-content njFormSubscript select=\"[njFormSubscript]\"></ng-content>\n <ng-container njFormAdditionalContent>\n <p [id]=\"getInstructionsId()\" hidden>{{ listNavigationLabel }}</p>\n <button\n #button\n type=\"button\"\n class=\"nj-form-item__custom-list-button\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isOpen\"\n role=\"combobox\"\n [attr.aria-label]=\"buttonLabel\"\n [attr.tabindex]=\"isOpen ? -1 : null\"\n [attr.aria-describedby]=\"getDescriptionId()\"\n (click)=\"toggleIsOpen()\">\n <span class=\"nj-sr-only\">{{buttonLabel}}</span>\n </button>\n <div class=\"nj-form-item__selected-tags\" (click)=\"toggleIsOpen()\">\n <ng-container *ngIf=\"selectIndexAsArray?.length as numOfSelected\">\n <ng-container *ngIf=\"displaySelectedItems\">\n <nj-tag *ngFor=\"let optionIndex of selectedIndexesToShow; let i = index\"\n #tags\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(optionIndex)\"\n (closeClick)=\"toggleByIndex($event, optionIndex, i)\">\n {{getLabelAtIndex(optionIndex)}}\n </nj-tag>\n <nj-tag *ngIf=\"maxTagsToDisplay && numOfSelected > maxTagsToDisplay\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\">\n +{{numOfSelected - maxTagsToDisplay}}\n </nj-tag>\n </ng-container>\n <ng-container *ngIf=\"!displaySelectedItems\">\n <nj-tag\n *ngIf=\"numOfSelected === 1\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(selectIndexAsArray?.[0])\"\n (closeClick)=\"toggleByIndex($event, selectIndexAsArray?.[0], 0)\">\n {{getLabelAtIndex(selectIndexAsArray?.[0])}}\n </nj-tag>\n <nj-tag\n *ngIf=\"numOfSelected > 1\"\n [variant]=\"tagColor\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [size]=\"tagSize\"\n [closeLabel]=\"tagResetSelectionLabel\"\n (closeClick)=\"resetSelection($event)\">\n {{numOfSelected}} {{selectedText}}\n </nj-tag>\n </ng-container>\n </ng-container>\n </div>\n <nj-list-group\n class=\"nj-form-item__list nj-form-item__list--no-animate\"\n [hidden]=\"!isOpen\"\n [@transformList]=\"isOpen ? 'open': 'void'\"\n [isDense]=\"true\"\n [hasBorder]=\"false\"\n [isClickable]=\"true\"\n [isCustomSelectList]=\"true\"\n [isCheckboxList]=\"true\"\n tabindex=\"-1\"\n [ariaLabel]=\"fieldLabel\"\n (keydown)=\"handleListKeydown($event)\"\n >\n <ng-content select=\"[njSelectOptions]\"></ng-content>\n </nj-list-group>\n </ng-container>\n</nj-form-item>\n", styles: [":host{display:block;width:100%;height:100%}.nj-form-item__custom-list-button{outline:none}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; }, propDecorators: { iconName: [{ type: Input }], fieldLabel: [{ type: Input }], listNavigationLabel: [{ type: Input }], buttonDefaultValueLabel: [{ type: Input }], maxTagsToDisplay: [{ type: Input }], displaySelectedItems: [{ type: Input }], selectedText: [{ type: Input }], tagColor: [{ type: Input }], tagCloseLabel: [{ type: Input }], tagResetSelectionLabel: [{ type: Input }], buttonEl: [{ type: ViewChild, args: ['button'] }], input: [{ type: ViewChild, args: ['input'] }], listEl: [{ type: ViewChild, args: [ListGroupComponent] }], tags: [{ type: ViewChildren, args: ['tags'] }], selectOptions: [{ type: ContentChildren, args: [ListItemComponent, { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFJTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7OztBQW9CbEQsTUFBTSxPQUFPLG9CQUNYLFNBQVEsaUJBQWlCO2FBRUQsZ0JBQVcsR0FBRyxRQUFRLEFBQVgsQ0FBWTthQUN2QixlQUFVLEdBQUcsT0FBTyxBQUFWLENBQVc7YUFDckIsWUFBTyxHQUFHLFNBQVMsQUFBWixDQUFhO2FBQ3BCLGNBQVMsR0FBRyxXQUFXLEFBQWQsQ0FBZTtJQUNoRDs7Ozs7Ozs7Ozs7TUFXRTthQUNzQix3QkFBbUIsR0FBRyxtQkFBbUIsQUFBdEIsQ0FBdUI7SUE0SGxFLFlBQTZCLE9BQWdDLEVBQW1CLEdBQXNCLEVBQTRCLFFBQVE7UUFDeEksS0FBSyxFQUFFLENBQUM7UUFEbUIsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFBbUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBNEIsYUFBUSxHQUFSLFFBQVEsQ0FBQTtRQTFIMUk7O1dBRUc7UUFDSyxjQUFTLEdBQUcsQ0FBQyxDQUFNLEVBQVEsRUFBRTtRQUNyQyxDQUFDLENBQUM7UUFFRjs7V0FFRztRQUNLLGVBQVUsR0FBRyxHQUFTLEVBQUU7UUFDaEMsQ0FBQyxDQUFDO1FBRUY7OztXQUdHO1FBQ0ssZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRWxDLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFakQ7O1dBRUc7UUFDSCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWY7O1dBRUc7UUFDSCxvQkFBZSxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRWpEOztXQUVHO1FBQ0gsbUJBQWMsR0FBZ0IsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUVoRDs7V0FFRztRQUNNLGFBQVEsR0FBRyxxQkFBcUIsQ0FBQztRQXlCMUM7OztXQUdHO1FBQ00seUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRXJDOzs7V0FHRztRQUNNLGlCQUFZLEdBQVcsVUFBVSxDQUFDO1FBRTNDOztXQUVHO1FBQ00sYUFBUSxHQUFxQixNQUFNLENBQUM7UUFFN0M7OztXQUdHO1FBQ00sa0JBQWEsR0FBRyxVQUFVLENBQUM7UUFFcEM7OztXQUdHO1FBQ00sMkJBQXNCLEdBQVksY0FBYyxDQUFDO0lBa0MxRCxDQUFDO0lBRUQsUUFBUTtRQUNOLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQzthQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxDQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU87YUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDakMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsOEJBQThCO1FBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQyxTQUFTO2lCQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDakMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkQsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksR0FBRyxDQUMzQixDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbkUsT0FBTyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssS0FBSyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDLENBQ0osQ0FBQztZQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQzVCLGdCQUFnQjtpQkFDYixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FDL0IsQ0FBQztTQUNIO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsQ0FBYSxFQUFFLEtBQWEsRUFBRSxRQUFnQjtRQUMxRCxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsOEdBQThHO1FBQzlHLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3RDLE9BQU87U0FDUjtRQUNELDJFQUEyRTtRQUMzRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDcEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsQ0FBUTtRQUNyQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sVUFBVSxDQUFDLElBQXVCLEVBQUUsS0FBYTtRQUN2RCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsS0FBYTtRQUM5QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFhO1FBQ3pDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVPLFFBQVE7UUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBILElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsT0FBTzthQUNSO1lBQ0QsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUU7Z0JBQy9CLHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMxQyxxRUFBcUU7Z0JBQ3JFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUN2RDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLENBQWdCO1FBQ2hDLG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLENBQUMsV0FBVyxFQUFFO1lBQy9DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFDLE9BQU8sRUFBRTtZQUMzQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIseUNBQXlDO1lBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Y7UUFFRCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLENBQUMsU0FBUyxFQUFFO1lBQzdDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQiw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUVELDJDQUEyQztRQUMzQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLENBQUMsVUFBVSxFQUFFO1lBQzlDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7UUFFRCw2Q0FBNkM7UUFDN0MsSUFBSSxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhO2dCQUNsQyxFQUFFLE9BQU8sRUFBRTtpQkFDVixTQUFTLENBQ1IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUNuRSxDQUFDO1lBRUosSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO2FBQy9CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsQ0FBYTtRQUMxQixNQUFNLGFBQWEsR0FBRyxDQUFDLEVBQUUsYUFBcUIsQ0FBQztRQUMvQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRWpCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ25CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxDQUFhO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQWMsQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUVqQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNuQjtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsTUFBaUI7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRTtZQUNsQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUMvRixJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN0QzthQUNGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLEtBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFdBQVc7UUFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sNEVBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQ3hDLEVBQUUsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sWUFBWSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxlQUFlLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksWUFBWTtRQUN0QixPQUFPLElBQUksQ0FBQyxhQUFhO1lBQ3ZCLEVBQUUsT0FBTyxFQUFFO2FBQ1YsU0FBUyxDQUNSLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FDaEUsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFZLFlBQVksQ0FBQyxLQUFhO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUM1RDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxxQkFBcUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDVCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQWE7UUFDL0IsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsS0FBSyxFQUFFLENBQUM7SUFDM0MsQ0FBQzsrR0E1akJVLG9CQUFvQiw2RUErSWlGLFFBQVE7bUdBL0k3RyxvQkFBb0Isb2JBWnBCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbkQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLHdEQW1KZ0IsaUJBQWlCLDhQQVp2QixrQkFBa0IseUlDOUsvQixxckhBc0dBLHNKRDNEWSxZQUFZLG1QQUFFLGlCQUFpQiwyWkFBRSxrQkFBa0IsZ0xBQUUsa0JBQWtCLDBMQUFFLFlBQVksa1BBSG5GLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDOzs0RkFLakMsb0JBQW9CO2tCQWpCaEMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsY0FDVyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxpQkFDN0IsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxDQUFDOzswQkFpSlMsTUFBTTsyQkFBQyxRQUFROzRDQXBGL0csUUFBUTtzQkFBaEIsS0FBSztnQkFNRyxVQUFVO3NCQUFsQixLQUFLO2dCQU1HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFNRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU1HLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFNRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsYUFBYTtzQkFBckIsS0FBSztnQkFNRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBTWUsUUFBUTtzQkFBNUIsU0FBUzt1QkFBQyxRQUFRO2dCQU1DLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFNYSxNQUFNO3NCQUFwQyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFNUCxJQUFJO3NCQUF6QixZQUFZO3VCQUFDLE1BQU07Z0JBTXFDLGFBQWE7c0JBQXJFLGVBQWU7dUJBQUMsaUJBQWlCLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21tb25Nb2R1bGUsIERPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2Zyb21FdmVudCwgcmFjZSwgU3ViamVjdCwgdGFrZVVudGlsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7c2VsZWN0QW5pbWF0aW9uc30gZnJvbSAnLi4vLi4vc2hhcmVkL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtGb3JtRmllbGREaXJlY3RpdmV9IGZyb20gJy4uL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtGb3JtSXRlbUNvbXBvbmVudH0gZnJvbSAnLi4vZm9ybS1pdGVtL2Zvcm0taXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtMaXN0R3JvdXBDb21wb25lbnR9IGZyb20gJy4uL2xpc3QtZ3JvdXAvbGlzdC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHtMaXN0SXRlbUNvbXBvbmVudH0gZnJvbSAnLi4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtUYWdDb21wb25lbnR9IGZyb20gJy4uL3RhZy90YWcuY29tcG9uZW50JztcbmltcG9ydCB7VGFnU2l6ZX0gZnJvbSAnLi4vdGFnL3RhZy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25qLW11bHRpLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgYW5pbWF0aW9uczogW3NlbGVjdEFuaW1hdGlvbnMudHJhbnNmb3JtTGlzdF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUYWdDb21wb25lbnQsIEZvcm1JdGVtQ29tcG9uZW50LCBGb3JtRmllbGREaXJlY3RpdmUsIExpc3RHcm91cENvbXBvbmVudCwgQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aVNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIEZvcm1JdGVtQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRVNDQVBFX0NPREUgPSAnRXNjYXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU5URVJfQ09ERSA9ICdFbnRlcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVQX0NPREUgPSAnQXJyb3dVcCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPV05fQ09ERSA9ICdBcnJvd0Rvd24nO1xuICAvKlxuICAgIFJlZ2V4IG1hdGNoaW5nIGV2ZXJ5IGFscGhhLW51bWVyaWMgY2hhcmFjdGVycy5cblxuICAgIFxcZCA6IGV2ZXJ5IGRpZ2l0c1xuICAgIFxccHtMZXR0ZXJ9IDogZXZlcnkgbGV0dGVycyBpbiB0aGUgbGF0aW4gYWxwaGFiZXQgaW5jbHVkaW5nIGxldHRlcnMgd2l0aCBkaWFjcml0aWNzXG5cbiAgICBUaGUgXCJ1XCIgZmxhZyBlbmFibGVzIHVuaWNvZGUgbW9kZSByZXF1aXJlZCB0byB1c2UgYFxccHtMZXR0ZXJ9YC5cblxuICAgIFNlZSA6XG4gICAgLSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0d1aWRlL1JlZ3VsYXJfRXhwcmVzc2lvbnMvVW5pY29kZV9Qcm9wZXJ0eV9Fc2NhcGVzI2dlbmVyYWxfY2F0ZWdvcmllc1xuICAgIC0gaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMTgvI0dlbmVyYWxfQ2F0ZWdvcnlfUHJvcGVydHlcbiAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUxQSEFfTlVNRVJJQ19SRUdFWCA9IC9eW1xcZFxccHtMZXR0ZXJ9XSQvdTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfb25DaGFuZ2UgPSAoXzogYW55KTogdm9pZCA9PiB7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgfTtcblxuICAvKipcbiAgICogTm90aWZpZXIgdXNlZCB0byBzdG9wIGl0ZW1zIGNsaWNrIGV2ZW50IHN1YnNjcmlwdGlvbi5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBjaGlsZE9wdGlvbnNDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBpc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2VsZWN0ZWRJbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzZWxlY3RlZFZhbHVlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogSWNvbiBuYW1lXG4gICAqL1xuICBASW5wdXQoKSBpY29uTmFtZSA9ICdrZXlib2FyZF9hcnJvd19kb3duJztcblxuICAvKipcbiAgICogTGFiZWwgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSByZWxhdGVkIGF0dHJpYnV0ZXMgb24gYnV0dG9uIGFuZCBsaXN0LlxuICAgKiBTaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgKHRleHQgb25seSkgYXMgdGhlIGA8bGFiZWw+YCBlbGVtZW50XG4gICAqL1xuICBASW5wdXQoKSBmaWVsZExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9ucyBvbiBob3cgdG8gbmF2aWdhdGUgdGhlIGxpc3QuIEl0IGlzIGFwcGVuZCBhZnRlciB0aGUgaW5wdXQgbGFiZWwuXG4gICAqIEBleGFtcGxlIFwiVXNlIHVwIGFuZCBkb3duIGFycm93cyBhbmQgRW50ZXIgdG8gc2VsZWN0IGEgdmFsdWVcIlxuICAgKi9cbiAgQElucHV0KCkgbGlzdE5hdmlnYXRpb25MYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdXR0b24gZGVmYXVsdCBsYWJlbCB3aGVuIG5vIHZhbHVlIGlzIHNlbGVjdGVkLiBJdCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgaW5wdXQgbGFiZWwuXG4gICAqIEBleGFtcGxlIFwiU2VsZWN0IGEgdmFsdWVcIlxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uRGVmYXVsdFZhbHVlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogTWF4IHRhZ3MgdG8gZGlzcGxheVxuICAgKi9cbiAgQElucHV0KCkgbWF4VGFnc1RvRGlzcGxheTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vIHRvIGRpc3BsYXkgc2VsZWN0ZWQgaXRlbXMuIFdoZW4gc2V0IHRvIGBmYWxzZWAgYW5kIG51bWJlciBvZiBzZWxlY3RlZCA+IDEsXG4gICAqIGluc3RlYWQgb2YgZGlzcGxheWluZyBlYWNoIHNlbGVjdGVkIGl0ZW0gYXMgdGFncyBpdCBvbmx5IGRpc3BsYXkgb25lIHRhZyBgWCBzZWxlY3RlZGBcbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlTZWxlY3RlZEl0ZW1zID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2VsZWN0ZWQgdGV4dCB3aGVuIGBkaXNwbGF5U2VsZWN0ZWRJdGVtcyA9IGZhbHNlYDpcbiAgICogQGV4YW1wbGUgJzUgc2VsZWN0ZWRgXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZFRleHQ6IHN0cmluZyA9ICdzZWxlY3RlZCc7XG5cbiAgLyoqXG4gICAqIFNlbGVjdGVkIG9wdGlvbnMgdGFnIGNvbG9yLiBDYW4gb25seSBiZSBncmV5IG9yIGJyYW5kXG4gICAqL1xuICBASW5wdXQoKSB0YWdDb2xvcjogJ2JyYW5kJyB8ICdncmV5JyA9ICdncmV5JztcblxuICAvKipcbiAgICogVGFnIGNsb3NlIGxhYmVsIGZvciBhY2Nlc3NpYmlsaXR5LCBkZWZh