@cqa-lib/cqa-ui 1.1.539 → 1.1.540

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.
@@ -16,12 +16,13 @@ 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 "../../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";
19
+ import * as i11 from "@angular/material/progress-spinner";
20
+ import * as i12 from "../../table/dynamic-table/dynamic-table.component";
21
+ import * as i13 from "../../empty-state/empty-state.component";
22
+ import * as i14 from "../../pagination/pagination.component";
23
+ import * as i15 from "../../table-action-toolbar/table-action-toolbar.component";
24
+ import * as i16 from "@angular/common";
25
+ import * as i17 from "./directives/folder-drop.directive";
25
26
  export class ModularTableTemplateComponent {
26
27
  constructor(cdr, dialogService) {
27
28
  this.cdr = cdr;
@@ -169,6 +170,33 @@ export class ModularTableTemplateComponent {
169
170
  this.modularLabels = { ...DEFAULT_MODULAR_LABELS };
170
171
  this.bulkActions = [];
171
172
  this.sidebarCollapsed = false;
173
+ /** Lazy-load: when true, the sidebar emits `searchChange` and skips its
174
+ * local name filter so the host can serve search results from the backend. */
175
+ this.serverSideSearch = false;
176
+ /** Lazy-load: backend-reported total root folders. Drives the sidebar's
177
+ * top-level "Load more" affordance when `folders.length < rootTotal`. */
178
+ this.rootTotal = 0;
179
+ /** Lazy-load: true while the host is fetching server-side folder-search
180
+ * results. Forwarded to the sidebar so it can render a search spinner. */
181
+ this.folderSearchLoading = false;
182
+ /** Lazy-load: true while a root-page fetch is in flight (initial load OR
183
+ * the scroll-driven "load more" pagination). Drives the loading indicator
184
+ * the modular grid renders at the right edge of the Organised row, and is
185
+ * forwarded to the sidebar for its own loading affordance. */
186
+ this.rootFoldersLoading = false;
187
+ /** Override for the currently-selected folder node. Used as a fallback when
188
+ * `findFolder(folders, selectedFolderId)` misses — e.g., during sidebar
189
+ * search when `folders` holds only the matched results, the selected
190
+ * folder may not be among them, but its breadcrumb / header label still
191
+ * needs to render. The host owns the lookup against its full folder map. */
192
+ this.selectedFolderNode = null;
193
+ /** Host-provided breadcrumb snapshot for the selected folder. Used as a
194
+ * fallback in `breadcrumbTrail` when `buildTrail` against `this.folders`
195
+ * yields empty — the canonical case is sidebar search, where `folders`
196
+ * is the search-results list and the selected folder's ancestors aren't
197
+ * present. The host walks `parentId` chains to build this; partial trails
198
+ * are acceptable when ancestors haven't been fetched yet. */
199
+ this.selectedFolderTrail = null;
172
200
  /**
173
201
  * When true (default), the library opens its own Move dialog for convenience
174
202
  * during testing. Hosts taking over API + UX should set this to `false` and
@@ -180,6 +208,16 @@ export class ModularTableTemplateComponent {
180
208
  // ============================================================================
181
209
  this.folderSelected = new EventEmitter();
182
210
  this.folderExpansionToggled = new EventEmitter();
211
+ /** Lazy-load: re-emitted from the sidebar when the user expands a node whose
212
+ * children haven't been fetched yet. Host responds by fetching that subtree. */
213
+ this.folderChildrenRequested = new EventEmitter();
214
+ /** Lazy-load: re-emitted when the user clicks the per-folder "Load more". */
215
+ this.folderLoadMoreRequested = new EventEmitter();
216
+ /** Lazy-load: re-emitted when the user clicks the top-level "Load more". */
217
+ this.rootLoadMoreRequested = new EventEmitter();
218
+ /** Lazy-load: debounced sidebar-search term. Consumed by hosts that have
219
+ * set `serverSideSearch=true` to refetch the tree from the backend. */
220
+ this.folderSearchChange = new EventEmitter();
183
221
  this.folderCreated = new EventEmitter();
184
222
  /** Emitted when the user clicks "+ New folder"; host should open a creation modal. */
185
223
  this.folderCreateRequested = new EventEmitter();
@@ -287,6 +325,14 @@ export class ModularTableTemplateComponent {
287
325
  this.visibilityColumns = [];
288
326
  // Export modal state
289
327
  this.isExportModalOpen = false;
328
+ /** Tracks the `folders.length` at which we last emitted `rootLoadMoreRequested`
329
+ * from the Organized grid scroll, so rapid scroll events don't spam the host
330
+ * before it has had a chance to append the next page. */
331
+ this.lastRootGridLoadAt = -1;
332
+ /** Tracks the `currentFolderNode.children.length` at which we last emitted
333
+ * `folderLoadMoreRequested` from the Subfolders grid scroll, for the same
334
+ * reason as `lastRootGridLoadAt`. */
335
+ this.lastSubfolderGridLoadAt = -1;
290
336
  /**
291
337
  * Row-drag payload builder used by the [cqaRowDrag] directive via (buildPayload).
292
338
  */
@@ -902,7 +948,16 @@ export class ModularTableTemplateComponent {
902
948
  if (this.selectedFolderId == null)
903
949
  return [];
904
950
  const node = this.findFolder(this.folders, this.selectedFolderId);
905
- return node?.children ?? [];
951
+ if (node?.children?.length)
952
+ return node.children;
953
+ // Fallback: host-provided snapshot when the live tree doesn't contain
954
+ // the selection (refresh-restore before ancestors are loaded, or sidebar
955
+ // search where `folders` holds only the matched results).
956
+ if (this.selectedFolderNode &&
957
+ String(this.selectedFolderNode.id) === String(this.selectedFolderId)) {
958
+ return this.selectedFolderNode.children ?? [];
959
+ }
960
+ return [];
906
961
  }
907
962
  /**
908
963
  * Breadcrumb trail from "All folders" down to the currently-selected folder.
@@ -912,7 +967,12 @@ export class ModularTableTemplateComponent {
912
967
  return [];
913
968
  const trail = [];
914
969
  this.buildTrail(this.folders, this.selectedFolderId, trail);
915
- return trail;
970
+ if (trail.length)
971
+ return trail;
972
+ // Fallback: host-provided snapshot survives swaps of `this.folders` (the
973
+ // canonical case is sidebar search, where the live walk won't find the
974
+ // selected folder's ancestors among the flat result set).
975
+ return this.selectedFolderTrail ?? [];
916
976
  }
917
977
  buildTrail(nodes, targetId, acc) {
918
978
  for (const n of nodes || []) {
@@ -948,7 +1008,16 @@ export class ModularTableTemplateComponent {
948
1008
  get currentFolderNode() {
949
1009
  if (this.selectedFolderId == null)
950
1010
  return null;
951
- return this.findFolder(this.folders, this.selectedFolderId);
1011
+ // Walk the visible tree first; fall back to the host-provided override
1012
+ // when the lookup misses (e.g. during sidebar search, when `folders`
1013
+ // holds only matched results and the selected folder isn't among them).
1014
+ const found = this.findFolder(this.folders, this.selectedFolderId);
1015
+ if (found)
1016
+ return found;
1017
+ if (this.selectedFolderNode && String(this.selectedFolderNode.id) === String(this.selectedFolderId)) {
1018
+ return this.selectedFolderNode;
1019
+ }
1020
+ return null;
952
1021
  }
953
1022
  /** Count of test cases directly under the currently-selected folder (excluding descendants).
954
1023
  * Reads `FolderNode.count` so the header badge matches the sidebar row count
@@ -1007,6 +1076,48 @@ export class ModularTableTemplateComponent {
1007
1076
  this.expandedFolderIds = Array.from(set);
1008
1077
  this.folderExpansionToggled.emit(event);
1009
1078
  }
1079
+ /** Horizontal-scroll handler for the "Organised" root tiles. Emits
1080
+ * `rootLoadMoreRequested` when the user scrolls within
1081
+ * `GRID_SCROLL_LOAD_THRESHOLD_PX` of the right edge AND more roots are
1082
+ * available on the backend. Throttled by `lastRootGridLoadAt`. */
1083
+ onRootGridScroll(event) {
1084
+ if (this.folders.length >= this.rootTotal)
1085
+ return;
1086
+ if (this.folders.length === this.lastRootGridLoadAt)
1087
+ return;
1088
+ const el = event.target;
1089
+ if (!el)
1090
+ return;
1091
+ const distanceFromRight = el.scrollWidth - (el.scrollLeft + el.clientWidth);
1092
+ if (distanceFromRight > ModularTableTemplateComponent.GRID_SCROLL_LOAD_THRESHOLD_PX)
1093
+ return;
1094
+ this.lastRootGridLoadAt = this.folders.length;
1095
+ this.rootLoadMoreRequested.emit();
1096
+ }
1097
+ /** Horizontal-scroll handler for the "Subfolders in X" tiles. Emits
1098
+ * `folderLoadMoreRequested({ id: selectedFolderId, nextPage })` when the
1099
+ * user scrolls within threshold of the right edge AND the active folder
1100
+ * has more children on the backend than have been loaded. */
1101
+ onSubfolderGridScroll(event) {
1102
+ const node = this.currentFolderNode;
1103
+ if (!node || this.selectedFolderId == null)
1104
+ return;
1105
+ const loaded = node.children?.length ?? 0;
1106
+ const total = node.totalChildren ?? loaded;
1107
+ if (loaded >= total)
1108
+ return;
1109
+ if (loaded === this.lastSubfolderGridLoadAt)
1110
+ return;
1111
+ const el = event.target;
1112
+ if (!el)
1113
+ return;
1114
+ const distanceFromRight = el.scrollWidth - (el.scrollLeft + el.clientWidth);
1115
+ if (distanceFromRight > ModularTableTemplateComponent.GRID_SCROLL_LOAD_THRESHOLD_PX)
1116
+ return;
1117
+ this.lastSubfolderGridLoadAt = loaded;
1118
+ const nextPage = (node.loadedPages ?? -1) + 1;
1119
+ this.folderLoadMoreRequested.emit({ id: this.selectedFolderId, nextPage });
1120
+ }
1010
1121
  onFolderCreated(payload) {
1011
1122
  this.folderCreated.emit(payload);
1012
1123
  }
@@ -1379,11 +1490,12 @@ export class ModularTableTemplateComponent {
1379
1490
  this.cdr.markForCheck();
1380
1491
  }
1381
1492
  }
1493
+ ModularTableTemplateComponent.GRID_SCROLL_LOAD_THRESHOLD_PX = 96;
1382
1494
  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 });
1383
- 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", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", folderIdAccessor: "folderIdAccessor", modularConfig: "modularConfig", modularLabels: "modularLabels", bulkActions: "bulkActions", sidebarCollapsed: "sidebarCollapsed", 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", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", testsMoved: "testsMoved", bulkActionClick: "bulkActionClick", bulkSelectAllChange: "bulkSelectAllChange", bulkDismiss: "bulkDismiss", bulkActionInvoked: "bulkActionInvoked", sidebarCollapsedChange: "sidebarCollapsedChange", reorderStart: "reorderStart", reorderCancel: "reorderCancel", reorderSave: "reorderSave", moveRequested: "moveRequested", selectedItemsChange: "selectedItemsChange", folderDeleteRequested: "folderDeleteRequested", folderMoveRequested: "folderMoveRequested", folderMoved: "folderMoved", folderDuplicateRequested: "folderDuplicateRequested", onReload: "onReload", onAutoRefreshClick: "onAutoRefreshClick", columnVisibilityChange: "columnVisibilityChange", autoRefreshIntervalChange: "autoRefreshIntervalChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "dynamicFilterComponent", first: true, predicate: DynamicFilterComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganisedCount]=\"unorganisedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\">\n <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 </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in (even if no subfolders, so the \"+ New folder\" tile remains reachable). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && subfolderTiles.length\"\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 <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 </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganised section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganisedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganisedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.ExportCodeModalComponent, selector: "cqa-export-code-modal", inputs: ["isOpen", "cases", "disabled"], outputs: ["closeModal", "export"] }, { type: i5.ColumnVisibilityComponent, selector: "cqa-column-visibility", inputs: ["isStepGroup", "columns", "columnVisibility", "selectedAutoRefreshInterval"], outputs: ["columnVisibilityChange", "autoRefreshChange"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i7.SelectedFiltersComponent, selector: "cqa-selected-filters", inputs: ["filterApplied", "chips", "defaultChips", "defaultChipClass"], outputs: ["removeChip", "clearAll", "onClearAll"] }, { type: i8.DynamicFilterComponent, selector: "cqa-dynamic-filter", inputs: ["config", "model", "showFilterPanel", "buttonLayout"], outputs: ["filtersApplied", "filtersChanged", "resetAction", "onApplyFilterClick", "onResetFilterClick"] }, { type: i9.FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: ["folders", "selectedFolderId", "expandedFolderIds", "unorganisedCount", "allowCreate", "allowRename", "allowDelete", "allowMove", "allowDuplicate", "allowDrop", "showCounts", "collapsed", "labels"], outputs: ["folderSelected", "folderExpansionToggled", "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.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 });
1495
+ 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", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", folderIdAccessor: "folderIdAccessor", modularConfig: "modularConfig", modularLabels: "modularLabels", bulkActions: "bulkActions", sidebarCollapsed: "sidebarCollapsed", serverSideSearch: "serverSideSearch", rootTotal: "rootTotal", folderSearchLoading: "folderSearchLoading", rootFoldersLoading: "rootFoldersLoading", selectedFolderNode: "selectedFolderNode", selectedFolderTrail: "selectedFolderTrail", useInternalDialogs: "useInternalDialogs", showReorderButton: "showReorderButton", reorderSaving: "reorderSaving", reorderLabels: "reorderLabels", columnVisibility: "columnVisibility" }, outputs: { onSearchChange: "onSearchChange", onExportClick: "onExportClick", onApplyFilterClick: "onApplyFilterClick", onResetFilterClick: "onResetFilterClick", onClearAll: "onClearAll", removeChip: "removeChip", viewModeChange: "viewModeChange", pageChange: "pageChange", sortChange: "sortChange", folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderChildrenRequested: "folderChildrenRequested", folderLoadMoreRequested: "folderLoadMoreRequested", rootLoadMoreRequested: "rootLoadMoreRequested", folderSearchChange: "folderSearchChange", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", testsMoved: "testsMoved", bulkActionClick: "bulkActionClick", bulkSelectAllChange: "bulkSelectAllChange", bulkDismiss: "bulkDismiss", bulkActionInvoked: "bulkActionInvoked", sidebarCollapsedChange: "sidebarCollapsedChange", reorderStart: "reorderStart", reorderCancel: "reorderCancel", reorderSave: "reorderSave", moveRequested: "moveRequested", selectedItemsChange: "selectedItemsChange", folderDeleteRequested: "folderDeleteRequested", folderMoveRequested: "folderMoveRequested", folderMoved: "folderMoved", folderDuplicateRequested: "folderDuplicateRequested", onReload: "onReload", onAutoRefreshClick: "onAutoRefreshClick", columnVisibilityChange: "columnVisibilityChange", autoRefreshIntervalChange: "autoRefreshIntervalChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "dynamicFilterComponent", first: true, predicate: DynamicFilterComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganisedCount]=\"unorganisedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n [serverSideSearch]=\"serverSideSearch\"\n [rootTotal]=\"rootTotal\"\n [folderSearchLoading]=\"folderSearchLoading\"\n [rootFoldersLoading]=\"rootFoldersLoading\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderChildrenRequested)=\"folderChildrenRequested.emit($event)\"\n (folderLoadMoreRequested)=\"folderLoadMoreRequested.emit($event)\"\n (rootLoadMoreRequested)=\"rootLoadMoreRequested.emit()\"\n (searchChange)=\"folderSearchChange.emit($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onRootGridScroll($event)\">\n <button\n *ngFor=\"let f of rootFolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}<ng-container *ngIf=\"f.children?.length\"> \u00B7 {{ f.children!.length === 1 ? modularLabels.oneSubfolder : modularLabels.subfoldersCount.replace('{n}', '' + f.children!.length) }}</ng-container>\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: null })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Pagination spinner anchored at the right edge of the Organised\n row. Only renders during an in-flight root fetch (initial OR\n scroll-driven \"load more\"), and is filtered to suppress when\n the section is empty so we don't show a spinner inside an\n otherwise-blank row. -->\n <div\n *ngIf=\"rootFoldersLoading && rootFolderTiles.length > 0\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading more folders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in\n (even if no subfolders, so the \"+ New folder\" tile remains\n reachable, and so we can render a loading state during the\n drill-in fetch before children arrive). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && (subfolderTiles.length || currentFolderNode?.childrenLoading)\"\n class=\"cqa-mb-4 cqa-px-3 cqa-py-1\"\n >\n <div *ngIf=\"subfolderTiles.length || modularConfig.allowCreateFolder\" class=\"cqa-text-sm cqa-text-neutral-600 cqa-mb-2\">\n {{ modularLabels.subfoldersIn }} {{ breadcrumbTrail.length ? breadcrumbTrail[breadcrumbTrail.length - 1].name : '' }}\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onSubfolderGridScroll($event)\">\n <button\n *ngFor=\"let f of subfolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Subfolder fetch indicator. Two cases:\n - Drill-in fetch: no subfolderTiles yet, render a centered\n row spinner so the section isn't empty during the fetch.\n - Pagination fetch: tiles exist, anchor a small spinner at\n the right edge so the user knows the next page is loading. -->\n <div\n *ngIf=\"currentFolderNode?.childrenLoading\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading subfolders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganised section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganisedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganisedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.ExportCodeModalComponent, selector: "cqa-export-code-modal", inputs: ["isOpen", "cases", "disabled"], outputs: ["closeModal", "export"] }, { type: i5.ColumnVisibilityComponent, selector: "cqa-column-visibility", inputs: ["isStepGroup", "columns", "columnVisibility", "selectedAutoRefreshInterval"], outputs: ["columnVisibilityChange", "autoRefreshChange"] }, { type: i6.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i7.SelectedFiltersComponent, selector: "cqa-selected-filters", inputs: ["filterApplied", "chips", "defaultChips", "defaultChipClass"], outputs: ["removeChip", "clearAll", "onClearAll"] }, { type: i8.DynamicFilterComponent, selector: "cqa-dynamic-filter", inputs: ["config", "model", "showFilterPanel", "buttonLayout"], outputs: ["filtersApplied", "filtersChanged", "resetAction", "onApplyFilterClick", "onResetFilterClick"] }, { type: i9.FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: ["folders", "selectedFolderId", "expandedFolderIds", "unorganisedCount", "allowCreate", "allowRename", "allowDelete", "allowMove", "allowDuplicate", "allowDrop", "showCounts", "collapsed", "labels", "serverSideSearch", "rootTotal", "folderSearchLoading", "rootFoldersLoading"], outputs: ["folderSelected", "folderExpansionToggled", "folderChildrenRequested", "folderLoadMoreRequested", "searchChange", "rootLoadMoreRequested", "folderCreated", "folderCreateRequested", "folderRenamed", "folderDeleted", "folderMoveRequested", "folderDuplicateRequested", "testsDropped", "folderDropped", "collapsedChange"] }, { type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i12.DynamicTableComponent, selector: "app-dynamic-table", inputs: ["data", "columns", "emptyState", "gridTemplateColumns", "screenWidth", "enableSelectAll", "rowSelectable", "enableLocalSort", "isTableLoading", "isTableDataLoading", "cellJsonPathGetter", "onJsonPathCopiedHandler", "enableRowReorder", "reorderHandleTooltip"], outputs: ["sortChange", "rowReorder"] }, { type: i13.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }, { type: i14.PaginationComponent, selector: "cqa-pagination", inputs: ["totalElements", "totalPages", "pageIndex", "pageSize", "pageItemCount", "pageSizeOptions", "pageSizeMenuDirection"], outputs: ["pageIndexChange", "pageSizeChange", "paginate"] }, { type: i15.TableActionToolbarComponent, selector: "cqa-table-action-toolbar", inputs: ["selectedItems", "actions", "showSelectAll", "allSelected", "showDismiss"], outputs: ["actionClick", "selectAllChange", "dismiss"] }], directives: [{ type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i16.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i17.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1384
1496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ModularTableTemplateComponent, decorators: [{
1385
1497
  type: Component,
1386
- args: [{ selector: 'cqa-modular-table-template', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganisedCount]=\"unorganisedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\">\n <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 </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in (even if no subfolders, so the \"+ New folder\" tile remains reachable). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && subfolderTiles.length\"\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 <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 </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganised section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganisedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganisedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", styles: [] }]
1498
+ args: [{ selector: 'cqa-modular-table-template', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder-icon chip. Render via <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>. -->\n<ng-template #folderIconChip let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" [attr.stroke]=\"color || 'currentColor'\" stroke-width=\"0.916667\"/>\n </svg>\n </span>\n</ng-template>\n\n<!-- Reusable \"+\" chip used by the \"New folder\" tile. -->\n<ng-template #addIconChip>\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-10 cqa-h-10 cqa-rounded-lg cqa-bg-[#F0F0F1] cqa-text-[#6D6D74] cqa-shrink-0 group-hover:cqa-bg-indigo-50 group-hover:cqa-text-[#3F43EE]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 3V13M3 8H13\" stroke=\"currentColor\" stroke-width=\"1.275\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<div class=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div [class]=\"!showSearchBar ? 'cqa-justify-end' : 'cqa-justify-between'\" class=\"cqa-w-full cqa-flex cqa-items-center cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showExportButton\"\n variant=\"grey-solid\"\n icon=\"open_in_new\"\n [text]=\"isExporting ? 'Exporting...' : 'Export'\"\n [disabled]=\"isExporting\"\n (clicked)=\"exportCodeClick()\"\n >\n <span>{{ isExporting ? 'Exporting...' : 'Export' }}</span>\n </cqa-button>\n \n <!-- Export Code Modal -->\n <cqa-export-code-modal\n *ngIf=\"showExportButton\"\n [isOpen]=\"isExportModalOpen\"\n [cases]=\"selectedCasesForExport\"\n [disabled]=\"false\"\n (closeModal)=\"closeExportModal()\"\n (export)=\"onExportModalExport($event)\">\n </cqa-export-code-modal>\n <ng-container *ngFor=\"let dropdownTemplate of otherDropDownButtons; trackBy: trackByDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"dropdownTemplate\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let selectDropdownTemplate of otherSelectDropDownButtons; trackBy: trackBySelectDropdownTemplateRef\">\n <ng-container *ngTemplateOutlet=\"selectDropdownTemplate\"></ng-container>\n </ng-container>\n \n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [disabled]=\"isReordering\"\n (clicked)=\"toggleFilter()\"\n >\n <span class=\"cqa-flex cqa-items-center cqa-gap-1\">\n Filter \n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button\n *ngIf=\"showAutoRefreshButton\"\n variant=\"grey-solid\"\n icon=\"refresh\"\n (clicked)=\"handleRefreshClick()\"\n [tooltip]=\"'Refresh'\"\n tooltipPosition=\"below\"\n [disabled]=\"isReordering\"\n ></cqa-button>\n <ng-container *ngFor=\"let buttonTemplate of otherButtons; trackBy: trackByTemplateRef\">\n <ng-container *ngTemplateOutlet=\"buttonTemplate\"></ng-container>\n </ng-container>\n <cqa-segment-control\n *ngIf=\"showViewModeToggle\"\n size=\"lg\"\n [segments]=\"viewModeSegments\"\n [value]=\"viewMode\"\n (valueChange)=\"onViewModeChange($event)\"\n ></cqa-segment-control>\n <cqa-button\n *ngIf=\"showReorderButton && !isReordering\"\n variant=\"outlined\"\n icon=\"drag_indicator\"\n [text]=\"reorderLabels.reorderButton\"\n [disabled]=\"!pagedRows || pagedRows.length === 0 || isTableLoading || isTableDataLoading\"\n (clicked)=\"startReorder()\"\n ></cqa-button>\n <ng-container *ngIf=\"showReorderButton && isReordering\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"reorderLabels.cancelButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"cancelReorder()\"\n ></cqa-button>\n <cqa-button\n variant=\"filled\"\n [icon]=\"reorderSaving ? 'hourglass_empty' : ''\"\n [text]=\"reorderSaving ? reorderLabels.savingButton : reorderLabels.doneButton\"\n [disabled]=\"reorderSaving\"\n (clicked)=\"saveReorder()\"\n ></cqa-button>\n </ng-container>\n </div>\n </div>\n\n <!-- Reorder mode banner -->\n <div *ngIf=\"isReordering\" class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-3 cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-[#FFFBEB] cqa-border cqa-border-[#FDE68A]\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"#92400E\"></circle>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-[#92400E]\">{{ reorderLabels.bannerTitle }}</span>\n <span class=\"cqa-text-sm cqa-text-[#92400E]\">{{ reorderLabels.bannerDescription }}</span>\n </div>\n\n <cqa-selected-filters\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n (onClearAll)=\"onClearAll.emit()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [model]=\"filterModel\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n (onApplyFilterClick)=\"onApplyFilterClick.emit($event)\"\n (onResetFilterClick)=\"handleResetFilterClick()\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-3 cqa-min-h-0 \" style=\"border-bottom: 1px solid rgb(226, 226, 227);\">\n <!-- Sidebar (only shown in modular view) -->\n <cqa-folder-sidebar\n *ngIf=\"isModularView && modularConfig.showSidebar\"\n [folders]=\"folders\"\n [selectedFolderId]=\"selectedFolderId\"\n [expandedFolderIds]=\"expandedFolderIds\"\n [unorganisedCount]=\"unorganisedCount\"\n [allowCreate]=\"modularConfig.allowCreateFolder\"\n [allowRename]=\"modularConfig.allowRenameFolder\"\n [allowDelete]=\"modularConfig.allowDeleteFolder\"\n [allowDrop]=\"modularConfig.allowTestDragDrop\"\n [showCounts]=\"modularConfig.showCounts\"\n [collapsed]=\"sidebarCollapsed\"\n [labels]=\"modularLabels\"\n [serverSideSearch]=\"serverSideSearch\"\n [rootTotal]=\"rootTotal\"\n [folderSearchLoading]=\"folderSearchLoading\"\n [rootFoldersLoading]=\"rootFoldersLoading\"\n (folderSelected)=\"onFolderSelected($event)\"\n (folderExpansionToggled)=\"onFolderExpansionToggled($event)\"\n (folderChildrenRequested)=\"folderChildrenRequested.emit($event)\"\n (folderLoadMoreRequested)=\"folderLoadMoreRequested.emit($event)\"\n (rootLoadMoreRequested)=\"rootLoadMoreRequested.emit()\"\n (searchChange)=\"folderSearchChange.emit($event)\"\n (folderCreated)=\"onFolderCreated($event)\"\n (folderCreateRequested)=\"onFolderCreateRequested($event)\"\n (folderRenamed)=\"onFolderRenamed($event)\"\n (folderDeleted)=\"onFolderDeleted($event)\"\n (folderMoveRequested)=\"onFolderMoveRequested($event)\"\n (folderDuplicateRequested)=\"onFolderDuplicateRequested($event)\"\n (testsDropped)=\"onTestsDropped($event)\"\n (folderDropped)=\"onFolderDropped($event)\"\n (collapsedChange)=\"onSidebarCollapsedChange($event)\"\n ></cqa-folder-sidebar>\n\n <!-- Right pane -->\n <div\n class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-min-w-0\"\n [style.border-top]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-left]=\"isModularView ? '1px solid #E2E2E3' : null\"\n [style.border-right]=\"isModularView ? '1px solid #E2E2E3' : null\"\n >\n <!-- Breadcrumb (modular view, folder drilled-in) -->\n <nav\n *ngIf=\"isModularView && modularConfig.showBreadcrumb && !isRootView\"\n aria-label=\"Folder path\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-sm cqa-px-3 cqa-py-1 cqa-mb-3 cqa-rounded-none\"\n style=\"color: #6D6D74; border-bottom: 1px solid #E2E2E3;\"\n >\n <button type=\"button\" class=\"hover:cqa-text-[#3F43EE] cqa-inline-flex cqa-items-center cqa-gap-1\" (click)=\"onFolderSelected(null)\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"currentColor\" stroke-width=\"0.916667\"/>\n </svg>\n <span>{{ modularLabels.allFolders }}</span>\n </button>\n <ng-container *ngFor=\"let crumb of breadcrumbTrail; let last = last\">\n <mat-icon class=\"cqa-align-middle\" style=\"font-size:16px;width:16px;height:16px;color:#6D6D74;\">chevron_right</mat-icon>\n <button\n type=\"button\"\n [ngClass]=\"last\n ? 'cqa-text-[#161617] cqa-font-semibold'\n : 'cqa-text-[#6D6D74] hover:cqa-text-[#3F43EE]'\"\n [disabled]=\"last\"\n (click)=\"!last && onFolderSelected(crumb.id)\"\n >{{ crumb.name }}</button>\n </ng-container>\n </nav>\n\n <!-- Folder grid: modular + root view -->\n <section\n *ngIf=\"isModularView && isRootView && modularConfig.showFolderGrid && rootFolderTiles.length\"\n class=\"cqa-mb-4 cqa-px-5 cqa-pt-4 cqa-pb-[14px]\"\n style=\"border-bottom: 1px solid #F0F0F1;\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9583 10.4585C12.9583 10.79 12.8266 11.108 12.5921 11.3424C12.3577 11.5768 12.0398 11.7085 11.7083 11.7085H1.70825C1.37673 11.7085 1.05879 11.5768 0.824368 11.3424C0.589948 11.108 0.458252 10.79 0.458252 10.4585V1.7085C0.458252 1.37698 0.589948 1.05903 0.824368 0.824613C1.05879 0.590192 1.37673 0.458496 1.70825 0.458496H4.83325L6.08325 2.3335H11.7083C12.0398 2.3335 12.3577 2.46519 12.5921 2.69961C12.8266 2.93403 12.9583 3.25198 12.9583 3.5835V10.4585Z\" stroke=\"#6D6D74\" stroke-width=\"0.916667\"/>\n </svg>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.organised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ rootFolderTiles.length === 1 ? modularLabels.foldersCountSingular : modularLabels.foldersCountPlural.replace('{n}', '' + rootFolderTiles.length) }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onRootGridScroll($event)\">\n <button\n *ngFor=\"let f of rootFolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}<ng-container *ngIf=\"f.children?.length\"> \u00B7 {{ f.children!.length === 1 ? modularLabels.oneSubfolder : modularLabels.subfoldersCount.replace('{n}', '' + f.children!.length) }}</ng-container>\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: null })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Pagination spinner anchored at the right edge of the Organised\n row. Only renders during an in-flight root fetch (initial OR\n scroll-driven \"load more\"), and is filtered to suppress when\n the section is empty so we don't show a spinner inside an\n otherwise-blank row. -->\n <div\n *ngIf=\"rootFoldersLoading && rootFolderTiles.length > 0\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading more folders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Subfolder section: modular + folder view. Shown whenever drilled in\n (even if no subfolders, so the \"+ New folder\" tile remains\n reachable, and so we can render a loading state during the\n drill-in fetch before children arrive). -->\n <section\n *ngIf=\"isModularView && !isRootView && modularConfig.showSubfolderSection && (subfolderTiles.length || currentFolderNode?.childrenLoading)\"\n class=\"cqa-mb-4 cqa-px-3 cqa-py-1\"\n >\n <div *ngIf=\"subfolderTiles.length || modularConfig.allowCreateFolder\" class=\"cqa-text-sm cqa-text-neutral-600 cqa-mb-2\">\n {{ modularLabels.subfoldersIn }} {{ breadcrumbTrail.length ? breadcrumbTrail[breadcrumbTrail.length - 1].name : '' }}\n </div>\n <div class=\"cqa-flex cqa-flex-nowrap cqa-gap-3 cqa-overflow-x-auto cqa-scrollbar-thin cqa-pb-2\"\n (scroll)=\"onSubfolderGridScroll($event)\">\n <button\n *ngFor=\"let f of subfolderTiles\"\n type=\"button\"\n [cqaFolderDrop]=\"f.id\"\n [dropEnabled]=\"modularConfig.allowTestDragDrop\"\n (testsDropped)=\"onTestsDropped($event)\"\n (click)=\"onFolderSelected(f.id)\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-solid cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-white hover:cqa-border-[#3F43EE] hover:cqa-shadow-sm cqa-transition-colors\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"folderIconChip; context: { color: f.color }\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ f.name }}</span>\n <span *ngIf=\"modularConfig.showCounts\" class=\"cqa-text-sm cqa-text-neutral-500 cqa-truncate\">\n {{ (f.count ?? 0) === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + (f.count ?? 0)) }}\n </span>\n </div>\n </div>\n <mat-icon class=\"cqa-text-neutral-400 cqa-shrink-0\" style=\"font-size:20px;width:20px;height:20px\">chevron_right</mat-icon>\n </button>\n\n <!-- \"+ New folder\" tile -->\n <button\n *ngIf=\"modularConfig.allowCreateFolder\"\n type=\"button\"\n (click)=\"onFolderCreateRequested({ parentId: selectedFolderId })\"\n class=\"cqa-group cqa-shrink-0 cqa-w-[240px] cqa-flex cqa-items-center cqa-gap-3 cqa-text-left cqa-p-3 cqa-rounded-[10px] cqa-border-dashed cqa-border-[0.5px] cqa-border-[#E2E2E3] cqa-bg-[#FAFAFA] hover:cqa-border-[#3F43EE] hover:cqa-bg-white cqa-transition-colors\"\n >\n <ng-container *ngTemplateOutlet=\"addIconChip\"></ng-container>\n <div class=\"cqa-flex cqa-flex-col cqa-min-w-0\">\n <span class=\"cqa-text-[15px] cqa-text-[#161617] cqa-truncate cqa-leading-tight group-hover:cqa-text-[#3F43EE]\">{{ modularLabels.newFolder }}</span>\n <span class=\"cqa-text-sm cqa-text-neutral-400\">{{ modularLabels.testsCountPlural.replace('{n}', '0') }}</span>\n </div>\n </button>\n\n <!-- Subfolder fetch indicator. Two cases:\n - Drill-in fetch: no subfolderTiles yet, render a centered\n row spinner so the section isn't empty during the fetch.\n - Pagination fetch: tiles exist, anchor a small spinner at\n the right edge so the user knows the next page is loading. -->\n <div\n *ngIf=\"currentFolderNode?.childrenLoading\"\n class=\"cqa-shrink-0 cqa-flex cqa-items-center cqa-justify-center cqa-w-[80px]\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'Loading subfolders'\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n </section>\n\n <!-- Folder panel header above the table: \"Hotel Search (3)\" + Clear filter -->\n <div\n *ngIf=\"isModularView && !isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-mb-1 cqa-items-center cqa-justify-between cqa-px-4 cqa-py-3 cqa-rounded-t-lg cqa-bg-indigo-50 cqa-border cqa-border-indigo-100\"\n >\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.9585 10.4585C12.9585 10.79 12.8268 11.108 12.5924 11.3424C12.358 11.5768 12.04 11.7085 11.7085 11.7085H1.7085C1.37698 11.7085 1.05903 11.5768 0.824613 11.3424C0.590192 11.108 0.458496 10.79 0.458496 10.4585V1.7085C0.458496 1.37698 0.590192 1.05903 0.824613 0.824613C1.05903 0.590192 1.37698 0.458496 1.7085 0.458496H4.8335L6.0835 2.3335H11.7085C12.04 2.3335 12.358 2.46519 12.5924 2.69961C12.8268 2.93403 12.9585 3.25198 12.9585 3.5835V10.4585Z\" [attr.stroke]=\"currentFolderNode?.color || '#3F43EE'\" stroke-width=\"0.916667\"/>\n </svg>\n <span class=\"cqa-text-sm cqa-font-semibold cqa-text-indigo-700\">\n {{ currentFolderNode?.name }} ({{ currentFolderDirectCount }})\n </span>\n </div>\n <button\n type=\"button\"\n class=\"cqa-px-3 cqa-py-1 cqa-text-xs cqa-font-medium cqa-text-indigo-700 cqa-bg-white cqa-border cqa-border-indigo-200 cqa-rounded hover:cqa-bg-indigo-50\"\n (click)=\"onFolderSelected(null)\"\n >{{ modularLabels.clearFilter }}</button>\n </div>\n\n <!-- Unorganised section header at root view -->\n <div\n *ngIf=\"isModularView && isRootView && modularConfig.showUnorganisedSection\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-mb-2 cqa-mt-2\" style=\"margin-left: 20px;\"\n >\n <mat-icon class=\"cqa-text-[#6D6D74]\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <h3 class=\"cqa-text-sm cqa-font-semibold cqa-text-[#6D6D74]\">{{ modularLabels.unorganised }}</h3>\n <span class=\"cqa-text-xs cqa-text-[#6D6D74]\">\n {{ unorganisedCount === 1 ? modularLabels.testsCountSingular : modularLabels.testsCountPlural.replace('{n}', '' + unorganisedCount) }}\n </span>\n </div>\n\n <!-- Table -->\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative cqa-overflow-x-auto\"\n [attr.style]=\"pagedRows && pagedRows.length > 0 ? null : 'border-bottom: none !important'\">\n <ng-container *ngIf=\"(isTableLoading || isTableDataLoading) || (!effectiveIsEmptyState && pagedRows && pagedRows.length > 0); else storyEmptyTpl\">\n <app-dynamic-table\n [style.border-bottom]=\"pagedRows && pagedRows.length > 0 ? '1px solid rgb(226, 226, 227)' : null\"\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [rowSelectable]=\"rowSelectable\"\n [enableLocalSort]=\"enableLocalSort && !isReordering\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\"\n [cellJsonPathGetter]=\"cellJsonPathGetter\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [enableRowReorder]=\"isReordering\"\n (rowReorder)=\"onRowReorder($event)\"\n (sortChange)=\"sortChange.emit($event)\">\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"effectiveIsEmptyState\"\n [title]=\"effectiveEmptyStateConfig.title\"\n [description]=\"effectiveEmptyStateConfig.description\"\n [imageUrl]=\"effectiveEmptyStateConfig.imageUrl\"\n [actions]=\"effectiveEmptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n </div>\n\n <cqa-pagination\n [totalElements]=\"serverSidePagination ? totalElements : filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSizeMenuDirection]=\"pageSizeMenuDirection\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n </div>\n </div>\n\n <!-- Reused bulk action toolbar -->\n <div *ngIf=\"anyRowSelected && modularConfig.allowBulkSelection && !isReordering\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\">\n <cqa-table-action-toolbar\n [selectedItems]=\"selectedItems && selectedItems.length > 0 ? selectedItems : currentSelectedItems\"\n [actions]=\"effectiveBulkActions\"\n [showSelectAll]=\"showSelectAllInToolbar\"\n [allSelected]=\"allSelectedInToolbar\"\n [showDismiss]=\"showDismissInToolbar\"\n (actionClick)=\"onBulkAction($event)\"\n (selectAllChange)=\"onBulkSelectAll($event)\"\n (dismiss)=\"onBulkDismiss()\"\n ></cqa-table-action-toolbar>\n </div>\n\n </div>\n</div>\n\n", styles: [] }]
1387
1499
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }]; }, propDecorators: { searchPlaceholder: [{
1388
1500
  type: Input
1389
1501
  }], searchValue: [{
@@ -1512,12 +1624,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1512
1624
  type: Input
1513
1625
  }], sidebarCollapsed: [{
1514
1626
  type: Input
1627
+ }], serverSideSearch: [{
1628
+ type: Input
1629
+ }], rootTotal: [{
1630
+ type: Input
1631
+ }], folderSearchLoading: [{
1632
+ type: Input
1633
+ }], rootFoldersLoading: [{
1634
+ type: Input
1635
+ }], selectedFolderNode: [{
1636
+ type: Input
1637
+ }], selectedFolderTrail: [{
1638
+ type: Input
1515
1639
  }], useInternalDialogs: [{
1516
1640
  type: Input
1517
1641
  }], folderSelected: [{
1518
1642
  type: Output
1519
1643
  }], folderExpansionToggled: [{
1520
1644
  type: Output
1645
+ }], folderChildrenRequested: [{
1646
+ type: Output
1647
+ }], folderLoadMoreRequested: [{
1648
+ type: Output
1649
+ }], rootLoadMoreRequested: [{
1650
+ type: Output
1651
+ }], folderSearchChange: [{
1652
+ type: Output
1521
1653
  }], folderCreated: [{
1522
1654
  type: Output
1523
1655
  }], folderCreateRequested: [{
@@ -1576,4 +1708,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1576
1708
  }], columnVisibility: [{
1577
1709
  type: Input
1578
1710
  }] } });
1579
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxhci10YWJsZS10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBS1osdUJBQXVCLEVBR3ZCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFLbEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQWlCdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3ZGLE1BQU0sT0FBTyw2QkFBNkI7SUFxVXhDLFlBQW9CLEdBQXNCLEVBQVUsYUFBNEI7UUFBNUQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXBVaEYsb0JBQW9CO1FBQ1gsc0JBQWlCLEdBQVcsbUJBQW1CLENBQUM7UUFDaEQsZ0JBQVcsR0FBVyxFQUFFLENB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LGdCQUFnQjtzQkFBeEIsS0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFPRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFRRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsc0JBQXNCO3NCQUEvQixNQUFNO2dCQU1FLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBa0JHLGFBQWE7c0JBQXRCLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQVFHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFPRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFNRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBTUcsUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDNEIsc0JBQXNCO3NCQUF4RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFtR3BCLGdCQUFnQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0ZpbHRlckl0ZW0sIER5bmFtaWNGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9maWx0ZXJzL2R5bmFtaWMtZmlsdGVyL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi90YWJsZS9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENvbHVtblZpc2liaWxpdHlDb25maWcgfSBmcm9tICcuLi8uLi9jb2x1bW4tdmlzaWJpbGl0eS9jb2x1bW4tdmlzaWJpbGl0eS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb24gfSBmcm9tICcuLi8uLi90YWJsZS1hY3Rpb24tdG9vbGJhci90YWJsZS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbmZpZyB9IGZyb20gJy4uLy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRU1QVFlfU1RBVEVfSU1BR0VTIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2ltYWdlcy9pbWFnZS1hc3NldHMuY29uc3RhbnRzJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0NPTkZJRyxcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgREVGQVVMVF9SRU9SREVSX0xBQkVMUyxcbiAgRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgRm9sZGVyQ3JlYXRlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVN0cmF0ZWd5LFxuICBGb2xkZXJEZWxldGVkUGF5bG9hZCxcbiAgRm9sZGVySWRBY2Nlc3NvcixcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkLFxuICBGb2xkZXJNb3ZlZFBheWxvYWQsXG4gIEZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIE1vZHVsYXJDb25maWcsXG4gIE1vZHVsYXJMYWJlbHMsXG4gIFJlb3JkZXJMYWJlbHMsXG4gIFJlb3JkZXJTYXZlUGF5bG9hZCxcbiAgVGVzdHNNb3ZlZFBheWxvYWQsXG4gIEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZCxcbn0gZnJvbSAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5pbXBvcnQgeyBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbmV3LWZvbGRlci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZUZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9kZWxldGUtZm9sZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW9kdWxhci10YWJsZS10ZW1wbGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvLyBTZWFyY2ggYmFyIGlucHV0c1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBjb21wb25lbnRzJztcbiAgQElucHV0KCkgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0V4cG9ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBTZWFyY2ggYmFyIG91dHB1dHNcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBvbkV4cG9ydENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrPzogJ1dFQkRSSVZFUl9JTycgfCAnU0VMRU5JVU1fSkFWQSc7IHNlbGVjdGVkSXRlbXM6IGFueVtdIH0gfCB2b2lkPigpO1xuICAvLyBGaWx0ZXIgb3V0cHV0c1xuICBAT3V0cHV0KCkgb25BcHBseUZpbHRlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblJlc2V0RmlsdGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvbkNsZWFyQWxsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlQ2hpcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIEZpbHRlciBpbnB1dHNcbiAgQElucHV0KCkgZmlsdGVyQ29uZmlnOiBEeW5hbWljRmlsdGVySXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGZpbHRlck1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBPdGhlciBidXR0b25zIGlucHV0IChhcnJheSBvZiBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBPdGhlciBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBkcm9wZG93biBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyRHJvcERvd25CdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIE90aGVyIHNlbGVjdCBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBzZWxlY3QgZHJvcGRvd24gYnV0dG9uIHRlbXBsYXRlcy9jb21wb25lbnRzKVxuICBASW5wdXQoKSBvdGhlclNlbGVjdERyb3BEb3duQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBMZWdhY3kgc2luZ2xlIGJ1dHRvbiBpbnB1dHMgKGRlcHJlY2F0ZWQsIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25MYWJlbDogc3RyaW5nID0gJ090aGVyIEJ1dHRvbic7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25WYXJpYW50OiAnZmlsbGVkJyB8ICdvdXRsaW5lZCcgfCAndGV4dCcgfCAnZWxldmF0ZWQnIHwgJ3RvbmFsJyB8ICdncmV5LXNvbGlkJyA9ICdmaWxsZWQnO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIG90aGVyQnV0dG9ucyBhcnJheSBpbnN0ZWFkICovXG4gIEBJbnB1dCgpIHNob3dPdGhlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBBY3Rpb24gbWVudSBidXR0b24gKHRocmVlLWRvdCBtZW51IGluIHRhYmxlIHJvd3MpXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFNldHRpbmdzIGFuZCByZWZyZXNoIGJ1dHRvbnNcbiAgQElucHV0KCkgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0F1dG9SZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBWaWV3LW1vZGUgdG9nZ2xlIChMaXN0IHwgTW9kdWxhcikuIEhpZGRlbiBieSBkZWZhdWx0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICBASW5wdXQoKSBzaG93Vmlld01vZGVUb2dnbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdmlld01vZGU6ICdsaXN0JyB8ICdtb2R1bGFyJyA9ICdsaXN0JztcbiAgQElucHV0KCkgdmlld01vZGVMYWJlbHM6IHsgbGlzdDogc3RyaW5nOyBtb2R1bGFyOiBzdHJpbmcgfSA9IHsgbGlzdDogJ0xpc3QnLCBtb2R1bGFyOiAnTW9kdWxhcicgfTtcbiAgQE91dHB1dCgpIHZpZXdNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnbGlzdCcgfCAnbW9kdWxhcic+KCk7XG5cbiAgZ2V0IHZpZXdNb2RlU2VnbWVudHMoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5saXN0LCB2YWx1ZTogJ2xpc3QnLCBpY29uOiAndmlld19saXN0JyB9LFxuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5tb2R1bGFyLCB2YWx1ZTogJ21vZHVsYXInLCBpY29uOiAnZm9sZGVyJyB9LFxuICAgIF07XG4gIH1cblxuICBvblZpZXdNb2RlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPT09ICdtb2R1bGFyJyA/ICdtb2R1bGFyJyA6ICdsaXN0JztcbiAgICBpZiAobmV4dCAhPT0gdGhpcy52aWV3TW9kZSkge1xuICAgICAgdGhpcy52aWV3TW9kZSA9IG5leHQ7XG4gICAgICB0aGlzLnZpZXdNb2RlQ2hhbmdlLmVtaXQobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGF0YSBpbnB1dFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuXG4gIC8vIEVtcHR5IHN0YXRlIGlucHV0c1xuICBASW5wdXQoKSBpc0VtcHR5U3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZUNvbmZpZzogRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICB0aXRsZTogJ05vIERhdGEgQXZhaWxhYmxlIFlldCcsXG4gICAgZGVzY3JpcHRpb246ICdSdW4gb3IgdXBsb2FkIHlvdXIgZmlyc3QgdGVzdCB0byBzZWUgeW91ciBhbmFseXRpY3MgYW5kIHRyZW5kcyBoZXJlLiBXYXRjaCB5b3VyIHF1YWxpdHkgbWV0cmljcyBjb21lIHRvIGxpZmUgd2l0aCByZWFsLXRpbWUgaW5zaWdodHMuJyxcbiAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLkRBU0hCT0FSRCxcbiAgICBhY3Rpb25zOiBbeyBsYWJlbDogJ1J1biBUZXN0IFN1aXRlJywgdmFyaWFudDogJ2ZpbGxlZCcgfV0sXG4gIH07XG5cbiAgLy8gQWN0aW9uIGJhciBpbnB1dHNcbiAgQElucHV0KCkgYWN0aW9uczogVGFibGVBY3Rpb25bXSA9IFtcbiAgICB7IFxuICAgICAgaWQ6ICdkZWxldGUnLCBcbiAgICAgIGxhYmVsOiAnRGVsZXRlJywgXG4gICAgICBpY29uOiAnZGVsZXRlJywgXG4gICAgICB0b29sdGlwOiAnRGVsZXRlIHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdlZGl0JywgXG4gICAgICBsYWJlbDogJ0VkaXQnLCBcbiAgICAgIGljb246ICdlZGl0JywgXG4gICAgICB0b29sdGlwOiAnRWRpdCBzZWxlY3RlZCcsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnRWRpdCBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2FkZC10YWcnLCBcbiAgICAgIGxhYmVsOiAnQWRkIFRhZycsIFxuICAgICAgaWNvbjogJ2xvY2FsX29mZmVyJywgXG4gICAgICB0b29sdGlwOiAnQWRkIHRhZ3MnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FkZCB0YWcgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdyZW1vdmUtdGFnJywgXG4gICAgICBsYWJlbDogJ1JlbW92ZSBUYWcnLCBcbiAgICAgIGljb246ICdsYWJlbF9vZmYnLCBcbiAgICAgIHRvb2x0aXA6ICdSZW1vdmUgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICBdO1xuXG4gIC8vIENoaXBzIGlucHV0c1xuICBASW5wdXQoKSBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICBASW5wdXQoKSBmaWx0ZXJBcHBsaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gVGFibGUgaW5wdXRzXG4gIEBJbnB1dCgpIGNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHJvd1NlbGVjdGFibGU/OiAocm93OiBhbnkpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgcGFnZUluZGV4OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbMTAsIDIwLCA0MCwgNjAsIDgwXTtcbiAgQElucHV0KCkgcGFnZVNpemVNZW51RGlyZWN0aW9uOiAnYXV0bycgfCAndXAnIHwgJ2Rvd24nID0gJ2F1dG8nO1xuICAvLyBTZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIGNvbnRyb2xzXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRvdGFsRWxlbWVudHM6IG51bWJlciA9IDA7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0+KCk7XG4gIC8qKlxuICAgKiBXaGVuIGZhbHNlLCBoZWFkZXIgc29ydCBkb2VzIG5vdCByZW9yZGVyIHJvd3MgbG9jYWxseSAodXNlIHdpdGggc2VydmVyU2lkZVBhZ2luYXRpb24gKyBzb3J0Q2hhbmdlKS5cbiAgICogRGVmYXVsdCB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlTG9jYWxTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBmaWVsZElkOiBzdHJpbmc7XG4gICAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbDtcbiAgfT4oKTtcbiAgLy8gTG9hZGVyIGNvbnRyb2xzIChwYXNzZWQgZG93biB0byBkeW5hbWljIHRhYmxlKVxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEJhY2t3YXJkLWNvbXBhdGliaWxpdHkgZmxhZzsgaWYgcHJvdmlkZWQsIGR5bmFtaWMgdGFibGUgd2lsbCB1c2UgaXQgd2hlbiBzcGVjaWZpYyBmbGFncyBhcmUgdW5kZWZpbmVkXG5cbiAgLy8gT3B0aW9uYWwgZ2V0dGVyIGZvciBKU09OIHBhdGggcGVyIGNlbGwuIFdoZW4gcHJvdmlkZWQsIGRvdWJsZS1jbGlja2luZyBhIGNlbGwgY29waWVzIHRoZSBwYXRoLlxuICBASW5wdXQoKSBjZWxsSnNvblBhdGhHZXR0ZXI/OiAocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZywgcm93OiBhbnkpID0+IHN0cmluZztcblxuICAvLyBPcHRpb25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIGEgSlNPTiBwYXRoIGlzIGNvcGllZCBmcm9tIGEgdGFibGUgY2VsbFxuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogc3RyaW5nIH0pID0+IHZvaWQ7XG5cbiAgLy8gU2VsZWN0ZWQgaXRlbXMgKGZ1bGwgb2JqZWN0cykgZm9yIG1haW50YWluaW5nIHNlbGVjdGlvbiBhY3Jvc3MgcGFnaW5hdGlvbiAoc2VydmVyLXNpZGUpXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIFwiU2VsZWN0IGFsbFwiIGFmZm9yZGFuY2UuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqIGZvciBub3cg4oCUIGhvc3Qgb3B0cyBpbi4gTWF0Y2hlcyB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50IHRvIGhpZGUgU2VsZWN0IEFsbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dTZWxlY3RBbGxJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIGRpc21pc3MgKMOXKSBhZmZvcmRhbmNlLiBEZWZhdWx0cyB0byBmYWxzZVxuICAgKiBmb3Igbm93IOKAlCBob3N0IG9wdHMgaW4uIE1hdGNoZXMgdGhlIGN1cnJlbnQgcHJvZHVjdCByZXF1aXJlbWVudCB0byBoaWRlIENhbmNlbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dEaXNtaXNzSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBCb3VuZCB0byB0aGUgdG9vbGJhcidzIFwiU2VsZWN0IGFsbFwiIGNoZWNrYm94IOKAlCBkcml2ZXMgdGhlIGNoZWNrZWQgc3RhdGUuICovXG4gIEBJbnB1dCgpIGFsbFNlbGVjdGVkSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIGNvbHVtbiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgX2NvbHVtblZpc2liaWxpdHk6IENvbHVtblZpc2liaWxpdHlDb25maWcgPSB7fTtcbiAgcHJpdmF0ZSBfY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICBmaWx0ZXJlZFJvd3M6IGFueVtdID0gW107XG4gIHBhZ2VkUm93czogYW55W10gPSBbXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaW5wdXRzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgQElucHV0KCkgZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleHBhbmRlZEZvbGRlcklkczogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgdW5vcmdhbmlzZWRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgZm9sZGVySWRBY2Nlc3NvcjogRm9sZGVySWRBY2Nlc3NvciA9IChyb3c6IGFueSkgPT4gcm93Py5mb2xkZXJJZCA/PyBudWxsO1xuICBASW5wdXQoKSBtb2R1bGFyQ29uZmlnOiBNb2R1bGFyQ29uZmlnID0geyAuLi5ERUZBVUxUX01PRFVMQVJfQ09ORklHIH07XG4gIEBJbnB1dCgpIG1vZHVsYXJMYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgYnVsa0FjdGlvbnM6IFRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgc2lkZWJhckNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCB0aGUgbGlicmFyeSBvcGVucyBpdHMgb3duIE1vdmUgZGlhbG9nIGZvciBjb252ZW5pZW5jZVxuICAgKiBkdXJpbmcgdGVzdGluZy4gSG9zdHMgdGFraW5nIG92ZXIgQVBJICsgVVggc2hvdWxkIHNldCB0aGlzIHRvIGBmYWxzZWAgYW5kXG4gICAqIGxpc3RlbiBvbiBgbW92ZVJlcXVlc3RlZGAgdG8gcmVuZGVyIHRoZWlyIG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHVzZUludGVybmFsRGlhbG9nczogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGb2xkZXIgLyBtb2R1bGFyIG91dHB1dHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBAT3V0cHV0KCkgZm9sZGVyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJFeHBhbnNpb25Ub2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJDcmVhdGVkUGF5bG9hZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgXCIrIE5ldyBmb2xkZXJcIjsgaG9zdCBzaG91bGQgb3BlbiBhIGNyZWF0aW9uIG1vZGFsLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhcmVudElkOiBudW1iZXIgfCBudWxsIH0+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJSZW5hbWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJSZW5hbWVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGZvbGRlciBkZWxldGlvbiB2aWEgdGhlIGludGVybmFsIGRpYWxvZyAob3JcbiAgICogaW1tZWRpYXRlbHksIHdoZW4gYHVzZUludGVybmFsRGlhbG9nc2AgaXMgZmFsc2UgYW5kIHRoZSBob3N0IGRyaXZlcyB0aGUgVVgpLlxuICAgKiBQYXlsb2FkIG5vdyBpbmNsdWRlcyB0aGUgdXNlcidzIGNob3NlbiBgc3RyYXRlZ3lgIGZvciB3aGF0IGhhcHBlbnMgdG8gdGhlXG4gICAqIGZvbGRlcidzIHRlc3QgY2FzZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRGVsZXRlZFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0c01vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0c01vdmVkUGF5bG9hZD4oKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQnVsayBhY3Rpb24gdG9vbGJhciBzdXJmYWNlIOKAlCBuYW1pbmcgbWlycm9ycyBjcWEtdGFibGUtdGVtcGxhdGUgc28gY29uc3VtZXJzXG4gIC8vIGdldCB0aGUgc2FtZSBldmVudHMgZnJvbSBlaXRoZXIgY29tcG9uZW50IChwbHVzIHRoZSBmb2xkZXIgZXZlbnRzIGJlbG93KS5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIEZpcmVzIG9uIHJhdyB0b29sYmFyIGFjdGlvbiBjbGljayDigJQgKmJlZm9yZSogYW55IGludGVybmFsIGRpYWxvZyBvcGVucy4gKi9cbiAgQE91dHB1dCgpIGJ1bGtBY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfT4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBcIlNlbGVjdCBhbGxcIiBpcyB0b2dnbGVkLiAqL1xuICBAT3V0cHV0KCkgYnVsa1NlbGVjdEFsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBkaXNtaXNzICjDlykgaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIGJ1bGtEaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyAqYWZ0ZXIqIHRoZSBsaWJyYXJ5LWludGVybmFsIG1vdmUtdG8tZm9sZGVyIGRpYWxvZyByZXNvbHZlcyB3aXRoIGFcbiAgICogdXNlciBjb25maXJtYXRpb24sIE9SIGltbWVkaWF0ZWx5IGZvciBub24tZGlhbG9nIGJ1bGsgYWN0aW9ucyBzdXBwbGllZCBieVxuICAgKiB0aGUgaG9zdC4gSG9zdHMgd2l0aCB0aGVpciBvd24gVVggc2hvdWxkIGxpc3RlbiBvbiBgYnVsa0FjdGlvbkNsaWNrYCArXG4gICAqIGBtb3ZlUmVxdWVzdGVkYCBhbmQgdHJlYXQgdGhpcyBhcyB0aGUgXCJjb25maXJtZWRcIiBzaWduYWwuXG4gICAqL1xuICBAT3V0cHV0KCkgYnVsa0FjdGlvbkludm9rZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZD4oKTtcblxuICBAT3V0cHV0KCkgc2lkZWJhckNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIHN1cmZhY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogV2hlbiB0cnVlLCByZW5kZXJzIGEgXCJSZW9yZGVyXCIgYnV0dG9uIGluIHRoZSB0b29sYmFyLiBIb3N0LWRyaXZlbi4gKi9cbiAgQElucHV0KCkgc2hvd1Jlb3JkZXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEhvc3QgZmxpcHMgdGhpcyB0cnVlIHdoaWxlIGl0cyBidWxrLXVwZGF0ZSBBUEkgY2FsbCBpcyBpbi1mbGlnaHQuIFRoZVxuICAgKiBjb21wb25lbnQga2VlcHMgdGhlIHJlb3JkZXIgVUkgcGlubmVkIChcIlNhdmluZy4uLlwiKSB3aGlsZSB0cnVlIGFuZCBleGl0c1xuICAgKiByZW9yZGVyIG1vZGUgd2hlbiBpdCBmbGlwcyBiYWNrIHRvIGZhbHNlICh0aGUgXCJmdXR1cmUgQVBJIGNhbGxcIiBob29rKS5cbiAgICovXG4gIEBJbnB1dCgpIHJlb3JkZXJTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFBhcnRpYWwgb3ZlcnJpZGUgZm9yIHRoZSBkZWZhdWx0IHJlb3JkZXIgbGFiZWxzIChcIlJlb3JkZXJcIiwgXCJEb25lXCIsIGV0Yy4pLiAqL1xuICBASW5wdXQoKSBzZXQgcmVvcmRlckxhYmVscyhwYXJ0aWFsOiBQYXJ0aWFsPFJlb3JkZXJMYWJlbHM+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUywgLi4uKHBhcnRpYWwgfHwge30pIH07XG4gIH1cbiAgZ2V0IHJlb3JkZXJMYWJlbHMoKTogUmVvcmRlckxhYmVscyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlb3JkZXJMYWJlbHM7XG4gIH1cbiAgcHJpdmF0ZSBfcmVvcmRlckxhYmVsczogUmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUyB9O1xuXG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIlJlb3JkZXJcIiBhbmQgdGhlIGNvbXBvbmVudCBlbnRlcnMgcmVvcmRlciBtb2RlLiAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJDYW5jZWxcIiDigJQgdGhlIG9yaWdpbmFsIG9yZGVyIGlzIGFscmVhZHkgcmVzdG9yZWQuICovXG4gIEBPdXRwdXQoKSByZW9yZGVyQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJEb25lXCIuIEhvc3Qgc2hvdWxkIHRha2UgYG9yZGVyZWRJdGVtc2AsIGNhbGwgaXRzXG4gICAqIGJ1bGstdXBkYXRlIEFQSSwgcmVmcmVzaCBgW2RhdGFdYCwgYW5kIGZsaXAgYHJlb3JkZXJTYXZpbmdgIGJhY2sgdG8gYGZhbHNlYCDigJRcbiAgICogdGhlIGNvbXBvbmVudCB3aWxsIHRoZW4gZXhpdCByZW9yZGVyIG1vZGUuXG4gICAqXG4gICAqIE5vdGU6IGZvciBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uLCBgb3JkZXJlZEl0ZW1zYCBpcyB0aGUgKmN1cnJlbnQgcGFnZSBzbGljZSosXG4gICAqIG5vdCB0aGUgZnVsbCBkYXRhc2V0IOKAlCBzYW1lIGFzIHRoZSBpbi1tZW1vcnkgdmlldyB0aGUgdXNlciB3YXMgZHJhZ2dpbmcuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFJlb3JkZXJTYXZlUGF5bG9hZD4oKTtcblxuICAvKiogSW50ZXJuYWwg4oCUIHRydWUgd2hpbGUgdGhlIHVzZXIgaXMgaW4gcmVvcmRlciBtb2RlLiAqL1xuICBpc1Jlb3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNuYXBzaG90IG9mIGBwYWdlZFJvd3NgIHRha2VuIG9uIGVudGVyOyB1c2VkIHRvIHJldmVydCBvbiBjYW5jZWwuICovXG4gIHByaXZhdGUgcmVvcmRlclNuYXBzaG90OiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZnQgb2YgdGhlIHJlb3JkZXJlZCByb3dzIChjdXJyZW50IHdvcmtpbmcgc3RhdGUpLiAqL1xuICBwcml2YXRlIHJlb3JkZXJEcmFmdDogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLyoqIEF1dG8tcmVmcmVzaCBpbnRlcnZhbCBjYXB0dXJlZCBvbiBlbnRlciwgc28gd2UgY2FuIHJlc3RvcmUgb24gY2FuY2VsL2RvbmUuICovXG4gIHByaXZhdGUgcmVvcmRlclNhdmVkQXV0b1JlZnJlc2g6IG51bWJlciA9IDA7XG4gIC8qKiBUcnVlIGFmdGVyIERvbmUgaGFzIGJlZW4gY2xpY2tlZCwgYXdhaXRpbmcgdGhlIGhvc3QncyBgcmVvcmRlclNhdmluZ2Ag4oaSIGZhbHNlIGZsaXAuICovXG4gIHByaXZhdGUgcmVvcmRlckF3YWl0aW5nU2F2ZUZsaXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiTW92ZSB0byBmb2xkZXJcIiBidWxrIGFjdGlvbiDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGRpYWxvZyBvcGVucy4gSG9zdHMgdGhhdCB3YW50IHRvIHJlbmRlciB0aGVpciBvd24gbW9kYWwgc2hvdWxkXG4gICAqIHNldCBgdXNlSW50ZXJuYWxEaWFsb2dzID0gZmFsc2VgIGFuZCBsaXN0ZW4gaGVyZS5cbiAgICovXG4gIEBPdXRwdXQoKSBtb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBzZWxlY3RlZDogYW55W107XG4gICAgY3VycmVudEZvbGRlcklkOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbGRlcnM6IEZvbGRlck5vZGVbXTtcbiAgfT4oKTtcblxuICAvKiogRmlyZXMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIGBzZWxlY3RlZEl0ZW1zYCBjaGFuZ2VzIGZyb20gd2l0aGluIChTZWxlY3QgQWxsIC8gRGlzbWlzcykuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBmb2xkZXIncyBkZWxldGUgYWZmb3JkYW5jZSDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGNvbmZpcm1hdGlvbiBkaWFsb2cgb3BlbnMuIEhvc3RzIG93bmluZyB0aGUgVVggbGlzdGVuIGhlcmUuXG4gICAqIFBheWxvYWQgaW5jbHVkZXMgYHRlc3RDb3VudGAgKyBgaGFzUGFyZW50YCBzbyBob3N0cyBjYW4gcmVuZGVyIHRoZSByaWdodFxuICAgKiBvcHRpb25zIGluIHRoZWlyIG93biBtb2RhbC5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEZWxldGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgcGlja3MgXCJNb3ZlIGZvbGRlclwiIGZyb20gYSBmb2xkZXIgcm93J3MgY29udGV4dCBtZW51IOKAlFxuICAgKiAqYmVmb3JlKiBhbnkgZGlhbG9nIG9wZW5zLiBIb3N0cyBvd25pbmcgdGhlIFVYIGxpc3RlbiBoZXJlIHdpdGhcbiAgICogYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgb3BlbiB0aGVpciBvd24gZm9sZGVyIHBpY2tlci5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGEgZm9sZGVyIG1vdmUgdmlhIHRoZSBpbnRlcm5hbCBwaWNrZXJcbiAgICogKG9yIGltbWVkaWF0ZWx5IHdoZW4gYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgdGhlIGhvc3QgZHJpdmVzIGl0KS5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyTW92ZWRQYXlsb2FkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBwaWNrcyBcIkR1cGxpY2F0ZSBmb2xkZXJcIiBmcm9tIGEgZm9sZGVyIHJvdydzIGNvbnRleHQgbWVudS5cbiAgICogVGhlIGxpYnJhcnkgZG9lc24ndCBvd24gcGVyc2lzdGVuY2UsIHNvIHRoZSBob3N0IGlzIGV4cGVjdGVkIHRvIGNsb25lIHRoZVxuICAgKiBmb2xkZXIncyBzdWJ0cmVlIHNlcnZlci1zaWRlIGFuZCAqcmVmZXJlbmNlKiAobm90IGNvcHkpIHRoZSB0ZXN0IGNhc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkUGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge31cbiAgcHJpdmF0ZSBwZW5kaW5nRmlsdGVyczogYW55O1xuICBwcml2YXRlIGFwcGxpZWRGaWx0ZXJzOiBhbnk7XG4gIHByaXZhdGUgYXV0b1JlZnJlc2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25BdXRvUmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uVmlzaWJpbGl0eUNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGF1dG9SZWZyZXNoSW50ZXJ2YWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQFZpZXdDaGlsZChEeW5hbWljRmlsdGVyQ29tcG9uZW50KSBkeW5hbWljRmlsdGVyQ29tcG9uZW50PzogRHluYW1pY0ZpbHRlckNvbXBvbmVudDtcblxuICAvLyBEZXJpdmVkIGNvbHVtbnMgd2l0aCB2aXNpYmlsaXR5IGFwcGxpZWQuXG4gIGNvbXB1dGVkQ29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLy8gQXV0by1nZW5lcmF0ZWQgdmlzaWJpbGl0eSBjb2x1bW5zIGZyb20gY29sdW1ucyBpbnB1dFxuICB2aXNpYmlsaXR5Q29sdW1uczogQXJyYXk8eyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wdXRlZENvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJpbGl0eSA9IHRoaXMuX2NvbHVtblZpc2liaWxpdHkgfHwge307XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5jb2x1bW5zIHx8IFtdO1xuICAgIGNvbnN0IG1hcHBlZCA9IHNvdXJjZS5tYXAoY29sID0+IHtcbiAgICAgIGlmIChbJ2NoZWNrYm94JywgJ2FjdGlvbnMnXS5pbmNsdWRlcyhjb2wuZmllbGRJZCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3cgPSB2aXNpYmlsaXR5W2NvbC5maWVsZElkXTtcbiAgICAgIHJldHVybiB7IC4uLmNvbCwgaXNTaG93OiBzaG93ICE9PSBmYWxzZSB9O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubW9kdWxhckNvbmZpZz8uc2hvd0ZvbGRlckNvbHVtbiAmJiAhbWFwcGVkLnNvbWUoYyA9PiBjLmZpZWxkSWQgPT09IEZPTERFUl9DT0xVTU5fRklFTERfSUQpKSB7XG4gICAgICBjb25zdCBmb2xkZXJTaG93ID0gdmlzaWJpbGl0eVtGT0xERVJfQ09MVU1OX0ZJRUxEX0lEXTtcbiAgICAgIGNvbnN0IGZvbGRlckNvbDogRHluYW1pY1RhYmxlQ29sdW1uID0ge1xuICAgICAgICAuLi50aGlzLmJ1aWxkRm9sZGVyQ29sdW1uKCksXG4gICAgICAgIGlzU2hvdzogZm9sZGVyU2hvdyAhPT0gZmFsc2UsXG4gICAgICB9O1xuICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgdHJhaWxpbmcgJ2FjdGlvbnMnIGNvbHVtbiB3aGVuIHByZXNlbnQgc28gdGhlIGZvbGRlclxuICAgICAgLy8gY29sdW1uIHJlYWRzIGFzIHRoZSBsYXN0IGRhdGEgY29sdW1uIHJhdGhlciB0aGFuIGFmdGVyIHRoZSBhY3Rpb24gbWVudS5cbiAgICAgIGNvbnN0IGFjdGlvbnNJZHggPSBtYXBwZWQuZmluZEluZGV4KGMgPT4gYy5maWVsZElkID09PSAnYWN0aW9ucycpO1xuICAgICAgaWYgKGFjdGlvbnNJZHggPj0gMCkge1xuICAgICAgICBtYXBwZWQuc3BsaWNlKGFjdGlvbnNJZHgsIDAsIGZvbGRlckNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucHVzaChmb2xkZXJDb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcHV0ZWRDb2x1bW5zID0gbWFwcGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvbGRlckNvbHVtbigpOiBEeW5hbWljVGFibGVDb2x1bW4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZElkOiBGT0xERVJfQ09MVU1OX0ZJRUxEX0lELFxuICAgICAgZmllbGROYW1lOiB0aGlzLm1vZHVsYXJMYWJlbHM/LmZvbGRlckNvbHVtbkxhYmVsIHx8ICdGb2xkZXInLFxuICAgICAgLy8gTGV0cyB0aGUgZHluYW1pYyB0YWJsZSBzb3J0L2ZpbHRlciBvbiB0aGUgcmVzb2x2ZWQgbmFtZSB3aXRob3V0IGdvaW5nXG4gICAgICAvLyB0aHJvdWdoIHJlbmRlcigpIOKAlCBhbHNvIG1ha2VzIGByb3cuZm9sZGVyTmFtZWAgYSBmaXJzdC1jbGFzcyBmaWVsZFxuICAgICAgLy8gYWxvbmdzaWRlIHJvdy5wcmlvcml0eSBldGMuIGZvciBkb3duc3RyZWFtIGNvZGUuXG4gICAgICBmaWVsZFZhbHVlOiAnZm9sZGVyTmFtZScsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIC8vIGlzRGVmYXVsdCA9PT0gZmFsc2UgbWFya3MgdGhlIGNvbHVtbiBhcyBcInVzZXItdG9nZ2xlYWJsZVwiIOKAlCBpdCBzaG93cyB1cFxuICAgICAgLy8gaW4gbWFwVmlzaWJpbGl0eUNvbHVtbnMgYW5kIHRoZXJlZm9yZSBpbiB0aGUgc2V0dGluZ3MgZHJvcGRvd24uXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcmVuZGVyOiAocm93OiBhbnkpID0+IHRoaXMucmVuZGVyRm9sZGVyQ2VsbChyb3cpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVGb2xkZXJOYW1lKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBpZiAocm93ICYmIHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIHtcbiAgICAgIHJldHVybiByb3cuZm9sZGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgY29uc3Qgbm9kZSA9IGZvbGRlcklkICE9IG51bGwgPyB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBmb2xkZXJJZCBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4gbm9kZT8ubmFtZSB8fCB0aGlzLm1vZHVsYXJMYWJlbHM/LnVub3JnYW5pc2VkUm93TGFiZWwgfHwgJ1Vub3JnYW5pc2VkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBkZXJpdmVkIGBmb2xkZXJOYW1lYCB0byBlYWNoIHJvdyB3aGVuIHRoZSBob3N0IGhhc24ndCBzdXBwbGllZFxuICAgKiBvbmUuIE11dGF0ZXMgaW4gcGxhY2Ugc28gdGhlIHZhbHVlIGlzIGF2YWlsYWJsZSBldmVyeXdoZXJlIHRoZSByb3cgZmxvd3NcbiAgICog4oCUIHNvcnQsIGZpbHRlciwgY29sdW1uIHJlbmRlcnMsIGV4cG9ydHMg4oCUIGFsb25nc2lkZSBmaWVsZHMgbGlrZSBwcmlvcml0eS5cbiAgICovXG4gIHByaXZhdGUgZW5yaWNoUm93c1dpdGhGb2xkZXJOYW1lKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaWYgKCFyb3cgfHwgdHlwZW9mIHJvdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIGNvbnRpbnVlO1xuICAgICAgcm93LmZvbGRlck5hbWUgPSB0aGlzLnJlc29sdmVGb2xkZXJOYW1lKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJGb2xkZXJDZWxsKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXNvbHZlRm9sZGVyTmFtZShyb3cpO1xuICAgIGNvbnN0IGVzY2FwZWQgPSBuYW1lLnJlcGxhY2UoL1smPD5cIiddL2csIGNoID0+ICh7XG4gICAgICAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsIFwiJ1wiOiAnJiMzOTsnLFxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbY2hdKTtcbiAgICByZXR1cm4gKFxuICAgICAgYDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRleHQtWyM2RDZENzRdXCI+YCArXG4gICAgICAgIGA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5gICtcbiAgICAgICAgICBgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+YCArXG4gICAgICAgIGA8L3N2Zz5gICtcbiAgICAgICAgYDxzcGFuPiR7ZXNjYXBlZH08L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucyA9IHRoaXMubWFwVmlzaWJpbGl0eUNvbHVtbnMoKTtcbiAgICB0aGlzLnZpc2liaWxpdHlDb2x1bW5zID0gdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBDb250cm9sbGVkIGNvbHVtbiB2aXNpYmlsaXR5OiBwYXJlbnQgY2FuIHNlZWQgYW5kIHB1c2ggdXBkYXRlcy5cbiAgQElucHV0KCkgc2V0IGNvbHVtblZpc2liaWxpdHkoY2ZnOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNmZykge1xuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eSA9IHsgLi4uY2ZnIH07XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGdldCBjb2x1bW5WaXNpYmlsaXR5KCk6IENvbHVtblZpc2liaWxpdHlDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5O1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snaXNFbXB0eVN0YXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ21vZHVsYXJDb25maWcnXSB8fCBjaGFuZ2VzWydtb2R1bGFyTGFiZWxzJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb2xkZXJzJ10gJiYgIWNoYW5nZXNbJ2ZvbGRlcnMnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gRm9sZGVyIG5hbWUgbG9va3VwIGxpdmVzIGluc2lkZSB0aGUgY29sdW1uJ3MgcmVuZGVyKCk7IHJlYnVpbGQgdGhlXG4gICAgICAvLyBjb2x1bW5zIGFycmF5IHNvIHRoZSBkeW5hbWljIHRhYmxlJ3MgT25QdXNoIENEIHBpY2tzIHVwIHRoZSBuZXcgcmVmXG4gICAgICAvLyBhbmQgcmUtaW52b2tlcyByZW5kZXIoKSB3aXRoIHRoZSBsYXRlc3QgZm9sZGVycy4gQWxzbyByZWZyZXNoIGFueVxuICAgICAgLy8gcm93cyB3ZSd2ZSBwcmV2aW91c2x5IGVucmljaGVkIHNvIHNvcnQvZmlsdGVyIG9uIHJvdy5mb2xkZXJOYW1lXG4gICAgICAvLyByZWZsZWN0cyB0aGUgbmV3IGZvbGRlciBsaXN0LlxuICAgICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEZvbGRlcklkJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkRm9sZGVySWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gUGVyIHRoZSBhcHByb3ZlZCBwbGFuOiBjbGVhciBzZWxlY3Rpb24gYW5kIHJlc2V0IHBhZ2luYXRpb24gb24gZm9sZGVyIGNoYW5nZS5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmlld01vZGUnXSAmJiAhY2hhbmdlc1sndmlld01vZGUnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gU3dpdGNoaW5nIGJldHdlZW4gbGlzdCBhbmQgbW9kdWxhciBjaGFuZ2VzIHdoZXRoZXIgdGhlIGZvbGRlciBmaWx0ZXIgYXBwbGllcy5cbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlbXMnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10gJiYgIWNoYW5nZXNbJ3Jlb3JkZXJTYXZpbmcnXS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgbm93U2F2aW5nID0gISFjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSG9zdCBmaW5pc2hlZCBpdHMgYnVsay11cGRhdGUgY2FsbCDigJQgZXhpdCByZW9yZGVyIG1vZGUuXG4gICAgICBpZiAoIW5vd1NhdmluZyAmJiB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwKSB7XG4gICAgICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcblxuICAgIC8vIEluIHNlcnZlci1zaWRlIG1vZGUsIGFzc3VtZSBpbmNvbWluZyBkYXRhIGlzIGFscmVhZHkgYSBwYWdlIHNsaWNlXG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLmZpbHRlcmVkUm93c107XG4gICAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5WaXNpYmlsaXR5KCk7XG4gICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBgZmlsdGVyZWRSb3dzYCBmcm9tIGBkYXRhYCBieSBhcHBseWluZyAoYSkgdGhlIGZpZWxkIGZpbHRlcnMgKHN0YXR1cy9wcmlvcml0eS9ldGMuKVxuICAgKiBhbmQgKGIpIHRoZSBmb2xkZXIgZmlsdGVyIGRlcml2ZWQgZnJvbSBgc2VsZWN0ZWRGb2xkZXJJZGAgKyBgZm9sZGVySWRBY2Nlc3NvcmAuXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRGaWx0ZXJlZFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gdGhpcy5hcHBsaWVkRmlsdGVycyA/PyB7fTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZGF0YS5maWx0ZXIociA9PiB0aGlzLnBhc3NGaWx0ZXJzKGVmZmVjdGl2ZSwgcikgJiYgdGhpcy5wYXNzRm9sZGVyKHIpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFzc0ZvbGRlcihyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIExpc3QgdmlldyBpZ25vcmVzIGZvbGRlciBmaWx0ZXJpbmcgZW50aXJlbHkg4oCUIGJlaGF2ZXMgbGlrZSB0aGUgdHJhZGl0aW9uYWwgZmxhdCB0YWJsZS5cbiAgICBpZiAoIXRoaXMuaXNNb2R1bGFyVmlldykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgLy8gUm9vdCB2aWV3OiBzaG93IG9ubHkgcm93cyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gYW55IGZvbGRlciAodGhlIFwiVW5vcmdhbmlzZWRcIiBidWNrZXQpLlxuICAgIC8vIEZvbGRlciB0aWxlcyBhYm92ZSB0aGUgdGFibGUgYXJlIHRoZSBlbnRyeSBwb2ludCB0byBwZXItZm9sZGVyIGNvbnRlbnRzLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvbGRlcklkID09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmb2xkZXJJZCAhPSBudWxsICYmIFN0cmluZyhmb2xkZXJJZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIG1vZHVsYXIgKGZvbGRlci1hd2FyZSkgVUkuICovXG4gIGdldCBpc01vZHVsYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdNb2RlID09PSAnbW9kdWxhcic7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIElEcyBmcm9tIHNlbGVjdGVkSXRlbXMgKG9iamVjdHMpXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzKCk6IFNldDxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gTnVtYmVyKGl0ZW0uaWQpKS5maWx0ZXIoaWQgPT4gIWlzTmFOKGlkKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHNTZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gSWYgbm8gc2VsZWN0ZWQgSURzLCBjbGVhciBhbGwgc2VsZWN0aW9uIHN0YXRlc1xuICAgICAgaWYgKHRoaXMucGFnZWRSb3dzKSB7XG4gICAgICAgIHRoaXMucGFnZWRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gc3RhdGUgYmFzZWQgb24gc2VsZWN0ZWRJdGVtc1xuICAgIGlmICh0aGlzLnBhZ2VkUm93cykge1xuICAgICAgdGhpcy5wYWdlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93ICYmIHJvdy5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHJvdyBhcyBhbnkpLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZElkc1NldC5oYXMoTnVtYmVyKHJvdy5pZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBmaWx0ZXJlZFJvd3MgZm9yIGNvbnNpc3RlbmN5XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGlmIChyb3cgJiYgcm93LmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IHNlbGVjdGVkSWRzU2V0LmhhcyhOdW1iZXIocm93LmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBDYWNoZSB2aXNpYmlsaXR5IGNvbHVtbnMgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IGFycmF5cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnMgPSB0aGlzLm1hcFZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgLy8gU2VlZCB2aXNpYmlsaXR5IHN0YXRlIGZyb20gZWFjaCBjb2x1bW4ncyBpc1Nob3cgKGRlZmF1bHQgdG8gdHJ1ZSkgc28gY29uc3VtZXJzXG4gICAgLy8gY2FuIHByZS1hcHBseSBwZXJzaXN0ZWQgcHJlZmVyZW5jZXMgdmlhIGNvbHVtbnNbaV0uaXNTaG93LlxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucykge1xuICAgICAgaWYgKHRoaXMuX2NvbHVtblZpc2liaWxpdHlbY29sLmlkXSAhPT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHNyY0NvbCA9IHNvdXJjZS5maW5kKGMgPT4gYy5maWVsZElkID09PSBjb2wuaWQpO1xuICAgICAgaWYgKHNyY0NvbCkge1xuICAgICAgICAvLyBIb3N0LXN1cHBsaWVkIGNvbHVtbiDigJQgaG9ub3VyIGl0cyBpc1Nob3cgZXhhY3RseSwgaW5jbHVkaW5nIGZvciB0aGVcbiAgICAgICAgLy8gZm9sZGVyIGNvbHVtbi4gSG9zdHMgd2FudGluZyB2aWV3LW1vZGUtYXdhcmUgZGVmYXVsdHMgc2hvdWxkIHNldFxuICAgICAgICAvLyBpc1Nob3cgdGhlbXNlbHZlcy5cbiAgICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gc3JjQ29sLmlzU2hvdyAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkge1xuICAgICAgICAvLyBBdXRvLWluamVjdGVkIGZvbGRlciBjb2x1bW4gKGhvc3QgZGlkIG5vdCBzdXBwbHkgb25lKTogZGVmYXVsdCB0b1xuICAgICAgICAvLyB2aXNpYmxlIGluIGxpc3QgdmlldywgaGlkZGVuIGluIG1vZHVsYXIgdmlldy4gVGhlIHVzZXIncyB0b2dnbGVcbiAgICAgICAgLy8gcGVyc2lzdHMgYWNyb3NzIHZpZXdNb2RlIGZsaXBzIG9uY2Ugc2VlZGVkLlxuICAgICAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5W2NvbC5pZF0gPSB0aGlzLnZpZXdNb2RlID09PSAnbGlzdCc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgYW55Um93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzZWxlY3RlZCBpdGVtcyAoZWl0aGVyIG9uIGN1cnJlbnQgcGFnZSBvciBhY3Jvc3MgYWxsIHBhZ2VzIHZpYSBzZWxlY3RlZEl0ZW1zKVxuICAgIGNvbnN0IGhhc1NlbGVjdGVkT25QYWdlID0gISEodGhpcy5wYWdlZFJvd3MgJiYgdGhpcy5wYWdlZFJvd3Muc29tZShyID0+ICEhKHIgYXMgYW55KS5pc1NlbGVjdGVkKSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0ZWRBY3Jvc3NQYWdlcyA9IHNlbGVjdGVkSWRzU2V0LnNpemUgPiAwO1xuICAgIHJldHVybiBoYXNTZWxlY3RlZE9uUGFnZSB8fCBoYXNTZWxlY3RlZEFjcm9zc1BhZ2VzO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3RlZEl0ZW1zKCk6IGFueVtdIHtcbiAgICAvLyBJZiBzZWxlY3RlZEl0ZW1zIChmdWxsIG9iamVjdHMpIGFyZSBwcm92aWRlZCwgdXNlIHRoZW0gZGlyZWN0bHlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIHNlbGVjdGVkIGl0ZW1zIGFyZSByZXR1cm5lZCwgaW5jbHVkaW5nIHRob3NlIGZyb20gb3RoZXIgcGFnZXNcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogRm9yIGNsaWVudC1zaWRlIHBhZ2luYXRpb24gb3Igd2hlbiBzZWxlY3RlZEl0ZW1zIGlzIG5vdCBwcm92aWRlZCxcbiAgICAvLyBmaWx0ZXIgcGFnZWRSb3dzIHRvIGdldCBzZWxlY3RlZCBpdGVtcyBmcm9tIGN1cnJlbnQgcGFnZSBvbmx5XG4gICAgaWYgKCF0aGlzLnBhZ2VkUm93cyB8fCB0aGlzLnBhZ2VkUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZElkc1NldCA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKTtcbiAgICBcbiAgICAvLyBGaWx0ZXIgcm93cyB0aGF0IGFyZSBzZWxlY3RlZFxuICAgIHJldHVybiB0aGlzLnBhZ2VkUm93c1xuICAgICAgLmZpbHRlcihyID0+IHtcbiAgICAgICAgaWYgKCFyIHx8IHIuaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByb3dJZCA9IE51bWJlcihyLmlkKTtcbiAgICAgICAgLy8gSW5jbHVkZSBpZiBlaXRoZXI6XG4gICAgICAgIC8vIDEuIFRoZSByb3cgaGFzIGlzU2VsZWN0ZWQgPSB0cnVlIChjdXJyZW50IHBhZ2Ugc2VsZWN0aW9uKVxuICAgICAgICAvLyAyLiBUaGUgcm93J3MgSUQgaXMgaW4gc2VsZWN0ZWRJdGVtcyAoc2VsZWN0ZWQgb24gb3RoZXIgcGFnZXMgb3IgcmVzdG9yZWQgc2VsZWN0aW9uKVxuICAgICAgICByZXR1cm4gISEociBhcyBhbnkpLmlzU2VsZWN0ZWQgfHwgc2VsZWN0ZWRJZHNTZXQuaGFzKHJvd0lkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWN0aW9uQ2xpY2soZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2FjdGlvbiB0b29sYmFyJywgZGF0YSk7XG4gIH1cblxuICB2aWV3KGlkOiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnVmlldycsIGlkKTtcbiAgfVxuXG4gIGVkaXQocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRWRpdCcsIHJvdyk7XG4gIH1cblxuICBkZWxldGUocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlJywgcm93KTtcbiAgfVxuXG4gIHRvZ2dsZUZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dGaWx0ZXJQYW5lbCA9ICF0aGlzLnNob3dGaWx0ZXJQYW5lbDtcbiAgfVxuXG4gIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjZmc6IENvbHVtblZpc2liaWxpdHlDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5ID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KHsgLi4uY2ZnIH0pO1xuICB9XG5cbiAgb25BdXRvUmVmcmVzaENoYW5nZShpbnRlcnZhbE1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbCA9IGludGVydmFsTXM7XG4gICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKGludGVydmFsTXMpO1xuICAgIHRoaXMuYXV0b1JlZnJlc2hJbnRlcnZhbENoYW5nZS5lbWl0KGludGVydmFsTXMpO1xuICAgIHRoaXMudHJpZ2dlclJlbG9hZCgpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWYWx1ZSBjaGFuZ2VkJywgdmFsdWUpO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBzZWFyY2godmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWFyY2gnLCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhcmVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDbGVhcmVkJyk7XG4gIH1cblxuICBvbkVtcHR5QWN0aW9uKGFjdGlvbjogYW55KSB7XG4gICAgaWYgKGFjdGlvbj8ubGFiZWwgPT09ICdTaG93IGZpbHRlcnMnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyc0NoYW5nZWQoY3VycmVudDogYW55KTogdm9pZCB7XG4gICAgLy8gRGVmZXIgYXBwbHlpbmcgZmlsdGVycyBhbmQgdXBkYXRpbmcgY2hpcHMgdW50aWwgQXBwbHkgRmlsdGVyIGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gY3VycmVudDtcbiAgfVxuXG4gIG9uRmlsdGVyc0FwcGxpZWQoYXBwbGllZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmlsdGVyUGFuZWwgPSBmYWxzZTtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBhcHBsaWVkID8/IHRoaXMucGVuZGluZ0ZpbHRlcnMgPz8ge307XG4gICAgdGhpcy5hcHBsaWVkRmlsdGVycyA9IGVmZmVjdGl2ZTtcbiAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICBjb25zdCBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICAgIGlmIChlZmZlY3RpdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVmZmVjdGl2ZSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlZmZlY3RpdmVba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlciBjb25maWcgaXRlbSBmb3IgdGhpcyBrZXlcbiAgICAgICAgY29uc3QgZmlsdGVyQ29uZmlnSXRlbSA9IHRoaXMuZmlsdGVyQ29uZmlnPy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWx0ZXJDb25maWdJdGVtPy5vcHRpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgZGlzcGxheSB0ZXh0IGZyb20gb3B0aW9uc1xuICAgICAgICBjb25zdCBnZXREaXNwbGF5VGV4dCA9ICh2YWw6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgLy8gSWYgdmFsdWUgaXMgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCBuYW1lL2xhYmVsLCB1c2UgaXRcbiAgICAgICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICh2YWwubmFtZSB8fCB2YWwubGFiZWwgfHwgdmFsLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5uYW1lID8/IHZhbC5sYWJlbCA/PyBTdHJpbmcodmFsLnZhbHVlID8/IHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG9wdGlvbiBpbiB0aGUgY29uZmlnXG4gICAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0SWQgPSBvcHQuaWQgPz8gb3B0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgb3B0VmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB2YWxTdHIgPSBTdHJpbmcodmFsKTtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcob3B0SWQpID09PSB2YWxTdHIgfHwgU3RyaW5nKG9wdFZhbHVlKSA9PT0gdmFsU3RyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24ubmFtZSA/PyBvcHRpb24ubGFiZWwgPz8gU3RyaW5nKG9wdGlvbi52YWx1ZSA/PyB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB0aGUgcmF3IHZhbHVlXG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgICAgbGV0IGxhYmVsID0gZmlsdGVyQ29uZmlnSXRlbT8ubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0ZXh0ID0gdmFsdWUubWFwKCh2OiBhbnkpID0+IGdldERpc3BsYXlUZXh0KHYpKS5qb2luKCcsICcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBpZiAoJ3N0YXJ0JyBpbiB2YWx1ZSB8fCAnZW5kJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHZhbHVlLnN0YXJ0ID8gbmV3IERhdGUodmFsdWUuc3RhcnQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBlID0gdmFsdWUuZW5kID8gbmV3IERhdGUodmFsdWUuZW5kKS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgdGV4dCA9IFtzLCBlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpcHMucHVzaCh7IGtleSwgbGFiZWwsIHRleHQsIGZ1bGxUZXh0OiB0ZXh0LCBoYXNNb3JlOiB0ZXh0Lmxlbmd0aCA+IDMwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoaXBzID0gY2hpcHM7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaGFuZGxlUmVzZXRGaWx0ZXJDbGljaygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBjaGlwcyBhbmQgcmVzZXQgZmlsdGVyZWQgZGF0YSB3aGVuIHJlc2V0IGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbGllZEZpbHRlcnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMub25SZXNldEZpbHRlckNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZVJlZnJlc2hDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9uQXV0b1JlZnJlc2hDbGljay5lbWl0KCk7XG4gICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5vblJlbG9hZC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQXV0b1JlZnJlc2goaW50ZXJ2YWxNczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckF1dG9SZWZyZXNoKCk7XG4gICAgaWYgKGludGVydmFsTXMgJiYgaW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gICAgICB9LCBpbnRlcnZhbE1zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQXV0b1JlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b1JlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZWZyZXNoVGltZXIpO1xuICAgICAgdGhpcy5hdXRvUmVmcmVzaFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBdXRvUmVmcmVzaCgpO1xuICB9XG5cbiAgb25QYWdpbmF0ZShlOiB7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGUucGFnZUluZGV4O1xuICAgIHRoaXMucGFnZVNpemUgPSBlLnBhZ2VTaXplO1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHsgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gIH1cblxuICBvblJlbW92ZUNoaXAoY2hpcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IHRoaXMuY2hpcHMuZmlsdGVyKGMgPT4gYyAhPT0gY2hpcCk7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IGNvbXBvbmVudCAoc2FtZSBwYXR0ZXJuIGFzIGV4ZWN1dGlvbiB0YWIpXG4gICAgdGhpcy5yZW1vdmVDaGlwLmVtaXQoY2hpcCk7XG4gIH1cblxuICBvbkNsZWFyQWxsQ2hpcHMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHRoZSBkeW5hbWljLWZpbHRlciBjb21wb25lbnQgZm9ybSB3aGVuIGNsZWFyaW5nIGFsbCBjaGlwc1xuICAgIGlmICh0aGlzLmR5bmFtaWNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0ZpbHRlckNvbXBvbmVudC5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICAvLyBTZXJ2ZXIgbW9kZTogcGFyZW50IHN1cHBsaWVzIGFscmVhZHktcGFnaW5hdGVkIGRhdGFcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gWy4uLnRoaXMuZmlsdGVyZWRSb3dzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucGFnZWRSb3dzID0gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcFZpc2liaWxpdHlDb2x1bW5zKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgaXRlbXMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKVxuICAgICAgLmZpbHRlcihjID0+IGMuaXNEZWZhdWx0ID09PSBmYWxzZSlcbiAgICAgIC5tYXAoYyA9PiAoeyBpZDogYy5maWVsZElkLCBsYWJlbDogYy5maWVsZE5hbWUgfHwgYy5maWVsZElkIH0pKTtcbiAgICBpZiAodGhpcy5tb2R1bGFyQ29uZmlnPy5zaG93Rm9sZGVyQ29sdW1uICYmICFpdGVtcy5zb21lKGkgPT4gaS5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkpIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBpZDogRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscz8uZm9sZGVyQ29sdW1uTGFiZWwgfHwgJ0ZvbGRlcicsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IGFueSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdHMgPSBEYXRlLnBhcnNlKGQpO1xuICAgIHJldHVybiBpc05hTih0cykgPyBudWxsIDogdHM7XG4gIH1cblxuICBwcml2YXRlIHBhc3NGaWx0ZXJzKGZpbHRlcnM6IGFueSwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybiB0cnVlO1xuICAgIGlmIChmaWx0ZXJzLnN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGZpbHRlcnMuc3RhdHVzKSAmJiBmaWx0ZXJzLnN0YXR1cy5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy5zdGF0dXMuaW5jbHVkZXMocm93LnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMucHJpb3JpdHkgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXJzLnByaW9yaXR5KSAmJiBmaWx0ZXJzLnByaW9yaXR5Lmxlbmd0aCkge1xuICAgICAgaWYgKCFmaWx0ZXJzLnByaW9yaXR5LmluY2x1ZGVzKHJvdy5wcmlvcml0eU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnRlc3RUeXBlICYmIEFycmF5LmlzQXJyYXkoZmlsdGVycy50ZXN0VHlwZSkgJiYgZmlsdGVycy50ZXN0VHlwZS5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy50ZXN0VHlwZS5pbmNsdWRlcyhyb3cudGVzdFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLmNyZWF0ZWRfZGF0ZSAmJiAoZmlsdGVycy5jcmVhdGVkX2RhdGUuc3RhcnQgfHwgZmlsdGVycy5jcmVhdGVkX2RhdGUuZW5kKSkge1xuICAgICAgY29uc3Qgc3RhcnRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5zdGFydCk7XG4gICAgICBjb25zdCBlbmRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5lbmQpO1xuICAgICAgY29uc3Qgcm93VHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUocm93LmNyZWF0ZWRBdCk7XG4gICAgICBpZiAocm93VHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsICYmIHJvd1RzIDwgc3RhcnRUcykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZW5kVHMgIT0gbnVsbCAmJiByb3dUcyA+IGVuZFRzKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJhY2tCeVRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlEcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlTZWxlY3REcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIEV4cG9ydCBtb2RhbCBzdGF0ZVxuICBpc0V4cG9ydE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGV4cG9ydENvZGVDbGljaygpOiB2b2lkIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgaXRlbXNcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtcztcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZFxuICAgICAgdGhpcy5vbkV4cG9ydENsaWNrLmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZUV4cG9ydE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIG9uRXhwb3J0TW9kYWxFeHBvcnQocmVzdWx0OiB7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrOiAnV0VCRFJJVkVSX0lPJyB8ICdTRUxFTklVTV9KQVZBJyB9KTogdm9pZCB7XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHdpdGggZXhwb3J0IHJlc3VsdFxuICAgIHRoaXMub25FeHBvcnRDbGljay5lbWl0KHtcbiAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgZW1haWxzOiByZXN1bHQuZW1haWxzLFxuICAgICAgZnJhbWV3b3JrOiByZXN1bHQuZnJhbWV3b3JrLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQ2FzZXNGb3JFeHBvcnQoKTogQXJyYXk8eyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgbmFtZTogaXRlbS5uYW1lIHx8IGl0ZW0udGl0bGUgfHwgJ1VubmFtZWQnXG4gICAgfSkpO1xuICB9XG4gIGdldCBhcnJvd0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdjcWEtdy00JyxcbiAgICAgICdjcWEtaC00JyxcbiAgICAgICdjcWEtcmVsYXRpdmUnLFxuICAgICAgJ2NxYS10cmFuc2l0aW9uLXRyYW5zZm9ybSdcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuc2hvd0ZpbHRlclBhbmVsKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjcWEtcm90YXRlLTE4MCcpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlQ2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaGVscGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZsYXQgbGlzdCBvZiByb290LWxldmVsIGZvbGRlcnMgZm9yIHRoZSBcIk9yZ2FuaXNlZFwiIGdyaWQgb24gdGhlIHJvb3Qgdmlldy5cbiAgICovXG4gIGdldCByb290Rm9sZGVyVGlsZXMoKTogRm9sZGVyTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5mb2xkZXJzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmZvbGRlcnMgb2YgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgKGZvciB0aGUgXCJTdWJmb2xkZXJzIGluIC4uLlwiIGdyaWQpLlxuICAgKi9cbiAgZ2V0IHN1YmZvbGRlclRpbGVzKCk6IEZvbGRlck5vZGVbXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gW107XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCk7XG4gICAgcmV0dXJuIG5vZGU/LmNoaWxkcmVuID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyZWFkY3J1bWIgdHJhaWwgZnJvbSBcIkFsbCBmb2xkZXJzXCIgZG93biB0byB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlci5cbiAgICovXG4gIGdldCBicmVhZGNydW1iVHJhaWwoKTogRm9sZGVyTm9kZVtdIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiBbXTtcbiAgICBjb25zdCB0cmFpbDogRm9sZGVyTm9kZVtdID0gW107XG4gICAgdGhpcy5idWlsZFRyYWlsKHRoaXMuZm9sZGVycywgdGhpcy5zZWxlY3RlZEZvbGRlcklkLCB0cmFpbCk7XG4gICAgcmV0dXJuIHRyYWlsO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRyYWlsKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIsIGFjYzogRm9sZGVyTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICBhY2MucHVzaChuKTtcbiAgICAgIC8vIFVzZSBTdHJpbmcoKSBjb2VyY2lvbiBmb3Igc2FmZXR5IGluIGNhc2UgaWRzIGFycml2ZSBhcyBlaXRoZXIgbnVtYmVyIG9yXG4gICAgICAvLyBzdHJpbmcgZnJvbSBkaWZmZXJlbnQgQVBJL3Rlc3QgZGF0YSBzaGFwZXMgKGUuZy4gcmF3IEpTT04gcGFyc2UgcmVzdWx0cykuXG4gICAgICBpZiAoU3RyaW5nKG4uaWQpID09PSBTdHJpbmcodGFyZ2V0SWQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIHRoaXMuYnVpbGRUcmFpbChuLmNoaWxkcmVuLCB0YXJnZXRJZCwgYWNjKSkgcmV0dXJuIHRydWU7XG4gICAgICBhY2MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEZvbGRlcihub2RlczogRm9sZGVyTm9kZVtdLCB0YXJnZXRJZDogbnVtYmVyKTogRm9sZGVyTm9kZSB8IG51bGwge1xuICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgaWYgKFN0cmluZyhuLmlkKSA9PT0gU3RyaW5nKHRhcmdldElkKSkgcmV0dXJuIG47XG4gICAgICBjb25zdCBmb3VuZCA9IG4uY2hpbGRyZW4gPyB0aGlzLmZpbmRGb2xkZXIobi5jaGlsZHJlbiwgdGFyZ2V0SWQpIDogbnVsbDtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gXCJyb290XCIgdmlldyAobm8gZm9sZGVyIHNlbGVjdGVkKS4gQ29udHJvbHMgd2hpY2hcbiAgICogc2VjdGlvbnMgcmVuZGVyIG9uIHRoZSByaWdodC1oYW5kIHBhbmUuXG4gICAqL1xuICBnZXQgaXNSb290VmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGw7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgbm9kZSAob3IgbnVsbCBhdCByb290KS4gKi9cbiAgZ2V0IGN1cnJlbnRGb2xkZXJOb2RlKCk6IEZvbGRlck5vZGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCB0aGlzLnNlbGVjdGVkRm9sZGVySWQpO1xuICB9XG5cbiAgLyoqIENvdW50IG9mIHRlc3QgY2FzZXMgZGlyZWN0bHkgdW5kZXIgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgKGV4Y2x1ZGluZyBkZXNjZW5kYW50cykuXG4gICAqICBSZWFkcyBgRm9sZGVyTm9kZS5jb3VudGAgc28gdGhlIGhlYWRlciBiYWRnZSBtYXRjaGVzIHRoZSBzaWRlYmFyIHJvdyBjb3VudFxuICAgKiAgKGZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIHJlbmRlcnMgdGhlIHNhbWUgYHJvdy5ub2RlLmNvdW50YCkuIFVzaW5nXG4gICAqICBgZmlsdGVyZWRSb3dzLmxlbmd0aGAgaGVyZSB3b3VsZCBvbmx5IHJlZmxlY3QgdGhlIGN1cnJlbnRseS1yZW5kZXJlZCBwYWdlLiAqL1xuICBnZXQgY3VycmVudEZvbGRlckRpcmVjdENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Rm9sZGVyTm9kZT8uY291bnQgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBlbXB0eS1zdGF0ZSBzbG90IHdoZW4gdGhlIGhvc3QgZXhwbGljaXRseSBvcHRzIGluLCBPUiB3aGVuIHRoZVxuICAgKiB0YWJsZSB3b3VsZCBvdGhlcndpc2UgcmVuZGVyIGJsYW5rIChubyBsb2FkaW5nICsgbm8gcm93cykuIFVzaW5nIGEgZGVyaXZlZFxuICAgKiBmbGFnIGtlZXBzIHRoZSBob3N0IGNvbnRyYWN0IGlkZW50aWNhbCB0byBgY3FhLXRhYmxlLXRlbXBsYXRlYCB3aGlsZSBsZXR0aW5nXG4gICAqIHRoZSBtb2R1bGFyIHZpZXcgc2hvdyBcIk5vIFRlc3QgQ2FzZSBGb3VuZFwiIG91dCBvZiB0aGUgYm94IOKAlCB0aGUgZWFybGllciBhc2suXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlSXNFbXB0eVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuaXNUYWJsZUxvYWRpbmcgfHwgdGhpcy5pc1RhYmxlRGF0YUxvYWRpbmcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMucGFnZWRSb3dzIHx8IHRoaXMucGFnZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaG9zdC1wcm92aWRlZCBgZW1wdHlTdGF0ZUNvbmZpZ2Agd2hlbiB0aGUgaG9zdCBmbGFnZ2VkIHRoZSBzdGF0ZVxuICAgKiBpdHNlbGY7IG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIGEgbGlicmFyeS1vd25lZCBcIk5vIFRlc3QgQ2FzZSBGb3VuZFwiIGNvbmZpZ1xuICAgKiBkcml2ZW4gYnkgYG1vZHVsYXJMYWJlbHNgLlxuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcoKTogRW1wdHlTdGF0ZUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eVN0YXRlKSByZXR1cm4gdGhpcy5lbXB0eVN0YXRlQ29uZmlnO1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLmVtcHR5Tm9UZXN0c0luRm9sZGVyVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tb2R1bGFyTGFiZWxzLmVtcHR5Tm9UZXN0c0luRm9sZGVyRGVzY3JpcHRpb24sXG4gICAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLlRFU1RfQ0FTRSxcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBvbkZvbGRlclNlbGVjdGVkKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZvbGRlcklkID0gaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5mb2xkZXJTZWxlY3RlZC5lbWl0KGlkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uRm9sZGVyRXhwYW5zaW9uVG9nZ2xlZChldmVudDogeyBpZDogbnVtYmVyOyBleHBhbmRlZDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLmV4cGFuZGVkRm9sZGVySWRzIHx8IFtdKTtcbiAgICBpZiAoZXZlbnQuZXhwYW5kZWQpIHtcbiAgICAgIHNldC5hZGQoZXZlbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQuZGVsZXRlKGV2ZW50LmlkKTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZEZvbGRlcklkcyA9IEFycmF5LmZyb20oc2V0KTtcbiAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkZvbGRlckNyZWF0ZWQocGF5bG9hZDogRm9sZGVyQ3JlYXRlZFBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLmZvbGRlckNyZWF0ZWQuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uRm9sZGVyQ3JlYXRlUmVxdWVzdGVkKHBheWxvYWQ6IHsgcGFyZW50SWQ6IG51bWJlciB8IG51bGwgfSk6IHZvaWQge1xuICAgIC8vIEVtaXQgdGhlIFwicmVxdWVzdGVkXCIgZXZlbnQgZmlyc3Qgc28gYSBob3N0IGNhbiBpbnRlcmNlcHQgd2hlbiBpdCBvd25zIHRoZSBVWC5cbiAgICB0aGlzLmZvbGRlckNyZWF0ZVJlcXVlc3RlZC5lbWl0KHBheWxvYWQpO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcbiAgICB0aGlzLm9wZW5DcmVhdGVGb2xkZXJEaWFsb2cocGF5bG9hZC5wYXJlbnRJZCk7XG4gIH1cblxuICBvbkZvbGRlclJlbmFtZWQocGF5bG9hZDogRm9sZGVyUmVuYW1lZFBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLmZvbGRlclJlbmFtZWQuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlZCB0byB0aGUgc2lkZWJhcidzIGBmb2xkZXJEZWxldGVkYCBvdXRwdXQg4oCUIHdoaWNoIGZpcmVzIG9uIGRlbGV0ZS1pY29uXG4gICAqICpjbGljayosIG5vdCBvbiBjb25maXJtYXRpb24uIFdlIHJlLWVtaXQgYSBgZm9sZGVyRGVsZXRlUmVxdWVzdGVkYCBldmVudFxuICAgKiBmaXJzdCAoc28gaG9zdHMgY2FuIGludGVyY2VwdCkgYW5kLCB3aGVuIGB1c2VJbnRlcm5hbERpYWxvZ3NgIGlzIGVuYWJsZWQsXG4gICAqIG9wZW4gdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cuIGBmb2xkZXJEZWxldGVkYCBub3cgb25seSBmaXJlcyBhZnRlciBjb25maXJtLlxuICAgKi9cbiAgb25Gb2xkZXJEZWxldGVkKHBheWxvYWQ6IHsgaWQ6IG51bWJlciB9KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5idWlsZERlbGV0ZUNvbnRleHQocGF5bG9hZC5pZCk7XG4gICAgdGhpcy5mb2xkZXJEZWxldGVSZXF1ZXN0ZWQuZW1pdChjdHgpO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcbiAgICB0aGlzLm9wZW5EZWxldGVGb2xkZXJEaWFsb2coY3R4KTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgdGhlIHsgaWQsIG5hbWUsIHRlc3RDb3VudCwgaGFzUGFyZW50IH0gcGF5bG9hZCB1c2VkIGJ5IGRlbGV0ZSBldmVudHMvZGlhbG9ncy4gKi9cbiAgcHJpdmF0ZSBidWlsZERlbGV0ZUNvbnRleHQoZm9sZGVySWQ6IG51bWJlcik6IEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBmb2xkZXJJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBmb2xkZXJJZCxcbiAgICAgIG5hbWU6IG5vZGU/Lm5hbWUgPz8gJycsXG4gICAgICB0ZXN0Q291bnQ6IHRoaXMuY291bnRUZXN0c0luRm9sZGVyKGZvbGRlcklkKSxcbiAgICAgIGhhc1BhcmVudDogdGhpcy5mb2xkZXJIYXNQYXJlbnQoZm9sZGVySWQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvdW50VGVzdHNJbkZvbGRlcihmb2xkZXJJZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuZm9sZGVySWRBY2Nlc3NvciA/PyAoKHI6IGFueSkgPT4gcj8uZm9sZGVySWQpO1xuICAgIHJldHVybiAodGhpcy5kYXRhIHx8IFtdKS5maWx0ZXIociA9PiB7XG4gICAgICBjb25zdCBpZCA9IGFjY2Vzc29yKHIpO1xuICAgICAgcmV0dXJuIGlkICE9IG51bGwgJiYgTnVtYmVyKGlkKSA9PT0gTnVtYmVyKGZvbGRlcklkKTtcbiAgICB9KS5sZW5ndGg7XG4gIH1cblxuICAvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGZvbGRlciBpcyBuZXN0ZWQgKGkuZS4gbm90IGEgcm9vdC1sZXZlbCBmb2xkZXIpLiAqL1xuICBwcml2YXRlIGZvbGRlckhhc1BhcmVudChmb2xkZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodGhpcy5mb2xkZXJzIHx8IFtdKS5zb21lKG4gPT4gbi5pZCA9PT0gZm9sZGVySWQpO1xuICB9XG5cbiAgb25UZXN0c0Ryb3BwZWQoZXZlbnQ6IHsgdGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjsgdGFyZ2V0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wKSByZXR1cm47XG4gICAgdGhpcy50ZXN0c01vdmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGRlci10by1mb2xkZXIgZHJhZy1kcm9wLiBUaGUgc2lkZWJhciBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQgYWdhaW5zdCBzZWxmL2Rlc2NlbmRhbnRcbiAgICogY3ljbGVzLCBzbyB0aGUgZHJvcCBpcyBpdHMgb3duIGNvbmZpcm1hdGlvbiDigJQgd2UgZW1pdCBgZm9sZGVyTW92ZWRgIGRpcmVjdGx5IHdpdGhvdXRcbiAgICogb3BlbmluZyB0aGUgbW92ZSBkaWFsb2cuIEdhdGVkIG9uIGBhbGxvd1Rlc3REcmFnRHJvcGAgKHNhbWUgZmxhZyBhcyB0ZXN0IGRyYWctZHJvcCkuXG4gICAqL1xuICBvbkZvbGRlckRyb3BwZWQoZXZlbnQ6IHsgaWQ6IG51bWJlcjsgbmV3UGFyZW50SWQ6IG51bWJlciB8IG51bGwgfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJNb3ZlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWRlYmFyIGVtaXR0ZWQgYGZvbGRlck1vdmVSZXF1ZXN0ZWRgICh1c2VyIHBpY2tlZCBcIk1vdmUgZm9sZGVyXCIgZnJvbSB0aGUgY29udGV4dCBtZW51KS5cbiAgICogV2UgcmUtZW1pdCBhIHJpY2hlciBwYXlsb2FkIGZvciBob3N0cywgYW5kIOKAlCB3aGVuIHJ1bm5pbmcgd2l0aCBpbnRlcm5hbCBkaWFsb2dzIOKAlFxuICAgKiBvcGVuIHRoZSBleGlzdGluZyBtb3ZlLXRvLWZvbGRlciBwaWNrZXIgY29uZmlndXJlZCBmb3IgYSBmb2xkZXItbW92ZSAoc2VsZiBhbmRcbiAgICogZGVzY2VuZGFudHMgYXJlIGRpc2FibGVkIHRvIHByZXZlbnQgY3ljbGVzKS5cbiAgICovXG4gIG9uRm9sZGVyTW92ZVJlcXVlc3RlZChwYXlsb2FkOiB7IGlkOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBwYXlsb2FkLmlkKTtcbiAgICBjb25zdCBjdHg6IEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkID0ge1xuICAgICAgaWQ6IHBheWxvYWQuaWQsXG4gICAgICBuYW1lOiBub2RlPy5uYW1lID8/ICcnLFxuICAgICAgaGFzUGFyZW50OiB0aGlzLmZvbGRlckhhc1BhcmVudChwYXlsb2FkLmlkKSxcbiAgICB9O1xuICAgIHRoaXMuZm9sZGVyTW92ZVJlcXVlc3RlZC5lbWl0KGN0eCk7XG4gICAgaWYgKCF0aGlzLnVzZUludGVybmFsRGlhbG9ncykgcmV0dXJuO1xuICAgIHRoaXMub3Blbk1vdmVGb2xkZXJEaWFsb2coY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWRlYmFyIGVtaXR0ZWQgYGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZGAuIFRoZSBsaWJyYXJ5IGNhbid0IHBlcnNpc3Qg4oCUXG4gICAqIGVtaXQgdGhlIGhvc3QtbGV2ZWwgZXZlbnQgc28gdGhlIGhvc3QgY2xvbmVzIHRoZSBzdWJ0cmVlIHNlcnZlci1zaWRlLlxuICAgKiBUZXN0IGNhc2VzIHNob3VsZCBiZSAqcmVmZXJlbmNlZCogZnJvbSB0aGUgbmV3IGZvbGRlcnMsIG5vdCBkdXBsaWNhdGVkLlxuICAgKi9cbiAgb25Gb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQocGF5bG9hZDogeyBpZDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgcGF5bG9hZC5pZCk7XG4gICAgdGhpcy5mb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICBpZDogcGF5bG9hZC5pZCxcbiAgICAgIG5hbWU6IG5vZGU/Lm5hbWUgPz8gJycsXG4gICAgfSk7XG4gIH1cblxuICBvblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoY29sbGFwc2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaWRlYmFyQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIHRoaXMuc2lkZWJhckNvbGxhcHNlZENoYW5nZS5lbWl0KGNvbGxhcHNlZCk7XG4gIH1cblxuICB0b2dnbGVTaWRlYmFyKCk6IHZvaWQge1xuICAgIHRoaXMub25TaWRlYmFyQ29sbGFwc2VkQ2hhbmdlKCF0aGlzLnNpZGViYXJDb2xsYXBzZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYnVsayBhY3Rpb25zIHNob3duIGluIHRoZSB0b29sYmFyIG1lcmdlZCB3aXRoIGFueSBob3N0LXN1cHBsaWVkXG4gICAqIGBidWxrQWN0aW9uc2AuIEN1cnJlbnRseSBvbmx5IFwiTW92ZSB0byBmb2xkZXJcIiBzaGlwcyBieSBkZWZhdWx0IOKAlFxuICAgKiBEZWxldGUgLyBBZGQgVGFnIGFyZSBvcHQtaW4gcGVyIHRoZSBjdXJyZW50IHByb2R1Y3QgcmVxdWlyZW1lbnQuIEhvc3RzXG4gICAqIHRoYXQgd2FudCB0aGVtIGJhY2sgcGFzcyB0aGVtIHZpYSBgYnVsa0FjdGlvbnNgLlxuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUJ1bGtBY3Rpb25zKCk6IFRhYmxlQWN0aW9uW10ge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBUYWJsZUFjdGlvbltdID0gW1xuICAgICAgeyBpZDogJ21vdmUnLCBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVUb0ZvbGRlciwgaWNvbjogJ2RyaXZlX2ZpbGVfbW92ZScsIHRvb2x0aXA6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlVG9Gb2xkZXIgfSxcbiAgICBdO1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IG5ldyBNYXAoKHRoaXMuYnVsa0FjdGlvbnMgfHwgW10pLm1hcChhID0+IFthLmlkLCBhXSBhcyBjb25zdCkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZmF1bHRzLm1hcChkID0+IG92ZXJyaWRlcy5nZXQoZC5pZCkgPz8gZCk7XG4gICAgZm9yIChjb25zdCBleHRyYSBvZiB0aGlzLmJ1bGtBY3Rpb25zIHx8IFtdKSB7XG4gICAgICBpZiAoIWRlZmF1bHRzLnNvbWUoZCA9PiBkLmlkID09PSBleHRyYS5pZCkpIHtcbiAgICAgICAgbWVyZ2VkLnB1c2goZXh0cmEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgb25CdWxrQWN0aW9uKGV2ZW50OiB7IGlkOiBzdHJpbmc7IHNlbGVjdGVkOiBhbnlbXSB9KTogdm9pZCB7XG4gICAgLy8gQWx3YXlzIGVtaXQgdGhlIHJhdyBjbGljayBzbyBob3N0cyBvd25pbmcgdGhlIFVYIGNhbiBpbnRlcmNlcHQgZWFybHkuXG4gICAgdGhpcy5idWxrQWN0aW9uQ2xpY2suZW1pdCh7IGlkOiBldmVudC5pZCwgc2VsZWN0ZWQ6IGV2ZW50LnNlbGVjdGVkIH0pO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSAoZXZlbnQuc2VsZWN0ZWQgfHwgW10pLm1hcChyID0+IHI/LmlkKS5maWx0ZXIodiA9PiB2ICE9IG51bGwpO1xuICAgIGlmIChldmVudC5pZCA9PT0gJ21vdmUnKSB7XG4gICAgICB0aGlzLm9wZW5Nb3ZlRGlhbG9nKHNlbGVjdGVkSWRzLCBldmVudC5zZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBub24tZGlhbG9nIGFjdGlvbnMgKGN1c3RvbSBlbnRyaWVzIGZyb20gaG9zdC1zdXBwbGllZCBgYnVsa0FjdGlvbnNgKSwgaW52b2tlIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMuYnVsa0FjdGlvbkludm9rZWQuZW1pdCh7IGlkOiBldmVudC5pZCwgc2VsZWN0ZWQ6IGV2ZW50LnNlbGVjdGVkIH0pO1xuICB9XG5cbiAgb25CdWxrU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBBcHBseSB0aGUgYWN0aW9uIGxvY2FsbHkgc28gdGhlIGFjdGlvbiB0b29sYmFyJ3MgXCJTZWxlY3QgYWxsXCIgd29ya3Mgb3V0LW9mLXRoZS1ib3guXG4gICAgLy8gV2hlbiBjaGVja2VkLCBzZWxlY3QgZXZlcnkgcm93IGluIHRoZSAqY3VycmVudCogZmlsdGVyZWQgc2V0IChpLmUuIGFsbCB0ZXN0cyBpblxuICAgIC8vIHRoZSBzZWxlY3RlZCBmb2xkZXIpLiBXaGVuIHVuY2hlY2tlZCwgY2xlYXIgc2VsZWN0aW9uLlxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGNoZWNrZWQgPyBbLi4udGhpcy5maWx0ZXJlZFJvd3NdIDogW107XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChbLi4udGhpcy5zZWxlY3RlZEl0ZW1zXSk7XG4gICAgdGhpcy5idWxrU2VsZWN0QWxsQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkJ1bGtEaXNtaXNzKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHNlbGVjdGlvbiBBTkQgdGhlIHBlci1yb3cgaXNTZWxlY3RlZCBmbGFncyBzbyB0aGUgYWN0aW9uIHRvb2xiYXIgY2xvc2VzXG4gICAgLy8gKGl0J3MgZ2F0ZWQgb24gYGFueVJvd1NlbGVjdGVkYCwgd2hpY2ggcmVhZHMgYm90aCBzZWxlY3RlZEl0ZW1zIGFuZCByb3cgZmxhZ3MpLlxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoW10pO1xuICAgIHRoaXMuYnVsa0Rpc21pc3MuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuTW92ZURpYWxvZyh0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBzZWxlY3RlZDogYW55W10pOiB2b2lkIHtcbiAgICAvLyBGaXJlIHRoZSBcInJlcXVlc3RlZFwiIGV2ZW50IGZpcnN0IHNvIGEgaG9zdCBjYW4gaW50ZXJjZXB0IHdoZW4gaXQgb3ducyB0aGUgVVguXG4gICAgdGhpcy5tb3ZlUmVxdWVzdGVkLmVtaXQoe1xuICAgICAgdGVzdElkcyxcbiAgICAgIHNlbGVjdGVkLFxuICAgICAgY3VycmVudEZvbGRlcklkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQsXG4gICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLnVzZUludGVybmFsRGlhbG9ncykgcmV0dXJuO1xuXG4gICAgY29uc3QgY291bnQgPSB0ZXN0SWRzLmxlbmd0aDtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChjb3VudCA9PT0gMVxuICAgICAgPyB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0Rlc2NyaXB0aW9uU2luZ3VsYXJcbiAgICAgIDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dEZXNjcmlwdGlvblBsdXJhbFxuICAgICkucmVwbGFjZSgne259JywgJycgKyBjb3VudCk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW48YW55LCBudW1iZXIgfCBudWxsPih7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dUaXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIGN1cnJlbnRGb2xkZXJJZDogdGhpcy5zZWxlY3RlZEZvbGRlcklkLFxuICAgICAgICAgIC8vIFdoZW4gbW92aW5nIEZST00gVW5vcmdhbmlzZWQsIGRpc2FibGUgdGhlIFVub3JnYW5pc2VkIGRlc3RpbmF0aW9uIHJvdy5cbiAgICAgICAgICByb290RGlzYWJsZWQ6IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UodW5kZWZpbmVkIGFzIGFueSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSByLmdldENvbXBvbmVudEluc3RhbmNlPE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIHIuY2xvc2UoaW5zdGFuY2UgPyBpbnN0YW5jZS5waWNrZWRGb2xkZXJJZCA6IG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh0YXJnZXRGb2xkZXJJZCA9PiB7XG4gICAgICBpZiAodGFyZ2V0Rm9sZGVySWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBjYW5jZWxsZWRcbiAgICAgIHRoaXMudGVzdHNNb3ZlZC5lbWl0KHsgdGVzdElkcywgdGFyZ2V0Rm9sZGVySWQ6IHRhcmdldEZvbGRlcklkID8/IG51bGwgfSk7XG4gICAgICB0aGlzLmJ1bGtBY3Rpb25JbnZva2VkLmVtaXQoeyBpZDogJ21vdmUnLCBzZWxlY3RlZCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgZm9sZGVyLXBpY2tlciBkaWFsb2cgY29uZmlndXJlZCBmb3IgbW92aW5nIGEgZm9sZGVyIChyYXRoZXIgdGhhbiB0ZXN0cykuXG4gICAqIFRoZSBzb3VyY2UgZm9sZGVyIGl0c2VsZiBpcyBtYXJrZWQgYXMgdGhlIFwiY3VycmVudFwiIGZvbGRlciBzbyBpdCdzIHJlbmRlcmVkIGFzXG4gICAqIGRpc2FibGVkIGluIHRoZSBwaWNrZXIuIE9uIGNvbmZpcm0sIGVtaXRzIGBmb2xkZXJNb3ZlZGAgd2l0aCB0aGUgY2hvc2VuIHBhcmVudC5cbiAgICovXG4gIHByaXZhdGUgb3Blbk1vdmVGb2xkZXJEaWFsb2coY3R4OiBGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZD4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5mb2xkZXJNZW51TW92ZSxcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlcnM6IHRoaXMuZm9sZGVycyxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMubW9kdWxhckxhYmVscyxcbiAgICAgICAgICAvLyBSZXVzZSB0aGUgXCJkaXNhYmxlZFwiIHRyZWF0bWVudDogdGhlIGZvbGRlciBiZWluZyBtb3ZlZCBjYW4ndCBiZSBpdHMgb3duIGRlc3RpbmF0aW9uLlxuICAgICAgICAgIGN1cnJlbnRGb2xkZXJJZDogY3R4LmlkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UodW5kZWZpbmVkIGFzIGFueSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSByLmdldENvbXBvbmVudEluc3RhbmNlPE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIHIuY2xvc2UoaW5zdGFuY2UgPyBpbnN0YW5jZS5waWNrZWRGb2xkZXJJZCA6IG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh0YXJnZXRGb2xkZXJJZCA9PiB7XG4gICAgICBpZiAodGFyZ2V0Rm9sZGVySWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBjYW5jZWxsZWRcbiAgICAgIHRoaXMuZm9sZGVyTW92ZWQuZW1pdCh7IGlkOiBjdHguaWQsIG5ld1BhcmVudElkOiB0YXJnZXRGb2xkZXJJZCA/PyBudWxsIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQ3JlYXRlRm9sZGVyRGlhbG9nKGluaXRpYWxQYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgeyBuYW1lOiBzdHJpbmc7IHBhcmVudElkOiBudW1iZXIgfCBudWxsOyBjb2xvcjogc3RyaW5nIH0gfCBmYWxzZT4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dUaXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nRGVzY3JpcHRpb24sXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogTmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgcGFyZW50SWQ6IGluaXRpYWxQYXJlbnRJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UoZmFsc2UpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm5ld0ZvbGRlckRpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdCA9IHIuZ2V0Q29tcG9uZW50SW5zdGFuY2U8TmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50PigpO1xuICAgICAgICAgICAgaWYgKCFpbnN0IHx8ICFpbnN0LmlzVmFsaWQpIHJldHVybiBmYWxzZTsgLy8ga2VlcCB0aGUgZGlhbG9nIG9wZW4gb24gaW52YWxpZCBzdWJtaXRcbiAgICAgICAgICAgIHIuY2xvc2UoeyBuYW1lOiAoaW5zdC5uYW1lIHx8ICcnKS50cmltKCksIHBhcmVudElkOiBpbnN0LnBhcmVudElkLCBjb2xvcjogaW5zdC5jb2xvciB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJDcmVhdGVkLmVtaXQoeyBwYXJlbnRJZDogcmVzdWx0LnBhcmVudElkLCBuYW1lOiByZXN1bHQubmFtZSwgY29sb3I6IHJlc3VsdC5jb2xvciB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkRlbGV0ZUZvbGRlckRpYWxvZyhjdHg6IEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQpOiB2b2lkIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIHsgc3RyYXRlZ3k6IEZvbGRlckRlbGV0ZVN0cmF0ZWd5IH0gfCBmYWxzZT4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5kZWxldGVGb2xkZXJEaWFsb2dUaXRsZSxcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBEZWxldGVGb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlck5hbWU6IGN0eC5uYW1lLFxuICAgICAgICAgIHRlc3RDb3VudDogY3R4LnRlc3RDb3VudCxcbiAgICAgICAgICBoYXNQYXJlbnQ6IGN0eC5oYXNQYXJlbnQsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgc3RyYXRlZ3k6IGN0eC5oYXNQYXJlbnQgPyAnbW92ZS10by1wYXJlbnQnIDogJ21vdmUtdG8tdW5vcmdhbmlzZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLmRlbGV0ZUZvbGRlckRpYWxvZ0NhbmNlbCwgcm9sZTogJ3NlY29uZGFyeScsIGhhbmRsZXI6IHIgPT4gci5jbG9zZShmYWxzZSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMuZGVsZXRlRm9sZGVyRGlhbG9nQ29uZmlybSxcbiAgICAgICAgICByb2xlOiAnd2FybicsXG4gICAgICAgICAgaGFuZGxlcjogciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0ID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxEZWxldGVGb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICByLmNsb3NlKGluc3QgPyB7IHN0cmF0ZWd5OiBpbnN0LnN0cmF0ZWd5IH0gOiBmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidXR0b25BbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgfSk7XG4gICAgcmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZm9sZGVyRGVsZXRlZC5lbWl0KHsgaWQ6IGN0eC5pZCwgc3RyYXRlZ3k6IHJlc3VsdC5zdHJhdGVneSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUm93LXJlb3JkZXIgaGFuZGxlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN0YXJ0UmVvcmRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICB0aGlzLnJlb3JkZXJTbmFwc2hvdCA9IFsuLi4odGhpcy5wYWdlZFJvd3MgfHwgW10pXTtcbiAgICB0aGlzLnJlb3JkZXJEcmFmdCA9IFsuLi4odGhpcy5wYWdlZFJvd3MgfHwgW10pXTtcbiAgICAvLyBQYXVzZSBhdXRvLXJlZnJlc2ggd2hpbGUgcmVvcmRlcmluZyDigJQgYXZvaWRzIHRoZSB0aW1lciBjbG9iYmVyaW5nIHRoZSBkcmFmdC5cbiAgICB0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID0gdGhpcy5zZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWw7XG4gICAgaWYgKHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2ggPiAwKSB7XG4gICAgICB0aGlzLnNldHVwQXV0b1JlZnJlc2goMCk7XG4gICAgfVxuICAgIHRoaXMuaXNSZW9yZGVyaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwID0gZmFsc2U7XG4gICAgdGhpcy5yZW9yZGVyU3RhcnQuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2FuY2VsUmVvcmRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSZW9yZGVyaW5nKSByZXR1cm47XG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFnZSBvcmRlciBzbyB0aGUgdXNlciBzZWVzIHRoZSBwcmUtZHJhZyBzdGF0ZS5cbiAgICBpZiAodGhpcy5yZW9yZGVyU25hcHNob3QpIHtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gWy4uLnRoaXMucmVvcmRlclNuYXBzaG90XTtcbiAgICB9XG4gICAgdGhpcy5leGl0UmVvcmRlck1vZGUoKTtcbiAgICB0aGlzLnJlb3JkZXJDYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgc2F2ZVJlb3JkZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0aGlzLnJlb3JkZXJEcmFmdCA/IFsuLi50aGlzLnJlb3JkZXJEcmFmdF0gOiBbLi4uKHRoaXMucGFnZWRSb3dzIHx8IFtdKV07XG4gICAgdGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCA9IHRydWU7XG4gICAgdGhpcy5yZW9yZGVyU2F2ZS5lbWl0KHsgb3JkZXJlZEl0ZW1zOiBvcmRlcmVkIH0pO1xuICAgIC8vIElmIHRoZSBob3N0IG5ldmVyIGZsaXBzIGByZW9yZGVyU2F2aW5nYCAoZS5nLiBzeW5jaHJvbm91cyBuby1vcCksIGV4aXRcbiAgICAvLyBpbW1lZGlhdGVseSBzbyB0aGUgVUkgZG9lc24ndCBnZXQgc3R1Y2sgaW4gXCJTYXZpbmcuLi5cIiBzdGF0ZS5cbiAgICBpZiAoIXRoaXMucmVvcmRlclNhdmluZykge1xuICAgICAgLy8gR2l2ZSB0aGUgaG9zdCBhIG1pY3JvdGFzayB0byBmbGlwIGByZW9yZGVyU2F2aW5nYCB0byB0cnVlIOKAlCBpZiBpdFxuICAgICAgLy8gaGFzbid0LCBhc3N1bWUgbm8gYXN5bmMgd29yayBhbmQgZXhpdC5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCAmJiAhdGhpcy5yZW9yZGVyU2F2aW5nKSB7XG4gICAgICAgICAgdGhpcy5leGl0UmVvcmRlck1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Sb3dSZW9yZGVyKGV2ZW50OiB7IHByZXZpb3VzSW5kZXg6IG51bWJlcjsgY3VycmVudEluZGV4OiBudW1iZXI7IG9yZGVyZWREYXRhOiBhbnlbXSB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIHRoaXMucmVvcmRlckRyYWZ0ID0gWy4uLmV2ZW50Lm9yZGVyZWREYXRhXTtcbiAgICB0aGlzLnBhZ2VkUm93cyA9IHRoaXMucmVvcmRlckRyYWZ0O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGl0UmVvcmRlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Jlb3JkZXJpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlb3JkZXJTbmFwc2hvdCA9IG51bGw7XG4gICAgdGhpcy5yZW9yZGVyRHJhZnQgPSBudWxsO1xuICAgIHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgPSBmYWxzZTtcbiAgICAvLyBSZXN0b3JlIHByZXZpb3VzbHktc2VsZWN0ZWQgYXV0by1yZWZyZXNoIGludGVydmFsIChpZiBhbnkpLlxuICAgIGlmICh0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID4gMCkge1xuICAgICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2gpO1xuICAgICAgdGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA9IDA7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdy1kcmFnIHBheWxvYWQgYnVpbGRlciB1c2VkIGJ5IHRoZSBbY3FhUm93RHJhZ10gZGlyZWN0aXZlIHZpYSAoYnVpbGRQYXlsb2FkKS5cbiAgICovXG4gIGJ1aWxkUm93RHJhZ1BheWxvYWQgPSAocm93OiBhbnkpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXM7XG4gICAgLy8gSWYgdGhlIGRyYWdnZWQgcm93IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBkcmFnIHRoZSB3aG9sZSBzZWxlY3Rpb24uXG4gICAgY29uc3Qgcm93SWQgPSByb3c/LmlkO1xuICAgIGNvbnN0IGluU2VsZWN0aW9uID0gcm93SWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5zb21lKHMgPT4gcz8uaWQgPT09IHJvd0lkKTtcbiAgICBjb25zdCBpZHMgPSAoaW5TZWxlY3Rpb24gPyBzZWxlY3RlZCA6IFtyb3ddKS5tYXAociA9PiByPy5pZCkuZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcbiAgICByZXR1cm4gaWRzO1xuICB9O1xufVxuIiwiPCEtLSBSZXVzYWJsZSBmb2xkZXItaWNvbiBjaGlwLiBSZW5kZXIgdmlhIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uQ2hpcDsgY29udGV4dDogeyBjb2xvcjogZi5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+LiAtLT5cbjxuZy10ZW1wbGF0ZSAjZm9sZGVySWNvbkNoaXAgbGV0LWNvbG9yPVwiY29sb3JcIj5cbiAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctMTAgY3FhLWgtMTAgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRjBGMEYxXSBjcWEtdGV4dC1bIzZENkQ3NF0gY3FhLXNocmluay0wIGdyb3VwLWhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBbYXR0ci5zdHJva2VdPVwiY29sb3IgfHwgJ2N1cnJlbnRDb2xvcidcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBSZXVzYWJsZSBcIitcIiBjaGlwIHVzZWQgYnkgdGhlIFwiTmV3IGZvbGRlclwiIHRpbGUuIC0tPlxuPG5nLXRlbXBsYXRlICNhZGRJY29uQ2hpcD5cbiAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctMTAgY3FhLWgtMTAgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRjBGMEYxXSBjcWEtdGV4dC1bIzZENkQ3NF0gY3FhLXNocmluay0wIGdyb3VwLWhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTggM1YxM00zIDhIMTNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI3NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXJlbGF0aXZlXCI+XG4gICAgPGRpdiBbY2xhc3NdPVwiIXNob3dTZWFyY2hCYXIgPyAnY3FhLWp1c3RpZnktZW5kJyA6ICdjcWEtanVzdGlmeS1iZXR3ZWVuJ1wiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC13cmFwIGNxYS1tYi0zXCI+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgKm5nSWY9XCJzaG93U2VhcmNoQmFyXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJzaG93Q2xlYXJcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwidmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2gpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAoY2xlYXJlZCk9XCJjbGVhcmVkKClcIlxuICAgICAgPjwvY3FhLXNlYXJjaC1iYXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIlxuICAgICAgICB2YXJpYW50PVwiZ3JleS1zb2xpZFwiXG4gICAgICAgIGljb249XCJvcGVuX2luX25ld1wiXG4gICAgICAgIFt0ZXh0XT1cImlzRXhwb3J0aW5nID8gJ0V4cG9ydGluZy4uLicgOiAnRXhwb3J0J1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0V4cG9ydGluZ1wiXG4gICAgICAgIChjbGlja2VkKT1cImV4cG9ydENvZGVDbGljaygpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4+e3sgaXNFeHBvcnRpbmcgPyAnRXhwb3J0aW5nLi4uJyA6ICdFeHBvcnQnIH19PC9zcGFuPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgXG4gICAgICA8IS0tIEV4cG9ydCBDb2RlIE1vZGFsIC0tPlxuICAgICAgPGNxYS1leHBvcnQtY29kZS1tb2RhbFxuICAgICAgICAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIlxuICAgICAgICBbaXNPcGVuXT1cImlzRXhwb3J0TW9kYWxPcGVuXCJcbiAgICAgICAgW2Nhc2VzXT1cInNlbGVjdGVkQ2FzZXNGb3JFeHBvcnRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAoY2xvc2VNb2RhbCk9XCJjbG9zZUV4cG9ydE1vZGFsKClcIlxuICAgICAgICAoZXhwb3J0KT1cIm9uRXhwb3J0TW9kYWxFeHBvcnQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtZXhwb3J0LWNvZGUtbW9kYWw+XG4gICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkcm9wZG93blRlbXBsYXRlIG9mIG90aGVyRHJvcERvd25CdXR0b25zOyB0cmFja0J5OiB0cmFja0J5RHJvcGRvd25UZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93blRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlbGVjdERyb3Bkb3duVGVtcGxhdGUgb2Ygb3RoZXJTZWxlY3REcm9wRG93bkJ1dHRvbnM7IHRyYWNrQnk6IHRyYWNrQnlTZWxlY3REcm9wZG93blRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdERyb3Bkb3duVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIFxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0ZpbHRlckJ1dHRvblwiXG4gICAgICAgICAgdmFyaWFudD1cImdyZXktc29saWRcIlxuICAgICAgICAgIGljb249XCJhZGRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgIChjbGlja2VkKT1cInRvZ2dsZUZpbHRlcigpXCJcbiAgICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgRmlsdGVyICAgICAgICAgIFxuICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJhcnJvd0NsYXNzZXNcIj5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy0yIGNxYS1oLTEgY3FhLWFic29sdXRlIGNxYS1sZWZ0LVs0cHhdIGNxYS10b3AtWzZweF1cIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDggNFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wIDBMNCA0TDggMFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzBCMEIwQ1wiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zM1wiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWNvbHVtbi12aXNpYmlsaXR5XG4gICAgICAgICAgKm5nSWY9XCJzaG93U2V0dGluZ3NCdXR0b25cIlxuICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2liaWxpdHlDb2x1bW5zXCJcbiAgICAgICAgICBbY29sdW1uVmlzaWJpbGl0eV09XCJjb2x1bW5WaXNpYmlsaXR5XCJcbiAgICAgICAgICBbc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsXT1cInNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2UpPVwib25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChhdXRvUmVmcmVzaENoYW5nZSk9XCJvbkF1dG9SZWZyZXNoQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9jcWEtY29sdW1uLXZpc2liaWxpdHk+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93QXV0b1JlZnJlc2hCdXR0b25cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgICBpY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwiaGFuZGxlUmVmcmVzaENsaWNrKClcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidSZWZyZXNoJ1wiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1Jlb3JkZXJpbmdcIlxuICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidXR0b25UZW1wbGF0ZSBvZiBvdGhlckJ1dHRvbnM7IHRyYWNrQnk6IHRyYWNrQnlUZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAqbmdJZj1cInNob3dWaWV3TW9kZVRvZ2dsZVwiXG4gICAgICAgICAgc2l6ZT1cImxnXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwidmlld01vZGVTZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cInZpZXdNb2RlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WaWV3TW9kZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPjwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dSZW9yZGVyQnV0dG9uICYmICFpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgaWNvbj1cImRyYWdfaW5kaWNhdG9yXCJcbiAgICAgICAgICBbdGV4dF09XCJyZW9yZGVyTGFiZWxzLnJlb3JkZXJCdXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhcGFnZWRSb3dzIHx8IHBhZ2VkUm93cy5sZW5ndGggPT09IDAgfHwgaXNUYWJsZUxvYWRpbmcgfHwgaXNUYWJsZURhdGFMb2FkaW5nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJzdGFydFJlb3JkZXIoKVwiXG4gICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UmVvcmRlckJ1dHRvbiAmJiBpc1Jlb3JkZXJpbmdcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cInJlb3JkZXJMYWJlbHMuY2FuY2VsQnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZW9yZGVyU2F2aW5nXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cImNhbmNlbFJlb3JkZXIoKVwiXG4gICAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgICAgICBbaWNvbl09XCJyZW9yZGVyU2F2aW5nID8gJ2hvdXJnbGFzc19lbXB0eScgOiAnJ1wiXG4gICAgICAgICAgICBbdGV4dF09XCJyZW9yZGVyU2F2aW5nID8gcmVvcmRlckxhYmVscy5zYXZpbmdCdXR0b24gOiByZW9yZGVyTGFiZWxzLmRvbmVCdXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlb3JkZXJTYXZpbmdcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwic2F2ZVJlb3JkZXIoKVwiXG4gICAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVvcmRlciBtb2RlIGJhbm5lciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyaW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWItMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtcm91bmRlZC1tZCBjcWEtYmctWyNGRkZCRUJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZERTY4QV1cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgPC9zdmc+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjOTI0MDBFXVwiPnt7IHJlb3JkZXJMYWJlbHMuYmFubmVyVGl0bGUgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjOTI0MDBFXVwiPnt7IHJlb3JkZXJMYWJlbHMuYmFubmVyRGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8Y3FhLXNlbGVjdGVkLWZpbHRlcnNcbiAgICAgIFtmaWx0ZXJBcHBsaWVkXT1cImZpbHRlckFwcGxpZWRcIlxuICAgICAgW2NoaXBzXT1cImNoaXBzXCJcbiAgICAgIChyZW1vdmVDaGlwKT1cIm9uUmVtb3ZlQ2hpcCgkZXZlbnQpXCJcbiAgICAgIChjbGVhckFsbCk9XCJvbkNsZWFyQWxsQ2hpcHMoKVwiXG4gICAgICAob25DbGVhckFsbCk9XCJvbkNsZWFyQWxsLmVtaXQoKVwiXG4gICAgPlxuICAgIDwvY3FhLXNlbGVjdGVkLWZpbHRlcnM+XG5cbiAgICA8Y3FhLWR5bmFtaWMtZmlsdGVyXG4gICAgICAqbmdJZj1cInNob3dGaWx0ZXJQYW5lbFwiXG4gICAgICBbY29uZmlnXT1cImZpbHRlckNvbmZpZ1wiXG4gICAgICBbbW9kZWxdPVwiZmlsdGVyTW9kZWxcIlxuICAgICAgW3Nob3dGaWx0ZXJQYW5lbF09XCJzaG93RmlsdGVyUGFuZWxcIlxuICAgICAgKGZpbHRlcnNDaGFuZ2VkKT1cIm9uRmlsdGVyc0NoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAoZmlsdGVyc0FwcGxpZWQpPVwib25GaWx0ZXJzQXBwbGllZCgkZXZlbnQpXCJcbiAgICAgIChvbkFwcGx5RmlsdGVyQ2xpY2spPVwib25BcHBseUZpbHRlckNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAob25SZXNldEZpbHRlckNsaWNrKT1cImhhbmRsZVJlc2V0RmlsdGVyQ2xpY2soKVwiXG4gICAgPlxuICAgIDwvY3FhLWR5bmFtaWMtZmlsdGVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdHJldGNoIGNxYS1nYXAtMyBjcWEtbWluLWgtMCBcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjI2LCAyMjYsIDIyNyk7XCI+XG4gICAgICA8IS0tIFNpZGViYXIgKG9ubHkgc2hvd24gaW4gbW9kdWxhciB2aWV3KSAtLT5cbiAgICAgIDxjcWEtZm9sZGVyLXNpZGViYXJcbiAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1NpZGViYXJcIlxuICAgICAgICBbZm9sZGVyc109XCJmb2xkZXJzXCJcbiAgICAgICAgW3NlbGVjdGVkRm9sZGVySWRdPVwic2VsZWN0ZWRGb2xkZXJJZFwiXG4gICAgICAgIFtleHBhbmRlZEZvbGRlcklkc109XCJleHBhbmRlZEZvbGRlcklkc1wiXG4gICAgICAgIFt1bm9yZ2FuaXNlZENvdW50XT1cInVub3JnYW5pc2VkQ291bnRcIlxuICAgICAgICBbYWxsb3dDcmVhdGVdPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgIFthbGxvd1JlbmFtZV09XCJtb2R1bGFyQ29uZmlnLmFsbG93UmVuYW1lRm9sZGVyXCJcbiAgICAgICAgW2FsbG93RGVsZXRlXT1cIm1vZHVsYXJDb25maWcuYWxsb3dEZWxldGVGb2xkZXJcIlxuICAgICAgICBbYWxsb3dEcm9wXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICBbc2hvd0NvdW50c109XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIlxuICAgICAgICBbY29sbGFwc2VkXT1cInNpZGViYXJDb2xsYXBzZWRcIlxuICAgICAgICBbbGFiZWxzXT1cIm1vZHVsYXJMYWJlbHNcIlxuICAgICAgICAoZm9sZGVyU2VsZWN0ZWQpPVwib25Gb2xkZXJTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckV4cGFuc2lvblRvZ2dsZWQpPVwib25Gb2xkZXJFeHBhbnNpb25Ub2dnbGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyQ3JlYXRlZCk9XCJvbkZvbGRlckNyZWF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJDcmVhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJSZW5hbWVkKT1cIm9uRm9sZGVyUmVuYW1lZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckRlbGV0ZWQpPVwib25Gb2xkZXJEZWxldGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyTW92ZVJlcXVlc3RlZCk9XCJvbkZvbGRlck1vdmVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQpPVwib25Gb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwib25UZXN0c0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJEcm9wcGVkKT1cIm9uRm9sZGVyRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9jcWEtZm9sZGVyLXNpZGViYXI+XG5cbiAgICAgIDwhLS0gUmlnaHQgcGFuZSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItdG9wXT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdF09XCJpc01vZHVsYXJWaWV3ID8gJzFweCBzb2xpZCAjRTJFMkUzJyA6IG51bGxcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyLXJpZ2h0XT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQnJlYWRjcnVtYiAobW9kdWxhciB2aWV3LCBmb2xkZXIgZHJpbGxlZC1pbikgLS0+XG4gICAgICAgIDxuYXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93QnJlYWRjcnVtYiAmJiAhaXNSb290Vmlld1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkZvbGRlciBwYXRoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS1weC0zIGNxYS1weS0xIGNxYS1tYi0zIGNxYS1yb3VuZGVkLW5vbmVcIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTJFMkUzO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIiAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChudWxsKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjAuOTE2NjY3XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3Bhbj57eyBtb2R1bGFyTGFiZWxzLmFsbEZvbGRlcnMgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY3J1bWIgb2YgYnJlYWRjcnVtYlRyYWlsOyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1hbGlnbi1taWRkbGVcIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Y29sb3I6IzZENkQ3NDtcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImxhc3RcbiAgICAgICAgICAgICAgICA/ICdjcWEtdGV4dC1bIzE2MTYxN10gY3FhLWZvbnQtc2VtaWJvbGQnXG4gICAgICAgICAgICAgICAgOiAnY3FhLXRleHQtWyM2RDZENzRdIGhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXSdcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGFzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIhbGFzdCAmJiBvbkZvbGRlclNlbGVjdGVkKGNydW1iLmlkKVwiXG4gICAgICAgICAgICA+e3sgY3J1bWIubmFtZSB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25hdj5cblxuICAgICAgICA8IS0tIEZvbGRlciBncmlkOiBtb2R1bGFyICsgcm9vdCB2aWV3IC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd0ZvbGRlckdyaWQgJiYgcm9vdEZvbGRlclRpbGVzLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtbWItNCBjcWEtcHgtNSBjcWEtcHQtNCBjcWEtcGItWzE0cHhdXCJcbiAgICAgICAgICBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRjBGMEYxO1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBzdHJva2U9XCIjNkQ2RDc0XCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPnt7IG1vZHVsYXJMYWJlbHMub3JnYW5pc2VkIH19PC9oMz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2RDZENzRdXCI+XG4gICAgICAgICAgICAgIHt7IHJvb3RGb2xkZXJUaWxlcy5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLmZvbGRlcnNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy5mb2xkZXJzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyByb290Rm9sZGVyVGlsZXMubGVuZ3RoKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1ub3dyYXAgY3FhLWdhcC0zIGNxYS1vdmVyZmxvdy14LWF1dG8gY3FhLXNjcm9sbGJhci10aGluIGNxYS1wYi0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIHJvb3RGb2xkZXJUaWxlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJmLmlkXCJcbiAgICAgICAgICAgICAgW2Ryb3BFbmFibGVkXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICAgICAgICAodGVzdHNEcm9wcGVkKT1cIm9uVGVzdHNEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChmLmlkKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19PG5nLWNvbnRhaW5lciAqbmdJZj1cImYuY2hpbGRyZW4/Lmxlbmd0aFwiPiDCtyB7eyBmLmNoaWxkcmVuIS5sZW5ndGggPT09IDEgPyBtb2R1bGFyTGFiZWxzLm9uZVN1YmZvbGRlciA6IG1vZHVsYXJMYWJlbHMuc3ViZm9sZGVyc0NvdW50LnJlcGxhY2UoJ3tufScsICcnICsgZi5jaGlsZHJlbiEubGVuZ3RoKSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXNocmluay0wXCIgc3R5bGU9XCJmb250LXNpemU6MjBweDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4XCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBcIisgTmV3IGZvbGRlclwiIHRpbGUgLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJDcmVhdGVSZXF1ZXN0ZWQoeyBwYXJlbnRJZDogbnVsbCB9KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS10ZXh0LWxlZnQgY3FhLXAtMyBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy1bI0ZBRkFGQV0gaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLWJnLXdoaXRlIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJY29uQ2hpcFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBtb2R1bGFyTGFiZWxzLm5ld0ZvbGRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNDAwXCI+e3sgbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcwJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8IS0tIFN1YmZvbGRlciBzZWN0aW9uOiBtb2R1bGFyICsgZm9sZGVyIHZpZXcuIFNob3duIHdoZW5ldmVyIGRyaWxsZWQgaW4gKGV2ZW4gaWYgbm8gc3ViZm9sZGVycywgc28gdGhlIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSByZW1haW5zIHJlYWNoYWJsZSkuIC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiAhaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dTdWJmb2xkZXJTZWN0aW9uICYmIHN1YmZvbGRlclRpbGVzLmxlbmd0aFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtbWItNCBjcWEtcHgtMyBjcWEtcHktMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViZm9sZGVyVGlsZXMubGVuZ3RoIHx8IG1vZHVsYXJDb25maWcuYWxsb3dDcmVhdGVGb2xkZXJcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNjAwIGNxYS1tYi0yXCI+XG4gICAgICAgICAgICB7eyBtb2R1bGFyTGFiZWxzLnN1YmZvbGRlcnNJbiB9fSB7eyBicmVhZGNydW1iVHJhaWwubGVuZ3RoID8gYnJlYWRjcnVtYlRyYWlsW2JyZWFkY3J1bWJUcmFpbC5sZW5ndGggLSAxXS5uYW1lIDogJycgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtbm93cmFwIGNxYS1nYXAtMyBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtcGItMlwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZiBvZiBzdWJmb2xkZXJUaWxlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJmLmlkXCJcbiAgICAgICAgICAgICAgW2Ryb3BFbmFibGVkXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICAgICAgICAodGVzdHNEcm9wcGVkKT1cIm9uVGVzdHNEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChmLmlkKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1uZXV0cmFsLTQwMCBjcWEtc2hyaW5rLTBcIiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHhcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZCh7IHBhcmVudElkOiBzZWxlY3RlZEZvbGRlcklkIH0pXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLXNocmluay0wIGNxYS13LVsyNDBweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVswLjVweF0gY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLWJnLVsjRkFGQUZBXSBob3ZlcjpjcWEtYm9yZGVyLVsjM0Y0M0VFXSBob3ZlcjpjcWEtYmctd2hpdGUgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25DaGlwXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNXB4XSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLXRydW5jYXRlIGNxYS1sZWFkaW5nLXRpZ2h0IGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IG1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC00MDBcIj57eyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJzAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDwhLS0gRm9sZGVyIHBhbmVsIGhlYWRlciBhYm92ZSB0aGUgdGFibGU6IFwiSG90ZWwgU2VhcmNoICgzKVwiICsgQ2xlYXIgZmlsdGVyIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmICFpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1Vub3JnYW5pc2VkU2VjdGlvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtbWItMSBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXB4LTQgY3FhLXB5LTMgY3FhLXJvdW5kZWQtdC1sZyBjcWEtYmctaW5kaWdvLTUwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1pbmRpZ28tMTAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4NSAxMC40NTg1QzEyLjk1ODUgMTAuNzkgMTIuODI2OCAxMS4xMDggMTIuNTkyNCAxMS4zNDI0QzEyLjM1OCAxMS41NzY4IDEyLjA0IDExLjcwODUgMTEuNzA4NSAxMS43MDg1SDEuNzA4NUMxLjM3Njk4IDExLjcwODUgMS4wNTkwMyAxMS41NzY4IDAuODI0NjEzIDExLjM0MjRDMC41OTAxOTIgMTEuMTA4IDAuNDU4NDk2IDEwLjc5IDAuNDU4NDk2IDEwLjQ1ODVWMS43MDg1QzAuNDU4NDk2IDEuMzc2OTggMC41OTAxOTIgMS4wNTkwMyAwLjgyNDYxMyAwLjgyNDYxM0MxLjA1OTAzIDAuNTkwMTkyIDEuMzc2OTggMC40NTg0OTYgMS43MDg1IDAuNDU4NDk2SDQuODMzNUw2LjA4MzUgMi4zMzM1SDExLjcwODVDMTIuMDQgMi4zMzM1IDEyLjM1OCAyLjQ2NTE5IDEyLjU5MjQgMi42OTk2MUMxMi44MjY4IDIuOTM0MDMgMTIuOTU4NSAzLjI1MTk4IDEyLjk1ODUgMy41ODM1VjEwLjQ1ODVaXCIgW2F0dHIuc3Ryb2tlXT1cImN1cnJlbnRGb2xkZXJOb2RlPy5jb2xvciB8fCAnIzNGNDNFRSdcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1pbmRpZ28tNzAwXCI+XG4gICAgICAgICAgICAgIHt7IGN1cnJlbnRGb2xkZXJOb2RlPy5uYW1lIH19ICh7eyBjdXJyZW50Rm9sZGVyRGlyZWN0Q291bnQgfX0pXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1weC0zIGNxYS1weS0xIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1pbmRpZ28tNzAwIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItaW5kaWdvLTIwMCBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctaW5kaWdvLTUwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlclNlbGVjdGVkKG51bGwpXCJcbiAgICAgICAgICA+e3sgbW9kdWxhckxhYmVscy5jbGVhckZpbHRlciB9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFVub3JnYW5pc2VkIHNlY3Rpb24gaGVhZGVyIGF0IHJvb3QgdmlldyAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBpc1Jvb3RWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1Vub3JnYW5pc2VkU2VjdGlvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWItMiBjcWEtbXQtMlwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIwcHg7XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNkQ2RDc0XVwiIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmluYm94PC9tYXQtaWNvbj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzZENkQ3NF1cIj57eyBtb2R1bGFyTGFiZWxzLnVub3JnYW5pc2VkIH19PC9oMz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNkQ2RDc0XVwiPlxuICAgICAgICAgICAge3sgdW5vcmdhbmlzZWRDb3VudCA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgdW5vcmdhbmlzZWRDb3VudCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGFibGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcm91bmRlZC1bN3B4XSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWwgY3FhLWJvcmRlci1yIGNxYS1ib3JkZXItZ3JleS0yMDAgY3FhLXJlbGF0aXZlIGNxYS1vdmVyZmxvdy14LWF1dG9cIlxuICAgICAgICAgICAgIFthdHRyLnN0eWxlXT1cInBhZ2VkUm93cyAmJiBwYWdlZFJvd3MubGVuZ3RoID4gMCA/IG51bGwgOiAnYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50J1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNUYWJsZUxvYWRpbmcgfHwgaXNUYWJsZURhdGFMb2FkaW5nKSB8fCAoIWVmZmVjdGl2ZUlzRW1wdHlTdGF0ZSAmJiBwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDApOyBlbHNlIHN0b3J5RW1wdHlUcGxcIj5cbiAgICAgICAgICAgIDxhcHAtZHluYW1pYy10YWJsZVxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyLWJvdHRvbV09XCJwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDAgPyAnMXB4IHNvbGlkIHJnYigyMjYsIDIyNiwgMjI3KScgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29tcHV0ZWRDb2x1bW5zXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwicGFnZWRSb3dzXCJcbiAgICAgICAgICAgICAgW3Jvd1NlbGVjdGFibGVdPVwicm93U2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgIFtlbmFibGVMb2NhbFNvcnRdPVwiZW5hYmxlTG9jYWxTb3J0ICYmICFpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgICAgICBbaXNUYWJsZUxvYWRpbmddPVwiaXNUYWJsZUxvYWRpbmdcIlxuICAgICAgICAgICAgICBbaXNUYWJsZURhdGFMb2FkaW5nXT1cImlzVGFibGVEYXRhTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtjZWxsSnNvblBhdGhHZXR0ZXJdPVwiY2VsbEpzb25QYXRoR2V0dGVyXCJcbiAgICAgICAgICAgICAgW29uSnNvblBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2VuYWJsZVJvd1Jlb3JkZXJdPVwiaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICAgICAgKHJvd1Jlb3JkZXIpPVwib25Sb3dSZW9yZGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAoc29ydENoYW5nZSk9XCJzb3J0Q2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5VGFibGVUcGw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktOFwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2lsbHVzdHJhdGlvbnMvZW1wdHktc3RhdGUuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiY3FhLXctMzIgY3FhLWgtMzIgY3FhLW1iLTRcIiAvPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLW1iLTJcIj5ObyB0ZXN0IGNhc2VzPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLW1iLTRcIj5UcnkgYWRqdXN0aW5nIGZpbHRlcnMgb3IgY3JlYXRlIGEgbmV3IHRlc3QgY2FzZS48L3A+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgKGNsaWNrZWQpPVwidG9nZ2xlRmlsdGVyKClcIj5TaG93IEZpbHRlcnM8L2NxYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2FwcC1keW5hbWljLXRhYmxlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzdG9yeUVtcHR5VHBsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTYgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxjcWEtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZUlzRW1wdHlTdGF0ZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcudGl0bGVcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbnNdPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5hY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25FbXB0eUFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2NxYS1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtcGFnaW5hdGlvblxuICAgICAgICAgIFt0b3RhbEVsZW1lbnRzXT1cInNlcnZlclNpZGVQYWdpbmF0aW9uID8gdG90YWxFbGVtZW50cyA6IGZpbHRlcmVkUm93cy5sZW5ndGhcIlxuICAgICAgICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgICBbcGFnZVNpemVNZW51RGlyZWN0aW9uXT1cInBhZ2VTaXplTWVudURpcmVjdGlvblwiXG4gICAgICAgICAgW3BhZ2VJdGVtQ291bnRdPVwicGFnZWRSb3dzLmxlbmd0aFwiXG4gICAgICAgICAgKHBhZ2luYXRlKT1cIm9uUGFnaW5hdGUoJGV2ZW50KVwiXG4gICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgPC9jcWEtcGFnaW5hdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZXVzZWQgYnVsayBhY3Rpb24gdG9vbGJhciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYW55Um93U2VsZWN0ZWQgJiYgbW9kdWxhckNvbmZpZy5hbGxvd0J1bGtTZWxlY3Rpb24gJiYgIWlzUmVvcmRlcmluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1ib3R0b20tWzE4Ljc1cHhdIGNxYS1sZWZ0LVs1MCVdIGNxYS10cmFuc2xhdGUteC1bLTUwJV0gY3FhLXctZnVsbCBsZzpjcWEtbWF4LXctWzY4JV0gY3FhLXNtOm1heC13LVs3NSVdIGNxYS1tYXgtdy1bOTAlXSBjcWEtei1bMV1cIj5cbiAgICAgIDxjcWEtdGFibGUtYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwic2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgPyBzZWxlY3RlZEl0ZW1zIDogY3VycmVudFNlbGVjdGVkSXRlbXNcIlxuICAgICAgICBbYWN0aW9uc109XCJlZmZlY3RpdmVCdWxrQWN0aW9uc1wiXG4gICAgICAgIFtzaG93U2VsZWN0QWxsXT1cInNob3dTZWxlY3RBbGxJblRvb2xiYXJcIlxuICAgICAgICBbYWxsU2VsZWN0ZWRdPVwiYWxsU2VsZWN0ZWRJblRvb2xiYXJcIlxuICAgICAgICBbc2hvd0Rpc21pc3NdPVwic2hvd0Rpc21pc3NJblRvb2xiYXJcIlxuICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25CdWxrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAoc2VsZWN0QWxsQ2hhbmdlKT1cIm9uQnVsa1NlbGVjdEFsbCgkZXZlbnQpXCJcbiAgICAgICAgKGRpc21pc3MpPVwib25CdWxrRGlzbWlzcygpXCJcbiAgICAgID48L2NxYS10YWJsZS1hY3Rpb24tdG9vbGJhcj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
1711
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxhci10YWJsZS10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL21vZHVsYXItdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBS1osdUJBQXVCLEVBR3ZCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLHNCQUFzQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFLbEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQWlCdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN2RixNQUFNLE9BQU8sNkJBQTZCO0lBMFd4QyxZQUFvQixHQUFzQixFQUFVLGFBQTRCO1FBQTVELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUF6V2hGLG9CQUFvQjtRQUNYLHNCQUFpQixHQUFXLG1CQUFtQixDQUFDO1FBQ2hELGdCQUFXLEdBQVcsRUFBRSxD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QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFHRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBRUcsdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUVHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFHRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFPRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFRRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsc0JBQXNCO3NCQUEvQixNQUFNO2dCQU1FLGlCQUFpQjtzQkFBekIsS0FBSztnQkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBa0JHLGFBQWE7c0JBQXRCLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQVFHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFPRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBS0csV0FBVztzQkFBcEIsTUFBTTtnQkFNRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBTUcsUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDNEIsc0JBQXNCO3NCQUF4RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFtR3BCLGdCQUFnQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0ZpbHRlckl0ZW0sIER5bmFtaWNGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9maWx0ZXJzL2R5bmFtaWMtZmlsdGVyL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi90YWJsZS9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENvbHVtblZpc2liaWxpdHlDb25maWcgfSBmcm9tICcuLi8uLi9jb2x1bW4tdmlzaWJpbGl0eS9jb2x1bW4tdmlzaWJpbGl0eS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb24gfSBmcm9tICcuLi8uLi90YWJsZS1hY3Rpb24tdG9vbGJhci90YWJsZS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbmZpZyB9IGZyb20gJy4uLy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRU1QVFlfU1RBVEVfSU1BR0VTIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2ltYWdlcy9pbWFnZS1hc3NldHMuY29uc3RhbnRzJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9kaWFsb2cvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0NPTkZJRyxcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgREVGQVVMVF9SRU9SREVSX0xBQkVMUyxcbiAgRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgRm9sZGVyQ3JlYXRlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIEZvbGRlckRlbGV0ZVN0cmF0ZWd5LFxuICBGb2xkZXJEZWxldGVkUGF5bG9hZCxcbiAgRm9sZGVySWRBY2Nlc3NvcixcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkLFxuICBGb2xkZXJNb3ZlZFBheWxvYWQsXG4gIEZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZFBheWxvYWQsXG4gIE1vZHVsYXJDb25maWcsXG4gIE1vZHVsYXJMYWJlbHMsXG4gIFJlb3JkZXJMYWJlbHMsXG4gIFJlb3JkZXJTYXZlUGF5bG9hZCxcbiAgVGVzdHNNb3ZlZFBheWxvYWQsXG4gIEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZCxcbn0gZnJvbSAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5pbXBvcnQgeyBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZ3MvbmV3LWZvbGRlci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZUZvbGRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9kZWxldGUtZm9sZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW9kdWxhci10YWJsZS10ZW1wbGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvLyBTZWFyY2ggYmFyIGlucHV0c1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBjb21wb25lbnRzJztcbiAgQElucHV0KCkgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0V4cG9ydGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBTZWFyY2ggYmFyIG91dHB1dHNcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBvbkV4cG9ydENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrPzogJ1dFQkRSSVZFUl9JTycgfCAnU0VMRU5JVU1fSkFWQSc7IHNlbGVjdGVkSXRlbXM6IGFueVtdIH0gfCB2b2lkPigpO1xuICAvLyBGaWx0ZXIgb3V0cHV0c1xuICBAT3V0cHV0KCkgb25BcHBseUZpbHRlckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblJlc2V0RmlsdGVyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvbkNsZWFyQWxsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlQ2hpcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIEZpbHRlciBpbnB1dHNcbiAgQElucHV0KCkgZmlsdGVyQ29uZmlnOiBEeW5hbWljRmlsdGVySXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGZpbHRlck1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBPdGhlciBidXR0b25zIGlucHV0IChhcnJheSBvZiBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBPdGhlciBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBkcm9wZG93biBidXR0b24gdGVtcGxhdGVzL2NvbXBvbmVudHMpXG4gIEBJbnB1dCgpIG90aGVyRHJvcERvd25CdXR0b25zOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcbiAgXG4gIC8vIE90aGVyIHNlbGVjdCBkcm9wZG93biBidXR0b25zIGlucHV0IChhcnJheSBvZiBzZWxlY3QgZHJvcGRvd24gYnV0dG9uIHRlbXBsYXRlcy9jb21wb25lbnRzKVxuICBASW5wdXQoKSBvdGhlclNlbGVjdERyb3BEb3duQnV0dG9uczogVGVtcGxhdGVSZWY8YW55PltdID0gW107XG4gIFxuICAvLyBMZWdhY3kgc2luZ2xlIGJ1dHRvbiBpbnB1dHMgKGRlcHJlY2F0ZWQsIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25MYWJlbDogc3RyaW5nID0gJ090aGVyIEJ1dHRvbic7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Ugb3RoZXJCdXR0b25zIGFycmF5IGluc3RlYWQgKi9cbiAgQElucHV0KCkgb3RoZXJCdXR0b25WYXJpYW50OiAnZmlsbGVkJyB8ICdvdXRsaW5lZCcgfCAndGV4dCcgfCAnZWxldmF0ZWQnIHwgJ3RvbmFsJyB8ICdncmV5LXNvbGlkJyA9ICdmaWxsZWQnO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIG90aGVyQnV0dG9ucyBhcnJheSBpbnN0ZWFkICovXG4gIEBJbnB1dCgpIHNob3dPdGhlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBBY3Rpb24gbWVudSBidXR0b24gKHRocmVlLWRvdCBtZW51IGluIHRhYmxlIHJvd3MpXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFNldHRpbmdzIGFuZCByZWZyZXNoIGJ1dHRvbnNcbiAgQElucHV0KCkgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0F1dG9SZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBWaWV3LW1vZGUgdG9nZ2xlIChMaXN0IHwgTW9kdWxhcikuIEhpZGRlbiBieSBkZWZhdWx0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICBASW5wdXQoKSBzaG93Vmlld01vZGVUb2dnbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdmlld01vZGU6ICdsaXN0JyB8ICdtb2R1bGFyJyA9ICdsaXN0JztcbiAgQElucHV0KCkgdmlld01vZGVMYWJlbHM6IHsgbGlzdDogc3RyaW5nOyBtb2R1bGFyOiBzdHJpbmcgfSA9IHsgbGlzdDogJ0xpc3QnLCBtb2R1bGFyOiAnTW9kdWxhcicgfTtcbiAgQE91dHB1dCgpIHZpZXdNb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnbGlzdCcgfCAnbW9kdWxhcic+KCk7XG5cbiAgZ2V0IHZpZXdNb2RlU2VnbWVudHMoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5saXN0LCB2YWx1ZTogJ2xpc3QnLCBpY29uOiAndmlld19saXN0JyB9LFxuICAgICAgeyBsYWJlbDogdGhpcy52aWV3TW9kZUxhYmVscy5tb2R1bGFyLCB2YWx1ZTogJ21vZHVsYXInLCBpY29uOiAnZm9sZGVyJyB9LFxuICAgIF07XG4gIH1cblxuICBvblZpZXdNb2RlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPT09ICdtb2R1bGFyJyA/ICdtb2R1bGFyJyA6ICdsaXN0JztcbiAgICBpZiAobmV4dCAhPT0gdGhpcy52aWV3TW9kZSkge1xuICAgICAgdGhpcy52aWV3TW9kZSA9IG5leHQ7XG4gICAgICB0aGlzLnZpZXdNb2RlQ2hhbmdlLmVtaXQobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGF0YSBpbnB1dFxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuXG4gIC8vIEVtcHR5IHN0YXRlIGlucHV0c1xuICBASW5wdXQoKSBpc0VtcHR5U3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZUNvbmZpZzogRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICB0aXRsZTogJ05vIERhdGEgQXZhaWxhYmxlIFlldCcsXG4gICAgZGVzY3JpcHRpb246ICdSdW4gb3IgdXBsb2FkIHlvdXIgZmlyc3QgdGVzdCB0byBzZWUgeW91ciBhbmFseXRpY3MgYW5kIHRyZW5kcyBoZXJlLiBXYXRjaCB5b3VyIHF1YWxpdHkgbWV0cmljcyBjb21lIHRvIGxpZmUgd2l0aCByZWFsLXRpbWUgaW5zaWdodHMuJyxcbiAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLkRBU0hCT0FSRCxcbiAgICBhY3Rpb25zOiBbeyBsYWJlbDogJ1J1biBUZXN0IFN1aXRlJywgdmFyaWFudDogJ2ZpbGxlZCcgfV0sXG4gIH07XG5cbiAgLy8gQWN0aW9uIGJhciBpbnB1dHNcbiAgQElucHV0KCkgYWN0aW9uczogVGFibGVBY3Rpb25bXSA9IFtcbiAgICB7IFxuICAgICAgaWQ6ICdkZWxldGUnLCBcbiAgICAgIGxhYmVsOiAnRGVsZXRlJywgXG4gICAgICBpY29uOiAnZGVsZXRlJywgXG4gICAgICB0b29sdGlwOiAnRGVsZXRlIHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdlZGl0JywgXG4gICAgICBsYWJlbDogJ0VkaXQnLCBcbiAgICAgIGljb246ICdlZGl0JywgXG4gICAgICB0b29sdGlwOiAnRWRpdCBzZWxlY3RlZCcsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnRWRpdCBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2FkZC10YWcnLCBcbiAgICAgIGxhYmVsOiAnQWRkIFRhZycsIFxuICAgICAgaWNvbjogJ2xvY2FsX29mZmVyJywgXG4gICAgICB0b29sdGlwOiAnQWRkIHRhZ3MnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FkZCB0YWcgYWN0aW9uIGNsaWNrZWQ6JywgY29udGV4dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IFxuICAgICAgaWQ6ICdyZW1vdmUtdGFnJywgXG4gICAgICBsYWJlbDogJ1JlbW92ZSBUYWcnLCBcbiAgICAgIGljb246ICdsYWJlbF9vZmYnLCBcbiAgICAgIHRvb2x0aXA6ICdSZW1vdmUgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICBdO1xuXG4gIC8vIENoaXBzIGlucHV0c1xuICBASW5wdXQoKSBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICBASW5wdXQoKSBmaWx0ZXJBcHBsaWVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gVGFibGUgaW5wdXRzXG4gIEBJbnB1dCgpIGNvbHVtbnM6IER5bmFtaWNUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHJvd1NlbGVjdGFibGU/OiAocm93OiBhbnkpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgcGFnZUluZGV4OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbMTAsIDIwLCA0MCwgNjAsIDgwXTtcbiAgQElucHV0KCkgcGFnZVNpemVNZW51RGlyZWN0aW9uOiAnYXV0bycgfCAndXAnIHwgJ2Rvd24nID0gJ2F1dG8nO1xuICAvLyBTZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIGNvbnRyb2xzXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRvdGFsRWxlbWVudHM6IG51bWJlciA9IDA7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0+KCk7XG4gIC8qKlxuICAgKiBXaGVuIGZhbHNlLCBoZWFkZXIgc29ydCBkb2VzIG5vdCByZW9yZGVyIHJvd3MgbG9jYWxseSAodXNlIHdpdGggc2VydmVyU2lkZVBhZ2luYXRpb24gKyBzb3J0Q2hhbmdlKS5cbiAgICogRGVmYXVsdCB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlTG9jYWxTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBmaWVsZElkOiBzdHJpbmc7XG4gICAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbDtcbiAgfT4oKTtcbiAgLy8gTG9hZGVyIGNvbnRyb2xzIChwYXNzZWQgZG93biB0byBkeW5hbWljIHRhYmxlKVxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEJhY2t3YXJkLWNvbXBhdGliaWxpdHkgZmxhZzsgaWYgcHJvdmlkZWQsIGR5bmFtaWMgdGFibGUgd2lsbCB1c2UgaXQgd2hlbiBzcGVjaWZpYyBmbGFncyBhcmUgdW5kZWZpbmVkXG5cbiAgLy8gT3B0aW9uYWwgZ2V0dGVyIGZvciBKU09OIHBhdGggcGVyIGNlbGwuIFdoZW4gcHJvdmlkZWQsIGRvdWJsZS1jbGlja2luZyBhIGNlbGwgY29waWVzIHRoZSBwYXRoLlxuICBASW5wdXQoKSBjZWxsSnNvblBhdGhHZXR0ZXI/OiAocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZywgcm93OiBhbnkpID0+IHN0cmluZztcblxuICAvLyBPcHRpb25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIGEgSlNPTiBwYXRoIGlzIGNvcGllZCBmcm9tIGEgdGFibGUgY2VsbFxuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogc3RyaW5nIH0pID0+IHZvaWQ7XG5cbiAgLy8gU2VsZWN0ZWQgaXRlbXMgKGZ1bGwgb2JqZWN0cykgZm9yIG1haW50YWluaW5nIHNlbGVjdGlvbiBhY3Jvc3MgcGFnaW5hdGlvbiAoc2VydmVyLXNpZGUpXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIFwiU2VsZWN0IGFsbFwiIGFmZm9yZGFuY2UuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqIGZvciBub3cg4oCUIGhvc3Qgb3B0cyBpbi4gTWF0Y2hlcyB0aGUgY3VycmVudCBwcm9kdWN0IHJlcXVpcmVtZW50IHRvIGhpZGUgU2VsZWN0IEFsbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dTZWxlY3RBbGxJblRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGFjdGlvbiB0b29sYmFyIHJlbmRlcnMgdGhlIGRpc21pc3MgKMOXKSBhZmZvcmRhbmNlLiBEZWZhdWx0cyB0byBmYWxzZVxuICAgKiBmb3Igbm93IOKAlCBob3N0IG9wdHMgaW4uIE1hdGNoZXMgdGhlIGN1cnJlbnQgcHJvZHVjdCByZXF1aXJlbWVudCB0byBoaWRlIENhbmNlbC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dEaXNtaXNzSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBCb3VuZCB0byB0aGUgdG9vbGJhcidzIFwiU2VsZWN0IGFsbFwiIGNoZWNrYm94IOKAlCBkcml2ZXMgdGhlIGNoZWNrZWQgc3RhdGUuICovXG4gIEBJbnB1dCgpIGFsbFNlbGVjdGVkSW5Ub29sYmFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIGNvbHVtbiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgX2NvbHVtblZpc2liaWxpdHk6IENvbHVtblZpc2liaWxpdHlDb25maWcgPSB7fTtcbiAgcHJpdmF0ZSBfY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICBmaWx0ZXJlZFJvd3M6IGFueVtdID0gW107XG4gIHBhZ2VkUm93czogYW55W10gPSBbXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaW5wdXRzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgQElucHV0KCkgZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleHBhbmRlZEZvbGRlcklkczogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgdW5vcmdhbmlzZWRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgZm9sZGVySWRBY2Nlc3NvcjogRm9sZGVySWRBY2Nlc3NvciA9IChyb3c6IGFueSkgPT4gcm93Py5mb2xkZXJJZCA/PyBudWxsO1xuICBASW5wdXQoKSBtb2R1bGFyQ29uZmlnOiBNb2R1bGFyQ29uZmlnID0geyAuLi5ERUZBVUxUX01PRFVMQVJfQ09ORklHIH07XG4gIEBJbnB1dCgpIG1vZHVsYXJMYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgYnVsa0FjdGlvbnM6IFRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgc2lkZWJhckNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogTGF6eS1sb2FkOiB3aGVuIHRydWUsIHRoZSBzaWRlYmFyIGVtaXRzIGBzZWFyY2hDaGFuZ2VgIGFuZCBza2lwcyBpdHNcbiAgICogIGxvY2FsIG5hbWUgZmlsdGVyIHNvIHRoZSBob3N0IGNhbiBzZXJ2ZSBzZWFyY2ggcmVzdWx0cyBmcm9tIHRoZSBiYWNrZW5kLiAqL1xuICBASW5wdXQoKSBzZXJ2ZXJTaWRlU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMYXp5LWxvYWQ6IGJhY2tlbmQtcmVwb3J0ZWQgdG90YWwgcm9vdCBmb2xkZXJzLiBEcml2ZXMgdGhlIHNpZGViYXInc1xuICAgKiAgdG9wLWxldmVsIFwiTG9hZCBtb3JlXCIgYWZmb3JkYW5jZSB3aGVuIGBmb2xkZXJzLmxlbmd0aCA8IHJvb3RUb3RhbGAuICovXG4gIEBJbnB1dCgpIHJvb3RUb3RhbDogbnVtYmVyID0gMDtcbiAgLyoqIExhenktbG9hZDogdHJ1ZSB3aGlsZSB0aGUgaG9zdCBpcyBmZXRjaGluZyBzZXJ2ZXItc2lkZSBmb2xkZXItc2VhcmNoXG4gICAqICByZXN1bHRzLiBGb3J3YXJkZWQgdG8gdGhlIHNpZGViYXIgc28gaXQgY2FuIHJlbmRlciBhIHNlYXJjaCBzcGlubmVyLiAqL1xuICBASW5wdXQoKSBmb2xkZXJTZWFyY2hMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBMYXp5LWxvYWQ6IHRydWUgd2hpbGUgYSByb290LXBhZ2UgZmV0Y2ggaXMgaW4gZmxpZ2h0IChpbml0aWFsIGxvYWQgT1JcbiAgICogIHRoZSBzY3JvbGwtZHJpdmVuIFwibG9hZCBtb3JlXCIgcGFnaW5hdGlvbikuIERyaXZlcyB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICogIHRoZSBtb2R1bGFyIGdyaWQgcmVuZGVycyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgT3JnYW5pc2VkIHJvdywgYW5kIGlzXG4gICAqICBmb3J3YXJkZWQgdG8gdGhlIHNpZGViYXIgZm9yIGl0cyBvd24gbG9hZGluZyBhZmZvcmRhbmNlLiAqL1xuICBASW5wdXQoKSByb290Rm9sZGVyc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIE92ZXJyaWRlIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciBub2RlLiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlblxuICAgKiAgYGZpbmRGb2xkZXIoZm9sZGVycywgc2VsZWN0ZWRGb2xkZXJJZClgIG1pc3NlcyDigJQgZS5nLiwgZHVyaW5nIHNpZGViYXJcbiAgICogIHNlYXJjaCB3aGVuIGBmb2xkZXJzYCBob2xkcyBvbmx5IHRoZSBtYXRjaGVkIHJlc3VsdHMsIHRoZSBzZWxlY3RlZFxuICAgKiAgZm9sZGVyIG1heSBub3QgYmUgYW1vbmcgdGhlbSwgYnV0IGl0cyBicmVhZGNydW1iIC8gaGVhZGVyIGxhYmVsIHN0aWxsXG4gICAqICBuZWVkcyB0byByZW5kZXIuIFRoZSBob3N0IG93bnMgdGhlIGxvb2t1cCBhZ2FpbnN0IGl0cyBmdWxsIGZvbGRlciBtYXAuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVyTm9kZTogRm9sZGVyTm9kZSB8IG51bGwgPSBudWxsO1xuICAvKiogSG9zdC1wcm92aWRlZCBicmVhZGNydW1iIHNuYXBzaG90IGZvciB0aGUgc2VsZWN0ZWQgZm9sZGVyLiBVc2VkIGFzIGFcbiAgICogIGZhbGxiYWNrIGluIGBicmVhZGNydW1iVHJhaWxgIHdoZW4gYGJ1aWxkVHJhaWxgIGFnYWluc3QgYHRoaXMuZm9sZGVyc2BcbiAgICogIHlpZWxkcyBlbXB0eSDigJQgdGhlIGNhbm9uaWNhbCBjYXNlIGlzIHNpZGViYXIgc2VhcmNoLCB3aGVyZSBgZm9sZGVyc2BcbiAgICogIGlzIHRoZSBzZWFyY2gtcmVzdWx0cyBsaXN0IGFuZCB0aGUgc2VsZWN0ZWQgZm9sZGVyJ3MgYW5jZXN0b3JzIGFyZW4ndFxuICAgKiAgcHJlc2VudC4gVGhlIGhvc3Qgd2Fsa3MgYHBhcmVudElkYCBjaGFpbnMgdG8gYnVpbGQgdGhpczsgcGFydGlhbCB0cmFpbHNcbiAgICogIGFyZSBhY2NlcHRhYmxlIHdoZW4gYW5jZXN0b3JzIGhhdmVuJ3QgYmVlbiBmZXRjaGVkIHlldC4gKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRGb2xkZXJUcmFpbDogRm9sZGVyTm9kZVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBsaWJyYXJ5IG9wZW5zIGl0cyBvd24gTW92ZSBkaWFsb2cgZm9yIGNvbnZlbmllbmNlXG4gICAqIGR1cmluZyB0ZXN0aW5nLiBIb3N0cyB0YWtpbmcgb3ZlciBBUEkgKyBVWCBzaG91bGQgc2V0IHRoaXMgdG8gYGZhbHNlYCBhbmRcbiAgICogbGlzdGVuIG9uIGBtb3ZlUmVxdWVzdGVkYCB0byByZW5kZXIgdGhlaXIgb3duLlxuICAgKi9cbiAgQElucHV0KCkgdXNlSW50ZXJuYWxEaWFsb2dzOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgb3V0cHV0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEBPdXRwdXQoKSBmb2xkZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckV4cGFuc2lvblRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgZXhwYW5kZWQ6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIExhenktbG9hZDogcmUtZW1pdHRlZCBmcm9tIHRoZSBzaWRlYmFyIHdoZW4gdGhlIHVzZXIgZXhwYW5kcyBhIG5vZGUgd2hvc2VcbiAgICogIGNoaWxkcmVuIGhhdmVuJ3QgYmVlbiBmZXRjaGVkIHlldC4gSG9zdCByZXNwb25kcyBieSBmZXRjaGluZyB0aGF0IHN1YnRyZWUuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDaGlsZHJlblJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogTGF6eS1sb2FkOiByZS1lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBwZXItZm9sZGVyIFwiTG9hZCBtb3JlXCIuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyOyBuZXh0UGFnZTogbnVtYmVyIH0+KCk7XG4gIC8qKiBMYXp5LWxvYWQ6IHJlLWVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHRvcC1sZXZlbCBcIkxvYWQgbW9yZVwiLiAqL1xuICBAT3V0cHV0KCkgcm9vdExvYWRNb3JlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogTGF6eS1sb2FkOiBkZWJvdW5jZWQgc2lkZWJhci1zZWFyY2ggdGVybS4gQ29uc3VtZWQgYnkgaG9zdHMgdGhhdCBoYXZlXG4gICAqICBzZXQgYHNlcnZlclNpZGVTZWFyY2g9dHJ1ZWAgdG8gcmVmZXRjaCB0aGUgdHJlZSBmcm9tIHRoZSBiYWNrZW5kLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJDcmVhdGVkUGF5bG9hZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgXCIrIE5ldyBmb2xkZXJcIjsgaG9zdCBzaG91bGQgb3BlbiBhIGNyZWF0aW9uIG1vZGFsLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhcmVudElkOiBudW1iZXIgfCBudWxsIH0+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJSZW5hbWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJSZW5hbWVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGZvbGRlciBkZWxldGlvbiB2aWEgdGhlIGludGVybmFsIGRpYWxvZyAob3JcbiAgICogaW1tZWRpYXRlbHksIHdoZW4gYHVzZUludGVybmFsRGlhbG9nc2AgaXMgZmFsc2UgYW5kIHRoZSBob3N0IGRyaXZlcyB0aGUgVVgpLlxuICAgKiBQYXlsb2FkIG5vdyBpbmNsdWRlcyB0aGUgdXNlcidzIGNob3NlbiBgc3RyYXRlZ3lgIGZvciB3aGF0IGhhcHBlbnMgdG8gdGhlXG4gICAqIGZvbGRlcidzIHRlc3QgY2FzZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRGVsZXRlZFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSB0ZXN0c01vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0c01vdmVkUGF5bG9hZD4oKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQnVsayBhY3Rpb24gdG9vbGJhciBzdXJmYWNlIOKAlCBuYW1pbmcgbWlycm9ycyBjcWEtdGFibGUtdGVtcGxhdGUgc28gY29uc3VtZXJzXG4gIC8vIGdldCB0aGUgc2FtZSBldmVudHMgZnJvbSBlaXRoZXIgY29tcG9uZW50IChwbHVzIHRoZSBmb2xkZXIgZXZlbnRzIGJlbG93KS5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIEZpcmVzIG9uIHJhdyB0b29sYmFyIGFjdGlvbiBjbGljayDigJQgKmJlZm9yZSogYW55IGludGVybmFsIGRpYWxvZyBvcGVucy4gKi9cbiAgQE91dHB1dCgpIGJ1bGtBY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nOyBzZWxlY3RlZDogYW55W10gfT4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBcIlNlbGVjdCBhbGxcIiBpcyB0b2dnbGVkLiAqL1xuICBAT3V0cHV0KCkgYnVsa1NlbGVjdEFsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIHRvb2xiYXIncyBkaXNtaXNzICjDlykgaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIGJ1bGtEaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyAqYWZ0ZXIqIHRoZSBsaWJyYXJ5LWludGVybmFsIG1vdmUtdG8tZm9sZGVyIGRpYWxvZyByZXNvbHZlcyB3aXRoIGFcbiAgICogdXNlciBjb25maXJtYXRpb24sIE9SIGltbWVkaWF0ZWx5IGZvciBub24tZGlhbG9nIGJ1bGsgYWN0aW9ucyBzdXBwbGllZCBieVxuICAgKiB0aGUgaG9zdC4gSG9zdHMgd2l0aCB0aGVpciBvd24gVVggc2hvdWxkIGxpc3RlbiBvbiBgYnVsa0FjdGlvbkNsaWNrYCArXG4gICAqIGBtb3ZlUmVxdWVzdGVkYCBhbmQgdHJlYXQgdGhpcyBhcyB0aGUgXCJjb25maXJtZWRcIiBzaWduYWwuXG4gICAqL1xuICBAT3V0cHV0KCkgYnVsa0FjdGlvbkludm9rZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1bGtBY3Rpb25JbnZva2VkUGF5bG9hZD4oKTtcblxuICBAT3V0cHV0KCkgc2lkZWJhckNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJvdy1yZW9yZGVyIHN1cmZhY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogV2hlbiB0cnVlLCByZW5kZXJzIGEgXCJSZW9yZGVyXCIgYnV0dG9uIGluIHRoZSB0b29sYmFyLiBIb3N0LWRyaXZlbi4gKi9cbiAgQElucHV0KCkgc2hvd1Jlb3JkZXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIEhvc3QgZmxpcHMgdGhpcyB0cnVlIHdoaWxlIGl0cyBidWxrLXVwZGF0ZSBBUEkgY2FsbCBpcyBpbi1mbGlnaHQuIFRoZVxuICAgKiBjb21wb25lbnQga2VlcHMgdGhlIHJlb3JkZXIgVUkgcGlubmVkIChcIlNhdmluZy4uLlwiKSB3aGlsZSB0cnVlIGFuZCBleGl0c1xuICAgKiByZW9yZGVyIG1vZGUgd2hlbiBpdCBmbGlwcyBiYWNrIHRvIGZhbHNlICh0aGUgXCJmdXR1cmUgQVBJIGNhbGxcIiBob29rKS5cbiAgICovXG4gIEBJbnB1dCgpIHJlb3JkZXJTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFBhcnRpYWwgb3ZlcnJpZGUgZm9yIHRoZSBkZWZhdWx0IHJlb3JkZXIgbGFiZWxzIChcIlJlb3JkZXJcIiwgXCJEb25lXCIsIGV0Yy4pLiAqL1xuICBASW5wdXQoKSBzZXQgcmVvcmRlckxhYmVscyhwYXJ0aWFsOiBQYXJ0aWFsPFJlb3JkZXJMYWJlbHM+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUywgLi4uKHBhcnRpYWwgfHwge30pIH07XG4gIH1cbiAgZ2V0IHJlb3JkZXJMYWJlbHMoKTogUmVvcmRlckxhYmVscyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlb3JkZXJMYWJlbHM7XG4gIH1cbiAgcHJpdmF0ZSBfcmVvcmRlckxhYmVsczogUmVvcmRlckxhYmVscyA9IHsgLi4uREVGQVVMVF9SRU9SREVSX0xBQkVMUyB9O1xuXG4gIC8qKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIlJlb3JkZXJcIiBhbmQgdGhlIGNvbXBvbmVudCBlbnRlcnMgcmVvcmRlciBtb2RlLiAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJDYW5jZWxcIiDigJQgdGhlIG9yaWdpbmFsIG9yZGVyIGlzIGFscmVhZHkgcmVzdG9yZWQuICovXG4gIEBPdXRwdXQoKSByZW9yZGVyQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgXCJEb25lXCIuIEhvc3Qgc2hvdWxkIHRha2UgYG9yZGVyZWRJdGVtc2AsIGNhbGwgaXRzXG4gICAqIGJ1bGstdXBkYXRlIEFQSSwgcmVmcmVzaCBgW2RhdGFdYCwgYW5kIGZsaXAgYHJlb3JkZXJTYXZpbmdgIGJhY2sgdG8gYGZhbHNlYCDigJRcbiAgICogdGhlIGNvbXBvbmVudCB3aWxsIHRoZW4gZXhpdCByZW9yZGVyIG1vZGUuXG4gICAqXG4gICAqIE5vdGU6IGZvciBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uLCBgb3JkZXJlZEl0ZW1zYCBpcyB0aGUgKmN1cnJlbnQgcGFnZSBzbGljZSosXG4gICAqIG5vdCB0aGUgZnVsbCBkYXRhc2V0IOKAlCBzYW1lIGFzIHRoZSBpbi1tZW1vcnkgdmlldyB0aGUgdXNlciB3YXMgZHJhZ2dpbmcuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVvcmRlclNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFJlb3JkZXJTYXZlUGF5bG9hZD4oKTtcblxuICAvKiogSW50ZXJuYWwg4oCUIHRydWUgd2hpbGUgdGhlIHVzZXIgaXMgaW4gcmVvcmRlciBtb2RlLiAqL1xuICBpc1Jlb3JkZXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFNuYXBzaG90IG9mIGBwYWdlZFJvd3NgIHRha2VuIG9uIGVudGVyOyB1c2VkIHRvIHJldmVydCBvbiBjYW5jZWwuICovXG4gIHByaXZhdGUgcmVvcmRlclNuYXBzaG90OiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZnQgb2YgdGhlIHJlb3JkZXJlZCByb3dzIChjdXJyZW50IHdvcmtpbmcgc3RhdGUpLiAqL1xuICBwcml2YXRlIHJlb3JkZXJEcmFmdDogYW55W10gfCBudWxsID0gbnVsbDtcbiAgLyoqIEF1dG8tcmVmcmVzaCBpbnRlcnZhbCBjYXB0dXJlZCBvbiBlbnRlciwgc28gd2UgY2FuIHJlc3RvcmUgb24gY2FuY2VsL2RvbmUuICovXG4gIHByaXZhdGUgcmVvcmRlclNhdmVkQXV0b1JlZnJlc2g6IG51bWJlciA9IDA7XG4gIC8qKiBUcnVlIGFmdGVyIERvbmUgaGFzIGJlZW4gY2xpY2tlZCwgYXdhaXRpbmcgdGhlIGhvc3QncyBgcmVvcmRlclNhdmluZ2Ag4oaSIGZhbHNlIGZsaXAuICovXG4gIHByaXZhdGUgcmVvcmRlckF3YWl0aW5nU2F2ZUZsaXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiTW92ZSB0byBmb2xkZXJcIiBidWxrIGFjdGlvbiDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGRpYWxvZyBvcGVucy4gSG9zdHMgdGhhdCB3YW50IHRvIHJlbmRlciB0aGVpciBvd24gbW9kYWwgc2hvdWxkXG4gICAqIHNldCBgdXNlSW50ZXJuYWxEaWFsb2dzID0gZmFsc2VgIGFuZCBsaXN0ZW4gaGVyZS5cbiAgICovXG4gIEBPdXRwdXQoKSBtb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBzZWxlY3RlZDogYW55W107XG4gICAgY3VycmVudEZvbGRlcklkOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbGRlcnM6IEZvbGRlck5vZGVbXTtcbiAgfT4oKTtcblxuICAvKiogRmlyZXMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCdzIGBzZWxlY3RlZEl0ZW1zYCBjaGFuZ2VzIGZyb20gd2l0aGluIChTZWxlY3QgQWxsIC8gRGlzbWlzcykuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBmb2xkZXIncyBkZWxldGUgYWZmb3JkYW5jZSDigJQgKmJlZm9yZSogdGhlXG4gICAqIGludGVybmFsIGNvbmZpcm1hdGlvbiBkaWFsb2cgb3BlbnMuIEhvc3RzIG93bmluZyB0aGUgVVggbGlzdGVuIGhlcmUuXG4gICAqIFBheWxvYWQgaW5jbHVkZXMgYHRlc3RDb3VudGAgKyBgaGFzUGFyZW50YCBzbyBob3N0cyBjYW4gcmVuZGVyIHRoZSByaWdodFxuICAgKiBvcHRpb25zIGluIHRoZWlyIG93biBtb2RhbC5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEZWxldGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHVzZXIgcGlja3MgXCJNb3ZlIGZvbGRlclwiIGZyb20gYSBmb2xkZXIgcm93J3MgY29udGV4dCBtZW51IOKAlFxuICAgKiAqYmVmb3JlKiBhbnkgZGlhbG9nIG9wZW5zLiBIb3N0cyBvd25pbmcgdGhlIFVYIGxpc3RlbiBoZXJlIHdpdGhcbiAgICogYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgb3BlbiB0aGVpciBvd24gZm9sZGVyIHBpY2tlci5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIHRoZSB1c2VyIGNvbmZpcm1zIGEgZm9sZGVyIG1vdmUgdmlhIHRoZSBpbnRlcm5hbCBwaWNrZXJcbiAgICogKG9yIGltbWVkaWF0ZWx5IHdoZW4gYHVzZUludGVybmFsRGlhbG9ncyA9IGZhbHNlYCBhbmQgdGhlIGhvc3QgZHJpdmVzIGl0KS5cbiAgICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyTW92ZWRQYXlsb2FkPigpO1xuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdXNlciBwaWNrcyBcIkR1cGxpY2F0ZSBmb2xkZXJcIiBmcm9tIGEgZm9sZGVyIHJvdydzIGNvbnRleHQgbWVudS5cbiAgICogVGhlIGxpYnJhcnkgZG9lc24ndCBvd24gcGVyc2lzdGVuY2UsIHNvIHRoZSBob3N0IGlzIGV4cGVjdGVkIHRvIGNsb25lIHRoZVxuICAgKiBmb2xkZXIncyBzdWJ0cmVlIHNlcnZlci1zaWRlIGFuZCAqcmVmZXJlbmNlKiAobm90IGNvcHkpIHRoZSB0ZXN0IGNhc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkUGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSkge31cbiAgcHJpdmF0ZSBwZW5kaW5nRmlsdGVyczogYW55O1xuICBwcml2YXRlIGFwcGxpZWRGaWx0ZXJzOiBhbnk7XG4gIHByaXZhdGUgYXV0b1JlZnJlc2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25BdXRvUmVmcmVzaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uVmlzaWJpbGl0eUNvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGF1dG9SZWZyZXNoSW50ZXJ2YWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQFZpZXdDaGlsZChEeW5hbWljRmlsdGVyQ29tcG9uZW50KSBkeW5hbWljRmlsdGVyQ29tcG9uZW50PzogRHluYW1pY0ZpbHRlckNvbXBvbmVudDtcblxuICAvLyBEZXJpdmVkIGNvbHVtbnMgd2l0aCB2aXNpYmlsaXR5IGFwcGxpZWQuXG4gIGNvbXB1dGVkQ29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLy8gQXV0by1nZW5lcmF0ZWQgdmlzaWJpbGl0eSBjb2x1bW5zIGZyb20gY29sdW1ucyBpbnB1dFxuICB2aXNpYmlsaXR5Q29sdW1uczogQXJyYXk8eyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wdXRlZENvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJpbGl0eSA9IHRoaXMuX2NvbHVtblZpc2liaWxpdHkgfHwge307XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5jb2x1bW5zIHx8IFtdO1xuICAgIGNvbnN0IG1hcHBlZCA9IHNvdXJjZS5tYXAoY29sID0+IHtcbiAgICAgIGlmIChbJ2NoZWNrYm94JywgJ2FjdGlvbnMnXS5pbmNsdWRlcyhjb2wuZmllbGRJZCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3cgPSB2aXNpYmlsaXR5W2NvbC5maWVsZElkXTtcbiAgICAgIHJldHVybiB7IC4uLmNvbCwgaXNTaG93OiBzaG93ICE9PSBmYWxzZSB9O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubW9kdWxhckNvbmZpZz8uc2hvd0ZvbGRlckNvbHVtbiAmJiAhbWFwcGVkLnNvbWUoYyA9PiBjLmZpZWxkSWQgPT09IEZPTERFUl9DT0xVTU5fRklFTERfSUQpKSB7XG4gICAgICBjb25zdCBmb2xkZXJTaG93ID0gdmlzaWJpbGl0eVtGT0xERVJfQ09MVU1OX0ZJRUxEX0lEXTtcbiAgICAgIGNvbnN0IGZvbGRlckNvbDogRHluYW1pY1RhYmxlQ29sdW1uID0ge1xuICAgICAgICAuLi50aGlzLmJ1aWxkRm9sZGVyQ29sdW1uKCksXG4gICAgICAgIGlzU2hvdzogZm9sZGVyU2hvdyAhPT0gZmFsc2UsXG4gICAgICB9O1xuICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgdHJhaWxpbmcgJ2FjdGlvbnMnIGNvbHVtbiB3aGVuIHByZXNlbnQgc28gdGhlIGZvbGRlclxuICAgICAgLy8gY29sdW1uIHJlYWRzIGFzIHRoZSBsYXN0IGRhdGEgY29sdW1uIHJhdGhlciB0aGFuIGFmdGVyIHRoZSBhY3Rpb24gbWVudS5cbiAgICAgIGNvbnN0IGFjdGlvbnNJZHggPSBtYXBwZWQuZmluZEluZGV4KGMgPT4gYy5maWVsZElkID09PSAnYWN0aW9ucycpO1xuICAgICAgaWYgKGFjdGlvbnNJZHggPj0gMCkge1xuICAgICAgICBtYXBwZWQuc3BsaWNlKGFjdGlvbnNJZHgsIDAsIGZvbGRlckNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucHVzaChmb2xkZXJDb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcHV0ZWRDb2x1bW5zID0gbWFwcGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvbGRlckNvbHVtbigpOiBEeW5hbWljVGFibGVDb2x1bW4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZElkOiBGT0xERVJfQ09MVU1OX0ZJRUxEX0lELFxuICAgICAgZmllbGROYW1lOiB0aGlzLm1vZHVsYXJMYWJlbHM/LmZvbGRlckNvbHVtbkxhYmVsIHx8ICdGb2xkZXInLFxuICAgICAgLy8gTGV0cyB0aGUgZHluYW1pYyB0YWJsZSBzb3J0L2ZpbHRlciBvbiB0aGUgcmVzb2x2ZWQgbmFtZSB3aXRob3V0IGdvaW5nXG4gICAgICAvLyB0aHJvdWdoIHJlbmRlcigpIOKAlCBhbHNvIG1ha2VzIGByb3cuZm9sZGVyTmFtZWAgYSBmaXJzdC1jbGFzcyBmaWVsZFxuICAgICAgLy8gYWxvbmdzaWRlIHJvdy5wcmlvcml0eSBldGMuIGZvciBkb3duc3RyZWFtIGNvZGUuXG4gICAgICBmaWVsZFZhbHVlOiAnZm9sZGVyTmFtZScsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIC8vIGlzRGVmYXVsdCA9PT0gZmFsc2UgbWFya3MgdGhlIGNvbHVtbiBhcyBcInVzZXItdG9nZ2xlYWJsZVwiIOKAlCBpdCBzaG93cyB1cFxuICAgICAgLy8gaW4gbWFwVmlzaWJpbGl0eUNvbHVtbnMgYW5kIHRoZXJlZm9yZSBpbiB0aGUgc2V0dGluZ3MgZHJvcGRvd24uXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcmVuZGVyOiAocm93OiBhbnkpID0+IHRoaXMucmVuZGVyRm9sZGVyQ2VsbChyb3cpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVGb2xkZXJOYW1lKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBpZiAocm93ICYmIHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIHtcbiAgICAgIHJldHVybiByb3cuZm9sZGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgY29uc3Qgbm9kZSA9IGZvbGRlcklkICE9IG51bGwgPyB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBmb2xkZXJJZCBhcyBudW1iZXIpIDogbnVsbDtcbiAgICByZXR1cm4gbm9kZT8ubmFtZSB8fCB0aGlzLm1vZHVsYXJMYWJlbHM/LnVub3JnYW5pc2VkUm93TGFiZWwgfHwgJ1Vub3JnYW5pc2VkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBkZXJpdmVkIGBmb2xkZXJOYW1lYCB0byBlYWNoIHJvdyB3aGVuIHRoZSBob3N0IGhhc24ndCBzdXBwbGllZFxuICAgKiBvbmUuIE11dGF0ZXMgaW4gcGxhY2Ugc28gdGhlIHZhbHVlIGlzIGF2YWlsYWJsZSBldmVyeXdoZXJlIHRoZSByb3cgZmxvd3NcbiAgICog4oCUIHNvcnQsIGZpbHRlciwgY29sdW1uIHJlbmRlcnMsIGV4cG9ydHMg4oCUIGFsb25nc2lkZSBmaWVsZHMgbGlrZSBwcmlvcml0eS5cbiAgICovXG4gIHByaXZhdGUgZW5yaWNoUm93c1dpdGhGb2xkZXJOYW1lKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgaWYgKCFyb3cgfHwgdHlwZW9mIHJvdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiByb3cuZm9sZGVyTmFtZSA9PT0gJ3N0cmluZycgJiYgcm93LmZvbGRlck5hbWUpIGNvbnRpbnVlO1xuICAgICAgcm93LmZvbGRlck5hbWUgPSB0aGlzLnJlc29sdmVGb2xkZXJOYW1lKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJGb2xkZXJDZWxsKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXNvbHZlRm9sZGVyTmFtZShyb3cpO1xuICAgIGNvbnN0IGVzY2FwZWQgPSBuYW1lLnJlcGxhY2UoL1smPD5cIiddL2csIGNoID0+ICh7XG4gICAgICAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsIFwiJ1wiOiAnJiMzOTsnLFxuICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbY2hdKTtcbiAgICByZXR1cm4gKFxuICAgICAgYDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRleHQtWyM2RDZENzRdXCI+YCArXG4gICAgICAgIGA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5gICtcbiAgICAgICAgICBgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+YCArXG4gICAgICAgIGA8L3N2Zz5gICtcbiAgICAgICAgYDxzcGFuPiR7ZXNjYXBlZH08L3NwYW4+YCArXG4gICAgICBgPC9zcGFuPmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucyA9IHRoaXMubWFwVmlzaWJpbGl0eUNvbHVtbnMoKTtcbiAgICB0aGlzLnZpc2liaWxpdHlDb2x1bW5zID0gdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBDb250cm9sbGVkIGNvbHVtbiB2aXNpYmlsaXR5OiBwYXJlbnQgY2FuIHNlZWQgYW5kIHB1c2ggdXBkYXRlcy5cbiAgQElucHV0KCkgc2V0IGNvbHVtblZpc2liaWxpdHkoY2ZnOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNmZykge1xuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eSA9IHsgLi4uY2ZnIH07XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGdldCBjb2x1bW5WaXNpYmlsaXR5KCk6IENvbHVtblZpc2liaWxpdHlDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5O1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5Q29sdW1ucygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snaXNFbXB0eVN0YXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ21vZHVsYXJDb25maWcnXSB8fCBjaGFuZ2VzWydtb2R1bGFyTGFiZWxzJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydmb2xkZXJzJ10gJiYgIWNoYW5nZXNbJ2ZvbGRlcnMnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gRm9sZGVyIG5hbWUgbG9va3VwIGxpdmVzIGluc2lkZSB0aGUgY29sdW1uJ3MgcmVuZGVyKCk7IHJlYnVpbGQgdGhlXG4gICAgICAvLyBjb2x1bW5zIGFycmF5IHNvIHRoZSBkeW5hbWljIHRhYmxlJ3MgT25QdXNoIENEIHBpY2tzIHVwIHRoZSBuZXcgcmVmXG4gICAgICAvLyBhbmQgcmUtaW52b2tlcyByZW5kZXIoKSB3aXRoIHRoZSBsYXRlc3QgZm9sZGVycy4gQWxzbyByZWZyZXNoIGFueVxuICAgICAgLy8gcm93cyB3ZSd2ZSBwcmV2aW91c2x5IGVucmljaGVkIHNvIHNvcnQvZmlsdGVyIG9uIHJvdy5mb2xkZXJOYW1lXG4gICAgICAvLyByZWZsZWN0cyB0aGUgbmV3IGZvbGRlciBsaXN0LlxuICAgICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEZvbGRlcklkJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkRm9sZGVySWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gUGVyIHRoZSBhcHByb3ZlZCBwbGFuOiBjbGVhciBzZWxlY3Rpb24gYW5kIHJlc2V0IHBhZ2luYXRpb24gb24gZm9sZGVyIGNoYW5nZS5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmlld01vZGUnXSAmJiAhY2hhbmdlc1sndmlld01vZGUnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gU3dpdGNoaW5nIGJldHdlZW4gbGlzdCBhbmQgbW9kdWxhciBjaGFuZ2VzIHdoZXRoZXIgdGhlIGZvbGRlciBmaWx0ZXIgYXBwbGllcy5cbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlbXMnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10gJiYgIWNoYW5nZXNbJ3Jlb3JkZXJTYXZpbmcnXS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3Qgbm93U2F2aW5nID0gISFjaGFuZ2VzWydyZW9yZGVyU2F2aW5nJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSG9zdCBmaW5pc2hlZCBpdHMgYnVsay11cGRhdGUgY2FsbCDigJQgZXhpdCByZW9yZGVyIG1vZGUuXG4gICAgICBpZiAoIW5vd1NhdmluZyAmJiB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwKSB7XG4gICAgICAgIHRoaXMuZXhpdFJlb3JkZXJNb2RlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnJpY2hSb3dzV2l0aEZvbGRlck5hbWUodGhpcy5kYXRhKTtcblxuICAgIC8vIEluIHNlcnZlci1zaWRlIG1vZGUsIGFzc3VtZSBpbmNvbWluZyBkYXRhIGlzIGFscmVhZHkgYSBwYWdlIHNsaWNlXG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICB0aGlzLnBhZ2VkUm93cyA9IFsuLi50aGlzLmZpbHRlcmVkUm93c107XG4gICAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5WaXNpYmlsaXR5KCk7XG4gICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb25TdGF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5pbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBgZmlsdGVyZWRSb3dzYCBmcm9tIGBkYXRhYCBieSBhcHBseWluZyAoYSkgdGhlIGZpZWxkIGZpbHRlcnMgKHN0YXR1cy9wcmlvcml0eS9ldGMuKVxuICAgKiBhbmQgKGIpIHRoZSBmb2xkZXIgZmlsdGVyIGRlcml2ZWQgZnJvbSBgc2VsZWN0ZWRGb2xkZXJJZGAgKyBgZm9sZGVySWRBY2Nlc3NvcmAuXG4gICAqL1xuICBwcml2YXRlIHJlYnVpbGRGaWx0ZXJlZFJvd3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gdGhpcy5hcHBsaWVkRmlsdGVycyA/PyB7fTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZGF0YS5maWx0ZXIociA9PiB0aGlzLnBhc3NGaWx0ZXJzKGVmZmVjdGl2ZSwgcikgJiYgdGhpcy5wYXNzRm9sZGVyKHIpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFzc0ZvbGRlcihyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIExpc3QgdmlldyBpZ25vcmVzIGZvbGRlciBmaWx0ZXJpbmcgZW50aXJlbHkg4oCUIGJlaGF2ZXMgbGlrZSB0aGUgdHJhZGl0aW9uYWwgZmxhdCB0YWJsZS5cbiAgICBpZiAoIXRoaXMuaXNNb2R1bGFyVmlldykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgZm9sZGVySWQgPSB0aGlzLmZvbGRlcklkQWNjZXNzb3IgPyB0aGlzLmZvbGRlcklkQWNjZXNzb3Iocm93KSA6IHJvdz8uZm9sZGVySWQ7XG4gICAgLy8gUm9vdCB2aWV3OiBzaG93IG9ubHkgcm93cyB0aGF0IGRvIG5vdCBiZWxvbmcgdG8gYW55IGZvbGRlciAodGhlIFwiVW5vcmdhbmlzZWRcIiBidWNrZXQpLlxuICAgIC8vIEZvbGRlciB0aWxlcyBhYm92ZSB0aGUgdGFibGUgYXJlIHRoZSBlbnRyeSBwb2ludCB0byBwZXItZm9sZGVyIGNvbnRlbnRzLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvbGRlcklkID09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmb2xkZXJJZCAhPSBudWxsICYmIFN0cmluZyhmb2xkZXJJZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIG1vZHVsYXIgKGZvbGRlci1hd2FyZSkgVUkuICovXG4gIGdldCBpc01vZHVsYXJWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdNb2RlID09PSAnbW9kdWxhcic7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIElEcyBmcm9tIHNlbGVjdGVkSXRlbXMgKG9iamVjdHMpXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzKCk6IFNldDxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gTnVtYmVyKGl0ZW0uaWQpKS5maWx0ZXIoaWQgPT4gIWlzTmFOKGlkKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJZHNTZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gSWYgbm8gc2VsZWN0ZWQgSURzLCBjbGVhciBhbGwgc2VsZWN0aW9uIHN0YXRlc1xuICAgICAgaWYgKHRoaXMucGFnZWRSb3dzKSB7XG4gICAgICAgIHRoaXMucGFnZWRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gc3RhdGUgYmFzZWQgb24gc2VsZWN0ZWRJdGVtc1xuICAgIGlmICh0aGlzLnBhZ2VkUm93cykge1xuICAgICAgdGhpcy5wYWdlZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93ICYmIHJvdy5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHJvdyBhcyBhbnkpLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZElkc1NldC5oYXMoTnVtYmVyKHJvdy5pZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBmaWx0ZXJlZFJvd3MgZm9yIGNvbnNpc3RlbmN5XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGlmIChyb3cgJiYgcm93LmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAocm93IGFzIGFueSkuaXNTZWxlY3RlZCA9IHNlbGVjdGVkSWRzU2V0LmhhcyhOdW1iZXIocm93LmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29sdW1uVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBDYWNoZSB2aXNpYmlsaXR5IGNvbHVtbnMgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IGFycmF5cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5fY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnMgPSB0aGlzLm1hcFZpc2liaWxpdHlDb2x1bW5zKCk7XG4gICAgLy8gU2VlZCB2aXNpYmlsaXR5IHN0YXRlIGZyb20gZWFjaCBjb2x1bW4ncyBpc1Nob3cgKGRlZmF1bHQgdG8gdHJ1ZSkgc28gY29uc3VtZXJzXG4gICAgLy8gY2FuIHByZS1hcHBseSBwZXJzaXN0ZWQgcHJlZmVyZW5jZXMgdmlhIGNvbHVtbnNbaV0uaXNTaG93LlxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucykge1xuICAgICAgaWYgKHRoaXMuX2NvbHVtblZpc2liaWxpdHlbY29sLmlkXSAhPT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHNyY0NvbCA9IHNvdXJjZS5maW5kKGMgPT4gYy5maWVsZElkID09PSBjb2wuaWQpO1xuICAgICAgaWYgKHNyY0NvbCkge1xuICAgICAgICAvLyBIb3N0LXN1cHBsaWVkIGNvbHVtbiDigJQgaG9ub3VyIGl0cyBpc1Nob3cgZXhhY3RseSwgaW5jbHVkaW5nIGZvciB0aGVcbiAgICAgICAgLy8gZm9sZGVyIGNvbHVtbi4gSG9zdHMgd2FudGluZyB2aWV3LW1vZGUtYXdhcmUgZGVmYXVsdHMgc2hvdWxkIHNldFxuICAgICAgICAvLyBpc1Nob3cgdGhlbXNlbHZlcy5cbiAgICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gc3JjQ29sLmlzU2hvdyAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkge1xuICAgICAgICAvLyBBdXRvLWluamVjdGVkIGZvbGRlciBjb2x1bW4gKGhvc3QgZGlkIG5vdCBzdXBwbHkgb25lKTogZGVmYXVsdCB0b1xuICAgICAgICAvLyB2aXNpYmxlIGluIGxpc3QgdmlldywgaGlkZGVuIGluIG1vZHVsYXIgdmlldy4gVGhlIHVzZXIncyB0b2dnbGVcbiAgICAgICAgLy8gcGVyc2lzdHMgYWNyb3NzIHZpZXdNb2RlIGZsaXBzIG9uY2Ugc2VlZGVkLlxuICAgICAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5W2NvbC5pZF0gPSB0aGlzLnZpZXdNb2RlID09PSAnbGlzdCc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgYW55Um93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzZWxlY3RlZCBpdGVtcyAoZWl0aGVyIG9uIGN1cnJlbnQgcGFnZSBvciBhY3Jvc3MgYWxsIHBhZ2VzIHZpYSBzZWxlY3RlZEl0ZW1zKVxuICAgIGNvbnN0IGhhc1NlbGVjdGVkT25QYWdlID0gISEodGhpcy5wYWdlZFJvd3MgJiYgdGhpcy5wYWdlZFJvd3Muc29tZShyID0+ICEhKHIgYXMgYW55KS5pc1NlbGVjdGVkKSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJZHNTZXQgPSB0aGlzLmdldFNlbGVjdGVkSWRzKCk7XG4gICAgY29uc3QgaGFzU2VsZWN0ZWRBY3Jvc3NQYWdlcyA9IHNlbGVjdGVkSWRzU2V0LnNpemUgPiAwO1xuICAgIHJldHVybiBoYXNTZWxlY3RlZE9uUGFnZSB8fCBoYXNTZWxlY3RlZEFjcm9zc1BhZ2VzO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3RlZEl0ZW1zKCk6IGFueVtdIHtcbiAgICAvLyBJZiBzZWxlY3RlZEl0ZW1zIChmdWxsIG9iamVjdHMpIGFyZSBwcm92aWRlZCwgdXNlIHRoZW0gZGlyZWN0bHlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIHNlbGVjdGVkIGl0ZW1zIGFyZSByZXR1cm5lZCwgaW5jbHVkaW5nIHRob3NlIGZyb20gb3RoZXIgcGFnZXNcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogRm9yIGNsaWVudC1zaWRlIHBhZ2luYXRpb24gb3Igd2hlbiBzZWxlY3RlZEl0ZW1zIGlzIG5vdCBwcm92aWRlZCxcbiAgICAvLyBmaWx0ZXIgcGFnZWRSb3dzIHRvIGdldCBzZWxlY3RlZCBpdGVtcyBmcm9tIGN1cnJlbnQgcGFnZSBvbmx5XG4gICAgaWYgKCF0aGlzLnBhZ2VkUm93cyB8fCB0aGlzLnBhZ2VkUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZElkc1NldCA9IHRoaXMuZ2V0U2VsZWN0ZWRJZHMoKTtcbiAgICBcbiAgICAvLyBGaWx0ZXIgcm93cyB0aGF0IGFyZSBzZWxlY3RlZFxuICAgIHJldHVybiB0aGlzLnBhZ2VkUm93c1xuICAgICAgLmZpbHRlcihyID0+IHtcbiAgICAgICAgaWYgKCFyIHx8IHIuaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByb3dJZCA9IE51bWJlcihyLmlkKTtcbiAgICAgICAgLy8gSW5jbHVkZSBpZiBlaXRoZXI6XG4gICAgICAgIC8vIDEuIFRoZSByb3cgaGFzIGlzU2VsZWN0ZWQgPSB0cnVlIChjdXJyZW50IHBhZ2Ugc2VsZWN0aW9uKVxuICAgICAgICAvLyAyLiBUaGUgcm93J3MgSUQgaXMgaW4gc2VsZWN0ZWRJdGVtcyAoc2VsZWN0ZWQgb24gb3RoZXIgcGFnZXMgb3IgcmVzdG9yZWQgc2VsZWN0aW9uKVxuICAgICAgICByZXR1cm4gISEociBhcyBhbnkpLmlzU2VsZWN0ZWQgfHwgc2VsZWN0ZWRJZHNTZXQuaGFzKHJvd0lkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYWN0aW9uQ2xpY2soZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2FjdGlvbiB0b29sYmFyJywgZGF0YSk7XG4gIH1cblxuICB2aWV3KGlkOiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnVmlldycsIGlkKTtcbiAgfVxuXG4gIGVkaXQocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRWRpdCcsIHJvdyk7XG4gIH1cblxuICBkZWxldGUocm93OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlJywgcm93KTtcbiAgfVxuXG4gIHRvZ2dsZUZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dGaWx0ZXJQYW5lbCA9ICF0aGlzLnNob3dGaWx0ZXJQYW5lbDtcbiAgfVxuXG4gIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjZmc6IENvbHVtblZpc2liaWxpdHlDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5ID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkQ29sdW1ucygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KHsgLi4uY2ZnIH0pO1xuICB9XG5cbiAgb25BdXRvUmVmcmVzaENoYW5nZShpbnRlcnZhbE1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbCA9IGludGVydmFsTXM7XG4gICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKGludGVydmFsTXMpO1xuICAgIHRoaXMuYXV0b1JlZnJlc2hJbnRlcnZhbENoYW5nZS5lbWl0KGludGVydmFsTXMpO1xuICAgIHRoaXMudHJpZ2dlclJlbG9hZCgpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWYWx1ZSBjaGFuZ2VkJywgdmFsdWUpO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBzZWFyY2godmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWFyY2gnLCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhcmVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDbGVhcmVkJyk7XG4gIH1cblxuICBvbkVtcHR5QWN0aW9uKGFjdGlvbjogYW55KSB7XG4gICAgaWYgKGFjdGlvbj8ubGFiZWwgPT09ICdTaG93IGZpbHRlcnMnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyc0NoYW5nZWQoY3VycmVudDogYW55KTogdm9pZCB7XG4gICAgLy8gRGVmZXIgYXBwbHlpbmcgZmlsdGVycyBhbmQgdXBkYXRpbmcgY2hpcHMgdW50aWwgQXBwbHkgRmlsdGVyIGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gY3VycmVudDtcbiAgfVxuXG4gIG9uRmlsdGVyc0FwcGxpZWQoYXBwbGllZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmlsdGVyUGFuZWwgPSBmYWxzZTtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBhcHBsaWVkID8/IHRoaXMucGVuZGluZ0ZpbHRlcnMgPz8ge307XG4gICAgdGhpcy5hcHBsaWVkRmlsdGVycyA9IGVmZmVjdGl2ZTtcbiAgICB0aGlzLnJlYnVpbGRGaWx0ZXJlZFJvd3MoKTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgICBjb25zdCBjaGlwczogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IGZ1bGxUZXh0Pzogc3RyaW5nOyBoYXNNb3JlPzogYm9vbGVhbiB9PiA9IFtdO1xuICAgIGlmIChlZmZlY3RpdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVmZmVjdGl2ZSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlZmZlY3RpdmVba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlciBjb25maWcgaXRlbSBmb3IgdGhpcyBrZXlcbiAgICAgICAgY29uc3QgZmlsdGVyQ29uZmlnSXRlbSA9IHRoaXMuZmlsdGVyQ29uZmlnPy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBmaWx0ZXJDb25maWdJdGVtPy5vcHRpb25zIHx8IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgZGlzcGxheSB0ZXh0IGZyb20gb3B0aW9uc1xuICAgICAgICBjb25zdCBnZXREaXNwbGF5VGV4dCA9ICh2YWw6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgLy8gSWYgdmFsdWUgaXMgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCBuYW1lL2xhYmVsLCB1c2UgaXRcbiAgICAgICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICh2YWwubmFtZSB8fCB2YWwubGFiZWwgfHwgdmFsLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5uYW1lID8/IHZhbC5sYWJlbCA/PyBTdHJpbmcodmFsLnZhbHVlID8/IHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG9wdGlvbiBpbiB0aGUgY29uZmlnXG4gICAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0SWQgPSBvcHQuaWQgPz8gb3B0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgb3B0VmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB2YWxTdHIgPSBTdHJpbmcodmFsKTtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcob3B0SWQpID09PSB2YWxTdHIgfHwgU3RyaW5nKG9wdFZhbHVlKSA9PT0gdmFsU3RyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24ubmFtZSA/PyBvcHRpb24ubGFiZWwgPz8gU3RyaW5nKG9wdGlvbi52YWx1ZSA/PyB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byB0aGUgcmF3IHZhbHVlXG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgICAgbGV0IGxhYmVsID0gZmlsdGVyQ29uZmlnSXRlbT8ubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0ZXh0ID0gdmFsdWUubWFwKCh2OiBhbnkpID0+IGdldERpc3BsYXlUZXh0KHYpKS5qb2luKCcsICcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBpZiAoJ3N0YXJ0JyBpbiB2YWx1ZSB8fCAnZW5kJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHZhbHVlLnN0YXJ0ID8gbmV3IERhdGUodmFsdWUuc3RhcnQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBlID0gdmFsdWUuZW5kID8gbmV3IERhdGUodmFsdWUuZW5kKS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgdGV4dCA9IFtzLCBlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHQgPSBnZXREaXNwbGF5VGV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpcHMucHVzaCh7IGtleSwgbGFiZWwsIHRleHQsIGZ1bGxUZXh0OiB0ZXh0LCBoYXNNb3JlOiB0ZXh0Lmxlbmd0aCA+IDMwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoaXBzID0gY2hpcHM7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaGFuZGxlUmVzZXRGaWx0ZXJDbGljaygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBjaGlwcyBhbmQgcmVzZXQgZmlsdGVyZWQgZGF0YSB3aGVuIHJlc2V0IGlzIGNsaWNrZWRcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbGllZEZpbHRlcnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMub25SZXNldEZpbHRlckNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIGhhbmRsZVJlZnJlc2hDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9uQXV0b1JlZnJlc2hDbGljay5lbWl0KCk7XG4gICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWJ1aWxkRmlsdGVyZWRSb3dzKCk7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5vblJlbG9hZC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQXV0b1JlZnJlc2goaW50ZXJ2YWxNczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckF1dG9SZWZyZXNoKCk7XG4gICAgaWYgKGludGVydmFsTXMgJiYgaW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVsb2FkKCk7XG4gICAgICB9LCBpbnRlcnZhbE1zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQXV0b1JlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b1JlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9SZWZyZXNoVGltZXIpO1xuICAgICAgdGhpcy5hdXRvUmVmcmVzaFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBdXRvUmVmcmVzaCgpO1xuICB9XG5cbiAgb25QYWdpbmF0ZShlOiB7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGUucGFnZUluZGV4O1xuICAgIHRoaXMucGFnZVNpemUgPSBlLnBhZ2VTaXplO1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHsgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gIH1cblxuICBvblJlbW92ZUNoaXAoY2hpcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IHRoaXMuY2hpcHMuZmlsdGVyKGMgPT4gYyAhPT0gY2hpcCk7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkID0gdGhpcy5jaGlwcy5sZW5ndGggPiAwO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IGNvbXBvbmVudCAoc2FtZSBwYXR0ZXJuIGFzIGV4ZWN1dGlvbiB0YWIpXG4gICAgdGhpcy5yZW1vdmVDaGlwLmVtaXQoY2hpcCk7XG4gIH1cblxuICBvbkNsZWFyQWxsQ2hpcHMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICAgIC8vIFJlc2V0IHRoZSBkeW5hbWljLWZpbHRlciBjb21wb25lbnQgZm9ybSB3aGVuIGNsZWFyaW5nIGFsbCBjaGlwc1xuICAgIGlmICh0aGlzLmR5bmFtaWNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuZHluYW1pY0ZpbHRlckNvbXBvbmVudC5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlcnZlclNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICAvLyBTZXJ2ZXIgbW9kZTogcGFyZW50IHN1cHBsaWVzIGFscmVhZHktcGFnaW5hdGVkIGRhdGFcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gWy4uLnRoaXMuZmlsdGVyZWRSb3dzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucGFnZWRSb3dzID0gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcFZpc2liaWxpdHlDb2x1bW5zKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgaXRlbXMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKVxuICAgICAgLmZpbHRlcihjID0+IGMuaXNEZWZhdWx0ID09PSBmYWxzZSlcbiAgICAgIC5tYXAoYyA9PiAoeyBpZDogYy5maWVsZElkLCBsYWJlbDogYy5maWVsZE5hbWUgfHwgYy5maWVsZElkIH0pKTtcbiAgICBpZiAodGhpcy5tb2R1bGFyQ29uZmlnPy5zaG93Rm9sZGVyQ29sdW1uICYmICFpdGVtcy5zb21lKGkgPT4gaS5pZCA9PT0gRk9MREVSX0NPTFVNTl9GSUVMRF9JRCkpIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBpZDogRk9MREVSX0NPTFVNTl9GSUVMRF9JRCxcbiAgICAgICAgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscz8uZm9sZGVyQ29sdW1uTGFiZWwgfHwgJ0ZvbGRlcicsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IGFueSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdHMgPSBEYXRlLnBhcnNlKGQpO1xuICAgIHJldHVybiBpc05hTih0cykgPyBudWxsIDogdHM7XG4gIH1cblxuICBwcml2YXRlIHBhc3NGaWx0ZXJzKGZpbHRlcnM6IGFueSwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybiB0cnVlO1xuICAgIGlmIChmaWx0ZXJzLnN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGZpbHRlcnMuc3RhdHVzKSAmJiBmaWx0ZXJzLnN0YXR1cy5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy5zdGF0dXMuaW5jbHVkZXMocm93LnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMucHJpb3JpdHkgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXJzLnByaW9yaXR5KSAmJiBmaWx0ZXJzLnByaW9yaXR5Lmxlbmd0aCkge1xuICAgICAgaWYgKCFmaWx0ZXJzLnByaW9yaXR5LmluY2x1ZGVzKHJvdy5wcmlvcml0eU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnRlc3RUeXBlICYmIEFycmF5LmlzQXJyYXkoZmlsdGVycy50ZXN0VHlwZSkgJiYgZmlsdGVycy50ZXN0VHlwZS5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy50ZXN0VHlwZS5pbmNsdWRlcyhyb3cudGVzdFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLmNyZWF0ZWRfZGF0ZSAmJiAoZmlsdGVycy5jcmVhdGVkX2RhdGUuc3RhcnQgfHwgZmlsdGVycy5jcmVhdGVkX2RhdGUuZW5kKSkge1xuICAgICAgY29uc3Qgc3RhcnRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5zdGFydCk7XG4gICAgICBjb25zdCBlbmRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5lbmQpO1xuICAgICAgY29uc3Qgcm93VHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUocm93LmNyZWF0ZWRBdCk7XG4gICAgICBpZiAocm93VHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsICYmIHJvd1RzIDwgc3RhcnRUcykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZW5kVHMgIT0gbnVsbCAmJiByb3dUcyA+IGVuZFRzKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJhY2tCeVRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlEcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHRyYWNrQnlTZWxlY3REcm9wZG93blRlbXBsYXRlUmVmKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8vIEV4cG9ydCBtb2RhbCBzdGF0ZVxuICBpc0V4cG9ydE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGV4cG9ydENvZGVDbGljaygpOiB2b2lkIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgaXRlbXNcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtcztcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZFxuICAgICAgdGhpcy5vbkV4cG9ydENsaWNrLmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZUV4cG9ydE1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBvcnRNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIG9uRXhwb3J0TW9kYWxFeHBvcnQocmVzdWx0OiB7IHR5cGU6ICdsb2NhbCcgfCAnZW1haWwnOyBlbWFpbHM/OiBzdHJpbmdbXTsgZnJhbWV3b3JrOiAnV0VCRFJJVkVSX0lPJyB8ICdTRUxFTklVTV9KQVZBJyB9KTogdm9pZCB7XG4gICAgdGhpcy5pc0V4cG9ydE1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIC8vIEVtaXQgZXZlbnQgdG8gcGFyZW50IHdpdGggZXhwb3J0IHJlc3VsdFxuICAgIHRoaXMub25FeHBvcnRDbGljay5lbWl0KHtcbiAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgZW1haWxzOiByZXN1bHQuZW1haWxzLFxuICAgICAgZnJhbWV3b3JrOiByZXN1bHQuZnJhbWV3b3JrLFxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5jdXJyZW50U2VsZWN0ZWRJdGVtc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkQ2FzZXNGb3JFeHBvcnQoKTogQXJyYXk8eyBpZD86IG51bWJlcjsgbmFtZT86IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgbmFtZTogaXRlbS5uYW1lIHx8IGl0ZW0udGl0bGUgfHwgJ1VubmFtZWQnXG4gICAgfSkpO1xuICB9XG4gIGdldCBhcnJvd0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdjcWEtdy00JyxcbiAgICAgICdjcWEtaC00JyxcbiAgICAgICdjcWEtcmVsYXRpdmUnLFxuICAgICAgJ2NxYS10cmFuc2l0aW9uLXRyYW5zZm9ybSdcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuc2hvd0ZpbHRlclBhbmVsKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjcWEtcm90YXRlLTE4MCcpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlQ2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZvbGRlciAvIG1vZHVsYXIgaGVscGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEZsYXQgbGlzdCBvZiByb290LWxldmVsIGZvbGRlcnMgZm9yIHRoZSBcIk9yZ2FuaXNlZFwiIGdyaWQgb24gdGhlIHJvb3Qgdmlldy5cbiAgICovXG4gIGdldCByb290Rm9sZGVyVGlsZXMoKTogRm9sZGVyTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5mb2xkZXJzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmZvbGRlcnMgb2YgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgKGZvciB0aGUgXCJTdWJmb2xkZXJzIGluIC4uLlwiIGdyaWQpLlxuICAgKi9cbiAgZ2V0IHN1YmZvbGRlclRpbGVzKCk6IEZvbGRlck5vZGVbXSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gW107XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCk7XG4gICAgaWYgKG5vZGU/LmNoaWxkcmVuPy5sZW5ndGgpIHJldHVybiBub2RlLmNoaWxkcmVuO1xuICAgIC8vIEZhbGxiYWNrOiBob3N0LXByb3ZpZGVkIHNuYXBzaG90IHdoZW4gdGhlIGxpdmUgdHJlZSBkb2Vzbid0IGNvbnRhaW5cbiAgICAvLyB0aGUgc2VsZWN0aW9uIChyZWZyZXNoLXJlc3RvcmUgYmVmb3JlIGFuY2VzdG9ycyBhcmUgbG9hZGVkLCBvciBzaWRlYmFyXG4gICAgLy8gc2VhcmNoIHdoZXJlIGBmb2xkZXJzYCBob2xkcyBvbmx5IHRoZSBtYXRjaGVkIHJlc3VsdHMpLlxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZSAmJlxuICAgICAgICBTdHJpbmcodGhpcy5zZWxlY3RlZEZvbGRlck5vZGUuaWQpID09PSBTdHJpbmcodGhpcy5zZWxlY3RlZEZvbGRlcklkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlLmNoaWxkcmVuID8/IFtdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQnJlYWRjcnVtYiB0cmFpbCBmcm9tIFwiQWxsIGZvbGRlcnNcIiBkb3duIHRvIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgZm9sZGVyLlxuICAgKi9cbiAgZ2V0IGJyZWFkY3J1bWJUcmFpbCgpOiBGb2xkZXJOb2RlW10ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHRyYWlsOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgICB0aGlzLmJ1aWxkVHJhaWwodGhpcy5mb2xkZXJzLCB0aGlzLnNlbGVjdGVkRm9sZGVySWQsIHRyYWlsKTtcbiAgICBpZiAodHJhaWwubGVuZ3RoKSByZXR1cm4gdHJhaWw7XG4gICAgLy8gRmFsbGJhY2s6IGhvc3QtcHJvdmlkZWQgc25hcHNob3Qgc3Vydml2ZXMgc3dhcHMgb2YgYHRoaXMuZm9sZGVyc2AgKHRoZVxuICAgIC8vIGNhbm9uaWNhbCBjYXNlIGlzIHNpZGViYXIgc2VhcmNoLCB3aGVyZSB0aGUgbGl2ZSB3YWxrIHdvbid0IGZpbmQgdGhlXG4gICAgLy8gc2VsZWN0ZWQgZm9sZGVyJ3MgYW5jZXN0b3JzIGFtb25nIHRoZSBmbGF0IHJlc3VsdCBzZXQpLlxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRm9sZGVyVHJhaWwgPz8gW107XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVHJhaWwobm9kZXM6IEZvbGRlck5vZGVbXSwgdGFyZ2V0SWQ6IG51bWJlciwgYWNjOiBGb2xkZXJOb2RlW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4pO1xuICAgICAgLy8gVXNlIFN0cmluZygpIGNvZXJjaW9uIGZvciBzYWZldHkgaW4gY2FzZSBpZHMgYXJyaXZlIGFzIGVpdGhlciBudW1iZXIgb3JcbiAgICAgIC8vIHN0cmluZyBmcm9tIGRpZmZlcmVudCBBUEkvdGVzdCBkYXRhIHNoYXBlcyAoZS5nLiByYXcgSlNPTiBwYXJzZSByZXN1bHRzKS5cbiAgICAgIGlmIChTdHJpbmcobi5pZCkgPT09IFN0cmluZyh0YXJnZXRJZCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKG4uY2hpbGRyZW4gJiYgdGhpcy5idWlsZFRyYWlsKG4uY2hpbGRyZW4sIHRhcmdldElkLCBhY2MpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGFjYy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRm9sZGVyKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICBpZiAoU3RyaW5nKG4uaWQpID09PSBTdHJpbmcodGFyZ2V0SWQpKSByZXR1cm4gbjtcbiAgICAgIGNvbnN0IGZvdW5kID0gbi5jaGlsZHJlbiA/IHRoaXMuZmluZEZvbGRlcihuLmNoaWxkcmVuLCB0YXJnZXRJZCkgOiBudWxsO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBcInJvb3RcIiB2aWV3IChubyBmb2xkZXIgc2VsZWN0ZWQpLiBDb250cm9scyB3aGljaFxuICAgKiBzZWN0aW9ucyByZW5kZXIgb24gdGhlIHJpZ2h0LWhhbmQgcGFuZS5cbiAgICovXG4gIGdldCBpc1Jvb3RWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudGx5LXNlbGVjdGVkIGZvbGRlciBub2RlIChvciBudWxsIGF0IHJvb3QpLiAqL1xuICBnZXQgY3VycmVudEZvbGRlck5vZGUoKTogRm9sZGVyTm9kZSB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgLy8gV2FsayB0aGUgdmlzaWJsZSB0cmVlIGZpcnN0OyBmYWxsIGJhY2sgdG8gdGhlIGhvc3QtcHJvdmlkZWQgb3ZlcnJpZGVcbiAgICAvLyB3aGVuIHRoZSBsb29rdXAgbWlzc2VzIChlLmcuIGR1cmluZyBzaWRlYmFyIHNlYXJjaCwgd2hlbiBgZm9sZGVyc2BcbiAgICAvLyBob2xkcyBvbmx5IG1hdGNoZWQgcmVzdWx0cyBhbmQgdGhlIHNlbGVjdGVkIGZvbGRlciBpc24ndCBhbW9uZyB0aGVtKS5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZEZvbGRlcih0aGlzLmZvbGRlcnMsIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJOb2RlICYmIFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVyTm9kZS5pZCkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkRm9sZGVySWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZvbGRlck5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIENvdW50IG9mIHRlc3QgY2FzZXMgZGlyZWN0bHkgdW5kZXIgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBmb2xkZXIgKGV4Y2x1ZGluZyBkZXNjZW5kYW50cykuXG4gICAqICBSZWFkcyBgRm9sZGVyTm9kZS5jb3VudGAgc28gdGhlIGhlYWRlciBiYWRnZSBtYXRjaGVzIHRoZSBzaWRlYmFyIHJvdyBjb3VudFxuICAgKiAgKGZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIHJlbmRlcnMgdGhlIHNhbWUgYHJvdy5ub2RlLmNvdW50YCkuIFVzaW5nXG4gICAqICBgZmlsdGVyZWRSb3dzLmxlbmd0aGAgaGVyZSB3b3VsZCBvbmx5IHJlZmxlY3QgdGhlIGN1cnJlbnRseS1yZW5kZXJlZCBwYWdlLiAqL1xuICBnZXQgY3VycmVudEZvbGRlckRpcmVjdENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Rm9sZGVyTm9kZT8uY291bnQgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBlbXB0eS1zdGF0ZSBzbG90IHdoZW4gdGhlIGhvc3QgZXhwbGljaXRseSBvcHRzIGluLCBPUiB3aGVuIHRoZVxuICAgKiB0YWJsZSB3b3VsZCBvdGhlcndpc2UgcmVuZGVyIGJsYW5rIChubyBsb2FkaW5nICsgbm8gcm93cykuIFVzaW5nIGEgZGVyaXZlZFxuICAgKiBmbGFnIGtlZXBzIHRoZSBob3N0IGNvbnRyYWN0IGlkZW50aWNhbCB0byBgY3FhLXRhYmxlLXRlbXBsYXRlYCB3aGlsZSBsZXR0aW5nXG4gICAqIHRoZSBtb2R1bGFyIHZpZXcgc2hvdyBcIk5vIFRlc3QgQ2FzZSBGb3VuZFwiIG91dCBvZiB0aGUgYm94IOKAlCB0aGUgZWFybGllciBhc2suXG4gICAqL1xuICBnZXQgZWZmZWN0aXZlSXNFbXB0eVN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuaXNUYWJsZUxvYWRpbmcgfHwgdGhpcy5pc1RhYmxlRGF0YUxvYWRpbmcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMucGFnZWRSb3dzIHx8IHRoaXMucGFnZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaG9zdC1wcm92aWRlZCBgZW1wdHlTdGF0ZUNvbmZpZ2Agd2hlbiB0aGUgaG9zdCBmbGFnZ2VkIHRoZSBzdGF0ZVxuICAgKiBpdHNlbGY7IG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIGEgbGlicmFyeS1vd25lZCBcIk5vIFRlc3QgQ2FzZSBGb3VuZFwiIGNvbmZpZ1xuICAgKiBkcml2ZW4gYnkgYG1vZHVsYXJMYWJlbHNgLlxuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcoKTogRW1wdHlTdGF0ZUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eVN0YXRlKSByZXR1cm4gdGhpcy5lbXB0eVN0YXRlQ29uZmlnO1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLmVtcHR5Tm9UZXN0c0luRm9sZGVyVGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tb2R1bGFyTGFiZWxzLmVtcHR5Tm9UZXN0c0luRm9sZGVyRGVzY3JpcHRpb24sXG4gICAgICBpbWFnZVVybDogRU1QVFlfU1RBVEVfSU1BR0VTLlRFU1RfQ0FTRSxcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBvbkZvbGRlclNlbGVjdGVkKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZvbGRlcklkID0gaWQ7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVidWlsZEZpbHRlcmVkUm93cygpO1xuICAgIHRoaXMuYXBwbHlQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5mb2xkZXJTZWxlY3RlZC5lbWl0KGlkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uRm9sZGVyRXhwYW5zaW9uVG9nZ2xlZChldmVudDogeyBpZDogbnVtYmVyOyBleHBhbmRlZDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCh0aGlzLmV4cGFuZGVkRm9sZGVySWRzIHx8IFtdKTtcbiAgICBpZiAoZXZlbnQuZXhwYW5kZWQpIHtcbiAgICAgIHNldC5hZGQoZXZlbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQuZGVsZXRlKGV2ZW50LmlkKTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZEZvbGRlcklkcyA9IEFycmF5LmZyb20oc2V0KTtcbiAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKiogVHJhY2tzIHRoZSBgZm9sZGVycy5sZW5ndGhgIGF0IHdoaWNoIHdlIGxhc3QgZW1pdHRlZCBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYFxuICAgKiAgZnJvbSB0aGUgT3JnYW5pemVkIGdyaWQgc2Nyb2xsLCBzbyByYXBpZCBzY3JvbGwgZXZlbnRzIGRvbid0IHNwYW0gdGhlIGhvc3RcbiAgICogIGJlZm9yZSBpdCBoYXMgaGFkIGEgY2hhbmNlIHRvIGFwcGVuZCB0aGUgbmV4dCBwYWdlLiAqL1xuICBwcml2YXRlIGxhc3RSb290R3JpZExvYWRBdDogbnVtYmVyID0gLTE7XG4gIC8qKiBUcmFja3MgdGhlIGBjdXJyZW50Rm9sZGVyTm9kZS5jaGlsZHJlbi5sZW5ndGhgIGF0IHdoaWNoIHdlIGxhc3QgZW1pdHRlZFxuICAgKiAgYGZvbGRlckxvYWRNb3JlUmVxdWVzdGVkYCBmcm9tIHRoZSBTdWJmb2xkZXJzIGdyaWQgc2Nyb2xsLCBmb3IgdGhlIHNhbWVcbiAgICogIHJlYXNvbiBhcyBgbGFzdFJvb3RHcmlkTG9hZEF0YC4gKi9cbiAgcHJpdmF0ZSBsYXN0U3ViZm9sZGVyR3JpZExvYWRBdDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdSSURfU0NST0xMX0xPQURfVEhSRVNIT0xEX1BYID0gOTY7XG5cbiAgLyoqIEhvcml6b250YWwtc2Nyb2xsIGhhbmRsZXIgZm9yIHRoZSBcIk9yZ2FuaXNlZFwiIHJvb3QgdGlsZXMuIEVtaXRzXG4gICAqICBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYCB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgd2l0aGluXG4gICAqICBgR1JJRF9TQ1JPTExfTE9BRF9USFJFU0hPTERfUFhgIG9mIHRoZSByaWdodCBlZGdlIEFORCBtb3JlIHJvb3RzIGFyZVxuICAgKiAgYXZhaWxhYmxlIG9uIHRoZSBiYWNrZW5kLiBUaHJvdHRsZWQgYnkgYGxhc3RSb290R3JpZExvYWRBdGAuICovXG4gIG9uUm9vdEdyaWRTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9sZGVycy5sZW5ndGggPj0gdGhpcy5yb290VG90YWwpIHJldHVybjtcbiAgICBpZiAodGhpcy5mb2xkZXJzLmxlbmd0aCA9PT0gdGhpcy5sYXN0Um9vdEdyaWRMb2FkQXQpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVJpZ2h0ID0gZWwuc2Nyb2xsV2lkdGggLSAoZWwuc2Nyb2xsTGVmdCArIGVsLmNsaWVudFdpZHRoKTtcbiAgICBpZiAoZGlzdGFuY2VGcm9tUmlnaHQgPiBNb2R1bGFyVGFibGVUZW1wbGF0ZUNvbXBvbmVudC5HUklEX1NDUk9MTF9MT0FEX1RIUkVTSE9MRF9QWCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdFJvb3RHcmlkTG9hZEF0ID0gdGhpcy5mb2xkZXJzLmxlbmd0aDtcbiAgICB0aGlzLnJvb3RMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KCk7XG4gIH1cblxuICAvKiogSG9yaXpvbnRhbC1zY3JvbGwgaGFuZGxlciBmb3IgdGhlIFwiU3ViZm9sZGVycyBpbiBYXCIgdGlsZXMuIEVtaXRzXG4gICAqICBgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQoeyBpZDogc2VsZWN0ZWRGb2xkZXJJZCwgbmV4dFBhZ2UgfSlgIHdoZW4gdGhlXG4gICAqICB1c2VyIHNjcm9sbHMgd2l0aGluIHRocmVzaG9sZCBvZiB0aGUgcmlnaHQgZWRnZSBBTkQgdGhlIGFjdGl2ZSBmb2xkZXJcbiAgICogIGhhcyBtb3JlIGNoaWxkcmVuIG9uIHRoZSBiYWNrZW5kIHRoYW4gaGF2ZSBiZWVuIGxvYWRlZC4gKi9cbiAgb25TdWJmb2xkZXJHcmlkU2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRGb2xkZXJOb2RlO1xuICAgIGlmICghbm9kZSB8fCB0aGlzLnNlbGVjdGVkRm9sZGVySWQgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGxvYWRlZCA9IG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA/PyAwO1xuICAgIGNvbnN0IHRvdGFsID0gbm9kZS50b3RhbENoaWxkcmVuID8/IGxvYWRlZDtcbiAgICBpZiAobG9hZGVkID49IHRvdGFsKSByZXR1cm47XG4gICAgaWYgKGxvYWRlZCA9PT0gdGhpcy5sYXN0U3ViZm9sZGVyR3JpZExvYWRBdCkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgZGlzdGFuY2VGcm9tUmlnaHQgPSBlbC5zY3JvbGxXaWR0aCAtIChlbC5zY3JvbGxMZWZ0ICsgZWwuY2xpZW50V2lkdGgpO1xuICAgIGlmIChkaXN0YW5jZUZyb21SaWdodCA+IE1vZHVsYXJUYWJsZVRlbXBsYXRlQ29tcG9uZW50LkdSSURfU0NST0xMX0xPQURfVEhSRVNIT0xEX1BYKSByZXR1cm47XG4gICAgdGhpcy5sYXN0U3ViZm9sZGVyR3JpZExvYWRBdCA9IGxvYWRlZDtcbiAgICBjb25zdCBuZXh0UGFnZSA9IChub2RlLmxvYWRlZFBhZ2VzID8/IC0xKSArIDE7XG4gICAgdGhpcy5mb2xkZXJMb2FkTW9yZVJlcXVlc3RlZC5lbWl0KHsgaWQ6IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCwgbmV4dFBhZ2UgfSk7XG4gIH1cblxuICBvbkZvbGRlckNyZWF0ZWQocGF5bG9hZDogRm9sZGVyQ3JlYXRlZFBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLmZvbGRlckNyZWF0ZWQuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIG9uRm9sZGVyQ3JlYXRlUmVxdWVzdGVkKHBheWxvYWQ6IHsgcGFyZW50SWQ6IG51bWJlciB8IG51bGwgfSk6IHZvaWQge1xuICAgIC8vIEVtaXQgdGhlIFwicmVxdWVzdGVkXCIgZXZlbnQgZmlyc3Qgc28gYSBob3N0IGNhbiBpbnRlcmNlcHQgd2hlbiBpdCBvd25zIHRoZSBVWC5cbiAgICB0aGlzLmZvbGRlckNyZWF0ZVJlcXVlc3RlZC5lbWl0KHBheWxvYWQpO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcbiAgICB0aGlzLm9wZW5DcmVhdGVGb2xkZXJEaWFsb2cocGF5bG9hZC5wYXJlbnRJZCk7XG4gIH1cblxuICBvbkZvbGRlclJlbmFtZWQocGF5bG9hZDogRm9sZGVyUmVuYW1lZFBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLmZvbGRlclJlbmFtZWQuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlZCB0byB0aGUgc2lkZWJhcidzIGBmb2xkZXJEZWxldGVkYCBvdXRwdXQg4oCUIHdoaWNoIGZpcmVzIG9uIGRlbGV0ZS1pY29uXG4gICAqICpjbGljayosIG5vdCBvbiBjb25maXJtYXRpb24uIFdlIHJlLWVtaXQgYSBgZm9sZGVyRGVsZXRlUmVxdWVzdGVkYCBldmVudFxuICAgKiBmaXJzdCAoc28gaG9zdHMgY2FuIGludGVyY2VwdCkgYW5kLCB3aGVuIGB1c2VJbnRlcm5hbERpYWxvZ3NgIGlzIGVuYWJsZWQsXG4gICAqIG9wZW4gdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cuIGBmb2xkZXJEZWxldGVkYCBub3cgb25seSBmaXJlcyBhZnRlciBjb25maXJtLlxuICAgKi9cbiAgb25Gb2xkZXJEZWxldGVkKHBheWxvYWQ6IHsgaWQ6IG51bWJlciB9KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5idWlsZERlbGV0ZUNvbnRleHQocGF5bG9hZC5pZCk7XG4gICAgdGhpcy5mb2xkZXJEZWxldGVSZXF1ZXN0ZWQuZW1pdChjdHgpO1xuICAgIGlmICghdGhpcy51c2VJbnRlcm5hbERpYWxvZ3MpIHJldHVybjtcbiAgICB0aGlzLm9wZW5EZWxldGVGb2xkZXJEaWFsb2coY3R4KTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgdGhlIHsgaWQsIG5hbWUsIHRlc3RDb3VudCwgaGFzUGFyZW50IH0gcGF5bG9hZCB1c2VkIGJ5IGRlbGV0ZSBldmVudHMvZGlhbG9ncy4gKi9cbiAgcHJpdmF0ZSBidWlsZERlbGV0ZUNvbnRleHQoZm9sZGVySWQ6IG51bWJlcik6IEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBmb2xkZXJJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBmb2xkZXJJZCxcbiAgICAgIG5hbWU6IG5vZGU/Lm5hbWUgPz8gJycsXG4gICAgICB0ZXN0Q291bnQ6IHRoaXMuY291bnRUZXN0c0luRm9sZGVyKGZvbGRlcklkKSxcbiAgICAgIGhhc1BhcmVudDogdGhpcy5mb2xkZXJIYXNQYXJlbnQoZm9sZGVySWQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvdW50VGVzdHNJbkZvbGRlcihmb2xkZXJJZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBhY2Nlc3NvciA9IHRoaXMuZm9sZGVySWRBY2Nlc3NvciA/PyAoKHI6IGFueSkgPT4gcj8uZm9sZGVySWQpO1xuICAgIHJldHVybiAodGhpcy5kYXRhIHx8IFtdKS5maWx0ZXIociA9PiB7XG4gICAgICBjb25zdCBpZCA9IGFjY2Vzc29yKHIpO1xuICAgICAgcmV0dXJuIGlkICE9IG51bGwgJiYgTnVtYmVyKGlkKSA9PT0gTnVtYmVyKGZvbGRlcklkKTtcbiAgICB9KS5sZW5ndGg7XG4gIH1cblxuICAvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGZvbGRlciBpcyBuZXN0ZWQgKGkuZS4gbm90IGEgcm9vdC1sZXZlbCBmb2xkZXIpLiAqL1xuICBwcml2YXRlIGZvbGRlckhhc1BhcmVudChmb2xkZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodGhpcy5mb2xkZXJzIHx8IFtdKS5zb21lKG4gPT4gbi5pZCA9PT0gZm9sZGVySWQpO1xuICB9XG5cbiAgb25UZXN0c0Ryb3BwZWQoZXZlbnQ6IHsgdGVzdElkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjsgdGFyZ2V0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wKSByZXR1cm47XG4gICAgdGhpcy50ZXN0c01vdmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGRlci10by1mb2xkZXIgZHJhZy1kcm9wLiBUaGUgc2lkZWJhciBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQgYWdhaW5zdCBzZWxmL2Rlc2NlbmRhbnRcbiAgICogY3ljbGVzLCBzbyB0aGUgZHJvcCBpcyBpdHMgb3duIGNvbmZpcm1hdGlvbiDigJQgd2UgZW1pdCBgZm9sZGVyTW92ZWRgIGRpcmVjdGx5IHdpdGhvdXRcbiAgICogb3BlbmluZyB0aGUgbW92ZSBkaWFsb2cuIEdhdGVkIG9uIGBhbGxvd1Rlc3REcmFnRHJvcGAgKHNhbWUgZmxhZyBhcyB0ZXN0IGRyYWctZHJvcCkuXG4gICAqL1xuICBvbkZvbGRlckRyb3BwZWQoZXZlbnQ6IHsgaWQ6IG51bWJlcjsgbmV3UGFyZW50SWQ6IG51bWJlciB8IG51bGwgfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2R1bGFyQ29uZmlnLmFsbG93VGVzdERyYWdEcm9wKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJNb3ZlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWRlYmFyIGVtaXR0ZWQgYGZvbGRlck1vdmVSZXF1ZXN0ZWRgICh1c2VyIHBpY2tlZCBcIk1vdmUgZm9sZGVyXCIgZnJvbSB0aGUgY29udGV4dCBtZW51KS5cbiAgICogV2UgcmUtZW1pdCBhIHJpY2hlciBwYXlsb2FkIGZvciBob3N0cywgYW5kIOKAlCB3aGVuIHJ1bm5pbmcgd2l0aCBpbnRlcm5hbCBkaWFsb2dzIOKAlFxuICAgKiBvcGVuIHRoZSBleGlzdGluZyBtb3ZlLXRvLWZvbGRlciBwaWNrZXIgY29uZmlndXJlZCBmb3IgYSBmb2xkZXItbW92ZSAoc2VsZiBhbmRcbiAgICogZGVzY2VuZGFudHMgYXJlIGRpc2FibGVkIHRvIHByZXZlbnQgY3ljbGVzKS5cbiAgICovXG4gIG9uRm9sZGVyTW92ZVJlcXVlc3RlZChwYXlsb2FkOiB7IGlkOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmRGb2xkZXIodGhpcy5mb2xkZXJzLCBwYXlsb2FkLmlkKTtcbiAgICBjb25zdCBjdHg6IEZvbGRlck1vdmVSZXF1ZXN0ZWRQYXlsb2FkID0ge1xuICAgICAgaWQ6IHBheWxvYWQuaWQsXG4gICAgICBuYW1lOiBub2RlPy5uYW1lID8/ICcnLFxuICAgICAgaGFzUGFyZW50OiB0aGlzLmZvbGRlckhhc1BhcmVudChwYXlsb2FkLmlkKSxcbiAgICB9O1xuICAgIHRoaXMuZm9sZGVyTW92ZVJlcXVlc3RlZC5lbWl0KGN0eCk7XG4gICAgaWYgKCF0aGlzLnVzZUludGVybmFsRGlhbG9ncykgcmV0dXJuO1xuICAgIHRoaXMub3Blbk1vdmVGb2xkZXJEaWFsb2coY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWRlYmFyIGVtaXR0ZWQgYGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZGAuIFRoZSBsaWJyYXJ5IGNhbid0IHBlcnNpc3Qg4oCUXG4gICAqIGVtaXQgdGhlIGhvc3QtbGV2ZWwgZXZlbnQgc28gdGhlIGhvc3QgY2xvbmVzIHRoZSBzdWJ0cmVlIHNlcnZlci1zaWRlLlxuICAgKiBUZXN0IGNhc2VzIHNob3VsZCBiZSAqcmVmZXJlbmNlZCogZnJvbSB0aGUgbmV3IGZvbGRlcnMsIG5vdCBkdXBsaWNhdGVkLlxuICAgKi9cbiAgb25Gb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQocGF5bG9hZDogeyBpZDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kRm9sZGVyKHRoaXMuZm9sZGVycywgcGF5bG9hZC5pZCk7XG4gICAgdGhpcy5mb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICBpZDogcGF5bG9hZC5pZCxcbiAgICAgIG5hbWU6IG5vZGU/Lm5hbWUgPz8gJycsXG4gICAgfSk7XG4gIH1cblxuICBvblNpZGViYXJDb2xsYXBzZWRDaGFuZ2UoY29sbGFwc2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaWRlYmFyQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIHRoaXMuc2lkZWJhckNvbGxhcHNlZENoYW5nZS5lbWl0KGNvbGxhcHNlZCk7XG4gIH1cblxuICB0b2dnbGVTaWRlYmFyKCk6IHZvaWQge1xuICAgIHRoaXMub25TaWRlYmFyQ29sbGFwc2VkQ2hhbmdlKCF0aGlzLnNpZGViYXJDb2xsYXBzZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgYnVsayBhY3Rpb25zIHNob3duIGluIHRoZSB0b29sYmFyIG1lcmdlZCB3aXRoIGFueSBob3N0LXN1cHBsaWVkXG4gICAqIGBidWxrQWN0aW9uc2AuIEN1cnJlbnRseSBvbmx5IFwiTW92ZSB0byBmb2xkZXJcIiBzaGlwcyBieSBkZWZhdWx0IOKAlFxuICAgKiBEZWxldGUgLyBBZGQgVGFnIGFyZSBvcHQtaW4gcGVyIHRoZSBjdXJyZW50IHByb2R1Y3QgcmVxdWlyZW1lbnQuIEhvc3RzXG4gICAqIHRoYXQgd2FudCB0aGVtIGJhY2sgcGFzcyB0aGVtIHZpYSBgYnVsa0FjdGlvbnNgLlxuICAgKi9cbiAgZ2V0IGVmZmVjdGl2ZUJ1bGtBY3Rpb25zKCk6IFRhYmxlQWN0aW9uW10ge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBUYWJsZUFjdGlvbltdID0gW1xuICAgICAgeyBpZDogJ21vdmUnLCBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVUb0ZvbGRlciwgaWNvbjogJ2RyaXZlX2ZpbGVfbW92ZScsIHRvb2x0aXA6IHRoaXMubW9kdWxhckxhYmVscy5tb3ZlVG9Gb2xkZXIgfSxcbiAgICBdO1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IG5ldyBNYXAoKHRoaXMuYnVsa0FjdGlvbnMgfHwgW10pLm1hcChhID0+IFthLmlkLCBhXSBhcyBjb25zdCkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZmF1bHRzLm1hcChkID0+IG92ZXJyaWRlcy5nZXQoZC5pZCkgPz8gZCk7XG4gICAgZm9yIChjb25zdCBleHRyYSBvZiB0aGlzLmJ1bGtBY3Rpb25zIHx8IFtdKSB7XG4gICAgICBpZiAoIWRlZmF1bHRzLnNvbWUoZCA9PiBkLmlkID09PSBleHRyYS5pZCkpIHtcbiAgICAgICAgbWVyZ2VkLnB1c2goZXh0cmEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgb25CdWxrQWN0aW9uKGV2ZW50OiB7IGlkOiBzdHJpbmc7IHNlbGVjdGVkOiBhbnlbXSB9KTogdm9pZCB7XG4gICAgLy8gQWx3YXlzIGVtaXQgdGhlIHJhdyBjbGljayBzbyBob3N0cyBvd25pbmcgdGhlIFVYIGNhbiBpbnRlcmNlcHQgZWFybHkuXG4gICAgdGhpcy5idWxrQWN0aW9uQ2xpY2suZW1pdCh7IGlkOiBldmVudC5pZCwgc2VsZWN0ZWQ6IGV2ZW50LnNlbGVjdGVkIH0pO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSAoZXZlbnQuc2VsZWN0ZWQgfHwgW10pLm1hcChyID0+IHI/LmlkKS5maWx0ZXIodiA9PiB2ICE9IG51bGwpO1xuICAgIGlmIChldmVudC5pZCA9PT0gJ21vdmUnKSB7XG4gICAgICB0aGlzLm9wZW5Nb3ZlRGlhbG9nKHNlbGVjdGVkSWRzLCBldmVudC5zZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBub24tZGlhbG9nIGFjdGlvbnMgKGN1c3RvbSBlbnRyaWVzIGZyb20gaG9zdC1zdXBwbGllZCBgYnVsa0FjdGlvbnNgKSwgaW52b2tlIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMuYnVsa0FjdGlvbkludm9rZWQuZW1pdCh7IGlkOiBldmVudC5pZCwgc2VsZWN0ZWQ6IGV2ZW50LnNlbGVjdGVkIH0pO1xuICB9XG5cbiAgb25CdWxrU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBBcHBseSB0aGUgYWN0aW9uIGxvY2FsbHkgc28gdGhlIGFjdGlvbiB0b29sYmFyJ3MgXCJTZWxlY3QgYWxsXCIgd29ya3Mgb3V0LW9mLXRoZS1ib3guXG4gICAgLy8gV2hlbiBjaGVja2VkLCBzZWxlY3QgZXZlcnkgcm93IGluIHRoZSAqY3VycmVudCogZmlsdGVyZWQgc2V0IChpLmUuIGFsbCB0ZXN0cyBpblxuICAgIC8vIHRoZSBzZWxlY3RlZCBmb2xkZXIpLiBXaGVuIHVuY2hlY2tlZCwgY2xlYXIgc2VsZWN0aW9uLlxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGNoZWNrZWQgPyBbLi4udGhpcy5maWx0ZXJlZFJvd3NdIDogW107XG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uU3RhdGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChbLi4udGhpcy5zZWxlY3RlZEl0ZW1zXSk7XG4gICAgdGhpcy5idWxrU2VsZWN0QWxsQ2hhbmdlLmVtaXQoY2hlY2tlZCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkJ1bGtEaXNtaXNzKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHNlbGVjdGlvbiBBTkQgdGhlIHBlci1yb3cgaXNTZWxlY3RlZCBmbGFncyBzbyB0aGUgYWN0aW9uIHRvb2xiYXIgY2xvc2VzXG4gICAgLy8gKGl0J3MgZ2F0ZWQgb24gYGFueVJvd1NlbGVjdGVkYCwgd2hpY2ggcmVhZHMgYm90aCBzZWxlY3RlZEl0ZW1zIGFuZCByb3cgZmxhZ3MpLlxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoW10pO1xuICAgIHRoaXMuYnVsa0Rpc21pc3MuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuTW92ZURpYWxvZyh0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBzZWxlY3RlZDogYW55W10pOiB2b2lkIHtcbiAgICAvLyBGaXJlIHRoZSBcInJlcXVlc3RlZFwiIGV2ZW50IGZpcnN0IHNvIGEgaG9zdCBjYW4gaW50ZXJjZXB0IHdoZW4gaXQgb3ducyB0aGUgVVguXG4gICAgdGhpcy5tb3ZlUmVxdWVzdGVkLmVtaXQoe1xuICAgICAgdGVzdElkcyxcbiAgICAgIHNlbGVjdGVkLFxuICAgICAgY3VycmVudEZvbGRlcklkOiB0aGlzLnNlbGVjdGVkRm9sZGVySWQsXG4gICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLnVzZUludGVybmFsRGlhbG9ncykgcmV0dXJuO1xuXG4gICAgY29uc3QgY291bnQgPSB0ZXN0SWRzLmxlbmd0aDtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChjb3VudCA9PT0gMVxuICAgICAgPyB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0Rlc2NyaXB0aW9uU2luZ3VsYXJcbiAgICAgIDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dEZXNjcmlwdGlvblBsdXJhbFxuICAgICkucmVwbGFjZSgne259JywgJycgKyBjb3VudCk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW48YW55LCBudW1iZXIgfCBudWxsPih7XG4gICAgICB0aXRsZTogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dUaXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxuICAgICAgICBjb21wb25lbnQ6IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgZm9sZGVyczogdGhpcy5mb2xkZXJzLFxuICAgICAgICAgIGxhYmVsczogdGhpcy5tb2R1bGFyTGFiZWxzLFxuICAgICAgICAgIGN1cnJlbnRGb2xkZXJJZDogdGhpcy5zZWxlY3RlZEZvbGRlcklkLFxuICAgICAgICAgIC8vIFdoZW4gbW92aW5nIEZST00gVW5vcmdhbmlzZWQsIGRpc2FibGUgdGhlIFVub3JnYW5pc2VkIGRlc3RpbmF0aW9uIHJvdy5cbiAgICAgICAgICByb290RGlzYWJsZWQ6IHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UodW5kZWZpbmVkIGFzIGFueSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSByLmdldENvbXBvbmVudEluc3RhbmNlPE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIHIuY2xvc2UoaW5zdGFuY2UgPyBpbnN0YW5jZS5waWNrZWRGb2xkZXJJZCA6IG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh0YXJnZXRGb2xkZXJJZCA9PiB7XG4gICAgICBpZiAodGFyZ2V0Rm9sZGVySWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBjYW5jZWxsZWRcbiAgICAgIHRoaXMudGVzdHNNb3ZlZC5lbWl0KHsgdGVzdElkcywgdGFyZ2V0Rm9sZGVySWQ6IHRhcmdldEZvbGRlcklkID8/IG51bGwgfSk7XG4gICAgICB0aGlzLmJ1bGtBY3Rpb25JbnZva2VkLmVtaXQoeyBpZDogJ21vdmUnLCBzZWxlY3RlZCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgZm9sZGVyLXBpY2tlciBkaWFsb2cgY29uZmlndXJlZCBmb3IgbW92aW5nIGEgZm9sZGVyIChyYXRoZXIgdGhhbiB0ZXN0cykuXG4gICAqIFRoZSBzb3VyY2UgZm9sZGVyIGl0c2VsZiBpcyBtYXJrZWQgYXMgdGhlIFwiY3VycmVudFwiIGZvbGRlciBzbyBpdCdzIHJlbmRlcmVkIGFzXG4gICAqIGRpc2FibGVkIGluIHRoZSBwaWNrZXIuIE9uIGNvbmZpcm0sIGVtaXRzIGBmb2xkZXJNb3ZlZGAgd2l0aCB0aGUgY2hvc2VuIHBhcmVudC5cbiAgICovXG4gIHByaXZhdGUgb3Blbk1vdmVGb2xkZXJEaWFsb2coY3R4OiBGb2xkZXJNb3ZlUmVxdWVzdGVkUGF5bG9hZCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZD4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5mb2xkZXJNZW51TW92ZSxcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlcnM6IHRoaXMuZm9sZGVycyxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMubW9kdWxhckxhYmVscyxcbiAgICAgICAgICAvLyBSZXVzZSB0aGUgXCJkaXNhYmxlZFwiIHRyZWF0bWVudDogdGhlIGZvbGRlciBiZWluZyBtb3ZlZCBjYW4ndCBiZSBpdHMgb3duIGRlc3RpbmF0aW9uLlxuICAgICAgICAgIGN1cnJlbnRGb2xkZXJJZDogY3R4LmlkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm1vdmVEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UodW5kZWZpbmVkIGFzIGFueSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMubW92ZURpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSByLmdldENvbXBvbmVudEluc3RhbmNlPE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudD4oKTtcbiAgICAgICAgICAgIHIuY2xvc2UoaW5zdGFuY2UgPyBpbnN0YW5jZS5waWNrZWRGb2xkZXJJZCA6IG51bGwpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnV0dG9uQWxpZ25tZW50OiAncmlnaHQnLFxuICAgIH0pO1xuICAgIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh0YXJnZXRGb2xkZXJJZCA9PiB7XG4gICAgICBpZiAodGFyZ2V0Rm9sZGVySWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBjYW5jZWxsZWRcbiAgICAgIHRoaXMuZm9sZGVyTW92ZWQuZW1pdCh7IGlkOiBjdHguaWQsIG5ld1BhcmVudElkOiB0YXJnZXRGb2xkZXJJZCA/PyBudWxsIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQ3JlYXRlRm9sZGVyRGlhbG9nKGluaXRpYWxQYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuPGFueSwgeyBuYW1lOiBzdHJpbmc7IHBhcmVudElkOiBudW1iZXIgfCBudWxsOyBjb2xvcjogc3RyaW5nIH0gfCBmYWxzZT4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dUaXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyRGlhbG9nRGVzY3JpcHRpb24sXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBvbmVudDogTmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICBmb2xkZXJzOiB0aGlzLmZvbGRlcnMsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgcGFyZW50SWQ6IGluaXRpYWxQYXJlbnRJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHsgbGFiZWw6IHRoaXMubW9kdWxhckxhYmVscy5uZXdGb2xkZXJEaWFsb2dDYW5jZWwsIHJvbGU6ICdzZWNvbmRhcnknLCBoYW5kbGVyOiByID0+IHIuY2xvc2UoZmFsc2UpIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLm5ld0ZvbGRlckRpYWxvZ0NvbmZpcm0sXG4gICAgICAgICAgcm9sZTogJ3ByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6IHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdCA9IHIuZ2V0Q29tcG9uZW50SW5zdGFuY2U8TmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50PigpO1xuICAgICAgICAgICAgaWYgKCFpbnN0IHx8ICFpbnN0LmlzVmFsaWQpIHJldHVybiBmYWxzZTsgLy8ga2VlcCB0aGUgZGlhbG9nIG9wZW4gb24gaW52YWxpZCBzdWJtaXRcbiAgICAgICAgICAgIHIuY2xvc2UoeyBuYW1lOiAoaW5zdC5uYW1lIHx8ICcnKS50cmltKCksIHBhcmVudElkOiBpbnN0LnBhcmVudElkLCBjb2xvcjogaW5zdC5jb2xvciB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJ1dHRvbkFsaWdubWVudDogJ3JpZ2h0JyxcbiAgICB9KTtcbiAgICByZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJDcmVhdGVkLmVtaXQoeyBwYXJlbnRJZDogcmVzdWx0LnBhcmVudElkLCBuYW1lOiByZXN1bHQubmFtZSwgY29sb3I6IHJlc3VsdC5jb2xvciB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkRlbGV0ZUZvbGRlckRpYWxvZyhjdHg6IEZvbGRlckRlbGV0ZVJlcXVlc3RlZFBheWxvYWQpOiB2b2lkIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbjxhbnksIHsgc3RyYXRlZ3k6IEZvbGRlckRlbGV0ZVN0cmF0ZWd5IH0gfCBmYWxzZT4oe1xuICAgICAgdGl0bGU6IHRoaXMubW9kdWxhckxhYmVscy5kZWxldGVGb2xkZXJEaWFsb2dUaXRsZSxcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgY29udGVudDoge1xuICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgY29tcG9uZW50OiBEZWxldGVGb2xkZXJEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgIGZvbGRlck5hbWU6IGN0eC5uYW1lLFxuICAgICAgICAgIHRlc3RDb3VudDogY3R4LnRlc3RDb3VudCxcbiAgICAgICAgICBoYXNQYXJlbnQ6IGN0eC5oYXNQYXJlbnQsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLm1vZHVsYXJMYWJlbHMsXG4gICAgICAgICAgc3RyYXRlZ3k6IGN0eC5oYXNQYXJlbnQgPyAnbW92ZS10by1wYXJlbnQnIDogJ21vdmUtdG8tdW5vcmdhbmlzZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogdGhpcy5tb2R1bGFyTGFiZWxzLmRlbGV0ZUZvbGRlckRpYWxvZ0NhbmNlbCwgcm9sZTogJ3NlY29uZGFyeScsIGhhbmRsZXI6IHIgPT4gci5jbG9zZShmYWxzZSkgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiB0aGlzLm1vZHVsYXJMYWJlbHMuZGVsZXRlRm9sZGVyRGlhbG9nQ29uZmlybSxcbiAgICAgICAgICByb2xlOiAnd2FybicsXG4gICAgICAgICAgaGFuZGxlcjogciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0ID0gci5nZXRDb21wb25lbnRJbnN0YW5jZTxEZWxldGVGb2xkZXJEaWFsb2dDb21wb25lbnQ+KCk7XG4gICAgICAgICAgICByLmNsb3NlKGluc3QgPyB7IHN0cmF0ZWd5OiBpbnN0LnN0cmF0ZWd5IH0gOiBmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBidXR0b25BbGlnbm1lbnQ6ICdyaWdodCcsXG4gICAgfSk7XG4gICAgcmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZm9sZGVyRGVsZXRlZC5lbWl0KHsgaWQ6IGN0eC5pZCwgc3RyYXRlZ3k6IHJlc3VsdC5zdHJhdGVneSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUm93LXJlb3JkZXIgaGFuZGxlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN0YXJ0UmVvcmRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1Jlb3JkZXJpbmcpIHJldHVybjtcbiAgICB0aGlzLnJlb3JkZXJTbmFwc2hvdCA9IFsuLi4odGhpcy5wYWdlZFJvd3MgfHwgW10pXTtcbiAgICB0aGlzLnJlb3JkZXJEcmFmdCA9IFsuLi4odGhpcy5wYWdlZFJvd3MgfHwgW10pXTtcbiAgICAvLyBQYXVzZSBhdXRvLXJlZnJlc2ggd2hpbGUgcmVvcmRlcmluZyDigJQgYXZvaWRzIHRoZSB0aW1lciBjbG9iYmVyaW5nIHRoZSBkcmFmdC5cbiAgICB0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID0gdGhpcy5zZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWw7XG4gICAgaWYgKHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2ggPiAwKSB7XG4gICAgICB0aGlzLnNldHVwQXV0b1JlZnJlc2goMCk7XG4gICAgfVxuICAgIHRoaXMuaXNSZW9yZGVyaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlb3JkZXJBd2FpdGluZ1NhdmVGbGlwID0gZmFsc2U7XG4gICAgdGhpcy5yZW9yZGVyU3RhcnQuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2FuY2VsUmVvcmRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSZW9yZGVyaW5nKSByZXR1cm47XG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFnZSBvcmRlciBzbyB0aGUgdXNlciBzZWVzIHRoZSBwcmUtZHJhZyBzdGF0ZS5cbiAgICBpZiAodGhpcy5yZW9yZGVyU25hcHNob3QpIHtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gWy4uLnRoaXMucmVvcmRlclNuYXBzaG90XTtcbiAgICB9XG4gICAgdGhpcy5leGl0UmVvcmRlck1vZGUoKTtcbiAgICB0aGlzLnJlb3JkZXJDYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgc2F2ZVJlb3JkZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0aGlzLnJlb3JkZXJEcmFmdCA/IFsuLi50aGlzLnJlb3JkZXJEcmFmdF0gOiBbLi4uKHRoaXMucGFnZWRSb3dzIHx8IFtdKV07XG4gICAgdGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCA9IHRydWU7XG4gICAgdGhpcy5yZW9yZGVyU2F2ZS5lbWl0KHsgb3JkZXJlZEl0ZW1zOiBvcmRlcmVkIH0pO1xuICAgIC8vIElmIHRoZSBob3N0IG5ldmVyIGZsaXBzIGByZW9yZGVyU2F2aW5nYCAoZS5nLiBzeW5jaHJvbm91cyBuby1vcCksIGV4aXRcbiAgICAvLyBpbW1lZGlhdGVseSBzbyB0aGUgVUkgZG9lc24ndCBnZXQgc3R1Y2sgaW4gXCJTYXZpbmcuLi5cIiBzdGF0ZS5cbiAgICBpZiAoIXRoaXMucmVvcmRlclNhdmluZykge1xuICAgICAgLy8gR2l2ZSB0aGUgaG9zdCBhIG1pY3JvdGFzayB0byBmbGlwIGByZW9yZGVyU2F2aW5nYCB0byB0cnVlIOKAlCBpZiBpdFxuICAgICAgLy8gaGFzbid0LCBhc3N1bWUgbm8gYXN5bmMgd29yayBhbmQgZXhpdC5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZW9yZGVyQXdhaXRpbmdTYXZlRmxpcCAmJiAhdGhpcy5yZW9yZGVyU2F2aW5nKSB7XG4gICAgICAgICAgdGhpcy5leGl0UmVvcmRlck1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Sb3dSZW9yZGVyKGV2ZW50OiB7IHByZXZpb3VzSW5kZXg6IG51bWJlcjsgY3VycmVudEluZGV4OiBudW1iZXI7IG9yZGVyZWREYXRhOiBhbnlbXSB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVvcmRlcmluZykgcmV0dXJuO1xuICAgIHRoaXMucmVvcmRlckRyYWZ0ID0gWy4uLmV2ZW50Lm9yZGVyZWREYXRhXTtcbiAgICB0aGlzLnBhZ2VkUm93cyA9IHRoaXMucmVvcmRlckRyYWZ0O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGl0UmVvcmRlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Jlb3JkZXJpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlb3JkZXJTbmFwc2hvdCA9IG51bGw7XG4gICAgdGhpcy5yZW9yZGVyRHJhZnQgPSBudWxsO1xuICAgIHRoaXMucmVvcmRlckF3YWl0aW5nU2F2ZUZsaXAgPSBmYWxzZTtcbiAgICAvLyBSZXN0b3JlIHByZXZpb3VzbHktc2VsZWN0ZWQgYXV0by1yZWZyZXNoIGludGVydmFsIChpZiBhbnkpLlxuICAgIGlmICh0aGlzLnJlb3JkZXJTYXZlZEF1dG9SZWZyZXNoID4gMCkge1xuICAgICAgdGhpcy5zZXR1cEF1dG9SZWZyZXNoKHRoaXMucmVvcmRlclNhdmVkQXV0b1JlZnJlc2gpO1xuICAgICAgdGhpcy5yZW9yZGVyU2F2ZWRBdXRvUmVmcmVzaCA9IDA7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdy1kcmFnIHBheWxvYWQgYnVpbGRlciB1c2VkIGJ5IHRoZSBbY3FhUm93RHJhZ10gZGlyZWN0aXZlIHZpYSAoYnVpbGRQYXlsb2FkKS5cbiAgICovXG4gIGJ1aWxkUm93RHJhZ1BheWxvYWQgPSAocm93OiBhbnkpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuY3VycmVudFNlbGVjdGVkSXRlbXM7XG4gICAgLy8gSWYgdGhlIGRyYWdnZWQgcm93IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBkcmFnIHRoZSB3aG9sZSBzZWxlY3Rpb24uXG4gICAgY29uc3Qgcm93SWQgPSByb3c/LmlkO1xuICAgIGNvbnN0IGluU2VsZWN0aW9uID0gcm93SWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5zb21lKHMgPT4gcz8uaWQgPT09IHJvd0lkKTtcbiAgICBjb25zdCBpZHMgPSAoaW5TZWxlY3Rpb24gPyBzZWxlY3RlZCA6IFtyb3ddKS5tYXAociA9PiByPy5pZCkuZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcbiAgICByZXR1cm4gaWRzO1xuICB9O1xufVxuIiwiPCEtLSBSZXVzYWJsZSBmb2xkZXItaWNvbiBjaGlwLiBSZW5kZXIgdmlhIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uQ2hpcDsgY29udGV4dDogeyBjb2xvcjogZi5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+LiAtLT5cbjxuZy10ZW1wbGF0ZSAjZm9sZGVySWNvbkNoaXAgbGV0LWNvbG9yPVwiY29sb3JcIj5cbiAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctMTAgY3FhLWgtMTAgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRjBGMEYxXSBjcWEtdGV4dC1bIzZENkQ3NF0gY3FhLXNocmluay0wIGdyb3VwLWhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTEyLjk1ODMgMTAuNDU4NUMxMi45NTgzIDEwLjc5IDEyLjgyNjYgMTEuMTA4IDEyLjU5MjEgMTEuMzQyNEMxMi4zNTc3IDExLjU3NjggMTIuMDM5OCAxMS43MDg1IDExLjcwODMgMTEuNzA4NUgxLjcwODI1QzEuMzc2NzMgMTEuNzA4NSAxLjA1ODc5IDExLjU3NjggMC44MjQzNjggMTEuMzQyNEMwLjU4OTk0OCAxMS4xMDggMC40NTgyNTIgMTAuNzkgMC40NTgyNTIgMTAuNDU4NVYxLjcwODVDMC40NTgyNTIgMS4zNzY5OCAwLjU4OTk0OCAxLjA1OTAzIDAuODI0MzY4IDAuODI0NjEzQzEuMDU4NzkgMC41OTAxOTIgMS4zNzY3MyAwLjQ1ODQ5NiAxLjcwODI1IDAuNDU4NDk2SDQuODMzMjVMNi4wODMyNSAyLjMzMzVIMTEuNzA4M0MxMi4wMzk4IDIuMzMzNSAxMi4zNTc3IDIuNDY1MTkgMTIuNTkyMSAyLjY5OTYxQzEyLjgyNjYgMi45MzQwMyAxMi45NTgzIDMuMjUxOTggMTIuOTU4MyAzLjU4MzVWMTAuNDU4NVpcIiBbYXR0ci5zdHJva2VdPVwiY29sb3IgfHwgJ2N1cnJlbnRDb2xvcidcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBSZXVzYWJsZSBcIitcIiBjaGlwIHVzZWQgYnkgdGhlIFwiTmV3IGZvbGRlclwiIHRpbGUuIC0tPlxuPG5nLXRlbXBsYXRlICNhZGRJY29uQ2hpcD5cbiAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctMTAgY3FhLWgtMTAgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRjBGMEYxXSBjcWEtdGV4dC1bIzZENkQ3NF0gY3FhLXNocmluay0wIGdyb3VwLWhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTggM1YxM00zIDhIMTNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI3NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXJlbGF0aXZlXCI+XG4gICAgPGRpdiBbY2xhc3NdPVwiIXNob3dTZWFyY2hCYXIgPyAnY3FhLWp1c3RpZnktZW5kJyA6ICdjcWEtanVzdGlmeS1iZXR3ZWVuJ1wiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZmxleC13cmFwIGNxYS1tYi0zXCI+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgKm5nSWY9XCJzaG93U2VhcmNoQmFyXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJzaG93Q2xlYXJcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwidmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzZWFyY2gpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAoY2xlYXJlZCk9XCJjbGVhcmVkKClcIlxuICAgICAgPjwvY3FhLXNlYXJjaC1iYXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIlxuICAgICAgICB2YXJpYW50PVwiZ3JleS1zb2xpZFwiXG4gICAgICAgIGljb249XCJvcGVuX2luX25ld1wiXG4gICAgICAgIFt0ZXh0XT1cImlzRXhwb3J0aW5nID8gJ0V4cG9ydGluZy4uLicgOiAnRXhwb3J0J1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0V4cG9ydGluZ1wiXG4gICAgICAgIChjbGlja2VkKT1cImV4cG9ydENvZGVDbGljaygpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4+e3sgaXNFeHBvcnRpbmcgPyAnRXhwb3J0aW5nLi4uJyA6ICdFeHBvcnQnIH19PC9zcGFuPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgXG4gICAgICA8IS0tIEV4cG9ydCBDb2RlIE1vZGFsIC0tPlxuICAgICAgPGNxYS1leHBvcnQtY29kZS1tb2RhbFxuICAgICAgICAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIlxuICAgICAgICBbaXNPcGVuXT1cImlzRXhwb3J0TW9kYWxPcGVuXCJcbiAgICAgICAgW2Nhc2VzXT1cInNlbGVjdGVkQ2FzZXNGb3JFeHBvcnRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAoY2xvc2VNb2RhbCk9XCJjbG9zZUV4cG9ydE1vZGFsKClcIlxuICAgICAgICAoZXhwb3J0KT1cIm9uRXhwb3J0TW9kYWxFeHBvcnQoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtZXhwb3J0LWNvZGUtbW9kYWw+XG4gICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkcm9wZG93blRlbXBsYXRlIG9mIG90aGVyRHJvcERvd25CdXR0b25zOyB0cmFja0J5OiB0cmFja0J5RHJvcGRvd25UZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93blRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlbGVjdERyb3Bkb3duVGVtcGxhdGUgb2Ygb3RoZXJTZWxlY3REcm9wRG93bkJ1dHRvbnM7IHRyYWNrQnk6IHRyYWNrQnlTZWxlY3REcm9wZG93blRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdERyb3Bkb3duVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIFxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0ZpbHRlckJ1dHRvblwiXG4gICAgICAgICAgdmFyaWFudD1cImdyZXktc29saWRcIlxuICAgICAgICAgIGljb249XCJhZGRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgIChjbGlja2VkKT1cInRvZ2dsZUZpbHRlcigpXCJcbiAgICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgRmlsdGVyICAgICAgICAgIFxuICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJhcnJvd0NsYXNzZXNcIj5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy0yIGNxYS1oLTEgY3FhLWFic29sdXRlIGNxYS1sZWZ0LVs0cHhdIGNxYS10b3AtWzZweF1cIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDggNFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wIDBMNCA0TDggMFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzBCMEIwQ1wiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS4zM1wiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWNvbHVtbi12aXNpYmlsaXR5XG4gICAgICAgICAgKm5nSWY9XCJzaG93U2V0dGluZ3NCdXR0b25cIlxuICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2liaWxpdHlDb2x1bW5zXCJcbiAgICAgICAgICBbY29sdW1uVmlzaWJpbGl0eV09XCJjb2x1bW5WaXNpYmlsaXR5XCJcbiAgICAgICAgICBbc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsXT1cInNlbGVjdGVkQXV0b1JlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2UpPVwib25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChhdXRvUmVmcmVzaENoYW5nZSk9XCJvbkF1dG9SZWZyZXNoQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9jcWEtY29sdW1uLXZpc2liaWxpdHk+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93QXV0b1JlZnJlc2hCdXR0b25cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgICBpY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwiaGFuZGxlUmVmcmVzaENsaWNrKClcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidSZWZyZXNoJ1wiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1Jlb3JkZXJpbmdcIlxuICAgICAgICA+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidXR0b25UZW1wbGF0ZSBvZiBvdGhlckJ1dHRvbnM7IHRyYWNrQnk6IHRyYWNrQnlUZW1wbGF0ZVJlZlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAqbmdJZj1cInNob3dWaWV3TW9kZVRvZ2dsZVwiXG4gICAgICAgICAgc2l6ZT1cImxnXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwidmlld01vZGVTZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cInZpZXdNb2RlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WaWV3TW9kZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPjwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dSZW9yZGVyQnV0dG9uICYmICFpc1Jlb3JkZXJpbmdcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgaWNvbj1cImRyYWdfaW5kaWNhdG9yXCJcbiAgICAgICAgICBbdGV4dF09XCJyZW9yZGVyTGFiZWxzLnJlb3JkZXJCdXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhcGFnZWRSb3dzIHx8IHBhZ2VkUm93cy5sZW5ndGggPT09IDAgfHwgaXNUYWJsZUxvYWRpbmcgfHwgaXNUYWJsZURhdGFMb2FkaW5nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJzdGFydFJlb3JkZXIoKVwiXG4gICAgICAgID48L2NxYS1idXR0b24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UmVvcmRlckJ1dHRvbiAmJiBpc1Jlb3JkZXJpbmdcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cInJlb3JkZXJMYWJlbHMuY2FuY2VsQnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZW9yZGVyU2F2aW5nXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cImNhbmNlbFJlb3JkZXIoKVwiXG4gICAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgICAgICBbaWNvbl09XCJyZW9yZGVyU2F2aW5nID8gJ2hvdXJnbGFzc19lbXB0eScgOiAnJ1wiXG4gICAgICAgICAgICBbdGV4dF09XCJyZW9yZGVyU2F2aW5nID8gcmVvcmRlckxhYmVscy5zYXZpbmdCdXR0b24gOiByZW9yZGVyTGFiZWxzLmRvbmVCdXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlb3JkZXJTYXZpbmdcIlxuICAgICAgICAgICAgKGNsaWNrZWQpPVwic2F2ZVJlb3JkZXIoKVwiXG4gICAgICAgICAgPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVvcmRlciBtb2RlIGJhbm5lciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZW9yZGVyaW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWItMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtcm91bmRlZC1tZCBjcWEtYmctWyNGRkZCRUJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZERTY4QV1cIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCIjOTI0MDBFXCI+PC9jaXJjbGU+XG4gICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cIiM5MjQwMEVcIj48L2NpcmNsZT5cbiAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiIzkyNDAwRVwiPjwvY2lyY2xlPlxuICAgICAgPC9zdmc+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjOTI0MDBFXVwiPnt7IHJlb3JkZXJMYWJlbHMuYmFubmVyVGl0bGUgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjOTI0MDBFXVwiPnt7IHJlb3JkZXJMYWJlbHMuYmFubmVyRGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8Y3FhLXNlbGVjdGVkLWZpbHRlcnNcbiAgICAgIFtmaWx0ZXJBcHBsaWVkXT1cImZpbHRlckFwcGxpZWRcIlxuICAgICAgW2NoaXBzXT1cImNoaXBzXCJcbiAgICAgIChyZW1vdmVDaGlwKT1cIm9uUmVtb3ZlQ2hpcCgkZXZlbnQpXCJcbiAgICAgIChjbGVhckFsbCk9XCJvbkNsZWFyQWxsQ2hpcHMoKVwiXG4gICAgICAob25DbGVhckFsbCk9XCJvbkNsZWFyQWxsLmVtaXQoKVwiXG4gICAgPlxuICAgIDwvY3FhLXNlbGVjdGVkLWZpbHRlcnM+XG5cbiAgICA8Y3FhLWR5bmFtaWMtZmlsdGVyXG4gICAgICAqbmdJZj1cInNob3dGaWx0ZXJQYW5lbFwiXG4gICAgICBbY29uZmlnXT1cImZpbHRlckNvbmZpZ1wiXG4gICAgICBbbW9kZWxdPVwiZmlsdGVyTW9kZWxcIlxuICAgICAgW3Nob3dGaWx0ZXJQYW5lbF09XCJzaG93RmlsdGVyUGFuZWxcIlxuICAgICAgKGZpbHRlcnNDaGFuZ2VkKT1cIm9uRmlsdGVyc0NoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAoZmlsdGVyc0FwcGxpZWQpPVwib25GaWx0ZXJzQXBwbGllZCgkZXZlbnQpXCJcbiAgICAgIChvbkFwcGx5RmlsdGVyQ2xpY2spPVwib25BcHBseUZpbHRlckNsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAob25SZXNldEZpbHRlckNsaWNrKT1cImhhbmRsZVJlc2V0RmlsdGVyQ2xpY2soKVwiXG4gICAgPlxuICAgIDwvY3FhLWR5bmFtaWMtZmlsdGVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdHJldGNoIGNxYS1nYXAtMyBjcWEtbWluLWgtMCBcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjI2LCAyMjYsIDIyNyk7XCI+XG4gICAgICA8IS0tIFNpZGViYXIgKG9ubHkgc2hvd24gaW4gbW9kdWxhciB2aWV3KSAtLT5cbiAgICAgIDxjcWEtZm9sZGVyLXNpZGViYXJcbiAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmIG1vZHVsYXJDb25maWcuc2hvd1NpZGViYXJcIlxuICAgICAgICBbZm9sZGVyc109XCJmb2xkZXJzXCJcbiAgICAgICAgW3NlbGVjdGVkRm9sZGVySWRdPVwic2VsZWN0ZWRGb2xkZXJJZFwiXG4gICAgICAgIFtleHBhbmRlZEZvbGRlcklkc109XCJleHBhbmRlZEZvbGRlcklkc1wiXG4gICAgICAgIFt1bm9yZ2FuaXNlZENvdW50XT1cInVub3JnYW5pc2VkQ291bnRcIlxuICAgICAgICBbYWxsb3dDcmVhdGVdPVwibW9kdWxhckNvbmZpZy5hbGxvd0NyZWF0ZUZvbGRlclwiXG4gICAgICAgIFthbGxvd1JlbmFtZV09XCJtb2R1bGFyQ29uZmlnLmFsbG93UmVuYW1lRm9sZGVyXCJcbiAgICAgICAgW2FsbG93RGVsZXRlXT1cIm1vZHVsYXJDb25maWcuYWxsb3dEZWxldGVGb2xkZXJcIlxuICAgICAgICBbYWxsb3dEcm9wXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICBbc2hvd0NvdW50c109XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIlxuICAgICAgICBbY29sbGFwc2VkXT1cInNpZGViYXJDb2xsYXBzZWRcIlxuICAgICAgICBbbGFiZWxzXT1cIm1vZHVsYXJMYWJlbHNcIlxuICAgICAgICBbc2VydmVyU2lkZVNlYXJjaF09XCJzZXJ2ZXJTaWRlU2VhcmNoXCJcbiAgICAgICAgW3Jvb3RUb3RhbF09XCJyb290VG90YWxcIlxuICAgICAgICBbZm9sZGVyU2VhcmNoTG9hZGluZ109XCJmb2xkZXJTZWFyY2hMb2FkaW5nXCJcbiAgICAgICAgW3Jvb3RGb2xkZXJzTG9hZGluZ109XCJyb290Rm9sZGVyc0xvYWRpbmdcIlxuICAgICAgICAoZm9sZGVyU2VsZWN0ZWQpPVwib25Gb2xkZXJTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckV4cGFuc2lvblRvZ2dsZWQpPVwib25Gb2xkZXJFeHBhbnNpb25Ub2dnbGVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyQ2hpbGRyZW5SZXF1ZXN0ZWQpPVwiZm9sZGVyQ2hpbGRyZW5SZXF1ZXN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckxvYWRNb3JlUmVxdWVzdGVkKT1cImZvbGRlckxvYWRNb3JlUmVxdWVzdGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChyb290TG9hZE1vcmVSZXF1ZXN0ZWQpPVwicm9vdExvYWRNb3JlUmVxdWVzdGVkLmVtaXQoKVwiXG4gICAgICAgIChzZWFyY2hDaGFuZ2UpPVwiZm9sZGVyU2VhcmNoQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJDcmVhdGVkKT1cIm9uRm9sZGVyQ3JlYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckNyZWF0ZVJlcXVlc3RlZCk9XCJvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlclJlbmFtZWQpPVwib25Gb2xkZXJSZW5hbWVkKCRldmVudClcIlxuICAgICAgICAoZm9sZGVyRGVsZXRlZCk9XCJvbkZvbGRlckRlbGV0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChmb2xkZXJNb3ZlUmVxdWVzdGVkKT1cIm9uRm9sZGVyTW92ZVJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZCk9XCJvbkZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJvblRlc3RzRHJvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgKGZvbGRlckRyb3BwZWQpPVwib25Gb2xkZXJEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAoY29sbGFwc2VkQ2hhbmdlKT1cIm9uU2lkZWJhckNvbGxhcHNlZENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1mb2xkZXItc2lkZWJhcj5cblxuICAgICAgPCEtLSBSaWdodCBwYW5lIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1taW4tdy0wXCJcbiAgICAgICAgW3N0eWxlLmJvcmRlci10b3BdPVwiaXNNb2R1bGFyVmlldyA/ICcxcHggc29saWQgI0UyRTJFMycgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLmJvcmRlci1sZWZ0XT1cImlzTW9kdWxhclZpZXcgPyAnMXB4IHNvbGlkICNFMkUyRTMnIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmlnaHRdPVwiaXNNb2R1bGFyVmlldyA/ICcxcHggc29saWQgI0UyRTJFMycgOiBudWxsXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBCcmVhZGNydW1iIChtb2R1bGFyIHZpZXcsIGZvbGRlciBkcmlsbGVkLWluKSAtLT5cbiAgICAgICAgPG5hdlxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dCcmVhZGNydW1iICYmICFpc1Jvb3RWaWV3XCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRm9sZGVyIHBhdGhcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXB4LTMgY3FhLXB5LTEgY3FhLW1iLTMgY3FhLXJvdW5kZWQtbm9uZVwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjogIzZENkQ3NDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFMkUyRTM7XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiIChjbGljayk9XCJvbkZvbGRlclNlbGVjdGVkKG51bGwpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi45NTgzIDEwLjQ1ODVDMTIuOTU4MyAxMC43OSAxMi44MjY2IDExLjEwOCAxMi41OTIxIDExLjM0MjRDMTIuMzU3NyAxMS41NzY4IDEyLjAzOTggMTEuNzA4NSAxMS43MDgzIDExLjcwODVIMS43MDgyNUMxLjM3NjczIDExLjcwODUgMS4wNTg3OSAxMS41NzY4IDAuODI0MzY4IDExLjM0MjRDMC41ODk5NDggMTEuMTA4IDAuNDU4MjUyIDEwLjc5IDAuNDU4MjUyIDEwLjQ1ODVWMS43MDg1QzAuNDU4MjUyIDEuMzc2OTggMC41ODk5NDggMS4wNTkwMyAwLjgyNDM2OCAwLjgyNDYxM0MxLjA1ODc5IDAuNTkwMTkyIDEuMzc2NzMgMC40NTg0OTYgMS43MDgyNSAwLjQ1ODQ5Nkg0LjgzMzI1TDYuMDgzMjUgMi4zMzM1SDExLjcwODNDMTIuMDM5OCAyLjMzMzUgMTIuMzU3NyAyLjQ2NTE5IDEyLjU5MjEgMi42OTk2MUMxMi44MjY2IDIuOTM0MDMgMTIuOTU4MyAzLjI1MTk4IDEyLjk1ODMgMy41ODM1VjEwLjQ1ODVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzcGFuPnt7IG1vZHVsYXJMYWJlbHMuYWxsRm9sZGVycyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjcnVtYiBvZiBicmVhZGNydW1iVHJhaWw7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWFsaWduLW1pZGRsZVwiIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtjb2xvcjojNkQ2RDc0O1wiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibGFzdFxuICAgICAgICAgICAgICAgID8gJ2NxYS10ZXh0LVsjMTYxNjE3XSBjcWEtZm9udC1zZW1pYm9sZCdcbiAgICAgICAgICAgICAgICA6ICdjcWEtdGV4dC1bIzZENkQ3NF0gaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdJ1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsYXN0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiFsYXN0ICYmIG9uRm9sZGVyU2VsZWN0ZWQoY3J1bWIuaWQpXCJcbiAgICAgICAgICAgID57eyBjcnVtYi5uYW1lIH19PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmF2PlxuXG4gICAgICAgIDwhLS0gRm9sZGVyIGdyaWQ6IG1vZHVsYXIgKyByb290IHZpZXcgLS0+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgKm5nSWY9XCJpc01vZHVsYXJWaWV3ICYmIGlzUm9vdFZpZXcgJiYgbW9kdWxhckNvbmZpZy5zaG93Rm9sZGVyR3JpZCAmJiByb290Rm9sZGVyVGlsZXMubGVuZ3RoXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1tYi00IGNxYS1weC01IGNxYS1wdC00IGNxYS1wYi1bMTRweF1cIlxuICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGMEYwRjE7XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWItMlwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE0IDEzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuOTU4MyAxMC40NTg1QzEyLjk1ODMgMTAuNzkgMTIuODI2NiAxMS4xMDggMTIuNTkyMSAxMS4zNDI0QzEyLjM1NzcgMTEuNTc2OCAxMi4wMzk4IDExLjcwODUgMTEuNzA4MyAxMS43MDg1SDEuNzA4MjVDMS4zNzY3MyAxMS43MDg1IDEuMDU4NzkgMTEuNTc2OCAwLjgyNDM2OCAxMS4zNDI0QzAuNTg5OTQ4IDExLjEwOCAwLjQ1ODI1MiAxMC43OSAwLjQ1ODI1MiAxMC40NTg1VjEuNzA4NUMwLjQ1ODI1MiAxLjM3Njk4IDAuNTg5OTQ4IDEuMDU5MDMgMC44MjQzNjggMC44MjQ2MTNDMS4wNTg3OSAwLjU5MDE5MiAxLjM3NjczIDAuNDU4NDk2IDEuNzA4MjUgMC40NTg0OTZINC44MzMyNUw2LjA4MzI1IDIuMzMzNUgxMS43MDgzQzEyLjAzOTggMi4zMzM1IDEyLjM1NzcgMi40NjUxOSAxMi41OTIxIDIuNjk5NjFDMTIuODI2NiAyLjkzNDAzIDEyLjk1ODMgMy4yNTE5OCAxMi45NTgzIDMuNTgzNVYxMC40NTg1WlwiIHN0cm9rZT1cIiM2RDZENzRcIiBzdHJva2Utd2lkdGg9XCIwLjkxNjY2N1wiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM2RDZENzRdXCI+e3sgbW9kdWxhckxhYmVscy5vcmdhbmlzZWQgfX08L2gzPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzZENkQ3NF1cIj5cbiAgICAgICAgICAgICAge3sgcm9vdEZvbGRlclRpbGVzLmxlbmd0aCA9PT0gMSA/IG1vZHVsYXJMYWJlbHMuZm9sZGVyc0NvdW50U2luZ3VsYXIgOiBtb2R1bGFyTGFiZWxzLmZvbGRlcnNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnJyArIHJvb3RGb2xkZXJUaWxlcy5sZW5ndGgpIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LW5vd3JhcCBjcWEtZ2FwLTMgY3FhLW92ZXJmbG93LXgtYXV0byBjcWEtc2Nyb2xsYmFyLXRoaW4gY3FhLXBiLTJcIlxuICAgICAgICAgICAgICAgKHNjcm9sbCk9XCJvblJvb3RHcmlkU2Nyb2xsKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGYgb2Ygcm9vdEZvbGRlclRpbGVzXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtjcWFGb2xkZXJEcm9wXT1cImYuaWRcIlxuICAgICAgICAgICAgICBbZHJvcEVuYWJsZWRdPVwibW9kdWxhckNvbmZpZy5hbGxvd1Rlc3REcmFnRHJvcFwiXG4gICAgICAgICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwib25UZXN0c0Ryb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlclNlbGVjdGVkKGYuaWQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLXNocmluay0wIGNxYS13LVsyNDBweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtdGV4dC1sZWZ0IGNxYS1wLTMgY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bMC41cHhdIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1iZy13aGl0ZSBob3ZlcjpjcWEtYm9yZGVyLVsjM0Y0M0VFXSBob3ZlcjpjcWEtc2hhZG93LXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uQ2hpcDsgY29udGV4dDogeyBjb2xvcjogZi5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTVweF0gY3FhLXRleHQtWyMxNjE2MTddIGNxYS10cnVuY2F0ZSBjcWEtbGVhZGluZy10aWdodCBncm91cC1ob3ZlcjpjcWEtdGV4dC1bIzNGNDNFRV1cIj57eyBmLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1vZHVsYXJDb25maWcuc2hvd0NvdW50c1wiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IChmLmNvdW50ID8/IDApID09PSAxID8gbW9kdWxhckxhYmVscy50ZXN0c0NvdW50U2luZ3VsYXIgOiBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJycgKyAoZi5jb3VudCA/PyAwKSkgfX08bmctY29udGFpbmVyICpuZ0lmPVwiZi5jaGlsZHJlbj8ubGVuZ3RoXCI+IMK3IHt7IGYuY2hpbGRyZW4hLmxlbmd0aCA9PT0gMSA/IG1vZHVsYXJMYWJlbHMub25lU3ViZm9sZGVyIDogbW9kdWxhckxhYmVscy5zdWJmb2xkZXJzQ291bnQucmVwbGFjZSgne259JywgJycgKyBmLmNoaWxkcmVuIS5sZW5ndGgpIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1uZXV0cmFsLTQwMCBjcWEtc2hyaW5rLTBcIiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHhcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZCh7IHBhcmVudElkOiBudWxsIH0pXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLXNocmluay0wIGNxYS13LVsyNDBweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVswLjVweF0gY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLWJnLVsjRkFGQUZBXSBob3ZlcjpjcWEtYm9yZGVyLVsjM0Y0M0VFXSBob3ZlcjpjcWEtYmctd2hpdGUgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25DaGlwXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNXB4XSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLXRydW5jYXRlIGNxYS1sZWFkaW5nLXRpZ2h0IGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IG1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC00MDBcIj57eyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJzAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBQYWdpbmF0aW9uIHNwaW5uZXIgYW5jaG9yZWQgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIE9yZ2FuaXNlZFxuICAgICAgICAgICAgICAgICByb3cuIE9ubHkgcmVuZGVycyBkdXJpbmcgYW4gaW4tZmxpZ2h0IHJvb3QgZmV0Y2ggKGluaXRpYWwgT1JcbiAgICAgICAgICAgICAgICAgc2Nyb2xsLWRyaXZlbiBcImxvYWQgbW9yZVwiKSwgYW5kIGlzIGZpbHRlcmVkIHRvIHN1cHByZXNzIHdoZW5cbiAgICAgICAgICAgICAgICAgdGhlIHNlY3Rpb24gaXMgZW1wdHkgc28gd2UgZG9uJ3Qgc2hvdyBhIHNwaW5uZXIgaW5zaWRlIGFuXG4gICAgICAgICAgICAgICAgIG90aGVyd2lzZS1ibGFuayByb3cuIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cInJvb3RGb2xkZXJzTG9hZGluZyAmJiByb290Rm9sZGVyVGlsZXMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXNocmluay0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LVs4MHB4XVwiXG4gICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0xvYWRpbmcgbW9yZSBmb2xkZXJzJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjIwXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8IS0tIFN1YmZvbGRlciBzZWN0aW9uOiBtb2R1bGFyICsgZm9sZGVyIHZpZXcuIFNob3duIHdoZW5ldmVyIGRyaWxsZWQgaW5cbiAgICAgICAgICAgICAoZXZlbiBpZiBubyBzdWJmb2xkZXJzLCBzbyB0aGUgXCIrIE5ldyBmb2xkZXJcIiB0aWxlIHJlbWFpbnNcbiAgICAgICAgICAgICByZWFjaGFibGUsIGFuZCBzbyB3ZSBjYW4gcmVuZGVyIGEgbG9hZGluZyBzdGF0ZSBkdXJpbmcgdGhlXG4gICAgICAgICAgICAgZHJpbGwtaW4gZmV0Y2ggYmVmb3JlIGNoaWxkcmVuIGFycml2ZSkuIC0tPlxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiAhaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dTdWJmb2xkZXJTZWN0aW9uICYmIChzdWJmb2xkZXJUaWxlcy5sZW5ndGggfHwgY3VycmVudEZvbGRlck5vZGU/LmNoaWxkcmVuTG9hZGluZylcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLW1iLTQgY3FhLXB4LTMgY3FhLXB5LTFcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN1YmZvbGRlclRpbGVzLmxlbmd0aCB8fCBtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTYwMCBjcWEtbWItMlwiPlxuICAgICAgICAgICAge3sgbW9kdWxhckxhYmVscy5zdWJmb2xkZXJzSW4gfX0ge3sgYnJlYWRjcnVtYlRyYWlsLmxlbmd0aCA/IGJyZWFkY3J1bWJUcmFpbFticmVhZGNydW1iVHJhaWwubGVuZ3RoIC0gMV0ubmFtZSA6ICcnIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LW5vd3JhcCBjcWEtZ2FwLTMgY3FhLW92ZXJmbG93LXgtYXV0byBjcWEtc2Nyb2xsYmFyLXRoaW4gY3FhLXBiLTJcIlxuICAgICAgICAgICAgICAgKHNjcm9sbCk9XCJvblN1YmZvbGRlckdyaWRTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZiBvZiBzdWJmb2xkZXJUaWxlc1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJmLmlkXCJcbiAgICAgICAgICAgICAgW2Ryb3BFbmFibGVkXT1cIm1vZHVsYXJDb25maWcuYWxsb3dUZXN0RHJhZ0Ryb3BcIlxuICAgICAgICAgICAgICAodGVzdHNEcm9wcGVkKT1cIm9uVGVzdHNEcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChmLmlkKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1zaHJpbmstMCBjcWEtdy1bMjQwcHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWzAuNXB4XSBjcWEtYm9yZGVyLVsjRTJFMkUzXSBjcWEtYmctd2hpdGUgaG92ZXI6Y3FhLWJvcmRlci1bIzNGNDNFRV0gaG92ZXI6Y3FhLXNoYWRvdy1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbkNoaXA7IGNvbnRleHQ6IHsgY29sb3I6IGYuY29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE1cHhdIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtdHJ1bmNhdGUgY3FhLWxlYWRpbmctdGlnaHQgZ3JvdXAtaG92ZXI6Y3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtb2R1bGFyQ29uZmlnLnNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoZi5jb3VudCA/PyAwKSA9PT0gMSA/IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFNpbmd1bGFyIDogbW9kdWxhckxhYmVscy50ZXN0c0NvdW50UGx1cmFsLnJlcGxhY2UoJ3tufScsICcnICsgKGYuY291bnQgPz8gMCkpIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1uZXV0cmFsLTQwMCBjcWEtc2hyaW5rLTBcIiBzdHlsZT1cImZvbnQtc2l6ZToyMHB4O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHhcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIFwiKyBOZXcgZm9sZGVyXCIgdGlsZSAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJtb2R1bGFyQ29uZmlnLmFsbG93Q3JlYXRlRm9sZGVyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkZvbGRlckNyZWF0ZVJlcXVlc3RlZCh7IHBhcmVudElkOiBzZWxlY3RlZEZvbGRlcklkIH0pXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLXNocmluay0wIGNxYS13LVsyNDBweF0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXRleHQtbGVmdCBjcWEtcC0zIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVswLjVweF0gY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLWJnLVsjRkFGQUZBXSBob3ZlcjpjcWEtYm9yZGVyLVsjM0Y0M0VFXSBob3ZlcjpjcWEtYmctd2hpdGUgY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFkZEljb25DaGlwXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxNXB4XSBjcWEtdGV4dC1bIzE2MTYxN10gY3FhLXRydW5jYXRlIGNxYS1sZWFkaW5nLXRpZ2h0IGdyb3VwLWhvdmVyOmNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IG1vZHVsYXJMYWJlbHMubmV3Rm9sZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC00MDBcIj57eyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRQbHVyYWwucmVwbGFjZSgne259JywgJzAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBTdWJmb2xkZXIgZmV0Y2ggaW5kaWNhdG9yLiBUd28gY2FzZXM6XG4gICAgICAgICAgICAgICAgIC0gRHJpbGwtaW4gZmV0Y2g6IG5vIHN1YmZvbGRlclRpbGVzIHlldCwgcmVuZGVyIGEgY2VudGVyZWRcbiAgICAgICAgICAgICAgICAgICByb3cgc3Bpbm5lciBzbyB0aGUgc2VjdGlvbiBpc24ndCBlbXB0eSBkdXJpbmcgdGhlIGZldGNoLlxuICAgICAgICAgICAgICAgICAtIFBhZ2luYXRpb24gZmV0Y2g6IHRpbGVzIGV4aXN0LCBhbmNob3IgYSBzbWFsbCBzcGlubmVyIGF0XG4gICAgICAgICAgICAgICAgICAgdGhlIHJpZ2h0IGVkZ2Ugc28gdGhlIHVzZXIga25vd3MgdGhlIG5leHQgcGFnZSBpcyBsb2FkaW5nLiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50Rm9sZGVyTm9kZT8uY2hpbGRyZW5Mb2FkaW5nXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtc2hyaW5rLTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctWzgwcHhdXCJcbiAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInTG9hZGluZyBzdWJmb2xkZXJzJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjIwXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8IS0tIEZvbGRlciBwYW5lbCBoZWFkZXIgYWJvdmUgdGhlIHRhYmxlOiBcIkhvdGVsIFNlYXJjaCAoMylcIiArIENsZWFyIGZpbHRlciAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGFyVmlldyAmJiAhaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dVbm9yZ2FuaXNlZFNlY3Rpb25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLW1iLTEgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1weC00IGNxYS1weS0zIGNxYS1yb3VuZGVkLXQtbGcgY3FhLWJnLWluZGlnby01MCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItaW5kaWdvLTEwMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxM1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjk1ODUgMTAuNDU4NUMxMi45NTg1IDEwLjc5IDEyLjgyNjggMTEuMTA4IDEyLjU5MjQgMTEuMzQyNEMxMi4zNTggMTEuNTc2OCAxMi4wNCAxMS43MDg1IDExLjcwODUgMTEuNzA4NUgxLjcwODVDMS4zNzY5OCAxMS43MDg1IDEuMDU5MDMgMTEuNTc2OCAwLjgyNDYxMyAxMS4zNDI0QzAuNTkwMTkyIDExLjEwOCAwLjQ1ODQ5NiAxMC43OSAwLjQ1ODQ5NiAxMC40NTg1VjEuNzA4NUMwLjQ1ODQ5NiAxLjM3Njk4IDAuNTkwMTkyIDEuMDU5MDMgMC44MjQ2MTMgMC44MjQ2MTNDMS4wNTkwMyAwLjU5MDE5MiAxLjM3Njk4IDAuNDU4NDk2IDEuNzA4NSAwLjQ1ODQ5Nkg0LjgzMzVMNi4wODM1IDIuMzMzNUgxMS43MDg1QzEyLjA0IDIuMzMzNSAxMi4zNTggMi40NjUxOSAxMi41OTI0IDIuNjk5NjFDMTIuODI2OCAyLjkzNDAzIDEyLjk1ODUgMy4yNTE5OCAxMi45NTg1IDMuNTgzNVYxMC40NTg1WlwiIFthdHRyLnN0cm9rZV09XCJjdXJyZW50Rm9sZGVyTm9kZT8uY29sb3IgfHwgJyMzRjQzRUUnXCIgc3Ryb2tlLXdpZHRoPVwiMC45MTY2NjdcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtaW5kaWdvLTcwMFwiPlxuICAgICAgICAgICAgICB7eyBjdXJyZW50Rm9sZGVyTm9kZT8ubmFtZSB9fSAoe3sgY3VycmVudEZvbGRlckRpcmVjdENvdW50IH19KVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcHgtMyBjcWEtcHktMSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtaW5kaWdvLTcwMCBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWluZGlnby0yMDAgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLWJnLWluZGlnby01MFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Gb2xkZXJTZWxlY3RlZChudWxsKVwiXG4gICAgICAgICAgPnt7IG1vZHVsYXJMYWJlbHMuY2xlYXJGaWx0ZXIgfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBVbm9yZ2FuaXNlZCBzZWN0aW9uIGhlYWRlciBhdCByb290IHZpZXcgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cImlzTW9kdWxhclZpZXcgJiYgaXNSb290VmlldyAmJiBtb2R1bGFyQ29uZmlnLnNob3dVbm9yZ2FuaXNlZFNlY3Rpb25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1iLTIgY3FhLW10LTJcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAyMHB4O1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzZENkQ3NF1cIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5pbmJveDwvbWF0LWljb24+XG4gICAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM2RDZENzRdXCI+e3sgbW9kdWxhckxhYmVscy51bm9yZ2FuaXNlZCB9fTwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzZENkQ3NF1cIj5cbiAgICAgICAgICAgIHt7IHVub3JnYW5pc2VkQ291bnQgPT09IDEgPyBtb2R1bGFyTGFiZWxzLnRlc3RzQ291bnRTaW5ndWxhciA6IG1vZHVsYXJMYWJlbHMudGVzdHNDb3VudFBsdXJhbC5yZXBsYWNlKCd7bn0nLCAnJyArIHVub3JnYW5pc2VkQ291bnQpIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhYmxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtWzdweF0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1sIGNxYS1ib3JkZXItciBjcWEtYm9yZGVyLWdyZXktMjAwIGNxYS1yZWxhdGl2ZSBjcWEtb3ZlcmZsb3cteC1hdXRvXCJcbiAgICAgICAgICAgICBbYXR0ci5zdHlsZV09XCJwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDAgPyBudWxsIDogJ2JvcmRlci1ib3R0b206IG5vbmUgIWltcG9ydGFudCdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGlzVGFibGVMb2FkaW5nIHx8IGlzVGFibGVEYXRhTG9hZGluZykgfHwgKCFlZmZlY3RpdmVJc0VtcHR5U3RhdGUgJiYgcGFnZWRSb3dzICYmIHBhZ2VkUm93cy5sZW5ndGggPiAwKTsgZWxzZSBzdG9yeUVtcHR5VHBsXCI+XG4gICAgICAgICAgICA8YXBwLWR5bmFtaWMtdGFibGVcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1ib3R0b21dPVwicGFnZWRSb3dzICYmIHBhZ2VkUm93cy5sZW5ndGggPiAwID8gJzFweCBzb2xpZCByZ2IoMjI2LCAyMjYsIDIyNyknIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbXB1dGVkQ29sdW1uc1wiXG4gICAgICAgICAgICAgIFtkYXRhXT1cInBhZ2VkUm93c1wiXG4gICAgICAgICAgICAgIFtyb3dTZWxlY3RhYmxlXT1cInJvd1NlbGVjdGFibGVcIlxuICAgICAgICAgICAgICBbZW5hYmxlTG9jYWxTb3J0XT1cImVuYWJsZUxvY2FsU29ydCAmJiAhaXNSZW9yZGVyaW5nXCJcbiAgICAgICAgICAgICAgW2lzVGFibGVMb2FkaW5nXT1cImlzVGFibGVMb2FkaW5nXCJcbiAgICAgICAgICAgICAgW2lzVGFibGVEYXRhTG9hZGluZ109XCJpc1RhYmxlRGF0YUxvYWRpbmdcIlxuICAgICAgICAgICAgICBbY2VsbEpzb25QYXRoR2V0dGVyXT1cImNlbGxKc29uUGF0aEdldHRlclwiXG4gICAgICAgICAgICAgIFtvbkpzb25QYXRoQ29waWVkSGFuZGxlcl09XCJvbkpzb25QYXRoQ29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtlbmFibGVSb3dSZW9yZGVyXT1cImlzUmVvcmRlcmluZ1wiXG4gICAgICAgICAgICAgIChyb3dSZW9yZGVyKT1cIm9uUm93UmVvcmRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNvcnRDaGFuZ2UpPVwic29ydENoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlVHBsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXB5LThcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbGx1c3RyYXRpb25zL2VtcHR5LXN0YXRlLnN2Z1wiIGFsdD1cIk5vIGRhdGFcIiBjbGFzcz1cImNxYS13LTMyIGNxYS1oLTMyIGNxYS1tYi00XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LWxnIGNxYS1mb250LXNlbWlib2xkIGNxYS1tYi0yXCI+Tm8gdGVzdCBjYXNlczwvaDM+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS1tYi00XCI+VHJ5IGFkanVzdGluZyBmaWx0ZXJzIG9yIGNyZWF0ZSBhIG5ldyB0ZXN0IGNhc2UuPC9wPlxuICAgICAgICAgICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIChjbGlja2VkKT1cInRvZ2dsZUZpbHRlcigpXCI+U2hvdyBGaWx0ZXJzPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9hcHAtZHluYW1pYy10YWJsZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RvcnlFbXB0eVRwbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC02IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8Y3FhLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJlZmZlY3RpdmVJc0VtcHR5U3RhdGVcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJlZmZlY3RpdmVFbXB0eVN0YXRlQ29uZmlnLnRpdGxlXCJcbiAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZWZmZWN0aXZlRW1wdHlTdGF0ZUNvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcuaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAgIFthY3Rpb25zXT1cImVmZmVjdGl2ZUVtcHR5U3RhdGVDb25maWcuYWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cIm9uRW1wdHlBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9jcWEtZW1wdHktc3RhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8Y3FhLXBhZ2luYXRpb25cbiAgICAgICAgICBbdG90YWxFbGVtZW50c109XCJzZXJ2ZXJTaWRlUGFnaW5hdGlvbiA/IHRvdGFsRWxlbWVudHMgOiBmaWx0ZXJlZFJvd3MubGVuZ3RoXCJcbiAgICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXG4gICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgW3BhZ2VTaXplTWVudURpcmVjdGlvbl09XCJwYWdlU2l6ZU1lbnVEaXJlY3Rpb25cIlxuICAgICAgICAgIFtwYWdlSXRlbUNvdW50XT1cInBhZ2VkUm93cy5sZW5ndGhcIlxuICAgICAgICAgIChwYWdpbmF0ZSk9XCJvblBhZ2luYXRlKCRldmVudClcIlxuICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3FhLXBhZ2luYXRpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmV1c2VkIGJ1bGsgYWN0aW9uIHRvb2xiYXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImFueVJvd1NlbGVjdGVkICYmIG1vZHVsYXJDb25maWcuYWxsb3dCdWxrU2VsZWN0aW9uICYmICFpc1Jlb3JkZXJpbmdcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLVsxOC43NXB4XSBjcWEtbGVmdC1bNTAlXSBjcWEtdHJhbnNsYXRlLXgtWy01MCVdIGNxYS13LWZ1bGwgbGc6Y3FhLW1heC13LVs2OCVdIGNxYS1zbTptYXgtdy1bNzUlXSBjcWEtbWF4LXctWzkwJV0gY3FhLXotWzFdXCI+XG4gICAgICA8Y3FhLXRhYmxlLWFjdGlvbi10b29sYmFyXG4gICAgICAgIFtzZWxlY3RlZEl0ZW1zXT1cInNlbGVjdGVkSXRlbXMgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJdGVtcyA6IGN1cnJlbnRTZWxlY3RlZEl0ZW1zXCJcbiAgICAgICAgW2FjdGlvbnNdPVwiZWZmZWN0aXZlQnVsa0FjdGlvbnNcIlxuICAgICAgICBbc2hvd1NlbGVjdEFsbF09XCJzaG93U2VsZWN0QWxsSW5Ub29sYmFyXCJcbiAgICAgICAgW2FsbFNlbGVjdGVkXT1cImFsbFNlbGVjdGVkSW5Ub29sYmFyXCJcbiAgICAgICAgW3Nob3dEaXNtaXNzXT1cInNob3dEaXNtaXNzSW5Ub29sYmFyXCJcbiAgICAgICAgKGFjdGlvbkNsaWNrKT1cIm9uQnVsa0FjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJvbkJ1bGtTZWxlY3RBbGwoJGV2ZW50KVwiXG4gICAgICAgIChkaXNtaXNzKT1cIm9uQnVsa0Rpc21pc3MoKVwiXG4gICAgICA+PC9jcWEtdGFibGUtYWN0aW9uLXRvb2xiYXI+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19