@cqa-lib/cqa-ui 1.1.549 → 1.1.550
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/dialog/dialog.component.mjs +15 -3
- package/esm2020/lib/dialog/dialog.models.mjs +1 -1
- package/esm2020/lib/templates/modular-table-template/dialogs/delete-folder-dialog.component.mjs +3 -3
- package/esm2020/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.mjs +11 -11
- package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +12 -5
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +68 -9
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +38 -10
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +3 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +133 -21
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +132 -21
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/dialog/dialog.component.d.ts +1 -0
- package/lib/dialog/dialog.models.d.ts +4 -0
- package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +18 -1
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +14 -1
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +6 -0
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -16,13 +16,12 @@ import * as i7 from "../../selected-filters/selected-filters.component";
|
|
|
16
16
|
import * as i8 from "../../filters/dynamic-filter/dynamic-filter.component";
|
|
17
17
|
import * as i9 from "./folder-sidebar/folder-sidebar.component";
|
|
18
18
|
import * as i10 from "@angular/material/icon";
|
|
19
|
-
import * as i11 from "
|
|
20
|
-
import * as i12 from "../../
|
|
21
|
-
import * as i13 from "../../
|
|
22
|
-
import * as i14 from "../../
|
|
23
|
-
import * as i15 from "
|
|
24
|
-
import * as i16 from "
|
|
25
|
-
import * as i17 from "./directives/folder-drop.directive";
|
|
19
|
+
import * as i11 from "../../table/dynamic-table/dynamic-table.component";
|
|
20
|
+
import * as i12 from "../../empty-state/empty-state.component";
|
|
21
|
+
import * as i13 from "../../pagination/pagination.component";
|
|
22
|
+
import * as i14 from "../../table-action-toolbar/table-action-toolbar.component";
|
|
23
|
+
import * as i15 from "@angular/common";
|
|
24
|
+
import * as i16 from "./directives/folder-drop.directive";
|
|
26
25
|
export class ModularTableTemplateComponent {
|
|
27
26
|
constructor(cdr, dialogService) {
|
|
28
27
|
this.cdr = cdr;
|
|
@@ -176,6 +175,12 @@ export class ModularTableTemplateComponent {
|
|
|
176
175
|
this.modularLabels = { ...DEFAULT_MODULAR_LABELS };
|
|
177
176
|
this.bulkActions = [];
|
|
178
177
|
this.sidebarCollapsed = false;
|
|
178
|
+
/** Controls whether the "Subfolders in {parent}" section is expanded.
|
|
179
|
+
* Two-way bindable as `[(subfolderSectionExpanded)]`. Defaults to true. */
|
|
180
|
+
this.subfolderSectionExpanded = true;
|
|
181
|
+
/** Controls whether the root-view "Organized" folder grid is expanded.
|
|
182
|
+
* Two-way bindable as `[(organizedSectionExpanded)]`. Defaults to true. */
|
|
183
|
+
this.organizedSectionExpanded = true;
|
|
179
184
|
/** Lazy-load: when true, the sidebar emits `searchChange` and skips its
|
|
180
185
|
* local name filter so the host can serve search results from the backend. */
|
|
181
186
|
this.serverSideSearch = false;
|
|
@@ -194,6 +199,9 @@ export class ModularTableTemplateComponent {
|
|
|
194
199
|
* the modular grid renders at the right edge of the Organized row, and is
|
|
195
200
|
* forwarded to the sidebar for its own loading affordance. */
|
|
196
201
|
this.rootFoldersLoading = false;
|
|
202
|
+
/** Folder ids whose host-side save (rename / move / etc.) is in flight.
|
|
203
|
+
* Forwarded to the sidebar for loading state. */
|
|
204
|
+
this.savingFolderIds = [];
|
|
197
205
|
/** Override for the currently-selected folder node. Used as a fallback when
|
|
198
206
|
* `findFolder(folders, selectedFolderId)` misses — e.g., during sidebar
|
|
199
207
|
* search when `folders` holds only the matched results, the selected
|
|
@@ -258,6 +266,8 @@ export class ModularTableTemplateComponent {
|
|
|
258
266
|
*/
|
|
259
267
|
this.bulkActionInvoked = new EventEmitter();
|
|
260
268
|
this.sidebarCollapsedChange = new EventEmitter();
|
|
269
|
+
this.subfolderSectionExpandedChange = new EventEmitter();
|
|
270
|
+
this.organizedSectionExpandedChange = new EventEmitter();
|
|
261
271
|
// ============================================================================
|
|
262
272
|
// Row-reorder surface
|
|
263
273
|
// ============================================================================
|
|
@@ -368,6 +378,14 @@ export class ModularTableTemplateComponent {
|
|
|
368
378
|
this.viewModeChange.emit(next);
|
|
369
379
|
}
|
|
370
380
|
}
|
|
381
|
+
toggleSubfolderSection() {
|
|
382
|
+
this.subfolderSectionExpanded = !this.subfolderSectionExpanded;
|
|
383
|
+
this.subfolderSectionExpandedChange.emit(this.subfolderSectionExpanded);
|
|
384
|
+
}
|
|
385
|
+
toggleOrganizedSection() {
|
|
386
|
+
this.organizedSectionExpanded = !this.organizedSectionExpanded;
|
|
387
|
+
this.organizedSectionExpandedChange.emit(this.organizedSectionExpanded);
|
|
388
|
+
}
|
|
371
389
|
/** Partial override for the default reorder labels ("Reorder", "Done", etc.). */
|
|
372
390
|
set reorderLabels(partial) {
|
|
373
391
|
this._reorderLabels = { ...DEFAULT_REORDER_LABELS, ...(partial || {}) };
|
|
@@ -1512,10 +1530,10 @@ export class ModularTableTemplateComponent {
|
|
|
1512
1530
|
}
|
|
1513
1531
|
ModularTableTemplateComponent.GRID_SCROLL_LOAD_THRESHOLD_PX = 96;
|
|
1514
1532
|
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 });
|
|
1515
|
-
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", folderSearchValue: "folderSearchValue", 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 [searchValue]=\"folderSearchValue\"\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", "searchValue"], 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 });
|
|
1533
|
+
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", subfolderSectionExpanded: "subfolderSectionExpanded", organizedSectionExpanded: "organizedSectionExpanded", serverSideSearch: "serverSideSearch", rootTotal: "rootTotal", folderSearchLoading: "folderSearchLoading", folderSearchValue: "folderSearchValue", rootFoldersLoading: "rootFoldersLoading", savingFolderIds: "savingFolderIds", 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", subfolderSectionExpandedChange: "subfolderSectionExpandedChange", organizedSectionExpandedChange: "organizedSectionExpandedChange", 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-flex-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 indeterminate loading spinner. Render via\n <ng-container *ngTemplateOutlet=\"loadingSpinner; context: { size: 20 }\"></ng-container>. -->\n<ng-template #loadingSpinner let-size=\"size\">\n <svg [attr.width]=\"size || 20\" [attr.height]=\"size || 20\" viewBox=\"0 0 50 50\" aria-label=\"loading\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"></circle>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\" dur=\"0.8s\" repeatCount=\"indefinite\"></animateTransform>\n </path>\n </svg>\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-flex-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-2 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 [savingFolderIds]=\"savingFolderIds\"\n [searchValue]=\"folderSearchValue\"\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-2 cqa-text-sm cqa-px-3 cqa-py-2 cqa-rounded-none cqa-min-w-0\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-flex-1 cqa-min-w-0 cqa-overflow-x-auto cqa-scrollbar-thin cqa-whitespace-nowrap\">\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1 cqa-flex-shrink-0\" (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 cqa-flex-shrink-0\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-flex-shrink-0\"\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 </div>\n <cqa-button\n *ngIf=\"modularConfig.showSubfolderSection && subfolderTiles.length\"\n class=\"cqa-flex-shrink-0\"\n variant=\"text\"\n btnSize=\"sm\"\n customClass=\"!cqa-text-[13px] !cqa-leading-[18px]\"\n [icon]=\"subfolderSectionExpanded ? 'expand_less' : 'expand_more'\"\n [text]=\"(subfolderSectionExpanded ? 'Hide' : 'Show') + ' subfolders'\"\n [attr.aria-expanded]=\"subfolderSectionExpanded\"\n (clicked)=\"toggleSubfolderSection()\"\n ></cqa-button>\n <cqa-button\n *ngIf=\"modularConfig.allowCreateFolder\"\n class=\"cqa-flex-shrink-0\"\n variant=\"text\"\n btnSize=\"sm\"\n customClass=\"!cqa-text-[13px] !cqa-leading-[18px]\"\n icon=\"add\"\n [text]=\"modularLabels.newFolder\"\n (clicked)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n ></cqa-button>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-px-5 cqa-pt-2\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-w-full cqa-text-left\"\n [attr.aria-expanded]=\"organizedSectionExpanded\"\n (click)=\"toggleOrganizedSection()\"\n >\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 <mat-icon class=\"cqa-text-[#6D6D74] cqa-ml-auto\" style=\"font-size:18px;width:18px;height:18px\">\n {{ organizedSectionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div\n class=\"cqa-grid\"\n style=\"transition: grid-template-rows 300ms cubic-bezier(0.4, 0, 0.2, 1);\"\n [style.grid-template-rows]=\"organizedSectionExpanded ? '1fr' : '0fr'\"\n >\n <div class=\"cqa-min-h-0\" style=\"overflow: hidden;\">\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-1\"\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-flex-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-flex-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-flex-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-flex-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 <ng-container *ngTemplateOutlet=\"loadingSpinner; context: { size: 20 }\"></ng-container>\n </div>\n </div>\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-grid\"\n style=\"transition: grid-template-rows 300ms cubic-bezier(0.4, 0, 0.2, 1);\"\n [style.grid-template-rows]=\"subfolderSectionExpanded ? '1fr' : '0fr'\"\n >\n <div class=\"cqa-min-h-0\" style=\"overflow: hidden;\">\n <div class=\"cqa-px-3 cqa-py-2 cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin\"\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-flex-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-flex-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-flex-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-flex-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 <ng-container *ngTemplateOutlet=\"loadingSpinner; context: { size: 20 }\"></ng-container>\n </div>\n </div>\n </div>\n </section>\n\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganizedSection\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-border cqa-border-indigo-100\"\n style=\"background-color: #D8D9FC;\"\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\" stroke=\"#3F43EE\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold\" style=\"color: #3F43EE;\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <cqa-button\n variant=\"outlined\"\n btnSize=\"sm\"\n customClass=\"!cqa-text-[13px]\"\n inlineStyles=\"border-color: #3F43EE; color: #3F43EE;\"\n [text]=\"modularLabels.clearFilter\"\n (clicked)=\"onFolderSelected(null)\"\n ></cqa-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 <div class=\"cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [class.cqa-modular-table-flush]=\"isModularView\"\n [attr.style]=\"(!isModularView ? 'border-radius: 7px;' : '') + ((pagedRows && pagedRows.length > 0) ? '' : ' 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", "foldersAccordionExpanded", "labels", "serverSideSearch", "rootTotal", "folderSearchLoading", "rootFoldersLoading", "savingFolderIds", "searchValue"], outputs: ["folderSelected", "folderExpansionToggled", "folderChildrenRequested", "folderLoadMoreRequested", "searchChange", "rootLoadMoreRequested", "folderCreated", "folderCreateRequested", "folderRenamed", "folderDeleted", "folderMoveRequested", "folderDuplicateRequested", "testsDropped", "folderDropped", "collapsedChange", "foldersAccordionExpandedChange"] }, { type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.DynamicTableComponent, selector: "app-dynamic-table", inputs: ["data", "columns", "emptyState", "gridTemplateColumns", "screenWidth", "enableSelectAll", "rowSelectable", "enableLocalSort", "isTableLoading", "isTableDataLoading", "cellJsonPathGetter", "onJsonPathCopiedHandler", "enableRowReorder", "reorderHandleTooltip"], outputs: ["sortChange", "rowReorder"] }, { type: i12.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }, { type: i13.PaginationComponent, selector: "cqa-pagination", inputs: ["totalElements", "totalPages", "pageIndex", "pageSize", "pageItemCount", "pageSizeOptions", "pageSizeMenuDirection"], outputs: ["pageIndexChange", "pageSizeChange", "paginate"] }, { type: i14.TableActionToolbarComponent, selector: "cqa-table-action-toolbar", inputs: ["selectedItems", "actions", "showSelectAll", "allSelected", "showDismiss"], outputs: ["actionClick", "selectAllChange", "dismiss"] }], directives: [{ type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i15.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i15.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i15.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i16.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1516
1534
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ModularTableTemplateComponent, decorators: [{
|
|
1517
1535
|
type: Component,
|
|
1518
|
-
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 [searchValue]=\"folderSearchValue\"\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: [] }]
|
|
1536
|
+
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-flex-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 indeterminate loading spinner. Render via\n <ng-container *ngTemplateOutlet=\"loadingSpinner; context: { size: 20 }\"></ng-container>. -->\n<ng-template #loadingSpinner let-size=\"size\">\n <svg [attr.width]=\"size || 20\" [attr.height]=\"size || 20\" viewBox=\"0 0 50 50\" aria-label=\"loading\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"></circle>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\" dur=\"0.8s\" repeatCount=\"indefinite\"></animateTransform>\n </path>\n </svg>\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-flex-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-2 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 [savingFolderIds]=\"savingFolderIds\"\n [searchValue]=\"folderSearchValue\"\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-2 cqa-text-sm cqa-px-3 cqa-py-2 cqa-rounded-none cqa-min-w-0\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-flex-1 cqa-min-w-0 cqa-overflow-x-auto cqa-scrollbar-thin cqa-whitespace-nowrap\">\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1 cqa-flex-shrink-0\" (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 cqa-flex-shrink-0\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-flex-shrink-0\"\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 </div>\n <cqa-button\n *ngIf=\"modularConfig.showSubfolderSection && subfolderTiles.length\"\n class=\"cqa-flex-shrink-0\"\n variant=\"text\"\n btnSize=\"sm\"\n customClass=\"!cqa-text-[13px] !cqa-leading-[18px]\"\n [icon]=\"subfolderSectionExpanded ? 'expand_less' : 'expand_more'\"\n [text]=\"(subfolderSectionExpanded ? 'Hide' : 'Show') + ' subfolders'\"\n [attr.aria-expanded]=\"subfolderSectionExpanded\"\n (clicked)=\"toggleSubfolderSection()\"\n ></cqa-button>\n <cqa-button\n *ngIf=\"modularConfig.allowCreateFolder\"\n class=\"cqa-flex-shrink-0\"\n variant=\"text\"\n btnSize=\"sm\"\n customClass=\"!cqa-text-[13px] !cqa-leading-[18px]\"\n icon=\"add\"\n [text]=\"modularLabels.newFolder\"\n (clicked)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n ></cqa-button>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-px-5 cqa-pt-2\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-w-full cqa-text-left\"\n [attr.aria-expanded]=\"organizedSectionExpanded\"\n (click)=\"toggleOrganizedSection()\"\n >\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 <mat-icon class=\"cqa-text-[#6D6D74] cqa-ml-auto\" style=\"font-size:18px;width:18px;height:18px\">\n {{ organizedSectionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div\n class=\"cqa-grid\"\n style=\"transition: grid-template-rows 300ms cubic-bezier(0.4, 0, 0.2, 1);\"\n [style.grid-template-rows]=\"organizedSectionExpanded ? '1fr' : '0fr'\"\n >\n <div class=\"cqa-min-h-0\" style=\"overflow: hidden;\">\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-1\"\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-flex-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-flex-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-flex-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-flex-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 <ng-container *ngTemplateOutlet=\"loadingSpinner; context: { size: 20 }\"></ng-container>\n </div>\n </div>\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-grid\"\n style=\"transition: grid-template-rows 300ms cubic-bezier(0.4, 0, 0.2, 1);\"\n [style.grid-template-rows]=\"subfolderSectionExpanded ? '1fr' : '0fr'\"\n >\n <div class=\"cqa-min-h-0\" style=\"overflow: hidden;\">\n <div class=\"cqa-px-3 cqa-py-2 cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin\"\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-flex-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-flex-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-flex-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-flex-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 <ng-container *ngTemplateOutlet=\"loadingSpinner; context: { size: 20 }\"></ng-container>\n </div>\n </div>\n </div>\n </section>\n\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganizedSection\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-border cqa-border-indigo-100\"\n style=\"background-color: #D8D9FC;\"\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\" stroke=\"#3F43EE\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold\" style=\"color: #3F43EE;\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <cqa-button\n variant=\"outlined\"\n btnSize=\"sm\"\n customClass=\"!cqa-text-[13px]\"\n inlineStyles=\"border-color: #3F43EE; color: #3F43EE;\"\n [text]=\"modularLabels.clearFilter\"\n (clicked)=\"onFolderSelected(null)\"\n ></cqa-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 <div class=\"cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [class.cqa-modular-table-flush]=\"isModularView\"\n [attr.style]=\"(!isModularView ? 'border-radius: 7px;' : '') + ((pagedRows && pagedRows.length > 0) ? '' : ' 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: [] }]
|
|
1519
1537
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }]; }, propDecorators: { searchPlaceholder: [{
|
|
1520
1538
|
type: Input
|
|
1521
1539
|
}], searchValue: [{
|
|
@@ -1646,6 +1664,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1646
1664
|
type: Input
|
|
1647
1665
|
}], sidebarCollapsed: [{
|
|
1648
1666
|
type: Input
|
|
1667
|
+
}], subfolderSectionExpanded: [{
|
|
1668
|
+
type: Input
|
|
1669
|
+
}], organizedSectionExpanded: [{
|
|
1670
|
+
type: Input
|
|
1649
1671
|
}], serverSideSearch: [{
|
|
1650
1672
|
type: Input
|
|
1651
1673
|
}], rootTotal: [{
|
|
@@ -1656,6 +1678,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1656
1678
|
type: Input
|
|
1657
1679
|
}], rootFoldersLoading: [{
|
|
1658
1680
|
type: Input
|
|
1681
|
+
}], savingFolderIds: [{
|
|
1682
|
+
type: Input
|
|
1659
1683
|
}], selectedFolderNode: [{
|
|
1660
1684
|
type: Input
|
|
1661
1685
|
}], selectedFolderTrail: [{
|
|
@@ -1694,6 +1718,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1694
1718
|
type: Output
|
|
1695
1719
|
}], sidebarCollapsedChange: [{
|
|
1696
1720
|
type: Output
|
|
1721
|
+
}], subfolderSectionExpandedChange: [{
|
|
1722
|
+
type: Output
|
|
1723
|
+
}], organizedSectionExpandedChange: [{
|
|
1724
|
+
type: Output
|
|
1697
1725
|
}], showReorderButton: [{
|
|
1698
1726
|
type: Input
|
|
1699
1727
|
}], reorderSaving: [{
|
|
@@ -1732,4 +1760,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1732
1760
|
}], columnVisibility: [{
|
|
1733
1761
|
type: Input
|
|
1734
1762
|
}] } });
|
|
1735
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxhci10YWJsZS10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBS1osdUJBQXVCLEVBR3ZCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFLbEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQWlCdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN2RixNQUFNLE9BQU8sNkJBQTZCO0lBb1h4QyxZQUFvQixHQUFzQixFQUFVLGFBQTRCO1FBQTVELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFuWGhGLG9CQUFvQjtRQUNYLHNCQUFpQixHQUFXLG1CQUFtQixDQUFDO1FBQ2hELGdCQUFXLEdBQVcsRUFBRSxD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QU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDNEIsc0JBQXNCO3NCQUF4RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFtR3BCLGdCQUFnQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0ZpbHRlckl0ZW0sIER5bmFtaWNGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9maWx0ZXJzL2R5bmFtaWMtZmlsdGVyL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi90YWJsZS9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENvbHVtblZpc2liaWxpdHlDb25maWcgfSBmcm9tICcuLi8uLi9jb2x1bW4tdmlzaWJpbGl0eS9jb2x1bW4tdmlzaWJpbGl0eS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb24gfSBmcm9tICcuLi8uLi90YWJsZS1hY3Rpb24tdG9vbGJhci90YWJsZS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbmZpZyB9IGZyb20gJy4uLy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRU1QVFlfU1RBVEVfSU1BR0VTIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2ltYWdlcy9pbWFnZS1hc3NldHMuY29uc3RhbnRzJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0NPTkZJRyxcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgREVGQVVMVF9SRU9SREVSX0xBQkVMUyxcbiAgRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgRm9sZGVyQ3JlYXRlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVN0cmF0ZWd5LFxuICBGb2xkZXJEZWxldGVkUGF5bG9hZCxcbiAgRm9sZGVySWRBY2Nlc3NvcixcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkLFxuICBGb2xkZXJNb3ZlZFBheWxvYWQsXG4gIEZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIE1vZHVsYXJDb25maWcsXG4gIE1vZHVsYXJMYWJlbHMsXG4gIFJlb3JkZXJMYWJlbHMsXG4gIFJlb3JkZXJTYXZlUGF5bG9hZCxcbiAgVGVzdHNNb3ZlZFBheWxvYWQsXG4gIEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZCxcbn0gZnJvbSAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5pbXBvcnQgeyBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbmV3LWZvbGRlci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZUZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9kZWxldGUtZm9sZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW9kdWxhci10YWJsZS10ZW1wbGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvLyBTZWFyY2ggYmFyIGlucHV0c1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBjb21wb25lbnRzJztcbiAgQElucHV0KCkgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0V4cG9ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBTZWFyY2ggYmFyIG91dHB1dHNcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBvbkV4cG9ydENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrPzogJ1dFQkRSSVZFUl9JTycgfCAnU0VMRU5JVU1fSkFWQSc7IHNlbGVjdGVkSXRlbXM6IGFueVtdIH0gfCB2b2lkPigpO1xuICAvLyBGaWx0ZXIgb3V0cHV0c1xuICBAT3V0cHV0KCkgb25BcHBseUZpbHRlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblJlc2V0RmlsdGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvbkNsZWFyQWxsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlQ2hpcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIEZpbHRlciBpbnB1dHNcbiAgQElucHV0KCkgZmlsdGVyQ29uZmlnOiBEeW5hbWljRmlsdGVySXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGZpbHRlck1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBPdGhlciBidXR0b25zIGlucHV0IChhcnJheSBvZiBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBPdGhlciBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBkcm9wZG93biBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyRHJvcERvd25CdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIE90aGVyIHNlbGVjdCBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBzZWxlY3QgZHJvcGRvd24gYnV0dG9uIHRlbXBsYXRlcy9jb21wb25lbnRzKVxuICBASW5wdXQoKSBvdGhlclNlbGVjdERyb3BEb3duQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBMZWdhY3kgc2luZ2xlIGJ1dHRvbiBpbnB1dHMgKGRlcHJlY2F0ZWQsIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25MYWJlbDogc3RyaW5nID0gJ090aGVyIEJ1dHRvbic7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25WYXJpYW50OiAnZmlsbGVkJyB8ICdvdXRsaW5lZCcgfCAndGV4dCcgfCAnZWxldmF0ZWQnIHwgJ3RvbmFsJyB8ICdncmV5LXNvbGlkJyA9ICdmaWxsZWQnO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIG90aGVyQnV0dG9ucyBhcnJheSBpbnN0ZWFkICovXG4gIEBJbnB1dCgpIHNob3dPdGhlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBBY3Rpb24gbWVudSBidXR0b24gKHRocmVlLWRvdCBtZW51IGluIHRhYmxlIHJvd3MpXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFNldHRpbmdzIGFuZCByZWZyZXNoIGJ1dHRvbnNcbiAgQElucHV0KCkgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0F1dG9SZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBWaWV3LW1vZGUgdG9nZ2xlIChMaXN0IHwgTW9kdWxhcikuIEhpZGRlbiBieSBkZWZhdWx0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICBASW5wdXQoKSBzaG93Vmlld01vZGVUb2dnbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdmlld01vZGU6ICdsaXN0JyB8ICdtb2R1bGFyJyA9ICdsaXN0JztcbiAgQElucHV0KCkgdmlld01vZGVMYWJlbHM6IHsgbGlzdDogc3RyaW5nOyBtb2R1bGFyOiBzdHJpbmcgfSA9IHsgbGlzdDogJ0xpc3QnLCBtb2R1bGFyOiAnTW9kdWxhcicgfTtcbiAgQE91dHB1dCgpIHZpZXdNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnbGlzdCcgfCAnbW9kdWxhcic+KCk7XG5cbiAgZ2V0IHZpZXdNb2RlU2VnbWVudHMoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5saXN0LCB2YWx1ZTogJ2xpc3QnLCBpY29uOiAndmlld19saXN0JyB9LFxuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5tb2R1bGFyLCB2YWx1ZTogJ21vZHVsYXInLCBpY29uOiAnZm9sZGVyJyB9LFxuICAgIF07XG4gIH1cblxuICBvblZpZXdNb2RlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPT09ICdtb2R1bGFyJyA/ICdtb2R1bGFyJyA6ICdsaXN0JztcbiAgICBpZiAobmV4dCAhPT0gdGhpcy52aWV3TW9kZSkge1xuICAgICAgdGhpcy52aWV3TW9kZSA9IG5leHQ7XG4gICAgICB0aGlzLnZpZXdNb2RlQ2hhbmdlLmVtaXQobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGF0YSBpbnB1dFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuXG4gIC8vIEVtcHR5IHN0YXRlIGlucHV0c1xuICBASW5wdXQoKSBpc0VtcHR5U3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZUNvbmZpZzogRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICB0aXRsZTogJ05vIERhdGEgQXZhaWxhYmxlIFlldCcsXG4gICAgZGVzY3JpcHRpb246ICdSdW4gb3IgdXBsb2FkIHlvdXIgZmlyc3QgdGVzdCB0byBzZWUgeW91ciBhbmFseXRpY3MgYW5kIHRyZW5kcyBoZXJlLiBXYXRjaCB5b3VyIHF1YWxpdHkgbWV0cmljcyBjb21lIHRvIGxpZmUgd2l0aCByZWFsLXRpbWUgaW5zaWdodHMuJyxcbiAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLkRBU0hCT0FSRCxcbiAgICBhY3Rpb25zOiBbeyBsYWJlbDogJ1J1biBUZXN0IFN1aXRlJywgdmFyaWFudDogJ2ZpbGxlZCcgfV0sXG4gIH07XG5cbiAgLy8gQWN0aW9uIGJhciBpbnB1dHNcbiAgQElucHV0KCkgYWN0aW9uczogVGFibGVBY3Rpb25bXSA9IFtcbiAgICB7IFxuICAgICAgaWQ6ICdkZWxldGUnLCBcbiAgICAgIGxhYmVsOiAnRGVsZXRlJywgXG4gICAgICBpY29uOiAnZGVsZXRlJywgXG4gICAgICB0b29sdGlwOiAnRGVsZXRlIHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdlZGl0JywgXG4gICAgICBsYWJlbDogJ0VkaXQnLCBcbiAgICAgIGljb246ICdlZGl0JywgXG4gICAgICB0b29sdGlwOiAnRWRpdCBzZWxlY3RlZCcsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnRWRpdCBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2FkZC10YWcnLCBcbiAgICAgIGxhYmVsOiAnQWRkIFRhZycsIFxuICAgICAgaWNvbjogJ2xvY2FsX29mZmVyJywgXG4gICAgICB0b29sdGlwOiAnQWRkIHRhZ3MnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FkZCB0YWcgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdyZW1vdmUtdGFnJywgXG4gICAgICBsYWJlbDogJ1JlbW92ZSBUYWcnLCBcbiAgICAgIGljb246ICdsYWJlbF9vZmYnLCBcbiAgICAgIHRvb2x0aXA6ICdSZW1vdmUgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICBdO1xuXG4gIC8vIENoaXBzIGlucHV0c1xuICBASW5wdXQoKSBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICBASW5wdXQoKSBmaWx0ZXJBcHBsaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gVGFibGUgaW5wdXRzXG4gIEBJbnB1dCgpIGNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHJvd1NlbGVjdGFibGU/OiAocm93OiBhbnkpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgcGFnZUluZGV4OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbMTAsIDIwLCA0MCwgNjAsIDgwXTtcbiAgQElucHV0KCkgcGFnZVNpemVNZW51RGlyZWN0aW9uOiAnYXV0bycgfCAndXAnIHwgJ2Rvd24nID0gJ2F1dG8nO1xuICAvLyBTZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIGNvbnRyb2xzXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRvdGFsRWxlbWVudHM6IG51bWJlciA9IDA7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0+KCk7XG4gIC8qKlxuICAgKiBXaGVuIGZhbHNlLCBoZWFkZXIgc29ydCBkb2VzIG5vdCByZW9yZGVyIHJvd3MgbG9jYWxseSAodXNlIHdpdGggc2VydmVyU2lkZVBhZ2luYXRpb24gKyBzb3J0Q2hhbmdlKS5cbiAgICogRGVmYXVsdCB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlTG9jYWxTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBmaWVsZElkOiBzdHJpbmc7XG4gICAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbDtcbiAgfT4oKTtcbiAgLy8gTG9hZGVyIGNvbnRyb2xzIChwYXNzZWQgZG93biB0byBkeW5hbWljIHRhYmxlKVxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEJhY2t3YXJkLWNvbXBhdGliaWxpdHkgZmxhZzsgaWYgcHJvdmlkZWQsIGR5bmFtaWMgdGFibGUgd2lsbCB1c2UgaXQgd2hlbiBzcGVjaWZpYyBmbGFncyBhcmUgdW5kZWZpbmVkXG5cbiAgLy8gT3B0aW9uYWwgZ2V0dGVyIGZvciBKU09OIHBhdGggcGVyIGNlbGwuIFdoZW4gcHJvdmlkZWQsIGRvdWJsZS1jbGlja2luZyBhIGNlbGwgY29waWVzIHRoZSBwYXRoLlxuICBASW5wdXQoKSBjZWxsSnNvblBhdGhHZXR0ZXI/OiAocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZywgcm93OiBhbnkpID0+IHN0cmluZztcblxuICAvLyBPcHRpb25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIGEgSlNPTiBwYXRoIGlzIGNvcGllZCBmcm9tIGEgdGFibGUgY2VsbFxuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogc3RyaW5nIH0pID0+IHZvaWQ7XG5cbiAgLy8gU2VsZWN0ZWQgaXRlbXMgKGZ1bGwgb2JqZWN0cykgZm9yIG1haW50YWluaW5nIHNlbGVjdGlvbiBhY3Jvc3MgcGFnaW5hdGlvbiAoc2VydmVyLXNpZGUpXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIFwiU2VsZWN0IGFsbFwiIGFmZm9yZGFuY2UuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqIGZvciBub3cg4oCUIGhvc3Qgb3B0cyBpbi4gTWF0Y2hlcyB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50IHRvIGhpZGUgU2VsZWN0IEFsbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dTZWxlY3RBbGxJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIGRpc21pc3MgKMOXKSBhZmZvcmRhbmNlLiBEZWZhdWx0cyB0byBmYWxzZVxuICAgKiBmb3Igbm93IOKAlCBob3N0IG9wdHMgaW4uIE1hdGNoZXMgdGhlIGN1cnJlbnQgcHJvZHVjdCByZXF1aXJlbWVudCB0byBoaWRlIENhbmNlbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dEaXNtaXNzSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBCb3VuZCB0byB0aGUgdG9vbGJhcidzIFwiU2VsZWN0IGFsbFwiIGNoZWNrYm94IOKAlCBkcml2ZXMgdGhlIGNoZWNrZWQgc3RhdGUuICovXG4gIEBJbnB1dCgpIGFsbFNlbGVjdGVkSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIGNvbHVtbiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgX2NvbHVtblZpc2liaWxpdHk6IENvbHVtblZpc2liaWxpdHlDb25maWcgPSB7fTtcbiAgcHJpdmF0ZSBfY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICBmaWx0ZXJlZFJvd3M6IGFueVtdID0gW107XG4gIHBhZ2VkUm93czogYW55W10gPSBbXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaW5wdXRzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgQElucHV0KCkgZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIC8qKiBIb3N0LXByb3ZpZGVkIHNuYXBzaG90IG9mIHJvb3QtbGV2ZWwgZm9sZGVycyBmb3IgdGhlIFwiT3JnYW5pemVkXCIgZ3JpZC5cbiAgICogIFdoZW4gc2V0LCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYHRoaXMuZm9sZGVyc2AgZm9yIGByb290Rm9sZGVyVGlsZXNgIHNvXG4gICAqICB0aGUgT3JnYW5pemVkIHNlY3Rpb24gc3RheXMgc3RhYmxlIHdoaWxlIHNpZGViYXIgc2VhcmNoIHN3YXBzIGBmb2xkZXJzYFxuICAgKiAgdG8gYSBmaWx0ZXJlZCByZXN1bHQgc2V0LiBNaXJyb3JzIHRoZSBob3N0LWRyaXZlbiBmYWxsYmFjayBwYXR0ZXJuIHVzZWRcbiAgICogIGJ5IGBzZWxlY3RlZEZvbGRlck5vZGVgIChzdWJmb2xkZXJzKSBhbmQgYHNlbGVjdGVkRm9sZGVyVHJhaWxgIChicmVhZGNydW1iKS4gKi9cbiAgQElucHV0KCkgcm9vdEZvbGRlcnM6IEZvbGRlck5vZGVbXSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZWxlY3RlZEZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZXhwYW5kZWRGb2xkZXJJZHM6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIHVub3JnYW5pemVkQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGZvbGRlcklkQWNjZXNzb3I6IEZvbGRlcklkQWNjZXNzb3IgPSAocm93OiBhbnkpID0+IHJvdz8uZm9sZGVySWQgPz8gbnVsbDtcbiAgQElucHV0KCkgbW9kdWxhckNvbmZpZzogTW9kdWxhckNvbmZpZyA9IHsgLi4uREVGQVVMVF9NT0RVTEFSX0NPTkZJRyB9O1xuICBASW5wdXQoKSBtb2R1bGFyTGFiZWxzOiBNb2R1bGFyTGFiZWxzID0geyAuLi5ERUZBVUxUX01PRFVMQVJfTEFCRUxTIH07XG4gIEBJbnB1dCgpIGJ1bGtBY3Rpb25zOiBUYWJsZUFjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIHNpZGViYXJDb2xsYXBzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExhenktbG9hZDogd2hlbiB0cnVlLCB0aGUgc2lkZWJhciBlbWl0cyBgc2VhcmNoQ2hhbmdlYCBhbmQgc2tpcHMgaXRzXG4gICAqICBsb2NhbCBuYW1lIGZpbHRlciBzbyB0aGUgaG9zdCBjYW4gc2VydmUgc2VhcmNoIHJlc3VsdHMgZnJvbSB0aGUgYmFja2VuZC4gKi9cbiAgQElucHV0KCkgc2VydmVyU2lkZVNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTGF6eS1sb2FkOiBiYWNrZW5kLXJlcG9ydGVkIHRvdGFsIHJvb3QgZm9sZGVycy4gRHJpdmVzIHRoZSBzaWRlYmFyJ3NcbiAgICogIHRvcC1sZXZlbCBcIkxvYWQgbW9yZVwiIGFmZm9yZGFuY2Ugd2hlbiBgZm9sZGVycy5sZW5ndGggPCByb290VG90YWxgLiAqL1xuICBASW5wdXQoKSByb290VG90YWw6IG51bWJlciA9IDA7XG4gIC8qKiBMYXp5LWxvYWQ6IHRydWUgd2hpbGUgdGhlIGhvc3QgaXMgZmV0Y2hpbmcgc2VydmVyLXNpZGUgZm9sZGVyLXNlYXJjaFxuICAgKiAgcmVzdWx0cy4gRm9yd2FyZGVkIHRvIHRoZSBzaWRlYmFyIHNvIGl0IGNhbiByZW5kZXIgYSBzZWFyY2ggc3Bpbm5lci4gKi9cbiAgQElucHV0KCkgZm9sZGVyU2VhcmNoTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogU2VlZGVkIHZhbHVlIGZvciB0aGUgc2lkZWJhcidzIHNlYXJjaCBpbnB1dC4gRXhwb3NlZCBzbyBob3N0cyBjYW4gcmVzdG9yZVxuICAgKiAgYW4gaW4tZmxpZ2h0IGZvbGRlci1zZWFyY2ggYWNyb3NzIHNpZGViYXIgZGVzdHJveS9yZS1jcmVhdGUgY3ljbGVzIChlLmcuLFxuICAgKiAgdG9nZ2xpbmcgb3V0IG9mIGFuZCBiYWNrIGludG8gbW9kdWxhciB2aWV3KS4gKi9cbiAgQElucHV0KCkgZm9sZGVyU2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICAvKiogTGF6eS1sb2FkOiB0cnVlIHdoaWxlIGEgcm9vdC1wYWdlIGZldGNoIGlzIGluIGZsaWdodCAoaW5pdGlhbCBsb2FkIE9SXG4gICAqICB0aGUgc2Nyb2xsLWRyaXZlbiBcImxvYWQgbW9yZVwiIHBhZ2luYXRpb24pLiBEcml2ZXMgdGhlIGxvYWRpbmcgaW5kaWNhdG9yXG4gICAqICB0aGUgbW9kdWxhciBncmlkIHJlbmRlcnMgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIE9yZ2FuaXplZCByb3csIGFuZCBpc1xuICAgKiAgZm9yd2FyZGVkIHRvIHRoZSBzaWRlYmFyIGZvciBpdHMgb3duIGxvYWRpbmcgYWZmb3JkYW5jZS4gKi9cbiAgQElucHV0KCkgcm9vdEZvbGRlcnNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBPdmVycmlkZSBmb3IgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgbm9kZS4gVXNlZCBhcyBhIGZhbGxiYWNrIHdoZW5cbiAgICogIGBmaW5kRm9sZGVyKGZvbGRlcnMsIHNlbGVjdGVkRm9sZGVySWQpYCBtaXNzZXMg4oCUIGUuZy4sIGR1cmluZyBzaWRlYmFyXG4gICAqICBzZWFyY2ggd2hlbiBgZm9sZGVyc2AgaG9sZHMgb25seSB0aGUgbWF0Y2hlZCByZXN1bHRzLCB0aGUgc2VsZWN0ZWRcbiAgICogIGZvbGRlciBtYXkgbm90IGJlIGFtb25nIHRoZW0sIGJ1dCBpdHMgYnJlYWRjcnVtYiAvIGhlYWRlciBsYWJlbCBzdGlsbFxuICAgKiAgbmVlZHMgdG8gcmVuZGVyLiBUaGUgaG9zdCBvd25zIHRoZSBsb29rdXAgYWdhaW5zdCBpdHMgZnVsbCBmb2xkZXIgbWFwLiAqL1xuICBASW5wdXQoKSBzZWxlY3RlZEZvbGRlck5vZGU6IEZvbGRlck5vZGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIEhvc3QtcHJvdmlkZWQgYnJlYWRjcnVtYiBzbmFwc2hvdCBmb3IgdGhlIHNlbGVjdGVkIGZvbGRlci4gVXNlZCBhcyBhXG4gICAqICBmYWxsYmFjayBpbiBgYnJlYWRjcnVtYlRyYWlsYCB3aGVuIGBidWlsZFRyYWlsYCBhZ2FpbnN0IGB0aGlzLmZvbGRlcnNgXG4gICAqICB5aWVsZHMgZW1wdHkg4oCUIHRoZSBjYW5vbmljYWwgY2FzZSBpcyBzaWRlYmFyIHNlYXJjaCwgd2hlcmUgYGZvbGRlcnNgXG4gICAqICBpcyB0aGUgc2VhcmNoLXJlc3VsdHMgbGlzdCBhbmQgdGhlIHNlbGVjdGVkIGZvbGRlcidzIGFuY2VzdG9ycyBhcmVuJ3RcbiAgICogIHByZXNlbnQuIFRoZSBob3N0IHdhbGtzIGBwYXJlbnRJZGAgY2hhaW5zIHRvIGJ1aWxkIHRoaXM7IHBhcnRpYWwgdHJhaWxzXG4gICAqICBhcmUgYWNjZXB0YWJsZSB3aGVuIGFuY2VzdG9ycyBoYXZlbid0IGJlZW4gZmV0Y2hlZCB5ZXQuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVyVHJhaWw6IEZvbGRlck5vZGVbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCB0aGUgbGlicmFyeSBvcGVucyBpdHMgb3duIE1vdmUgZGlhbG9nIGZvciBjb252ZW5pZW5jZVxuICAgKiBkdXJpbmcgdGVzdGluZy4gSG9zdHMgdGFraW5nIG92ZXIgQVBJICsgVVggc2hvdWxkIHNldCB0aGlzIHRvIGBmYWxzZWAgYW5kXG4gICAqIGxpc3RlbiBvbiBgbW92ZVJlcXVlc3RlZGAgdG8gcmVuZGVyIHRoZWlyIG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHVzZUludGVybmFsRGlhbG9nczogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGb2xkZXIgLyBtb2R1bGFyIG91dHB1dHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBAT3V0cHV0KCkgZm9sZGVyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJFeHBhbnNpb25Ub2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0+KCk7XG4gIC8qKiBMYXp5LWxvYWQ6IHJlLWVtaXR0ZWQgZnJvbSB0aGUgc2lkZWJhciB3aGVuIHRoZSB1c2VyIGV4cGFuZHMgYSBub2RlIHdob3NlXG4gICAqICBjaGlsZHJlbiBoYXZlbid0IGJlZW4gZmV0Y2hlZCB5ZXQuIEhvc3QgcmVzcG9uZHMgYnkgZmV0Y2hpbmcgdGhhdCBzdWJ0cmVlLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ2hpbGRyZW5SZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgLyoqIExhenktbG9hZDogcmUtZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgcGVyLWZvbGRlciBcIkxvYWQgbW9yZVwiLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgbmV4dFBhZ2U6IG51bWJlciB9PigpO1xuICAvKiogTGF6eS1sb2FkOiByZS1lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIi4gKi9cbiAgQE91dHB1dCgpIHJvb3RMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIExhenktbG9hZDogZGVib3VuY2VkIHNpZGViYXItc2VhcmNoIHRlcm0uIENvbnN1bWVkIGJ5IGhvc3RzIHRoYXQgaGF2ZVxuICAgKiAgc2V0IGBzZXJ2ZXJTaWRlU2VhcmNoPXRydWVgIHRvIHJlZmV0Y2ggdGhlIHRyZWUgZnJvbSB0aGUgYmFja2VuZC4gKi9cbiAgQE91dHB1dCgpIGZvbGRlclNlYXJjaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyQ3JlYXRlZFBheWxvYWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiKyBOZXcgZm9sZGVyXCI7IGhvc3Qgc2hvdWxkIG9wZW4gYSBjcmVhdGlvbiBtb2RhbC4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckNyZWF0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICBAT3V0cHV0KCkgZm9sZGVyUmVuYW1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyUmVuYW1lZFBheWxvYWQ+KCk7XG4gIC8qKlxuICAgKiBGaXJlcyBhZnRlciB0aGUgdXNlciBjb25maXJtcyBmb2xkZXIgZGVsZXRpb24gdmlhIHRoZSBpbnRlcm5hbCBkaWFsb2cgKG9yXG4gICAqIGltbWVkaWF0ZWx5LCB3aGVuIGB1c2VJbnRlcm5hbERpYWxvZ3NgIGlzIGZhbHNlIGFuZCB0aGUgaG9zdCBkcml2ZXMgdGhlIFVYKS5cbiAgICogUGF5bG9hZCBub3cgaW5jbHVkZXMgdGhlIHVzZXIncyBjaG9zZW4gYHN0cmF0ZWd5YCBmb3Igd2hhdCBoYXBwZW5zIHRvIHRoZVxuICAgKiBmb2xkZXIncyB0ZXN0IGNhc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvbGRlckRlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckRlbGV0ZWRQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgdGVzdHNNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdHNNb3ZlZFBheWxvYWQ+KCk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEJ1bGsgYWN0aW9uIHRvb2xiYXIgc3VyZmFjZSDigJQgbmFtaW5nIG1pcnJvcnMgY3FhLXRhYmxlLXRlbXBsYXRlIHNvIGNvbnN1bWVyc1xuICAvLyBnZXQgdGhlIHNhbWUgZXZlbnRzIGZyb20gZWl0aGVyIGNvbXBvbmVudCAocGx1cyB0aGUgZm9sZGVyIGV2ZW50cyBiZWxvdykuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBGaXJlcyBvbiByYXcgdG9vbGJhciBhY3Rpb24gY2xpY2sg4oCUICpiZWZvcmUqIGFueSBpbnRlcm5hbCBkaWFsb2cgb3BlbnMuICovXG4gIEBPdXRwdXQoKSBidWxrQWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZzsgc2VsZWN0ZWQ6IGFueVtdIH0+KCk7XG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB0b29sYmFyJ3MgXCJTZWxlY3QgYWxsXCIgaXMgdG9nZ2xlZC4gKi9cbiAgQE91dHB1dCgpIGJ1bGtTZWxlY3RBbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB0b29sYmFyJ3MgZGlzbWlzcyAow5cpIGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBidWxrRGlzbWlzcyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgKmFmdGVyKiB0aGUgbGlicmFyeS1pbnRlcm5hbCBtb3ZlLXRvLWZvbGRlciBkaWFsb2cgcmVzb2x2ZXMgd2l0aCBhXG4gICAqIHVzZXIgY29uZmlybWF0aW9uLCBPUiBpbW1lZGlhdGVseSBmb3Igbm9uLWRpYWxvZyBidWxrIGFjdGlvbnMgc3VwcGxpZWQgYnlcbiAgICogdGhlIGhvc3QuIEhvc3RzIHdpdGggdGhlaXIgb3duIFVYIHNob3VsZCBsaXN0ZW4gb24gYGJ1bGtBY3Rpb25DbGlja2AgK1xuICAgKiBgbW92ZVJlcXVlc3RlZGAgYW5kIHRyZWF0IHRoaXMgYXMgdGhlIFwiY29uZmlybWVkXCIgc2lnbmFsLlxuICAgKi9cbiAgQE91dHB1dCgpIGJ1bGtBY3Rpb25JbnZva2VkID0gbmV3IEV2ZW50RW1pdHRlcjxCdWxrQWN0aW9uSW52b2tlZFBheWxvYWQ+KCk7XG5cbiAgQE91dHB1dCgpIHNpZGViYXJDb2xsYXBzZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSb3ctcmVvcmRlciBzdXJmYWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIFdoZW4gdHJ1ZSwgcmVuZGVycyBhIFwiUmVvcmRlclwiIGJ1dHRvbiBpbiB0aGUgdG9vbGJhci4gSG9zdC1kcml2ZW4uICovXG4gIEBJbnB1dCgpIHNob3dSZW9yZGVyQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBIb3N0IGZsaXBzIHRoaXMgdHJ1ZSB3aGlsZSBpdHMgYnVsay11cGRhdGUgQVBJIGNhbGwgaXMgaW4tZmxpZ2h0LiBUaGVcbiAgICogY29tcG9uZW50IGtlZXBzIHRoZSByZW9yZGVyIFVJIHBpbm5lZCAoXCJTYXZpbmcuLi5cIikgd2hpbGUgdHJ1ZSBhbmQgZXhpdHNcbiAgICogcmVvcmRlciBtb2RlIHdoZW4gaXQgZmxpcHMgYmFjayB0byBmYWxzZSAodGhlIFwiZnV0dXJlIEFQSSBjYWxsXCIgaG9vaykuXG4gICAqL1xuICBASW5wdXQoKSByZW9yZGVyU2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBQYXJ0aWFsIG92ZXJyaWRlIGZvciB0aGUgZGVmYXVsdCByZW9yZGVyIGxhYmVscyAoXCJSZW9yZGVyXCIsIFwiRG9uZVwiLCBldGMuKS4gKi9cbiAgQElucHV0KCkgc2V0IHJlb3JkZXJMYWJlbHMocGFydGlhbDogUGFydGlhbDxSZW9yZGVyTGFiZWxzPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Jlb3JkZXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfUkVPUkRFUl9MQUJFTFMsIC4uLihwYXJ0aWFsIHx8IHt9KSB9O1xuICB9XG4gIGdldCByZW9yZGVyTGFiZWxzKCk6IFJlb3JkZXJMYWJlbHMge1xuICAgIHJldHVybiB0aGlzLl9yZW9yZGVyTGFiZWxzO1xuICB9XG4gIHByaXZhdGUgX3Jlb3JkZXJMYWJlbHM6IFJlb3JkZXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfUkVPUkRFUl9MQUJFTFMgfTtcblxuICAvKiogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJSZW9yZGVyXCIgYW5kIHRoZSBjb21wb25lbnQgZW50ZXJzIHJlb3JkZXIgbW9kZS4gKi9cbiAgQE91dHB1dCgpIHJlb3JkZXJTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiQ2FuY2VsXCIg4oCUIHRoZSBvcmlnaW5hbCBvcmRlciBpcyBhbHJlYWR5IHJlc3RvcmVkLiAqL1xuICBAT3V0cHV0KCkgcmVvcmRlckNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiRG9uZVwiLiBIb3N0IHNob3VsZCB0YWtlIGBvcmRlcmVkSXRlbXNgLCBjYWxsIGl0c1xuICAgKiBidWxrLXVwZGF0ZSBBUEksIHJlZnJlc2ggYFtkYXRhXWAsIGFuZCBmbGlwIGByZW9yZGVyU2F2aW5nYCBiYWNrIHRvIGBmYWxzZWAg4oCUXG4gICAqIHRoZSBjb21wb25lbnQgd2lsbCB0aGVuIGV4aXQgcmVvcmRlciBtb2RlLlxuICAgKlxuICAgKiBOb3RlOiBmb3Igc2VydmVyLXNpZGUgcGFnaW5hdGlvbiwgYG9yZGVyZWRJdGVtc2AgaXMgdGhlICpjdXJyZW50IHBhZ2Ugc2xpY2UqLFxuICAgKiBub3QgdGhlIGZ1bGwgZGF0YXNldCDigJQgc2FtZSBhcyB0aGUgaW4tbWVtb3J5IHZpZXcgdGhlIHVzZXIgd2FzIGRyYWdnaW5nLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlb3JkZXJTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyU2F2ZVBheWxvYWQ+KCk7XG5cbiAgLyoqIEludGVybmFsIOKAlCB0cnVlIHdoaWxlIHRoZSB1c2VyIGlzIGluIHJlb3JkZXIgbW9kZS4gKi9cbiAgaXNSZW9yZGVyaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBTbmFwc2hvdCBvZiBgcGFnZWRSb3dzYCB0YWtlbiBvbiBlbnRlcjsgdXNlZCB0byByZXZlcnQgb24gY2FuY2VsLiAqL1xuICBwcml2YXRlIHJlb3JkZXJTbmFwc2hvdDogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLyoqIERyYWZ0IG9mIHRoZSByZW9yZGVyZWQgcm93cyAoY3VycmVudCB3b3JraW5nIHN0YXRlKS4gKi9cbiAgcHJpdmF0ZSByZW9yZGVyRHJhZnQ6IGFueVtdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBBdXRvLXJlZnJlc2ggaW50ZXJ2YWwgY2FwdHVyZWQgb24gZW50ZXIsIHNvIHdlIGNhbiByZXN0b3JlIG9uIGNhbmNlbC9kb25lLiAqL1xuICBwcml2YXRlIHJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoOiBudW1iZXIgPSAwO1xuICAvKiogVHJ1ZSBhZnRlciBEb25lIGhhcyBiZWVuIGNsaWNrZWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYHJlb3JkZXJTYXZpbmdgIOKGkiBmYWxzZSBmbGlwLiAqL1xuICBwcml2YXRlIHJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcIk1vdmUgdG8gZm9sZGVyXCIgYnVsayBhY3Rpb24g4oCUICpiZWZvcmUqIHRoZVxuICAgKiBpbnRlcm5hbCBkaWFsb2cgb3BlbnMuIEhvc3RzIHRoYXQgd2FudCB0byByZW5kZXIgdGhlaXIgb3duIG1vZGFsIHNob3VsZFxuICAgKiBzZXQgYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgbGlzdGVuIGhlcmUuXG4gICAqL1xuICBAT3V0cHV0KCkgbW92ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gICAgc2VsZWN0ZWQ6IGFueVtdO1xuICAgIGN1cnJlbnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbDtcbiAgICBmb2xkZXJzOiBGb2xkZXJOb2RlW107XG4gIH0+KCk7XG5cbiAgLyoqIEZpcmVzIHdoZW5ldmVyIHRoZSBjb21wb25lbnQncyBgc2VsZWN0ZWRJdGVtc2AgY2hhbmdlcyBmcm9tIHdpdGhpbiAoU2VsZWN0IEFsbCAvIERpc21pc3MpLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgZm9sZGVyJ3MgZGVsZXRlIGFmZm9yZGFuY2Ug4oCUICpiZWZvcmUqIHRoZVxuICAgKiBpbnRlcm5hbCBjb25maXJtYXRpb24gZGlhbG9nIG9wZW5zLiBIb3N0cyBvd25pbmcgdGhlIFVYIGxpc3RlbiBoZXJlLlxuICAgKiBQYXlsb2FkIGluY2x1ZGVzIGB0ZXN0Q291bnRgICsgYGhhc1BhcmVudGAgc28gaG9zdHMgY2FuIHJlbmRlciB0aGUgcmlnaHRcbiAgICogb3B0aW9ucyBpbiB0aGVpciBvd24gbW9kYWwuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRGVsZXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJEZWxldGVSZXF1ZXN0ZWRQYXlsb2FkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIHBpY2tzIFwiTW92ZSBmb2xkZXJcIiBmcm9tIGEgZm9sZGVyIHJvdydzIGNvbnRleHQgbWVudSDigJRcbiAgICogKmJlZm9yZSogYW55IGRpYWxvZyBvcGVucy4gSG9zdHMgb3duaW5nIHRoZSBVWCBsaXN0ZW4gaGVyZSB3aXRoXG4gICAqIGB1c2VJbnRlcm5hbERpYWxvZ3MgPSBmYWxzZWAgYW5kIG9wZW4gdGhlaXIgb3duIGZvbGRlciBwaWNrZXIuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyTW92ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyTW92ZVJlcXVlc3RlZFBheWxvYWQ+KCk7XG4gIC8qKlxuICAgKiBGaXJlcyBhZnRlciB0aGUgdXNlciBjb25maXJtcyBhIGZvbGRlciBtb3ZlIHZpYSB0aGUgaW50ZXJuYWwgcGlja2VyXG4gICAqIChvciBpbW1lZGlhdGVseSB3aGVuIGB1c2VJbnRlcm5hbERpYWxvZ3MgPSBmYWxzZWAgYW5kIHRoZSBob3N0IGRyaXZlcyBpdCkuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyTW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlck1vdmVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgcGlja3MgXCJEdXBsaWNhdGUgZm9sZGVyXCIgZnJvbSBhIGZvbGRlciByb3cncyBjb250ZXh0IG1lbnUuXG4gICAqIFRoZSBsaWJyYXJ5IGRvZXNuJ3Qgb3duIHBlcnNpc3RlbmNlLCBzbyB0aGUgaG9zdCBpcyBleHBlY3RlZCB0byBjbG9uZSB0aGVcbiAgICogZm9sZGVyJ3Mgc3VidHJlZSBzZXJ2ZXItc2lkZSBhbmQgKnJlZmVyZW5jZSogKG5vdCBjb3B5KSB0aGUgdGVzdCBjYXNlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZFBheWxvYWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHt9XG4gIHByaXZhdGUgcGVuZGluZ0ZpbHRlcnM6IGFueTtcbiAgcHJpdmF0ZSBhcHBsaWVkRmlsdGVyczogYW55O1xuICBwcml2YXRlIGF1dG9SZWZyZXNoVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIEBPdXRwdXQoKSBvblJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9uQXV0b1JlZnJlc2hDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtblZpc2liaWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtblZpc2liaWxpdHlDb25maWc+KCk7XG4gIEBPdXRwdXQoKSBhdXRvUmVmcmVzaEludGVydmFsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBWaWV3Q2hpbGQoRHluYW1pY0ZpbHRlckNvbXBvbmVudCkgZHluYW1pY0ZpbHRlckNvbXBvbmVudD86IER5bmFtaWNGaWx0ZXJDb21wb25lbnQ7XG5cbiAgLy8gRGVyaXZlZCBjb2x1bW5zIHdpdGggdmlzaWJpbGl0eSBhcHBsaWVkLlxuICBjb21wdXRlZENvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIC8vIEF1dG8tZ2VuZXJhdGVkIHZpc2liaWxpdHkgY29sdW1ucyBmcm9tIGNvbHVtbnMgaW5wdXRcbiAgdmlzaWJpbGl0eUNvbHVtbnM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuXG4gIHByaXZhdGUgdXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2liaWxpdHkgPSB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5IHx8IHt9O1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICBjb25zdCBtYXBwZWQgPSBzb3VyY2UubWFwKGNvbCA9PiB7XG4gICAgICBpZiAoWydjaGVja2JveCcsICdhY3Rpb25zJ10uaW5jbHVkZXMoY29sLmZpZWxkSWQpKSB7XG4gICAgICAgIHJldHVybiBjb2w7XG4gICAgICB9XG4gICAgICBjb25zdCBzaG93ID0gdmlzaWJpbGl0eVtjb2wuZmllbGRJZF07XG4gICAgICByZXR1cm4geyAuLi5jb2wsIGlzU2hvdzogc2hvdyAhPT0gZmFsc2UgfTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm1vZHVsYXJDb25maWc/LnNob3dGb2xkZXJDb2x1bW4gJiYgIW1hcHBlZC5zb21lKGMgPT4gYy5maWVsZElkID09PSBGT0xERVJfQ09MVU1OX0ZJRUxEX0lEKSkge1xuICAgICAgY29uc3QgZm9sZGVyU2hvdyA9IHZpc2liaWxpdHlbRk9MREVSX0NPTFVNTl9GSUVMRF9JRF07XG4gICAgICBjb25zdCBmb2xkZXJDb2w6IER5bmFtaWNUYWJsZUNvbHVtbiA9IHtcbiAgICAgICAgLi4udGhpcy5idWlsZEZvbGRlckNvbHVtbigpLFxuICAgICAgICBpc1Nob3c6IGZvbGRlclNob3cgIT09IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIC8vIEluc2VydCBiZWZvcmUgdGhlIHRyYWlsaW5nICdhY3Rpb25zJyBjb2x1bW4gd2hlbiBwcmVzZW50IHNvIHRoZSBmb2xkZXJcbiAgICAgIC8vIGNvbHVtbiByZWFkcyBhcyB0aGUgbGFzdCBkYXRhIGNvbHVtbiByYXRoZXIgdGhhbiBhZnRlciB0aGUgYWN0aW9uIG1lbnUuXG4gICAgICBjb25zdCBhY3Rpb25zSWR4ID0gbWFwcGVkLmZpbmRJbmRleChjID0+IGMuZmllbGRJZCA9PT0gJ2FjdGlvbnMnKTtcbiAgICAgIGlmIChhY3Rpb25zSWR4ID49IDApIHtcbiAgICAgICAgbWFwcGVkLnNwbGljZShhY3Rpb25zSWR4LCAwLCBmb2xkZXJDb2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnB1c2goZm9sZGVyQ29sKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbXB1dGVkQ29sdW1ucyA9IG1hcHBlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb2xkZXJDb2x1bW4oKTogRHluYW1pY1RhYmxlQ29sdW1uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRJZDogRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgICAgIGZpZWxkTmFtZTogdGhpcy5tb2R1bGFyTGFiZWxzPy5mb2xkZXJDb2x1bW5MYWJlbCB8fCAnRm9sZGVyJyxcbiAgICAgIC8vIExldHMgdGhlIGR5bmFtaWMgdGFibGUgc29ydC9maWx0ZXIgb24gdGhlIHJlc29sdmVkIG5hbWUgd2l0aG91dCBnb2luZ1xuICAgICAgLy8gdGhyb3VnaCByZW5kZXIoKSDigJQgYWxzbyBtYWtlcyBgcm93LmZvbGRlck5hbWVgIGEgZmlyc3QtY2xhc3MgZmllbGRcbiAgICAgIC8vIGFsb25nc2lkZSByb3cucHJpb3JpdHkgZXRjLiBmb3IgZG93bnN0cmVhbSBjb2RlLlxuICAgICAgZmllbGRWYWx1ZTogJ2ZvbGRlck5hbWUnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICAvLyBpc0RlZmF1bHQgPT09IGZhbHNlIG1hcmtzIHRoZSBjb2x1bW4gYXMgXCJ1c2VyLXRvZ2dsZWFibGVcIiDigJQgaXQgc2hvd3MgdXBcbiAgICAgIC8vIGluIG1hcFZpc2liaWxpdHlDb2x1bW5zIGFuZCB0aGVyZWZvcmUgaW4gdGhlIHNldHRpbmdzIGRyb3Bkb3duLlxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHJlbmRlcjogKHJvdzogYW55KSA9PiB0aGlzLnJlbmRlckZvbGRlckNlbGwocm93KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRm9sZGVyTmFtZShyb3c6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHJvdyAmJiB0eXBlb2Ygcm93LmZvbGRlck5hbWUgPT09ICdzdHJpbmcnICYmIHJvdy5mb2xkZXJOYW1lKSB7XG4gICAgICByZXR1cm4gcm93LmZvbGRlck5hbWU7XG4gICAgfVxuICAgIGNvbnN0IGZvbGRlcklkID0gdGhpcy5mb2xkZXJJZEFjY2Vzc29yID8gdGhpcy5mb2xkZXJJZEFjY2Vzc29yKHJvdykgOiByb3c/LmZvbGRlcklkO1xuICAgIGNvbnN0IG5vZGUgPSBmb2xkZXJJZCAhPSBudWxsID8gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgZm9sZGVySWQgYXMgbnVtYmVyKSA6IG51bGw7XG4gICAgcmV0dXJuIG5vZGU/Lm5hbWUgfHwgdGhpcy5tb2R1bGFyTGFiZWxzPy51bm9yZ2FuaXplZFJvd0xhYmVsIHx8ICdVbm9yZ2FuaXplZCc7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgZGVyaXZlZCBgZm9sZGVyTmFtZWAgdG8gZWFjaCByb3cgd2hlbiB0aGUgaG9zdCBoYXNuJ3Qgc3VwcGxpZWRcbiAgICogb25lLiBNdXRhdGVzIGluIHBsYWNlIHNvIHRoZSB2YWx1ZSBpcyBhdmFpbGFibGUgZXZlcnl3aGVyZSB0aGUgcm93IGZsb3dzXG4gICAqIOKAlCBzb3J0LCBmaWx0ZXIsIGNvbHVtbiByZW5kZXJzLCBleHBvcnRzIOKAlCBhbG9uZ3NpZGUgZmllbGRzIGxpa2UgcHJpb3JpdHkuXG4gICAqL1xuICBwcml2YXRlIGVucmljaFJvd3NXaXRoRm9sZGVyTmFtZShyb3dzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmICghcm93IHx8IHR5cGVvZiByb3cgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmICh0eXBlb2Ygcm93LmZvbGRlck5hbWUgPT09ICdzdHJpbmcnICYmIHJvdy5mb2xkZXJOYW1lKSBjb250aW51ZTtcbiAgICAgIHJvdy5mb2xkZXJOYW1lID0gdGhpcy5yZXNvbHZlRm9sZGVyTmFtZShyb3cpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRm9sZGVyQ2VsbChyb3c6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVzb2x2ZUZvbGRlck5hbWUocm93KTtcbiAgICBjb25zdCBlc2NhcGVkID0gbmFtZS5yZXBsYWNlKC9bJjw+XCInXS9nLCBjaCA9PiAoe1xuICAgICAgJyYnOiAnJmFtcDsnLCAnPCc6ICcmbHQ7JywgJz4nOiAnJmd0OycsICdcIic6ICcmcXVvdDsnLCBcIidcIjogJyYjMzk7JyxcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW2NoXSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS10ZXh0LVsjNkQ2RDc0XVwiPmAgK1xuICAgICAgICBgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+YCArXG4gICAgICAgICAgYDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPmAgK1xuICAgICAgICBgPC9zdmc+YCArXG4gICAgICAgIGA8c3Bhbj4ke2VzY2FwZWR9PC9zcGFuPmAgK1xuICAgICAgYDwvc3Bhbj5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eUNvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnMgPSB0aGlzLm1hcFZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgdGhpcy52aXNpYmlsaXR5Q29sdW1ucyA9IHRoaXMuX2NhY2hlZFZpc2liaWxpdHlDb2x1bW5zO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gQ29udHJvbGxlZCBjb2x1bW4gdmlzaWJpbGl0eTogcGFyZW50IGNhbiBzZWVkIGFuZCBwdXNoIHVwZGF0ZXMuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5WaXNpYmlsaXR5KGNmZzogQ29sdW1uVmlzaWJpbGl0eUNvbmZpZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChjZmcpIHtcbiAgICAgIHRoaXMuX2NvbHVtblZpc2liaWxpdHkgPSB7IC4uLmNmZyB9O1xuICAgICAgdGhpcy51cGRhdGVDb21wdXRlZENvbHVtbnMoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBnZXQgY29sdW1uVmlzaWJpbGl0eSgpOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uVmlzaWJpbGl0eTtcbiAgfVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2lzRW1wdHlTdGF0ZSddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbHVtbnMnXSB8fCBjaGFuZ2VzWydtb2R1bGFyQ29uZmlnJ10gfHwgY2hhbmdlc1snbW9kdWxhckxhYmVscyddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5WaXNpYmlsaXR5KCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZm9sZGVycyddICYmICFjaGFuZ2VzWydmb2xkZXJzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIEZvbGRlciBuYW1lIGxvb2t1cCBsaXZlcyBpbnNpZGUgdGhlIGNvbHVtbidzIHJlbmRlcigpOyByZWJ1aWxkIHRoZVxuICAgICAgLy8gY29sdW1ucyBhcnJheSBzbyB0aGUgZHluYW1pYyB0YWJsZSdzIE9uUHVzaCBDRCBwaWNrcyB1cCB0aGUgbmV3IHJlZlxuICAgICAgLy8gYW5kIHJlLWludm9rZXMgcmVuZGVyKCkgd2l0aCB0aGUgbGF0ZXN0IGZvbGRlcnMuIEFsc28gcmVmcmVzaCBhbnlcbiAgICAgIC8vIHJvd3Mgd2UndmUgcHJldmlvdXNseSBlbnJpY2hlZCBzbyBzb3J0L2ZpbHRlciBvbiByb3cuZm9sZGVyTmFtZVxuICAgICAgLy8gcmVmbGVjdHMgdGhlIG5ldyBmb2xkZXIgbGlzdC5cbiAgICAgIHRoaXMuZW5yaWNoUm93c1dpdGhGb2xkZXJOYW1lKHRoaXMuZGF0YSk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRGb2xkZXJJZCddICYmICFjaGFuZ2VzWydzZWxlY3RlZEZvbGRlcklkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIFBlciB0aGUgYXBwcm92ZWQgcGxhbjogY2xlYXIgc2VsZWN0aW9uIGFuZCByZXNldCBwYWdpbmF0aW9uIG9uIGZvbGRlciBjaGFuZ2UuXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZXdNb2RlJ10gJiYgIWNoYW5nZXNbJ3ZpZXdNb2RlJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIFN3aXRjaGluZyBiZXR3ZWVuIGxpc3QgYW5kIG1vZHVsYXIgY2hhbmdlcyB3aGV0aGVyIHRoZSBmb2xkZXIgZmlsdGVyIGFwcGxpZXMuXG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEl0ZW1zJ10gfHwgY2hhbmdlc1snZGF0YSddKSB7XG4gICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sncmVvcmRlclNhdmluZyddICYmICFjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5vd1NhdmluZyA9ICEhY2hhbmdlc1sncmVvcmRlclNhdmluZyddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIC8vIEhvc3QgZmluaXNoZWQgaXRzIGJ1bGstdXBkYXRlIGNhbGwg4oCUIGV4aXQgcmVvcmRlciBtb2RlLlxuICAgICAgaWYgKCFub3dTYXZpbmcgJiYgdGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCkge1xuICAgICAgICB0aGlzLmV4aXRSZW9yZGVyTW9kZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbXBvbmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5U3RhdGUpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gW107XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW5yaWNoUm93c1dpdGhGb2xkZXJOYW1lKHRoaXMuZGF0YSk7XG5cbiAgICAvLyBJbiBzZXJ2ZXItc2lkZSBtb2RlLCBhc3N1bWUgaW5jb21pbmcgZGF0YSBpcyBhbHJlYWR5IGEgcGFnZSBzbGljZVxuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cyA9IFsuLi50aGlzLmRhdGFdO1xuICAgICAgdGhpcy5wYWdlZFJvd3MgPSBbLi4udGhpcy5maWx0ZXJlZFJvd3NdO1xuICAgICAgdGhpcy5pbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpO1xuICAgICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYGZpbHRlcmVkUm93c2AgZnJvbSBgZGF0YWAgYnkgYXBwbHlpbmcgKGEpIHRoZSBmaWVsZCBmaWx0ZXJzIChzdGF0dXMvcHJpb3JpdHkvZXRjLilcbiAgICogYW5kIChiKSB0aGUgZm9sZGVyIGZpbHRlciBkZXJpdmVkIGZyb20gYHNlbGVjdGVkRm9sZGVySWRgICsgYGZvbGRlcklkQWNjZXNzb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkRmlsdGVyZWRSb3dzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVmZmVjdGl2ZSA9IHRoaXMuYXBwbGllZEZpbHRlcnMgPz8ge307XG4gICAgdGhpcy5maWx0ZXJlZFJvd3MgPSB0aGlzLmRhdGEuZmlsdGVyKHIgPT4gdGhpcy5wYXNzRmlsdGVycyhlZmZlY3RpdmUsIHIpICYmIHRoaXMucGFzc0ZvbGRlcihyKSk7XG4gIH1cblxuICBwcml2YXRlIHBhc3NGb2xkZXIocm93OiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBMaXN0IHZpZXcgaWdub3JlcyBmb2xkZXIgZmlsdGVyaW5nIGVudGlyZWx5IOKAlCBiZWhhdmVzIGxpa2UgdGhlIHRyYWRpdGlvbmFsIGZsYXQgdGFibGUuXG4gICAgaWYgKCF0aGlzLmlzTW9kdWxhclZpZXcpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGZvbGRlcklkID0gdGhpcy5mb2xkZXJJZEFjY2Vzc29yID8gdGhpcy5mb2xkZXJJZEFjY2Vzc29yKHJvdykgOiByb3c/LmZvbGRlcklkO1xuICAgIC8vIFJvb3Qgdmlldzogc2hvdyBvbmx5IHJvd3MgdGhhdCBkbyBub3QgYmVsb25nIHRvIGFueSBmb2xkZXIgKHRoZSBcIlVub3JnYW5pemVkXCIgYnVja2V0KS5cbiAgICAvLyBGb2xkZXIgdGlsZXMgYWJvdmUgdGhlIHRhYmxlIGFyZSB0aGUgZW50cnkgcG9pbnQgdG8gcGVyLWZvbGRlciBjb250ZW50cy5cbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmb2xkZXJJZCA9PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZm9sZGVySWQgIT0gbnVsbCAmJiBTdHJpbmcoZm9sZGVySWQpID09PSBTdHJpbmcodGhpcy5zZWxlY3RlZEZvbGRlcklkKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmVuZGVyIHRoZSBtb2R1bGFyIChmb2xkZXItYXdhcmUpIFVJLiAqL1xuICBnZXQgaXNNb2R1bGFyVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aWV3TW9kZSA9PT0gJ21vZHVsYXInO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBJRHMgZnJvbSBzZWxlY3RlZEl0ZW1zIChvYmplY3RzKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZElkcygpOiBTZXQ8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcyAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXQodGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChpdGVtID0+IE51bWJlcihpdGVtLmlkKSkuZmlsdGVyKGlkID0+ICFpc05hTihpZCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVNlbGVjdGlvblN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzU2V0ID0gdGhpcy5nZXRTZWxlY3RlZElkcygpO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzU2V0LnNpemUgPT09IDApIHtcbiAgICAgIC8vIElmIG5vIHNlbGVjdGVkIElEcywgY2xlYXIgYWxsIHNlbGVjdGlvbiBzdGF0ZXNcbiAgICAgIGlmICh0aGlzLnBhZ2VkUm93cykge1xuICAgICAgICB0aGlzLnBhZ2VkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgKHJvdyBhcyBhbnkpLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc2VsZWN0aW9uIHN0YXRlIGJhc2VkIG9uIHNlbGVjdGVkSXRlbXNcbiAgICBpZiAodGhpcy5wYWdlZFJvd3MpIHtcbiAgICAgIHRoaXMucGFnZWRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgaWYgKHJvdyAmJiByb3cuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChyb3cgYXMgYW55KS5pc1NlbGVjdGVkID0gc2VsZWN0ZWRJZHNTZXQuaGFzKE51bWJlcihyb3cuaWQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxzbyB1cGRhdGUgZmlsdGVyZWRSb3dzIGZvciBjb25zaXN0ZW5jeVxuICAgIGlmICh0aGlzLmZpbHRlcmVkUm93cykge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93ICYmIHJvdy5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHJvdyBhcyBhbnkpLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZElkc1NldC5oYXMoTnVtYmVyKHJvdy5pZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgLy8gQ2FjaGUgdmlzaWJpbGl0eSBjb2x1bW5zIHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBhcnJheXMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIHRoaXMuX2NhY2hlZFZpc2liaWxpdHlDb2x1bW5zID0gdGhpcy5tYXBWaXNpYmlsaXR5Q29sdW1ucygpO1xuICAgIC8vIFNlZWQgdmlzaWJpbGl0eSBzdGF0ZSBmcm9tIGVhY2ggY29sdW1uJ3MgaXNTaG93IChkZWZhdWx0IHRvIHRydWUpIHNvIGNvbnN1bWVyc1xuICAgIC8vIGNhbiBwcmUtYXBwbHkgcGVyc2lzdGVkIHByZWZlcmVuY2VzIHZpYSBjb2x1bW5zW2ldLmlzU2hvdy5cbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLl9jb2x1bW5WaXNpYmlsaXR5W2NvbC5pZF0gIT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzb3VyY2UuZmluZChjID0+IGMuZmllbGRJZCA9PT0gY29sLmlkKTtcbiAgICAgIGlmIChzcmNDb2wpIHtcbiAgICAgICAgLy8gSG9zdC1zdXBwbGllZCBjb2x1bW4g4oCUIGhvbm91ciBpdHMgaXNTaG93IGV4YWN0bHksIGluY2x1ZGluZyBmb3IgdGhlXG4gICAgICAgIC8vIGZvbGRlciBjb2x1bW4uIEhvc3RzIHdhbnRpbmcgdmlldy1tb2RlLWF3YXJlIGRlZmF1bHRzIHNob3VsZCBzZXRcbiAgICAgICAgLy8gaXNTaG93IHRoZW1zZWx2ZXMuXG4gICAgICAgIHRoaXMuX2NvbHVtblZpc2liaWxpdHlbY29sLmlkXSA9IHNyY0NvbC5pc1Nob3cgIT09IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaWQgPT09IEZPTERFUl9DT0xVTU5fRklFTERfSUQpIHtcbiAgICAgICAgLy8gQXV0by1pbmplY3RlZCBmb2xkZXIgY29sdW1uIChob3N0IGRpZCBub3Qgc3VwcGx5IG9uZSk6IGRlZmF1bHQgdG9cbiAgICAgICAgLy8gdmlzaWJsZSBpbiBsaXN0IHZpZXcsIGhpZGRlbiBpbiBtb2R1bGFyIHZpZXcuIFRoZSB1c2VyJ3MgdG9nZ2xlXG4gICAgICAgIC8vIHBlcnNpc3RzIGFjcm9zcyB2aWV3TW9kZSBmbGlwcyBvbmNlIHNlZWRlZC5cbiAgICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gdGhpcy52aWV3TW9kZSA9PT0gJ2xpc3QnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbHVtblZpc2liaWxpdHlbY29sLmlkXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFueVJvd1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgc2VsZWN0ZWQgaXRlbXMgKGVpdGhlciBvbiBjdXJyZW50IHBhZ2Ugb3IgYWNyb3NzIGFsbCBwYWdlcyB2aWEgc2VsZWN0ZWRJdGVtcylcbiAgICBjb25zdCBoYXNTZWxlY3RlZE9uUGFnZSA9ICEhKHRoaXMucGFnZWRSb3dzICYmIHRoaXMucGFnZWRSb3dzLnNvbWUociA9PiAhIShyIGFzIGFueSkuaXNTZWxlY3RlZCkpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzU2V0ID0gdGhpcy5nZXRTZWxlY3RlZElkcygpO1xuICAgIGNvbnN0IGhhc1NlbGVjdGVkQWNyb3NzUGFnZXMgPSBzZWxlY3RlZElkc1NldC5zaXplID4gMDtcbiAgICByZXR1cm4gaGFzU2VsZWN0ZWRPblBhZ2UgfHwgaGFzU2VsZWN0ZWRBY3Jvc3NQYWdlcztcbiAgfVxuXG4gIGdldCBjdXJyZW50U2VsZWN0ZWRJdGVtcygpOiBhbnlbXSB7XG4gICAgLy8gSWYgc2VsZWN0ZWRJdGVtcyAoZnVsbCBvYmplY3RzKSBhcmUgcHJvdmlkZWQsIHVzZSB0aGVtIGRpcmVjdGx5XG4gICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBzZWxlY3RlZCBpdGVtcyBhcmUgcmV0dXJuZWQsIGluY2x1ZGluZyB0aG9zZSBmcm9tIG90aGVyIHBhZ2VzXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcyAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcztcbiAgICB9XG4gICAgLy8gRmFsbGJhY2s6IEZvciBjbGllbnQtc2lkZSBwYWdpbmF0aW9uIG9yIHdoZW4gc2VsZWN0ZWRJdGVtcyBpcyBub3QgcHJvdmlkZWQsXG4gICAgLy8gZmlsdGVyIHBhZ2VkUm93cyB0byBnZXQgc2VsZWN0ZWQgaXRlbXMgZnJvbSBjdXJyZW50IHBhZ2Ugb25seVxuICAgIGlmICghdGhpcy5wYWdlZFJvd3MgfHwgdGhpcy5wYWdlZFJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG4gICAgXG4gICAgLy8gRmlsdGVyIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWRcbiAgICByZXR1cm4gdGhpcy5wYWdlZFJvd3NcbiAgICAgIC5maWx0ZXIociA9PiB7XG4gICAgICAgIGlmICghciB8fCByLmlkID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgcm93SWQgPSBOdW1iZXIoci5pZCk7XG4gICAgICAgIC8vIEluY2x1ZGUgaWYgZWl0aGVyOlxuICAgICAgICAvLyAxLiBUaGUgcm93IGhhcyBpc1NlbGVjdGVkID0gdHJ1ZSAoY3VycmVudCBwYWdlIHNlbGVjdGlvbilcbiAgICAgICAgLy8gMi4gVGhlIHJvdydzIElEIGlzIGluIHNlbGVjdGVkSXRlbXMgKHNlbGVjdGVkIG9uIG90aGVyIHBhZ2VzIG9yIHJlc3RvcmVkIHNlbGVjdGlvbilcbiAgICAgICAgcmV0dXJuICEhKHIgYXMgYW55KS5pc1NlbGVjdGVkIHx8IHNlbGVjdGVkSWRzU2V0Lmhhcyhyb3dJZCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFjdGlvbkNsaWNrKGRhdGE6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdhY3Rpb24gdG9vbGJhcicsIGRhdGEpO1xuICB9XG5cbiAgdmlldyhpZDogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1ZpZXcnLCBpZCk7XG4gIH1cblxuICBlZGl0KHJvdzogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0VkaXQnLCByb3cpO1xuICB9XG5cbiAgZGVsZXRlKHJvdzogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0RlbGV0ZScsIHJvdyk7XG4gIH1cblxuICB0b2dnbGVGaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmlsdGVyUGFuZWwgPSAhdGhpcy5zaG93RmlsdGVyUGFuZWw7XG4gIH1cblxuICBvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UoY2ZnOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eSA9IHsgLi4uY2ZnIH07XG4gICAgdGhpcy51cGRhdGVDb21wdXRlZENvbHVtbnMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmNvbHVtblZpc2liaWxpdHlDaGFuZ2UuZW1pdCh7IC4uLmNmZyB9KTtcbiAgfVxuXG4gIG9uQXV0b1JlZnJlc2hDaGFuZ2UoaW50ZXJ2YWxNczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWwgPSBpbnRlcnZhbE1zO1xuICAgIHRoaXMuc2V0dXBBdXRvUmVmcmVzaChpbnRlcnZhbE1zKTtcbiAgICB0aGlzLmF1dG9SZWZyZXNoSW50ZXJ2YWxDaGFuZ2UuZW1pdChpbnRlcnZhbE1zKTtcbiAgICB0aGlzLnRyaWdnZXJSZWxvYWQoKTtcbiAgfVxuXG4gIHZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnVmFsdWUgY2hhbmdlZCcsIHZhbHVlKTtcbiAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgc2VhcmNoKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnU2VhcmNoJywgdmFsdWUpO1xuICB9XG5cbiAgY2xlYXJlZCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnQ2xlYXJlZCcpO1xuICB9XG5cbiAgb25FbXB0eUFjdGlvbihhY3Rpb246IGFueSkge1xuICAgIGlmIChhY3Rpb24/LmxhYmVsID09PSAnU2hvdyBmaWx0ZXJzJykge1xuICAgICAgdGhpcy50b2dnbGVGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBvbkZpbHRlcnNDaGFuZ2VkKGN1cnJlbnQ6IGFueSk6IHZvaWQge1xuICAgIC8vIERlZmVyIGFwcGx5aW5nIGZpbHRlcnMgYW5kIHVwZGF0aW5nIGNoaXBzIHVudGlsIEFwcGx5IEZpbHRlciBpcyBjbGlja2VkXG4gICAgdGhpcy5wZW5kaW5nRmlsdGVycyA9IGN1cnJlbnQ7XG4gIH1cblxuICBvbkZpbHRlcnNBcHBsaWVkKGFwcGxpZWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0ZpbHRlclBhbmVsID0gZmFsc2U7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gYXBwbGllZCA/PyB0aGlzLnBlbmRpbmdGaWx0ZXJzID8/IHt9O1xuICAgIHRoaXMuYXBwbGllZEZpbHRlcnMgPSBlZmZlY3RpdmU7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgY29uc3QgY2hpcHM6IEFycmF5PHsga2V5Pzogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgdGV4dDogc3RyaW5nOyBmdWxsVGV4dD86IHN0cmluZzsgaGFzTW9yZT86IGJvb2xlYW4gfT4gPSBbXTtcbiAgICBpZiAoZWZmZWN0aXZlKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlZmZlY3RpdmUpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZWZmZWN0aXZlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgY29udGludWU7XG4gICAgICAgIFxuICAgICAgICAvLyBGaW5kIHRoZSBmaWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoaXMga2V5XG4gICAgICAgIGNvbnN0IGZpbHRlckNvbmZpZ0l0ZW0gPSB0aGlzLmZpbHRlckNvbmZpZz8uZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZmlsdGVyQ29uZmlnSXRlbT8ub3B0aW9ucyB8fCBbXTtcbiAgICAgICAgXG4gICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGRpc3BsYXkgdGV4dCBmcm9tIG9wdGlvbnNcbiAgICAgICAgY29uc3QgZ2V0RGlzcGxheVRleHQgPSAodmFsOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgICAgIC8vIElmIHZhbHVlIGlzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggbmFtZS9sYWJlbCwgdXNlIGl0XG4gICAgICAgICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAodmFsLm5hbWUgfHwgdmFsLmxhYmVsIHx8IHZhbC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwubmFtZSA/PyB2YWwubGFiZWwgPz8gU3RyaW5nKHZhbC52YWx1ZSA/PyB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb29rIHVwIHRoZSBvcHRpb24gaW4gdGhlIGNvbmZpZ1xuICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnMuZmluZCgob3B0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdElkID0gb3B0LmlkID8/IG9wdC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IG9wdFZhbHVlID0gb3B0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgdmFsU3RyID0gU3RyaW5nKHZhbCk7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKG9wdElkKSA9PT0gdmFsU3RyIHx8IFN0cmluZyhvcHRWYWx1ZSkgPT09IHZhbFN0cjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLm5hbWUgPz8gb3B0aW9uLmxhYmVsID8/IFN0cmluZyhvcHRpb24udmFsdWUgPz8gdmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdGhlIHJhdyB2YWx1ZVxuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIGxldCBsYWJlbCA9IGZpbHRlckNvbmZpZ0l0ZW0/LmxhYmVsO1xuICAgICAgICBcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdGV4dCA9IHZhbHVlLm1hcCgodjogYW55KSA9PiBnZXREaXNwbGF5VGV4dCh2KSkuam9pbignLCAnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKCdzdGFydCcgaW4gdmFsdWUgfHwgJ2VuZCcgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB2YWx1ZS5zdGFydCA/IG5ldyBEYXRlKHZhbHVlLnN0YXJ0KS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZSA9IHZhbHVlLmVuZCA/IG5ldyBEYXRlKHZhbHVlLmVuZCkudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOiAnJztcbiAgICAgICAgICAgIHRleHQgPSBbcywgZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gZ2V0RGlzcGxheVRleHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gZ2V0RGlzcGxheVRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNoaXBzLnB1c2goeyBrZXksIGxhYmVsLCB0ZXh0LCBmdWxsVGV4dDogdGV4dCwgaGFzTW9yZTogdGV4dC5sZW5ndGggPiAzMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGlwcyA9IGNoaXBzO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IHRoaXMuY2hpcHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGhhbmRsZVJlc2V0RmlsdGVyQ2xpY2soKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgY2hpcHMgYW5kIHJlc2V0IGZpbHRlcmVkIGRhdGEgd2hlbiByZXNldCBpcyBjbGlja2VkXG4gICAgdGhpcy5wZW5kaW5nRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2hpcHMgPSBbXTtcbiAgICB0aGlzLmZpbHRlckFwcGxpZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB0aGlzLm9uUmVzZXRGaWx0ZXJDbGljay5lbWl0KCk7XG4gIH1cblxuICBoYW5kbGVSZWZyZXNoQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vbkF1dG9SZWZyZXNoQ2xpY2suZW1pdCgpO1xuICAgIHRoaXMudHJpZ2dlclJlbG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmlnZ2VyUmVsb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMub25SZWxvYWQuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEF1dG9SZWZyZXNoKGludGVydmFsTXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBdXRvUmVmcmVzaCgpO1xuICAgIGlmIChpbnRlcnZhbE1zICYmIGludGVydmFsTXMgPiAwKSB7XG4gICAgICB0aGlzLmF1dG9SZWZyZXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJpZ2dlclJlbG9hZCgpO1xuICAgICAgfSwgaW50ZXJ2YWxNcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckF1dG9SZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUmVmcmVzaFRpbWVyKTtcbiAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQXV0b1JlZnJlc2goKTtcbiAgfVxuXG4gIG9uUGFnaW5hdGUoZTogeyBwYWdlSW5kZXg6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9KTogdm9pZCB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBlLnBhZ2VJbmRleDtcbiAgICB0aGlzLnBhZ2VTaXplID0gZS5wYWdlU2l6ZTtcbiAgICBpZiAodGhpcy5zZXJ2ZXJTaWRlUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoeyBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LCBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHNpemU7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICB9XG5cbiAgb25SZW1vdmVDaGlwKGNoaXA6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2hpcHMgPSB0aGlzLmNoaXBzLmZpbHRlcihjID0+IGMgIT09IGNoaXApO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IHRoaXMuY2hpcHMubGVuZ3RoID4gMDtcbiAgICAvLyBFbWl0IGV2ZW50IHRvIHBhcmVudCBjb21wb25lbnQgKHNhbWUgcGF0dGVybiBhcyBleGVjdXRpb24gdGFiKVxuICAgIHRoaXMucmVtb3ZlQ2hpcC5lbWl0KGNoaXApO1xuICB9XG5cbiAgb25DbGVhckFsbENoaXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY2hpcHMgPSBbXTtcbiAgICB0aGlzLmZpbHRlckFwcGxpZWQgPSBmYWxzZTtcbiAgICAvLyBSZXNldCB0aGUgZHluYW1pYy1maWx0ZXIgY29tcG9uZW50IGZvcm0gd2hlbiBjbGVhcmluZyBhbGwgY2hpcHNcbiAgICBpZiAodGhpcy5keW5hbWljRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmR5bmFtaWNGaWx0ZXJDb21wb25lbnQucmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UGFnaW5hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXJTaWRlUGFnaW5hdGlvbikge1xuICAgICAgLy8gU2VydmVyIG1vZGU6IHBhcmVudCBzdXBwbGllcyBhbHJlYWR5LXBhZ2luYXRlZCBkYXRhXG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLmZpbHRlcmVkUm93c107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2VkUm93cyA9IHRoaXMuZmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBWaXNpYmlsaXR5Q29sdW1ucygpOiBBcnJheTx7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMuY29sdW1ucyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoYyA9PiBjLmlzRGVmYXVsdCA9PT0gZmFsc2UpXG4gICAgICAubWFwKGMgPT4gKHsgaWQ6IGMuZmllbGRJZCwgbGFiZWw6IGMuZmllbGROYW1lIHx8IGMuZmllbGRJZCB9KSk7XG4gICAgaWYgKHRoaXMubW9kdWxhckNvbmZpZz8uc2hvd0ZvbGRlckNvbHVtbiAmJiAhaXRlbXMuc29tZShpID0+IGkuaWQgPT09IEZPTERFUl9DT0xVTU5fRklFTERfSUQpKSB7XG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgaWQ6IEZPTERFUl9DT0xVTU5fRklFTERfSUQsXG4gICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHM/LmZvbGRlckNvbHVtbkxhYmVsIHx8ICdGb2xkZXInLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplRGF0ZShkOiBhbnkpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoIWQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHRzID0gRGF0ZS5wYXJzZShkKTtcbiAgICByZXR1cm4gaXNOYU4odHMpID8gbnVsbCA6IHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXNzRmlsdGVycyhmaWx0ZXJzOiBhbnksIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWx0ZXJzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZmlsdGVycy5zdGF0dXMgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXJzLnN0YXR1cykgJiYgZmlsdGVycy5zdGF0dXMubGVuZ3RoKSB7XG4gICAgICBpZiAoIWZpbHRlcnMuc3RhdHVzLmluY2x1ZGVzKHJvdy5zdGF0dXMpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnByaW9yaXR5ICYmIEFycmF5LmlzQXJyYXkoZmlsdGVycy5wcmlvcml0eSkgJiYgZmlsdGVycy5wcmlvcml0eS5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy5wcmlvcml0eS5pbmNsdWRlcyhyb3cucHJpb3JpdHlOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVycy50ZXN0VHlwZSAmJiBBcnJheS5pc0FycmF5KGZpbHRlcnMudGVzdFR5cGUpICYmIGZpbHRlcnMudGVzdFR5cGUubGVuZ3RoKSB7XG4gICAgICBpZiAoIWZpbHRlcnMudGVzdFR5cGUuaW5jbHVkZXMocm93LnRlc3RUeXBlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVycy5jcmVhdGVkX2RhdGUgJiYgKGZpbHRlcnMuY3JlYXRlZF9kYXRlLnN0YXJ0IHx8IGZpbHRlcnMuY3JlYXRlZF9kYXRlLmVuZCkpIHtcbiAgICAgIGNvbnN0IHN0YXJ0VHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZmlsdGVycy5jcmVhdGVkX2RhdGUuc3RhcnQpO1xuICAgICAgY29uc3QgZW5kVHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZmlsdGVycy5jcmVhdGVkX2RhdGUuZW5kKTtcbiAgICAgIGNvbnN0IHJvd1RzID0gdGhpcy5ub3JtYWxpemVEYXRlKHJvdy5jcmVhdGVkQXQpO1xuICAgICAgaWYgKHJvd1RzICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHN0YXJ0VHMgIT0gbnVsbCAmJiByb3dUcyA8IHN0YXJ0VHMpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGVuZFRzICE9IG51bGwgJiYgcm93VHMgPiBlbmRUcykgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyYWNrQnlUZW1wbGF0ZVJlZihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICB0cmFja0J5RHJvcGRvd25UZW1wbGF0ZVJlZihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICB0cmFja0J5U2VsZWN0RHJvcGRvd25UZW1wbGF0ZVJlZihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvLyBFeHBvcnQgbW9kYWwgc3RhdGVcbiAgaXNFeHBvcnRNb2RhbE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBleHBvcnRDb2RlQ2xpY2soKTogdm9pZCB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIGl0ZW1zXG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXM7XG4gICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBFbWl0IGV2ZW50IHRvIHBhcmVudCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlbiBubyBpdGVtcyBhcmUgc2VsZWN0ZWRcbiAgICAgIHRoaXMub25FeHBvcnRDbGljay5lbWl0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VFeHBvcnRNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRXhwb3J0TW9kYWxPcGVuID0gZmFsc2U7XG4gIH1cblxuICBvbkV4cG9ydE1vZGFsRXhwb3J0KHJlc3VsdDogeyB0eXBlOiAnbG9jYWwnIHwgJ2VtYWlsJzsgZW1haWxzPzogc3RyaW5nW107IGZyYW1ld29yazogJ1dFQkRSSVZFUl9JTycgfCAnU0VMRU5JVU1fSkFWQScgfSk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICAvLyBFbWl0IGV2ZW50IHRvIHBhcmVudCB3aXRoIGV4cG9ydCByZXN1bHRcbiAgICB0aGlzLm9uRXhwb3J0Q2xpY2suZW1pdCh7XG4gICAgICB0eXBlOiByZXN1bHQudHlwZSxcbiAgICAgIGVtYWlsczogcmVzdWx0LmVtYWlscyxcbiAgICAgIGZyYW1ld29yazogcmVzdWx0LmZyYW1ld29yayxcbiAgICAgIHNlbGVjdGVkSXRlbXM6IHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXNcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZENhc2VzRm9yRXhwb3J0KCk6IEFycmF5PHsgaWQ/OiBudW1iZXI7IG5hbWU/OiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTZWxlY3RlZEl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICBpZDogaXRlbS5pZCxcbiAgICAgIG5hbWU6IGl0ZW0ubmFtZSB8fCBpdGVtLnRpdGxlIHx8ICdVbm5hbWVkJ1xuICAgIH0pKTtcbiAgfVxuICBnZXQgYXJyb3dDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgICAnY3FhLXctNCcsXG4gICAgICAnY3FhLWgtNCcsXG4gICAgICAnY3FhLXJlbGF0aXZlJyxcbiAgICAgICdjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm0nXG4gICAgXTtcblxuICAgIGlmICh0aGlzLnNob3dGaWx0ZXJQYW5lbCkge1xuICAgICAgYmFzZUNsYXNzZXMucHVzaCgnY3FhLXJvdGF0ZS0xODAnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZUNsYXNzZXMuam9pbignICcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGb2xkZXIgLyBtb2R1bGFyIGhlbHBlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBGbGF0IGxpc3Qgb2Ygcm9vdC1sZXZlbCBmb2xkZXJzIGZvciB0aGUgXCJPcmdhbml6ZWRcIiBncmlkIG9uIHRoZSByb290IHZpZXcuXG4gICAqIFByZWZlcnMgdGhlIGhvc3QtcHJvdmlkZWQgYHJvb3RGb2xkZXJzYCBzbmFwc2hvdCB3aGVuIHNldCDigJQgYW5hbG9nb3VzIHRvXG4gICAqIGhvdyBgc3ViZm9sZGVyVGlsZXNgIGZhbGxzIGJhY2sgdG8gYHNlbGVjdGVkRm9sZGVyTm9kZWAgYW5kIGBicmVhZGNydW1iVHJhaWxgXG4gICAqIGZhbGxzIGJhY2sgdG8gYHNlbGVjdGVkRm9sZGVyVHJhaWxgIHdoZW4gYGZvbGRlcnNgIGhhcyBiZWVuIHN3YXBwZWQgdG8gYVxuICAgKiBzZWFyY2gtcmVzdWx0cyBsaXN0LiBGYWxscyBiYWNrIHRvIGB0aGlzLmZvbGRlcnNgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldCByb290Rm9sZGVyVGlsZXMoKTogRm9sZGVyTm9kZVtdIHtcbiAgICBpZiAodGhpcy5yb290Rm9sZGVycyAhPSBudWxsKSByZXR1cm4gdGhpcy5yb290Rm9sZGVycztcbiAgICByZXR1cm4gdGhpcy5mb2xkZXJzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmZvbGRlcnMgb2YgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgKGZvciB0aGUgXCJTdWJmb2xkZXJzIGluIC4uLlwiIGdyaWQpLlxuICAgKi9cbiAgZ2V0IHN1YmZvbGRlclRpbGVzKCk6IEZvbGRlck5vZGVbXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gW107XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCk7XG4gICAgaWYgKG5vZGU/LmNoaWxkcmVuPy5sZW5ndGgpIHJldHVybiBub2RlLmNoaWxkcmVuO1xuICAgIC8vIEZhbGxiYWNrOiBob3N0LXByb3ZpZGVkIHNuYXBzaG90IHdoZW4gdGhlIGxpdmUgdHJlZSBkb2Vzbid0IGNvbnRhaW5cbiAgICAvLyB0aGUgc2VsZWN0aW9uIChyZWZyZXNoLXJlc3RvcmUgYmVmb3JlIGFuY2VzdG9ycyBhcmUgbG9hZGVkLCBvciBzaWRlYmFyXG4gICAgLy8gc2VhcmNoIHdoZXJlIGBmb2xkZXJzYCBob2xkcyBvbmx5IHRoZSBtYXRjaGVkIHJlc3VsdHMpLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZSAmJlxuICAgICAgICBTdHJpbmcodGhpcy5zZWxlY3RlZEZvbGRlck5vZGUuaWQpID09PSBTdHJpbmcodGhpcy5zZWxlY3RlZEZvbGRlcklkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlLmNoaWxkcmVuID8/IFtdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQnJlYWRjcnVtYiB0cmFpbCBmcm9tIFwiQWxsIGZvbGRlcnNcIiBkb3duIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgZm9sZGVyLlxuICAgKi9cbiAgZ2V0IGJyZWFkY3J1bWJUcmFpbCgpOiBGb2xkZXJOb2RlW10ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHRyYWlsOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgICB0aGlzLmJ1aWxkVHJhaWwodGhpcy5mb2xkZXJzLCB0aGlzLnNlbGVjdGVkRm9sZGVySWQsIHRyYWlsKTtcbiAgICBpZiAodHJhaWwubGVuZ3RoKSByZXR1cm4gdHJhaWw7XG4gICAgLy8gRmFsbGJhY2s6IGhvc3QtcHJvdmlkZWQgc25hcHNob3Qgc3Vydml2ZXMgc3dhcHMgb2YgYHRoaXMuZm9sZGVyc2AgKHRoZVxuICAgIC8vIGNhbm9uaWNhbCBjYXNlIGlzIHNpZGViYXIgc2VhcmNoLCB3aGVyZSB0aGUgbGl2ZSB3YWxrIHdvbid0IGZpbmQgdGhlXG4gICAgLy8gc2VsZWN0ZWQgZm9sZGVyJ3MgYW5jZXN0b3JzIGFtb25nIHRoZSBmbGF0IHJlc3VsdCBzZXQpLlxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRm9sZGVyVHJhaWwgPz8gW107XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVHJhaWwobm9kZXM6IEZvbGRlck5vZGVbXSwgdGFyZ2V0SWQ6IG51bWJlciwgYWNjOiBGb2xkZXJOb2RlW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4pO1xuICAgICAgLy8gVXNlIFN0cmluZygpIGNvZXJjaW9uIGZvciBzYWZldHkgaW4gY2FzZSBpZHMgYXJyaXZlIGFzIGVpdGhlciBudW1iZXIgb3JcbiAgICAgIC8vIHN0cmluZyBmcm9tIGRpZmZlcmVudCBBUEkvdGVzdCBkYXRhIHNoYXBlcyAoZS5nLiByYXcgSlNPTiBwYXJzZSByZXN1bHRzKS5cbiAgICAgIGlmIChTdHJpbmcobi5pZCkgPT09IFN0cmluZyh0YXJnZXRJZCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKG4uY2hpbGRyZW4gJiYgdGhpcy5idWlsZFRyYWlsKG4uY2hpbGRyZW4sIHRhcmdldElkLCBhY2MpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGFjYy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRm9sZGVyKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICBpZiAoU3RyaW5nKG4uaWQpID09PSBTdHJpbmcodGFyZ2V0SWQpKSByZXR1cm4gbjtcbiAgICAgIGNvbnN0IGZvdW5kID0gbi5jaGlsZHJlbiA/IHRoaXMuZmluZEZvbGRlcihuLmNoaWxkcmVuLCB0YXJnZXRJZCkgOiBudWxsO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBcInJvb3RcIiB2aWV3IChubyBmb2xkZXIgc2VsZWN0ZWQpLiBDb250cm9scyB3aGljaFxuICAgKiBzZWN0aW9ucyByZW5kZXIgb24gdGhlIHJpZ2h0LWhhbmQgcGFuZS5cbiAgICovXG4gIGdldCBpc1Jvb3RWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciBub2RlIChvciBudWxsIGF0IHJvb3QpLiAqL1xuICBnZXQgY3VycmVudEZvbGRlck5vZGUoKTogRm9sZGVyTm9kZSB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgLy8gV2FsayB0aGUgdmlzaWJsZSB0cmVlIGZpcnN0OyBmYWxsIGJhY2sgdG8gdGhlIGhvc3QtcHJvdmlkZWQgb3ZlcnJpZGVcbiAgICAvLyB3aGVuIHRoZSBsb29rdXAgbWlzc2VzIChlLmcuIGR1cmluZyBzaWRlYmFyIHNlYXJjaCwgd2hlbiBgZm9sZGVyc2BcbiAgICAvLyBob2xkcyBvbmx5IG1hdGNoZWQgcmVzdWx0cyBhbmQgdGhlIHNlbGVjdGVkIGZvbGRlciBpc24ndCBhbW9uZyB0aGVtKS5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlICYmIFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZS5pZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvbGRlck5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvdW50IG9mIHRlc3QgY2FzZXMgZGlyZWN0bHkgdW5kZXIgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgKGV4Y2x1ZGluZyBkZXNjZW5kYW50cykuXG4gICAqICBSZWFkcyBgRm9sZGVyTm9kZS5jb3VudGAgc28gdGhlIGhlYWRlciBiYWRnZSBtYXRjaGVzIHRoZSBzaWRlYmFyIHJvdyBjb3VudFxuICAgKiAgKGZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIHJlbmRlcnMgdGhlIHNhbWUgYHJvdy5ub2RlLmNvdW50YCkuIFVzaW5nXG4gICAqICBgZmlsdGVyZWRSb3dzLmxlbmd0aGAgaGVyZSB3b3VsZCBvbmx5IHJlZmxlY3QgdGhlIGN1cnJlbnRseS1yZW5kZXJlZCBwYWdlLiAqL1xuICBnZXQgY3VycmVudEZvbGRlckRpcmVjdENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Rm9sZGVyTm9kZT8uY291bnQgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBlbXB0eS1zdGF0ZSBzbG90IHdoZW4gdGhlIGhvc3QgZXhwbGljaXRseSBvcHRzIGluLCBPUiB3aGVuIHRoZVxuICAgKiB0YWJsZSB3b3VsZCBvdGhlcndpc2UgcmVuZGVyIGJsYW5rIChubyBsb2FkaW5nICsgbm8gcm93cykuIFVzaW5nIGEgZGVyaXZlZFxuICAgKiBmbGFnIGtlZXBzIHRoZSBob3N0IGNvbnRyYWN0IGlkZW50aWNhbCB0byBgY3FhLXRhYmxlLXRlbXBsYXRlYCB3aGlsZSBsZXR0aW5nXG4gICAqIHRoZSBtb2R1bGFyIHZpZXcgc2hvdyBcIk5vIFRlc3QgQ2FzZSBGb3VuZFwiIG91dCBvZiB0aGUgYm94IOKAlCB0aGUgZWFybGllciBhc2suXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlSXNFbXB0eVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuaXNUYWJsZUxvYWRpbmcgfHwgdGhpcy5pc1RhYmxlRGF0YUxvYWRpbmcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMucGFnZWRSb3dzIHx8IHRoaXMucGFnZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaG9zdC1wcm92aWRlZCBgZW1wdHlTdGF0ZUNvbmZpZ2Agd2hlbiB0aGUgaG9zdCBmbGFnZ2VkIHRoZSBzdGF0ZVxuICAgKiBpdHNlbGY7IG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIGEgbGlicmFyeS1vd25lZCBcIk5vIFRlc3QgQ2FzZSBGb3VuZFwiIGNvbmZpZ1xuICAgKiBkcml2ZW4gYnkgYG1vZHVsYXJMYWJlbHNgLlxuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcoKTogRW1wdHlTdGF0ZUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eVN0YXRlKSByZXR1cm4gdGhpcy5lbXB0eVN0YXRlQ29uZmlnO1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLmVtcHR5Tm9UZXN0c0luRm9sZGVyVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tb2R1bGFyTGFiZWxzLmVtcHR5Tm9UZXN0c0luRm9sZGVyRGVzY3JpcHRpb24sXG4gICAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLlRFU1RfQ0FTRSxcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBvbkZvbGRlclNlbGVjdGVkKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZvbGRlcklkID0gaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5mb2xkZXJTZWxlY3RlZC5lbWl0KGlkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uRm9sZGVyRXhwYW5zaW9uVG9nZ2xlZChldmVudDogeyBpZDogbnVtYmVyOyBleHBhbmRlZDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLmV4cGFuZGVkRm9sZGVySWRzIHx8IFtdKTtcbiAgICBpZiAoZXZlbnQuZXhwYW5kZWQpIHtcbiAgICAgIHNldC5hZGQoZXZlbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQuZGVsZXRlKGV2ZW50LmlkKTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZEZvbGRlcklkcyA9IEFycmF5LmZyb20oc2V0KTtcbiAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKiogVHJhY2tzIHRoZSBgZm9sZGVycy5sZW5ndGhgIGF0IHdoaWNoIHdlIGxhc3QgZW1pdHRlZCBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYFxuICAgKiAgZnJvbSB0aGUgT3JnYW5pemVkIGdyaWQgc2Nyb2xsLCBzbyByYXBpZCBzY3JvbGwgZXZlbnRzIGRvbid0IHNwYW0gdGhlIGhvc3RcbiAgICogIGJlZm9yZSBpdCBoYXMgaGFkIGEgY2hhbmNlIHRvIGFwcGVuZCB0aGUgbmV4dCBwYWdlLiAqL1xuICBwcml2YXRlIGxhc3RSb290R3JpZExvYWRBdDogbnVtYmVyID0gLTE7XG4gIC8qKiBUcmFja3MgdGhlIGBjdXJyZW50Rm9sZGVyTm9kZS5jaGlsZHJlbi5sZW5ndGhgIGF0IHdoaWNoIHdlIGxhc3QgZW1pdHRlZFxuICAgKiAgYGZvbGRlckxvYWRNb3JlUmVxdWVzdGVkYCBmcm9tIHRoZSBTdWJmb2xkZXJzIGdyaWQgc2Nyb2xsLCBmb3IgdGhlIHNhbWVcbiAgICogIHJlYXNvbiBhcyBgbGFzdFJvb3RHcmlkTG9hZEF0YC4gKi9cbiAgcHJpdmF0ZSBsYXN0U3ViZm9sZGVyR3JpZExvYWRBdDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdSSURfU0NST0xMX0xPQURfVEhSRVNIT0xEX1BYID0gOTY7XG5cbiAgLyoqIEhvcml6b250YWwtc2Nyb2xsIGhhbmRsZXIgZm9yIHRoZSBcIk9yZ2FuaXplZFwiIHJvb3QgdGlsZXMuIEVtaXRzXG4gICAqICBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYCB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgd2l0aGluXG4gICAqICBgR1JJRF9TQ1JPTExfTE9BRF9USFJFU0hPTERfUFhgIG9mIHRoZSByaWdodCBlZGdlIEFORCBtb3JlIHJvb3RzIGFyZVxuICAgKiAgYXZhaWxhYmxlIG9uIHRoZSBiYWNrZW5kLiBUaHJvdHRsZWQgYnkgYGxhc3RSb290R3JpZExvYWRBdGAuXG4gICAqICBVc2VzIGByb290Rm9sZGVyVGlsZXMubGVuZ3RoYCAobm90IGBmb2xkZXJzLmxlbmd0aGApIHNvIHRoZSBnYXRlIHN0YXlzXG4gICAqICBjb3JyZWN0IHdoZW4gYHJvb3RGb2xkZXJzYCBkZWNvdXBsZXMgdGhlIE9yZ2FuaXplZCBncmlkIGZyb20gdGhlXG4gICAqICBzZWFyY2gtZmlsdGVyZWQgYGZvbGRlcnNgIGlucHV0LiAqL1xuICBvblJvb3RHcmlkU2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMucm9vdEZvbGRlclRpbGVzLmxlbmd0aDtcbiAgICBpZiAobG9hZGVkID49IHRoaXMucm9vdFRvdGFsKSByZXR1cm47XG4gICAgaWYgKGxvYWRlZCA9PT0gdGhpcy5sYXN0Um9vdEdyaWRMb2FkQXQpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVJpZ2h0ID0gZWwuc2Nyb2xsV2lkdGggLSAoZWwuc2Nyb2xsTGVmdCArIGVsLmNsaWVudFdpZHRoKTtcbiAgICBpZiAoZGlzdGFuY2VGcm9tUmlnaHQgPiBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudC5HUklEX1NDUk9MTF9MT0FEX1RIUkVTSE9MRF9QWCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdFJvb3RHcmlkTG9hZEF0ID0gbG9hZGVkO1xuICAgIHRoaXMucm9vdExvYWRNb3JlUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsLXNjcm9sbCBoYW5kbGVyIGZvciB0aGUgXCJTdWJmb2xkZXJzIGluIFhcIiB0aWxlcy4gRW1pdHNcbiAgICogIGBmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCh7IGlkOiBzZWxlY3RlZEZvbGRlcklkLCBuZXh0UGFnZSB9KWAgd2hlbiB0aGVcbiAgICogIHVzZXIgc2Nyb2xscyB3aXRoaW4gdGhyZXNob2xkIG9mIHRoZSByaWdodCBlZGdlIEFORCB0aGUgYWN0aXZlIGZvbGRlclxuICAgKiAgaGFzIG1vcmUgY2hpbGRyZW4gb24gdGhlIGJhY2tlbmQgdGhhbiBoYXZlIGJlZW4gbG9hZGVkLiAqL1xuICBvblN1YmZvbGRlckdyaWRTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudEZvbGRlck5vZGU7XG4gICAgaWYgKCFub2RlIHx8IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgbG9hZGVkID0gbm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgdG90YWwgPSBub2RlLnRvdGFsQ2hpbGRyZW4gPz8gbG9hZGVkO1xuICAgIGlmIChsb2FkZWQgPj0gdG90YWwpIHJldHVybjtcbiAgICBpZiAobG9hZGVkID09PSB0aGlzLmxhc3RTdWJmb2xkZXJHcmlkTG9hZEF0KSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBkaXN0YW5jZUZyb21SaWdodCA9IGVsLnNjcm9sbFdpZHRoIC0gKGVsLnNjcm9sbExlZnQgKyBlbC5jbGllbnRXaWR0aCk7XG4gICAgaWYgKGRpc3RhbmNlRnJvbVJpZ2h0ID4gTW9kdWxhclRhYmxlVGVtcGxhdGVDb21wb25lbnQuR1JJRF9TQ1JPTExfTE9BRF9USFJFU0hPTERfUFgpIHJldHVybjtcbiAgICB0aGlzLmxhc3RTdWJmb2xkZXJHcmlkTG9hZEF0ID0gbG9hZGVkO1xuICAgIGNvbnN0IG5leHRQYWdlID0gKG5vZGUubG9hZGVkUGFnZXMgPz8gLTEpICsgMTtcbiAgICB0aGlzLmZvbGRlckxvYWRNb3JlUmVxdWVzdGVkLmVtaXQoeyBpZDogdGhpcy5zZWxlY3RlZEZvbGRlcklkLCBuZXh0UGFnZSB9KTtcbiAgfVxuXG4gIG9uRm9sZGVyQ3JlYXRlZChwYXlsb2FkOiBGb2xkZXJDcmVhdGVkUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMuZm9sZGVyQ3JlYXRlZC5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgb25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQocGF5bG9hZDogeyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgLy8gRW1pdCB0aGUgXCJyZXF1ZXN0ZWRcIiBldmVudCBmaXJzdCBzbyBhIGhvc3QgY2FuIGludGVyY2VwdCB3aGVuIGl0IG93bnMgdGhlIFVYLlxuICAgIHRoaXMuZm9sZGVyQ3JlYXRlUmVxdWVzdGVkLmVtaXQocGF5bG9hZCk7XG4gICAgaWYgKCF0aGlzLnVzZUludGVybmFsRGlhbG9ncykgcmV0dXJuO1xuICAgIHRoaXMub3BlbkNyZWF0ZUZvbGRlckRpYWxvZyhwYXlsb2FkLnBhcmVudElkKTtcbiAgfVxuXG4gIG9uRm9sZGVyUmVuYW1lZChwYXlsb2FkOiBGb2xkZXJSZW5hbWVkUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMuZm9sZGVyUmVuYW1lZC5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpcmVkIHRvIHRoZSBzaWRlYmFyJ3MgYGZvbGRlckRlbGV0ZWRgIG91dHB1dCDigJQgd2hpY2ggZmlyZXMgb24gZGVsZXRlLWljb25cbiAgICogKmNsaWNrKiwgbm90IG9uIGNvbmZpcm1hdGlvbi4gV2UgcmUtZW1pdCBhIGBmb2xkZXJEZWxldGVSZXF1ZXN0ZWRgIGV2ZW50XG4gICAqIGZpcnN0IChzbyBob3N0cyBjYW4gaW50ZXJjZXB0KSBhbmQsIHdoZW4gYHVzZUludGVybmFsRGlhbG9nc2AgaXMgZW5hYmxlZCxcbiAgICogb3BlbiB0aGUgY29uZmlybWF0aW9uIGRpYWxvZy4gYGZvbGRlckRlbGV0ZWRgIG5vdyBvbmx5IGZpcmVzIGFmdGVyIGNvbmZpcm0uXG4gICAqL1xuICBvbkZvbGRlckRlbGV0ZWQocGF5bG9hZDogeyBpZDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmJ1aWxkRGVsZXRlQ29udGV4dChwYXlsb2FkLmlkKTtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZVJlcXVlc3RlZC5lbWl0KGN0eCk7XG4gICAgaWYgKCF0aGlzLnVzZUludGVybmFsRGlhbG9ncykgcmV0dXJuO1xuICAgIHRoaXMub3BlbkRlbGV0ZUZvbGRlckRpYWxvZyhjdHgpO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyB0aGUgeyBpZCwgbmFtZSwgdGVzdENvdW50LCBoYXNQYXJlbnQgfSBwYXlsb2FkIHVzZWQgYnkgZGVsZXRlIGV2ZW50cy9kaWFsb2dzLiAqL1xuICBwcml2YXRlIGJ1aWxkRGVsZXRlQ29udGV4dChmb2xkZXJJZDogbnVtYmVyKTogRm9sZGVyRGVsZXRlUmVxdWVzdGVkUGF5bG9hZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIGZvbGRlcklkKTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGZvbGRlcklkLFxuICAgICAgbmFtZTogbm9kZT8ubmFtZSA/PyAnJyxcbiAgICAgIHRlc3RDb3VudDogdGhpcy5jb3VudFRlc3RzSW5Gb2xkZXIoZm9sZGVySWQpLFxuICAgICAgaGFzUGFyZW50OiB0aGlzLmZvbGRlckhhc1BhcmVudChmb2xkZXJJZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY291bnRUZXN0c0luRm9sZGVyKGZvbGRlcklkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5mb2xkZXJJZEFjY2Vzc29yID8/ICgocjogYW55KSA9PiByPy5mb2xkZXJJZCk7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEgfHwgW10pLmZpbHRlcihyID0+IHtcbiAgICAgIGNvbnN0IGlkID0gYWNjZXNzb3Iocik7XG4gICAgICByZXR1cm4gaWQgIT0gbnVsbCAmJiBOdW1iZXIoaWQpID09PSBOdW1iZXIoZm9sZGVySWQpO1xuICAgIH0pLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZm9sZGVyIGlzIG5lc3RlZCAoaS5lLiBub3QgYSByb290LWxldmVsIGZvbGRlcikuICovXG4gIHByaXZhdGUgZm9sZGVySGFzUGFyZW50KGZvbGRlcklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLmZvbGRlcnMgfHwgW10pLnNvbWUobiA9PiBuLmlkID09PSBmb2xkZXJJZCk7XG4gIH1cblxuICBvblRlc3RzRHJvcHBlZChldmVudDogeyB0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+OyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3ApIHJldHVybjtcbiAgICB0aGlzLnRlc3RzTW92ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogRm9sZGVyLXRvLWZvbGRlciBkcmFnLWRyb3AuIFRoZSBzaWRlYmFyIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCBhZ2FpbnN0IHNlbGYvZGVzY2VuZGFudFxuICAgKiBjeWNsZXMsIHNvIHRoZSBkcm9wIGlzIGl0cyBvd24gY29uZmlybWF0aW9uIOKAlCB3ZSBlbWl0IGBmb2xkZXJNb3ZlZGAgZGlyZWN0bHkgd2l0aG91dFxuICAgKiBvcGVuaW5nIHRoZSBtb3ZlIGRpYWxvZy4gR2F0ZWQgb24gYGFsbG93VGVzdERyYWdEcm9wYCAoc2FtZSBmbGFnIGFzIHRlc3QgZHJhZy1kcm9wKS5cbiAgICovXG4gIG9uRm9sZGVyRHJvcHBlZChldmVudDogeyBpZDogbnVtYmVyOyBuZXdQYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3ApIHJldHVybjtcbiAgICB0aGlzLmZvbGRlck1vdmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZGViYXIgZW1pdHRlZCBgZm9sZGVyTW92ZVJlcXVlc3RlZGAgKHVzZXIgcGlja2VkIFwiTW92ZSBmb2xkZXJcIiBmcm9tIHRoZSBjb250ZXh0IG1lbnUpLlxuICAgKiBXZSByZS1lbWl0IGEgcmljaGVyIHBheWxvYWQgZm9yIGhvc3RzLCBhbmQg4oCUIHdoZW4gcnVubmluZyB3aXRoIGludGVybmFsIGRpYWxvZ3Mg4oCUXG4gICAqIG9wZW4gdGhlIGV4aXN0aW5nIG1vdmUtdG8tZm9sZGVyIHBpY2tlciBjb25maWd1cmVkIGZvciBhIGZvbGRlci1tb3ZlIChzZWxmIGFuZFxuICAgKiBkZXNjZW5kYW50cyBhcmUgZGlzYWJsZWQgdG8gcHJldmVudCBjeWNsZXMpLlxuICAgKi9cbiAgb25Gb2xkZXJNb3ZlUmVxdWVzdGVkKHBheWxvYWQ6IHsgaWQ6IG51bWJlciB9KTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHBheWxvYWQuaWQpO1xuICAgIGNvbnN0IGN0eDogRm9sZGVyTW92ZVJlcXVlc3RlZFBheWxvYWQgPSB7XG4gICAgICBpZDogcGF5bG9hZC5pZCxcbiAgICAgIG5hbWU6IG5vZGU/Lm5hbWUgPz8gJycsXG4gICAgICBoYXNQYXJlbnQ6IHRoaXMuZm9sZGVySGFzUGFyZW50KHBheWxvYWQuaWQpLFxuICAgIH07XG4gICAgdGhpcy5mb2xkZXJNb3ZlUmVxdWVzdGVkLmVtaXQoY3R4KTtcbiAgICBpZiAoIXRoaXMudXNlSW50ZXJuYWxEaWFsb2dzKSByZXR1cm47XG4gICAgdGhpcy5vcGVuTW92ZUZvbGRlckRpYWxvZyhjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZGViYXIgZW1pdHRlZCBgZm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkYC4gVGhlIGxpYnJhcnkgY2FuJ3QgcGVyc2lzdCDigJRcbiAgICogZW1pdCB0aGUgaG9zdC1sZXZlbCBldmVudCBzbyB0aGUgaG9zdCBjbG9uZXMgdGhlIHN1YnRyZWUgc2VydmVyLXNpZGUuXG4gICAqIFRlc3QgY2FzZXMgc2hvdWxkIGJlICpyZWZlcmVuY2VkKiBmcm9tIHRoZSBuZXcgZm9sZGVycywgbm90IGR1cGxpY2F0ZWQuXG4gICAqL1xuICBvbkZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZChwYXlsb2FkOiB7IGlkOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBwYXlsb2FkLmlkKTtcbiAgICB0aGlzLmZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZC5lbWl0KHtcbiAgICAgIGlkOiBwYXlsb2FkLmlkLFxuICAgICAgbmFtZTogbm9kZT8ubmFtZSA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2lkZWJhckNvbGxhcHNlZENoYW5nZShjb2xsYXBzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNpZGViYXJDb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gICAgdGhpcy5zaWRlYmFyQ29sbGFwc2VkQ2hhbmdlLmVtaXQoY29sbGFwc2VkKTtcbiAgfVxuXG4gIHRvZ2dsZVNpZGViYXIoKTogdm9pZCB7XG4gICAgdGhpcy5vblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoIXRoaXMuc2lkZWJhckNvbGxhcHNlZCk7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBidWxrIGFjdGlvbnMgc2hvd24gaW4gdGhlIHRvb2xiYXIgbWVyZ2VkIHdpdGggYW55IGhvc3Qtc3VwcGxpZWRcbiAgICogYGJ1bGtBY3Rpb25zYC4gQ3VycmVudGx5IG9ubHkgXCJNb3ZlIHRvIGZvbGRlclwiIHNoaXBzIGJ5IGRlZmF1bHQg4oCUXG4gICAqIERlbGV0ZSAvIEFkZCBUYWcgYXJlIG9wdC1pbiBwZXIgdGhlIGN1cnJlbnQgcHJvZHVjdCByZXF1aXJlbWVudC4gSG9zdHNcbiAgICogdGhhdCB3YW50IHRoZW0gYmFjayBwYXNzIHRoZW0gdmlhIGBidWxrQWN0aW9uc2AuXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlQnVsa0FjdGlvbnMoKTogVGFibGVBY3Rpb25bXSB7XG4gICAgY29uc3QgZGVmYXVsdHM6IFRhYmxlQWN0aW9uW10gPSBbXG4gICAgICB7IGlkOiAnbW92ZScsIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZVRvRm9sZGVyLCBpY29uOiAnZHJpdmVfZmlsZV9tb3ZlJywgdG9vbHRpcDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVUb0ZvbGRlciB9LFxuICAgIF07XG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gbmV3IE1hcCgodGhpcy5idWxrQWN0aW9ucyB8fCBbXSkubWFwKGEgPT4gW2EuaWQsIGFdIGFzIGNvbnN0KSk7XG4gICAgY29uc3QgbWVyZ2VkID0gZGVmYXVsdHMubWFwKGQgPT4gb3ZlcnJpZGVzLmdldChkLmlkKSA/PyBkKTtcbiAgICBmb3IgKGNvbnN0IGV4dHJhIG9mIHRoaXMuYnVsa0FjdGlvbnMgfHwgW10pIHtcbiAgICAgIGlmICghZGVmYXVsdHMuc29tZShkID0+IGQuaWQgPT09IGV4dHJhLmlkKSkge1xuICAgICAgICBtZXJnZWQucHVzaChleHRyYSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICBvbkJ1bGtBY3Rpb24oZXZlbnQ6IHsgaWQ6IHN0cmluZzsgc2VsZWN0ZWQ6IGFueVtdIH0pOiB2b2lkIHtcbiAgICAvLyBBbHdheXMgZW1pdCB0aGUgcmF3IGNsaWNrIHNvIGhvc3RzIG93bmluZyB0aGUgVVggY2FuIGludGVyY2VwdCBlYXJseS5cbiAgICB0aGlzLmJ1bGtBY3Rpb25DbGljay5lbWl0KHsgaWQ6IGV2ZW50LmlkLCBzZWxlY3RlZDogZXZlbnQuc2VsZWN0ZWQgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZElkcyA9IChldmVudC5zZWxlY3RlZCB8fCBbXSkubWFwKHIgPT4gcj8uaWQpLmZpbHRlcih2ID0+IHYgIT0gbnVsbCk7XG4gICAgaWYgKGV2ZW50LmlkID09PSAnbW92ZScpIHtcbiAgICAgIHRoaXMub3Blbk1vdmVEaWFsb2coc2VsZWN0ZWRJZHMsIGV2ZW50LnNlbGVjdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIG5vbi1kaWFsb2cgYWN0aW9ucyAoY3VzdG9tIGVudHJpZXMgZnJvbSBob3N0LXN1cHBsaWVkIGBidWxrQWN0aW9uc2ApLCBpbnZva2UgaW1tZWRpYXRlbHkuXG4gICAgdGhpcy5idWxrQWN0aW9uSW52b2tlZC5lbWl0KHsgaWQ6IGV2ZW50LmlkLCBzZWxlY3RlZDogZXZlbnQuc2VsZWN0ZWQgfSk7XG4gIH1cblxuICBvbkJ1bGtTZWxlY3RBbGwoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEFwcGx5IHRoZSBhY3Rpb24gbG9jYWxseSBzbyB0aGUgYWN0aW9uIHRvb2xiYXIncyBcIlNlbGVjdCBhbGxcIiB3b3JrcyBvdXQtb2YtdGhlLWJveC5cbiAgICAvLyBXaGVuIGNoZWNrZWQsIHNlbGVjdCBldmVyeSByb3cgaW4gdGhlICpjdXJyZW50KiBmaWx0ZXJlZCBzZXQgKGkuZS4gYWxsIHRlc3RzIGluXG4gICAgLy8gdGhlIHNlbGVjdGVkIGZvbGRlcikuIFdoZW4gdW5jaGVja2VkLCBjbGVhciBzZWxlY3Rpb24uXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gY2hlY2tlZCA/IFsuLi50aGlzLmZpbHRlcmVkUm93c10gOiBbXTtcbiAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KFsuLi50aGlzLnNlbGVjdGVkSXRlbXNdKTtcbiAgICB0aGlzLmJ1bGtTZWxlY3RBbGxDaGFuZ2UuZW1pdChjaGVja2VkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQnVsa0Rpc21pc3MoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgc2VsZWN0aW9uIEFORCB0aGUgcGVyLXJvdyBpc1NlbGVjdGVkIGZsYWdzIHNvIHRoZSBhY3Rpb24gdG9vbGJhciBjbG9zZXNcbiAgICAvLyAoaXQncyBnYXRlZCBvbiBgYW55Um93U2VsZWN0ZWRgLCB3aGljaCByZWFkcyBib3RoIHNlbGVjdGVkSXRlbXMgYW5kIHJvdyBmbGFncykuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChbXSk7XG4gICAgdGhpcy5idWxrRGlzbWlzcy5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Nb3ZlRGlhbG9nKHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHNlbGVjdGVkOiBhbnlbXSk6IHZvaWQge1xuICAgIC8vIEZpcmUgdGhlIFwicmVxdWVzdGVkXCIgZXZlbnQgZmlyc3Qgc28gYSBob3N0IGNhbiBpbnRlcmNlcHQgd2hlbiBpdCBvd25zIHRoZSBVWC5cbiAgICB0aGlzLm1vdmVSZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICB0ZXN0SWRzLFxuICAgICAgc2VsZWN0ZWQsXG4gICAgICBjdXJyZW50Rm9sZGVySWQ6IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCxcbiAgICAgIGZvbGRlcnM6IHRoaXMuZm9sZGVycyxcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMudXNlSW50ZXJuYWxEaWFsb2dzKSByZXR1cm47XG5cbiAgICBjb25zdCBjb3VudCA9IHRlc3RJZHMubGVuZ3RoO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGNvdW50ID09PSAxXG4gICAgICA/IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nRGVzY3JpcHRpb25TaW5ndWxhclxuICAgICAgOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0Rlc2NyaXB0aW9uUGx1cmFsXG4gICAgKS5yZXBsYWNlKCd7bn0nLCAnJyArIGNvdW50KTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIG51bWJlciB8IG51bGw+KHtcbiAgICAgIHRpdGxlOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ1RpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgY3VycmVudEZvbGRlcklkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQsXG4gICAgICAgICAgLy8gV2hlbiBtb3ZpbmcgRlJPTSBVbm9yZ2FuaXplZCwgZGlzYWJsZSB0aGUgVW5vcmdhbml6ZWQgZGVzdGluYXRpb24gcm93LlxuICAgICAgICAgIHJvb3REaXNhYmxlZDogdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0NhbmNlbCwgcm9sZTogJ3NlY29uZGFyeScsIGhhbmRsZXI6IHIgPT4gci5jbG9zZSh1bmRlZmluZWQgYXMgYW55KSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nQ29uZmlybSxcbiAgICAgICAgICByb2xlOiAncHJpbWFyeScsXG4gICAgICAgICAgaGFuZGxlcjogciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHIuZ2V0Q29tcG9uZW50SW5zdGFuY2U8TW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50PigpO1xuICAgICAgICAgICAgci5jbG9zZShpbnN0YW5jZSA/IGluc3RhbmNlLnBpY2tlZEZvbGRlcklkIDogbnVsbCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidXR0b25BbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgfSk7XG4gICAgcmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHRhcmdldEZvbGRlcklkID0+IHtcbiAgICAgIGlmICh0YXJnZXRGb2xkZXJJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47IC8vIGNhbmNlbGxlZFxuICAgICAgdGhpcy50ZXN0c01vdmVkLmVtaXQoeyB0ZXN0SWRzLCB0YXJnZXRGb2xkZXJJZDogdGFyZ2V0Rm9sZGVySWQgPz8gbnVsbCB9KTtcbiAgICAgIHRoaXMuYnVsa0FjdGlvbkludm9rZWQuZW1pdCh7IGlkOiAnbW92ZScsIHNlbGVjdGVkIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBmb2xkZXItcGlja2VyIGRpYWxvZyBjb25maWd1cmVkIGZvciBtb3ZpbmcgYSBmb2xkZXIgKHJhdGhlciB0aGFuIHRlc3RzKS5cbiAgICogVGhlIHNvdXJjZSBmb2xkZXIgaXRzZWxmIGlzIG1hcmtlZCBhcyB0aGUgXCJjdXJyZW50XCIgZm9sZGVyIHNvIGl0J3MgcmVuZGVyZWQgYXNcbiAgICogZGlzYWJsZWQgaW4gdGhlIHBpY2tlci4gT24gY29uZmlybSwgZW1pdHMgYGZvbGRlck1vdmVkYCB3aXRoIHRoZSBjaG9zZW4gcGFyZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBvcGVuTW92ZUZvbGRlckRpYWxvZyhjdHg6IEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkKTogdm9pZCB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW48YW55LCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkPih7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLmZvbGRlck1lbnVNb3ZlLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIC8vIFJldXNlIHRoZSBcImRpc2FibGVkXCIgdHJlYXRtZW50OiB0aGUgZm9sZGVyIGJlaW5nIG1vdmVkIGNhbid0IGJlIGl0cyBvd24gZGVzdGluYXRpb24uXG4gICAgICAgICAgY3VycmVudEZvbGRlcklkOiBjdHguaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0NhbmNlbCwgcm9sZTogJ3NlY29uZGFyeScsIGhhbmRsZXI6IHIgPT4gci5jbG9zZSh1bmRlZmluZWQgYXMgYW55KSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlRGlhbG9nQ29uZmlybSxcbiAgICAgICAgICByb2xlOiAncHJpbWFyeScsXG4gICAgICAgICAgaGFuZGxlcjogciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHIuZ2V0Q29tcG9uZW50SW5zdGFuY2U8TW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50PigpO1xuICAgICAgICAgICAgci5jbG9zZShpbnN0YW5jZSA/IGluc3RhbmNlLnBpY2tlZEZvbGRlcklkIDogbnVsbCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidXR0b25BbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgfSk7XG4gICAgcmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHRhcmdldEZvbGRlcklkID0+IHtcbiAgICAgIGlmICh0YXJnZXRGb2xkZXJJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47IC8vIGNhbmNlbGxlZFxuICAgICAgdGhpcy5mb2xkZXJNb3ZlZC5lbWl0KHsgaWQ6IGN0eC5pZCwgbmV3UGFyZW50SWQ6IHRhcmdldEZvbGRlcklkID8/IG51bGwgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5DcmVhdGVGb2xkZXJEaWFsb2coaW5pdGlhbFBhcmVudElkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW48YW55LCB7IG5hbWU6IHN0cmluZzsgcGFyZW50SWQ6IG51bWJlciB8IG51bGw7IGNvbG9yOiBzdHJpbmcgfSB8IGZhbHNlPih7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLm5ld0ZvbGRlckRpYWxvZ1RpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dEZXNjcmlwdGlvbixcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlcnM6IHRoaXMuZm9sZGVycyxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMubW9kdWxhckxhYmVscyxcbiAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICBwYXJlbnRJZDogaW5pdGlhbFBhcmVudElkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm5ld0ZvbGRlckRpYWxvZ0NhbmNlbCwgcm9sZTogJ3NlY29uZGFyeScsIGhhbmRsZXI6IHIgPT4gci5jbG9zZShmYWxzZSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nQ29uZmlybSxcbiAgICAgICAgICByb2xlOiAncHJpbWFyeScsXG4gICAgICAgICAgaGFuZGxlcjogciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0ID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICBpZiAoIWluc3QgfHwgIWluc3QuaXNWYWxpZCkgcmV0dXJuIGZhbHNlOyAvLyBrZWVwIHRoZSBkaWFsb2cgb3BlbiBvbiBpbnZhbGlkIHN1Ym1pdFxuICAgICAgICAgICAgci5jbG9zZSh7IG5hbWU6IChpbnN0Lm5hbWUgfHwgJycpLnRyaW0oKSwgcGFyZW50SWQ6IGluc3QucGFyZW50SWQsIGNvbG9yOiBpbnN0LmNvbG9yIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmZvbGRlckNyZWF0ZWQuZW1pdCh7IHBhcmVudElkOiByZXN1bHQucGFyZW50SWQsIG5hbWU6IHJlc3VsdC5uYW1lLCBjb2xvcjogcmVzdWx0LmNvbG9yIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRGVsZXRlRm9sZGVyRGlhbG9nKGN0eDogRm9sZGVyRGVsZXRlUmVxdWVzdGVkUGF5bG9hZCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgeyBzdHJhdGVneTogRm9sZGVyRGVsZXRlU3RyYXRlZ3kgfSB8IGZhbHNlPih7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLmRlbGV0ZUZvbGRlckRpYWxvZ1RpdGxlLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IERlbGV0ZUZvbGRlckRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgZm9sZGVyTmFtZTogY3R4Lm5hbWUsXG4gICAgICAgICAgdGVzdENvdW50OiBjdHgudGVzdENvdW50LFxuICAgICAgICAgIGhhc1BhcmVudDogY3R4Lmhhc1BhcmVudCxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMubW9kdWxhckxhYmVscyxcbiAgICAgICAgICBzdHJhdGVneTogY3R4Lmhhc1BhcmVudCA/ICdtb3ZlLXRvLXBhcmVudCcgOiAnbW92ZS10by11bm9yZ2FuaXplZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMuZGVsZXRlRm9sZGVyRGlhbG9nQ2FuY2VsLCByb2xlOiAnc2Vjb25kYXJ5JywgaGFuZGxlcjogciA9PiByLmNsb3NlKGZhbHNlKSB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5kZWxldGVGb2xkZXJEaWFsb2dDb25maXJtLFxuICAgICAgICAgIHJvbGU6ICd3YXJuJyxcbiAgICAgICAgICBoYW5kbGVyOiByID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc3QgPSByLmdldENvbXBvbmVudEluc3RhbmNlPERlbGV0ZUZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIHIuY2xvc2UoaW5zdCA/IHsgc3RyYXRlZ3k6IGluc3Quc3RyYXRlZ3kgfSA6IGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJEZWxldGVkLmVtaXQoeyBpZDogY3R4LmlkLCBzdHJhdGVneTogcmVzdWx0LnN0cmF0ZWd5IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSb3ctcmVvcmRlciBoYW5kbGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgc3RhcnRSZW9yZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIHRoaXMucmVvcmRlclNuYXBzaG90ID0gWy4uLih0aGlzLnBhZ2VkUm93cyB8fCBbXSldO1xuICAgIHRoaXMucmVvcmRlckRyYWZ0ID0gWy4uLih0aGlzLnBhZ2VkUm93cyB8fCBbXSldO1xuICAgIC8vIFBhdXNlIGF1dG8tcmVmcmVzaCB3aGlsZSByZW9yZGVyaW5nIOKAlCBhdm9pZHMgdGhlIHRpbWVyIGNsb2JiZXJpbmcgdGhlIGRyYWZ0LlxuICAgIHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2ggPSB0aGlzLnNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbDtcbiAgICBpZiAodGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA+IDApIHtcbiAgICAgIHRoaXMuc2V0dXBBdXRvUmVmcmVzaCgwKTtcbiAgICB9XG4gICAgdGhpcy5pc1Jlb3JkZXJpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgPSBmYWxzZTtcbiAgICB0aGlzLnJlb3JkZXJTdGFydC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjYW5jZWxSZW9yZGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWdlIG9yZGVyIHNvIHRoZSB1c2VyIHNlZXMgdGhlIHByZS1kcmFnIHN0YXRlLlxuICAgIGlmICh0aGlzLnJlb3JkZXJTbmFwc2hvdCkge1xuICAgICAgdGhpcy5wYWdlZFJvd3MgPSBbLi4udGhpcy5yZW9yZGVyU25hcHNob3RdO1xuICAgIH1cbiAgICB0aGlzLmV4aXRSZW9yZGVyTW9kZSgpO1xuICAgIHRoaXMucmVvcmRlckNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBzYXZlUmVvcmRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSZW9yZGVyaW5nKSByZXR1cm47XG4gICAgY29uc3Qgb3JkZXJlZCA9IHRoaXMucmVvcmRlckRyYWZ0ID8gWy4uLnRoaXMucmVvcmRlckRyYWZ0XSA6IFsuLi4odGhpcy5wYWdlZFJvd3MgfHwgW10pXTtcbiAgICB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwID0gdHJ1ZTtcbiAgICB0aGlzLnJlb3JkZXJTYXZlLmVtaXQoeyBvcmRlcmVkSXRlbXM6IG9yZGVyZWQgfSk7XG4gICAgLy8gSWYgdGhlIGhvc3QgbmV2ZXIgZmxpcHMgYHJlb3JkZXJTYXZpbmdgIChlLmcuIHN5bmNocm9ub3VzIG5vLW9wKSwgZXhpdFxuICAgIC8vIGltbWVkaWF0ZWx5IHNvIHRoZSBVSSBkb2Vzbid0IGdldCBzdHVjayBpbiBcIlNhdmluZy4uLlwiIHN0YXRlLlxuICAgIGlmICghdGhpcy5yZW9yZGVyU2F2aW5nKSB7XG4gICAgICAvLyBHaXZlIHRoZSBob3N0IGEgbWljcm90YXNrIHRvIGZsaXAgYHJlb3JkZXJTYXZpbmdgIHRvIHRydWUg4oCUIGlmIGl0XG4gICAgICAvLyBoYXNuJ3QsIGFzc3VtZSBubyBhc3luYyB3b3JrIGFuZCBleGl0LlxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwICYmICF0aGlzLnJlb3JkZXJTYXZpbmcpIHtcbiAgICAgICAgICB0aGlzLmV4aXRSZW9yZGVyTW9kZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblJvd1Jlb3JkZXIoZXZlbnQ6IHsgcHJldmlvdXNJbmRleDogbnVtYmVyOyBjdXJyZW50SW5kZXg6IG51bWJlcjsgb3JkZXJlZERhdGE6IGFueVtdIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSZW9yZGVyaW5nKSByZXR1cm47XG4gICAgdGhpcy5yZW9yZGVyRHJhZnQgPSBbLi4uZXZlbnQub3JkZXJlZERhdGFdO1xuICAgIHRoaXMucGFnZWRSb3dzID0gdGhpcy5yZW9yZGVyRHJhZnQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4aXRSZW9yZGVyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUmVvcmRlcmluZyA9IGZhbHNlO1xuICAgIHRoaXMucmVvcmRlclNuYXBzaG90ID0gbnVsbDtcbiAgICB0aGlzLnJlb3JkZXJEcmFmdCA9IG51bGw7XG4gICAgdGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCA9IGZhbHNlO1xuICAgIC8vIFJlc3RvcmUgcHJldmlvdXNseS1zZWxlY3RlZCBhdXRvLXJlZnJlc2ggaW50ZXJ2YWwgKGlmIGFueSkuXG4gICAgaWYgKHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2ggPiAwKSB7XG4gICAgICB0aGlzLnNldHVwQXV0b1JlZnJlc2godGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCk7XG4gICAgICB0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID0gMDtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUm93LWRyYWcgcGF5bG9hZCBidWlsZGVyIHVzZWQgYnkgdGhlIFtjcWFSb3dEcmFnXSBkaXJlY3RpdmUgdmlhIChidWlsZFBheWxvYWQpLlxuICAgKi9cbiAgYnVpbGRSb3dEcmFnUGF5bG9hZCA9IChyb3c6IGFueSk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtcztcbiAgICAvLyBJZiB0aGUgZHJhZ2dlZCByb3cgaXMgcGFydCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGRyYWcgdGhlIHdob2xlIHNlbGVjdGlvbi5cbiAgICBjb25zdCByb3dJZCA9IHJvdz8uaWQ7XG4gICAgY29uc3QgaW5TZWxlY3Rpb24gPSByb3dJZCAhPSBudWxsICYmIHNlbGVjdGVkLnNvbWUocyA9PiBzPy5pZCA9PT0gcm93SWQpO1xuICAgIGNvbnN0IGlkcyA9IChpblNlbGVjdGlvbiA/IHNlbGVjdGVkIDogW3Jvd10pLm1hcChyID0+IHI/LmlkKS5maWx0ZXIodiA9PiB2ICE9IG51bGwpO1xuICAgIHJldHVybiBpZHM7XG4gIH07XG59XG4iLCI8IS0tIFJldXNhYmxlIGZvbGRlci1pY29uIGNoaXAuIFJlbmRlciB2aWEgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb25DaGlwOyBjb250ZXh0OiB7IGNvbG9yOiBmLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj4uIC0tPlxuPG5nLXRlbXBsYXRlICNmb2xkZXJJY29uQ2hpcCBsZXQtY29sb3I9XCJjb2xvclwiPlxuICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy0xMCBjcWEtaC0xMCBjcWEtcm91bmRlZC1sZyBjcWEtYmctWyNGMEYwRjFdIGNxYS10ZXh0LVsjNkQ2RDc0XSBjcWEtc2hyaW5rLTAgZ3JvdXAtaG92ZXI6Y3FhLWJnLWluZGlnby01MCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIFthdHRyLnN0cm9rZV09XCJjb2xvciB8fCAnY3VycmVudENvbG9yJ1wiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgIDwvc3ZnPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFJldXNhYmxlIFwiK1wiIGNoaXAgdXNlZCBieSB0aGUgXCJOZXcgZm9sZGVyXCIgdGlsZS4gLS0+XG48bmctdGVtcGxhdGUgI2FkZEljb25DaGlwPlxuICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy0xMCBjcWEtaC0xMCBjcWEtcm91bmRlZC1sZyBjcWEtYmctWyNGMEYwRjFdIGNxYS10ZXh0LVsjNkQ2RDc0XSBjcWEtc2hyaW5rLTAgZ3JvdXAtaG92ZXI6Y3FhLWJnLWluZGlnby01MCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNOCAzVjEzTTMgOEgxM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjc1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtcmVsYXRpdmVcIj5cbiAgICA8ZGl2IFtjbGFzc109XCIhc2hvd1NlYXJjaEJhciA/ICdjcWEtanVzdGlmeS1lbmQnIDogJ2NxYS1qdXN0aWZ5LWJldHdlZW4nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1iLTNcIj5cbiAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICAqbmdJZj1cInNob3dTZWFyY2hCYXJcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInNob3dDbGVhclwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ2YWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaCk9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgIChjbGVhcmVkKT1cImNsZWFyZWQoKVwiXG4gICAgICA+PC9jcWEtc2VhcmNoLWJhcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtZmxleC13cmFwXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgaWNvbj1cIm9wZW5faW5fbmV3XCJcbiAgICAgICAgW3RleHRdPVwiaXNFeHBvcnRpbmcgPyAnRXhwb3J0aW5nLi4uJyA6ICdFeHBvcnQnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRXhwb3J0aW5nXCJcbiAgICAgICAgKGNsaWNrZWQpPVwiZXhwb3J0Q29kZUNsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8c3Bhbj57eyBpc0V4cG9ydGluZyA/ICdFeHBvcnRpbmcuLi4nIDogJ0V4cG9ydCcgfX08L3NwYW4+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICBcbiAgICAgIDwhLS0gRXhwb3J0IENvZGUgTW9kYWwgLS0+XG4gICAgICA8Y3FhLWV4cG9ydC1jb2RlLW1vZGFsXG4gICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gICAgICAgIFtpc09wZW5dPVwiaXNFeHBvcnRNb2RhbE9wZW5cIlxuICAgICAgICBbY2FzZXNdPVwic2VsZWN0ZWRDYXNlc0ZvckV4cG9ydFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgIChjbG9zZU1vZGFsKT1cImNsb3NlRXhwb3J0TW9kYWwoKVwiXG4gICAgICAgIChleHBvcnQpPVwib25FeHBvcnRNb2RhbEV4cG9ydCgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1leHBvcnQtY29kZS1tb2RhbD5cbiAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRyb3Bkb3duVGVtcGxhdGUgb2Ygb3RoZXJEcm9wRG93bkJ1dHRvbnM7IHRyYWNrQnk6IHRyYWNrQnlEcm9wZG93blRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VsZWN0RHJvcGRvd25UZW1wbGF0ZSBvZiBvdGhlclNlbGVjdERyb3BEb3duQnV0dG9uczsgdHJhY2tCeTogdHJhY2tCeVNlbGVjdERyb3Bkb3duVGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0RHJvcGRvd25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgXG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93RmlsdGVyQnV0dG9uXCJcbiAgICAgICAgICB2YXJpYW50PVwiZ3JleS1zb2xpZFwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlRmlsdGVyKClcIlxuICAgICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICBGaWx0ZXIgICAgICAgICAgXG4gICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImFycm93Q2xhc3Nlc1wiPlxuICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LTIgY3FhLWgtMSBjcWEtYWJzb2x1dGUgY3FhLWxlZnQtWzRweF0gY3FhLXRvcC1bNnB4XVwiXG4gICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgOCA0XCJcbiAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgMEw0IDRMOCAwXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMEIwQjBDXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjMzXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtY29sdW1uLXZpc2liaWxpdHlcbiAgICAgICAgICAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiXG4gICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJpbGl0eUNvbHVtbnNcIlxuICAgICAgICAgIFtjb2x1bW5WaXNpYmlsaXR5XT1cImNvbHVtblZpc2liaWxpdHlcIlxuICAgICAgICAgIFtzZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWxdPVwic2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAoY29sdW1uVmlzaWJpbGl0eUNoYW5nZSk9XCJvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGF1dG9SZWZyZXNoQ2hhbmdlKT1cIm9uQXV0b1JlZnJlc2hDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2NxYS1jb2x1bW4tdmlzaWJpbGl0eT5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dBdXRvUmVmcmVzaEJ1dHRvblwiXG4gICAgICAgICAgdmFyaWFudD1cImdyZXktc29saWRcIlxuICAgICAgICAgIGljb249XCJyZWZyZXNoXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJoYW5kbGVSZWZyZXNoQ2xpY2soKVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlZnJlc2gnXCJcbiAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVvcmRlcmluZ1wiXG4gICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvblRlbXBsYXRlIG9mIG90aGVyQnV0dG9uczsgdHJhY2tCeTogdHJhY2tCeVRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8Y3FhLXNlZ21lbnQtY29udHJvbFxuICAgICAgICAgICpuZ0lmPVwic2hvd1ZpZXdNb2RlVG9nZ2xlXCJcbiAgICAgICAgICBzaXplPVwibGdcIlxuICAgICAgICAgIFtzZWdtZW50c109XCJ2aWV3TW9kZVNlZ21lbnRzXCJcbiAgICAgICAgICBbdmFsdWVdPVwidmlld01vZGVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZpZXdNb2RlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd1Jlb3JkZXJCdXR0b24gJiYgIWlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICBpY29uPVwiZHJhZ19pbmRpY2F0b3JcIlxuICAgICAgICAgIFt0ZXh0XT1cInJlb3JkZXJMYWJlbHMucmVvcmRlckJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFwYWdlZFJvd3MgfHwgcGFnZWRSb3dzLmxlbmd0aCA9PT0gMCB8fCBpc1RhYmxlTG9hZGluZyB8fCBpc1RhYmxlRGF0YUxvYWRpbmdcIlxuICAgICAgICAgIChjbGlja2VkKT1cInN0YXJ0UmVvcmRlcigpXCJcbiAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZW9yZGVyQnV0dG9uICYmIGlzUmVvcmRlcmluZ1wiPlxuICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW3RleHRdPVwicmVvcmRlckxhYmVscy5jYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlb3JkZXJTYXZpbmdcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwiY2FuY2VsUmVvcmRlcigpXCJcbiAgICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgICAgIFtpY29uXT1cInJlb3JkZXJTYXZpbmcgPyAnaG91cmdsYXNzX2VtcHR5JyA6ICcnXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cInJlb3JkZXJTYXZpbmcgPyByZW9yZGVyTGFiZWxzLnNhdmluZ0J1dHRvbiA6IHJlb3JkZXJMYWJlbHMuZG9uZUJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVvcmRlclNhdmluZ1wiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJzYXZlUmVvcmRlcigpXCJcbiAgICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZW9yZGVyIG1vZGUgYmFubmVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tYi0zIGNxYS1weC0zIGNxYS1weS0yIGNxYS1yb3VuZGVkLW1kIGNxYS1iZy1bI0ZGRkJFQl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkRFNjhBXVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICA8L3N2Zz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM5MjQwMEVdXCI+e3sgcmVvcmRlckxhYmVscy5iYW5uZXJUaXRsZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM5MjQwMEVdXCI+e3sgcmVvcmRlckxhYmVscy5iYW5uZXJEZXNjcmlwdGlvbiB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxjcWEtc2VsZWN0ZWQtZmlsdGVyc1xuICAgICAgW2ZpbHRlckFwcGxpZWRdPVwiZmlsdGVyQXBwbGllZFwiXG4gICAgICBbY2hpcHNdPVwiY2hpcHNcIlxuICAgICAgKHJlbW92ZUNoaXApPVwib25SZW1vdmVDaGlwKCRldmVudClcIlxuICAgICAgKGNsZWFyQWxsKT1cIm9uQ2xlYXJBbGxDaGlwcygpXCJcbiAgICAgIChvbkNsZWFyQWxsKT1cIm9uQ2xlYXJBbGwuZW1pdCgpXCJcbiAgICA+XG4gICAgPC9jcWEtc2VsZWN0ZWQtZmlsdGVycz5cblxuICAgIDxjcWEtZHluYW1pYy1maWx0ZXJcbiAgICAgICpuZ0lmPVwic2hvd0ZpbHRlclBhbmVsXCJcbiAgICAgIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCJcbiAgICAgIFttb2RlbF09XCJmaWx0ZXJNb2RlbFwiXG4gICAgICBbc2hvd0ZpbHRlclBhbmVsXT1cInNob3dGaWx0ZXJQYW5lbFwiXG4gICAgICAoZmlsdGVyc0NoYW5nZWQpPVwib25GaWx0ZXJzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChmaWx0ZXJzQXBwbGllZCk9XCJvbkZpbHRlcnNBcHBsaWVkKCRldmVudClcIlxuICAgICAgKG9uQXBwbHlGaWx0ZXJDbGljayk9XCJvbkFwcGx5RmlsdGVyQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgIChvblJlc2V0RmlsdGVyQ2xpY2spPVwiaGFuZGxlUmVzZXRGaWx0ZXJDbGljaygpXCJcbiAgICA+XG4gICAgPC9jcWEtZHluYW1pYy1maWx0ZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLWdhcC0zIGNxYS1taW4taC0wIFwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyMjYsIDIyNiwgMjI3KTtcIj5cbiAgICAgIDwhLS0gU2lkZWJhciAob25seSBzaG93biBpbiBtb2R1bGFyIHZpZXcpIC0tPlxuICAgICAgPGNxYS1mb2xkZXItc2lkZWJhclxuICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93U2lkZWJhclwiXG4gICAgICAgIFtmb2xkZXJzXT1cImZvbGRlcnNcIlxuICAgICAgICBbc2VsZWN0ZWRGb2xkZXJJZF09XCJzZWxlY3RlZEZvbGRlcklkXCJcbiAgICAgICAgW2V4cGFuZGVkRm9sZGVySWRzXT1cImV4cGFuZGVkRm9sZGVySWRzXCJcbiAgICAgICAgW3Vub3JnYW5pemVkQ291bnRdPVwidW5vcmdhbml6ZWRDb3VudFwiXG4gICAgICAgIFthbGxvd0NyZWF0ZV09XCJtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCJcbiAgICAgICAgW2FsbG93UmVuYW1lXT1cIm1vZHVsYXJDb25maWcuYWxsb3dSZW5hbWVGb2xkZXJcIlxuICAgICAgICBbYWxsb3dEZWxldGVdPVwibW9kdWxhckNvbmZpZy5hbGxvd0RlbGV0ZUZvbGRlclwiXG4gICAgICAgIFthbGxvd0Ryb3BdPVwibW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcFwiXG4gICAgICAgIFtzaG93Q291bnRzXT1cIm1vZHVsYXJDb25maWcuc2hvd0NvdW50c1wiXG4gICAgICAgIFtjb2xsYXBzZWRdPVwic2lkZWJhckNvbGxhcHNlZFwiXG4gICAgICAgIFtsYWJlbHNdPVwibW9kdWxhckxhYmVsc1wiXG4gICAgICAgIFtzZXJ2ZXJTaWRlU2VhcmNoXT1cInNlcnZlclNpZGVTZWFyY2hcIlxuICAgICAgICBbcm9vdFRvdGFsXT1cInJvb3RUb3RhbFwiXG4gICAgICAgIFtmb2xkZXJTZWFyY2hMb2FkaW5nXT1cImZvbGRlclNlYXJjaExvYWRpbmdcIlxuICAgICAgICBbcm9vdEZvbGRlcnNMb2FkaW5nXT1cInJvb3RGb2xkZXJzTG9hZGluZ1wiXG4gICAgICAgIFtzZWFyY2hWYWx1ZV09XCJmb2xkZXJTZWFyY2hWYWx1ZVwiXG4gICAgICAgIChmb2xkZXJTZWxlY3RlZCk9XCJvbkZvbGRlclNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyRXhwYW5zaW9uVG9nZ2xlZCk9XCJvbkZvbGRlckV4cGFuc2lvblRvZ2dsZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJDaGlsZHJlblJlcXVlc3RlZCk9XCJmb2xkZXJDaGlsZHJlblJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAoZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQpPVwiZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHJvb3RMb2FkTW9yZVJlcXVlc3RlZCk9XCJyb290TG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCgpXCJcbiAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJmb2xkZXJTZWFyY2hDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckNyZWF0ZWQpPVwib25Gb2xkZXJDcmVhdGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyQ3JlYXRlUmVxdWVzdGVkKT1cIm9uRm9sZGVyQ3JlYXRlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyUmVuYW1lZCk9XCJvbkZvbGRlclJlbmFtZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEZWxldGVkKT1cIm9uRm9sZGVyRGVsZXRlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlck1vdmVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJNb3ZlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkKT1cIm9uRm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAodGVzdHNEcm9wcGVkKT1cIm9uVGVzdHNEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyRHJvcHBlZCk9XCJvbkZvbGRlckRyb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChjb2xsYXBzZWRDaGFuZ2UpPVwib25TaWRlYmFyQ29sbGFwc2VkQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvY3FhLWZvbGRlci1zaWRlYmFyPlxuXG4gICAgICA8IS0tIFJpZ2h0IHBhbmUgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXRvcF09XCJpc01vZHVsYXJWaWV3ID8gJzFweCBzb2xpZCAjRTJFMkUzJyA6IG51bGxcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLWxlZnRdPVwiaXNNb2R1bGFyVmlldyA/ICcxcHggc29saWQgI0UyRTJFMycgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLmJvcmRlci1yaWdodF09XCJpc01vZHVsYXJWaWV3ID8gJzFweCBzb2xpZCAjRTJFMkUzJyA6IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEJyZWFkY3J1bWIgKG1vZHVsYXIgdmlldywgZm9sZGVyIGRyaWxsZWQtaW4pIC0tPlxuICAgICAgICA8bmF2XG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd0JyZWFkY3J1bWIgJiYgIWlzUm9vdFZpZXdcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJGb2xkZXIgcGF0aFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtdGV4dC1zbSBjcWEtcHgtMyBjcWEtcHktMSBjcWEtbWItMyBjcWEtcm91bmRlZC1ub25lXCJcbiAgICAgICAgICBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0UyRTJFMztcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCIgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQobnVsbClcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4+e3sgbW9kdWxhckxhYmVscy5hbGxGb2xkZXJzIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNydW1iIG9mIGJyZWFkY3J1bWJUcmFpbDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtYWxpZ24tbWlkZGxlXCIgc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2NvbG9yOiM2RDZENzQ7XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJsYXN0XG4gICAgICAgICAgICAgICAgPyAnY3FhLXRleHQtWyMxNjE2MTddIGNxYS1mb250LXNlbWlib2xkJ1xuICAgICAgICAgICAgICAgIDogJ2NxYS10ZXh0LVsjNkQ2RDc0XSBob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV0nXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxhc3RcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiIWxhc3QgJiYgb25Gb2xkZXJTZWxlY3RlZChjcnVtYi5pZClcIlxuICAgICAgICAgICAgPnt7IGNydW1iLm5hbWUgfX08L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uYXY+XG5cbiAgICAgICAgPCEtLSBGb2xkZXIgZ3JpZDogbW9kdWxhciArIHJvb3QgdmlldyAtLT5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dGb2xkZXJHcmlkICYmIHJvb3RGb2xkZXJUaWxlcy5sZW5ndGhcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLW1iLTQgY3FhLXB4LTUgY3FhLXB0LTQgY3FhLXBiLVsxNHB4XVwiXG4gICAgICAgICAgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0YwRjBGMTtcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tYi0yXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiIzZENkQ3NFwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzZENkQ3NF1cIj57eyBtb2R1bGFyTGFiZWxzLm9yZ2FuaXplZCB9fTwvaDM+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPlxuICAgICAgICAgICAgICB7eyByb290Rm9sZGVyVGlsZXMubGVuZ3RoID09PSAxID8gbW9kdWxhckxhYmVscy5mb2xkZXJzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMuZm9sZGVyc0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgcm9vdEZvbGRlclRpbGVzLmxlbmd0aCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtbm93cmFwIGNxYS1nYXAtMyBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtcGItMlwiXG4gICAgICAgICAgICAgICAoc2Nyb2xsKT1cIm9uUm9vdEdyaWRTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZiBvZiByb290Rm9sZGVyVGlsZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NxYUZvbGRlckRyb3BdPVwiZi5pZFwiXG4gICAgICAgICAgICAgIFtkcm9wRW5hYmxlZF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJvblRlc3RzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQoZi5pZClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtc2hyaW5rLTAgY3FhLXctWzI0MHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVswLjVweF0gY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1ib3JkZXItWyMzRjQzRUVdIGhvdmVyOmNxYS1zaGFkb3ctc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb25DaGlwOyBjb250ZXh0OiB7IGNvbG9yOiBmLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNXB4XSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLXRydW5jYXRlIGNxYS1sZWFkaW5nLXRpZ2h0IGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IGYubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibW9kdWxhckNvbmZpZy5zaG93Q291bnRzXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTUwMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGYuY291bnQgPz8gMCkgPT09IDEgPyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnJyArIChmLmNvdW50ID8/IDApKSB9fTxuZy1jb250YWluZXIgKm5nSWY9XCJmLmNoaWxkcmVuPy5sZW5ndGhcIj4gwrcge3sgZi5jaGlsZHJlbiEubGVuZ3RoID09PSAxID8gbW9kdWxhckxhYmVscy5vbmVTdWJmb2xkZXIgOiBtb2R1bGFyTGFiZWxzLnN1YmZvbGRlcnNDb3VudC5yZXBsYWNlKCd7bn0nLCAnJyArIGYuY2hpbGRyZW4hLmxlbmd0aCkgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LW5ldXRyYWwtNDAwIGNxYS1zaHJpbmstMFwiIHN0eWxlPVwiZm9udC1zaXplOjIwcHg7d2lkdGg6MjBweDtoZWlnaHQ6MjBweFwiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gXCIrIE5ldyBmb2xkZXJcIiB0aWxlIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIm1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyQ3JlYXRlUmVxdWVzdGVkKHsgcGFyZW50SWQ6IG51bGwgfSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtc2hyaW5rLTAgY3FhLXctWzI0MHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtdGV4dC1sZWZ0IGNxYS1wLTMgY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctWyNGQUZBRkFdIGhvdmVyOmNxYS1ib3JkZXItWyMzRjQzRUVdIGhvdmVyOmNxYS1iZy13aGl0ZSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvbkNoaXBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgbW9kdWxhckxhYmVscy5uZXdGb2xkZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTQwMFwiPnt7IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnMCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFBhZ2luYXRpb24gc3Bpbm5lciBhbmNob3JlZCBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgT3JnYW5pemVkXG4gICAgICAgICAgICAgICAgIHJvdy4gT25seSByZW5kZXJzIGR1cmluZyBhbiBpbi1mbGlnaHQgcm9vdCBmZXRjaCAoaW5pdGlhbCBPUlxuICAgICAgICAgICAgICAgICBzY3JvbGwtZHJpdmVuIFwibG9hZCBtb3JlXCIpLCBhbmQgaXMgZmlsdGVyZWQgdG8gc3VwcHJlc3Mgd2hlblxuICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBpcyBlbXB0eSBzbyB3ZSBkb24ndCBzaG93IGEgc3Bpbm5lciBpbnNpZGUgYW5cbiAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLWJsYW5rIHJvdy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwicm9vdEZvbGRlcnNMb2FkaW5nICYmIHJvb3RGb2xkZXJUaWxlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtc2hyaW5rLTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctWzgwcHhdXCJcbiAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTG9hZGluZyBtb3JlIGZvbGRlcnMnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMjBcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDwhLS0gU3ViZm9sZGVyIHNlY3Rpb246IG1vZHVsYXIgKyBmb2xkZXIgdmlldy4gU2hvd24gd2hlbmV2ZXIgZHJpbGxlZCBpblxuICAgICAgICAgICAgIChldmVuIGlmIG5vIHN1YmZvbGRlcnMsIHNvIHRoZSBcIisgTmV3IGZvbGRlclwiIHRpbGUgcmVtYWluc1xuICAgICAgICAgICAgIHJlYWNoYWJsZSwgYW5kIHNvIHdlIGNhbiByZW5kZXIgYSBsb2FkaW5nIHN0YXRlIGR1cmluZyB0aGVcbiAgICAgICAgICAgICBkcmlsbC1pbiBmZXRjaCBiZWZvcmUgY2hpbGRyZW4gYXJyaXZlKS4gLS0+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmICFpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1N1YmZvbGRlclNlY3Rpb24gJiYgKHN1YmZvbGRlclRpbGVzLmxlbmd0aCB8fCBjdXJyZW50Rm9sZGVyTm9kZT8uY2hpbGRyZW5Mb2FkaW5nKVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtbWItNCBjcWEtcHgtMyBjcWEtcHktMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViZm9sZGVyVGlsZXMubGVuZ3RoIHx8IG1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNjAwIGNxYS1tYi0yXCI+XG4gICAgICAgICAgICB7eyBtb2R1bGFyTGFiZWxzLnN1YmZvbGRlcnNJbiB9fSB7eyBicmVhZGNydW1iVHJhaWwubGVuZ3RoID8gYnJlYWRjcnVtYlRyYWlsW2JyZWFkY3J1bWJUcmFpbC5sZW5ndGggLSAxXS5uYW1lIDogJycgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtbm93cmFwIGNxYS1nYXAtMyBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtcGItMlwiXG4gICAgICAgICAgICAgICAoc2Nyb2xsKT1cIm9uU3ViZm9sZGVyR3JpZFNjcm9sbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIHN1YmZvbGRlclRpbGVzXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtjcWFGb2xkZXJEcm9wXT1cImYuaWRcIlxuICAgICAgICAgICAgICBbZHJvcEVuYWJsZWRdPVwibW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcFwiXG4gICAgICAgICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwib25UZXN0c0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlclNlbGVjdGVkKGYuaWQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLXNocmluay0wIGNxYS13LVsyNDBweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtdGV4dC1sZWZ0IGNxYS1wLTMgY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy13aGl0ZSBob3ZlcjpjcWEtYm9yZGVyLVsjM0Y0M0VFXSBob3ZlcjpjcWEtc2hhZG93LXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uQ2hpcDsgY29udGV4dDogeyBjb2xvcjogZi5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBmLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1vZHVsYXJDb25maWcuc2hvd0NvdW50c1wiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IChmLmNvdW50ID8/IDApID09PSAxID8gbW9kdWxhckxhYmVscy50ZXN0c0NvdW50U2luZ3VsYXIgOiBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyAoZi5jb3VudCA/PyAwKSkgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LW5ldXRyYWwtNDAwIGNxYS1zaHJpbmstMFwiIHN0eWxlPVwiZm9udC1zaXplOjIwcHg7d2lkdGg6MjBweDtoZWlnaHQ6MjBweFwiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gXCIrIE5ldyBmb2xkZXJcIiB0aWxlIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIm1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyQ3JlYXRlUmVxdWVzdGVkKHsgcGFyZW50SWQ6IHNlbGVjdGVkRm9sZGVySWQgfSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtc2hyaW5rLTAgY3FhLXctWzI0MHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtdGV4dC1sZWZ0IGNxYS1wLTMgY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctWyNGQUZBRkFdIGhvdmVyOmNxYS1ib3JkZXItWyMzRjQzRUVdIGhvdmVyOmNxYS1iZy13aGl0ZSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvbkNoaXBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgbW9kdWxhckxhYmVscy5uZXdGb2xkZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTQwMFwiPnt7IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnMCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFN1YmZvbGRlciBmZXRjaCBpbmRpY2F0b3IuIFR3byBjYXNlczpcbiAgICAgICAgICAgICAgICAgLSBEcmlsbC1pbiBmZXRjaDogbm8gc3ViZm9sZGVyVGlsZXMgeWV0LCByZW5kZXIgYSBjZW50ZXJlZFxuICAgICAgICAgICAgICAgICAgIHJvdyBzcGlubmVyIHNvIHRoZSBzZWN0aW9uIGlzbid0IGVtcHR5IGR1cmluZyB0aGUgZmV0Y2guXG4gICAgICAgICAgICAgICAgIC0gUGFnaW5hdGlvbiBmZXRjaDogdGlsZXMgZXhpc3QsIGFuY2hvciBhIHNtYWxsIHNwaW5uZXIgYXRcbiAgICAgICAgICAgICAgICAgICB0aGUgcmlnaHQgZWRnZSBzbyB0aGUgdXNlciBrbm93cyB0aGUgbmV4dCBwYWdlIGlzIGxvYWRpbmcuIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRGb2xkZXJOb2RlPy5jaGlsZHJlbkxvYWRpbmdcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1zaHJpbmstMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy1bODBweF1cIlxuICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMb2FkaW5nIHN1YmZvbGRlcnMnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMjBcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDwhLS0gRm9sZGVyIHBhbmVsIGhlYWRlciBhYm92ZSB0aGUgdGFibGU6IFwiSG90ZWwgU2VhcmNoICgzKVwiICsgQ2xlYXIgZmlsdGVyIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmICFpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1Vub3JnYW5pemVkU2VjdGlvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtbWItMSBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXB4LTQgY3FhLXB5LTMgY3FhLXJvdW5kZWQtdC1sZyBjcWEtYmctaW5kaWdvLTUwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1pbmRpZ28tMTAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4NSAxMC40NTg1QzEyLjk1ODUgMTAuNzkgMTIuODI2OCAxMS4xMDggMTIuNTkyNCAxMS4zNDI0QzEyLjM1OCAxMS41NzY4IDEyLjA0IDExLjcwODUgMTEuNzA4NSAxMS43MDg1SDEuNzA4NUMxLjM3Njk4IDExLjcwODUgMS4wNTkwMyAxMS41NzY4IDAuODI0NjEzIDExLjM0MjRDMC41OTAxOTIgMTEuMTA4IDAuNDU4NDk2IDEwLjc5IDAuNDU4NDk2IDEwLjQ1ODVWMS43MDg1QzAuNDU4NDk2IDEuMzc2OTggMC41OTAxOTIgMS4wNTkwMyAwLjgyNDYxMyAwLjgyNDYxM0MxLjA1OTAzIDAuNTkwMTkyIDEuMzc2OTggMC40NTg0OTYgMS43MDg1IDAuNDU4NDk2SDQuODMzNUw2LjA4MzUgMi4zMzM1SDExLjcwODVDMTIuMDQgMi4zMzM1IDEyLjM1OCAyLjQ2NTE5IDEyLjU5MjQgMi42OTk2MUMxMi44MjY4IDIuOTM0MDMgMTIuOTU4NSAzLjI1MTk4IDEyLjk1ODUgMy41ODM1VjEwLjQ1ODVaXCIgW2F0dHIuc3Ryb2tlXT1cImN1cnJlbnRGb2xkZXJOb2RlPy5jb2xvciB8fCAnIzNGNDNFRSdcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1pbmRpZ28tNzAwXCI+XG4gICAgICAgICAgICAgIHt7IGN1cnJlbnRGb2xkZXJOb2RlPy5uYW1lIH19ICh7eyBjdXJyZW50Rm9sZGVyRGlyZWN0Q291bnQgfX0pXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1weC0zIGNxYS1weS0xIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1pbmRpZ28tNzAwIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItaW5kaWdvLTIwMCBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctaW5kaWdvLTUwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlclNlbGVjdGVkKG51bGwpXCJcbiAgICAgICAgICA+e3sgbW9kdWxhckxhYmVscy5jbGVhckZpbHRlciB9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFVub3JnYW5pemVkIHNlY3Rpb24gaGVhZGVyIGF0IHJvb3QgdmlldyAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1Vub3JnYW5pemVkU2VjdGlvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWItMiBjcWEtbXQtMlwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIwcHg7XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNkQ2RDc0XVwiIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmluYm94PC9tYXQtaWNvbj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzZENkQ3NF1cIj57eyBtb2R1bGFyTGFiZWxzLnVub3JnYW5pemVkIH19PC9oMz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPlxuICAgICAgICAgICAge3sgdW5vcmdhbml6ZWRDb3VudCA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgdW5vcmdhbml6ZWRDb3VudCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGFibGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcm91bmRlZC1bN3B4XSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWwgY3FhLWJvcmRlci1yIGNxYS1ib3JkZXItZ3JleS0yMDAgY3FhLXJlbGF0aXZlIGNxYS1vdmVyZmxvdy14LWF1dG9cIlxuICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cInBhZ2VkUm93cyAmJiBwYWdlZFJvd3MubGVuZ3RoID4gMCA/IG51bGwgOiAnYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50J1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNUYWJsZUxvYWRpbmcgfHwgaXNUYWJsZURhdGFMb2FkaW5nKSB8fCAoIWVmZmVjdGl2ZUlzRW1wdHlTdGF0ZSAmJiBwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDApOyBlbHNlIHN0b3J5RW1wdHlUcGxcIj5cbiAgICAgICAgICAgIDxhcHAtZHluYW1pYy10YWJsZVxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyLWJvdHRvbV09XCJwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDAgPyAnMXB4IHNvbGlkIHJnYigyMjYsIDIyNiwgMjI3KScgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29tcHV0ZWRDb2x1bW5zXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwicGFnZWRSb3dzXCJcbiAgICAgICAgICAgICAgW3Jvd1NlbGVjdGFibGVdPVwicm93U2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgIFtlbmFibGVMb2NhbFNvcnRdPVwiZW5hYmxlTG9jYWxTb3J0ICYmICFpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgICAgICBbaXNUYWJsZUxvYWRpbmddPVwiaXNUYWJsZUxvYWRpbmdcIlxuICAgICAgICAgICAgICBbaXNUYWJsZURhdGFMb2FkaW5nXT1cImlzVGFibGVEYXRhTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtjZWxsSnNvblBhdGhHZXR0ZXJdPVwiY2VsbEpzb25QYXRoR2V0dGVyXCJcbiAgICAgICAgICAgICAgW29uSnNvblBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2VuYWJsZVJvd1Jlb3JkZXJdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICAgICAgKHJvd1Jlb3JkZXIpPVwib25Sb3dSZW9yZGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAoc29ydENoYW5nZSk9XCJzb3J0Q2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5VGFibGVUcGw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktOFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2lsbHVzdHJhdGlvbnMvZW1wdHktc3RhdGUuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiY3FhLXctMzIgY3FhLWgtMzIgY3FhLW1iLTRcIiAvPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLW1iLTJcIj5ObyB0ZXN0IGNhc2VzPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLW1iLTRcIj5UcnkgYWRqdXN0aW5nIGZpbHRlcnMgb3IgY3JlYXRlIGEgbmV3IHRlc3QgY2FzZS48L3A+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgKGNsaWNrZWQpPVwidG9nZ2xlRmlsdGVyKClcIj5TaG93IEZpbHRlcnM8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2FwcC1keW5hbWljLXRhYmxlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzdG9yeUVtcHR5VHBsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTYgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxjcWEtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZUlzRW1wdHlTdGF0ZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcudGl0bGVcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbnNdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5hY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25FbXB0eUFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2NxYS1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtcGFnaW5hdGlvblxuICAgICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInNlcnZlclNpZGVQYWdpbmF0aW9uID8gdG90YWxFbGVtZW50cyA6IGZpbHRlcmVkUm93cy5sZW5ndGhcIlxuICAgICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgICBbcGFnZVNpemVNZW51RGlyZWN0aW9uXT1cInBhZ2VTaXplTWVudURpcmVjdGlvblwiXG4gICAgICAgICAgW3BhZ2VJdGVtQ291bnRdPVwicGFnZWRSb3dzLmxlbmd0aFwiXG4gICAgICAgICAgKHBhZ2luYXRlKT1cIm9uUGFnaW5hdGUoJGV2ZW50KVwiXG4gICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgPC9jcWEtcGFnaW5hdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZXVzZWQgYnVsayBhY3Rpb24gdG9vbGJhciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYW55Um93U2VsZWN0ZWQgJiYgbW9kdWxhckNvbmZpZy5hbGxvd0J1bGtTZWxlY3Rpb24gJiYgIWlzUmVvcmRlcmluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1ib3R0b20tWzE4Ljc1cHhdIGNxYS1sZWZ0LVs1MCVdIGNxYS10cmFuc2xhdGUteC1bLTUwJV0gY3FhLXctZnVsbCBsZzpjcWEtbWF4LXctWzY4JV0gY3FhLXNtOm1heC13LVs3NSVdIGNxYS1tYXgtdy1bOTAlXSBjcWEtei1bMV1cIj5cbiAgICAgIDxjcWEtdGFibGUtYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwic2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgPyBzZWxlY3RlZEl0ZW1zIDogY3VycmVudFNlbGVjdGVkSXRlbXNcIlxuICAgICAgICBbYWN0aW9uc109XCJlZmZlY3RpdmVCdWxrQWN0aW9uc1wiXG4gICAgICAgIFtzaG93U2VsZWN0QWxsXT1cInNob3dTZWxlY3RBbGxJblRvb2xiYXJcIlxuICAgICAgICBbYWxsU2VsZWN0ZWRdPVwiYWxsU2VsZWN0ZWRJblRvb2xiYXJcIlxuICAgICAgICBbc2hvd0Rpc21pc3NdPVwic2hvd0Rpc21pc3NJblRvb2xiYXJcIlxuICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25CdWxrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAoc2VsZWN0QWxsQ2hhbmdlKT1cIm9uQnVsa1NlbGVjdEFsbCgkZXZlbnQpXCJcbiAgICAgICAgKGRpc21pc3MpPVwib25CdWxrRGlzbWlzcygpXCJcbiAgICAgID48L2NxYS10YWJsZS1hY3Rpb24tdG9vbGJhcj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|
|
1763
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxhci10YWJsZS10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBS1osdUJBQXVCLEVBR3ZCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFLbEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQWlCdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3ZGLE1BQU0sT0FBTyw2QkFBNkI7SUF5WXhDLFlBQW9CLEdBQXNCLEVBQVUsYUFBNEI7UUFBNUQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXhZaEYsb0JBQW9CO1FBQ1gsc0JBQWlCLEdBQVcsbUJBQW1CLENBQUM7UUFDaEQsZ0JBQVcsR0FBVyxFQUFFLENB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QkFBdEIsTUFBTTtnQkFFRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFPRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFRRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLDhCQUE4QjtzQkFBdkMsTUFBTTtnQkFDRyw4QkFBOEI7c0JBQXZDLE1BQU07Z0JBZ0JFLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBa0JHLGFBQWE7c0JBQXRCLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQVFHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFPRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFNRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBTUcsUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDNEIsc0JBQXNCO3NCQUF4RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFtR3BCLGdCQUFnQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0ZpbHRlckl0ZW0sIER5bmFtaWNGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9maWx0ZXJzL2R5bmFtaWMtZmlsdGVyL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi90YWJsZS9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENvbHVtblZpc2liaWxpdHlDb25maWcgfSBmcm9tICcuLi8uLi9jb2x1bW4tdmlzaWJpbGl0eS9jb2x1bW4tdmlzaWJpbGl0eS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb24gfSBmcm9tICcuLi8uLi90YWJsZS1hY3Rpb24tdG9vbGJhci90YWJsZS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbmZpZyB9IGZyb20gJy4uLy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRU1QVFlfU1RBVEVfSU1BR0VTIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2ltYWdlcy9pbWFnZS1hc3NldHMuY29uc3RhbnRzJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0NPTkZJRyxcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgREVGQVVMVF9SRU9SREVSX0xBQkVMUyxcbiAgRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgRm9sZGVyQ3JlYXRlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVN0cmF0ZWd5LFxuICBGb2xkZXJEZWxldGVkUGF5bG9hZCxcbiAgRm9sZGVySWRBY2Nlc3NvcixcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkLFxuICBGb2xkZXJNb3ZlZFBheWxvYWQsXG4gIEZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIE1vZHVsYXJDb25maWcsXG4gIE1vZHVsYXJMYWJlbHMsXG4gIFJlb3JkZXJMYWJlbHMsXG4gIFJlb3JkZXJTYXZlUGF5bG9hZCxcbiAgVGVzdHNNb3ZlZFBheWxvYWQsXG4gIEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZCxcbn0gZnJvbSAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5pbXBvcnQgeyBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbmV3LWZvbGRlci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZUZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9kZWxldGUtZm9sZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW9kdWxhci10YWJsZS10ZW1wbGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvLyBTZWFyY2ggYmFyIGlucHV0c1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBjb21wb25lbnRzJztcbiAgQElucHV0KCkgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0V4cG9ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBTZWFyY2ggYmFyIG91dHB1dHNcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBvbkV4cG9ydENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrPzogJ1dFQkRSSVZFUl9JTycgfCAnU0VMRU5JVU1fSkFWQSc7IHNlbGVjdGVkSXRlbXM6IGFueVtdIH0gfCB2b2lkPigpO1xuICAvLyBGaWx0ZXIgb3V0cHV0c1xuICBAT3V0cHV0KCkgb25BcHBseUZpbHRlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblJlc2V0RmlsdGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvbkNsZWFyQWxsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlQ2hpcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIEZpbHRlciBpbnB1dHNcbiAgQElucHV0KCkgZmlsdGVyQ29uZmlnOiBEeW5hbWljRmlsdGVySXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGZpbHRlck1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBPdGhlciBidXR0b25zIGlucHV0IChhcnJheSBvZiBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBPdGhlciBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBkcm9wZG93biBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyRHJvcERvd25CdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIE90aGVyIHNlbGVjdCBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBzZWxlY3QgZHJvcGRvd24gYnV0dG9uIHRlbXBsYXRlcy9jb21wb25lbnRzKVxuICBASW5wdXQoKSBvdGhlclNlbGVjdERyb3BEb3duQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBMZWdhY3kgc2luZ2xlIGJ1dHRvbiBpbnB1dHMgKGRlcHJlY2F0ZWQsIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25MYWJlbDogc3RyaW5nID0gJ090aGVyIEJ1dHRvbic7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25WYXJpYW50OiAnZmlsbGVkJyB8ICdvdXRsaW5lZCcgfCAndGV4dCcgfCAnZWxldmF0ZWQnIHwgJ3RvbmFsJyB8ICdncmV5LXNvbGlkJyA9ICdmaWxsZWQnO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIG90aGVyQnV0dG9ucyBhcnJheSBpbnN0ZWFkICovXG4gIEBJbnB1dCgpIHNob3dPdGhlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBBY3Rpb24gbWVudSBidXR0b24gKHRocmVlLWRvdCBtZW51IGluIHRhYmxlIHJvd3MpXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFNldHRpbmdzIGFuZCByZWZyZXNoIGJ1dHRvbnNcbiAgQElucHV0KCkgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0F1dG9SZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBWaWV3LW1vZGUgdG9nZ2xlIChMaXN0IHwgTW9kdWxhcikuIEhpZGRlbiBieSBkZWZhdWx0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICBASW5wdXQoKSBzaG93Vmlld01vZGVUb2dnbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdmlld01vZGU6ICdsaXN0JyB8ICdtb2R1bGFyJyA9ICdsaXN0JztcbiAgQElucHV0KCkgdmlld01vZGVMYWJlbHM6IHsgbGlzdDogc3RyaW5nOyBtb2R1bGFyOiBzdHJpbmcgfSA9IHsgbGlzdDogJ0xpc3QnLCBtb2R1bGFyOiAnTW9kdWxhcicgfTtcbiAgQE91dHB1dCgpIHZpZXdNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnbGlzdCcgfCAnbW9kdWxhcic+KCk7XG5cbiAgZ2V0IHZpZXdNb2RlU2VnbWVudHMoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5saXN0LCB2YWx1ZTogJ2xpc3QnLCBpY29uOiAndmlld19saXN0JyB9LFxuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5tb2R1bGFyLCB2YWx1ZTogJ21vZHVsYXInLCBpY29uOiAnZm9sZGVyJyB9LFxuICAgIF07XG4gIH1cblxuICBvblZpZXdNb2RlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPT09ICdtb2R1bGFyJyA/ICdtb2R1bGFyJyA6ICdsaXN0JztcbiAgICBpZiAobmV4dCAhPT0gdGhpcy52aWV3TW9kZSkge1xuICAgICAgdGhpcy52aWV3TW9kZSA9IG5leHQ7XG4gICAgICB0aGlzLnZpZXdNb2RlQ2hhbmdlLmVtaXQobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGF0YSBpbnB1dFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuXG4gIC8vIEVtcHR5IHN0YXRlIGlucHV0c1xuICBASW5wdXQoKSBpc0VtcHR5U3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZUNvbmZpZzogRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICB0aXRsZTogJ05vIERhdGEgQXZhaWxhYmxlIFlldCcsXG4gICAgZGVzY3JpcHRpb246ICdSdW4gb3IgdXBsb2FkIHlvdXIgZmlyc3QgdGVzdCB0byBzZWUgeW91ciBhbmFseXRpY3MgYW5kIHRyZW5kcyBoZXJlLiBXYXRjaCB5b3VyIHF1YWxpdHkgbWV0cmljcyBjb21lIHRvIGxpZmUgd2l0aCByZWFsLXRpbWUgaW5zaWdodHMuJyxcbiAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLkRBU0hCT0FSRCxcbiAgICBhY3Rpb25zOiBbeyBsYWJlbDogJ1J1biBUZXN0IFN1aXRlJywgdmFyaWFudDogJ2ZpbGxlZCcgfV0sXG4gIH07XG5cbiAgLy8gQWN0aW9uIGJhciBpbnB1dHNcbiAgQElucHV0KCkgYWN0aW9uczogVGFibGVBY3Rpb25bXSA9IFtcbiAgICB7IFxuICAgICAgaWQ6ICdkZWxldGUnLCBcbiAgICAgIGxhYmVsOiAnRGVsZXRlJywgXG4gICAgICBpY29uOiAnZGVsZXRlJywgXG4gICAgICB0b29sdGlwOiAnRGVsZXRlIHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdlZGl0JywgXG4gICAgICBsYWJlbDogJ0VkaXQnLCBcbiAgICAgIGljb246ICdlZGl0JywgXG4gICAgICB0b29sdGlwOiAnRWRpdCBzZWxlY3RlZCcsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnRWRpdCBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2FkZC10YWcnLCBcbiAgICAgIGxhYmVsOiAnQWRkIFRhZycsIFxuICAgICAgaWNvbjogJ2xvY2FsX29mZmVyJywgXG4gICAgICB0b29sdGlwOiAnQWRkIHRhZ3MnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FkZCB0YWcgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdyZW1vdmUtdGFnJywgXG4gICAgICBsYWJlbDogJ1JlbW92ZSBUYWcnLCBcbiAgICAgIGljb246ICdsYWJlbF9vZmYnLCBcbiAgICAgIHRvb2x0aXA6ICdSZW1vdmUgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICBdO1xuXG4gIC8vIENoaXBzIGlucHV0c1xuICBASW5wdXQoKSBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICBASW5wdXQoKSBmaWx0ZXJBcHBsaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gVGFibGUgaW5wdXRzXG4gIEBJbnB1dCgpIGNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHJvd1NlbGVjdGFibGU/OiAocm93OiBhbnkpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgcGFnZUluZGV4OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbMTAsIDIwLCA0MCwgNjAsIDgwXTtcbiAgQElucHV0KCkgcGFnZVNpemVNZW51RGlyZWN0aW9uOiAnYXV0bycgfCAndXAnIHwgJ2Rvd24nID0gJ2F1dG8nO1xuICAvLyBTZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIGNvbnRyb2xzXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRvdGFsRWxlbWVudHM6IG51bWJlciA9IDA7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0+KCk7XG4gIC8qKlxuICAgKiBXaGVuIGZhbHNlLCBoZWFkZXIgc29ydCBkb2VzIG5vdCByZW9yZGVyIHJvd3MgbG9jYWxseSAodXNlIHdpdGggc2VydmVyU2lkZVBhZ2luYXRpb24gKyBzb3J0Q2hhbmdlKS5cbiAgICogRGVmYXVsdCB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlTG9jYWxTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBmaWVsZElkOiBzdHJpbmc7XG4gICAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbDtcbiAgfT4oKTtcbiAgLy8gTG9hZGVyIGNvbnRyb2xzIChwYXNzZWQgZG93biB0byBkeW5hbWljIHRhYmxlKVxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEJhY2t3YXJkLWNvbXBhdGliaWxpdHkgZmxhZzsgaWYgcHJvdmlkZWQsIGR5bmFtaWMgdGFibGUgd2lsbCB1c2UgaXQgd2hlbiBzcGVjaWZpYyBmbGFncyBhcmUgdW5kZWZpbmVkXG5cbiAgLy8gT3B0aW9uYWwgZ2V0dGVyIGZvciBKU09OIHBhdGggcGVyIGNlbGwuIFdoZW4gcHJvdmlkZWQsIGRvdWJsZS1jbGlja2luZyBhIGNlbGwgY29waWVzIHRoZSBwYXRoLlxuICBASW5wdXQoKSBjZWxsSnNvblBhdGhHZXR0ZXI/OiAocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZywgcm93OiBhbnkpID0+IHN0cmluZztcblxuICAvLyBPcHRpb25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIGEgSlNPTiBwYXRoIGlzIGNvcGllZCBmcm9tIGEgdGFibGUgY2VsbFxuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogc3RyaW5nIH0pID0+IHZvaWQ7XG5cbiAgLy8gU2VsZWN0ZWQgaXRlbXMgKGZ1bGwgb2JqZWN0cykgZm9yIG1haW50YWluaW5nIHNlbGVjdGlvbiBhY3Jvc3MgcGFnaW5hdGlvbiAoc2VydmVyLXNpZGUpXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIFwiU2VsZWN0IGFsbFwiIGFmZm9yZGFuY2UuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqIGZvciBub3cg4oCUIGhvc3Qgb3B0cyBpbi4gTWF0Y2hlcyB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50IHRvIGhpZGUgU2VsZWN0IEFsbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dTZWxlY3RBbGxJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIGRpc21pc3MgKMOXKSBhZmZvcmRhbmNlLiBEZWZhdWx0cyB0byBmYWxzZVxuICAgKiBmb3Igbm93IOKAlCBob3N0IG9wdHMgaW4uIE1hdGNoZXMgdGhlIGN1cnJlbnQgcHJvZHVjdCByZXF1aXJlbWVudCB0byBoaWRlIENhbmNlbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dEaXNtaXNzSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBCb3VuZCB0byB0aGUgdG9vbGJhcidzIFwiU2VsZWN0IGFsbFwiIGNoZWNrYm94IOKAlCBkcml2ZXMgdGhlIGNoZWNrZWQgc3RhdGUuICovXG4gIEBJbnB1dCgpIGFsbFNlbGVjdGVkSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIGNvbHVtbiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgX2NvbHVtblZpc2liaWxpdHk6IENvbHVtblZpc2liaWxpdHlDb25maWcgPSB7fTtcbiAgcHJpdmF0ZSBfY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICBmaWx0ZXJlZFJvd3M6IGFueVtdID0gW107XG4gIHBhZ2VkUm93czogYW55W10gPSBbXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaW5wdXRzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgQElucHV0KCkgZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIC8qKiBIb3N0LXByb3ZpZGVkIHNuYXBzaG90IG9mIHJvb3QtbGV2ZWwgZm9sZGVycyBmb3IgdGhlIFwiT3JnYW5pemVkXCIgZ3JpZC5cbiAgICogIFdoZW4gc2V0LCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYHRoaXMuZm9sZGVyc2AgZm9yIGByb290Rm9sZGVyVGlsZXNgIHNvXG4gICAqICB0aGUgT3JnYW5pemVkIHNlY3Rpb24gc3RheXMgc3RhYmxlIHdoaWxlIHNpZGViYXIgc2VhcmNoIHN3YXBzIGBmb2xkZXJzYFxuICAgKiAgdG8gYSBmaWx0ZXJlZCByZXN1bHQgc2V0LiBNaXJyb3JzIHRoZSBob3N0LWRyaXZlbiBmYWxsYmFjayBwYXR0ZXJuIHVzZWRcbiAgICogIGJ5IGBzZWxlY3RlZEZvbGRlck5vZGVgIChzdWJmb2xkZXJzKSBhbmQgYHNlbGVjdGVkRm9sZGVyVHJhaWxgIChicmVhZGNydW1iKS4gKi9cbiAgQElucHV0KCkgcm9vdEZvbGRlcnM6IEZvbGRlck5vZGVbXSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZWxlY3RlZEZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZXhwYW5kZWRGb2xkZXJJZHM6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIHVub3JnYW5pemVkQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGZvbGRlcklkQWNjZXNzb3I6IEZvbGRlcklkQWNjZXNzb3IgPSAocm93OiBhbnkpID0+IHJvdz8uZm9sZGVySWQgPz8gbnVsbDtcbiAgQElucHV0KCkgbW9kdWxhckNvbmZpZzogTW9kdWxhckNvbmZpZyA9IHsgLi4uREVGQVVMVF9NT0RVTEFSX0NPTkZJRyB9O1xuICBASW5wdXQoKSBtb2R1bGFyTGFiZWxzOiBNb2R1bGFyTGFiZWxzID0geyAuLi5ERUZBVUxUX01PRFVMQVJfTEFCRUxTIH07XG4gIEBJbnB1dCgpIGJ1bGtBY3Rpb25zOiBUYWJsZUFjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIHNpZGViYXJDb2xsYXBzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIFwiU3ViZm9sZGVycyBpbiB7cGFyZW50fVwiIHNlY3Rpb24gaXMgZXhwYW5kZWQuXG4gICAqICBUd28td2F5IGJpbmRhYmxlIGFzIGBbKHN1YmZvbGRlclNlY3Rpb25FeHBhbmRlZCldYC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgQElucHV0KCkgc3ViZm9sZGVyU2VjdGlvbkV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHJvb3QtdmlldyBcIk9yZ2FuaXplZFwiIGZvbGRlciBncmlkIGlzIGV4cGFuZGVkLlxuICAgKiAgVHdvLXdheSBiaW5kYWJsZSBhcyBgWyhvcmdhbml6ZWRTZWN0aW9uRXhwYW5kZWQpXWAuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIEBJbnB1dCgpIG9yZ2FuaXplZFNlY3Rpb25FeHBhbmRlZDogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBMYXp5LWxvYWQ6IHdoZW4gdHJ1ZSwgdGhlIHNpZGViYXIgZW1pdHMgYHNlYXJjaENoYW5nZWAgYW5kIHNraXBzIGl0c1xuICAgKiAgbG9jYWwgbmFtZSBmaWx0ZXIgc28gdGhlIGhvc3QgY2FuIHNlcnZlIHNlYXJjaCByZXN1bHRzIGZyb20gdGhlIGJhY2tlbmQuICovXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIExhenktbG9hZDogYmFja2VuZC1yZXBvcnRlZCB0b3RhbCByb290IGZvbGRlcnMuIERyaXZlcyB0aGUgc2lkZWJhcidzXG4gICAqICB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIiBhZmZvcmRhbmNlIHdoZW4gYGZvbGRlcnMubGVuZ3RoIDwgcm9vdFRvdGFsYC4gKi9cbiAgQElucHV0KCkgcm9vdFRvdGFsOiBudW1iZXIgPSAwO1xuICAvKiogTGF6eS1sb2FkOiB0cnVlIHdoaWxlIHRoZSBob3N0IGlzIGZldGNoaW5nIHNlcnZlci1zaWRlIGZvbGRlci1zZWFyY2hcbiAgICogIHJlc3VsdHMuIEZvcndhcmRlZCB0byB0aGUgc2lkZWJhciBzbyBpdCBjYW4gcmVuZGVyIGEgc2VhcmNoIHNwaW5uZXIuICovXG4gIEBJbnB1dCgpIGZvbGRlclNlYXJjaExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNlZWRlZCB2YWx1ZSBmb3IgdGhlIHNpZGViYXIncyBzZWFyY2ggaW5wdXQuIEV4cG9zZWQgc28gaG9zdHMgY2FuIHJlc3RvcmVcbiAgICogIGFuIGluLWZsaWdodCBmb2xkZXItc2VhcmNoIGFjcm9zcyBzaWRlYmFyIGRlc3Ryb3kvcmUtY3JlYXRlIGN5Y2xlcyAoZS5nLixcbiAgICogIHRvZ2dsaW5nIG91dCBvZiBhbmQgYmFjayBpbnRvIG1vZHVsYXIgdmlldykuICovXG4gIEBJbnB1dCgpIGZvbGRlclNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgLyoqIExhenktbG9hZDogdHJ1ZSB3aGlsZSBhIHJvb3QtcGFnZSBmZXRjaCBpcyBpbiBmbGlnaHQgKGluaXRpYWwgbG9hZCBPUlxuICAgKiAgdGhlIHNjcm9sbC1kcml2ZW4gXCJsb2FkIG1vcmVcIiBwYWdpbmF0aW9uKS4gRHJpdmVzIHRoZSBsb2FkaW5nIGluZGljYXRvclxuICAgKiAgdGhlIG1vZHVsYXIgZ3JpZCByZW5kZXJzIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBPcmdhbml6ZWQgcm93LCBhbmQgaXNcbiAgICogIGZvcndhcmRlZCB0byB0aGUgc2lkZWJhciBmb3IgaXRzIG93biBsb2FkaW5nIGFmZm9yZGFuY2UuICovXG4gIEBJbnB1dCgpIHJvb3RGb2xkZXJzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRm9sZGVyIGlkcyB3aG9zZSBob3N0LXNpZGUgc2F2ZSAocmVuYW1lIC8gbW92ZSAvIGV0Yy4pIGlzIGluIGZsaWdodC5cbiAgICogIEZvcndhcmRlZCB0byB0aGUgc2lkZWJhciBmb3IgbG9hZGluZyBzdGF0ZS4gKi9cbiAgQElucHV0KCkgc2F2aW5nRm9sZGVySWRzOiBBcnJheTxudW1iZXI+ID0gW107XG4gIC8qKiBPdmVycmlkZSBmb3IgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgbm9kZS4gVXNlZCBhcyBhIGZhbGxiYWNrIHdoZW5cbiAgICogIGBmaW5kRm9sZGVyKGZvbGRlcnMsIHNlbGVjdGVkRm9sZGVySWQpYCBtaXNzZXMg4oCUIGUuZy4sIGR1cmluZyBzaWRlYmFyXG4gICAqICBzZWFyY2ggd2hlbiBgZm9sZGVyc2AgaG9sZHMgb25seSB0aGUgbWF0Y2hlZCByZXN1bHRzLCB0aGUgc2VsZWN0ZWRcbiAgICogIGZvbGRlciBtYXkgbm90IGJlIGFtb25nIHRoZW0sIGJ1dCBpdHMgYnJlYWRjcnVtYiAvIGhlYWRlciBsYWJlbCBzdGlsbFxuICAgKiAgbmVlZHMgdG8gcmVuZGVyLiBUaGUgaG9zdCBvd25zIHRoZSBsb29rdXAgYWdhaW5zdCBpdHMgZnVsbCBmb2xkZXIgbWFwLiAqL1xuICBASW5wdXQoKSBzZWxlY3RlZEZvbGRlck5vZGU6IEZvbGRlck5vZGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIEhvc3QtcHJvdmlkZWQgYnJlYWRjcnVtYiBzbmFwc2hvdCBmb3IgdGhlIHNlbGVjdGVkIGZvbGRlci4gVXNlZCBhcyBhXG4gICAqICBmYWxsYmFjayBpbiBgYnJlYWRjcnVtYlRyYWlsYCB3aGVuIGBidWlsZFRyYWlsYCBhZ2FpbnN0IGB0aGlzLmZvbGRlcnNgXG4gICAqICB5aWVsZHMgZW1wdHkg4oCUIHRoZSBjYW5vbmljYWwgY2FzZSBpcyBzaWRlYmFyIHNlYXJjaCwgd2hlcmUgYGZvbGRlcnNgXG4gICAqICBpcyB0aGUgc2VhcmNoLXJlc3VsdHMgbGlzdCBhbmQgdGhlIHNlbGVjdGVkIGZvbGRlcidzIGFuY2VzdG9ycyBhcmVuJ3RcbiAgICogIHByZXNlbnQuIFRoZSBob3N0IHdhbGtzIGBwYXJlbnRJZGAgY2hhaW5zIHRvIGJ1aWxkIHRoaXM7IHBhcnRpYWwgdHJhaWxzXG4gICAqICBhcmUgYWNjZXB0YWJsZSB3aGVuIGFuY2VzdG9ycyBoYXZlbid0IGJlZW4gZmV0Y2hlZCB5ZXQuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVyVHJhaWw6IEZvbGRlck5vZGVbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCB0aGUgbGlicmFyeSBvcGVucyBpdHMgb3duIE1vdmUgZGlhbG9nIGZvciBjb252ZW5pZW5jZVxuICAgKiBkdXJpbmcgdGVzdGluZy4gSG9zdHMgdGFraW5nIG92ZXIgQVBJICsgVVggc2hvdWxkIHNldCB0aGlzIHRvIGBmYWxzZWAgYW5kXG4gICAqIGxpc3RlbiBvbiBgbW92ZVJlcXVlc3RlZGAgdG8gcmVuZGVyIHRoZWlyIG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHVzZUludGVybmFsRGlhbG9nczogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGb2xkZXIgLyBtb2R1bGFyIG91dHB1dHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBAT3V0cHV0KCkgZm9sZGVyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJFeHBhbnNpb25Ub2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0+KCk7XG4gIC8qKiBMYXp5LWxvYWQ6IHJlLWVtaXR0ZWQgZnJvbSB0aGUgc2lkZWJhciB3aGVuIHRoZSB1c2VyIGV4cGFuZHMgYSBub2RlIHdob3NlXG4gICAqICBjaGlsZHJlbiBoYXZlbid0IGJlZW4gZmV0Y2hlZCB5ZXQuIEhvc3QgcmVzcG9uZHMgYnkgZmV0Y2hpbmcgdGhhdCBzdWJ0cmVlLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ2hpbGRyZW5SZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgLyoqIExhenktbG9hZDogcmUtZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgcGVyLWZvbGRlciBcIkxvYWQgbW9yZVwiLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgbmV4dFBhZ2U6IG51bWJlciB9PigpO1xuICAvKiogTGF6eS1sb2FkOiByZS1lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIi4gKi9cbiAgQE91dHB1dCgpIHJvb3RMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIExhenktbG9hZDogZGVib3VuY2VkIHNpZGViYXItc2VhcmNoIHRlcm0uIENvbnN1bWVkIGJ5IGhvc3RzIHRoYXQgaGF2ZVxuICAgKiAgc2V0IGBzZXJ2ZXJTaWRlU2VhcmNoPXRydWVgIHRvIHJlZmV0Y2ggdGhlIHRyZWUgZnJvbSB0aGUgYmFja2VuZC4gKi9cbiAgQE91dHB1dCgpIGZvbGRlclNlYXJjaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyQ3JlYXRlZFBheWxvYWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiKyBOZXcgZm9sZGVyXCI7IGhvc3Qgc2hvdWxkIG9wZW4gYSBjcmVhdGlvbiBtb2RhbC4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckNyZWF0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICBAT3V0cHV0KCkgZm9sZGVyUmVuYW1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyUmVuYW1lZFBheWxvYWQ+KCk7XG4gIC8qKlxuICAgKiBGaXJlcyBhZnRlciB0aGUgdXNlciBjb25maXJtcyBmb2xkZXIgZGVsZXRpb24gdmlhIHRoZSBpbnRlcm5hbCBkaWFsb2cgKG9yXG4gICAqIGltbWVkaWF0ZWx5LCB3aGVuIGB1c2VJbnRlcm5hbERpYWxvZ3NgIGlzIGZhbHNlIGFuZCB0aGUgaG9zdCBkcml2ZXMgdGhlIFVYKS5cbiAgICogUGF5bG9hZCBub3cgaW5jbHVkZXMgdGhlIHVzZXIncyBjaG9zZW4gYHN0cmF0ZWd5YCBmb3Igd2hhdCBoYXBwZW5zIHRvIHRoZVxuICAgKiBmb2xkZXIncyB0ZXN0IGNhc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvbGRlckRlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckRlbGV0ZWRQYXlsb2FkPigpO1xuICBAT3V0cHV0KCkgdGVzdHNNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdHNNb3ZlZFBheWxvYWQ+KCk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEJ1bGsgYWN0aW9uIHRvb2xiYXIgc3VyZmFjZSDigJQgbmFtaW5nIG1pcnJvcnMgY3FhLXRhYmxlLXRlbXBsYXRlIHNvIGNvbnN1bWVyc1xuICAvLyBnZXQgdGhlIHNhbWUgZXZlbnRzIGZyb20gZWl0aGVyIGNvbXBvbmVudCAocGx1cyB0aGUgZm9sZGVyIGV2ZW50cyBiZWxvdykuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBGaXJlcyBvbiByYXcgdG9vbGJhciBhY3Rpb24gY2xpY2sg4oCUICpiZWZvcmUqIGFueSBpbnRlcm5hbCBkaWFsb2cgb3BlbnMuICovXG4gIEBPdXRwdXQoKSBidWxrQWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZzsgc2VsZWN0ZWQ6IGFueVtdIH0+KCk7XG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB0b29sYmFyJ3MgXCJTZWxlY3QgYWxsXCIgaXMgdG9nZ2xlZC4gKi9cbiAgQE91dHB1dCgpIGJ1bGtTZWxlY3RBbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB0b29sYmFyJ3MgZGlzbWlzcyAow5cpIGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBidWxrRGlzbWlzcyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgKmFmdGVyKiB0aGUgbGlicmFyeS1pbnRlcm5hbCBtb3ZlLXRvLWZvbGRlciBkaWFsb2cgcmVzb2x2ZXMgd2l0aCBhXG4gICAqIHVzZXIgY29uZmlybWF0aW9uLCBPUiBpbW1lZGlhdGVseSBmb3Igbm9uLWRpYWxvZyBidWxrIGFjdGlvbnMgc3VwcGxpZWQgYnlcbiAgICogdGhlIGhvc3QuIEhvc3RzIHdpdGggdGhlaXIgb3duIFVYIHNob3VsZCBsaXN0ZW4gb24gYGJ1bGtBY3Rpb25DbGlja2AgK1xuICAgKiBgbW92ZVJlcXVlc3RlZGAgYW5kIHRyZWF0IHRoaXMgYXMgdGhlIFwiY29uZmlybWVkXCIgc2lnbmFsLlxuICAgKi9cbiAgQE91dHB1dCgpIGJ1bGtBY3Rpb25JbnZva2VkID0gbmV3IEV2ZW50RW1pdHRlcjxCdWxrQWN0aW9uSW52b2tlZFBheWxvYWQ+KCk7XG5cbiAgQE91dHB1dCgpIHNpZGViYXJDb2xsYXBzZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzdWJmb2xkZXJTZWN0aW9uRXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvcmdhbml6ZWRTZWN0aW9uRXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgdG9nZ2xlU3ViZm9sZGVyU2VjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnN1YmZvbGRlclNlY3Rpb25FeHBhbmRlZCA9ICF0aGlzLnN1YmZvbGRlclNlY3Rpb25FeHBhbmRlZDtcbiAgICB0aGlzLnN1YmZvbGRlclNlY3Rpb25FeHBhbmRlZENoYW5nZS5lbWl0KHRoaXMuc3ViZm9sZGVyU2VjdGlvbkV4cGFuZGVkKTtcbiAgfVxuXG4gIHRvZ2dsZU9yZ2FuaXplZFNlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5vcmdhbml6ZWRTZWN0aW9uRXhwYW5kZWQgPSAhdGhpcy5vcmdhbml6ZWRTZWN0aW9uRXhwYW5kZWQ7XG4gICAgdGhpcy5vcmdhbml6ZWRTZWN0aW9uRXhwYW5kZWRDaGFuZ2UuZW1pdCh0aGlzLm9yZ2FuaXplZFNlY3Rpb25FeHBhbmRlZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIHN1cmZhY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogV2hlbiB0cnVlLCByZW5kZXJzIGEgXCJSZW9yZGVyXCIgYnV0dG9uIGluIHRoZSB0b29sYmFyLiBIb3N0LWRyaXZlbi4gKi9cbiAgQElucHV0KCkgc2hvd1Jlb3JkZXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEhvc3QgZmxpcHMgdGhpcyB0cnVlIHdoaWxlIGl0cyBidWxrLXVwZGF0ZSBBUEkgY2FsbCBpcyBpbi1mbGlnaHQuIFRoZVxuICAgKiBjb21wb25lbnQga2VlcHMgdGhlIHJlb3JkZXIgVUkgcGlubmVkIChcIlNhdmluZy4uLlwiKSB3aGlsZSB0cnVlIGFuZCBleGl0c1xuICAgKiByZW9yZGVyIG1vZGUgd2hlbiBpdCBmbGlwcyBiYWNrIHRvIGZhbHNlICh0aGUgXCJmdXR1cmUgQVBJIGNhbGxcIiBob29rKS5cbiAgICovXG4gIEBJbnB1dCgpIHJlb3JkZXJTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFBhcnRpYWwgb3ZlcnJpZGUgZm9yIHRoZSBkZWZhdWx0IHJlb3JkZXIgbGFiZWxzIChcIlJlb3JkZXJcIiwgXCJEb25lXCIsIGV0Yy4pLiAqL1xuICBASW5wdXQoKSBzZXQgcmVvcmRlckxhYmVscyhwYXJ0aWFsOiBQYXJ0aWFsPFJlb3JkZXJMYWJlbHM+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+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTEwIGNxYS1oLTEwIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXRleHQtWyM2RDZENzRdIGNxYS1mbGV4LXNocmluay0wIGdyb3VwLWhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBbYXR0ci5zdHJva2VdPVwiY29sb3IgfHwgJ2N1cnJlbnRDb2xvcidcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBSZXVzYWJsZSBpbmRldGVybWluYXRlIGxvYWRpbmcgc3Bpbm5lci4gUmVuZGVyIHZpYVxuICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1NwaW5uZXI7IGNvbnRleHQ6IHsgc2l6ZTogMjAgfVwiPjwvbmctY29udGFpbmVyPi4gLS0+XG48bmctdGVtcGxhdGUgI2xvYWRpbmdTcGlubmVyIGxldC1zaXplPVwic2l6ZVwiPlxuICA8c3ZnIFthdHRyLndpZHRoXT1cInNpemUgfHwgMjBcIiBbYXR0ci5oZWlnaHRdPVwic2l6ZSB8fCAyMFwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIiBhcmlhLWxhYmVsPVwibG9hZGluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICA8Y2lyY2xlIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgc3Ryb2tlPVwiI0U1RTdFQlwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiPjwvY2lyY2xlPlxuICAgIDxwYXRoIGQ9XCJNNDUgMjVhMjAgMjAgMCAwIDAtMjAtMjBcIiBzdHJva2U9XCIjNEY0NkU1XCIgc3Ryb2tlLXdpZHRoPVwiNlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxuICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiBmcm9tPVwiMCAyNSAyNVwiIHRvPVwiMzYwIDI1IDI1XCIgZHVyPVwiMC44c1wiIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiPjwvYW5pbWF0ZVRyYW5zZm9ybT5cbiAgICA8L3BhdGg+XG4gIDwvc3ZnPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBSZXVzYWJsZSBcIitcIiBjaGlwIHVzZWQgYnkgdGhlIFwiTmV3IGZvbGRlclwiIHRpbGUuIC0tPlxuPG5nLXRlbXBsYXRlICNhZGRJY29uQ2hpcD5cbiAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctMTAgY3FhLWgtMTAgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRjBGMEYxXSBjcWEtdGV4dC1bIzZENkQ3NF0gY3FhLWZsZXgtc2hyaW5rLTAgZ3JvdXAtaG92ZXI6Y3FhLWJnLWluZGlnby01MCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNOCAzVjEzTTMgOEgxM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjc1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtcmVsYXRpdmVcIj5cbiAgICA8ZGl2IFtjbGFzc109XCIhc2hvd1NlYXJjaEJhciA/ICdjcWEtanVzdGlmeS1lbmQnIDogJ2NxYS1qdXN0aWZ5LWJldHdlZW4nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1mbGV4LXdyYXAgY3FhLW1iLTNcIj5cbiAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICAqbmdJZj1cInNob3dTZWFyY2hCYXJcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInNob3dDbGVhclwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ2YWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHNlYXJjaCk9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgIChjbGVhcmVkKT1cImNsZWFyZWQoKVwiXG4gICAgICA+PC9jcWEtc2VhcmNoLWJhcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtZmxleC13cmFwXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgaWNvbj1cIm9wZW5faW5fbmV3XCJcbiAgICAgICAgW3RleHRdPVwiaXNFeHBvcnRpbmcgPyAnRXhwb3J0aW5nLi4uJyA6ICdFeHBvcnQnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRXhwb3J0aW5nXCJcbiAgICAgICAgKGNsaWNrZWQpPVwiZXhwb3J0Q29kZUNsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8c3Bhbj57eyBpc0V4cG9ydGluZyA/ICdFeHBvcnRpbmcuLi4nIDogJ0V4cG9ydCcgfX08L3NwYW4+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICBcbiAgICAgIDwhLS0gRXhwb3J0IENvZGUgTW9kYWwgLS0+XG4gICAgICA8Y3FhLWV4cG9ydC1jb2RlLW1vZGFsXG4gICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gICAgICAgIFtpc09wZW5dPVwiaXNFeHBvcnRNb2RhbE9wZW5cIlxuICAgICAgICBbY2FzZXNdPVwic2VsZWN0ZWRDYXNlc0ZvckV4cG9ydFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgIChjbG9zZU1vZGFsKT1cImNsb3NlRXhwb3J0TW9kYWwoKVwiXG4gICAgICAgIChleHBvcnQpPVwib25FeHBvcnRNb2RhbEV4cG9ydCgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1leHBvcnQtY29kZS1tb2RhbD5cbiAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRyb3Bkb3duVGVtcGxhdGUgb2Ygb3RoZXJEcm9wRG93bkJ1dHRvbnM7IHRyYWNrQnk6IHRyYWNrQnlEcm9wZG93blRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VsZWN0RHJvcGRvd25UZW1wbGF0ZSBvZiBvdGhlclNlbGVjdERyb3BEb3duQnV0dG9uczsgdHJhY2tCeTogdHJhY2tCeVNlbGVjdERyb3Bkb3duVGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0RHJvcGRvd25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgXG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93RmlsdGVyQnV0dG9uXCJcbiAgICAgICAgICB2YXJpYW50PVwiZ3JleS1zb2xpZFwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlRmlsdGVyKClcIlxuICAgICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICBGaWx0ZXIgICAgICAgICAgXG4gICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImFycm93Q2xhc3Nlc1wiPlxuICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LTIgY3FhLWgtMSBjcWEtYWJzb2x1dGUgY3FhLWxlZnQtWzRweF0gY3FhLXRvcC1bNnB4XVwiXG4gICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgOCA0XCJcbiAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgMEw0IDRMOCAwXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMEIwQjBDXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjMzXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtY29sdW1uLXZpc2liaWxpdHlcbiAgICAgICAgICAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiXG4gICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJpbGl0eUNvbHVtbnNcIlxuICAgICAgICAgIFtjb2x1bW5WaXNpYmlsaXR5XT1cImNvbHVtblZpc2liaWxpdHlcIlxuICAgICAgICAgIFtzZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWxdPVwic2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAoY29sdW1uVmlzaWJpbGl0eUNoYW5nZSk9XCJvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGF1dG9SZWZyZXNoQ2hhbmdlKT1cIm9uQXV0b1JlZnJlc2hDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2NxYS1jb2x1bW4tdmlzaWJpbGl0eT5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dBdXRvUmVmcmVzaEJ1dHRvblwiXG4gICAgICAgICAgdmFyaWFudD1cImdyZXktc29saWRcIlxuICAgICAgICAgIGljb249XCJyZWZyZXNoXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJoYW5kbGVSZWZyZXNoQ2xpY2soKVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ1JlZnJlc2gnXCJcbiAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVvcmRlcmluZ1wiXG4gICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvblRlbXBsYXRlIG9mIG90aGVyQnV0dG9uczsgdHJhY2tCeTogdHJhY2tCeVRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8Y3FhLXNlZ21lbnQtY29udHJvbFxuICAgICAgICAgICpuZ0lmPVwic2hvd1ZpZXdNb2RlVG9nZ2xlXCJcbiAgICAgICAgICBzaXplPVwibGdcIlxuICAgICAgICAgIFtzZWdtZW50c109XCJ2aWV3TW9kZVNlZ21lbnRzXCJcbiAgICAgICAgICBbdmFsdWVdPVwidmlld01vZGVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZpZXdNb2RlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd1Jlb3JkZXJCdXR0b24gJiYgIWlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICBpY29uPVwiZHJhZ19pbmRpY2F0b3JcIlxuICAgICAgICAgIFt0ZXh0XT1cInJlb3JkZXJMYWJlbHMucmVvcmRlckJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFwYWdlZFJvd3MgfHwgcGFnZWRSb3dzLmxlbmd0aCA9PT0gMCB8fCBpc1RhYmxlTG9hZGluZyB8fCBpc1RhYmxlRGF0YUxvYWRpbmdcIlxuICAgICAgICAgIChjbGlja2VkKT1cInN0YXJ0UmVvcmRlcigpXCJcbiAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZW9yZGVyQnV0dG9uICYmIGlzUmVvcmRlcmluZ1wiPlxuICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgICAgW3RleHRdPVwicmVvcmRlckxhYmVscy5jYW5jZWxCdXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlb3JkZXJTYXZpbmdcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwiY2FuY2VsUmVvcmRlcigpXCJcbiAgICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgICAgIFtpY29uXT1cInJlb3JkZXJTYXZpbmcgPyAnaG91cmdsYXNzX2VtcHR5JyA6ICcnXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cInJlb3JkZXJTYXZpbmcgPyByZW9yZGVyTGFiZWxzLnNhdmluZ0J1dHRvbiA6IHJlb3JkZXJMYWJlbHMuZG9uZUJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVvcmRlclNhdmluZ1wiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJzYXZlUmVvcmRlcigpXCJcbiAgICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZW9yZGVyIG1vZGUgYmFubmVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Jlb3JkZXJpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tYi0zIGNxYS1weC0zIGNxYS1weS0yIGNxYS1yb3VuZGVkLW1kIGNxYS1iZy1bI0ZGRkJFQl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkRFNjhBXVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICA8L3N2Zz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM5MjQwMEVdXCI+e3sgcmVvcmRlckxhYmVscy5iYW5uZXJUaXRsZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM5MjQwMEVdXCI+e3sgcmVvcmRlckxhYmVscy5iYW5uZXJEZXNjcmlwdGlvbiB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxjcWEtc2VsZWN0ZWQtZmlsdGVyc1xuICAgICAgW2ZpbHRlckFwcGxpZWRdPVwiZmlsdGVyQXBwbGllZFwiXG4gICAgICBbY2hpcHNdPVwiY2hpcHNcIlxuICAgICAgKHJlbW92ZUNoaXApPVwib25SZW1vdmVDaGlwKCRldmVudClcIlxuICAgICAgKGNsZWFyQWxsKT1cIm9uQ2xlYXJBbGxDaGlwcygpXCJcbiAgICAgIChvbkNsZWFyQWxsKT1cIm9uQ2xlYXJBbGwuZW1pdCgpXCJcbiAgICA+XG4gICAgPC9jcWEtc2VsZWN0ZWQtZmlsdGVycz5cblxuICAgIDxjcWEtZHluYW1pYy1maWx0ZXJcbiAgICAgICpuZ0lmPVwic2hvd0ZpbHRlclBhbmVsXCJcbiAgICAgIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCJcbiAgICAgIFttb2RlbF09XCJmaWx0ZXJNb2RlbFwiXG4gICAgICBbc2hvd0ZpbHRlclBhbmVsXT1cInNob3dGaWx0ZXJQYW5lbFwiXG4gICAgICAoZmlsdGVyc0NoYW5nZWQpPVwib25GaWx0ZXJzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChmaWx0ZXJzQXBwbGllZCk9XCJvbkZpbHRlcnNBcHBsaWVkKCRldmVudClcIlxuICAgICAgKG9uQXBwbHlGaWx0ZXJDbGljayk9XCJvbkFwcGx5RmlsdGVyQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgIChvblJlc2V0RmlsdGVyQ2xpY2spPVwiaGFuZGxlUmVzZXRGaWx0ZXJDbGljaygpXCJcbiAgICA+XG4gICAgPC9jcWEtZHluYW1pYy1maWx0ZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLWdhcC0yIGNxYS1taW4taC0wIFwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigyMjYsIDIyNiwgMjI3KTtcIj5cbiAgICAgIDwhLS0gU2lkZWJhciAob25seSBzaG93biBpbiBtb2R1bGFyIHZpZXcpIC0tPlxuICAgICAgPGNxYS1mb2xkZXItc2lkZWJhclxuICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93U2lkZWJhclwiXG4gICAgICAgIFtmb2xkZXJzXT1cImZvbGRlcnNcIlxuICAgICAgICBbc2VsZWN0ZWRGb2xkZXJJZF09XCJzZWxlY3RlZEZvbGRlcklkXCJcbiAgICAgICAgW2V4cGFuZGVkRm9sZGVySWRzXT1cImV4cGFuZGVkRm9sZGVySWRzXCJcbiAgICAgICAgW3Vub3JnYW5pemVkQ291bnRdPVwidW5vcmdhbml6ZWRDb3VudFwiXG4gICAgICAgIFthbGxvd0NyZWF0ZV09XCJtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCJcbiAgICAgICAgW2FsbG93UmVuYW1lXT1cIm1vZHVsYXJDb25maWcuYWxsb3dSZW5hbWVGb2xkZXJcIlxuICAgICAgICBbYWxsb3dEZWxldGVdPVwibW9kdWxhckNvbmZpZy5hbGxvd0RlbGV0ZUZvbGRlclwiXG4gICAgICAgIFthbGxvd0Ryb3BdPVwibW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcFwiXG4gICAgICAgIFtzaG93Q291bnRzXT1cIm1vZHVsYXJDb25maWcuc2hvd0NvdW50c1wiXG4gICAgICAgIFtjb2xsYXBzZWRdPVwic2lkZWJhckNvbGxhcHNlZFwiXG4gICAgICAgIFtsYWJlbHNdPVwibW9kdWxhckxhYmVsc1wiXG4gICAgICAgIFtzZXJ2ZXJTaWRlU2VhcmNoXT1cInNlcnZlclNpZGVTZWFyY2hcIlxuICAgICAgICBbcm9vdFRvdGFsXT1cInJvb3RUb3RhbFwiXG4gICAgICAgIFtmb2xkZXJTZWFyY2hMb2FkaW5nXT1cImZvbGRlclNlYXJjaExvYWRpbmdcIlxuICAgICAgICBbcm9vdEZvbGRlcnNMb2FkaW5nXT1cInJvb3RGb2xkZXJzTG9hZGluZ1wiXG4gICAgICAgIFtzYXZpbmdGb2xkZXJJZHNdPVwic2F2aW5nRm9sZGVySWRzXCJcbiAgICAgICAgW3NlYXJjaFZhbHVlXT1cImZvbGRlclNlYXJjaFZhbHVlXCJcbiAgICAgICAgKGZvbGRlclNlbGVjdGVkKT1cIm9uRm9sZGVyU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJFeHBhbnNpb25Ub2dnbGVkKT1cIm9uRm9sZGVyRXhwYW5zaW9uVG9nZ2xlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckNoaWxkcmVuUmVxdWVzdGVkKT1cImZvbGRlckNoaWxkcmVuUmVxdWVzdGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCk9XCJmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAocm9vdExvYWRNb3JlUmVxdWVzdGVkKT1cInJvb3RMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cImZvbGRlclNlYXJjaENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAoZm9sZGVyQ3JlYXRlZCk9XCJvbkZvbGRlckNyZWF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJDcmVhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJSZW5hbWVkKT1cIm9uRm9sZGVyUmVuYW1lZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckRlbGV0ZWQpPVwib25Gb2xkZXJEZWxldGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyTW92ZVJlcXVlc3RlZCk9XCJvbkZvbGRlck1vdmVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwib25UZXN0c0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEcm9wcGVkKT1cIm9uRm9sZGVyRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9jcWEtZm9sZGVyLXNpZGViYXI+XG5cbiAgICAgIDwhLS0gUmlnaHQgcGFuZSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItdG9wXT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdF09XCJpc01vZHVsYXJWaWV3ID8gJzFweCBzb2xpZCAjRTJFMkUzJyA6IG51bGxcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJpZ2h0XT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQnJlYWRjcnVtYiAobW9kdWxhciB2aWV3LCBmb2xkZXIgZHJpbGxlZC1pbikgLS0+XG4gICAgICAgIDxuYXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93QnJlYWRjcnVtYiAmJiAhaXNSb290Vmlld1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkZvbGRlciBwYXRoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1weC0zIGNxYS1weS0yIGNxYS1yb3VuZGVkLW5vbmUgY3FhLW1pbi13LTBcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTJFMkUzO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLWZsZXgtMSBjcWEtbWluLXctMCBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtZmxleC1zaHJpbmstMFwiIChjbGljayk9XCJvbkZvbGRlclNlbGVjdGVkKG51bGwpXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgbW9kdWxhckxhYmVscy5hbGxGb2xkZXJzIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjcnVtYiBvZiBicmVhZGNydW1iVHJhaWw7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtYWxpZ24tbWlkZGxlIGNxYS1mbGV4LXNocmluay0wXCIgc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2NvbG9yOiM2RDZENzQ7XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJsYXN0XG4gICAgICAgICAgICAgICAgICA/ICdjcWEtdGV4dC1bIzE2MTYxN10gY3FhLWZvbnQtc2VtaWJvbGQnXG4gICAgICAgICAgICAgICAgICA6ICdjcWEtdGV4dC1bIzZENkQ3NF0gaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdJ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxhc3RcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhbGFzdCAmJiBvbkZvbGRlclNlbGVjdGVkKGNydW1iLmlkKVwiXG4gICAgICAgICAgICAgID57eyBjcnVtYi5uYW1lIH19PC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dTdWJmb2xkZXJTZWN0aW9uICYmIHN1YmZvbGRlclRpbGVzLmxlbmd0aFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgICBjdXN0b21DbGFzcz1cIiFjcWEtdGV4dC1bMTNweF0gIWNxYS1sZWFkaW5nLVsxOHB4XVwiXG4gICAgICAgICAgICBbaWNvbl09XCJzdWJmb2xkZXJTZWN0aW9uRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJ1wiXG4gICAgICAgICAgICBbdGV4dF09XCIoc3ViZm9sZGVyU2VjdGlvbkV4cGFuZGVkID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgc3ViZm9sZGVycydcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzdWJmb2xkZXJTZWN0aW9uRXhwYW5kZWRcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlU3ViZm9sZGVyU2VjdGlvbigpXCJcbiAgICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIm1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiXG4gICAgICAgICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICAgICAgICBidG5TaXplPVwic21cIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCIhY3FhLXRleHQtWzEzcHhdICFjcWEtbGVhZGluZy1bMThweF1cIlxuICAgICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgICBbdGV4dF09XCJtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlclwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZCh7IHBhcmVudElkOiBzZWxlY3RlZEZvbGRlcklkIH0pXCJcbiAgICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8L25hdj5cblxuICAgICAgICA8IS0tIEZvbGRlciBncmlkOiBtb2R1bGFyICsgcm9vdCB2aWV3IC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd0ZvbGRlckdyaWQgJiYgcm9vdEZvbGRlclRpbGVzLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcHgtNSBjcWEtcHQtMlwiXG4gICAgICAgICAgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0YwRjBGMTtcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1tYi0yIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9yZ2FuaXplZFNlY3Rpb25FeHBhbmRlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3JnYW5pemVkU2VjdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiIzZENkQ3NFwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzZENkQ3NF1cIj57eyBtb2R1bGFyTGFiZWxzLm9yZ2FuaXplZCB9fTwvaDM+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPlxuICAgICAgICAgICAgICB7eyByb290Rm9sZGVyVGlsZXMubGVuZ3RoID09PSAxID8gbW9kdWxhckxhYmVscy5mb2xkZXJzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMuZm9sZGVyc0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgcm9vdEZvbGRlclRpbGVzLmxlbmd0aCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNkQ2RDc0XSBjcWEtbWwtYXV0b1wiIHN0eWxlPVwiZm9udC1zaXplOjE4cHg7d2lkdGg6MThweDtoZWlnaHQ6MThweFwiPlxuICAgICAgICAgICAgICB7eyBvcmdhbml6ZWRTZWN0aW9uRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNxYS1ncmlkXCJcbiAgICAgICAgICAgIHN0eWxlPVwidHJhbnNpdGlvbjogZ3JpZC10ZW1wbGF0ZS1yb3dzIDMwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XCJcbiAgICAgICAgICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLXJvd3NdPVwib3JnYW5pemVkU2VjdGlvbkV4cGFuZGVkID8gJzFmcicgOiAnMGZyJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLWgtMFwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtbm93cmFwIGNxYS1nYXAtMyBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtcGItMVwiXG4gICAgICAgICAgICAgICAoc2Nyb2xsKT1cIm9uUm9vdEdyaWRTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZiBvZiByb290Rm9sZGVyVGlsZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NxYUZvbGRlckRyb3BdPVwiZi5pZFwiXG4gICAgICAgICAgICAgIFtkcm9wRW5hYmxlZF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJvblRlc3RzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQoZi5pZClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtZmxleC1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cImYuY2hpbGRyZW4/Lmxlbmd0aFwiPiDCtyB7eyBmLmNoaWxkcmVuIS5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLm9uZVN1YmZvbGRlciA6IG1vZHVsYXJMYWJlbHMuc3ViZm9sZGVyc0NvdW50LnJlcGxhY2UoJ3tufScsICcnICsgZi5jaGlsZHJlbiEubGVuZ3RoKSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLWZsZXgtc2hyaW5rLTBcIiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHhcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZCh7IHBhcmVudElkOiBudWxsIH0pXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXctWzI0MHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtdGV4dC1sZWZ0IGNxYS1wLTMgY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctWyNGQUZBRkFdIGhvdmVyOmNxYS1ib3JkZXItWyMzRjQzRUVdIGhvdmVyOmNxYS1iZy13aGl0ZSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkSWNvbkNoaXBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgbW9kdWxhckxhYmVscy5uZXdGb2xkZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTQwMFwiPnt7IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnMCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFBhZ2luYXRpb24gc3Bpbm5lciBhbmNob3JlZCBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgT3JnYW5pemVkXG4gICAgICAgICAgICAgICAgIHJvdy4gT25seSByZW5kZXJzIGR1cmluZyBhbiBpbi1mbGlnaHQgcm9vdCBmZXRjaCAoaW5pdGlhbCBPUlxuICAgICAgICAgICAgICAgICBzY3JvbGwtZHJpdmVuIFwibG9hZCBtb3JlXCIpLCBhbmQgaXMgZmlsdGVyZWQgdG8gc3VwcHJlc3Mgd2hlblxuICAgICAgICAgICAgICAgICB0aGUgc2VjdGlvbiBpcyBlbXB0eSBzbyB3ZSBkb24ndCBzaG93IGEgc3Bpbm5lciBpbnNpZGUgYW5cbiAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLWJsYW5rIHJvdy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwicm9vdEZvbGRlcnNMb2FkaW5nICYmIHJvb3RGb2xkZXJUaWxlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy1bODBweF1cIlxuICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMb2FkaW5nIG1vcmUgZm9sZGVycydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1NwaW5uZXI7IGNvbnRleHQ6IHsgc2l6ZTogMjAgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8IS0tIFN1YmZvbGRlciBzZWN0aW9uOiBtb2R1bGFyICsgZm9sZGVyIHZpZXcuIFNob3duIHdoZW5ldmVyIGRyaWxsZWQgaW5cbiAgICAgICAgICAgICAoZXZlbiBpZiBubyBzdWJmb2xkZXJzLCBzbyB0aGUgXCIrIE5ldyBmb2xkZXJcIiB0aWxlIHJlbWFpbnNcbiAgICAgICAgICAgICByZWFjaGFibGUsIGFuZCBzbyB3ZSBjYW4gcmVuZGVyIGEgbG9hZGluZyBzdGF0ZSBkdXJpbmcgdGhlXG4gICAgICAgICAgICAgZHJpbGwtaW4gZmV0Y2ggYmVmb3JlIGNoaWxkcmVuIGFycml2ZSkuIC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiAhaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dTdWJmb2xkZXJTZWN0aW9uICYmIChzdWJmb2xkZXJUaWxlcy5sZW5ndGggfHwgY3VycmVudEZvbGRlck5vZGU/LmNoaWxkcmVuTG9hZGluZylcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWdyaWRcIlxuICAgICAgICAgIHN0eWxlPVwidHJhbnNpdGlvbjogZ3JpZC10ZW1wbGF0ZS1yb3dzIDMwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XCJcbiAgICAgICAgICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1yb3dzXT1cInN1YmZvbGRlclNlY3Rpb25FeHBhbmRlZCA/ICcxZnInIDogJzBmcidcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC0wXCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHgtMyBjcWEtcHktMiBjcWEtZmxleCBjcWEtZmxleC1ub3dyYXAgY3FhLWdhcC0zIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLXNjcm9sbGJhci10aGluXCJcbiAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25TdWJmb2xkZXJHcmlkU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGYgb2Ygc3ViZm9sZGVyVGlsZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2NxYUZvbGRlckRyb3BdPVwiZi5pZFwiXG4gICAgICAgICAgICAgIFtkcm9wRW5hYmxlZF09XCJtb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wXCJcbiAgICAgICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJvblRlc3RzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyU2VsZWN0ZWQoZi5pZClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtZmxleC1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1uZXV0cmFsLTQwMCBjcWEtZmxleC1zaHJpbmstMFwiIHN0eWxlPVwiZm9udC1zaXplOjIwcHg7d2lkdGg6MjBweDtoZWlnaHQ6MjBweFwiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gXCIrIE5ldyBmb2xkZXJcIiB0aWxlIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIm1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9sZGVyQ3JlYXRlUmVxdWVzdGVkKHsgcGFyZW50SWQ6IHNlbGVjdGVkRm9sZGVySWQgfSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtZmxleC1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy1bI0ZBRkFGQV0gaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLWJnLXdoaXRlIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uQ2hpcFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNDAwXCI+e3sgbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcwJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwhLS0gU3ViZm9sZGVyIGZldGNoIGluZGljYXRvci4gVHdvIGNhc2VzOlxuICAgICAgICAgICAgICAgICAtIERyaWxsLWluIGZldGNoOiBubyBzdWJmb2xkZXJUaWxlcyB5ZXQsIHJlbmRlciBhIGNlbnRlcmVkXG4gICAgICAgICAgICAgICAgICAgcm93IHNwaW5uZXIgc28gdGhlIHNlY3Rpb24gaXNuJ3QgZW1wdHkgZHVyaW5nIHRoZSBmZXRjaC5cbiAgICAgICAgICAgICAgICAgLSBQYWdpbmF0aW9uIGZldGNoOiB0aWxlcyBleGlzdCwgYW5jaG9yIGEgc21hbGwgc3Bpbm5lciBhdFxuICAgICAgICAgICAgICAgICAgIHRoZSByaWdodCBlZGdlIHNvIHRoZSB1c2VyIGtub3dzIHRoZSBuZXh0IHBhZ2UgaXMgbG9hZGluZy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEZvbGRlck5vZGU/LmNoaWxkcmVuTG9hZGluZ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctWzgwcHhdXCJcbiAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTG9hZGluZyBzdWJmb2xkZXJzJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nU3Bpbm5lcjsgY29udGV4dDogeyBzaXplOiAyMCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgIWlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93VW5vcmdhbml6ZWRTZWN0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNCBjcWEtcHktMyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItaW5kaWdvLTEwMFwiXG4gICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRDhEOUZDO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjk1ODUgMTAuNDU4NUMxMi45NTg1IDEwLjc5IDEyLjgyNjggMTEuMTA4IDEyLjU5MjQgMTEuMzQyNEMxMi4zNTggMTEuNTc2OCAxMi4wNCAxMS43MDg1IDExLjcwODUgMTEuNzA4NUgxLjcwODVDMS4zNzY5OCAxMS43MDg1IDEuMDU5MDMgMTEuNTc2OCAwLjgyNDYxMyAxMS4zNDI0QzAuNTkwMTkyIDExLjEwOCAwLjQ1ODQ5NiAxMC43OSAwLjQ1ODQ5NiAxMC40NTg1VjEuNzA4NUMwLjQ1ODQ5NiAxLjM3Njk4IDAuNTkwMTkyIDEuMDU5MDMgMC44MjQ2MTMgMC44MjQ2MTNDMS4wNTkwMyAwLjU5MDE5MiAxLjM3Njk4IDAuNDU4NDk2IDEuNzA4NSAwLjQ1ODQ5Nkg0LjgzMzVMNi4wODM1IDIuMzMzNUgxMS43MDg1QzEyLjA0IDIuMzMzNSAxMi4zNTggMi40NjUxOSAxMi41OTI0IDIuNjk5NjFDMTIuODI2OCAyLjkzNDAzIDEyLjk1ODUgMy4yNTE5OCAxMi45NTg1IDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZFwiIHN0eWxlPVwiY29sb3I6ICMzRjQzRUU7XCI+XG4gICAgICAgICAgICAgIHt7IGN1cnJlbnRGb2xkZXJOb2RlPy5uYW1lIH19ICh7eyBjdXJyZW50Rm9sZGVyRGlyZWN0Q291bnQgfX0pXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBidG5TaXplPVwic21cIlxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M9XCIhY3FhLXRleHQtWzEzcHhdXCJcbiAgICAgICAgICAgIGlubGluZVN0eWxlcz1cImJvcmRlci1jb2xvcjogIzNGNDNFRTsgY29sb3I6ICMzRjQzRUU7XCJcbiAgICAgICAgICAgIFt0ZXh0XT1cIm1vZHVsYXJMYWJlbHMuY2xlYXJGaWx0ZXJcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwib25Gb2xkZXJTZWxlY3RlZChudWxsKVwiXG4gICAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBVbm9yZ2FuaXplZCBzZWN0aW9uIGhlYWRlciBhdCByb290IHZpZXcgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dVbm9yZ2FuaXplZFNlY3Rpb25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTIgY3FhLW10LTJcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAyMHB4O1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzZENkQ3NF1cIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5pbmJveDwvbWF0LWljb24+XG4gICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM2RDZENzRdXCI+e3sgbW9kdWxhckxhYmVscy51bm9yZ2FuaXplZCB9fTwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzZENkQ3NF1cIj5cbiAgICAgICAgICAgIHt7IHVub3JnYW5pemVkQ291bnQgPT09IDEgPyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnJyArIHVub3JnYW5pemVkQ291bnQpIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1sIGNxYS1ib3JkZXItciBjcWEtYm9yZGVyLWdyZXktMjAwIGNxYS1yZWxhdGl2ZSBjcWEtb3ZlcmZsb3cteC1hdXRvXCJcbiAgICAgICAgICAgICBbY2xhc3MuY3FhLW1vZHVsYXItdGFibGUtZmx1c2hdPVwiaXNNb2R1bGFyVmlld1wiXG4gICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiKCFpc01vZHVsYXJWaWV3ID8gJ2JvcmRlci1yYWRpdXM6IDdweDsnIDogJycpICsgKChwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDApID8gJycgOiAnIGJvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudDsnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNUYWJsZUxvYWRpbmcgfHwgaXNUYWJsZURhdGFMb2FkaW5nKSB8fCAoIWVmZmVjdGl2ZUlzRW1wdHlTdGF0ZSAmJiBwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDApOyBlbHNlIHN0b3J5RW1wdHlUcGxcIj5cbiAgICAgICAgICAgIDxhcHAtZHluYW1pYy10YWJsZVxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyLWJvdHRvbV09XCJwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDAgPyAnMXB4IHNvbGlkIHJnYigyMjYsIDIyNiwgMjI3KScgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29tcHV0ZWRDb2x1bW5zXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwicGFnZWRSb3dzXCJcbiAgICAgICAgICAgICAgW3Jvd1NlbGVjdGFibGVdPVwicm93U2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgIFtlbmFibGVMb2NhbFNvcnRdPVwiZW5hYmxlTG9jYWxTb3J0ICYmICFpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgICAgICBbaXNUYWJsZUxvYWRpbmddPVwiaXNUYWJsZUxvYWRpbmdcIlxuICAgICAgICAgICAgICBbaXNUYWJsZURhdGFMb2FkaW5nXT1cImlzVGFibGVEYXRhTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtjZWxsSnNvblBhdGhHZXR0ZXJdPVwiY2VsbEpzb25QYXRoR2V0dGVyXCJcbiAgICAgICAgICAgICAgW29uSnNvblBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2VuYWJsZVJvd1Jlb3JkZXJdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICAgICAgKHJvd1Jlb3JkZXIpPVwib25Sb3dSZW9yZGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAoc29ydENoYW5nZSk9XCJzb3J0Q2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5VGFibGVUcGw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktOFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2lsbHVzdHJhdGlvbnMvZW1wdHktc3RhdGUuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiY3FhLXctMzIgY3FhLWgtMzIgY3FhLW1iLTRcIiAvPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLW1iLTJcIj5ObyB0ZXN0IGNhc2VzPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLW1iLTRcIj5UcnkgYWRqdXN0aW5nIGZpbHRlcnMgb3IgY3JlYXRlIGEgbmV3IHRlc3QgY2FzZS48L3A+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgKGNsaWNrZWQpPVwidG9nZ2xlRmlsdGVyKClcIj5TaG93IEZpbHRlcnM8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2FwcC1keW5hbWljLXRhYmxlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzdG9yeUVtcHR5VHBsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTYgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxjcWEtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZUlzRW1wdHlTdGF0ZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcudGl0bGVcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbnNdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5hY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25FbXB0eUFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2NxYS1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtcGFnaW5hdGlvblxuICAgICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInNlcnZlclNpZGVQYWdpbmF0aW9uID8gdG90YWxFbGVtZW50cyA6IGZpbHRlcmVkUm93cy5sZW5ndGhcIlxuICAgICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgICBbcGFnZVNpemVNZW51RGlyZWN0aW9uXT1cInBhZ2VTaXplTWVudURpcmVjdGlvblwiXG4gICAgICAgICAgW3BhZ2VJdGVtQ291bnRdPVwicGFnZWRSb3dzLmxlbmd0aFwiXG4gICAgICAgICAgKHBhZ2luYXRlKT1cIm9uUGFnaW5hdGUoJGV2ZW50KVwiXG4gICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgPC9jcWEtcGFnaW5hdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZXVzZWQgYnVsayBhY3Rpb24gdG9vbGJhciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYW55Um93U2VsZWN0ZWQgJiYgbW9kdWxhckNvbmZpZy5hbGxvd0J1bGtTZWxlY3Rpb24gJiYgIWlzUmVvcmRlcmluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1ib3R0b20tWzE4Ljc1cHhdIGNxYS1sZWZ0LVs1MCVdIGNxYS10cmFuc2xhdGUteC1bLTUwJV0gY3FhLXctZnVsbCBsZzpjcWEtbWF4LXctWzY4JV0gY3FhLXNtOm1heC13LVs3NSVdIGNxYS1tYXgtdy1bOTAlXSBjcWEtei1bMV1cIj5cbiAgICAgIDxjcWEtdGFibGUtYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwic2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgPyBzZWxlY3RlZEl0ZW1zIDogY3VycmVudFNlbGVjdGVkSXRlbXNcIlxuICAgICAgICBbYWN0aW9uc109XCJlZmZlY3RpdmVCdWxrQWN0aW9uc1wiXG4gICAgICAgIFtzaG93U2VsZWN0QWxsXT1cInNob3dTZWxlY3RBbGxJblRvb2xiYXJcIlxuICAgICAgICBbYWxsU2VsZWN0ZWRdPVwiYWxsU2VsZWN0ZWRJblRvb2xiYXJcIlxuICAgICAgICBbc2hvd0Rpc21pc3NdPVwic2hvd0Rpc21pc3NJblRvb2xiYXJcIlxuICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25CdWxrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAoc2VsZWN0QWxsQ2hhbmdlKT1cIm9uQnVsa1NlbGVjdEFsbCgkZXZlbnQpXCJcbiAgICAgICAgKGRpc21pc3MpPVwib25CdWxrRGlzbWlzcygpXCJcbiAgICAgID48L2NxYS10YWJsZS1hY3Rpb24tdG9vbGJhcj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|