@cqa-lib/cqa-ui 1.1.543 → 1.1.545
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/templates/modular-table-template/dialogs/delete-folder-dialog.component.mjs +7 -7
- package/esm2020/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.mjs +23 -23
- package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +2 -2
- package/esm2020/lib/templates/modular-table-template/directives/folder-drop.directive.mjs +2 -2
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +10 -10
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +15 -15
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +8 -8
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +159 -7
- package/esm2020/lib/test-case-details/test-case-details.component.mjs +7 -3
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/lib/viewport-selector/viewport-selector.component.mjs +348 -0
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +583 -104
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +599 -101
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.d.ts +2 -2
- package/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.d.ts +1 -1
- package/lib/templates/modular-table-template/directives/folder-drop.directive.d.ts +1 -1
- package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +5 -5
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +8 -8
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +7 -7
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +30 -1
- package/lib/test-case-details/test-case-details.component.d.ts +8 -1
- package/lib/ui-kit.module.d.ts +189 -188
- package/lib/viewport-selector/viewport-selector.component.d.ts +74 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/styles.css +1 -1
|
@@ -162,15 +162,15 @@ export class ModularTableTemplateComponent {
|
|
|
162
162
|
// Folder / modular inputs
|
|
163
163
|
// ============================================================================
|
|
164
164
|
this.folders = [];
|
|
165
|
-
/** Host-provided snapshot of root-level folders for the "
|
|
165
|
+
/** Host-provided snapshot of root-level folders for the "Organized" grid.
|
|
166
166
|
* When set, takes precedence over `this.folders` for `rootFolderTiles` so
|
|
167
|
-
* the
|
|
167
|
+
* the Organized section stays stable while sidebar search swaps `folders`
|
|
168
168
|
* to a filtered result set. Mirrors the host-driven fallback pattern used
|
|
169
169
|
* by `selectedFolderNode` (subfolders) and `selectedFolderTrail` (breadcrumb). */
|
|
170
170
|
this.rootFolders = null;
|
|
171
171
|
this.selectedFolderId = null;
|
|
172
172
|
this.expandedFolderIds = [];
|
|
173
|
-
this.
|
|
173
|
+
this.unorganizedCount = 0;
|
|
174
174
|
this.folderIdAccessor = (row) => row?.folderId ?? null;
|
|
175
175
|
this.modularConfig = { ...DEFAULT_MODULAR_CONFIG };
|
|
176
176
|
this.modularLabels = { ...DEFAULT_MODULAR_LABELS };
|
|
@@ -187,7 +187,7 @@ export class ModularTableTemplateComponent {
|
|
|
187
187
|
this.folderSearchLoading = false;
|
|
188
188
|
/** Lazy-load: true while a root-page fetch is in flight (initial load OR
|
|
189
189
|
* the scroll-driven "load more" pagination). Drives the loading indicator
|
|
190
|
-
* the modular grid renders at the right edge of the
|
|
190
|
+
* the modular grid renders at the right edge of the Organized row, and is
|
|
191
191
|
* forwarded to the sidebar for its own loading affordance. */
|
|
192
192
|
this.rootFoldersLoading = false;
|
|
193
193
|
/** Override for the currently-selected folder node. Used as a fallback when
|
|
@@ -421,7 +421,7 @@ export class ModularTableTemplateComponent {
|
|
|
421
421
|
}
|
|
422
422
|
const folderId = this.folderIdAccessor ? this.folderIdAccessor(row) : row?.folderId;
|
|
423
423
|
const node = folderId != null ? this.findFolder(this.folders, folderId) : null;
|
|
424
|
-
return node?.name || this.modularLabels?.
|
|
424
|
+
return node?.name || this.modularLabels?.unorganizedRowLabel || 'Unorganized';
|
|
425
425
|
}
|
|
426
426
|
/**
|
|
427
427
|
* Attach a derived `folderName` to each row when the host hasn't supplied
|
|
@@ -548,7 +548,7 @@ export class ModularTableTemplateComponent {
|
|
|
548
548
|
if (!this.isModularView)
|
|
549
549
|
return true;
|
|
550
550
|
const folderId = this.folderIdAccessor ? this.folderIdAccessor(row) : row?.folderId;
|
|
551
|
-
// Root view: show only rows that do not belong to any folder (the "
|
|
551
|
+
// Root view: show only rows that do not belong to any folder (the "Unorganized" bucket).
|
|
552
552
|
// Folder tiles above the table are the entry point to per-folder contents.
|
|
553
553
|
if (this.selectedFolderId == null) {
|
|
554
554
|
return folderId == null;
|
|
@@ -942,7 +942,7 @@ export class ModularTableTemplateComponent {
|
|
|
942
942
|
// Folder / modular helpers
|
|
943
943
|
// ============================================================================
|
|
944
944
|
/**
|
|
945
|
-
* Flat list of root-level folders for the "
|
|
945
|
+
* Flat list of root-level folders for the "Organized" grid on the root view.
|
|
946
946
|
* Prefers the host-provided `rootFolders` snapshot when set — analogous to
|
|
947
947
|
* how `subfolderTiles` falls back to `selectedFolderNode` and `breadcrumbTrail`
|
|
948
948
|
* falls back to `selectedFolderTrail` when `folders` has been swapped to a
|
|
@@ -1088,12 +1088,12 @@ export class ModularTableTemplateComponent {
|
|
|
1088
1088
|
this.expandedFolderIds = Array.from(set);
|
|
1089
1089
|
this.folderExpansionToggled.emit(event);
|
|
1090
1090
|
}
|
|
1091
|
-
/** Horizontal-scroll handler for the "
|
|
1091
|
+
/** Horizontal-scroll handler for the "Organized" root tiles. Emits
|
|
1092
1092
|
* `rootLoadMoreRequested` when the user scrolls within
|
|
1093
1093
|
* `GRID_SCROLL_LOAD_THRESHOLD_PX` of the right edge AND more roots are
|
|
1094
1094
|
* available on the backend. Throttled by `lastRootGridLoadAt`.
|
|
1095
1095
|
* Uses `rootFolderTiles.length` (not `folders.length`) so the gate stays
|
|
1096
|
-
* correct when `rootFolders` decouples the
|
|
1096
|
+
* correct when `rootFolders` decouples the Organized grid from the
|
|
1097
1097
|
* search-filtered `folders` input. */
|
|
1098
1098
|
onRootGridScroll(event) {
|
|
1099
1099
|
const loaded = this.rootFolderTiles.length;
|
|
@@ -1307,7 +1307,7 @@ export class ModularTableTemplateComponent {
|
|
|
1307
1307
|
folders: this.folders,
|
|
1308
1308
|
labels: this.modularLabels,
|
|
1309
1309
|
currentFolderId: this.selectedFolderId,
|
|
1310
|
-
// When moving FROM
|
|
1310
|
+
// When moving FROM Unorganized, disable the Unorganized destination row.
|
|
1311
1311
|
rootDisabled: this.selectedFolderId == null,
|
|
1312
1312
|
},
|
|
1313
1313
|
},
|
|
@@ -1418,7 +1418,7 @@ export class ModularTableTemplateComponent {
|
|
|
1418
1418
|
testCount: ctx.testCount,
|
|
1419
1419
|
hasParent: ctx.hasParent,
|
|
1420
1420
|
labels: this.modularLabels,
|
|
1421
|
-
strategy: ctx.hasParent ? 'move-to-parent' : 'move-to-
|
|
1421
|
+
strategy: ctx.hasParent ? 'move-to-parent' : 'move-to-unorganized',
|
|
1422
1422
|
},
|
|
1423
1423
|
},
|
|
1424
1424
|
buttons: [
|
|
@@ -1508,10 +1508,10 @@ export class ModularTableTemplateComponent {
|
|
|
1508
1508
|
}
|
|
1509
1509
|
ModularTableTemplateComponent.GRID_SCROLL_LOAD_THRESHOLD_PX = 96;
|
|
1510
1510
|
ModularTableTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ModularTableTemplateComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DialogService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1511
|
-
ModularTableTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ModularTableTemplateComponent, selector: "cqa-modular-table-template", inputs: { searchPlaceholder: "searchPlaceholder", searchValue: "searchValue", showClear: "showClear", showSearchBar: "showSearchBar", showExportButton: "showExportButton", isExporting: "isExporting", filterConfig: "filterConfig", filterModel: "filterModel", showFilterPanel: "showFilterPanel", showFilterButton: "showFilterButton", otherButtons: "otherButtons", otherDropDownButtons: "otherDropDownButtons", otherSelectDropDownButtons: "otherSelectDropDownButtons", otherButtonLabel: "otherButtonLabel", otherButtonVariant: "otherButtonVariant", showOtherButton: "showOtherButton", showActionButton: "showActionButton", showSettingsButton: "showSettingsButton", showAutoRefreshButton: "showAutoRefreshButton", showViewModeToggle: "showViewModeToggle", viewMode: "viewMode", viewModeLabels: "viewModeLabels", data: "data", isEmptyState: "isEmptyState", emptyStateConfig: "emptyStateConfig", actions: "actions", chips: "chips", filterApplied: "filterApplied", columns: "columns", rowSelectable: "rowSelectable", selectedAutoRefreshInterval: "selectedAutoRefreshInterval", pageIndex: "pageIndex", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", pageSizeMenuDirection: "pageSizeMenuDirection", serverSidePagination: "serverSidePagination", totalElements: "totalElements", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading", cellJsonPathGetter: "cellJsonPathGetter", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", selectedItems: "selectedItems", showSelectAllInToolbar: "showSelectAllInToolbar", showDismissInToolbar: "showDismissInToolbar", allSelectedInToolbar: "allSelectedInToolbar", folders: "folders", rootFolders: "rootFolders", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", folderIdAccessor: "folderIdAccessor", modularConfig: "modularConfig", modularLabels: "modularLabels", bulkActions: "bulkActions", sidebarCollapsed: "sidebarCollapsed", serverSideSearch: "serverSideSearch", rootTotal: "rootTotal", folderSearchLoading: "folderSearchLoading", rootFoldersLoading: "rootFoldersLoading", selectedFolderNode: "selectedFolderNode", selectedFolderTrail: "selectedFolderTrail", useInternalDialogs: "useInternalDialogs", showReorderButton: "showReorderButton", reorderSaving: "reorderSaving", reorderLabels: "reorderLabels", columnVisibility: "columnVisibility" }, outputs: { onSearchChange: "onSearchChange", onExportClick: "onExportClick", onApplyFilterClick: "onApplyFilterClick", onResetFilterClick: "onResetFilterClick", onClearAll: "onClearAll", removeChip: "removeChip", viewModeChange: "viewModeChange", pageChange: "pageChange", sortChange: "sortChange", folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderChildrenRequested: "folderChildrenRequested", folderLoadMoreRequested: "folderLoadMoreRequested", rootLoadMoreRequested: "rootLoadMoreRequested", folderSearchChange: "folderSearchChange", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", testsMoved: "testsMoved", bulkActionClick: "bulkActionClick", bulkSelectAllChange: "bulkSelectAllChange", bulkDismiss: "bulkDismiss", bulkActionInvoked: "bulkActionInvoked", sidebarCollapsedChange: "sidebarCollapsedChange", reorderStart: "reorderStart", reorderCancel: "reorderCancel", reorderSave: "reorderSave", moveRequested: "moveRequested", selectedItemsChange: "selectedItemsChange", folderDeleteRequested: "folderDeleteRequested", folderMoveRequested: "folderMoveRequested", folderMoved: "folderMoved", folderDuplicateRequested: "folderDuplicateRequested", onReload: "onReload", onAutoRefreshClick: "onAutoRefreshClick", columnVisibilityChange: "columnVisibilityChange", autoRefreshIntervalChange: "autoRefreshIntervalChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "dynamicFilterComponent", first: true, predicate: DynamicFilterComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganisedCount]=\"unorganisedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n [serverSideSearch]=\"serverSideSearch\"\n [rootTotal]=\"rootTotal\"\n [folderSearchLoading]=\"folderSearchLoading\"\n [rootFoldersLoading]=\"rootFoldersLoading\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderChildrenRequested)=\"folderChildrenRequested.emit($event)\"\n (folderLoadMoreRequested)=\"folderLoadMoreRequested.emit($event)\"\n (rootLoadMoreRequested)=\"rootLoadMoreRequested.emit()\"\n (searchChange)=\"folderSearchChange.emit($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onRootGridScroll($event)\">\n <button\n *ngFor=\"let f of rootFolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}<ng-container *ngIf=\"f.children?.length\"> \u00B7 {{ f.children!.length === 1 ? modularLabels.oneSubfolder : modularLabels.subfoldersCount.replace('{n}', '' + f.children!.length) }}</ng-container>\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: null })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Pagination spinner anchored at the right edge of the Organised\n row. Only renders during an in-flight root fetch (initial OR\n scroll-driven \"load more\"), and is filtered to suppress when\n the section is empty so we don't show a spinner inside an\n otherwise-blank row. -->\n <div\n *ngIf=\"rootFoldersLoading && rootFolderTiles.length > 0\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading more folders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in\n (even if no subfolders, so the \"+ New folder\" tile remains\n reachable, and so we can render a loading state during the\n drill-in fetch before children arrive). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && (subfolderTiles.length || currentFolderNode?.childrenLoading)\"\n class=\"cqa-mb-4 cqa-px-3 cqa-py-1\"\n >\n <div *ngIf=\"subfolderTiles.length || modularConfig.allowCreateFolder\" class=\"cqa-text-sm cqa-text-neutral-600 cqa-mb-2\">\n {{ modularLabels.subfoldersIn }} {{ breadcrumbTrail.length ? breadcrumbTrail[breadcrumbTrail.length - 1].name : '' }}\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onSubfolderGridScroll($event)\">\n <button\n *ngFor=\"let f of subfolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Subfolder fetch indicator. Two cases:\n - Drill-in fetch: no subfolderTiles yet, render a centered\n row spinner so the section isn't empty during the fetch.\n - Pagination fetch: tiles exist, anchor a small spinner at\n the right edge so the user knows the next page is loading. -->\n <div\n *ngIf=\"currentFolderNode?.childrenLoading\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading subfolders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganised section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganisedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganisedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.ExportCodeModalComponent, selector: "cqa-export-code-modal", inputs: ["isOpen", "cases", "disabled"], outputs: ["closeModal", "export"] }, { type: i5.ColumnVisibilityComponent, selector: "cqa-column-visibility", inputs: ["isStepGroup", "columns", "columnVisibility", "selectedAutoRefreshInterval"], outputs: ["columnVisibilityChange", "autoRefreshChange"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i7.SelectedFiltersComponent, selector: "cqa-selected-filters", inputs: ["filterApplied", "chips", "defaultChips", "defaultChipClass"], outputs: ["removeChip", "clearAll", "onClearAll"] }, { type: i8.DynamicFilterComponent, selector: "cqa-dynamic-filter", inputs: ["config", "model", "showFilterPanel", "buttonLayout"], outputs: ["filtersApplied", "filtersChanged", "resetAction", "onApplyFilterClick", "onResetFilterClick"] }, { type: i9.FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: ["folders", "selectedFolderId", "expandedFolderIds", "unorganisedCount", "allowCreate", "allowRename", "allowDelete", "allowMove", "allowDuplicate", "allowDrop", "showCounts", "collapsed", "labels", "serverSideSearch", "rootTotal", "folderSearchLoading", "rootFoldersLoading"], outputs: ["folderSelected", "folderExpansionToggled", "folderChildrenRequested", "folderLoadMoreRequested", "searchChange", "rootLoadMoreRequested", "folderCreated", "folderCreateRequested", "folderRenamed", "folderDeleted", "folderMoveRequested", "folderDuplicateRequested", "testsDropped", "folderDropped", "collapsedChange"] }, { type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i12.DynamicTableComponent, selector: "app-dynamic-table", inputs: ["data", "columns", "emptyState", "gridTemplateColumns", "screenWidth", "enableSelectAll", "rowSelectable", "enableLocalSort", "isTableLoading", "isTableDataLoading", "cellJsonPathGetter", "onJsonPathCopiedHandler", "enableRowReorder", "reorderHandleTooltip"], outputs: ["sortChange", "rowReorder"] }, { type: i13.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }, { type: i14.PaginationComponent, selector: "cqa-pagination", inputs: ["totalElements", "totalPages", "pageIndex", "pageSize", "pageItemCount", "pageSizeOptions", "pageSizeMenuDirection"], outputs: ["pageIndexChange", "pageSizeChange", "paginate"] }, { type: i15.TableActionToolbarComponent, selector: "cqa-table-action-toolbar", inputs: ["selectedItems", "actions", "showSelectAll", "allSelected", "showDismiss"], outputs: ["actionClick", "selectAllChange", "dismiss"] }], directives: [{ type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i16.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i17.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1511
|
+
ModularTableTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ModularTableTemplateComponent, selector: "cqa-modular-table-template", inputs: { searchPlaceholder: "searchPlaceholder", searchValue: "searchValue", showClear: "showClear", showSearchBar: "showSearchBar", showExportButton: "showExportButton", isExporting: "isExporting", filterConfig: "filterConfig", filterModel: "filterModel", showFilterPanel: "showFilterPanel", showFilterButton: "showFilterButton", otherButtons: "otherButtons", otherDropDownButtons: "otherDropDownButtons", otherSelectDropDownButtons: "otherSelectDropDownButtons", otherButtonLabel: "otherButtonLabel", otherButtonVariant: "otherButtonVariant", showOtherButton: "showOtherButton", showActionButton: "showActionButton", showSettingsButton: "showSettingsButton", showAutoRefreshButton: "showAutoRefreshButton", showViewModeToggle: "showViewModeToggle", viewMode: "viewMode", viewModeLabels: "viewModeLabels", data: "data", isEmptyState: "isEmptyState", emptyStateConfig: "emptyStateConfig", actions: "actions", chips: "chips", filterApplied: "filterApplied", columns: "columns", rowSelectable: "rowSelectable", selectedAutoRefreshInterval: "selectedAutoRefreshInterval", pageIndex: "pageIndex", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", pageSizeMenuDirection: "pageSizeMenuDirection", serverSidePagination: "serverSidePagination", totalElements: "totalElements", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading", cellJsonPathGetter: "cellJsonPathGetter", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", selectedItems: "selectedItems", showSelectAllInToolbar: "showSelectAllInToolbar", showDismissInToolbar: "showDismissInToolbar", allSelectedInToolbar: "allSelectedInToolbar", folders: "folders", rootFolders: "rootFolders", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganizedCount: "unorganizedCount", folderIdAccessor: "folderIdAccessor", modularConfig: "modularConfig", modularLabels: "modularLabels", bulkActions: "bulkActions", sidebarCollapsed: "sidebarCollapsed", serverSideSearch: "serverSideSearch", rootTotal: "rootTotal", folderSearchLoading: "folderSearchLoading", rootFoldersLoading: "rootFoldersLoading", selectedFolderNode: "selectedFolderNode", selectedFolderTrail: "selectedFolderTrail", useInternalDialogs: "useInternalDialogs", showReorderButton: "showReorderButton", reorderSaving: "reorderSaving", reorderLabels: "reorderLabels", columnVisibility: "columnVisibility" }, outputs: { onSearchChange: "onSearchChange", onExportClick: "onExportClick", onApplyFilterClick: "onApplyFilterClick", onResetFilterClick: "onResetFilterClick", onClearAll: "onClearAll", removeChip: "removeChip", viewModeChange: "viewModeChange", pageChange: "pageChange", sortChange: "sortChange", folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderChildrenRequested: "folderChildrenRequested", folderLoadMoreRequested: "folderLoadMoreRequested", rootLoadMoreRequested: "rootLoadMoreRequested", folderSearchChange: "folderSearchChange", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", testsMoved: "testsMoved", bulkActionClick: "bulkActionClick", bulkSelectAllChange: "bulkSelectAllChange", bulkDismiss: "bulkDismiss", bulkActionInvoked: "bulkActionInvoked", sidebarCollapsedChange: "sidebarCollapsedChange", reorderStart: "reorderStart", reorderCancel: "reorderCancel", reorderSave: "reorderSave", moveRequested: "moveRequested", selectedItemsChange: "selectedItemsChange", folderDeleteRequested: "folderDeleteRequested", folderMoveRequested: "folderMoveRequested", folderMoved: "folderMoved", folderDuplicateRequested: "folderDuplicateRequested", onReload: "onReload", onAutoRefreshClick: "onAutoRefreshClick", columnVisibilityChange: "columnVisibilityChange", autoRefreshIntervalChange: "autoRefreshIntervalChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "dynamicFilterComponent", first: true, predicate: DynamicFilterComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganizedCount]=\"unorganizedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n [serverSideSearch]=\"serverSideSearch\"\n [rootTotal]=\"rootTotal\"\n [folderSearchLoading]=\"folderSearchLoading\"\n [rootFoldersLoading]=\"rootFoldersLoading\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderChildrenRequested)=\"folderChildrenRequested.emit($event)\"\n (folderLoadMoreRequested)=\"folderLoadMoreRequested.emit($event)\"\n (rootLoadMoreRequested)=\"rootLoadMoreRequested.emit()\"\n (searchChange)=\"folderSearchChange.emit($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organized }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onRootGridScroll($event)\">\n <button\n *ngFor=\"let f of rootFolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}<ng-container *ngIf=\"f.children?.length\"> \u00B7 {{ f.children!.length === 1 ? modularLabels.oneSubfolder : modularLabels.subfoldersCount.replace('{n}', '' + f.children!.length) }}</ng-container>\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: null })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Pagination spinner anchored at the right edge of the Organized\n row. Only renders during an in-flight root fetch (initial OR\n scroll-driven \"load more\"), and is filtered to suppress when\n the section is empty so we don't show a spinner inside an\n otherwise-blank row. -->\n <div\n *ngIf=\"rootFoldersLoading && rootFolderTiles.length > 0\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading more folders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in\n (even if no subfolders, so the \"+ New folder\" tile remains\n reachable, and so we can render a loading state during the\n drill-in fetch before children arrive). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && (subfolderTiles.length || currentFolderNode?.childrenLoading)\"\n class=\"cqa-mb-4 cqa-px-3 cqa-py-1\"\n >\n <div *ngIf=\"subfolderTiles.length || modularConfig.allowCreateFolder\" class=\"cqa-text-sm cqa-text-neutral-600 cqa-mb-2\">\n {{ modularLabels.subfoldersIn }} {{ breadcrumbTrail.length ? breadcrumbTrail[breadcrumbTrail.length - 1].name : '' }}\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onSubfolderGridScroll($event)\">\n <button\n *ngFor=\"let f of subfolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Subfolder fetch indicator. Two cases:\n - Drill-in fetch: no subfolderTiles yet, render a centered\n row spinner so the section isn't empty during the fetch.\n - Pagination fetch: tiles exist, anchor a small spinner at\n the right edge so the user knows the next page is loading. -->\n <div\n *ngIf=\"currentFolderNode?.childrenLoading\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading subfolders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganizedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganized section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganizedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganized }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganizedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganizedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.ExportCodeModalComponent, selector: "cqa-export-code-modal", inputs: ["isOpen", "cases", "disabled"], outputs: ["closeModal", "export"] }, { type: i5.ColumnVisibilityComponent, selector: "cqa-column-visibility", inputs: ["isStepGroup", "columns", "columnVisibility", "selectedAutoRefreshInterval"], outputs: ["columnVisibilityChange", "autoRefreshChange"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i7.SelectedFiltersComponent, selector: "cqa-selected-filters", inputs: ["filterApplied", "chips", "defaultChips", "defaultChipClass"], outputs: ["removeChip", "clearAll", "onClearAll"] }, { type: i8.DynamicFilterComponent, selector: "cqa-dynamic-filter", inputs: ["config", "model", "showFilterPanel", "buttonLayout"], outputs: ["filtersApplied", "filtersChanged", "resetAction", "onApplyFilterClick", "onResetFilterClick"] }, { type: i9.FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: ["folders", "selectedFolderId", "expandedFolderIds", "unorganizedCount", "allowCreate", "allowRename", "allowDelete", "allowMove", "allowDuplicate", "allowDrop", "showCounts", "collapsed", "labels", "serverSideSearch", "rootTotal", "folderSearchLoading", "rootFoldersLoading"], outputs: ["folderSelected", "folderExpansionToggled", "folderChildrenRequested", "folderLoadMoreRequested", "searchChange", "rootLoadMoreRequested", "folderCreated", "folderCreateRequested", "folderRenamed", "folderDeleted", "folderMoveRequested", "folderDuplicateRequested", "testsDropped", "folderDropped", "collapsedChange"] }, { type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i12.DynamicTableComponent, selector: "app-dynamic-table", inputs: ["data", "columns", "emptyState", "gridTemplateColumns", "screenWidth", "enableSelectAll", "rowSelectable", "enableLocalSort", "isTableLoading", "isTableDataLoading", "cellJsonPathGetter", "onJsonPathCopiedHandler", "enableRowReorder", "reorderHandleTooltip"], outputs: ["sortChange", "rowReorder"] }, { type: i13.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }, { type: i14.PaginationComponent, selector: "cqa-pagination", inputs: ["totalElements", "totalPages", "pageIndex", "pageSize", "pageItemCount", "pageSizeOptions", "pageSizeMenuDirection"], outputs: ["pageIndexChange", "pageSizeChange", "paginate"] }, { type: i15.TableActionToolbarComponent, selector: "cqa-table-action-toolbar", inputs: ["selectedItems", "actions", "showSelectAll", "allSelected", "showDismiss"], outputs: ["actionClick", "selectAllChange", "dismiss"] }], directives: [{ type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i16.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i17.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1512
1512
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ModularTableTemplateComponent, decorators: [{
|
|
1513
1513
|
type: Component,
|
|
1514
|
-
args: [{ selector: 'cqa-modular-table-template', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganisedCount]=\"unorganisedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n [serverSideSearch]=\"serverSideSearch\"\n [rootTotal]=\"rootTotal\"\n [folderSearchLoading]=\"folderSearchLoading\"\n [rootFoldersLoading]=\"rootFoldersLoading\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderChildrenRequested)=\"folderChildrenRequested.emit($event)\"\n (folderLoadMoreRequested)=\"folderLoadMoreRequested.emit($event)\"\n (rootLoadMoreRequested)=\"rootLoadMoreRequested.emit()\"\n (searchChange)=\"folderSearchChange.emit($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onRootGridScroll($event)\">\n <button\n *ngFor=\"let f of rootFolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}<ng-container *ngIf=\"f.children?.length\"> \u00B7 {{ f.children!.length === 1 ? modularLabels.oneSubfolder : modularLabels.subfoldersCount.replace('{n}', '' + f.children!.length) }}</ng-container>\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: null })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Pagination spinner anchored at the right edge of the Organised\n row. Only renders during an in-flight root fetch (initial OR\n scroll-driven \"load more\"), and is filtered to suppress when\n the section is empty so we don't show a spinner inside an\n otherwise-blank row. -->\n <div\n *ngIf=\"rootFoldersLoading && rootFolderTiles.length > 0\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading more folders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in\n (even if no subfolders, so the \"+ New folder\" tile remains\n reachable, and so we can render a loading state during the\n drill-in fetch before children arrive). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && (subfolderTiles.length || currentFolderNode?.childrenLoading)\"\n class=\"cqa-mb-4 cqa-px-3 cqa-py-1\"\n >\n <div *ngIf=\"subfolderTiles.length || modularConfig.allowCreateFolder\" class=\"cqa-text-sm cqa-text-neutral-600 cqa-mb-2\">\n {{ modularLabels.subfoldersIn }} {{ breadcrumbTrail.length ? breadcrumbTrail[breadcrumbTrail.length - 1].name : '' }}\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onSubfolderGridScroll($event)\">\n <button\n *ngFor=\"let f of subfolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Subfolder fetch indicator. Two cases:\n - Drill-in fetch: no subfolderTiles yet, render a centered\n row spinner so the section isn't empty during the fetch.\n - Pagination fetch: tiles exist, anchor a small spinner at\n the right edge so the user knows the next page is loading. -->\n <div\n *ngIf=\"currentFolderNode?.childrenLoading\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading subfolders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganised section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganisedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganisedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", styles: [] }]
|
|
1514
|
+
args: [{ selector: 'cqa-modular-table-template', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganizedCount]=\"unorganizedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n [serverSideSearch]=\"serverSideSearch\"\n [rootTotal]=\"rootTotal\"\n [folderSearchLoading]=\"folderSearchLoading\"\n [rootFoldersLoading]=\"rootFoldersLoading\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderChildrenRequested)=\"folderChildrenRequested.emit($event)\"\n (folderLoadMoreRequested)=\"folderLoadMoreRequested.emit($event)\"\n (rootLoadMoreRequested)=\"rootLoadMoreRequested.emit()\"\n (searchChange)=\"folderSearchChange.emit($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organized }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onRootGridScroll($event)\">\n <button\n *ngFor=\"let f of rootFolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}<ng-container *ngIf=\"f.children?.length\"> \u00B7 {{ f.children!.length === 1 ? modularLabels.oneSubfolder : modularLabels.subfoldersCount.replace('{n}', '' + f.children!.length) }}</ng-container>\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: null })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Pagination spinner anchored at the right edge of the Organized\n row. Only renders during an in-flight root fetch (initial OR\n scroll-driven \"load more\"), and is filtered to suppress when\n the section is empty so we don't show a spinner inside an\n otherwise-blank row. -->\n <div\n *ngIf=\"rootFoldersLoading && rootFolderTiles.length > 0\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading more folders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in\n (even if no subfolders, so the \"+ New folder\" tile remains\n reachable, and so we can render a loading state during the\n drill-in fetch before children arrive). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && (subfolderTiles.length || currentFolderNode?.childrenLoading)\"\n class=\"cqa-mb-4 cqa-px-3 cqa-py-1\"\n >\n <div *ngIf=\"subfolderTiles.length || modularConfig.allowCreateFolder\" class=\"cqa-text-sm cqa-text-neutral-600 cqa-mb-2\">\n {{ modularLabels.subfoldersIn }} {{ breadcrumbTrail.length ? breadcrumbTrail[breadcrumbTrail.length - 1].name : '' }}\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onSubfolderGridScroll($event)\">\n <button\n *ngFor=\"let f of subfolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Subfolder fetch indicator. Two cases:\n - Drill-in fetch: no subfolderTiles yet, render a centered\n row spinner so the section isn't empty during the fetch.\n - Pagination fetch: tiles exist, anchor a small spinner at\n the right edge so the user knows the next page is loading. -->\n <div\n *ngIf=\"currentFolderNode?.childrenLoading\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading subfolders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganizedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganized section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganizedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganized }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganizedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganizedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", styles: [] }]
|
|
1515
1515
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }]; }, propDecorators: { searchPlaceholder: [{
|
|
1516
1516
|
type: Input
|
|
1517
1517
|
}], searchValue: [{
|
|
@@ -1630,7 +1630,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1630
1630
|
type: Input
|
|
1631
1631
|
}], expandedFolderIds: [{
|
|
1632
1632
|
type: Input
|
|
1633
|
-
}],
|
|
1633
|
+
}], unorganizedCount: [{
|
|
1634
1634
|
type: Input
|
|
1635
1635
|
}], folderIdAccessor: [{
|
|
1636
1636
|
type: Input
|
|
@@ -1726,4 +1726,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1726
1726
|
}], columnVisibility: [{
|
|
1727
1727
|
type: Input
|
|
1728
1728
|
}] } });
|
|
1729
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxhci10YWJsZS10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBS1osdUJBQXVCLEVBR3ZCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFLbEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQWlCdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN2RixNQUFNLE9BQU8sNkJBQTZCO0lBZ1h4QyxZQUFvQixHQUFzQixFQUFVLGFBQTRCO1FBQTVELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEvV2hGLG9CQUFvQjtRQUNYLHNCQUFpQixHQUFXLG1CQUFtQixDQUFDO1FBQ2hELGdCQUFXLEdBQVcsRUFBRSxD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O1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUFZLEVBQUUsR0FBUTtRQUN4QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzFCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUN4RDtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUNoRTtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUM1RDtRQUNELElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLE9BQU8s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c0JBQXhELFNBQVM7dUJBQUMsc0JBQXNCO2dCQW1HcEIsZ0JBQWdCO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRmlsdGVySXRlbSwgRHluYW1pY0ZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ZpbHRlcnMvZHluYW1pYy1maWx0ZXIvZHluYW1pYy1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29sdW1uVmlzaWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbHVtbi12aXNpYmlsaXR5L2NvbHVtbi12aXNpYmlsaXR5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFjdGlvbiB9IGZyb20gJy4uLy4uL3RhYmxlLWFjdGlvbi10b29sYmFyL3RhYmxlLWFjdGlvbi10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29uZmlnIH0gZnJvbSAnLi4vLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFTVBUWV9TVEFURV9JTUFHRVMgfSBmcm9tICcuLi8uLi9hc3NldHMvaW1hZ2VzL2ltYWdlLWFzc2V0cy5jb25zdGFudHMnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQge1xuICBERUZBVUxUX01PRFVMQVJfQ09ORklHLFxuICBERUZBVUxUX01PRFVMQVJfTEFCRUxTLFxuICBERUZBVUxUX1JFT1JERVJfTEFCRUxTLFxuICBGT0xERVJfQ09MVU1OX0ZJRUxEX0lELFxuICBGb2xkZXJDcmVhdGVkUGF5bG9hZCxcbiAgRm9sZGVyRGVsZXRlUmVxdWVzdGVkUGF5bG9hZCxcbiAgRm9sZGVyRGVsZXRlU3RyYXRlZ3ksXG4gIEZvbGRlckRlbGV0ZWRQYXlsb2FkLFxuICBGb2xkZXJJZEFjY2Vzc29yLFxuICBGb2xkZXJOb2RlLFxuICBGb2xkZXJSZW5hbWVkUGF5bG9hZCxcbiAgRm9sZGVyTW92ZVJlcXVlc3RlZFBheWxvYWQsXG4gIEZvbGRlck1vdmVkUGF5bG9hZCxcbiAgRm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkUGF5bG9hZCxcbiAgTW9kdWxhckNvbmZpZyxcbiAgTW9kdWxhckxhYmVscyxcbiAgUmVvcmRlckxhYmVscyxcbiAgUmVvcmRlclNhdmVQYXlsb2FkLFxuICBUZXN0c01vdmVkUGF5bG9hZCxcbiAgQnVsa0FjdGlvbkludm9rZWRQYXlsb2FkLFxufSBmcm9tICcuL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcbmltcG9ydCB7IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9tb3ZlLXRvLWZvbGRlci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9uZXctZm9sZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlRm9sZGVyRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9kaWFsb2dzL2RlbGV0ZS1mb2xkZXItZGlhbG9nLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1tb2R1bGFyLXRhYmxlLXRlbXBsYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1vZHVsYXJUYWJsZVRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8vIFNlYXJjaCBiYXIgaW5wdXRzXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGNvbXBvbmVudHMnO1xuICBASW5wdXQoKSBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNob3dDbGVhcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRXhwb3J0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIFNlYXJjaCBiYXIgb3V0cHV0c1xuICBAT3V0cHV0KCkgb25TZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9uRXhwb3J0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdHlwZTogJ2xvY2FsJyB8ICdlbWFpbCc7IGVtYWlscz86IHN0cmluZ1tdOyBmcmFtZXdvcms/OiAnV0VCRFJJVkVSX0lPJyB8ICdTRUxFTklVTV9KQVZBJzsgc2VsZWN0ZWRJdGVtczogYW55W10gfSB8IHZvaWQ+KCk7XG4gIC8vIEZpbHRlciBvdXRwdXRzXG4gIEBPdXRwdXQoKSBvbkFwcGx5RmlsdGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uUmVzZXRGaWx0ZXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9uQ2xlYXJBbGwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZW1vdmVDaGlwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gRmlsdGVyIGlucHV0c1xuICBASW5wdXQoKSBmaWx0ZXJDb25maWc6IER5bmFtaWNGaWx0ZXJJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgZmlsdGVyTW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgQElucHV0KCkgc2hvd0ZpbHRlclBhbmVsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIE90aGVyIGJ1dHRvbnMgaW5wdXQgKGFycmF5IG9mIGJ1dHRvbiB0ZW1wbGF0ZXMvY29tcG9uZW50cylcbiAgQElucHV0KCkgb3RoZXJCdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIE90aGVyIGRyb3Bkb3duIGJ1dHRvbnMgaW5wdXQgKGFycmF5IG9mIGRyb3Bkb3duIGJ1dHRvbiB0ZW1wbGF0ZXMvY29tcG9uZW50cylcbiAgQElucHV0KCkgb3RoZXJEcm9wRG93bkJ1dHRvbnM6IFRlbXBsYXRlUmVmPGFueT5bXSA9IFtdO1xuICBcbiAgLy8gT3RoZXIgc2VsZWN0IGRyb3Bkb3duIGJ1dHRvbnMgaW5wdXQgKGFycmF5IG9mIHNlbGVjdCBkcm9wZG93biBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyU2VsZWN0RHJvcERvd25CdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIExlZ2FjeSBzaW5nbGUgYnV0dG9uIGlucHV0cyAoZGVwcmVjYXRlZCwga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBvdGhlckJ1dHRvbnMgYXJyYXkgaW5zdGVhZCAqL1xuICBASW5wdXQoKSBvdGhlckJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnT3RoZXIgQnV0dG9uJztcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBvdGhlckJ1dHRvbnMgYXJyYXkgaW5zdGVhZCAqL1xuICBASW5wdXQoKSBvdGhlckJ1dHRvblZhcmlhbnQ6ICdmaWxsZWQnIHwgJ291dGxpbmVkJyB8ICd0ZXh0JyB8ICdlbGV2YXRlZCcgfCAndG9uYWwnIHwgJ2dyZXktc29saWQnID0gJ2ZpbGxlZCc7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgc2hvd090aGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgXG4gIC8vIEFjdGlvbiBtZW51IGJ1dHRvbiAodGhyZWUtZG90IG1lbnUgaW4gdGFibGUgcm93cylcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gU2V0dGluZ3MgYW5kIHJlZnJlc2ggYnV0dG9uc1xuICBASW5wdXQoKSBzaG93U2V0dGluZ3NCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93QXV0b1JlZnJlc2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFZpZXctbW9kZSB0b2dnbGUgKExpc3QgfCBNb2R1bGFyKS4gSGlkZGVuIGJ5IGRlZmF1bHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gIEBJbnB1dCgpIHNob3dWaWV3TW9kZVRvZ2dsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2aWV3TW9kZTogJ2xpc3QnIHwgJ21vZHVsYXInID0gJ2xpc3QnO1xuICBASW5wdXQoKSB2aWV3TW9kZUxhYmVsczogeyBsaXN0OiBzdHJpbmc7IG1vZHVsYXI6IHN0cmluZyB9ID0geyBsaXN0OiAnTGlzdCcsIG1vZHVsYXI6ICdNb2R1bGFyJyB9O1xuICBAT3V0cHV0KCkgdmlld01vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdsaXN0JyB8ICdtb2R1bGFyJz4oKTtcblxuICBnZXQgdmlld01vZGVTZWdtZW50cygpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGljb24/OiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7IGxhYmVsOiB0aGlzLnZpZXdNb2RlTGFiZWxzLmxpc3QsIHZhbHVlOiAnbGlzdCcsIGljb246ICd2aWV3X2xpc3QnIH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnZpZXdNb2RlTGFiZWxzLm1vZHVsYXIsIHZhbHVlOiAnbW9kdWxhcicsIGljb246ICdmb2xkZXInIH0sXG4gICAgXTtcbiAgfVxuXG4gIG9uVmlld01vZGVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA9PT0gJ21vZHVsYXInID8gJ21vZHVsYXInIDogJ2xpc3QnO1xuICAgIGlmIChuZXh0ICE9PSB0aGlzLnZpZXdNb2RlKSB7XG4gICAgICB0aGlzLnZpZXdNb2RlID0gbmV4dDtcbiAgICAgIHRoaXMudmlld01vZGVDaGFuZ2UuZW1pdChuZXh0KTtcbiAgICB9XG4gIH1cblxuICAvLyBEYXRhIGlucHV0XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG5cbiAgLy8gRW1wdHkgc3RhdGUgaW5wdXRzXG4gIEBJbnB1dCgpIGlzRW1wdHlTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbXB0eVN0YXRlQ29uZmlnOiBFbXB0eVN0YXRlQ29uZmlnID0ge1xuICAgIHRpdGxlOiAnTm8gRGF0YSBBdmFpbGFibGUgWWV0JyxcbiAgICBkZXNjcmlwdGlvbjogJ1J1biBvciB1cGxvYWQgeW91ciBmaXJzdCB0ZXN0IHRvIHNlZSB5b3VyIGFuYWx5dGljcyBhbmQgdHJlbmRzIGhlcmUuIFdhdGNoIHlvdXIgcXVhbGl0eSBtZXRyaWNzIGNvbWUgdG8gbGlmZSB3aXRoIHJlYWwtdGltZSBpbnNpZ2h0cy4nLFxuICAgIGltYWdlVXJsOiBFTVBUWV9TVEFURV9JTUFHRVMuREFTSEJPQVJELFxuICAgIGFjdGlvbnM6IFt7IGxhYmVsOiAnUnVuIFRlc3QgU3VpdGUnLCB2YXJpYW50OiAnZmlsbGVkJyB9XSxcbiAgfTtcblxuICAvLyBBY3Rpb24gYmFyIGlucHV0c1xuICBASW5wdXQoKSBhY3Rpb25zOiBUYWJsZUFjdGlvbltdID0gW1xuICAgIHsgXG4gICAgICBpZDogJ2RlbGV0ZScsIFxuICAgICAgbGFiZWw6ICdEZWxldGUnLCBcbiAgICAgIGljb246ICdkZWxldGUnLCBcbiAgICAgIHRvb2x0aXA6ICdEZWxldGUgc2VsZWN0ZWQnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2VkaXQnLCBcbiAgICAgIGxhYmVsOiAnRWRpdCcsIFxuICAgICAgaWNvbjogJ2VkaXQnLCBcbiAgICAgIHRvb2x0aXA6ICdFZGl0IHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFZGl0IGFjdGlvbiBjbGlja2VkOicsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBcbiAgICAgIGlkOiAnYWRkLXRhZycsIFxuICAgICAgbGFiZWw6ICdBZGQgVGFnJywgXG4gICAgICBpY29uOiAnbG9jYWxfb2ZmZXInLCBcbiAgICAgIHRvb2x0aXA6ICdBZGQgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQWRkIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ3JlbW92ZS10YWcnLCBcbiAgICAgIGxhYmVsOiAnUmVtb3ZlIFRhZycsIFxuICAgICAgaWNvbjogJ2xhYmVsX29mZicsIFxuICAgICAgdG9vbHRpcDogJ1JlbW92ZSB0YWdzJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgdGFnIGFjdGlvbiBjbGlja2VkOicsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gIF07XG5cbiAgLy8gQ2hpcHMgaW5wdXRzXG4gIEBJbnB1dCgpIGNoaXBzOiBBcnJheTx7IGtleT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgZnVsbFRleHQ/OiBzdHJpbmc7IGhhc01vcmU/OiBib29sZWFuIH0+ID0gW107XG4gIEBJbnB1dCgpIGZpbHRlckFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBUYWJsZSBpbnB1dHNcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgQElucHV0KCkgcm93U2VsZWN0YWJsZT86IChyb3c6IGFueSkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFsxMCwgMjAsIDQwLCA2MCwgODBdO1xuICBASW5wdXQoKSBwYWdlU2l6ZU1lbnVEaXJlY3Rpb246ICdhdXRvJyB8ICd1cCcgfCAnZG93bicgPSAnYXV0byc7XG4gIC8vIFNlcnZlci1zaWRlIHBhZ2luYXRpb24gY29udHJvbHNcbiAgQElucHV0KCkgc2VydmVyU2lkZVBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdG90YWxFbGVtZW50czogbnVtYmVyID0gMDtcbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFnZUluZGV4OiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXIgfT4oKTtcbiAgLyoqXG4gICAqIFdoZW4gZmFsc2UsIGhlYWRlciBzb3J0IGRvZXMgbm90IHJlb3JkZXIgcm93cyBsb2NhbGx5ICh1c2Ugd2l0aCBzZXJ2ZXJTaWRlUGFnaW5hdGlvbiArIHNvcnRDaGFuZ2UpLlxuICAgKiBEZWZhdWx0IHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVMb2NhbFNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAT3V0cHV0KCkgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGZpZWxkSWQ6IHN0cmluZztcbiAgICBmaWVsZFZhbHVlPzogc3RyaW5nO1xuICAgIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCBudWxsO1xuICB9PigpO1xuICAvLyBMb2FkZXIgY29udHJvbHMgKHBhc3NlZCBkb3duIHRvIGR5bmFtaWMgdGFibGUpXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNUYWJsZURhdGFMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gQmFja3dhcmQtY29tcGF0aWJpbGl0eSBmbGFnOyBpZiBwcm92aWRlZCwgZHluYW1pYyB0YWJsZSB3aWxsIHVzZSBpdCB3aGVuIHNwZWNpZmljIGZsYWdzIGFyZSB1bmRlZmluZWRcblxuICAvLyBPcHRpb25hbCBnZXR0ZXIgZm9yIEpTT04gcGF0aCBwZXIgY2VsbC4gV2hlbiBwcm92aWRlZCwgZG91YmxlLWNsaWNraW5nIGEgY2VsbCBjb3BpZXMgdGhlIHBhdGguXG4gIEBJbnB1dCgpIGNlbGxKc29uUGF0aEdldHRlcj86IChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nLCByb3c6IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8vIE9wdGlvbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBKU09OIHBhdGggaXMgY29waWVkIGZyb20gYSB0YWJsZSBjZWxsXG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiBzdHJpbmcgfSkgPT4gdm9pZDtcblxuICAvLyBTZWxlY3RlZCBpdGVtcyAoZnVsbCBvYmplY3RzKSBmb3IgbWFpbnRhaW5pbmcgc2VsZWN0aW9uIGFjcm9zcyBwYWdpbmF0aW9uIChzZXJ2ZXItc2lkZSlcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcblxuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgYWN0aW9uIHRvb2xiYXIgcmVuZGVycyB0aGUgXCJTZWxlY3QgYWxsXCIgYWZmb3JkYW5jZS4gRGVmYXVsdHMgdG8gZmFsc2VcbiAgICogZm9yIG5vdyDigJQgaG9zdCBvcHRzIGluLiBNYXRjaGVzIHRoZSBjdXJyZW50IHByb2R1Y3QgcmVxdWlyZW1lbnQgdG8gaGlkZSBTZWxlY3QgQWxsLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NlbGVjdEFsbEluVG9vbGJhcjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgYWN0aW9uIHRvb2xiYXIgcmVuZGVycyB0aGUgZGlzbWlzcyAow5cpIGFmZm9yZGFuY2UuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqIGZvciBub3cg4oCUIGhvc3Qgb3B0cyBpbi4gTWF0Y2hlcyB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50IHRvIGhpZGUgQ2FuY2VsLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd0Rpc21pc3NJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEJvdW5kIHRvIHRoZSB0b29sYmFyJ3MgXCJTZWxlY3QgYWxsXCIgY2hlY2tib3gg4oCUIGRyaXZlcyB0aGUgY2hlY2tlZCBzdGF0ZS4gKi9cbiAgQElucHV0KCkgYWxsU2VsZWN0ZWRJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBJbnRlcm5hbCBzdGF0ZSBmb3IgY29sdW1uIHZpc2liaWxpdHlcbiAgcHJpdmF0ZSBfY29sdW1uVmlzaWJpbGl0eTogQ29sdW1uVmlzaWJpbGl0eUNvbmZpZyA9IHt9O1xuICBwcml2YXRlIF9jYWNoZWRWaXNpYmlsaXR5Q29sdW1uczogQXJyYXk8eyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG4gIGZpbHRlcmVkUm93czogYW55W10gPSBbXTtcbiAgcGFnZWRSb3dzOiBhbnlbXSA9IFtdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRm9sZGVyIC8gbW9kdWxhciBpbnB1dHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBASW5wdXQoKSBmb2xkZXJzOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgLyoqIEhvc3QtcHJvdmlkZWQgc25hcHNob3Qgb2Ygcm9vdC1sZXZlbCBmb2xkZXJzIGZvciB0aGUgXCJPcmdhbmlzZWRcIiBncmlkLlxuICAgKiAgV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgdGhpcy5mb2xkZXJzYCBmb3IgYHJvb3RGb2xkZXJUaWxlc2Agc29cbiAgICogIHRoZSBPcmdhbmlzZWQgc2VjdGlvbiBzdGF5cyBzdGFibGUgd2hpbGUgc2lkZWJhciBzZWFyY2ggc3dhcHMgYGZvbGRlcnNgXG4gICAqICB0byBhIGZpbHRlcmVkIHJlc3VsdCBzZXQuIE1pcnJvcnMgdGhlIGhvc3QtZHJpdmVuIGZhbGxiYWNrIHBhdHRlcm4gdXNlZFxuICAgKiAgYnkgYHNlbGVjdGVkRm9sZGVyTm9kZWAgKHN1YmZvbGRlcnMpIGFuZCBgc2VsZWN0ZWRGb2xkZXJUcmFpbGAgKGJyZWFkY3J1bWIpLiAqL1xuICBASW5wdXQoKSByb290Rm9sZGVyczogRm9sZGVyTm9kZVtdIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleHBhbmRlZEZvbGRlcklkczogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgdW5vcmdhbmlzZWRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgZm9sZGVySWRBY2Nlc3NvcjogRm9sZGVySWRBY2Nlc3NvciA9IChyb3c6IGFueSkgPT4gcm93Py5mb2xkZXJJZCA/PyBudWxsO1xuICBASW5wdXQoKSBtb2R1bGFyQ29uZmlnOiBNb2R1bGFyQ29uZmlnID0geyAuLi5ERUZBVUxUX01PRFVMQVJfQ09ORklHIH07XG4gIEBJbnB1dCgpIG1vZHVsYXJMYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgYnVsa0FjdGlvbnM6IFRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgc2lkZWJhckNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTGF6eS1sb2FkOiB3aGVuIHRydWUsIHRoZSBzaWRlYmFyIGVtaXRzIGBzZWFyY2hDaGFuZ2VgIGFuZCBza2lwcyBpdHNcbiAgICogIGxvY2FsIG5hbWUgZmlsdGVyIHNvIHRoZSBob3N0IGNhbiBzZXJ2ZSBzZWFyY2ggcmVzdWx0cyBmcm9tIHRoZSBiYWNrZW5kLiAqL1xuICBASW5wdXQoKSBzZXJ2ZXJTaWRlU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMYXp5LWxvYWQ6IGJhY2tlbmQtcmVwb3J0ZWQgdG90YWwgcm9vdCBmb2xkZXJzLiBEcml2ZXMgdGhlIHNpZGViYXInc1xuICAgKiAgdG9wLWxldmVsIFwiTG9hZCBtb3JlXCIgYWZmb3JkYW5jZSB3aGVuIGBmb2xkZXJzLmxlbmd0aCA8IHJvb3RUb3RhbGAuICovXG4gIEBJbnB1dCgpIHJvb3RUb3RhbDogbnVtYmVyID0gMDtcbiAgLyoqIExhenktbG9hZDogdHJ1ZSB3aGlsZSB0aGUgaG9zdCBpcyBmZXRjaGluZyBzZXJ2ZXItc2lkZSBmb2xkZXItc2VhcmNoXG4gICAqICByZXN1bHRzLiBGb3J3YXJkZWQgdG8gdGhlIHNpZGViYXIgc28gaXQgY2FuIHJlbmRlciBhIHNlYXJjaCBzcGlubmVyLiAqL1xuICBASW5wdXQoKSBmb2xkZXJTZWFyY2hMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMYXp5LWxvYWQ6IHRydWUgd2hpbGUgYSByb290LXBhZ2UgZmV0Y2ggaXMgaW4gZmxpZ2h0IChpbml0aWFsIGxvYWQgT1JcbiAgICogIHRoZSBzY3JvbGwtZHJpdmVuIFwibG9hZCBtb3JlXCIgcGFnaW5hdGlvbikuIERyaXZlcyB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICogIHRoZSBtb2R1bGFyIGdyaWQgcmVuZGVycyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgT3JnYW5pc2VkIHJvdywgYW5kIGlzXG4gICAqICBmb3J3YXJkZWQgdG8gdGhlIHNpZGViYXIgZm9yIGl0cyBvd24gbG9hZGluZyBhZmZvcmRhbmNlLiAqL1xuICBASW5wdXQoKSByb290Rm9sZGVyc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE92ZXJyaWRlIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciBub2RlLiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlblxuICAgKiAgYGZpbmRGb2xkZXIoZm9sZGVycywgc2VsZWN0ZWRGb2xkZXJJZClgIG1pc3NlcyDigJQgZS5nLiwgZHVyaW5nIHNpZGViYXJcbiAgICogIHNlYXJjaCB3aGVuIGBmb2xkZXJzYCBob2xkcyBvbmx5IHRoZSBtYXRjaGVkIHJlc3VsdHMsIHRoZSBzZWxlY3RlZFxuICAgKiAgZm9sZGVyIG1heSBub3QgYmUgYW1vbmcgdGhlbSwgYnV0IGl0cyBicmVhZGNydW1iIC8gaGVhZGVyIGxhYmVsIHN0aWxsXG4gICAqICBuZWVkcyB0byByZW5kZXIuIFRoZSBob3N0IG93bnMgdGhlIGxvb2t1cCBhZ2FpbnN0IGl0cyBmdWxsIGZvbGRlciBtYXAuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVyTm9kZTogRm9sZGVyTm9kZSB8IG51bGwgPSBudWxsO1xuICAvKiogSG9zdC1wcm92aWRlZCBicmVhZGNydW1iIHNuYXBzaG90IGZvciB0aGUgc2VsZWN0ZWQgZm9sZGVyLiBVc2VkIGFzIGFcbiAgICogIGZhbGxiYWNrIGluIGBicmVhZGNydW1iVHJhaWxgIHdoZW4gYGJ1aWxkVHJhaWxgIGFnYWluc3QgYHRoaXMuZm9sZGVyc2BcbiAgICogIHlpZWxkcyBlbXB0eSDigJQgdGhlIGNhbm9uaWNhbCBjYXNlIGlzIHNpZGViYXIgc2VhcmNoLCB3aGVyZSBgZm9sZGVyc2BcbiAgICogIGlzIHRoZSBzZWFyY2gtcmVzdWx0cyBsaXN0IGFuZCB0aGUgc2VsZWN0ZWQgZm9sZGVyJ3MgYW5jZXN0b3JzIGFyZW4ndFxuICAgKiAgcHJlc2VudC4gVGhlIGhvc3Qgd2Fsa3MgYHBhcmVudElkYCBjaGFpbnMgdG8gYnVpbGQgdGhpczsgcGFydGlhbCB0cmFpbHNcbiAgICogIGFyZSBhY2NlcHRhYmxlIHdoZW4gYW5jZXN0b3JzIGhhdmVuJ3QgYmVlbiBmZXRjaGVkIHlldC4gKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRGb2xkZXJUcmFpbDogRm9sZGVyTm9kZVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBsaWJyYXJ5IG9wZW5zIGl0cyBvd24gTW92ZSBkaWFsb2cgZm9yIGNvbnZlbmllbmNlXG4gICAqIGR1cmluZyB0ZXN0aW5nLiBIb3N0cyB0YWtpbmcgb3ZlciBBUEkgKyBVWCBzaG91bGQgc2V0IHRoaXMgdG8gYGZhbHNlYCBhbmRcbiAgICogbGlzdGVuIG9uIGBtb3ZlUmVxdWVzdGVkYCB0byByZW5kZXIgdGhlaXIgb3duLlxuICAgKi9cbiAgQElucHV0KCkgdXNlSW50ZXJuYWxEaWFsb2dzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgb3V0cHV0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEBPdXRwdXQoKSBmb2xkZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckV4cGFuc2lvblRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgZXhwYW5kZWQ6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIExhenktbG9hZDogcmUtZW1pdHRlZCBmcm9tIHRoZSBzaWRlYmFyIHdoZW4gdGhlIHVzZXIgZXhwYW5kcyBhIG5vZGUgd2hvc2VcbiAgICogIGNoaWxkcmVuIGhhdmVuJ3QgYmVlbiBmZXRjaGVkIHlldC4gSG9zdCByZXNwb25kcyBieSBmZXRjaGluZyB0aGF0IHN1YnRyZWUuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDaGlsZHJlblJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogTGF6eS1sb2FkOiByZS1lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBwZXItZm9sZGVyIFwiTG9hZCBtb3JlXCIuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyOyBuZXh0UGFnZTogbnVtYmVyIH0+KCk7XG4gIC8qKiBMYXp5LWxvYWQ6IHJlLWVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHRvcC1sZXZlbCBcIkxvYWQgbW9yZVwiLiAqL1xuICBAT3V0cHV0KCkgcm9vdExvYWRNb3JlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogTGF6eS1sb2FkOiBkZWJvdW5jZWQgc2lkZWJhci1zZWFyY2ggdGVybS4gQ29uc3VtZWQgYnkgaG9zdHMgdGhhdCBoYXZlXG4gICAqICBzZXQgYHNlcnZlclNpZGVTZWFyY2g9dHJ1ZWAgdG8gcmVmZXRjaCB0aGUgdHJlZSBmcm9tIHRoZSBiYWNrZW5kLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJDcmVhdGVkUGF5bG9hZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgXCIrIE5ldyBmb2xkZXJcIjsgaG9zdCBzaG91bGQgb3BlbiBhIGNyZWF0aW9uIG1vZGFsLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhcmVudElkOiBudW1iZXIgfCBudWxsIH0+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJSZW5hbWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJSZW5hbWVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGZvbGRlciBkZWxldGlvbiB2aWEgdGhlIGludGVybmFsIGRpYWxvZyAob3JcbiAgICogaW1tZWRpYXRlbHksIHdoZW4gYHVzZUludGVybmFsRGlhbG9nc2AgaXMgZmFsc2UgYW5kIHRoZSBob3N0IGRyaXZlcyB0aGUgVVgpLlxuICAgKiBQYXlsb2FkIG5vdyBpbmNsdWRlcyB0aGUgdXNlcidzIGNob3NlbiBgc3RyYXRlZ3lgIGZvciB3aGF0IGhhcHBlbnMgdG8gdGhlXG4gICAqIGZvbGRlcidzIHRlc3QgY2FzZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRGVsZXRlZFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0c01vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0c01vdmVkUGF5bG9hZD4oKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQnVsayBhY3Rpb24gdG9vbGJhciBzdXJmYWNlIOKAlCBuYW1pbmcgbWlycm9ycyBjcWEtdGFibGUtdGVtcGxhdGUgc28gY29uc3VtZXJzXG4gIC8vIGdldCB0aGUgc2FtZSBldmVudHMgZnJvbSBlaXRoZXIgY29tcG9uZW50IChwbHVzIHRoZSBmb2xkZXIgZXZlbnRzIGJlbG93KS5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIEZpcmVzIG9uIHJhdyB0b29sYmFyIGFjdGlvbiBjbGljayDigJQgKmJlZm9yZSogYW55IGludGVybmFsIGRpYWxvZyBvcGVucy4gKi9cbiAgQE91dHB1dCgpIGJ1bGtBY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfT4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBcIlNlbGVjdCBhbGxcIiBpcyB0b2dnbGVkLiAqL1xuICBAT3V0cHV0KCkgYnVsa1NlbGVjdEFsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBkaXNtaXNzICjDlykgaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIGJ1bGtEaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyAqYWZ0ZXIqIHRoZSBsaWJyYXJ5LWludGVybmFsIG1vdmUtdG8tZm9sZGVyIGRpYWxvZyByZXNvbHZlcyB3aXRoIGFcbiAgICogdXNlciBjb25maXJtYXRpb24sIE9SIGltbWVkaWF0ZWx5IGZvciBub24tZGlhbG9nIGJ1bGsgYWN0aW9ucyBzdXBwbGllZCBieVxuICAgKiB0aGUgaG9zdC4gSG9zdHMgd2l0aCB0aGVpciBvd24gVVggc2hvdWxkIGxpc3RlbiBvbiBgYnVsa0FjdGlvbkNsaWNrYCArXG4gICAqIGBtb3ZlUmVxdWVzdGVkYCBhbmQgdHJlYXQgdGhpcyBhcyB0aGUgXCJjb25maXJtZWRcIiBzaWduYWwuXG4gICAqL1xuICBAT3V0cHV0KCkgYnVsa0FjdGlvbkludm9rZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZD4oKTtcblxuICBAT3V0cHV0KCkgc2lkZWJhckNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIHN1cmZhY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogV2hlbiB0cnVlLCByZW5kZXJzIGEgXCJSZW9yZGVyXCIgYnV0dG9uIGluIHRoZSB0b29sYmFyLiBIb3N0LWRyaXZlbi4gKi9cbiAgQElucHV0KCkgc2hvd1Jlb3JkZXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEhvc3QgZmxpcHMgdGhpcyB0cnVlIHdoaWxlIGl0cyBidWxrLXVwZGF0ZSBBUEkgY2FsbCBpcyBpbi1mbGlnaHQuIFRoZVxuICAgKiBjb21wb25lbnQga2VlcHMgdGhlIHJlb3JkZXIgVUkgcGlubmVkIChcIlNhdmluZy4uLlwiKSB3aGlsZSB0cnVlIGFuZCBleGl0c1xuICAgKiByZW9yZGVyIG1vZGUgd2hlbiBpdCBmbGlwcyBiYWNrIHRvIGZhbHNlICh0aGUgXCJmdXR1cmUgQVBJIGNhbGxcIiBob29rKS5cbiAgICovXG4gIEBJbnB1dCgpIHJlb3JkZXJTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFBhcnRpYWwgb3ZlcnJpZGUgZm9yIHRoZSBkZWZhdWx0IHJlb3JkZXIgbGFiZWxzIChcIlJlb3JkZXJcIiwgXCJEb25lXCIsIGV0Yy4pLiAqL1xuICBASW5wdXQoKSBzZXQgcmVvcmRlckxhYmVscyhwYXJ0aWFsOiBQYXJ0aWFsPFJlb3JkZXJMYWJlbHM+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUywgLi4uKHBhcnRpYWwgfHwge30pIH07XG4gIH1cbiAgZ2V0IHJlb3JkZXJMYWJlbHMoKTogUmVvcmRlckxhYmVscyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlb3JkZXJMYWJlbHM7XG4gIH1cbiAgcHJpdmF0ZSBfcmVvcmRlckxhYmVsczogUmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUyB9O1xuXG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIlJlb3JkZXJcIiBhbmQgdGhlIGNvbXBvbmVudCBlbnRlcnMgcmVvcmRlciBtb2RlLiAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJDYW5jZWxcIiDigJQgdGhlIG9yaWdpbmFsIG9yZGVyIGlzIGFscmVhZHkgcmVzdG9yZWQuICovXG4gIEBPdXRwdXQoKSByZW9yZGVyQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJEb25lXCIuIEhvc3Qgc2hvdWxkIHRha2UgYG9yZGVyZWRJdGVtc2AsIGNhbGwgaXRzXG4gICAqIGJ1bGstdXBkYXRlIEFQSSwgcmVmcmVzaCBgW2RhdGFdYCwgYW5kIGZsaXAgYHJlb3JkZXJTYXZpbmdgIGJhY2sgdG8gYGZhbHNlYCDigJRcbiAgICogdGhlIGNvbXBvbmVudCB3aWxsIHRoZW4gZXhpdCByZW9yZGVyIG1vZGUuXG4gICAqXG4gICAqIE5vdGU6IGZvciBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uLCBgb3JkZXJlZEl0ZW1zYCBpcyB0aGUgKmN1cnJlbnQgcGFnZSBzbGljZSosXG4gICAqIG5vdCB0aGUgZnVsbCBkYXRhc2V0IOKAlCBzYW1lIGFzIHRoZSBpbi1tZW1vcnkgdmlldyB0aGUgdXNlciB3YXMgZHJhZ2dpbmcuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFJlb3JkZXJTYXZlUGF5bG9hZD4oKTtcblxuICAvKiogSW50ZXJuYWwg4oCUIHRydWUgd2hpbGUgdGhlIHVzZXIgaXMgaW4gcmVvcmRlciBtb2RlLiAqL1xuICBpc1Jlb3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNuYXBzaG90IG9mIGBwYWdlZFJvd3NgIHRha2VuIG9uIGVudGVyOyB1c2VkIHRvIHJldmVydCBvbiBjYW5jZWwuICovXG4gIHByaXZhdGUgcmVvcmRlclNuYXBzaG90OiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZnQgb2YgdGhlIHJlb3JkZXJlZCByb3dzIChjdXJyZW50IHdvcmtpbmcgc3RhdGUpLiAqL1xuICBwcml2YXRlIHJlb3JkZXJEcmFmdDogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLyoqIEF1dG8tcmVmcmVzaCBpbnRlcnZhbCBjYXB0dXJlZCBvbiBlbnRlciwgc28gd2UgY2FuIHJlc3RvcmUgb24gY2FuY2VsL2RvbmUuICovXG4gIHByaXZhdGUgcmVvcmRlclNhdmVkQXV0b1JlZnJlc2g6IG51bWJlciA9IDA7XG4gIC8qKiBUcnVlIGFmdGVyIERvbmUgaGFzIGJlZW4gY2xpY2tlZCwgYXdhaXRpbmcgdGhlIGhvc3QncyBgcmVvcmRlclNhdmluZ2Ag4oaSIGZhbHNlIGZsaXAuICovXG4gIHByaXZhdGUgcmVvcmRlckF3YWl0aW5nU2F2ZUZsaXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiTW92ZSB0byBmb2xkZXJcIiBidWxrIGFjdGlvbiDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGRpYWxvZyBvcGVucy4gSG9zdHMgdGhhdCB3YW50IHRvIHJlbmRlciB0aGVpciBvd24gbW9kYWwgc2hvdWxkXG4gICAqIHNldCBgdXNlSW50ZXJuYWxEaWFsb2dzID0gZmFsc2VgIGFuZCBsaXN0ZW4gaGVyZS5cbiAgICovXG4gIEBPdXRwdXQoKSBtb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBzZWxlY3RlZDogYW55W107XG4gICAgY3VycmVudEZvbGRlcklkOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbGRlcnM6IEZvbGRlck5vZGVbXTtcbiAgfT4oKTtcblxuICAvKiogRmlyZXMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIGBzZWxlY3RlZEl0ZW1zYCBjaGFuZ2VzIGZyb20gd2l0aGluIChTZWxlY3QgQWxsIC8gRGlzbWlzcykuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBmb2xkZXIncyBkZWxldGUgYWZmb3JkYW5jZSDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGNvbmZpcm1hdGlvbiBkaWFsb2cgb3BlbnMuIEhvc3RzIG93bmluZyB0aGUgVVggbGlzdGVuIGhlcmUuXG4gICAqIFBheWxvYWQgaW5jbHVkZXMgYHRlc3RDb3VudGAgKyBgaGFzUGFyZW50YCBzbyBob3N0cyBjYW4gcmVuZGVyIHRoZSByaWdodFxuICAgKiBvcHRpb25zIGluIHRoZWlyIG93biBtb2RhbC5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEZWxldGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgcGlja3MgXCJNb3ZlIGZvbGRlclwiIGZyb20gYSBmb2xkZXIgcm93J3MgY29udGV4dCBtZW51IOKAlFxuICAgKiAqYmVmb3JlKiBhbnkgZGlhbG9nIG9wZW5zLiBIb3N0cyBvd25pbmcgdGhlIFVYIGxpc3RlbiBoZXJlIHdpdGhcbiAgICogYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgb3BlbiB0aGVpciBvd24gZm9sZGVyIHBpY2tlci5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGEgZm9sZGVyIG1vdmUgdmlhIHRoZSBpbnRlcm5hbCBwaWNrZXJcbiAgICogKG9yIGltbWVkaWF0ZWx5IHdoZW4gYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgdGhlIGhvc3QgZHJpdmVzIGl0KS5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyTW92ZWRQYXlsb2FkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBwaWNrcyBcIkR1cGxpY2F0ZSBmb2xkZXJcIiBmcm9tIGEgZm9sZGVyIHJvdydzIGNvbnRleHQgbWVudS5cbiAgICogVGhlIGxpYnJhcnkgZG9lc24ndCBvd24gcGVyc2lzdGVuY2UsIHNvIHRoZSBob3N0IGlzIGV4cGVjdGVkIHRvIGNsb25lIHRoZVxuICAgKiBmb2xkZXIncyBzdWJ0cmVlIHNlcnZlci1zaWRlIGFuZCAqcmVmZXJlbmNlKiAobm90IGNvcHkpIHRoZSB0ZXN0IGNhc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkUGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge31cbiAgcHJpdmF0ZSBwZW5kaW5nRmlsdGVyczogYW55O1xuICBwcml2YXRlIGFwcGxpZWRGaWx0ZXJzOiBhbnk7XG4gIHByaXZhdGUgYXV0b1JlZnJlc2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25BdXRvUmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uVmlzaWJpbGl0eUNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGF1dG9SZWZyZXNoSW50ZXJ2YWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQFZpZXdDaGlsZChEeW5hbWljRmlsdGVyQ29tcG9uZW50KSBkeW5hbWljRmlsdGVyQ29tcG9uZW50PzogRHluYW1pY0ZpbHRlckNvbXBvbmVudDtcblxuICAvLyBEZXJpdmVkIGNvbHVtbnMgd2l0aCB2aXNpYmlsaXR5IGFwcGxpZWQuXG4gIGNvbXB1dGVkQ29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLy8gQXV0by1nZW5lcmF0ZWQgdmlzaWJpbGl0eSBjb2x1bW5zIGZyb20gY29sdW1ucyBpbnB1dFxuICB2aXNpYmlsaXR5Q29sdW1uczogQXJyYXk8eyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wdXRlZENvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJpbGl0eSA9IHRoaXMuX2NvbHVtblZpc2liaWxpdHkgfHwge307XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5jb2x1bW5zIHx8IFtdO1xuICAgIGNvbnN0IG1hcHBlZCA9IHNvdXJjZS5tYXAoY29sID0+IHtcbiAgICAgIGlmIChbJ2NoZWNrYm94JywgJ2FjdGlvbnMnXS5pbmNsdWRlcyhjb2wuZmllbGRJZCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3cgPSB2aXNpYmlsaXR5W2NvbC5maWVsZElkXTtcbiAgICAgIHJldHVybiB7IC4uLmNvbCwgaXNTaG93OiBzaG93ICE9PSBmYWxzZSB9O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubW9kdWxhckNvbmZpZz8uc2hvd0ZvbGRlckNvbHVtbiAmJiAhbWFwcGVkLnNvbWUoYyA9PiBjLmZpZWxkSWQgPT09IEZPTERFUl9DT0xVTU5fRklFTERfSUQpKSB7XG4gICAgICBjb25zdCBmb2xkZXJTaG93ID0gdmlzaWJpbGl0eVtGT0xERVJfQ09MVU1OX0ZJRUxEX0lEXTtcbiAgICAgIGNvbnN0IGZvbGRlckNvbDogRHluYW1pY1RhYmxlQ29sdW1uID0ge1xuICAgICAgICAuLi50aGlzLmJ1aWxkRm9sZGVyQ29sdW1uKCksXG4gICAgICAgIGlzU2hvdzogZm9sZGVyU2hvdyAhPT0gZmFsc2UsXG4gICAgICB9O1xuICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgdHJhaWxpbmcgJ2FjdGlvbnMnIGNvbHVtbiB3aGVuIHByZXNlbnQgc28gdGhlIGZvbGRlclxuICAgICAgLy8gY29sdW1uIHJlYWRzIGFzIHRoZSBsYXN0IGRhdGEgY29sdW1uIHJhdGhlciB0aGFuIGFmdGVyIHRoZSBhY3Rpb24gbWVudS5cbiAgICAgIGNvbnN0IGFjdGlvbnNJZHggPSBtYXBwZWQuZmluZEluZGV4KGMgPT4gYy5maWVsZElkID09PSAnYWN0aW9ucycpO1xuICAgICAgaWYgKGFjdGlvbnNJZHggPj0gMCkge1xuICAgICAgICBtYXBwZWQuc3BsaWNlKGFjdGlvbnNJZHgsIDAsIGZvbGRlckNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucHVzaChmb2xkZXJDb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcHV0ZWRDb2x1bW5zID0gbWFwcGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvbGRlckNvbHVtbigpOiBEeW5hbWljVGFibGVDb2x1bW4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZElkOiBGT0xERVJfQ09MVU1OX0ZJRUxEX0lELFxuICAgICAgZmllbGROYW1lOiB0aGlzLm1vZHVsYXJMYWJlbHM/LmZvbGRlckNvbHVtbkxhYmVsIHx8ICdGb2xkZXInLFxuICAgICAgLy8gTGV0cyB0aGUgZHluYW1pYyB0YWJsZSBzb3J0L2ZpbHRlciBvbiB0aGUgcmVzb2x2ZWQgbmFtZSB3aXRob3V0IGdvaW5nXG4gICAgICAvLyB0aHJvdWdoIHJlbmRlcigpIOKAlCBhbHNvIG1ha2VzIGByb3cuZm9sZGVyTmFtZWAgYSBmaXJzdC1jbGFzcyBmaWVsZFxuICAgICAgLy8gYWxvbmdzaWRlIHJvdy5wcmlvcml0eSBldGMuIGZvciBkb3duc3RyZWFtIGNvZGUuXG4gICAgICBmaWVsZFZhbHVlOiAnZm9sZGVyTmFtZScsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIC8vIGlzRGVmYXVsdCA9PT0gZmFsc2UgbWFya3MgdGhlIGNvbHVtbiBhcyBcInVzZXItdG9nZ2xlYWJsZVwiIOKAlCBpdCBzaG93cyB1cFxuICAgICAgLy8gaW4gbWFwVmlzaWJpbGl0eUNvbHVtbnMgYW5kIHRoZXJlZm9yZSBpbiB0aGUgc2V0dGluZ3MgZHJvcGRvd24uXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcmVuZGVyOiAocm93OiBhbnkpID0+IHRoaXMucmVuZGVyRm9sZGVyQ2VsbChyb3cpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVGb2xkZXJOYW1lKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBpZiAocm93ICYmIHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIHtcbiAgICAgIHJldHVybiByb3cuZm9sZGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgY29uc3Qgbm9kZSA9IGZvbGRlcklkICE9IG51bGwgPyB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBmb2xkZXJJZCBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4gbm9kZT8ubmFtZSB8fCB0aGlzLm1vZHVsYXJMYWJlbHM/LnVub3JnYW5pc2VkUm93TGFiZWwgfHwgJ1Vub3JnYW5pc2VkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBkZXJpdmVkIGBmb2xkZXJOYW1lYCB0byBlYWNoIHJvdyB3aGVuIHRoZSBob3N0IGhhc24ndCBzdXBwbGllZFxuICAgKiBvbmUuIE11dGF0ZXMgaW4gcGxhY2Ugc28gdGhlIHZhbHVlIGlzIGF2YWlsYWJsZSBldmVyeXdoZXJlIHRoZSByb3cgZmxvd3NcbiAgICog4oCUIHNvcnQsIGZpbHRlciwgY29sdW1uIHJlbmRlcnMsIGV4cG9ydHMg4oCUIGFsb25nc2lkZSBmaWVsZHMgbGlrZSBwcmlvcml0eS5cbiAgICovXG4gIHByaXZhdGUgZW5yaWNoUm93c1dpdGhGb2xkZXJOYW1lKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaWYgKCFyb3cgfHwgdHlwZW9mIHJvdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIGNvbnRpbnVlO1xuICAgICAgcm93LmZvbGRlck5hbWUgPSB0aGlzLnJlc29sdmVGb2xkZXJOYW1lKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJGb2xkZXJDZWxsKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXNvbHZlRm9sZGVyTmFtZShyb3cpO1xuICAgIGNvbnN0IGVzY2FwZWQgPSBuYW1lLnJlcGxhY2UoL1smPD5cIiddL2csIGNoID0+ICh7XG4gICAgICAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsIFwiJ1wiOiAnJiMzOTsnLFxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbY2hdKTtcbiAgICByZXR1cm4gKFxuICAgICAgYDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRleHQtWyM2RDZENzRdXCI+YCArXG4gICAgICAgIGA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5gICtcbiAgICAgICAgICBgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+YCArXG4gICAgICAgIGA8L3N2Zz5gICtcbiAgICAgICAgYDxzcGFuPiR7ZXNjYXBlZH08L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucyA9IHRoaXMubWFwVmlzaWJpbGl0eUNvbHVtbnMoKTtcbiAgICB0aGlzLnZpc2liaWxpdHlDb2x1bW5zID0gdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBDb250cm9sbGVkIGNvbHVtbiB2aXNpYmlsaXR5OiBwYXJlbnQgY2FuIHNlZWQgYW5kIHB1c2ggdXBkYXRlcy5cbiAgQElucHV0KCkgc2V0IGNvbHVtblZpc2liaWxpdHkoY2ZnOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNmZykge1xuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eSA9IHsgLi4uY2ZnIH07XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGdldCBjb2x1bW5WaXNpYmlsaXR5KCk6IENvbHVtblZpc2liaWxpdHlDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5O1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snaXNFbXB0eVN0YXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ21vZHVsYXJDb25maWcnXSB8fCBjaGFuZ2VzWydtb2R1bGFyTGFiZWxzJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb2xkZXJzJ10gJiYgIWNoYW5nZXNbJ2ZvbGRlcnMnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gRm9sZGVyIG5hbWUgbG9va3VwIGxpdmVzIGluc2lkZSB0aGUgY29sdW1uJ3MgcmVuZGVyKCk7IHJlYnVpbGQgdGhlXG4gICAgICAvLyBjb2x1bW5zIGFycmF5IHNvIHRoZSBkeW5hbWljIHRhYmxlJ3MgT25QdXNoIENEIHBpY2tzIHVwIHRoZSBuZXcgcmVmXG4gICAgICAvLyBhbmQgcmUtaW52b2tlcyByZW5kZXIoKSB3aXRoIHRoZSBsYXRlc3QgZm9sZGVycy4gQWxzbyByZWZyZXNoIGFueVxuICAgICAgLy8gcm93cyB3ZSd2ZSBwcmV2aW91c2x5IGVucmljaGVkIHNvIHNvcnQvZmlsdGVyIG9uIHJvdy5mb2xkZXJOYW1lXG4gICAgICAvLyByZWZsZWN0cyB0aGUgbmV3IGZvbGRlciBsaXN0LlxuICAgICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEZvbGRlcklkJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkRm9sZGVySWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gUGVyIHRoZSBhcHByb3ZlZCBwbGFuOiBjbGVhciBzZWxlY3Rpb24gYW5kIHJlc2V0IHBhZ2luYXRpb24gb24gZm9sZGVyIGNoYW5nZS5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmlld01vZGUnXSAmJiAhY2hhbmdlc1sndmlld01vZGUnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gU3dpdGNoaW5nIGJldHdlZW4gbGlzdCBhbmQgbW9kdWxhciBjaGFuZ2VzIHdoZXRoZXIgdGhlIGZvbGRlciBmaWx0ZXIgYXBwbGllcy5cbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlbXMnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10gJiYgIWNoYW5nZXNbJ3Jlb3JkZXJTYXZpbmcnXS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgbm93U2F2aW5nID0gISFjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSG9zdCBmaW5pc2hlZCBpdHMgYnVsay11cGRhdGUgY2FsbCDigJQgZXhpdCByZW9yZGVyIG1vZGUuXG4gICAgICBpZiAoIW5vd1NhdmluZyAmJiB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwKSB7XG4gICAgICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcblxuICAgIC8vIEluIHNlcnZlci1zaWRlIG1vZGUsIGFzc3VtZSBpbmNvbWluZyBkYXRhIGlzIGFscmVhZHkgYSBwYWdlIHNsaWNlXG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLmZpbHRlcmVkUm93c107XG4gICAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5WaXNpYmlsaXR5KCk7XG4gICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBgZmlsdGVyZWRSb3dzYCBmcm9tIGBkYXRhYCBieSBhcHBseWluZyAoYSkgdGhlIGZpZWxkIGZpbHRlcnMgKHN0YXR1cy9wcmlvcml0eS9ldGMuKVxuICAgKiBhbmQgKGIpIHRoZSBmb2xkZXIgZmlsdGVyIGRlcml2ZWQgZnJvbSBgc2VsZWN0ZWRGb2xkZXJJZGAgKyBgZm9sZGVySWRBY2Nlc3NvcmAuXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRGaWx0ZXJlZFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gdGhpcy5hcHBsaWVkRmlsdGVycyA/PyB7fTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZGF0YS5maWx0ZXIociA9PiB0aGlzLnBhc3NGaWx0ZXJzKGVmZmVjdGl2ZSwgcikgJiYgdGhpcy5wYXNzRm9sZGVyKHIpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFzc0ZvbGRlcihyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIExpc3QgdmlldyBpZ25vcmVzIGZvbGRlciBmaWx0ZXJpbmcgZW50aXJlbHkg4oCUIGJlaGF2ZXMgbGlrZSB0aGUgdHJhZGl0aW9uYWwgZmxhdCB0YWJsZS5cbiAgICBpZiAoIXRoaXMuaXNNb2R1bGFyVmlldykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgLy8gUm9vdCB2aWV3OiBzaG93IG9ubHkgcm93cyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gYW55IGZvbGRlciAodGhlIFwiVW5vcmdhbmlzZWRcIiBidWNrZXQpLlxuICAgIC8vIEZvbGRlciB0aWxlcyBhYm92ZSB0aGUgdGFibGUgYXJlIHRoZSBlbnRyeSBwb2ludCB0byBwZXItZm9sZGVyIGNvbnRlbnRzLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvbGRlcklkID09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmb2xkZXJJZCAhPSBudWxsICYmIFN0cmluZyhmb2xkZXJJZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIG1vZHVsYXIgKGZvbGRlci1hd2FyZSkgVUkuICovXG4gIGdldCBpc01vZHVsYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdNb2RlID09PSAnbW9kdWxhcic7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIElEcyBmcm9tIHNlbGVjdGVkSXRlbXMgKG9iamVjdHMpXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzKCk6IFNldDxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gTnVtYmVyKGl0ZW0uaWQpKS5maWx0ZXIoaWQgPT4gIWlzTmFOKGlkKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHNTZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gSWYgbm8gc2VsZWN0ZWQgSURzLCBjbGVhciBhbGwgc2VsZWN0aW9uIHN0YXRlc1xuICAgICAgaWYgKHRoaXMucGFnZWRSb3dzKSB7XG4gICAgICAgIHRoaXMucGFnZWRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gc3RhdGUgYmFzZWQgb24gc2VsZWN0ZWRJdGVtc1xuICAgIGlmICh0aGlzLnBhZ2VkUm93cykge1xuICAgICAgdGhpcy5wYWdlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93ICYmIHJvdy5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHJvdyBhcyBhbnkpLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZElkc1NldC5oYXMoTnVtYmVyKHJvdy5pZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBmaWx0ZXJlZFJvd3MgZm9yIGNvbnNpc3RlbmN5XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGlmIChyb3cgJiYgcm93LmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IHNlbGVjdGVkSWRzU2V0LmhhcyhOdW1iZXIocm93LmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBDYWNoZSB2aXNpYmlsaXR5IGNvbHVtbnMgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IGFycmF5cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnMgPSB0aGlzLm1hcFZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgLy8gU2VlZCB2aXNpYmlsaXR5IHN0YXRlIGZyb20gZWFjaCBjb2x1bW4ncyBpc1Nob3cgKGRlZmF1bHQgdG8gdHJ1ZSkgc28gY29uc3VtZXJzXG4gICAgLy8gY2FuIHByZS1hcHBseSBwZXJzaXN0ZWQgcHJlZmVyZW5jZXMgdmlhIGNvbHVtbnNbaV0uaXNTaG93LlxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucykge1xuICAgICAgaWYgKHRoaXMuX2NvbHVtblZpc2liaWxpdHlbY29sLmlkXSAhPT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHNyY0NvbCA9IHNvdXJjZS5maW5kKGMgPT4gYy5maWVsZElkID09PSBjb2wuaWQpO1xuICAgICAgaWYgKHNyY0NvbCkge1xuICAgICAgICAvLyBIb3N0LXN1cHBsaWVkIGNvbHVtbiDigJQgaG9ub3VyIGl0cyBpc1Nob3cgZXhhY3RseSwgaW5jbHVkaW5nIGZvciB0aGVcbiAgICAgICAgLy8gZm9sZGVyIGNvbHVtbi4gSG9zdHMgd2FudGluZyB2aWV3LW1vZGUtYXdhcmUgZGVmYXVsdHMgc2hvdWxkIHNldFxuICAgICAgICAvLyBpc1Nob3cgdGhlbXNlbHZlcy5cbiAgICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gc3JjQ29sLmlzU2hvdyAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkge1xuICAgICAgICAvLyBBdXRvLWluamVjdGVkIGZvbGRlciBjb2x1bW4gKGhvc3QgZGlkIG5vdCBzdXBwbHkgb25lKTogZGVmYXVsdCB0b1xuICAgICAgICAvLyB2aXNpYmxlIGluIGxpc3QgdmlldywgaGlkZGVuIGluIG1vZHVsYXIgdmlldy4gVGhlIHVzZXIncyB0b2dnbGVcbiAgICAgICAgLy8gcGVyc2lzdHMgYWNyb3NzIHZpZXdNb2RlIGZsaXBzIG9uY2Ugc2VlZGVkLlxuICAgICAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5W2NvbC5pZF0gPSB0aGlzLnZpZXdNb2RlID09PSAnbGlzdCc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgYW55Um93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzZWxlY3RlZCBpdGVtcyAoZWl0aGVyIG9uIGN1cnJlbnQgcGFnZSBvciBhY3Jvc3MgYWxsIHBhZ2VzIHZpYSBzZWxlY3RlZEl0ZW1zKVxuICAgIGNvbnN0IGhhc1NlbGVjdGVkT25QYWdlID0gISEodGhpcy5wYWdlZFJvd3MgJiYgdGhpcy5wYWdlZFJvd3Muc29tZShyID0+ICEhKHIgYXMgYW55KS5pc1NlbGVjdGVkKSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0ZWRBY3Jvc3NQYWdlcyA9IHNlbGVjdGVkSWRzU2V0LnNpemUgPiAwO1xuICAgIHJldHVybiBoYXNTZWxlY3RlZE9uUGFnZSB8fCBoYXNTZWxlY3RlZEFjcm9zc1BhZ2VzO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3RlZEl0ZW1zKCk6IGFueVtdIHtcbiAgICAvLyBJZiBzZWxlY3RlZEl0ZW1zIChmdWxsIG9iamVjdHMpIGFyZSBwcm92aWRlZCwgdXNlIHRoZW0gZGlyZWN0bHlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIHNlbGVjdGVkIGl0ZW1zIGFyZSByZXR1cm5lZCwgaW5jbHVkaW5nIHRob3NlIGZyb20gb3RoZXIgcGFnZXNcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogRm9yIGNsaWVudC1zaWRlIHBhZ2luYXRpb24gb3Igd2hlbiBzZWxlY3RlZEl0ZW1zIGlzIG5vdCBwcm92aWRlZCxcbiAgICAvLyBmaWx0ZXIgcGFnZWRSb3dzIHRvIGdldCBzZWxlY3RlZCBpdGVtcyBmcm9tIGN1cnJlbnQgcGFnZSBvbmx5XG4gICAgaWYgKCF0aGlzLnBhZ2VkUm93cyB8fCB0aGlzLnBhZ2VkUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZElkc1NldCA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKTtcbiAgICBcbiAgICAvLyBGaWx0ZXIgcm93cyB0aGF0IGFyZSBzZWxlY3RlZFxuICAgIHJldHVybiB0aGlzLnBhZ2VkUm93c1xuICAgICAgLmZpbHRlcihyID0+IHtcbiAgICAgICAgaWYgKCFyIHx8IHIuaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByb3dJZCA9IE51bWJlcihyLmlkKTtcbiAgICAgICAgLy8gSW5jbHVkZSBpZiBlaXRoZXI6XG4gICAgICAgIC8vIDEuIFRoZSByb3cgaGFzIGlzU2VsZWN0ZWQgPSB0cnVlIChjdXJyZW50IHBhZ2Ugc2VsZWN0aW9uKVxuICAgICAgICAvLyAyLiBUaGUgcm93J3MgSUQgaXMgaW4gc2VsZWN0ZWRJdGVtcyAoc2VsZWN0ZWQgb24gb3RoZXIgcGFnZXMgb3IgcmVzdG9yZWQgc2VsZWN0aW9uKVxuICAgICAgICByZXR1cm4gISEociBhcyBhbnkpLmlzU2VsZWN0ZWQgfHwgc2VsZWN0ZWRJZHNTZXQuaGFzKHJvd0lkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWN0aW9uQ2xpY2soZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2FjdGlvbiB0b29sYmFyJywgZGF0YSk7XG4gIH1cblxuICB2aWV3KGlkOiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnVmlldycsIGlkKTtcbiAgfVxuXG4gIGVkaXQocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRWRpdCcsIHJvdyk7XG4gIH1cblxuICBkZWxldGUocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlJywgcm93KTtcbiAgfVxuXG4gIHRvZ2dsZUZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dGaWx0ZXJQYW5lbCA9ICF0aGlzLnNob3dGaWx0ZXJQYW5lbDtcbiAgfVxuXG4gIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjZmc6IENvbHVtblZpc2liaWxpdHlDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5ID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KHsgLi4uY2ZnIH0pO1xuICB9XG5cbiAgb25BdXRvUmVmcmVzaENoYW5nZShpbnRlcnZhbE1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbCA9IGludGVydmFsTXM7XG4gICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKGludGVydmFsTXMpO1xuICAgIHRoaXMuYXV0b1JlZnJlc2hJbnRlcnZhbENoYW5nZS5lbWl0KGludGVydmFsTXMpO1xuICAgIHRoaXMudHJpZ2dlclJlbG9hZCgpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWYWx1ZSBjaGFuZ2VkJywgdmFsdWUpO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBzZWFyY2godmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWFyY2gnLCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhcmVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDbGVhcmVkJyk7XG4gIH1cblxuICBvbkVtcHR5QWN0aW9uKGFjdGlvbjogYW55KSB7XG4gICAgaWYgKGFjdGlvbj8ubGFiZWwgPT09ICdTaG93IGZpbHRlcnMnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyc0NoYW5nZWQoY3VycmVudDogYW55KTogdm9pZCB7XG4gICAgLy8gRGVmZXIgYXBwbHlpbmcgZmlsdGVycyBhbmQgdXBkYXRpbmcgY2hpcHMgdW50aWwgQXBwbHkgRmlsdGVyIGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gY3VycmVudDtcbiAgfVxuXG4gIG9uRmlsdGVyc0FwcGxpZWQoYXBwbGllZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmlsdGVyUGFuZWwgPSBmYWxzZTtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBhcHBsaWVkID8/IHRoaXMucGVuZGluZ0ZpbHRlcnMgPz8ge307XG4gICAgdGhpcy5hcHBsaWVkRmlsdGVycyA9IGVmZmVjdGl2ZTtcbiAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICBjb25zdCBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICAgIGlmIChlZmZlY3RpdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVmZmVjdGl2ZSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlZmZlY3RpdmVba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlciBjb25maWcgaXRlbSBmb3IgdGhpcyBrZXlcbiAgICAgICAgY29uc3QgZmlsdGVyQ29uZmlnSXRlbSA9IHRoaXMuZmlsdGVyQ29uZmlnPy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWx0ZXJDb25maWdJdGVtPy5vcHRpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgZGlzcGxheSB0ZXh0IGZyb20gb3B0aW9uc1xuICAgICAgICBjb25zdCBnZXREaXNwbGF5VGV4dCA9ICh2YWw6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgLy8gSWYgdmFsdWUgaXMgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCBuYW1lL2xhYmVsLCB1c2UgaXRcbiAgICAgICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICh2YWwubmFtZSB8fCB2YWwubGFiZWwgfHwgdmFsLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5uYW1lID8/IHZhbC5sYWJlbCA/PyBTdHJpbmcodmFsLnZhbHVlID8/IHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG9wdGlvbiBpbiB0aGUgY29uZmlnXG4gICAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0SWQgPSBvcHQuaWQgPz8gb3B0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgb3B0VmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB2YWxTdHIgPSBTdHJpbmcodmFsKTtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcob3B0SWQpID09PSB2YWxTdHIgfHwgU3RyaW5nKG9wdFZhbHVlKSA9PT0gdmFsU3RyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24ubmFtZSA/PyBvcHRpb24ubGFiZWwgPz8gU3RyaW5nKG9wdGlvbi52YWx1ZSA/PyB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB0aGUgcmF3IHZhbHVlXG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgICAgbGV0IGxhYmVsID0gZmlsdGVyQ29uZmlnSXRlbT8ubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0ZXh0ID0gdmFsdWUubWFwKCh2OiBhbnkpID0+IGdldERpc3BsYXlUZXh0KHYpKS5qb2luKCcsICcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBpZiAoJ3N0YXJ0JyBpbiB2YWx1ZSB8fCAnZW5kJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHZhbHVlLnN0YXJ0ID8gbmV3IERhdGUodmFsdWUuc3RhcnQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBlID0gdmFsdWUuZW5kID8gbmV3IERhdGUodmFsdWUuZW5kKS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgdGV4dCA9IFtzLCBlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpcHMucHVzaCh7IGtleSwgbGFiZWwsIHRleHQsIGZ1bGxUZXh0OiB0ZXh0LCBoYXNNb3JlOiB0ZXh0Lmxlbmd0aCA+IDMwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoaXBzID0gY2hpcHM7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaGFuZGxlUmVzZXRGaWx0ZXJDbGljaygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBjaGlwcyBhbmQgcmVzZXQgZmlsdGVyZWQgZGF0YSB3aGVuIHJlc2V0IGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbGllZEZpbHRlcnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMub25SZXNldEZpbHRlckNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZVJlZnJlc2hDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9uQXV0b1JlZnJlc2hDbGljay5lbWl0KCk7XG4gICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5vblJlbG9hZC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQXV0b1JlZnJlc2goaW50ZXJ2YWxNczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckF1dG9SZWZyZXNoKCk7XG4gICAgaWYgKGludGVydmFsTXMgJiYgaW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gICAgICB9LCBpbnRlcnZhbE1zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQXV0b1JlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b1JlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZWZyZXNoVGltZXIpO1xuICAgICAgdGhpcy5hdXRvUmVmcmVzaFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBdXRvUmVmcmVzaCgpO1xuICB9XG5cbiAgb25QYWdpbmF0ZShlOiB7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGUucGFnZUluZGV4O1xuICAgIHRoaXMucGFnZVNpemUgPSBlLnBhZ2VTaXplO1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHsgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gIH1cblxuICBvblJlbW92ZUNoaXAoY2hpcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IHRoaXMuY2hpcHMuZmlsdGVyKGMgPT4gYyAhPT0gY2hpcCk7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IGNvbXBvbmVudCAoc2FtZSBwYXR0ZXJuIGFzIGV4ZWN1dGlvbiB0YWIpXG4gICAgdGhpcy5yZW1vdmVDaGlwLmVtaXQoY2hpcCk7XG4gIH1cblxuICBvbkNsZWFyQWxsQ2hpcHMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHRoZSBkeW5hbWljLWZpbHRlciBjb21wb25lbnQgZm9ybSB3aGVuIGNsZWFyaW5nIGFsbCBjaGlwc1xuICAgIGlmICh0aGlzLmR5bmFtaWNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0ZpbHRlckNvbXBvbmVudC5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICAvLyBTZXJ2ZXIgbW9kZTogcGFyZW50IHN1cHBsaWVzIGFscmVhZHktcGFnaW5hdGVkIGRhdGFcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gWy4uLnRoaXMuZmlsdGVyZWRSb3dzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucGFnZWRSb3dzID0gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcFZpc2liaWxpdHlDb2x1bW5zKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgaXRlbXMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKVxuICAgICAgLmZpbHRlcihjID0+IGMuaXNEZWZhdWx0ID09PSBmYWxzZSlcbiAgICAgIC5tYXAoYyA9PiAoeyBpZDogYy5maWVsZElkLCBsYWJlbDogYy5maWVsZE5hbWUgfHwgYy5maWVsZElkIH0pKTtcbiAgICBpZiAodGhpcy5tb2R1bGFyQ29uZmlnPy5zaG93Rm9sZGVyQ29sdW1uICYmICFpdGVtcy5zb21lKGkgPT4gaS5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkpIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBpZDogRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscz8uZm9sZGVyQ29sdW1uTGFiZWwgfHwgJ0ZvbGRlcicsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IGFueSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdHMgPSBEYXRlLnBhcnNlKGQpO1xuICAgIHJldHVybiBpc05hTih0cykgPyBudWxsIDogdHM7XG4gIH1cblxuICBwcml2YXRlIHBhc3NGaWx0ZXJzKGZpbHRlcnM6IGFueSwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybiB0cnVlO1xuICAgIGlmIChmaWx0ZXJzLnN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGZpbHRlcnMuc3RhdHVzKSAmJiBmaWx0ZXJzLnN0YXR1cy5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy5zdGF0dXMuaW5jbHVkZXMocm93LnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMucHJpb3JpdHkgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXJzLnByaW9yaXR5KSAmJiBmaWx0ZXJzLnByaW9yaXR5Lmxlbmd0aCkge1xuICAgICAgaWYgKCFmaWx0ZXJzLnByaW9yaXR5LmluY2x1ZGVzKHJvdy5wcmlvcml0eU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnRlc3RUeXBlICYmIEFycmF5LmlzQXJyYXkoZmlsdGVycy50ZXN0VHlwZSkgJiYgZmlsdGVycy50ZXN0VHlwZS5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy50ZXN0VHlwZS5pbmNsdWRlcyhyb3cudGVzdFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLmNyZWF0ZWRfZGF0ZSAmJiAoZmlsdGVycy5jcmVhdGVkX2RhdGUuc3RhcnQgfHwgZmlsdGVycy5jcmVhdGVkX2RhdGUuZW5kKSkge1xuICAgICAgY29uc3Qgc3RhcnRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5zdGFydCk7XG4gICAgICBjb25zdCBlbmRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5lbmQpO1xuICAgICAgY29uc3Qgcm93VHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUocm93LmNyZWF0ZWRBdCk7XG4gICAgICBpZiAocm93VHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsICYmIHJvd1RzIDwgc3RhcnRUcykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZW5kVHMgIT0gbnVsbCAmJiByb3dUcyA+IGVuZFRzKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJhY2tCeVRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlEcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlTZWxlY3REcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIEV4cG9ydCBtb2RhbCBzdGF0ZVxuICBpc0V4cG9ydE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGV4cG9ydENvZGVDbGljaygpOiB2b2lkIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgaXRlbXNcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtcztcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZFxuICAgICAgdGhpcy5vbkV4cG9ydENsaWNrLmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZUV4cG9ydE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIG9uRXhwb3J0TW9kYWxFeHBvcnQocmVzdWx0OiB7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrOiAnV0VCRFJJVkVSX0lPJyB8ICdTRUxFTklVTV9KQVZBJyB9KTogdm9pZCB7XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHdpdGggZXhwb3J0IHJlc3VsdFxuICAgIHRoaXMub25FeHBvcnRDbGljay5lbWl0KHtcbiAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgZW1haWxzOiByZXN1bHQuZW1haWxzLFxuICAgICAgZnJhbWV3b3JrOiByZXN1bHQuZnJhbWV3b3JrLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQ2FzZXNGb3JFeHBvcnQoKTogQXJyYXk8eyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgbmFtZTogaXRlbS5uYW1lIHx8IGl0ZW0udGl0bGUgfHwgJ1VubmFtZWQnXG4gICAgfSkpO1xuICB9XG4gIGdldCBhcnJvd0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdjcWEtdy00JyxcbiAgICAgICdjcWEtaC00JyxcbiAgICAgICdjcWEtcmVsYXRpdmUnLFxuICAgICAgJ2NxYS10cmFuc2l0aW9uLXRyYW5zZm9ybSdcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuc2hvd0ZpbHRlclBhbmVsKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjcWEtcm90YXRlLTE4MCcpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlQ2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaGVscGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZsYXQgbGlzdCBvZiByb290LWxldmVsIGZvbGRlcnMgZm9yIHRoZSBcIk9yZ2FuaXNlZFwiIGdyaWQgb24gdGhlIHJvb3Qgdmlldy5cbiAgICogUHJlZmVycyB0aGUgaG9zdC1wcm92aWRlZCBgcm9vdEZvbGRlcnNgIHNuYXBzaG90IHdoZW4gc2V0IOKAlCBhbmFsb2dvdXMgdG9cbiAgICogaG93IGBzdWJmb2xkZXJUaWxlc2AgZmFsbHMgYmFjayB0byBgc2VsZWN0ZWRGb2xkZXJOb2RlYCBhbmQgYGJyZWFkY3J1bWJUcmFpbGBcbiAgICogZmFsbHMgYmFjayB0byBgc2VsZWN0ZWRGb2xkZXJUcmFpbGAgd2hlbiBgZm9sZGVyc2AgaGFzIGJlZW4gc3dhcHBlZCB0byBhXG4gICAqIHNlYXJjaC1yZXN1bHRzIGxpc3QuIEZhbGxzIGJhY2sgdG8gYHRoaXMuZm9sZGVyc2Agb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0IHJvb3RGb2xkZXJUaWxlcygpOiBGb2xkZXJOb2RlW10ge1xuICAgIGlmICh0aGlzLnJvb3RGb2xkZXJzICE9IG51bGwpIHJldHVybiB0aGlzLnJvb3RGb2xkZXJzO1xuICAgIHJldHVybiB0aGlzLmZvbGRlcnMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3ViZm9sZGVycyBvZiB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciAoZm9yIHRoZSBcIlN1YmZvbGRlcnMgaW4gLi4uXCIgZ3JpZCkuXG4gICAqL1xuICBnZXQgc3ViZm9sZGVyVGlsZXMoKTogRm9sZGVyTm9kZVtdIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiBbXTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgdGhpcy5zZWxlY3RlZEZvbGRlcklkKTtcbiAgICBpZiAobm9kZT8uY2hpbGRyZW4/Lmxlbmd0aCkgcmV0dXJuIG5vZGUuY2hpbGRyZW47XG4gICAgLy8gRmFsbGJhY2s6IGhvc3QtcHJvdmlkZWQgc25hcHNob3Qgd2hlbiB0aGUgbGl2ZSB0cmVlIGRvZXNuJ3QgY29udGFpblxuICAgIC8vIHRoZSBzZWxlY3Rpb24gKHJlZnJlc2gtcmVzdG9yZSBiZWZvcmUgYW5jZXN0b3JzIGFyZSBsb2FkZWQsIG9yIHNpZGViYXJcbiAgICAvLyBzZWFyY2ggd2hlcmUgYGZvbGRlcnNgIGhvbGRzIG9ubHkgdGhlIG1hdGNoZWQgcmVzdWx0cykuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlICYmXG4gICAgICAgIFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZS5pZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvbGRlck5vZGUuY2hpbGRyZW4gPz8gW107XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhZGNydW1iIHRyYWlsIGZyb20gXCJBbGwgZm9sZGVyc1wiIGRvd24gdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIuXG4gICAqL1xuICBnZXQgYnJlYWRjcnVtYlRyYWlsKCk6IEZvbGRlck5vZGVbXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gW107XG4gICAgY29uc3QgdHJhaWw6IEZvbGRlck5vZGVbXSA9IFtdO1xuICAgIHRoaXMuYnVpbGRUcmFpbCh0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCwgdHJhaWwpO1xuICAgIGlmICh0cmFpbC5sZW5ndGgpIHJldHVybiB0cmFpbDtcbiAgICAvLyBGYWxsYmFjazogaG9zdC1wcm92aWRlZCBzbmFwc2hvdCBzdXJ2aXZlcyBzd2FwcyBvZiBgdGhpcy5mb2xkZXJzYCAodGhlXG4gICAgLy8gY2Fub25pY2FsIGNhc2UgaXMgc2lkZWJhciBzZWFyY2gsIHdoZXJlIHRoZSBsaXZlIHdhbGsgd29uJ3QgZmluZCB0aGVcbiAgICAvLyBzZWxlY3RlZCBmb2xkZXIncyBhbmNlc3RvcnMgYW1vbmcgdGhlIGZsYXQgcmVzdWx0IHNldCkuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXJUcmFpbCA/PyBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRUcmFpbChub2RlczogRm9sZGVyTm9kZVtdLCB0YXJnZXRJZDogbnVtYmVyLCBhY2M6IEZvbGRlck5vZGVbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgYWNjLnB1c2gobik7XG4gICAgICAvLyBVc2UgU3RyaW5nKCkgY29lcmNpb24gZm9yIHNhZmV0eSBpbiBjYXNlIGlkcyBhcnJpdmUgYXMgZWl0aGVyIG51bWJlciBvclxuICAgICAgLy8gc3RyaW5nIGZyb20gZGlmZmVyZW50IEFQSS90ZXN0IGRhdGEgc2hhcGVzIChlLmcuIHJhdyBKU09OIHBhcnNlIHJlc3VsdHMpLlxuICAgICAgaWYgKFN0cmluZyhuLmlkKSA9PT0gU3RyaW5nKHRhcmdldElkKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobi5jaGlsZHJlbiAmJiB0aGlzLmJ1aWxkVHJhaWwobi5jaGlsZHJlbiwgdGFyZ2V0SWQsIGFjYykpIHJldHVybiB0cnVlO1xuICAgICAgYWNjLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGb2xkZXIobm9kZXM6IEZvbGRlck5vZGVbXSwgdGFyZ2V0SWQ6IG51bWJlcik6IEZvbGRlck5vZGUgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGlmIChTdHJpbmcobi5pZCkgPT09IFN0cmluZyh0YXJnZXRJZCkpIHJldHVybiBuO1xuICAgICAgY29uc3QgZm91bmQgPSBuLmNoaWxkcmVuID8gdGhpcy5maW5kRm9sZGVyKG4uY2hpbGRyZW4sIHRhcmdldElkKSA6IG51bGw7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIFwicm9vdFwiIHZpZXcgKG5vIGZvbGRlciBzZWxlY3RlZCkuIENvbnRyb2xzIHdoaWNoXG4gICAqIHNlY3Rpb25zIHJlbmRlciBvbiB0aGUgcmlnaHQtaGFuZCBwYW5lLlxuICAgKi9cbiAgZ2V0IGlzUm9vdFZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50bHktc2VsZWN0ZWQgZm9sZGVyIG5vZGUgKG9yIG51bGwgYXQgcm9vdCkuICovXG4gIGdldCBjdXJyZW50Rm9sZGVyTm9kZSgpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAvLyBXYWxrIHRoZSB2aXNpYmxlIHRyZWUgZmlyc3Q7IGZhbGwgYmFjayB0byB0aGUgaG9zdC1wcm92aWRlZCBvdmVycmlkZVxuICAgIC8vIHdoZW4gdGhlIGxvb2t1cCBtaXNzZXMgKGUuZy4gZHVyaW5nIHNpZGViYXIgc2VhcmNoLCB3aGVuIGBmb2xkZXJzYFxuICAgIC8vIGhvbGRzIG9ubHkgbWF0Y2hlZCByZXN1bHRzIGFuZCB0aGUgc2VsZWN0ZWQgZm9sZGVyIGlzbid0IGFtb25nIHRoZW0pLlxuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgdGhpcy5zZWxlY3RlZEZvbGRlcklkKTtcbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlck5vZGUgJiYgU3RyaW5nKHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlLmlkKSA9PT0gU3RyaW5nKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ291bnQgb2YgdGVzdCBjYXNlcyBkaXJlY3RseSB1bmRlciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciAoZXhjbHVkaW5nIGRlc2NlbmRhbnRzKS5cbiAgICogIFJlYWRzIGBGb2xkZXJOb2RlLmNvdW50YCBzbyB0aGUgaGVhZGVyIGJhZGdlIG1hdGNoZXMgdGhlIHNpZGViYXIgcm93IGNvdW50XG4gICAqICAoZm9sZGVyLXNpZGViYXIuY29tcG9uZW50Lmh0bWwgcmVuZGVycyB0aGUgc2FtZSBgcm93Lm5vZGUuY291bnRgKS4gVXNpbmdcbiAgICogIGBmaWx0ZXJlZFJvd3MubGVuZ3RoYCBoZXJlIHdvdWxkIG9ubHkgcmVmbGVjdCB0aGUgY3VycmVudGx5LXJlbmRlcmVkIHBhZ2UuICovXG4gIGdldCBjdXJyZW50Rm9sZGVyRGlyZWN0Q291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGb2xkZXJOb2RlPy5jb3VudCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGVtcHR5LXN0YXRlIHNsb3Qgd2hlbiB0aGUgaG9zdCBleHBsaWNpdGx5IG9wdHMgaW4sIE9SIHdoZW4gdGhlXG4gICAqIHRhYmxlIHdvdWxkIG90aGVyd2lzZSByZW5kZXIgYmxhbmsgKG5vIGxvYWRpbmcgKyBubyByb3dzKS4gVXNpbmcgYSBkZXJpdmVkXG4gICAqIGZsYWcga2VlcHMgdGhlIGhvc3QgY29udHJhY3QgaWRlbnRpY2FsIHRvIGBjcWEtdGFibGUtdGVtcGxhdGVgIHdoaWxlIGxldHRpbmdcbiAgICogdGhlIG1vZHVsYXIgdmlldyBzaG93IFwiTm8gVGVzdCBDYXNlIEZvdW5kXCIgb3V0IG9mIHRoZSBib3gg4oCUIHRoZSBlYXJsaWVyIGFzay5cbiAgICovXG4gIGdldCBlZmZlY3RpdmVJc0VtcHR5U3RhdGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eVN0YXRlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1RhYmxlTG9hZGluZyB8fCB0aGlzLmlzVGFibGVEYXRhTG9hZGluZykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhdGhpcy5wYWdlZFJvd3MgfHwgdGhpcy5wYWdlZFJvd3MubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIHRoZSBob3N0LXByb3ZpZGVkIGBlbXB0eVN0YXRlQ29uZmlnYCB3aGVuIHRoZSBob3N0IGZsYWdnZWQgdGhlIHN0YXRlXG4gICAqIGl0c2VsZjsgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYSBsaWJyYXJ5LW93bmVkIFwiTm8gVGVzdCBDYXNlIEZvdW5kXCIgY29uZmlnXG4gICAqIGRyaXZlbiBieSBgbW9kdWxhckxhYmVsc2AuXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZygpOiBFbXB0eVN0YXRlQ29uZmlnIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5U3RhdGUpIHJldHVybiB0aGlzLmVtcHR5U3RhdGVDb25maWc7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMuZW1wdHlOb1Rlc3RzSW5Gb2xkZXJUaXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1vZHVsYXJMYWJlbHMuZW1wdHlOb1Rlc3RzSW5Gb2xkZXJEZXNjcmlwdGlvbixcbiAgICAgIGltYWdlVXJsOiBFTVBUWV9TVEFURV9JTUFHRVMuVEVTVF9DQVNFLFxuICAgICAgYWN0aW9uczogW10sXG4gICAgfTtcbiAgfVxuXG4gIG9uRm9sZGVyU2VsZWN0ZWQoaWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPSBpZDtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQoaWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25Gb2xkZXJFeHBhbnNpb25Ub2dnbGVkKGV2ZW50OiB7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KHRoaXMuZXhwYW5kZWRGb2xkZXJJZHMgfHwgW10pO1xuICAgIGlmIChldmVudC5leHBhbmRlZCkge1xuICAgICAgc2V0LmFkZChldmVudC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldC5kZWxldGUoZXZlbnQuaWQpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuZGVkRm9sZGVySWRzID0gQXJyYXkuZnJvbShzZXQpO1xuICAgIHRoaXMuZm9sZGVyRXhwYW5zaW9uVG9nZ2xlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBUcmFja3MgdGhlIGBmb2xkZXJzLmxlbmd0aGAgYXQgd2hpY2ggd2UgbGFzdCBlbWl0dGVkIGByb290TG9hZE1vcmVSZXF1ZXN0ZWRgXG4gICAqICBmcm9tIHRoZSBPcmdhbml6ZWQgZ3JpZCBzY3JvbGwsIHNvIHJhcGlkIHNjcm9sbCBldmVudHMgZG9uJ3Qgc3BhbSB0aGUgaG9zdFxuICAgKiAgYmVmb3JlIGl0IGhhcyBoYWQgYSBjaGFuY2UgdG8gYXBwZW5kIHRoZSBuZXh0IHBhZ2UuICovXG4gIHByaXZhdGUgbGFzdFJvb3RHcmlkTG9hZEF0OiBudW1iZXIgPSAtMTtcbiAgLyoqIFRyYWNrcyB0aGUgYGN1cnJlbnRGb2xkZXJOb2RlLmNoaWxkcmVuLmxlbmd0aGAgYXQgd2hpY2ggd2UgbGFzdCBlbWl0dGVkXG4gICAqICBgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWRgIGZyb20gdGhlIFN1YmZvbGRlcnMgZ3JpZCBzY3JvbGwsIGZvciB0aGUgc2FtZVxuICAgKiAgcmVhc29uIGFzIGBsYXN0Um9vdEdyaWRMb2FkQXRgLiAqL1xuICBwcml2YXRlIGxhc3RTdWJmb2xkZXJHcmlkTG9hZEF0OiBudW1iZXIgPSAtMTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR1JJRF9TQ1JPTExfTE9BRF9USFJFU0hPTERfUFggPSA5NjtcblxuICAvKiogSG9yaXpvbnRhbC1zY3JvbGwgaGFuZGxlciBmb3IgdGhlIFwiT3JnYW5pc2VkXCIgcm9vdCB0aWxlcy4gRW1pdHNcbiAgICogIGByb290TG9hZE1vcmVSZXF1ZXN0ZWRgIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyB3aXRoaW5cbiAgICogIGBHUklEX1NDUk9MTF9MT0FEX1RIUkVTSE9MRF9QWGAgb2YgdGhlIHJpZ2h0IGVkZ2UgQU5EIG1vcmUgcm9vdHMgYXJlXG4gICAqICBhdmFpbGFibGUgb24gdGhlIGJhY2tlbmQuIFRocm90dGxlZCBieSBgbGFzdFJvb3RHcmlkTG9hZEF0YC5cbiAgICogIFVzZXMgYHJvb3RGb2xkZXJUaWxlcy5sZW5ndGhgIChub3QgYGZvbGRlcnMubGVuZ3RoYCkgc28gdGhlIGdhdGUgc3RheXNcbiAgICogIGNvcnJlY3Qgd2hlbiBgcm9vdEZvbGRlcnNgIGRlY291cGxlcyB0aGUgT3JnYW5pc2VkIGdyaWQgZnJvbSB0aGVcbiAgICogIHNlYXJjaC1maWx0ZXJlZCBgZm9sZGVyc2AgaW5wdXQuICovXG4gIG9uUm9vdEdyaWRTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5yb290Rm9sZGVyVGlsZXMubGVuZ3RoO1xuICAgIGlmIChsb2FkZWQgPj0gdGhpcy5yb290VG90YWwpIHJldHVybjtcbiAgICBpZiAobG9hZGVkID09PSB0aGlzLmxhc3RSb290R3JpZExvYWRBdCkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgZGlzdGFuY2VGcm9tUmlnaHQgPSBlbC5zY3JvbGxXaWR0aCAtIChlbC5zY3JvbGxMZWZ0ICsgZWwuY2xpZW50V2lkdGgpO1xuICAgIGlmIChkaXN0YW5jZUZyb21SaWdodCA+IE1vZHVsYXJUYWJsZVRlbXBsYXRlQ29tcG9uZW50LkdSSURfU0NST0xMX0xPQURfVEhSRVNIT0xEX1BYKSByZXR1cm47XG4gICAgdGhpcy5sYXN0Um9vdEdyaWRMb2FkQXQgPSBsb2FkZWQ7XG4gICAgdGhpcy5yb290TG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEhvcml6b250YWwtc2Nyb2xsIGhhbmRsZXIgZm9yIHRoZSBcIlN1YmZvbGRlcnMgaW4gWFwiIHRpbGVzLiBFbWl0c1xuICAgKiAgYGZvbGRlckxvYWRNb3JlUmVxdWVzdGVkKHsgaWQ6IHNlbGVjdGVkRm9sZGVySWQsIG5leHRQYWdlIH0pYCB3aGVuIHRoZVxuICAgKiAgdXNlciBzY3JvbGxzIHdpdGhpbiB0aHJlc2hvbGQgb2YgdGhlIHJpZ2h0IGVkZ2UgQU5EIHRoZSBhY3RpdmUgZm9sZGVyXG4gICAqICBoYXMgbW9yZSBjaGlsZHJlbiBvbiB0aGUgYmFja2VuZCB0aGFuIGhhdmUgYmVlbiBsb2FkZWQuICovXG4gIG9uU3ViZm9sZGVyR3JpZFNjcm9sbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Rm9sZGVyTm9kZTtcbiAgICBpZiAoIW5vZGUgfHwgdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybjtcbiAgICBjb25zdCBsb2FkZWQgPSBub2RlLmNoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICBjb25zdCB0b3RhbCA9IG5vZGUudG90YWxDaGlsZHJlbiA/PyBsb2FkZWQ7XG4gICAgaWYgKGxvYWRlZCA+PSB0b3RhbCkgcmV0dXJuO1xuICAgIGlmIChsb2FkZWQgPT09IHRoaXMubGFzdFN1YmZvbGRlckdyaWRMb2FkQXQpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVJpZ2h0ID0gZWwuc2Nyb2xsV2lkdGggLSAoZWwuc2Nyb2xsTGVmdCArIGVsLmNsaWVudFdpZHRoKTtcbiAgICBpZiAoZGlzdGFuY2VGcm9tUmlnaHQgPiBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudC5HUklEX1NDUk9MTF9MT0FEX1RIUkVTSE9MRF9QWCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdFN1YmZvbGRlckdyaWRMb2FkQXQgPSBsb2FkZWQ7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSAobm9kZS5sb2FkZWRQYWdlcyA/PyAtMSkgKyAxO1xuICAgIHRoaXMuZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCh7IGlkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQsIG5leHRQYWdlIH0pO1xuICB9XG5cbiAgb25Gb2xkZXJDcmVhdGVkKHBheWxvYWQ6IEZvbGRlckNyZWF0ZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5mb2xkZXJDcmVhdGVkLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICBvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZChwYXlsb2FkOiB7IHBhcmVudElkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICAvLyBFbWl0IHRoZSBcInJlcXVlc3RlZFwiIGV2ZW50IGZpcnN0IHNvIGEgaG9zdCBjYW4gaW50ZXJjZXB0IHdoZW4gaXQgb3ducyB0aGUgVVguXG4gICAgdGhpcy5mb2xkZXJDcmVhdGVSZXF1ZXN0ZWQuZW1pdChwYXlsb2FkKTtcbiAgICBpZiAoIXRoaXMudXNlSW50ZXJuYWxEaWFsb2dzKSByZXR1cm47XG4gICAgdGhpcy5vcGVuQ3JlYXRlRm9sZGVyRGlhbG9nKHBheWxvYWQucGFyZW50SWQpO1xuICB9XG5cbiAgb25Gb2xkZXJSZW5hbWVkKHBheWxvYWQ6IEZvbGRlclJlbmFtZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5mb2xkZXJSZW5hbWVkLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZWQgdG8gdGhlIHNpZGViYXIncyBgZm9sZGVyRGVsZXRlZGAgb3V0cHV0IOKAlCB3aGljaCBmaXJlcyBvbiBkZWxldGUtaWNvblxuICAgKiAqY2xpY2sqLCBub3Qgb24gY29uZmlybWF0aW9uLiBXZSByZS1lbWl0IGEgYGZvbGRlckRlbGV0ZVJlcXVlc3RlZGAgZXZlbnRcbiAgICogZmlyc3QgKHNvIGhvc3RzIGNhbiBpbnRlcmNlcHQpIGFuZCwgd2hlbiBgdXNlSW50ZXJuYWxEaWFsb2dzYCBpcyBlbmFibGVkLFxuICAgKiBvcGVuIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLiBgZm9sZGVyRGVsZXRlZGAgbm93IG9ubHkgZmlyZXMgYWZ0ZXIgY29uZmlybS5cbiAgICovXG4gIG9uRm9sZGVyRGVsZXRlZChwYXlsb2FkOiB7IGlkOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuYnVpbGREZWxldGVDb250ZXh0KHBheWxvYWQuaWQpO1xuICAgIHRoaXMuZm9sZGVyRGVsZXRlUmVxdWVzdGVkLmVtaXQoY3R4KTtcbiAgICBpZiAoIXRoaXMudXNlSW50ZXJuYWxEaWFsb2dzKSByZXR1cm47XG4gICAgdGhpcy5vcGVuRGVsZXRlRm9sZGVyRGlhbG9nKGN0eCk7XG4gIH1cblxuICAvKiogQnVpbGRzIHRoZSB7IGlkLCBuYW1lLCB0ZXN0Q291bnQsIGhhc1BhcmVudCB9IHBheWxvYWQgdXNlZCBieSBkZWxldGUgZXZlbnRzL2RpYWxvZ3MuICovXG4gIHByaXZhdGUgYnVpbGREZWxldGVDb250ZXh0KGZvbGRlcklkOiBudW1iZXIpOiBGb2xkZXJEZWxldGVSZXF1ZXN0ZWRQYXlsb2FkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgZm9sZGVySWQpO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZm9sZGVySWQsXG4gICAgICBuYW1lOiBub2RlPy5uYW1lID8/ICcnLFxuICAgICAgdGVzdENvdW50OiB0aGlzLmNvdW50VGVzdHNJbkZvbGRlcihmb2xkZXJJZCksXG4gICAgICBoYXNQYXJlbnQ6IHRoaXMuZm9sZGVySGFzUGFyZW50KGZvbGRlcklkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudFRlc3RzSW5Gb2xkZXIoZm9sZGVySWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgYWNjZXNzb3IgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPz8gKChyOiBhbnkpID0+IHI/LmZvbGRlcklkKTtcbiAgICByZXR1cm4gKHRoaXMuZGF0YSB8fCBbXSkuZmlsdGVyKHIgPT4ge1xuICAgICAgY29uc3QgaWQgPSBhY2Nlc3NvcihyKTtcbiAgICAgIHJldHVybiBpZCAhPSBudWxsICYmIE51bWJlcihpZCkgPT09IE51bWJlcihmb2xkZXJJZCk7XG4gICAgfSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmb2xkZXIgaXMgbmVzdGVkIChpLmUuIG5vdCBhIHJvb3QtbGV2ZWwgZm9sZGVyKS4gKi9cbiAgcHJpdmF0ZSBmb2xkZXJIYXNQYXJlbnQoZm9sZGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHRoaXMuZm9sZGVycyB8fCBbXSkuc29tZShuID0+IG4uaWQgPT09IGZvbGRlcklkKTtcbiAgfVxuXG4gIG9uVGVzdHNEcm9wcGVkKGV2ZW50OiB7IHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj47IHRhcmdldEZvbGRlcklkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcCkgcmV0dXJuO1xuICAgIHRoaXMudGVzdHNNb3ZlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2xkZXItdG8tZm9sZGVyIGRyYWctZHJvcC4gVGhlIHNpZGViYXIgaGFzIGFscmVhZHkgdmFsaWRhdGVkIGFnYWluc3Qgc2VsZi9kZXNjZW5kYW50XG4gICAqIGN5Y2xlcywgc28gdGhlIGRyb3AgaXMgaXRzIG93biBjb25maXJtYXRpb24g4oCUIHdlIGVtaXQgYGZvbGRlck1vdmVkYCBkaXJlY3RseSB3aXRob3V0XG4gICAqIG9wZW5pbmcgdGhlIG1vdmUgZGlhbG9nLiBHYXRlZCBvbiBgYWxsb3dUZXN0RHJhZ0Ryb3BgIChzYW1lIGZsYWcgYXMgdGVzdCBkcmFnLWRyb3ApLlxuICAgKi9cbiAgb25Gb2xkZXJEcm9wcGVkKGV2ZW50OiB7IGlkOiBudW1iZXI7IG5ld1BhcmVudElkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcCkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyTW92ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2lkZWJhciBlbWl0dGVkIGBmb2xkZXJNb3ZlUmVxdWVzdGVkYCAodXNlciBwaWNrZWQgXCJNb3ZlIGZvbGRlclwiIGZyb20gdGhlIGNvbnRleHQgbWVudSkuXG4gICAqIFdlIHJlLWVtaXQgYSByaWNoZXIgcGF5bG9hZCBmb3IgaG9zdHMsIGFuZCDigJQgd2hlbiBydW5uaW5nIHdpdGggaW50ZXJuYWwgZGlhbG9ncyDigJRcbiAgICogb3BlbiB0aGUgZXhpc3RpbmcgbW92ZS10by1mb2xkZXIgcGlja2VyIGNvbmZpZ3VyZWQgZm9yIGEgZm9sZGVyLW1vdmUgKHNlbGYgYW5kXG4gICAqIGRlc2NlbmRhbnRzIGFyZSBkaXNhYmxlZCB0byBwcmV2ZW50IGN5Y2xlcykuXG4gICAqL1xuICBvbkZvbGRlck1vdmVSZXF1ZXN0ZWQocGF5bG9hZDogeyBpZDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgcGF5bG9hZC5pZCk7XG4gICAgY29uc3QgY3R4OiBGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZCA9IHtcbiAgICAgIGlkOiBwYXlsb2FkLmlkLFxuICAgICAgbmFtZTogbm9kZT8ubmFtZSA/PyAnJyxcbiAgICAgIGhhc1BhcmVudDogdGhpcy5mb2xkZXJIYXNQYXJlbnQocGF5bG9hZC5pZCksXG4gICAgfTtcbiAgICB0aGlzLmZvbGRlck1vdmVSZXF1ZXN0ZWQuZW1pdChjdHgpO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcbiAgICB0aGlzLm9wZW5Nb3ZlRm9sZGVyRGlhbG9nKGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lkZWJhciBlbWl0dGVkIGBmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWRgLiBUaGUgbGlicmFyeSBjYW4ndCBwZXJzaXN0IOKAlFxuICAgKiBlbWl0IHRoZSBob3N0LWxldmVsIGV2ZW50IHNvIHRoZSBob3N0IGNsb25lcyB0aGUgc3VidHJlZSBzZXJ2ZXItc2lkZS5cbiAgICogVGVzdCBjYXNlcyBzaG91bGQgYmUgKnJlZmVyZW5jZWQqIGZyb20gdGhlIG5ldyBmb2xkZXJzLCBub3QgZHVwbGljYXRlZC5cbiAgICovXG4gIG9uRm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkKHBheWxvYWQ6IHsgaWQ6IG51bWJlciB9KTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHBheWxvYWQuaWQpO1xuICAgIHRoaXMuZm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkLmVtaXQoe1xuICAgICAgaWQ6IHBheWxvYWQuaWQsXG4gICAgICBuYW1lOiBub2RlPy5uYW1lID8/ICcnLFxuICAgIH0pO1xuICB9XG5cbiAgb25TaWRlYmFyQ29sbGFwc2VkQ2hhbmdlKGNvbGxhcHNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2lkZWJhckNvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB0aGlzLnNpZGViYXJDb2xsYXBzZWRDaGFuZ2UuZW1pdChjb2xsYXBzZWQpO1xuICB9XG5cbiAgdG9nZ2xlU2lkZWJhcigpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2lkZWJhckNvbGxhcHNlZENoYW5nZSghdGhpcy5zaWRlYmFyQ29sbGFwc2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGJ1bGsgYWN0aW9ucyBzaG93biBpbiB0aGUgdG9vbGJhciBtZXJnZWQgd2l0aCBhbnkgaG9zdC1zdXBwbGllZFxuICAgKiBgYnVsa0FjdGlvbnNgLiBDdXJyZW50bHkgb25seSBcIk1vdmUgdG8gZm9sZGVyXCIgc2hpcHMgYnkgZGVmYXVsdCDigJRcbiAgICogRGVsZXRlIC8gQWRkIFRhZyBhcmUgb3B0LWluIHBlciB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50LiBIb3N0c1xuICAgKiB0aGF0IHdhbnQgdGhlbSBiYWNrIHBhc3MgdGhlbSB2aWEgYGJ1bGtBY3Rpb25zYC5cbiAgICovXG4gIGdldCBlZmZlY3RpdmVCdWxrQWN0aW9ucygpOiBUYWJsZUFjdGlvbltdIHtcbiAgICBjb25zdCBkZWZhdWx0czogVGFibGVBY3Rpb25bXSA9IFtcbiAgICAgIHsgaWQ6ICdtb3ZlJywgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlVG9Gb2xkZXIsIGljb246ICdkcml2ZV9maWxlX21vdmUnLCB0b29sdGlwOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZVRvRm9sZGVyIH0sXG4gICAgXTtcbiAgICBjb25zdCBvdmVycmlkZXMgPSBuZXcgTWFwKCh0aGlzLmJ1bGtBY3Rpb25zIHx8IFtdKS5tYXAoYSA9PiBbYS5pZCwgYV0gYXMgY29uc3QpKTtcbiAgICBjb25zdCBtZXJnZWQgPSBkZWZhdWx0cy5tYXAoZCA9PiBvdmVycmlkZXMuZ2V0KGQuaWQpID8/IGQpO1xuICAgIGZvciAoY29uc3QgZXh0cmEgb2YgdGhpcy5idWxrQWN0aW9ucyB8fCBbXSkge1xuICAgICAgaWYgKCFkZWZhdWx0cy5zb21lKGQgPT4gZC5pZCA9PT0gZXh0cmEuaWQpKSB7XG4gICAgICAgIG1lcmdlZC5wdXNoKGV4dHJhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIG9uQnVsa0FjdGlvbihldmVudDogeyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfSk6IHZvaWQge1xuICAgIC8vIEFsd2F5cyBlbWl0IHRoZSByYXcgY2xpY2sgc28gaG9zdHMgb3duaW5nIHRoZSBVWCBjYW4gaW50ZXJjZXB0IGVhcmx5LlxuICAgIHRoaXMuYnVsa0FjdGlvbkNsaWNrLmVtaXQoeyBpZDogZXZlbnQuaWQsIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCB9KTtcblxuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gKGV2ZW50LnNlbGVjdGVkIHx8IFtdKS5tYXAociA9PiByPy5pZCkuZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcbiAgICBpZiAoZXZlbnQuaWQgPT09ICdtb3ZlJykge1xuICAgICAgdGhpcy5vcGVuTW92ZURpYWxvZyhzZWxlY3RlZElkcywgZXZlbnQuc2VsZWN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGb3Igbm9uLWRpYWxvZyBhY3Rpb25zIChjdXN0b20gZW50cmllcyBmcm9tIGhvc3Qtc3VwcGxpZWQgYGJ1bGtBY3Rpb25zYCksIGludm9rZSBpbW1lZGlhdGVseS5cbiAgICB0aGlzLmJ1bGtBY3Rpb25JbnZva2VkLmVtaXQoeyBpZDogZXZlbnQuaWQsIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCB9KTtcbiAgfVxuXG4gIG9uQnVsa1NlbGVjdEFsbChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gQXBwbHkgdGhlIGFjdGlvbiBsb2NhbGx5IHNvIHRoZSBhY3Rpb24gdG9vbGJhcidzIFwiU2VsZWN0IGFsbFwiIHdvcmtzIG91dC1vZi10aGUtYm94LlxuICAgIC8vIFdoZW4gY2hlY2tlZCwgc2VsZWN0IGV2ZXJ5IHJvdyBpbiB0aGUgKmN1cnJlbnQqIGZpbHRlcmVkIHNldCAoaS5lLiBhbGwgdGVzdHMgaW5cbiAgICAvLyB0aGUgc2VsZWN0ZWQgZm9sZGVyKS4gV2hlbiB1bmNoZWNrZWQsIGNsZWFyIHNlbGVjdGlvbi5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBjaGVja2VkID8gWy4uLnRoaXMuZmlsdGVyZWRSb3dzXSA6IFtdO1xuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoWy4uLnRoaXMuc2VsZWN0ZWRJdGVtc10pO1xuICAgIHRoaXMuYnVsa1NlbGVjdEFsbENoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25CdWxrRGlzbWlzcygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBzZWxlY3Rpb24gQU5EIHRoZSBwZXItcm93IGlzU2VsZWN0ZWQgZmxhZ3Mgc28gdGhlIGFjdGlvbiB0b29sYmFyIGNsb3Nlc1xuICAgIC8vIChpdCdzIGdhdGVkIG9uIGBhbnlSb3dTZWxlY3RlZGAsIHdoaWNoIHJlYWRzIGJvdGggc2VsZWN0ZWRJdGVtcyBhbmQgcm93IGZsYWdzKS5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KFtdKTtcbiAgICB0aGlzLmJ1bGtEaXNtaXNzLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk1vdmVEaWFsb2codGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgLy8gRmlyZSB0aGUgXCJyZXF1ZXN0ZWRcIiBldmVudCBmaXJzdCBzbyBhIGhvc3QgY2FuIGludGVyY2VwdCB3aGVuIGl0IG93bnMgdGhlIFVYLlxuICAgIHRoaXMubW92ZVJlcXVlc3RlZC5lbWl0KHtcbiAgICAgIHRlc3RJZHMsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGN1cnJlbnRGb2xkZXJJZDogdGhpcy5zZWxlY3RlZEZvbGRlcklkLFxuICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgIH0pO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcblxuICAgIGNvbnN0IGNvdW50ID0gdGVzdElkcy5sZW5ndGg7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoY291bnQgPT09IDFcbiAgICAgID8gdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dEZXNjcmlwdGlvblNpbmd1bGFyXG4gICAgICA6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nRGVzY3JpcHRpb25QbHVyYWxcbiAgICApLnJlcGxhY2UoJ3tufScsICcnICsgY291bnQpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgbnVtYmVyIHwgbnVsbD4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlcnM6IHRoaXMuZm9sZGVycyxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMubW9kdWxhckxhYmVscyxcbiAgICAgICAgICBjdXJyZW50Rm9sZGVySWQ6IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCxcbiAgICAgICAgICAvLyBXaGVuIG1vdmluZyBGUk9NIFVub3JnYW5pc2VkLCBkaXNhYmxlIHRoZSBVbm9yZ2FuaXNlZCBkZXN0aW5hdGlvbiByb3cuXG4gICAgICAgICAgcm9vdERpc2FibGVkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKHVuZGVmaW5lZCBhcyBhbnkpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICByLmNsb3NlKGluc3RhbmNlID8gaW5zdGFuY2UucGlja2VkRm9sZGVySWQgOiBudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUodGFyZ2V0Rm9sZGVySWQgPT4ge1xuICAgICAgaWYgKHRhcmdldEZvbGRlcklkID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkXG4gICAgICB0aGlzLnRlc3RzTW92ZWQuZW1pdCh7IHRlc3RJZHMsIHRhcmdldEZvbGRlcklkOiB0YXJnZXRGb2xkZXJJZCA/PyBudWxsIH0pO1xuICAgICAgdGhpcy5idWxrQWN0aW9uSW52b2tlZC5lbWl0KHsgaWQ6ICdtb3ZlJywgc2VsZWN0ZWQgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGZvbGRlci1waWNrZXIgZGlhbG9nIGNvbmZpZ3VyZWQgZm9yIG1vdmluZyBhIGZvbGRlciAocmF0aGVyIHRoYW4gdGVzdHMpLlxuICAgKiBUaGUgc291cmNlIGZvbGRlciBpdHNlbGYgaXMgbWFya2VkIGFzIHRoZSBcImN1cnJlbnRcIiBmb2xkZXIgc28gaXQncyByZW5kZXJlZCBhc1xuICAgKiBkaXNhYmxlZCBpbiB0aGUgcGlja2VyLiBPbiBjb25maXJtLCBlbWl0cyBgZm9sZGVyTW92ZWRgIHdpdGggdGhlIGNob3NlbiBwYXJlbnQuXG4gICAqL1xuICBwcml2YXRlIG9wZW5Nb3ZlRm9sZGVyRGlhbG9nKGN0eDogRm9sZGVyTW92ZVJlcXVlc3RlZFBheWxvYWQpOiB2b2lkIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMuZm9sZGVyTWVudU1vdmUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgLy8gUmV1c2UgdGhlIFwiZGlzYWJsZWRcIiB0cmVhdG1lbnQ6IHRoZSBmb2xkZXIgYmVpbmcgbW92ZWQgY2FuJ3QgYmUgaXRzIG93biBkZXN0aW5hdGlvbi5cbiAgICAgICAgICBjdXJyZW50Rm9sZGVySWQ6IGN0eC5pZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKHVuZGVmaW5lZCBhcyBhbnkpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICByLmNsb3NlKGluc3RhbmNlID8gaW5zdGFuY2UucGlja2VkRm9sZGVySWQgOiBudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUodGFyZ2V0Rm9sZGVySWQgPT4ge1xuICAgICAgaWYgKHRhcmdldEZvbGRlcklkID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkXG4gICAgICB0aGlzLmZvbGRlck1vdmVkLmVtaXQoeyBpZDogY3R4LmlkLCBuZXdQYXJlbnRJZDogdGFyZ2V0Rm9sZGVySWQgPz8gbnVsbCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkNyZWF0ZUZvbGRlckRpYWxvZyhpbml0aWFsUGFyZW50SWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIHsgbmFtZTogc3RyaW5nOyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbDsgY29sb3I6IHN0cmluZyB9IHwgZmFsc2U+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tb2R1bGFyTGFiZWxzLm5ld0ZvbGRlckRpYWxvZ0Rlc2NyaXB0aW9uLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIHBhcmVudElkOiBpbml0aWFsUGFyZW50SWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKGZhbHNlKSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3QgPSByLmdldENvbXBvbmVudEluc3RhbmNlPE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIGlmICghaW5zdCB8fCAhaW5zdC5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7IC8vIGtlZXAgdGhlIGRpYWxvZyBvcGVuIG9uIGludmFsaWQgc3VibWl0XG4gICAgICAgICAgICByLmNsb3NlKHsgbmFtZTogKGluc3QubmFtZSB8fCAnJykudHJpbSgpLCBwYXJlbnRJZDogaW5zdC5wYXJlbnRJZCwgY29sb3I6IGluc3QuY29sb3IgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidXR0b25BbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgfSk7XG4gICAgcmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZm9sZGVyQ3JlYXRlZC5lbWl0KHsgcGFyZW50SWQ6IHJlc3VsdC5wYXJlbnRJZCwgbmFtZTogcmVzdWx0Lm5hbWUsIGNvbG9yOiByZXN1bHQuY29sb3IgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5EZWxldGVGb2xkZXJEaWFsb2coY3R4OiBGb2xkZXJEZWxldGVSZXF1ZXN0ZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW48YW55LCB7IHN0cmF0ZWd5OiBGb2xkZXJEZWxldGVTdHJhdGVneSB9IHwgZmFsc2U+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMuZGVsZXRlRm9sZGVyRGlhbG9nVGl0bGUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogRGVsZXRlRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJOYW1lOiBjdHgubmFtZSxcbiAgICAgICAgICB0ZXN0Q291bnQ6IGN0eC50ZXN0Q291bnQsXG4gICAgICAgICAgaGFzUGFyZW50OiBjdHguaGFzUGFyZW50LFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIHN0cmF0ZWd5OiBjdHguaGFzUGFyZW50ID8gJ21vdmUtdG8tcGFyZW50JyA6ICdtb3ZlLXRvLXVub3JnYW5pc2VkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5kZWxldGVGb2xkZXJEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UoZmFsc2UpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLmRlbGV0ZUZvbGRlckRpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3dhcm4nLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdCA9IHIuZ2V0Q29tcG9uZW50SW5zdGFuY2U8RGVsZXRlRm9sZGVyRGlhbG9nQ29tcG9uZW50PigpO1xuICAgICAgICAgICAgci5jbG9zZShpbnN0ID8geyBzdHJhdGVneTogaW5zdC5zdHJhdGVneSB9IDogZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBjdHguaWQsIHN0cmF0ZWd5OiByZXN1bHQuc3RyYXRlZ3kgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBzdGFydFJlb3JkZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZW9yZGVyaW5nKSByZXR1cm47XG4gICAgdGhpcy5yZW9yZGVyU25hcHNob3QgPSBbLi4uKHRoaXMucGFnZWRSb3dzIHx8IFtdKV07XG4gICAgdGhpcy5yZW9yZGVyRHJhZnQgPSBbLi4uKHRoaXMucGFnZWRSb3dzIHx8IFtdKV07XG4gICAgLy8gUGF1c2UgYXV0by1yZWZyZXNoIHdoaWxlIHJlb3JkZXJpbmcg4oCUIGF2b2lkcyB0aGUgdGltZXIgY2xvYmJlcmluZyB0aGUgZHJhZnQuXG4gICAgdGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA9IHRoaXMuc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsO1xuICAgIGlmICh0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID4gMCkge1xuICAgICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKDApO1xuICAgIH1cbiAgICB0aGlzLmlzUmVvcmRlcmluZyA9IHRydWU7XG4gICAgdGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCA9IGZhbHNlO1xuICAgIHRoaXMucmVvcmRlclN0YXJ0LmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNhbmNlbFJlb3JkZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhZ2Ugb3JkZXIgc28gdGhlIHVzZXIgc2VlcyB0aGUgcHJlLWRyYWcgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVvcmRlclNuYXBzaG90KSB7XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLnJlb3JkZXJTbmFwc2hvdF07XG4gICAgfVxuICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgdGhpcy5yZW9yZGVyQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHNhdmVSZW9yZGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICBjb25zdCBvcmRlcmVkID0gdGhpcy5yZW9yZGVyRHJhZnQgPyBbLi4udGhpcy5yZW9yZGVyRHJhZnRdIDogWy4uLih0aGlzLnBhZ2VkUm93cyB8fCBbXSldO1xuICAgIHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgPSB0cnVlO1xuICAgIHRoaXMucmVvcmRlclNhdmUuZW1pdCh7IG9yZGVyZWRJdGVtczogb3JkZXJlZCB9KTtcbiAgICAvLyBJZiB0aGUgaG9zdCBuZXZlciBmbGlwcyBgcmVvcmRlclNhdmluZ2AgKGUuZy4gc3luY2hyb25vdXMgbm8tb3ApLCBleGl0XG4gICAgLy8gaW1tZWRpYXRlbHkgc28gdGhlIFVJIGRvZXNuJ3QgZ2V0IHN0dWNrIGluIFwiU2F2aW5nLi4uXCIgc3RhdGUuXG4gICAgaWYgKCF0aGlzLnJlb3JkZXJTYXZpbmcpIHtcbiAgICAgIC8vIEdpdmUgdGhlIGhvc3QgYSBtaWNyb3Rhc2sgdG8gZmxpcCBgcmVvcmRlclNhdmluZ2AgdG8gdHJ1ZSDigJQgaWYgaXRcbiAgICAgIC8vIGhhc24ndCwgYXNzdW1lIG5vIGFzeW5jIHdvcmsgYW5kIGV4aXQuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgJiYgIXRoaXMucmVvcmRlclNhdmluZykge1xuICAgICAgICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUm93UmVvcmRlcihldmVudDogeyBwcmV2aW91c0luZGV4OiBudW1iZXI7IGN1cnJlbnRJbmRleDogbnVtYmVyOyBvcmRlcmVkRGF0YTogYW55W10gfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICB0aGlzLnJlb3JkZXJEcmFmdCA9IFsuLi5ldmVudC5vcmRlcmVkRGF0YV07XG4gICAgdGhpcy5wYWdlZFJvd3MgPSB0aGlzLnJlb3JkZXJEcmFmdDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhpdFJlb3JkZXJNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNSZW9yZGVyaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZW9yZGVyU25hcHNob3QgPSBudWxsO1xuICAgIHRoaXMucmVvcmRlckRyYWZ0ID0gbnVsbDtcbiAgICB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwID0gZmFsc2U7XG4gICAgLy8gUmVzdG9yZSBwcmV2aW91c2x5LXNlbGVjdGVkIGF1dG8tcmVmcmVzaCBpbnRlcnZhbCAoaWYgYW55KS5cbiAgICBpZiAodGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA+IDApIHtcbiAgICAgIHRoaXMuc2V0dXBBdXRvUmVmcmVzaCh0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoKTtcbiAgICAgIHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2ggPSAwO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3ctZHJhZyBwYXlsb2FkIGJ1aWxkZXIgdXNlZCBieSB0aGUgW2NxYVJvd0RyYWddIGRpcmVjdGl2ZSB2aWEgKGJ1aWxkUGF5bG9hZCkuXG4gICAqL1xuICBidWlsZFJvd0RyYWdQYXlsb2FkID0gKHJvdzogYW55KTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmN1cnJlbnRTZWxlY3RlZEl0ZW1zO1xuICAgIC8vIElmIHRoZSBkcmFnZ2VkIHJvdyBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgZHJhZyB0aGUgd2hvbGUgc2VsZWN0aW9uLlxuICAgIGNvbnN0IHJvd0lkID0gcm93Py5pZDtcbiAgICBjb25zdCBpblNlbGVjdGlvbiA9IHJvd0lkICE9IG51bGwgJiYgc2VsZWN0ZWQuc29tZShzID0+IHM/LmlkID09PSByb3dJZCk7XG4gICAgY29uc3QgaWRzID0gKGluU2VsZWN0aW9uID8gc2VsZWN0ZWQgOiBbcm93XSkubWFwKHIgPT4gcj8uaWQpLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG4gICAgcmV0dXJuIGlkcztcbiAgfTtcbn1cbiIsIjwhLS0gUmV1c2FibGUgZm9sZGVyLWljb24gY2hpcC4gUmVuZGVyIHZpYSA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPi4gLS0+XG48bmctdGVtcGxhdGUgI2ZvbGRlckljb25DaGlwIGxldC1jb2xvcj1cImNvbG9yXCI+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTEwIGNxYS1oLTEwIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXRleHQtWyM2RDZENzRdIGNxYS1zaHJpbmstMCBncm91cC1ob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPlxuICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgW2F0dHIuc3Ryb2tlXT1cImNvbG9yIHx8ICdjdXJyZW50Q29sb3InXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gUmV1c2FibGUgXCIrXCIgY2hpcCB1c2VkIGJ5IHRoZSBcIk5ldyBmb2xkZXJcIiB0aWxlLiAtLT5cbjxuZy10ZW1wbGF0ZSAjYWRkSWNvbkNoaXA+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTEwIGNxYS1oLTEwIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXRleHQtWyM2RDZENzRdIGNxYS1zaHJpbmstMCBncm91cC1ob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPlxuICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHBhdGggZD1cIk04IDNWMTNNMyA4SDEzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgIDwvc3ZnPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1yZWxhdGl2ZVwiPlxuICAgIDxkaXYgW2NsYXNzXT1cIiFzaG93U2VhcmNoQmFyID8gJ2NxYS1qdXN0aWZ5LWVuZCcgOiAnY3FhLWp1c3RpZnktYmV0d2VlbidcIiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtd3JhcCBjcWEtbWItM1wiPlxuICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoc2VhcmNoKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgKGNsZWFyZWQpPVwiY2xlYXJlZCgpXCJcbiAgICAgID48L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cImdyZXktc29saWRcIlxuICAgICAgICBpY29uPVwib3Blbl9pbl9uZXdcIlxuICAgICAgICBbdGV4dF09XCJpc0V4cG9ydGluZyA/ICdFeHBvcnRpbmcuLi4nIDogJ0V4cG9ydCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNFeHBvcnRpbmdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJleHBvcnRDb2RlQ2xpY2soKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPnt7IGlzRXhwb3J0aW5nID8gJ0V4cG9ydGluZy4uLicgOiAnRXhwb3J0JyB9fTwvc3Bhbj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIFxuICAgICAgPCEtLSBFeHBvcnQgQ29kZSBNb2RhbCAtLT5cbiAgICAgIDxjcWEtZXhwb3J0LWNvZGUtbW9kYWxcbiAgICAgICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgICAgICAgW2lzT3Blbl09XCJpc0V4cG9ydE1vZGFsT3BlblwiXG4gICAgICAgIFtjYXNlc109XCJzZWxlY3RlZENhc2VzRm9yRXhwb3J0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgKGNsb3NlTW9kYWwpPVwiY2xvc2VFeHBvcnRNb2RhbCgpXCJcbiAgICAgICAgKGV4cG9ydCk9XCJvbkV4cG9ydE1vZGFsRXhwb3J0KCRldmVudClcIj5cbiAgICAgIDwvY3FhLWV4cG9ydC1jb2RlLW1vZGFsPlxuICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZHJvcGRvd25UZW1wbGF0ZSBvZiBvdGhlckRyb3BEb3duQnV0dG9uczsgdHJhY2tCeTogdHJhY2tCeURyb3Bkb3duVGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWxlY3REcm9wZG93blRlbXBsYXRlIG9mIG90aGVyU2VsZWN0RHJvcERvd25CdXR0b25zOyB0cmFja0J5OiB0cmFja0J5U2VsZWN0RHJvcGRvd25UZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3REcm9wZG93blRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICBcbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dGaWx0ZXJCdXR0b25cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVGaWx0ZXIoKVwiXG4gICAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiPlxuICAgICAgICAgIEZpbHRlciAgICAgICAgICBcbiAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiYXJyb3dDbGFzc2VzXCI+XG4gICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctMiBjcWEtaC0xIGNxYS1hYnNvbHV0ZSBjcWEtbGVmdC1bNHB4XSBjcWEtdG9wLVs2cHhdXCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA4IDRcIlxuICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMCAwTDQgNEw4IDBcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwQjBCMENcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzNcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1jb2x1bW4tdmlzaWJpbGl0eVxuICAgICAgICAgICpuZ0lmPVwic2hvd1NldHRpbmdzQnV0dG9uXCJcbiAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmlsaXR5Q29sdW1uc1wiXG4gICAgICAgICAgW2NvbHVtblZpc2liaWxpdHldPVwiY29sdW1uVmlzaWJpbGl0eVwiXG4gICAgICAgICAgW3NlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbF09XCJzZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgIChjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlKT1cIm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoYXV0b1JlZnJlc2hDaGFuZ2UpPVwib25BdXRvUmVmcmVzaENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPjwvY3FhLWNvbHVtbi12aXNpYmlsaXR5PlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0F1dG9SZWZyZXNoQnV0dG9uXCJcbiAgICAgICAgICB2YXJpYW50PVwiZ3JleS1zb2xpZFwiXG4gICAgICAgICAgaWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgIChjbGlja2VkKT1cImhhbmRsZVJlZnJlc2hDbGljaygpXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInUmVmcmVzaCdcIlxuICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uVGVtcGxhdGUgb2Ygb3RoZXJCdXR0b25zOyB0cmFja0J5OiB0cmFja0J5VGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJzaG93Vmlld01vZGVUb2dnbGVcIlxuICAgICAgICAgIHNpemU9XCJsZ1wiXG4gICAgICAgICAgW3NlZ21lbnRzXT1cInZpZXdNb2RlU2VnbWVudHNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ2aWV3TW9kZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmlld01vZGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93UmVvcmRlckJ1dHRvbiAmJiAhaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgIGljb249XCJkcmFnX2luZGljYXRvclwiXG4gICAgICAgICAgW3RleHRdPVwicmVvcmRlckxhYmVscy5yZW9yZGVyQnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXBhZ2VkUm93cyB8fCBwYWdlZFJvd3MubGVuZ3RoID09PSAwIHx8IGlzVGFibGVMb2FkaW5nIHx8IGlzVGFibGVEYXRhTG9hZGluZ1wiXG4gICAgICAgICAgKGNsaWNrZWQpPVwic3RhcnRSZW9yZGVyKClcIlxuICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1Jlb3JkZXJCdXR0b24gJiYgaXNSZW9yZGVyaW5nXCI+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbdGV4dF09XCJyZW9yZGVyTGFiZWxzLmNhbmNlbEJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVvcmRlclNhdmluZ1wiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJjYW5jZWxSZW9yZGVyKClcIlxuICAgICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgW2ljb25dPVwicmVvcmRlclNhdmluZyA/ICdob3VyZ2xhc3NfZW1wdHknIDogJydcIlxuICAgICAgICAgICAgW3RleHRdPVwicmVvcmRlclNhdmluZyA/IHJlb3JkZXJMYWJlbHMuc2F2aW5nQnV0dG9uIDogcmVvcmRlckxhYmVscy5kb25lQnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZW9yZGVyU2F2aW5nXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cInNhdmVSZW9yZGVyKClcIlxuICAgICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlb3JkZXIgbW9kZSBiYW5uZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlcmluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTMgY3FhLXB4LTMgY3FhLXB5LTIgY3FhLXJvdW5kZWQtbWQgY3FhLWJnLVsjRkZGQkVCXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGREU2OEFdXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgIDwvc3ZnPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzkyNDAwRV1cIj57eyByZW9yZGVyTGFiZWxzLmJhbm5lclRpdGxlIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzkyNDAwRV1cIj57eyByZW9yZGVyTGFiZWxzLmJhbm5lckRlc2NyaXB0aW9uIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGNxYS1zZWxlY3RlZC1maWx0ZXJzXG4gICAgICBbZmlsdGVyQXBwbGllZF09XCJmaWx0ZXJBcHBsaWVkXCJcbiAgICAgIFtjaGlwc109XCJjaGlwc1wiXG4gICAgICAocmVtb3ZlQ2hpcCk9XCJvblJlbW92ZUNoaXAoJGV2ZW50KVwiXG4gICAgICAoY2xlYXJBbGwpPVwib25DbGVhckFsbENoaXBzKClcIlxuICAgICAgKG9uQ2xlYXJBbGwpPVwib25DbGVhckFsbC5lbWl0KClcIlxuICAgID5cbiAgICA8L2NxYS1zZWxlY3RlZC1maWx0ZXJzPlxuXG4gICAgPGNxYS1keW5hbWljLWZpbHRlclxuICAgICAgKm5nSWY9XCJzaG93RmlsdGVyUGFuZWxcIlxuICAgICAgW2NvbmZpZ109XCJmaWx0ZXJDb25maWdcIlxuICAgICAgW21vZGVsXT1cImZpbHRlck1vZGVsXCJcbiAgICAgIFtzaG93RmlsdGVyUGFuZWxdPVwic2hvd0ZpbHRlclBhbmVsXCJcbiAgICAgIChmaWx0ZXJzQ2hhbmdlZCk9XCJvbkZpbHRlcnNDaGFuZ2VkKCRldmVudClcIlxuICAgICAgKGZpbHRlcnNBcHBsaWVkKT1cIm9uRmlsdGVyc0FwcGxpZWQoJGV2ZW50KVwiXG4gICAgICAob25BcHBseUZpbHRlckNsaWNrKT1cIm9uQXBwbHlGaWx0ZXJDbGljay5lbWl0KCRldmVudClcIlxuICAgICAgKG9uUmVzZXRGaWx0ZXJDbGljayk9XCJoYW5kbGVSZXNldEZpbHRlckNsaWNrKClcIlxuICAgID5cbiAgICA8L2NxYS1keW5hbWljLWZpbHRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtZ2FwLTMgY3FhLW1pbi1oLTAgXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIyNiwgMjI2LCAyMjcpO1wiPlxuICAgICAgPCEtLSBTaWRlYmFyIChvbmx5IHNob3duIGluIG1vZHVsYXIgdmlldykgLS0+XG4gICAgICA8Y3FhLWZvbGRlci1zaWRlYmFyXG4gICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dTaWRlYmFyXCJcbiAgICAgICAgW2ZvbGRlcnNdPVwiZm9sZGVyc1wiXG4gICAgICAgIFtzZWxlY3RlZEZvbGRlcklkXT1cInNlbGVjdGVkRm9sZGVySWRcIlxuICAgICAgICBbZXhwYW5kZWRGb2xkZXJJZHNdPVwiZXhwYW5kZWRGb2xkZXJJZHNcIlxuICAgICAgICBbdW5vcmdhbmlzZWRDb3VudF09XCJ1bm9yZ2FuaXNlZENvdW50XCJcbiAgICAgICAgW2FsbG93Q3JlYXRlXT1cIm1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIlxuICAgICAgICBbYWxsb3dSZW5hbWVdPVwibW9kdWxhckNvbmZpZy5hbGxvd1JlbmFtZUZvbGRlclwiXG4gICAgICAgIFthbGxvd0RlbGV0ZV09XCJtb2R1bGFyQ29uZmlnLmFsbG93RGVsZXRlRm9sZGVyXCJcbiAgICAgICAgW2FsbG93RHJvcF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgW3Nob3dDb3VudHNdPVwibW9kdWxhckNvbmZpZy5zaG93Q291bnRzXCJcbiAgICAgICAgW2NvbGxhcHNlZF09XCJzaWRlYmFyQ29sbGFwc2VkXCJcbiAgICAgICAgW2xhYmVsc109XCJtb2R1bGFyTGFiZWxzXCJcbiAgICAgICAgW3NlcnZlclNpZGVTZWFyY2hdPVwic2VydmVyU2lkZVNlYXJjaFwiXG4gICAgICAgIFtyb290VG90YWxdPVwicm9vdFRvdGFsXCJcbiAgICAgICAgW2ZvbGRlclNlYXJjaExvYWRpbmddPVwiZm9sZGVyU2VhcmNoTG9hZGluZ1wiXG4gICAgICAgIFtyb290Rm9sZGVyc0xvYWRpbmddPVwicm9vdEZvbGRlcnNMb2FkaW5nXCJcbiAgICAgICAgKGZvbGRlclNlbGVjdGVkKT1cIm9uRm9sZGVyU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJFeHBhbnNpb25Ub2dnbGVkKT1cIm9uRm9sZGVyRXhwYW5zaW9uVG9nZ2xlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckNoaWxkcmVuUmVxdWVzdGVkKT1cImZvbGRlckNoaWxkcmVuUmVxdWVzdGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCk9XCJmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAocm9vdExvYWRNb3JlUmVxdWVzdGVkKT1cInJvb3RMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cImZvbGRlclNlYXJjaENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoZm9sZGVyQ3JlYXRlZCk9XCJvbkZvbGRlckNyZWF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJDcmVhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJSZW5hbWVkKT1cIm9uRm9sZGVyUmVuYW1lZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckRlbGV0ZWQpPVwib25Gb2xkZXJEZWxldGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyTW92ZVJlcXVlc3RlZCk9XCJvbkZvbGRlck1vdmVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwib25UZXN0c0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEcm9wcGVkKT1cIm9uRm9sZGVyRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9jcWEtZm9sZGVyLXNpZGViYXI+XG5cbiAgICAgIDwhLS0gUmlnaHQgcGFuZSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItdG9wXT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdF09XCJpc01vZHVsYXJWaWV3ID8gJzFweCBzb2xpZCAjRTJFMkUzJyA6IG51bGxcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJpZ2h0XT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQnJlYWRjcnVtYiAobW9kdWxhciB2aWV3LCBmb2xkZXIgZHJpbGxlZC1pbikgLS0+XG4gICAgICAgIDxuYXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93QnJlYWRjcnVtYiAmJiAhaXNSb290Vmlld1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkZvbGRlciBwYXRoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS1weC0zIGNxYS1weS0xIGNxYS1tYi0zIGNxYS1yb3VuZGVkLW5vbmVcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTJFMkUzO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIiAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChudWxsKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3Bhbj57eyBtb2R1bGFyTGFiZWxzLmFsbEZvbGRlcnMgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY3J1bWIgb2YgYnJlYWRjcnVtYlRyYWlsOyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1hbGlnbi1taWRkbGVcIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y29sb3I6IzZENkQ3NDtcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImxhc3RcbiAgICAgICAgICAgICAgICA/ICdjcWEtdGV4dC1bIzE2MTYxN10gY3FhLWZvbnQtc2VtaWJvbGQnXG4gICAgICAgICAgICAgICAgOiAnY3FhLXRleHQtWyM2RDZENzRdIGhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXSdcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGFzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIhbGFzdCAmJiBvbkZvbGRlclNlbGVjdGVkKGNydW1iLmlkKVwiXG4gICAgICAgICAgICA+e3sgY3J1bWIubmFtZSB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25hdj5cblxuICAgICAgICA8IS0tIEZvbGRlciBncmlkOiBtb2R1bGFyICsgcm9vdCB2aWV3IC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd0ZvbGRlckdyaWQgJiYgcm9vdEZvbGRlclRpbGVzLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtbWItNCBjcWEtcHgtNSBjcWEtcHQtNCBjcWEtcGItWzE0cHhdXCJcbiAgICAgICAgICBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjBGMEYxO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBzdHJva2U9XCIjNkQ2RDc0XCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPnt7IG1vZHVsYXJMYWJlbHMub3JnYW5pc2VkIH19PC9oMz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2RDZENzRdXCI+XG4gICAgICAgICAgICAgIHt7IHJvb3RGb2xkZXJUaWxlcy5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLmZvbGRlcnNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy5mb2xkZXJzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyByb290Rm9sZGVyVGlsZXMubGVuZ3RoKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1ub3dyYXAgY3FhLWdhcC0zIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLXNjcm9sbGJhci10aGluIGNxYS1wYi0yXCJcbiAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25Sb290R3JpZFNjcm9sbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIHJvb3RGb2xkZXJUaWxlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJmLmlkXCJcbiAgICAgICAgICAgICAgW2Ryb3BFbmFibGVkXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICAgICAgICAodGVzdHNEcm9wcGVkKT1cIm9uVGVzdHNEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChmLmlkKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cImYuY2hpbGRyZW4/Lmxlbmd0aFwiPiDCtyB7eyBmLmNoaWxkcmVuIS5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLm9uZVN1YmZvbGRlciA6IG1vZHVsYXJMYWJlbHMuc3ViZm9sZGVyc0NvdW50LnJlcGxhY2UoJ3tufScsICcnICsgZi5jaGlsZHJlbiEubGVuZ3RoKSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXNocmluay0wXCIgc3R5bGU9XCJmb250LXNpemU6MjBweDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBcIisgTmV3IGZvbGRlclwiIHRpbGUgLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoeyBwYXJlbnRJZDogbnVsbCB9KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy1bI0ZBRkFGQV0gaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLWJnLXdoaXRlIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uQ2hpcFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNDAwXCI+e3sgbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcwJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gUGFnaW5hdGlvbiBzcGlubmVyIGFuY2hvcmVkIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBPcmdhbmlzZWRcbiAgICAgICAgICAgICAgICAgcm93LiBPbmx5IHJlbmRlcnMgZHVyaW5nIGFuIGluLWZsaWdodCByb290IGZldGNoIChpbml0aWFsIE9SXG4gICAgICAgICAgICAgICAgIHNjcm9sbC1kcml2ZW4gXCJsb2FkIG1vcmVcIiksIGFuZCBpcyBmaWx0ZXJlZCB0byBzdXBwcmVzcyB3aGVuXG4gICAgICAgICAgICAgICAgIHRoZSBzZWN0aW9uIGlzIGVtcHR5IHNvIHdlIGRvbid0IHNob3cgYSBzcGlubmVyIGluc2lkZSBhblxuICAgICAgICAgICAgICAgICBvdGhlcndpc2UtYmxhbmsgcm93LiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJyb290Rm9sZGVyc0xvYWRpbmcgJiYgcm9vdEZvbGRlclRpbGVzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1zaHJpbmstMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy1bODBweF1cIlxuICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMb2FkaW5nIG1vcmUgZm9sZGVycydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPCEtLSBTdWJmb2xkZXIgc2VjdGlvbjogbW9kdWxhciArIGZvbGRlciB2aWV3LiBTaG93biB3aGVuZXZlciBkcmlsbGVkIGluXG4gICAgICAgICAgICAgKGV2ZW4gaWYgbm8gc3ViZm9sZGVycywgc28gdGhlIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSByZW1haW5zXG4gICAgICAgICAgICAgcmVhY2hhYmxlLCBhbmQgc28gd2UgY2FuIHJlbmRlciBhIGxvYWRpbmcgc3RhdGUgZHVyaW5nIHRoZVxuICAgICAgICAgICAgIGRyaWxsLWluIGZldGNoIGJlZm9yZSBjaGlsZHJlbiBhcnJpdmUpLiAtLT5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgIWlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93U3ViZm9sZGVyU2VjdGlvbiAmJiAoc3ViZm9sZGVyVGlsZXMubGVuZ3RoIHx8IGN1cnJlbnRGb2xkZXJOb2RlPy5jaGlsZHJlbkxvYWRpbmcpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1tYi00IGNxYS1weC0zIGNxYS1weS0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJmb2xkZXJUaWxlcy5sZW5ndGggfHwgbW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC02MDAgY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIHt7IG1vZHVsYXJMYWJlbHMuc3ViZm9sZGVyc0luIH19IHt7IGJyZWFkY3J1bWJUcmFpbC5sZW5ndGggPyBicmVhZGNydW1iVHJhaWxbYnJlYWRjcnVtYlRyYWlsLmxlbmd0aCAtIDFdLm5hbWUgOiAnJyB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1ub3dyYXAgY3FhLWdhcC0zIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLXNjcm9sbGJhci10aGluIGNxYS1wYi0yXCJcbiAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25TdWJmb2xkZXJHcmlkU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGYgb2Ygc3ViZm9sZGVyVGlsZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NxYUZvbGRlckRyb3BdPVwiZi5pZFwiXG4gICAgICAgICAgICAgIFtkcm9wRW5hYmxlZF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJvblRlc3RzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQoZi5pZClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtc2hyaW5rLTAgY3FhLXctWzI0MHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVswLjVweF0gY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1ib3JkZXItWyMzRjQzRUVdIGhvdmVyOmNxYS1zaGFkb3ctc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb25DaGlwOyBjb250ZXh0OiB7IGNvbG9yOiBmLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNXB4XSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLXRydW5jYXRlIGNxYS1sZWFkaW5nLXRpZ2h0IGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IGYubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kdWxhckNvbmZpZy5zaG93Q291bnRzXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTUwMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGYuY291bnQgPz8gMCkgPT09IDEgPyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnJyArIChmLmNvdW50ID8/IDApKSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXNocmluay0wXCIgc3R5bGU9XCJmb250LXNpemU6MjBweDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBcIisgTmV3IGZvbGRlclwiIHRpbGUgLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoeyBwYXJlbnRJZDogc2VsZWN0ZWRGb2xkZXJJZCB9KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy1bI0ZBRkFGQV0gaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLWJnLXdoaXRlIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uQ2hpcFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNDAwXCI+e3sgbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcwJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gU3ViZm9sZGVyIGZldGNoIGluZGljYXRvci4gVHdvIGNhc2VzOlxuICAgICAgICAgICAgICAgICAtIERyaWxsLWluIGZldGNoOiBubyBzdWJmb2xkZXJUaWxlcyB5ZXQsIHJlbmRlciBhIGNlbnRlcmVkXG4gICAgICAgICAgICAgICAgICAgcm93IHNwaW5uZXIgc28gdGhlIHNlY3Rpb24gaXNuJ3QgZW1wdHkgZHVyaW5nIHRoZSBmZXRjaC5cbiAgICAgICAgICAgICAgICAgLSBQYWdpbmF0aW9uIGZldGNoOiB0aWxlcyBleGlzdCwgYW5jaG9yIGEgc21hbGwgc3Bpbm5lciBhdFxuICAgICAgICAgICAgICAgICAgIHRoZSByaWdodCBlZGdlIHNvIHRoZSB1c2VyIGtub3dzIHRoZSBuZXh0IHBhZ2UgaXMgbG9hZGluZy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEZvbGRlck5vZGU/LmNoaWxkcmVuTG9hZGluZ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXNocmluay0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LVs4MHB4XVwiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0xvYWRpbmcgc3ViZm9sZGVycydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPCEtLSBGb2xkZXIgcGFuZWwgaGVhZGVyIGFib3ZlIHRoZSB0YWJsZTogXCJIb3RlbCBTZWFyY2ggKDMpXCIgKyBDbGVhciBmaWx0ZXIgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgIWlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93VW5vcmdhbmlzZWRTZWN0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1tYi0xIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNCBjcWEtcHktMyBjcWEtcm91bmRlZC10LWxnIGNxYS1iZy1pbmRpZ28tNTAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWluZGlnby0xMDBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi45NTg1IDEwLjQ1ODVDMTIuOTU4NSAxMC43OSAxMi44MjY4IDExLjEwOCAxMi41OTI0IDExLjM0MjRDMTIuMzU4IDExLjU3NjggMTIuMDQgMTEuNzA4NSAxMS43MDg1IDExLjcwODVIMS43MDg1QzEuMzc2OTggMTEuNzA4NSAxLjA1OTAzIDExLjU3NjggMC44MjQ2MTMgMTEuMzQyNEMwLjU5MDE5MiAxMS4xMDggMC40NTg0OTYgMTAuNzkgMC40NTg0OTYgMTAuNDU4NVYxLjcwODVDMC40NTg0OTYgMS4zNzY5OCAwLjU5MDE5MiAxLjA1OTAzIDAuODI0NjEzIDAuODI0NjEzQzEuMDU5MDMgMC41OTAxOTIgMS4zNzY5OCAwLjQ1ODQ5NiAxLjcwODUgMC40NTg0OTZINC44MzM1TDYuMDgzNSAyLjMzMzVIMTEuNzA4NUMxMi4wNCAyLjMzMzUgMTIuMzU4IDIuNDY1MTkgMTIuNTkyNCAyLjY5OTYxQzEyLjgyNjggMi45MzQwMyAxMi45NTg1IDMuMjUxOTggMTIuOTU4NSAzLjU4MzVWMTAuNDU4NVpcIiBbYXR0ci5zdHJva2VdPVwiY3VycmVudEZvbGRlck5vZGU/LmNvbG9yIHx8ICcjM0Y0M0VFJ1wiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWluZGlnby03MDBcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudEZvbGRlck5vZGU/Lm5hbWUgfX0gKHt7IGN1cnJlbnRGb2xkZXJEaXJlY3RDb3VudCB9fSlcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTMgY3FhLXB5LTEgY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWluZGlnby03MDAgY3FhLWJnLXdoaXRlIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1pbmRpZ28tMjAwIGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQobnVsbClcIlxuICAgICAgICAgID57eyBtb2R1bGFyTGFiZWxzLmNsZWFyRmlsdGVyIH19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVW5vcmdhbmlzZWQgc2VjdGlvbiBoZWFkZXIgYXQgcm9vdCB2aWV3IC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmIGlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93VW5vcmdhbmlzZWRTZWN0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tYi0yIGNxYS1tdC0yXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2RDZENzRdXCIgc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+aW5ib3g8L21hdC1pY29uPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPnt7IG1vZHVsYXJMYWJlbHMudW5vcmdhbmlzZWQgfX08L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2RDZENzRdXCI+XG4gICAgICAgICAgICB7eyB1bm9yZ2FuaXNlZENvdW50ID09PSAxID8gbW9kdWxhckxhYmVscy50ZXN0c0NvdW50U2luZ3VsYXIgOiBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyB1bm9yZ2FuaXNlZENvdW50KSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWJsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLVs3cHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWJvcmRlci10IGNxYS1ib3JkZXItbCBjcWEtYm9yZGVyLXIgY3FhLWJvcmRlci1ncmV5LTIwMCBjcWEtcmVsYXRpdmUgY3FhLW92ZXJmbG93LXgtYXV0b1wiXG4gICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwicGFnZWRSb3dzICYmIHBhZ2VkUm93cy5sZW5ndGggPiAwID8gbnVsbCA6ICdib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQnXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihpc1RhYmxlTG9hZGluZyB8fCBpc1RhYmxlRGF0YUxvYWRpbmcpIHx8ICghZWZmZWN0aXZlSXNFbXB0eVN0YXRlICYmIHBhZ2VkUm93cyAmJiBwYWdlZFJvd3MubGVuZ3RoID4gMCk7IGVsc2Ugc3RvcnlFbXB0eVRwbFwiPlxuICAgICAgICAgICAgPGFwcC1keW5hbWljLXRhYmxlXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItYm90dG9tXT1cInBhZ2VkUm93cyAmJiBwYWdlZFJvd3MubGVuZ3RoID4gMCA/ICcxcHggc29saWQgcmdiKDIyNiwgMjI2LCAyMjcpJyA6IG51bGxcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJjb21wdXRlZENvbHVtbnNcIlxuICAgICAgICAgICAgICBbZGF0YV09XCJwYWdlZFJvd3NcIlxuICAgICAgICAgICAgICBbcm93U2VsZWN0YWJsZV09XCJyb3dTZWxlY3RhYmxlXCJcbiAgICAgICAgICAgICAgW2VuYWJsZUxvY2FsU29ydF09XCJlbmFibGVMb2NhbFNvcnQgJiYgIWlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgICAgIFtpc1RhYmxlTG9hZGluZ109XCJpc1RhYmxlTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtpc1RhYmxlRGF0YUxvYWRpbmddPVwiaXNUYWJsZURhdGFMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW2NlbGxKc29uUGF0aEdldHRlcl09XCJjZWxsSnNvblBhdGhHZXR0ZXJcIlxuICAgICAgICAgICAgICBbb25Kc29uUGF0aENvcGllZEhhbmRsZXJdPVwib25Kc29uUGF0aENvcGllZEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbZW5hYmxlUm93UmVvcmRlcl09XCJpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgICAgICAocm93UmVvcmRlcik9XCJvblJvd1Jlb3JkZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cInNvcnRDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlUYWJsZVRwbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS04XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWxsdXN0cmF0aW9ucy9lbXB0eS1zdGF0ZS5zdmdcIiBhbHQ9XCJObyBkYXRhXCIgY2xhc3M9XCJjcWEtdy0zMiBjcWEtaC0zMiBjcWEtbWItNFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1sZyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbWItMlwiPk5vIHRlc3QgY2FzZXM8L2gzPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTUwMCBjcWEtbWItNFwiPlRyeSBhZGp1c3RpbmcgZmlsdGVycyBvciBjcmVhdGUgYSBuZXcgdGVzdCBjYXNlLjwvcD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiAoY2xpY2tlZCk9XCJ0b2dnbGVGaWx0ZXIoKVwiPlNob3cgRmlsdGVyczwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvYXBwLWR5bmFtaWMtdGFibGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3N0b3J5RW1wdHlUcGw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZWZmZWN0aXZlSXNFbXB0eVN0YXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIFtpbWFnZVVybF09XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uc109XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmFjdGlvbnNcIlxuICAgICAgICAgICAgICAgIChhY3Rpb25DbGljayk9XCJvbkVtcHR5QWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvY3FhLWVtcHR5LXN0YXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGNxYS1wYWdpbmF0aW9uXG4gICAgICAgICAgW3RvdGFsRWxlbWVudHNdPVwic2VydmVyU2lkZVBhZ2luYXRpb24gPyB0b3RhbEVsZW1lbnRzIDogZmlsdGVyZWRSb3dzLmxlbmd0aFwiXG4gICAgICAgICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICAgIFtwYWdlU2l6ZU1lbnVEaXJlY3Rpb25dPVwicGFnZVNpemVNZW51RGlyZWN0aW9uXCJcbiAgICAgICAgICBbcGFnZUl0ZW1Db3VudF09XCJwYWdlZFJvd3MubGVuZ3RoXCJcbiAgICAgICAgICAocGFnaW5hdGUpPVwib25QYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L2NxYS1wYWdpbmF0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJldXNlZCBidWxrIGFjdGlvbiB0b29sYmFyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhbnlSb3dTZWxlY3RlZCAmJiBtb2R1bGFyQ29uZmlnLmFsbG93QnVsa1NlbGVjdGlvbiAmJiAhaXNSZW9yZGVyaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1bMTguNzVweF0gY3FhLWxlZnQtWzUwJV0gY3FhLXRyYW5zbGF0ZS14LVstNTAlXSBjcWEtdy1mdWxsIGxnOmNxYS1tYXgtdy1bNjglXSBjcWEtc206bWF4LXctWzc1JV0gY3FhLW1heC13LVs5MCVdIGNxYS16LVsxXVwiPlxuICAgICAgPGNxYS10YWJsZS1hY3Rpb24tdG9vbGJhclxuICAgICAgICBbc2VsZWN0ZWRJdGVtc109XCJzZWxlY3RlZEl0ZW1zICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCA/IHNlbGVjdGVkSXRlbXMgOiBjdXJyZW50U2VsZWN0ZWRJdGVtc1wiXG4gICAgICAgIFthY3Rpb25zXT1cImVmZmVjdGl2ZUJ1bGtBY3Rpb25zXCJcbiAgICAgICAgW3Nob3dTZWxlY3RBbGxdPVwic2hvd1NlbGVjdEFsbEluVG9vbGJhclwiXG4gICAgICAgIFthbGxTZWxlY3RlZF09XCJhbGxTZWxlY3RlZEluVG9vbGJhclwiXG4gICAgICAgIFtzaG93RGlzbWlzc109XCJzaG93RGlzbWlzc0luVG9vbGJhclwiXG4gICAgICAgIChhY3Rpb25DbGljayk9XCJvbkJ1bGtBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwib25CdWxrU2VsZWN0QWxsKCRldmVudClcIlxuICAgICAgICAoZGlzbWlzcyk9XCJvbkJ1bGtEaXNtaXNzKClcIlxuICAgICAgPjwvY3FhLXRhYmxlLWFjdGlvbi10b29sYmFyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
|
|
1729
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxhci10YWJsZS10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBS1osdUJBQXVCLEVBR3ZCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFLbEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQWlCdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN2RixNQUFNLE9BQU8sNkJBQTZCO0lBZ1h4QyxZQUFvQixHQUFzQixFQUFVLGFBQTRCO1FBQTVELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEvV2hGLG9CQUFvQjtRQUNYLHNCQUFpQixHQUFXLG1CQUFtQixDQUFDO1FBQ2hELGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDOUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQ3RDLHFCQUFxQjtRQUNYLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM1QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUE2SCxDQUFDO1FBQ3hLLGlCQUFpQjtRQUNQLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDN0MsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUM5QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN0QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUvQyxnQkFBZ0I7UUFDUCxpQkFBWSxHQUF3QixFQUFFLENBQUM7UUFDdkMsZ0JBQVcsR0FBd0IsRUFBRSxDQUFDO1FBQ3RDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUUxQyw2REFBNkQ7UUFDcEQsaUJBQVksR0FBdUIsRUFBRSxDQUFDO1FBRS9DLCtFQUErRTtRQUN0RSx5QkFBb0IsR0FBdUIsRUFBRSxDQUFDO1FBRXZELDZGQUE2RjtRQUNwRiwrQkFBMEIsR0FBdUIsRUFBRSxDQUFDO1FBRTdELDRFQUE0RTtRQUM1RSxpREFBaUQ7UUFDeEMscUJBQWdCLEdBQVcsY0FBYyxDQUFDO1FBQ25ELGlEQUFpRDtRQUN4Qyx1QkFBa0IsR0FBeUUsUUFBUSxDQUFDO1FBQzdHLGlEQUFpRDtRQUN4QyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUV6QyxvREFBb0Q7UUFDM0MscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBRTFDLCtCQUErQjtRQUN0Qix1QkFBa0IsR0FBWSxJQUFJLENBQUM7UUFDbkMsMEJBQXFCLEdBQVksSUFBSSxDQUFDO1FBRS9DLG1GQUFtRjtRQUMxRSx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsYUFBUSxHQUF1QixNQUFNLENBQUM7UUFDdEMsbUJBQWMsR0FBc0MsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN4RixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBaUJsRSxhQUFhO1FBQ0osU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUUxQixxQkFBcUI7UUFDWixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixxQkFBZ0IsR0FBcUI7WUFDNUMsS0FBSyxFQUFFLHVCQUF1QjtZQUM5QixXQUFXLEVBQUUsdUlBQXVJO1lBQ3BKLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO1lBQ3RDLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztTQUMxRCxDQUFDO1FBRUYsb0JBQW9CO1FBQ1gsWUFBTyxHQUFrQjtZQUNoQztnQkFDRSxFQUFFLEVBQUUsUUFBUTtnQkFDWixLQUFLLEVBQUUsUUFBUTtnQkFDZixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDakQsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLE1BQU07Z0JBQ1YsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO2FBQ0Y7WUFDRDtnQkFDRSxFQUFFLEVBQUUsU0FBUztnQkFDYixLQUFLLEVBQUUsU0FBUztnQkFDaEIsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDbEQsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFlBQVk7Z0JBQ2hCLEtBQUssRUFBRSxZQUFZO2dCQUNuQixJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO2FBQ0Y7U0FDRixDQUFDO1FBRUYsZUFBZTtRQUNOLFVBQUssR0FBZ0csRUFBRSxDQUFDO1FBQ3hHLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRXhDLGVBQWU7UUFDTixZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQUVuQyxnQ0FBMkIsR0FBVyxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLG9CQUFlLEdBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakQsMEJBQXFCLEdBQTJCLE1BQU0sQ0FBQztRQUNoRSxrQ0FBa0M7UUFDekIseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMkMsQ0FBQztRQUNuRjs7O1dBR0c7UUFDTSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUMvQixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBSW5DLENBQUM7UUFZTCwwRkFBMEY7UUFDakYsa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFFbkM7OztXQUdHO1FBQ00sMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBQ2pEOzs7V0FHRztRQUNNLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUMvQywrRUFBK0U7UUFDdEUseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRS9DLHVDQUF1QztRQUMvQixzQkFBaUIsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLDZCQUF3QixHQUF5QyxFQUFFLENBQUM7UUFDNUUsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsY0FBUyxHQUFVLEVBQUUsQ0FBQztRQUV0QiwrRUFBK0U7UUFDL0UsMEJBQTBCO1FBQzFCLCtFQUErRTtRQUN0RSxZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUNwQzs7OzsyRkFJbUY7UUFDMUUsZ0JBQVcsR0FBd0IsSUFBSSxDQUFDO1FBQ3hDLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDdkMsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBQ2pDLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUM3QixxQkFBZ0IsR0FBcUIsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO1FBQ3pFLGtCQUFhLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBQzdELGtCQUFhLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBQzdELGdCQUFXLEdBQWtCLEVBQUUsQ0FBQztRQUNoQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDM0M7dUZBQytFO1FBQ3RFLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUMzQztrRkFDMEU7UUFDakUsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUMvQjttRkFDMkU7UUFDbEUsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQzlDOzs7dUVBRytEO1FBQ3RELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3Qzs7OztxRkFJNkU7UUFDcEUsdUJBQWtCLEdBQXNCLElBQUksQ0FBQztRQUN0RDs7Ozs7c0VBSzhEO1FBQ3JELHdCQUFtQixHQUF3QixJQUFJLENBQUM7UUFFekQ7Ozs7V0FJRztRQUNNLHVCQUFrQixHQUFZLElBQUksQ0FBQztRQUU1QywrRUFBK0U7UUFDL0UsMkJBQTJCO1FBQzNCLCtFQUErRTtRQUNyRSxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ25ELDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDO1FBQ3pGO3lGQUNpRjtRQUN2RSw0QkFBdUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQy9ELDZFQUE2RTtRQUNuRSw0QkFBdUIsR0FBRyxJQUFJLFlBQVksRUFBb0MsQ0FBQztRQUN6Riw0RUFBNEU7UUFDbEUsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMzRDtnRkFDd0U7UUFDOUQsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNoRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBQ25FLHNGQUFzRjtRQUM1RSwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUN4RSxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBQ25FOzs7OztXQUtHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUN6RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFN0QsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSw0RUFBNEU7UUFDNUUsOEVBQThFO1FBRTlFLDhFQUE4RTtRQUNwRSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBQ2hGLHdEQUF3RDtRQUM5Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzVELHVEQUF1RDtRQUM3QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFakQ7Ozs7O1dBS0c7UUFDTyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUVqRSwyQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRS9ELCtFQUErRTtRQUMvRSxzQkFBc0I7UUFDdEIsK0VBQStFO1FBQy9FLHlFQUF5RTtRQUNoRSxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDNUM7Ozs7V0FJRztRQUNNLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBUWhDLG1CQUFjLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBRXRFLGtGQUFrRjtRQUN4RSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbEQsb0ZBQW9GO1FBQzFFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNuRDs7Ozs7OztXQU9HO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUUvRCx5REFBeUQ7UUFDekQsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsd0VBQXdFO1FBQ2hFLG9CQUFlLEdBQWlCLElBQUksQ0FBQztRQUM3QywyREFBMkQ7UUFDbkQsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBQzFDLGlGQUFpRjtRQUN6RSw0QkFBdUIsR0FBVyxDQUFDLENBQUM7UUFDNUMsMEZBQTBGO1FBQ2xGLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUVqRDs7OztXQUlHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFLdEMsQ0FBQztRQUVMLGlHQUFpRztRQUN2Rix3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBRTFEOzs7OztXQUtHO1FBQ08sMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQWdDLENBQUM7UUFFbkY7Ozs7V0FJRztRQUNPLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBQy9FOzs7V0FHRztRQUNPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDL0Q7Ozs7V0FJRztRQUNPLDZCQUF3QixHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBTS9FLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDOUMsMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFDcEUsOEJBQXlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUdqRSwyQ0FBMkM7UUFDM0Msb0JBQWUsR0FBeUIsRUFBRSxDQUFDO1FBQzNDLHVEQUF1RDtRQUN2RCxzQkFBaUIsR0FBeUMsRUFBRSxDQUFDO1FBaWtCN0QscUJBQXFCO1FBQ3JCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQW9NbkM7O2tFQUUwRDtRQUNsRCx1QkFBa0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUN4Qzs7OENBRXNDO1FBQzlCLDRCQUF1QixHQUFXLENBQUMsQ0FBQyxDQUFDO1FBOGE3Qzs7V0FFRztRQUNILHdCQUFtQixHQUFHLENBQUMsR0FBUSxFQUEwQixFQUFFO1lBQ3pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxpRkFBaUY7WUFDakYsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUN0QixNQUFNLFdBQVcsR0FBRyxLQUFLLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3BGLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO0lBbHRDaUYsQ0FBQztJQTNUcEYsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNyRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7U0FDekUsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhO1FBQzVCLE1BQU0sSUFBSSxHQUFHLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RELElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBbU9ELGlGQUFpRjtJQUNqRixJQUFhLGFBQWEsQ0FBQyxPQUEyQztRQUNwRSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBb0ZPLHFCQUFxQjtRQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNqRCxPQUFPLEdBQUcsQ0FBQzthQUNaO1lBQ0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxPQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLHNCQUFzQixDQUFDLEVBQUU7WUFDbkcsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQXVCO2dCQUNwQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0IsTUFBTSxFQUFFLFVBQVUsS0FBSyxLQUFLO2FBQzdCLENBQUM7WUFDRix5RUFBeUU7WUFDekUsMEVBQTBFO1lBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ2xFLElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3pDO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixPQUFPO1lBQ0wsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsSUFBSSxRQUFRO1lBQzVELHdFQUF3RTtZQUN4RSxxRUFBcUU7WUFDckUsbURBQW1EO1lBQ25ELFVBQVUsRUFBRSxZQUFZO1lBQ3hCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsMEVBQTBFO1lBQzFFLGtFQUFrRTtZQUNsRSxTQUFTLEVBQUUsS0FBSztZQUNoQixNQUFNLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7U0FDakQsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxHQUFRO1FBQ2hDLElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUMvRCxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUM7U0FDdkI7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztRQUNwRixNQUFNLElBQUksR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekYsT0FBTyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLElBQUksYUFBYSxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssd0JBQXdCLENBQUMsSUFBVztRQUMxQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO2dCQUFFLFNBQVM7WUFDOUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxVQUFVO2dCQUFFLFNBQVM7WUFDbkUsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsR0FBUTtRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU87U0FDekMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUNMLGdGQUFnRjtZQUM5RSxvSEFBb0g7WUFDbEgsc2dCQUFzZ0I7WUFDeGdCLFFBQVE7WUFDUixTQUFTLE9BQU8sU0FBUztZQUMzQixTQUFTLENBQ1YsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLElBQWEsZ0JBQWdCLENBQUMsR0FBdUM7UUFDbkUsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtRQUNELElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDOUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDekQscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxvRUFBb0U7WUFDcEUsa0VBQWtFO1lBQ2xFLGdDQUFnQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUMzRSxnRkFBZ0Y7WUFDaEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQzNELGdGQUFnRjtZQUNoRixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDL0MsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDckUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDMUQsMERBQTBEO1lBQzFELElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO2dCQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUI7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sVUFBVSxDQUFDLEdBQVE7UUFDekIseUZBQXlGO1FBQ3pGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1FBQ3BGLHlGQUF5RjtRQUN6RiwyRUFBMkU7UUFDM0UsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFO1lBQ2pDLE9BQU8sUUFBUSxJQUFJLElBQUksQ0FBQztTQUN6QjtRQUNELE9BQU8sUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUY7UUFDRCxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFN0MsSUFBSSxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUM3QixpREFBaUQ7WUFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDM0IsSUFBSSxHQUFHLEVBQUU7d0JBQ04sR0FBVyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7cUJBQ2pDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxPQUFPO1NBQ1I7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRTtvQkFDOUIsR0FBVyxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDOUQ7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7b0JBQzlCLEdBQVcsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzlEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxrRkFBa0Y7UUFDbEYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVELGlGQUFpRjtRQUNqRiw2REFBNkQ7UUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDbEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1Ysc0VBQXNFO2dCQUN0RSxtRUFBbUU7Z0JBQ25FLHFCQUFxQjtnQkFDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQztnQkFDekQsU0FBUzthQUNWO1lBQ0QsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLHNCQUFzQixFQUFFO2dCQUNyQyxvRUFBb0U7Z0JBQ3BFLGtFQUFrRTtnQkFDbEUsOENBQThDO2dCQUM5QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDO2dCQUMxRCxTQUFTO2FBQ1Y7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUN2QztJQUNILENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsdUdBQXVHO1FBQ3ZHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBRSxDQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNsRyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDN0MsTUFBTSxzQkFBc0IsR0FBRyxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUN2RCxPQUFPLGlCQUFpQixJQUFJLHNCQUFzQixDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixrRUFBa0U7UUFDbEUsaUZBQWlGO1FBQ2pGLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzNCO1FBQ0QsOEVBQThFO1FBQzlFLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUU3QyxnQ0FBZ0M7UUFDaEMsT0FBTyxJQUFJLENBQUMsU0FBUzthQUNsQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMzQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLHFCQUFxQjtZQUNyQiw0REFBNEQ7WUFDNUQsc0ZBQXNGO1lBQ3RGLE9BQU8sQ0FBQyxDQUFFLENBQVMsQ0FBQyxVQUFVLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBbUI7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksQ0FBQyxHQUFRO1FBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFRO1FBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsd0JBQXdCLENBQUMsR0FBMkI7UUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQWtCO1FBQ3BDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxVQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYTtRQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBVztRQUN2QixJQUFJLE1BQU0sRUFBRSxLQUFLLEtBQUssY0FBYyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxPQUFZO1FBQzNCLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBWTtRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFnRyxFQUFFLENBQUM7UUFDOUcsSUFBSSxTQUFTLEVBQUU7WUFDYixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO29CQUFFLFNBQVM7Z0JBRTVGLDJDQUEyQztnQkFDM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBRWhELG9EQUFvRDtnQkFDcEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFRLEVBQVUsRUFBRTtvQkFDMUMsd0RBQXdEO29CQUN4RCxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUMxRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztxQkFDMUQ7b0JBRUQsbUNBQW1DO29CQUNuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7d0JBQ3ZDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQzt3QkFDbEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzt3QkFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUMzQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQztvQkFDakUsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxNQUFNLEVBQUU7d0JBQ1YsT0FBTyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7cUJBQ25FO29CQUVELDRCQUE0QjtvQkFDNUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQztnQkFFRixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO2dCQUVwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3hCLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVEO3FCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO29CQUNwQyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTt3QkFDdEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEUsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzNDO3lCQUFNO3dCQUNMLElBQUksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzlCO2lCQUNGO3FCQUFNO29CQUNMLElBQUksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzlCO2dCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDN0U7U0FDRjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsNERBQTREO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLFVBQVUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxDQUEwQztRQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBWTtRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM3RSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFTO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0MsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0Isa0VBQWtFO1FBQ2xFLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLHNEQUFzRDtZQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEMsT0FBTztTQUNSO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQzthQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQzthQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxzQkFBc0IsQ0FBQyxFQUFFO1lBQzdGLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsRUFBRSxFQUFFLHNCQUFzQjtnQkFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLElBQUksUUFBUTthQUN6RCxDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGFBQWEsQ0FBQyxDQUFNO1FBQzFCLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUFZLEVBQUUsR0FBUTtRQUN4QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzFCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUN4RDtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUNoRTtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUM1RDtRQUNELElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLE9BQU8s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c0JBQXhELFNBQVM7dUJBQUMsc0JBQXNCO2dCQW1HcEIsZ0JBQWdCO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRmlsdGVySXRlbSwgRHluYW1pY0ZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ZpbHRlcnMvZHluYW1pYy1maWx0ZXIvZHluYW1pYy1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29sdW1uVmlzaWJpbGl0eUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbHVtbi12aXNpYmlsaXR5L2NvbHVtbi12aXNpYmlsaXR5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFjdGlvbiB9IGZyb20gJy4uLy4uL3RhYmxlLWFjdGlvbi10b29sYmFyL3RhYmxlLWFjdGlvbi10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29uZmlnIH0gZnJvbSAnLi4vLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFTVBUWV9TVEFURV9JTUFHRVMgfSBmcm9tICcuLi8uLi9hc3NldHMvaW1hZ2VzL2ltYWdlLWFzc2V0cy5jb25zdGFudHMnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQge1xuICBERUZBVUxUX01PRFVMQVJfQ09ORklHLFxuICBERUZBVUxUX01PRFVMQVJfTEFCRUxTLFxuICBERUZBVUxUX1JFT1JERVJfTEFCRUxTLFxuICBGT0xERVJfQ09MVU1OX0ZJRUxEX0lELFxuICBGb2xkZXJDcmVhdGVkUGF5bG9hZCxcbiAgRm9sZGVyRGVsZXRlUmVxdWVzdGVkUGF5bG9hZCxcbiAgRm9sZGVyRGVsZXRlU3RyYXRlZ3ksXG4gIEZvbGRlckRlbGV0ZWRQYXlsb2FkLFxuICBGb2xkZXJJZEFjY2Vzc29yLFxuICBGb2xkZXJOb2RlLFxuICBGb2xkZXJSZW5hbWVkUGF5bG9hZCxcbiAgRm9sZGVyTW92ZVJlcXVlc3RlZFBheWxvYWQsXG4gIEZvbGRlck1vdmVkUGF5bG9hZCxcbiAgRm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkUGF5bG9hZCxcbiAgTW9kdWxhckNvbmZpZyxcbiAgTW9kdWxhckxhYmVscyxcbiAgUmVvcmRlckxhYmVscyxcbiAgUmVvcmRlclNhdmVQYXlsb2FkLFxuICBUZXN0c01vdmVkUGF5bG9hZCxcbiAgQnVsa0FjdGlvbkludm9rZWRQYXlsb2FkLFxufSBmcm9tICcuL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcbmltcG9ydCB7IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9tb3ZlLXRvLWZvbGRlci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9uZXctZm9sZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlRm9sZGVyRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9kaWFsb2dzL2RlbGV0ZS1mb2xkZXItZGlhbG9nLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1tb2R1bGFyLXRhYmxlLXRlbXBsYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1vZHVsYXJUYWJsZVRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8vIFNlYXJjaCBiYXIgaW5wdXRzXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGNvbXBvbmVudHMnO1xuICBASW5wdXQoKSBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNob3dDbGVhcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRXhwb3J0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIFNlYXJjaCBiYXIgb3V0cHV0c1xuICBAT3V0cHV0KCkgb25TZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9uRXhwb3J0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdHlwZTogJ2xvY2FsJyB8ICdlbWFpbCc7IGVtYWlscz86IHN0cmluZ1tdOyBmcmFtZXdvcms/OiAnV0VCRFJJVkVSX0lPJyB8ICdTRUxFTklVTV9KQVZBJzsgc2VsZWN0ZWRJdGVtczogYW55W10gfSB8IHZvaWQ+KCk7XG4gIC8vIEZpbHRlciBvdXRwdXRzXG4gIEBPdXRwdXQoKSBvbkFwcGx5RmlsdGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uUmVzZXRGaWx0ZXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9uQ2xlYXJBbGwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZW1vdmVDaGlwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gRmlsdGVyIGlucHV0c1xuICBASW5wdXQoKSBmaWx0ZXJDb25maWc6IER5bmFtaWNGaWx0ZXJJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgZmlsdGVyTW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgQElucHV0KCkgc2hvd0ZpbHRlclBhbmVsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIE90aGVyIGJ1dHRvbnMgaW5wdXQgKGFycmF5IG9mIGJ1dHRvbiB0ZW1wbGF0ZXMvY29tcG9uZW50cylcbiAgQElucHV0KCkgb3RoZXJCdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIE90aGVyIGRyb3Bkb3duIGJ1dHRvbnMgaW5wdXQgKGFycmF5IG9mIGRyb3Bkb3duIGJ1dHRvbiB0ZW1wbGF0ZXMvY29tcG9uZW50cylcbiAgQElucHV0KCkgb3RoZXJEcm9wRG93bkJ1dHRvbnM6IFRlbXBsYXRlUmVmPGFueT5bXSA9IFtdO1xuICBcbiAgLy8gT3RoZXIgc2VsZWN0IGRyb3Bkb3duIGJ1dHRvbnMgaW5wdXQgKGFycmF5IG9mIHNlbGVjdCBkcm9wZG93biBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyU2VsZWN0RHJvcERvd25CdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIExlZ2FjeSBzaW5nbGUgYnV0dG9uIGlucHV0cyAoZGVwcmVjYXRlZCwga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBvdGhlckJ1dHRvbnMgYXJyYXkgaW5zdGVhZCAqL1xuICBASW5wdXQoKSBvdGhlckJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnT3RoZXIgQnV0dG9uJztcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBvdGhlckJ1dHRvbnMgYXJyYXkgaW5zdGVhZCAqL1xuICBASW5wdXQoKSBvdGhlckJ1dHRvblZhcmlhbnQ6ICdmaWxsZWQnIHwgJ291dGxpbmVkJyB8ICd0ZXh0JyB8ICdlbGV2YXRlZCcgfCAndG9uYWwnIHwgJ2dyZXktc29saWQnID0gJ2ZpbGxlZCc7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgc2hvd090aGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgXG4gIC8vIEFjdGlvbiBtZW51IGJ1dHRvbiAodGhyZWUtZG90IG1lbnUgaW4gdGFibGUgcm93cylcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gU2V0dGluZ3MgYW5kIHJlZnJlc2ggYnV0dG9uc1xuICBASW5wdXQoKSBzaG93U2V0dGluZ3NCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93QXV0b1JlZnJlc2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFZpZXctbW9kZSB0b2dnbGUgKExpc3QgfCBNb2R1bGFyKS4gSGlkZGVuIGJ5IGRlZmF1bHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gIEBJbnB1dCgpIHNob3dWaWV3TW9kZVRvZ2dsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2aWV3TW9kZTogJ2xpc3QnIHwgJ21vZHVsYXInID0gJ2xpc3QnO1xuICBASW5wdXQoKSB2aWV3TW9kZUxhYmVsczogeyBsaXN0OiBzdHJpbmc7IG1vZHVsYXI6IHN0cmluZyB9ID0geyBsaXN0OiAnTGlzdCcsIG1vZHVsYXI6ICdNb2R1bGFyJyB9O1xuICBAT3V0cHV0KCkgdmlld01vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdsaXN0JyB8ICdtb2R1bGFyJz4oKTtcblxuICBnZXQgdmlld01vZGVTZWdtZW50cygpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGljb24/OiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7IGxhYmVsOiB0aGlzLnZpZXdNb2RlTGFiZWxzLmxpc3QsIHZhbHVlOiAnbGlzdCcsIGljb246ICd2aWV3X2xpc3QnIH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnZpZXdNb2RlTGFiZWxzLm1vZHVsYXIsIHZhbHVlOiAnbW9kdWxhcicsIGljb246ICdmb2xkZXInIH0sXG4gICAgXTtcbiAgfVxuXG4gIG9uVmlld01vZGVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA9PT0gJ21vZHVsYXInID8gJ21vZHVsYXInIDogJ2xpc3QnO1xuICAgIGlmIChuZXh0ICE9PSB0aGlzLnZpZXdNb2RlKSB7XG4gICAgICB0aGlzLnZpZXdNb2RlID0gbmV4dDtcbiAgICAgIHRoaXMudmlld01vZGVDaGFuZ2UuZW1pdChuZXh0KTtcbiAgICB9XG4gIH1cblxuICAvLyBEYXRhIGlucHV0XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG5cbiAgLy8gRW1wdHkgc3RhdGUgaW5wdXRzXG4gIEBJbnB1dCgpIGlzRW1wdHlTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbXB0eVN0YXRlQ29uZmlnOiBFbXB0eVN0YXRlQ29uZmlnID0ge1xuICAgIHRpdGxlOiAnTm8gRGF0YSBBdmFpbGFibGUgWWV0JyxcbiAgICBkZXNjcmlwdGlvbjogJ1J1biBvciB1cGxvYWQgeW91ciBmaXJzdCB0ZXN0IHRvIHNlZSB5b3VyIGFuYWx5dGljcyBhbmQgdHJlbmRzIGhlcmUuIFdhdGNoIHlvdXIgcXVhbGl0eSBtZXRyaWNzIGNvbWUgdG8gbGlmZSB3aXRoIHJlYWwtdGltZSBpbnNpZ2h0cy4nLFxuICAgIGltYWdlVXJsOiBFTVBUWV9TVEFURV9JTUFHRVMuREFTSEJPQVJELFxuICAgIGFjdGlvbnM6IFt7IGxhYmVsOiAnUnVuIFRlc3QgU3VpdGUnLCB2YXJpYW50OiAnZmlsbGVkJyB9XSxcbiAgfTtcblxuICAvLyBBY3Rpb24gYmFyIGlucHV0c1xuICBASW5wdXQoKSBhY3Rpb25zOiBUYWJsZUFjdGlvbltdID0gW1xuICAgIHsgXG4gICAgICBpZDogJ2RlbGV0ZScsIFxuICAgICAgbGFiZWw6ICdEZWxldGUnLCBcbiAgICAgIGljb246ICdkZWxldGUnLCBcbiAgICAgIHRvb2x0aXA6ICdEZWxldGUgc2VsZWN0ZWQnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2VkaXQnLCBcbiAgICAgIGxhYmVsOiAnRWRpdCcsIFxuICAgICAgaWNvbjogJ2VkaXQnLCBcbiAgICAgIHRvb2x0aXA6ICdFZGl0IHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFZGl0IGFjdGlvbiBjbGlja2VkOicsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBcbiAgICAgIGlkOiAnYWRkLXRhZycsIFxuICAgICAgbGFiZWw6ICdBZGQgVGFnJywgXG4gICAgICBpY29uOiAnbG9jYWxfb2ZmZXInLCBcbiAgICAgIHRvb2x0aXA6ICdBZGQgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQWRkIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ3JlbW92ZS10YWcnLCBcbiAgICAgIGxhYmVsOiAnUmVtb3ZlIFRhZycsIFxuICAgICAgaWNvbjogJ2xhYmVsX29mZicsIFxuICAgICAgdG9vbHRpcDogJ1JlbW92ZSB0YWdzJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgdGFnIGFjdGlvbiBjbGlja2VkOicsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gIF07XG5cbiAgLy8gQ2hpcHMgaW5wdXRzXG4gIEBJbnB1dCgpIGNoaXBzOiBBcnJheTx7IGtleT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgZnVsbFRleHQ/OiBzdHJpbmc7IGhhc01vcmU/OiBib29sZWFuIH0+ID0gW107XG4gIEBJbnB1dCgpIGZpbHRlckFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBUYWJsZSBpbnB1dHNcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgQElucHV0KCkgcm93U2VsZWN0YWJsZT86IChyb3c6IGFueSkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFsxMCwgMjAsIDQwLCA2MCwgODBdO1xuICBASW5wdXQoKSBwYWdlU2l6ZU1lbnVEaXJlY3Rpb246ICdhdXRvJyB8ICd1cCcgfCAnZG93bicgPSAnYXV0byc7XG4gIC8vIFNlcnZlci1zaWRlIHBhZ2luYXRpb24gY29udHJvbHNcbiAgQElucHV0KCkgc2VydmVyU2lkZVBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdG90YWxFbGVtZW50czogbnVtYmVyID0gMDtcbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFnZUluZGV4OiBudW1iZXI7IHBhZ2VTaXplOiBudW1iZXIgfT4oKTtcbiAgLyoqXG4gICAqIFdoZW4gZmFsc2UsIGhlYWRlciBzb3J0IGRvZXMgbm90IHJlb3JkZXIgcm93cyBsb2NhbGx5ICh1c2Ugd2l0aCBzZXJ2ZXJTaWRlUGFnaW5hdGlvbiArIHNvcnRDaGFuZ2UpLlxuICAgKiBEZWZhdWx0IHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVMb2NhbFNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAT3V0cHV0KCkgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGZpZWxkSWQ6IHN0cmluZztcbiAgICBmaWVsZFZhbHVlPzogc3RyaW5nO1xuICAgIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCBudWxsO1xuICB9PigpO1xuICAvLyBMb2FkZXIgY29udHJvbHMgKHBhc3NlZCBkb3duIHRvIGR5bmFtaWMgdGFibGUpXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNUYWJsZURhdGFMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gQmFja3dhcmQtY29tcGF0aWJpbGl0eSBmbGFnOyBpZiBwcm92aWRlZCwgZHluYW1pYyB0YWJsZSB3aWxsIHVzZSBpdCB3aGVuIHNwZWNpZmljIGZsYWdzIGFyZSB1bmRlZmluZWRcblxuICAvLyBPcHRpb25hbCBnZXR0ZXIgZm9yIEpTT04gcGF0aCBwZXIgY2VsbC4gV2hlbiBwcm92aWRlZCwgZG91YmxlLWNsaWNraW5nIGEgY2VsbCBjb3BpZXMgdGhlIHBhdGguXG4gIEBJbnB1dCgpIGNlbGxKc29uUGF0aEdldHRlcj86IChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nLCByb3c6IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8vIE9wdGlvbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBKU09OIHBhdGggaXMgY29waWVkIGZyb20gYSB0YWJsZSBjZWxsXG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiBzdHJpbmcgfSkgPT4gdm9pZDtcblxuICAvLyBTZWxlY3RlZCBpdGVtcyAoZnVsbCBvYmplY3RzKSBmb3IgbWFpbnRhaW5pbmcgc2VsZWN0aW9uIGFjcm9zcyBwYWdpbmF0aW9uIChzZXJ2ZXItc2lkZSlcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcblxuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgYWN0aW9uIHRvb2xiYXIgcmVuZGVycyB0aGUgXCJTZWxlY3QgYWxsXCIgYWZmb3JkYW5jZS4gRGVmYXVsdHMgdG8gZmFsc2VcbiAgICogZm9yIG5vdyDigJQgaG9zdCBvcHRzIGluLiBNYXRjaGVzIHRoZSBjdXJyZW50IHByb2R1Y3QgcmVxdWlyZW1lbnQgdG8gaGlkZSBTZWxlY3QgQWxsLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NlbGVjdEFsbEluVG9vbGJhcjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgYWN0aW9uIHRvb2xiYXIgcmVuZGVycyB0aGUgZGlzbWlzcyAow5cpIGFmZm9yZGFuY2UuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqIGZvciBub3cg4oCUIGhvc3Qgb3B0cyBpbi4gTWF0Y2hlcyB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50IHRvIGhpZGUgQ2FuY2VsLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd0Rpc21pc3NJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEJvdW5kIHRvIHRoZSB0b29sYmFyJ3MgXCJTZWxlY3QgYWxsXCIgY2hlY2tib3gg4oCUIGRyaXZlcyB0aGUgY2hlY2tlZCBzdGF0ZS4gKi9cbiAgQElucHV0KCkgYWxsU2VsZWN0ZWRJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBJbnRlcm5hbCBzdGF0ZSBmb3IgY29sdW1uIHZpc2liaWxpdHlcbiAgcHJpdmF0ZSBfY29sdW1uVmlzaWJpbGl0eTogQ29sdW1uVmlzaWJpbGl0eUNvbmZpZyA9IHt9O1xuICBwcml2YXRlIF9jYWNoZWRWaXNpYmlsaXR5Q29sdW1uczogQXJyYXk8eyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG4gIGZpbHRlcmVkUm93czogYW55W10gPSBbXTtcbiAgcGFnZWRSb3dzOiBhbnlbXSA9IFtdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRm9sZGVyIC8gbW9kdWxhciBpbnB1dHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBASW5wdXQoKSBmb2xkZXJzOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgLyoqIEhvc3QtcHJvdmlkZWQgc25hcHNob3Qgb2Ygcm9vdC1sZXZlbCBmb2xkZXJzIGZvciB0aGUgXCJPcmdhbml6ZWRcIiBncmlkLlxuICAgKiAgV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgdGhpcy5mb2xkZXJzYCBmb3IgYHJvb3RGb2xkZXJUaWxlc2Agc29cbiAgICogIHRoZSBPcmdhbml6ZWQgc2VjdGlvbiBzdGF5cyBzdGFibGUgd2hpbGUgc2lkZWJhciBzZWFyY2ggc3dhcHMgYGZvbGRlcnNgXG4gICAqICB0byBhIGZpbHRlcmVkIHJlc3VsdCBzZXQuIE1pcnJvcnMgdGhlIGhvc3QtZHJpdmVuIGZhbGxiYWNrIHBhdHRlcm4gdXNlZFxuICAgKiAgYnkgYHNlbGVjdGVkRm9sZGVyTm9kZWAgKHN1YmZvbGRlcnMpIGFuZCBgc2VsZWN0ZWRGb2xkZXJUcmFpbGAgKGJyZWFkY3J1bWIpLiAqL1xuICBASW5wdXQoKSByb290Rm9sZGVyczogRm9sZGVyTm9kZVtdIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleHBhbmRlZEZvbGRlcklkczogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgdW5vcmdhbml6ZWRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgZm9sZGVySWRBY2Nlc3NvcjogRm9sZGVySWRBY2Nlc3NvciA9IChyb3c6IGFueSkgPT4gcm93Py5mb2xkZXJJZCA/PyBudWxsO1xuICBASW5wdXQoKSBtb2R1bGFyQ29uZmlnOiBNb2R1bGFyQ29uZmlnID0geyAuLi5ERUZBVUxUX01PRFVMQVJfQ09ORklHIH07XG4gIEBJbnB1dCgpIG1vZHVsYXJMYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgYnVsa0FjdGlvbnM6IFRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgc2lkZWJhckNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTGF6eS1sb2FkOiB3aGVuIHRydWUsIHRoZSBzaWRlYmFyIGVtaXRzIGBzZWFyY2hDaGFuZ2VgIGFuZCBza2lwcyBpdHNcbiAgICogIGxvY2FsIG5hbWUgZmlsdGVyIHNvIHRoZSBob3N0IGNhbiBzZXJ2ZSBzZWFyY2ggcmVzdWx0cyBmcm9tIHRoZSBiYWNrZW5kLiAqL1xuICBASW5wdXQoKSBzZXJ2ZXJTaWRlU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMYXp5LWxvYWQ6IGJhY2tlbmQtcmVwb3J0ZWQgdG90YWwgcm9vdCBmb2xkZXJzLiBEcml2ZXMgdGhlIHNpZGViYXInc1xuICAgKiAgdG9wLWxldmVsIFwiTG9hZCBtb3JlXCIgYWZmb3JkYW5jZSB3aGVuIGBmb2xkZXJzLmxlbmd0aCA8IHJvb3RUb3RhbGAuICovXG4gIEBJbnB1dCgpIHJvb3RUb3RhbDogbnVtYmVyID0gMDtcbiAgLyoqIExhenktbG9hZDogdHJ1ZSB3aGlsZSB0aGUgaG9zdCBpcyBmZXRjaGluZyBzZXJ2ZXItc2lkZSBmb2xkZXItc2VhcmNoXG4gICAqICByZXN1bHRzLiBGb3J3YXJkZWQgdG8gdGhlIHNpZGViYXIgc28gaXQgY2FuIHJlbmRlciBhIHNlYXJjaCBzcGlubmVyLiAqL1xuICBASW5wdXQoKSBmb2xkZXJTZWFyY2hMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMYXp5LWxvYWQ6IHRydWUgd2hpbGUgYSByb290LXBhZ2UgZmV0Y2ggaXMgaW4gZmxpZ2h0IChpbml0aWFsIGxvYWQgT1JcbiAgICogIHRoZSBzY3JvbGwtZHJpdmVuIFwibG9hZCBtb3JlXCIgcGFnaW5hdGlvbikuIERyaXZlcyB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICogIHRoZSBtb2R1bGFyIGdyaWQgcmVuZGVycyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgT3JnYW5pemVkIHJvdywgYW5kIGlzXG4gICAqICBmb3J3YXJkZWQgdG8gdGhlIHNpZGViYXIgZm9yIGl0cyBvd24gbG9hZGluZyBhZmZvcmRhbmNlLiAqL1xuICBASW5wdXQoKSByb290Rm9sZGVyc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE92ZXJyaWRlIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciBub2RlLiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlblxuICAgKiAgYGZpbmRGb2xkZXIoZm9sZGVycywgc2VsZWN0ZWRGb2xkZXJJZClgIG1pc3NlcyDigJQgZS5nLiwgZHVyaW5nIHNpZGViYXJcbiAgICogIHNlYXJjaCB3aGVuIGBmb2xkZXJzYCBob2xkcyBvbmx5IHRoZSBtYXRjaGVkIHJlc3VsdHMsIHRoZSBzZWxlY3RlZFxuICAgKiAgZm9sZGVyIG1heSBub3QgYmUgYW1vbmcgdGhlbSwgYnV0IGl0cyBicmVhZGNydW1iIC8gaGVhZGVyIGxhYmVsIHN0aWxsXG4gICAqICBuZWVkcyB0byByZW5kZXIuIFRoZSBob3N0IG93bnMgdGhlIGxvb2t1cCBhZ2FpbnN0IGl0cyBmdWxsIGZvbGRlciBtYXAuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVyTm9kZTogRm9sZGVyTm9kZSB8IG51bGwgPSBudWxsO1xuICAvKiogSG9zdC1wcm92aWRlZCBicmVhZGNydW1iIHNuYXBzaG90IGZvciB0aGUgc2VsZWN0ZWQgZm9sZGVyLiBVc2VkIGFzIGFcbiAgICogIGZhbGxiYWNrIGluIGBicmVhZGNydW1iVHJhaWxgIHdoZW4gYGJ1aWxkVHJhaWxgIGFnYWluc3QgYHRoaXMuZm9sZGVyc2BcbiAgICogIHlpZWxkcyBlbXB0eSDigJQgdGhlIGNhbm9uaWNhbCBjYXNlIGlzIHNpZGViYXIgc2VhcmNoLCB3aGVyZSBgZm9sZGVyc2BcbiAgICogIGlzIHRoZSBzZWFyY2gtcmVzdWx0cyBsaXN0IGFuZCB0aGUgc2VsZWN0ZWQgZm9sZGVyJ3MgYW5jZXN0b3JzIGFyZW4ndFxuICAgKiAgcHJlc2VudC4gVGhlIGhvc3Qgd2Fsa3MgYHBhcmVudElkYCBjaGFpbnMgdG8gYnVpbGQgdGhpczsgcGFydGlhbCB0cmFpbHNcbiAgICogIGFyZSBhY2NlcHRhYmxlIHdoZW4gYW5jZXN0b3JzIGhhdmVuJ3QgYmVlbiBmZXRjaGVkIHlldC4gKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRGb2xkZXJUcmFpbDogRm9sZGVyTm9kZVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBsaWJyYXJ5IG9wZW5zIGl0cyBvd24gTW92ZSBkaWFsb2cgZm9yIGNvbnZlbmllbmNlXG4gICAqIGR1cmluZyB0ZXN0aW5nLiBIb3N0cyB0YWtpbmcgb3ZlciBBUEkgKyBVWCBzaG91bGQgc2V0IHRoaXMgdG8gYGZhbHNlYCBhbmRcbiAgICogbGlzdGVuIG9uIGBtb3ZlUmVxdWVzdGVkYCB0byByZW5kZXIgdGhlaXIgb3duLlxuICAgKi9cbiAgQElucHV0KCkgdXNlSW50ZXJuYWxEaWFsb2dzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgb3V0cHV0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEBPdXRwdXQoKSBmb2xkZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckV4cGFuc2lvblRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgZXhwYW5kZWQ6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIExhenktbG9hZDogcmUtZW1pdHRlZCBmcm9tIHRoZSBzaWRlYmFyIHdoZW4gdGhlIHVzZXIgZXhwYW5kcyBhIG5vZGUgd2hvc2VcbiAgICogIGNoaWxkcmVuIGhhdmVuJ3QgYmVlbiBmZXRjaGVkIHlldC4gSG9zdCByZXNwb25kcyBieSBmZXRjaGluZyB0aGF0IHN1YnRyZWUuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDaGlsZHJlblJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogTGF6eS1sb2FkOiByZS1lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBwZXItZm9sZGVyIFwiTG9hZCBtb3JlXCIuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyOyBuZXh0UGFnZTogbnVtYmVyIH0+KCk7XG4gIC8qKiBMYXp5LWxvYWQ6IHJlLWVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHRvcC1sZXZlbCBcIkxvYWQgbW9yZVwiLiAqL1xuICBAT3V0cHV0KCkgcm9vdExvYWRNb3JlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogTGF6eS1sb2FkOiBkZWJvdW5jZWQgc2lkZWJhci1zZWFyY2ggdGVybS4gQ29uc3VtZWQgYnkgaG9zdHMgdGhhdCBoYXZlXG4gICAqICBzZXQgYHNlcnZlclNpZGVTZWFyY2g9dHJ1ZWAgdG8gcmVmZXRjaCB0aGUgdHJlZSBmcm9tIHRoZSBiYWNrZW5kLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJDcmVhdGVkUGF5bG9hZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgXCIrIE5ldyBmb2xkZXJcIjsgaG9zdCBzaG91bGQgb3BlbiBhIGNyZWF0aW9uIG1vZGFsLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhcmVudElkOiBudW1iZXIgfCBudWxsIH0+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJSZW5hbWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJSZW5hbWVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGZvbGRlciBkZWxldGlvbiB2aWEgdGhlIGludGVybmFsIGRpYWxvZyAob3JcbiAgICogaW1tZWRpYXRlbHksIHdoZW4gYHVzZUludGVybmFsRGlhbG9nc2AgaXMgZmFsc2UgYW5kIHRoZSBob3N0IGRyaXZlcyB0aGUgVVgpLlxuICAgKiBQYXlsb2FkIG5vdyBpbmNsdWRlcyB0aGUgdXNlcidzIGNob3NlbiBgc3RyYXRlZ3lgIGZvciB3aGF0IGhhcHBlbnMgdG8gdGhlXG4gICAqIGZvbGRlcidzIHRlc3QgY2FzZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRGVsZXRlZFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0c01vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0c01vdmVkUGF5bG9hZD4oKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQnVsayBhY3Rpb24gdG9vbGJhciBzdXJmYWNlIOKAlCBuYW1pbmcgbWlycm9ycyBjcWEtdGFibGUtdGVtcGxhdGUgc28gY29uc3VtZXJzXG4gIC8vIGdldCB0aGUgc2FtZSBldmVudHMgZnJvbSBlaXRoZXIgY29tcG9uZW50IChwbHVzIHRoZSBmb2xkZXIgZXZlbnRzIGJlbG93KS5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIEZpcmVzIG9uIHJhdyB0b29sYmFyIGFjdGlvbiBjbGljayDigJQgKmJlZm9yZSogYW55IGludGVybmFsIGRpYWxvZyBvcGVucy4gKi9cbiAgQE91dHB1dCgpIGJ1bGtBY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfT4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBcIlNlbGVjdCBhbGxcIiBpcyB0b2dnbGVkLiAqL1xuICBAT3V0cHV0KCkgYnVsa1NlbGVjdEFsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBkaXNtaXNzICjDlykgaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIGJ1bGtEaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyAqYWZ0ZXIqIHRoZSBsaWJyYXJ5LWludGVybmFsIG1vdmUtdG8tZm9sZGVyIGRpYWxvZyByZXNvbHZlcyB3aXRoIGFcbiAgICogdXNlciBjb25maXJtYXRpb24sIE9SIGltbWVkaWF0ZWx5IGZvciBub24tZGlhbG9nIGJ1bGsgYWN0aW9ucyBzdXBwbGllZCBieVxuICAgKiB0aGUgaG9zdC4gSG9zdHMgd2l0aCB0aGVpciBvd24gVVggc2hvdWxkIGxpc3RlbiBvbiBgYnVsa0FjdGlvbkNsaWNrYCArXG4gICAqIGBtb3ZlUmVxdWVzdGVkYCBhbmQgdHJlYXQgdGhpcyBhcyB0aGUgXCJjb25maXJtZWRcIiBzaWduYWwuXG4gICAqL1xuICBAT3V0cHV0KCkgYnVsa0FjdGlvbkludm9rZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZD4oKTtcblxuICBAT3V0cHV0KCkgc2lkZWJhckNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIHN1cmZhY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogV2hlbiB0cnVlLCByZW5kZXJzIGEgXCJSZW9yZGVyXCIgYnV0dG9uIGluIHRoZSB0b29sYmFyLiBIb3N0LWRyaXZlbi4gKi9cbiAgQElucHV0KCkgc2hvd1Jlb3JkZXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEhvc3QgZmxpcHMgdGhpcyB0cnVlIHdoaWxlIGl0cyBidWxrLXVwZGF0ZSBBUEkgY2FsbCBpcyBpbi1mbGlnaHQuIFRoZVxuICAgKiBjb21wb25lbnQga2VlcHMgdGhlIHJlb3JkZXIgVUkgcGlubmVkIChcIlNhdmluZy4uLlwiKSB3aGlsZSB0cnVlIGFuZCBleGl0c1xuICAgKiByZW9yZGVyIG1vZGUgd2hlbiBpdCBmbGlwcyBiYWNrIHRvIGZhbHNlICh0aGUgXCJmdXR1cmUgQVBJIGNhbGxcIiBob29rKS5cbiAgICovXG4gIEBJbnB1dCgpIHJlb3JkZXJTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFBhcnRpYWwgb3ZlcnJpZGUgZm9yIHRoZSBkZWZhdWx0IHJlb3JkZXIgbGFiZWxzIChcIlJlb3JkZXJcIiwgXCJEb25lXCIsIGV0Yy4pLiAqL1xuICBASW5wdXQoKSBzZXQgcmVvcmRlckxhYmVscyhwYXJ0aWFsOiBQYXJ0aWFsPFJlb3JkZXJMYWJlbHM+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUywgLi4uKHBhcnRpYWwgfHwge30pIH07XG4gIH1cbiAgZ2V0IHJlb3JkZXJMYWJlbHMoKTogUmVvcmRlckxhYmVscyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlb3JkZXJMYWJlbHM7XG4gIH1cbiAgcHJpdmF0ZSBfcmVvcmRlckxhYmVsczogUmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUyB9O1xuXG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIlJlb3JkZXJcIiBhbmQgdGhlIGNvbXBvbmVudCBlbnRlcnMgcmVvcmRlciBtb2RlLiAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJDYW5jZWxcIiDigJQgdGhlIG9yaWdpbmFsIG9yZGVyIGlzIGFscmVhZHkgcmVzdG9yZWQuICovXG4gIEBPdXRwdXQoKSByZW9yZGVyQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJEb25lXCIuIEhvc3Qgc2hvdWxkIHRha2UgYG9yZGVyZWRJdGVtc2AsIGNhbGwgaXRzXG4gICAqIGJ1bGstdXBkYXRlIEFQSSwgcmVmcmVzaCBgW2RhdGFdYCwgYW5kIGZsaXAgYHJlb3JkZXJTYXZpbmdgIGJhY2sgdG8gYGZhbHNlYCDigJRcbiAgICogdGhlIGNvbXBvbmVudCB3aWxsIHRoZW4gZXhpdCByZW9yZGVyIG1vZGUuXG4gICAqXG4gICAqIE5vdGU6IGZvciBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uLCBgb3JkZXJlZEl0ZW1zYCBpcyB0aGUgKmN1cnJlbnQgcGFnZSBzbGljZSosXG4gICAqIG5vdCB0aGUgZnVsbCBkYXRhc2V0IOKAlCBzYW1lIGFzIHRoZSBpbi1tZW1vcnkgdmlldyB0aGUgdXNlciB3YXMgZHJhZ2dpbmcuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFJlb3JkZXJTYXZlUGF5bG9hZD4oKTtcblxuICAvKiogSW50ZXJuYWwg4oCUIHRydWUgd2hpbGUgdGhlIHVzZXIgaXMgaW4gcmVvcmRlciBtb2RlLiAqL1xuICBpc1Jlb3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNuYXBzaG90IG9mIGBwYWdlZFJvd3NgIHRha2VuIG9uIGVudGVyOyB1c2VkIHRvIHJldmVydCBvbiBjYW5jZWwuICovXG4gIHByaXZhdGUgcmVvcmRlclNuYXBzaG90OiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZnQgb2YgdGhlIHJlb3JkZXJlZCByb3dzIChjdXJyZW50IHdvcmtpbmcgc3RhdGUpLiAqL1xuICBwcml2YXRlIHJlb3JkZXJEcmFmdDogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLyoqIEF1dG8tcmVmcmVzaCBpbnRlcnZhbCBjYXB0dXJlZCBvbiBlbnRlciwgc28gd2UgY2FuIHJlc3RvcmUgb24gY2FuY2VsL2RvbmUuICovXG4gIHByaXZhdGUgcmVvcmRlclNhdmVkQXV0b1JlZnJlc2g6IG51bWJlciA9IDA7XG4gIC8qKiBUcnVlIGFmdGVyIERvbmUgaGFzIGJlZW4gY2xpY2tlZCwgYXdhaXRpbmcgdGhlIGhvc3QncyBgcmVvcmRlclNhdmluZ2Ag4oaSIGZhbHNlIGZsaXAuICovXG4gIHByaXZhdGUgcmVvcmRlckF3YWl0aW5nU2F2ZUZsaXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiTW92ZSB0byBmb2xkZXJcIiBidWxrIGFjdGlvbiDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGRpYWxvZyBvcGVucy4gSG9zdHMgdGhhdCB3YW50IHRvIHJlbmRlciB0aGVpciBvd24gbW9kYWwgc2hvdWxkXG4gICAqIHNldCBgdXNlSW50ZXJuYWxEaWFsb2dzID0gZmFsc2VgIGFuZCBsaXN0ZW4gaGVyZS5cbiAgICovXG4gIEBPdXRwdXQoKSBtb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBzZWxlY3RlZDogYW55W107XG4gICAgY3VycmVudEZvbGRlcklkOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbGRlcnM6IEZvbGRlck5vZGVbXTtcbiAgfT4oKTtcblxuICAvKiogRmlyZXMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIGBzZWxlY3RlZEl0ZW1zYCBjaGFuZ2VzIGZyb20gd2l0aGluIChTZWxlY3QgQWxsIC8gRGlzbWlzcykuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBmb2xkZXIncyBkZWxldGUgYWZmb3JkYW5jZSDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGNvbmZpcm1hdGlvbiBkaWFsb2cgb3BlbnMuIEhvc3RzIG93bmluZyB0aGUgVVggbGlzdGVuIGhlcmUuXG4gICAqIFBheWxvYWQgaW5jbHVkZXMgYHRlc3RDb3VudGAgKyBgaGFzUGFyZW50YCBzbyBob3N0cyBjYW4gcmVuZGVyIHRoZSByaWdodFxuICAgKiBvcHRpb25zIGluIHRoZWlyIG93biBtb2RhbC5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEZWxldGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgcGlja3MgXCJNb3ZlIGZvbGRlclwiIGZyb20gYSBmb2xkZXIgcm93J3MgY29udGV4dCBtZW51IOKAlFxuICAgKiAqYmVmb3JlKiBhbnkgZGlhbG9nIG9wZW5zLiBIb3N0cyBvd25pbmcgdGhlIFVYIGxpc3RlbiBoZXJlIHdpdGhcbiAgICogYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgb3BlbiB0aGVpciBvd24gZm9sZGVyIHBpY2tlci5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGEgZm9sZGVyIG1vdmUgdmlhIHRoZSBpbnRlcm5hbCBwaWNrZXJcbiAgICogKG9yIGltbWVkaWF0ZWx5IHdoZW4gYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgdGhlIGhvc3QgZHJpdmVzIGl0KS5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyTW92ZWRQYXlsb2FkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBwaWNrcyBcIkR1cGxpY2F0ZSBmb2xkZXJcIiBmcm9tIGEgZm9sZGVyIHJvdydzIGNvbnRleHQgbWVudS5cbiAgICogVGhlIGxpYnJhcnkgZG9lc24ndCBvd24gcGVyc2lzdGVuY2UsIHNvIHRoZSBob3N0IGlzIGV4cGVjdGVkIHRvIGNsb25lIHRoZVxuICAgKiBmb2xkZXIncyBzdWJ0cmVlIHNlcnZlci1zaWRlIGFuZCAqcmVmZXJlbmNlKiAobm90IGNvcHkpIHRoZSB0ZXN0IGNhc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkUGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge31cbiAgcHJpdmF0ZSBwZW5kaW5nRmlsdGVyczogYW55O1xuICBwcml2YXRlIGFwcGxpZWRGaWx0ZXJzOiBhbnk7XG4gIHByaXZhdGUgYXV0b1JlZnJlc2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25BdXRvUmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uVmlzaWJpbGl0eUNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGF1dG9SZWZyZXNoSW50ZXJ2YWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQFZpZXdDaGlsZChEeW5hbWljRmlsdGVyQ29tcG9uZW50KSBkeW5hbWljRmlsdGVyQ29tcG9uZW50PzogRHluYW1pY0ZpbHRlckNvbXBvbmVudDtcblxuICAvLyBEZXJpdmVkIGNvbHVtbnMgd2l0aCB2aXNpYmlsaXR5IGFwcGxpZWQuXG4gIGNvbXB1dGVkQ29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLy8gQXV0by1nZW5lcmF0ZWQgdmlzaWJpbGl0eSBjb2x1bW5zIGZyb20gY29sdW1ucyBpbnB1dFxuICB2aXNpYmlsaXR5Q29sdW1uczogQXJyYXk8eyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wdXRlZENvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJpbGl0eSA9IHRoaXMuX2NvbHVtblZpc2liaWxpdHkgfHwge307XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5jb2x1bW5zIHx8IFtdO1xuICAgIGNvbnN0IG1hcHBlZCA9IHNvdXJjZS5tYXAoY29sID0+IHtcbiAgICAgIGlmIChbJ2NoZWNrYm94JywgJ2FjdGlvbnMnXS5pbmNsdWRlcyhjb2wuZmllbGRJZCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3cgPSB2aXNpYmlsaXR5W2NvbC5maWVsZElkXTtcbiAgICAgIHJldHVybiB7IC4uLmNvbCwgaXNTaG93OiBzaG93ICE9PSBmYWxzZSB9O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubW9kdWxhckNvbmZpZz8uc2hvd0ZvbGRlckNvbHVtbiAmJiAhbWFwcGVkLnNvbWUoYyA9PiBjLmZpZWxkSWQgPT09IEZPTERFUl9DT0xVTU5fRklFTERfSUQpKSB7XG4gICAgICBjb25zdCBmb2xkZXJTaG93ID0gdmlzaWJpbGl0eVtGT0xERVJfQ09MVU1OX0ZJRUxEX0lEXTtcbiAgICAgIGNvbnN0IGZvbGRlckNvbDogRHluYW1pY1RhYmxlQ29sdW1uID0ge1xuICAgICAgICAuLi50aGlzLmJ1aWxkRm9sZGVyQ29sdW1uKCksXG4gICAgICAgIGlzU2hvdzogZm9sZGVyU2hvdyAhPT0gZmFsc2UsXG4gICAgICB9O1xuICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgdHJhaWxpbmcgJ2FjdGlvbnMnIGNvbHVtbiB3aGVuIHByZXNlbnQgc28gdGhlIGZvbGRlclxuICAgICAgLy8gY29sdW1uIHJlYWRzIGFzIHRoZSBsYXN0IGRhdGEgY29sdW1uIHJhdGhlciB0aGFuIGFmdGVyIHRoZSBhY3Rpb24gbWVudS5cbiAgICAgIGNvbnN0IGFjdGlvbnNJZHggPSBtYXBwZWQuZmluZEluZGV4KGMgPT4gYy5maWVsZElkID09PSAnYWN0aW9ucycpO1xuICAgICAgaWYgKGFjdGlvbnNJZHggPj0gMCkge1xuICAgICAgICBtYXBwZWQuc3BsaWNlKGFjdGlvbnNJZHgsIDAsIGZvbGRlckNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucHVzaChmb2xkZXJDb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcHV0ZWRDb2x1bW5zID0gbWFwcGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvbGRlckNvbHVtbigpOiBEeW5hbWljVGFibGVDb2x1bW4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZElkOiBGT0xERVJfQ09MVU1OX0ZJRUxEX0lELFxuICAgICAgZmllbGROYW1lOiB0aGlzLm1vZHVsYXJMYWJlbHM/LmZvbGRlckNvbHVtbkxhYmVsIHx8ICdGb2xkZXInLFxuICAgICAgLy8gTGV0cyB0aGUgZHluYW1pYyB0YWJsZSBzb3J0L2ZpbHRlciBvbiB0aGUgcmVzb2x2ZWQgbmFtZSB3aXRob3V0IGdvaW5nXG4gICAgICAvLyB0aHJvdWdoIHJlbmRlcigpIOKAlCBhbHNvIG1ha2VzIGByb3cuZm9sZGVyTmFtZWAgYSBmaXJzdC1jbGFzcyBmaWVsZFxuICAgICAgLy8gYWxvbmdzaWRlIHJvdy5wcmlvcml0eSBldGMuIGZvciBkb3duc3RyZWFtIGNvZGUuXG4gICAgICBmaWVsZFZhbHVlOiAnZm9sZGVyTmFtZScsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIC8vIGlzRGVmYXVsdCA9PT0gZmFsc2UgbWFya3MgdGhlIGNvbHVtbiBhcyBcInVzZXItdG9nZ2xlYWJsZVwiIOKAlCBpdCBzaG93cyB1cFxuICAgICAgLy8gaW4gbWFwVmlzaWJpbGl0eUNvbHVtbnMgYW5kIHRoZXJlZm9yZSBpbiB0aGUgc2V0dGluZ3MgZHJvcGRvd24uXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcmVuZGVyOiAocm93OiBhbnkpID0+IHRoaXMucmVuZGVyRm9sZGVyQ2VsbChyb3cpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVGb2xkZXJOYW1lKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBpZiAocm93ICYmIHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIHtcbiAgICAgIHJldHVybiByb3cuZm9sZGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgY29uc3Qgbm9kZSA9IGZvbGRlcklkICE9IG51bGwgPyB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBmb2xkZXJJZCBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4gbm9kZT8ubmFtZSB8fCB0aGlzLm1vZHVsYXJMYWJlbHM/LnVub3JnYW5pemVkUm93TGFiZWwgfHwgJ1Vub3JnYW5pemVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBkZXJpdmVkIGBmb2xkZXJOYW1lYCB0byBlYWNoIHJvdyB3aGVuIHRoZSBob3N0IGhhc24ndCBzdXBwbGllZFxuICAgKiBvbmUuIE11dGF0ZXMgaW4gcGxhY2Ugc28gdGhlIHZhbHVlIGlzIGF2YWlsYWJsZSBldmVyeXdoZXJlIHRoZSByb3cgZmxvd3NcbiAgICog4oCUIHNvcnQsIGZpbHRlciwgY29sdW1uIHJlbmRlcnMsIGV4cG9ydHMg4oCUIGFsb25nc2lkZSBmaWVsZHMgbGlrZSBwcmlvcml0eS5cbiAgICovXG4gIHByaXZhdGUgZW5yaWNoUm93c1dpdGhGb2xkZXJOYW1lKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaWYgKCFyb3cgfHwgdHlwZW9mIHJvdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIGNvbnRpbnVlO1xuICAgICAgcm93LmZvbGRlck5hbWUgPSB0aGlzLnJlc29sdmVGb2xkZXJOYW1lKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJGb2xkZXJDZWxsKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXNvbHZlRm9sZGVyTmFtZShyb3cpO1xuICAgIGNvbnN0IGVzY2FwZWQgPSBuYW1lLnJlcGxhY2UoL1smPD5cIiddL2csIGNoID0+ICh7XG4gICAgICAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsIFwiJ1wiOiAnJiMzOTsnLFxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbY2hdKTtcbiAgICByZXR1cm4gKFxuICAgICAgYDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRleHQtWyM2RDZENzRdXCI+YCArXG4gICAgICAgIGA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5gICtcbiAgICAgICAgICBgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+YCArXG4gICAgICAgIGA8L3N2Zz5gICtcbiAgICAgICAgYDxzcGFuPiR7ZXNjYXBlZH08L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucyA9IHRoaXMubWFwVmlzaWJpbGl0eUNvbHVtbnMoKTtcbiAgICB0aGlzLnZpc2liaWxpdHlDb2x1bW5zID0gdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBDb250cm9sbGVkIGNvbHVtbiB2aXNpYmlsaXR5OiBwYXJlbnQgY2FuIHNlZWQgYW5kIHB1c2ggdXBkYXRlcy5cbiAgQElucHV0KCkgc2V0IGNvbHVtblZpc2liaWxpdHkoY2ZnOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNmZykge1xuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eSA9IHsgLi4uY2ZnIH07XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGdldCBjb2x1bW5WaXNpYmlsaXR5KCk6IENvbHVtblZpc2liaWxpdHlDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5O1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snaXNFbXB0eVN0YXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ21vZHVsYXJDb25maWcnXSB8fCBjaGFuZ2VzWydtb2R1bGFyTGFiZWxzJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb2xkZXJzJ10gJiYgIWNoYW5nZXNbJ2ZvbGRlcnMnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gRm9sZGVyIG5hbWUgbG9va3VwIGxpdmVzIGluc2lkZSB0aGUgY29sdW1uJ3MgcmVuZGVyKCk7IHJlYnVpbGQgdGhlXG4gICAgICAvLyBjb2x1bW5zIGFycmF5IHNvIHRoZSBkeW5hbWljIHRhYmxlJ3MgT25QdXNoIENEIHBpY2tzIHVwIHRoZSBuZXcgcmVmXG4gICAgICAvLyBhbmQgcmUtaW52b2tlcyByZW5kZXIoKSB3aXRoIHRoZSBsYXRlc3QgZm9sZGVycy4gQWxzbyByZWZyZXNoIGFueVxuICAgICAgLy8gcm93cyB3ZSd2ZSBwcmV2aW91c2x5IGVucmljaGVkIHNvIHNvcnQvZmlsdGVyIG9uIHJvdy5mb2xkZXJOYW1lXG4gICAgICAvLyByZWZsZWN0cyB0aGUgbmV3IGZvbGRlciBsaXN0LlxuICAgICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEZvbGRlcklkJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkRm9sZGVySWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gUGVyIHRoZSBhcHByb3ZlZCBwbGFuOiBjbGVhciBzZWxlY3Rpb24gYW5kIHJlc2V0IHBhZ2luYXRpb24gb24gZm9sZGVyIGNoYW5nZS5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmlld01vZGUnXSAmJiAhY2hhbmdlc1sndmlld01vZGUnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gU3dpdGNoaW5nIGJldHdlZW4gbGlzdCBhbmQgbW9kdWxhciBjaGFuZ2VzIHdoZXRoZXIgdGhlIGZvbGRlciBmaWx0ZXIgYXBwbGllcy5cbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlbXMnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10gJiYgIWNoYW5nZXNbJ3Jlb3JkZXJTYXZpbmcnXS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgbm93U2F2aW5nID0gISFjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSG9zdCBmaW5pc2hlZCBpdHMgYnVsay11cGRhdGUgY2FsbCDigJQgZXhpdCByZW9yZGVyIG1vZGUuXG4gICAgICBpZiAoIW5vd1NhdmluZyAmJiB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwKSB7XG4gICAgICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcblxuICAgIC8vIEluIHNlcnZlci1zaWRlIG1vZGUsIGFzc3VtZSBpbmNvbWluZyBkYXRhIGlzIGFscmVhZHkgYSBwYWdlIHNsaWNlXG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLmZpbHRlcmVkUm93c107XG4gICAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5WaXNpYmlsaXR5KCk7XG4gICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBgZmlsdGVyZWRSb3dzYCBmcm9tIGBkYXRhYCBieSBhcHBseWluZyAoYSkgdGhlIGZpZWxkIGZpbHRlcnMgKHN0YXR1cy9wcmlvcml0eS9ldGMuKVxuICAgKiBhbmQgKGIpIHRoZSBmb2xkZXIgZmlsdGVyIGRlcml2ZWQgZnJvbSBgc2VsZWN0ZWRGb2xkZXJJZGAgKyBgZm9sZGVySWRBY2Nlc3NvcmAuXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRGaWx0ZXJlZFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gdGhpcy5hcHBsaWVkRmlsdGVycyA/PyB7fTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZGF0YS5maWx0ZXIociA9PiB0aGlzLnBhc3NGaWx0ZXJzKGVmZmVjdGl2ZSwgcikgJiYgdGhpcy5wYXNzRm9sZGVyKHIpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFzc0ZvbGRlcihyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIExpc3QgdmlldyBpZ25vcmVzIGZvbGRlciBmaWx0ZXJpbmcgZW50aXJlbHkg4oCUIGJlaGF2ZXMgbGlrZSB0aGUgdHJhZGl0aW9uYWwgZmxhdCB0YWJsZS5cbiAgICBpZiAoIXRoaXMuaXNNb2R1bGFyVmlldykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgLy8gUm9vdCB2aWV3OiBzaG93IG9ubHkgcm93cyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gYW55IGZvbGRlciAodGhlIFwiVW5vcmdhbml6ZWRcIiBidWNrZXQpLlxuICAgIC8vIEZvbGRlciB0aWxlcyBhYm92ZSB0aGUgdGFibGUgYXJlIHRoZSBlbnRyeSBwb2ludCB0byBwZXItZm9sZGVyIGNvbnRlbnRzLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvbGRlcklkID09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmb2xkZXJJZCAhPSBudWxsICYmIFN0cmluZyhmb2xkZXJJZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIG1vZHVsYXIgKGZvbGRlci1hd2FyZSkgVUkuICovXG4gIGdldCBpc01vZHVsYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdNb2RlID09PSAnbW9kdWxhcic7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIElEcyBmcm9tIHNlbGVjdGVkSXRlbXMgKG9iamVjdHMpXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzKCk6IFNldDxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gTnVtYmVyKGl0ZW0uaWQpKS5maWx0ZXIoaWQgPT4gIWlzTmFOKGlkKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHNTZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gSWYgbm8gc2VsZWN0ZWQgSURzLCBjbGVhciBhbGwgc2VsZWN0aW9uIHN0YXRlc1xuICAgICAgaWYgKHRoaXMucGFnZWRSb3dzKSB7XG4gICAgICAgIHRoaXMucGFnZWRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gc3RhdGUgYmFzZWQgb24gc2VsZWN0ZWRJdGVtc1xuICAgIGlmICh0aGlzLnBhZ2VkUm93cykge1xuICAgICAgdGhpcy5wYWdlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93ICYmIHJvdy5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHJvdyBhcyBhbnkpLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZElkc1NldC5oYXMoTnVtYmVyKHJvdy5pZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBmaWx0ZXJlZFJvd3MgZm9yIGNvbnNpc3RlbmN5XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGlmIChyb3cgJiYgcm93LmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IHNlbGVjdGVkSWRzU2V0LmhhcyhOdW1iZXIocm93LmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBDYWNoZSB2aXNpYmlsaXR5IGNvbHVtbnMgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IGFycmF5cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnMgPSB0aGlzLm1hcFZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgLy8gU2VlZCB2aXNpYmlsaXR5IHN0YXRlIGZyb20gZWFjaCBjb2x1bW4ncyBpc1Nob3cgKGRlZmF1bHQgdG8gdHJ1ZSkgc28gY29uc3VtZXJzXG4gICAgLy8gY2FuIHByZS1hcHBseSBwZXJzaXN0ZWQgcHJlZmVyZW5jZXMgdmlhIGNvbHVtbnNbaV0uaXNTaG93LlxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucykge1xuICAgICAgaWYgKHRoaXMuX2NvbHVtblZpc2liaWxpdHlbY29sLmlkXSAhPT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHNyY0NvbCA9IHNvdXJjZS5maW5kKGMgPT4gYy5maWVsZElkID09PSBjb2wuaWQpO1xuICAgICAgaWYgKHNyY0NvbCkge1xuICAgICAgICAvLyBIb3N0LXN1cHBsaWVkIGNvbHVtbiDigJQgaG9ub3VyIGl0cyBpc1Nob3cgZXhhY3RseSwgaW5jbHVkaW5nIGZvciB0aGVcbiAgICAgICAgLy8gZm9sZGVyIGNvbHVtbi4gSG9zdHMgd2FudGluZyB2aWV3LW1vZGUtYXdhcmUgZGVmYXVsdHMgc2hvdWxkIHNldFxuICAgICAgICAvLyBpc1Nob3cgdGhlbXNlbHZlcy5cbiAgICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gc3JjQ29sLmlzU2hvdyAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkge1xuICAgICAgICAvLyBBdXRvLWluamVjdGVkIGZvbGRlciBjb2x1bW4gKGhvc3QgZGlkIG5vdCBzdXBwbHkgb25lKTogZGVmYXVsdCB0b1xuICAgICAgICAvLyB2aXNpYmxlIGluIGxpc3QgdmlldywgaGlkZGVuIGluIG1vZHVsYXIgdmlldy4gVGhlIHVzZXIncyB0b2dnbGVcbiAgICAgICAgLy8gcGVyc2lzdHMgYWNyb3NzIHZpZXdNb2RlIGZsaXBzIG9uY2Ugc2VlZGVkLlxuICAgICAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5W2NvbC5pZF0gPSB0aGlzLnZpZXdNb2RlID09PSAnbGlzdCc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgYW55Um93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzZWxlY3RlZCBpdGVtcyAoZWl0aGVyIG9uIGN1cnJlbnQgcGFnZSBvciBhY3Jvc3MgYWxsIHBhZ2VzIHZpYSBzZWxlY3RlZEl0ZW1zKVxuICAgIGNvbnN0IGhhc1NlbGVjdGVkT25QYWdlID0gISEodGhpcy5wYWdlZFJvd3MgJiYgdGhpcy5wYWdlZFJvd3Muc29tZShyID0+ICEhKHIgYXMgYW55KS5pc1NlbGVjdGVkKSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0ZWRBY3Jvc3NQYWdlcyA9IHNlbGVjdGVkSWRzU2V0LnNpemUgPiAwO1xuICAgIHJldHVybiBoYXNTZWxlY3RlZE9uUGFnZSB8fCBoYXNTZWxlY3RlZEFjcm9zc1BhZ2VzO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3RlZEl0ZW1zKCk6IGFueVtdIHtcbiAgICAvLyBJZiBzZWxlY3RlZEl0ZW1zIChmdWxsIG9iamVjdHMpIGFyZSBwcm92aWRlZCwgdXNlIHRoZW0gZGlyZWN0bHlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIHNlbGVjdGVkIGl0ZW1zIGFyZSByZXR1cm5lZCwgaW5jbHVkaW5nIHRob3NlIGZyb20gb3RoZXIgcGFnZXNcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogRm9yIGNsaWVudC1zaWRlIHBhZ2luYXRpb24gb3Igd2hlbiBzZWxlY3RlZEl0ZW1zIGlzIG5vdCBwcm92aWRlZCxcbiAgICAvLyBmaWx0ZXIgcGFnZWRSb3dzIHRvIGdldCBzZWxlY3RlZCBpdGVtcyBmcm9tIGN1cnJlbnQgcGFnZSBvbmx5XG4gICAgaWYgKCF0aGlzLnBhZ2VkUm93cyB8fCB0aGlzLnBhZ2VkUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZElkc1NldCA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKTtcbiAgICBcbiAgICAvLyBGaWx0ZXIgcm93cyB0aGF0IGFyZSBzZWxlY3RlZFxuICAgIHJldHVybiB0aGlzLnBhZ2VkUm93c1xuICAgICAgLmZpbHRlcihyID0+IHtcbiAgICAgICAgaWYgKCFyIHx8IHIuaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByb3dJZCA9IE51bWJlcihyLmlkKTtcbiAgICAgICAgLy8gSW5jbHVkZSBpZiBlaXRoZXI6XG4gICAgICAgIC8vIDEuIFRoZSByb3cgaGFzIGlzU2VsZWN0ZWQgPSB0cnVlIChjdXJyZW50IHBhZ2Ugc2VsZWN0aW9uKVxuICAgICAgICAvLyAyLiBUaGUgcm93J3MgSUQgaXMgaW4gc2VsZWN0ZWRJdGVtcyAoc2VsZWN0ZWQgb24gb3RoZXIgcGFnZXMgb3IgcmVzdG9yZWQgc2VsZWN0aW9uKVxuICAgICAgICByZXR1cm4gISEociBhcyBhbnkpLmlzU2VsZWN0ZWQgfHwgc2VsZWN0ZWRJZHNTZXQuaGFzKHJvd0lkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWN0aW9uQ2xpY2soZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2FjdGlvbiB0b29sYmFyJywgZGF0YSk7XG4gIH1cblxuICB2aWV3KGlkOiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnVmlldycsIGlkKTtcbiAgfVxuXG4gIGVkaXQocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRWRpdCcsIHJvdyk7XG4gIH1cblxuICBkZWxldGUocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlJywgcm93KTtcbiAgfVxuXG4gIHRvZ2dsZUZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dGaWx0ZXJQYW5lbCA9ICF0aGlzLnNob3dGaWx0ZXJQYW5lbDtcbiAgfVxuXG4gIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjZmc6IENvbHVtblZpc2liaWxpdHlDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5ID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KHsgLi4uY2ZnIH0pO1xuICB9XG5cbiAgb25BdXRvUmVmcmVzaENoYW5nZShpbnRlcnZhbE1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbCA9IGludGVydmFsTXM7XG4gICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKGludGVydmFsTXMpO1xuICAgIHRoaXMuYXV0b1JlZnJlc2hJbnRlcnZhbENoYW5nZS5lbWl0KGludGVydmFsTXMpO1xuICAgIHRoaXMudHJpZ2dlclJlbG9hZCgpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWYWx1ZSBjaGFuZ2VkJywgdmFsdWUpO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBzZWFyY2godmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWFyY2gnLCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhcmVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDbGVhcmVkJyk7XG4gIH1cblxuICBvbkVtcHR5QWN0aW9uKGFjdGlvbjogYW55KSB7XG4gICAgaWYgKGFjdGlvbj8ubGFiZWwgPT09ICdTaG93IGZpbHRlcnMnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyc0NoYW5nZWQoY3VycmVudDogYW55KTogdm9pZCB7XG4gICAgLy8gRGVmZXIgYXBwbHlpbmcgZmlsdGVycyBhbmQgdXBkYXRpbmcgY2hpcHMgdW50aWwgQXBwbHkgRmlsdGVyIGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gY3VycmVudDtcbiAgfVxuXG4gIG9uRmlsdGVyc0FwcGxpZWQoYXBwbGllZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmlsdGVyUGFuZWwgPSBmYWxzZTtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBhcHBsaWVkID8/IHRoaXMucGVuZGluZ0ZpbHRlcnMgPz8ge307XG4gICAgdGhpcy5hcHBsaWVkRmlsdGVycyA9IGVmZmVjdGl2ZTtcbiAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICBjb25zdCBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICAgIGlmIChlZmZlY3RpdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVmZmVjdGl2ZSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlZmZlY3RpdmVba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlciBjb25maWcgaXRlbSBmb3IgdGhpcyBrZXlcbiAgICAgICAgY29uc3QgZmlsdGVyQ29uZmlnSXRlbSA9IHRoaXMuZmlsdGVyQ29uZmlnPy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWx0ZXJDb25maWdJdGVtPy5vcHRpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgZGlzcGxheSB0ZXh0IGZyb20gb3B0aW9uc1xuICAgICAgICBjb25zdCBnZXREaXNwbGF5VGV4dCA9ICh2YWw6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgLy8gSWYgdmFsdWUgaXMgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCBuYW1lL2xhYmVsLCB1c2UgaXRcbiAgICAgICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICh2YWwubmFtZSB8fCB2YWwubGFiZWwgfHwgdmFsLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5uYW1lID8/IHZhbC5sYWJlbCA/PyBTdHJpbmcodmFsLnZhbHVlID8/IHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG9wdGlvbiBpbiB0aGUgY29uZmlnXG4gICAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0SWQgPSBvcHQuaWQgPz8gb3B0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgb3B0VmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB2YWxTdHIgPSBTdHJpbmcodmFsKTtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcob3B0SWQpID09PSB2YWxTdHIgfHwgU3RyaW5nKG9wdFZhbHVlKSA9PT0gdmFsU3RyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24ubmFtZSA/PyBvcHRpb24ubGFiZWwgPz8gU3RyaW5nKG9wdGlvbi52YWx1ZSA/PyB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB0aGUgcmF3IHZhbHVlXG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgICAgbGV0IGxhYmVsID0gZmlsdGVyQ29uZmlnSXRlbT8ubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0ZXh0ID0gdmFsdWUubWFwKCh2OiBhbnkpID0+IGdldERpc3BsYXlUZXh0KHYpKS5qb2luKCcsICcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBpZiAoJ3N0YXJ0JyBpbiB2YWx1ZSB8fCAnZW5kJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHZhbHVlLnN0YXJ0ID8gbmV3IERhdGUodmFsdWUuc3RhcnQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBlID0gdmFsdWUuZW5kID8gbmV3IERhdGUodmFsdWUuZW5kKS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgdGV4dCA9IFtzLCBlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpcHMucHVzaCh7IGtleSwgbGFiZWwsIHRleHQsIGZ1bGxUZXh0OiB0ZXh0LCBoYXNNb3JlOiB0ZXh0Lmxlbmd0aCA+IDMwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoaXBzID0gY2hpcHM7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaGFuZGxlUmVzZXRGaWx0ZXJDbGljaygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBjaGlwcyBhbmQgcmVzZXQgZmlsdGVyZWQgZGF0YSB3aGVuIHJlc2V0IGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbGllZEZpbHRlcnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMub25SZXNldEZpbHRlckNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZVJlZnJlc2hDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9uQXV0b1JlZnJlc2hDbGljay5lbWl0KCk7XG4gICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5vblJlbG9hZC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQXV0b1JlZnJlc2goaW50ZXJ2YWxNczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckF1dG9SZWZyZXNoKCk7XG4gICAgaWYgKGludGVydmFsTXMgJiYgaW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gICAgICB9LCBpbnRlcnZhbE1zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQXV0b1JlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b1JlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZWZyZXNoVGltZXIpO1xuICAgICAgdGhpcy5hdXRvUmVmcmVzaFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBdXRvUmVmcmVzaCgpO1xuICB9XG5cbiAgb25QYWdpbmF0ZShlOiB7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGUucGFnZUluZGV4O1xuICAgIHRoaXMucGFnZVNpemUgPSBlLnBhZ2VTaXplO1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHsgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gIH1cblxuICBvblJlbW92ZUNoaXAoY2hpcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IHRoaXMuY2hpcHMuZmlsdGVyKGMgPT4gYyAhPT0gY2hpcCk7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IGNvbXBvbmVudCAoc2FtZSBwYXR0ZXJuIGFzIGV4ZWN1dGlvbiB0YWIpXG4gICAgdGhpcy5yZW1vdmVDaGlwLmVtaXQoY2hpcCk7XG4gIH1cblxuICBvbkNsZWFyQWxsQ2hpcHMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHRoZSBkeW5hbWljLWZpbHRlciBjb21wb25lbnQgZm9ybSB3aGVuIGNsZWFyaW5nIGFsbCBjaGlwc1xuICAgIGlmICh0aGlzLmR5bmFtaWNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0ZpbHRlckNvbXBvbmVudC5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICAvLyBTZXJ2ZXIgbW9kZTogcGFyZW50IHN1cHBsaWVzIGFscmVhZHktcGFnaW5hdGVkIGRhdGFcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gWy4uLnRoaXMuZmlsdGVyZWRSb3dzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucGFnZWRSb3dzID0gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcFZpc2liaWxpdHlDb2x1bW5zKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgaXRlbXMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKVxuICAgICAgLmZpbHRlcihjID0+IGMuaXNEZWZhdWx0ID09PSBmYWxzZSlcbiAgICAgIC5tYXAoYyA9PiAoeyBpZDogYy5maWVsZElkLCBsYWJlbDogYy5maWVsZE5hbWUgfHwgYy5maWVsZElkIH0pKTtcbiAgICBpZiAodGhpcy5tb2R1bGFyQ29uZmlnPy5zaG93Rm9sZGVyQ29sdW1uICYmICFpdGVtcy5zb21lKGkgPT4gaS5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkpIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBpZDogRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscz8uZm9sZGVyQ29sdW1uTGFiZWwgfHwgJ0ZvbGRlcicsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IGFueSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdHMgPSBEYXRlLnBhcnNlKGQpO1xuICAgIHJldHVybiBpc05hTih0cykgPyBudWxsIDogdHM7XG4gIH1cblxuICBwcml2YXRlIHBhc3NGaWx0ZXJzKGZpbHRlcnM6IGFueSwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybiB0cnVlO1xuICAgIGlmIChmaWx0ZXJzLnN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGZpbHRlcnMuc3RhdHVzKSAmJiBmaWx0ZXJzLnN0YXR1cy5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy5zdGF0dXMuaW5jbHVkZXMocm93LnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMucHJpb3JpdHkgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXJzLnByaW9yaXR5KSAmJiBmaWx0ZXJzLnByaW9yaXR5Lmxlbmd0aCkge1xuICAgICAgaWYgKCFmaWx0ZXJzLnByaW9yaXR5LmluY2x1ZGVzKHJvdy5wcmlvcml0eU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnRlc3RUeXBlICYmIEFycmF5LmlzQXJyYXkoZmlsdGVycy50ZXN0VHlwZSkgJiYgZmlsdGVycy50ZXN0VHlwZS5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy50ZXN0VHlwZS5pbmNsdWRlcyhyb3cudGVzdFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLmNyZWF0ZWRfZGF0ZSAmJiAoZmlsdGVycy5jcmVhdGVkX2RhdGUuc3RhcnQgfHwgZmlsdGVycy5jcmVhdGVkX2RhdGUuZW5kKSkge1xuICAgICAgY29uc3Qgc3RhcnRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5zdGFydCk7XG4gICAgICBjb25zdCBlbmRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5lbmQpO1xuICAgICAgY29uc3Qgcm93VHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUocm93LmNyZWF0ZWRBdCk7XG4gICAgICBpZiAocm93VHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsICYmIHJvd1RzIDwgc3RhcnRUcykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZW5kVHMgIT0gbnVsbCAmJiByb3dUcyA+IGVuZFRzKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJhY2tCeVRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlEcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlTZWxlY3REcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIEV4cG9ydCBtb2RhbCBzdGF0ZVxuICBpc0V4cG9ydE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGV4cG9ydENvZGVDbGljaygpOiB2b2lkIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgaXRlbXNcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtcztcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZFxuICAgICAgdGhpcy5vbkV4cG9ydENsaWNrLmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZUV4cG9ydE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIG9uRXhwb3J0TW9kYWxFeHBvcnQocmVzdWx0OiB7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrOiAnV0VCRFJJVkVSX0lPJyB8ICdTRUxFTklVTV9KQVZBJyB9KTogdm9pZCB7XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHdpdGggZXhwb3J0IHJlc3VsdFxuICAgIHRoaXMub25FeHBvcnRDbGljay5lbWl0KHtcbiAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgZW1haWxzOiByZXN1bHQuZW1haWxzLFxuICAgICAgZnJhbWV3b3JrOiByZXN1bHQuZnJhbWV3b3JrLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQ2FzZXNGb3JFeHBvcnQoKTogQXJyYXk8eyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgbmFtZTogaXRlbS5uYW1lIHx8IGl0ZW0udGl0bGUgfHwgJ1VubmFtZWQnXG4gICAgfSkpO1xuICB9XG4gIGdldCBhcnJvd0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdjcWEtdy00JyxcbiAgICAgICdjcWEtaC00JyxcbiAgICAgICdjcWEtcmVsYXRpdmUnLFxuICAgICAgJ2NxYS10cmFuc2l0aW9uLXRyYW5zZm9ybSdcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuc2hvd0ZpbHRlclBhbmVsKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjcWEtcm90YXRlLTE4MCcpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlQ2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaGVscGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZsYXQgbGlzdCBvZiByb290LWxldmVsIGZvbGRlcnMgZm9yIHRoZSBcIk9yZ2FuaXplZFwiIGdyaWQgb24gdGhlIHJvb3Qgdmlldy5cbiAgICogUHJlZmVycyB0aGUgaG9zdC1wcm92aWRlZCBgcm9vdEZvbGRlcnNgIHNuYXBzaG90IHdoZW4gc2V0IOKAlCBhbmFsb2dvdXMgdG9cbiAgICogaG93IGBzdWJmb2xkZXJUaWxlc2AgZmFsbHMgYmFjayB0byBgc2VsZWN0ZWRGb2xkZXJOb2RlYCBhbmQgYGJyZWFkY3J1bWJUcmFpbGBcbiAgICogZmFsbHMgYmFjayB0byBgc2VsZWN0ZWRGb2xkZXJUcmFpbGAgd2hlbiBgZm9sZGVyc2AgaGFzIGJlZW4gc3dhcHBlZCB0byBhXG4gICAqIHNlYXJjaC1yZXN1bHRzIGxpc3QuIEZhbGxzIGJhY2sgdG8gYHRoaXMuZm9sZGVyc2Agb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0IHJvb3RGb2xkZXJUaWxlcygpOiBGb2xkZXJOb2RlW10ge1xuICAgIGlmICh0aGlzLnJvb3RGb2xkZXJzICE9IG51bGwpIHJldHVybiB0aGlzLnJvb3RGb2xkZXJzO1xuICAgIHJldHVybiB0aGlzLmZvbGRlcnMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3ViZm9sZGVycyBvZiB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciAoZm9yIHRoZSBcIlN1YmZvbGRlcnMgaW4gLi4uXCIgZ3JpZCkuXG4gICAqL1xuICBnZXQgc3ViZm9sZGVyVGlsZXMoKTogRm9sZGVyTm9kZVtdIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiBbXTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgdGhpcy5zZWxlY3RlZEZvbGRlcklkKTtcbiAgICBpZiAobm9kZT8uY2hpbGRyZW4/Lmxlbmd0aCkgcmV0dXJuIG5vZGUuY2hpbGRyZW47XG4gICAgLy8gRmFsbGJhY2s6IGhvc3QtcHJvdmlkZWQgc25hcHNob3Qgd2hlbiB0aGUgbGl2ZSB0cmVlIGRvZXNuJ3QgY29udGFpblxuICAgIC8vIHRoZSBzZWxlY3Rpb24gKHJlZnJlc2gtcmVzdG9yZSBiZWZvcmUgYW5jZXN0b3JzIGFyZSBsb2FkZWQsIG9yIHNpZGViYXJcbiAgICAvLyBzZWFyY2ggd2hlcmUgYGZvbGRlcnNgIGhvbGRzIG9ubHkgdGhlIG1hdGNoZWQgcmVzdWx0cykuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlICYmXG4gICAgICAgIFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZS5pZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvbGRlck5vZGUuY2hpbGRyZW4gPz8gW107XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhZGNydW1iIHRyYWlsIGZyb20gXCJBbGwgZm9sZGVyc1wiIGRvd24gdG8gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIuXG4gICAqL1xuICBnZXQgYnJlYWRjcnVtYlRyYWlsKCk6IEZvbGRlck5vZGVbXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gW107XG4gICAgY29uc3QgdHJhaWw6IEZvbGRlck5vZGVbXSA9IFtdO1xuICAgIHRoaXMuYnVpbGRUcmFpbCh0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCwgdHJhaWwpO1xuICAgIGlmICh0cmFpbC5sZW5ndGgpIHJldHVybiB0cmFpbDtcbiAgICAvLyBGYWxsYmFjazogaG9zdC1wcm92aWRlZCBzbmFwc2hvdCBzdXJ2aXZlcyBzd2FwcyBvZiBgdGhpcy5mb2xkZXJzYCAodGhlXG4gICAgLy8gY2Fub25pY2FsIGNhc2UgaXMgc2lkZWJhciBzZWFyY2gsIHdoZXJlIHRoZSBsaXZlIHdhbGsgd29uJ3QgZmluZCB0aGVcbiAgICAvLyBzZWxlY3RlZCBmb2xkZXIncyBhbmNlc3RvcnMgYW1vbmcgdGhlIGZsYXQgcmVzdWx0IHNldCkuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXJUcmFpbCA/PyBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRUcmFpbChub2RlczogRm9sZGVyTm9kZVtdLCB0YXJnZXRJZDogbnVtYmVyLCBhY2M6IEZvbGRlck5vZGVbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgYWNjLnB1c2gobik7XG4gICAgICAvLyBVc2UgU3RyaW5nKCkgY29lcmNpb24gZm9yIHNhZmV0eSBpbiBjYXNlIGlkcyBhcnJpdmUgYXMgZWl0aGVyIG51bWJlciBvclxuICAgICAgLy8gc3RyaW5nIGZyb20gZGlmZmVyZW50IEFQSS90ZXN0IGRhdGEgc2hhcGVzIChlLmcuIHJhdyBKU09OIHBhcnNlIHJlc3VsdHMpLlxuICAgICAgaWYgKFN0cmluZyhuLmlkKSA9PT0gU3RyaW5nKHRhcmdldElkKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobi5jaGlsZHJlbiAmJiB0aGlzLmJ1aWxkVHJhaWwobi5jaGlsZHJlbiwgdGFyZ2V0SWQsIGFjYykpIHJldHVybiB0cnVlO1xuICAgICAgYWNjLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGb2xkZXIobm9kZXM6IEZvbGRlck5vZGVbXSwgdGFyZ2V0SWQ6IG51bWJlcik6IEZvbGRlck5vZGUgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGlmIChTdHJpbmcobi5pZCkgPT09IFN0cmluZyh0YXJnZXRJZCkpIHJldHVybiBuO1xuICAgICAgY29uc3QgZm91bmQgPSBuLmNoaWxkcmVuID8gdGhpcy5maW5kRm9sZGVyKG4uY2hpbGRyZW4sIHRhcmdldElkKSA6IG51bGw7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIFwicm9vdFwiIHZpZXcgKG5vIGZvbGRlciBzZWxlY3RlZCkuIENvbnRyb2xzIHdoaWNoXG4gICAqIHNlY3Rpb25zIHJlbmRlciBvbiB0aGUgcmlnaHQtaGFuZCBwYW5lLlxuICAgKi9cbiAgZ2V0IGlzUm9vdFZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50bHktc2VsZWN0ZWQgZm9sZGVyIG5vZGUgKG9yIG51bGwgYXQgcm9vdCkuICovXG4gIGdldCBjdXJyZW50Rm9sZGVyTm9kZSgpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAvLyBXYWxrIHRoZSB2aXNpYmxlIHRyZWUgZmlyc3Q7IGZhbGwgYmFjayB0byB0aGUgaG9zdC1wcm92aWRlZCBvdmVycmlkZVxuICAgIC8vIHdoZW4gdGhlIGxvb2t1cCBtaXNzZXMgKGUuZy4gZHVyaW5nIHNpZGViYXIgc2VhcmNoLCB3aGVuIGBmb2xkZXJzYFxuICAgIC8vIGhvbGRzIG9ubHkgbWF0Y2hlZCByZXN1bHRzIGFuZCB0aGUgc2VsZWN0ZWQgZm9sZGVyIGlzbid0IGFtb25nIHRoZW0pLlxuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgdGhpcy5zZWxlY3RlZEZvbGRlcklkKTtcbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlck5vZGUgJiYgU3RyaW5nKHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlLmlkKSA9PT0gU3RyaW5nKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQ291bnQgb2YgdGVzdCBjYXNlcyBkaXJlY3RseSB1bmRlciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciAoZXhjbHVkaW5nIGRlc2NlbmRhbnRzKS5cbiAgICogIFJlYWRzIGBGb2xkZXJOb2RlLmNvdW50YCBzbyB0aGUgaGVhZGVyIGJhZGdlIG1hdGNoZXMgdGhlIHNpZGViYXIgcm93IGNvdW50XG4gICAqICAoZm9sZGVyLXNpZGViYXIuY29tcG9uZW50Lmh0bWwgcmVuZGVycyB0aGUgc2FtZSBgcm93Lm5vZGUuY291bnRgKS4gVXNpbmdcbiAgICogIGBmaWx0ZXJlZFJvd3MubGVuZ3RoYCBoZXJlIHdvdWxkIG9ubHkgcmVmbGVjdCB0aGUgY3VycmVudGx5LXJlbmRlcmVkIHBhZ2UuICovXG4gIGdldCBjdXJyZW50Rm9sZGVyRGlyZWN0Q291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGb2xkZXJOb2RlPy5jb3VudCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGVtcHR5LXN0YXRlIHNsb3Qgd2hlbiB0aGUgaG9zdCBleHBsaWNpdGx5IG9wdHMgaW4sIE9SIHdoZW4gdGhlXG4gICAqIHRhYmxlIHdvdWxkIG90aGVyd2lzZSByZW5kZXIgYmxhbmsgKG5vIGxvYWRpbmcgKyBubyByb3dzKS4gVXNpbmcgYSBkZXJpdmVkXG4gICAqIGZsYWcga2VlcHMgdGhlIGhvc3QgY29udHJhY3QgaWRlbnRpY2FsIHRvIGBjcWEtdGFibGUtdGVtcGxhdGVgIHdoaWxlIGxldHRpbmdcbiAgICogdGhlIG1vZHVsYXIgdmlldyBzaG93IFwiTm8gVGVzdCBDYXNlIEZvdW5kXCIgb3V0IG9mIHRoZSBib3gg4oCUIHRoZSBlYXJsaWVyIGFzay5cbiAgICovXG4gIGdldCBlZmZlY3RpdmVJc0VtcHR5U3RhdGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eVN0YXRlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1RhYmxlTG9hZGluZyB8fCB0aGlzLmlzVGFibGVEYXRhTG9hZGluZykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhdGhpcy5wYWdlZFJvd3MgfHwgdGhpcy5wYWdlZFJvd3MubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIHRoZSBob3N0LXByb3ZpZGVkIGBlbXB0eVN0YXRlQ29uZmlnYCB3aGVuIHRoZSBob3N0IGZsYWdnZWQgdGhlIHN0YXRlXG4gICAqIGl0c2VsZjsgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gYSBsaWJyYXJ5LW93bmVkIFwiTm8gVGVzdCBDYXNlIEZvdW5kXCIgY29uZmlnXG4gICAqIGRyaXZlbiBieSBgbW9kdWxhckxhYmVsc2AuXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZygpOiBFbXB0eVN0YXRlQ29uZmlnIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5U3RhdGUpIHJldHVybiB0aGlzLmVtcHR5U3RhdGVDb25maWc7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMuZW1wdHlOb1Rlc3RzSW5Gb2xkZXJUaXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1vZHVsYXJMYWJlbHMuZW1wdHlOb1Rlc3RzSW5Gb2xkZXJEZXNjcmlwdGlvbixcbiAgICAgIGltYWdlVXJsOiBFTVBUWV9TVEFURV9JTUFHRVMuVEVTVF9DQVNFLFxuICAgICAgYWN0aW9uczogW10sXG4gICAgfTtcbiAgfVxuXG4gIG9uRm9sZGVyU2VsZWN0ZWQoaWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPSBpZDtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQoaWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25Gb2xkZXJFeHBhbnNpb25Ub2dnbGVkKGV2ZW50OiB7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBjb25zdCBzZXQgPSBuZXcgU2V0KHRoaXMuZXhwYW5kZWRGb2xkZXJJZHMgfHwgW10pO1xuICAgIGlmIChldmVudC5leHBhbmRlZCkge1xuICAgICAgc2V0LmFkZChldmVudC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldC5kZWxldGUoZXZlbnQuaWQpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuZGVkRm9sZGVySWRzID0gQXJyYXkuZnJvbShzZXQpO1xuICAgIHRoaXMuZm9sZGVyRXhwYW5zaW9uVG9nZ2xlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBUcmFja3MgdGhlIGBmb2xkZXJzLmxlbmd0aGAgYXQgd2hpY2ggd2UgbGFzdCBlbWl0dGVkIGByb290TG9hZE1vcmVSZXF1ZXN0ZWRgXG4gICAqICBmcm9tIHRoZSBPcmdhbml6ZWQgZ3JpZCBzY3JvbGwsIHNvIHJhcGlkIHNjcm9sbCBldmVudHMgZG9uJ3Qgc3BhbSB0aGUgaG9zdFxuICAgKiAgYmVmb3JlIGl0IGhhcyBoYWQgYSBjaGFuY2UgdG8gYXBwZW5kIHRoZSBuZXh0IHBhZ2UuICovXG4gIHByaXZhdGUgbGFzdFJvb3RHcmlkTG9hZEF0OiBudW1iZXIgPSAtMTtcbiAgLyoqIFRyYWNrcyB0aGUgYGN1cnJlbnRGb2xkZXJOb2RlLmNoaWxkcmVuLmxlbmd0aGAgYXQgd2hpY2ggd2UgbGFzdCBlbWl0dGVkXG4gICAqICBgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWRgIGZyb20gdGhlIFN1YmZvbGRlcnMgZ3JpZCBzY3JvbGwsIGZvciB0aGUgc2FtZVxuICAgKiAgcmVhc29uIGFzIGBsYXN0Um9vdEdyaWRMb2FkQXRgLiAqL1xuICBwcml2YXRlIGxhc3RTdWJmb2xkZXJHcmlkTG9hZEF0OiBudW1iZXIgPSAtMTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR1JJRF9TQ1JPTExfTE9BRF9USFJFU0hPTERfUFggPSA5NjtcblxuICAvKiogSG9yaXpvbnRhbC1zY3JvbGwgaGFuZGxlciBmb3IgdGhlIFwiT3JnYW5pemVkXCIgcm9vdCB0aWxlcy4gRW1pdHNcbiAgICogIGByb290TG9hZE1vcmVSZXF1ZXN0ZWRgIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyB3aXRoaW5cbiAgICogIGBHUklEX1NDUk9MTF9MT0FEX1RIUkVTSE9MRF9QWGAgb2YgdGhlIHJpZ2h0IGVkZ2UgQU5EIG1vcmUgcm9vdHMgYXJlXG4gICAqICBhdmFpbGFibGUgb24gdGhlIGJhY2tlbmQuIFRocm90dGxlZCBieSBgbGFzdFJvb3RHcmlkTG9hZEF0YC5cbiAgICogIFVzZXMgYHJvb3RGb2xkZXJUaWxlcy5sZW5ndGhgIChub3QgYGZvbGRlcnMubGVuZ3RoYCkgc28gdGhlIGdhdGUgc3RheXNcbiAgICogIGNvcnJlY3Qgd2hlbiBgcm9vdEZvbGRlcnNgIGRlY291cGxlcyB0aGUgT3JnYW5pemVkIGdyaWQgZnJvbSB0aGVcbiAgICogIHNlYXJjaC1maWx0ZXJlZCBgZm9sZGVyc2AgaW5wdXQuICovXG4gIG9uUm9vdEdyaWRTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5yb290Rm9sZGVyVGlsZXMubGVuZ3RoO1xuICAgIGlmIChsb2FkZWQgPj0gdGhpcy5yb290VG90YWwpIHJldHVybjtcbiAgICBpZiAobG9hZGVkID09PSB0aGlzLmxhc3RSb290R3JpZExvYWRBdCkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgZGlzdGFuY2VGcm9tUmlnaHQgPSBlbC5zY3JvbGxXaWR0aCAtIChlbC5zY3JvbGxMZWZ0ICsgZWwuY2xpZW50V2lkdGgpO1xuICAgIGlmIChkaXN0YW5jZUZyb21SaWdodCA+IE1vZHVsYXJUYWJsZVRlbXBsYXRlQ29tcG9uZW50LkdSSURfU0NST0xMX0xPQURfVEhSRVNIT0xEX1BYKSByZXR1cm47XG4gICAgdGhpcy5sYXN0Um9vdEdyaWRMb2FkQXQgPSBsb2FkZWQ7XG4gICAgdGhpcy5yb290TG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEhvcml6b250YWwtc2Nyb2xsIGhhbmRsZXIgZm9yIHRoZSBcIlN1YmZvbGRlcnMgaW4gWFwiIHRpbGVzLiBFbWl0c1xuICAgKiAgYGZvbGRlckxvYWRNb3JlUmVxdWVzdGVkKHsgaWQ6IHNlbGVjdGVkRm9sZGVySWQsIG5leHRQYWdlIH0pYCB3aGVuIHRoZVxuICAgKiAgdXNlciBzY3JvbGxzIHdpdGhpbiB0aHJlc2hvbGQgb2YgdGhlIHJpZ2h0IGVkZ2UgQU5EIHRoZSBhY3RpdmUgZm9sZGVyXG4gICAqICBoYXMgbW9yZSBjaGlsZHJlbiBvbiB0aGUgYmFja2VuZCB0aGFuIGhhdmUgYmVlbiBsb2FkZWQuICovXG4gIG9uU3ViZm9sZGVyR3JpZFNjcm9sbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Rm9sZGVyTm9kZTtcbiAgICBpZiAoIW5vZGUgfHwgdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybjtcbiAgICBjb25zdCBsb2FkZWQgPSBub2RlLmNoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICBjb25zdCB0b3RhbCA9IG5vZGUudG90YWxDaGlsZHJlbiA/PyBsb2FkZWQ7XG4gICAgaWYgKGxvYWRlZCA+PSB0b3RhbCkgcmV0dXJuO1xuICAgIGlmIChsb2FkZWQgPT09IHRoaXMubGFzdFN1YmZvbGRlckdyaWRMb2FkQXQpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVJpZ2h0ID0gZWwuc2Nyb2xsV2lkdGggLSAoZWwuc2Nyb2xsTGVmdCArIGVsLmNsaWVudFdpZHRoKTtcbiAgICBpZiAoZGlzdGFuY2VGcm9tUmlnaHQgPiBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudC5HUklEX1NDUk9MTF9MT0FEX1RIUkVTSE9MRF9QWCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdFN1YmZvbGRlckdyaWRMb2FkQXQgPSBsb2FkZWQ7XG4gICAgY29uc3QgbmV4dFBhZ2UgPSAobm9kZS5sb2FkZWRQYWdlcyA/PyAtMSkgKyAxO1xuICAgIHRoaXMuZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCh7IGlkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQsIG5leHRQYWdlIH0pO1xuICB9XG5cbiAgb25Gb2xkZXJDcmVhdGVkKHBheWxvYWQ6IEZvbGRlckNyZWF0ZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5mb2xkZXJDcmVhdGVkLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICBvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZChwYXlsb2FkOiB7IHBhcmVudElkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICAvLyBFbWl0IHRoZSBcInJlcXVlc3RlZFwiIGV2ZW50IGZpcnN0IHNvIGEgaG9zdCBjYW4gaW50ZXJjZXB0IHdoZW4gaXQgb3ducyB0aGUgVVguXG4gICAgdGhpcy5mb2xkZXJDcmVhdGVSZXF1ZXN0ZWQuZW1pdChwYXlsb2FkKTtcbiAgICBpZiAoIXRoaXMudXNlSW50ZXJuYWxEaWFsb2dzKSByZXR1cm47XG4gICAgdGhpcy5vcGVuQ3JlYXRlRm9sZGVyRGlhbG9nKHBheWxvYWQucGFyZW50SWQpO1xuICB9XG5cbiAgb25Gb2xkZXJSZW5hbWVkKHBheWxvYWQ6IEZvbGRlclJlbmFtZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5mb2xkZXJSZW5hbWVkLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZWQgdG8gdGhlIHNpZGViYXIncyBgZm9sZGVyRGVsZXRlZGAgb3V0cHV0IOKAlCB3aGljaCBmaXJlcyBvbiBkZWxldGUtaWNvblxuICAgKiAqY2xpY2sqLCBub3Qgb24gY29uZmlybWF0aW9uLiBXZSByZS1lbWl0IGEgYGZvbGRlckRlbGV0ZVJlcXVlc3RlZGAgZXZlbnRcbiAgICogZmlyc3QgKHNvIGhvc3RzIGNhbiBpbnRlcmNlcHQpIGFuZCwgd2hlbiBgdXNlSW50ZXJuYWxEaWFsb2dzYCBpcyBlbmFibGVkLFxuICAgKiBvcGVuIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLiBgZm9sZGVyRGVsZXRlZGAgbm93IG9ubHkgZmlyZXMgYWZ0ZXIgY29uZmlybS5cbiAgICovXG4gIG9uRm9sZGVyRGVsZXRlZChwYXlsb2FkOiB7IGlkOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuYnVpbGREZWxldGVDb250ZXh0KHBheWxvYWQuaWQpO1xuICAgIHRoaXMuZm9sZGVyRGVsZXRlUmVxdWVzdGVkLmVtaXQoY3R4KTtcbiAgICBpZiAoIXRoaXMudXNlSW50ZXJuYWxEaWFsb2dzKSByZXR1cm47XG4gICAgdGhpcy5vcGVuRGVsZXRlRm9sZGVyRGlhbG9nKGN0eCk7XG4gIH1cblxuICAvKiogQnVpbGRzIHRoZSB7IGlkLCBuYW1lLCB0ZXN0Q291bnQsIGhhc1BhcmVudCB9IHBheWxvYWQgdXNlZCBieSBkZWxldGUgZXZlbnRzL2RpYWxvZ3MuICovXG4gIHByaXZhdGUgYnVpbGREZWxldGVDb250ZXh0KGZvbGRlcklkOiBudW1iZXIpOiBGb2xkZXJEZWxldGVSZXF1ZXN0ZWRQYXlsb2FkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgZm9sZGVySWQpO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZm9sZGVySWQsXG4gICAgICBuYW1lOiBub2RlPy5uYW1lID8/ICcnLFxuICAgICAgdGVzdENvdW50OiB0aGlzLmNvdW50VGVzdHNJbkZvbGRlcihmb2xkZXJJZCksXG4gICAgICBoYXNQYXJlbnQ6IHRoaXMuZm9sZGVySGFzUGFyZW50KGZvbGRlcklkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudFRlc3RzSW5Gb2xkZXIoZm9sZGVySWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgYWNjZXNzb3IgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPz8gKChyOiBhbnkpID0+IHI/LmZvbGRlcklkKTtcbiAgICByZXR1cm4gKHRoaXMuZGF0YSB8fCBbXSkuZmlsdGVyKHIgPT4ge1xuICAgICAgY29uc3QgaWQgPSBhY2Nlc3NvcihyKTtcbiAgICAgIHJldHVybiBpZCAhPSBudWxsICYmIE51bWJlcihpZCkgPT09IE51bWJlcihmb2xkZXJJZCk7XG4gICAgfSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmb2xkZXIgaXMgbmVzdGVkIChpLmUuIG5vdCBhIHJvb3QtbGV2ZWwgZm9sZGVyKS4gKi9cbiAgcHJpdmF0ZSBmb2xkZXJIYXNQYXJlbnQoZm9sZGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHRoaXMuZm9sZGVycyB8fCBbXSkuc29tZShuID0+IG4uaWQgPT09IGZvbGRlcklkKTtcbiAgfVxuXG4gIG9uVGVzdHNEcm9wcGVkKGV2ZW50OiB7IHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj47IHRhcmdldEZvbGRlcklkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcCkgcmV0dXJuO1xuICAgIHRoaXMudGVzdHNNb3ZlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2xkZXItdG8tZm9sZGVyIGRyYWctZHJvcC4gVGhlIHNpZGViYXIgaGFzIGFscmVhZHkgdmFsaWRhdGVkIGFnYWluc3Qgc2VsZi9kZXNjZW5kYW50XG4gICAqIGN5Y2xlcywgc28gdGhlIGRyb3AgaXMgaXRzIG93biBjb25maXJtYXRpb24g4oCUIHdlIGVtaXQgYGZvbGRlck1vdmVkYCBkaXJlY3RseSB3aXRob3V0XG4gICAqIG9wZW5pbmcgdGhlIG1vdmUgZGlhbG9nLiBHYXRlZCBvbiBgYWxsb3dUZXN0RHJhZ0Ryb3BgIChzYW1lIGZsYWcgYXMgdGVzdCBkcmFnLWRyb3ApLlxuICAgKi9cbiAgb25Gb2xkZXJEcm9wcGVkKGV2ZW50OiB7IGlkOiBudW1iZXI7IG5ld1BhcmVudElkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcCkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyTW92ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2lkZWJhciBlbWl0dGVkIGBmb2xkZXJNb3ZlUmVxdWVzdGVkYCAodXNlciBwaWNrZWQgXCJNb3ZlIGZvbGRlclwiIGZyb20gdGhlIGNvbnRleHQgbWVudSkuXG4gICAqIFdlIHJlLWVtaXQgYSByaWNoZXIgcGF5bG9hZCBmb3IgaG9zdHMsIGFuZCDigJQgd2hlbiBydW5uaW5nIHdpdGggaW50ZXJuYWwgZGlhbG9ncyDigJRcbiAgICogb3BlbiB0aGUgZXhpc3RpbmcgbW92ZS10by1mb2xkZXIgcGlja2VyIGNvbmZpZ3VyZWQgZm9yIGEgZm9sZGVyLW1vdmUgKHNlbGYgYW5kXG4gICAqIGRlc2NlbmRhbnRzIGFyZSBkaXNhYmxlZCB0byBwcmV2ZW50IGN5Y2xlcykuXG4gICAqL1xuICBvbkZvbGRlck1vdmVSZXF1ZXN0ZWQocGF5bG9hZDogeyBpZDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgcGF5bG9hZC5pZCk7XG4gICAgY29uc3QgY3R4OiBGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZCA9IHtcbiAgICAgIGlkOiBwYXlsb2FkLmlkLFxuICAgICAgbmFtZTogbm9kZT8ubmFtZSA/PyAnJyxcbiAgICAgIGhhc1BhcmVudDogdGhpcy5mb2xkZXJIYXNQYXJlbnQocGF5bG9hZC5pZCksXG4gICAgfTtcbiAgICB0aGlzLmZvbGRlck1vdmVSZXF1ZXN0ZWQuZW1pdChjdHgpO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcbiAgICB0aGlzLm9wZW5Nb3ZlRm9sZGVyRGlhbG9nKGN0eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lkZWJhciBlbWl0dGVkIGBmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWRgLiBUaGUgbGlicmFyeSBjYW4ndCBwZXJzaXN0IOKAlFxuICAgKiBlbWl0IHRoZSBob3N0LWxldmVsIGV2ZW50IHNvIHRoZSBob3N0IGNsb25lcyB0aGUgc3VidHJlZSBzZXJ2ZXItc2lkZS5cbiAgICogVGVzdCBjYXNlcyBzaG91bGQgYmUgKnJlZmVyZW5jZWQqIGZyb20gdGhlIG5ldyBmb2xkZXJzLCBub3QgZHVwbGljYXRlZC5cbiAgICovXG4gIG9uRm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkKHBheWxvYWQ6IHsgaWQ6IG51bWJlciB9KTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHBheWxvYWQuaWQpO1xuICAgIHRoaXMuZm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkLmVtaXQoe1xuICAgICAgaWQ6IHBheWxvYWQuaWQsXG4gICAgICBuYW1lOiBub2RlPy5uYW1lID8/ICcnLFxuICAgIH0pO1xuICB9XG5cbiAgb25TaWRlYmFyQ29sbGFwc2VkQ2hhbmdlKGNvbGxhcHNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2lkZWJhckNvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB0aGlzLnNpZGViYXJDb2xsYXBzZWRDaGFuZ2UuZW1pdChjb2xsYXBzZWQpO1xuICB9XG5cbiAgdG9nZ2xlU2lkZWJhcigpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2lkZWJhckNvbGxhcHNlZENoYW5nZSghdGhpcy5zaWRlYmFyQ29sbGFwc2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGJ1bGsgYWN0aW9ucyBzaG93biBpbiB0aGUgdG9vbGJhciBtZXJnZWQgd2l0aCBhbnkgaG9zdC1zdXBwbGllZFxuICAgKiBgYnVsa0FjdGlvbnNgLiBDdXJyZW50bHkgb25seSBcIk1vdmUgdG8gZm9sZGVyXCIgc2hpcHMgYnkgZGVmYXVsdCDigJRcbiAgICogRGVsZXRlIC8gQWRkIFRhZyBhcmUgb3B0LWluIHBlciB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50LiBIb3N0c1xuICAgKiB0aGF0IHdhbnQgdGhlbSBiYWNrIHBhc3MgdGhlbSB2aWEgYGJ1bGtBY3Rpb25zYC5cbiAgICovXG4gIGdldCBlZmZlY3RpdmVCdWxrQWN0aW9ucygpOiBUYWJsZUFjdGlvbltdIHtcbiAgICBjb25zdCBkZWZhdWx0czogVGFibGVBY3Rpb25bXSA9IFtcbiAgICAgIHsgaWQ6ICdtb3ZlJywgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlVG9Gb2xkZXIsIGljb246ICdkcml2ZV9maWxlX21vdmUnLCB0b29sdGlwOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZVRvRm9sZGVyIH0sXG4gICAgXTtcbiAgICBjb25zdCBvdmVycmlkZXMgPSBuZXcgTWFwKCh0aGlzLmJ1bGtBY3Rpb25zIHx8IFtdKS5tYXAoYSA9PiBbYS5pZCwgYV0gYXMgY29uc3QpKTtcbiAgICBjb25zdCBtZXJnZWQgPSBkZWZhdWx0cy5tYXAoZCA9PiBvdmVycmlkZXMuZ2V0KGQuaWQpID8/IGQpO1xuICAgIGZvciAoY29uc3QgZXh0cmEgb2YgdGhpcy5idWxrQWN0aW9ucyB8fCBbXSkge1xuICAgICAgaWYgKCFkZWZhdWx0cy5zb21lKGQgPT4gZC5pZCA9PT0gZXh0cmEuaWQpKSB7XG4gICAgICAgIG1lcmdlZC5wdXNoKGV4dHJhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIG9uQnVsa0FjdGlvbihldmVudDogeyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfSk6IHZvaWQge1xuICAgIC8vIEFsd2F5cyBlbWl0IHRoZSByYXcgY2xpY2sgc28gaG9zdHMgb3duaW5nIHRoZSBVWCBjYW4gaW50ZXJjZXB0IGVhcmx5LlxuICAgIHRoaXMuYnVsa0FjdGlvbkNsaWNrLmVtaXQoeyBpZDogZXZlbnQuaWQsIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCB9KTtcblxuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gKGV2ZW50LnNlbGVjdGVkIHx8IFtdKS5tYXAociA9PiByPy5pZCkuZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcbiAgICBpZiAoZXZlbnQuaWQgPT09ICdtb3ZlJykge1xuICAgICAgdGhpcy5vcGVuTW92ZURpYWxvZyhzZWxlY3RlZElkcywgZXZlbnQuc2VsZWN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGb3Igbm9uLWRpYWxvZyBhY3Rpb25zIChjdXN0b20gZW50cmllcyBmcm9tIGhvc3Qtc3VwcGxpZWQgYGJ1bGtBY3Rpb25zYCksIGludm9rZSBpbW1lZGlhdGVseS5cbiAgICB0aGlzLmJ1bGtBY3Rpb25JbnZva2VkLmVtaXQoeyBpZDogZXZlbnQuaWQsIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCB9KTtcbiAgfVxuXG4gIG9uQnVsa1NlbGVjdEFsbChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gQXBwbHkgdGhlIGFjdGlvbiBsb2NhbGx5IHNvIHRoZSBhY3Rpb24gdG9vbGJhcidzIFwiU2VsZWN0IGFsbFwiIHdvcmtzIG91dC1vZi10aGUtYm94LlxuICAgIC8vIFdoZW4gY2hlY2tlZCwgc2VsZWN0IGV2ZXJ5IHJvdyBpbiB0aGUgKmN1cnJlbnQqIGZpbHRlcmVkIHNldCAoaS5lLiBhbGwgdGVzdHMgaW5cbiAgICAvLyB0aGUgc2VsZWN0ZWQgZm9sZGVyKS4gV2hlbiB1bmNoZWNrZWQsIGNsZWFyIHNlbGVjdGlvbi5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBjaGVja2VkID8gWy4uLnRoaXMuZmlsdGVyZWRSb3dzXSA6IFtdO1xuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoWy4uLnRoaXMuc2VsZWN0ZWRJdGVtc10pO1xuICAgIHRoaXMuYnVsa1NlbGVjdEFsbENoYW5nZS5lbWl0KGNoZWNrZWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25CdWxrRGlzbWlzcygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBzZWxlY3Rpb24gQU5EIHRoZSBwZXItcm93IGlzU2VsZWN0ZWQgZmxhZ3Mgc28gdGhlIGFjdGlvbiB0b29sYmFyIGNsb3Nlc1xuICAgIC8vIChpdCdzIGdhdGVkIG9uIGBhbnlSb3dTZWxlY3RlZGAsIHdoaWNoIHJlYWRzIGJvdGggc2VsZWN0ZWRJdGVtcyBhbmQgcm93IGZsYWdzKS5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KFtdKTtcbiAgICB0aGlzLmJ1bGtEaXNtaXNzLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk1vdmVEaWFsb2codGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgLy8gRmlyZSB0aGUgXCJyZXF1ZXN0ZWRcIiBldmVudCBmaXJzdCBzbyBhIGhvc3QgY2FuIGludGVyY2VwdCB3aGVuIGl0IG93bnMgdGhlIFVYLlxuICAgIHRoaXMubW92ZVJlcXVlc3RlZC5lbWl0KHtcbiAgICAgIHRlc3RJZHMsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGN1cnJlbnRGb2xkZXJJZDogdGhpcy5zZWxlY3RlZEZvbGRlcklkLFxuICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgIH0pO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcblxuICAgIGNvbnN0IGNvdW50ID0gdGVzdElkcy5sZW5ndGg7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoY291bnQgPT09IDFcbiAgICAgID8gdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dEZXNjcmlwdGlvblNpbmd1bGFyXG4gICAgICA6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nRGVzY3JpcHRpb25QbHVyYWxcbiAgICApLnJlcGxhY2UoJ3tufScsICcnICsgY291bnQpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgbnVtYmVyIHwgbnVsbD4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlcnM6IHRoaXMuZm9sZGVycyxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMubW9kdWxhckxhYmVscyxcbiAgICAgICAgICBjdXJyZW50Rm9sZGVySWQ6IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCxcbiAgICAgICAgICAvLyBXaGVuIG1vdmluZyBGUk9NIFVub3JnYW5pemVkLCBkaXNhYmxlIHRoZSBVbm9yZ2FuaXplZCBkZXN0aW5hdGlvbiByb3cuXG4gICAgICAgICAgcm9vdERpc2FibGVkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKHVuZGVmaW5lZCBhcyBhbnkpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICByLmNsb3NlKGluc3RhbmNlID8gaW5zdGFuY2UucGlja2VkRm9sZGVySWQgOiBudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUodGFyZ2V0Rm9sZGVySWQgPT4ge1xuICAgICAgaWYgKHRhcmdldEZvbGRlcklkID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkXG4gICAgICB0aGlzLnRlc3RzTW92ZWQuZW1pdCh7IHRlc3RJZHMsIHRhcmdldEZvbGRlcklkOiB0YXJnZXRGb2xkZXJJZCA/PyBudWxsIH0pO1xuICAgICAgdGhpcy5idWxrQWN0aW9uSW52b2tlZC5lbWl0KHsgaWQ6ICdtb3ZlJywgc2VsZWN0ZWQgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGZvbGRlci1waWNrZXIgZGlhbG9nIGNvbmZpZ3VyZWQgZm9yIG1vdmluZyBhIGZvbGRlciAocmF0aGVyIHRoYW4gdGVzdHMpLlxuICAgKiBUaGUgc291cmNlIGZvbGRlciBpdHNlbGYgaXMgbWFya2VkIGFzIHRoZSBcImN1cnJlbnRcIiBmb2xkZXIgc28gaXQncyByZW5kZXJlZCBhc1xuICAgKiBkaXNhYmxlZCBpbiB0aGUgcGlja2VyLiBPbiBjb25maXJtLCBlbWl0cyBgZm9sZGVyTW92ZWRgIHdpdGggdGhlIGNob3NlbiBwYXJlbnQuXG4gICAqL1xuICBwcml2YXRlIG9wZW5Nb3ZlRm9sZGVyRGlhbG9nKGN0eDogRm9sZGVyTW92ZVJlcXVlc3RlZFBheWxvYWQpOiB2b2lkIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMuZm9sZGVyTWVudU1vdmUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgLy8gUmV1c2UgdGhlIFwiZGlzYWJsZWRcIiB0cmVhdG1lbnQ6IHRoZSBmb2xkZXIgYmVpbmcgbW92ZWQgY2FuJ3QgYmUgaXRzIG93biBkZXN0aW5hdGlvbi5cbiAgICAgICAgICBjdXJyZW50Rm9sZGVySWQ6IGN0eC5pZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKHVuZGVmaW5lZCBhcyBhbnkpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICByLmNsb3NlKGluc3RhbmNlID8gaW5zdGFuY2UucGlja2VkRm9sZGVySWQgOiBudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUodGFyZ2V0Rm9sZGVySWQgPT4ge1xuICAgICAgaWYgKHRhcmdldEZvbGRlcklkID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gY2FuY2VsbGVkXG4gICAgICB0aGlzLmZvbGRlck1vdmVkLmVtaXQoeyBpZDogY3R4LmlkLCBuZXdQYXJlbnRJZDogdGFyZ2V0Rm9sZGVySWQgPz8gbnVsbCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkNyZWF0ZUZvbGRlckRpYWxvZyhpbml0aWFsUGFyZW50SWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIHsgbmFtZTogc3RyaW5nOyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbDsgY29sb3I6IHN0cmluZyB9IHwgZmFsc2U+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tb2R1bGFyTGFiZWxzLm5ld0ZvbGRlckRpYWxvZ0Rlc2NyaXB0aW9uLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIHBhcmVudElkOiBpbml0aWFsUGFyZW50SWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKGZhbHNlKSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3QgPSByLmdldENvbXBvbmVudEluc3RhbmNlPE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIGlmICghaW5zdCB8fCAhaW5zdC5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7IC8vIGtlZXAgdGhlIGRpYWxvZyBvcGVuIG9uIGludmFsaWQgc3VibWl0XG4gICAgICAgICAgICByLmNsb3NlKHsgbmFtZTogKGluc3QubmFtZSB8fCAnJykudHJpbSgpLCBwYXJlbnRJZDogaW5zdC5wYXJlbnRJZCwgY29sb3I6IGluc3QuY29sb3IgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidXR0b25BbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgfSk7XG4gICAgcmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZm9sZGVyQ3JlYXRlZC5lbWl0KHsgcGFyZW50SWQ6IHJlc3VsdC5wYXJlbnRJZCwgbmFtZTogcmVzdWx0Lm5hbWUsIGNvbG9yOiByZXN1bHQuY29sb3IgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5EZWxldGVGb2xkZXJEaWFsb2coY3R4OiBGb2xkZXJEZWxldGVSZXF1ZXN0ZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW48YW55LCB7IHN0cmF0ZWd5OiBGb2xkZXJEZWxldGVTdHJhdGVneSB9IHwgZmFsc2U+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMuZGVsZXRlRm9sZGVyRGlhbG9nVGl0bGUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogRGVsZXRlRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJOYW1lOiBjdHgubmFtZSxcbiAgICAgICAgICB0ZXN0Q291bnQ6IGN0eC50ZXN0Q291bnQsXG4gICAgICAgICAgaGFzUGFyZW50OiBjdHguaGFzUGFyZW50LFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIHN0cmF0ZWd5OiBjdHguaGFzUGFyZW50ID8gJ21vdmUtdG8tcGFyZW50JyA6ICdtb3ZlLXRvLXVub3JnYW5pemVkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5kZWxldGVGb2xkZXJEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UoZmFsc2UpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLmRlbGV0ZUZvbGRlckRpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3dhcm4nLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdCA9IHIuZ2V0Q29tcG9uZW50SW5zdGFuY2U8RGVsZXRlRm9sZGVyRGlhbG9nQ29tcG9uZW50PigpO1xuICAgICAgICAgICAgci5jbG9zZShpbnN0ID8geyBzdHJhdGVneTogaW5zdC5zdHJhdGVneSB9IDogZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBjdHguaWQsIHN0cmF0ZWd5OiByZXN1bHQuc3RyYXRlZ3kgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBzdGFydFJlb3JkZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZW9yZGVyaW5nKSByZXR1cm47XG4gICAgdGhpcy5yZW9yZGVyU25hcHNob3QgPSBbLi4uKHRoaXMucGFnZWRSb3dzIHx8IFtdKV07XG4gICAgdGhpcy5yZW9yZGVyRHJhZnQgPSBbLi4uKHRoaXMucGFnZWRSb3dzIHx8IFtdKV07XG4gICAgLy8gUGF1c2UgYXV0by1yZWZyZXNoIHdoaWxlIHJlb3JkZXJpbmcg4oCUIGF2b2lkcyB0aGUgdGltZXIgY2xvYmJlcmluZyB0aGUgZHJhZnQuXG4gICAgdGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA9IHRoaXMuc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsO1xuICAgIGlmICh0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID4gMCkge1xuICAgICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKDApO1xuICAgIH1cbiAgICB0aGlzLmlzUmVvcmRlcmluZyA9IHRydWU7XG4gICAgdGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCA9IGZhbHNlO1xuICAgIHRoaXMucmVvcmRlclN0YXJ0LmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNhbmNlbFJlb3JkZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBhZ2Ugb3JkZXIgc28gdGhlIHVzZXIgc2VlcyB0aGUgcHJlLWRyYWcgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVvcmRlclNuYXBzaG90KSB7XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLnJlb3JkZXJTbmFwc2hvdF07XG4gICAgfVxuICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgdGhpcy5yZW9yZGVyQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHNhdmVSZW9yZGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICBjb25zdCBvcmRlcmVkID0gdGhpcy5yZW9yZGVyRHJhZnQgPyBbLi4udGhpcy5yZW9yZGVyRHJhZnRdIDogWy4uLih0aGlzLnBhZ2VkUm93cyB8fCBbXSldO1xuICAgIHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgPSB0cnVlO1xuICAgIHRoaXMucmVvcmRlclNhdmUuZW1pdCh7IG9yZGVyZWRJdGVtczogb3JkZXJlZCB9KTtcbiAgICAvLyBJZiB0aGUgaG9zdCBuZXZlciBmbGlwcyBgcmVvcmRlclNhdmluZ2AgKGUuZy4gc3luY2hyb25vdXMgbm8tb3ApLCBleGl0XG4gICAgLy8gaW1tZWRpYXRlbHkgc28gdGhlIFVJIGRvZXNuJ3QgZ2V0IHN0dWNrIGluIFwiU2F2aW5nLi4uXCIgc3RhdGUuXG4gICAgaWYgKCF0aGlzLnJlb3JkZXJTYXZpbmcpIHtcbiAgICAgIC8vIEdpdmUgdGhlIGhvc3QgYSBtaWNyb3Rhc2sgdG8gZmxpcCBgcmVvcmRlclNhdmluZ2AgdG8gdHJ1ZSDigJQgaWYgaXRcbiAgICAgIC8vIGhhc24ndCwgYXNzdW1lIG5vIGFzeW5jIHdvcmsgYW5kIGV4aXQuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgJiYgIXRoaXMucmVvcmRlclNhdmluZykge1xuICAgICAgICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUm93UmVvcmRlcihldmVudDogeyBwcmV2aW91c0luZGV4OiBudW1iZXI7IGN1cnJlbnRJbmRleDogbnVtYmVyOyBvcmRlcmVkRGF0YTogYW55W10gfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICB0aGlzLnJlb3JkZXJEcmFmdCA9IFsuLi5ldmVudC5vcmRlcmVkRGF0YV07XG4gICAgdGhpcy5wYWdlZFJvd3MgPSB0aGlzLnJlb3JkZXJEcmFmdDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhpdFJlb3JkZXJNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNSZW9yZGVyaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZW9yZGVyU25hcHNob3QgPSBudWxsO1xuICAgIHRoaXMucmVvcmRlckRyYWZ0ID0gbnVsbDtcbiAgICB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwID0gZmFsc2U7XG4gICAgLy8gUmVzdG9yZSBwcmV2aW91c2x5LXNlbGVjdGVkIGF1dG8tcmVmcmVzaCBpbnRlcnZhbCAoaWYgYW55KS5cbiAgICBpZiAodGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA+IDApIHtcbiAgICAgIHRoaXMuc2V0dXBBdXRvUmVmcmVzaCh0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoKTtcbiAgICAgIHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2ggPSAwO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3ctZHJhZyBwYXlsb2FkIGJ1aWxkZXIgdXNlZCBieSB0aGUgW2NxYVJvd0RyYWddIGRpcmVjdGl2ZSB2aWEgKGJ1aWxkUGF5bG9hZCkuXG4gICAqL1xuICBidWlsZFJvd0RyYWdQYXlsb2FkID0gKHJvdzogYW55KTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmN1cnJlbnRTZWxlY3RlZEl0ZW1zO1xuICAgIC8vIElmIHRoZSBkcmFnZ2VkIHJvdyBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgZHJhZyB0aGUgd2hvbGUgc2VsZWN0aW9uLlxuICAgIGNvbnN0IHJvd0lkID0gcm93Py5pZDtcbiAgICBjb25zdCBpblNlbGVjdGlvbiA9IHJvd0lkICE9IG51bGwgJiYgc2VsZWN0ZWQuc29tZShzID0+IHM/LmlkID09PSByb3dJZCk7XG4gICAgY29uc3QgaWRzID0gKGluU2VsZWN0aW9uID8gc2VsZWN0ZWQgOiBbcm93XSkubWFwKHIgPT4gcj8uaWQpLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG4gICAgcmV0dXJuIGlkcztcbiAgfTtcbn1cbiIsIjwhLS0gUmV1c2FibGUgZm9sZGVyLWljb24gY2hpcC4gUmVuZGVyIHZpYSA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPi4gLS0+XG48bmctdGVtcGxhdGUgI2ZvbGRlckljb25DaGlwIGxldC1jb2xvcj1cImNvbG9yXCI+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTEwIGNxYS1oLTEwIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXRleHQtWyM2RDZENzRdIGNxYS1zaHJpbmstMCBncm91cC1ob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPlxuICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgW2F0dHIuc3Ryb2tlXT1cImNvbG9yIHx8ICdjdXJyZW50Q29sb3InXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gUmV1c2FibGUgXCIrXCIgY2hpcCB1c2VkIGJ5IHRoZSBcIk5ldyBmb2xkZXJcIiB0aWxlLiAtLT5cbjxuZy10ZW1wbGF0ZSAjYWRkSWNvbkNoaXA+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTEwIGNxYS1oLTEwIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXRleHQtWyM2RDZENzRdIGNxYS1zaHJpbmstMCBncm91cC1ob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPlxuICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHBhdGggZD1cIk04IDNWMTNNMyA4SDEzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgIDwvc3ZnPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1yZWxhdGl2ZVwiPlxuICAgIDxkaXYgW2NsYXNzXT1cIiFzaG93U2VhcmNoQmFyID8gJ2NxYS1qdXN0aWZ5LWVuZCcgOiAnY3FhLWp1c3RpZnktYmV0d2VlbidcIiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZsZXgtd3JhcCBjcWEtbWItM1wiPlxuICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoc2VhcmNoKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgKGNsZWFyZWQpPVwiY2xlYXJlZCgpXCJcbiAgICAgID48L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cImdyZXktc29saWRcIlxuICAgICAgICBpY29uPVwib3Blbl9pbl9uZXdcIlxuICAgICAgICBbdGV4dF09XCJpc0V4cG9ydGluZyA/ICdFeHBvcnRpbmcuLi4nIDogJ0V4cG9ydCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNFeHBvcnRpbmdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJleHBvcnRDb2RlQ2xpY2soKVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPnt7IGlzRXhwb3J0aW5nID8gJ0V4cG9ydGluZy4uLicgOiAnRXhwb3J0JyB9fTwvc3Bhbj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIFxuICAgICAgPCEtLSBFeHBvcnQgQ29kZSBNb2RhbCAtLT5cbiAgICAgIDxjcWEtZXhwb3J0LWNvZGUtbW9kYWxcbiAgICAgICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgICAgICAgW2lzT3Blbl09XCJpc0V4cG9ydE1vZGFsT3BlblwiXG4gICAgICAgIFtjYXNlc109XCJzZWxlY3RlZENhc2VzRm9yRXhwb3J0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcbiAgICAgICAgKGNsb3NlTW9kYWwpPVwiY2xvc2VFeHBvcnRNb2RhbCgpXCJcbiAgICAgICAgKGV4cG9ydCk9XCJvbkV4cG9ydE1vZGFsRXhwb3J0KCRldmVudClcIj5cbiAgICAgIDwvY3FhLWV4cG9ydC1jb2RlLW1vZGFsPlxuICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZHJvcGRvd25UZW1wbGF0ZSBvZiBvdGhlckRyb3BEb3duQnV0dG9uczsgdHJhY2tCeTogdHJhY2tCeURyb3Bkb3duVGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWxlY3REcm9wZG93blRlbXBsYXRlIG9mIG90aGVyU2VsZWN0RHJvcERvd25CdXR0b25zOyB0cmFja0J5OiB0cmFja0J5U2VsZWN0RHJvcGRvd25UZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3REcm9wZG93blRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICBcbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dGaWx0ZXJCdXR0b25cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVGaWx0ZXIoKVwiXG4gICAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiPlxuICAgICAgICAgIEZpbHRlciAgICAgICAgICBcbiAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiYXJyb3dDbGFzc2VzXCI+XG4gICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctMiBjcWEtaC0xIGNxYS1hYnNvbHV0ZSBjcWEtbGVmdC1bNHB4XSBjcWEtdG9wLVs2cHhdXCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA4IDRcIlxuICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMCAwTDQgNEw4IDBcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwQjBCMENcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzNcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1jb2x1bW4tdmlzaWJpbGl0eVxuICAgICAgICAgICpuZ0lmPVwic2hvd1NldHRpbmdzQnV0dG9uXCJcbiAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmlsaXR5Q29sdW1uc1wiXG4gICAgICAgICAgW2NvbHVtblZpc2liaWxpdHldPVwiY29sdW1uVmlzaWJpbGl0eVwiXG4gICAgICAgICAgW3NlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbF09XCJzZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgIChjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlKT1cIm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoYXV0b1JlZnJlc2hDaGFuZ2UpPVwib25BdXRvUmVmcmVzaENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPjwvY3FhLWNvbHVtbi12aXNpYmlsaXR5PlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0F1dG9SZWZyZXNoQnV0dG9uXCJcbiAgICAgICAgICB2YXJpYW50PVwiZ3JleS1zb2xpZFwiXG4gICAgICAgICAgaWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgIChjbGlja2VkKT1cImhhbmRsZVJlZnJlc2hDbGljaygpXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInUmVmcmVzaCdcIlxuICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uVGVtcGxhdGUgb2Ygb3RoZXJCdXR0b25zOyB0cmFja0J5OiB0cmFja0J5VGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJzaG93Vmlld01vZGVUb2dnbGVcIlxuICAgICAgICAgIHNpemU9XCJsZ1wiXG4gICAgICAgICAgW3NlZ21lbnRzXT1cInZpZXdNb2RlU2VnbWVudHNcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ2aWV3TW9kZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmlld01vZGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93UmVvcmRlckJ1dHRvbiAmJiAhaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgIGljb249XCJkcmFnX2luZGljYXRvclwiXG4gICAgICAgICAgW3RleHRdPVwicmVvcmRlckxhYmVscy5yZW9yZGVyQnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXBhZ2VkUm93cyB8fCBwYWdlZFJvd3MubGVuZ3RoID09PSAwIHx8IGlzVGFibGVMb2FkaW5nIHx8IGlzVGFibGVEYXRhTG9hZGluZ1wiXG4gICAgICAgICAgKGNsaWNrZWQpPVwic3RhcnRSZW9yZGVyKClcIlxuICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1Jlb3JkZXJCdXR0b24gJiYgaXNSZW9yZGVyaW5nXCI+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbdGV4dF09XCJyZW9yZGVyTGFiZWxzLmNhbmNlbEJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVvcmRlclNhdmluZ1wiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJjYW5jZWxSZW9yZGVyKClcIlxuICAgICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgW2ljb25dPVwicmVvcmRlclNhdmluZyA/ICdob3VyZ2xhc3NfZW1wdHknIDogJydcIlxuICAgICAgICAgICAgW3RleHRdPVwicmVvcmRlclNhdmluZyA/IHJlb3JkZXJMYWJlbHMuc2F2aW5nQnV0dG9uIDogcmVvcmRlckxhYmVscy5kb25lQnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZW9yZGVyU2F2aW5nXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cInNhdmVSZW9yZGVyKClcIlxuICAgICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlb3JkZXIgbW9kZSBiYW5uZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVvcmRlcmluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTMgY3FhLXB4LTMgY3FhLXB5LTIgY3FhLXJvdW5kZWQtbWQgY3FhLWJnLVsjRkZGQkVCXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGREU2OEFdXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgIDwvc3ZnPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzkyNDAwRV1cIj57eyByZW9yZGVyTGFiZWxzLmJhbm5lclRpdGxlIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzkyNDAwRV1cIj57eyByZW9yZGVyTGFiZWxzLmJhbm5lckRlc2NyaXB0aW9uIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGNxYS1zZWxlY3RlZC1maWx0ZXJzXG4gICAgICBbZmlsdGVyQXBwbGllZF09XCJmaWx0ZXJBcHBsaWVkXCJcbiAgICAgIFtjaGlwc109XCJjaGlwc1wiXG4gICAgICAocmVtb3ZlQ2hpcCk9XCJvblJlbW92ZUNoaXAoJGV2ZW50KVwiXG4gICAgICAoY2xlYXJBbGwpPVwib25DbGVhckFsbENoaXBzKClcIlxuICAgICAgKG9uQ2xlYXJBbGwpPVwib25DbGVhckFsbC5lbWl0KClcIlxuICAgID5cbiAgICA8L2NxYS1zZWxlY3RlZC1maWx0ZXJzPlxuXG4gICAgPGNxYS1keW5hbWljLWZpbHRlclxuICAgICAgKm5nSWY9XCJzaG93RmlsdGVyUGFuZWxcIlxuICAgICAgW2NvbmZpZ109XCJmaWx0ZXJDb25maWdcIlxuICAgICAgW21vZGVsXT1cImZpbHRlck1vZGVsXCJcbiAgICAgIFtzaG93RmlsdGVyUGFuZWxdPVwic2hvd0ZpbHRlclBhbmVsXCJcbiAgICAgIChmaWx0ZXJzQ2hhbmdlZCk9XCJvbkZpbHRlcnNDaGFuZ2VkKCRldmVudClcIlxuICAgICAgKGZpbHRlcnNBcHBsaWVkKT1cIm9uRmlsdGVyc0FwcGxpZWQoJGV2ZW50KVwiXG4gICAgICAob25BcHBseUZpbHRlckNsaWNrKT1cIm9uQXBwbHlGaWx0ZXJDbGljay5lbWl0KCRldmVudClcIlxuICAgICAgKG9uUmVzZXRGaWx0ZXJDbGljayk9XCJoYW5kbGVSZXNldEZpbHRlckNsaWNrKClcIlxuICAgID5cbiAgICA8L2NxYS1keW5hbWljLWZpbHRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtZ2FwLTMgY3FhLW1pbi1oLTAgXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIyNiwgMjI2LCAyMjcpO1wiPlxuICAgICAgPCEtLSBTaWRlYmFyIChvbmx5IHNob3duIGluIG1vZHVsYXIgdmlldykgLS0+XG4gICAgICA8Y3FhLWZvbGRlci1zaWRlYmFyXG4gICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dTaWRlYmFyXCJcbiAgICAgICAgW2ZvbGRlcnNdPVwiZm9sZGVyc1wiXG4gICAgICAgIFtzZWxlY3RlZEZvbGRlcklkXT1cInNlbGVjdGVkRm9sZGVySWRcIlxuICAgICAgICBbZXhwYW5kZWRGb2xkZXJJZHNdPVwiZXhwYW5kZWRGb2xkZXJJZHNcIlxuICAgICAgICBbdW5vcmdhbml6ZWRDb3VudF09XCJ1bm9yZ2FuaXplZENvdW50XCJcbiAgICAgICAgW2FsbG93Q3JlYXRlXT1cIm1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIlxuICAgICAgICBbYWxsb3dSZW5hbWVdPVwibW9kdWxhckNvbmZpZy5hbGxvd1JlbmFtZUZvbGRlclwiXG4gICAgICAgIFthbGxvd0RlbGV0ZV09XCJtb2R1bGFyQ29uZmlnLmFsbG93RGVsZXRlRm9sZGVyXCJcbiAgICAgICAgW2FsbG93RHJvcF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgW3Nob3dDb3VudHNdPVwibW9kdWxhckNvbmZpZy5zaG93Q291bnRzXCJcbiAgICAgICAgW2NvbGxhcHNlZF09XCJzaWRlYmFyQ29sbGFwc2VkXCJcbiAgICAgICAgW2xhYmVsc109XCJtb2R1bGFyTGFiZWxzXCJcbiAgICAgICAgW3NlcnZlclNpZGVTZWFyY2hdPVwic2VydmVyU2lkZVNlYXJjaFwiXG4gICAgICAgIFtyb290VG90YWxdPVwicm9vdFRvdGFsXCJcbiAgICAgICAgW2ZvbGRlclNlYXJjaExvYWRpbmddPVwiZm9sZGVyU2VhcmNoTG9hZGluZ1wiXG4gICAgICAgIFtyb290Rm9sZGVyc0xvYWRpbmddPVwicm9vdEZvbGRlcnNMb2FkaW5nXCJcbiAgICAgICAgKGZvbGRlclNlbGVjdGVkKT1cIm9uRm9sZGVyU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJFeHBhbnNpb25Ub2dnbGVkKT1cIm9uRm9sZGVyRXhwYW5zaW9uVG9nZ2xlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckNoaWxkcmVuUmVxdWVzdGVkKT1cImZvbGRlckNoaWxkcmVuUmVxdWVzdGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCk9XCJmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAocm9vdExvYWRNb3JlUmVxdWVzdGVkKT1cInJvb3RMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cImZvbGRlclNlYXJjaENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoZm9sZGVyQ3JlYXRlZCk9XCJvbkZvbGRlckNyZWF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJDcmVhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJSZW5hbWVkKT1cIm9uRm9sZGVyUmVuYW1lZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckRlbGV0ZWQpPVwib25Gb2xkZXJEZWxldGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyTW92ZVJlcXVlc3RlZCk9XCJvbkZvbGRlck1vdmVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwib25UZXN0c0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEcm9wcGVkKT1cIm9uRm9sZGVyRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9jcWEtZm9sZGVyLXNpZGViYXI+XG5cbiAgICAgIDwhLS0gUmlnaHQgcGFuZSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItdG9wXT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdF09XCJpc01vZHVsYXJWaWV3ID8gJzFweCBzb2xpZCAjRTJFMkUzJyA6IG51bGxcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJpZ2h0XT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQnJlYWRjcnVtYiAobW9kdWxhciB2aWV3LCBmb2xkZXIgZHJpbGxlZC1pbikgLS0+XG4gICAgICAgIDxuYXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93QnJlYWRjcnVtYiAmJiAhaXNSb290Vmlld1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkZvbGRlciBwYXRoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS1weC0zIGNxYS1weS0xIGNxYS1tYi0zIGNxYS1yb3VuZGVkLW5vbmVcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTJFMkUzO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIiAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChudWxsKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3Bhbj57eyBtb2R1bGFyTGFiZWxzLmFsbEZvbGRlcnMgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY3J1bWIgb2YgYnJlYWRjcnVtYlRyYWlsOyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1hbGlnbi1taWRkbGVcIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y29sb3I6IzZENkQ3NDtcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImxhc3RcbiAgICAgICAgICAgICAgICA/ICdjcWEtdGV4dC1bIzE2MTYxN10gY3FhLWZvbnQtc2VtaWJvbGQnXG4gICAgICAgICAgICAgICAgOiAnY3FhLXRleHQtWyM2RDZENzRdIGhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXSdcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGFzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIhbGFzdCAmJiBvbkZvbGRlclNlbGVjdGVkKGNydW1iLmlkKVwiXG4gICAgICAgICAgICA+e3sgY3J1bWIubmFtZSB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25hdj5cblxuICAgICAgICA8IS0tIEZvbGRlciBncmlkOiBtb2R1bGFyICsgcm9vdCB2aWV3IC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd0ZvbGRlckdyaWQgJiYgcm9vdEZvbGRlclRpbGVzLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtbWItNCBjcWEtcHgtNSBjcWEtcHQtNCBjcWEtcGItWzE0cHhdXCJcbiAgICAgICAgICBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjBGMEYxO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBzdHJva2U9XCIjNkQ2RDc0XCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPnt7IG1vZHVsYXJMYWJlbHMub3JnYW5pemVkIH19PC9oMz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2RDZENzRdXCI+XG4gICAgICAgICAgICAgIHt7IHJvb3RGb2xkZXJUaWxlcy5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLmZvbGRlcnNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy5mb2xkZXJzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyByb290Rm9sZGVyVGlsZXMubGVuZ3RoKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1ub3dyYXAgY3FhLWdhcC0zIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLXNjcm9sbGJhci10aGluIGNxYS1wYi0yXCJcbiAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25Sb290R3JpZFNjcm9sbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIHJvb3RGb2xkZXJUaWxlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJmLmlkXCJcbiAgICAgICAgICAgICAgW2Ryb3BFbmFibGVkXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICAgICAgICAodGVzdHNEcm9wcGVkKT1cIm9uVGVzdHNEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChmLmlkKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cImYuY2hpbGRyZW4/Lmxlbmd0aFwiPiDCtyB7eyBmLmNoaWxkcmVuIS5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLm9uZVN1YmZvbGRlciA6IG1vZHVsYXJMYWJlbHMuc3ViZm9sZGVyc0NvdW50LnJlcGxhY2UoJ3tufScsICcnICsgZi5jaGlsZHJlbiEubGVuZ3RoKSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXNocmluay0wXCIgc3R5bGU9XCJmb250LXNpemU6MjBweDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBcIisgTmV3IGZvbGRlclwiIHRpbGUgLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoeyBwYXJlbnRJZDogbnVsbCB9KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy1bI0ZBRkFGQV0gaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLWJnLXdoaXRlIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uQ2hpcFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNDAwXCI+e3sgbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcwJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gUGFnaW5hdGlvbiBzcGlubmVyIGFuY2hvcmVkIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBPcmdhbml6ZWRcbiAgICAgICAgICAgICAgICAgcm93LiBPbmx5IHJlbmRlcnMgZHVyaW5nIGFuIGluLWZsaWdodCByb290IGZldGNoIChpbml0aWFsIE9SXG4gICAgICAgICAgICAgICAgIHNjcm9sbC1kcml2ZW4gXCJsb2FkIG1vcmVcIiksIGFuZCBpcyBmaWx0ZXJlZCB0byBzdXBwcmVzcyB3aGVuXG4gICAgICAgICAgICAgICAgIHRoZSBzZWN0aW9uIGlzIGVtcHR5IHNvIHdlIGRvbid0IHNob3cgYSBzcGlubmVyIGluc2lkZSBhblxuICAgICAgICAgICAgICAgICBvdGhlcndpc2UtYmxhbmsgcm93LiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJyb290Rm9sZGVyc0xvYWRpbmcgJiYgcm9vdEZvbGRlclRpbGVzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1zaHJpbmstMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy1bODBweF1cIlxuICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMb2FkaW5nIG1vcmUgZm9sZGVycydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPCEtLSBTdWJmb2xkZXIgc2VjdGlvbjogbW9kdWxhciArIGZvbGRlciB2aWV3LiBTaG93biB3aGVuZXZlciBkcmlsbGVkIGluXG4gICAgICAgICAgICAgKGV2ZW4gaWYgbm8gc3ViZm9sZGVycywgc28gdGhlIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSByZW1haW5zXG4gICAgICAgICAgICAgcmVhY2hhYmxlLCBhbmQgc28gd2UgY2FuIHJlbmRlciBhIGxvYWRpbmcgc3RhdGUgZHVyaW5nIHRoZVxuICAgICAgICAgICAgIGRyaWxsLWluIGZldGNoIGJlZm9yZSBjaGlsZHJlbiBhcnJpdmUpLiAtLT5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgIWlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93U3ViZm9sZGVyU2VjdGlvbiAmJiAoc3ViZm9sZGVyVGlsZXMubGVuZ3RoIHx8IGN1cnJlbnRGb2xkZXJOb2RlPy5jaGlsZHJlbkxvYWRpbmcpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1tYi00IGNxYS1weC0zIGNxYS1weS0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJmb2xkZXJUaWxlcy5sZW5ndGggfHwgbW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC02MDAgY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIHt7IG1vZHVsYXJMYWJlbHMuc3ViZm9sZGVyc0luIH19IHt7IGJyZWFkY3J1bWJUcmFpbC5sZW5ndGggPyBicmVhZGNydW1iVHJhaWxbYnJlYWRjcnVtYlRyYWlsLmxlbmd0aCAtIDFdLm5hbWUgOiAnJyB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1ub3dyYXAgY3FhLWdhcC0zIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLXNjcm9sbGJhci10aGluIGNxYS1wYi0yXCJcbiAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25TdWJmb2xkZXJHcmlkU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGYgb2Ygc3ViZm9sZGVyVGlsZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NxYUZvbGRlckRyb3BdPVwiZi5pZFwiXG4gICAgICAgICAgICAgIFtkcm9wRW5hYmxlZF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJvblRlc3RzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQoZi5pZClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtc2hyaW5rLTAgY3FhLXctWzI0MHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVswLjVweF0gY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1ib3JkZXItWyMzRjQzRUVdIGhvdmVyOmNxYS1zaGFkb3ctc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb25DaGlwOyBjb250ZXh0OiB7IGNvbG9yOiBmLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNXB4XSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLXRydW5jYXRlIGNxYS1sZWFkaW5nLXRpZ2h0IGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IGYubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kdWxhckNvbmZpZy5zaG93Q291bnRzXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTUwMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGYuY291bnQgPz8gMCkgPT09IDEgPyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnJyArIChmLmNvdW50ID8/IDApKSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXNocmluay0wXCIgc3R5bGU9XCJmb250LXNpemU6MjBweDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBcIisgTmV3IGZvbGRlclwiIHRpbGUgLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoeyBwYXJlbnRJZDogc2VsZWN0ZWRGb2xkZXJJZCB9KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy1bI0ZBRkFGQV0gaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLWJnLXdoaXRlIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uQ2hpcFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNDAwXCI+e3sgbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcwJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gU3ViZm9sZGVyIGZldGNoIGluZGljYXRvci4gVHdvIGNhc2VzOlxuICAgICAgICAgICAgICAgICAtIERyaWxsLWluIGZldGNoOiBubyBzdWJmb2xkZXJUaWxlcyB5ZXQsIHJlbmRlciBhIGNlbnRlcmVkXG4gICAgICAgICAgICAgICAgICAgcm93IHNwaW5uZXIgc28gdGhlIHNlY3Rpb24gaXNuJ3QgZW1wdHkgZHVyaW5nIHRoZSBmZXRjaC5cbiAgICAgICAgICAgICAgICAgLSBQYWdpbmF0aW9uIGZldGNoOiB0aWxlcyBleGlzdCwgYW5jaG9yIGEgc21hbGwgc3Bpbm5lciBhdFxuICAgICAgICAgICAgICAgICAgIHRoZSByaWdodCBlZGdlIHNvIHRoZSB1c2VyIGtub3dzIHRoZSBuZXh0IHBhZ2UgaXMgbG9hZGluZy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEZvbGRlck5vZGU/LmNoaWxkcmVuTG9hZGluZ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXNocmluay0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LVs4MHB4XVwiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0xvYWRpbmcgc3ViZm9sZGVycydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPCEtLSBGb2xkZXIgcGFuZWwgaGVhZGVyIGFib3ZlIHRoZSB0YWJsZTogXCJIb3RlbCBTZWFyY2ggKDMpXCIgKyBDbGVhciBmaWx0ZXIgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgIWlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93VW5vcmdhbml6ZWRTZWN0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1tYi0xIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNCBjcWEtcHktMyBjcWEtcm91bmRlZC10LWxnIGNxYS1iZy1pbmRpZ28tNTAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWluZGlnby0xMDBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi45NTg1IDEwLjQ1ODVDMTIuOTU4NSAxMC43OSAxMi44MjY4IDExLjEwOCAxMi41OTI0IDExLjM0MjRDMTIuMzU4IDExLjU3NjggMTIuMDQgMTEuNzA4NSAxMS43MDg1IDExLjcwODVIMS43MDg1QzEuMzc2OTggMTEuNzA4NSAxLjA1OTAzIDExLjU3NjggMC44MjQ2MTMgMTEuMzQyNEMwLjU5MDE5MiAxMS4xMDggMC40NTg0OTYgMTAuNzkgMC40NTg0OTYgMTAuNDU4NVYxLjcwODVDMC40NTg0OTYgMS4zNzY5OCAwLjU5MDE5MiAxLjA1OTAzIDAuODI0NjEzIDAuODI0NjEzQzEuMDU5MDMgMC41OTAxOTIgMS4zNzY5OCAwLjQ1ODQ5NiAxLjcwODUgMC40NTg0OTZINC44MzM1TDYuMDgzNSAyLjMzMzVIMTEuNzA4NUMxMi4wNCAyLjMzMzUgMTIuMzU4IDIuNDY1MTkgMTIuNTkyNCAyLjY5OTYxQzEyLjgyNjggMi45MzQwMyAxMi45NTg1IDMuMjUxOTggMTIuOTU4NSAzLjU4MzVWMTAuNDU4NVpcIiBbYXR0ci5zdHJva2VdPVwiY3VycmVudEZvbGRlck5vZGU/LmNvbG9yIHx8ICcjM0Y0M0VFJ1wiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWluZGlnby03MDBcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudEZvbGRlck5vZGU/Lm5hbWUgfX0gKHt7IGN1cnJlbnRGb2xkZXJEaXJlY3RDb3VudCB9fSlcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTMgY3FhLXB5LTEgY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWluZGlnby03MDAgY3FhLWJnLXdoaXRlIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1pbmRpZ28tMjAwIGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQobnVsbClcIlxuICAgICAgICAgID57eyBtb2R1bGFyTGFiZWxzLmNsZWFyRmlsdGVyIH19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVW5vcmdhbml6ZWQgc2VjdGlvbiBoZWFkZXIgYXQgcm9vdCB2aWV3IC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmIGlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93VW5vcmdhbml6ZWRTZWN0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tYi0yIGNxYS1tdC0yXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2RDZENzRdXCIgc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+aW5ib3g8L21hdC1pY29uPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPnt7IG1vZHVsYXJMYWJlbHMudW5vcmdhbml6ZWQgfX08L2gzPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2RDZENzRdXCI+XG4gICAgICAgICAgICB7eyB1bm9yZ2FuaXplZENvdW50ID09PSAxID8gbW9kdWxhckxhYmVscy50ZXN0c0NvdW50U2luZ3VsYXIgOiBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyB1bm9yZ2FuaXplZENvdW50KSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWJsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLVs3cHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWJvcmRlci10IGNxYS1ib3JkZXItbCBjcWEtYm9yZGVyLXIgY3FhLWJvcmRlci1ncmV5LTIwMCBjcWEtcmVsYXRpdmUgY3FhLW92ZXJmbG93LXgtYXV0b1wiXG4gICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwicGFnZWRSb3dzICYmIHBhZ2VkUm93cy5sZW5ndGggPiAwID8gbnVsbCA6ICdib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQnXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihpc1RhYmxlTG9hZGluZyB8fCBpc1RhYmxlRGF0YUxvYWRpbmcpIHx8ICghZWZmZWN0aXZlSXNFbXB0eVN0YXRlICYmIHBhZ2VkUm93cyAmJiBwYWdlZFJvd3MubGVuZ3RoID4gMCk7IGVsc2Ugc3RvcnlFbXB0eVRwbFwiPlxuICAgICAgICAgICAgPGFwcC1keW5hbWljLXRhYmxlXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItYm90dG9tXT1cInBhZ2VkUm93cyAmJiBwYWdlZFJvd3MubGVuZ3RoID4gMCA/ICcxcHggc29saWQgcmdiKDIyNiwgMjI2LCAyMjcpJyA6IG51bGxcIlxuICAgICAgICAgICAgICBbY29sdW1uc109XCJjb21wdXRlZENvbHVtbnNcIlxuICAgICAgICAgICAgICBbZGF0YV09XCJwYWdlZFJvd3NcIlxuICAgICAgICAgICAgICBbcm93U2VsZWN0YWJsZV09XCJyb3dTZWxlY3RhYmxlXCJcbiAgICAgICAgICAgICAgW2VuYWJsZUxvY2FsU29ydF09XCJlbmFibGVMb2NhbFNvcnQgJiYgIWlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgICAgIFtpc1RhYmxlTG9hZGluZ109XCJpc1RhYmxlTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtpc1RhYmxlRGF0YUxvYWRpbmddPVwiaXNUYWJsZURhdGFMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW2NlbGxKc29uUGF0aEdldHRlcl09XCJjZWxsSnNvblBhdGhHZXR0ZXJcIlxuICAgICAgICAgICAgICBbb25Kc29uUGF0aENvcGllZEhhbmRsZXJdPVwib25Kc29uUGF0aENvcGllZEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbZW5hYmxlUm93UmVvcmRlcl09XCJpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgICAgICAocm93UmVvcmRlcik9XCJvblJvd1Jlb3JkZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzb3J0Q2hhbmdlKT1cInNvcnRDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlUYWJsZVRwbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS04XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWxsdXN0cmF0aW9ucy9lbXB0eS1zdGF0ZS5zdmdcIiBhbHQ9XCJObyBkYXRhXCIgY2xhc3M9XCJjcWEtdy0zMiBjcWEtaC0zMiBjcWEtbWItNFwiIC8+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1sZyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbWItMlwiPk5vIHRlc3QgY2FzZXM8L2gzPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTUwMCBjcWEtbWItNFwiPlRyeSBhZGp1c3RpbmcgZmlsdGVycyBvciBjcmVhdGUgYSBuZXcgdGVzdCBjYXNlLjwvcD5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiAoY2xpY2tlZCk9XCJ0b2dnbGVGaWx0ZXIoKVwiPlNob3cgRmlsdGVyczwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvYXBwLWR5bmFtaWMtdGFibGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3N0b3J5RW1wdHlUcGw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZWZmZWN0aXZlSXNFbXB0eVN0YXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIFtpbWFnZVVybF09XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uc109XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmFjdGlvbnNcIlxuICAgICAgICAgICAgICAgIChhY3Rpb25DbGljayk9XCJvbkVtcHR5QWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvY3FhLWVtcHR5LXN0YXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGNxYS1wYWdpbmF0aW9uXG4gICAgICAgICAgW3RvdGFsRWxlbWVudHNdPVwic2VydmVyU2lkZVBhZ2luYXRpb24gPyB0b3RhbEVsZW1lbnRzIDogZmlsdGVyZWRSb3dzLmxlbmd0aFwiXG4gICAgICAgICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICAgIFtwYWdlU2l6ZU1lbnVEaXJlY3Rpb25dPVwicGFnZVNpemVNZW51RGlyZWN0aW9uXCJcbiAgICAgICAgICBbcGFnZUl0ZW1Db3VudF09XCJwYWdlZFJvd3MubGVuZ3RoXCJcbiAgICAgICAgICAocGFnaW5hdGUpPVwib25QYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L2NxYS1wYWdpbmF0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJldXNlZCBidWxrIGFjdGlvbiB0b29sYmFyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhbnlSb3dTZWxlY3RlZCAmJiBtb2R1bGFyQ29uZmlnLmFsbG93QnVsa1NlbGVjdGlvbiAmJiAhaXNSZW9yZGVyaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1bMTguNzVweF0gY3FhLWxlZnQtWzUwJV0gY3FhLXRyYW5zbGF0ZS14LVstNTAlXSBjcWEtdy1mdWxsIGxnOmNxYS1tYXgtdy1bNjglXSBjcWEtc206bWF4LXctWzc1JV0gY3FhLW1heC13LVs5MCVdIGNxYS16LVsxXVwiPlxuICAgICAgPGNxYS10YWJsZS1hY3Rpb24tdG9vbGJhclxuICAgICAgICBbc2VsZWN0ZWRJdGVtc109XCJzZWxlY3RlZEl0ZW1zICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCA/IHNlbGVjdGVkSXRlbXMgOiBjdXJyZW50U2VsZWN0ZWRJdGVtc1wiXG4gICAgICAgIFthY3Rpb25zXT1cImVmZmVjdGl2ZUJ1bGtBY3Rpb25zXCJcbiAgICAgICAgW3Nob3dTZWxlY3RBbGxdPVwic2hvd1NlbGVjdEFsbEluVG9vbGJhclwiXG4gICAgICAgIFthbGxTZWxlY3RlZF09XCJhbGxTZWxlY3RlZEluVG9vbGJhclwiXG4gICAgICAgIFtzaG93RGlzbWlzc109XCJzaG93RGlzbWlzc0luVG9vbGJhclwiXG4gICAgICAgIChhY3Rpb25DbGljayk9XCJvbkJ1bGtBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RBbGxDaGFuZ2UpPVwib25CdWxrU2VsZWN0QWxsKCRldmVudClcIlxuICAgICAgICAoZGlzbWlzcyk9XCJvbkJ1bGtEaXNtaXNzKClcIlxuICAgICAgPjwvY3FhLXRhYmxlLWFjdGlvbi10b29sYmFyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
|