ngx-edu-sharing-ui 9999.0.2 → 9999.0.4

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.
Files changed (47) hide show
  1. package/esm2022/lib/actionbar/actionbar.component.mjs +31 -16
  2. package/esm2022/lib/directives/icon.directive.mjs +24 -7
  3. package/esm2022/lib/dropdown/dropdown.component.mjs +15 -8
  4. package/esm2022/lib/list-items/list-text/list-text.component.mjs +3 -3
  5. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +3 -3
  6. package/esm2022/lib/node-entries/entries-model.mjs +1 -1
  7. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +6 -4
  8. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +16 -13
  9. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +2 -2
  10. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +5 -3
  11. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +8 -3
  12. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +7 -5
  13. package/esm2022/lib/pipes/file-size.pipe.mjs +6 -5
  14. package/esm2022/lib/pipes/node-title.pipe.mjs +7 -1
  15. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +3 -3
  16. package/esm2022/lib/services/abstract/options-helper.service.mjs +1 -1
  17. package/esm2022/lib/services/node-entries.service.mjs +1 -1
  18. package/esm2022/lib/services/node-helper.service.mjs +5 -2
  19. package/esm2022/lib/services/options-helper-data.service.mjs +2 -2
  20. package/esm2022/lib/services/search-helper.service.mjs +52 -0
  21. package/esm2022/lib/services/ui.service.mjs +16 -1
  22. package/esm2022/lib/translations/translation-loader.mjs +7 -6
  23. package/esm2022/lib/translations/translations.service.mjs +14 -4
  24. package/esm2022/lib/types/option-item.mjs +6 -1
  25. package/esm2022/module.mjs +2 -1
  26. package/fesm2022/ngx-edu-sharing-ui.mjs +214 -74
  27. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
  28. package/lib/actionbar/actionbar.component.d.ts +13 -3
  29. package/lib/directives/icon.directive.d.ts +5 -3
  30. package/lib/dropdown/dropdown.component.d.ts +6 -3
  31. package/lib/list-items/list-text/list-text.component.d.ts +3 -3
  32. package/lib/list-items/list-widget.d.ts +1 -1
  33. package/lib/node-entries/entries-model.d.ts +1 -1
  34. package/lib/node-entries/node-entries-card/node-entries-card.component.d.ts +1 -1
  35. package/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.d.ts +1 -1
  36. package/lib/node-entries/option-button/option-button.component.d.ts +2 -1
  37. package/lib/pipes/node-title.pipe.d.ts +2 -1
  38. package/lib/pipes/option-tooltip.pipe.d.ts +1 -1
  39. package/lib/services/abstract/options-helper.service.d.ts +1 -1
  40. package/lib/services/node-helper.service.d.ts +2 -2
  41. package/lib/services/options-helper-data.service.d.ts +3 -3
  42. package/lib/services/search-helper.service.d.ts +21 -0
  43. package/lib/services/ui.service.d.ts +7 -1
  44. package/lib/translations/translations.service.d.ts +5 -2
  45. package/lib/types/option-item.d.ts +7 -2
  46. package/module.d.ts +1 -0
  47. package/package.json +1 -1
@@ -121,6 +121,8 @@ export class NodeEntriesTableComponent {
121
121
  }
122
122
  // Wait for the menu to reflect changed options.
