@energycap/components 0.39.24-ECAP-26539-Item-Picker-Select-All.20240912-1552 → 0.39.24-ECAP-26539-Item-Picker-Select-All.20240913-1532
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.
- package/esm2020/lib/controls/item-picker/item-picker.component.mjs +14 -3
- package/fesm2015/energycap-components.mjs +13 -2
- package/fesm2015/energycap-components.mjs.map +1 -1
- package/fesm2020/energycap-components.mjs +13 -2
- package/fesm2020/energycap-components.mjs.map +1 -1
- package/package.json +1 -1
@@ -101,6 +101,9 @@ export class ItemPickerComponent {
|
|
101
101
|
* If any of the items have `preventRemove` set, their indices are added to the context.
|
102
102
|
*/
|
103
103
|
onItemsChange(results) {
|
104
|
+
if (this.selectionContext.isSelectingAllItems) {
|
105
|
+
this.onClearSelectionClick();
|
106
|
+
}
|
104
107
|
let newNonDependentCheckboxes = [];
|
105
108
|
results.items.forEach((item, index) => {
|
106
109
|
// Check to see if any of the items are marked to be selected by default and if so
|
@@ -139,6 +142,7 @@ export class ItemPickerComponent {
|
|
139
142
|
}
|
140
143
|
});
|
141
144
|
this.selectedItems = Array.from(this.selectionContext.selectedItemsMap.values());
|
145
|
+
this.selectionContext.isSelectingAllItems = false;
|
142
146
|
}
|
143
147
|
/**
|
144
148
|
* Called when the remove item button is clicked for a selected item
|
@@ -190,10 +194,16 @@ export class ItemPickerComponent {
|
|
190
194
|
});
|
191
195
|
this.selectionContext.selectAllCheckbox.valueChanges.pipe(debounceTime(10), takeUntil(this.destroyed)).subscribe((checked) => {
|
192
196
|
const onePageOfData = this.availableItems.length === this.totalItemsBeforePaging;
|
197
|
+
console.log('selectAllCheckbox checked: ', checked);
|
193
198
|
if (checked && !onePageOfData) {
|
194
199
|
this.showSelectAllItemsButton = true;
|
195
200
|
}
|
196
201
|
else if (!checked) {
|
202
|
+
console.log('not checked');
|
203
|
+
if (this.selectionContext.isSelectingAllItems) {
|
204
|
+
// We were selecting all items, clear the selection to allow the user to start over
|
205
|
+
this.onClearSelectionClick();
|
206
|
+
}
|
197
207
|
this.showSelectAllItemsButton = false;
|
198
208
|
this.selectionContext.isSelectingAllItems = false;
|
199
209
|
}
|
@@ -201,6 +211,7 @@ export class ItemPickerComponent {
|
|
201
211
|
}
|
202
212
|
updateAvailableCheckboxText() {
|
203
213
|
if (this.enableSelectAllItems) {
|
214
|
+
console.log(this.selectionContext.isSelectingAllItems);
|
204
215
|
if (!this.selectionContext.isSelectingAllItems) {
|
205
216
|
const checkedCount = this.selectionContext.rowCheckboxes.controls.map(c => c.value).filter(v => v).length;
|
206
217
|
if (checkedCount > 0) {
|
@@ -256,10 +267,10 @@ export class ItemPickerComponent {
|
|
256
267
|
}
|
257
268
|
}
|
258
269
|
ItemPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
259
|
-
ItemPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ItemPickerComponent, selector: "ec-item-picker", inputs: { id: "id", availableTitle: "availableTitle", selectedTitle: "selectedTitle", itemName: "itemName", formModel: "formModel", customAvailableHeaderTemplate: "customAvailableHeaderTemplate", customAvailableItemTemplate: "customAvailableItemTemplate", customSelectedItemTemplate: "customSelectedItemTemplate", ready: "ready", getItems: "getItems", selectionContext: "selectionContext", noDataMessage: "noDataMessage", noSelectedItemsMessage: "noSelectedItemsMessage", enableSelectAllItems: "enableSelectAllItems", selectAllItemsMessage: "selectAllItemsMessage" }, viewQueries: [{ propertyName: "defaultAvailableHeaderTemplate", first: true, predicate: ["defaultAvailableHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableSelectAllHeaderTemplate", first: true, predicate: ["defaultAvailableSelectAllHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableItemTemplate", first: true, predicate: ["defaultAvailableItemTemplate"], descendants: true, static: true }, { propertyName: "defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\" class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\" style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <a *ngIf=\"selectedItemsClearable\"\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</a>\r\n </div>\r\n <span class=\"m-auto\" [innerHtml]=\"selectAllItemsMessage | translate\"></span> \r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\" [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <a *ngIf=\"selectedItemsClearable\"\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</a>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableSelectAllHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i4.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i5.TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: i6.SearchableTableComponent, selector: "ec-searchable-table", inputs: ["id", "resizable", "sortable", "sort", "autofocus", "tableClasses", "searchboxPlaceholder", "formModel", "noDataMessage", "noSearchResultsMessage", "ready", "getItems", "refresh", "status", "tableLayoutFixed", "searchboxTabIndex", "maxItemCount", "hideSearchControl", "hideHeader", "objectType", "hideFooter", "pageable", "pageSize", "maxTabs", "searchboxReadonly", "selectionContext", "selectionToolbarTemplate", "additionalCountText", "selectable", "customContentTemplate", "removeCard", "overlayClasses", "fillParentHeight"], outputs: ["sortChange", "pageChange", "itemsChange"] }, { kind: "component", type: i7.TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: ["id", "ecTableSelectableRow", "selectionContext", "rowIndex", "lockedColOptions", "isSelected", "isCheckboxDisabled"] }, { kind: "component", type: i8.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
|
270
|
+
ItemPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ItemPickerComponent, selector: "ec-item-picker", inputs: { id: "id", availableTitle: "availableTitle", selectedTitle: "selectedTitle", itemName: "itemName", formModel: "formModel", customAvailableHeaderTemplate: "customAvailableHeaderTemplate", customAvailableItemTemplate: "customAvailableItemTemplate", customSelectedItemTemplate: "customSelectedItemTemplate", ready: "ready", getItems: "getItems", selectionContext: "selectionContext", noDataMessage: "noDataMessage", noSelectedItemsMessage: "noSelectedItemsMessage", enableSelectAllItems: "enableSelectAllItems", selectAllItemsMessage: "selectAllItemsMessage" }, viewQueries: [{ propertyName: "defaultAvailableHeaderTemplate", first: true, predicate: ["defaultAvailableHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableSelectAllHeaderTemplate", first: true, predicate: ["defaultAvailableSelectAllHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableItemTemplate", first: true, predicate: ["defaultAvailableItemTemplate"], descendants: true, static: true }, { propertyName: "defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove || selectionContext.isSelectingAllItems\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\"\r\n style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n <span class=\"m-auto\"\r\n [innerHtml]=\"selectAllItemsMessage | translate\"></span>\r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\"\r\n [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableSelectAllHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i4.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i5.TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: i6.SearchableTableComponent, selector: "ec-searchable-table", inputs: ["id", "resizable", "sortable", "sort", "autofocus", "tableClasses", "searchboxPlaceholder", "formModel", "noDataMessage", "noSearchResultsMessage", "ready", "getItems", "refresh", "status", "tableLayoutFixed", "searchboxTabIndex", "maxItemCount", "hideSearchControl", "hideHeader", "objectType", "hideFooter", "pageable", "pageSize", "maxTabs", "searchboxReadonly", "selectionContext", "selectionToolbarTemplate", "additionalCountText", "selectable", "customContentTemplate", "removeCard", "overlayClasses", "fillParentHeight"], outputs: ["sortChange", "pageChange", "itemsChange"] }, { kind: "component", type: i7.TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: ["id", "ecTableSelectableRow", "selectionContext", "rowIndex", "lockedColOptions", "isSelected", "isCheckboxDisabled"] }, { kind: "component", type: i8.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
|
260
271
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, decorators: [{
|
261
272
|
type: Component,
|
262
|
-
args: [{ selector: 'ec-item-picker', template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"
|
273
|
+
args: [{ selector: 'ec-item-picker', template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove || selectionContext.isSelectingAllItems\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\"\r\n style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n <span class=\"m-auto\"\r\n [innerHtml]=\"selectAllItemsMessage | translate\"></span>\r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\"\r\n [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableSelectAllHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"] }]
|
263
274
|
}], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { id: [{
|
264
275
|
type: Input
|
265
276
|
}], availableTitle: [{
|
@@ -303,4 +314,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
303
314
|
type: ViewChild,
|
304
315
|
args: ['defaultSelectedItemTemplate', { static: true }]
|
305
316
|
}] } });
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2l0ZW0tcGlja2VyL2l0ZW0tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9pdGVtLXBpY2tlci9pdGVtLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNkMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7Ozs7Ozs7QUFlM0UsQ0FBQztBQUVGLE1BQU0sT0FBTywyQkFBK0IsU0FBUSx5QkFBeUI7SUFBN0U7O1FBQ0UscUZBQXFGO1FBQzlFLHFCQUFnQixHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWhFOzs7V0FHRztRQUNJLDRCQUF1QixHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlEOztXQUVHO1FBQ2Esb0NBQStCLEdBQVksSUFBSSxDQUFDO1FBRWhFOzs7V0FHRztRQUNJLHdCQUFtQixHQUFZLEtBQUssQ0FBQztJQUM5QyxDQUFDO0NBQUE7QUFPRCxNQUFNLE9BQU8sbUJBQW1CO0lBd0c5QixZQUNVLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBdkc1Qyx3R0FBd0c7UUFDeEYsT0FBRSxHQUFZLEVBQUUsQ0FB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QUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsU0FBUztzQkFBeEIsS0FBSztnQkFHVSw2QkFBNkI7c0JBQTVDLEtBQUs7Z0JBR1UsMkJBQTJCO3NCQUExQyxLQUFLO2dCQUdVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFHVSxLQUFLO3NCQUFwQixLQUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUtVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBTVUsc0JBQXNCO3NCQUFyQyxLQUFLO2dCQUtVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFHVSxxQkFBcUI7c0JBQXBDLEtBQUs7Z0JBMkNpRSw4QkFBOEI7c0JBQXBHLFNBQVM7dUJBQUMsZ0NBQWdDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNtQix1Q0FBdUM7c0JBQXRILFNBQVM7dUJBQUMseUNBQXlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVELDRCQUE0QjtzQkFBaEcsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1MsMkJBQTJCO3NCQUE5RixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFRhYmxlU2VhcmNoUmVzdWx0cyB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFibGUvc2VhcmNoYWJsZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdpbmdJbmZvIH0gZnJvbSAnLi4vLi4vZGlzcGxheS90YWJsZS90YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQgfSBmcm9tICcuLi8uLi9kaXNwbGF5L3RhYmxlL3RhYmxlLXNlbGVjdGFibGUtcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi8uLi9kaXNwbGF5L3ZpZXctb3ZlcmxheS92aWV3LW92ZXJsYXkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi9tZW51L21lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQaWNrZXJJdGVtPFRWYWx1ZSA9IGFueSwgU0l0ZW1zID0gYW55PiBleHRlbmRzIE1lbnVJdGVtIHtcclxuICBpZDogc3RyaW5nO1xyXG5cclxuICAvKiogV2hlbiBzZXQgdG8gdHJ1ZSB0aGUgYXZhaWxhYmxlIGl0ZW0gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBsaXN0ICovXHJcbiAgZGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBpdGVtIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3RlZCBsaXN0ICovXHJcbiAgcHJldmVudFJlbW92ZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBSZWRlZmluaW5nIHRvIGdldCB0aGUgdHlwaW5nICovXHJcbiAgdmFsdWU6IFRWYWx1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBJdGVtUGlja2VyU2VsZWN0YWJsZUNvbnRleHQ8VD4gZXh0ZW5kcyBUYWJsZVNlbGVjdGFibGVSb3dDb250ZXh0IHtcclxuICAvKiogaWQvdmFsdWUgbWFwIG9mIHRoZSBzZWxlY3RlZCBpdGVtcy4gVXNlZCBmb3Iga2VlcGluZyB0cmFjayBvZiB3aGF0IGlzIHNlbGVjdGVkICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXNNYXA6IE1hcDxzdHJpbmcsIFBpY2tlckl0ZW08VD4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAvKipcclxuICAgKiBHaXZlcyBhIHdheSB0byB0ZWxsIHRoZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgdGhlIG1hcCB3YXMgbW9kaWZpZWQgZXh0ZXJuYWxseSBhbmQgdG8gdXBkYXRlXHJcbiAgICogdGhlIGF2YWlsYWJsZS9zZWxlY3RlZCBsaXN0c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zTWFwQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkdmFuY2VkUm93Q2xpY2tCZWhhdmlvciBpcyBkaXNhYmxlZCBmb3IgSXRlbVBpY2tlci5cclxuICAgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgZGlzYWJsZUFkdmFuY2VkUm93Q2xpY2tCZWhhdmlvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBXaGVuIHRydWUgdGhlIHVzZXIgaGFzIG9wdGVkIHRvIHNlbGVjdCBhbGwgaXRlbXMgYWNyb3NzIGFsbCBwYWdlcy4gRHVlIHRvIGFwaSBwYWdpbmF0aW9uXHJcbiAgICogIHdlIGRvbid0IGhhdmUgYWxsIG9mIHRoZSBpdGVtcyBsb2NhbGx5LCBzbyB0aGUgaG9zdCB3aWxsIG5lZWQgdG8gdGVsbCB0aGUgQVBJIHRvIG9wZXJhdGUgb24gYWxsXHJcbiAgICogIHZpYSBhcGkgZmlsdGVycyBvciBvdGhlciBtZWFucy5cclxuICAgKi9cclxuICBwdWJsaWMgaXNTZWxlY3RpbmdBbGxJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLWl0ZW0tcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaXRlbS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2l0ZW0tcGlja2VyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEl0ZW1QaWNrZXJDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqIElkZW50aWZpZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGFsbCBpbnRlcm5hbCBhY3Rpb24gZWxlbWVudHMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRpdGxlIGRpc3BsYXllZCBhYm92ZSB0aGUgYXZhaWxhYmxlIGl0ZW1zIHRhYmxlICovXHJcbiAgQElucHV0KCkgcHVibGljIGF2YWlsYWJsZVRpdGxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRpdGxlIGRpc3BsYXllZCBhYm92ZSB0aGUgc2VsZWN0ZWQgaXRlbXMgbGlzdCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZFRpdGxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRoZSB0eXBlIG9mIGl0ZW0gYmVpbmcgc2VsZWN0ZWQuIEV4LiBNZXRlcnMsIEFkZHJlc3NlcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpdGVtTmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBGb3JtIGdyb3VwIHRoYXQgaXMgZ2l2ZW4gdG8gdGhlIGludGVybmFsIFNlYXJjaGFibGUgVGFibGUgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZm9ybU1vZGVsPzogVW50eXBlZEZvcm1Hcm91cDtcclxuXHJcbiAgLyoqIFRlbXBsYXRlIGZvciB3aGVuIGEgY3VzdG9tIGhlYWRlciBpcyBuZWVkZWQgZm9yIHRoZSBhdmFpbGFibGUgaXRlbXMgdGFibGUgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKiogVGVtcGxhdGUgZm9yIHdoZW4gYSBjdXN0b20gYXZhaWxhYmxlIGl0ZW0gaXMgbmVlZGVkLiBEZWZhdWx0IHRlbXBsYXRlIGlzIGEgbGFiZWwgb25seSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21BdmFpbGFibGVJdGVtVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKiogVGVtcGxhdGUgZm9yIHdoZW4gYSBjdXN0b20gc2VsZWN0ZWQgaXRlbSBpcyBuZWVkZWQuIERlZmF1bHQgdGVtcGxhdGUgaXMgYSBsYWJlbCBvbmx5ICovXHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVNlbGVjdGVkSXRlbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFVzZWQgYnkgdGhlIGludGVybmFsIFNlYXJjaGFibGUgVGFibGUgdG8ga25vdyB3aGVuIHRoZSBwYWdlIGlzIHJlYWR5ICovXHJcbiAgQElucHV0KCkgcHVibGljIHJlYWR5PzogT2JzZXJ2YWJsZTx2b2lkPjtcclxuXHJcbiAgLyoqIFVzZWQgYnkgU2VhcmNoYWJsZSBUYWJsZSB0byByZXRyaWV2ZSB0aGUgYXZhaWxhYmxlIGl0ZW1zICovXHJcbiAgQElucHV0KCkgcHVibGljIGdldEl0ZW1zPzogKHNlYXJjaD86IHN0cmluZywgcGFnZUNoYW5nZUluZm8/OiBQYWdpbmdJbmZvKSA9PiBPYnNlcnZhYmxlPFRhYmxlU2VhcmNoUmVzdWx0cz47XHJcblxyXG4gIC8qKiBVc2VkIHRvIG1haW50YWluIHRoZSBhdmFpbGFibGUgaXRlbXMgY2hlY2tib3ggc2VsZWN0aW9uIGFzIHdlbGwgYXMgdGhlIHNlbGVjdGVkIGl0ZW1zIGxpc3QgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uQ29udGV4dCE6IEl0ZW1QaWNrZXJTZWxlY3RhYmxlQ29udGV4dDxUPjtcclxuXHJcbiAgLyoqIFVzZWQgYnkgdGhlIGludGVybmFsIFNlYXJjaGFibGUgVGFibGUgd2hlbiB0aGVyZSBpcyBubyBhdmFpbGFibGUgaXRlbXMgdG8gY2hvb3NlIGZyb20gYmFzZWQgb24gdGhlIGdldEl0ZW1zIHJlc3VsdHMuIERvIG5vdCBzdXBwbHlcclxuICAgKiAgdG8gaW5oZXJpdCB0aGUgZGVmYXVsdCBtZXNzYWdlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBub0RhdGFNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBubyBzZWxlY3RlZCBpdGVtcyBtZXNzYWdlLiBJZiBwcm92aWRlZCB0aGlzIHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG1lc3NhZ2Ugd2l0aCB0aGUgaXRlbSBuYW1lXHJcbiAgICogaW50ZXJwb2xhdGlvbiB3aWxsIGJlIHVzZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG5vU2VsZWN0ZWRJdGVtc01lc3NhZ2U/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGVuIHRydWUgdGhlIGJ1dHRvbiB0byBzZWxlY3QgYWxsIGl0ZW1zIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGhlYWRlciB3aGVuXHJcbiAgICogIHRoZSBoZWFkZXIgY2hlY2tib3ggaXMgY2hlY2tlZCBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIHBhZ2VzIG9mIHJlc3VsdHNcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlU2VsZWN0QWxsSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBhc3NlZCBpbiBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIHNlbGVjdGVkIGl0ZW1zIHRhYmxlIHdoZW4gdGhlIHNlbGVjdCBhbGwgaXRlbXMgYnV0dG9uIGlzIGNsaWNrZWQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0QWxsSXRlbXNNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIExpc3Qgb2YgYXZhaWxhYmxlIGl0ZW1zIHRvIHBpY2sgZnJvbSAqL1xyXG4gIHB1YmxpYyBhdmFpbGFibGVJdGVtczogUGlja2VySXRlbVtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdGVkIGl0ZW1zIGFycmF5LiBDcmVhdGVkIGZyb20gdGhlIHNlbGVjdGVkIGl0ZW1zIG1hcC4gQmluZGluZyB0byB0aGVcclxuICAgKiBtYXAgaXRlcmF0ZSB2YWx1ZXMgY2F1c2VkIGFuZ3VsYXIgXCJleHByZXNzaW9uIGNoYW5nZWRcIiBlcnJvcnMgc28gYWZ0ZXIgYSBtYXBcclxuICAgKiB1cGRhdGUgdGhpcyBnZXRzIHNldCB0byB0aGUgdmFsdWVzXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXM6IFBpY2tlckl0ZW1bXSA9IFtdO1xyXG5cclxuICAvKiogVHJ1ZSBpZiB0aGVyZSBhcmUgc2VsZWN0ZWQgaXRlbXMgYW5kIGF0IGxlYXN0IG9uZSBjYW4gYmUgcmVtb3ZlZCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zQ2xlYXJhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUcmFjayBieSB1c2VkIGZvciB0aGUgc2VhcmNoYWJsZSB0YWJsZSByb3dzICovXHJcbiAgcHVibGljIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKSA9PiBpbmRleDtcclxuXHJcbiAgcHVibGljIHRhYmxlU3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnKTtcclxuXHJcbiAgLyoqIFRleHQgdG8gZGlzcGxheSBuZXh0IHRvIHRoZSBjaGVja2JveCBpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGhlYWRlci4gVXNlZCB0byBkaXNsYXkgaG93IG1hbnkgaXRlbXMgYXJlXHJcbiAgICogIHNlbGVjdGVkIHdoZW4gc2VsZWN0IGFsbCBpdGVtcyBpcyBlbmFibGVkXHJcbiAgICovXHJcbiAgcHVibGljIGF2YWlsYWJsZUNoZWNrYm94VGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBXaGVuIHNldCB0byB0cnVlIHRoZSBzZWxlY3QgYWxsIGl0ZW1zIGJ1dHRvbiB3aWxsIHNob3cgaW4gdGhlIGF2YWlsYWJsZSBpdGVtcyBoZWFkZXIuIFRoaXMgaXNcclxuICAgKiAgc2hvd24gd2hlbiB0aGUgdXNlciBoYXMgZW5hYmxlZCBzZWxlY3QgYWxsIGZvciB0aGUgaXRlbSBwaWNrZXIgYW5kIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGhlYWRlciBjaGVja2JveFxyXG4gICAqICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFnZSBvZiByZXN1bHRzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzaG93U2VsZWN0QWxsSXRlbXNCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgcmV0dXJuZWQgZnJvbSB0aGUgYXBpIGFjcm9zcyBhbGwgcGFnZXMgKi9cclxuICBwdWJsaWMgdG90YWxJdGVtc0JlZm9yZVBhZ2luZz86IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBsYXRlIHVzZWQgdG8gZGlzcGxheSB0aGUgYXZhaWxhYmxlIGFuZCBzZWxlY3RlZCBpdGVtcyBhcyB3ZWxsIGFzIHRoZSBhdmFpbGFibGUgaXRlbSBoZWFkZXIuXHJcbiAgICogVGhpcyB3aWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBpZiBhIGN1c3RvbSBpcyBub3QgcHJvdmlkZWRcclxuICAgKi9cclxuICBwdWJsaWMgaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBEZWZhdWx0IHRlbXBsYXRlcyB1c2VkIGlmIGEgY3VzdG9tIHRlbXBsYXRlIGlzIG5vdCBwcm92aWRlZCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0QXZhaWxhYmxlU2VsZWN0QWxsSGVhZGVyVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGRlZmF1bHRBdmFpbGFibGVTZWxlY3RBbGxIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGRlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFVzZWQgdG8gc2h1dCBkb3duIG91ciBzdWJzY3JpcHRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgKi9cclxuICBwcml2YXRlIGRlc3Ryb3llZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR1cFJvd0NoZWNrYm94ZXNXYXRjaGVyKCk7XHJcbiAgICB0aGlzLnNldHVwU2VsZWN0ZWRJdGVtc0NoYW5nZWRXYXRjaGVyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCBmb3IgY2hhbmdlcyBhbmQgcmVhY3QgaWYgdGhlIGN1c3RvbSBpdGVtIHRlbXBsYXRlIHZhbHVlIGNoYW5nZXNcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEludGVybmFsaXplZFRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBieSB0aGUgc2VhcmNoYWJsZSB0YWJsZSB3aGVuIGEgbmV3IHNldCBvZiBpdGVtcyBhcmUgcmV0dXJuZWQgZnJvbSB0aGUgZ2V0SXRlbXMgY2FsbC5cclxuICAgKiBJZiBhbnkgb2YgdGhlIGl0ZW1zIGhhdmUgYHByZXZlbnRSZW1vdmVgIHNldCwgdGhlaXIgaW5kaWNlcyBhcmUgYWRkZWQgdG8gdGhlIGNvbnRleHQuXHJcbiAgICovXHJcbiAgcHVibGljIG9uSXRlbXNDaGFuZ2UocmVzdWx0czogVGFibGVTZWFyY2hSZXN1bHRzKSB7XHJcbiAgICBsZXQgbmV3Tm9uRGVwZW5kZW50Q2hlY2tib3hlczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICAoPFBpY2tlckl0ZW1bXT5yZXN1bHRzLml0ZW1zKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgID0+IHtcclxuICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgaXRlbXMgYXJlIG1hcmtlZCB0byBiZSBzZWxlY3RlZCBieSBkZWZhdWx0IGFuZCBpZiBzb1xyXG4gICAgICAvLyBhZGQgdGhlbSB0byB0aGUgbWFwLlxyXG4gICAgICBpZiAoaXRlbS5kZWZhdWx0U2VsZWN0ZWQgJiYgIXRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5oYXMoaXRlbS5pZCkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuc2V0KGl0ZW0uaWQsIGl0ZW0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBpdGVtcyBhcmUgbWFya2VkIHRvIHByZXZlbnQgUmVtb3ZhbCwgYW5kIGlmIHNvXHJcbiAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSBub24tZGVwZW5kZW50IGNoZWNrYm94ZXMgYXJyYXkuICBUaGlzIHdpbGwgcHJldmVudCB0aGUgbWFzdGVyXHJcbiAgICAgIC8vIGNoZWNrYm94IGZyb20gdG9nZ2xpbmcgdGhlbS5cclxuICAgICAgaWYgKGl0ZW0ucHJldmVudFJlbW92ZSkge1xyXG4gICAgICAgIG5ld05vbkRlcGVuZGVudENoZWNrYm94ZXMucHVzaChpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5ub25EZXBlbmRlbnRDaGVja2JveGVzID0gbmV3Tm9uRGVwZW5kZW50Q2hlY2tib3hlcztcclxuXHJcbiAgICAvLyBXaGVuIHRoZSB1c2VyIGZpbHRlcnMgdGhlIGxpc3Qgd2Ugc2hvdWxkIHJlc2V0IHRoZSBzZWxlY3QgYWxsIGl0ZW1zXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtcyA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuYXZhaWxhYmxlSXRlbXMgPSAoPFBpY2tlckl0ZW1bXT5yZXN1bHRzLml0ZW1zKTtcclxuICAgIHRoaXMudG90YWxJdGVtc0JlZm9yZVBhZ2luZyA9IHJlc3VsdHMudG90YWxJdGVtc0JlZm9yZVBhZ2luZztcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZUNoZWNrYm94VGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNsZWFyIHNlbGVjdGlvbiBsaW5rIGJ1dHRvbiBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgcHVibGljIG9uQ2xlYXJTZWxlY3Rpb25DbGljaygpIHtcclxuICAgIC8vIFJlbW92ZSByZW1vdmFibGUgaXRlbXMgZnJvbSBtYXBcclxuICAgIC8vIFRoaXMgaXMgc2FmZS4gIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTk0MDIxNi9lczYtaXMtaXQtZGFuZ2Vyb3VzLXRvLWRlbGV0ZS1lbGVtZW50cy1mcm9tLXNldC1tYXAtZHVyaW5nLXNldC1tYXAtaXRlcmF0aW9uXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXApIHtcclxuICAgICAgaWYgKCF2YWwucHJldmVudFJlbW92ZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLmRlbGV0ZShrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnJvd0NoZWNrYm94ZXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBpZighdGhpcy5hdmFpbGFibGVJdGVtc1tpbmRleF0ucHJldmVudFJlbW92ZSl7XHJcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmYWxzZSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC52YWx1ZXMoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVtb3ZlIGl0ZW0gYnV0dG9uIGlzIGNsaWNrZWQgZm9yIGEgc2VsZWN0ZWQgaXRlbVxyXG4gICAqIEBwYXJhbSByZW1vdmVJdGVtXHJcbiAgICovXHJcbiAgcHVibGljIHJlbW92ZVNlbGVjdGVkSXRlbShyZW1vdmVJdGVtOiBQaWNrZXJJdGVtKTogdm9pZCB7XHJcbiAgICBsZXQgZm91bmRJbmRleCA9IHRoaXMuYXZhaWxhYmxlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PT0gcmVtb3ZlSXRlbS5pZCk7XHJcbiAgICBpZiAoZm91bmRJbmRleCA+IC0xKSB7XHJcbiAgICAgIC8vIFVwZGF0ZSB0aGUgcm93IGNoZWNrYm94IHNpbmNlIHRoZSBpdGVtIGV4aXN0cyBpbiB0aGUgcGFnZSBiZWluZyB2aWV3ZWRcclxuICAgICAgLy8gVGhlIHZhbHVlIGNoYW5nZSBoYW5kbGVyIGZvciByb3cgY2hlY2tib3hlcyB3aWxsIHVwZGF0ZSB0aGUgbWFwL3NlbGVjdGVkIGl0ZW1zXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5yb3dDaGVja2JveGVzLmF0KGZvdW5kSW5kZXgpLnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRoZSBpdGVtIGJlaW5nIHJlbW92ZWQgaXMgbm90IG9uIHRoZSBjdXJyZW50IHBhZ2Ugc28ganVzdCB1cGRhdGUgdGhlXHJcbiAgICAgIC8vIG1hcC9zZWxlY3RlZCBpdGVtc1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC5kZWxldGUocmVtb3ZlSXRlbS5pZCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXAudmFsdWVzKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgXHJcbiAgLyoqIFxyXG4gICAqIENsaWNrIGhhbmRsZXIgZm9yIHRoZSBzZWxlY3QgYWxsIGl0ZW1zIGJ1dHRvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZWxlY3RBbGxJdGVtcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zID0gdHJ1ZTtcclxuICAgIHRoaXMuc2hvd1NlbGVjdEFsbEl0ZW1zQnV0dG9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZUNoZWNrYm94VGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIHJvdyBjaGVja2JveGVzIGZvcm0gYXJyYXkgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbXNcclxuICAgKiBsaXN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cFJvd0NoZWNrYm94ZXNXYXRjaGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5yb3dDaGVja2JveGVzLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICAvLyBEZWJvdW5jZSAxMCBpcyBzaW1wbHkgdG8gbm90IHNwYW0gdGhlIGNoYW5nZSBoYW5kbGVyIG9uIGxvYWQvcGFnZSBjaGFuZ2VcclxuICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuZXcgcm93IGlzIGFkZGVkIHRvIHRoZSB0YWJsZVxyXG4gICAgICBkZWJvdW5jZVRpbWUoMTApLFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgocm93VmFsdWVzOiBib29sZWFuW10pID0+IHtcclxuICAgICAgcm93VmFsdWVzLmZvckVhY2goKHNlbGVjdGVkLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGxldCBhdmFpbGFibGVJdGVtID0gdGhpcy5hdmFpbGFibGVJdGVtc1tpbmRleF07XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhhdmFpbGFibGVJdGVtLmlkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmRlbGV0ZShhdmFpbGFibGVJdGVtLmlkKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkICYmICF0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGF2YWlsYWJsZUl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuc2V0KGF2YWlsYWJsZUl0ZW0uaWQsIGF2YWlsYWJsZUl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC52YWx1ZXMoKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyYWJsZSA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5zb21lKGkgPT4gIWkucHJldmVudFJlbW92ZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlQXZhaWxhYmxlQ2hlY2tib3hUZXh0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0QWxsQ2hlY2tib3gudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDEwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKChjaGVja2VkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9uZVBhZ2VPZkRhdGEgPSB0aGlzLmF2YWlsYWJsZUl0ZW1zLmxlbmd0aCA9PT0gdGhpcy50b3RhbEl0ZW1zQmVmb3JlUGFnaW5nO1xyXG4gICAgICBpZiAoY2hlY2tlZCAmJiAhb25lUGFnZU9mRGF0YSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1NlbGVjdEFsbEl0ZW1zQnV0dG9uID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmICghY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1NlbGVjdEFsbEl0ZW1zQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUF2YWlsYWJsZUNoZWNrYm94VGV4dCgpIHtcclxuICAgIGlmICh0aGlzLmVuYWJsZVNlbGVjdEFsbEl0ZW1zKSB7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMpIHtcclxuICAgICAgICBjb25zdCBjaGVja2VkQ291bnQgPSB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5jb250cm9scy5tYXAoYyA9PiBjLnZhbHVlKS5maWx0ZXIodiA9PiB2KS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNoZWNrZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlQ2hlY2tib3hUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0NvdW50U2VsZWN0ZWRfVEMnLCB7IGNvdW50OiBjaGVja2VkQ291bnQgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlQ2hlY2tib3hUZXh0ID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlQ2hlY2tib3hUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0FsbEl0ZW1QaWNrZXJJdGVtc1NlbGVjdGVkX1NDJywgeyBjb3VudDogdGhpcy50b3RhbEl0ZW1zQmVmb3JlUGFnaW5nLCBpdGVtTmFtZTogdGhpcy5pdGVtTmFtZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggdG8gYmUgdG9sZCBpZiBjaGFuZ2VzIHRvIHRoZSBtYXAgd2VyZSBtYWRlIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudCBhbmQgaWYgc28gdXBkYXRlXHJcbiAgICogdGhlIGFycmF5IGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0ZWQgbGlzdCBhbmQgc2VsZWN0IGNoZWNrYm94ZXMgZm9yIHZpc2libGUgYXZhaWxhYmxlIGl0ZW1zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cFNlbGVjdGVkSXRlbXNDaGFuZ2VkV2F0Y2hlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwQ2hhbmdlZC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkNvbnRleHQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC52YWx1ZXMoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC5oYXMoaXRlbS5pZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnJvd0NoZWNrYm94ZXMuYXQoaW5kZXgpLnNldFZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW50ZXJuYWxpemVkVGVtcGxhdGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VzdG9tQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZSA9IHRoaXMuY3VzdG9tQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZW5hYmxlU2VsZWN0QWxsSXRlbXMpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdEF2YWlsYWJsZVNlbGVjdEFsbEhlYWRlclRlbXBsYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmN1c3RvbUF2YWlsYWJsZUl0ZW1UZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUl0ZW1UZW1wbGF0ZSA9IHRoaXMuY3VzdG9tQXZhaWxhYmxlSXRlbVRlbXBsYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUgPSB0aGlzLmRlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY3VzdG9tU2VsZWN0ZWRJdGVtVGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSA9IHRoaXMuY3VzdG9tU2VsZWN0ZWRJdGVtVGVtcGxhdGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZFNlbGVjdGVkSXRlbVRlbXBsYXRlID0gdGhpcy5kZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgZWNPdmVybGF5XHJcbiAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1ncm93IGNhcmRcIlxyXG4gICAgIFtzdGF0dXNdPVwidGFibGVTdGF0dXM/LnN0YXR1c1wiXHJcbiAgICAgW21lc3NhZ2VdPVwidGFibGVTdGF0dXM/Lm1lc3NhZ2VcIlxyXG4gICAgIFtkaXNwbGF5QXNNYXNrXT1cInRydWVcIj5cclxuICAgIDxlYy1zZWFyY2hhYmxlLXRhYmxlIGlkPVwie3tpZH19X3NlYXJjaGFibGVUYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtZ3Jvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsbFBhcmVudEhlaWdodF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlSGVhZGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVTZWFyY2hDb250cm9sXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3JlbW92ZUNhcmRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZWFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwiNTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW29iamVjdFR5cGVdPVwiaXRlbU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJmb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWR5XT1cInJlYWR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtnZXRJdGVtc109XCJnZXRJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtub0RhdGFNZXNzYWdlXT1cIm5vRGF0YU1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbkNvbnRleHRdPVwic2VsZWN0aW9uQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInRhYmxlU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtc0NoYW5nZSk9XCJvbkl0ZW1zQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tZWMtc2VhcmNoYWJsZS10YWJsZS1mbGV4LXByb3BlcnRpZXNdPVwiKGF2YWlsYWJsZUl0ZW1zLmxlbmd0aCB8fCB0YWJsZVN0YXR1cy5zdGF0dXMgPT09ICdwZW5kaW5nJyB8fCB0YWJsZVN0YXR1cy5zdGF0dXMgPT09ICdlcnJvcicgKSA/ICcxIDEgYXV0bycgOiAnMCAxIGF1dG8nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS4tLWVjLXNlYXJjaGFibGUtdGFibGUtaGVpZ2h0LWNhcHRpb24tZm9vdGVyXT1cIidjYWxjKDIuNXJlbSArIDFweCknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZUxheW91dEZpeGVkXT1cInRydWVcIj5cclxuICAgICAgICA8aGVhZGVyICpuZ0lmPVwiY3VzdG9tQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWhlYWRlciBmbGV4LXNocmlua1wiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogM3JlbTtcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7YXZhaWxhYmxlVGl0bGUgfCB0cmFuc2xhdGV9fTwvaDM+XHJcbiAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHIgZWNUYWJsZVNlbGVjdGFibGVSb3dcclxuICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Db250ZXh0XT1cInNlbGVjdGlvbkNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXItYm90dG9tLTBcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZTtcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYXZhaWxhYmxlSXRlbXM7IGluZGV4IGFzIHJvd0luZGV4OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBlY1RhYmxlU2VsZWN0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Db250ZXh0XT1cInNlbGVjdGlvbkNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzQ2hlY2tib3hEaXNhYmxlZF09XCJpdGVtLnByZXZlbnRSZW1vdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cInNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGl0ZW0uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy10YWJsZS1zZWxlY3RhYmxlLXJvdy12ZXJ0aWNhbC1hbGlnbi1jaGVja2JveC10ZF09XCInbWlkZGxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgPC9lYy1zZWFyY2hhYmxlLXRhYmxlPlxyXG5cclxuICAgIDxzZWN0aW9uIGlkPVwie3tpZH19X3NlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RlZC1pdGVtcyBmbGV4LWdyb3cgZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZ3Jvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBib3JkZXItYm90dG9tIHB4LTJcIiBzdHlsZT1cImhlaWdodDogM3JlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGZsZXgtZ3JvdyB0ZXh0LXRydW5jYXRlXCI+e3tzZWxlY3RlZFRpdGxlIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwic2VsZWN0ZWRJdGVtc0NsZWFyYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICBpZD1cInt7aWR9fV9jbGVhclNlbGVjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBsLTIgbWwtYXV0byBmb250LXNpemUtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcclxuICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsZWFyU2VsZWN0aW9uQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+Q2xlYXJTZWxlY3Rpb25fVEM8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tYXV0b1wiIFtpbm5lckh0bWxdPVwic2VsZWN0QWxsSXRlbXNNZXNzYWdlIHwgdHJhbnNsYXRlXCI+PC9zcGFuPiAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGVjLXRhYmxlICpuZ0lmPVwiIXNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3cgaXMtZml4ZWRcIj5cclxuICAgICAgICAgICAgPGNvbGdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPGNvbD5cclxuICAgICAgICAgICAgICAgIDxjb2wgc3R5bGU9XCJ3aWR0aDogMnJlbTtcIj5cclxuICAgICAgICAgICAgPC9jb2xncm91cD5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiaGVpZ2h0OiAzcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIGJvcmRlci1ib3R0b20tMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMiBmb250LWNvbG9yLXByaW1hcnkgZmxleC1ncm93IHRleHQtdHJ1bmNhdGVcIj57e3NlbGVjdGVkVGl0bGUgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zQ2xlYXJhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tpZH19X2NsZWFyU2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMiBtbC1hdXRvIGZvbnQtc2l6ZS1iYXNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xlYXJTZWxlY3Rpb25DbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT5DbGVhclNlbGVjdGlvbl9UQzwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcblxyXG4gICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRJdGVtcy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtczsgbGFzdCBhcyBpc0xhc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInNlbGVjdGVkX3Jvd197e2l0ZW0uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItYm90dG9tXT1cIiFpc0xhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkU2VsZWN0ZWRJdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbnMtY29sIHRleHQtcmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjLWJ1dHRvbiBpZD1cInt7aWR9fV9yZW1vdmVTZWxlY3RlZF97e2l0ZW0uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWl0ZW0ucHJldmVudFJlbW92ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJpY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImVjLWljb24gaWNvbi1jYW5jZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJyZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWMtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cIiFzZWxlY3RlZEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFub1NlbGVjdGVkSXRlbXNNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sc3Bhbj1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtMiBuby1kYXRhLW1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7aXRlbU5hbWU6IGl0ZW1OYW1lIHwgdHJhbnNsYXRlfVwiPkl0ZW1QaWNrZXJOb0l0ZW1zU2VsZWN0ZWRfU0M8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm5vU2VsZWN0ZWRJdGVtc01lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIG5vLWRhdGEtbWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT57e25vU2VsZWN0ZWRJdGVtc01lc3NhZ2V9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvZWMtdGFibGU+XHJcblxyXG4gICAgICAgIDxmb290ZXIgaWQ9XCJzZWxlY3RlZEl0ZW1zRm9vdGVyXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRJdGVtcy5sZW5ndGggJiYgIXNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXNocmluayBweC0yIGJvcmRlci10b3AgYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDIuNXJlbSArIDFweCk7XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtYXV0byB0ZXh0LWNhcHRpb24tMSBmb250LWNvbG9yLWhpbnRcIj5cclxuICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9fSB7e2l0ZW1OYW1lIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZm9vdGVyPlxyXG4gICAgPC9zZWN0aW9uPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlPlxyXG4gICAgPHRoIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGJvcmRlci1ib3R0b20tMFwiPnt7YXZhaWxhYmxlVGl0bGUgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRBdmFpbGFibGVTZWxlY3RBbGxIZWFkZXJUZW1wbGF0ZT5cclxuICAgIDx0aCBjbGFzcz1cInRleHQtaGVhZGluZy0yIGZvbnQtY29sb3ItcHJpbWFyeSBib3JkZXItYm90dG9tLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYXZhaWxhYmxlQ2hlY2tib3hUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3thdmFpbGFibGVUaXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImF2YWlsYWJsZUNoZWNrYm94VGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0ZWRDb3VudFwiPnt7YXZhaWxhYmxlQ2hlY2tib3hUZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93U2VsZWN0QWxsSXRlbXNCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGVjTGlua0J1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsSXRlbXNCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGxJdGVtcygpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7ICgnU2VsZWN0QWxsSXRlbVBpY2tlckl0ZW1zX1RDJykgfCB0cmFuc2xhdGU6eyBjb3VudDogdG90YWxJdGVtc0JlZm9yZVBhZ2luZywgaXRlbU5hbWU6IGl0ZW1OYW1lIH0gfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RoPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDx0ZD57e2l0ZW0ubGFiZWx9fTwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZVxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICB7e2l0ZW0ubGFiZWx9fVxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2l0ZW0tcGlja2VyL2l0ZW0tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9pdGVtLXBpY2tlci9pdGVtLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNkMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7Ozs7Ozs7QUFlM0UsQ0FBQztBQUVGLE1BQU0sT0FBTywyQkFBK0IsU0FBUSx5QkFBeUI7SUFBN0U7O1FBQ0UscUZBQXFGO1FBQzlFLHFCQUFnQixHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWhFOzs7V0FHRztRQUNJLDRCQUF1QixHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlEOztXQUVHO1FBQ2Esb0NBQStCLEdBQVksSUFBSSxDQUFDO1FBRWhFOzs7V0FHRztRQUNJLHdCQUFtQixHQUFZLEtBQUssQ0FBQztJQUM5QyxDQUFDO0NBQUE7QUFPRCxNQUFNLE9BQU8sbUJBQW1CO0lBd0c5QixZQUNVLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBdkc1Qyx3R0FBd0c7UUFDeEYsT0FBRSxHQUFZLEVBQUUsQ0FBQztRQUVqQyxzREFBc0Q7UUFDdEMsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFFNUMsb0RBQW9EO1FBQ3BDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTNDLDZEQUE2RDtRQUM3QyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBdUJ0Qzs7V0FFRztRQUNhLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBUTNDOztXQUVHO1FBQ2EseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRELDJHQUEyRztRQUMzRiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFFbkQsMkNBQTJDO1FBQ3BDLG1CQUFjLEdBQWlCLEVBQUUsQ0FBQztRQUV6Qzs7OztXQUlHO1FBQ0ksa0JBQWEsR0FBaUIsRUFBRSxDQUFDO1FBRXhDLHVFQUF1RTtRQUNoRSwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFFL0Msa0RBQWtEO1FBQzNDLGlCQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUV4QyxnQkFBVyxHQUFZLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXJEOztXQUVHO1FBQ0ksMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBRTFDOzs7V0FHRztRQUNJLDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUVqRCx1RUFBdUU7UUFDaEUsMkJBQXNCLEdBQVksQ0FBQyxDQUFDO1FBaUIzQywwRUFBMEU7UUFDbEUsY0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBSTdDLENBQUM7SUFFRSxRQUFRO1FBQ2IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxPQUEyQjtRQUM5QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUM3QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUM5QjtRQUVELElBQUkseUJBQXlCLEdBQWEsRUFBRSxDQUFDO1FBRTlCLE9BQU8sQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRyxFQUFFO1lBQ3JELGtGQUFrRjtZQUNsRix1QkFBdUI7WUFDdkIsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM1RDtZQUVELDRFQUE0RTtZQUM1RSxnRkFBZ0Y7WUFDaEYsK0JBQStCO1lBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLEdBQUcseUJBQXlCLENBQUM7UUFFekUsc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFFbEQsSUFBSSxDQUFDLGNBQWMsR0FBa0IsT0FBTyxDQUFDLEtBQU0sQ0FBQztRQUNwRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1FBRTdELElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLHFCQUFxQjtRQUMxQixrQ0FBa0M7UUFDbEMsK0lBQStJO1FBQy9JLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUU7WUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEQ7U0FDRjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEVBQUU7Z0JBQzdDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDeEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSSxrQkFBa0IsQ0FBQyxVQUFzQjtRQUM5QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ25CLHlFQUF5RTtZQUN6RSxpRkFBaUY7WUFDakYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BFO2FBQU07WUFDTCx1RUFBdUU7WUFDdkUscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRjtJQUNILENBQUM7SUFHRDs7T0FFRztJQUNJLGNBQWM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSTtRQUNwRCwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFvQixFQUFFLEVBQUU7WUFDbkMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDOUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xFO3FCQUFNLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ3JGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFDOUU7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtZQUNwSSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDakYsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUVwRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQzthQUN0QztpQkFBTSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUUzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRTtvQkFDN0MsbUZBQW1GO29CQUNuRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztpQkFDOUI7Z0JBRUQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQzthQUNuRDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDJCQUEyQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzlDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQzFHLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztpQkFDekc7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztpQkFDakM7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQywrQkFBK0IsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQzlKO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0NBQWdDO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBRWxGLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUMxQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO3dCQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzlEO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG1DQUFtQyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztTQUMvRTthQUFNLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ3BDLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxJQUFJLENBQUMsdUNBQXVDLENBQUM7U0FDekY7YUFBTTtZQUNMLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUM7U0FDaEY7UUFFRCxJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUNwQyxJQUFJLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1NBQzNFO2FBQU07WUFDTCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDO1NBQzVFO1FBRUQsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQztTQUN6RTthQUFNO1lBQ0wsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQztTQUMxRTtJQUNILENBQUM7O2dIQTFUVSxtQkFBbUI7b0dBQW5CLG1CQUFtQiw4dENDcERoQyx5blJBNktjOzJGRHpIRCxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsZ0JBQWdCO3VHQU9WLEVBQUU7c0JBQWpCLEtBQUs7Z0JBR1UsY0FBYztzQkFBN0IsS0FBSztnQkFHVSxhQUFhO3NCQUE1QixLQUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsU0FBUztzQkFBeEIsS0FBSztnQkFHVSw2QkFBNkI7c0JBQTVDLEtBQUs7Z0JBR1UsMkJBQTJCO3NCQUExQyxLQUFLO2dCQUdVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFHVSxLQUFLO3NCQUFwQixLQUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUtVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBTVUsc0JBQXNCO3NCQUFyQyxLQUFLO2dCQUtVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFHVSxxQkFBcUI7c0JBQXBDLEtBQUs7Z0JBMkNpRSw4QkFBOEI7c0JBQXBHLFNBQVM7dUJBQUMsZ0NBQWdDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNtQix1Q0FBdUM7c0JBQXRILFNBQVM7dUJBQUMseUNBQXlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVELDRCQUE0QjtzQkFBaEcsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1MsMkJBQTJCO3NCQUE5RixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFRhYmxlU2VhcmNoUmVzdWx0cyB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFibGUvc2VhcmNoYWJsZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdpbmdJbmZvIH0gZnJvbSAnLi4vLi4vZGlzcGxheS90YWJsZS90YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQgfSBmcm9tICcuLi8uLi9kaXNwbGF5L3RhYmxlL3RhYmxlLXNlbGVjdGFibGUtcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi8uLi9kaXNwbGF5L3ZpZXctb3ZlcmxheS92aWV3LW92ZXJsYXkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi9tZW51L21lbnUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQaWNrZXJJdGVtPFRWYWx1ZSA9IGFueSwgU0l0ZW1zID0gYW55PiBleHRlbmRzIE1lbnVJdGVtIHtcclxuICBpZDogc3RyaW5nO1xyXG5cclxuICAvKiogV2hlbiBzZXQgdG8gdHJ1ZSB0aGUgYXZhaWxhYmxlIGl0ZW0gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBsaXN0ICovXHJcbiAgZGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBpdGVtIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3RlZCBsaXN0ICovXHJcbiAgcHJldmVudFJlbW92ZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBSZWRlZmluaW5nIHRvIGdldCB0aGUgdHlwaW5nICovXHJcbiAgdmFsdWU6IFRWYWx1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBJdGVtUGlja2VyU2VsZWN0YWJsZUNvbnRleHQ8VD4gZXh0ZW5kcyBUYWJsZVNlbGVjdGFibGVSb3dDb250ZXh0IHtcclxuICAvKiogaWQvdmFsdWUgbWFwIG9mIHRoZSBzZWxlY3RlZCBpdGVtcy4gVXNlZCBmb3Iga2VlcGluZyB0cmFjayBvZiB3aGF0IGlzIHNlbGVjdGVkICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXNNYXA6IE1hcDxzdHJpbmcsIFBpY2tlckl0ZW08VD4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAvKipcclxuICAgKiBHaXZlcyBhIHdheSB0byB0ZWxsIHRoZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgdGhlIG1hcCB3YXMgbW9kaWZpZWQgZXh0ZXJuYWxseSBhbmQgdG8gdXBkYXRlXHJcbiAgICogdGhlIGF2YWlsYWJsZS9zZWxlY3RlZCBsaXN0c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zTWFwQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkdmFuY2VkUm93Q2xpY2tCZWhhdmlvciBpcyBkaXNhYmxlZCBmb3IgSXRlbVBpY2tlci5cclxuICAgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgZGlzYWJsZUFkdmFuY2VkUm93Q2xpY2tCZWhhdmlvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBXaGVuIHRydWUgdGhlIHVzZXIgaGFzIG9wdGVkIHRvIHNlbGVjdCBhbGwgaXRlbXMgYWNyb3NzIGFsbCBwYWdlcy4gRHVlIHRvIGFwaSBwYWdpbmF0aW9uXHJcbiAgICogIHdlIGRvbid0IGhhdmUgYWxsIG9mIHRoZSBpdGVtcyBsb2NhbGx5LCBzbyB0aGUgaG9zdCB3aWxsIG5lZWQgdG8gdGVsbCB0aGUgQVBJIHRvIG9wZXJhdGUgb24gYWxsXHJcbiAgICogIHZpYSBhcGkgZmlsdGVycyBvciBvdGhlciBtZWFucy5cclxuICAgKi9cclxuICBwdWJsaWMgaXNTZWxlY3RpbmdBbGxJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLWl0ZW0tcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaXRlbS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2l0ZW0tcGlja2VyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEl0ZW1QaWNrZXJDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqIElkZW50aWZpZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGFsbCBpbnRlcm5hbCBhY3Rpb24gZWxlbWVudHMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRpdGxlIGRpc3BsYXllZCBhYm92ZSB0aGUgYXZhaWxhYmxlIGl0ZW1zIHRhYmxlICovXHJcbiAgQElucHV0KCkgcHVibGljIGF2YWlsYWJsZVRpdGxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRpdGxlIGRpc3BsYXllZCBhYm92ZSB0aGUgc2VsZWN0ZWQgaXRlbXMgbGlzdCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZFRpdGxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIFRoZSB0eXBlIG9mIGl0ZW0gYmVpbmcgc2VsZWN0ZWQuIEV4LiBNZXRlcnMsIEFkZHJlc3NlcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpdGVtTmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBGb3JtIGdyb3VwIHRoYXQgaXMgZ2l2ZW4gdG8gdGhlIGludGVybmFsIFNlYXJjaGFibGUgVGFibGUgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZm9ybU1vZGVsPzogVW50eXBlZEZvcm1Hcm91cDtcclxuXHJcbiAgLyoqIFRlbXBsYXRlIGZvciB3aGVuIGEgY3VzdG9tIGhlYWRlciBpcyBuZWVkZWQgZm9yIHRoZSBhdmFpbGFibGUgaXRlbXMgdGFibGUgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKiogVGVtcGxhdGUgZm9yIHdoZW4gYSBjdXN0b20gYXZhaWxhYmxlIGl0ZW0gaXMgbmVlZGVkLiBEZWZhdWx0IHRlbXBsYXRlIGlzIGEgbGFiZWwgb25seSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21BdmFpbGFibGVJdGVtVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKiogVGVtcGxhdGUgZm9yIHdoZW4gYSBjdXN0b20gc2VsZWN0ZWQgaXRlbSBpcyBuZWVkZWQuIERlZmF1bHQgdGVtcGxhdGUgaXMgYSBsYWJlbCBvbmx5ICovXHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVNlbGVjdGVkSXRlbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFVzZWQgYnkgdGhlIGludGVybmFsIFNlYXJjaGFibGUgVGFibGUgdG8ga25vdyB3aGVuIHRoZSBwYWdlIGlzIHJlYWR5ICovXHJcbiAgQElucHV0KCkgcHVibGljIHJlYWR5PzogT2JzZXJ2YWJsZTx2b2lkPjtcclxuXHJcbiAgLyoqIFVzZWQgYnkgU2VhcmNoYWJsZSBUYWJsZSB0byByZXRyaWV2ZSB0aGUgYXZhaWxhYmxlIGl0ZW1zICovXHJcbiAgQElucHV0KCkgcHVibGljIGdldEl0ZW1zPzogKHNlYXJjaD86IHN0cmluZywgcGFnZUNoYW5nZUluZm8/OiBQYWdpbmdJbmZvKSA9PiBPYnNlcnZhYmxlPFRhYmxlU2VhcmNoUmVzdWx0cz47XHJcblxyXG4gIC8qKiBVc2VkIHRvIG1haW50YWluIHRoZSBhdmFpbGFibGUgaXRlbXMgY2hlY2tib3ggc2VsZWN0aW9uIGFzIHdlbGwgYXMgdGhlIHNlbGVjdGVkIGl0ZW1zIGxpc3QgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uQ29udGV4dCE6IEl0ZW1QaWNrZXJTZWxlY3RhYmxlQ29udGV4dDxUPjtcclxuXHJcbiAgLyoqIFVzZWQgYnkgdGhlIGludGVybmFsIFNlYXJjaGFibGUgVGFibGUgd2hlbiB0aGVyZSBpcyBubyBhdmFpbGFibGUgaXRlbXMgdG8gY2hvb3NlIGZyb20gYmFzZWQgb24gdGhlIGdldEl0ZW1zIHJlc3VsdHMuIERvIG5vdCBzdXBwbHlcclxuICAgKiAgdG8gaW5oZXJpdCB0aGUgZGVmYXVsdCBtZXNzYWdlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBub0RhdGFNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBubyBzZWxlY3RlZCBpdGVtcyBtZXNzYWdlLiBJZiBwcm92aWRlZCB0aGlzIHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG1lc3NhZ2Ugd2l0aCB0aGUgaXRlbSBuYW1lXHJcbiAgICogaW50ZXJwb2xhdGlvbiB3aWxsIGJlIHVzZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG5vU2VsZWN0ZWRJdGVtc01lc3NhZ2U/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGVuIHRydWUgdGhlIGJ1dHRvbiB0byBzZWxlY3QgYWxsIGl0ZW1zIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGhlYWRlciB3aGVuXHJcbiAgICogIHRoZSBoZWFkZXIgY2hlY2tib3ggaXMgY2hlY2tlZCBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIHBhZ2VzIG9mIHJlc3VsdHNcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlU2VsZWN0QWxsSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBhc3NlZCBpbiBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIHNlbGVjdGVkIGl0ZW1zIHRhYmxlIHdoZW4gdGhlIHNlbGVjdCBhbGwgaXRlbXMgYnV0dG9uIGlzIGNsaWNrZWQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0QWxsSXRlbXNNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIExpc3Qgb2YgYXZhaWxhYmxlIGl0ZW1zIHRvIHBpY2sgZnJvbSAqL1xyXG4gIHB1YmxpYyBhdmFpbGFibGVJdGVtczogUGlja2VySXRlbVtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdGVkIGl0ZW1zIGFycmF5LiBDcmVhdGVkIGZyb20gdGhlIHNlbGVjdGVkIGl0ZW1zIG1hcC4gQmluZGluZyB0byB0aGVcclxuICAgKiBtYXAgaXRlcmF0ZSB2YWx1ZXMgY2F1c2VkIGFuZ3VsYXIgXCJleHByZXNzaW9uIGNoYW5nZWRcIiBlcnJvcnMgc28gYWZ0ZXIgYSBtYXBcclxuICAgKiB1cGRhdGUgdGhpcyBnZXRzIHNldCB0byB0aGUgdmFsdWVzXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXM6IFBpY2tlckl0ZW1bXSA9IFtdO1xyXG5cclxuICAvKiogVHJ1ZSBpZiB0aGVyZSBhcmUgc2VsZWN0ZWQgaXRlbXMgYW5kIGF0IGxlYXN0IG9uZSBjYW4gYmUgcmVtb3ZlZCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zQ2xlYXJhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUcmFjayBieSB1c2VkIGZvciB0aGUgc2VhcmNoYWJsZSB0YWJsZSByb3dzICovXHJcbiAgcHVibGljIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKSA9PiBpbmRleDtcclxuXHJcbiAgcHVibGljIHRhYmxlU3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnKTtcclxuXHJcbiAgLyoqIFRleHQgdG8gZGlzcGxheSBuZXh0IHRvIHRoZSBjaGVja2JveCBpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGhlYWRlci4gVXNlZCB0byBkaXNsYXkgaG93IG1hbnkgaXRlbXMgYXJlXHJcbiAgICogIHNlbGVjdGVkIHdoZW4gc2VsZWN0IGFsbCBpdGVtcyBpcyBlbmFibGVkXHJcbiAgICovXHJcbiAgcHVibGljIGF2YWlsYWJsZUNoZWNrYm94VGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBXaGVuIHNldCB0byB0cnVlIHRoZSBzZWxlY3QgYWxsIGl0ZW1zIGJ1dHRvbiB3aWxsIHNob3cgaW4gdGhlIGF2YWlsYWJsZSBpdGVtcyBoZWFkZXIuIFRoaXMgaXNcclxuICAgKiAgc2hvd24gd2hlbiB0aGUgdXNlciBoYXMgZW5hYmxlZCBzZWxlY3QgYWxsIGZvciB0aGUgaXRlbSBwaWNrZXIgYW5kIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGhlYWRlciBjaGVja2JveFxyXG4gICAqICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFnZSBvZiByZXN1bHRzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzaG93U2VsZWN0QWxsSXRlbXNCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgcmV0dXJuZWQgZnJvbSB0aGUgYXBpIGFjcm9zcyBhbGwgcGFnZXMgKi9cclxuICBwdWJsaWMgdG90YWxJdGVtc0JlZm9yZVBhZ2luZz86IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBsYXRlIHVzZWQgdG8gZGlzcGxheSB0aGUgYXZhaWxhYmxlIGFuZCBzZWxlY3RlZCBpdGVtcyBhcyB3ZWxsIGFzIHRoZSBhdmFpbGFibGUgaXRlbSBoZWFkZXIuXHJcbiAgICogVGhpcyB3aWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBpZiBhIGN1c3RvbSBpcyBub3QgcHJvdmlkZWRcclxuICAgKi9cclxuICBwdWJsaWMgaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBEZWZhdWx0IHRlbXBsYXRlcyB1c2VkIGlmIGEgY3VzdG9tIHRlbXBsYXRlIGlzIG5vdCBwcm92aWRlZCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0QXZhaWxhYmxlU2VsZWN0QWxsSGVhZGVyVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGRlZmF1bHRBdmFpbGFibGVTZWxlY3RBbGxIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGRlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFVzZWQgdG8gc2h1dCBkb3duIG91ciBzdWJzY3JpcHRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgKi9cclxuICBwcml2YXRlIGRlc3Ryb3llZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR1cFJvd0NoZWNrYm94ZXNXYXRjaGVyKCk7XHJcbiAgICB0aGlzLnNldHVwU2VsZWN0ZWRJdGVtc0NoYW5nZWRXYXRjaGVyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCBmb3IgY2hhbmdlcyBhbmQgcmVhY3QgaWYgdGhlIGN1c3RvbSBpdGVtIHRlbXBsYXRlIHZhbHVlIGNoYW5nZXNcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEludGVybmFsaXplZFRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBieSB0aGUgc2VhcmNoYWJsZSB0YWJsZSB3aGVuIGEgbmV3IHNldCBvZiBpdGVtcyBhcmUgcmV0dXJuZWQgZnJvbSB0aGUgZ2V0SXRlbXMgY2FsbC5cclxuICAgKiBJZiBhbnkgb2YgdGhlIGl0ZW1zIGhhdmUgYHByZXZlbnRSZW1vdmVgIHNldCwgdGhlaXIgaW5kaWNlcyBhcmUgYWRkZWQgdG8gdGhlIGNvbnRleHQuXHJcbiAgICovXHJcbiAgcHVibGljIG9uSXRlbXNDaGFuZ2UocmVzdWx0czogVGFibGVTZWFyY2hSZXN1bHRzKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMpIHtcclxuICAgICAgdGhpcy5vbkNsZWFyU2VsZWN0aW9uQ2xpY2soKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbGV0IG5ld05vbkRlcGVuZGVudENoZWNrYm94ZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgKDxQaWNrZXJJdGVtW10+cmVzdWx0cy5pdGVtcykuZm9yRWFjaCgoaXRlbSwgaW5kZXgpICA9PiB7XHJcbiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIGl0ZW1zIGFyZSBtYXJrZWQgdG8gYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdCBhbmQgaWYgc29cclxuICAgICAgLy8gYWRkIHRoZW0gdG8gdGhlIG1hcC5cclxuICAgICAgaWYgKGl0ZW0uZGVmYXVsdFNlbGVjdGVkICYmICF0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnNldChpdGVtLmlkLCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgaXRlbXMgYXJlIG1hcmtlZCB0byBwcmV2ZW50IFJlbW92YWwsIGFuZCBpZiBzb1xyXG4gICAgICAvLyBhZGQgdGhlbSB0byB0aGUgbm9uLWRlcGVuZGVudCBjaGVja2JveGVzIGFycmF5LiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1hc3RlclxyXG4gICAgICAvLyBjaGVja2JveCBmcm9tIHRvZ2dsaW5nIHRoZW0uXHJcbiAgICAgIGlmIChpdGVtLnByZXZlbnRSZW1vdmUpIHtcclxuICAgICAgICBuZXdOb25EZXBlbmRlbnRDaGVja2JveGVzLnB1c2goaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQubm9uRGVwZW5kZW50Q2hlY2tib3hlcyA9IG5ld05vbkRlcGVuZGVudENoZWNrYm94ZXM7XHJcblxyXG4gICAgLy8gV2hlbiB0aGUgdXNlciBmaWx0ZXJzIHRoZSBsaXN0IHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0IGFsbCBpdGVtc1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmF2YWlsYWJsZUl0ZW1zID0gKDxQaWNrZXJJdGVtW10+cmVzdWx0cy5pdGVtcyk7XHJcbiAgICB0aGlzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmcgPSByZXN1bHRzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmc7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBdmFpbGFibGVDaGVja2JveFRleHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjbGVhciBzZWxlY3Rpb24gbGluayBidXR0b24gaXMgY2xpY2tlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkNsZWFyU2VsZWN0aW9uQ2xpY2soKSB7XHJcbiAgICAvLyBSZW1vdmUgcmVtb3ZhYmxlIGl0ZW1zIGZyb20gbWFwXHJcbiAgICAvLyBUaGlzIGlzIHNhZmUuICBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU5NDAyMTYvZXM2LWlzLWl0LWRhbmdlcm91cy10by1kZWxldGUtZWxlbWVudHMtZnJvbS1zZXQtbWFwLWR1cmluZy1zZXQtbWFwLWl0ZXJhdGlvblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwKSB7XHJcbiAgICAgIGlmICghdmFsLnByZXZlbnRSZW1vdmUpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC5kZWxldGUoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5yb3dDaGVja2JveGVzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmF2YWlsYWJsZUl0ZW1zW2luZGV4XS5wcmV2ZW50UmVtb3ZlKSB7XHJcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmYWxzZSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC52YWx1ZXMoKSk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbW92ZSBpdGVtIGJ1dHRvbiBpcyBjbGlja2VkIGZvciBhIHNlbGVjdGVkIGl0ZW1cclxuICAgKiBAcGFyYW0gcmVtb3ZlSXRlbVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW1vdmVTZWxlY3RlZEl0ZW0ocmVtb3ZlSXRlbTogUGlja2VySXRlbSk6IHZvaWQge1xyXG4gICAgbGV0IGZvdW5kSW5kZXggPSB0aGlzLmF2YWlsYWJsZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IHJlbW92ZUl0ZW0uaWQpO1xyXG4gICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xyXG4gICAgICAvLyBVcGRhdGUgdGhlIHJvdyBjaGVja2JveCBzaW5jZSB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIHBhZ2UgYmVpbmcgdmlld2VkXHJcbiAgICAgIC8vIFRoZSB2YWx1ZSBjaGFuZ2UgaGFuZGxlciBmb3Igcm93IGNoZWNrYm94ZXMgd2lsbCB1cGRhdGUgdGhlIG1hcC9zZWxlY3RlZCBpdGVtc1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5hdChmb3VuZEluZGV4KS5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGUgaXRlbSBiZWluZyByZW1vdmVkIGlzIG5vdCBvbiB0aGUgY3VycmVudCBwYWdlIHNvIGp1c3QgdXBkYXRlIHRoZVxyXG4gICAgICAvLyBtYXAvc2VsZWN0ZWQgaXRlbXNcclxuICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXAuZGVsZXRlKHJlbW92ZUl0ZW0uaWQpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLnZhbHVlcygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFxyXG4gIC8qKiBcclxuICAgKiBDbGljayBoYW5kbGVyIGZvciB0aGUgc2VsZWN0IGFsbCBpdGVtcyBidXR0b25cclxuICAgKi9cclxuICBwdWJsaWMgc2VsZWN0QWxsSXRlbXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtcyA9IHRydWU7XHJcbiAgICB0aGlzLnNob3dTZWxlY3RBbGxJdGVtc0J1dHRvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy51cGRhdGVBdmFpbGFibGVDaGVja2JveFRleHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSByb3cgY2hlY2tib3hlcyBmb3JtIGFycmF5IGFuZCB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW1zXHJcbiAgICogbGlzdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBSb3dDaGVja2JveGVzV2F0Y2hlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8ucm93Q2hlY2tib3hlcy52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgLy8gRGVib3VuY2UgMTAgaXMgc2ltcGx5IHRvIG5vdCBzcGFtIHRoZSBjaGFuZ2UgaGFuZGxlciBvbiBsb2FkL3BhZ2UgY2hhbmdlXHJcbiAgICAgIC8vIE90aGVyd2lzZSB0aGlzIHdpbGwgZ2V0IGNhbGxlZCBldmVyeSB0aW1lIGEgbmV3IHJvdyBpcyBhZGRlZCB0byB0aGUgdGFibGVcclxuICAgICAgZGVib3VuY2VUaW1lKDEwKSxcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKVxyXG4gICAgKS5zdWJzY3JpYmUoKHJvd1ZhbHVlczogYm9vbGVhbltdKSA9PiB7XHJcbiAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKChzZWxlY3RlZCwgaW5kZXgpID0+IHtcclxuICAgICAgICBsZXQgYXZhaWxhYmxlSXRlbSA9IHRoaXMuYXZhaWxhYmxlSXRlbXNbaW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkICYmIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5oYXMoYXZhaWxhYmxlSXRlbS5pZCkpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5kZWxldGUoYXZhaWxhYmxlSXRlbS5pZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCAmJiAhdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhhdmFpbGFibGVJdGVtLmlkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnNldChhdmFpbGFibGVJdGVtLmlkLCBhdmFpbGFibGVJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAudmFsdWVzKCkpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmFibGUgPSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkSXRlbXMuc29tZShpID0+ICFpLnByZXZlbnRSZW1vdmUpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZUNoZWNrYm94VGV4dCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdEFsbENoZWNrYm94LnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgxMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoY2hlY2tlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBjb25zdCBvbmVQYWdlT2ZEYXRhID0gdGhpcy5hdmFpbGFibGVJdGVtcy5sZW5ndGggPT09IHRoaXMudG90YWxJdGVtc0JlZm9yZVBhZ2luZztcclxuICAgICAgY29uc29sZS5sb2coJ3NlbGVjdEFsbENoZWNrYm94IGNoZWNrZWQ6ICcsIGNoZWNrZWQpO1xyXG5cclxuICAgICAgaWYgKGNoZWNrZWQgJiYgIW9uZVBhZ2VPZkRhdGEpIHtcclxuICAgICAgICB0aGlzLnNob3dTZWxlY3RBbGxJdGVtc0J1dHRvbiA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnbm90IGNoZWNrZWQnKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zKSB7XHJcbiAgICAgICAgICAvLyBXZSB3ZXJlIHNlbGVjdGluZyBhbGwgaXRlbXMsIGNsZWFyIHRoZSBzZWxlY3Rpb24gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3RhcnQgb3ZlclxyXG4gICAgICAgICAgdGhpcy5vbkNsZWFyU2VsZWN0aW9uQ2xpY2soKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd1NlbGVjdEFsbEl0ZW1zQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUF2YWlsYWJsZUNoZWNrYm94VGV4dCgpIHtcclxuICAgIGlmICh0aGlzLmVuYWJsZVNlbGVjdEFsbEl0ZW1zKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zKTtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtcykge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IHRoaXMuc2VsZWN0aW9uQ29udGV4dC5yb3dDaGVja2JveGVzLmNvbnRyb2xzLm1hcChjID0+IGMudmFsdWUpLmZpbHRlcih2ID0+IHYpLmxlbmd0aDtcclxuICAgICAgICBpZiAoY2hlY2tlZENvdW50ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVDaGVja2JveFRleHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQ291bnRTZWxlY3RlZF9UQycsIHsgY291bnQ6IGNoZWNrZWRDb3VudCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVDaGVja2JveFRleHQgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVDaGVja2JveFRleHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQWxsSXRlbVBpY2tlckl0ZW1zU2VsZWN0ZWRfU0MnLCB7IGNvdW50OiB0aGlzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmcsIGl0ZW1OYW1lOiB0aGlzLml0ZW1OYW1lIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCB0byBiZSB0b2xkIGlmIGNoYW5nZXMgdG8gdGhlIG1hcCB3ZXJlIG1hZGUgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFuZCBpZiBzbyB1cGRhdGVcclxuICAgKiB0aGUgYXJyYXkgZGlzcGxheWVkIGluIHRoZSBzZWxlY3RlZCBsaXN0IGFuZCBzZWxlY3QgY2hlY2tib3hlcyBmb3IgdmlzaWJsZSBhdmFpbGFibGUgaXRlbXNcclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwU2VsZWN0ZWRJdGVtc0NoYW5nZWRXYXRjaGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXBDaGFuZ2VkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnZhbHVlcygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhpdGVtLmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5hdChpbmRleCkuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbnRlcm5hbGl6ZWRUZW1wbGF0ZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlID0gdGhpcy5jdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5lbmFibGVTZWxlY3RBbGxJdGVtcykge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlID0gdGhpcy5kZWZhdWx0QXZhaWxhYmxlU2VsZWN0QWxsSGVhZGVyVGVtcGxhdGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlID0gdGhpcy5kZWZhdWx0QXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY3VzdG9tQXZhaWxhYmxlSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkQXZhaWxhYmxlSXRlbVRlbXBsYXRlID0gdGhpcy5jdXN0b21BdmFpbGFibGVJdGVtVGVtcGxhdGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUl0ZW1UZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdEF2YWlsYWJsZUl0ZW1UZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jdXN0b21TZWxlY3RlZEl0ZW1UZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZFNlbGVjdGVkSXRlbVRlbXBsYXRlID0gdGhpcy5jdXN0b21TZWxlY3RlZEl0ZW1UZW1wbGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkU2VsZWN0ZWRJdGVtVGVtcGxhdGUgPSB0aGlzLmRlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBlY092ZXJsYXlcclxuICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3cgY2FyZFwiXHJcbiAgICAgW3N0YXR1c109XCJ0YWJsZVN0YXR1cz8uc3RhdHVzXCJcclxuICAgICBbbWVzc2FnZV09XCJ0YWJsZVN0YXR1cz8ubWVzc2FnZVwiXHJcbiAgICAgW2Rpc3BsYXlBc01hc2tdPVwidHJ1ZVwiPlxyXG4gICAgPGVjLXNlYXJjaGFibGUtdGFibGUgaWQ9XCJ7e2lkfX1fc2VhcmNoYWJsZVRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxsUGFyZW50SGVpZ2h0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVIZWFkZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlYXJjaENvbnRyb2xdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZlQ2FyZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbb2JqZWN0VHlwZV09XCJpdGVtTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cImZvcm1Nb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZHldPVwicmVhZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2dldEl0ZW1zXT1cImdldEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW25vRGF0YU1lc3NhZ2VdPVwibm9EYXRhTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uQ29udGV4dF09XCJzZWxlY3Rpb25Db250ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNdPVwidGFibGVTdGF0dXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1zQ2hhbmdlKT1cIm9uSXRlbXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy1zZWFyY2hhYmxlLXRhYmxlLWZsZXgtcHJvcGVydGllc109XCIoYXZhaWxhYmxlSXRlbXMubGVuZ3RoIHx8IHRhYmxlU3RhdHVzLnN0YXR1cyA9PT0gJ3BlbmRpbmcnIHx8IHRhYmxlU3RhdHVzLnN0YXR1cyA9PT0gJ2Vycm9yJyApID8gJzEgMSBhdXRvJyA6ICcwIDEgYXV0bydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tZWMtc2VhcmNoYWJsZS10YWJsZS1oZWlnaHQtY2FwdGlvbi1mb290ZXJdPVwiJ2NhbGMoMi41cmVtICsgMXB4KSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlTGF5b3V0Rml4ZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxoZWFkZXIgKm5nSWY9XCJjdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtaGVhZGVyIGZsZXgtc2hyaW5rXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAzcmVtO1wiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3thdmFpbGFibGVUaXRsZSB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0ciBlY1RhYmxlU2VsZWN0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgW3NlbGVjdGlvbkNvbnRleHRdPVwic2VsZWN0aW9uQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci1ib3R0b20tMFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlO1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcblxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhdmFpbGFibGVJdGVtczsgaW5kZXggYXMgcm93SW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGVjVGFibGVTZWxlY3RhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbkNvbnRleHRdPVwic2VsZWN0aW9uQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cInJvd0luZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbaXNDaGVja2JveERpc2FibGVkXT1cIml0ZW0ucHJldmVudFJlbW92ZSB8fCBzZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cInNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGl0ZW0uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy10YWJsZS1zZWxlY3RhYmxlLXJvdy12ZXJ0aWNhbC1hbGlnbi1jaGVja2JveC10ZF09XCInbWlkZGxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgPC9lYy1zZWFyY2hhYmxlLXRhYmxlPlxyXG5cclxuICAgIDxzZWN0aW9uIGlkPVwie3tpZH19X3NlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RlZC1pdGVtcyBmbGV4LWdyb3cgZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWdyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYm9yZGVyLWJvdHRvbSBweC0yXCJcclxuICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogM3JlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGZsZXgtZ3JvdyB0ZXh0LXRydW5jYXRlXCI+e3tzZWxlY3RlZFRpdGxlIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWxlY3RlZEl0ZW1zQ2xlYXJhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWNMaW5rQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tpZH19X2NsZWFyU2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwbC0yIG1sLWF1dG8gZm9udC1zaXplLWJhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGVhclNlbGVjdGlvbkNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+Q2xlYXJTZWxlY3Rpb25fVEM8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJzZWxlY3RBbGxJdGVtc01lc3NhZ2UgfCB0cmFuc2xhdGVcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGVjLXRhYmxlICpuZ0lmPVwiIXNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3cgaXMtZml4ZWRcIj5cclxuICAgICAgICAgICAgPGNvbGdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPGNvbD5cclxuICAgICAgICAgICAgICAgIDxjb2wgc3R5bGU9XCJ3aWR0aDogMnJlbTtcIj5cclxuICAgICAgICAgICAgPC9jb2xncm91cD5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiaGVpZ2h0OiAzcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIGJvcmRlci1ib3R0b20tMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMiBmb250LWNvbG9yLXByaW1hcnkgZmxleC1ncm93IHRleHQtdHJ1bmNhdGVcIj57e3NlbGVjdGVkVGl0bGUgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlbGVjdGVkSXRlbXNDbGVhcmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY0xpbmtCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fY2xlYXJTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBsLTIgbWwtYXV0byBmb250LXNpemUtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsZWFyU2VsZWN0aW9uQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT5DbGVhclNlbGVjdGlvbl9UQzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuXHJcbiAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyBsYXN0IGFzIGlzTGFzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0ZWRfcm93X3t7aXRlbS5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ib3R0b21dPVwiIWlzTGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9ucy1jb2wgdGV4dC1yaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWMtYnV0dG9uIGlkPVwie3tpZH19X3JlbW92ZVNlbGVjdGVkX3t7aXRlbS5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXRlbS5wcmV2ZW50UmVtb3ZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZWMtaWNvbiBpY29uLWNhbmNlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lYy1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIXNlbGVjdGVkSXRlbXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIW5vU2VsZWN0ZWRJdGVtc01lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIG5vLWRhdGEtbWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cIntpdGVtTmFtZTogaXRlbU5hbWUgfCB0cmFuc2xhdGV9XCI+SXRlbVBpY2tlck5vSXRlbXNTZWxlY3RlZF9TQzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibm9TZWxlY3RlZEl0ZW1zTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHNwYW49XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLTIgbm8tZGF0YS1tZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPnt7bm9TZWxlY3RlZEl0ZW1zTWVzc2FnZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC9lYy10YWJsZT5cclxuXHJcbiAgICAgICAgPGZvb3RlciBpZD1cInNlbGVjdGVkSXRlbXNGb290ZXJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aCAmJiAhc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtc2hyaW5rIHB4LTIgYm9yZGVyLXRvcCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMi41cmVtICsgMXB4KTtcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC1hdXRvIHRleHQtY2FwdGlvbi0xIGZvbnQtY29sb3ItaGludFwiPlxyXG4gICAgICAgICAgICAgICAge3tzZWxlY3RlZEl0ZW1zLmxlbmd0aH19IHt7aXRlbU5hbWUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9mb290ZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU+XHJcbiAgICA8dGggY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMiBmb250LWNvbG9yLXByaW1hcnkgYm9yZGVyLWJvdHRvbS0wXCI+e3thdmFpbGFibGVUaXRsZSB8IHRyYW5zbGF0ZX19PC90aD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEF2YWlsYWJsZVNlbGVjdEFsbEhlYWRlclRlbXBsYXRlPlxyXG4gICAgPHRoIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGJvcmRlci1ib3R0b20tMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFhdmFpbGFibGVDaGVja2JveFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj57e2F2YWlsYWJsZVRpdGxlIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYXZhaWxhYmxlQ2hlY2tib3hUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RlZENvdW50XCI+e3thdmFpbGFibGVDaGVja2JveFRleHR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dTZWxlY3RBbGxJdGVtc0J1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgZWNMaW5rQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxJdGVtc0J1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbEl0ZW1zKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiPlxyXG4gICAgICAgICAgICAgICAge3sgKCdTZWxlY3RBbGxJdGVtUGlja2VySXRlbXNfVEMnKSB8IHRyYW5zbGF0ZTp7IGNvdW50OiB0b3RhbEl0ZW1zQmVmb3JlUGFnaW5nLCBpdGVtTmFtZTogaXRlbU5hbWUgfSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvdGg+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGVcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG4gICAgPHRkPnt7aXRlbS5sYWJlbH19PC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIHt7aXRlbS5sYWJlbH19XHJcbjwvbmctdGVtcGxhdGU+Il19
|
@@ -9230,6 +9230,9 @@ class ItemPickerComponent {
|
|
9230
9230
|
* If any of the items have `preventRemove` set, their indices are added to the context.
|
9231
9231
|
*/
|
9232
9232
|
onItemsChange(results) {
|
9233
|
+
if (this.selectionContext.isSelectingAllItems) {
|
9234
|
+
this.onClearSelectionClick();
|
9235
|
+
}
|
9233
9236
|
let newNonDependentCheckboxes = [];
|
9234
9237
|
results.items.forEach((item, index) => {
|
9235
9238
|
var _a, _b;
|
@@ -9269,6 +9272,7 @@ class ItemPickerComponent {
|
|
9269
9272
|
}
|
9270
9273
|
});
|
9271
9274
|
this.selectedItems = Array.from(this.selectionContext.selectedItemsMap.values());
|
9275
|
+
this.selectionContext.isSelectingAllItems = false;
|
9272
9276
|
}
|
9273
9277
|
/**
|
9274
9278
|
* Called when the remove item button is clicked for a selected item
|
@@ -9323,10 +9327,16 @@ class ItemPickerComponent {
|
|
9323
9327
|
});
|
9324
9328
|
this.selectionContext.selectAllCheckbox.valueChanges.pipe(debounceTime(10), takeUntil(this.destroyed)).subscribe((checked) => {
|
9325
9329
|
const onePageOfData = this.availableItems.length === this.totalItemsBeforePaging;
|
9330
|
+
console.log('selectAllCheckbox checked: ', checked);
|
9326
9331
|
if (checked && !onePageOfData) {
|
9327
9332
|
this.showSelectAllItemsButton = true;
|
9328
9333
|
}
|
9329
9334
|
else if (!checked) {
|
9335
|
+
console.log('not checked');
|
9336
|
+
if (this.selectionContext.isSelectingAllItems) {
|
9337
|
+
// We were selecting all items, clear the selection to allow the user to start over
|
9338
|
+
this.onClearSelectionClick();
|
9339
|
+
}
|
9330
9340
|
this.showSelectAllItemsButton = false;
|
9331
9341
|
this.selectionContext.isSelectingAllItems = false;
|
9332
9342
|
}
|
@@ -9334,6 +9344,7 @@ class ItemPickerComponent {
|
|
9334
9344
|
}
|
9335
9345
|
updateAvailableCheckboxText() {
|
9336
9346
|
if (this.enableSelectAllItems) {
|
9347
|
+
console.log(this.selectionContext.isSelectingAllItems);
|
9337
9348
|
if (!this.selectionContext.isSelectingAllItems) {
|
9338
9349
|
const checkedCount = this.selectionContext.rowCheckboxes.controls.map(c => c.value).filter(v => v).length;
|
9339
9350
|
if (checkedCount > 0) {
|
@@ -9390,10 +9401,10 @@ class ItemPickerComponent {
|
|
9390
9401
|
}
|
9391
9402
|
}
|
9392
9403
|
ItemPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, deps: [{ token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
9393
|
-
ItemPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ItemPickerComponent, selector: "ec-item-picker", inputs: { id: "id", availableTitle: "availableTitle", selectedTitle: "selectedTitle", itemName: "itemName", formModel: "formModel", customAvailableHeaderTemplate: "customAvailableHeaderTemplate", customAvailableItemTemplate: "customAvailableItemTemplate", customSelectedItemTemplate: "customSelectedItemTemplate", ready: "ready", getItems: "getItems", selectionContext: "selectionContext", noDataMessage: "noDataMessage", noSelectedItemsMessage: "noSelectedItemsMessage", enableSelectAllItems: "enableSelectAllItems", selectAllItemsMessage: "selectAllItemsMessage" }, viewQueries: [{ propertyName: "defaultAvailableHeaderTemplate", first: true, predicate: ["defaultAvailableHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableSelectAllHeaderTemplate", first: true, predicate: ["defaultAvailableSelectAllHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableItemTemplate", first: true, predicate: ["defaultAvailableItemTemplate"], descendants: true, static: true }, { propertyName: "defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\" class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\" style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <a *ngIf=\"selectedItemsClearable\"\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</a>\r\n </div>\r\n <span class=\"m-auto\" [innerHtml]=\"selectAllItemsMessage | translate\"></span> \r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\" [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <a *ngIf=\"selectedItemsClearable\"\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</a>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableSelectAllHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: SearchableTableComponent, selector: "ec-searchable-table", inputs: ["id", "resizable", "sortable", "sort", "autofocus", "tableClasses", "searchboxPlaceholder", "formModel", "noDataMessage", "noSearchResultsMessage", "ready", "getItems", "refresh", "status", "tableLayoutFixed", "searchboxTabIndex", "maxItemCount", "hideSearchControl", "hideHeader", "objectType", "hideFooter", "pageable", "pageSize", "maxTabs", "searchboxReadonly", "selectionContext", "selectionToolbarTemplate", "additionalCountText", "selectable", "customContentTemplate", "removeCard", "overlayClasses", "fillParentHeight"], outputs: ["sortChange", "pageChange", "itemsChange"] }, { kind: "component", type: TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: ["id", "ecTableSelectableRow", "selectionContext", "rowIndex", "lockedColOptions", "isSelected", "isCheckboxDisabled"] }, { kind: "component", type: LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
9404
|
+
ItemPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ItemPickerComponent, selector: "ec-item-picker", inputs: { id: "id", availableTitle: "availableTitle", selectedTitle: "selectedTitle", itemName: "itemName", formModel: "formModel", customAvailableHeaderTemplate: "customAvailableHeaderTemplate", customAvailableItemTemplate: "customAvailableItemTemplate", customSelectedItemTemplate: "customSelectedItemTemplate", ready: "ready", getItems: "getItems", selectionContext: "selectionContext", noDataMessage: "noDataMessage", noSelectedItemsMessage: "noSelectedItemsMessage", enableSelectAllItems: "enableSelectAllItems", selectAllItemsMessage: "selectAllItemsMessage" }, viewQueries: [{ propertyName: "defaultAvailableHeaderTemplate", first: true, predicate: ["defaultAvailableHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableSelectAllHeaderTemplate", first: true, predicate: ["defaultAvailableSelectAllHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableItemTemplate", first: true, predicate: ["defaultAvailableItemTemplate"], descendants: true, static: true }, { propertyName: "defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove || selectionContext.isSelectingAllItems\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\"\r\n style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n <span class=\"m-auto\"\r\n [innerHtml]=\"selectAllItemsMessage | translate\"></span>\r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\"\r\n [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableSelectAllHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: SearchableTableComponent, selector: "ec-searchable-table", inputs: ["id", "resizable", "sortable", "sort", "autofocus", "tableClasses", "searchboxPlaceholder", "formModel", "noDataMessage", "noSearchResultsMessage", "ready", "getItems", "refresh", "status", "tableLayoutFixed", "searchboxTabIndex", "maxItemCount", "hideSearchControl", "hideHeader", "objectType", "hideFooter", "pageable", "pageSize", "maxTabs", "searchboxReadonly", "selectionContext", "selectionToolbarTemplate", "additionalCountText", "selectable", "customContentTemplate", "removeCard", "overlayClasses", "fillParentHeight"], outputs: ["sortChange", "pageChange", "itemsChange"] }, { kind: "component", type: TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: ["id", "ecTableSelectableRow", "selectionContext", "rowIndex", "lockedColOptions", "isSelected", "isCheckboxDisabled"] }, { kind: "component", type: LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
9394
9405
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, decorators: [{
|
9395
9406
|
type: Component,
|
9396
|
-
args: [{ selector: 'ec-item-picker', template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"
|
9407
|
+
args: [{ selector: 'ec-item-picker', template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove || selectionContext.isSelectingAllItems\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\"\r\n style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n <span class=\"m-auto\"\r\n [innerHtml]=\"selectAllItemsMessage | translate\"></span>\r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\"\r\n [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableSelectAllHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"] }]
|
9397
9408
|
}], ctorParameters: function () { return [{ type: i3.TranslateService }]; }, propDecorators: { id: [{
|
9398
9409
|
type: Input
|
9399
9410
|
}], availableTitle: [{
|