ngx-edu-sharing-ui 9.1.3 → 9.1.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.
- package/esm2022/lib/actionbar/actionbar.component.mjs +1 -1
- package/esm2022/lib/index.mjs +85 -0
- package/esm2022/lib/node-entries/list-item-label.pipe.mjs +9 -6
- package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +3 -21
- package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +43 -37
- package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +45 -55
- package/esm2022/lib/services/abstract/options-helper.service.mjs +1 -1
- package/esm2022/lib/services/node-entries.service.mjs +26 -5
- package/esm2022/lib/services/node-helper.service.mjs +14 -1
- package/esm2022/lib/services/options-helper-data.service.mjs +3 -3
- package/esm2022/lib/services/search-helper.service.mjs +3 -3
- package/esm2022/lib/spinner/spinner.component.mjs +5 -5
- package/esm2022/lib/translations/translation-loader.mjs +2 -1
- package/esm2022/lib/types/option-item.mjs +8 -7
- package/esm2022/ngx-edu-sharing-ui.mjs +2 -2
- package/esm2022/public-api.mjs +2 -0
- package/fesm2022/ngx-edu-sharing-ui.mjs +287 -273
- package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/lib/index.d.ts +81 -0
- package/lib/list-items/list-widget.d.ts +1 -1
- package/lib/node-entries/list-item-label.pipe.d.ts +3 -1
- package/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.d.ts +4 -2
- package/lib/node-entries/node-entries-table/node-entries-table.component.d.ts +3 -1
- package/lib/services/abstract/options-helper.service.d.ts +1 -1
- package/lib/services/node-entries.service.d.ts +5 -1
- package/lib/services/node-helper.service.d.ts +9 -0
- package/lib/services/options-helper-data.service.d.ts +4 -4
- package/lib/types/option-item.d.ts +7 -6
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/esm2022/module.mjs +0 -85
- package/module.d.ts +0 -81
package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs
CHANGED
|
@@ -14,26 +14,27 @@ import * as i0 from "@angular/core";
|
|
|
14
14
|
import * as i1 from "../../services/node-entries.service";
|
|
15
15
|
import * as i2 from "../node-entries-global.service";
|
|
16
16
|
import * as i3 from "../node-entries-templates.service";
|
|
17
|
-
import * as i4 from "../../services/
|
|
18
|
-
import * as i5 from "
|
|
19
|
-
import * as i6 from "@angular/
|
|
20
|
-
import * as i7 from "@angular/cdk/
|
|
21
|
-
import * as i8 from "
|
|
22
|
-
import * as i9 from "../../
|
|
23
|
-
import * as i10 from "../../
|
|
24
|
-
import * as i11 from "../../directives/
|
|
25
|
-
import * as i12 from "../../
|
|
26
|
-
import * as i13 from "
|
|
27
|
-
import * as i14 from "@angular/material/
|
|
28
|
-
import * as i15 from "@angular/material/
|
|
29
|
-
import * as i16 from "
|
|
30
|
-
import * as i17 from "../node-entries-
|
|
31
|
-
import * as i18 from "../node-entries-card
|
|
32
|
-
import * as i19 from "../
|
|
33
|
-
import * as i20 from "
|
|
34
|
-
import * as i21 from "../../directives/drag-nodes/nodes-
|
|
35
|
-
import * as i22 from "
|
|
36
|
-
import * as i23 from "
|
|
17
|
+
import * as i4 from "../../services/node-helper.service";
|
|
18
|
+
import * as i5 from "../../services/ui.service";
|
|
19
|
+
import * as i6 from "@angular/common";
|
|
20
|
+
import * as i7 from "@angular/cdk/overlay";
|
|
21
|
+
import * as i8 from "@angular/cdk/drag-drop";
|
|
22
|
+
import * as i9 from "../../directives/border-box-observer.directive";
|
|
23
|
+
import * as i10 from "../../dropdown/dropdown.component";
|
|
24
|
+
import * as i11 from "../../directives/icon.directive";
|
|
25
|
+
import * as i12 from "../../directives/infinite-scroll.directive";
|
|
26
|
+
import * as i13 from "../../spinner/spinner.component";
|
|
27
|
+
import * as i14 from "@angular/material/button";
|
|
28
|
+
import * as i15 from "@angular/material/badge";
|
|
29
|
+
import * as i16 from "@angular/material/tooltip";
|
|
30
|
+
import * as i17 from "../node-entries-table/column-chooser/column-chooser.component";
|
|
31
|
+
import * as i18 from "../node-entries-card/node-entries-card.component";
|
|
32
|
+
import * as i19 from "../node-entries-card-small/node-entries-card-small.component";
|
|
33
|
+
import * as i20 from "../sort-select-panel/sort-select-panel.component";
|
|
34
|
+
import * as i21 from "../../directives/drag-nodes/nodes-drag.directive";
|
|
35
|
+
import * as i22 from "../../directives/drag-nodes/nodes-drop-target.directive";
|
|
36
|
+
import * as i23 from "../node-entries-global-options/node-entries-global-options.component";
|
|
37
|
+
import * as i24 from "@ngx-translate/core";
|
|
37
38
|
let displayedWarnings = [];
|
|
38
39
|
export class NodeEntriesCardGridComponent {
|
|
39
40
|
set gridTop(value) {
|
|
@@ -46,10 +47,11 @@ export class NodeEntriesCardGridComponent {
|
|
|
46
47
|
});
|
|
47
48
|
// }
|
|
48
49
|
}
|
|
49
|
-
constructor(entriesService, entriesGlobalService, templatesService, ui, ngZone) {
|
|
50
|
+
constructor(entriesService, entriesGlobalService, templatesService, nodeHelperService, ui, ngZone) {
|
|
50
51
|
this.entriesService = entriesService;
|
|
51
52
|
this.entriesGlobalService = entriesGlobalService;
|
|
52
53
|
this.templatesService = templatesService;
|
|
54
|
+
this.nodeHelperService = nodeHelperService;
|
|
53
55
|
this.ui = ui;
|
|
54
56
|
this.ngZone = ngZone;
|
|
55
57
|
this.NodeEntriesDisplayType = NodeEntriesDisplayType;
|
|
@@ -209,14 +211,17 @@ export class NodeEntriesCardGridComponent {
|
|
|
209
211
|
.concat(new ListItemSort('NODE', 'score'), new ListItemSort('NODE', RestConstants.CCM_PROP_COLLECTION_ORDERED_POSITION), new ListItemSort('NODE', RestConstants.CM_PROP_TITLE), new ListItemSort('NODE', RestConstants.CM_NAME), new ListItemSort('NODE', RestConstants.CM_PROP_C_CREATED), new ListItemSort('NODE', RestConstants.CM_MODIFIED_DATE), new ListItemSort('NODE', RestConstants.CCM_PROP_REPLICATIONMODIFIED), new ListItemSort('NODE', RestConstants.CCM_PROP_REPLICATIONSOURCETIMESTAMP))
|
|
210
212
|
.some((c2) => c.type === c2.type && c2.name === c.name);
|
|
211
213
|
if (!result && !this.entriesService.configureColumns) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
214
|
+
return this.entriesService.sort?.columns;
|
|
215
|
+
/*
|
|
216
|
+
const warning =
|
|
217
|
+
'Sort field ' +
|
|
218
|
+
c.name +
|
|
219
|
+
' was specified but is not present as a column. ' +
|
|
220
|
+
'It will be ignored. Please also configure this field in the <lists> section';
|
|
221
|
+
if (!displayedWarnings.includes(warning)) {
|
|
222
|
+
console.warn(warning);
|
|
223
|
+
displayedWarnings.push(warning);
|
|
224
|
+
}*/
|
|
220
225
|
}
|
|
221
226
|
return result;
|
|
222
227
|
});
|
|
@@ -283,19 +288,20 @@ export class NodeEntriesCardGridComponent {
|
|
|
283
288
|
behavior: 'smooth',
|
|
284
289
|
});
|
|
285
290
|
}
|
|
286
|
-
isCustomTemplate() {
|
|
287
|
-
return this.entriesService.dataSource instanceof CustomTemplatesDataSource;
|
|
291
|
+
isCustomTemplate(node) {
|
|
292
|
+
return this.entriesService.dataSource instanceof CustomTemplatesDataSource || (node.elementRef);
|
|
288
293
|
}
|
|
289
294
|
isBlocked(node) {
|
|
290
|
-
return node.properties?.[RestConstants.CCM_PROP_IMPORT_BLOCKED]?.[0] === 'true'
|
|
295
|
+
return (node.properties?.[RestConstants.CCM_PROP_IMPORT_BLOCKED]?.[0] === 'true' ||
|
|
296
|
+
this.nodeHelperService.isNodeRevoked(node));
|
|
291
297
|
}
|
|
292
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesCardGridComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeEntriesGlobalService }, { token: i3.NodeEntriesTemplatesService }, { token: i4.UIService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
293
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: NodeEntriesCardGridComponent, selector: "es-node-entries-card-grid", inputs: { displayType: "displayType" }, host: { properties: { "style.--scroll-gradient-color": "this.scrollGradientColor" } }, viewQueries: [{ propertyName: "columnChooserTrigger", first: true, predicate: ["columnChooserTrigger"], descendants: true }, { propertyName: "gridTop", first: true, predicate: ["gridTop"], descendants: true, static: true }, { propertyName: "sortPanel", first: true, predicate: SortSelectPanelComponent, descendants: true }, { propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true }, { propertyName: "dropListsQuery", predicate: CdkDropList, descendants: true }, { propertyName: "itemRefs", predicate: ["item"], descendants: true, read: ElementRef }], ngImport: i0, template: "<ng-template #gridTop>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible$.next(!columnChooserVisible$.value)\"\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 <es-sort-select-panel\n *ngIf=\"entriesService.sort?.allowed\"\n class=\"order-panel\"\n [active]=\"entriesService.sort.active\"\n [direction]=\"entriesService.sort.direction\"\n [columns]=\"getSortColumns()\"\n (sortChange)=\"onSortChange($event)\"\n [(customSortingInProgress)]=\"entriesService.sort.customSortingInProgress\"\n (customSortingInProgressChange)=\"onCustomSortingInProgressChange()\"\n ></es-sort-select-panel>\n</ng-template>\n<es-column-chooser\n *ngIf=\"entriesService.configureColumns\"\n [(columns)]=\"entriesService.columns\"\n [columnChooserVisible]=\"columnChooserVisible$ | async\"\n [origin]=\"columnChooserTrigger\"\n (columnChooserVisibleChange)=\"columnChooserVisible$.next($event)\"\n></es-column-chooser>\n<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n\n<!-- Do not render the list element (`role=\"list\"` or `li`) when there are no list items. -->\n<ng-container\n *ngIf=\"(nodes$ | async)?.length > 0 || (entriesService.globalOptionsSubject | async)?.length > 0\"\n>\n <!-- FIXME: Ideally, we would use native `ul` and `li` elements, but these have a strict model,\n that only allows `li` elements as direct children of `ul` elements. So we would need to use the\n native elements at all places without any elements between `ul` and `li`. -->\n <div\n *ngIf=\"entriesService.sort?.customSortingInProgress\"\n role=\"list\"\n class=\"card-grid card-grid-reorder\"\n cdkDropListGroup\n >\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-order-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n cdkDropList\n [cdkDropListConnectedTo]=\"dropLists\"\n [cdkDropListData]=\"i\"\n >\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card-small>\n </div>\n </ng-container>\n </div>\n <div class=\"card-grid-wrapper\" *ngIf=\"!entriesService.sort?.customSortingInProgress\">\n <ng-container *ngTemplateOutlet=\"scrollHelper\"></ng-container>\n <div\n role=\"list\"\n class=\"card-grid card-grid-layout-{{ layout }}\"\n #grid\n (esBorderBoxObserver)=\"onGridSizeChanges()\"\n esInfiniteScroll\n (scroll)=\"updateScrollState()\"\n (scrolled)=\"!visibleItemsLimited && loadData('scroll')\"\n >\n <es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"displayType\"\n >\n </es-node-entries-global-options>\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-drag-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDropNodes\"\n (nodeDropped)=\"onNodesDropped($event)\"\n #dropTarget=\"esNodesDropTarget\"\n >\n <ng-container *ngIf=\"isCustomTemplate()\">\n <ng-container *ngTemplateOutlet=\"$any(node)\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!isCustomTemplate()\">\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n [dropdown]=\"dropdown\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"getDragData(node)\"\n esNodesDrag\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.card-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"\n isDragging && entriesService.selection.isSelected(node)\n \"\n >\n <ng-container *ngIf=\"entriesService.selection.selected.length > 1\">\n <es-node-entries-card\n *cdkDragPreview\n [node]=\"node\"\n [matBadge]=\"\n entriesService.selection.selected.length > 1\n ? entriesService.selection.selected.length\n : null\n \"\n class=\"card-drag-preview\"\n ></es-node-entries-card>\n </ng-container>\n </es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"[node]\"\n esNodesDrag\n >\n </es-node-entries-card-small>\n </ng-container>\n <div\n *ngIf=\"dropTarget.active?.canDrop?.denyExplicit\"\n class=\"card-grid-drop-blocked-container\"\n >\n <i esIcon=\"cancel\"></i>\n </div>\n <div *ngIf=\"dropTarget.active?.canDrop?.accept\" class=\"card-grid-drop-allowed-container\">\n <i\n [esIcon]=\"dropTarget.active.action === 'copy' ? 'add_circle_outline' : 'archive'\"\n ></i>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n !entriesService.dataSource.isLoading &&\n entriesService.dataSource.hasMore() &&\n !visibleItemsLimited &&\n entriesService.paginationStrategy === 'infinite-scroll' &&\n layout !== '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\n *ngIf=\"\n entriesService.dataSource.isLoading === true ||\n entriesService.dataSource.isLoading === 'initial' ||\n (entriesService.dataSource.isLoading === 'page' &&\n entriesService.paginationStrategy === 'infinite-scroll')\n \"\n>\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n</ng-container>\n\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #scrollHelper>\n <ng-container *ngIf=\"layout === 'scroll'\">\n <div\n class=\"scroll-helper-left\"\n role=\"presentation\"\n (click)=\"doScroll('left')\"\n *ngIf=\"scroll.left\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('left')\">\n <i esIcon=\"keyboard_arrow_left\" [aria]=\"true\"></i>\n </button>\n </div>\n <div\n class=\"scroll-helper-right\"\n role=\"presentation\"\n (click)=\"doScroll('right')\"\n *ngIf=\"scroll.right\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('right')\">\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"true\"></i>\n </button>\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@keyframes OrderAnimationCards{0%{transform:rotate(-.25deg)}50%{transform:rotate(.25deg)}to{transform:rotate(-.25deg)}}:host{--scroll-gradient-color: white}.order-panel{margin-left:auto}.load-more{display:flex;justify-content:center}.card-grid-wrapper{position:relative;z-index:0}.card-grid-wrapper .scroll-helper-left,.card-grid-wrapper .scroll-helper-right{position:absolute;width:15%;min-width:60px;max-width:calc(var(--cardWidth) * .4);display:flex;align-items:center;height:calc(100% - 10px);z-index:5;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.card-grid-wrapper .scroll-helper-left>button,.card-grid-wrapper .scroll-helper-right>button{background-color:#fff;color:var(--primary);box-shadow:0 0 25px #00000040}.card-grid-wrapper .scroll-helper-left{left:-1.5em;justify-content:flex-start;background:linear-gradient(to left,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-left>button{margin-left:calc(1.5em - 8px)}.card-grid-wrapper .scroll-helper-right{right:-1.5em;justify-content:flex-end;background:linear-gradient(to right,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-right>button{margin-right:calc(1.5em - 8px)}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardWidth),1fr));grid-column-gap:20px;grid-row-gap:20px;grid-template-rows:auto;padding-block-start:1em;padding-block-end:1em}.card-grid.card-grid-layout-scroll{position:relative;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;grid-auto-flow:column;grid-template-columns:repeat(auto-fit,var(--cardWidth));grid-auto-columns:minmax(var(--cardWidth),1fr);padding:1.5em;margin:-.5em -1.5em 0}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{margin:0 1.5em}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.1);border-radius:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar{height:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-thumb{max-width:20px;border-radius:10px;background-color:var(--primary)}.card-grid.card-grid-layout-scroll>.card-grid-drag-wrapper{scroll-snap-align:center;scroll-snap-stop:always}.card-grid .card-import-blocked ::ng-deep .card-meta{opacity:.75;text-decoration:line-through}.card-grid>.card-grid-drag-wrapper{position:relative}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{position:absolute;z-index:1;inset:0;display:flex;justify-content:center;align-items:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{background:radial-gradient(circle,#fff 30%,rgba(255,255,255,.0001) 70%);width:200px;height:200px;font-size:80px;display:flex;align-items:center;justify-content:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i{color:var(--colorStatusPositive)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{color:var(--colorStatusNegative)}.card-grid>.card-grid-drag-wrapper .selected-when-dragging{opacity:.5}.card-grid>.card-grid-drag-wrapper.cdk-drop-list-dragging>*:first-child{display:none}.card-grid.card-grid-reorder>.card-grid-order-wrapper{animation-iteration-count:infinite;animation-duration:.5s;animation-name:OrderAnimationCards}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(2n){animation-delay:0s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(odd){animation-delay:-.25s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(3n){animation-delay:-.125s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(5n){animation-delay:-.0625s}.card-grid.card-grid-reorder>.card-grid-order-wrapper .cdk-drag-placeholder{display:none}.card-drag-preview{width:250px}::ng-deep .es-card-grid-rearrange-drag-preview.cdk-drag-animating{transition:none}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i7.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: i7.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i8.BorderBoxObserverDirective, selector: "[esBorderBoxObserver]", outputs: ["esBorderBoxObserver"], exportAs: ["borderBoxObserver"] }, { kind: "component", type: i9.DropdownComponent, selector: "es-dropdown", inputs: ["position", "options", "callbackObject", "showDisabled", "menuClass"] }, { kind: "directive", type: i10.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i11.InfiniteScrollDirective, selector: "[esInfiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollThrottle", "scrollWindow"], outputs: ["scrolled"] }, { kind: "component", type: i12.SpinnerComponent, selector: "es-spinner" }, { kind: "component", type: i13.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i14.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i16.ColumnChooserComponent, selector: "es-column-chooser", inputs: ["origin", "columnChooserVisible", "columns"], outputs: ["columnChooserVisibleChange", "columnsChange"] }, { kind: "component", type: i17.NodeEntriesCardComponent, selector: "es-node-entries-card", inputs: ["dropdown", "node"] }, { kind: "component", type: i18.NodeEntriesCardSmallComponent, selector: "es-node-entries-card-small", inputs: ["node"] }, { kind: "component", type: i19.SortSelectPanelComponent, selector: "es-sort-select-panel", inputs: ["active", "direction", "columns", "customSortingInProgress"], outputs: ["sortChange", "customSortingInProgressChange"] }, { kind: "directive", type: i20.NodesDragDirective, selector: "[esNodesDrag]" }, { kind: "directive", type: i21.NodesDropTargetDirective, selector: "[esNodesDropTarget]", inputs: ["esNodesDropTarget", "canDropNodes"], outputs: ["nodeDropped"], exportAs: ["esNodesDropTarget"] }, { kind: "component", type: i22.NodeEntriesGlobalOptionsComponent, selector: "es-node-entries-global-options", inputs: ["displayType"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i23.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
298
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesCardGridComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeEntriesGlobalService }, { token: i3.NodeEntriesTemplatesService }, { token: i4.NodeHelperService }, { token: i5.UIService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
299
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: NodeEntriesCardGridComponent, selector: "es-node-entries-card-grid", inputs: { displayType: "displayType" }, host: { properties: { "style.--scroll-gradient-color": "this.scrollGradientColor" } }, viewQueries: [{ propertyName: "columnChooserTrigger", first: true, predicate: ["columnChooserTrigger"], descendants: true }, { propertyName: "gridTop", first: true, predicate: ["gridTop"], descendants: true, static: true }, { propertyName: "sortPanel", first: true, predicate: SortSelectPanelComponent, descendants: true }, { propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true }, { propertyName: "dropListsQuery", predicate: CdkDropList, descendants: true }, { propertyName: "itemRefs", predicate: ["item"], descendants: true, read: ElementRef }], ngImport: i0, template: "<ng-template #gridTop>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible$.next(!columnChooserVisible$.value)\"\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 <es-sort-select-panel\n *ngIf=\"entriesService.sort?.allowed\"\n class=\"order-panel\"\n [active]=\"entriesService.sort.active\"\n [direction]=\"entriesService.sort.direction\"\n [columns]=\"getSortColumns()\"\n (sortChange)=\"onSortChange($event)\"\n [(customSortingInProgress)]=\"entriesService.sort.customSortingInProgress\"\n (customSortingInProgressChange)=\"onCustomSortingInProgressChange()\"\n ></es-sort-select-panel>\n</ng-template>\n<es-column-chooser\n *ngIf=\"entriesService.configureColumns\"\n [(columns)]=\"entriesService.columns\"\n [columnChooserVisible]=\"columnChooserVisible$ | async\"\n [origin]=\"columnChooserTrigger\"\n (columnChooserVisibleChange)=\"columnChooserVisible$.next($event)\"\n></es-column-chooser>\n<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n\n<!-- Do not render the list element (`role=\"list\"` or `li`) when there are no list items. -->\n<ng-container\n *ngIf=\"(nodes$ | async)?.length > 0 || (entriesService.globalOptionsSubject | async)?.length > 0\"\n>\n <!-- FIXME: Ideally, we would use native `ul` and `li` elements, but these have a strict model,\n that only allows `li` elements as direct children of `ul` elements. So we would need to use the\n native elements at all places without any elements between `ul` and `li`. -->\n <div\n *ngIf=\"entriesService.sort?.customSortingInProgress\"\n role=\"list\"\n class=\"card-grid card-grid-reorder\"\n cdkDropListGroup\n >\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-order-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n cdkDropList\n [cdkDropListConnectedTo]=\"dropLists\"\n [cdkDropListData]=\"i\"\n >\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card-small>\n </div>\n </ng-container>\n </div>\n <div class=\"card-grid-wrapper\" *ngIf=\"!entriesService.sort?.customSortingInProgress\">\n <ng-container *ngTemplateOutlet=\"scrollHelper\"></ng-container>\n <div\n role=\"list\"\n class=\"card-grid card-grid-layout-{{ layout }}\"\n #grid\n (esBorderBoxObserver)=\"onGridSizeChanges()\"\n esInfiniteScroll\n (scroll)=\"updateScrollState()\"\n (scrolled)=\"!visibleItemsLimited && loadData('scroll')\"\n >\n <es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"displayType\"\n >\n </es-node-entries-global-options>\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-drag-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDropNodes\"\n (nodeDropped)=\"onNodesDropped($event)\"\n #dropTarget=\"esNodesDropTarget\"\n >\n <ng-container *ngIf=\"isCustomTemplate(node)\">\n <ng-container *ngTemplateOutlet=\"$any(node)\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!isCustomTemplate(node)\">\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n [dropdown]=\"dropdown\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"getDragData(node)\"\n esNodesDrag\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.card-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"\n isDragging && entriesService.selection.isSelected(node)\n \"\n >\n <ng-container *ngIf=\"entriesService.selection.selected.length > 1\">\n <es-node-entries-card\n *cdkDragPreview\n [node]=\"node\"\n [matBadge]=\"\n entriesService.selection.selected.length > 1\n ? entriesService.selection.selected.length\n : null\n \"\n class=\"card-drag-preview\"\n ></es-node-entries-card>\n </ng-container>\n </es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"[node]\"\n esNodesDrag\n >\n </es-node-entries-card-small>\n </ng-container>\n <div\n *ngIf=\"dropTarget.active?.canDrop?.denyExplicit\"\n class=\"card-grid-drop-blocked-container\"\n >\n <i esIcon=\"cancel\"></i>\n </div>\n <div *ngIf=\"dropTarget.active?.canDrop?.accept\" class=\"card-grid-drop-allowed-container\">\n <i\n [esIcon]=\"dropTarget.active.action === 'copy' ? 'add_circle_outline' : 'archive'\"\n ></i>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n !entriesService.dataSource.isLoading &&\n entriesService.dataSource.hasMore() &&\n !visibleItemsLimited &&\n entriesService.paginationStrategy === 'infinite-scroll' &&\n layout !== '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\n *ngIf=\"\n entriesService.dataSource.isLoading === true ||\n entriesService.dataSource.isLoading === 'initial' ||\n (entriesService.dataSource.isLoading === 'page' &&\n entriesService.paginationStrategy === 'infinite-scroll')\n \"\n>\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n</ng-container>\n\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #scrollHelper>\n <ng-container *ngIf=\"layout === 'scroll'\">\n <div\n class=\"scroll-helper-left\"\n role=\"presentation\"\n (click)=\"doScroll('left')\"\n *ngIf=\"scroll.left\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('left')\">\n <i esIcon=\"keyboard_arrow_left\" [aria]=\"true\"></i>\n </button>\n </div>\n <div\n class=\"scroll-helper-right\"\n role=\"presentation\"\n (click)=\"doScroll('right')\"\n *ngIf=\"scroll.right\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('right')\">\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"true\"></i>\n </button>\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@keyframes OrderAnimationCards{0%{transform:rotate(-.25deg)}50%{transform:rotate(.25deg)}to{transform:rotate(-.25deg)}}:host{--scroll-gradient-color: white}.order-panel{margin-left:auto}.load-more{display:flex;justify-content:center}.card-grid-wrapper{position:relative;z-index:0}.card-grid-wrapper .scroll-helper-left,.card-grid-wrapper .scroll-helper-right{position:absolute;width:15%;min-width:60px;max-width:calc(var(--cardWidth) * .4);display:flex;align-items:center;height:calc(100% - 10px);z-index:5;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.card-grid-wrapper .scroll-helper-left>button,.card-grid-wrapper .scroll-helper-right>button{background-color:#fff;color:var(--primary);box-shadow:0 0 25px #00000040}.card-grid-wrapper .scroll-helper-left{left:-1.5em;justify-content:flex-start;background:linear-gradient(to left,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-left>button{margin-left:calc(1.5em - 8px)}.card-grid-wrapper .scroll-helper-right{right:-1.5em;justify-content:flex-end;background:linear-gradient(to right,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-right>button{margin-right:calc(1.5em - 8px)}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardWidth),1fr));grid-column-gap:20px;grid-row-gap:20px;grid-template-rows:auto;padding-block-start:1em;padding-block-end:1em}.card-grid.card-grid-layout-scroll{position:relative;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;grid-auto-flow:column;grid-template-columns:repeat(auto-fit,var(--cardWidth));grid-auto-columns:minmax(var(--cardWidth),1fr);padding:1.5em;margin:-.5em -1.5em 0}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{margin:0 1.5em}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.1);border-radius:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar{height:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-thumb{max-width:20px;border-radius:10px;background-color:var(--primary)}.card-grid.card-grid-layout-scroll>.card-grid-drag-wrapper{scroll-snap-align:center;scroll-snap-stop:always}.card-grid .card-import-blocked ::ng-deep .card-meta{opacity:.75;text-decoration:line-through}.card-grid>.card-grid-drag-wrapper{position:relative}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{position:absolute;z-index:1;inset:0;display:flex;justify-content:center;align-items:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{background:radial-gradient(circle,#fff 30%,rgba(255,255,255,.0001) 70%);width:200px;height:200px;font-size:80px;display:flex;align-items:center;justify-content:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i{color:var(--colorStatusPositive)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{color:var(--colorStatusNegative)}.card-grid>.card-grid-drag-wrapper .selected-when-dragging{opacity:.5}.card-grid>.card-grid-drag-wrapper.cdk-drop-list-dragging>*:first-child{display:none}.card-grid.card-grid-reorder>.card-grid-order-wrapper{animation-iteration-count:infinite;animation-duration:.5s;animation-name:OrderAnimationCards}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(2n){animation-delay:0s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(odd){animation-delay:-.25s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(3n){animation-delay:-.125s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(5n){animation-delay:-.0625s}.card-grid.card-grid-reorder>.card-grid-order-wrapper .cdk-drag-placeholder{display:none}.card-drag-preview{width:250px}::ng-deep .es-card-grid-rearrange-drag-preview.cdk-drag-animating{transition:none}\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.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.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: i8.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i9.BorderBoxObserverDirective, selector: "[esBorderBoxObserver]", outputs: ["esBorderBoxObserver"], exportAs: ["borderBoxObserver"] }, { kind: "component", type: i10.DropdownComponent, selector: "es-dropdown", inputs: ["position", "options", "callbackObject", "showDisabled", "menuClass"] }, { kind: "directive", type: i11.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i12.InfiniteScrollDirective, selector: "[esInfiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollThrottle", "scrollWindow"], outputs: ["scrolled"] }, { kind: "component", type: i13.SpinnerComponent, selector: "es-spinner" }, { kind: "component", type: i14.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i15.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i17.ColumnChooserComponent, selector: "es-column-chooser", inputs: ["origin", "columnChooserVisible", "columns"], outputs: ["columnChooserVisibleChange", "columnsChange"] }, { kind: "component", type: i18.NodeEntriesCardComponent, selector: "es-node-entries-card", inputs: ["dropdown", "node"] }, { kind: "component", type: i19.NodeEntriesCardSmallComponent, selector: "es-node-entries-card-small", inputs: ["node"] }, { kind: "component", type: i20.SortSelectPanelComponent, selector: "es-sort-select-panel", inputs: ["active", "direction", "columns", "customSortingInProgress"], outputs: ["sortChange", "customSortingInProgressChange"] }, { kind: "directive", type: i21.NodesDragDirective, selector: "[esNodesDrag]" }, { kind: "directive", type: i22.NodesDropTargetDirective, selector: "[esNodesDropTarget]", inputs: ["esNodesDropTarget", "canDropNodes"], outputs: ["nodeDropped"], exportAs: ["esNodesDropTarget"] }, { kind: "component", type: i23.NodeEntriesGlobalOptionsComponent, selector: "es-node-entries-global-options", inputs: ["displayType"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i24.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
294
300
|
}
|
|
295
301
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesCardGridComponent, decorators: [{
|
|
296
302
|
type: Component,
|
|
297
|
-
args: [{ selector: 'es-node-entries-card-grid', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #gridTop>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible$.next(!columnChooserVisible$.value)\"\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 <es-sort-select-panel\n *ngIf=\"entriesService.sort?.allowed\"\n class=\"order-panel\"\n [active]=\"entriesService.sort.active\"\n [direction]=\"entriesService.sort.direction\"\n [columns]=\"getSortColumns()\"\n (sortChange)=\"onSortChange($event)\"\n [(customSortingInProgress)]=\"entriesService.sort.customSortingInProgress\"\n (customSortingInProgressChange)=\"onCustomSortingInProgressChange()\"\n ></es-sort-select-panel>\n</ng-template>\n<es-column-chooser\n *ngIf=\"entriesService.configureColumns\"\n [(columns)]=\"entriesService.columns\"\n [columnChooserVisible]=\"columnChooserVisible$ | async\"\n [origin]=\"columnChooserTrigger\"\n (columnChooserVisibleChange)=\"columnChooserVisible$.next($event)\"\n></es-column-chooser>\n<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n\n<!-- Do not render the list element (`role=\"list\"` or `li`) when there are no list items. -->\n<ng-container\n *ngIf=\"(nodes$ | async)?.length > 0 || (entriesService.globalOptionsSubject | async)?.length > 0\"\n>\n <!-- FIXME: Ideally, we would use native `ul` and `li` elements, but these have a strict model,\n that only allows `li` elements as direct children of `ul` elements. So we would need to use the\n native elements at all places without any elements between `ul` and `li`. -->\n <div\n *ngIf=\"entriesService.sort?.customSortingInProgress\"\n role=\"list\"\n class=\"card-grid card-grid-reorder\"\n cdkDropListGroup\n >\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-order-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n cdkDropList\n [cdkDropListConnectedTo]=\"dropLists\"\n [cdkDropListData]=\"i\"\n >\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card-small>\n </div>\n </ng-container>\n </div>\n <div class=\"card-grid-wrapper\" *ngIf=\"!entriesService.sort?.customSortingInProgress\">\n <ng-container *ngTemplateOutlet=\"scrollHelper\"></ng-container>\n <div\n role=\"list\"\n class=\"card-grid card-grid-layout-{{ layout }}\"\n #grid\n (esBorderBoxObserver)=\"onGridSizeChanges()\"\n esInfiniteScroll\n (scroll)=\"updateScrollState()\"\n (scrolled)=\"!visibleItemsLimited && loadData('scroll')\"\n >\n <es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"displayType\"\n >\n </es-node-entries-global-options>\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-drag-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDropNodes\"\n (nodeDropped)=\"onNodesDropped($event)\"\n #dropTarget=\"esNodesDropTarget\"\n >\n <ng-container *ngIf=\"isCustomTemplate()\">\n <ng-container *ngTemplateOutlet=\"$any(node)\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!isCustomTemplate()\">\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n [dropdown]=\"dropdown\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"getDragData(node)\"\n esNodesDrag\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.card-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"\n isDragging && entriesService.selection.isSelected(node)\n \"\n >\n <ng-container *ngIf=\"entriesService.selection.selected.length > 1\">\n <es-node-entries-card\n *cdkDragPreview\n [node]=\"node\"\n [matBadge]=\"\n entriesService.selection.selected.length > 1\n ? entriesService.selection.selected.length\n : null\n \"\n class=\"card-drag-preview\"\n ></es-node-entries-card>\n </ng-container>\n </es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"[node]\"\n esNodesDrag\n >\n </es-node-entries-card-small>\n </ng-container>\n <div\n *ngIf=\"dropTarget.active?.canDrop?.denyExplicit\"\n class=\"card-grid-drop-blocked-container\"\n >\n <i esIcon=\"cancel\"></i>\n </div>\n <div *ngIf=\"dropTarget.active?.canDrop?.accept\" class=\"card-grid-drop-allowed-container\">\n <i\n [esIcon]=\"dropTarget.active.action === 'copy' ? 'add_circle_outline' : 'archive'\"\n ></i>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n !entriesService.dataSource.isLoading &&\n entriesService.dataSource.hasMore() &&\n !visibleItemsLimited &&\n entriesService.paginationStrategy === 'infinite-scroll' &&\n layout !== '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\n *ngIf=\"\n entriesService.dataSource.isLoading === true ||\n entriesService.dataSource.isLoading === 'initial' ||\n (entriesService.dataSource.isLoading === 'page' &&\n entriesService.paginationStrategy === 'infinite-scroll')\n \"\n>\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n</ng-container>\n\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #scrollHelper>\n <ng-container *ngIf=\"layout === 'scroll'\">\n <div\n class=\"scroll-helper-left\"\n role=\"presentation\"\n (click)=\"doScroll('left')\"\n *ngIf=\"scroll.left\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('left')\">\n <i esIcon=\"keyboard_arrow_left\" [aria]=\"true\"></i>\n </button>\n </div>\n <div\n class=\"scroll-helper-right\"\n role=\"presentation\"\n (click)=\"doScroll('right')\"\n *ngIf=\"scroll.right\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('right')\">\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"true\"></i>\n </button>\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@keyframes OrderAnimationCards{0%{transform:rotate(-.25deg)}50%{transform:rotate(.25deg)}to{transform:rotate(-.25deg)}}:host{--scroll-gradient-color: white}.order-panel{margin-left:auto}.load-more{display:flex;justify-content:center}.card-grid-wrapper{position:relative;z-index:0}.card-grid-wrapper .scroll-helper-left,.card-grid-wrapper .scroll-helper-right{position:absolute;width:15%;min-width:60px;max-width:calc(var(--cardWidth) * .4);display:flex;align-items:center;height:calc(100% - 10px);z-index:5;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.card-grid-wrapper .scroll-helper-left>button,.card-grid-wrapper .scroll-helper-right>button{background-color:#fff;color:var(--primary);box-shadow:0 0 25px #00000040}.card-grid-wrapper .scroll-helper-left{left:-1.5em;justify-content:flex-start;background:linear-gradient(to left,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-left>button{margin-left:calc(1.5em - 8px)}.card-grid-wrapper .scroll-helper-right{right:-1.5em;justify-content:flex-end;background:linear-gradient(to right,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-right>button{margin-right:calc(1.5em - 8px)}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardWidth),1fr));grid-column-gap:20px;grid-row-gap:20px;grid-template-rows:auto;padding-block-start:1em;padding-block-end:1em}.card-grid.card-grid-layout-scroll{position:relative;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;grid-auto-flow:column;grid-template-columns:repeat(auto-fit,var(--cardWidth));grid-auto-columns:minmax(var(--cardWidth),1fr);padding:1.5em;margin:-.5em -1.5em 0}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{margin:0 1.5em}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.1);border-radius:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar{height:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-thumb{max-width:20px;border-radius:10px;background-color:var(--primary)}.card-grid.card-grid-layout-scroll>.card-grid-drag-wrapper{scroll-snap-align:center;scroll-snap-stop:always}.card-grid .card-import-blocked ::ng-deep .card-meta{opacity:.75;text-decoration:line-through}.card-grid>.card-grid-drag-wrapper{position:relative}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{position:absolute;z-index:1;inset:0;display:flex;justify-content:center;align-items:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{background:radial-gradient(circle,#fff 30%,rgba(255,255,255,.0001) 70%);width:200px;height:200px;font-size:80px;display:flex;align-items:center;justify-content:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i{color:var(--colorStatusPositive)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{color:var(--colorStatusNegative)}.card-grid>.card-grid-drag-wrapper .selected-when-dragging{opacity:.5}.card-grid>.card-grid-drag-wrapper.cdk-drop-list-dragging>*:first-child{display:none}.card-grid.card-grid-reorder>.card-grid-order-wrapper{animation-iteration-count:infinite;animation-duration:.5s;animation-name:OrderAnimationCards}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(2n){animation-delay:0s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(odd){animation-delay:-.25s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(3n){animation-delay:-.125s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(5n){animation-delay:-.0625s}.card-grid.card-grid-reorder>.card-grid-order-wrapper .cdk-drag-placeholder{display:none}.card-drag-preview{width:250px}::ng-deep .es-card-grid-rearrange-drag-preview.cdk-drag-animating{transition:none}\n"] }]
|
|
298
|
-
}], ctorParameters: function () { return [{ type: i1.NodeEntriesService }, { type: i2.NodeEntriesGlobalService }, { type: i3.NodeEntriesTemplatesService }, { type: i4.UIService }, { type: i0.NgZone }]; }, propDecorators: { columnChooserTrigger: [{
|
|
303
|
+
args: [{ selector: 'es-node-entries-card-grid', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #gridTop>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible$.next(!columnChooserVisible$.value)\"\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 <es-sort-select-panel\n *ngIf=\"entriesService.sort?.allowed\"\n class=\"order-panel\"\n [active]=\"entriesService.sort.active\"\n [direction]=\"entriesService.sort.direction\"\n [columns]=\"getSortColumns()\"\n (sortChange)=\"onSortChange($event)\"\n [(customSortingInProgress)]=\"entriesService.sort.customSortingInProgress\"\n (customSortingInProgressChange)=\"onCustomSortingInProgressChange()\"\n ></es-sort-select-panel>\n</ng-template>\n<es-column-chooser\n *ngIf=\"entriesService.configureColumns\"\n [(columns)]=\"entriesService.columns\"\n [columnChooserVisible]=\"columnChooserVisible$ | async\"\n [origin]=\"columnChooserTrigger\"\n (columnChooserVisibleChange)=\"columnChooserVisible$.next($event)\"\n></es-column-chooser>\n<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n\n<!-- Do not render the list element (`role=\"list\"` or `li`) when there are no list items. -->\n<ng-container\n *ngIf=\"(nodes$ | async)?.length > 0 || (entriesService.globalOptionsSubject | async)?.length > 0\"\n>\n <!-- FIXME: Ideally, we would use native `ul` and `li` elements, but these have a strict model,\n that only allows `li` elements as direct children of `ul` elements. So we would need to use the\n native elements at all places without any elements between `ul` and `li`. -->\n <div\n *ngIf=\"entriesService.sort?.customSortingInProgress\"\n role=\"list\"\n class=\"card-grid card-grid-reorder\"\n cdkDropListGroup\n >\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-order-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n cdkDropList\n [cdkDropListConnectedTo]=\"dropLists\"\n [cdkDropListData]=\"i\"\n >\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragData]=\"i\"\n [cdkDragStartDelay]=\"getDragStartDelay()\"\n cdkDragPreviewClass=\"es-card-grid-rearrange-drag-preview\"\n (cdkDragEntered)=\"onRearrangeDragEntered($event)\"\n (cdkDragStarted)=\"onRearrangeDragStarted()\"\n (cdkDragEnded)=\"onRearrangeDragEnded()\"\n ></es-node-entries-card-small>\n </div>\n </ng-container>\n </div>\n <div class=\"card-grid-wrapper\" *ngIf=\"!entriesService.sort?.customSortingInProgress\">\n <ng-container *ngTemplateOutlet=\"scrollHelper\"></ng-container>\n <div\n role=\"list\"\n class=\"card-grid card-grid-layout-{{ layout }}\"\n #grid\n (esBorderBoxObserver)=\"onGridSizeChanges()\"\n esInfiniteScroll\n (scroll)=\"updateScrollState()\"\n (scrolled)=\"!visibleItemsLimited && loadData('scroll')\"\n >\n <es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"displayType\"\n >\n </es-node-entries-global-options>\n <ng-container *ngIf=\"nodes$ | async as nodes\">\n <div\n class=\"card-grid-drag-wrapper\"\n *ngFor=\"let node of nodes; let i = index\"\n role=\"none\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDropNodes\"\n (nodeDropped)=\"onNodesDropped($event)\"\n #dropTarget=\"esNodesDropTarget\"\n >\n <ng-container *ngIf=\"isCustomTemplate(node)\">\n <ng-container *ngTemplateOutlet=\"$any(node)\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!isCustomTemplate(node)\">\n <es-node-entries-card\n *ngIf=\"displayType === NodeEntriesDisplayType.Grid\"\n #item\n [node]=\"node\"\n [dropdown]=\"dropdown\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"getDragData(node)\"\n esNodesDrag\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.card-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"\n isDragging && entriesService.selection.isSelected(node)\n \"\n >\n <ng-container *ngIf=\"entriesService.selection.selected.length > 1\">\n <es-node-entries-card\n *cdkDragPreview\n [node]=\"node\"\n [matBadge]=\"\n entriesService.selection.selected.length > 1\n ? entriesService.selection.selected.length\n : null\n \"\n class=\"card-drag-preview\"\n ></es-node-entries-card>\n </ng-container>\n </es-node-entries-card>\n <es-node-entries-card-small\n *ngIf=\"displayType === NodeEntriesDisplayType.SmallGrid\"\n #item\n [node]=\"node\"\n role=\"listitem\"\n cdkDrag\n [cdkDragDisabled]=\"!(getDragEnabled() | async)\"\n [cdkDragData]=\"[node]\"\n esNodesDrag\n >\n </es-node-entries-card-small>\n </ng-container>\n <div\n *ngIf=\"dropTarget.active?.canDrop?.denyExplicit\"\n class=\"card-grid-drop-blocked-container\"\n >\n <i esIcon=\"cancel\"></i>\n </div>\n <div *ngIf=\"dropTarget.active?.canDrop?.accept\" class=\"card-grid-drop-allowed-container\">\n <i\n [esIcon]=\"dropTarget.active.action === 'copy' ? 'add_circle_outline' : 'archive'\"\n ></i>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n<ng-container\n *ngIf=\"\n !entriesService.dataSource.isLoading &&\n entriesService.dataSource.hasMore() &&\n !visibleItemsLimited &&\n entriesService.paginationStrategy === 'infinite-scroll' &&\n layout !== '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\n *ngIf=\"\n entriesService.dataSource.isLoading === true ||\n entriesService.dataSource.isLoading === 'initial' ||\n (entriesService.dataSource.isLoading === 'page' &&\n entriesService.paginationStrategy === 'infinite-scroll')\n \"\n>\n <ng-container *ngTemplateOutlet=\"loading\"></ng-container>\n</ng-container>\n\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #scrollHelper>\n <ng-container *ngIf=\"layout === 'scroll'\">\n <div\n class=\"scroll-helper-left\"\n role=\"presentation\"\n (click)=\"doScroll('left')\"\n *ngIf=\"scroll.left\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('left')\">\n <i esIcon=\"keyboard_arrow_left\" [aria]=\"true\"></i>\n </button>\n </div>\n <div\n class=\"scroll-helper-right\"\n role=\"presentation\"\n (click)=\"doScroll('right')\"\n *ngIf=\"scroll.right\"\n >\n <button mat-icon-button color=\"primary\" (click)=\"$event.stopPropagation(); doScroll('right')\">\n <i esIcon=\"keyboard_arrow_right\" [aria]=\"true\"></i>\n </button>\n </div>\n </ng-container>\n</ng-template>\n", styles: ["@keyframes OrderAnimationCards{0%{transform:rotate(-.25deg)}50%{transform:rotate(.25deg)}to{transform:rotate(-.25deg)}}:host{--scroll-gradient-color: white}.order-panel{margin-left:auto}.load-more{display:flex;justify-content:center}.card-grid-wrapper{position:relative;z-index:0}.card-grid-wrapper .scroll-helper-left,.card-grid-wrapper .scroll-helper-right{position:absolute;width:15%;min-width:60px;max-width:calc(var(--cardWidth) * .4);display:flex;align-items:center;height:calc(100% - 10px);z-index:5;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.card-grid-wrapper .scroll-helper-left>button,.card-grid-wrapper .scroll-helper-right>button{background-color:#fff;color:var(--primary);box-shadow:0 0 25px #00000040}.card-grid-wrapper .scroll-helper-left{left:-1.5em;justify-content:flex-start;background:linear-gradient(to left,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-left>button{margin-left:calc(1.5em - 8px)}.card-grid-wrapper .scroll-helper-right{right:-1.5em;justify-content:flex-end;background:linear-gradient(to right,transparent 0,var(--scroll-gradient-color) calc(100% - 1.5em))}.card-grid-wrapper .scroll-helper-right>button{margin-right:calc(1.5em - 8px)}.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardWidth),1fr));grid-column-gap:20px;grid-row-gap:20px;grid-template-rows:auto;padding-block-start:1em;padding-block-end:1em}.card-grid.card-grid-layout-scroll{position:relative;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;grid-auto-flow:column;grid-template-columns:repeat(auto-fit,var(--cardWidth));grid-auto-columns:minmax(var(--cardWidth),1fr);padding:1.5em;margin:-.5em -1.5em 0}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{margin:0 1.5em}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,.1);border-radius:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar{height:10px;background-color:transparent}.card-grid.card-grid-layout-scroll::-webkit-scrollbar-thumb{max-width:20px;border-radius:10px;background-color:var(--primary)}.card-grid.card-grid-layout-scroll>.card-grid-drag-wrapper{scroll-snap-align:center;scroll-snap-stop:always}.card-grid .card-import-blocked ::ng-deep .card-meta{opacity:.75;text-decoration:line-through}.card-grid>.card-grid-drag-wrapper{position:relative}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{position:absolute;z-index:1;inset:0;display:flex;justify-content:center;align-items:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i,.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{background:radial-gradient(circle,#fff 30%,rgba(255,255,255,.0001) 70%);width:200px;height:200px;font-size:80px;display:flex;align-items:center;justify-content:center}.card-grid>.card-grid-drag-wrapper .card-grid-drop-allowed-container>i{color:var(--colorStatusPositive)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.card-grid>.card-grid-drag-wrapper .card-grid-drop-blocked-container>i{color:var(--colorStatusNegative)}.card-grid>.card-grid-drag-wrapper .selected-when-dragging{opacity:.5}.card-grid>.card-grid-drag-wrapper.cdk-drop-list-dragging>*:first-child{display:none}.card-grid.card-grid-reorder>.card-grid-order-wrapper{animation-iteration-count:infinite;animation-duration:.5s;animation-name:OrderAnimationCards}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(2n){animation-delay:0s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(odd){animation-delay:-.25s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(3n){animation-delay:-.125s}.card-grid.card-grid-reorder>.card-grid-order-wrapper:nth-of-type(5n){animation-delay:-.0625s}.card-grid.card-grid-reorder>.card-grid-order-wrapper .cdk-drag-placeholder{display:none}.card-drag-preview{width:250px}::ng-deep .es-card-grid-rearrange-drag-preview.cdk-drag-animating{transition:none}\n"] }]
|
|
304
|
+
}], ctorParameters: function () { return [{ type: i1.NodeEntriesService }, { type: i2.NodeEntriesGlobalService }, { type: i3.NodeEntriesTemplatesService }, { type: i4.NodeHelperService }, { type: i5.UIService }, { type: i0.NgZone }]; }, propDecorators: { columnChooserTrigger: [{
|
|
299
305
|
type: ViewChild,
|
|
300
306
|
args: ['columnChooserTrigger']
|
|
301
307
|
}], gridTop: [{
|
|
@@ -319,4 +325,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
|
|
|
319
325
|
type: HostBinding,
|
|
320
326
|
args: ['style.--scroll-gradient-color']
|
|
321
327
|
}] } });
|
|
322
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL25vZGUtZW50cmllcy9ub2RlLWVudHJpZXMtY2FyZC1ncmlkL25vZGUtZW50cmllcy1jYXJkLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC9ub2RlLWVudHJpZXMtY2FyZC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBUSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsT0FBTyxFQUFjLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSXJELElBQUksaUJBQWlCLEdBQWEsRUFBRSxDQUFDO0FBUXJDLE1BQU0sT0FBTyw0QkFBNEI7SUFXckMsSUFBNEMsT0FBTyxDQUFDLEtBQTJCO1FBQzNFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQ0ksU0FBUyxDQUFDLEtBQStCO1FBQ3pDLHdFQUF3RTtRQUN4RSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFrQixDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJO0lBQ1IsQ0FBQztJQWlDRCxZQUNXLGNBQXFDLEVBQ3JDLG9CQUE4QyxFQUM5QyxnQkFBNkMsRUFDN0MsRUFBYSxFQUNaLE1BQWM7UUFKZixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUEwQjtRQUM5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTZCO1FBQzdDLE9BQUUsR0FBRixFQUFFLENBQVc7UUFDWixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBMURqQiwyQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNoRCxXQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCOzs7V0FHRztRQUNNLDhCQUF5QixHQUFHLEdBQUcsQ0FBQztRQUV6QywwQkFBcUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQWtCbkQsZUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtRQUVuRDs7OztXQUlHO1FBQ0gsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRTVCOzs7V0FHRztRQUNILFdBQU0sR0FBRztZQUNMLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLEtBQUs7U0FDZixDQUFDO1FBS2UsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3RFLGFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBSyxDQUFDO1FBRTlCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBeU14QyxpQkFBWSxHQUFHLENBQUMsUUFBcUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUEvTDNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUM5QyxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUNuRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ2hELEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFDaEQsb0JBQW9CLEVBQUUsQ0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMvQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLEVBQ2pELG9CQUFvQixFQUFFLENBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDM0UsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQTZCO1FBQ2pELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzFCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixLQUFLLE9BQU8sRUFBRTtnQkFDcEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUNsRCxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVzthQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3BGLElBQUksQ0FDRCxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRSxDQUNKO2FBQ0EsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxZQUFZLENBQUMsSUFBVTtRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQTJCO1FBQ2hDLGtFQUFrRTtRQUNsRSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDckIsNkJBQTZCO1lBQzdCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3RELE9BQU87YUFDVjtTQUNKO1FBQ0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsSUFBSSxhQUFhLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUN0QyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRCwrQkFBK0I7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHNCQUFzQixDQUFDLE1BQW9CO1FBQ3ZDLGVBQWUsQ0FDWCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUN4QixDQUFDO1FBQ0YscUZBQXFGO1FBQ3JGLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUMvQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQ1osSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFFLElBQUksQ0FBQyxZQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FDakYsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELHNCQUFzQjtRQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxHQUFHLG1DQUFtQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRU8sMkJBQTJCO1FBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRU8sMkJBQTJCO1FBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2IsU0FBUyxDQUFDLENBQUMsS0FBa0QsRUFBRSxFQUFFO1lBQzlELElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN0RDtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFvQjtRQUNsQyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELGlCQUFpQjtRQUNiLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQzthQUM5QyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQzthQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjO1FBQ1YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPO2lCQUNyQyxNQUFNLENBQ0gsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUNqQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLG9DQUFvQyxDQUFDLEVBQzVFLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQ3JELElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQy9DLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFDekQsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUN4RCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLDRCQUE0QixDQUFDLEVBQ3BFLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsbUNBQW1DLENBQUMsQ0FDOUU7aUJBQ0EsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ2xELE1BQU0sT0FBTyxHQUNULGFBQWE7b0JBQ2IsQ0FBQyxDQUFDLElBQUk7b0JBQ04saURBQWlEO29CQUNqRCw2RUFBNkUsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNuQzthQUNKO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBSUQsY0FBYyxDQUFDLFFBQXdCO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2xELE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWTtZQUM5QixJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU07U0FDeEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FDdEUsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBTztRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQ2hELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUM7U0FDN0I7YUFBTTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBTztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUEyQjtRQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUM1QyxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtnQkFDdEIsT0FBTyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQzthQUNqQztpQkFBTSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7Z0JBQzlCOzs7bUJBR0c7Z0JBQ0gsT0FBTyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7YUFDOUU7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBMkI7UUFDaEMsa0VBQWtFO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pFLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxFQUNBLFVBQVU7Z0JBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7b0JBQ3RELENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ1osT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsWUFBWSx5QkFBeUIsQ0FBQztJQUMvRSxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUM7SUFDcEYsQ0FBQzs4R0EzVVEsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsNmJBYzFCLHdCQUF3QixzSkFRckIsV0FBVyxpR0FFSyxVQUFVLDZCQ2xFNUMsNDdRQWlPQTs7MkZEdkxhLDRCQUE0QjtrQkFOeEMsU0FBUzsrQkFDSSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU07dU9BWVosb0JBQW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDVyxPQUFPO3NCQUFsRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWxDLFNBQVM7c0JBRFosU0FBUzt1QkFBQyx3QkFBd0I7Z0JBUVIsY0FBYztzQkFBeEMsWUFBWTt1QkFBQyxXQUFXO2dCQUNOLE9BQU87c0JBQXpCLFNBQVM7dUJBQUMsTUFBTTtnQkFDMkIsUUFBUTtzQkFBbkQsWUFBWTt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNqQyxXQUFXO3NCQUFuQixLQUFLO2dCQTJCd0MsbUJBQW1CO3NCQUFoRSxXQUFXO3VCQUFDLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWdFbnRlciwgQ2RrRHJvcExpc3QsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgZWZmZWN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTm9kZSwgUmVzdENvbnN0YW50cyB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBHcmlkTGF5b3V0LCBOb2RlRW50cmllc0Rpc3BsYXlUeXBlIH0gZnJvbSAnLi4vZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBJdGVtc0NhcCB9IGZyb20gJy4uL2l0ZW1zLWNhcCc7XG5pbXBvcnQgeyBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UgfSBmcm9tICcuLi9ub2RlLWVudHJpZXMtZ2xvYmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFNvcnRTZWxlY3RQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3NvcnQtc2VsZWN0LXBhbmVsL3NvcnQtc2VsZWN0LXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNEYXRhU291cmNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy1kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi8uLi90eXBlcy9vcHRpb24taXRlbSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcbmltcG9ydCB7IExpc3RJdGVtU29ydCB9IGZyb20gJy4uLy4uL3R5cGVzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBEcmFnRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuXG5sZXQgZGlzcGxheWVkV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZXMtbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZCcsXG4gICAgdGVtcGxhdGVVcmw6ICdub2RlLWVudHJpZXMtY2FyZC1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlRW50cmllc0NhcmRHcmlkQ29tcG9uZW50PFQgZXh0ZW5kcyBOb2RlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlID0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZTtcbiAgICByZWFkb25seSBUYXJnZXQgPSBUYXJnZXQ7XG4gICAgLyoqXG4gICAgICogcmVsYXRpdmUgc2Nyb2xsaW5nIHdoZW4gYSBzY3JvbGxpbmcgYXJyb3cgKGxlZnQgb3IgcmlnaHQpIGlzIHVzZWRcbiAgICAgKiBhIHZhbHVlIG9mIDEgd291bGQgbWVhbiB0byBzY3JvbGwgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIGVudGlyZSBjb250ZW50XG4gICAgICovXG4gICAgcmVhZG9ubHkgU2Nyb2xsaW5nT2Zmc2V0UGVyY2VudGFnZSA9IDAuNDtcblxuICAgIGNvbHVtbkNob29zZXJWaXNpYmxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNob29zZXJUcmlnZ2VyJykgY29sdW1uQ2hvb3NlclRyaWdnZXI6IENka092ZXJsYXlPcmlnaW47XG4gICAgQFZpZXdDaGlsZCgnZ3JpZFRvcCcsIHsgc3RhdGljOiB0cnVlIH0pIHNldCBncmlkVG9wKHZhbHVlOiBUZW1wbGF0ZVJlZjx1bmtub3duPikge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyR3JpZFRvcCh2YWx1ZSk7XG4gICAgfVxuICAgIEBWaWV3Q2hpbGQoU29ydFNlbGVjdFBhbmVsQ29tcG9uZW50KVxuICAgIHNldCBzb3J0UGFuZWwodmFsdWU6IFNvcnRTZWxlY3RQYW5lbENvbXBvbmVudCkge1xuICAgICAgICAvLyBpZiAodGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlIGluc3RhbmNlb2YgTm9kZURhdGFTb3VyY2VSZW1vdGUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlIGFzIGFueSkuc29ydFBhbmVsID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB9XG4gICAgfVxuICAgIEBWaWV3Q2hpbGRyZW4oQ2RrRHJvcExpc3QpIGRyb3BMaXN0c1F1ZXJ5OiBRdWVyeUxpc3Q8Q2RrRHJvcExpc3Q+O1xuICAgIEBWaWV3Q2hpbGQoJ2dyaWQnKSBncmlkUmVmOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGRyZW4oJ2l0ZW0nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgaXRlbVJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG4gICAgQElucHV0KCkgZGlzcGxheVR5cGU6IE5vZGVFbnRyaWVzRGlzcGxheVR5cGU7XG5cbiAgICBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIERyYWctYW5kLWRyb3AsIG5vdCByZWFycmFuZ2VcbiAgICBkcm9wTGlzdHM6IENka0Ryb3BMaXN0W107XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNob3duIGl0ZW1zIGlzIGxpbWl0ZWQgYnkgYGdyaWRDb25maWcubWF4Um93c2AuXG4gICAgICpcbiAgICAgKiBBIHZhbHVlIG9mIGB0cnVlYCBkb2VzIG5vdCBtZWFuLCB0aGF0IHRoZXJlIHdvdWxkIGJlIG1vcmUgaXRlbXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIHZpc2libGVJdGVtc0xpbWl0ZWQgPSBmYWxzZTtcbiAgICBsYXlvdXQ6IEdyaWRMYXlvdXQ7XG4gICAgLyoqXG4gICAgICogdXBkYXRlcyB2aWEgYm94T2JzZXJ2ZXJcbiAgICAgKiBhbmQgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGlmIHNjcm9sbGluZyBpbiB0aGUgZGlyZWN0aW9uIGlzIGN1cnJlbnRseSBmZWFzaWJsZVxuICAgICAqL1xuICAgIHNjcm9sbCA9IHtcbiAgICAgICAgbGVmdDogZmFsc2UsXG4gICAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmVhZG9ubHkgbm9kZXMkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4Um93cyQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXQkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXRlbXNQZXJSb3dTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgICByZWFkb25seSBpdGVtc0NhcCA9IG5ldyBJdGVtc0NhcDxUPigpO1xuICAgIHByaXZhdGUgZ2xvYmFsQ3Vyc29yU3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuLS1zY3JvbGwtZ3JhZGllbnQtY29sb3InKSBzY3JvbGxHcmFkaWVudENvbG9yOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVudHJpZXNTZXJ2aWNlOiBOb2RlRW50cmllc1NlcnZpY2U8VD4sXG4gICAgICAgIHB1YmxpYyBlbnRyaWVzR2xvYmFsU2VydmljZTogTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgdGVtcGxhdGVzU2VydmljZTogTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgdWk6IFVJU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5ub2RlcyQgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGRhdGFTb3VyY2UpID0+IGRhdGFTb3VyY2U/LmNvbm5lY3QoKSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWF4Um93cyQgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLmdyaWRDb25maWckLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGdyaWRDb25maWcpID0+IGdyaWRDb25maWc/Lm1heFJvd3MgfHwgbnVsbCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxheW91dCQgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLmdyaWRDb25maWckLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGdyaWRDb25maWcpID0+IGdyaWRDb25maWc/LmxheW91dCB8fCAnZ3JpZCcpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlZmZlY3QoKCkgPT4gKHRoaXMuc2Nyb2xsR3JhZGllbnRDb2xvciA9IHRoaXMuZW50cmllc1NlcnZpY2Uuc2Nyb2xsR3JhZGllbnRDb2xvcigpKSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJJdGVtc0NhcCgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTGF5b3V0KCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaXNpYmxlSXRlbXNMaW1pdGVkKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyR3JpZFRvcChncmlkVG9wOiBUZW1wbGF0ZVJlZjx1bmtub3duPik6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS5lbnRyaWVzVG9wTWF0dGVyID0gZ3JpZFRvcDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmVudHJpZXNUb3BNYXR0ZXIgPT09IGdyaWRUb3ApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNTZXJ2aWNlLmVudHJpZXNUb3BNYXR0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVySXRlbXNDYXAoKSB7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZSRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhU291cmNlKSA9PiAoZGF0YVNvdXJjZS5pdGVtc0NhcCA9IHRoaXMuaXRlbXNDYXApKTtcbiAgICAgICAgcnhqcy5jb21iaW5lTGF0ZXN0KFt0aGlzLml0ZW1zUGVyUm93U3ViamVjdC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLCB0aGlzLm1heFJvd3MkXSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoW2l0ZW1zUGVyUm93LCBtYXhSb3dzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbWF4Um93cyA+IDAgJiYgaXRlbXNQZXJSb3cgIT09IG51bGwgPyBpdGVtc1BlclJvdyAqIG1heFJvd3MgOiBudWxsLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjYXApID0+ICh0aGlzLml0ZW1zQ2FwLmNhcCA9IGNhcCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJMYXlvdXQoKSB7XG4gICAgICAgIHRoaXMubGF5b3V0JC5zdWJzY3JpYmUoKGxheW91dCkgPT4gKHRoaXMubGF5b3V0ID0gbGF5b3V0KSk7XG4gICAgfVxuXG4gICAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0LmFjdGl2ZSA9IHNvcnQuYWN0aXZlO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQuZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydENoYW5nZS5lbWl0KHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydCk7XG4gICAgfVxuXG4gICAgbG9hZERhdGEoc291cmNlOiAnc2Nyb2xsJyB8ICdidXR0b24nKSB7XG4gICAgICAgIC8vIEBUT0RPOiBNYXliZSB0aGlzIGlzIGJldHRlciBoYW5kbGVkIGluIGEgbW9yZSBjZW50cmFsZWQgc2VydmljZVxuICAgICAgICBpZiAoc291cmNlID09PSAnc2Nyb2xsJykge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBmb290ZXJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Zvb3RlcicpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAmJiBlbGVtZW50cy5pdGVtKDApLmlubmVySFRNTC50cmltKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY291bGRMb2FkTW9yZSA9IHRoaXMuZW50cmllc1NlcnZpY2UubG9hZE1vcmUoc291cmNlKTtcbiAgICAgICAgaWYgKGNvdWxkTG9hZE1vcmUgJiYgc291cmNlID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0TmV3SXRlbVdoZW5Mb2FkZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ3VzdG9tU29ydGluZ0luUHJvZ3Jlc3NDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydENoYW5nZS5lbWl0KHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRHJvcExpc3RzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uUmVhcnJhbmdlRHJhZ0VudGVyZWQoJGV2ZW50OiBDZGtEcmFnRW50ZXIpIHtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmdldERhdGEoKSxcbiAgICAgICAgICAgICRldmVudC5pdGVtLmRhdGEsXG4gICAgICAgICAgICAkZXZlbnQuY29udGFpbmVyLmRhdGEsXG4gICAgICAgICk7XG4gICAgICAgIC8vIGBDZGtEcmFnYCBkb2Vzbid0IHJlYWxseSB3YW50IHVzIHRvIHJlYXJyYW5nZSB0aGUgaXRlbXMgd2hpbGUgZHJhZ2dpbmcuIEl0cyBjYWNoZWRcbiAgICAgICAgLy8gZWxlbWVudCBwb3NpdGlvbnMgZ2V0IG91dCBvZiBzeW5jIHVubGVzcyB3ZSB1cGRhdGUgdGhlbSBtYW51YWxseS5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BMaXN0cz8uZm9yRWFjaCgobGlzdCkgPT4gKGxpc3QuX2Ryb3BMaXN0UmVmIGFzIGFueSlbJ19jYWNoZUl0ZW1zJ10oKSksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uUmVhcnJhbmdlRHJhZ1N0YXJ0ZWQoKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsQ3Vyc29yU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZ2xvYmFsQ3Vyc29yU3R5bGUpO1xuICAgICAgICB0aGlzLmdsb2JhbEN1cnNvclN0eWxlLmlubmVySFRNTCA9IGAqIHtjdXJzb3I6IGdyYWJiaW5nICFpbXBvcnRhbnQ7IH1gO1xuICAgIH1cblxuICAgIG9uUmVhcnJhbmdlRHJhZ0VuZGVkKCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZ2xvYmFsQ3Vyc29yU3R5bGUpO1xuICAgICAgICB0aGlzLmdsb2JhbEN1cnNvclN0eWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXREcmFnU3RhcnREZWxheSgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy51aS5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gNTAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyVmlzaWJsZUl0ZW1zTGltaXRlZCgpIHtcbiAgICAgICAgdGhpcy5tYXhSb3dzJC5zdWJzY3JpYmUoKG1heFJvd3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUl0ZW1zTGltaXRlZCA9IG1heFJvd3MgPiAwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hEcm9wTGlzdHMoKSB7XG4gICAgICAgIHRoaXMuZHJvcExpc3RzID0gdGhpcy5kcm9wTGlzdHNRdWVyeS50b0FycmF5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0TmV3SXRlbVdoZW5Mb2FkZWQoKSB7XG4gICAgICAgIGNvbnN0IG9sZExlbmd0aCA9IHRoaXMuaXRlbVJlZnMubGVuZ3RoO1xuICAgICAgICB0aGlzLml0ZW1SZWZzLmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChpdGVtczogTm9kZUVudHJpZXNDYXJkR3JpZENvbXBvbmVudDxUPlsnaXRlbVJlZnMnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiBvbGRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09uY2UoaXRlbXMuZ2V0KG9sZExlbmd0aCkubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uY2UoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBvbkdyaWRTaXplQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXNQZXJSb3cgPSB0aGlzLmdldEl0ZW1zUGVyUm93KCk7XG4gICAgICAgIHRoaXMuaXRlbXNQZXJSb3dTdWJqZWN0Lm5leHQoaXRlbXNQZXJSb3cpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJdGVtc1BlclJvdygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZ3JpZFJlZi5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycpXG4gICAgICAgICAgICAuc3BsaXQoJyAnKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0U29ydENvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQ/LmNvbHVtbnM/LmZpbHRlcigoYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5lbnRyaWVzU2VydmljZS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsICdzY29yZScpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DQ01fUFJPUF9DT0xMRUNUSU9OX09SREVSRURfUE9TSVRJT04pLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DTV9QUk9QX1RJVExFKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ01fTkFNRSksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNNX1BST1BfQ19DUkVBVEVEKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ01fTU9ESUZJRURfREFURSksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX1JFUExJQ0FUSU9OTU9ESUZJRUQpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DQ01fUFJPUF9SRVBMSUNBVElPTlNPVVJDRVRJTUVTVEFNUCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zb21lKChjMikgPT4gYy50eXBlID09PSBjMi50eXBlICYmIGMyLm5hbWUgPT09IGMubmFtZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCAmJiAhdGhpcy5lbnRyaWVzU2VydmljZS5jb25maWd1cmVDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2FybmluZyA9XG4gICAgICAgICAgICAgICAgICAgICdTb3J0IGZpZWxkICcgK1xuICAgICAgICAgICAgICAgICAgICBjLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAnIHdhcyBzcGVjaWZpZWQgYnV0IGlzIG5vdCBwcmVzZW50IGFzIGEgY29sdW1uLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0l0IHdpbGwgYmUgaWdub3JlZC4gUGxlYXNlIGFsc28gY29uZmlndXJlIHRoaXMgZmllbGQgaW4gdGhlIDxsaXN0cz4gc2VjdGlvbic7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNwbGF5ZWRXYXJuaW5ncy5pbmNsdWRlcyh3YXJuaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZFdhcm5pbmdzLnB1c2god2FybmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FuRHJvcE5vZGVzID0gKGRyYWdEYXRhOiBEcmFnRGF0YTxUPikgPT4gdGhpcy5lbnRyaWVzU2VydmljZS5kcmFnRHJvcC5kcm9wQWxsb3dlZD8uKGRyYWdEYXRhKTtcblxuICAgIG9uTm9kZXNEcm9wcGVkKGRyYWdEYXRhOiBEcmFnRGF0YTxOb2RlPikge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wLmRyb3BwZWQoZHJhZ0RhdGEudGFyZ2V0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBkcmFnRGF0YS5kcmFnZ2VkTm9kZXMsXG4gICAgICAgICAgICBtb2RlOiBkcmFnRGF0YS5hY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldERyYWdFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51aS5pc1RvdWNoU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgbWFwKCh0b3VjaCkgPT4gIXRvdWNoICYmIHRoaXMuZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3A/LmRyYWdBbGxvd2VkKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXREcmFnRGF0YShub2RlOiBUKTogVFtdIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb247XG4gICAgICAgIGlmIChzZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbbm9kZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRyYWdTdGFydGVkKG5vZGU6IFQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgfVxuXG4gICAgb25EcmFnRW5kZWQoKSB7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuU2Nyb2xsKGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5ncmlkUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc2Nyb2xsTGVmdCA+IDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgIHVzZSBhIHNtYWxsIHBpeGVsIGJ1ZmZlciAoMTBweCkgYmVjYXVzZSBzY3JvbGxpbmcgYWxpZ25zIHdpdGggdGhlIHN0YXJ0IG9mIGVhY2ggY2FyZCBhbmRcbiAgICAgICAgICAgICAgICAgaXQgY2FuIGNhdXNlIHNsaWdodCBhbGlnbm1lbnQgaXNzdWVzIG9uIHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnNjcm9sbExlZnQgPCBlbGVtZW50LnNjcm9sbFdpZHRoIC0gZWxlbWVudC5jbGllbnRXaWR0aCAtIDEwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB1cGRhdGVTY3JvbGxTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0ID09PSAnc2Nyb2xsJykge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGwubGVmdCA9IHRoaXMuY2FuU2Nyb2xsKCdsZWZ0Jyk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbC5yaWdodCA9IHRoaXMuY2FuU2Nyb2xsKCdyaWdodCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZG9TY3JvbGwoZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKSB7XG4gICAgICAgIC8vIDEgaXMgZW5vdWdoIGJlY2F1c2UgdGhlIGJyb3dzZXIgd2lsbCBoYW5kbGUgaXQgdmlhIGNzcyBzbmFwcGluZ1xuICAgICAgICBjb25zdCBsZWZ0U2Nyb2xsID0gdGhpcy5ncmlkUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIHVzaW5nIHNjcm9sbCBiZWNhdXNlIGl0IHdvcmtzIG1vcmUgcmVsaWFibGUgdGhhbiBzY3JvbGxCeVxuICAgICAgICB0aGlzLmdyaWRSZWY/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHtcbiAgICAgICAgICAgIGxlZnQ6XG4gICAgICAgICAgICAgICAgbGVmdFNjcm9sbCArXG4gICAgICAgICAgICAgICAgTWF0aC5tYXgoMjUwLCByZWN0LndpZHRoICogdGhpcy5TY3JvbGxpbmdPZmZzZXRQZXJjZW50YWdlKSAqXG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICdyaWdodCcgPyAxIDogLTEpLFxuICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpc0N1c3RvbVRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlIGluc3RhbmNlb2YgQ3VzdG9tVGVtcGxhdGVzRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBpc0Jsb2NrZWQobm9kZTogTm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9JTVBPUlRfQkxPQ0tFRF0/LlswXSA9PT0gJ3RydWUnO1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjZ3JpZFRvcD5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuY29uZmlndXJlQ29sdW1uc1wiXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKGNsaWNrKT1cImNvbHVtbkNob29zZXJWaXNpYmxlJC5uZXh0KCFjb2x1bW5DaG9vc2VyVmlzaWJsZSQudmFsdWUpXCJcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI2NvbHVtbkNob29zZXJUcmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgW21hdFRvb2x0aXBdPVwiJ0xJU1RfVEFCTEUuQ09ORklHVVJFX0NPTFVNTlMnIHwgdHJhbnNsYXRlXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMSVNUX1RBQkxFLkNPTkZJR1VSRV9DT0xVTU5TJyB8IHRyYW5zbGF0ZVwiXG4gID5cbiAgICA8aSBlc0ljb249XCJzZXR0aW5nc1wiPjwvaT5cbiAgPC9idXR0b24+XG4gIDxlcy1zb3J0LXNlbGVjdC1wYW5lbFxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2Uuc29ydD8uYWxsb3dlZFwiXG4gICAgY2xhc3M9XCJvcmRlci1wYW5lbFwiXG4gICAgW2FjdGl2ZV09XCJlbnRyaWVzU2VydmljZS5zb3J0LmFjdGl2ZVwiXG4gICAgW2RpcmVjdGlvbl09XCJlbnRyaWVzU2VydmljZS5zb3J0LmRpcmVjdGlvblwiXG4gICAgW2NvbHVtbnNdPVwiZ2V0U29ydENvbHVtbnMoKVwiXG4gICAgKHNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIlxuICAgIFsoY3VzdG9tU29ydGluZ0luUHJvZ3Jlc3MpXT1cImVudHJpZXNTZXJ2aWNlLnNvcnQuY3VzdG9tU29ydGluZ0luUHJvZ3Jlc3NcIlxuICAgIChjdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc0NoYW5nZSk9XCJvbkN1c3RvbVNvcnRpbmdJblByb2dyZXNzQ2hhbmdlKClcIlxuICA+PC9lcy1zb3J0LXNlbGVjdC1wYW5lbD5cbjwvbmctdGVtcGxhdGU+XG48ZXMtY29sdW1uLWNob29zZXJcbiAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5jb25maWd1cmVDb2x1bW5zXCJcbiAgWyhjb2x1bW5zKV09XCJlbnRyaWVzU2VydmljZS5jb2x1bW5zXCJcbiAgW2NvbHVtbkNob29zZXJWaXNpYmxlXT1cImNvbHVtbkNob29zZXJWaXNpYmxlJCB8IGFzeW5jXCJcbiAgW29yaWdpbl09XCJjb2x1bW5DaG9vc2VyVHJpZ2dlclwiXG4gIChjb2x1bW5DaG9vc2VyVmlzaWJsZUNoYW5nZSk9XCJjb2x1bW5DaG9vc2VyVmlzaWJsZSQubmV4dCgkZXZlbnQpXCJcbj48L2VzLWNvbHVtbi1jaG9vc2VyPlxuPGVzLWRyb3Bkb3duICNkcm9wZG93biBbb3B0aW9uc109XCJlbnRyaWVzU2VydmljZS5vcHRpb25zPy5bVGFyZ2V0Lkxpc3REcm9wZG93bl1cIj48L2VzLWRyb3Bkb3duPlxuXG48IS0tIERvIG5vdCByZW5kZXIgdGhlIGxpc3QgZWxlbWVudCAoYHJvbGU9XCJsaXN0XCJgIG9yIGBsaWApIHdoZW4gdGhlcmUgYXJlIG5vIGxpc3QgaXRlbXMuIC0tPlxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIihub2RlcyQgfCBhc3luYyk/Lmxlbmd0aCA+IDAgfHwgKGVudHJpZXNTZXJ2aWNlLmdsb2JhbE9wdGlvbnNTdWJqZWN0IHwgYXN5bmMpPy5sZW5ndGggPiAwXCJcbj5cbiAgPCEtLSBGSVhNRTogSWRlYWxseSwgd2Ugd291bGQgdXNlIG5hdGl2ZSBgdWxgIGFuZCBgbGlgIGVsZW1lbnRzLCBidXQgdGhlc2UgaGF2ZSBhIHN0cmljdCBtb2RlbCxcbiAgdGhhdCBvbmx5IGFsbG93cyBgbGlgIGVsZW1lbnRzIGFzIGRpcmVjdCBjaGlsZHJlbiBvZiBgdWxgIGVsZW1lbnRzLiBTbyB3ZSB3b3VsZCBuZWVkIHRvIHVzZSB0aGVcbiAgbmF0aXZlIGVsZW1lbnRzIGF0IGFsbCBwbGFjZXMgd2l0aG91dCBhbnkgZWxlbWVudHMgYmV0d2VlbiBgdWxgIGFuZCBgbGlgLiAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2Uuc29ydD8uY3VzdG9tU29ydGluZ0luUHJvZ3Jlc3NcIlxuICAgIHJvbGU9XCJsaXN0XCJcbiAgICBjbGFzcz1cImNhcmQtZ3JpZCBjYXJkLWdyaWQtcmVvcmRlclwiXG4gICAgY2RrRHJvcExpc3RHcm91cFxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzJCB8IGFzeW5jIGFzIG5vZGVzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY2FyZC1ncmlkLW9yZGVyLXdyYXBwZXJcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgbm9kZSBvZiBub2RlczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiZHJvcExpc3RzXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJpXCJcbiAgICAgID5cbiAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkXG4gICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5HcmlkXCJcbiAgICAgICAgICAjaXRlbVxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0aXRlbVwiXG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJpXCJcbiAgICAgICAgICBbY2RrRHJhZ1N0YXJ0RGVsYXldPVwiZ2V0RHJhZ1N0YXJ0RGVsYXkoKVwiXG4gICAgICAgICAgY2RrRHJhZ1ByZXZpZXdDbGFzcz1cImVzLWNhcmQtZ3JpZC1yZWFycmFuZ2UtZHJhZy1wcmV2aWV3XCJcbiAgICAgICAgICAoY2RrRHJhZ0VudGVyZWQpPVwib25SZWFycmFuZ2VEcmFnRW50ZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25SZWFycmFuZ2VEcmFnU3RhcnRlZCgpXCJcbiAgICAgICAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uUmVhcnJhbmdlRHJhZ0VuZGVkKClcIlxuICAgICAgICA+PC9lcy1ub2RlLWVudHJpZXMtY2FyZD5cbiAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsXG4gICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWRcIlxuICAgICAgICAgICNpdGVtXG4gICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgW2Nka0RyYWdEYXRhXT1cImlcIlxuICAgICAgICAgIFtjZGtEcmFnU3RhcnREZWxheV09XCJnZXREcmFnU3RhcnREZWxheSgpXCJcbiAgICAgICAgICBjZGtEcmFnUHJldmlld0NsYXNzPVwiZXMtY2FyZC1ncmlkLXJlYXJyYW5nZS1kcmFnLXByZXZpZXdcIlxuICAgICAgICAgIChjZGtEcmFnRW50ZXJlZCk9XCJvblJlYXJyYW5nZURyYWdFbnRlcmVkKCRldmVudClcIlxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvblJlYXJyYW5nZURyYWdTdGFydGVkKClcIlxuICAgICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25SZWFycmFuZ2VEcmFnRW5kZWQoKVwiXG4gICAgICAgID48L2VzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkLXdyYXBwZXJcIiAqbmdJZj1cIiFlbnRyaWVzU2VydmljZS5zb3J0Py5jdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzY3JvbGxIZWxwZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2XG4gICAgICByb2xlPVwibGlzdFwiXG4gICAgICBjbGFzcz1cImNhcmQtZ3JpZCBjYXJkLWdyaWQtbGF5b3V0LXt7IGxheW91dCB9fVwiXG4gICAgICAjZ3JpZFxuICAgICAgKGVzQm9yZGVyQm94T2JzZXJ2ZXIpPVwib25HcmlkU2l6ZUNoYW5nZXMoKVwiXG4gICAgICBlc0luZmluaXRlU2Nyb2xsXG4gICAgICAoc2Nyb2xsKT1cInVwZGF0ZVNjcm9sbFN0YXRlKClcIlxuICAgICAgKHNjcm9sbGVkKT1cIiF2aXNpYmxlSXRlbXNMaW1pdGVkICYmIGxvYWREYXRhKCdzY3JvbGwnKVwiXG4gICAgPlxuICAgICAgPGVzLW5vZGUtZW50cmllcy1nbG9iYWwtb3B0aW9uc1xuICAgICAgICAqbmdJZj1cIihlbnRyaWVzU2VydmljZS5nbG9iYWxPcHRpb25zU3ViamVjdCB8IGFzeW5jKT8ubGVuZ3RoXCJcbiAgICAgICAgW2Rpc3BsYXlUeXBlXT1cImRpc3BsYXlUeXBlXCJcbiAgICAgID5cbiAgICAgIDwvZXMtbm9kZS1lbnRyaWVzLWdsb2JhbC1vcHRpb25zPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzJCB8IGFzeW5jIGFzIG5vZGVzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNhcmQtZ3JpZC1kcmFnLXdyYXBwZXJcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIG5vZGVzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICAgW2VzTm9kZXNEcm9wVGFyZ2V0XT1cIm5vZGVcIlxuICAgICAgICAgIFtjYW5Ecm9wTm9kZXNdPVwiY2FuRHJvcE5vZGVzXCJcbiAgICAgICAgICAobm9kZURyb3BwZWQpPVwib25Ob2Rlc0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgICAgI2Ryb3BUYXJnZXQ9XCJlc05vZGVzRHJvcFRhcmdldFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDdXN0b21UZW1wbGF0ZSgpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiJGFueShub2RlKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDdXN0b21UZW1wbGF0ZSgpXCI+XG4gICAgICAgICAgICA8ZXMtbm9kZS1lbnRyaWVzLWNhcmRcbiAgICAgICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5HcmlkXCJcbiAgICAgICAgICAgICAgI2l0ZW1cbiAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgIFtkcm9wZG93bl09XCJkcm9wZG93blwiXG4gICAgICAgICAgICAgIHJvbGU9XCJsaXN0aXRlbVwiXG4gICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCIhKGdldERyYWdFbmFibGVkKCkgfCBhc3luYylcIlxuICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiZ2V0RHJhZ0RhdGEobm9kZSlcIlxuICAgICAgICAgICAgICBlc05vZGVzRHJhZ1xuICAgICAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25EcmFnU3RhcnRlZChub2RlKVwiXG4gICAgICAgICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25EcmFnRW5kZWQoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5jYXJkLWltcG9ydC1ibG9ja2VkXT1cImlzQmxvY2tlZChub2RlKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC13aGVuLWRyYWdnaW5nXT1cIlxuICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmcgJiYgZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkXG4gICAgICAgICAgICAgICAgICAqY2RrRHJhZ1ByZXZpZXdcbiAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cIlxuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1kcmFnLXByZXZpZXdcIlxuICAgICAgICAgICAgICAgID48L2VzLW5vZGUtZW50cmllcy1jYXJkPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZXMtbm9kZS1lbnRyaWVzLWNhcmQ+XG4gICAgICAgICAgICA8ZXMtbm9kZS1lbnRyaWVzLWNhcmQtc21hbGxcbiAgICAgICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWRcIlxuICAgICAgICAgICAgICAjaXRlbVxuICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIiEoZ2V0RHJhZ0VuYWJsZWQoKSB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJbbm9kZV1cIlxuICAgICAgICAgICAgICBlc05vZGVzRHJhZ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9lcy1ub2RlLWVudHJpZXMtY2FyZC1zbWFsbD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImRyb3BUYXJnZXQuYWN0aXZlPy5jYW5Ecm9wPy5kZW55RXhwbGljaXRcIlxuICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWdyaWQtZHJvcC1ibG9ja2VkLWNvbnRhaW5lclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgZXNJY29uPVwiY2FuY2VsXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wVGFyZ2V0LmFjdGl2ZT8uY2FuRHJvcD8uYWNjZXB0XCIgY2xhc3M9XCJjYXJkLWdyaWQtZHJvcC1hbGxvd2VkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgW2VzSWNvbl09XCJkcm9wVGFyZ2V0LmFjdGl2ZS5hY3Rpb24gPT09ICdjb3B5JyA/ICdhZGRfY2lyY2xlX291dGxpbmUnIDogJ2FyY2hpdmUnXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwiXG4gICAgIWVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nICYmXG4gICAgZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5oYXNNb3JlKCkgJiZcbiAgICAhdmlzaWJsZUl0ZW1zTGltaXRlZCAmJlxuICAgIGVudHJpZXNTZXJ2aWNlLnBhZ2luYXRpb25TdHJhdGVneSA9PT0gJ2luZmluaXRlLXNjcm9sbCcgJiZcbiAgICBsYXlvdXQgIT09ICdzY3JvbGwnXG4gIFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJsb2FkLW1vcmVcIj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImxvYWREYXRhKCdidXR0b24nKVwiPlxuICAgICAgPGkgZXNJY29uPVwicmVmcmVzaFwiPjwvaT5cbiAgICAgIDxzcGFuPnt7ICdMT0FEX01PUkUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIlxuICAgIGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nID09PSB0cnVlIHx8XG4gICAgZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0xvYWRpbmcgPT09ICdpbml0aWFsJyB8fFxuICAgIChlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZyA9PT0gJ3BhZ2UnICYmXG4gICAgICBlbnRyaWVzU2VydmljZS5wYWdpbmF0aW9uU3RyYXRlZ3kgPT09ICdpbmZpbml0ZS1zY3JvbGwnKVxuICBcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1wiPjwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGVzLXNwaW5uZXI+PC9lcy1zcGlubmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjc2Nyb2xsSGVscGVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5b3V0ID09PSAnc2Nyb2xsJ1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2Nyb2xsLWhlbHBlci1sZWZ0XCJcbiAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgKGNsaWNrKT1cImRvU2Nyb2xsKCdsZWZ0JylcIlxuICAgICAgKm5nSWY9XCJzY3JvbGwubGVmdFwiXG4gICAgPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZG9TY3JvbGwoJ2xlZnQnKVwiPlxuICAgICAgICA8aSBlc0ljb249XCJrZXlib2FyZF9hcnJvd19sZWZ0XCIgW2FyaWFdPVwidHJ1ZVwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic2Nyb2xsLWhlbHBlci1yaWdodFwiXG4gICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgIChjbGljayk9XCJkb1Njcm9sbCgncmlnaHQnKVwiXG4gICAgICAqbmdJZj1cInNjcm9sbC5yaWdodFwiXG4gICAgPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZG9TY3JvbGwoJ3JpZ2h0JylcIj5cbiAgICAgICAgPGkgZXNJY29uPVwia2V5Ym9hcmRfYXJyb3dfcmlnaHRcIiBbYXJpYV09XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
328
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL25vZGUtZW50cmllcy9ub2RlLWVudHJpZXMtY2FyZC1ncmlkL25vZGUtZW50cmllcy1jYXJkLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC9ub2RlLWVudHJpZXMtY2FyZC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFNTCxTQUFTLEVBQ1QsWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBUSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsT0FBTyxFQUFjLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtyRCxJQUFJLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztBQVFyQyxNQUFNLE9BQU8sNEJBQTRCO0lBV3JDLElBQTRDLE9BQU8sQ0FBQyxLQUEyQjtRQUMzRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUNJLFNBQVMsQ0FBQyxLQUErQjtRQUN6Qyx3RUFBd0U7UUFDeEUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBa0IsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSTtJQUNSLENBQUM7SUFpQ0QsWUFDVyxjQUFxQyxFQUNyQyxvQkFBOEMsRUFDOUMsZ0JBQTZDLEVBQzdDLGlCQUFvQyxFQUNwQyxFQUFhLEVBQ1osTUFBYztRQUxmLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQTBCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBNkI7UUFDN0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxPQUFFLEdBQUYsRUFBRSxDQUFXO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTNEakIsMkJBQXNCLEdBQUcsc0JBQXNCLENBQUM7UUFDaEQsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUN6Qjs7O1dBR0c7UUFDTSw4QkFBeUIsR0FBRyxHQUFHLENBQUM7UUFFekMsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFrQm5ELGVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQywrQkFBK0I7UUFFbkQ7Ozs7V0FJRztRQUNILHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUU1Qjs7O1dBR0c7UUFDSCxXQUFNLEdBQUc7WUFDTCxJQUFJLEVBQUUsS0FBSztZQUNYLEtBQUssRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQUtlLHVCQUFrQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUN0RSxhQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUssQ0FBQztRQUU5QixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQTRNeEMsaUJBQVksR0FBRyxDQUFDLFFBQXFCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBak0zRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDOUMsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDbkQsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNoRCxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLEVBQ2hELG9CQUFvQixFQUFFLENBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDL0MsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxFQUNqRCxvQkFBb0IsRUFBRSxDQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzNFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUE2QjtRQUNqRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsS0FBSyxPQUFPLEVBQUU7Z0JBQ3BELFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDbEQsQ0FBQyxDQUFDLENBQUM7YUFDTjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVc7YUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0IsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNwRixJQUFJLENBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUMzQixPQUFPLEdBQUcsQ0FBQyxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckUsQ0FDSjthQUNBLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVU7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUEyQjtRQUNoQyxrRUFBa0U7UUFDbEUsSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQ3JCLDZCQUE2QjtZQUM3QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN0RCxPQUFPO2FBQ1Y7U0FDSjtRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELElBQUksYUFBYSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDdEMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7U0FDdEM7SUFDTCxDQUFDO0lBRUQsK0JBQStCO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxNQUFvQjtRQUN2QyxlQUFlLENBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNoQixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDeEIsQ0FBQztRQUNGLHFGQUFxRjtRQUNyRixvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FDL0IsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUNaLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBRSxJQUFJLENBQUMsWUFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQ2pGLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxzQkFBc0I7UUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxtQ0FBbUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQixPQUFPLEdBQUcsQ0FBQztTQUNkO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVPLDJCQUEyQjtRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVPLDJCQUEyQjtRQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87YUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEtBQWtELEVBQUUsRUFBRTtZQUM5RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxFQUFFO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdEQ7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxTQUFTLENBQUMsT0FBb0I7UUFDbEMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxpQkFBaUI7UUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sY0FBYztRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDOUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUM7YUFDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYztRQUNWLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztpQkFDckMsTUFBTSxDQUNILElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFDakMsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUM1RSxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUNyRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUMvQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQ3pELElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsZ0JBQWdCLENBQUMsRUFDeEQsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUNwRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLG1DQUFtQyxDQUFDLENBQzlFO2lCQUNBLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFO2dCQUNsRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztnQkFDekM7Ozs7Ozs7Ozt1QkFTTzthQUNWO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBSUQsY0FBYyxDQUFDLFFBQXdCO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2xELE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWTtZQUM5QixJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU07U0FDeEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FDdEUsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBTztRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQ2hELElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUM7U0FDN0I7YUFBTTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBTztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxTQUEyQjtRQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUM1QyxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtnQkFDdEIsT0FBTyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQzthQUNqQztpQkFBTSxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7Z0JBQzlCOzs7bUJBR0c7Z0JBQ0gsT0FBTyxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7YUFDOUU7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBMkI7UUFDaEMsa0VBQWtFO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUMxRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pFLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxFQUNBLFVBQVU7Z0JBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7b0JBQ3RELENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBTztRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxZQUFZLHlCQUF5QixJQUFJLENBQUUsSUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBVTtRQUNoQixPQUFPLENBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTTtZQUN4RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUM3QyxDQUFDO0lBQ04sQ0FBQzs4R0FqVlEsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsNmJBYzFCLHdCQUF3QixzSkFRckIsV0FBVyxpR0FFSyxVQUFVLDZCQ25FNUMsbzhRQWlPQTs7MkZEdExhLDRCQUE0QjtrQkFOeEMsU0FBUzsrQkFDSSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU07dVFBWVosb0JBQW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDVyxPQUFPO3NCQUFsRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWxDLFNBQVM7c0JBRFosU0FBUzt1QkFBQyx3QkFBd0I7Z0JBUVIsY0FBYztzQkFBeEMsWUFBWTt1QkFBQyxXQUFXO2dCQUNOLE9BQU87c0JBQXpCLFNBQVM7dUJBQUMsTUFBTTtnQkFDMkIsUUFBUTtzQkFBbkQsWUFBWTt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNqQyxXQUFXO3NCQUFuQixLQUFLO2dCQTJCd0MsbUJBQW1CO3NCQUFoRSxXQUFXO3VCQUFDLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWdFbnRlciwgQ2RrRHJvcExpc3QsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgZWZmZWN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTm9kZSwgUmVzdENvbnN0YW50cyB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBHcmlkTGF5b3V0LCBOb2RlRW50cmllc0Rpc3BsYXlUeXBlIH0gZnJvbSAnLi4vZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBJdGVtc0NhcCB9IGZyb20gJy4uL2l0ZW1zLWNhcCc7XG5pbXBvcnQgeyBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UgfSBmcm9tICcuLi9ub2RlLWVudHJpZXMtZ2xvYmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNUZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFNvcnRTZWxlY3RQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3NvcnQtc2VsZWN0LXBhbmVsL3NvcnQtc2VsZWN0LXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNEYXRhU291cmNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy1kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBUYXJnZXQgfSBmcm9tICcuLi8uLi90eXBlcy9vcHRpb24taXRlbSc7XG5pbXBvcnQgeyBOb2RlRW50cmllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91aS5zZXJ2aWNlJztcbmltcG9ydCB7IExpc3RJdGVtU29ydCB9IGZyb20gJy4uLy4uL3R5cGVzL2xpc3QtaXRlbSc7XG5pbXBvcnQgeyBEcmFnRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgTm9kZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWhlbHBlci5zZXJ2aWNlJztcblxubGV0IGRpc3BsYXllZFdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2VzLW5vZGUtZW50cmllcy1jYXJkLWdyaWQnLFxuICAgIHRlbXBsYXRlVXJsOiAnbm9kZS1lbnRyaWVzLWNhcmQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ25vZGUtZW50cmllcy1jYXJkLWdyaWQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUVudHJpZXNDYXJkR3JpZENvbXBvbmVudDxUIGV4dGVuZHMgTm9kZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcmVhZG9ubHkgTm9kZUVudHJpZXNEaXNwbGF5VHlwZSA9IE5vZGVFbnRyaWVzRGlzcGxheVR5cGU7XG4gICAgcmVhZG9ubHkgVGFyZ2V0ID0gVGFyZ2V0O1xuICAgIC8qKlxuICAgICAqIHJlbGF0aXZlIHNjcm9sbGluZyB3aGVuIGEgc2Nyb2xsaW5nIGFycm93IChsZWZ0IG9yIHJpZ2h0KSBpcyB1c2VkXG4gICAgICogYSB2YWx1ZSBvZiAxIHdvdWxkIG1lYW4gdG8gc2Nyb2xsIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSBlbnRpcmUgY29udGVudFxuICAgICAqL1xuICAgIHJlYWRvbmx5IFNjcm9sbGluZ09mZnNldFBlcmNlbnRhZ2UgPSAwLjQ7XG5cbiAgICBjb2x1bW5DaG9vc2VyVmlzaWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBAVmlld0NoaWxkKCdjb2x1bW5DaG9vc2VyVHJpZ2dlcicpIGNvbHVtbkNob29zZXJUcmlnZ2VyOiBDZGtPdmVybGF5T3JpZ2luO1xuICAgIEBWaWV3Q2hpbGQoJ2dyaWRUb3AnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZXQgZ3JpZFRvcCh2YWx1ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4pIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckdyaWRUb3AodmFsdWUpO1xuICAgIH1cbiAgICBAVmlld0NoaWxkKFNvcnRTZWxlY3RQYW5lbENvbXBvbmVudClcbiAgICBzZXQgc29ydFBhbmVsKHZhbHVlOiBTb3J0U2VsZWN0UGFuZWxDb21wb25lbnQpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIE5vZGVEYXRhU291cmNlUmVtb3RlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZSBhcyBhbnkpLnNvcnRQYW5lbCA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gfVxuICAgIH1cbiAgICBAVmlld0NoaWxkcmVuKENka0Ryb3BMaXN0KSBkcm9wTGlzdHNRdWVyeTogUXVlcnlMaXN0PENka0Ryb3BMaXN0PjtcbiAgICBAVmlld0NoaWxkKCdncmlkJykgZ3JpZFJlZjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkcmVuKCdpdGVtJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGl0ZW1SZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+O1xuICAgIEBJbnB1dCgpIGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuXG4gICAgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBEcmFnLWFuZC1kcm9wLCBub3QgcmVhcnJhbmdlXG4gICAgZHJvcExpc3RzOiBDZGtEcm9wTGlzdFtdO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzaG93biBpdGVtcyBpcyBsaW1pdGVkIGJ5IGBncmlkQ29uZmlnLm1heFJvd3NgLlxuICAgICAqXG4gICAgICogQSB2YWx1ZSBvZiBgdHJ1ZWAgZG9lcyBub3QgbWVhbiwgdGhhdCB0aGVyZSB3b3VsZCBiZSBtb3JlIGl0ZW1zIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICB2aXNpYmxlSXRlbXNMaW1pdGVkID0gZmFsc2U7XG4gICAgbGF5b3V0OiBHcmlkTGF5b3V0O1xuICAgIC8qKlxuICAgICAqIHVwZGF0ZXMgdmlhIGJveE9ic2VydmVyXG4gICAgICogYW5kIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBpZiBzY3JvbGxpbmcgaW4gdGhlIGRpcmVjdGlvbiBpcyBjdXJyZW50bHkgZmVhc2libGVcbiAgICAgKi9cbiAgICBzY3JvbGwgPSB7XG4gICAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgICByaWdodDogZmFsc2UsXG4gICAgfTtcblxuICAgIHJlYWRvbmx5IG5vZGVzJDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heFJvd3MkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0JDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zUGVyUm93U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gICAgcmVhZG9ubHkgaXRlbXNDYXAgPSBuZXcgSXRlbXNDYXA8VD4oKTtcbiAgICBwcml2YXRlIGdsb2JhbEN1cnNvclN0eWxlOiBIVE1MU3R5bGVFbGVtZW50O1xuICAgIHByaXZhdGUgZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tc2Nyb2xsLWdyYWRpZW50LWNvbG9yJykgc2Nyb2xsR3JhZGllbnRDb2xvcjogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbnRyaWVzU2VydmljZTogTm9kZUVudHJpZXNTZXJ2aWNlPFQ+LFxuICAgICAgICBwdWJsaWMgZW50cmllc0dsb2JhbFNlcnZpY2U6IE5vZGVFbnRyaWVzR2xvYmFsU2VydmljZSxcbiAgICAgICAgcHVibGljIHRlbXBsYXRlc1NlcnZpY2U6IE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSxcbiAgICAgICAgcHVibGljIG5vZGVIZWxwZXJTZXJ2aWNlOiBOb2RlSGVscGVyU2VydmljZSxcbiAgICAgICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgKSB7XG4gICAgICAgIHRoaXMubm9kZXMkID0gdGhpcy5lbnRyaWVzU2VydmljZS5kYXRhU291cmNlJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChkYXRhU291cmNlKSA9PiBkYXRhU291cmNlPy5jb25uZWN0KCkpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm1heFJvd3MkID0gdGhpcy5lbnRyaWVzU2VydmljZS5ncmlkQ29uZmlnJC5waXBlKFxuICAgICAgICAgICAgbWFwKChncmlkQ29uZmlnKSA9PiBncmlkQ29uZmlnPy5tYXhSb3dzIHx8IG51bGwpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sYXlvdXQkID0gdGhpcy5lbnRyaWVzU2VydmljZS5ncmlkQ29uZmlnJC5waXBlKFxuICAgICAgICAgICAgbWFwKChncmlkQ29uZmlnKSA9PiBncmlkQ29uZmlnPy5sYXlvdXQgfHwgJ2dyaWQnKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWZmZWN0KCgpID0+ICh0aGlzLnNjcm9sbEdyYWRpZW50Q29sb3IgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNjcm9sbEdyYWRpZW50Q29sb3IoKSkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVySXRlbXNDYXAoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckxheW91dCgpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlzaWJsZUl0ZW1zTGltaXRlZCgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckdyaWRUb3AoZ3JpZFRvcDogVGVtcGxhdGVSZWY8dW5rbm93bj4pOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1NlcnZpY2UuZW50cmllc1RvcE1hdHRlciA9IGdyaWRUb3A7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVzU2VydmljZS5lbnRyaWVzVG9wTWF0dGVyID09PSBncmlkVG9wKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzU2VydmljZS5lbnRyaWVzVG9wTWF0dGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3Rlckl0ZW1zQ2FwKCkge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0YVNvdXJjZSkgPT4gKGRhdGFTb3VyY2UuaXRlbXNDYXAgPSB0aGlzLml0ZW1zQ2FwKSk7XG4gICAgICAgIHJ4anMuY29tYmluZUxhdGVzdChbdGhpcy5pdGVtc1BlclJvd1N1YmplY3QucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKSwgdGhpcy5tYXhSb3dzJF0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKFtpdGVtc1BlclJvdywgbWF4Um93c10pID0+XG4gICAgICAgICAgICAgICAgICAgIG1heFJvd3MgPiAwICYmIGl0ZW1zUGVyUm93ICE9PSBudWxsID8gaXRlbXNQZXJSb3cgKiBtYXhSb3dzIDogbnVsbCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2FwKSA9PiAodGhpcy5pdGVtc0NhcC5jYXAgPSBjYXApKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyTGF5b3V0KCkge1xuICAgICAgICB0aGlzLmxheW91dCQuc3Vic2NyaWJlKChsYXlvdXQpID0+ICh0aGlzLmxheW91dCA9IGxheW91dCkpO1xuICAgIH1cblxuICAgIG9uU29ydENoYW5nZShzb3J0OiBTb3J0KSB7XG4gICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydC5hY3RpdmUgPSBzb3J0LmFjdGl2ZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0LmRpcmVjdGlvbiA9IHNvcnQuZGlyZWN0aW9uO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnRDaGFuZ2UuZW1pdCh0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQpO1xuICAgIH1cblxuICAgIGxvYWREYXRhKHNvdXJjZTogJ3Njcm9sbCcgfCAnYnV0dG9uJykge1xuICAgICAgICAvLyBAVE9ETzogTWF5YmUgdGhpcyBpcyBiZXR0ZXIgaGFuZGxlZCBpbiBhIG1vcmUgY2VudHJhbGVkIHNlcnZpY2VcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJ3Njcm9sbCcpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgZm9vdGVyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdmb290ZXInKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggJiYgZWxlbWVudHMuaXRlbSgwKS5pbm5lckhUTUwudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdWxkTG9hZE1vcmUgPSB0aGlzLmVudHJpZXNTZXJ2aWNlLmxvYWRNb3JlKHNvdXJjZSk7XG4gICAgICAgIGlmIChjb3VsZExvYWRNb3JlICYmIHNvdXJjZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNGaXJzdE5ld0l0ZW1XaGVuTG9hZGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkN1c3RvbVNvcnRpbmdJblByb2dyZXNzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnRDaGFuZ2UuZW1pdCh0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaERyb3BMaXN0cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblJlYXJyYW5nZURyYWdFbnRlcmVkKCRldmVudDogQ2RrRHJhZ0VudGVyKSB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKCksXG4gICAgICAgICAgICAkZXZlbnQuaXRlbS5kYXRhLFxuICAgICAgICAgICAgJGV2ZW50LmNvbnRhaW5lci5kYXRhLFxuICAgICAgICApO1xuICAgICAgICAvLyBgQ2RrRHJhZ2AgZG9lc24ndCByZWFsbHkgd2FudCB1cyB0byByZWFycmFuZ2UgdGhlIGl0ZW1zIHdoaWxlIGRyYWdnaW5nLiBJdHMgY2FjaGVkXG4gICAgICAgIC8vIGVsZW1lbnQgcG9zaXRpb25zIGdldCBvdXQgb2Ygc3luYyB1bmxlc3Mgd2UgdXBkYXRlIHRoZW0gbWFudWFsbHkuXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wTGlzdHM/LmZvckVhY2goKGxpc3QpID0+IChsaXN0Ll9kcm9wTGlzdFJlZiBhcyBhbnkpWydfY2FjaGVJdGVtcyddKCkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvblJlYXJyYW5nZURyYWdTdGFydGVkKCkge1xuICAgICAgICB0aGlzLmdsb2JhbEN1cnNvclN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmdsb2JhbEN1cnNvclN0eWxlKTtcbiAgICAgICAgdGhpcy5nbG9iYWxDdXJzb3JTdHlsZS5pbm5lckhUTUwgPSBgKiB7Y3Vyc29yOiBncmFiYmluZyAhaW1wb3J0YW50OyB9YDtcbiAgICB9XG5cbiAgICBvblJlYXJyYW5nZURyYWdFbmRlZCgpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmdsb2JhbEN1cnNvclN0eWxlKTtcbiAgICAgICAgdGhpcy5nbG9iYWxDdXJzb3JTdHlsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0RHJhZ1N0YXJ0RGVsYXkoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMudWkuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDUwMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclZpc2libGVJdGVtc0xpbWl0ZWQoKSB7XG4gICAgICAgIHRoaXMubWF4Um93cyQuc3Vic2NyaWJlKChtYXhSb3dzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVJdGVtc0xpbWl0ZWQgPSBtYXhSb3dzID4gMDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWZyZXNoRHJvcExpc3RzKCkge1xuICAgICAgICB0aGlzLmRyb3BMaXN0cyA9IHRoaXMuZHJvcExpc3RzUXVlcnkudG9BcnJheSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNGaXJzdE5ld0l0ZW1XaGVuTG9hZGVkKCkge1xuICAgICAgICBjb25zdCBvbGRMZW5ndGggPSB0aGlzLml0ZW1SZWZzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5pdGVtUmVmcy5jaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoaXRlbXM6IE5vZGVFbnRyaWVzQ2FyZEdyaWRDb21wb25lbnQ8VD5bJ2l0ZW1SZWZzJ10pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gb2xkTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNPbmNlKGl0ZW1zLmdldChvbGRMZW5ndGgpLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNPbmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgb25HcmlkU2l6ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zUGVyUm93ID0gdGhpcy5nZXRJdGVtc1BlclJvdygpO1xuICAgICAgICB0aGlzLml0ZW1zUGVyUm93U3ViamVjdC5uZXh0KGl0ZW1zUGVyUm93KTtcbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxTdGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SXRlbXNQZXJSb3coKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkUmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmdyaWRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCdncmlkLXRlbXBsYXRlLWNvbHVtbnMnKVxuICAgICAgICAgICAgLnNwbGl0KCcgJykubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldFNvcnRDb2x1bW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Py5jb2x1bW5zPy5maWx0ZXIoKGMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZW50cmllc1NlcnZpY2UuY29sdW1uc1xuICAgICAgICAgICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCAnc2NvcmUnKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ0NNX1BST1BfQ09MTEVDVElPTl9PUkRFUkVEX1BPU0lUSU9OKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ01fUFJPUF9USVRMRSksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNNX05BTUUpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DTV9QUk9QX0NfQ1JFQVRFRCksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0SXRlbVNvcnQoJ05PREUnLCBSZXN0Q29uc3RhbnRzLkNNX01PRElGSUVEX0RBVEUpLFxuICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdEl0ZW1Tb3J0KCdOT0RFJywgUmVzdENvbnN0YW50cy5DQ01fUFJPUF9SRVBMSUNBVElPTk1PRElGSUVEKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RJdGVtU29ydCgnTk9ERScsIFJlc3RDb25zdGFudHMuQ0NNX1BST1BfUkVQTElDQVRJT05TT1VSQ0VUSU1FU1RBTVApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc29tZSgoYzIpID0+IGMudHlwZSA9PT0gYzIudHlwZSAmJiBjMi5uYW1lID09PSBjLm5hbWUpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQgJiYgIXRoaXMuZW50cmllc1NlcnZpY2UuY29uZmlndXJlQ29sdW1ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQ/LmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FybmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAnU29ydCBmaWVsZCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMubmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIHdhcyBzcGVjaWZpZWQgYnV0IGlzIG5vdCBwcmVzZW50IGFzIGEgY29sdW1uLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdJdCB3aWxsIGJlIGlnbm9yZWQuIFBsZWFzZSBhbHNvIGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGluIHRoZSA8bGlzdHM+IHNlY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpc3BsYXllZFdhcm5pbmdzLmluY2x1ZGVzKHdhcm5pbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRXYXJuaW5ncy5wdXNoKHdhcm5pbmcpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbkRyb3BOb2RlcyA9IChkcmFnRGF0YTogRHJhZ0RhdGE8VD4pID0+IHRoaXMuZW50cmllc1NlcnZpY2UuZHJhZ0Ryb3AuZHJvcEFsbG93ZWQ/LihkcmFnRGF0YSk7XG5cbiAgICBvbk5vZGVzRHJvcHBlZChkcmFnRGF0YTogRHJhZ0RhdGE8Tm9kZT4pIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5kcmFnRHJvcC5kcm9wcGVkKGRyYWdEYXRhLnRhcmdldCwge1xuICAgICAgICAgICAgZWxlbWVudDogZHJhZ0RhdGEuZHJhZ2dlZE5vZGVzLFxuICAgICAgICAgICAgbW9kZTogZHJhZ0RhdGEuYWN0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREcmFnRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWkuaXNUb3VjaFN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgodG91Y2gpID0+ICF0b3VjaCAmJiB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wPy5kcmFnQWxsb3dlZCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0RHJhZ0RhdGEobm9kZTogVCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW25vZGVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EcmFnU3RhcnRlZChub2RlOiBUKSB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uRHJhZ0VuZGVkKCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhblNjcm9sbChkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ3JpZFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnNjcm9sbExlZnQgPiAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICB1c2UgYSBzbWFsbCBwaXhlbCBidWZmZXIgKDEwcHgpIGJlY2F1c2Ugc2Nyb2xsaW5nIGFsaWducyB3aXRoIHRoZSBzdGFydCBvZiBlYWNoIGNhcmQgYW5kXG4gICAgICAgICAgICAgICAgIGl0IGNhbiBjYXVzZSBzbGlnaHQgYWxpZ25tZW50IGlzc3VlcyBvbiB0aGUgZW5kIG9mIHRoZSBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zY3JvbGxMZWZ0IDwgZWxlbWVudC5zY3JvbGxXaWR0aCAtIGVsZW1lbnQuY2xpZW50V2lkdGggLSAxMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdXBkYXRlU2Nyb2xsU3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxheW91dCA9PT0gJ3Njcm9sbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsLmxlZnQgPSB0aGlzLmNhblNjcm9sbCgnbGVmdCcpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGwucmlnaHQgPSB0aGlzLmNhblNjcm9sbCgncmlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRvU2Nyb2xsKGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgICAgICAvLyAxIGlzIGVub3VnaCBiZWNhdXNlIHRoZSBicm93c2VyIHdpbGwgaGFuZGxlIGl0IHZpYSBjc3Mgc25hcHBpbmdcbiAgICAgICAgY29uc3QgbGVmdFNjcm9sbCA9IHRoaXMuZ3JpZFJlZj8ubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkUmVmPy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAvLyB1c2luZyBzY3JvbGwgYmVjYXVzZSBpdCB3b3JrcyBtb3JlIHJlbGlhYmxlIHRoYW4gc2Nyb2xsQnlcbiAgICAgICAgdGhpcy5ncmlkUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7XG4gICAgICAgICAgICBsZWZ0OlxuICAgICAgICAgICAgICAgIGxlZnRTY3JvbGwgK1xuICAgICAgICAgICAgICAgIE1hdGgubWF4KDI1MCwgcmVjdC53aWR0aCAqIHRoaXMuU2Nyb2xsaW5nT2Zmc2V0UGVyY2VudGFnZSkgKlxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAncmlnaHQnID8gMSA6IC0xKSxcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNDdXN0b21UZW1wbGF0ZShub2RlOiBUKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBDdXN0b21UZW1wbGF0ZXNEYXRhU291cmNlIHx8ICgobm9kZSBhcyBhbnkpLmVsZW1lbnRSZWYpO1xuICAgIH1cblxuICAgIGlzQmxvY2tlZChub2RlOiBOb2RlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBub2RlLnByb3BlcnRpZXM/LltSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX0lNUE9SVF9CTE9DS0VEXT8uWzBdID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgIHRoaXMubm9kZUhlbHBlclNlcnZpY2UuaXNOb2RlUmV2b2tlZChub2RlKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjZ3JpZFRvcD5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuY29uZmlndXJlQ29sdW1uc1wiXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKGNsaWNrKT1cImNvbHVtbkNob29zZXJWaXNpYmxlJC5uZXh0KCFjb2x1bW5DaG9vc2VyVmlzaWJsZSQudmFsdWUpXCJcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI2NvbHVtbkNob29zZXJUcmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgW21hdFRvb2x0aXBdPVwiJ0xJU1RfVEFCTEUuQ09ORklHVVJFX0NPTFVNTlMnIHwgdHJhbnNsYXRlXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMSVNUX1RBQkxFLkNPTkZJR1VSRV9DT0xVTU5TJyB8IHRyYW5zbGF0ZVwiXG4gID5cbiAgICA8aSBlc0ljb249XCJzZXR0aW5nc1wiPjwvaT5cbiAgPC9idXR0b24+XG4gIDxlcy1zb3J0LXNlbGVjdC1wYW5lbFxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2Uuc29ydD8uYWxsb3dlZFwiXG4gICAgY2xhc3M9XCJvcmRlci1wYW5lbFwiXG4gICAgW2FjdGl2ZV09XCJlbnRyaWVzU2VydmljZS5zb3J0LmFjdGl2ZVwiXG4gICAgW2RpcmVjdGlvbl09XCJlbnRyaWVzU2VydmljZS5zb3J0LmRpcmVjdGlvblwiXG4gICAgW2NvbHVtbnNdPVwiZ2V0U29ydENvbHVtbnMoKVwiXG4gICAgKHNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIlxuICAgIFsoY3VzdG9tU29ydGluZ0luUHJvZ3Jlc3MpXT1cImVudHJpZXNTZXJ2aWNlLnNvcnQuY3VzdG9tU29ydGluZ0luUHJvZ3Jlc3NcIlxuICAgIChjdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc0NoYW5nZSk9XCJvbkN1c3RvbVNvcnRpbmdJblByb2dyZXNzQ2hhbmdlKClcIlxuICA+PC9lcy1zb3J0LXNlbGVjdC1wYW5lbD5cbjwvbmctdGVtcGxhdGU+XG48ZXMtY29sdW1uLWNob29zZXJcbiAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5jb25maWd1cmVDb2x1bW5zXCJcbiAgWyhjb2x1bW5zKV09XCJlbnRyaWVzU2VydmljZS5jb2x1bW5zXCJcbiAgW2NvbHVtbkNob29zZXJWaXNpYmxlXT1cImNvbHVtbkNob29zZXJWaXNpYmxlJCB8IGFzeW5jXCJcbiAgW29yaWdpbl09XCJjb2x1bW5DaG9vc2VyVHJpZ2dlclwiXG4gIChjb2x1bW5DaG9vc2VyVmlzaWJsZUNoYW5nZSk9XCJjb2x1bW5DaG9vc2VyVmlzaWJsZSQubmV4dCgkZXZlbnQpXCJcbj48L2VzLWNvbHVtbi1jaG9vc2VyPlxuPGVzLWRyb3Bkb3duICNkcm9wZG93biBbb3B0aW9uc109XCJlbnRyaWVzU2VydmljZS5vcHRpb25zPy5bVGFyZ2V0Lkxpc3REcm9wZG93bl1cIj48L2VzLWRyb3Bkb3duPlxuXG48IS0tIERvIG5vdCByZW5kZXIgdGhlIGxpc3QgZWxlbWVudCAoYHJvbGU9XCJsaXN0XCJgIG9yIGBsaWApIHdoZW4gdGhlcmUgYXJlIG5vIGxpc3QgaXRlbXMuIC0tPlxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIihub2RlcyQgfCBhc3luYyk/Lmxlbmd0aCA+IDAgfHwgKGVudHJpZXNTZXJ2aWNlLmdsb2JhbE9wdGlvbnNTdWJqZWN0IHwgYXN5bmMpPy5sZW5ndGggPiAwXCJcbj5cbiAgPCEtLSBGSVhNRTogSWRlYWxseSwgd2Ugd291bGQgdXNlIG5hdGl2ZSBgdWxgIGFuZCBgbGlgIGVsZW1lbnRzLCBidXQgdGhlc2UgaGF2ZSBhIHN0cmljdCBtb2RlbCxcbiAgdGhhdCBvbmx5IGFsbG93cyBgbGlgIGVsZW1lbnRzIGFzIGRpcmVjdCBjaGlsZHJlbiBvZiBgdWxgIGVsZW1lbnRzLiBTbyB3ZSB3b3VsZCBuZWVkIHRvIHVzZSB0aGVcbiAgbmF0aXZlIGVsZW1lbnRzIGF0IGFsbCBwbGFjZXMgd2l0aG91dCBhbnkgZWxlbWVudHMgYmV0d2VlbiBgdWxgIGFuZCBgbGlgLiAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2Uuc29ydD8uY3VzdG9tU29ydGluZ0luUHJvZ3Jlc3NcIlxuICAgIHJvbGU9XCJsaXN0XCJcbiAgICBjbGFzcz1cImNhcmQtZ3JpZCBjYXJkLWdyaWQtcmVvcmRlclwiXG4gICAgY2RrRHJvcExpc3RHcm91cFxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzJCB8IGFzeW5jIGFzIG5vZGVzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY2FyZC1ncmlkLW9yZGVyLXdyYXBwZXJcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgbm9kZSBvZiBub2RlczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiZHJvcExpc3RzXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJpXCJcbiAgICAgID5cbiAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkXG4gICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5HcmlkXCJcbiAgICAgICAgICAjaXRlbVxuICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgIHJvbGU9XCJsaXN0aXRlbVwiXG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJpXCJcbiAgICAgICAgICBbY2RrRHJhZ1N0YXJ0RGVsYXldPVwiZ2V0RHJhZ1N0YXJ0RGVsYXkoKVwiXG4gICAgICAgICAgY2RrRHJhZ1ByZXZpZXdDbGFzcz1cImVzLWNhcmQtZ3JpZC1yZWFycmFuZ2UtZHJhZy1wcmV2aWV3XCJcbiAgICAgICAgICAoY2RrRHJhZ0VudGVyZWQpPVwib25SZWFycmFuZ2VEcmFnRW50ZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25SZWFycmFuZ2VEcmFnU3RhcnRlZCgpXCJcbiAgICAgICAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uUmVhcnJhbmdlRHJhZ0VuZGVkKClcIlxuICAgICAgICA+PC9lcy1ub2RlLWVudHJpZXMtY2FyZD5cbiAgICAgICAgPGVzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsXG4gICAgICAgICAgKm5nSWY9XCJkaXNwbGF5VHlwZSA9PT0gTm9kZUVudHJpZXNEaXNwbGF5VHlwZS5TbWFsbEdyaWRcIlxuICAgICAgICAgICNpdGVtXG4gICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgW2Nka0RyYWdEYXRhXT1cImlcIlxuICAgICAgICAgIFtjZGtEcmFnU3RhcnREZWxheV09XCJnZXREcmFnU3RhcnREZWxheSgpXCJcbiAgICAgICAgICBjZGtEcmFnUHJldmlld0NsYXNzPVwiZXMtY2FyZC1ncmlkLXJlYXJyYW5nZS1kcmFnLXByZXZpZXdcIlxuICAgICAgICAgIChjZGtEcmFnRW50ZXJlZCk9XCJvblJlYXJyYW5nZURyYWdFbnRlcmVkKCRldmVudClcIlxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvblJlYXJyYW5nZURyYWdTdGFydGVkKClcIlxuICAgICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25SZWFycmFuZ2VEcmFnRW5kZWQoKVwiXG4gICAgICAgID48L2VzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkLXdyYXBwZXJcIiAqbmdJZj1cIiFlbnRyaWVzU2VydmljZS5zb3J0Py5jdXN0b21Tb3J0aW5nSW5Qcm9ncmVzc1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzY3JvbGxIZWxwZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2XG4gICAgICByb2xlPVwibGlzdFwiXG4gICAgICBjbGFzcz1cImNhcmQtZ3JpZCBjYXJkLWdyaWQtbGF5b3V0LXt7IGxheW91dCB9fVwiXG4gICAgICAjZ3JpZFxuICAgICAgKGVzQm9yZGVyQm94T2JzZXJ2ZXIpPVwib25HcmlkU2l6ZUNoYW5nZXMoKVwiXG4gICAgICBlc0luZmluaXRlU2Nyb2xsXG4gICAgICAoc2Nyb2xsKT1cInVwZGF0ZVNjcm9sbFN0YXRlKClcIlxuICAgICAgKHNjcm9sbGVkKT1cIiF2aXNpYmxlSXRlbXNMaW1pdGVkICYmIGxvYWREYXRhKCdzY3JvbGwnKVwiXG4gICAgPlxuICAgICAgPGVzLW5vZGUtZW50cmllcy1nbG9iYWwtb3B0aW9uc1xuICAgICAgICAqbmdJZj1cIihlbnRyaWVzU2VydmljZS5nbG9iYWxPcHRpb25zU3ViamVjdCB8IGFzeW5jKT8ubGVuZ3RoXCJcbiAgICAgICAgW2Rpc3BsYXlUeXBlXT1cImRpc3BsYXlUeXBlXCJcbiAgICAgID5cbiAgICAgIDwvZXMtbm9kZS1lbnRyaWVzLWdsb2JhbC1vcHRpb25zPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzJCB8IGFzeW5jIGFzIG5vZGVzXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNhcmQtZ3JpZC1kcmFnLXdyYXBwZXJcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIG5vZGVzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICAgW2VzTm9kZXNEcm9wVGFyZ2V0XT1cIm5vZGVcIlxuICAgICAgICAgIFtjYW5Ecm9wTm9kZXNdPVwiY2FuRHJvcE5vZGVzXCJcbiAgICAgICAgICAobm9kZURyb3BwZWQpPVwib25Ob2Rlc0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgICAgI2Ryb3BUYXJnZXQ9XCJlc05vZGVzRHJvcFRhcmdldFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDdXN0b21UZW1wbGF0ZShub2RlKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIiRhbnkobm9kZSlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQ3VzdG9tVGVtcGxhdGUobm9kZSlcIj5cbiAgICAgICAgICAgIDxlcy1ub2RlLWVudHJpZXMtY2FyZFxuICAgICAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLkdyaWRcIlxuICAgICAgICAgICAgICAjaXRlbVxuICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgW2Ryb3Bkb3duXT1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIiEoZ2V0RHJhZ0VuYWJsZWQoKSB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJnZXREcmFnRGF0YShub2RlKVwiXG4gICAgICAgICAgICAgIGVzTm9kZXNEcmFnXG4gICAgICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKG5vZGUpXCJcbiAgICAgICAgICAgICAgKGNka0RyYWdFbmRlZCk9XCJvbkRyYWdFbmRlZCgpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmNhcmQtaW1wb3J0LWJsb2NrZWRdPVwiaXNCbG9ja2VkKG5vZGUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkLXdoZW4tZHJhZ2dpbmddPVwiXG4gICAgICAgICAgICAgICAgaXNEcmFnZ2luZyAmJiBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICA8ZXMtbm9kZS1lbnRyaWVzLWNhcmRcbiAgICAgICAgICAgICAgICAgICpjZGtEcmFnUHJldmlld1xuICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWRyYWctcHJldmlld1wiXG4gICAgICAgICAgICAgICAgPjwvZXMtbm9kZS1lbnRyaWVzLWNhcmQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9lcy1ub2RlLWVudHJpZXMtY2FyZD5cbiAgICAgICAgICAgIDxlcy1ub2RlLWVudHJpZXMtY2FyZC1zbWFsbFxuICAgICAgICAgICAgICAqbmdJZj1cImRpc3BsYXlUeXBlID09PSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlNtYWxsR3JpZFwiXG4gICAgICAgICAgICAgICNpdGVtXG4gICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICByb2xlPVwibGlzdGl0ZW1cIlxuICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiIShnZXREcmFnRW5hYmxlZCgpIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIltub2RlXVwiXG4gICAgICAgICAgICAgIGVzTm9kZXNEcmFnXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2VzLW5vZGUtZW50cmllcy1jYXJkLXNtYWxsPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiZHJvcFRhcmdldC5hY3RpdmU/LmNhbkRyb3A/LmRlbnlFeHBsaWNpdFwiXG4gICAgICAgICAgICBjbGFzcz1cImNhcmQtZ3JpZC1kcm9wLWJsb2NrZWQtY29udGFpbmVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBlc0ljb249XCJjYW5jZWxcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImRyb3BUYXJnZXQuYWN0aXZlPy5jYW5Ecm9wPy5hY2NlcHRcIiBjbGFzcz1cImNhcmQtZ3JpZC1kcm9wLWFsbG93ZWQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBbZXNJY29uXT1cImRyb3BUYXJnZXQuYWN0aXZlLmFjdGlvbiA9PT0gJ2NvcHknID8gJ2FkZF9jaXJjbGVfb3V0bGluZScgOiAnYXJjaGl2ZSdcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJcbiAgICAhZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0xvYWRpbmcgJiZcbiAgICBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmhhc01vcmUoKSAmJlxuICAgICF2aXNpYmxlSXRlbXNMaW1pdGVkICYmXG4gICAgZW50cmllc1NlcnZpY2UucGFnaW5hdGlvblN0cmF0ZWd5ID09PSAnaW5maW5pdGUtc2Nyb2xsJyAmJlxuICAgIGxheW91dCAhPT0gJ3Njcm9sbCdcbiAgXCJcbj5cbiAgPGRpdiBjbGFzcz1cImxvYWQtbW9yZVwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwibG9hZERhdGEoJ2J1dHRvbicpXCI+XG4gICAgICA8aSBlc0ljb249XCJyZWZyZXNoXCI+PC9pPlxuICAgICAgPHNwYW4+e3sgJ0xPQURfTU9SRScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwiXG4gICAgZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5pc0xvYWRpbmcgPT09IHRydWUgfHxcbiAgICBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZyA9PT0gJ2luaXRpYWwnIHx8XG4gICAgKGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nID09PSAncGFnZScgJiZcbiAgICAgIGVudHJpZXNTZXJ2aWNlLnBhZ2luYXRpb25TdHJhdGVneSA9PT0gJ2luZmluaXRlLXNjcm9sbCcpXG4gIFwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZXMtc3Bpbm5lcj48L2VzLXNwaW5uZXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNzY3JvbGxIZWxwZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYXlvdXQgPT09ICdzY3JvbGwnXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzY3JvbGwtaGVscGVyLWxlZnRcIlxuICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAoY2xpY2spPVwiZG9TY3JvbGwoJ2xlZnQnKVwiXG4gICAgICAqbmdJZj1cInNjcm9sbC5sZWZ0XCJcbiAgICA+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBkb1Njcm9sbCgnbGVmdCcpXCI+XG4gICAgICAgIDxpIGVzSWNvbj1cImtleWJvYXJkX2Fycm93X2xlZnRcIiBbYXJpYV09XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzY3JvbGwtaGVscGVyLXJpZ2h0XCJcbiAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgKGNsaWNrKT1cImRvU2Nyb2xsKCdyaWdodCcpXCJcbiAgICAgICpuZ0lmPVwic2Nyb2xsLnJpZ2h0XCJcbiAgICA+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBkb1Njcm9sbCgncmlnaHQnKVwiPlxuICAgICAgICA8aSBlc0ljb249XCJrZXlib2FyZF9hcnJvd19yaWdodFwiIFthcmlhXT1cInRydWVcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|