123
123
  setTimeout(() => {
124
+ this.dropdown.callbackObject = node;
125
+ this.dropdown.ngOnChanges();
124
126
  if (this.dropdown.canShowDropdown()) {
125
127
  this.menuTrigger.openMenu();
126
128
  }
@@ -275,11 +277,11 @@ export class NodeEntriesTableComponent {
275
277
  return node.properties?.[RestConstants.CCM_PROP_IMPORT_BLOCKED]?.[0] === 'true';
276
278
  }
277
279
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NodeEntriesTableComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeEntriesGlobalService }, { token: i0.ApplicationRef }, { token: i3.Toast }, { token: i4.TranslationsService }, { token: i0.ChangeDetectorRef }, { token: i5.UIService }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
278
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: NodeEntriesTableComponent, selector: "es-node-entries-table", viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "columnChooserTrigger", first: true, predicate: ["columnChooserTrigger"], descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true }, { propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n<button\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n></button>\n<es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"NodeEntriesDisplayType.Table\"\n>\n</es-node-entries-global-options>\n<mat-table\n [dataSource]=\"entriesService.dataSource\"\n matSort\n [matSortDisableClear]=\"true\"\n [matSortActive]=\"entriesService.sort?.active\"\n [matSortDirection]=\"entriesService.sort?.direction\"\n esInfiniteScroll\n (scrolled)=\"loadData('scroll')\"\n>\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [ngModel]=\"entriesService.selection.selected.length > 0\"\n [indeterminate]=\"\n entriesService.selection.selected.length > 0 &&\n entriesService.selection.selected.length !== entriesService.dataSource.getData().length\n \"\n (ngModelChange)=\"toggleAll($event)\"\n color=\"primary\"\n aria-label=\"{{ 'LIST_TABLE.TOGGLE_ALL' | translate }}\"\n ></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate: { element: (node | nodeTitle) } }}\"\n color=\"primary\"\n ></mat-checkbox>\n </mat-cell>\n </ng-container>\n <div matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef class=\"cell-icon cell-count\">\n ({{ entriesService.selection.selected.length\n }}<ng-container *ngIf=\"entriesService.dataSource?.getTotal() !== undefined\">\n / {{ entriesService.dataSource?.getTotal() }}</ng-container\n >)\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\" class=\"cell-icon\">\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <ng-container *ngTemplateOutlet=\"icon; context: { node: this.node }\"></ng-container>\n </ng-container>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n >\n <ng-container\n *ngTemplateOutlet=\"icon; context: { node: this.node }\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n ></ng-container>\n </div>\n </mat-cell>\n </div>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible = !columnChooserVisible\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <button\n mat-icon-button\n *ngIf=\"entriesService.options?.[Target.List]?.length\"\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n >\n <i esIcon=\"more_vert\" [aria]=\"true\"></i>\n </button>\n </mat-cell>\n </ng-container>\n <!-- Data Columns -->\n <ng-container\n *ngFor=\"let column of visibleDataColumns$ | async; let first = first\"\n [matColumnDef]=\"column.name\"\n >\n <ng-container>\n <mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!(entriesService.sort?.allowed && isSortable(column))\"\n [class.mat-column-primary]=\"first\"\n >{{ column | esListItemLabel | async }}</mat-header-cell\n >\n </ng-container>\n <mat-cell\n *matCellDef=\"let node\"\n #cell\n [class.mat-column-primary]=\"first\"\n attr.data-test=\"table-cell-{{ column.name }}\"\n >\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <es-node-url cdkMonitorSubtreeFocus [node]=\"node\" [mode]=\"first ? 'link' : 'wrapper'\">\n <es-list-base\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n </es-node-url>\n </ng-container>\n <es-list-base\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n <ng-container *ngIf=\"first\">\n <div class=\"childobjects\" *ngIf=\"node.properties?.['virtual:childobjectcount'] > 0\">\n <div\n class=\"childobject-count\"\n matTooltip=\"{{\n 'CHILDOBJECT_COUNT'\n | translate: { count: node.properties['virtual:childobjectcount'] * 1 + 1 }\n }}\"\n >\n <span>{{ node.properties['virtual:childobjectcount'] * 1 + 1 }}</span\n ><i esIcon=\"filter_none\"></i>\n </div>\n </div>\n </ng-container>\n </mat-cell>\n </ng-container>\n <mat-header-row mat-header-row *matHeaderRowDef=\"visibleColumnNames$ | async\"></mat-header-row>\n <mat-row\n mat-row\n matRipple\n cdkDrag\n esNodesDrag\n [cdkDragDisabled]=\"!entriesService.dragDrop?.dragAllowed || (ui.isTouchSubject | async)\"\n [cdkDragData]=\"getDragData(node)\"\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDrop\"\n (nodeDropped)=\"drop($event)\"\n class=\"mat-row\"\n [class.mat-row-selected]=\"entriesService.selection.isSelected(node)\"\n [class.mat-row-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"isDragging && entriesService.selection.isSelected(node)\"\n [class.mat-row-virtual]=\"node.virtual\"\n [class.mat-row-virtual-first]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i - 1])?.virtual\n \"\n [class.mat-row-virtual-last]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i + 1])?.virtual\n \"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n *matRowDef=\"let node; let i = index; let last = last; columns: visibleColumnNames$ | async\"\n (contextmenu)=\"onRowContextMenu({ event: $event, node: node })\"\n (keydown.ContextMenu)=\"onRowContextMenu({ event: $event, node: node })\"\n >\n <es-drag-preview\n *cdkDragPreview\n [node]=\"node\"\n [selected]=\"entriesService.selection.selected\"\n [item]=\"(visibleDataColumns$ | async)[0]\"\n ></es-drag-preview>\n </mat-row>\n</mat-table>\n<ng-container\n *ngIf=\"\n (entriesService.dataSource.isLoadingSubject | async) === false &&\n entriesService.dataSource.hasMore() &&\n entriesService.paginationStrategy === 'infinite-scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container *ngIf=\"entriesService.dataSource.isLoadingSubject | async\">\n <ng-container *ngTemplateOutlet=\"loading\"> </ng-container>\n</ng-container>\n<!--\n<mat-paginator #paginator [pageSizeOptions]=\"pageSizeOptions\"></mat-paginator>\n-->\n\n<!-- Wait for ready state to avoid changed-after-checked error when `columnChooserTrigger` becomes\navailable. -->\n<es-column-chooser\n *ngIf=\"columnChooserTriggerReady\"\n [(columns)]=\"entriesService.columns\"\n [(columnChooserVisible)]=\"columnChooserVisible\"\n [origin]=\"columnChooserTrigger\"\n></es-column-chooser>\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #icon let-node=\"node\">\n <div class=\"icon-bg\">\n <img\n *ngIf=\"node.iconURL\"\n [src]=\"node | esNodeIcon | async\"\n [alt]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n [matTooltip]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n matTooltipTouchGestures=\"off\"\n />\n <i\n *ngIf=\"!node.iconURL\"\n [esIcon]=\"node.authorityType ? (node.authorityType === 'GROUP' ? 'group' : 'person') : null\"\n ></i>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}:host ::ng-deep mat-header-cell{color:var(--textMediumLight)}:host ::ng-deep mat-cell,:host ::ng-deep mat-header-cell{margin:0!important}:host ::ng-deep mat-cell es-node-url{width:100%}:host ::ng-deep mat-cell es-node-url a{color:#000}:host ::ng-deep mat-cell es-node-url.cdk-keyboard-focused{outline:none;border:var(--focusWidth) solid var(--palette-primary-300)}:host ::ng-deep es-list-base{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:inline;width:100%;padding:20.3px 0;align-items:center}:host ::ng-deep es-list-base>div{display:inline}:host ::ng-deep es-list-base>div>div{display:inline}mat-header-cell,mat-cell{margin:0 3px}mat-header-cell:not(.mat-column-primary),mat-cell:not(.mat-column-primary){flex:0 145px}mat-header-cell.mat-column-primary,mat-cell.mat-column-primary{min-width:30%}mat-header-cell.mat-column-select,mat-cell.mat-column-select{flex:0 58px;min-width:58px;padding-left:14px}mat-header-cell.mat-column-icon,mat-cell.mat-column-icon{flex:0 85px;min-width:85px;justify-content:center}mat-header-cell.mat-column-actions,mat-cell.mat-column-actions{flex:0 58px;min-width:58px;display:flex;justify-content:flex-end;padding-right:5px}.mat-row{background:unset}.mat-row.dynamic-single-click{cursor:pointer}.mat-row.dynamic-single-click:hover{background-color:rgb(var(--palette-primary-50))}.mat-row.mat-row-import-blocked{opacity:.75;text-decoration:line-through}.mat-row.mat-row-selected{background:var(--listItemSelectedBackgroundEffect)}.mat-row.mat-row-selected .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual{background:linear-gradient(to right,var(--nodeVirtualColor) 5px,transparent 5px) no-repeat;border-right:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual.mat-row-selected{background:linear-gradient(to right,var(--nodeVirtualColor) 0,var(--nodeVirtualColor) 5px,var(--listItemSelectedBackground) 5px,var(--listItemSelectedBackground) 5px)}.mat-row.mat-row-virtual-first{border-top:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual-last{border-bottom:2px dashed var(--nodeVirtualColorLight)}.mat-row.selected-when-dragging{opacity:.5}.dropdown-dummy{position:fixed}.childobjects{background-color:#0000000d;border-radius:15px;display:inline-flex;align-items:center;min-width:51px;min-height:26px;justify-content:center;cursor:default;-webkit-user-select:none;user-select:none;padding:2px 8px;margin-left:5px}.childobjects>.childobject-count{display:inline-flex;align-items:center}.childobjects>.childobject-count>i{font-size:13px;margin-left:4px}.cell-icon .icon-bg{width:36px;height:36px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.cell-icon .icon-bg>img{width:18px;height:auto}.cell-icon .icon-bg>i{color:#666;font-size:18px}.mat-column-link{flex:0 60px}.mat-column-link a,.load-more{display:flex;justify-content:center}es-node-entries-global-options{padding:20px 0}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "directive", type: i9.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i10.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i11.CheckTextOverflowDirective, selector: "[esCheckTextOverflow]", inputs: ["esCheckTextOverflow"], exportAs: ["esCheckTextOverflow"] }, { kind: "component", type: i12.DropdownComponent, selector: "es-dropdown", inputs: ["position", "options", "callbackObject", "showDisabled", "menuClass"] }, { kind: "directive", type: i13.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i14.InfiniteScrollDirective, selector: "[esInfiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollThrottle", "scrollWindow"], outputs: ["scrolled"] }, { kind: "component", type: i15.NodeUrlComponent, selector: "es-node-url", inputs: ["node", "nodes", "target", "scope", "queryParams", "mode", "disabled", "alwaysRipple", "aria-describedby", "aria-label"], outputs: ["buttonClick"] }, { kind: "component", type: i16.SpinnerComponent, selector: "es-spinner" }, { kind: "component", type: i17.ListBaseComponent, selector: "es-list-base", inputs: ["forceText"] }, { kind: "component", type: i18.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i19.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i19.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i20.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i21.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i21.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i21.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i21.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i21.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i21.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i21.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i21.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i21.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i21.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i22.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i23.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i23.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i24.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i25.ColumnChooserComponent, selector: "es-column-chooser", inputs: ["origin", "columnChooserVisible", "columns"], outputs: ["columnChooserVisibleChange", "columnsChange"] }, { kind: "component", type: i26.DragPreviewComponent, selector: "es-drag-preview", inputs: ["node", "selected", "item"] }, { kind: "directive", type: i27.NodesDragDirective, selector: "[esNodesDrag]" }, { kind: "directive", type: i28.NodesDropTargetDirective, selector: "[esNodesDropTarget]", inputs: ["esNodesDropTarget", "canDropNodes"], outputs: ["nodeDropped"], exportAs: ["esNodesDropTarget"] }, { kind: "component", type: i29.NodeEntriesGlobalOptionsComponent, selector: "es-node-entries-global-options", inputs: ["displayType"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i30.NodeIconPipe, name: "esNodeIcon" }, { kind: "pipe", type: i31.NodeTitlePipe, name: "nodeTitle" }, { kind: "pipe", type: i32.TranslatePipe, name: "translate" }, { kind: "pipe", type: i33.ListItemLabelPipe, name: "esListItemLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
280
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: NodeEntriesTableComponent, selector: "es-node-entries-table", viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "columnChooserTrigger", first: true, predicate: ["columnChooserTrigger"], descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true }, { propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n<button\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n></button>\n<es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"NodeEntriesDisplayType.Table\"\n>\n</es-node-entries-global-options>\n<mat-table\n [dataSource]=\"entriesService.dataSource\"\n matSort\n [matSortDisableClear]=\"true\"\n [matSortActive]=\"entriesService.sort?.active\"\n [matSortDirection]=\"entriesService.sort?.direction\"\n esInfiniteScroll\n (scrolled)=\"loadData('scroll')\"\n>\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [ngModel]=\"entriesService.selection.selected.length > 0\"\n [indeterminate]=\"\n entriesService.selection.selected.length > 0 &&\n entriesService.selection.selected.length !== entriesService.dataSource.getData().length\n \"\n (ngModelChange)=\"toggleAll($event)\"\n color=\"primary\"\n aria-label=\"{{ 'LIST_TABLE.TOGGLE_ALL' | translate }}\"\n ></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate : { element: (node | nodeTitle) } }}\"\n color=\"primary\"\n ></mat-checkbox>\n </mat-cell>\n </ng-container>\n <div matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef class=\"cell-icon cell-count\">\n ({{ entriesService.selection.selected.length\n }}<ng-container *ngIf=\"entriesService.dataSource?.getTotal() !== undefined\">\n / {{ entriesService.dataSource?.getTotal() }}</ng-container\n >)\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\" class=\"cell-icon\">\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <ng-container *ngTemplateOutlet=\"icon; context: { node: this.node }\"></ng-container>\n </ng-container>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n >\n <ng-container\n *ngTemplateOutlet=\"icon; context: { node: this.node }\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n ></ng-container>\n </div>\n </mat-cell>\n </div>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible = !columnChooserVisible\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <button\n mat-icon-button\n *ngIf=\"entriesService.options?.[Target.List]?.length\"\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n >\n <i esIcon=\"more_vert\" [aria]=\"true\"></i>\n </button>\n </mat-cell>\n </ng-container>\n <!-- Data Columns -->\n <ng-container\n *ngFor=\"let column of visibleDataColumns$ | async; let first = first\"\n [matColumnDef]=\"column.name\"\n >\n <ng-container>\n <mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!(entriesService.sort?.allowed && isSortable(column))\"\n [class.mat-column-primary]=\"first\"\n >{{ column | esListItemLabel | async }}</mat-header-cell\n >\n </ng-container>\n <mat-cell\n *matCellDef=\"let node\"\n #cell\n [class.mat-column-primary]=\"first\"\n attr.data-test=\"table-cell-{{ column.name }}\"\n >\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <es-node-url cdkMonitorSubtreeFocus [node]=\"node\" [mode]=\"first ? 'link' : 'wrapper'\">\n <es-list-base\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n </es-node-url>\n </ng-container>\n <es-list-base\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n ></es-list-base>\n <ng-container *ngIf=\"first\">\n <div class=\"childobjects\" *ngIf=\"node.properties?.['virtual:childobjectcount'] > 0\">\n <div\n class=\"childobject-count\"\n matTooltip=\"{{\n 'CHILDOBJECT_COUNT'\n | translate : { count: node.properties['virtual:childobjectcount'] * 1 + 1 }\n }}\"\n >\n <span>{{ node.properties['virtual:childobjectcount'] * 1 + 1 }}</span\n ><i esIcon=\"filter_none\"></i>\n </div>\n </div>\n </ng-container>\n </mat-cell>\n </ng-container>\n <mat-header-row mat-header-row *matHeaderRowDef=\"visibleColumnNames$ | async\"></mat-header-row>\n <mat-row\n mat-row\n matRipple\n cdkDrag\n esNodesDrag\n [cdkDragDisabled]=\"!entriesService.dragDrop?.dragAllowed || (ui.isTouchSubject | async)\"\n [cdkDragData]=\"getDragData(node)\"\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDrop\"\n (nodeDropped)=\"drop($event)\"\n class=\"mat-row\"\n [class.mat-row-selected]=\"entriesService.selection.isSelected(node)\"\n [class.mat-row-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"isDragging && entriesService.selection.isSelected(node)\"\n [class.mat-row-virtual]=\"node.virtual\"\n [class.mat-row-virtual-first]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i - 1])?.virtual\n \"\n [class.mat-row-virtual-last]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i + 1])?.virtual\n \"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n *matRowDef=\"let node; let i = index; let last = last; columns: visibleColumnNames$ | async\"\n (contextmenu)=\"onRowContextMenu({ event: $event, node: node })\"\n (keydown.ContextMenu)=\"onRowContextMenu({ event: $event, node: node })\"\n >\n <es-drag-preview\n *cdkDragPreview\n [node]=\"node\"\n [selected]=\"entriesService.selection.selected\"\n [item]=\"(visibleDataColumns$ | async)[0]\"\n ></es-drag-preview>\n </mat-row>\n</mat-table>\n<ng-container\n *ngIf=\"\n (entriesService.dataSource.isLoadingSubject | async) === false &&\n entriesService.dataSource.hasMore() &&\n entriesService.paginationStrategy === 'infinite-scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container *ngIf=\"entriesService.dataSource.isLoadingSubject | async\">\n <ng-container *ngTemplateOutlet=\"loading\"> </ng-container>\n</ng-container>\n<!--\n<mat-paginator #paginator [pageSizeOptions]=\"pageSizeOptions\"></mat-paginator>\n-->\n\n<!-- Wait for ready state to avoid changed-after-checked error when `columnChooserTrigger` becomes\navailable. -->\n<es-column-chooser\n *ngIf=\"columnChooserTriggerReady\"\n [(columns)]=\"entriesService.columns\"\n [(columnChooserVisible)]=\"columnChooserVisible\"\n [origin]=\"columnChooserTrigger\"\n></es-column-chooser>\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #icon let-node=\"node\">\n <div class=\"icon-bg\">\n <img\n *ngIf=\"node.iconURL\"\n [src]=\"node | esNodeIcon | async\"\n [alt]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n [matTooltip]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n matTooltipTouchGestures=\"off\"\n />\n <i\n *ngIf=\"!node.iconURL\"\n [esIcon]=\"node.authorityType ? (node.authorityType === 'GROUP' ? 'group' : 'person') : null\"\n ></i>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}:host ::ng-deep mat-header-cell{color:var(--textMediumLight)}:host ::ng-deep mat-cell,:host ::ng-deep mat-header-cell{margin:0!important}:host ::ng-deep mat-cell es-node-url{width:100%}:host ::ng-deep mat-cell es-node-url a{color:#000}:host ::ng-deep mat-cell es-node-url.cdk-keyboard-focused{outline:none;border:var(--focusWidth) solid var(--palette-primary-300)}:host ::ng-deep es-list-base{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:inline;width:100%;padding:20.3px 0;align-items:center}:host ::ng-deep es-list-base>div{display:inline}:host ::ng-deep es-list-base>div>div{display:inline}mat-header-cell,mat-cell{margin:0 3px}mat-header-cell:not(.mat-column-primary),mat-cell:not(.mat-column-primary){flex:0 145px}mat-header-cell.mat-column-primary,mat-cell.mat-column-primary{min-width:30%}mat-header-cell.mat-column-select,mat-cell.mat-column-select{flex:0 58px;min-width:58px;padding-left:14px}mat-header-cell.mat-column-icon,mat-cell.mat-column-icon{flex:0 85px;min-width:85px;justify-content:center}mat-header-cell.mat-column-actions,mat-cell.mat-column-actions{flex:0 58px;min-width:58px;display:flex;justify-content:flex-end;padding-right:5px}.mat-row{background:unset}.mat-row.dynamic-single-click{cursor:pointer}.mat-row.dynamic-single-click:hover{background-color:rgb(var(--palette-primary-50))}.mat-row.mat-row-import-blocked{opacity:.75;text-decoration:line-through}.mat-row.mat-row-selected{background:var(--listItemSelectedBackgroundEffect)}.mat-row.mat-row-selected .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual{background:linear-gradient(to right,var(--nodeVirtualColor) 5px,transparent 5px) no-repeat;border-right:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual.mat-row-selected{background:linear-gradient(to right,var(--nodeVirtualColor) 0,var(--nodeVirtualColor) 5px,var(--listItemSelectedBackground) 5px,var(--listItemSelectedBackground) 5px)}.mat-row.mat-row-virtual-first{border-top:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual-last{border-bottom:2px dashed var(--nodeVirtualColorLight)}.mat-row.selected-when-dragging{opacity:.5}.dropdown-dummy{position:fixed}.childobjects{background-color:#0000000d;border-radius:15px;display:inline-flex;align-items:center;min-width:51px;min-height:26px;justify-content:center;cursor:default;-webkit-user-select:none;user-select:none;padding:2px 8px;margin-left:5px}.childobjects>.childobject-count{display:inline-flex;align-items:center}.childobjects>.childobject-count>i{font-size:13px;margin-left:4px}.cell-icon .icon-bg{width:36px;height:36px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.cell-icon .icon-bg>img{width:18px;height:auto}.cell-icon .icon-bg>i{color:#666;font-size:18px}.mat-column-link{flex:0 60px}.mat-column-link a,.load-more{display:flex;justify-content:center}es-node-entries-global-options{padding:20px 0}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "directive", type: i9.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i10.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i11.CheckTextOverflowDirective, selector: "[esCheckTextOverflow]", inputs: ["esCheckTextOverflow"], exportAs: ["esCheckTextOverflow"] }, { kind: "component", type: i12.DropdownComponent, selector: "es-dropdown", inputs: ["position", "options", "callbackObject", "showDisabled", "menuClass"] }, { kind: "directive", type: i13.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i14.InfiniteScrollDirective, selector: "[esInfiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollThrottle", "scrollWindow"], outputs: ["scrolled"] }, { kind: "component", type: i15.NodeUrlComponent, selector: "es-node-url", inputs: ["node", "nodes", "target", "scope", "queryParams", "mode", "disabled", "alwaysRipple", "aria-describedby", "aria-label"], outputs: ["buttonClick"] }, { kind: "component", type: i16.SpinnerComponent, selector: "es-spinner" }, { kind: "component", type: i17.ListBaseComponent, selector: "es-list-base", inputs: ["forceText"] }, { kind: "component", type: i18.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i19.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i19.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i20.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i21.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i21.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i21.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i21.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i21.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i21.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i21.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i21.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i21.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i21.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i22.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i23.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i23.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i24.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i25.ColumnChooserComponent, selector: "es-column-chooser", inputs: ["origin", "columnChooserVisible", "columns"], outputs: ["columnChooserVisibleChange", "columnsChange"] }, { kind: "component", type: i26.DragPreviewComponent, selector: "es-drag-preview", inputs: ["node", "selected", "item"] }, { kind: "directive", type: i27.NodesDragDirective, selector: "[esNodesDrag]" }, { kind: "directive", type: i28.NodesDropTargetDirective, selector: "[esNodesDropTarget]", inputs: ["esNodesDropTarget", "canDropNodes"], outputs: ["nodeDropped"], exportAs: ["esNodesDropTarget"] }, { kind: "component", type: i29.NodeEntriesGlobalOptionsComponent, selector: "es-node-entries-global-options", inputs: ["displayType"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i30.NodeIconPipe, name: "esNodeIcon" }, { kind: "pipe", type: i31.NodeTitlePipe, name: "nodeTitle" }, { kind: "pipe", type: i32.TranslatePipe, name: "translate" }, { kind: "pipe", type: i33.ListItemLabelPipe, name: "esListItemLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
279
281
  }
280
282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: NodeEntriesTableComponent, decorators: [{
281
283
  type: Component,
282
- args: [{ selector: 'es-node-entries-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n<button\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n></button>\n<es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"NodeEntriesDisplayType.Table\"\n>\n</es-node-entries-global-options>\n<mat-table\n [dataSource]=\"entriesService.dataSource\"\n matSort\n [matSortDisableClear]=\"true\"\n [matSortActive]=\"entriesService.sort?.active\"\n [matSortDirection]=\"entriesService.sort?.direction\"\n esInfiniteScroll\n (scrolled)=\"loadData('scroll')\"\n>\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [ngModel]=\"entriesService.selection.selected.length > 0\"\n [indeterminate]=\"\n entriesService.selection.selected.length > 0 &&\n entriesService.selection.selected.length !== entriesService.dataSource.getData().length\n \"\n (ngModelChange)=\"toggleAll($event)\"\n color=\"primary\"\n aria-label=\"{{ 'LIST_TABLE.TOGGLE_ALL' | translate }}\"\n ></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate: { element: (node | nodeTitle) } }}\"\n color=\"primary\"\n ></mat-checkbox>\n </mat-cell>\n </ng-container>\n <div matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef class=\"cell-icon cell-count\">\n ({{ entriesService.selection.selected.length\n }}<ng-container *ngIf=\"entriesService.dataSource?.getTotal() !== undefined\">\n / {{ entriesService.dataSource?.getTotal() }}</ng-container\n >)\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\" class=\"cell-icon\">\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <ng-container *ngTemplateOutlet=\"icon; context: { node: this.node }\"></ng-container>\n </ng-container>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n >\n <ng-container\n *ngTemplateOutlet=\"icon; context: { node: this.node }\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n ></ng-container>\n </div>\n </mat-cell>\n </div>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible = !columnChooserVisible\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <button\n mat-icon-button\n *ngIf=\"entriesService.options?.[Target.List]?.length\"\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n >\n <i esIcon=\"more_vert\" [aria]=\"true\"></i>\n </button>\n </mat-cell>\n </ng-container>\n <!-- Data Columns -->\n <ng-container\n *ngFor=\"let column of visibleDataColumns$ | async; let first = first\"\n [matColumnDef]=\"column.name\"\n >\n <ng-container>\n <mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!(entriesService.sort?.allowed && isSortable(column))\"\n [class.mat-column-primary]=\"first\"\n >{{ column | esListItemLabel | async }}</mat-header-cell\n >\n </ng-container>\n <mat-cell\n *matCellDef=\"let node\"\n #cell\n [class.mat-column-primary]=\"first\"\n attr.data-test=\"table-cell-{{ column.name }}\"\n >\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <es-node-url cdkMonitorSubtreeFocus [node]=\"node\" [mode]=\"first ? 'link' : 'wrapper'\">\n <es-list-base\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n </es-node-url>\n </ng-container>\n <es-list-base\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n <ng-container *ngIf=\"first\">\n <div class=\"childobjects\" *ngIf=\"node.properties?.['virtual:childobjectcount'] > 0\">\n <div\n class=\"childobject-count\"\n matTooltip=\"{{\n 'CHILDOBJECT_COUNT'\n | translate: { count: node.properties['virtual:childobjectcount'] * 1 + 1 }\n }}\"\n >\n <span>{{ node.properties['virtual:childobjectcount'] * 1 + 1 }}</span\n ><i esIcon=\"filter_none\"></i>\n </div>\n </div>\n </ng-container>\n </mat-cell>\n </ng-container>\n <mat-header-row mat-header-row *matHeaderRowDef=\"visibleColumnNames$ | async\"></mat-header-row>\n <mat-row\n mat-row\n matRipple\n cdkDrag\n esNodesDrag\n [cdkDragDisabled]=\"!entriesService.dragDrop?.dragAllowed || (ui.isTouchSubject | async)\"\n [cdkDragData]=\"getDragData(node)\"\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDrop\"\n (nodeDropped)=\"drop($event)\"\n class=\"mat-row\"\n [class.mat-row-selected]=\"entriesService.selection.isSelected(node)\"\n [class.mat-row-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"isDragging && entriesService.selection.isSelected(node)\"\n [class.mat-row-virtual]=\"node.virtual\"\n [class.mat-row-virtual-first]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i - 1])?.virtual\n \"\n [class.mat-row-virtual-last]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i + 1])?.virtual\n \"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n *matRowDef=\"let node; let i = index; let last = last; columns: visibleColumnNames$ | async\"\n (contextmenu)=\"onRowContextMenu({ event: $event, node: node })\"\n (keydown.ContextMenu)=\"onRowContextMenu({ event: $event, node: node })\"\n >\n <es-drag-preview\n *cdkDragPreview\n [node]=\"node\"\n [selected]=\"entriesService.selection.selected\"\n [item]=\"(visibleDataColumns$ | async)[0]\"\n ></es-drag-preview>\n </mat-row>\n</mat-table>\n<ng-container\n *ngIf=\"\n (entriesService.dataSource.isLoadingSubject | async) === false &&\n entriesService.dataSource.hasMore() &&\n entriesService.paginationStrategy === 'infinite-scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container *ngIf=\"entriesService.dataSource.isLoadingSubject | async\">\n <ng-container *ngTemplateOutlet=\"loading\"> </ng-container>\n</ng-container>\n<!--\n<mat-paginator #paginator [pageSizeOptions]=\"pageSizeOptions\"></mat-paginator>\n-->\n\n<!-- Wait for ready state to avoid changed-after-checked error when `columnChooserTrigger` becomes\navailable. -->\n<es-column-chooser\n *ngIf=\"columnChooserTriggerReady\"\n [(columns)]=\"entriesService.columns\"\n [(columnChooserVisible)]=\"columnChooserVisible\"\n [origin]=\"columnChooserTrigger\"\n></es-column-chooser>\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #icon let-node=\"node\">\n <div class=\"icon-bg\">\n <img\n *ngIf=\"node.iconURL\"\n [src]=\"node | esNodeIcon | async\"\n [alt]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n [matTooltip]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n matTooltipTouchGestures=\"off\"\n />\n <i\n *ngIf=\"!node.iconURL\"\n [esIcon]=\"node.authorityType ? (node.authorityType === 'GROUP' ? 'group' : 'person') : null\"\n ></i>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}:host ::ng-deep mat-header-cell{color:var(--textMediumLight)}:host ::ng-deep mat-cell,:host ::ng-deep mat-header-cell{margin:0!important}:host ::ng-deep mat-cell es-node-url{width:100%}:host ::ng-deep mat-cell es-node-url a{color:#000}:host ::ng-deep mat-cell es-node-url.cdk-keyboard-focused{outline:none;border:var(--focusWidth) solid var(--palette-primary-300)}:host ::ng-deep es-list-base{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:inline;width:100%;padding:20.3px 0;align-items:center}:host ::ng-deep es-list-base>div{display:inline}:host ::ng-deep es-list-base>div>div{display:inline}mat-header-cell,mat-cell{margin:0 3px}mat-header-cell:not(.mat-column-primary),mat-cell:not(.mat-column-primary){flex:0 145px}mat-header-cell.mat-column-primary,mat-cell.mat-column-primary{min-width:30%}mat-header-cell.mat-column-select,mat-cell.mat-column-select{flex:0 58px;min-width:58px;padding-left:14px}mat-header-cell.mat-column-icon,mat-cell.mat-column-icon{flex:0 85px;min-width:85px;justify-content:center}mat-header-cell.mat-column-actions,mat-cell.mat-column-actions{flex:0 58px;min-width:58px;display:flex;justify-content:flex-end;padding-right:5px}.mat-row{background:unset}.mat-row.dynamic-single-click{cursor:pointer}.mat-row.dynamic-single-click:hover{background-color:rgb(var(--palette-primary-50))}.mat-row.mat-row-import-blocked{opacity:.75;text-decoration:line-through}.mat-row.mat-row-selected{background:var(--listItemSelectedBackgroundEffect)}.mat-row.mat-row-selected .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual{background:linear-gradient(to right,var(--nodeVirtualColor) 5px,transparent 5px) no-repeat;border-right:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual.mat-row-selected{background:linear-gradient(to right,var(--nodeVirtualColor) 0,var(--nodeVirtualColor) 5px,var(--listItemSelectedBackground) 5px,var(--listItemSelectedBackground) 5px)}.mat-row.mat-row-virtual-first{border-top:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual-last{border-bottom:2px dashed var(--nodeVirtualColorLight)}.mat-row.selected-when-dragging{opacity:.5}.dropdown-dummy{position:fixed}.childobjects{background-color:#0000000d;border-radius:15px;display:inline-flex;align-items:center;min-width:51px;min-height:26px;justify-content:center;cursor:default;-webkit-user-select:none;user-select:none;padding:2px 8px;margin-left:5px}.childobjects>.childobject-count{display:inline-flex;align-items:center}.childobjects>.childobject-count>i{font-size:13px;margin-left:4px}.cell-icon .icon-bg{width:36px;height:36px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.cell-icon .icon-bg>img{width:18px;height:auto}.cell-icon .icon-bg>i{color:#666;font-size:18px}.mat-column-link{flex:0 60px}.mat-column-link a,.load-more{display:flex;justify-content:center}es-node-entries-global-options{padding:20px 0}\n"] }]
284
+ args: [{ selector: 'es-node-entries-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n<button\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n></button>\n<es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"NodeEntriesDisplayType.Table\"\n>\n</es-node-entries-global-options>\n<mat-table\n [dataSource]=\"entriesService.dataSource\"\n matSort\n [matSortDisableClear]=\"true\"\n [matSortActive]=\"entriesService.sort?.active\"\n [matSortDirection]=\"entriesService.sort?.direction\"\n esInfiniteScroll\n (scrolled)=\"loadData('scroll')\"\n>\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [ngModel]=\"entriesService.selection.selected.length > 0\"\n [indeterminate]=\"\n entriesService.selection.selected.length > 0 &&\n entriesService.selection.selected.length !== entriesService.dataSource.getData().length\n \"\n (ngModelChange)=\"toggleAll($event)\"\n color=\"primary\"\n aria-label=\"{{ 'LIST_TABLE.TOGGLE_ALL' | translate }}\"\n ></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate : { element: (node | nodeTitle) } }}\"\n color=\"primary\"\n ></mat-checkbox>\n </mat-cell>\n </ng-container>\n <div matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef class=\"cell-icon cell-count\">\n ({{ entriesService.selection.selected.length\n }}<ng-container *ngIf=\"entriesService.dataSource?.getTotal() !== undefined\">\n / {{ entriesService.dataSource?.getTotal() }}</ng-container\n >)\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\" class=\"cell-icon\">\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <ng-container *ngTemplateOutlet=\"icon; context: { node: this.node }\"></ng-container>\n </ng-container>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n >\n <ng-container\n *ngTemplateOutlet=\"icon; context: { node: this.node }\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n ></ng-container>\n </div>\n </mat-cell>\n </div>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible = !columnChooserVisible\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <button\n mat-icon-button\n *ngIf=\"entriesService.options?.[Target.List]?.length\"\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n >\n <i esIcon=\"more_vert\" [aria]=\"true\"></i>\n </button>\n </mat-cell>\n </ng-container>\n <!-- Data Columns -->\n <ng-container\n *ngFor=\"let column of visibleDataColumns$ | async; let first = first\"\n [matColumnDef]=\"column.name\"\n >\n <ng-container>\n <mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!(entriesService.sort?.allowed && isSortable(column))\"\n [class.mat-column-primary]=\"first\"\n >{{ column | esListItemLabel | async }}</mat-header-cell\n >\n </ng-container>\n <mat-cell\n *matCellDef=\"let node\"\n #cell\n [class.mat-column-primary]=\"first\"\n attr.data-test=\"table-cell-{{ column.name }}\"\n >\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <es-node-url cdkMonitorSubtreeFocus [node]=\"node\" [mode]=\"first ? 'link' : 'wrapper'\">\n <es-list-base\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n </es-node-url>\n </ng-container>\n <es-list-base\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n ></es-list-base>\n <ng-container *ngIf=\"first\">\n <div class=\"childobjects\" *ngIf=\"node.properties?.['virtual:childobjectcount'] > 0\">\n <div\n class=\"childobject-count\"\n matTooltip=\"{{\n 'CHILDOBJECT_COUNT'\n | translate : { count: node.properties['virtual:childobjectcount'] * 1 + 1 }\n }}\"\n >\n <span>{{ node.properties['virtual:childobjectcount'] * 1 + 1 }}</span\n ><i esIcon=\"filter_none\"></i>\n </div>\n </div>\n </ng-container>\n </mat-cell>\n </ng-container>\n <mat-header-row mat-header-row *matHeaderRowDef=\"visibleColumnNames$ | async\"></mat-header-row>\n <mat-row\n mat-row\n matRipple\n cdkDrag\n esNodesDrag\n [cdkDragDisabled]=\"!entriesService.dragDrop?.dragAllowed || (ui.isTouchSubject | async)\"\n [cdkDragData]=\"getDragData(node)\"\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDrop\"\n (nodeDropped)=\"drop($event)\"\n class=\"mat-row\"\n [class.mat-row-selected]=\"entriesService.selection.isSelected(node)\"\n [class.mat-row-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"isDragging && entriesService.selection.isSelected(node)\"\n [class.mat-row-virtual]=\"node.virtual\"\n [class.mat-row-virtual-first]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i - 1])?.virtual\n \"\n [class.mat-row-virtual-last]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i + 1])?.virtual\n \"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n *matRowDef=\"let node; let i = index; let last = last; columns: visibleColumnNames$ | async\"\n (contextmenu)=\"onRowContextMenu({ event: $event, node: node })\"\n (keydown.ContextMenu)=\"onRowContextMenu({ event: $event, node: node })\"\n >\n <es-drag-preview\n *cdkDragPreview\n [node]=\"node\"\n [selected]=\"entriesService.selection.selected\"\n [item]=\"(visibleDataColumns$ | async)[0]\"\n ></es-drag-preview>\n </mat-row>\n</mat-table>\n<ng-container\n *ngIf=\"\n (entriesService.dataSource.isLoadingSubject | async) === false &&\n entriesService.dataSource.hasMore() &&\n entriesService.paginationStrategy === 'infinite-scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container *ngIf=\"entriesService.dataSource.isLoadingSubject | async\">\n <ng-container *ngTemplateOutlet=\"loading\"> </ng-container>\n</ng-container>\n<!--\n<mat-paginator #paginator [pageSizeOptions]=\"pageSizeOptions\"></mat-paginator>\n-->\n\n<!-- Wait for ready state to avoid changed-after-checked error when `columnChooserTrigger` becomes\navailable. -->\n<es-column-chooser\n *ngIf=\"columnChooserTriggerReady\"\n [(columns)]=\"entriesService.columns\"\n [(columnChooserVisible)]=\"columnChooserVisible\"\n [origin]=\"columnChooserTrigger\"\n></es-column-chooser>\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #icon let-node=\"node\">\n <div class=\"icon-bg\">\n <img\n *ngIf=\"node.iconURL\"\n [src]=\"node | esNodeIcon | async\"\n [alt]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n [matTooltip]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n matTooltipTouchGestures=\"off\"\n />\n <i\n *ngIf=\"!node.iconURL\"\n [esIcon]=\"node.authorityType ? (node.authorityType === 'GROUP' ? 'group' : 'person') : null\"\n ></i>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}:host ::ng-deep mat-header-cell{color:var(--textMediumLight)}:host ::ng-deep mat-cell,:host ::ng-deep mat-header-cell{margin:0!important}:host ::ng-deep mat-cell es-node-url{width:100%}:host ::ng-deep mat-cell es-node-url a{color:#000}:host ::ng-deep mat-cell es-node-url.cdk-keyboard-focused{outline:none;border:var(--focusWidth) solid var(--palette-primary-300)}:host ::ng-deep es-list-base{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:inline;width:100%;padding:20.3px 0;align-items:center}:host ::ng-deep es-list-base>div{display:inline}:host ::ng-deep es-list-base>div>div{display:inline}mat-header-cell,mat-cell{margin:0 3px}mat-header-cell:not(.mat-column-primary),mat-cell:not(.mat-column-primary){flex:0 145px}mat-header-cell.mat-column-primary,mat-cell.mat-column-primary{min-width:30%}mat-header-cell.mat-column-select,mat-cell.mat-column-select{flex:0 58px;min-width:58px;padding-left:14px}mat-header-cell.mat-column-icon,mat-cell.mat-column-icon{flex:0 85px;min-width:85px;justify-content:center}mat-header-cell.mat-column-actions,mat-cell.mat-column-actions{flex:0 58px;min-width:58px;display:flex;justify-content:flex-end;padding-right:5px}.mat-row{background:unset}.mat-row.dynamic-single-click{cursor:pointer}.mat-row.dynamic-single-click:hover{background-color:rgb(var(--palette-primary-50))}.mat-row.mat-row-import-blocked{opacity:.75;text-decoration:line-through}.mat-row.mat-row-selected{background:var(--listItemSelectedBackgroundEffect)}.mat-row.mat-row-selected .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual{background:linear-gradient(to right,var(--nodeVirtualColor) 5px,transparent 5px) no-repeat;border-right:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual.mat-row-selected{background:linear-gradient(to right,var(--nodeVirtualColor) 0,var(--nodeVirtualColor) 5px,var(--listItemSelectedBackground) 5px,var(--listItemSelectedBackground) 5px)}.mat-row.mat-row-virtual-first{border-top:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual-last{border-bottom:2px dashed var(--nodeVirtualColorLight)}.mat-row.selected-when-dragging{opacity:.5}.dropdown-dummy{position:fixed}.childobjects{background-color:#0000000d;border-radius:15px;display:inline-flex;align-items:center;min-width:51px;min-height:26px;justify-content:center;cursor:default;-webkit-user-select:none;user-select:none;padding:2px 8px;margin-left:5px}.childobjects>.childobject-count{display:inline-flex;align-items:center}.childobjects>.childobject-count>i{font-size:13px;margin-left:4px}.cell-icon .icon-bg{width:36px;height:36px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.cell-icon .icon-bg>img{width:18px;height:auto}.cell-icon .icon-bg>i{color:#666;font-size:18px}.mat-column-link{flex:0 60px}.mat-column-link a,.load-more{display:flex;justify-content:center}es-node-entries-global-options{padding:20px 0}\n"] }]
283
285
  }], ctorParameters: () => [{ type: i1.NodeEntriesService }, { type: i2.NodeEntriesGlobalService }, { type: i0.ApplicationRef }, { type: i3.Toast }, { type: i4.TranslationsService }, { type: i0.ChangeDetectorRef }, { type: i5.UIService }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { sort: [{
284
286
  type: ViewChild,
285
287
  args: [MatSort]
@@ -296,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
296
298
  type: ViewChild,
297
299
  args: ['menuTrigger']
298
300
  }] } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy10YWJsZS9ub2RlLWVudHJpZXMtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXRhYmxlL25vZGUtZW50cmllcy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFNVCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQXVCLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUNILFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEdBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0gsV0FBVyxFQUNYLGVBQWUsRUFFZixzQkFBc0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUc1RixPQUFPLEVBQVEsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpELE9BQU8s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QUFJLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUM7SUFDcEYsQ0FBQzs4R0EvUlEseUJBQXlCO2tHQUF6Qix5QkFBeUIsbUdBUXZCLE9BQU8sNEVBQ1AsWUFBWSwwTEFFWixpQkFBaUIsa0tDakVoQyxrOVRBZ1JBOzsyRkQxTmEseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNJLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTTt1VEFVM0IsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUNPLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDWSxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNILFFBQVE7c0JBQXJDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNGLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka092ZXJsYXlPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgTmdab25lLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0SGVhZGVyLCBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlVGltZSxcbiAgICBkZWxheSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBmaXJzdCxcbiAgICBtYXAsXG4gICAgc2hhcmVSZXBsYXksXG4gICAgc3RhcnRXaXRoLFxuICAgIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBDbGlja1NvdXJjZSxcbiAgICBJbnRlcmFjdGlvblR5cGUsXG4gICAgTm9kZUVudHJpZXNEYXRhVHlwZSxcbiAgICBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLFxufSBmcm9tICcuLi9lbnRyaWVzLW1vZGVsJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzR2xvYmFsU2VydmljZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcbmltcG9ydCB7IEJvcmRlckJveE9ic2VydmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9ib3JkZXItYm94LW9ic2VydmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4uLy4uL3R5cGVzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBDYW5Ecm9wLCBEcmFnRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBOb2RlLCBSZXN0Q29uc3RhbnRzIH0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5pbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi8uLi90eXBlcy9vcHRpb24taXRlbSc7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Fic3RyYWN0L3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZURhdGFTb3VyY2VSZW1vdGUgfSBmcm9tICcuLi9ub2RlLWRhdGEtc291cmNlLXJlbW90ZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRpb25zL3RyYW5zbGF0aW9ucy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1ub2RlLWVudHJpZXMtdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWVudHJpZXMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25vZGUtZW50cmllcy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlRW50cmllc1RhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBOb2RlRW50cmllc0RhdGFUeXBlPlxuICAgIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgICByZWFkb25seSBJbnRlcmFjdGlvblR5cGUgPSBJbnRlcmFjdGlvblR5cGU7XG4gICAgcmVhZG9ubHkgQ2xpY2tTb3VyY2UgPSBDbGlja1NvdXJjZTtcbiAgICByZWFkb25seSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlID0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZTtcbiAgICByZWFkb25seSBUYXJnZXQgPSBUYXJnZXQ7XG5cbiAgICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XG4gICAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNob29zZXJUcmlnZ2VyJykgY29sdW1uQ2hvb3NlclRyaWdnZXI6IENka092ZXJsYXlPcmlnaW47XG4gICAgQFZpZXdDaGlsZChEcm9wZG93bkNvbXBvbmVudCkgZHJvcGRvd246IERyb3Bkb3duQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ21lbnVUcmlnZ2VyJykgbWVudVRyaWdnZXI6IE1hdE1lbnVUcmlnZ2VyO1xuXG4gICAgZHJvcGRvd25MZWZ0OiBudW1iZXI7XG4gICAgZHJvcGRvd25Ub3A6IG51bWJlcjtcblxuICAgIGxvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgaXNQYWdlU2VsZWN0ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBpc0FsbFNlbGVjdGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgY29sdW1uQ2hvb3NlclZpc2libGUgPSBmYWxzZTtcbiAgICBjb2x1bW5DaG9vc2VyVHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgZXJyb3I6IE9ic2VydmFibGU8YW55PjtcbiAgICBwYWdlU2l6ZU9wdGlvbnMgPSBbMjUsIDUwLCAxMDBdO1xuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4aW11bUNvbHVtbnNOdW1iZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdCgxKTtcbiAgICByZWFkb25seSB2aXNpYmxlRGF0YUNvbHVtbnMkO1xuICAgIHJlYWRvbmx5IHZpc2libGVDb2x1bW5OYW1lcyQ7XG5cbiAgICBwcml2YXRlIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVudHJpZXNTZXJ2aWNlOiBOb2RlRW50cmllc1NlcnZpY2U8VD4sXG4gICAgICAgIHB1YmxpYyBlbnRyaWVzR2xvYmFsU2VydmljZTogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgcHJpdmF0ZSB0b2FzdDogVG9hc3QsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJCA9IHRoaXMuZ2V0VmlzaWJsZURhdGFDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbk5hbWVzJCA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbk5hbWVzKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNYXhpbXVtQ29sdW1uc051bWJlcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jaGFuZ2VkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLCBkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyU29ydENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBOb2RlRGF0YVNvdXJjZVJlbW90ZSkge1xuICAgICAgICAgICAgICAgICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgYXMgTm9kZURhdGFTb3VyY2VSZW1vdGUpLnNvcnRQYW5lbCA9IHRoaXMuc29ydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJFxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgZGVsYXkoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmNvbHVtbkNob29zZXJUcmlnZ2VyUmVhZHkgPSB0cnVlKSk7XG4gICAgICAgIHJ4anMuY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UkLnBpcGUoc3RhcnRXaXRoKHZvaWQgMCBhcyB2b2lkKSksXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLm9wdGlvbnMkLnBpcGUoc3RhcnRXaXRoKHZvaWQgMCBhcyB2b2lkKSksXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nU3ViamVjdC5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2hhbmdlZC5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMud2FpdEZvckluaXQoKS5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICBdKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9uUm93Q29udGV4dE1lbnUoeyBldmVudCwgbm9kZSB9OiB7IGV2ZW50OiBNb3VzZUV2ZW50IHwgRXZlbnQ7IG5vZGU6IFQgfSkge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAoeyBjbGllbnRYOiB0aGlzLmRyb3Bkb3duTGVmdCwgY2xpZW50WTogdGhpcy5kcm9wZG93blRvcCB9ID0gZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKHsgeDogdGhpcy5kcm9wZG93bkxlZnQsIHk6IHRoaXMuZHJvcGRvd25Ub3AgfSA9IChcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBtZW51IHRvIHJlZmxlY3QgY2hhbmdlZCBvcHRpb25zLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmNhblNob3dEcm9wZG93bigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51VHJpZ2dlci5vcGVuTWVudSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnRvYXN0KCdOT19BVkFJTEFCTEVfT1BUSU9OUycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNvcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc29ydC5zb3J0KHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQ/LmFjdGl2ZSxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQ/LmRpcmVjdGlvbiBhcyAnYXNjJyB8ICdkZXNjJyxcbiAgICAgICAgICAgIGRpc2FibGVDbGVhcjogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBGaXggbWlzc2luZyBzb3J0aW5nIGluZGljYXRvcnMuIFNlZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xMDI0MiNpc3N1ZWNvbW1lbnQtNDcwNzI2ODI5LiBTZWVtc1xuICAgICAgICAvLyB0byBiZSBmaXhlZCB1cHN0cmVhbSB3aXRoIEFuZ3VsYXIgMTEuXG4gICAgICAgIChcbiAgICAgICAgICAgIHRoaXMuc29ydC5zb3J0YWJsZXMuZ2V0KHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydD8uYWN0aXZlKSBhcyBNYXRTb3J0SGVhZGVyXG4gICAgICAgICkuX3NldEFuaW1hdGlvblRyYW5zaXRpb25TdGF0ZSh7XG4gICAgICAgICAgICB0b1N0YXRlOiAnYWN0aXZlJyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKHF1ZXJ5UGFyYW1zOiBQYXJhbXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnQ6IFNvcnQgPSBxdWVyeVBhcmFtcy5zb3J0ID8gSlNPTi5wYXJzZShxdWVyeVBhcmFtcy5zb3J0KSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoc29ydCAmJiBzb3J0LmRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ydC5zb3J0KHsgaWQ6IHNvcnQuYWN0aXZlLCBzdGFydDogc29ydC5kaXJlY3Rpb24sIGRpc2FibGVDbGVhcjogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgLy8gRml4IG1pc3Npbmcgc29ydGluZyBpbmRpY2F0b3JzLiBTZWVcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xMDI0MiNpc3N1ZWNvbW1lbnQtNDcwNzI2ODI5LiBTZWVtc1xuICAgICAgICAgICAgICAgIC8vIHRvIGJlIGZpeGVkIHVwc3RyZWFtIHdpdGggQW5ndWxhciAxMS5cbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydC5zb3J0YWJsZXMuZ2V0KHNvcnQuYWN0aXZlKSBhcyBNYXRTb3J0SGVhZGVyXG4gICAgICAgICAgICAgICAgKS5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdG9TdGF0ZTogJ2FjdGl2ZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVlcnlQYXJhbXMucGFnZUluZGV4ICYmIHF1ZXJ5UGFyYW1zLnBhZ2VTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gcXVlcnlQYXJhbXMucGFnZUluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gcXVlcnlQYXJhbXMucGFnZVNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyTWF4aW11bUNvbHVtbnNOdW1iZXIoKSB7XG4gICAgICAgIEJvcmRlckJveE9ic2VydmVyRGlyZWN0aXZlLm9ic2VydmVFbGVtZW50KHRoaXMuZWxlbWVudFJlZilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXG4gICAgICAgICAgICAgICAgbWFwKChib3gpID0+IHRoaXMuZ2V0TWF4aW11bUNvbHVtbnNOdW1iZXIoYm94LndpZHRoKSksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKG1heGltdW1Db2x1bW5zTnVtYmVyKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm1heGltdW1Db2x1bW5zTnVtYmVyJC5uZXh0KG1heGltdW1Db2x1bW5zTnVtYmVyKSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF4aW11bUNvbHVtbnNOdW1iZXIodGFibGVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdG90YWwgd2lkdGggb2YgYWx3YXlzIHZpc2libGUgY29sdW1ucyBsaWtlIGNoZWNrYm94ZXMgYW5kIGljb25zLlxuICAgICAgICAgICAgICAgICh0YWJsZVdpZHRoIC0gMTg3KSAvXG4gICAgICAgICAgICAgICAgICAgIC8vIERpdmlkZSBieSB3aXRoIG9mIGRhdGEgY29sdW1ucyAoaW5jbHVkaW5nIG1hcmdpbikuXG4gICAgICAgICAgICAgICAgICAgIDEyNixcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlRGF0YUNvbHVtbnMoKTogT2JzZXJ2YWJsZTxMaXN0SXRlbVtdPiB7XG4gICAgICAgIHJldHVybiByeGpzXG4gICAgICAgICAgICAuY29tYmluZUxhdGVzdChbdGhpcy5tYXhpbXVtQ29sdW1uc051bWJlciQsIHRoaXMuZW50cmllc1NlcnZpY2UuY29sdW1uc1N1YmplY3RdKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChbbWF4aW11bUNvbHVtbnNOdW1iZXIsIGNvbHVtbnNdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLnZpc2libGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggPCBtYXhpbXVtQ29sdW1uc051bWJlcik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmlzaWJsZUNvbHVtbk5hbWVzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJC5waXBlKFxuICAgICAgICAgICAgbWFwKCh2aXNpYmxlRGF0YUNvbHVtbnMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllc1NlcnZpY2UuY2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKCdzZWxlY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKCdpY29uJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnMuY29uY2F0KHZpc2libGVEYXRhQ29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSkpLmNvbmNhdChbJ2FjdGlvbnMnXSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzU29ydGFibGUoY29sdW1uOiBMaXN0SXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Py5jb2x1bW5zPy5zb21lKFxuICAgICAgICAgICAgKGMpID0+IGMudHlwZSA9PT0gY29sdW1uLnR5cGUgJiYgYy5uYW1lID09PSBjb2x1bW4ubmFtZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB0b2dnbGVBbGwoY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJTb3J0Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2Uuc3Vic2NyaWJlKChzb3J0OiBTb3J0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQuYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQuZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnRDaGFuZ2UuZW1pdCh0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQpO1xuICAgICAgICAgICAgLyp0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nXSwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgc29ydDogSlNPTi5zdHJpbmdpZnkoc29ydCkgfSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICB9KTsqL1xuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gQXMgYSByZXNwb25zZSB0byBjaGFuZ2VzIG9mIG90aGVyIHBhcmFtZXRlcnMsIHRoZSBwYWdlSW5kZXggbWlnaHQgYmUgcmVzZXQgdG8gMCBhbmQgYVxuICAgICAgICAgICAgICAgIC8vIHBhZ2UgZXZlbnQgdHJpZ2dlcnMuIFRoaXMgY2hhbmdlIG9mIG90aGVyIHBhcmFtZXRlcnMgaXMgbGlrZWx5IHRvIGNhdXNlIGFcbiAgICAgICAgICAgICAgICAvLyBgcm91dGVyLm5hdmlnYXRlKClgIGNhbGwgZWxzZXdoZXJlLiBXaGVuIHRoaXMgaGFwcGVucyBqdXN0IGJlZm9yZSBvdXIgY2FsbCwgb3VyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBhcmUgaWdub3JlZC4gVG8gc2hpZWxkIGFnYWluc3QgdGhpcywgd2Ugd2FpdCBhIHRpY2suXG4gICAgICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IHBhZ2VJbmRleCwgcGFnZVNpemUgfTogUGFnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJ10sIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcGFnZUluZGV4LCBwYWdlU2l6ZSB9LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgIGNhbkRyb3AgPSAoZHJhZ0RhdGE6IERyYWdEYXRhPFQ+KTogQ2FuRHJvcCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wLmRyb3BBbGxvd2VkPy4oZHJhZ0RhdGEpO1xuICAgIH07XG5cbiAgICBkcm9wKGRyYWdEYXRhOiBEcmFnRGF0YTxOb2RlPikge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wLmRyb3BwZWQoZHJhZ0RhdGEudGFyZ2V0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBkcmFnRGF0YS5kcmFnZ2VkTm9kZXMsXG4gICAgICAgICAgICBtb2RlOiBkcmFnRGF0YS5hY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldERyYWdEYXRhKG5vZGU6IFQpOiBUW10ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtub2RlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0ZWQobm9kZTogVCkge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkRyYWdFbmRlZCgpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbG9hZERhdGEoc291cmNlOiAnc2Nyb2xsJyB8ICdidXR0b24nKSB7XG4gICAgICAgIC8vIFRPRE86IGZvY3VzIG5leHQgaXRlbSB3aGVuIHRyaWdnZXJlZCB2aWEgYnV0dG9uLlxuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmxvYWRNb3JlKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3Blbk1lbnUobm9kZTogVCkge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsaWNrU291cmNlID0gQ2xpY2tTb3VyY2UuRHJvcGRvd247XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwbGljYXRpb25SZWYudGljaygpO1xuICAgICAgICB0aGlzLmRyb3Bkb3duLm1lbnUuZm9jdXNGaXJzdEl0ZW0oKTtcbiAgICB9XG5cbiAgICBpc0Jsb2NrZWQobm9kZTogTm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9JTVBPUlRfQkxPQ0tFRF0/LlswXSA9PT0gJ3RydWUnO1xuICAgIH1cbn1cbiIsIjxlcy1kcm9wZG93biAjZHJvcGRvd24gW29wdGlvbnNdPVwiZW50cmllc1NlcnZpY2Uub3B0aW9ucz8uW1RhcmdldC5MaXN0RHJvcGRvd25dXCI+PC9lcy1kcm9wZG93bj5cbjxidXR0b25cbiAgI21lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIlxuICBtYXQtYnV0dG9uXG4gIGNsYXNzPVwiZHJvcGRvd24tZHVtbXkgY2RrLXZpc3VhbGx5LWhpZGRlblwiXG4gIFtzdHlsZS5sZWZ0LnB4XT1cImRyb3Bkb3duTGVmdFwiXG4gIFtzdHlsZS50b3AucHhdPVwiZHJvcGRvd25Ub3BcIlxuICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZHJvcGRvd24ubWVudVwiXG4gIHRhYmluZGV4PVwiLTFcIlxuICBhcmlhLWhpZGRlbj1cInRydWVcIlxuPjwvYnV0dG9uPlxuPGVzLW5vZGUtZW50cmllcy1nbG9iYWwtb3B0aW9uc1xuICAqbmdJZj1cIihlbnRyaWVzU2VydmljZS5nbG9iYWxPcHRpb25zU3ViamVjdCB8IGFzeW5jKT8ubGVuZ3RoXCJcbiAgW2Rpc3BsYXlUeXBlXT1cIk5vZGVFbnRyaWVzRGlzcGxheVR5cGUuVGFibGVcIlxuPlxuPC9lcy1ub2RlLWVudHJpZXMtZ2xvYmFsLW9wdGlvbnM+XG48bWF0LXRhYmxlXG4gIFtkYXRhU291cmNlXT1cImVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2VcIlxuICBtYXRTb3J0XG4gIFttYXRTb3J0RGlzYWJsZUNsZWFyXT1cInRydWVcIlxuICBbbWF0U29ydEFjdGl2ZV09XCJlbnRyaWVzU2VydmljZS5zb3J0Py5hY3RpdmVcIlxuICBbbWF0U29ydERpcmVjdGlvbl09XCJlbnRyaWVzU2VydmljZS5zb3J0Py5kaXJlY3Rpb25cIlxuICBlc0luZmluaXRlU2Nyb2xsXG4gIChzY3JvbGxlZCk9XCJsb2FkRGF0YSgnc2Nyb2xsJylcIlxuPlxuICA8IS0tIENoZWNrYm94IENvbHVtbiAtLT5cbiAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICBbbmdNb2RlbF09XCJlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMFwiXG4gICAgICAgIFtpbmRldGVybWluYXRlXT1cIlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCAhPT0gZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKCkubGVuZ3RoXG4gICAgICAgIFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZUFsbCgkZXZlbnQpXCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgYXJpYS1sYWJlbD1cInt7ICdMSVNUX1RBQkxFLlRPR0dMRV9BTEwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgID48L21hdC1jaGVja2JveD5cbiAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgbm9kZVwiPlxuICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICBbY2hlY2tlZF09XCJlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgIChjaGFuZ2UpPVwiZW50cmllc1NlcnZpY2Uub25DaGVja2JveENoYW5nZWQobm9kZSwgJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cInt7ICdTRUxFQ1QnIHwgdHJhbnNsYXRlOiB7IGVsZW1lbnQ6IChub2RlIHwgbm9kZVRpdGxlKSB9IH19XCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgID48L21hdC1jaGVja2JveD5cbiAgICA8L21hdC1jZWxsPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBtYXRDb2x1bW5EZWY9XCJpY29uXCI+XG4gICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImNlbGwtaWNvbiBjZWxsLWNvdW50XCI+XG4gICAgICAoe3sgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFxuICAgICAgfX08bmctY29udGFpbmVyICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZT8uZ2V0VG90YWwoKSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgIC8ge3sgZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZT8uZ2V0VG90YWwoKSB9fTwvbmctY29udGFpbmVyXG4gICAgICA+KVxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBub2RlXCIgY2xhc3M9XCJjZWxsLWljb25cIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuRGVmYXVsdEFjdGlvbkxpbmtcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbjsgY29udGV4dDogeyBub2RlOiB0aGlzLm5vZGUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLm9uQ2xpY2tlZCh7IGV2ZW50OiAkZXZlbnQsIGVsZW1lbnQ6IG5vZGUsIHNvdXJjZTogQ2xpY2tTb3VyY2UuSWNvbiB9KVxuICAgICAgICBcIlxuICAgICAgICAoZGJsY2xpY2spPVwiZW50cmllc1NlcnZpY2UuZGJsQ2xpY2tJdGVtLmVtaXQoeyBlbGVtZW50OiBub2RlLCBzb3VyY2U6IENsaWNrU291cmNlLkljb24gfSlcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uOyBjb250ZXh0OiB7IG5vZGU6IHRoaXMubm9kZSB9XCJcbiAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICBlbnRyaWVzU2VydmljZS5vbkNsaWNrZWQoeyBldmVudDogJGV2ZW50LCBlbGVtZW50OiBub2RlLCBzb3VyY2U6IENsaWNrU291cmNlLkljb24gfSlcbiAgICAgICAgICBcIlxuICAgICAgICAgIChkYmxjbGljayk9XCJlbnRyaWVzU2VydmljZS5kYmxDbGlja0l0ZW0uZW1pdCh7IGVsZW1lbnQ6IG5vZGUsIHNvdXJjZTogQ2xpY2tTb3VyY2UuSWNvbiB9KVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmNvbmZpZ3VyZUNvbHVtbnNcIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cImNvbHVtbkNob29zZXJWaXNpYmxlID0gIWNvbHVtbkNob29zZXJWaXNpYmxlXCJcbiAgICAgICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICAgICAjY29sdW1uQ2hvb3NlclRyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ0xJU1RfVEFCTEUuQ09ORklHVVJFX0NPTFVNTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTElTVF9UQUJMRS5DT05GSUdVUkVfQ09MVU1OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgPlxuICAgICAgICA8aSBlc0ljb249XCJzZXR0aW5nc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBub2RlXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLm9wdGlvbnM/LltUYXJnZXQuTGlzdF0/Lmxlbmd0aFwiXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIChjbGljayk9XCJvcGVuTWVudShub2RlKVwiXG4gICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJkcm9wZG93bi5tZW51XCJcbiAgICAgID5cbiAgICAgICAgPGkgZXNJY29uPVwibW9yZV92ZXJ0XCIgW2FyaWFdPVwidHJ1ZVwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuICA8IS0tIERhdGEgQ29sdW1ucyAtLT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZURhdGFDb2x1bW5zJCB8IGFzeW5jOyBsZXQgZmlyc3QgPSBmaXJzdFwiXG4gICAgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyPlxuICAgICAgPG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICBtYXQtc29ydC1oZWFkZXJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiEoZW50cmllc1NlcnZpY2Uuc29ydD8uYWxsb3dlZCAmJiBpc1NvcnRhYmxlKGNvbHVtbikpXCJcbiAgICAgICAgW2NsYXNzLm1hdC1jb2x1bW4tcHJpbWFyeV09XCJmaXJzdFwiXG4gICAgICAgID57eyBjb2x1bW4gfCBlc0xpc3RJdGVtTGFiZWwgfCBhc3luYyB9fTwvbWF0LWhlYWRlci1jZWxsXG4gICAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG1hdC1jZWxsXG4gICAgICAqbWF0Q2VsbERlZj1cImxldCBub2RlXCJcbiAgICAgICNjZWxsXG4gICAgICBbY2xhc3MubWF0LWNvbHVtbi1wcmltYXJ5XT1cImZpcnN0XCJcbiAgICAgIGF0dHIuZGF0YS10ZXN0PVwidGFibGUtY2VsbC17eyBjb2x1bW4ubmFtZSB9fVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmVsZW1lbnRJbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGlua1wiXG4gICAgICA+XG4gICAgICAgIDxlcy1ub2RlLXVybCBjZGtNb25pdG9yU3VidHJlZUZvY3VzIFtub2RlXT1cIm5vZGVcIiBbbW9kZV09XCJmaXJzdCA/ICdsaW5rJyA6ICd3cmFwcGVyJ1wiPlxuICAgICAgICAgIDxlcy1saXN0LWJhc2VcbiAgICAgICAgICAgIFtmb3JjZVRleHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgIFtpdGVtXT1cImNvbHVtblwiXG4gICAgICAgICAgICBlc0NoZWNrVGV4dE92ZXJmbG93XG4gICAgICAgICAgICAjdGV4dD1cImVzQ2hlY2tUZXh0T3ZlcmZsb3dcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwidGV4dC5oYXNUZXh0T3ZlcmZsb3coKSA/IGNlbGwuaW5uZXJUZXh0IDogbnVsbFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwVG91Y2hHZXN0dXJlcz1cIm9mZlwiXG4gICAgICAgICAgPjwvZXMtbGlzdC1iYXNlPlxuICAgICAgICA8L2VzLW5vZGUtdXJsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZXMtbGlzdC1iYXNlXG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgICAgW2ZvcmNlVGV4dF09XCJ0cnVlXCJcbiAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgIFtpdGVtXT1cImNvbHVtblwiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBlbnRyaWVzU2VydmljZS5vbkNsaWNrZWQoe1xuICAgICAgICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG5vZGUsXG4gICAgICAgICAgICBzb3VyY2U6IENsaWNrU291cmNlLk1ldGFkYXRhLFxuICAgICAgICAgICAgYXR0cmlidXRlOiBjb2x1bW4sXG4gICAgICAgICAgfSlcbiAgICAgICAgXCJcbiAgICAgICAgKGRibGNsaWNrKT1cIlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLmRibENsaWNrSXRlbS5lbWl0KHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IG5vZGUsXG4gICAgICAgICAgICBzb3VyY2U6IENsaWNrU291cmNlLk1ldGFkYXRhLFxuICAgICAgICAgICAgYXR0cmlidXRlOiBjb2x1bW4sXG4gICAgICAgICAgfSlcbiAgICAgICAgXCJcbiAgICAgICAgZXNDaGVja1RleHRPdmVyZmxvd1xuICAgICAgICAjdGV4dD1cImVzQ2hlY2tUZXh0T3ZlcmZsb3dcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJ0ZXh0Lmhhc1RleHRPdmVyZmxvdygpID8gY2VsbC5pbm5lclRleHQgOiBudWxsXCJcbiAgICAgICAgbWF0VG9vbHRpcFRvdWNoR2VzdHVyZXM9XCJvZmZcIlxuICAgICAgPjwvZXMtbGlzdC1iYXNlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpcnN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGlsZG9iamVjdHNcIiAqbmdJZj1cIm5vZGUucHJvcGVydGllcz8uWyd2aXJ0dWFsOmNoaWxkb2JqZWN0Y291bnQnXSA+IDBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNoaWxkb2JqZWN0LWNvdW50XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7e1xuICAgICAgICAgICAgICAnQ0hJTERPQkpFQ1RfQ09VTlQnXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgY291bnQ6IG5vZGUucHJvcGVydGllc1sndmlydHVhbDpjaGlsZG9iamVjdGNvdW50J10gKiAxICsgMSB9XG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+e3sgbm9kZS5wcm9wZXJ0aWVzWyd2aXJ0dWFsOmNoaWxkb2JqZWN0Y291bnQnXSAqIDEgKyAxIH19PC9zcGFuXG4gICAgICAgICAgICA+PGkgZXNJY29uPVwiZmlsdGVyX25vbmVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtY2VsbD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxtYXQtaGVhZGVyLXJvdyBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwidmlzaWJsZUNvbHVtbk5hbWVzJCB8IGFzeW5jXCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgPG1hdC1yb3dcbiAgICBtYXQtcm93XG4gICAgbWF0UmlwcGxlXG4gICAgY2RrRHJhZ1xuICAgIGVzTm9kZXNEcmFnXG4gICAgW2Nka0RyYWdEaXNhYmxlZF09XCIhZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3A/LmRyYWdBbGxvd2VkIHx8ICh1aS5pc1RvdWNoU3ViamVjdCB8IGFzeW5jKVwiXG4gICAgW2Nka0RyYWdEYXRhXT1cImdldERyYWdEYXRhKG5vZGUpXCJcbiAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25EcmFnU3RhcnRlZChub2RlKVwiXG4gICAgKGNka0RyYWdFbmRlZCk9XCJvbkRyYWdFbmRlZCgpXCJcbiAgICBbZXNOb2Rlc0Ryb3BUYXJnZXRdPVwibm9kZVwiXG4gICAgW2NhbkRyb3BOb2Rlc109XCJjYW5Ecm9wXCJcbiAgICAobm9kZURyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcbiAgICBjbGFzcz1cIm1hdC1yb3dcIlxuICAgIFtjbGFzcy5tYXQtcm93LXNlbGVjdGVkXT1cImVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXCJcbiAgICBbY2xhc3MubWF0LXJvdy1pbXBvcnQtYmxvY2tlZF09XCJpc0Jsb2NrZWQobm9kZSlcIlxuICAgIFtjbGFzcy5zZWxlY3RlZC13aGVuLWRyYWdnaW5nXT1cImlzRHJhZ2dpbmcgJiYgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIlxuICAgIFtjbGFzcy5tYXQtcm93LXZpcnR1YWxdPVwibm9kZS52aXJ0dWFsXCJcbiAgICBbY2xhc3MubWF0LXJvdy12aXJ0dWFsLWZpcnN0XT1cIlxuICAgICAgbm9kZS52aXJ0dWFsICYmICEkYW55KGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuZ2V0RGF0YSgpW2kgLSAxXSk/LnZpcnR1YWxcbiAgICBcIlxuICAgIFtjbGFzcy5tYXQtcm93LXZpcnR1YWwtbGFzdF09XCJcbiAgICAgIG5vZGUudmlydHVhbCAmJiAhJGFueShlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmdldERhdGEoKVtpICsgMV0pPy52aXJ0dWFsXG4gICAgXCJcbiAgICBbY2xhc3MuZHluYW1pYy1zaW5nbGUtY2xpY2tdPVwiZW50cmllc1NlcnZpY2Uuc2luZ2xlQ2xpY2tIaW50ID09PSAnZHluYW1pYydcIlxuICAgICptYXRSb3dEZWY9XCJsZXQgbm9kZTsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0OyBjb2x1bW5zOiB2aXNpYmxlQ29sdW1uTmFtZXMkIHwgYXN5bmNcIlxuICAgIChjb250ZXh0bWVudSk9XCJvblJvd0NvbnRleHRNZW51KHsgZXZlbnQ6ICRldmVudCwgbm9kZTogbm9kZSB9KVwiXG4gICAgKGtleWRvd24uQ29udGV4dE1lbnUpPVwib25Sb3dDb250ZXh0TWVudSh7IGV2ZW50OiAkZXZlbnQsIG5vZGU6IG5vZGUgfSlcIlxuICA+XG4gICAgPGVzLWRyYWctcHJldmlld1xuICAgICAgKmNka0RyYWdQcmV2aWV3XG4gICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgIFtzZWxlY3RlZF09XCJlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWRcIlxuICAgICAgW2l0ZW1dPVwiKHZpc2libGVEYXRhQ29sdW1ucyQgfCBhc3luYylbMF1cIlxuICAgID48L2VzLWRyYWctcHJldmlldz5cbiAgPC9tYXQtcm93PlxuPC9tYXQtdGFibGU+XG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwiXG4gICAgKGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nU3ViamVjdCB8IGFzeW5jKSA9PT0gZmFsc2UgJiZcbiAgICBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmhhc01vcmUoKSAmJlxuICAgIGVudHJpZXNTZXJ2aWNlLnBhZ2luYXRpb25TdHJhdGVneSA9PT0gJ2luZmluaXRlLXNjcm9sbCdcbiAgXCJcbj5cbiAgPGRpdiBjbGFzcz1cImxvYWQtbW9yZVwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwibG9hZERhdGEoJ2J1dHRvbicpXCI+XG4gICAgICA8aSBlc0ljb249XCJyZWZyZXNoXCI+PC9pPlxuICAgICAgPHNwYW4+e3sgJ0xPQURfTU9SRScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0xvYWRpbmdTdWJqZWN0IHwgYXN5bmNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdcIj4gPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjwhLS1cbjxtYXQtcGFnaW5hdG9yICNwYWdpbmF0b3IgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIj48L21hdC1wYWdpbmF0b3I+XG4tLT5cblxuPCEtLSBXYWl0IGZvciByZWFkeSBzdGF0ZSB0byBhdm9pZCBjaGFuZ2VkLWFmdGVyLWNoZWNrZWQgZXJyb3Igd2hlbiBgY29sdW1uQ2hvb3NlclRyaWdnZXJgIGJlY29tZXNcbmF2YWlsYWJsZS4gLS0+XG48ZXMtY29sdW1uLWNob29zZXJcbiAgKm5nSWY9XCJjb2x1bW5DaG9vc2VyVHJpZ2dlclJlYWR5XCJcbiAgWyhjb2x1bW5zKV09XCJlbnRyaWVzU2VydmljZS5jb2x1bW5zXCJcbiAgWyhjb2x1bW5DaG9vc2VyVmlzaWJsZSldPVwiY29sdW1uQ2hvb3NlclZpc2libGVcIlxuICBbb3JpZ2luXT1cImNvbHVtbkNob29zZXJUcmlnZ2VyXCJcbj48L2VzLWNvbHVtbi1jaG9vc2VyPlxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZXMtc3Bpbm5lcj48L2VzLXNwaW5uZXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNpY29uIGxldC1ub2RlPVwibm9kZVwiPlxuICA8ZGl2IGNsYXNzPVwiaWNvbi1iZ1wiPlxuICAgIDxpbWdcbiAgICAgICpuZ0lmPVwibm9kZS5pY29uVVJMXCJcbiAgICAgIFtzcmNdPVwibm9kZSB8IGVzTm9kZUljb24gfCBhc3luY1wiXG4gICAgICBbYWx0XT1cIlxuICAgICAgICBub2RlLm1lZGlhdHlwZVxuICAgICAgICAgID8gKCdOT0RFLm1lZGlhdHlwZScgfCB0cmFuc2xhdGUpICsgJzogJyArICgnTUVESUFUWVBFLicgKyBub2RlLm1lZGlhdHlwZSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICcnXG4gICAgICBcIlxuICAgICAgW21hdFRvb2x0aXBdPVwiXG4gICAgICAgIG5vZGUubWVkaWF0eXBlXG4gICAgICAgICAgPyAoJ05PREUubWVkaWF0eXBlJyB8IHRyYW5zbGF0ZSkgKyAnOiAnICsgKCdNRURJQVRZUEUuJyArIG5vZGUubWVkaWF0eXBlIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogJydcbiAgICAgIFwiXG4gICAgICBtYXRUb29sdGlwVG91Y2hHZXN0dXJlcz1cIm9mZlwiXG4gICAgLz5cbiAgICA8aVxuICAgICAgKm5nSWY9XCIhbm9kZS5pY29uVVJMXCJcbiAgICAgIFtlc0ljb25dPVwibm9kZS5hdXRob3JpdHlUeXBlID8gKG5vZGUuYXV0aG9yaXR5VHlwZSA9PT0gJ0dST1VQJyA/ICdncm91cCcgOiAncGVyc29uJykgOiBudWxsXCJcbiAgICA+PC9pPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy10YWJsZS9ub2RlLWVudHJpZXMtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXRhYmxlL25vZGUtZW50cmllcy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFNVCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQXVCLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUNILFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEdBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0gsV0FBVyxFQUNYLGVBQWUsRUFFZixzQkFBc0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUc1RixPQUFPLEVBQVEsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpELE9BQU8s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QUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUM7SUFDcEYsQ0FBQzs4R0FqU1EseUJBQXlCO2tHQUF6Qix5QkFBeUIsbUdBUXZCLE9BQU8sNEVBQ1AsWUFBWSwwTEFFWixpQkFBaUIsa0tDakVoQyw4eFRBNFFBOzsyRkR0TmEseUJBQXlCO2tCQU5yQyxTQUFTOytCQUNJLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTTt1VEFVM0IsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUNPLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDWSxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNILFFBQVE7c0JBQXJDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNGLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka092ZXJsYXlPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgTmdab25lLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0SGVhZGVyLCBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlVGltZSxcbiAgICBkZWxheSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgICBmaXJzdCxcbiAgICBtYXAsXG4gICAgc2hhcmVSZXBsYXksXG4gICAgc3RhcnRXaXRoLFxuICAgIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBDbGlja1NvdXJjZSxcbiAgICBJbnRlcmFjdGlvblR5cGUsXG4gICAgTm9kZUVudHJpZXNEYXRhVHlwZSxcbiAgICBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLFxufSBmcm9tICcuLi9lbnRyaWVzLW1vZGVsJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzR2xvYmFsU2VydmljZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcbmltcG9ydCB7IEJvcmRlckJveE9ic2VydmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9ib3JkZXItYm94LW9ic2VydmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4uLy4uL3R5cGVzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBDYW5Ecm9wLCBEcmFnRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBOb2RlLCBSZXN0Q29uc3RhbnRzIH0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5pbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi8uLi90eXBlcy9vcHRpb24taXRlbSc7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Fic3RyYWN0L3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZURhdGFTb3VyY2VSZW1vdGUgfSBmcm9tICcuLi9ub2RlLWRhdGEtc291cmNlLXJlbW90ZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRpb25zL3RyYW5zbGF0aW9ucy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1ub2RlLWVudHJpZXMtdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWVudHJpZXMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25vZGUtZW50cmllcy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlRW50cmllc1RhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBOb2RlRW50cmllc0RhdGFUeXBlPlxuICAgIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgICByZWFkb25seSBJbnRlcmFjdGlvblR5cGUgPSBJbnRlcmFjdGlvblR5cGU7XG4gICAgcmVhZG9ubHkgQ2xpY2tTb3VyY2UgPSBDbGlja1NvdXJjZTtcbiAgICByZWFkb25seSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlID0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZTtcbiAgICByZWFkb25seSBUYXJnZXQgPSBUYXJnZXQ7XG5cbiAgICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XG4gICAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNob29zZXJUcmlnZ2VyJykgY29sdW1uQ2hvb3NlclRyaWdnZXI6IENka092ZXJsYXlPcmlnaW47XG4gICAgQFZpZXdDaGlsZChEcm9wZG93bkNvbXBvbmVudCkgZHJvcGRvd246IERyb3Bkb3duQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ21lbnVUcmlnZ2VyJykgbWVudVRyaWdnZXI6IE1hdE1lbnVUcmlnZ2VyO1xuXG4gICAgZHJvcGRvd25MZWZ0OiBudW1iZXI7XG4gICAgZHJvcGRvd25Ub3A6IG51bWJlcjtcblxuICAgIGxvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgaXNQYWdlU2VsZWN0ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBpc0FsbFNlbGVjdGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgY29sdW1uQ2hvb3NlclZpc2libGUgPSBmYWxzZTtcbiAgICBjb2x1bW5DaG9vc2VyVHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgZXJyb3I6IE9ic2VydmFibGU8YW55PjtcbiAgICBwYWdlU2l6ZU9wdGlvbnMgPSBbMjUsIDUwLCAxMDBdO1xuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4aW11bUNvbHVtbnNOdW1iZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdCgxKTtcbiAgICByZWFkb25seSB2aXNpYmxlRGF0YUNvbHVtbnMkO1xuICAgIHJlYWRvbmx5IHZpc2libGVDb2x1bW5OYW1lcyQ7XG5cbiAgICBwcml2YXRlIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVudHJpZXNTZXJ2aWNlOiBOb2RlRW50cmllc1NlcnZpY2U8VD4sXG4gICAgICAgIHB1YmxpYyBlbnRyaWVzR2xvYmFsU2VydmljZTogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgcHJpdmF0ZSB0b2FzdDogVG9hc3QsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJCA9IHRoaXMuZ2V0VmlzaWJsZURhdGFDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbk5hbWVzJCA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbk5hbWVzKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNYXhpbXVtQ29sdW1uc051bWJlcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jaGFuZ2VkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLCBkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyU29ydENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBOb2RlRGF0YVNvdXJjZVJlbW90ZSkge1xuICAgICAgICAgICAgICAgICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgYXMgTm9kZURhdGFTb3VyY2VSZW1vdGUpLnNvcnRQYW5lbCA9IHRoaXMuc29ydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJFxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgZGVsYXkoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmNvbHVtbkNob29zZXJUcmlnZ2VyUmVhZHkgPSB0cnVlKSk7XG4gICAgICAgIHJ4anMuY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UkLnBpcGUoc3RhcnRXaXRoKHZvaWQgMCBhcyB2b2lkKSksXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLm9wdGlvbnMkLnBpcGUoc3RhcnRXaXRoKHZvaWQgMCBhcyB2b2lkKSksXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nU3ViamVjdC5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2hhbmdlZC5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMud2FpdEZvckluaXQoKS5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICBdKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9uUm93Q29udGV4dE1lbnUoeyBldmVudCwgbm9kZSB9OiB7IGV2ZW50OiBNb3VzZUV2ZW50IHwgRXZlbnQ7IG5vZGU6IFQgfSkge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAoeyBjbGllbnRYOiB0aGlzLmRyb3Bkb3duTGVmdCwgY2xpZW50WTogdGhpcy5kcm9wZG93blRvcCB9ID0gZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKHsgeDogdGhpcy5kcm9wZG93bkxlZnQsIHk6IHRoaXMuZHJvcGRvd25Ub3AgfSA9IChcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBtZW51IHRvIHJlZmxlY3QgY2hhbmdlZCBvcHRpb25zLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uY2FsbGJhY2tPYmplY3QgPSBub2RlO1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5uZ09uQ2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24uY2FuU2hvd0Ryb3Bkb3duKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVUcmlnZ2VyLm9wZW5NZW51KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3QudG9hc3QoJ05PX0FWQUlMQUJMRV9PUFRJT05TJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU29ydCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zb3J0LnNvcnQoe1xuICAgICAgICAgICAgaWQ6IHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydD8uYWN0aXZlLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydD8uZGlyZWN0aW9uIGFzICdhc2MnIHwgJ2Rlc2MnLFxuICAgICAgICAgICAgZGlzYWJsZUNsZWFyOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEZpeCBtaXNzaW5nIHNvcnRpbmcgaW5kaWNhdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjQyI2lzc3VlY29tbWVudC00NzA3MjY4MjkuIFNlZW1zXG4gICAgICAgIC8vIHRvIGJlIGZpeGVkIHVwc3RyZWFtIHdpdGggQW5ndWxhciAxMS5cbiAgICAgICAgKFxuICAgICAgICAgICAgdGhpcy5zb3J0LnNvcnRhYmxlcy5nZXQodGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Py5hY3RpdmUpIGFzIE1hdFNvcnRIZWFkZXJcbiAgICAgICAgKS5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHRvU3RhdGU6ICdhY3RpdmUnLFxuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgocXVlcnlQYXJhbXM6IFBhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydDogU29ydCA9IHF1ZXJ5UGFyYW1zLnNvcnQgPyBKU09OLnBhcnNlKHF1ZXJ5UGFyYW1zLnNvcnQpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChzb3J0ICYmIHNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0LnNvcnQoeyBpZDogc29ydC5hY3RpdmUsIHN0YXJ0OiBzb3J0LmRpcmVjdGlvbiwgZGlzYWJsZUNsZWFyOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAvLyBGaXggbWlzc2luZyBzb3J0aW5nIGluZGljYXRvcnMuIFNlZVxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjQyI2lzc3VlY29tbWVudC00NzA3MjY4MjkuIFNlZW1zXG4gICAgICAgICAgICAgICAgLy8gdG8gYmUgZml4ZWQgdXBzdHJlYW0gd2l0aCBBbmd1bGFyIDExLlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0LnNvcnRhYmxlcy5nZXQoc29ydC5hY3RpdmUpIGFzIE1hdFNvcnRIZWFkZXJcbiAgICAgICAgICAgICAgICApLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0b1N0YXRlOiAnYWN0aXZlJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5wYWdlSW5kZXggJiYgcXVlcnlQYXJhbXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSBxdWVyeVBhcmFtcy5wYWdlSW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSBxdWVyeVBhcmFtcy5wYWdlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJNYXhpbXVtQ29sdW1uc051bWJlcigpIHtcbiAgICAgICAgQm9yZGVyQm94T2JzZXJ2ZXJEaXJlY3RpdmUub2JzZXJ2ZUVsZW1lbnQodGhpcy5lbGVtZW50UmVmKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSxcbiAgICAgICAgICAgICAgICBtYXAoKGJveCkgPT4gdGhpcy5nZXRNYXhpbXVtQ29sdW1uc051bWJlcihib3gud2lkdGgpKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobWF4aW11bUNvbHVtbnNOdW1iZXIpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMubWF4aW11bUNvbHVtbnNOdW1iZXIkLm5leHQobWF4aW11bUNvbHVtbnNOdW1iZXIpKSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXhpbXVtQ29sdW1uc051bWJlcih0YWJsZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0b3RhbCB3aWR0aCBvZiBhbHdheXMgdmlzaWJsZSBjb2x1bW5zIGxpa2UgY2hlY2tib3hlcyBhbmQgaWNvbnMuXG4gICAgICAgICAgICAgICAgKHRhYmxlV2lkdGggLSAxODcpIC9cbiAgICAgICAgICAgICAgICAgICAgLy8gRGl2aWRlIGJ5IHdpdGggb2YgZGF0YSBjb2x1bW5zIChpbmNsdWRpbmcgbWFyZ2luKS5cbiAgICAgICAgICAgICAgICAgICAgMTI2LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZpc2libGVEYXRhQ29sdW1ucygpOiBPYnNlcnZhYmxlPExpc3RJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIHJ4anNcbiAgICAgICAgICAgIC5jb21iaW5lTGF0ZXN0KFt0aGlzLm1heGltdW1Db2x1bW5zTnVtYmVyJCwgdGhpcy5lbnRyaWVzU2VydmljZS5jb2x1bW5zU3ViamVjdF0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKFttYXhpbXVtQ29sdW1uc051bWJlciwgY29sdW1uc10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjb2x1bW5zID8/IFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCA8IG1heGltdW1Db2x1bW5zTnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlQ29sdW1uTmFtZXMoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlRGF0YUNvbHVtbnMkLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHZpc2libGVEYXRhQ29sdW1ucykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbnRyaWVzU2VydmljZS5jaGVja2JveCkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goJ3NlbGVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goJ2ljb24nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5jb25jYXQodmlzaWJsZURhdGFDb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKSkuY29uY2F0KFsnYWN0aW9ucyddKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaXNTb3J0YWJsZShjb2x1bW46IExpc3RJdGVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQ/LmNvbHVtbnM/LnNvbWUoXG4gICAgICAgICAgICAoYykgPT4gYy50eXBlID09PSBjb2x1bW4udHlwZSAmJiBjLm5hbWUgPT09IGNvbHVtbi5uYW1lLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRvZ2dsZUFsbChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmdldERhdGEoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclNvcnRDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLnNvcnQuc29ydENoYW5nZS5zdWJzY3JpYmUoKHNvcnQ6IFNvcnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydC5hY3RpdmUgPSBzb3J0LmFjdGl2ZTtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydC5kaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydENoYW5nZS5lbWl0KHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydCk7XG4gICAgICAgICAgICAvKnRoaXMucm91dGVyLm5hdmlnYXRlKFsnLiddLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBzb3J0OiBKU09OLnN0cmluZ2lmeShzb3J0KSB9LFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICAgIH0pOyovXG4gICAgICAgIH0pO1xuICAgICAgICAvKlxuICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBBcyBhIHJlc3BvbnNlIHRvIGNoYW5nZXMgb2Ygb3RoZXIgcGFyYW1ldGVycywgdGhlIHBhZ2VJbmRleCBtaWdodCBiZSByZXNldCB0byAwIGFuZCBhXG4gICAgICAgICAgICAgICAgLy8gcGFnZSBldmVudCB0cmlnZ2Vycy4gVGhpcyBjaGFuZ2Ugb2Ygb3RoZXIgcGFyYW1ldGVycyBpcyBsaWtlbHkgdG8gY2F1c2UgYVxuICAgICAgICAgICAgICAgIC8vIGByb3V0ZXIubmF2aWdhdGUoKWAgY2FsbCBlbHNld2hlcmUuIFdoZW4gdGhpcyBoYXBwZW5zIGp1c3QgYmVmb3JlIG91ciBjYWxsLCBvdXJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGFyZSBpZ25vcmVkLiBUbyBzaGllbGQgYWdhaW5zdCB0aGlzLCB3ZSB3YWl0IGEgdGljay5cbiAgICAgICAgICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgcGFnZUluZGV4LCBwYWdlU2l6ZSB9OiBQYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nXSwge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBwYWdlSW5kZXgsIHBhZ2VTaXplIH0sXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICovXG4gICAgfVxuXG4gICAgY2FuRHJvcCA9IChkcmFnRGF0YTogRHJhZ0RhdGE8VD4pOiBDYW5Ecm9wID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3AuZHJvcEFsbG93ZWQ/LihkcmFnRGF0YSk7XG4gICAgfTtcblxuICAgIGRyb3AoZHJhZ0RhdGE6IERyYWdEYXRhPE5vZGU+KSB7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3AuZHJvcHBlZChkcmFnRGF0YS50YXJnZXQsIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGRyYWdEYXRhLmRyYWdnZWROb2RlcyxcbiAgICAgICAgICAgIG1vZGU6IGRyYWdEYXRhLmFjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RHJhZ0RhdGEobm9kZTogVCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW25vZGVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EcmFnU3RhcnRlZChub2RlOiBUKSB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uRHJhZ0VuZGVkKCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsb2FkRGF0YShzb3VyY2U6ICdzY3JvbGwnIHwgJ2J1dHRvbicpIHtcbiAgICAgICAgLy8gVE9ETzogZm9jdXMgbmV4dCBpdGVtIHdoZW4gdHJpZ2dlcmVkIHZpYSBidXR0b24uXG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UubG9hZE1vcmUoc291cmNlKTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuTWVudShub2RlOiBUKSB7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdChub2RlKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xpY2tTb3VyY2UgPSBDbGlja1NvdXJjZS5Ecm9wZG93bjtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHBsaWNhdGlvblJlZi50aWNrKCk7XG4gICAgICAgIHRoaXMuZHJvcGRvd24ubWVudS5mb2N1c0ZpcnN0SXRlbSgpO1xuICAgIH1cblxuICAgIGlzQmxvY2tlZChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLnByb3BlcnRpZXM/LltSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX0lNUE9SVF9CTE9DS0VEXT8uWzBdID09PSAndHJ1ZSc7XG4gICAgfVxufVxuIiwiPGVzLWRyb3Bkb3duICNkcm9wZG93biBbb3B0aW9uc109XCJlbnRyaWVzU2VydmljZS5vcHRpb25zPy5bVGFyZ2V0Lkxpc3REcm9wZG93bl1cIj48L2VzLWRyb3Bkb3duPlxuPGJ1dHRvblxuICAjbWVudVRyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiXG4gIG1hdC1idXR0b25cbiAgY2xhc3M9XCJkcm9wZG93bi1kdW1teSBjZGstdmlzdWFsbHktaGlkZGVuXCJcbiAgW3N0eWxlLmxlZnQucHhdPVwiZHJvcGRvd25MZWZ0XCJcbiAgW3N0eWxlLnRvcC5weF09XCJkcm9wZG93blRvcFwiXG4gIFttYXRNZW51VHJpZ2dlckZvcl09XCJkcm9wZG93bi5tZW51XCJcbiAgdGFiaW5kZXg9XCItMVwiXG4gIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4+PC9idXR0b24+XG48ZXMtbm9kZS1lbnRyaWVzLWdsb2JhbC1vcHRpb25zXG4gICpuZ0lmPVwiKGVudHJpZXNTZXJ2aWNlLmdsb2JhbE9wdGlvbnNTdWJqZWN0IHwgYXN5bmMpPy5sZW5ndGhcIlxuICBbZGlzcGxheVR5cGVdPVwiTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5UYWJsZVwiXG4+XG48L2VzLW5vZGUtZW50cmllcy1nbG9iYWwtb3B0aW9ucz5cbjxtYXQtdGFibGVcbiAgW2RhdGFTb3VyY2VdPVwiZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZVwiXG4gIG1hdFNvcnRcbiAgW21hdFNvcnREaXNhYmxlQ2xlYXJdPVwidHJ1ZVwiXG4gIFttYXRTb3J0QWN0aXZlXT1cImVudHJpZXNTZXJ2aWNlLnNvcnQ/LmFjdGl2ZVwiXG4gIFttYXRTb3J0RGlyZWN0aW9uXT1cImVudHJpZXNTZXJ2aWNlLnNvcnQ/LmRpcmVjdGlvblwiXG4gIGVzSW5maW5pdGVTY3JvbGxcbiAgKHNjcm9sbGVkKT1cImxvYWREYXRhKCdzY3JvbGwnKVwiXG4+XG4gIDwhLS0gQ2hlY2tib3ggQ29sdW1uIC0tPlxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgIFtuZ01vZGVsXT1cImVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwXCJcbiAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiXG4gICAgICAgICAgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoICE9PSBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmdldERhdGEoKS5sZW5ndGhcbiAgICAgICAgXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlQWxsKCRldmVudClcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBhcmlhLWxhYmVsPVwie3sgJ0xJU1RfVEFCTEUuVE9HR0xFX0FMTCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgPjwvbWF0LWNoZWNrYm94PlxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBub2RlXCI+XG4gICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgIFtjaGVja2VkXT1cImVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJlbnRyaWVzU2VydmljZS5vbkNoZWNrYm94Q2hhbmdlZChub2RlLCAkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwie3sgJ1NFTEVDVCcgfCB0cmFuc2xhdGUgOiB7IGVsZW1lbnQ6IChub2RlIHwgbm9kZVRpdGxlKSB9IH19XCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgID48L21hdC1jaGVja2JveD5cbiAgICA8L21hdC1jZWxsPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBtYXRDb2x1bW5EZWY9XCJpY29uXCI+XG4gICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImNlbGwtaWNvbiBjZWxsLWNvdW50XCI+XG4gICAgICAoe3sgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFxuICAgICAgfX08bmctY29udGFpbmVyICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZT8uZ2V0VG90YWwoKSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgIC8ge3sgZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZT8uZ2V0VG90YWwoKSB9fTwvbmctY29udGFpbmVyXG4gICAgICA+KVxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBub2RlXCIgY2xhc3M9XCJjZWxsLWljb25cIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuRGVmYXVsdEFjdGlvbkxpbmtcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbjsgY29udGV4dDogeyBub2RlOiB0aGlzLm5vZGUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLm9uQ2xpY2tlZCh7IGV2ZW50OiAkZXZlbnQsIGVsZW1lbnQ6IG5vZGUsIHNvdXJjZTogQ2xpY2tTb3VyY2UuSWNvbiB9KVxuICAgICAgICBcIlxuICAgICAgICAoZGJsY2xpY2spPVwiZW50cmllc1NlcnZpY2UuZGJsQ2xpY2tJdGVtLmVtaXQoeyBlbGVtZW50OiBub2RlLCBzb3VyY2U6IENsaWNrU291cmNlLkljb24gfSlcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uOyBjb250ZXh0OiB7IG5vZGU6IHRoaXMubm9kZSB9XCJcbiAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICBlbnRyaWVzU2VydmljZS5vbkNsaWNrZWQoeyBldmVudDogJGV2ZW50LCBlbGVtZW50OiBub2RlLCBzb3VyY2U6IENsaWNrU291cmNlLkljb24gfSlcbiAgICAgICAgICBcIlxuICAgICAgICAgIChkYmxjbGljayk9XCJlbnRyaWVzU2VydmljZS5kYmxDbGlja0l0ZW0uZW1pdCh7IGVsZW1lbnQ6IG5vZGUsIHNvdXJjZTogQ2xpY2tTb3VyY2UuSWNvbiB9KVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmNvbmZpZ3VyZUNvbHVtbnNcIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cImNvbHVtbkNob29zZXJWaXNpYmxlID0gIWNvbHVtbkNob29zZXJWaXNpYmxlXCJcbiAgICAgICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICAgICAjY29sdW1uQ2hvb3NlclRyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiJ0xJU1RfVEFCTEUuQ09ORklHVVJFX0NPTFVNTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTElTVF9UQUJMRS5DT05GSUdVUkVfQ09MVU1OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgPlxuICAgICAgICA8aSBlc0ljb249XCJzZXR0aW5nc1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBub2RlXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLm9wdGlvbnM/LltUYXJnZXQuTGlzdF0/Lmxlbmd0aFwiXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIChjbGljayk9XCJvcGVuTWVudShub2RlKVwiXG4gICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJkcm9wZG93bi5tZW51XCJcbiAgICAgID5cbiAgICAgICAgPGkgZXNJY29uPVwibW9yZV92ZXJ0XCIgW2FyaWFdPVwidHJ1ZVwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuICA8IS0tIERhdGEgQ29sdW1ucyAtLT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZURhdGFDb2x1bW5zJCB8IGFzeW5jOyBsZXQgZmlyc3QgPSBmaXJzdFwiXG4gICAgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyPlxuICAgICAgPG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICBtYXQtc29ydC1oZWFkZXJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiEoZW50cmllc1NlcnZpY2Uuc29ydD8uYWxsb3dlZCAmJiBpc1NvcnRhYmxlKGNvbHVtbikpXCJcbiAgICAgICAgW2NsYXNzLm1hdC1jb2x1bW4tcHJpbWFyeV09XCJmaXJzdFwiXG4gICAgICAgID57eyBjb2x1bW4gfCBlc0xpc3RJdGVtTGFiZWwgfCBhc3luYyB9fTwvbWF0LWhlYWRlci1jZWxsXG4gICAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG1hdC1jZWxsXG4gICAgICAqbWF0Q2VsbERlZj1cImxldCBub2RlXCJcbiAgICAgICNjZWxsXG4gICAgICBbY2xhc3MubWF0LWNvbHVtbi1wcmltYXJ5XT1cImZpcnN0XCJcbiAgICAgIGF0dHIuZGF0YS10ZXN0PVwidGFibGUtY2VsbC17eyBjb2x1bW4ubmFtZSB9fVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmVsZW1lbnRJbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGlua1wiXG4gICAgICA+XG4gICAgICAgIDxlcy1ub2RlLXVybCBjZGtNb25pdG9yU3VidHJlZUZvY3VzIFtub2RlXT1cIm5vZGVcIiBbbW9kZV09XCJmaXJzdCA/ICdsaW5rJyA6ICd3cmFwcGVyJ1wiPlxuICAgICAgICAgIDxlcy1saXN0LWJhc2VcbiAgICAgICAgICAgIFtmb3JjZVRleHRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgIFtpdGVtXT1cImNvbHVtblwiXG4gICAgICAgICAgICBlc0NoZWNrVGV4dE92ZXJmbG93XG4gICAgICAgICAgICAjdGV4dD1cImVzQ2hlY2tUZXh0T3ZlcmZsb3dcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwidGV4dC5oYXNUZXh0T3ZlcmZsb3coKSA/IGNlbGwuaW5uZXJUZXh0IDogbnVsbFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwVG91Y2hHZXN0dXJlcz1cIm9mZlwiXG4gICAgICAgICAgPjwvZXMtbGlzdC1iYXNlPlxuICAgICAgICA8L2VzLW5vZGUtdXJsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZXMtbGlzdC1iYXNlXG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgICAgW2ZvcmNlVGV4dF09XCJ0cnVlXCJcbiAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgIFtpdGVtXT1cImNvbHVtblwiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBlbnRyaWVzU2VydmljZS5vbkNsaWNrZWQoe1xuICAgICAgICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG5vZGUsXG4gICAgICAgICAgICBzb3VyY2U6IENsaWNrU291cmNlLk1ldGFkYXRhLFxuICAgICAgICAgICAgYXR0cmlidXRlOiBjb2x1bW4sXG4gICAgICAgICAgfSlcbiAgICAgICAgXCJcbiAgICAgICAgKGRibGNsaWNrKT1cIlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLmRibENsaWNrSXRlbS5lbWl0KHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IG5vZGUsXG4gICAgICAgICAgICBzb3VyY2U6IENsaWNrU291cmNlLk1ldGFkYXRhLFxuICAgICAgICAgICAgYXR0cmlidXRlOiBjb2x1bW4sXG4gICAgICAgICAgfSlcbiAgICAgICAgXCJcbiAgICAgID48L2VzLWxpc3QtYmFzZT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXJzdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpbGRvYmplY3RzXCIgKm5nSWY9XCJub2RlLnByb3BlcnRpZXM/LlsndmlydHVhbDpjaGlsZG9iamVjdGNvdW50J10gPiAwXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjaGlsZG9iamVjdC1jb3VudFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwie3tcbiAgICAgICAgICAgICAgJ0NISUxET0JKRUNUX0NPVU5UJ1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlIDogeyBjb3VudDogbm9kZS5wcm9wZXJ0aWVzWyd2aXJ0dWFsOmNoaWxkb2JqZWN0Y291bnQnXSAqIDEgKyAxIH1cbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3Bhbj57eyBub2RlLnByb3BlcnRpZXNbJ3ZpcnR1YWw6Y2hpbGRvYmplY3Rjb3VudCddICogMSArIDEgfX08L3NwYW5cbiAgICAgICAgICAgID48aSBlc0ljb249XCJmaWx0ZXJfbm9uZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1jZWxsPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG1hdC1oZWFkZXItcm93IG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJ2aXNpYmxlQ29sdW1uTmFtZXMkIHwgYXN5bmNcIj48L21hdC1oZWFkZXItcm93PlxuICA8bWF0LXJvd1xuICAgIG1hdC1yb3dcbiAgICBtYXRSaXBwbGVcbiAgICBjZGtEcmFnXG4gICAgZXNOb2Rlc0RyYWdcbiAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIiFlbnRyaWVzU2VydmljZS5kcmFnRHJvcD8uZHJhZ0FsbG93ZWQgfHwgKHVpLmlzVG91Y2hTdWJqZWN0IHwgYXN5bmMpXCJcbiAgICBbY2RrRHJhZ0RhdGFdPVwiZ2V0RHJhZ0RhdGEobm9kZSlcIlxuICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKG5vZGUpXCJcbiAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uRHJhZ0VuZGVkKClcIlxuICAgIFtlc05vZGVzRHJvcFRhcmdldF09XCJub2RlXCJcbiAgICBbY2FuRHJvcE5vZGVzXT1cImNhbkRyb3BcIlxuICAgIChub2RlRHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxuICAgIGNsYXNzPVwibWF0LXJvd1wiXG4gICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwiZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIlxuICAgIFtjbGFzcy5tYXQtcm93LWltcG9ydC1ibG9ja2VkXT1cImlzQmxvY2tlZChub2RlKVwiXG4gICAgW2NsYXNzLnNlbGVjdGVkLXdoZW4tZHJhZ2dpbmddPVwiaXNEcmFnZ2luZyAmJiBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgW2NsYXNzLm1hdC1yb3ctdmlydHVhbF09XCJub2RlLnZpcnR1YWxcIlxuICAgIFtjbGFzcy5tYXQtcm93LXZpcnR1YWwtZmlyc3RdPVwiXG4gICAgICBub2RlLnZpcnR1YWwgJiYgISRhbnkoZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKClbaSAtIDFdKT8udmlydHVhbFxuICAgIFwiXG4gICAgW2NsYXNzLm1hdC1yb3ctdmlydHVhbC1sYXN0XT1cIlxuICAgICAgbm9kZS52aXJ0dWFsICYmICEkYW55KGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuZ2V0RGF0YSgpW2kgKyAxXSk/LnZpcnR1YWxcbiAgICBcIlxuICAgIFtjbGFzcy5keW5hbWljLXNpbmdsZS1jbGlja109XCJlbnRyaWVzU2VydmljZS5zaW5nbGVDbGlja0hpbnQgPT09ICdkeW5hbWljJ1wiXG4gICAgKm1hdFJvd0RlZj1cImxldCBub2RlOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3Q7IGNvbHVtbnM6IHZpc2libGVDb2x1bW5OYW1lcyQgfCBhc3luY1wiXG4gICAgKGNvbnRleHRtZW51KT1cIm9uUm93Q29udGV4dE1lbnUoeyBldmVudDogJGV2ZW50LCBub2RlOiBub2RlIH0pXCJcbiAgICAoa2V5ZG93bi5Db250ZXh0TWVudSk9XCJvblJvd0NvbnRleHRNZW51KHsgZXZlbnQ6ICRldmVudCwgbm9kZTogbm9kZSB9KVwiXG4gID5cbiAgICA8ZXMtZHJhZy1wcmV2aWV3XG4gICAgICAqY2RrRHJhZ1ByZXZpZXdcbiAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgW3NlbGVjdGVkXT1cImVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZFwiXG4gICAgICBbaXRlbV09XCIodmlzaWJsZURhdGFDb2x1bW5zJCB8IGFzeW5jKVswXVwiXG4gICAgPjwvZXMtZHJhZy1wcmV2aWV3PlxuICA8L21hdC1yb3c+XG48L21hdC10YWJsZT5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJcbiAgICAoZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0xvYWRpbmdTdWJqZWN0IHwgYXN5bmMpID09PSBmYWxzZSAmJlxuICAgIGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaGFzTW9yZSgpICYmXG4gICAgZW50cmllc1NlcnZpY2UucGFnaW5hdGlvblN0cmF0ZWd5ID09PSAnaW5maW5pdGUtc2Nyb2xsJ1xuICBcIlxuPlxuICA8ZGl2IGNsYXNzPVwibG9hZC1tb3JlXCI+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJsb2FkRGF0YSgnYnV0dG9uJylcIj5cbiAgICAgIDxpIGVzSWNvbj1cInJlZnJlc2hcIj48L2k+XG4gICAgICA8c3Bhbj57eyAnTE9BRF9NT1JFJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZ1N1YmplY3QgfCBhc3luY1wiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPiA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuPCEtLVxuPG1hdC1wYWdpbmF0b3IgI3BhZ2luYXRvciBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiPjwvbWF0LXBhZ2luYXRvcj5cbi0tPlxuXG48IS0tIFdhaXQgZm9yIHJlYWR5IHN0YXRlIHRvIGF2b2lkIGNoYW5nZWQtYWZ0ZXItY2hlY2tlZCBlcnJvciB3aGVuIGBjb2x1bW5DaG9vc2VyVHJpZ2dlcmAgYmVjb21lc1xuYXZhaWxhYmxlLiAtLT5cbjxlcy1jb2x1bW4tY2hvb3NlclxuICAqbmdJZj1cImNvbHVtbkNob29zZXJUcmlnZ2VyUmVhZHlcIlxuICBbKGNvbHVtbnMpXT1cImVudHJpZXNTZXJ2aWNlLmNvbHVtbnNcIlxuICBbKGNvbHVtbkNob29zZXJWaXNpYmxlKV09XCJjb2x1bW5DaG9vc2VyVmlzaWJsZVwiXG4gIFtvcmlnaW5dPVwiY29sdW1uQ2hvb3NlclRyaWdnZXJcIlxuPjwvZXMtY29sdW1uLWNob29zZXI+XG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxlcy1zcGlubmVyPjwvZXMtc3Bpbm5lcj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2ljb24gbGV0LW5vZGU9XCJub2RlXCI+XG4gIDxkaXYgY2xhc3M9XCJpY29uLWJnXCI+XG4gICAgPGltZ1xuICAgICAgKm5nSWY9XCJub2RlLmljb25VUkxcIlxuICAgICAgW3NyY109XCJub2RlIHwgZXNOb2RlSWNvbiB8IGFzeW5jXCJcbiAgICAgIFthbHRdPVwiXG4gICAgICAgIG5vZGUubWVkaWF0eXBlXG4gICAgICAgICAgPyAoJ05PREUubWVkaWF0eXBlJyB8IHRyYW5zbGF0ZSkgKyAnOiAnICsgKCdNRURJQVRZUEUuJyArIG5vZGUubWVkaWF0eXBlIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogJydcbiAgICAgIFwiXG4gICAgICBbbWF0VG9vbHRpcF09XCJcbiAgICAgICAgbm9kZS5tZWRpYXR5cGVcbiAgICAgICAgICA/ICgnTk9ERS5tZWRpYXR5cGUnIHwgdHJhbnNsYXRlKSArICc6ICcgKyAoJ01FRElBVFlQRS4nICsgbm9kZS5tZWRpYXR5cGUgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAnJ1xuICAgICAgXCJcbiAgICAgIG1hdFRvb2x0aXBUb3VjaEdlc3R1cmVzPVwib2ZmXCJcbiAgICAvPlxuICAgIDxpXG4gICAgICAqbmdJZj1cIiFub2RlLmljb25VUkxcIlxuICAgICAgW2VzSWNvbl09XCJub2RlLmF1dGhvcml0eVR5cGUgPyAobm9kZS5hdXRob3JpdHlUeXBlID09PSAnR1JPVVAnID8gJ2dyb3VwJyA6ICdwZXJzb24nKSA6IG51bGxcIlxuICAgID48L2k+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -166,12 +166,17 @@ export class NodeEntriesWrapperComponent {
166
166
  return;
167
167
  }
168
168
  this.dataSource.getData().forEach((d) => {
169
- let hits = nodes.filter((n) => n.ref.id === d.ref.id);
169
+ let hits = nodes.filter((n) => n?.ref
170
+ ? n?.ref.id === d?.ref.id
171
+ : n?.authorityName ===
172
+ d?.authorityName);
170
173
  if (hits.length === 0) {
171
174
  // handle if the original has changed (for collection refs)
172
- hits = nodes.filter((n) => n.ref.id === d.originalId);
175
+ hits = nodes.filter((n) => n?.ref &&
176
+ n?.ref?.id === d?.originalId);
173
177
  }
174
178
  if (hits.length === 1) {
179
+ console.log('copy', d, hits);
175
180
  this.nodeHelperService.copyDataToNode(d, hits[0]);
176
181
  }
177
182
  });
@@ -328,4 +333,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
328
333
  }], displayTypeChanged: [{
329
334
  type: Output
330
335
  }] } });
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXdyYXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXdyYXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBS0wsTUFBTSxFQUtOLFNBQVMsR0FHWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRS9FLE9BQU8sRUFHSCxlQUFlLEVBUWYsc0JBQXNCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQXdCLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFJNUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7QUFXbkYsTUFBTSxPQUFPLDJCQUEyQjtJQXFGcEMsWUFDWSxnQkFBa0MsRUFDbEMsdUJBQWdELEVBQ2hELE1BQWMsRUFDZCxjQUFxQyxFQUN0QyxhQUF1QyxFQUN0QyxpQkFBb0MsRUFDcEMsU0FBb0I7SUFDNUIsUUFBUTtJQUNSLG1DQUFtQztJQUMzQixnQkFBNkMsRUFDN0MsaUJBQW9DLEVBQ3BDLFVBQXNCO1FBWHRCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsNEJBQXVCLEdBQXZCLHVCQUF1QixD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QkFJRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFNpbXBsZUNoYW5nZSxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4vbm9kZS1lbnRyaWVzLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzQ29tcG9uZW50IH0gZnJvbSAnLi9ub2RlLWVudHJpZXMuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgRmV0Y2hFdmVudCxcbiAgICBHcmlkQ29uZmlnLFxuICAgIEludGVyYWN0aW9uVHlwZSxcbiAgICBMaXN0RHJhZ0dyb3BDb25maWcsXG4gICAgTGlzdEV2ZW50SW50ZXJmYWNlLFxuICAgIExpc3RPcHRpb25zLFxuICAgIExpc3RPcHRpb25zQ29uZmlnLFxuICAgIExpc3RTb3J0Q29uZmlnLFxuICAgIE5vZGVDbGlja0V2ZW50LFxuICAgIE5vZGVFbnRyaWVzRGF0YVR5cGUsXG4gICAgTm9kZUVudHJpZXNEaXNwbGF5VHlwZSxcbn0gZnJvbSAnLi9lbnRyaWVzLW1vZGVsJztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlIH0gZnJvbSAnLi9ub2RlLWRhdGEtc291cmNlJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL3V0aWwvaGVscGVyJztcbmltcG9ydCB7IEN1c3RvbVNlbGVjdGlvbk1vZGVsLCBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBPcHRpb25JdGVtLCBTY29wZSB9IGZyb20gJy4uL3R5cGVzL29wdGlvbi1pdGVtJztcbmltcG9ydCB7IE5vZGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbm9kZS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4uL3R5cGVzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBUZW1wb3JhcnlTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RlbXBvcmFyeS1zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlZmVyZW5jZSwgTm9kZSwgVXNlciB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgVmlydHVhbE5vZGUgfSBmcm9tICcuLi90eXBlcy9hcGktbW9kZWxzJztcbmltcG9ydCB7IE9wdGlvbnNIZWxwZXJEYXRhU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29wdGlvbnMtaGVscGVyLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1ub2RlLWVudHJpZXMtd3JhcHBlcicsXG4gICAgdGVtcGxhdGU6IGA8ZXMtbm9kZS1lbnRyaWVzXG4gICAgICAgICNub2RlRW50cmllc0NvbXBvbmVudFxuICAgICAgICAqbmdJZj1cIiFjdXN0b21Ob2RlTGlzdENvbXBvbmVudFwiXG4gICAgPjwvZXMtbm9kZS1lbnRyaWVzPmAsXG4gICAgcHJvdmlkZXJzOiBbTm9kZUVudHJpZXNTZXJ2aWNlLCBPcHRpb25zSGVscGVyRGF0YVNlcnZpY2UsIE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzV3JhcHBlckNvbXBvbmVudDxUIGV4dGVuZHMgTm9kZUVudHJpZXNEYXRhVHlwZT5cbiAgICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIExpc3RFdmVudEludGVyZmFjZTxUPlxue1xuICAgIC8qKlxuICAgICAqIHRpdGxlIChhYm92ZSkgdGhlIHRhYmxlL2dyaWRcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKCd0aXRsZScpIHRpdGxlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKlxuICAgICAqIGRhdGEgc2hvd24gd2hlbiBkYXRhIHNvdXJjZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ2VtcHR5JykgZW1wdHlSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgLyoqXG4gICAgICogY3VzdG9tIGFyZWEgZm9yIGFjdGlvbnMgb25seSBmb3IgTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWQgKHBlciBjYXJkIGF0IHRoZSBib3R0b20pXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZCgnYWN0aW9uQXJlYScpIGFjdGlvbkFyZWFSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgLyoqXG4gICAgICogY3VzdG9tIGFyZWEgZm9yIGFuIG92ZXJsYXkgXCJhYm92ZVwiIGVhY2ggY2FyZCAoaS5lLiB0byBzaG93IGRpc2FibGVkIGluZm9zKSwgb25seSBmb3IgTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWQgJiBvZGVFbnRyaWVzRGlzcGxheVR5cGUuR3JpZFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ292ZXJsYXknKSBvdmVybGF5UmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBWaWV3Q2hpbGQoJ25vZGVFbnRyaWVzQ29tcG9uZW50Jykgbm9kZUVudHJpZXNDb21wb25lbnRSZWY6IE5vZGVFbnRyaWVzQ29tcG9uZW50PFQ+O1xuICAgIEBJbnB1dCgpIGRhdGFTb3VyY2U6IE5vZGVEYXRhU291cmNlPFQ+O1xuICAgIEBJbnB1dCgpIHNjb3BlOiBTY29wZTtcbiAgICBASW5wdXQoKSBjb2x1bW5zOiBMaXN0SXRlbVtdO1xuICAgIEBJbnB1dCgpIGNvbmZpZ3VyZUNvbHVtbnM6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2hlY2tib3ggPSB0cnVlO1xuICAgIEBPdXRwdXQoKSBjb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0SXRlbVtdPigpO1xuICAgIEBJbnB1dCgpIGdsb2JhbE9wdGlvbnM6IE9wdGlvbkl0ZW1bXTtcbiAgICBASW5wdXQoKSBkaXNwbGF5VHlwZSA9IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUuR3JpZDtcbiAgICBAT3V0cHV0KCkgZGlzcGxheVR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVFbnRyaWVzRGlzcGxheVR5cGU+KCk7XG4gICAgQElucHV0KCkgZWxlbWVudEludGVyYWN0aW9uVHlwZSA9IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGluaztcbiAgICBASW5wdXQoKSBzb3J0OiBMaXN0U29ydENvbmZpZztcbiAgICBASW5wdXQoKSBkcmFnRHJvcDogTGlzdERyYWdHcm9wQ29uZmlnPFQ+O1xuICAgIEBJbnB1dCgpIGdyaWRDb25maWc6IEdyaWRDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbG9yIGRlZmluZXMgdGhlIGJhc2UgY29sb3Igb2YgZ3JhZGllbnRzIHZpc3VhbGx5IGxpbWl0aW5nIGEgZ3JpZCBpbiBzY3JvbGwgZGlyZWN0aW9uLlxuICAgICAqIERlZmF1bHRzIHRvIHdoaXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNjcm9sbEdyYWRpZW50Q29sb3I6IHN0cmluZyA9ICcjZmZmJztcblxuICAgIC8qKlxuICAgICAqIHRoaXMgY2FuIGJlIHNldCBpbnN0ZWFkIG9mIGNhbGxpbmcgaW5pdE9wdGlvbnNHZW5lcmF0b3IoKVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGluaXRDb25maWc6IExpc3RPcHRpb25zQ29uZmlnO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyBub2RlLWVudHJpZXMgaW5zdGFuY2UgcmVwcmVzZW50cyB0aGUgcGFnZSdzIG1haW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIE9ubHkgc2V0IHRvIHRydWUgZm9yIG9uZSBpbnN0YW5jZSBwZXIgcGFnZS5cbiAgICAgKlxuICAgICAqIElmIHRydWUsIHRoaXMgaW5zdGFuY2Ugd2lsbFxuICAgICAqIC0gaGFuZGxlIHBhZ2Utd2lkZSBrZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgKiAtIHRha2UgY29udHJvbCBvZiB0aGUgYHBhZ2VgIGFuZCBgcGFnZVNpemVgIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHBhZ2luYXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwcmltYXJ5SW5zdGFuY2U6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVUkgaGludHMgZm9yIHdoZXRoZXIgYSBzaW5nbGUgY2xpY2sgd2lsbCBjYXVzZSBhIGR5bmFtaWMgYWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBkb2VzIG5vdCBjb25maWd1cmUgdGhlIGFjdHVhbCBiZWhhdmlvciBidXQgb25seSBVSSBoaW50cyB0byB0aGUgdXNlci4gSGludHMgaW5jbHVkZVxuICAgICAqIGhvdmVyIGVmZmVjdHMgYW5kIGEgY2hhbmdlZCBjdXJzb3IuXG4gICAgICpcbiAgICAgKiAtIFdoZW4gY2hvb3NpbmcgJ3N0YXRpYycsIHRoZSBgY2xpY2tJdGVtYCBldmVudCBzaG91bGQgdHJpZ2dlciBzb21lIHN0YXRpb25hcnkgYWN0aW9uIGxpa2VcbiAgICAgKiAgIHNlbGVjdGluZyB0aGUgZWxlbWVudCBvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGluIGEgY29tcGxlbWVudGFyeSBwYWdlIGFyZWEuIFRoZVxuICAgICAqICAgYGRibENsaWNrSXRlbWAgZXZlbnQgY2FuIGJlIHVzZWQgZm9yIGEgbW9yZSBkaXNydXB0aXZlIGFjdGlvbi5cbiAgICAgKiAtIFdoZW4gY2hvb3NpbmcgJ2R5bmFtaWMnLCB0aGUgYGNsaWNrSXRlbWAgZXZlbnQgc2hvdWxkIHRyaWdnZXIgYSBtYWpvciBhY3Rpb24gbGlrZVxuICAgICAqICAgbmF2aWdhdGluZyB0byBhIG5ldyBwYWdlIG9yIGNsb3NpbmcgYSBkaWFsb2cuXG4gICAgICovXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgY29udHJvbGxpbmcgdGhlIHVpIGhpbnRzIGFuZCB0aGUgYWN0dWFsIGJlaGF2aW9yIHdpdGggYSBzaW5nbGUgb3B0aW9uLlxuICAgIEBJbnB1dCgpIHNpbmdsZUNsaWNrSGludDogJ2R5bmFtaWMnIHwgJ3N0YXRpYycgPSAnZHluYW1pYyc7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGxvYWQgbW9yZSBkYXRhIG9uIHNjcm9sbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlSW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBmZXRjaERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPEZldGNoRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGNsaWNrSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+KCk7XG4gICAgQE91dHB1dCgpIGRibENsaWNrSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+KCk7XG4gICAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RTb3J0Q29uZmlnPigpO1xuICAgIEBPdXRwdXQoKSB2aXJ0dWFsTm9kZXNBZGRlZDtcbiAgICBAT3V0cHV0KCkgZGlzcGxheVR5cGVDaGFuZ2VkO1xuXG4gICAgY3VzdG9tTm9kZUxpc3RDb21wb25lbnQ6IFR5cGU8Tm9kZUVudHJpZXNDb21wb25lbnQ8VD4+O1xuICAgIHByaXZhdGUgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8Tm9kZUVudHJpZXNDb21wb25lbnQ8VD4+O1xuICAgIHByaXZhdGUgb3B0aW9uczogTGlzdE9wdGlvbnM7XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSB0ZW1wb3JhcnlTdG9yYWdlU2VydmljZTogVGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgZW50cmllc1NlcnZpY2U6IE5vZGVFbnRyaWVzU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIG9wdGlvbnNIZWxwZXI6IE9wdGlvbnNIZWxwZXJEYXRhU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub2RlSGVscGVyU2VydmljZTogTm9kZUhlbHBlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdWlTZXJ2aWNlOiBVSVNlcnZpY2UsXG4gICAgICAgIC8vIEBUT0RPXG4gICAgICAgIC8vIHByaXZhdGUgbWFpbk5hdjogTWFpbk5hdlNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVzU2VydmljZTogTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICkge1xuICAgICAgICAvLyByZWd1bGFyeSByZS1iaW5kIHRlbXBsYXRlIHNpbmNlIGl0IG1pZ2h0IGhhdmUgdXBkYXRlZCB3aXRob3V0IG5nQ2hhbmdlcyB0cmlnZ2VyXG4gICAgICAgIC8qXG4gICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxuICAgICAgICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZW1wdHlSZWYgPSB0aGlzLmVtcHR5UmVmKVxuICAgICAgICApO1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLnZpcnR1YWxOb2Rlc0FkZGVkID0gdGhpcy5vcHRpb25zSGVscGVyLnZpcnR1YWxOb2Rlc0FkZGVkO1xuICAgICAgICB0aGlzLmRpc3BsYXlUeXBlQ2hhbmdlZCA9IHRoaXMub3B0aW9uc0hlbHBlci5kaXNwbGF5VHlwZUNoYW5nZWQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNIZWxwZXIuZ2V0RGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zSGVscGVyLmdldERhdGEoKS5zZWxlY3RlZE9iamVjdHMgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNIZWxwZXIuZ2V0RGF0YSgpLmFjdGl2ZU9iamVjdHMgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdvcHRpb25zSGVscGVyIGlzIG5vdCBpbml0YWxpemVkIGNvcnJlY3RseTsgZGF0YSBpcyBlbXB0eScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zSGVscGVyLnJlZnJlc2hDb21wb25lbnRzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmltYXJ5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc0hlbHBlci5yZWdpc3Rlckdsb2JhbEtleWJvYXJkU2hvcnRjdXRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5saXN0ID0gdGhpcztcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlID0gdGhpcy5kYXRhU291cmNlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNjb3BlID0gdGhpcy5zY29wZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5jb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmNvbmZpZ3VyZUNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnM7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuY2hlY2tib3ggPSB0aGlzLmNoZWNrYm94O1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRpc3BsYXlUeXBlID0gdGhpcy5kaXNwbGF5VHlwZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlID0gdGhpcy5lbGVtZW50SW50ZXJhY3Rpb25UeXBlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmdyaWRDb25maWcgPSB0aGlzLmdyaWRDb25maWc7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5nbG9iYWxPcHRpb25zID0gdGhpcy5nbG9iYWxPcHRpb25zO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydENoYW5nZSA9IHRoaXMuc29ydENoYW5nZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kcmFnRHJvcCA9IHRoaXMuZHJhZ0Ryb3A7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuY2xpY2tJdGVtID0gdGhpcy5jbGlja0l0ZW07XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGJsQ2xpY2tJdGVtID0gdGhpcy5kYmxDbGlja0l0ZW07XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZmV0Y2hEYXRhID0gdGhpcy5mZXRjaERhdGE7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UucHJpbWFyeUluc3RhbmNlID0gdGhpcy5wcmltYXJ5SW5zdGFuY2U7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2luZ2xlQ2xpY2tIaW50ID0gdGhpcy5zaW5nbGVDbGlja0hpbnQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGlzYWJsZUluZmluaXRlU2Nyb2xsID0gdGhpcy5kaXNhYmxlSW5maW5pdGVTY3JvbGw7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2Nyb2xsR3JhZGllbnRDb2xvci5zZXQodGhpcy5zY3JvbGxHcmFkaWVudENvbG9yKTtcblxuICAgICAgICBpZiAoY2hhbmdlc1snaW5pdENvbmZpZyddKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zR2VuZXJhdG9yKHRoaXMuaW5pdENvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZj8uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgbmVlZCB3cmFwcGluZyB3aXRoIGBzZXRUaW1lb3V0YC5cbiAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoaXMgd3JhcHBlciB3aXRoIHRoZSBjb25maWd1cmVkIGN1c3RvbS1ub2RlLWxpc3QgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCA9IHRoaXMudGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgVGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UuQ1VTVE9NX05PREVfRU5UUklFU19DT01QT05FTlQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnVpU2VydmljZS5pbmplY3RBbmd1bGFyQ29tcG9uZW50KFxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgLy8gSW5wdXQgYmluZGluZ3MgYXJlIGluaXRpYWxpemVkIGluIGBuZ09uQ2hhbmdlc2AuXG4gICAgICAgICAgICB0aGlzLmdldE91dHB1dEJpbmRpbmdzKCksXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgbWFwIG9mIHRoZSBvdXRwdXQgYmluZGluZ3MgZGVmaW5lZCBpbiB0aGlzIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE91dHB1dEJpbmRpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogRXZlbnRFbWl0dGVyPGFueT4gfSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJpbmRpbmdzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgIG91dHB1dEJpbmRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0QmluZGluZ3M7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVR5cGUoKTogTm9kZUVudHJpZXNEaXNwbGF5VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlUeXBlO1xuICAgIH1cblxuICAgIHNldERpc3BsYXlUeXBlKGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGUgPSBkaXNwbGF5VHlwZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kaXNwbGF5VHlwZSA9IGRpc3BsYXlUeXBlO1xuICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGVDaGFuZ2UuZW1pdChkaXNwbGF5VHlwZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlTm9kZXMobm9kZXM6IHZvaWQgfCBUW10pIHtcbiAgICAgICAgaWYgKCFub2Rlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhpdHMgPSAobm9kZXMgYXMgVFtdKS5maWx0ZXIoKG4pID0+IChuIGFzIE5vZGUpLnJlZi5pZCA9PT0gKGQgYXMgTm9kZSkucmVmLmlkKTtcbiAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBpZiB0aGUgb3JpZ2luYWwgaGFzIGNoYW5nZWQgKGZvciBjb2xsZWN0aW9uIHJlZnMpXG4gICAgICAgICAgICAgICAgaGl0cyA9IChub2RlcyBhcyBUW10pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKG4pID0+IChuIGFzIE5vZGUpLnJlZi5pZCA9PT0gKGQgYXMgdW5rbm93biBhcyBDb2xsZWN0aW9uUmVmZXJlbmNlKS5vcmlnaW5hbElkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGl0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVIZWxwZXJTZXJ2aWNlLmNvcHlEYXRhVG9Ob2RlKGQgYXMgTm9kZSwgaGl0c1swXSBhcyBOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRyaWdnZXIgcmVidWlsZFxuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlIGluc3RhbmNlb2YgTm9kZURhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICh0aGlzLmRhdGFTb3VyY2UgYXMgTm9kZURhdGFTb3VyY2U8VD4pLnJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRTZWxlY3Rpb24gPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KFxuICAgICAgICAgICAgLi4ub2xkU2VsZWN0aW9uLm1hcChcbiAgICAgICAgICAgICAgICAobykgPT4gdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5maWx0ZXIoKGQpID0+IEhlbHBlci5vYmplY3RFcXVhbHMobywgZCkpPy5bMF0sXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBzaG93UmVvcmRlckNvbHVtbnNEaWFsb2coKTogdm9pZCB7fVxuXG4gICAgYWRkVmlydHVhbE5vZGVzKHZpcnR1YWw6IFRbXSk6IHZvaWQge1xuICAgICAgICB2aXJ0dWFsID0gdmlydHVhbC5tYXAoKG8pID0+IHtcbiAgICAgICAgICAgIChvIGFzIFZpcnR1YWxOb2RlKS52aXJ0dWFsID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9KTtcbiAgICAgICAgdmlydHVhbC5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWlucyA9IHRoaXMuZGF0YVNvdXJjZVxuICAgICAgICAgICAgICAgIC5nZXREYXRhKClcbiAgICAgICAgICAgICAgICAuc29tZSgoZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgKGQgYXMgTm9kZSkucmVmXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChkIGFzIE5vZGUpLnJlZj8uaWQgPT09ICh2IGFzIE5vZGUpLnJlZj8uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGQgYXMgVXNlcikuYXV0aG9yaXR5TmFtZSA9PT0gKHYgYXMgVXNlcikuYXV0aG9yaXR5TmFtZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb2Rlcyhbdl0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYXBwZW5kRGF0YShbdl0sICdiZWZvcmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdCguLi52aXJ0dWFsKTtcbiAgICAgICAgdGhpcy52aXJ0dWFsTm9kZXNBZGRlZC5lbWl0KHZpcnR1YWwgYXMgTm9kZVtdKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zOiBMaXN0T3B0aW9ucyk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0aW9uKCk6IEN1c3RvbVNlbGVjdGlvbk1vZGVsPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXRPcHRpb25zR2VuZXJhdG9yKGNvbmZpZzogTGlzdE9wdGlvbnNDb25maWcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zSGVscGVyLmluaXRDb21wb25lbnRzKGNvbmZpZy5hY3Rpb25iYXIsIHRoaXMpO1xuICAgICAgICB0aGlzLm9wdGlvbnNIZWxwZXIuc2V0RGF0YSh7XG4gICAgICAgICAgICBzY29wZTogdGhpcy5lbnRyaWVzU2VydmljZS5zY29wZSxcbiAgICAgICAgICAgIGFjdGl2ZU9iamVjdHM6IHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLFxuICAgICAgICAgICAgc2VsZWN0ZWRPYmplY3RzOiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZCxcbiAgICAgICAgICAgIGFsbE9iamVjdHM6IHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNvbmZpZy5wYXJlbnQsXG4gICAgICAgICAgICBjdXN0b21PcHRpb25zOiBjb25maWcuY3VzdG9tT3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9uc0hlbHBlci5yZWZyZXNoQ29tcG9uZW50cygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gUHJldmVudCBjaGFuZ2VkLWFmdGVyLWNoZWNrZWQgZXJyb3JcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0ZVRlbXBsYXRlcygpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRlbXBsYXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLnRpdGxlID0gdGhpcy50aXRsZVJlZjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmVtcHR5ID0gdGhpcy5lbXB0eVJlZjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmFjdGlvbkFyZWEgPSB0aGlzLmFjdGlvbkFyZWFSZWY7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS5vdmVybGF5ID0gdGhpcy5vdmVybGF5UmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlc2V0IHRoZSBwYWdpbmF0aW9uIHRvIHRoZSBmaXJzdCBwYWdlXG4gICAgICogaGludDogdGhpcyB3aWxsIGRvIG5vdGhpbmcgaW4gY2FzZSB0aGUgcGFnaW5hdGlvblN0cmF0ZWd5ICE9PSBQYWdpbmF0aW9uXG4gICAgICovXG4gICAgcmVzZXRQYWdpbmF0aW9uKCkge1xuICAgICAgICB0aGlzLm5vZGVFbnRyaWVzQ29tcG9uZW50UmVmPy5wYWdpbmF0b3I/LmZpcnN0UGFnZSgpO1xuICAgIH1cblxuICAgIGRlbGV0ZU5vZGVzKG9iamVjdHM6IFRbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucmVtb3ZlRGF0YShvYmplY3RzKTtcbiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb24oKS5jbGVhcigpO1xuICAgIH1cbn1cbiJdfQ==
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXdyYXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXdyYXBwZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBS0wsTUFBTSxFQUtOLFNBQVMsR0FHWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRS9FLE9BQU8sRUFHSCxlQUFlLEVBUWYsc0JBQXNCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQXdCLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFJNUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7QUFXbkYsTUFBTSxPQUFPLDJCQUEyQjtJQXFGcEMsWUFDWSxnQkFBa0MsRUFDbEMsdUJBQWdELEVBQ2hELE1BQWMsRUFDZCxjQUFxQyxFQUN0QyxhQUF1QyxFQUN0QyxpQkFBb0MsRUFDcEMsU0FBb0I7SUFDNUIsUUFBUTtJQUNSLG1DQUFtQztJQUMzQixnQkFBNkMsRUFDN0MsaUJBQW9DLEVBQ3BDLFVBQXNCO1FBWHRCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsNEJBQXVCLEdBQXZCLHVCQUF1QixD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OUIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQU1HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQVVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBY0csZUFBZTtzQkFBdkIsS0FBSztnQkFJRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFNpbXBsZUNoYW5nZSxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4vbm9kZS1lbnRyaWVzLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVFbnRyaWVzQ29tcG9uZW50IH0gZnJvbSAnLi9ub2RlLWVudHJpZXMuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgRmV0Y2hFdmVudCxcbiAgICBHcmlkQ29uZmlnLFxuICAgIEludGVyYWN0aW9uVHlwZSxcbiAgICBMaXN0RHJhZ0dyb3BDb25maWcsXG4gICAgTGlzdEV2ZW50SW50ZXJmYWNlLFxuICAgIExpc3RPcHRpb25zLFxuICAgIExpc3RPcHRpb25zQ29uZmlnLFxuICAgIExpc3RTb3J0Q29uZmlnLFxuICAgIE5vZGVDbGlja0V2ZW50LFxuICAgIE5vZGVFbnRyaWVzRGF0YVR5cGUsXG4gICAgTm9kZUVudHJpZXNEaXNwbGF5VHlwZSxcbn0gZnJvbSAnLi9lbnRyaWVzLW1vZGVsJztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlIH0gZnJvbSAnLi9ub2RlLWRhdGEtc291cmNlJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL3V0aWwvaGVscGVyJztcbmltcG9ydCB7IEN1c3RvbVNlbGVjdGlvbk1vZGVsLCBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBPcHRpb25JdGVtLCBTY29wZSB9IGZyb20gJy4uL3R5cGVzL29wdGlvbi1pdGVtJztcbmltcG9ydCB7IE5vZGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbm9kZS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJy4uL3R5cGVzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBUZW1wb3JhcnlTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RlbXBvcmFyeS1zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlZmVyZW5jZSwgR2VuZXJpY0F1dGhvcml0eSwgTm9kZSwgVXNlciB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgVmlydHVhbE5vZGUgfSBmcm9tICcuLi90eXBlcy9hcGktbW9kZWxzJztcbmltcG9ydCB7IE9wdGlvbnNIZWxwZXJEYXRhU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29wdGlvbnMtaGVscGVyLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcy1ub2RlLWVudHJpZXMtd3JhcHBlcicsXG4gICAgdGVtcGxhdGU6IGA8ZXMtbm9kZS1lbnRyaWVzXG4gICAgICAgICNub2RlRW50cmllc0NvbXBvbmVudFxuICAgICAgICAqbmdJZj1cIiFjdXN0b21Ob2RlTGlzdENvbXBvbmVudFwiXG4gICAgPjwvZXMtbm9kZS1lbnRyaWVzPmAsXG4gICAgcHJvdmlkZXJzOiBbTm9kZUVudHJpZXNTZXJ2aWNlLCBPcHRpb25zSGVscGVyRGF0YVNlcnZpY2UsIE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzV3JhcHBlckNvbXBvbmVudDxUIGV4dGVuZHMgTm9kZUVudHJpZXNEYXRhVHlwZT5cbiAgICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIExpc3RFdmVudEludGVyZmFjZTxUPlxue1xuICAgIC8qKlxuICAgICAqIHRpdGxlIChhYm92ZSkgdGhlIHRhYmxlL2dyaWRcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKCd0aXRsZScpIHRpdGxlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKlxuICAgICAqIGRhdGEgc2hvd24gd2hlbiBkYXRhIHNvdXJjZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ2VtcHR5JykgZW1wdHlSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgLyoqXG4gICAgICogY3VzdG9tIGFyZWEgZm9yIGFjdGlvbnMgb25seSBmb3IgTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWQgKHBlciBjYXJkIGF0IHRoZSBib3R0b20pXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZCgnYWN0aW9uQXJlYScpIGFjdGlvbkFyZWFSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgLyoqXG4gICAgICogY3VzdG9tIGFyZWEgZm9yIGFuIG92ZXJsYXkgXCJhYm92ZVwiIGVhY2ggY2FyZCAoaS5lLiB0byBzaG93IGRpc2FibGVkIGluZm9zKSwgb25seSBmb3IgTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWQgJiBvZGVFbnRyaWVzRGlzcGxheVR5cGUuR3JpZFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ292ZXJsYXknKSBvdmVybGF5UmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBWaWV3Q2hpbGQoJ25vZGVFbnRyaWVzQ29tcG9uZW50Jykgbm9kZUVudHJpZXNDb21wb25lbnRSZWY6IE5vZGVFbnRyaWVzQ29tcG9uZW50PFQ+O1xuICAgIEBJbnB1dCgpIGRhdGFTb3VyY2U6IE5vZGVEYXRhU291cmNlPFQ+O1xuICAgIEBJbnB1dCgpIHNjb3BlOiBTY29wZTtcbiAgICBASW5wdXQoKSBjb2x1bW5zOiBMaXN0SXRlbVtdO1xuICAgIEBJbnB1dCgpIGNvbmZpZ3VyZUNvbHVtbnM6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2hlY2tib3ggPSB0cnVlO1xuICAgIEBPdXRwdXQoKSBjb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaXN0SXRlbVtdPigpO1xuICAgIEBJbnB1dCgpIGdsb2JhbE9wdGlvbnM6IE9wdGlvbkl0ZW1bXTtcbiAgICBASW5wdXQoKSBkaXNwbGF5VHlwZSA9IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUuR3JpZDtcbiAgICBAT3V0cHV0KCkgZGlzcGxheVR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE5vZGVFbnRyaWVzRGlzcGxheVR5cGU+KCk7XG4gICAgQElucHV0KCkgZWxlbWVudEludGVyYWN0aW9uVHlwZSA9IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGluaztcbiAgICBASW5wdXQoKSBzb3J0OiBMaXN0U29ydENvbmZpZztcbiAgICBASW5wdXQoKSBkcmFnRHJvcDogTGlzdERyYWdHcm9wQ29uZmlnPFQ+O1xuICAgIEBJbnB1dCgpIGdyaWRDb25maWc6IEdyaWRDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbG9yIGRlZmluZXMgdGhlIGJhc2UgY29sb3Igb2YgZ3JhZGllbnRzIHZpc3VhbGx5IGxpbWl0aW5nIGEgZ3JpZCBpbiBzY3JvbGwgZGlyZWN0aW9uLlxuICAgICAqIERlZmF1bHRzIHRvIHdoaXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNjcm9sbEdyYWRpZW50Q29sb3I6IHN0cmluZyA9ICcjZmZmJztcblxuICAgIC8qKlxuICAgICAqIHRoaXMgY2FuIGJlIHNldCBpbnN0ZWFkIG9mIGNhbGxpbmcgaW5pdE9wdGlvbnNHZW5lcmF0b3IoKVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGluaXRDb25maWc6IExpc3RPcHRpb25zQ29uZmlnO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyBub2RlLWVudHJpZXMgaW5zdGFuY2UgcmVwcmVzZW50cyB0aGUgcGFnZSdzIG1haW4gY29udGVudC5cbiAgICAgKlxuICAgICAqIE9ubHkgc2V0IHRvIHRydWUgZm9yIG9uZSBpbnN0YW5jZSBwZXIgcGFnZS5cbiAgICAgKlxuICAgICAqIElmIHRydWUsIHRoaXMgaW5zdGFuY2Ugd2lsbFxuICAgICAqIC0gaGFuZGxlIHBhZ2Utd2lkZSBrZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgKiAtIHRha2UgY29udHJvbCBvZiB0aGUgYHBhZ2VgIGFuZCBgcGFnZVNpemVgIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHBhZ2luYXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwcmltYXJ5SW5zdGFuY2U6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVUkgaGludHMgZm9yIHdoZXRoZXIgYSBzaW5nbGUgY2xpY2sgd2lsbCBjYXVzZSBhIGR5bmFtaWMgYWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBkb2VzIG5vdCBjb25maWd1cmUgdGhlIGFjdHVhbCBiZWhhdmlvciBidXQgb25seSBVSSBoaW50cyB0byB0aGUgdXNlci4gSGludHMgaW5jbHVkZVxuICAgICAqIGhvdmVyIGVmZmVjdHMgYW5kIGEgY2hhbmdlZCBjdXJzb3IuXG4gICAgICpcbiAgICAgKiAtIFdoZW4gY2hvb3NpbmcgJ3N0YXRpYycsIHRoZSBgY2xpY2tJdGVtYCBldmVudCBzaG91bGQgdHJpZ2dlciBzb21lIHN0YXRpb25hcnkgYWN0aW9uIGxpa2VcbiAgICAgKiAgIHNlbGVjdGluZyB0aGUgZWxlbWVudCBvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGluIGEgY29tcGxlbWVudGFyeSBwYWdlIGFyZWEuIFRoZVxuICAgICAqICAgYGRibENsaWNrSXRlbWAgZXZlbnQgY2FuIGJlIHVzZWQgZm9yIGEgbW9yZSBkaXNydXB0aXZlIGFjdGlvbi5cbiAgICAgKiAtIFdoZW4gY2hvb3NpbmcgJ2R5bmFtaWMnLCB0aGUgYGNsaWNrSXRlbWAgZXZlbnQgc2hvdWxkIHRyaWdnZXIgYSBtYWpvciBhY3Rpb24gbGlrZVxuICAgICAqICAgbmF2aWdhdGluZyB0byBhIG5ldyBwYWdlIG9yIGNsb3NpbmcgYSBkaWFsb2cuXG4gICAgICovXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgY29udHJvbGxpbmcgdGhlIHVpIGhpbnRzIGFuZCB0aGUgYWN0dWFsIGJlaGF2aW9yIHdpdGggYSBzaW5nbGUgb3B0aW9uLlxuICAgIEBJbnB1dCgpIHNpbmdsZUNsaWNrSGludDogJ2R5bmFtaWMnIHwgJ3N0YXRpYycgPSAnZHluYW1pYyc7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGxvYWQgbW9yZSBkYXRhIG9uIHNjcm9sbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlSW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBmZXRjaERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPEZldGNoRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGNsaWNrSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+KCk7XG4gICAgQE91dHB1dCgpIGRibENsaWNrSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+KCk7XG4gICAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RTb3J0Q29uZmlnPigpO1xuICAgIEBPdXRwdXQoKSB2aXJ0dWFsTm9kZXNBZGRlZDtcbiAgICBAT3V0cHV0KCkgZGlzcGxheVR5cGVDaGFuZ2VkO1xuXG4gICAgY3VzdG9tTm9kZUxpc3RDb21wb25lbnQ6IFR5cGU8Tm9kZUVudHJpZXNDb21wb25lbnQ8VD4+O1xuICAgIHByaXZhdGUgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8Tm9kZUVudHJpZXNDb21wb25lbnQ8VD4+O1xuICAgIHByaXZhdGUgb3B0aW9uczogTGlzdE9wdGlvbnM7XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSB0ZW1wb3JhcnlTdG9yYWdlU2VydmljZTogVGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgZW50cmllc1NlcnZpY2U6IE5vZGVFbnRyaWVzU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIG9wdGlvbnNIZWxwZXI6IE9wdGlvbnNIZWxwZXJEYXRhU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub2RlSGVscGVyU2VydmljZTogTm9kZUhlbHBlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdWlTZXJ2aWNlOiBVSVNlcnZpY2UsXG4gICAgICAgIC8vIEBUT0RPXG4gICAgICAgIC8vIHByaXZhdGUgbWFpbk5hdjogTWFpbk5hdlNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVzU2VydmljZTogTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICkge1xuICAgICAgICAvLyByZWd1bGFyeSByZS1iaW5kIHRlbXBsYXRlIHNpbmNlIGl0IG1pZ2h0IGhhdmUgdXBkYXRlZCB3aXRob3V0IG5nQ2hhbmdlcyB0cmlnZ2VyXG4gICAgICAgIC8qXG4gICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxuICAgICAgICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZW1wdHlSZWYgPSB0aGlzLmVtcHR5UmVmKVxuICAgICAgICApO1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLnZpcnR1YWxOb2Rlc0FkZGVkID0gdGhpcy5vcHRpb25zSGVscGVyLnZpcnR1YWxOb2Rlc0FkZGVkO1xuICAgICAgICB0aGlzLmRpc3BsYXlUeXBlQ2hhbmdlZCA9IHRoaXMub3B0aW9uc0hlbHBlci5kaXNwbGF5VHlwZUNoYW5nZWQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNIZWxwZXIuZ2V0RGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zSGVscGVyLmdldERhdGEoKS5zZWxlY3RlZE9iamVjdHMgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNIZWxwZXIuZ2V0RGF0YSgpLmFjdGl2ZU9iamVjdHMgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdvcHRpb25zSGVscGVyIGlzIG5vdCBpbml0YWxpemVkIGNvcnJlY3RseTsgZGF0YSBpcyBlbXB0eScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zSGVscGVyLnJlZnJlc2hDb21wb25lbnRzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmltYXJ5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc0hlbHBlci5yZWdpc3Rlckdsb2JhbEtleWJvYXJkU2hvcnRjdXRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5saXN0ID0gdGhpcztcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlID0gdGhpcy5kYXRhU291cmNlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNjb3BlID0gdGhpcy5zY29wZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5jb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmNvbmZpZ3VyZUNvbHVtbnMgPSB0aGlzLmNvbmZpZ3VyZUNvbHVtbnM7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuY2hlY2tib3ggPSB0aGlzLmNoZWNrYm94O1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRpc3BsYXlUeXBlID0gdGhpcy5kaXNwbGF5VHlwZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlID0gdGhpcy5lbGVtZW50SW50ZXJhY3Rpb25UeXBlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmdyaWRDb25maWcgPSB0aGlzLmdyaWRDb25maWc7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5nbG9iYWxPcHRpb25zID0gdGhpcy5nbG9iYWxPcHRpb25zO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydENoYW5nZSA9IHRoaXMuc29ydENoYW5nZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kcmFnRHJvcCA9IHRoaXMuZHJhZ0Ryb3A7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuY2xpY2tJdGVtID0gdGhpcy5jbGlja0l0ZW07XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGJsQ2xpY2tJdGVtID0gdGhpcy5kYmxDbGlja0l0ZW07XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZmV0Y2hEYXRhID0gdGhpcy5mZXRjaERhdGE7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UucHJpbWFyeUluc3RhbmNlID0gdGhpcy5wcmltYXJ5SW5zdGFuY2U7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2luZ2xlQ2xpY2tIaW50ID0gdGhpcy5zaW5nbGVDbGlja0hpbnQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGlzYWJsZUluZmluaXRlU2Nyb2xsID0gdGhpcy5kaXNhYmxlSW5maW5pdGVTY3JvbGw7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2Nyb2xsR3JhZGllbnRDb2xvci5zZXQodGhpcy5zY3JvbGxHcmFkaWVudENvbG9yKTtcblxuICAgICAgICBpZiAoY2hhbmdlc1snaW5pdENvbmZpZyddKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zR2VuZXJhdG9yKHRoaXMuaW5pdENvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZj8uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgbmVlZCB3cmFwcGluZyB3aXRoIGBzZXRUaW1lb3V0YC5cbiAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoaXMgd3JhcHBlciB3aXRoIHRoZSBjb25maWd1cmVkIGN1c3RvbS1ub2RlLWxpc3QgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCA9IHRoaXMudGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgVGVtcG9yYXJ5U3RvcmFnZVNlcnZpY2UuQ1VTVE9NX05PREVfRU5UUklFU19DT01QT05FTlQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnVpU2VydmljZS5pbmplY3RBbmd1bGFyQ29tcG9uZW50KFxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Ob2RlTGlzdENvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgLy8gSW5wdXQgYmluZGluZ3MgYXJlIGluaXRpYWxpemVkIGluIGBuZ09uQ2hhbmdlc2AuXG4gICAgICAgICAgICB0aGlzLmdldE91dHB1dEJpbmRpbmdzKCksXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgbWFwIG9mIHRoZSBvdXRwdXQgYmluZGluZ3MgZGVmaW5lZCBpbiB0aGlzIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE91dHB1dEJpbmRpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogRXZlbnRFbWl0dGVyPGFueT4gfSB7XG4gICAgICAgIGNvbnN0IG91dHB1dEJpbmRpbmdzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgIG91dHB1dEJpbmRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0QmluZGluZ3M7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVR5cGUoKTogTm9kZUVudHJpZXNEaXNwbGF5VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlUeXBlO1xuICAgIH1cblxuICAgIHNldERpc3BsYXlUeXBlKGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGUgPSBkaXNwbGF5VHlwZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kaXNwbGF5VHlwZSA9IGRpc3BsYXlUeXBlO1xuICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuZGlzcGxheVR5cGVDaGFuZ2UuZW1pdChkaXNwbGF5VHlwZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlTm9kZXMobm9kZXM6IHZvaWQgfCBUW10pIHtcbiAgICAgICAgaWYgKCFub2Rlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhpdHMgPSAobm9kZXMgYXMgVFtdKS5maWx0ZXIoKG4pID0+XG4gICAgICAgICAgICAgICAgKG4gYXMgTm9kZSk/LnJlZlxuICAgICAgICAgICAgICAgICAgICA/IChuIGFzIE5vZGUpPy5yZWYuaWQgPT09IChkIGFzIE5vZGUpPy5yZWYuaWRcbiAgICAgICAgICAgICAgICAgICAgOiAobiBhcyBHZW5lcmljQXV0aG9yaXR5KT8uYXV0aG9yaXR5TmFtZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAoZCBhcyBHZW5lcmljQXV0aG9yaXR5KT8uYXV0aG9yaXR5TmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaGl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaWYgdGhlIG9yaWdpbmFsIGhhcyBjaGFuZ2VkIChmb3IgY29sbGVjdGlvbiByZWZzKVxuICAgICAgICAgICAgICAgIGhpdHMgPSAobm9kZXMgYXMgVFtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChuKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKG4gYXMgTm9kZSk/LnJlZiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKG4gYXMgTm9kZSk/LnJlZj8uaWQgPT09IChkIGFzIHVua25vd24gYXMgQ29sbGVjdGlvblJlZmVyZW5jZSk/Lm9yaWdpbmFsSWQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoaXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3B5JywgZCwgaGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlSGVscGVyU2VydmljZS5jb3B5RGF0YVRvTm9kZShkIGFzIE5vZGUsIGhpdHNbMF0gYXMgTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0cmlnZ2VyIHJlYnVpbGRcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIE5vZGVEYXRhU291cmNlKSB7XG4gICAgICAgICAgICAodGhpcy5kYXRhU291cmNlIGFzIE5vZGVEYXRhU291cmNlPFQ+KS5yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2xkU2VsZWN0aW9uID0gdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdChcbiAgICAgICAgICAgIC4uLm9sZFNlbGVjdGlvbi5tYXAoXG4gICAgICAgICAgICAgICAgKG8pID0+IHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuZmlsdGVyKChkKSA9PiBIZWxwZXIub2JqZWN0RXF1YWxzKG8sIGQpKT8uWzBdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgc2hvd1Jlb3JkZXJDb2x1bW5zRGlhbG9nKCk6IHZvaWQge31cblxuICAgIGFkZFZpcnR1YWxOb2Rlcyh2aXJ0dWFsOiBUW10pOiB2b2lkIHtcbiAgICAgICAgdmlydHVhbCA9IHZpcnR1YWwubWFwKChvKSA9PiB7XG4gICAgICAgICAgICAobyBhcyBWaXJ0dWFsTm9kZSkudmlydHVhbCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfSk7XG4gICAgICAgIHZpcnR1YWwuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbnMgPSB0aGlzLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgICAuZ2V0RGF0YSgpXG4gICAgICAgICAgICAgICAgLnNvbWUoKGQpID0+XG4gICAgICAgICAgICAgICAgICAgIChkIGFzIE5vZGUpLnJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoZCBhcyBOb2RlKS5yZWY/LmlkID09PSAodiBhcyBOb2RlKS5yZWY/LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChkIGFzIFVzZXIpLmF1dGhvcml0eU5hbWUgPT09ICh2IGFzIFVzZXIpLmF1dGhvcml0eU5hbWUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjb250YWlucykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZXMoW3ZdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmFwcGVuZERhdGEoW3ZdLCAnYmVmb3JlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3QoLi4udmlydHVhbCk7XG4gICAgICAgIHRoaXMudmlydHVhbE5vZGVzQWRkZWQuZW1pdCh2aXJ0dWFsIGFzIE5vZGVbXSk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHNldE9wdGlvbnMob3B0aW9uczogTGlzdE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGlvbigpOiBDdXN0b21TZWxlY3Rpb25Nb2RlbDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbjtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0T3B0aW9uc0dlbmVyYXRvcihjb25maWc6IExpc3RPcHRpb25zQ29uZmlnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub3B0aW9uc0hlbHBlci5pbml0Q29tcG9uZW50cyhjb25maWcuYWN0aW9uYmFyLCB0aGlzKTtcbiAgICAgICAgdGhpcy5vcHRpb25zSGVscGVyLnNldERhdGEoe1xuICAgICAgICAgICAgc2NvcGU6IHRoaXMuZW50cmllc1NlcnZpY2Uuc2NvcGUsXG4gICAgICAgICAgICBhY3RpdmVPYmplY3RzOiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZCxcbiAgICAgICAgICAgIHNlbGVjdGVkT2JqZWN0czogdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQsXG4gICAgICAgICAgICBhbGxPYmplY3RzOiB0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLFxuICAgICAgICAgICAgcGFyZW50OiBjb25maWcucGFyZW50LFxuICAgICAgICAgICAgY3VzdG9tT3B0aW9uczogY29uZmlnLmN1c3RvbU9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9wdGlvbnNIZWxwZXIucmVmcmVzaENvbXBvbmVudHMoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFByZXZlbnQgY2hhbmdlZC1hZnRlci1jaGVja2VkIGVycm9yXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy51cGRhdGVUZW1wbGF0ZXMoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUZW1wbGF0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS50aXRsZSA9IHRoaXMudGl0bGVSZWY7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS5lbXB0eSA9IHRoaXMuZW1wdHlSZWY7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS5hY3Rpb25BcmVhID0gdGhpcy5hY3Rpb25BcmVhUmVmO1xuICAgICAgICB0aGlzLnRlbXBsYXRlc1NlcnZpY2Uub3ZlcmxheSA9IHRoaXMub3ZlcmxheVJlZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXNldCB0aGUgcGFnaW5hdGlvbiB0byB0aGUgZmlyc3QgcGFnZVxuICAgICAqIGhpbnQ6IHRoaXMgd2lsbCBkbyBub3RoaW5nIGluIGNhc2UgdGhlIHBhZ2luYXRpb25TdHJhdGVneSAhPT0gUGFnaW5hdGlvblxuICAgICAqL1xuICAgIHJlc2V0UGFnaW5hdGlvbigpIHtcbiAgICAgICAgdGhpcy5ub2RlRW50cmllc0NvbXBvbmVudFJlZj8ucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgICB9XG5cbiAgICBkZWxldGVOb2RlcyhvYmplY3RzOiBUW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLnJlbW92ZURhdGEob2JqZWN0cyk7XG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uKCkuY2xlYXIoKTtcbiAgICB9XG59XG4iXX0=