@cqa-lib/cqa-ui 1.1.540 → 1.1.541-gamma.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/README.md +8 -1
- package/esm2020/lib/compare-runs/compare-runs.component.mjs +1 -1
- package/esm2020/lib/execution-screen/condition-debug-step/condition-branch-editor.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-query-execution-item/db-query-execution-item.component.mjs +1 -1
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +1 -1
- package/esm2020/lib/iterations-loop/iterations-loop.component.mjs +1 -1
- package/esm2020/lib/mixed-variable-input/mixed-variable-input.component.mjs +30 -10
- package/esm2020/lib/new-global-variable-dialog/global-variable-tags-input.component.mjs +129 -0
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.component.mjs +16 -5
- package/esm2020/lib/new-global-variable-dialog/new-global-variable-dialog.models.mjs +1 -1
- package/esm2020/lib/segment-control/segment-control.component.mjs +12 -4
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +17 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +17 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +12 -3
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +315 -27
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +3 -3
- package/esm2020/lib/templates/table-template.component.mjs +5 -3
- package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.component.mjs +116 -0
- package/esm2020/lib/test-case-details/data-library-panel/data-library-panel.models.mjs +2 -0
- package/esm2020/lib/test-case-details/data-library-panel/element-card.component.mjs +36 -0
- package/esm2020/lib/test-case-details/data-library-panel/test-data-profile-card.component.mjs +38 -0
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +43 -4
- package/esm2020/lib/test-case-details/test-case-details.models.mjs +3 -1
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +1 -1
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +119 -6
- package/esm2020/lib/ui-kit.module.mjs +23 -3
- package/esm2020/public-api.mjs +6 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +977 -132
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +896 -62
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/new-global-variable-dialog/global-variable-tags-input.component.d.ts +39 -0
- package/lib/new-global-variable-dialog/new-global-variable-dialog.component.d.ts +5 -2
- package/lib/new-global-variable-dialog/new-global-variable-dialog.models.d.ts +8 -0
- package/lib/segment-control/segment-control.component.d.ts +3 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +15 -1
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +15 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +11 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +71 -4
- package/lib/templates/table-template.component.d.ts +8 -1
- package/lib/test-case-details/data-library-panel/data-library-panel.component.d.ts +42 -0
- package/lib/test-case-details/data-library-panel/data-library-panel.models.d.ts +17 -0
- package/lib/test-case-details/data-library-panel/element-card.component.d.ts +13 -0
- package/lib/test-case-details/data-library-panel/test-data-profile-card.component.d.ts +13 -0
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +7 -0
- package/lib/test-case-details/test-case-details.models.d.ts +2 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +17 -1
- package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +34 -6
- package/lib/ui-kit.module.d.ts +100 -96
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/styles.css +1 -1
package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs
CHANGED
|
@@ -628,10 +628,10 @@ FolderSidebarComponent.RENAME_LIMIT_FLASH_MS = 600;
|
|
|
628
628
|
* position is within this many px of the end. */
|
|
629
629
|
FolderSidebarComponent.SCROLL_LOAD_THRESHOLD_PX = 64;
|
|
630
630
|
FolderSidebarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FolderSidebarComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
631
|
-
FolderSidebarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: { folders: "folders", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", allowCreate: "allowCreate", allowRename: "allowRename", allowDelete: "allowDelete", allowMove: "allowMove", allowDuplicate: "allowDuplicate", allowDrop: "allowDrop", showCounts: "showCounts", collapsed: "collapsed", labels: "labels", serverSideSearch: "serverSideSearch", rootTotal: "rootTotal", folderSearchLoading: "folderSearchLoading", rootFoldersLoading: "rootFoldersLoading" }, outputs: { folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderChildrenRequested: "folderChildrenRequested", folderLoadMoreRequested: "folderLoadMoreRequested", searchChange: "searchChange", rootLoadMoreRequested: "rootLoadMoreRequested", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", folderMoveRequested: "folderMoveRequested", folderDuplicateRequested: "folderDuplicateRequested", testsDropped: "testsDropped", folderDropped: "folderDropped", collapsedChange: "collapsedChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscape()", "document:dragend": "onDocumentDragEnd()" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-1\"\n [style.border-bottom]=\"collapsed ? null : '1px solid #E2E2E3'\"\n [style.margin-bottom.px]=\"collapsed ? 0 : 8\"\n >\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2 cqa-relative\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"onSearchInput($event)\"\n (cleared)=\"onSearchClear()\"\n ></cqa-search-bar>\n <!-- Inline loading affordance during server-side folder search. Sits\n inside the relative container above so it overlays the trailing\n edge of the search input without shifting layout. -->\n <span\n *ngIf=\"folderSearchLoading\"\n class=\"cqa-absolute cqa-right-7 cqa-top-1/2 -cqa-translate-y-1/2 cqa-flex cqa-items-center\"\n aria-live=\"polite\"\n aria-label=\"Searching folders\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </span>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised sits directly below; tree caps at 60vh and scrolls when overflowing).\n Scroll-based lazy-loading at the root level: nearing the bottom emits\n `rootLoadMoreRequested`, which the host responds to by fetching the\n next page of roots. -->\n <div role=\"tree\" class=\"cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\"\n (scroll)=\"onTreeScroll($event)\">\n <!-- Initial-load spinner: only renders when we have no folders yet AND\n no search active (search has its own inline spinner). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length === 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-6\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n <div\n *ngIf=\"searchValue?.trim() && rows.length === 0 && !folderSearchLoading\"\n class=\"cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-neutral-500 cqa-text-center\"\n >\n {{ labels.noFoldersFound }}\n </div>\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <!-- Synthetic loading row (lazy fetch in flight) -->\n <div\n *ngIf=\"row.kind === 'loading'\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-1.5 cqa-text-sm cqa-text-neutral-500\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n <span>Loading\u2026</span>\n </div>\n <!-- Synthetic load-more row (more children available on backend) -->\n <button\n *ngIf=\"row.kind === 'load-more'\"\n type=\"button\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-w-full cqa-py-1.5 cqa-text-sm cqa-text-indigo-600 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onLoadMore(row.node); $event.stopPropagation()\"\n >\n <span>Load more ({{ (row.node.totalChildren ?? 0) - (row.node.children?.length ?? 0) }})</span>\n </button>\n <!-- Real folder row -->\n <div\n *ngIf=\"row.kind === 'folder'\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"(isRenameDraftValid && !renameLimitFlash)\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid || renameLimitFlash\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-truncate\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-tabular-nums cqa-ml-1\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200\"\n [style.color]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id ? '#3F43EE' : '#4C4C51'\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n <!-- Root-level pagination is now driven by scroll (see `(scroll)` on the\n tree container above). Per-folder children retain the explicit\n \"Load more\" button rendered inside the rows loop above, since\n subtrees aren't independently scrollable. -->\n <!-- Pagination spinner \u2014 visible only when fetching an additional page\n of roots (folders.length > 0 distinguishes from initial-load case). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length > 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-2\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-tabular-nums\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). A 0\u00D70 fixed-position\n anchor at the click coords drives a cdkConnectedOverlay; CDK's\n flexible-connected positioning auto-flips up/left when the menu\n would overflow the viewport (last-folder-near-bottom case). -->\n <div #ctxAnchor cdkOverlayOrigin\n class=\"cqa-fixed cqa-w-0 cqa-h-0 cqa-pointer-events-none\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"></div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"ctxAnchor\"\n [cdkConnectedOverlayOpen]=\"contextMenuFolderId !== null\"\n [cdkConnectedOverlayPositions]=\"contextMenuPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\n [cdkConnectedOverlayPush]=\"true\"\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\n (detach)=\"closeContextMenu()\"\n >\n <!-- The lib's tailwind config sets important: '.cqa-ui-root', which\n emits descendant selectors like `.cqa-ui-root .cqa-bg-white`.\n CDK Overlay teleports this template into the global overlay\n container (outside the host's cqa-ui-root), so we wrap the menu in\n an ancestor cqa-ui-root div to re-establish the utility scope. -->\n <div class=\"cqa-ui-root\">\n <div\n role=\"menu\"\n class=\"cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n</aside>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }, { type: i6.FolderDragDirective, selector: "[cqaFolderDrag]", inputs: ["cqaFolderDrag", "dragEnabled"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i8.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
631
|
+
FolderSidebarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: { folders: "folders", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", allowCreate: "allowCreate", allowRename: "allowRename", allowDelete: "allowDelete", allowMove: "allowMove", allowDuplicate: "allowDuplicate", allowDrop: "allowDrop", showCounts: "showCounts", collapsed: "collapsed", labels: "labels", serverSideSearch: "serverSideSearch", rootTotal: "rootTotal", folderSearchLoading: "folderSearchLoading", rootFoldersLoading: "rootFoldersLoading" }, outputs: { folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderChildrenRequested: "folderChildrenRequested", folderLoadMoreRequested: "folderLoadMoreRequested", searchChange: "searchChange", rootLoadMoreRequested: "rootLoadMoreRequested", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", folderMoveRequested: "folderMoveRequested", folderDuplicateRequested: "folderDuplicateRequested", testsDropped: "testsDropped", folderDropped: "folderDropped", collapsedChange: "collapsedChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscape()", "document:dragend": "onDocumentDragEnd()" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-1\"\n [style.border-bottom]=\"collapsed ? null : '1px solid #E2E2E3'\"\n [style.margin-bottom.px]=\"collapsed ? 0 : 8\"\n >\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2\">\n <div class=\"cqa-relative\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"onSearchInput($event)\"\n (cleared)=\"onSearchClear()\"\n ></cqa-search-bar>\n <span\n *ngIf=\"folderSearchLoading\"\n class=\"cqa-absolute cqa-right-8 cqa-inset-y-0 cqa-flex cqa-items-center\"\n aria-live=\"polite\"\n aria-label=\"Searching folders\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </span>\n </div>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised sits directly below; tree caps at 60vh and scrolls when overflowing).\n Scroll-based lazy-loading at the root level: nearing the bottom emits\n `rootLoadMoreRequested`, which the host responds to by fetching the\n next page of roots. -->\n <div role=\"tree\" class=\"cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\"\n (scroll)=\"onTreeScroll($event)\">\n <!-- Initial-load spinner: only renders when we have no folders yet AND\n no search active (search has its own inline spinner). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length === 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-6\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n <div\n *ngIf=\"searchValue?.trim() && rows.length === 0 && !folderSearchLoading\"\n class=\"cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-neutral-500 cqa-text-center\"\n >\n {{ labels.noFoldersFound }}\n </div>\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <!-- Synthetic loading row (lazy fetch in flight) -->\n <div\n *ngIf=\"row.kind === 'loading'\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-1.5 cqa-text-sm cqa-text-neutral-500\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n <span>Loading\u2026</span>\n </div>\n <!-- Synthetic load-more row (more children available on backend) -->\n <button\n *ngIf=\"row.kind === 'load-more'\"\n type=\"button\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-w-full cqa-py-1.5 cqa-text-sm cqa-text-indigo-600 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onLoadMore(row.node); $event.stopPropagation()\"\n >\n <span>Load more ({{ (row.node.totalChildren ?? 0) - (row.node.children?.length ?? 0) }})</span>\n </button>\n <!-- Real folder row -->\n <div\n *ngIf=\"row.kind === 'folder'\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"(isRenameDraftValid && !renameLimitFlash)\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid || renameLimitFlash\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-truncate\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-tabular-nums cqa-ml-1\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200\"\n [style.color]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id ? '#3F43EE' : '#4C4C51'\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n <!-- Root-level pagination is now driven by scroll (see `(scroll)` on the\n tree container above). Per-folder children retain the explicit\n \"Load more\" button rendered inside the rows loop above, since\n subtrees aren't independently scrollable. -->\n <!-- Pagination spinner \u2014 visible only when fetching an additional page\n of roots (folders.length > 0 distinguishes from initial-load case). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length > 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-2\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-tabular-nums\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). A 0\u00D70 fixed-position\n anchor at the click coords drives a cdkConnectedOverlay; CDK's\n flexible-connected positioning auto-flips up/left when the menu\n would overflow the viewport (last-folder-near-bottom case). -->\n <div #ctxAnchor cdkOverlayOrigin\n class=\"cqa-fixed cqa-w-0 cqa-h-0 cqa-pointer-events-none\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"></div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"ctxAnchor\"\n [cdkConnectedOverlayOpen]=\"contextMenuFolderId !== null\"\n [cdkConnectedOverlayPositions]=\"contextMenuPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\n [cdkConnectedOverlayPush]=\"true\"\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\n (detach)=\"closeContextMenu()\"\n >\n <!-- The lib's tailwind config sets important: '.cqa-ui-root', which\n emits descendant selectors like `.cqa-ui-root .cqa-bg-white`.\n CDK Overlay teleports this template into the global overlay\n container (outside the host's cqa-ui-root), so we wrap the menu in\n an ancestor cqa-ui-root div to re-establish the utility scope. -->\n <div class=\"cqa-ui-root\">\n <div\n role=\"menu\"\n class=\"cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n</aside>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }, { type: i6.FolderDragDirective, selector: "[cqaFolderDrag]", inputs: ["cqaFolderDrag", "dragEnabled"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i8.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
632
632
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FolderSidebarComponent, decorators: [{
|
|
633
633
|
type: Component,
|
|
634
|
-
args: [{ selector: 'cqa-folder-sidebar', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-1\"\n [style.border-bottom]=\"collapsed ? null : '1px solid #E2E2E3'\"\n [style.margin-bottom.px]=\"collapsed ? 0 : 8\"\n >\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2 cqa-relative\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"onSearchInput($event)\"\n (cleared)=\"onSearchClear()\"\n ></cqa-search-bar>\n <!-- Inline loading affordance during server-side folder search. Sits\n inside the relative container above so it overlays the trailing\n edge of the search input without shifting layout. -->\n <span\n *ngIf=\"folderSearchLoading\"\n class=\"cqa-absolute cqa-right-7 cqa-top-1/2 -cqa-translate-y-1/2 cqa-flex cqa-items-center\"\n aria-live=\"polite\"\n aria-label=\"Searching folders\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </span>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised sits directly below; tree caps at 60vh and scrolls when overflowing).\n Scroll-based lazy-loading at the root level: nearing the bottom emits\n `rootLoadMoreRequested`, which the host responds to by fetching the\n next page of roots. -->\n <div role=\"tree\" class=\"cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\"\n (scroll)=\"onTreeScroll($event)\">\n <!-- Initial-load spinner: only renders when we have no folders yet AND\n no search active (search has its own inline spinner). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length === 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-6\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n <div\n *ngIf=\"searchValue?.trim() && rows.length === 0 && !folderSearchLoading\"\n class=\"cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-neutral-500 cqa-text-center\"\n >\n {{ labels.noFoldersFound }}\n </div>\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <!-- Synthetic loading row (lazy fetch in flight) -->\n <div\n *ngIf=\"row.kind === 'loading'\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-1.5 cqa-text-sm cqa-text-neutral-500\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n <span>Loading\u2026</span>\n </div>\n <!-- Synthetic load-more row (more children available on backend) -->\n <button\n *ngIf=\"row.kind === 'load-more'\"\n type=\"button\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-w-full cqa-py-1.5 cqa-text-sm cqa-text-indigo-600 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onLoadMore(row.node); $event.stopPropagation()\"\n >\n <span>Load more ({{ (row.node.totalChildren ?? 0) - (row.node.children?.length ?? 0) }})</span>\n </button>\n <!-- Real folder row -->\n <div\n *ngIf=\"row.kind === 'folder'\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"(isRenameDraftValid && !renameLimitFlash)\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid || renameLimitFlash\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-truncate\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-tabular-nums cqa-ml-1\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200\"\n [style.color]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id ? '#3F43EE' : '#4C4C51'\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n <!-- Root-level pagination is now driven by scroll (see `(scroll)` on the\n tree container above). Per-folder children retain the explicit\n \"Load more\" button rendered inside the rows loop above, since\n subtrees aren't independently scrollable. -->\n <!-- Pagination spinner \u2014 visible only when fetching an additional page\n of roots (folders.length > 0 distinguishes from initial-load case). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length > 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-2\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-tabular-nums\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). A 0\u00D70 fixed-position\n anchor at the click coords drives a cdkConnectedOverlay; CDK's\n flexible-connected positioning auto-flips up/left when the menu\n would overflow the viewport (last-folder-near-bottom case). -->\n <div #ctxAnchor cdkOverlayOrigin\n class=\"cqa-fixed cqa-w-0 cqa-h-0 cqa-pointer-events-none\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"></div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"ctxAnchor\"\n [cdkConnectedOverlayOpen]=\"contextMenuFolderId !== null\"\n [cdkConnectedOverlayPositions]=\"contextMenuPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\n [cdkConnectedOverlayPush]=\"true\"\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\n (detach)=\"closeContextMenu()\"\n >\n <!-- The lib's tailwind config sets important: '.cqa-ui-root', which\n emits descendant selectors like `.cqa-ui-root .cqa-bg-white`.\n CDK Overlay teleports this template into the global overlay\n container (outside the host's cqa-ui-root), so we wrap the menu in\n an ancestor cqa-ui-root div to re-establish the utility scope. -->\n <div class=\"cqa-ui-root\">\n <div\n role=\"menu\"\n class=\"cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n</aside>\n", styles: [] }]
|
|
634
|
+
args: [{ selector: 'cqa-folder-sidebar', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-1\"\n [style.border-bottom]=\"collapsed ? null : '1px solid #E2E2E3'\"\n [style.margin-bottom.px]=\"collapsed ? 0 : 8\"\n >\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2\">\n <div class=\"cqa-relative\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"onSearchInput($event)\"\n (cleared)=\"onSearchClear()\"\n ></cqa-search-bar>\n <span\n *ngIf=\"folderSearchLoading\"\n class=\"cqa-absolute cqa-right-8 cqa-inset-y-0 cqa-flex cqa-items-center\"\n aria-live=\"polite\"\n aria-label=\"Searching folders\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </span>\n </div>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised sits directly below; tree caps at 60vh and scrolls when overflowing).\n Scroll-based lazy-loading at the root level: nearing the bottom emits\n `rootLoadMoreRequested`, which the host responds to by fetching the\n next page of roots. -->\n <div role=\"tree\" class=\"cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\"\n (scroll)=\"onTreeScroll($event)\">\n <!-- Initial-load spinner: only renders when we have no folders yet AND\n no search active (search has its own inline spinner). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length === 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-6\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"20\" mode=\"indeterminate\"></mat-spinner>\n </div>\n <div\n *ngIf=\"searchValue?.trim() && rows.length === 0 && !folderSearchLoading\"\n class=\"cqa-px-3 cqa-py-2 cqa-text-sm cqa-text-neutral-500 cqa-text-center\"\n >\n {{ labels.noFoldersFound }}\n </div>\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <!-- Synthetic loading row (lazy fetch in flight) -->\n <div\n *ngIf=\"row.kind === 'loading'\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-1.5 cqa-text-sm cqa-text-neutral-500\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n <span>Loading\u2026</span>\n </div>\n <!-- Synthetic load-more row (more children available on backend) -->\n <button\n *ngIf=\"row.kind === 'load-more'\"\n type=\"button\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n class=\"cqa-flex cqa-items-center cqa-w-full cqa-py-1.5 cqa-text-sm cqa-text-indigo-600 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onLoadMore(row.node); $event.stopPropagation()\"\n >\n <span>Load more ({{ (row.node.totalChildren ?? 0) - (row.node.children?.length ?? 0) }})</span>\n </button>\n <!-- Real folder row -->\n <div\n *ngIf=\"row.kind === 'folder'\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"(isRenameDraftValid && !renameLimitFlash)\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid || renameLimitFlash\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-truncate\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-tabular-nums cqa-ml-1\"\n [style.color]=\"isSelected(row.node.id) ? '#3F43EE' : '#4C4C51'\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200\"\n [style.color]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id ? '#3F43EE' : '#4C4C51'\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n <!-- Root-level pagination is now driven by scroll (see `(scroll)` on the\n tree container above). Per-folder children retain the explicit\n \"Load more\" button rendered inside the rows loop above, since\n subtrees aren't independently scrollable. -->\n <!-- Pagination spinner \u2014 visible only when fetching an additional page\n of roots (folders.length > 0 distinguishes from initial-load case). -->\n <div\n *ngIf=\"rootFoldersLoading && folders.length > 0 && !searchValue?.trim()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-py-2\"\n aria-live=\"polite\"\n >\n <mat-spinner diameter=\"14\" mode=\"indeterminate\"></mat-spinner>\n </div>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-indigo-50 focus:cqa-outline-none focus:cqa-bg-indigo-50 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-tabular-nums\" [style.color]=\"isSelected(null) ? '#3F43EE' : '#4C4C51'\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). A 0\u00D70 fixed-position\n anchor at the click coords drives a cdkConnectedOverlay; CDK's\n flexible-connected positioning auto-flips up/left when the menu\n would overflow the viewport (last-folder-near-bottom case). -->\n <div #ctxAnchor cdkOverlayOrigin\n class=\"cqa-fixed cqa-w-0 cqa-h-0 cqa-pointer-events-none\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"></div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"ctxAnchor\"\n [cdkConnectedOverlayOpen]=\"contextMenuFolderId !== null\"\n [cdkConnectedOverlayPositions]=\"contextMenuPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\n [cdkConnectedOverlayPush]=\"true\"\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\n (detach)=\"closeContextMenu()\"\n >\n <!-- The lib's tailwind config sets important: '.cqa-ui-root', which\n emits descendant selectors like `.cqa-ui-root .cqa-bg-white`.\n CDK Overlay teleports this template into the global overlay\n container (outside the host's cqa-ui-root), so we wrap the menu in\n an ancestor cqa-ui-root div to re-establish the utility scope. -->\n <div class=\"cqa-ui-root\">\n <div\n role=\"menu\"\n class=\"cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-indigo-50 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n</aside>\n", styles: [] }]
|
|
635
635
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { folders: [{
|
|
636
636
|
type: Input
|
|
637
637
|
}], selectedFolderId: [{
|
|
@@ -706,4 +706,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
706
706
|
type: HostListener,
|
|
707
707
|
args: ['document:dragend']
|
|
708
708
|
}] } });
|
|
709
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9sZGVyLXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9mb2xkZXItc2lkZWJhci9mb2xkZXItc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL2ZvbGRlci1zaWRlYmFyL2ZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsc0JBQXNCLEdBSXZCLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7QUFvQjFDLE1BQU0sT0FBTyxzQkFBc0I7SUF3R2pDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdkdqQyxZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUMzQixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLHNCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixtQkFBYyxHQUFZLElBQUksQ0FBQztRQUMvQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixXQUFNLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxD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QWdCO3NCQUF4QixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFJRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBR0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUdHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQXVYUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU05QixRQUFRO3NCQURQLFlBQVk7dUJBQUMseUJBQXlCO2dCQXdHdkMsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIE1vZHVsYXJMYWJlbHMsXG59IGZyb20gJy4uL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcblxuLyoqIEEgcm93IGluIHRoZSBmbGF0dGVuZWQgc2lkZWJhciB0cmVlLiBga2luZGAgZGlzdGluZ3Vpc2hlcyByZWFsIGZvbGRlciByb3dzXG4gKiAgZnJvbSB0aGUgbGF6eS1sb2FkIGFmZm9yZGFuY2VzICgnbG9hZGluZycgc3Bpbm5lciwgJ2xvYWQtbW9yZScgYnV0dG9uKSB0aGF0XG4gKiAgdGhlIGByb3dzYCBnZXR0ZXIgaW50ZXJsZWF2ZXMgaW5zaWRlIGFuIGV4cGFuZGVkIHN1YnRyZWUuICovXG5pbnRlcmZhY2UgUmVuZGVyTm9kZSB7XG4gIGtpbmQ6ICdmb2xkZXInIHwgJ2xvYWRpbmcnIHwgJ2xvYWQtbW9yZSc7XG4gIG5vZGU6IEZvbGRlck5vZGU7XG4gIGRlcHRoOiBudW1iZXI7XG4gIHZpc2libGU6IGJvb2xlYW47XG4gIGhhc0NoaWxkcmVuOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZm9sZGVyLXNpZGViYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9sZGVyLXNpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGb2xkZXJTaWRlYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleHBhbmRlZEZvbGRlcklkczogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgdW5vcmdhbmlzZWRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgYWxsb3dDcmVhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd1JlbmFtZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93RGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dNb3ZlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dEdXBsaWNhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0Ryb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q291bnRzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxhYmVsczogTW9kdWxhckxhYmVscyA9IHsgLi4uREVGQVVMVF9NT0RVTEFSX0xBQkVMUyB9O1xuICAvKiogV2hlbiB0cnVlLCB0aGUgc2lkZWJhciBlbWl0cyBgc2VhcmNoQ2hhbmdlYCBhbmQgc2tpcHMgaXRzIGxvY2FsIG5hbWUgZmlsdGVyXG4gICAqICDigJQgdGhlIGhvc3QgaXMgZXhwZWN0ZWQgdG8gc3dhcCBgZm9sZGVyc2Agd2l0aCBzZXJ2ZXItc2lkZSBzZWFyY2ggcmVzdWx0cy5cbiAgICogIERlZmF1bHQga2VlcHMgdGhlIGxlZ2FjeSBjbGllbnQtc2lkZSBiZWhhdmlvdXIgZm9yIGNhbGxlcnMgdGhhdCBoYXZlbid0XG4gICAqICBvcHRlZCBpbnRvIGxhenkgbG9hZGluZyB5ZXQuICovXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEJhY2tlbmQtcmVwb3J0ZWQgdG90YWwgcm9vdCBmb2xkZXJzLiBXaGVuIGBmb2xkZXJzLmxlbmd0aCA8IHJvb3RUb3RhbGAgdGhlXG4gICAqICBzaWRlYmFyIHJlbmRlcnMgYSB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIiBhZmZvcmRhbmNlIGFmdGVyIHRoZSB0cmVlLiAqL1xuICBASW5wdXQoKSByb290VG90YWw6IG51bWJlciA9IDA7XG4gIC8qKiBUcnVlIHdoaWxlIGEgc2VydmVyLXNpZGUgZm9sZGVyLXNlYXJjaCByZXF1ZXN0IGlzIGluIGZsaWdodC4gVGhlIHNpZGViYXJcbiAgICogIHNob3dzIGEgc3Bpbm5lciBuZXh0IHRvIHRoZSBzZWFyY2ggaW5wdXQgc28gdGhlIHVzZXIgY2FuIHRlbGwgdHlwaW5nXG4gICAqICBoYXMgYmVlbiByZWdpc3RlcmVkLiAqL1xuICBASW5wdXQoKSBmb2xkZXJTZWFyY2hMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIGEgcm9vdC1wYWdlIGZldGNoIGlzIGluIGZsaWdodCAoaW5pdGlhbCBsb2FkIE9SIHNjcm9sbC1kcml2ZW5cbiAgICogIHBhZ2luYXRpb24pLiBXaGVuIHNldCB3aXRoIG5vIGZvbGRlcnMgeWV0LCB0aGUgc2lkZWJhciBzaG93cyBhIGNlbnRlcmVkXG4gICAqICBzcGlubmVyOyB3aGVuIHNldCBkdXJpbmcgcGFnaW5hdGlvbiwgYSBzbWFsbCBzcGlubmVyIGFwcGVhcnMgYXQgdGhlXG4gICAqICBib3R0b20gb2YgdGhlIHRyZWUuICovXG4gIEBJbnB1dCgpIHJvb3RGb2xkZXJzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBmb2xkZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckV4cGFuc2lvblRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgZXhwYW5kZWQ6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIExhenktbG9hZDogZmlyZXMgd2hlbiB0aGUgdXNlciBleHBhbmRzIGEgbm9kZSB3aG9zZSBjaGlsZHJlbiBoYXZlbid0IGJlZW5cbiAgICogIGZldGNoZWQgeWV0IChgaGFzQ2hpbGRyZW4gPT09IHRydWUgJiYgbG9hZGVkUGFnZXMgPT09IHVuZGVmaW5lZGApLiBIb3N0XG4gICAqICByZXNwb25kcyBieSBjYWxsaW5nIGl0cyBgbG9hZEZvbGRlckNoaWxkcmVuKGlkLCAwKWAuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDaGlsZHJlblJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogTGF6eS1sb2FkOiBmaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgcGVyLWZvbGRlciBcIkxvYWQgbW9yZVwiIHJvdy5cbiAgICogIEhvc3QgcmVzcG9uZHMgYnkgY2FsbGluZyBgbG9hZEZvbGRlckNoaWxkcmVuKGlkLCBuZXh0UGFnZSlgLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgbmV4dFBhZ2U6IG51bWJlciB9PigpO1xuICAvKiogRGVib3VuY2VkIHNlYXJjaC1pbnB1dCB2YWx1ZS4gQWx3YXlzIGVtaXR0ZWQ7IG9ubHkgY29uc3VtZWQgYnkgaG9zdHMgdGhhdFxuICAgKiAgc2V0IGBzZXJ2ZXJTaWRlU2VhcmNoPXRydWVgIHRvIHJlLWZldGNoIHRoZSB0cmVlIGZyb20gdGhlIGJhY2tlbmQuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIExhenktbG9hZDogdXNlciBjbGlja2VkIHRoZSB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIiBhZmZvcmRhbmNlIGZvciByb290cy4gKi9cbiAgQE91dHB1dCgpIHJvb3RMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGhvc3QgY29tcGxldGVzIGZvbGRlciBjcmVhdGlvbiAoZS5nLiwgaW5saW5lIHJlbmFtZSBmbG93KS4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhcmVudElkOiBudW1iZXIgfCBudWxsOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiK1wiIGhlYWRlciBidXR0b24uIEhvc3Qgc2hvdWxkIG9wZW4gYSBjcmVhdGlvbiBtb2RhbC4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckNyZWF0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICAvKiogQ2FycmllcyB0aGUgZnVsbCByZW5hbWVkIGZvbGRlciBub2RlICsgcGFyZW50IGlkIHNvIGhvc3RzIGNhbiBpc3N1ZSBjb21wbGV0ZSB1cGRhdGUgcmVxdWVzdHMuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJSZW5hbWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJSZW5hbWVkUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckRlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlciB9PigpO1xuICAvKiogVXNlciBwaWNrZWQgXCJNb3ZlIGZvbGRlclwiIGZyb20gdGhlIGNvbnRleHQgbWVudS4gSG9zdCBvcGVucyB0aGUgZm9sZGVyIHBpY2tlci4gKi9cbiAgQE91dHB1dCgpIGZvbGRlck1vdmVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlciB9PigpO1xuICAvKiogVXNlciBwaWNrZWQgXCJEdXBsaWNhdGUgZm9sZGVyXCIgZnJvbSB0aGUgY29udGV4dCBtZW51LiBIb3N0IGNsb25lcyB0aGUgc3VidHJlZSAodGVzdHMgcmVmZXJlbmNlZCwgbm90IGNvcGllZCkuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgdGVzdHNEcm9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj47IHRhcmdldEZvbGRlcklkOiBudW1iZXIgfCBudWxsIH0+KCk7XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9sZGVyIHJvdyBpcyBkcm9wcGVkIG9udG8gYW5vdGhlciBmb2xkZXIgKG9yIHRoZSBVbm9yZ2FuaXNlZCByb3cpLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRHJvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyOyBuZXdQYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICBAT3V0cHV0KCkgY29sbGFwc2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgLyoqIERlYm91bmNlIHRpbWVyIGZvciBgc2VhcmNoQ2hhbmdlYCBlbWlzc2lvbnM7IGNsZWFyZWQgb24gZWFjaCBrZXlzdHJva2Ugc29cbiAgICogIHRoZSBob3N0IG9ubHkgcmUtZmV0Y2hlcyBvbmNlIHRoZSB1c2VyIHBhdXNlcyB0eXBpbmcuICovXG4gIHByaXZhdGUgc2VhcmNoRW1pdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfTVMgPSAzMDA7XG4gIHJlbmFtaW5nSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICByZW5hbWVEcmFmdDogc3RyaW5nID0gJyc7XG4gIC8qKiBJbmxpbmUgcmVuYW1lIHVzZXMgdGhlIHNhbWUgbmFtZSBydWxlcyBhcyB0aGUgTmV3IEZvbGRlciBkaWFsb2cuICovXG4gIHJlYWRvbmx5IHJlbmFtZU1heExlbmd0aDogbnVtYmVyID0gMjA7XG4gIC8qKiBUcmFuc2llbnQgZmxhZzogdHVybnMgdGhlIHJlbmFtZSBpbnB1dCByZWQgYnJpZWZseSB3aGVuIHRoZSB1c2VyIGtleXN0cm9rZXNcbiAgICogIHdoaWxlIGFscmVhZHkgYXQgYHJlbmFtZU1heExlbmd0aGAsIHNvIHRoZSBzaWxlbnQgbWF4bGVuZ3RoIGNsYW1wIGdldHMgYVxuICAgKiAgdmlzaWJsZSBcInlvdSd2ZSBoaXQgdGhlIGNhcFwiIHNpZ25hbC4gQ2xlYXJlZCBieSBgcmVuYW1lTGltaXRGbGFzaFRpbWVyYC4gKi9cbiAgcmVuYW1lTGltaXRGbGFzaCA9IGZhbHNlO1xuICBwcml2YXRlIHJlbmFtZUxpbWl0Rmxhc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVOQU1FX0xJTUlUX0ZMQVNIX01TID0gNjAwO1xuXG4gIC8qKiBJZCBvZiB0aGUgZm9sZGVyIHdob3NlIGNvbnRleHQgbWVudSBpcyBvcGVuLCBvciBudWxsIHdoZW4gY2xvc2VkLiAqL1xuICBjb250ZXh0TWVudUZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFN1cHByZXNzIG91dHNpZGUtY2xpY2sgaGFuZGxpbmcgdW50aWwgdGhpcyB0aW1lc3RhbXA7IHByb3RlY3RzIGFnYWluc3QgdGhlXG4gICAqICByaWdodC1jbGljayB0aGF0IG9wZW5zIHRoZSBtZW51IGFsc28gYmVpbmcgaW50ZXJwcmV0ZWQgYXMgYW4gb3V0c2lkZSBjbGljay4gKi9cbiAgcHJpdmF0ZSBfc3VwcHJlc3NPdXRzaWRlQ2xpY2tVbnRpbCA9IDA7XG4gIC8qKiBWaWV3cG9ydC1hbmNob3JlZCBwb3NpdGlvbiAoY2xpZW50IGNvb3JkaW5hdGVzKSBmb3IgdGhlIGZsb2F0aW5nIG1lbnUuXG4gICAqICBEcml2ZXMgdGhlIGludmlzaWJsZSBjZGtPdmVybGF5T3JpZ2luIGFuY2hvcjsgQ0RLIE92ZXJsYXkgdGhlbiBwaWNrcyB0aGVcbiAgICogIGJlc3Qgb2YgYGNvbnRleHRNZW51UG9zaXRpb25zYCBzbyB0aGUgbWVudSBuZXZlciBvdmVyZmxvd3MgdGhlIHZpZXdwb3J0LiAqL1xuICBjb250ZXh0TWVudVBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICAvKiogUG9zaXRpb24gcHJpb3JpdHkgZm9yIHRoZSBDREstb3ZlcmxheS1yZW5kZXJlZCBjb250ZXh0IG1lbnUuIENESyB0cmllcyBlYWNoXG4gICAqICBpbiBvcmRlciBhbmQgdXNlcyB0aGUgZmlyc3Qgb25lIHRoYXQgZml0cyDigJQgc28gdGhlIG1lbnUgb3BlbnMgZG93bndhcmQgYnlcbiAgICogIGRlZmF1bHQgYW5kIGZsaXBzIHVwIC8gbGVmdCB3aGVuIHRvbyBjbG9zZSB0byB0aGUgYm90dG9tIG9yIHJpZ2h0IGVkZ2UuICovXG4gIHJlYWRvbmx5IGNvbnRleHRNZW51UG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfSxcbiAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCAgICBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nIH0sXG4gICAgeyBvcmlnaW5YOiAnZW5kJywgICBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdlbmQnLCAgIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgIHsgb3JpZ2luWDogJ2VuZCcsICAgb3JpZ2luWTogJ3RvcCcsICAgIG92ZXJsYXlYOiAnZW5kJywgICBvdmVybGF5WTogJ2JvdHRvbScgfSxcbiAgXTtcblxuICAvKiogUGVuZGluZyBhdXRvLWV4cGFuZCB0aW1lcnMgd2hpbGUgYSBmb2xkZXIgZHJhZyBpcyBob3ZlcmVkIG92ZXIgY29sbGFwc2VkIHJvd3MuICovXG4gIHByaXZhdGUgZHJhZ0V4cGFuZFRpbWVycyA9IG5ldyBNYXA8bnVtYmVyLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0VYUEFORF9ERUxBWV9NUyA9IDYwMDtcbiAgLyoqIElkIG9mIHRoZSBmb2xkZXIgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQ7IHVzZWQgdG8gc2tpcCBjeWNsZSB0YXJnZXRzIGFuZCBzb3VyY2UtaG92ZXIgZXhwYW5zaW9uLiAqL1xuICBwcml2YXRlIGFjdGl2ZUZvbGRlckRyYWdJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGdldCBleHBhbmRlZFNldCgpOiBTZXQ8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQodGhpcy5leHBhbmRlZEZvbGRlcklkcyB8fCBbXSk7XG4gIH1cblxuICAvKiogRmxhdHRlbmVkLCBkZXB0aC1hd2FyZSBsaXN0IG9mIHJvd3MgdG8gcmVuZGVyIGluIG9yZGVyLiBBbmNlc3RvcnMgb2YgbWF0Y2hlcyBhcmUga2VwdC4gKi9cbiAgZ2V0IHJvd3MoKTogUmVuZGVyTm9kZVtdIHtcbiAgICAvLyBTZXJ2ZXItc2lkZSBtb2RlOiBob3N0IHByZS1maWx0ZXJzIGBmb2xkZXJzYDsgd2Ugc2tpcCB0aGUgbG9jYWwgZmlsdGVyIHNvXG4gICAgLy8gcmVzdWx0cyBhcmVuJ3QgZG91YmxlLWZpbHRlcmVkIChiYWNrZW5kIG1heSB1c2UgZGlmZmVyZW50IGZ1enp5IGxvZ2ljKS5cbiAgICBjb25zdCBsb2NhbFNlYXJjaCA9IHRoaXMuc2VydmVyU2lkZVNlYXJjaFxuICAgICAgPyAnJ1xuICAgICAgOiAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkU2V0O1xuICAgIGNvbnN0IGtlZXBTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAobG9jYWxTZWFyY2gpIHtcbiAgICAgIGNvbnN0IG1hcmsgPSAobm9kZXM6IEZvbGRlck5vZGVbXSwgYW5jZXN0b3JzOiBudW1iZXJbXSk6IHZvaWQgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkID0gKG4ubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb2NhbFNlYXJjaCk7XG4gICAgICAgICAgY29uc3QgY2hpbGRBbmNlc3RvcnMgPSBbLi4uYW5jZXN0b3JzLCBuLmlkXTtcbiAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFuY2VzdG9ycykga2VlcFNldC5hZGQoYSk7XG4gICAgICAgICAgICBrZWVwU2V0LmFkZChuLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG4uY2hpbGRyZW4/Lmxlbmd0aCkgbWFyayhuLmNoaWxkcmVuLCBjaGlsZEFuY2VzdG9ycyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBtYXJrKHRoaXMuZm9sZGVycywgW10pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dDogUmVuZGVyTm9kZVtdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyLCBwYXJlbnRWaXNpYmxlOiBib29sZWFuKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmlzaWJsZSA9ICFsb2NhbFNlYXJjaCB8fCBrZWVwU2V0LmhhcyhuLmlkKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHBhcmVudFZpc2libGUgJiYgc2VhcmNoVmlzaWJsZTtcbiAgICAgICAgLy8gU2hvdyB0aGUgY2hldnJvbiB3aGVuIHRoZSBiYWNrZW5kIHNheXMgdGhpcyBmb2xkZXIgaGFzIGNoaWxkcmVuXG4gICAgICAgIC8vIChsYXp5LWxvYWQ6IGNoaWxkcmVuIG1heSBub3QgYmUgZmV0Y2hlZCB5ZXQpIE9SIHdoZW4gY2hpbGRyZW4gYXJlXG4gICAgICAgIC8vIGFscmVhZHkgcG9wdWxhdGVkIChlYWdlciBtb2RlIGZvciBjYWxsZXJzIHRoYXQgcHJlLWJ1aWxkIHRoZSB0cmVlKS5cbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIW4uaGFzQ2hpbGRyZW4gfHwgISEobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIG91dC5wdXNoKHsga2luZDogJ2ZvbGRlcicsIG5vZGU6IG4sIGRlcHRoLCB2aXNpYmxlLCBoYXNDaGlsZHJlbiB9KTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRCeVNlYXJjaCA9ICEhbG9jYWxTZWFyY2ggJiYga2VlcFNldC5oYXMobi5pZCk7XG4gICAgICAgIGNvbnN0IGlzTm9kZUV4cGFuZGVkID0gZXhwYW5kZWQuaGFzKG4uaWQpIHx8IGV4cGFuZGVkQnlTZWFyY2g7XG4gICAgICAgIGlmICghaXNOb2RlRXhwYW5kZWQgfHwgIWhhc0NoaWxkcmVuKSBjb250aW51ZTtcbiAgICAgICAgLy8gUmVjdXJzZSBmb3IgY2hpbGRyZW4gdGhhdCBhcmUgYWxyZWFkeSBpbiBtZW1vcnkuXG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICB3YWxrKG4uY2hpbGRyZW4sIGRlcHRoICsgMSwgdmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXBwZW5kIGxhenktbG9hZCBhZmZvcmRhbmNlcyBhdCB0aGUgZW5kIG9mIHRoZSBvcGVuIHN1YnRyZWU6XG4gICAgICAgIC8vIC0gJ2xvYWRpbmcnIHdoaWxlIGEgY2hpbGRyZW4tcGFnZSBmZXRjaCBpcyBpbiBmbGlnaHQuXG4gICAgICAgIC8vIC0gJ2xvYWQtbW9yZScgd2hlbiBtb3JlIGNoaWxkcmVuIGV4aXN0IG9uIHRoZSBiYWNrZW5kIHRoYW4gd2UgaGF2ZS5cbiAgICAgICAgaWYgKG4uY2hpbGRyZW5Mb2FkaW5nKSB7XG4gICAgICAgICAgb3V0LnB1c2goeyBraW5kOiAnbG9hZGluZycsIG5vZGU6IG4sIGRlcHRoOiBkZXB0aCArIDEsIHZpc2libGUsIGhhc0NoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgobi5jaGlsZHJlbj8ubGVuZ3RoID8/IDApIDwgKG4udG90YWxDaGlsZHJlbiA/PyAwKSkge1xuICAgICAgICAgIG91dC5wdXNoKHsga2luZDogJ2xvYWQtbW9yZScsIG5vZGU6IG4sIGRlcHRoOiBkZXB0aCArIDEsIHZpc2libGUsIGhhc0NoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayh0aGlzLmZvbGRlcnMsIDAsIHRydWUpO1xuICAgIHJldHVybiBvdXQuZmlsdGVyKHIgPT4gci52aXNpYmxlKTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkU2V0LmhhcyhpZCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlkID09IG51bGwgJiYgdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBpZCAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCAhPSBudWxsICYmIGlkID09PSB0aGlzLnNlbGVjdGVkRm9sZGVySWQ7XG4gIH1cblxuICBvblRvZ2dsZShuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBleHBhbmRlZCA9ICF0aGlzLmlzRXhwYW5kZWQobi5pZCk7XG4gICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogbi5pZCwgZXhwYW5kZWQgfSk7XG4gICAgLy8gTGF6eSBmZXRjaDogaWYgdGhlIHVzZXIgaXMgZXhwYW5kaW5nIGEgbm9kZSB3aG9zZSBjaGlsZHJlbiBoYXZlbid0IGJlZW5cbiAgICAvLyBsb2FkZWQgeWV0LCBhc2sgdGhlIGhvc3QgdG8gZmV0Y2ggdGhlbS4gU2tpcCB3aGVuIG5vdCBsYXp5IChsb2FkZWRQYWdlc1xuICAgIC8vIGFscmVhZHkgc2V0KSBvciBub3QgZXhwYW5kaW5nLlxuICAgIGlmIChleHBhbmRlZCAmJiBuLmhhc0NoaWxkcmVuICYmIG4ubG9hZGVkUGFnZXMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mb2xkZXJDaGlsZHJlblJlcXVlc3RlZC5lbWl0KG4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWFyY2ggaW5wdXQgaGFuZGxlcjogdXBkYXRlcyB0aGUgbG9jYWwgYHNlYXJjaFZhbHVlYCBpbW1lZGlhdGVseSAoc28gdGhlXG4gICAqICBpbnB1dCBzdGF5cyByZXNwb25zaXZlKSBhbmQgZGVib3VuY2VzIGBzZWFyY2hDaGFuZ2VgIGVtaXNzaW9ucyBzbyBhIGhvc3RcbiAgICogIGRvaW5nIHNlcnZlci1zaWRlIHNlYXJjaCBmaXJlcyBhdCBtb3N0IG9uZSByZXF1ZXN0IHBlciBwYXVzZS4gKi9cbiAgb25TZWFyY2hJbnB1dCh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGVybTtcbiAgICBpZiAodGhpcy5zZWFyY2hFbWl0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaEVtaXRUaW1lcik7XG4gICAgdGhpcy5zZWFyY2hFbWl0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICB0aGlzLnNlYXJjaEVtaXRUaW1lciA9IG51bGw7XG4gICAgfSwgRm9sZGVyU2lkZWJhckNvbXBvbmVudC5TRUFSQ0hfREVCT1VOQ0VfTVMpO1xuICB9XG5cbiAgLyoqIFNlYXJjaCBpbnB1dCBjbGVhciBoYW5kbGVyOiBmbHVzaGVzIHRoZSBkZWJvdW5jZSBzbyB0aGUgaG9zdCBzZWVzIGFuXG4gICAqICBlbXB0eSB0ZXJtIGltbWVkaWF0ZWx5IGFuZCBjYW4gcmVzdG9yZSB0aGUgbGF6eSB0cmVlLiAqL1xuICBvblNlYXJjaENsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICBpZiAodGhpcy5zZWFyY2hFbWl0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaEVtaXRUaW1lcik7XG4gICAgICB0aGlzLnNlYXJjaEVtaXRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoJycpO1xuICB9XG5cbiAgLyoqIExhenktbG9hZDogdXNlciBjbGlja2VkIHRoZSBwZXItZm9sZGVyIFwiTG9hZCBtb3JlXCIgcm93LiBUaGUgc2lkZWJhciB0cmFja3NcbiAgICogIHBhZ2luYXRpb24gdmlhIGBub2RlLmxvYWRlZFBhZ2VzYDsgdGhlIG5leHQgcGFnZSBpcyBsb2FkZWRQYWdlcyArIDEuICovXG4gIG9uTG9hZE1vcmUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIGlmIChuLmxvYWRlZFBhZ2VzID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckxvYWRNb3JlUmVxdWVzdGVkLmVtaXQoeyBpZDogbi5pZCwgbmV4dFBhZ2U6IG4ubG9hZGVkUGFnZXMgKyAxIH0pO1xuICB9XG5cbiAgLyoqIENhY2hlZCBgZm9sZGVycy5sZW5ndGhgIGF0IHRoZSBtb21lbnQgd2UgbGFzdCBlbWl0dGVkIGByb290TG9hZE1vcmVSZXF1ZXN0ZWRgLlxuICAgKiAgVXNlZCB0byB0aHJvdHRsZSB0aGUgc2Nyb2xsLWJhc2VkIHBhZ2luYXRpb24gc28gd2UgZG9uJ3QgcmUtZW1pdCB1bnRpbCB0aGVcbiAgICogIGhvc3QgaGFzIGFjdHVhbGx5IGFwcGVuZGVkIGEgbmV3IHBhZ2UuICovXG4gIHByaXZhdGUgbGFzdFJvb3RMb2FkRW1pdHRlZEF0OiBudW1iZXIgPSAtMTtcbiAgLyoqIFRocmVzaG9sZCAocHgpIGZvciBcIm5lYXIgdGhlIGJvdHRvbVwiIOKAlCBlbWl0IGEgbG9hZC1tb3JlIG9uY2UgdGhlIHNjcm9sbFxuICAgKiAgcG9zaXRpb24gaXMgd2l0aGluIHRoaXMgbWFueSBweCBvZiB0aGUgZW5kLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ1JPTExfTE9BRF9USFJFU0hPTERfUFggPSA2NDtcblxuICAvKiogVmVydGljYWwtc2Nyb2xsIGhhbmRsZXIgZm9yIHRoZSByb290LWZvbGRlciBsaXN0LiBGaXJlcyBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYFxuICAgKiAgd2hlbiB0aGUgdXNlciBzY3JvbGxzIHdpdGhpbiB0aGUgdGhyZXNob2xkIG9mIHRoZSBib3R0b20gYW5kIG1vcmUgcm9vdHNcbiAgICogIGFyZSBhdmFpbGFibGUgb24gdGhlIGJhY2tlbmQuIFN1cHByZXNzZWQgZHVyaW5nIHNpZGViYXIgc2VhcmNoLiAqL1xuICBvblRyZWVTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVmFsdWU/LnRyaW0oKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZvbGRlcnMubGVuZ3RoID49IHRoaXMucm9vdFRvdGFsKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZm9sZGVycy5sZW5ndGggPT09IHRoaXMubGFzdFJvb3RMb2FkRW1pdHRlZEF0KSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBlbC5zY3JvbGxIZWlnaHQgLSAoZWwuc2Nyb2xsVG9wICsgZWwuY2xpZW50SGVpZ2h0KTtcbiAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tID4gRm9sZGVyU2lkZWJhckNvbXBvbmVudC5TQ1JPTExfTE9BRF9USFJFU0hPTERfUFgpIHJldHVybjtcbiAgICB0aGlzLmxhc3RSb290TG9hZEVtaXR0ZWRBdCA9IHRoaXMuZm9sZGVycy5sZW5ndGg7XG4gICAgdGhpcy5yb290TG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3QobjogRm9sZGVyTm9kZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZW5hbWluZ0lkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQobiA9PSBudWxsID8gbnVsbCA6IG4uaWQpO1xuICB9XG5cbiAgb25TZWxlY3RVbm9yZ2FuaXNlZCgpOiB2b2lkIHtcbiAgICAvLyBTZW50aW5lbDogaG9zdHMgdGhhdCBrZWVwIGFuIFwiVW5vcmdhbmlzZWRcIiBidWNrZXQgY2FuIHRyZWF0IGEgbnVsbCBzZWxlY3Rpb25cbiAgICAvLyBhcyBcInNob3cgdW5vcmdhbmlzZWRcIi4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJvb3QgKG51bGwpIHNlbGVjdGlvbiBwYXR0ZXJuLFxuICAgIC8vIHRoaXMgbWF0Y2hlcyBpdC4gSG9zdCBkZWNpZGVzIHNlbWFudGljcy5cbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQobnVsbCk7XG4gIH1cblxuICBiZWdpblJlbmFtZShuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dSZW5hbWUpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlbmFtaW5nSWQgPSBuLmlkO1xuICAgIHRoaXMucmVuYW1lRHJhZnQgPSBuLm5hbWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5mb2N1c1JlbmFtZUlucHV0KG4uaWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgYWN0aXZlIHJlbmFtZSBkcmFmdCBwYXNzZXMgdGhlIG5hbWUgcnVsZXMgKG5vbi1lbXB0eSwgd2l0aGluIG1heCBsZW5ndGgpLiAqL1xuICBnZXQgaXNSZW5hbWVEcmFmdFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSAodGhpcy5yZW5hbWVEcmFmdCB8fCAnJykudHJpbSgpO1xuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgJiYgdHJpbW1lZC5sZW5ndGggPD0gdGhpcy5yZW5hbWVNYXhMZW5ndGg7XG4gIH1cblxuICBjb21taXRSZW5hbWUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIC8vIERpc2NhcmQgaW52YWxpZCBkcmFmdHMgKGVtcHR5IC8gdG9vIGxvbmcpIGluc3RlYWQgb2YgY29tbWl0dGluZyBhIGJhZCBuYW1lLlxuICAgIC8vIFRoZSB1c2VyIHNlZXMgdGhlIHJlZCBib3JkZXIgd2hpbGUgZWRpdGluZzsgb24gYmx1ciB3ZSByZXZlcnQgdG8gdGhlIG9yaWdpbmFsLlxuICAgIGlmICghdGhpcy5pc1JlbmFtZURyYWZ0VmFsaWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAodGhpcy5yZW5hbWVEcmFmdCB8fCAnJykudHJpbSgpO1xuICAgIGlmIChuYW1lICE9PSBuLm5hbWUpIHtcbiAgICAgIC8vIEVtaXQgdGhlIGZ1bGwgcmVuYW1lZCBub2RlICh3aXRoIHRoZSBuZXcgbmFtZSkgKyBwYXJlbnQgY29udGV4dCBzbyBob3N0cyBjYW5cbiAgICAgIC8vIGNhbGwgYFBVVCAvdGVzdF9jYXNlX2ZvbGRlcnMve2lkfWAgd2l0aG91dCByZS1yZXNvbHZpbmcgZnJvbSB0aGVpciBjYWNoZWQgdHJlZS5cbiAgICAgIGNvbnN0IGZvbGRlcjogRm9sZGVyTm9kZSA9IHsgLi4ubiwgbmFtZSB9O1xuICAgICAgdGhpcy5mb2xkZXJSZW5hbWVkLmVtaXQoe1xuICAgICAgICBmb2xkZXIsXG4gICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkT2Yobi5pZCksXG4gICAgICAgIHByZXZpb3VzTmFtZTogbi5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gIH1cblxuICBjYW5jZWxSZW5hbWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5hbWluZ0lkID0gbnVsbDtcbiAgICB0aGlzLnJlbmFtZURyYWZ0ID0gJyc7XG4gICAgdGhpcy5jbGVhclJlbmFtZUxpbWl0Rmxhc2goKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUmVuYW1lS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgLy8gU3RvcCBidWJibGluZyBzbyB0aGUgcm93J3Mga2V5ZG93biBoYW5kbGVyICh3aGljaCB0cmVhdHMgU3BhY2UvRW50ZXIvQXJyb3dzIGFzXG4gICAgLy8gc2VsZWN0aW9uIC8gdHJlZSBuYXZpZ2F0aW9uKSBjYW4ndCBzd2FsbG93IGNoYXJhY3RlcnMgdHlwZWQgaW50byB0aGUgcmVuYW1lIGlucHV0LlxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBEb24ndCBzd2FsbG93IHRoZSB1c2VyJ3MgZWRpdCBvbiBFbnRlciB3aGVuIHRoZSBkcmFmdCBpcyBpbnZhbGlkIOKAlCBrZWVwXG4gICAgICAvLyB0aGUgaW5wdXQgb3BlbiAocmVkIGJvcmRlciBhbHJlYWR5IHNpZ25hbHMgdGhlIGlzc3VlKSBhbmQgbGV0IHRoZW0gZml4IGl0LlxuICAgICAgaWYgKCF0aGlzLmlzUmVuYW1lRHJhZnRWYWxpZCkgcmV0dXJuO1xuICAgICAgdGhpcy5jb21taXRSZW5hbWUobik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGFueSBvdGhlciBrZXlzdHJva2UsIGRldGVjdCBcInVzZXIgaXMgdHJ5aW5nIHRvIHR5cGUgcGFzdCBtYXhsZW5ndGhcIiBhbmRcbiAgICAvLyBicmllZmx5IGZsYXNoIHRoZSBpbnB1dCByZWQuIFRoZSBicm93c2VyJ3MgYG1heGxlbmd0aGAgYXR0cmlidXRlIGFscmVhZHlcbiAgICAvLyBzaWxlbnRseSBibG9ja3MgdGhlIGNoYXJhY3RlcjsgdGhpcyBzdXJmYWNlcyBhIHZpc2libGUgXCJ5b3UndmUgaGl0IHRoZSBjYXBcIlxuICAgIC8vIHNpZ25hbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBtaXNzaW5nLlxuICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlS2V5KGV2ZW50KSAmJiB0aGlzLndvdWxkRXhjZWVkUmVuYW1lTGltaXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZW5hbWVMaW1pdEZsYXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIFNpbmdsZS1jaGFyYWN0ZXIga2V5cyBhcmUgcHJpbnRhYmxlcyAoYSwgQiwgMSwgISwgc3BhY2UpLiBNb2RpZmllci1kcml2ZW5cbiAgICAvLyBzaG9ydGN1dHMgKEN0cmwvTWV0YSkgc2hvdWxkbid0IGNvdW50IOKAlCB0aGV5IGRvbid0IGluc2VydCB0ZXh0LlxuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXk7XG4gIH1cblxuICBwcml2YXRlIHdvdWxkRXhjZWVkUmVuYW1lTGltaXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBUaGUgbmV3IGxlbmd0aCBhZnRlciB0aGUga2V5c3Ryb2tlIHdvdWxkIGJlOiBjdXJyZW50IC0gc2VsZWN0aW9uTGVuZ3RoICsgMS5cbiAgICAvLyBJZiBhIHNlbGVjdGlvbiBjb3ZlcnMgcGFydCBvZiB0aGUgdmFsdWUsIHR5cGluZyByZXBsYWNlcyB0aGF0IHJhbmdlLCBzbyB0aGVcbiAgICAvLyBuZXQgbGVuZ3RoIG1pZ2h0IHN0aWxsIGZpdCB1bmRlciB0aGUgY2FwLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldD8uc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQ/LnNlbGVjdGlvbkVuZCA/PyAwO1xuICAgIGNvbnN0IHNlbGVjdGVkTGVuID0gTWF0aC5tYXgoMCwgZW5kIC0gc3RhcnQpO1xuICAgIGNvbnN0IGRyYWZ0TGVuID0gKHRoaXMucmVuYW1lRHJhZnQgfHwgJycpLmxlbmd0aDtcbiAgICByZXR1cm4gZHJhZnRMZW4gLSBzZWxlY3RlZExlbiA+PSB0aGlzLnJlbmFtZU1heExlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlclJlbmFtZUxpbWl0Rmxhc2goKTogdm9pZCB7XG4gICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbmFtZUxpbWl0Rmxhc2hUaW1lcik7XG4gICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVuYW1lTGltaXRGbGFzaCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgRm9sZGVyU2lkZWJhckNvbXBvbmVudC5SRU5BTUVfTElNSVRfRkxBU0hfTVMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlbmFtZUxpbWl0Rmxhc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVuYW1lTGltaXRGbGFzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIpO1xuICAgICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlbmFtZUxpbWl0Rmxhc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZUZvbGRlcihuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dEZWxldGUpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBmb2xkZXIgY29udGV4dCBtZW51IGFuY2hvcmVkIGF0IHRoZSBnaXZlbiBjbGllbnQgY29vcmRpbmF0ZXMuXG4gICAqIENhbGxlZCBmcm9tIGJvdGggKGNvbnRleHRtZW51KSBvbiB0aGUgcm93IGFuZCAoY2xpY2spIG9uIHRoZSBlbGxpcHNpcyBidXR0b24uXG4gICAqIFRoZSB0ZW1wbGF0ZSByZW5kZXJzIHRoZSBtZW51IHZpYSBjZGtDb25uZWN0ZWRPdmVybGF5IGFuY2hvcmVkIG9uIGFuXG4gICAqIGludmlzaWJsZSAww5cwIG9yaWdpbiBhdCBgY29udGV4dE1lbnVQb3NpdGlvbmA7IENESydzIGZsZXhpYmxlLWNvbm5lY3RlZFxuICAgKiBwb3NpdGlvbmluZyBhdXRvLWZsaXBzIHVwL2xlZnQgd2hlbiB0aGUgcHJlZmVycmVkIHBsYWNlbWVudCB3b3VsZCBvdmVyZmxvd1xuICAgKiB0aGUgdmlld3BvcnQgKGUuZy4gcmlnaHQtY2xpY2tpbmcgdGhlIGxhc3QgZm9sZGVyIG5lYXIgdGhlIGJvdHRvbSBlZGdlKS5cbiAgICovXG4gIG9wZW5Db250ZXh0TWVudShuOiBGb2xkZXJOb2RlLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmhhc0FueUNvbnRleHRBY3Rpb24pIHJldHVybjtcbiAgICB0aGlzLmNvbnRleHRNZW51Rm9sZGVySWQgPSBuLmlkO1xuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbiA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIC8vIENESydzIG91dHNpZGUtY2xpY2sgZGlzcGF0Y2hlciBhdHRhY2hlcyBib2R5LWxldmVsIGNhcHR1cmUtcGhhc2UgbGlzdGVuZXJzXG4gICAgLy8gZm9yIGNsaWNrL2F1eGNsaWNrL2NvbnRleHRtZW51LiBPbiByaWdodC1jbGljayB0aGUgY29udGV4dG1lbnUrYXV4Y2xpY2tcbiAgICAvLyBldmVudHMgZmlyZSBvbiB0aGUgc2FtZSBnZXN0dXJlIHRoYXQgb3BlbmVkIHRoZSBtZW51LCB3aGljaCB3b3VsZFxuICAgIC8vIGltbWVkaWF0ZWx5IGNsb3NlIGl0LiBTdXBwcmVzcyBvdXRzaWRlLWNsaWNrIGhhbmRsaW5nIGZvciBhIHNob3J0IHdpbmRvdy5cbiAgICB0aGlzLl9zdXBwcmVzc091dHNpZGVDbGlja1VudGlsID0gRGF0ZS5ub3coKSArIDI1MDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uT3ZlcmxheU91dHNpZGVDbGljaygpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSA8IHRoaXMuX3N1cHByZXNzT3V0c2lkZUNsaWNrVW50aWwpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgfVxuXG4gIGNsb3NlQ29udGV4dE1lbnUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVGb2xkZXJJZCA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5jb250ZXh0TWVudUZvbGRlcklkID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIG1lbnUgZW50cnkgaXMgZW5hYmxlZCDigJQgb3RoZXJ3aXNlIHRoZSB0cmlnZ2VyIGlzIHN1cHByZXNzZWQgZW50aXJlbHkuICovXG4gIGdldCBoYXNBbnlDb250ZXh0QWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93Q3JlYXRlIHx8IHRoaXMuYWxsb3dSZW5hbWUgfHwgdGhpcy5hbGxvd01vdmUgfHwgdGhpcy5hbGxvd0R1cGxpY2F0ZSB8fCB0aGlzLmFsbG93RGVsZXRlO1xuICB9XG5cbiAgb25Db250ZXh0Q3JlYXRlU3ViZm9sZGVyKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dDcmVhdGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckNyZWF0ZVJlcXVlc3RlZC5lbWl0KHsgcGFyZW50SWQ6IG4uaWQgfSk7XG4gIH1cblxuICBvbkNvbnRleHRSZW5hbWUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgIGlmICghdGhpcy5hbGxvd1JlbmFtZSkgcmV0dXJuO1xuICAgIHRoaXMucmVuYW1pbmdJZCA9IG4uaWQ7XG4gICAgdGhpcy5yZW5hbWVEcmFmdCA9IG4ubmFtZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzUmVuYW1lSW5wdXQobi5pZCk7XG4gIH1cblxuICBvbkNvbnRleHRNb3ZlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dNb3ZlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJNb3ZlUmVxdWVzdGVkLmVtaXQoeyBpZDogbi5pZCB9KTtcbiAgfVxuXG4gIG9uQ29udGV4dER1cGxpY2F0ZShuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgaWYgKCF0aGlzLmFsbG93RHVwbGljYXRlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgb25Db250ZXh0RGVsZXRlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dEZWxldGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxuICBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICB9XG5cbiAgLyoqIFRlbXBsYXRlIGhlbHBlcjogcmVzb2x2ZSBhIGZvbGRlciBub2RlIGJ5IGlkIGZyb20gdGhlIGlucHV0IHRyZWUuICovXG4gIGZvbGRlckJ5SWQoaWQ6IG51bWJlciB8IG51bGwpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgaWYgKGlkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZpbmQgPSAobm9kZXM6IEZvbGRlck5vZGVbXSk6IEZvbGRlck5vZGUgfCBudWxsID0+IHtcbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICBpZiAobi5pZCA9PT0gaWQpIHJldHVybiBuO1xuICAgICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgaGl0ID0gZmluZChuLmNoaWxkcmVuKTtcbiAgICAgICAgICBpZiAoaGl0KSByZXR1cm4gaGl0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBmaW5kKHRoaXMuZm9sZGVycyk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcGFyZW50IGlkIG9mIGBpZGAsIG9yIG51bGwgd2hlbiBgaWRgIGlzIGEgcm9vdCBmb2xkZXIgLyBub3QgZm91bmQuICovXG4gIHByaXZhdGUgcGFyZW50SWRPZihpZDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICAgIGlmIChuLmlkID09PSBpZCkge1xuICAgICAgICAgIHJlc3VsdCA9IHBhcmVudElkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGggJiYgd2FsayhuLmNoaWxkcmVuLCBuLmlkKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgbnVsbCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlcXVlc3RDcmVhdGUocGFyZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsbG93Q3JlYXRlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJDcmVhdGVSZXF1ZXN0ZWQuZW1pdCh7IHBhcmVudElkIH0pO1xuICB9XG5cbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgdGhpcy5jb2xsYXBzZWRDaGFuZ2UuZW1pdCh0aGlzLmNvbGxhcHNlZCk7XG4gIH1cblxuICByb3dEcm9wcGVkKHRhcmdldElkOiBudW1iZXIgfCBudWxsLCBldmVudDogeyB0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+OyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgLy8gRGlyZWN0aXZlIGFscmVhZHkgZW1pdHMgd2l0aCB0aGUgYm91bmQgZm9sZGVyIGlkLCBidXQgbm9ybWFsaXNlIGluIGNhc2UgY2FsbGVyc1xuICAgIC8vIHdpcmUgcmF3IGV2ZW50cy5cbiAgICB0aGlzLnRlc3RzRHJvcHBlZC5lbWl0KHsgdGVzdElkczogZXZlbnQudGVzdElkcywgdGFyZ2V0Rm9sZGVySWQ6IHRhcmdldElkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGFyZ2V0IHJlY2VpdmVkIGEgZm9sZGVyIGRyYWcuIFZhbGlkYXRlIGFnYWluc3Qgc2VsZi9kZXNjZW5kYW50IGN5Y2xlcyBhbmRcbiAgICogZW1pdCBgZm9sZGVyRHJvcHBlZGAgaWYgdGhlIG1vdmUgaXMgbGVnYWwuIENhbGxlZCBmcm9tIHRoZSBkaXJlY3RpdmUnc1xuICAgKiBgKGZvbGRlckRyb3BwZWQpYCBvdXRwdXQgb24gZXZlcnkgcm93IGFuZCBvbiB0aGUgVW5vcmdhbmlzZWQgcm93LlxuICAgKi9cbiAgb25Gb2xkZXJSb3dEcm9wcGVkKHRhcmdldElkOiBudW1iZXIgfCBudWxsLCBldmVudDogeyBmb2xkZXJJZDogbnVtYmVyOyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEV4cGFuZFRpbWVycygpO1xuICAgIHRoaXMuYWN0aXZlRm9sZGVyRHJhZ0lkID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2VJZCA9IGV2ZW50LmZvbGRlcklkO1xuICAgIGlmICh0YXJnZXRJZCAhPSBudWxsICYmIHRhcmdldElkID09PSBzb3VyY2VJZCkgcmV0dXJuO1xuICAgIGlmICh0YXJnZXRJZCAhPSBudWxsICYmIHRoaXMuaXNEZXNjZW5kYW50T2Yoc291cmNlSWQsIHRhcmdldElkKSkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyRHJvcHBlZC5lbWl0KHsgaWQ6IHNvdXJjZUlkLCBuZXdQYXJlbnRJZDogdGFyZ2V0SWQgfSk7XG4gIH1cblxuICAvKiogUmVtZW1iZXIgdGhlIGRyYWdnZWQgZm9sZGVyIHNvIHdlIGNhbiBibG9jayBzZWxmLWhvdmVyIGV4cGFuc2lvbiBhbmQgY3ljbGUgZHJvcHMuICovXG4gIG9uRm9sZGVyRHJhZ1N0YXJ0KG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9IG4uaWQ7XG4gIH1cblxuICBvbkZvbGRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVGb2xkZXJEcmFnSWQgPSBudWxsO1xuICAgIHRoaXMuY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTtcbiAgfVxuXG4gIC8qKiBTY2hlZHVsZSBhbiBhdXRvLWV4cGFuZCBmb3IgYSBjb2xsYXBzZWQgZm9sZGVyIHRoYXQgaGFzIGNoaWxkcmVuIGR1cmluZyBkcmFnLWhvdmVyLiAqL1xuICBvbkZvbGRlclJvd0RyYWdPdmVyKHJvdzogUmVuZGVyTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gcm93Lm5vZGUuaWQ7XG4gICAgaWYgKCFyb3cuaGFzQ2hpbGRyZW4pIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKGlkKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9PT0gaWQpIHJldHVybjsgLy8gZG9uJ3QgZXhwYW5kIHRoZSBzb3VyY2VcbiAgICBpZiAodGhpcy5kcmFnRXhwYW5kVGltZXJzLmhhcyhpZCkpIHJldHVybjtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZChpZCkpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZCwgZXhwYW5kZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5EUkFHX0VYUEFORF9ERUxBWV9NUyk7XG4gICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLnNldChpZCwgdGltZXIpO1xuICB9XG5cbiAgb25Gb2xkZXJSb3dEcmFnTGVhdmUocm93OiBSZW5kZXJOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSByb3cubm9kZS5pZDtcbiAgICBjb25zdCB0aW1lciA9IHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5nZXQoaWQpO1xuICAgIGlmICh0aW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmRlbGV0ZShpZCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6ZHJhZ2VuZCcpXG4gIG9uRG9jdW1lbnREcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMub25Gb2xkZXJEcmFnRW5kKCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGBjYW5kaWRhdGVJZGAgaXMgYHNvdXJjZUlkYCBpdHNlbGYgb3IgYW55IGRlc2NlbmRhbnQgb2YgaXQuICovXG4gIHByaXZhdGUgaXNEZXNjZW5kYW50T2Yoc291cmNlSWQ6IG51bWJlciwgY2FuZGlkYXRlSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZm9sZGVyQnlJZChzb3VyY2VJZCk7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGFjazogRm9sZGVyTm9kZVtdID0gW3NvdXJjZV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgbiA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGlmIChuLmlkID09PSBjYW5kaWRhdGVJZCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSBzdGFjay5wdXNoKC4uLm4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxsRXhwYW5kVGltZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5mb3JFYWNoKHQgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLmRyYWdFeHBhbmRUaW1lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTtcbiAgICB0aGlzLmNsZWFyUmVuYW1lTGltaXRGbGFzaCgpO1xuICAgIGlmICh0aGlzLnNlYXJjaEVtaXRUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoRW1pdFRpbWVyKTtcbiAgICAgIHRoaXMuc2VhcmNoRW1pdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5Um93ID0gKF86IG51bWJlciwgcm93OiBSZW5kZXJOb2RlKSA9PiBgJHtyb3cua2luZH1fJHtyb3cubm9kZS5pZH1gO1xuXG4gIG9uUm93S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgcm93OiBSZW5kZXJOb2RlLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93cztcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXh0ID0gcm93c1tpbmRleCArIDFdO1xuICAgICAgICBpZiAobmV4dCkgdGhpcy5mb2N1c1Jvd0VsZW1lbnQobmV4dC5ub2RlLmlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcm93c1tpbmRleCAtIDFdO1xuICAgICAgICBpZiAocHJldikgdGhpcy5mb2N1c1Jvd0VsZW1lbnQocHJldi5ub2RlLmlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0Jzoge1xuICAgICAgICBpZiAocm93Lmhhc0NoaWxkcmVuICYmICF0aGlzLmlzRXhwYW5kZWQocm93Lm5vZGUuaWQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdCh7IGlkOiByb3cubm9kZS5pZCwgZXhwYW5kZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiB7XG4gICAgICAgIGlmIChyb3cuaGFzQ2hpbGRyZW4gJiYgdGhpcy5pc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogcm93Lm5vZGUuaWQsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25TZWxlY3Qocm93Lm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUm93RWxlbWVudChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2RhdGEtZm9sZGVyLXJvdy1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICBlbD8uZm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBpbmxpbmUgcmVuYW1lIGlucHV0IGZvciB0aGUgZ2l2ZW4gZm9sZGVyLiBVc2VzIGBzZXRUaW1lb3V0YCAobm90XG4gICAqIG1pY3JvdGFzaykgYmVjYXVzZSB0aGUgaW5wdXQgaXMgZ2F0ZWQgYnkgYCpuZ0lmPVwicmVuYW1pbmdJZCA9PT0gLi4uXCJgIGFuZFxuICAgKiBtdXN0IHN1cnZpdmUgdGhlIG5leHQgT25QdXNoIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUgYmVmb3JlIGl0J3MgaW4gdGhlIERPTS5cbiAgICovXG4gIHByaXZhdGUgZm9jdXNSZW5hbWVJbnB1dChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oYFtkYXRhLWZvbGRlci1yZW5hbWUtaW5wdXQ9XCIke2lkfVwiXWApO1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIGVsLnNlbGVjdCgpO1xuICAgIH0sIDApO1xuICB9XG59XG4iLCI8IS0tIFJldXNhYmxlIGZvbGRlciBpY29uLiBSZW5kZXIgdmlhIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uOyBjb250ZXh0OiB7IGNvbG9yOiBub2RlLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj4uIC0tPlxuPG5nLXRlbXBsYXRlICNmb2xkZXJJY29uIGxldC1jb2xvcj1cImNvbG9yXCI+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTQgY3FhLWgtNCBjcWEtc2hyaW5rLTBcIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTMgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMTIuMTkxNiA5Ljg1ODI0QzEyLjE5MTYgMTAuMTY3NyAxMi4wNjg3IDEwLjQ2NDQgMTEuODQ5OSAxMC42ODMyQzExLjYzMTEgMTAuOTAyIDExLjMzNDMgMTEuMDI0OSAxMS4wMjQ5IDExLjAyNDlIMS42OTE1N0MxLjM4MjE1IDExLjAyNDkgMS4wODU0IDEwLjkwMiAwLjg2NjYxMSAxMC42ODMyQzAuNjQ3ODE5IDEwLjQ2NDQgMC41MjQ5MDIgMTAuMTY3NyAwLjUyNDkwMiA5Ljg1ODI0VjEuNjkxNTdDMC41MjQ5MDIgMS4zODIxNSAwLjY0NzgxOSAxLjA4NTQgMC44NjY2MTEgMC44NjY2MTFDMS4wODU0IDAuNjQ3ODE5IDEuMzgyMTUgMC41MjQ5MDIgMS42OTE1NyAwLjUyNDkwMkg0LjYwODI0TDUuNzc0OSAyLjI3NDlIMTEuMDI0OUMxMS4zMzQzIDIuMjc0OSAxMS42MzExIDIuMzk3ODIgMTEuODQ5OSAyLjYxNjYxQzEyLjA2ODcgMi44MzU0IDEyLjE5MTYgMy4xMzIxNSAxMi4xOTE2IDMuNDQxNTdWOS44NTgyNFpcIiBbYXR0ci5zdHJva2VdPVwiY29sb3IgfHwgJyM5OTk5OUUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4wNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGFzaWRlXG4gIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItbmV1dHJhbC0yMDAgY3FhLXJvdW5kZWQtbGcgY3FhLWgtZnVsbCBjcWEtbWluLWgtMFwiXG4gIFtjbGFzcy5jcWEtdy1bMjQwcHhdXT1cIiFjb2xsYXBzZWRcIlxuICBbY2xhc3MuY3FhLXctWzQ4cHhdXT1cImNvbGxhcHNlZFwiXG4gIHN0eWxlPVwidHJhbnNpdGlvbjogd2lkdGggMTUwbXMgZWFzZTtcIlxuPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1weC0zIGNxYS1weS0xXCJcbiAgICBbc3R5bGUuYm9yZGVyLWJvdHRvbV09XCJjb2xsYXBzZWQgPyBudWxsIDogJzFweCBzb2xpZCAjRTJFMkUzJ1wiXG4gICAgW3N0eWxlLm1hcmdpbi1ib3R0b20ucHhdPVwiY29sbGFwc2VkID8gMCA6IDhcIlxuICA+XG4gICAgPHNwYW4gKm5nSWY9XCIhY29sbGFwc2VkXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1uZXV0cmFsLTkwMFwiPlxuICAgICAge3sgbGFiZWxzLmZvbGRlcnMgfX1cbiAgICA8L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCIgW2NsYXNzLmNxYS13LWZ1bGxdPVwiY29sbGFwc2VkXCIgW2NsYXNzLmNxYS1qdXN0aWZ5LWNlbnRlcl09XCJjb2xsYXBzZWRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXRleHQtbmV1dHJhbC01MDBcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sbGFwc2VkID8gJ0V4cGFuZCBmb2xkZXJzIHBhbmVsJyA6ICdDb2xsYXBzZSBmb2xkZXJzIHBhbmVsJ1wiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxOHB4O3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHhcIj5cbiAgICAgICAgICB7eyBjb2xsYXBzZWQgPyAnY2hldnJvbl9yaWdodCcgOiAna2V5Ym9hcmRfZG91YmxlX2Fycm93X2xlZnQnIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCIhY29sbGFwc2VkICYmIGFsbG93Q3JlYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXRleHQtbmV1dHJhbC01MDBcIlxuICAgICAgICAoY2xpY2spPVwicmVxdWVzdENyZWF0ZShudWxsKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxzLm5ld0ZvbGRlclwiXG4gICAgICAgIFt0aXRsZV09XCJsYWJlbHMubmV3Rm9sZGVyXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE4cHg7d2lkdGg6MThweDtoZWlnaHQ6MThweFwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2xsYXBzZWRcIj5cbiAgICA8IS0tIFNlYXJjaCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTMgY3FhLXBiLTIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVscy5zZWFyY2hGb2xkZXJzUGxhY2Vob2xkZXJcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWFyY2hJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcigpXCJcbiAgICAgID48L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgPCEtLSBJbmxpbmUgbG9hZGluZyBhZmZvcmRhbmNlIGR1cmluZyBzZXJ2ZXItc2lkZSBmb2xkZXIgc2VhcmNoLiBTaXRzXG4gICAgICAgICAgIGluc2lkZSB0aGUgcmVsYXRpdmUgY29udGFpbmVyIGFib3ZlIHNvIGl0IG92ZXJsYXlzIHRoZSB0cmFpbGluZ1xuICAgICAgICAgICBlZGdlIG9mIHRoZSBzZWFyY2ggaW5wdXQgd2l0aG91dCBzaGlmdGluZyBsYXlvdXQuIC0tPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJmb2xkZXJTZWFyY2hMb2FkaW5nXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXJpZ2h0LTcgY3FhLXRvcC0xLzIgLWNxYS10cmFuc2xhdGUteS0xLzIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJTZWFyY2hpbmcgZm9sZGVyc1wiXG4gICAgICA+XG4gICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE0XCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUcmVlIChmb2xkZXJzIG9ubHkg4oCUIFVub3JnYW5pc2VkIHNpdHMgZGlyZWN0bHkgYmVsb3c7IHRyZWUgY2FwcyBhdCA2MHZoIGFuZCBzY3JvbGxzIHdoZW4gb3ZlcmZsb3dpbmcpLlxuICAgICAgICAgU2Nyb2xsLWJhc2VkIGxhenktbG9hZGluZyBhdCB0aGUgcm9vdCBsZXZlbDogbmVhcmluZyB0aGUgYm90dG9tIGVtaXRzXG4gICAgICAgICBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYCwgd2hpY2ggdGhlIGhvc3QgcmVzcG9uZHMgdG8gYnkgZmV0Y2hpbmcgdGhlXG4gICAgICAgICBuZXh0IHBhZ2Ugb2Ygcm9vdHMuIC0tPlxuICAgIDxkaXYgcm9sZT1cInRyZWVcIiBjbGFzcz1cImNxYS1taW4taC0wIGNxYS1tYXgtaC1bNjB2aF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHktMSBjcWEtc2Nyb2xsYmFyLXRoaW4gY3FhLXNjcm9sbGJhci10cmFjay10cmFuc3BhcmVudCBjcWEtc2Nyb2xsYmFyLXRodW1iLVsjRTVFN0VCXSBjcWEtc2Nyb2xsYmFyLXRodW1iLXJvdW5kZWQtZnVsbCBjcWEtc2Nyb2xsYmFyLXRodW1iLWhvdmVyOmNxYS1iZy1bI0QxRDVEQl1cIlxuICAgICAgICAgKHNjcm9sbCk9XCJvblRyZWVTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgPCEtLSBJbml0aWFsLWxvYWQgc3Bpbm5lcjogb25seSByZW5kZXJzIHdoZW4gd2UgaGF2ZSBubyBmb2xkZXJzIHlldCBBTkRcbiAgICAgICAgICAgbm8gc2VhcmNoIGFjdGl2ZSAoc2VhcmNoIGhhcyBpdHMgb3duIGlubGluZSBzcGlubmVyKS4gLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwicm9vdEZvbGRlcnNMb2FkaW5nICYmIGZvbGRlcnMubGVuZ3RoID09PSAwICYmICFzZWFyY2hWYWx1ZT8udHJpbSgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktNlwiXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjIwXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwic2VhcmNoVmFsdWU/LnRyaW0oKSAmJiByb3dzLmxlbmd0aCA9PT0gMCAmJiAhZm9sZGVyU2VhcmNoTG9hZGluZ1wiXG4gICAgICAgIGNsYXNzPVwiY3FhLXB4LTMgY3FhLXB5LTIgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLXRleHQtY2VudGVyXCJcbiAgICAgID5cbiAgICAgICAge3sgbGFiZWxzLm5vRm9sZGVyc0ZvdW5kIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Um93XCI+XG4gICAgICAgIDwhLS0gU3ludGhldGljIGxvYWRpbmcgcm93IChsYXp5IGZldGNoIGluIGZsaWdodCkgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInJvdy5raW5kID09PSAnbG9hZGluZydcIlxuICAgICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCI4ICsgcm93LmRlcHRoICogMTZcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTUwMFwiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE0XCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgIDxzcGFuPkxvYWRpbmfigKY8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFN5bnRoZXRpYyBsb2FkLW1vcmUgcm93IChtb3JlIGNoaWxkcmVuIGF2YWlsYWJsZSBvbiBiYWNrZW5kKSAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwicm93LmtpbmQgPT09ICdsb2FkLW1vcmUnXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbc3R5bGUucGFkZGluZ0xlZnQucHhdPVwiOCArIHJvdy5kZXB0aCAqIDE2XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXctZnVsbCBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LWluZGlnby02MDAgaG92ZXI6Y3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Mb2FkTW9yZShyb3cubm9kZSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj5Mb2FkIG1vcmUgKHt7IChyb3cubm9kZS50b3RhbENoaWxkcmVuID8/IDApIC0gKHJvdy5ub2RlLmNoaWxkcmVuPy5sZW5ndGggPz8gMCkgfX0pPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPCEtLSBSZWFsIGZvbGRlciByb3cgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInJvdy5raW5kID09PSAnZm9sZGVyJ1wiXG4gICAgICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicm93Lmhhc0NoaWxkcmVuID8gaXNFeHBhbmRlZChyb3cubm9kZS5pZCkgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWZvbGRlci1yb3ctaWRdPVwicm93Lm5vZGUuaWRcIlxuICAgICAgICAgIFtjcWFGb2xkZXJEcm9wXT1cInJvdy5ub2RlLmlkXCJcbiAgICAgICAgICBbZHJvcEVuYWJsZWRdPVwiYWxsb3dEcm9wXCJcbiAgICAgICAgICAodGVzdHNEcm9wcGVkKT1cInJvd0Ryb3BwZWQocm93Lm5vZGUuaWQsICRldmVudClcIlxuICAgICAgICAgIChmb2xkZXJEcm9wcGVkKT1cIm9uRm9sZGVyUm93RHJvcHBlZChyb3cubm9kZS5pZCwgJGV2ZW50KVwiXG4gICAgICAgICAgW2NxYUZvbGRlckRyYWddPVwicm93Lm5vZGUuaWRcIlxuICAgICAgICAgIFtkcmFnRW5hYmxlZF09XCJhbGxvd0Ryb3BcIlxuICAgICAgICAgIChkcmFnc3RhcnQpPVwib25Gb2xkZXJEcmFnU3RhcnQocm93Lm5vZGUpXCJcbiAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkZvbGRlckRyYWdFbmQoKVwiXG4gICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRm9sZGVyUm93RHJhZ092ZXIocm93KVwiXG4gICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkZvbGRlclJvd0RyYWdMZWF2ZShyb3cpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3Qocm93Lm5vZGUpXCJcbiAgICAgICAgICAoY29udGV4dG1lbnUpPVwib3BlbkNvbnRleHRNZW51KHJvdy5ub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJvblJvd0tleWRvd24oJGV2ZW50LCByb3csIGkpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1ncm91cCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHItMyBjcWEtcHktMS41IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLWJnLWluZGlnby01MCBjcWEtcmVsYXRpdmVcIlxuICAgICAgICAgIFtjbGFzcy5jcWEtYmctaW5kaWdvLTUwXT1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpIHx8IGNvbnRleHRNZW51Rm9sZGVySWQgPT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICBbc3R5bGUucGFkZGluZ0xlZnQucHhdPVwiOCArIHJvdy5kZXB0aCAqIDE2XCJcbiAgICAgICAgICBbYXR0ci50aXRsZV09XCJyb3cubm9kZS50b3RhbENvdW50ICE9IG51bGwgPyAocm93Lm5vZGUudG90YWxDb3VudCArICcgdG90YWwgaW5jbHVkaW5nIHN1YmZvbGRlcnMnKSA6IG51bGxcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiaXNTZWxlY3RlZChyb3cubm9kZS5pZClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMCBjcWEtdG9wLTAgY3FhLWJvdHRvbS0wIGNxYS13LVszcHhdIGNxYS1iZy1pbmRpZ28tNjAwXCJcbiAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0wXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKSA/ICcjM0Y0M0VFJyA6ICcjNEM0QzUxJ1wiXG4gICAgICAgICAgICBbc3R5bGUudmlzaWJpbGl0eV09XCJyb3cuaGFzQ2hpbGRyZW4gPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGUocm93Lm5vZGUsICRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSA/ICdDb2xsYXBzZScgOiAnRXhwYW5kJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPlxuICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb247IGNvbnRleHQ6IHsgY29sb3I6IHJvdy5ub2RlLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZW5hbWluZ0lkID09PSByb3cubm9kZS5pZDsgZWxzZSBuYW1lVHBsXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBzaXplPVwiMVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9sZGVyLXJlbmFtZS1pbnB1dF09XCJyb3cubm9kZS5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJyZW5hbWVNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLXctZnVsbCBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkIGNxYS1ib3JkZXIgY3FhLWJnLXdoaXRlIGNxYS10ZXh0LXNtIGNxYS1zaGFkb3ctc20gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtcmluZy0xXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKGlzUmVuYW1lRHJhZnRWYWxpZCAmJiAhcmVuYW1lTGltaXRGbGFzaClcbiAgICAgICAgICAgICAgICA/ICdjcWEtYm9yZGVyLW5ldXRyYWwtMzAwIGZvY3VzOmNxYS1ib3JkZXItaW5kaWdvLTQwMCBmb2N1czpjcWEtcmluZy1pbmRpZ28tMjAwJ1xuICAgICAgICAgICAgICAgIDogJ2NxYS1ib3JkZXItWyNFRjQ0NDRdIGZvY3VzOmNxYS1ib3JkZXItWyNFRjQ0NDRdIGZvY3VzOmNxYS1yaW5nLVsjRkNBNUE1XSdcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiIWlzUmVuYW1lRHJhZnRWYWxpZCB8fCByZW5hbWVMaW1pdEZsYXNoXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZW5hbWVEcmFmdFwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUmVuYW1lS2V5KCRldmVudCwgcm93Lm5vZGUpXCJcbiAgICAgICAgICAgICAgKGtleXByZXNzKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgIChrZXl1cCk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJjb21taXRSZW5hbWUocm93Lm5vZGUpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbmFtZVRwbD5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdGV4dC1zbSBjcWEtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiaXNTZWxlY3RlZChyb3cubm9kZS5pZCkgPyAnIzNGNDNFRScgOiAnIzRDNEM1MSdcIlxuICAgICAgICAgICAgICAoZGJsY2xpY2spPVwiYmVnaW5SZW5hbWUocm93Lm5vZGUsICRldmVudClcIlxuICAgICAgICAgICAgPnt7IHJvdy5ub2RlLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDwhLS0gQ291bnQgc2hvd24gYXQgcmVzdDsgaGlkZGVuIG9uIHJvdyBob3ZlciB3aGVuIGRlbGV0ZSBpcyBhbGxvd2VkIC0tPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInNob3dDb3VudHMgJiYgcm93Lm5vZGUuY291bnQgIT0gbnVsbFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10YWJ1bGFyLW51bXMgY3FhLW1sLTFcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpID8gJyMzRjQzRUUnIDogJyM0QzRDNTEnXCJcbiAgICAgICAgICAgIFtjbGFzcy5ncm91cC1ob3ZlcjpjcWEtaGlkZGVuXT1cImFsbG93RGVsZXRlXCJcbiAgICAgICAgICA+e3sgcm93Lm5vZGUuY291bnQgfX08L3NwYW4+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc0FueUNvbnRleHRBY3Rpb25cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1wLTAuNSBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctbmV1dHJhbC0yMDBcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpIHx8IGNvbnRleHRNZW51Rm9sZGVySWQgPT09IHJvdy5ub2RlLmlkID8gJyMzRjQzRUUnIDogJyM0QzRDNTEnXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtaGlkZGVuXT1cImNvbnRleHRNZW51Rm9sZGVySWQgIT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5ncm91cC1ob3ZlcjpjcWEtaW5saW5lLWZsZXhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWlubGluZS1mbGV4XT1cImNvbnRleHRNZW51Rm9sZGVySWQgPT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29udGV4dE1lbnUocm93Lm5vZGUsICRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT3BlbiBhY3Rpb25zIGZvciAnICsgcm93Lm5vZGUubmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidtZW51J1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImNvbnRleHRNZW51Rm9sZGVySWQgPT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+bW9yZV9ob3JpejwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIFJvb3QtbGV2ZWwgcGFnaW5hdGlvbiBpcyBub3cgZHJpdmVuIGJ5IHNjcm9sbCAoc2VlIGAoc2Nyb2xsKWAgb24gdGhlXG4gICAgICAgICAgIHRyZWUgY29udGFpbmVyIGFib3ZlKS4gUGVyLWZvbGRlciBjaGlsZHJlbiByZXRhaW4gdGhlIGV4cGxpY2l0XG4gICAgICAgICAgIFwiTG9hZCBtb3JlXCIgYnV0dG9uIHJlbmRlcmVkIGluc2lkZSB0aGUgcm93cyBsb29wIGFib3ZlLCBzaW5jZVxuICAgICAgICAgICBzdWJ0cmVlcyBhcmVuJ3QgaW5kZXBlbmRlbnRseSBzY3JvbGxhYmxlLiAtLT5cbiAgICAgIDwhLS0gUGFnaW5hdGlvbiBzcGlubmVyIOKAlCB2aXNpYmxlIG9ubHkgd2hlbiBmZXRjaGluZyBhbiBhZGRpdGlvbmFsIHBhZ2VcbiAgICAgICAgICAgb2Ygcm9vdHMgKGZvbGRlcnMubGVuZ3RoID4gMCBkaXN0aW5ndWlzaGVzIGZyb20gaW5pdGlhbC1sb2FkIGNhc2UpLiAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJyb290Rm9sZGVyc0xvYWRpbmcgJiYgZm9sZGVycy5sZW5ndGggPiAwICYmICFzZWFyY2hWYWx1ZT8udHJpbSgpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktMlwiXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE0XCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERpdmlkZXIgYmV0d2VlbiBmb2xkZXIgdHJlZSBhbmQgcGlubmVkIFVub3JnYW5pc2VkIHRhYiAtLT5cbiAgICA8ZGl2XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgY2xhc3M9XCJjcWEtbXgtMyBjcWEtc2hyaW5rLTBcIlxuICAgICAgc3R5bGU9XCJoZWlnaHQ6IDFweDsgYmFja2dyb3VuZC1jb2xvcjogI0U1RTdFQjsgbWFyZ2luLXRvcDogNnB4OyBtYXJnaW4tYm90dG9tOiA2cHg7XCJcbiAgICA+PC9kaXY+XG5cbiAgICA8IS0tIFVub3JnYW5pc2VkIOKAlCBwaW5uZWQgYmVsb3cgdGhlIHNjcm9sbGFibGUgZm9sZGVyIHRyZWUgc28gaXQgc3RheXMgdmlzaWJsZSByZWdhcmRsZXNzIG9mIGZvbGRlciBjb3VudCAtLT5cbiAgICA8ZGl2XG4gICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChudWxsKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtYmctaW5kaWdvLTUwIGNxYS1yZWxhdGl2ZSBjcWEtc2hyaW5rLTBcIlxuICAgICAgW2NsYXNzLmNxYS1iZy1pbmRpZ28tNTBdPVwiaXNTZWxlY3RlZChudWxsKVwiXG4gICAgICBbY3FhRm9sZGVyRHJvcF09XCJudWxsXCJcbiAgICAgIFtkcm9wRW5hYmxlZF09XCJhbGxvd0Ryb3BcIlxuICAgICAgKHRlc3RzRHJvcHBlZCk9XCJyb3dEcm9wcGVkKG51bGwsICRldmVudClcIlxuICAgICAgKGZvbGRlckRyb3BwZWQpPVwib25Gb2xkZXJSb3dEcm9wcGVkKG51bGwsICRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0VW5vcmdhbmlzZWQoKVwiXG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJpc1NlbGVjdGVkKG51bGwpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMCBjcWEtdG9wLTAgY3FhLWJvdHRvbS0wIGNxYS13LVszcHhdIGNxYS1iZy1pbmRpZ28tNjAwXCJcbiAgICAgID48L3NwYW4+XG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImlzU2VsZWN0ZWQobnVsbCkgPyAnIzNGNDNFRScgOiAnIzRDNEM1MSdcIiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5pbmJveDwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXRleHQtc21cIiBbc3R5bGUuY29sb3JdPVwiaXNTZWxlY3RlZChudWxsKSA/ICcjM0Y0M0VFJyA6ICcjNEM0QzUxJ1wiPnt7IGxhYmVscy51bm9yZ2FuaXNlZCB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0NvdW50c1wiIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRhYnVsYXItbnVtc1wiIFtzdHlsZS5jb2xvcl09XCJpc1NlbGVjdGVkKG51bGwpID8gJyMzRjQzRUUnIDogJyM0QzRDNTEnXCI+e3sgdW5vcmdhbmlzZWRDb3VudCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9sZGVyIGNvbnRleHQgbWVudSAocmlnaHQtY2xpY2sgLyBlbGxpcHNpcykuIEEgMMOXMCBmaXhlZC1wb3NpdGlvblxuICAgICAgICAgYW5jaG9yIGF0IHRoZSBjbGljayBjb29yZHMgZHJpdmVzIGEgY2RrQ29ubmVjdGVkT3ZlcmxheTsgQ0RLJ3NcbiAgICAgICAgIGZsZXhpYmxlLWNvbm5lY3RlZCBwb3NpdGlvbmluZyBhdXRvLWZsaXBzIHVwL2xlZnQgd2hlbiB0aGUgbWVudVxuICAgICAgICAgd291bGQgb3ZlcmZsb3cgdGhlIHZpZXdwb3J0IChsYXN0LWZvbGRlci1uZWFyLWJvdHRvbSBjYXNlKS4gLS0+XG4gICAgPGRpdiAjY3R4QW5jaG9yIGNka092ZXJsYXlPcmlnaW5cbiAgICAgICAgIGNsYXNzPVwiY3FhLWZpeGVkIGNxYS13LTAgY3FhLWgtMCBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnhcIlxuICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnlcIj48L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwiY3R4QW5jaG9yXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJjb250ZXh0TWVudUZvbGRlcklkICE9PSBudWxsXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cImNvbnRleHRNZW51UG9zaXRpb25zXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwiZmFsc2VcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnNdPVwiZmFsc2VcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQdXNoXT1cInRydWVcIlxuICAgICAgKG92ZXJsYXlPdXRzaWRlQ2xpY2spPVwib25PdmVybGF5T3V0c2lkZUNsaWNrKClcIlxuICAgICAgKGRldGFjaCk9XCJjbG9zZUNvbnRleHRNZW51KClcIlxuICAgID5cbiAgICAgIDwhLS0gVGhlIGxpYidzIHRhaWx3aW5kIGNvbmZpZyBzZXRzIGltcG9ydGFudDogJy5jcWEtdWktcm9vdCcsIHdoaWNoXG4gICAgICAgICAgIGVtaXRzIGRlc2NlbmRhbnQgc2VsZWN0b3JzIGxpa2UgYC5jcWEtdWktcm9vdCAuY3FhLWJnLXdoaXRlYC5cbiAgICAgICAgICAgQ0RLIE92ZXJsYXkgdGVsZXBvcnRzIHRoaXMgdGVtcGxhdGUgaW50byB0aGUgZ2xvYmFsIG92ZXJsYXlcbiAgICAgICAgICAgY29udGFpbmVyIChvdXRzaWRlIHRoZSBob3N0J3MgY3FhLXVpLXJvb3QpLCBzbyB3ZSB3cmFwIHRoZSBtZW51IGluXG4gICAgICAgICAgIGFuIGFuY2VzdG9yIGNxYS11aS1yb290IGRpdiB0byByZS1lc3RhYmxpc2ggdGhlIHV0aWxpdHkgc2NvcGUuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIHJvbGU9XCJtZW51XCJcbiAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctWzE4MHB4XSBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLW5ldXRyYWwtMjAwIGNxYS1yb3VuZGVkLW1kIGNxYS1zaGFkb3ctbGcgY3FhLXB5LTFcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgKGNvbnRleHRtZW51KT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9sZGVyQnlJZChjb250ZXh0TWVudUZvbGRlcklkKSBhcyBtZW51Tm9kZVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHRDcmVhdGVTdWJmb2xkZXIobWVudU5vZGUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+Y3JlYXRlX25ld19mb2xkZXI8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgbGFiZWxzLmZvbGRlck1lbnVDcmVhdGVTdWJmb2xkZXIgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJhbGxvd1JlbmFtZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS13LWZ1bGwgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29udGV4dFJlbmFtZShtZW51Tm9kZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51UmVuYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dNb3ZlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0TW92ZShtZW51Tm9kZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5kcml2ZV9maWxlX21vdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgbGFiZWxzLmZvbGRlck1lbnVNb3ZlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dEdXBsaWNhdGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHREdXBsaWNhdGUobWVudU5vZGUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51RHVwbGljYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhbGxvd0RlbGV0ZSAmJiAoYWxsb3dDcmVhdGUgfHwgYWxsb3dSZW5hbWUgfHwgYWxsb3dNb3ZlIHx8IGFsbG93RHVwbGljYXRlKVwiIGNsYXNzPVwiY3FhLWgtcHggY3FhLWJnLW5ldXRyYWwtMjAwIGNxYS1teS0xXCI+PC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJhbGxvd0RlbGV0ZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS13LWZ1bGwgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1yZWQtNjAwIGhvdmVyOmNxYS1iZy1yZWQtNTAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0RGVsZXRlKG1lbnVOb2RlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51RGVsZXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICA8L25nLWNvbnRhaW5lcj5cbjwvYXNpZGU+XG4iXX0=
|
|
709
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9sZGVyLXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9mb2xkZXItc2lkZWJhci9mb2xkZXItc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL2ZvbGRlci1zaWRlYmFyL2ZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsc0JBQXNCLEdBSXZCLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7QUFvQjFDLE1BQU0sT0FBTyxzQkFBc0I7SUF3R2pDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdkdqQyxZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUMzQixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLHNCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDNUIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixtQkFBYyxHQUFZLElBQUksQ0FBQztRQUMvQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixXQUFNLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxD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QWdCO3NCQUF4QixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFJRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBR0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUdHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQXVYUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQU05QixRQUFRO3NCQURQLFlBQVk7dUJBQUMseUJBQXlCO2dCQXdHdkMsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIE1vZHVsYXJMYWJlbHMsXG59IGZyb20gJy4uL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcblxuLyoqIEEgcm93IGluIHRoZSBmbGF0dGVuZWQgc2lkZWJhciB0cmVlLiBga2luZGAgZGlzdGluZ3Vpc2hlcyByZWFsIGZvbGRlciByb3dzXG4gKiAgZnJvbSB0aGUgbGF6eS1sb2FkIGFmZm9yZGFuY2VzICgnbG9hZGluZycgc3Bpbm5lciwgJ2xvYWQtbW9yZScgYnV0dG9uKSB0aGF0XG4gKiAgdGhlIGByb3dzYCBnZXR0ZXIgaW50ZXJsZWF2ZXMgaW5zaWRlIGFuIGV4cGFuZGVkIHN1YnRyZWUuICovXG5pbnRlcmZhY2UgUmVuZGVyTm9kZSB7XG4gIGtpbmQ6ICdmb2xkZXInIHwgJ2xvYWRpbmcnIHwgJ2xvYWQtbW9yZSc7XG4gIG5vZGU6IEZvbGRlck5vZGU7XG4gIGRlcHRoOiBudW1iZXI7XG4gIHZpc2libGU6IGJvb2xlYW47XG4gIGhhc0NoaWxkcmVuOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZm9sZGVyLXNpZGViYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9sZGVyLXNpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGb2xkZXJTaWRlYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleHBhbmRlZEZvbGRlcklkczogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgdW5vcmdhbmlzZWRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgYWxsb3dDcmVhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd1JlbmFtZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93RGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dNb3ZlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dEdXBsaWNhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0Ryb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q291bnRzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxhYmVsczogTW9kdWxhckxhYmVscyA9IHsgLi4uREVGQVVMVF9NT0RVTEFSX0xBQkVMUyB9O1xuICAvKiogV2hlbiB0cnVlLCB0aGUgc2lkZWJhciBlbWl0cyBgc2VhcmNoQ2hhbmdlYCBhbmQgc2tpcHMgaXRzIGxvY2FsIG5hbWUgZmlsdGVyXG4gICAqICDigJQgdGhlIGhvc3QgaXMgZXhwZWN0ZWQgdG8gc3dhcCBgZm9sZGVyc2Agd2l0aCBzZXJ2ZXItc2lkZSBzZWFyY2ggcmVzdWx0cy5cbiAgICogIERlZmF1bHQga2VlcHMgdGhlIGxlZ2FjeSBjbGllbnQtc2lkZSBiZWhhdmlvdXIgZm9yIGNhbGxlcnMgdGhhdCBoYXZlbid0XG4gICAqICBvcHRlZCBpbnRvIGxhenkgbG9hZGluZyB5ZXQuICovXG4gIEBJbnB1dCgpIHNlcnZlclNpZGVTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEJhY2tlbmQtcmVwb3J0ZWQgdG90YWwgcm9vdCBmb2xkZXJzLiBXaGVuIGBmb2xkZXJzLmxlbmd0aCA8IHJvb3RUb3RhbGAgdGhlXG4gICAqICBzaWRlYmFyIHJlbmRlcnMgYSB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIiBhZmZvcmRhbmNlIGFmdGVyIHRoZSB0cmVlLiAqL1xuICBASW5wdXQoKSByb290VG90YWw6IG51bWJlciA9IDA7XG4gIC8qKiBUcnVlIHdoaWxlIGEgc2VydmVyLXNpZGUgZm9sZGVyLXNlYXJjaCByZXF1ZXN0IGlzIGluIGZsaWdodC4gVGhlIHNpZGViYXJcbiAgICogIHNob3dzIGEgc3Bpbm5lciBuZXh0IHRvIHRoZSBzZWFyY2ggaW5wdXQgc28gdGhlIHVzZXIgY2FuIHRlbGwgdHlwaW5nXG4gICAqICBoYXMgYmVlbiByZWdpc3RlcmVkLiAqL1xuICBASW5wdXQoKSBmb2xkZXJTZWFyY2hMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIGEgcm9vdC1wYWdlIGZldGNoIGlzIGluIGZsaWdodCAoaW5pdGlhbCBsb2FkIE9SIHNjcm9sbC1kcml2ZW5cbiAgICogIHBhZ2luYXRpb24pLiBXaGVuIHNldCB3aXRoIG5vIGZvbGRlcnMgeWV0LCB0aGUgc2lkZWJhciBzaG93cyBhIGNlbnRlcmVkXG4gICAqICBzcGlubmVyOyB3aGVuIHNldCBkdXJpbmcgcGFnaW5hdGlvbiwgYSBzbWFsbCBzcGlubmVyIGFwcGVhcnMgYXQgdGhlXG4gICAqICBib3R0b20gb2YgdGhlIHRyZWUuICovXG4gIEBJbnB1dCgpIHJvb3RGb2xkZXJzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBmb2xkZXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckV4cGFuc2lvblRvZ2dsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgZXhwYW5kZWQ6IGJvb2xlYW4gfT4oKTtcbiAgLyoqIExhenktbG9hZDogZmlyZXMgd2hlbiB0aGUgdXNlciBleHBhbmRzIGEgbm9kZSB3aG9zZSBjaGlsZHJlbiBoYXZlbid0IGJlZW5cbiAgICogIGZldGNoZWQgeWV0IChgaGFzQ2hpbGRyZW4gPT09IHRydWUgJiYgbG9hZGVkUGFnZXMgPT09IHVuZGVmaW5lZGApLiBIb3N0XG4gICAqICByZXNwb25kcyBieSBjYWxsaW5nIGl0cyBgbG9hZEZvbGRlckNoaWxkcmVuKGlkLCAwKWAuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDaGlsZHJlblJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogTGF6eS1sb2FkOiBmaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgcGVyLWZvbGRlciBcIkxvYWQgbW9yZVwiIHJvdy5cbiAgICogIEhvc3QgcmVzcG9uZHMgYnkgY2FsbGluZyBgbG9hZEZvbGRlckNoaWxkcmVuKGlkLCBuZXh0UGFnZSlgLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyTG9hZE1vcmVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgbmV4dFBhZ2U6IG51bWJlciB9PigpO1xuICAvKiogRGVib3VuY2VkIHNlYXJjaC1pbnB1dCB2YWx1ZS4gQWx3YXlzIGVtaXR0ZWQ7IG9ubHkgY29uc3VtZWQgYnkgaG9zdHMgdGhhdFxuICAgKiAgc2V0IGBzZXJ2ZXJTaWRlU2VhcmNoPXRydWVgIHRvIHJlLWZldGNoIHRoZSB0cmVlIGZyb20gdGhlIGJhY2tlbmQuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIExhenktbG9hZDogdXNlciBjbGlja2VkIHRoZSB0b3AtbGV2ZWwgXCJMb2FkIG1vcmVcIiBhZmZvcmRhbmNlIGZvciByb290cy4gKi9cbiAgQE91dHB1dCgpIHJvb3RMb2FkTW9yZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGhvc3QgY29tcGxldGVzIGZvbGRlciBjcmVhdGlvbiAoZS5nLiwgaW5saW5lIHJlbmFtZSBmbG93KS4gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhcmVudElkOiBudW1iZXIgfCBudWxsOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiK1wiIGhlYWRlciBidXR0b24uIEhvc3Qgc2hvdWxkIG9wZW4gYSBjcmVhdGlvbiBtb2RhbC4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckNyZWF0ZVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICAvKiogQ2FycmllcyB0aGUgZnVsbCByZW5hbWVkIGZvbGRlciBub2RlICsgcGFyZW50IGlkIHNvIGhvc3RzIGNhbiBpc3N1ZSBjb21wbGV0ZSB1cGRhdGUgcmVxdWVzdHMuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJSZW5hbWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2xkZXJSZW5hbWVkUGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGZvbGRlckRlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlciB9PigpO1xuICAvKiogVXNlciBwaWNrZWQgXCJNb3ZlIGZvbGRlclwiIGZyb20gdGhlIGNvbnRleHQgbWVudS4gSG9zdCBvcGVucyB0aGUgZm9sZGVyIHBpY2tlci4gKi9cbiAgQE91dHB1dCgpIGZvbGRlck1vdmVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlciB9PigpO1xuICAvKiogVXNlciBwaWNrZWQgXCJEdXBsaWNhdGUgZm9sZGVyXCIgZnJvbSB0aGUgY29udGV4dCBtZW51LiBIb3N0IGNsb25lcyB0aGUgc3VidHJlZSAodGVzdHMgcmVmZXJlbmNlZCwgbm90IGNvcGllZCkuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgdGVzdHNEcm9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj47IHRhcmdldEZvbGRlcklkOiBudW1iZXIgfCBudWxsIH0+KCk7XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9sZGVyIHJvdyBpcyBkcm9wcGVkIG9udG8gYW5vdGhlciBmb2xkZXIgKG9yIHRoZSBVbm9yZ2FuaXNlZCByb3cpLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRHJvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogbnVtYmVyOyBuZXdQYXJlbnRJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICBAT3V0cHV0KCkgY29sbGFwc2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgLyoqIERlYm91bmNlIHRpbWVyIGZvciBgc2VhcmNoQ2hhbmdlYCBlbWlzc2lvbnM7IGNsZWFyZWQgb24gZWFjaCBrZXlzdHJva2Ugc29cbiAgICogIHRoZSBob3N0IG9ubHkgcmUtZmV0Y2hlcyBvbmNlIHRoZSB1c2VyIHBhdXNlcyB0eXBpbmcuICovXG4gIHByaXZhdGUgc2VhcmNoRW1pdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfTVMgPSAzMDA7XG4gIHJlbmFtaW5nSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICByZW5hbWVEcmFmdDogc3RyaW5nID0gJyc7XG4gIC8qKiBJbmxpbmUgcmVuYW1lIHVzZXMgdGhlIHNhbWUgbmFtZSBydWxlcyBhcyB0aGUgTmV3IEZvbGRlciBkaWFsb2cuICovXG4gIHJlYWRvbmx5IHJlbmFtZU1heExlbmd0aDogbnVtYmVyID0gMjA7XG4gIC8qKiBUcmFuc2llbnQgZmxhZzogdHVybnMgdGhlIHJlbmFtZSBpbnB1dCByZWQgYnJpZWZseSB3aGVuIHRoZSB1c2VyIGtleXN0cm9rZXNcbiAgICogIHdoaWxlIGFscmVhZHkgYXQgYHJlbmFtZU1heExlbmd0aGAsIHNvIHRoZSBzaWxlbnQgbWF4bGVuZ3RoIGNsYW1wIGdldHMgYVxuICAgKiAgdmlzaWJsZSBcInlvdSd2ZSBoaXQgdGhlIGNhcFwiIHNpZ25hbC4gQ2xlYXJlZCBieSBgcmVuYW1lTGltaXRGbGFzaFRpbWVyYC4gKi9cbiAgcmVuYW1lTGltaXRGbGFzaCA9IGZhbHNlO1xuICBwcml2YXRlIHJlbmFtZUxpbWl0Rmxhc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVOQU1FX0xJTUlUX0ZMQVNIX01TID0gNjAwO1xuXG4gIC8qKiBJZCBvZiB0aGUgZm9sZGVyIHdob3NlIGNvbnRleHQgbWVudSBpcyBvcGVuLCBvciBudWxsIHdoZW4gY2xvc2VkLiAqL1xuICBjb250ZXh0TWVudUZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFN1cHByZXNzIG91dHNpZGUtY2xpY2sgaGFuZGxpbmcgdW50aWwgdGhpcyB0aW1lc3RhbXA7IHByb3RlY3RzIGFnYWluc3QgdGhlXG4gICAqICByaWdodC1jbGljayB0aGF0IG9wZW5zIHRoZSBtZW51IGFsc28gYmVpbmcgaW50ZXJwcmV0ZWQgYXMgYW4gb3V0c2lkZSBjbGljay4gKi9cbiAgcHJpdmF0ZSBfc3VwcHJlc3NPdXRzaWRlQ2xpY2tVbnRpbCA9IDA7XG4gIC8qKiBWaWV3cG9ydC1hbmNob3JlZCBwb3NpdGlvbiAoY2xpZW50IGNvb3JkaW5hdGVzKSBmb3IgdGhlIGZsb2F0aW5nIG1lbnUuXG4gICAqICBEcml2ZXMgdGhlIGludmlzaWJsZSBjZGtPdmVybGF5T3JpZ2luIGFuY2hvcjsgQ0RLIE92ZXJsYXkgdGhlbiBwaWNrcyB0aGVcbiAgICogIGJlc3Qgb2YgYGNvbnRleHRNZW51UG9zaXRpb25zYCBzbyB0aGUgbWVudSBuZXZlciBvdmVyZmxvd3MgdGhlIHZpZXdwb3J0LiAqL1xuICBjb250ZXh0TWVudVBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICAvKiogUG9zaXRpb24gcHJpb3JpdHkgZm9yIHRoZSBDREstb3ZlcmxheS1yZW5kZXJlZCBjb250ZXh0IG1lbnUuIENESyB0cmllcyBlYWNoXG4gICAqICBpbiBvcmRlciBhbmQgdXNlcyB0aGUgZmlyc3Qgb25lIHRoYXQgZml0cyDigJQgc28gdGhlIG1lbnUgb3BlbnMgZG93bndhcmQgYnlcbiAgICogIGRlZmF1bHQgYW5kIGZsaXBzIHVwIC8gbGVmdCB3aGVuIHRvbyBjbG9zZSB0byB0aGUgYm90dG9tIG9yIHJpZ2h0IGVkZ2UuICovXG4gIHJlYWRvbmx5IGNvbnRleHRNZW51UG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfSxcbiAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCAgICBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nIH0sXG4gICAgeyBvcmlnaW5YOiAnZW5kJywgICBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdlbmQnLCAgIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgIHsgb3JpZ2luWDogJ2VuZCcsICAgb3JpZ2luWTogJ3RvcCcsICAgIG92ZXJsYXlYOiAnZW5kJywgICBvdmVybGF5WTogJ2JvdHRvbScgfSxcbiAgXTtcblxuICAvKiogUGVuZGluZyBhdXRvLWV4cGFuZCB0aW1lcnMgd2hpbGUgYSBmb2xkZXIgZHJhZyBpcyBob3ZlcmVkIG92ZXIgY29sbGFwc2VkIHJvd3MuICovXG4gIHByaXZhdGUgZHJhZ0V4cGFuZFRpbWVycyA9IG5ldyBNYXA8bnVtYmVyLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0VYUEFORF9ERUxBWV9NUyA9IDYwMDtcbiAgLyoqIElkIG9mIHRoZSBmb2xkZXIgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQ7IHVzZWQgdG8gc2tpcCBjeWNsZSB0YXJnZXRzIGFuZCBzb3VyY2UtaG92ZXIgZXhwYW5zaW9uLiAqL1xuICBwcml2YXRlIGFjdGl2ZUZvbGRlckRyYWdJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGdldCBleHBhbmRlZFNldCgpOiBTZXQ8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQodGhpcy5leHBhbmRlZEZvbGRlcklkcyB8fCBbXSk7XG4gIH1cblxuICAvKiogRmxhdHRlbmVkLCBkZXB0aC1hd2FyZSBsaXN0IG9mIHJvd3MgdG8gcmVuZGVyIGluIG9yZGVyLiBBbmNlc3RvcnMgb2YgbWF0Y2hlcyBhcmUga2VwdC4gKi9cbiAgZ2V0IHJvd3MoKTogUmVuZGVyTm9kZVtdIHtcbiAgICAvLyBTZXJ2ZXItc2lkZSBtb2RlOiBob3N0IHByZS1maWx0ZXJzIGBmb2xkZXJzYDsgd2Ugc2tpcCB0aGUgbG9jYWwgZmlsdGVyIHNvXG4gICAgLy8gcmVzdWx0cyBhcmVuJ3QgZG91YmxlLWZpbHRlcmVkIChiYWNrZW5kIG1heSB1c2UgZGlmZmVyZW50IGZ1enp5IGxvZ2ljKS5cbiAgICBjb25zdCBsb2NhbFNlYXJjaCA9IHRoaXMuc2VydmVyU2lkZVNlYXJjaFxuICAgICAgPyAnJ1xuICAgICAgOiAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkU2V0O1xuICAgIGNvbnN0IGtlZXBTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAobG9jYWxTZWFyY2gpIHtcbiAgICAgIGNvbnN0IG1hcmsgPSAobm9kZXM6IEZvbGRlck5vZGVbXSwgYW5jZXN0b3JzOiBudW1iZXJbXSk6IHZvaWQgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkID0gKG4ubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb2NhbFNlYXJjaCk7XG4gICAgICAgICAgY29uc3QgY2hpbGRBbmNlc3RvcnMgPSBbLi4uYW5jZXN0b3JzLCBuLmlkXTtcbiAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFuY2VzdG9ycykga2VlcFNldC5hZGQoYSk7XG4gICAgICAgICAgICBrZWVwU2V0LmFkZChuLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG4uY2hpbGRyZW4/Lmxlbmd0aCkgbWFyayhuLmNoaWxkcmVuLCBjaGlsZEFuY2VzdG9ycyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBtYXJrKHRoaXMuZm9sZGVycywgW10pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dDogUmVuZGVyTm9kZVtdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyLCBwYXJlbnRWaXNpYmxlOiBib29sZWFuKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmlzaWJsZSA9ICFsb2NhbFNlYXJjaCB8fCBrZWVwU2V0LmhhcyhuLmlkKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHBhcmVudFZpc2libGUgJiYgc2VhcmNoVmlzaWJsZTtcbiAgICAgICAgLy8gU2hvdyB0aGUgY2hldnJvbiB3aGVuIHRoZSBiYWNrZW5kIHNheXMgdGhpcyBmb2xkZXIgaGFzIGNoaWxkcmVuXG4gICAgICAgIC8vIChsYXp5LWxvYWQ6IGNoaWxkcmVuIG1heSBub3QgYmUgZmV0Y2hlZCB5ZXQpIE9SIHdoZW4gY2hpbGRyZW4gYXJlXG4gICAgICAgIC8vIGFscmVhZHkgcG9wdWxhdGVkIChlYWdlciBtb2RlIGZvciBjYWxsZXJzIHRoYXQgcHJlLWJ1aWxkIHRoZSB0cmVlKS5cbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIW4uaGFzQ2hpbGRyZW4gfHwgISEobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIG91dC5wdXNoKHsga2luZDogJ2ZvbGRlcicsIG5vZGU6IG4sIGRlcHRoLCB2aXNpYmxlLCBoYXNDaGlsZHJlbiB9KTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRCeVNlYXJjaCA9ICEhbG9jYWxTZWFyY2ggJiYga2VlcFNldC5oYXMobi5pZCk7XG4gICAgICAgIGNvbnN0IGlzTm9kZUV4cGFuZGVkID0gZXhwYW5kZWQuaGFzKG4uaWQpIHx8IGV4cGFuZGVkQnlTZWFyY2g7XG4gICAgICAgIGlmICghaXNOb2RlRXhwYW5kZWQgfHwgIWhhc0NoaWxkcmVuKSBjb250aW51ZTtcbiAgICAgICAgLy8gUmVjdXJzZSBmb3IgY2hpbGRyZW4gdGhhdCBhcmUgYWxyZWFkeSBpbiBtZW1vcnkuXG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICB3YWxrKG4uY2hpbGRyZW4sIGRlcHRoICsgMSwgdmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXBwZW5kIGxhenktbG9hZCBhZmZvcmRhbmNlcyBhdCB0aGUgZW5kIG9mIHRoZSBvcGVuIHN1YnRyZWU6XG4gICAgICAgIC8vIC0gJ2xvYWRpbmcnIHdoaWxlIGEgY2hpbGRyZW4tcGFnZSBmZXRjaCBpcyBpbiBmbGlnaHQuXG4gICAgICAgIC8vIC0gJ2xvYWQtbW9yZScgd2hlbiBtb3JlIGNoaWxkcmVuIGV4aXN0IG9uIHRoZSBiYWNrZW5kIHRoYW4gd2UgaGF2ZS5cbiAgICAgICAgaWYgKG4uY2hpbGRyZW5Mb2FkaW5nKSB7XG4gICAgICAgICAgb3V0LnB1c2goeyBraW5kOiAnbG9hZGluZycsIG5vZGU6IG4sIGRlcHRoOiBkZXB0aCArIDEsIHZpc2libGUsIGhhc0NoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgobi5jaGlsZHJlbj8ubGVuZ3RoID8/IDApIDwgKG4udG90YWxDaGlsZHJlbiA/PyAwKSkge1xuICAgICAgICAgIG91dC5wdXNoKHsga2luZDogJ2xvYWQtbW9yZScsIG5vZGU6IG4sIGRlcHRoOiBkZXB0aCArIDEsIHZpc2libGUsIGhhc0NoaWxkcmVuOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayh0aGlzLmZvbGRlcnMsIDAsIHRydWUpO1xuICAgIHJldHVybiBvdXQuZmlsdGVyKHIgPT4gci52aXNpYmxlKTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkU2V0LmhhcyhpZCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlkID09IG51bGwgJiYgdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBpZCAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCAhPSBudWxsICYmIGlkID09PSB0aGlzLnNlbGVjdGVkRm9sZGVySWQ7XG4gIH1cblxuICBvblRvZ2dsZShuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBleHBhbmRlZCA9ICF0aGlzLmlzRXhwYW5kZWQobi5pZCk7XG4gICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogbi5pZCwgZXhwYW5kZWQgfSk7XG4gICAgLy8gTGF6eSBmZXRjaDogaWYgdGhlIHVzZXIgaXMgZXhwYW5kaW5nIGEgbm9kZSB3aG9zZSBjaGlsZHJlbiBoYXZlbid0IGJlZW5cbiAgICAvLyBsb2FkZWQgeWV0LCBhc2sgdGhlIGhvc3QgdG8gZmV0Y2ggdGhlbS4gU2tpcCB3aGVuIG5vdCBsYXp5IChsb2FkZWRQYWdlc1xuICAgIC8vIGFscmVhZHkgc2V0KSBvciBub3QgZXhwYW5kaW5nLlxuICAgIGlmIChleHBhbmRlZCAmJiBuLmhhc0NoaWxkcmVuICYmIG4ubG9hZGVkUGFnZXMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mb2xkZXJDaGlsZHJlblJlcXVlc3RlZC5lbWl0KG4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWFyY2ggaW5wdXQgaGFuZGxlcjogdXBkYXRlcyB0aGUgbG9jYWwgYHNlYXJjaFZhbHVlYCBpbW1lZGlhdGVseSAoc28gdGhlXG4gICAqICBpbnB1dCBzdGF5cyByZXNwb25zaXZlKSBhbmQgZGVib3VuY2VzIGBzZWFyY2hDaGFuZ2VgIGVtaXNzaW9ucyBzbyBhIGhvc3RcbiAgICogIGRvaW5nIHNlcnZlci1zaWRlIHNlYXJjaCBmaXJlcyBhdCBtb3N0IG9uZSByZXF1ZXN0IHBlciBwYXVzZS4gKi9cbiAgb25TZWFyY2hJbnB1dCh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGVybTtcbiAgICBpZiAodGhpcy5zZWFyY2hFbWl0VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaEVtaXRUaW1lcik7XG4gICAgdGhpcy5zZWFyY2hFbWl0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICB0aGlzLnNlYXJjaEVtaXRUaW1lciA9IG51bGw7XG4gICAgfSwgRm9sZGVyU2lkZWJhckNvbXBvbmVudC5TRUFSQ0hfREVCT1VOQ0VfTVMpO1xuICB9XG5cbiAgLyoqIFNlYXJjaCBpbnB1dCBjbGVhciBoYW5kbGVyOiBmbHVzaGVzIHRoZSBkZWJvdW5jZSBzbyB0aGUgaG9zdCBzZWVzIGFuXG4gICAqICBlbXB0eSB0ZXJtIGltbWVkaWF0ZWx5IGFuZCBjYW4gcmVzdG9yZSB0aGUgbGF6eSB0cmVlLiAqL1xuICBvblNlYXJjaENsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICBpZiAodGhpcy5zZWFyY2hFbWl0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaEVtaXRUaW1lcik7XG4gICAgICB0aGlzLnNlYXJjaEVtaXRUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoJycpO1xuICB9XG5cbiAgLyoqIExhenktbG9hZDogdXNlciBjbGlja2VkIHRoZSBwZXItZm9sZGVyIFwiTG9hZCBtb3JlXCIgcm93LiBUaGUgc2lkZWJhciB0cmFja3NcbiAgICogIHBhZ2luYXRpb24gdmlhIGBub2RlLmxvYWRlZFBhZ2VzYDsgdGhlIG5leHQgcGFnZSBpcyBsb2FkZWRQYWdlcyArIDEuICovXG4gIG9uTG9hZE1vcmUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIGlmIChuLmxvYWRlZFBhZ2VzID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckxvYWRNb3JlUmVxdWVzdGVkLmVtaXQoeyBpZDogbi5pZCwgbmV4dFBhZ2U6IG4ubG9hZGVkUGFnZXMgKyAxIH0pO1xuICB9XG5cbiAgLyoqIENhY2hlZCBgZm9sZGVycy5sZW5ndGhgIGF0IHRoZSBtb21lbnQgd2UgbGFzdCBlbWl0dGVkIGByb290TG9hZE1vcmVSZXF1ZXN0ZWRgLlxuICAgKiAgVXNlZCB0byB0aHJvdHRsZSB0aGUgc2Nyb2xsLWJhc2VkIHBhZ2luYXRpb24gc28gd2UgZG9uJ3QgcmUtZW1pdCB1bnRpbCB0aGVcbiAgICogIGhvc3QgaGFzIGFjdHVhbGx5IGFwcGVuZGVkIGEgbmV3IHBhZ2UuICovXG4gIHByaXZhdGUgbGFzdFJvb3RMb2FkRW1pdHRlZEF0OiBudW1iZXIgPSAtMTtcbiAgLyoqIFRocmVzaG9sZCAocHgpIGZvciBcIm5lYXIgdGhlIGJvdHRvbVwiIOKAlCBlbWl0IGEgbG9hZC1tb3JlIG9uY2UgdGhlIHNjcm9sbFxuICAgKiAgcG9zaXRpb24gaXMgd2l0aGluIHRoaXMgbWFueSBweCBvZiB0aGUgZW5kLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ1JPTExfTE9BRF9USFJFU0hPTERfUFggPSA2NDtcblxuICAvKiogVmVydGljYWwtc2Nyb2xsIGhhbmRsZXIgZm9yIHRoZSByb290LWZvbGRlciBsaXN0LiBGaXJlcyBgcm9vdExvYWRNb3JlUmVxdWVzdGVkYFxuICAgKiAgd2hlbiB0aGUgdXNlciBzY3JvbGxzIHdpdGhpbiB0aGUgdGhyZXNob2xkIG9mIHRoZSBib3R0b20gYW5kIG1vcmUgcm9vdHNcbiAgICogIGFyZSBhdmFpbGFibGUgb24gdGhlIGJhY2tlbmQuIFN1cHByZXNzZWQgZHVyaW5nIHNpZGViYXIgc2VhcmNoLiAqL1xuICBvblRyZWVTY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVmFsdWU/LnRyaW0oKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZvbGRlcnMubGVuZ3RoID49IHRoaXMucm9vdFRvdGFsKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZm9sZGVycy5sZW5ndGggPT09IHRoaXMubGFzdFJvb3RMb2FkRW1pdHRlZEF0KSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBkaXN0YW5jZUZyb21Cb3R0b20gPSBlbC5zY3JvbGxIZWlnaHQgLSAoZWwuc2Nyb2xsVG9wICsgZWwuY2xpZW50SGVpZ2h0KTtcbiAgICBpZiAoZGlzdGFuY2VGcm9tQm90dG9tID4gRm9sZGVyU2lkZWJhckNvbXBvbmVudC5TQ1JPTExfTE9BRF9USFJFU0hPTERfUFgpIHJldHVybjtcbiAgICB0aGlzLmxhc3RSb290TG9hZEVtaXR0ZWRBdCA9IHRoaXMuZm9sZGVycy5sZW5ndGg7XG4gICAgdGhpcy5yb290TG9hZE1vcmVSZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3QobjogRm9sZGVyTm9kZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZW5hbWluZ0lkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQobiA9PSBudWxsID8gbnVsbCA6IG4uaWQpO1xuICB9XG5cbiAgb25TZWxlY3RVbm9yZ2FuaXNlZCgpOiB2b2lkIHtcbiAgICAvLyBTZW50aW5lbDogaG9zdHMgdGhhdCBrZWVwIGFuIFwiVW5vcmdhbmlzZWRcIiBidWNrZXQgY2FuIHRyZWF0IGEgbnVsbCBzZWxlY3Rpb25cbiAgICAvLyBhcyBcInNob3cgdW5vcmdhbmlzZWRcIi4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJvb3QgKG51bGwpIHNlbGVjdGlvbiBwYXR0ZXJuLFxuICAgIC8vIHRoaXMgbWF0Y2hlcyBpdC4gSG9zdCBkZWNpZGVzIHNlbWFudGljcy5cbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQobnVsbCk7XG4gIH1cblxuICBiZWdpblJlbmFtZShuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dSZW5hbWUpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlbmFtaW5nSWQgPSBuLmlkO1xuICAgIHRoaXMucmVuYW1lRHJhZnQgPSBuLm5hbWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5mb2N1c1JlbmFtZUlucHV0KG4uaWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgYWN0aXZlIHJlbmFtZSBkcmFmdCBwYXNzZXMgdGhlIG5hbWUgcnVsZXMgKG5vbi1lbXB0eSwgd2l0aGluIG1heCBsZW5ndGgpLiAqL1xuICBnZXQgaXNSZW5hbWVEcmFmdFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSAodGhpcy5yZW5hbWVEcmFmdCB8fCAnJykudHJpbSgpO1xuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgJiYgdHJpbW1lZC5sZW5ndGggPD0gdGhpcy5yZW5hbWVNYXhMZW5ndGg7XG4gIH1cblxuICBjb21taXRSZW5hbWUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIC8vIERpc2NhcmQgaW52YWxpZCBkcmFmdHMgKGVtcHR5IC8gdG9vIGxvbmcpIGluc3RlYWQgb2YgY29tbWl0dGluZyBhIGJhZCBuYW1lLlxuICAgIC8vIFRoZSB1c2VyIHNlZXMgdGhlIHJlZCBib3JkZXIgd2hpbGUgZWRpdGluZzsgb24gYmx1ciB3ZSByZXZlcnQgdG8gdGhlIG9yaWdpbmFsLlxuICAgIGlmICghdGhpcy5pc1JlbmFtZURyYWZ0VmFsaWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAodGhpcy5yZW5hbWVEcmFmdCB8fCAnJykudHJpbSgpO1xuICAgIGlmIChuYW1lICE9PSBuLm5hbWUpIHtcbiAgICAgIC8vIEVtaXQgdGhlIGZ1bGwgcmVuYW1lZCBub2RlICh3aXRoIHRoZSBuZXcgbmFtZSkgKyBwYXJlbnQgY29udGV4dCBzbyBob3N0cyBjYW5cbiAgICAgIC8vIGNhbGwgYFBVVCAvdGVzdF9jYXNlX2ZvbGRlcnMve2lkfWAgd2l0aG91dCByZS1yZXNvbHZpbmcgZnJvbSB0aGVpciBjYWNoZWQgdHJlZS5cbiAgICAgIGNvbnN0IGZvbGRlcjogRm9sZGVyTm9kZSA9IHsgLi4ubiwgbmFtZSB9O1xuICAgICAgdGhpcy5mb2xkZXJSZW5hbWVkLmVtaXQoe1xuICAgICAgICBmb2xkZXIsXG4gICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkT2Yobi5pZCksXG4gICAgICAgIHByZXZpb3VzTmFtZTogbi5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gIH1cblxuICBjYW5jZWxSZW5hbWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5hbWluZ0lkID0gbnVsbDtcbiAgICB0aGlzLnJlbmFtZURyYWZ0ID0gJyc7XG4gICAgdGhpcy5jbGVhclJlbmFtZUxpbWl0Rmxhc2goKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUmVuYW1lS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgLy8gU3RvcCBidWJibGluZyBzbyB0aGUgcm93J3Mga2V5ZG93biBoYW5kbGVyICh3aGljaCB0cmVhdHMgU3BhY2UvRW50ZXIvQXJyb3dzIGFzXG4gICAgLy8gc2VsZWN0aW9uIC8gdHJlZSBuYXZpZ2F0aW9uKSBjYW4ndCBzd2FsbG93IGNoYXJhY3RlcnMgdHlwZWQgaW50byB0aGUgcmVuYW1lIGlucHV0LlxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBEb24ndCBzd2FsbG93IHRoZSB1c2VyJ3MgZWRpdCBvbiBFbnRlciB3aGVuIHRoZSBkcmFmdCBpcyBpbnZhbGlkIOKAlCBrZWVwXG4gICAgICAvLyB0aGUgaW5wdXQgb3BlbiAocmVkIGJvcmRlciBhbHJlYWR5IHNpZ25hbHMgdGhlIGlzc3VlKSBhbmQgbGV0IHRoZW0gZml4IGl0LlxuICAgICAgaWYgKCF0aGlzLmlzUmVuYW1lRHJhZnRWYWxpZCkgcmV0dXJuO1xuICAgICAgdGhpcy5jb21taXRSZW5hbWUobik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGFueSBvdGhlciBrZXlzdHJva2UsIGRldGVjdCBcInVzZXIgaXMgdHJ5aW5nIHRvIHR5cGUgcGFzdCBtYXhsZW5ndGhcIiBhbmRcbiAgICAvLyBicmllZmx5IGZsYXNoIHRoZSBpbnB1dCByZWQuIFRoZSBicm93c2VyJ3MgYG1heGxlbmd0aGAgYXR0cmlidXRlIGFscmVhZHlcbiAgICAvLyBzaWxlbnRseSBibG9ja3MgdGhlIGNoYXJhY3RlcjsgdGhpcyBzdXJmYWNlcyBhIHZpc2libGUgXCJ5b3UndmUgaGl0IHRoZSBjYXBcIlxuICAgIC8vIHNpZ25hbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBtaXNzaW5nLlxuICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlS2V5KGV2ZW50KSAmJiB0aGlzLndvdWxkRXhjZWVkUmVuYW1lTGltaXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZW5hbWVMaW1pdEZsYXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIFNpbmdsZS1jaGFyYWN0ZXIga2V5cyBhcmUgcHJpbnRhYmxlcyAoYSwgQiwgMSwgISwgc3BhY2UpLiBNb2RpZmllci1kcml2ZW5cbiAgICAvLyBzaG9ydGN1dHMgKEN0cmwvTWV0YSkgc2hvdWxkbid0IGNvdW50IOKAlCB0aGV5IGRvbid0IGluc2VydCB0ZXh0LlxuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXk7XG4gIH1cblxuICBwcml2YXRlIHdvdWxkRXhjZWVkUmVuYW1lTGltaXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBUaGUgbmV3IGxlbmd0aCBhZnRlciB0aGUga2V5c3Ryb2tlIHdvdWxkIGJlOiBjdXJyZW50IC0gc2VsZWN0aW9uTGVuZ3RoICsgMS5cbiAgICAvLyBJZiBhIHNlbGVjdGlvbiBjb3ZlcnMgcGFydCBvZiB0aGUgdmFsdWUsIHR5cGluZyByZXBsYWNlcyB0aGF0IHJhbmdlLCBzbyB0aGVcbiAgICAvLyBuZXQgbGVuZ3RoIG1pZ2h0IHN0aWxsIGZpdCB1bmRlciB0aGUgY2FwLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldD8uc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQ/LnNlbGVjdGlvbkVuZCA/PyAwO1xuICAgIGNvbnN0IHNlbGVjdGVkTGVuID0gTWF0aC5tYXgoMCwgZW5kIC0gc3RhcnQpO1xuICAgIGNvbnN0IGRyYWZ0TGVuID0gKHRoaXMucmVuYW1lRHJhZnQgfHwgJycpLmxlbmd0aDtcbiAgICByZXR1cm4gZHJhZnRMZW4gLSBzZWxlY3RlZExlbiA+PSB0aGlzLnJlbmFtZU1heExlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlclJlbmFtZUxpbWl0Rmxhc2goKTogdm9pZCB7XG4gICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbmFtZUxpbWl0Rmxhc2hUaW1lcik7XG4gICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVuYW1lTGltaXRGbGFzaCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgRm9sZGVyU2lkZWJhckNvbXBvbmVudC5SRU5BTUVfTElNSVRfRkxBU0hfTVMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlbmFtZUxpbWl0Rmxhc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVuYW1lTGltaXRGbGFzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIpO1xuICAgICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlbmFtZUxpbWl0Rmxhc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZUZvbGRlcihuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dEZWxldGUpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBmb2xkZXIgY29udGV4dCBtZW51IGFuY2hvcmVkIGF0IHRoZSBnaXZlbiBjbGllbnQgY29vcmRpbmF0ZXMuXG4gICAqIENhbGxlZCBmcm9tIGJvdGggKGNvbnRleHRtZW51KSBvbiB0aGUgcm93IGFuZCAoY2xpY2spIG9uIHRoZSBlbGxpcHNpcyBidXR0b24uXG4gICAqIFRoZSB0ZW1wbGF0ZSByZW5kZXJzIHRoZSBtZW51IHZpYSBjZGtDb25uZWN0ZWRPdmVybGF5IGFuY2hvcmVkIG9uIGFuXG4gICAqIGludmlzaWJsZSAww5cwIG9yaWdpbiBhdCBgY29udGV4dE1lbnVQb3NpdGlvbmA7IENESydzIGZsZXhpYmxlLWNvbm5lY3RlZFxuICAgKiBwb3NpdGlvbmluZyBhdXRvLWZsaXBzIHVwL2xlZnQgd2hlbiB0aGUgcHJlZmVycmVkIHBsYWNlbWVudCB3b3VsZCBvdmVyZmxvd1xuICAgKiB0aGUgdmlld3BvcnQgKGUuZy4gcmlnaHQtY2xpY2tpbmcgdGhlIGxhc3QgZm9sZGVyIG5lYXIgdGhlIGJvdHRvbSBlZGdlKS5cbiAgICovXG4gIG9wZW5Db250ZXh0TWVudShuOiBGb2xkZXJOb2RlLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmhhc0FueUNvbnRleHRBY3Rpb24pIHJldHVybjtcbiAgICB0aGlzLmNvbnRleHRNZW51Rm9sZGVySWQgPSBuLmlkO1xuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbiA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIC8vIENESydzIG91dHNpZGUtY2xpY2sgZGlzcGF0Y2hlciBhdHRhY2hlcyBib2R5LWxldmVsIGNhcHR1cmUtcGhhc2UgbGlzdGVuZXJzXG4gICAgLy8gZm9yIGNsaWNrL2F1eGNsaWNrL2NvbnRleHRtZW51LiBPbiByaWdodC1jbGljayB0aGUgY29udGV4dG1lbnUrYXV4Y2xpY2tcbiAgICAvLyBldmVudHMgZmlyZSBvbiB0aGUgc2FtZSBnZXN0dXJlIHRoYXQgb3BlbmVkIHRoZSBtZW51LCB3aGljaCB3b3VsZFxuICAgIC8vIGltbWVkaWF0ZWx5IGNsb3NlIGl0LiBTdXBwcmVzcyBvdXRzaWRlLWNsaWNrIGhhbmRsaW5nIGZvciBhIHNob3J0IHdpbmRvdy5cbiAgICB0aGlzLl9zdXBwcmVzc091dHNpZGVDbGlja1VudGlsID0gRGF0ZS5ub3coKSArIDI1MDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uT3ZlcmxheU91dHNpZGVDbGljaygpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSA8IHRoaXMuX3N1cHByZXNzT3V0c2lkZUNsaWNrVW50aWwpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgfVxuXG4gIGNsb3NlQ29udGV4dE1lbnUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVGb2xkZXJJZCA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5jb250ZXh0TWVudUZvbGRlcklkID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIG1lbnUgZW50cnkgaXMgZW5hYmxlZCDigJQgb3RoZXJ3aXNlIHRoZSB0cmlnZ2VyIGlzIHN1cHByZXNzZWQgZW50aXJlbHkuICovXG4gIGdldCBoYXNBbnlDb250ZXh0QWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93Q3JlYXRlIHx8IHRoaXMuYWxsb3dSZW5hbWUgfHwgdGhpcy5hbGxvd01vdmUgfHwgdGhpcy5hbGxvd0R1cGxpY2F0ZSB8fCB0aGlzLmFsbG93RGVsZXRlO1xuICB9XG5cbiAgb25Db250ZXh0Q3JlYXRlU3ViZm9sZGVyKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dDcmVhdGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckNyZWF0ZVJlcXVlc3RlZC5lbWl0KHsgcGFyZW50SWQ6IG4uaWQgfSk7XG4gIH1cblxuICBvbkNvbnRleHRSZW5hbWUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgIGlmICghdGhpcy5hbGxvd1JlbmFtZSkgcmV0dXJuO1xuICAgIHRoaXMucmVuYW1pbmdJZCA9IG4uaWQ7XG4gICAgdGhpcy5yZW5hbWVEcmFmdCA9IG4ubmFtZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzUmVuYW1lSW5wdXQobi5pZCk7XG4gIH1cblxuICBvbkNvbnRleHRNb3ZlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dNb3ZlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJNb3ZlUmVxdWVzdGVkLmVtaXQoeyBpZDogbi5pZCB9KTtcbiAgfVxuXG4gIG9uQ29udGV4dER1cGxpY2F0ZShuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgaWYgKCF0aGlzLmFsbG93RHVwbGljYXRlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgb25Db250ZXh0RGVsZXRlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dEZWxldGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxuICBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICB9XG5cbiAgLyoqIFRlbXBsYXRlIGhlbHBlcjogcmVzb2x2ZSBhIGZvbGRlciBub2RlIGJ5IGlkIGZyb20gdGhlIGlucHV0IHRyZWUuICovXG4gIGZvbGRlckJ5SWQoaWQ6IG51bWJlciB8IG51bGwpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgaWYgKGlkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZpbmQgPSAobm9kZXM6IEZvbGRlck5vZGVbXSk6IEZvbGRlck5vZGUgfCBudWxsID0+IHtcbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICBpZiAobi5pZCA9PT0gaWQpIHJldHVybiBuO1xuICAgICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgaGl0ID0gZmluZChuLmNoaWxkcmVuKTtcbiAgICAgICAgICBpZiAoaGl0KSByZXR1cm4gaGl0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBmaW5kKHRoaXMuZm9sZGVycyk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcGFyZW50IGlkIG9mIGBpZGAsIG9yIG51bGwgd2hlbiBgaWRgIGlzIGEgcm9vdCBmb2xkZXIgLyBub3QgZm91bmQuICovXG4gIHByaXZhdGUgcGFyZW50SWRPZihpZDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICAgIGlmIChuLmlkID09PSBpZCkge1xuICAgICAgICAgIHJlc3VsdCA9IHBhcmVudElkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGggJiYgd2FsayhuLmNoaWxkcmVuLCBuLmlkKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgbnVsbCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlcXVlc3RDcmVhdGUocGFyZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsbG93Q3JlYXRlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJDcmVhdGVSZXF1ZXN0ZWQuZW1pdCh7IHBhcmVudElkIH0pO1xuICB9XG5cbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgdGhpcy5jb2xsYXBzZWRDaGFuZ2UuZW1pdCh0aGlzLmNvbGxhcHNlZCk7XG4gIH1cblxuICByb3dEcm9wcGVkKHRhcmdldElkOiBudW1iZXIgfCBudWxsLCBldmVudDogeyB0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+OyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgLy8gRGlyZWN0aXZlIGFscmVhZHkgZW1pdHMgd2l0aCB0aGUgYm91bmQgZm9sZGVyIGlkLCBidXQgbm9ybWFsaXNlIGluIGNhc2UgY2FsbGVyc1xuICAgIC8vIHdpcmUgcmF3IGV2ZW50cy5cbiAgICB0aGlzLnRlc3RzRHJvcHBlZC5lbWl0KHsgdGVzdElkczogZXZlbnQudGVzdElkcywgdGFyZ2V0Rm9sZGVySWQ6IHRhcmdldElkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGFyZ2V0IHJlY2VpdmVkIGEgZm9sZGVyIGRyYWcuIFZhbGlkYXRlIGFnYWluc3Qgc2VsZi9kZXNjZW5kYW50IGN5Y2xlcyBhbmRcbiAgICogZW1pdCBgZm9sZGVyRHJvcHBlZGAgaWYgdGhlIG1vdmUgaXMgbGVnYWwuIENhbGxlZCBmcm9tIHRoZSBkaXJlY3RpdmUnc1xuICAgKiBgKGZvbGRlckRyb3BwZWQpYCBvdXRwdXQgb24gZXZlcnkgcm93IGFuZCBvbiB0aGUgVW5vcmdhbmlzZWQgcm93LlxuICAgKi9cbiAgb25Gb2xkZXJSb3dEcm9wcGVkKHRhcmdldElkOiBudW1iZXIgfCBudWxsLCBldmVudDogeyBmb2xkZXJJZDogbnVtYmVyOyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEV4cGFuZFRpbWVycygpO1xuICAgIHRoaXMuYWN0aXZlRm9sZGVyRHJhZ0lkID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2VJZCA9IGV2ZW50LmZvbGRlcklkO1xuICAgIGlmICh0YXJnZXRJZCAhPSBudWxsICYmIHRhcmdldElkID09PSBzb3VyY2VJZCkgcmV0dXJuO1xuICAgIGlmICh0YXJnZXRJZCAhPSBudWxsICYmIHRoaXMuaXNEZXNjZW5kYW50T2Yoc291cmNlSWQsIHRhcmdldElkKSkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyRHJvcHBlZC5lbWl0KHsgaWQ6IHNvdXJjZUlkLCBuZXdQYXJlbnRJZDogdGFyZ2V0SWQgfSk7XG4gIH1cblxuICAvKiogUmVtZW1iZXIgdGhlIGRyYWdnZWQgZm9sZGVyIHNvIHdlIGNhbiBibG9jayBzZWxmLWhvdmVyIGV4cGFuc2lvbiBhbmQgY3ljbGUgZHJvcHMuICovXG4gIG9uRm9sZGVyRHJhZ1N0YXJ0KG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9IG4uaWQ7XG4gIH1cblxuICBvbkZvbGRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVGb2xkZXJEcmFnSWQgPSBudWxsO1xuICAgIHRoaXMuY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTtcbiAgfVxuXG4gIC8qKiBTY2hlZHVsZSBhbiBhdXRvLWV4cGFuZCBmb3IgYSBjb2xsYXBzZWQgZm9sZGVyIHRoYXQgaGFzIGNoaWxkcmVuIGR1cmluZyBkcmFnLWhvdmVyLiAqL1xuICBvbkZvbGRlclJvd0RyYWdPdmVyKHJvdzogUmVuZGVyTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gcm93Lm5vZGUuaWQ7XG4gICAgaWYgKCFyb3cuaGFzQ2hpbGRyZW4pIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKGlkKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9PT0gaWQpIHJldHVybjsgLy8gZG9uJ3QgZXhwYW5kIHRoZSBzb3VyY2VcbiAgICBpZiAodGhpcy5kcmFnRXhwYW5kVGltZXJzLmhhcyhpZCkpIHJldHVybjtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZChpZCkpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZCwgZXhwYW5kZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5EUkFHX0VYUEFORF9ERUxBWV9NUyk7XG4gICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLnNldChpZCwgdGltZXIpO1xuICB9XG5cbiAgb25Gb2xkZXJSb3dEcmFnTGVhdmUocm93OiBSZW5kZXJOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSByb3cubm9kZS5pZDtcbiAgICBjb25zdCB0aW1lciA9IHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5nZXQoaWQpO1xuICAgIGlmICh0aW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmRlbGV0ZShpZCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6ZHJhZ2VuZCcpXG4gIG9uRG9jdW1lbnREcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMub25Gb2xkZXJEcmFnRW5kKCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGBjYW5kaWRhdGVJZGAgaXMgYHNvdXJjZUlkYCBpdHNlbGYgb3IgYW55IGRlc2NlbmRhbnQgb2YgaXQuICovXG4gIHByaXZhdGUgaXNEZXNjZW5kYW50T2Yoc291cmNlSWQ6IG51bWJlciwgY2FuZGlkYXRlSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZm9sZGVyQnlJZChzb3VyY2VJZCk7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGFjazogRm9sZGVyTm9kZVtdID0gW3NvdXJjZV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgbiA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGlmIChuLmlkID09PSBjYW5kaWRhdGVJZCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSBzdGFjay5wdXNoKC4uLm4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxsRXhwYW5kVGltZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5mb3JFYWNoKHQgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLmRyYWdFeHBhbmRUaW1lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTtcbiAgICB0aGlzLmNsZWFyUmVuYW1lTGltaXRGbGFzaCgpO1xuICAgIGlmICh0aGlzLnNlYXJjaEVtaXRUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoRW1pdFRpbWVyKTtcbiAgICAgIHRoaXMuc2VhcmNoRW1pdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5Um93ID0gKF86IG51bWJlciwgcm93OiBSZW5kZXJOb2RlKSA9PiBgJHtyb3cua2luZH1fJHtyb3cubm9kZS5pZH1gO1xuXG4gIG9uUm93S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgcm93OiBSZW5kZXJOb2RlLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93cztcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXh0ID0gcm93c1tpbmRleCArIDFdO1xuICAgICAgICBpZiAobmV4dCkgdGhpcy5mb2N1c1Jvd0VsZW1lbnQobmV4dC5ub2RlLmlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcm93c1tpbmRleCAtIDFdO1xuICAgICAgICBpZiAocHJldikgdGhpcy5mb2N1c1Jvd0VsZW1lbnQocHJldi5ub2RlLmlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0Jzoge1xuICAgICAgICBpZiAocm93Lmhhc0NoaWxkcmVuICYmICF0aGlzLmlzRXhwYW5kZWQocm93Lm5vZGUuaWQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdCh7IGlkOiByb3cubm9kZS5pZCwgZXhwYW5kZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiB7XG4gICAgICAgIGlmIChyb3cuaGFzQ2hpbGRyZW4gJiYgdGhpcy5pc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogcm93Lm5vZGUuaWQsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25TZWxlY3Qocm93Lm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUm93RWxlbWVudChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2RhdGEtZm9sZGVyLXJvdy1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICBlbD8uZm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBpbmxpbmUgcmVuYW1lIGlucHV0IGZvciB0aGUgZ2l2ZW4gZm9sZGVyLiBVc2VzIGBzZXRUaW1lb3V0YCAobm90XG4gICAqIG1pY3JvdGFzaykgYmVjYXVzZSB0aGUgaW5wdXQgaXMgZ2F0ZWQgYnkgYCpuZ0lmPVwicmVuYW1pbmdJZCA9PT0gLi4uXCJgIGFuZFxuICAgKiBtdXN0IHN1cnZpdmUgdGhlIG5leHQgT25QdXNoIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUgYmVmb3JlIGl0J3MgaW4gdGhlIERPTS5cbiAgICovXG4gIHByaXZhdGUgZm9jdXNSZW5hbWVJbnB1dChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oYFtkYXRhLWZvbGRlci1yZW5hbWUtaW5wdXQ9XCIke2lkfVwiXWApO1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIGVsLnNlbGVjdCgpO1xuICAgIH0sIDApO1xuICB9XG59XG4iLCI8IS0tIFJldXNhYmxlIGZvbGRlciBpY29uLiBSZW5kZXIgdmlhIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uOyBjb250ZXh0OiB7IGNvbG9yOiBub2RlLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj4uIC0tPlxuPG5nLXRlbXBsYXRlICNmb2xkZXJJY29uIGxldC1jb2xvcj1cImNvbG9yXCI+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTQgY3FhLWgtNCBjcWEtc2hyaW5rLTBcIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTMgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMTIuMTkxNiA5Ljg1ODI0QzEyLjE5MTYgMTAuMTY3NyAxMi4wNjg3IDEwLjQ2NDQgMTEuODQ5OSAxMC42ODMyQzExLjYzMTEgMTAuOTAyIDExLjMzNDMgMTEuMDI0OSAxMS4wMjQ5IDExLjAyNDlIMS42OTE1N0MxLjM4MjE1IDExLjAyNDkgMS4wODU0IDEwLjkwMiAwLjg2NjYxMSAxMC42ODMyQzAuNjQ3ODE5IDEwLjQ2NDQgMC41MjQ5MDIgMTAuMTY3NyAwLjUyNDkwMiA5Ljg1ODI0VjEuNjkxNTdDMC41MjQ5MDIgMS4zODIxNSAwLjY0NzgxOSAxLjA4NTQgMC44NjY2MTEgMC44NjY2MTFDMS4wODU0IDAuNjQ3ODE5IDEuMzgyMTUgMC41MjQ5MDIgMS42OTE1NyAwLjUyNDkwMkg0LjYwODI0TDUuNzc0OSAyLjI3NDlIMTEuMDI0OUMxMS4zMzQzIDIuMjc0OSAxMS42MzExIDIuMzk3ODIgMTEuODQ5OSAyLjYxNjYxQzEyLjA2ODcgMi44MzU0IDEyLjE5MTYgMy4xMzIxNSAxMi4xOTE2IDMuNDQxNTdWOS44NTgyNFpcIiBbYXR0ci5zdHJva2VdPVwiY29sb3IgfHwgJyM5OTk5OUUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4wNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGFzaWRlXG4gIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItbmV1dHJhbC0yMDAgY3FhLXJvdW5kZWQtbGcgY3FhLWgtZnVsbCBjcWEtbWluLWgtMFwiXG4gIFtjbGFzcy5jcWEtdy1bMjQwcHhdXT1cIiFjb2xsYXBzZWRcIlxuICBbY2xhc3MuY3FhLXctWzQ4cHhdXT1cImNvbGxhcHNlZFwiXG4gIHN0eWxlPVwidHJhbnNpdGlvbjogd2lkdGggMTUwbXMgZWFzZTtcIlxuPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1weC0zIGNxYS1weS0xXCJcbiAgICBbc3R5bGUuYm9yZGVyLWJvdHRvbV09XCJjb2xsYXBzZWQgPyBudWxsIDogJzFweCBzb2xpZCAjRTJFMkUzJ1wiXG4gICAgW3N0eWxlLm1hcmdpbi1ib3R0b20ucHhdPVwiY29sbGFwc2VkID8gMCA6IDhcIlxuICA+XG4gICAgPHNwYW4gKm5nSWY9XCIhY29sbGFwc2VkXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1uZXV0cmFsLTkwMFwiPlxuICAgICAge3sgbGFiZWxzLmZvbGRlcnMgfX1cbiAgICA8L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xXCIgW2NsYXNzLmNxYS13LWZ1bGxdPVwiY29sbGFwc2VkXCIgW2NsYXNzLmNxYS1qdXN0aWZ5LWNlbnRlcl09XCJjb2xsYXBzZWRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXRleHQtbmV1dHJhbC01MDBcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sbGFwc2VkID8gJ0V4cGFuZCBmb2xkZXJzIHBhbmVsJyA6ICdDb2xsYXBzZSBmb2xkZXJzIHBhbmVsJ1wiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxOHB4O3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHhcIj5cbiAgICAgICAgICB7eyBjb2xsYXBzZWQgPyAnY2hldnJvbl9yaWdodCcgOiAna2V5Ym9hcmRfZG91YmxlX2Fycm93X2xlZnQnIH19XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCIhY29sbGFwc2VkICYmIGFsbG93Q3JlYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXRleHQtbmV1dHJhbC01MDBcIlxuICAgICAgICAoY2xpY2spPVwicmVxdWVzdENyZWF0ZShudWxsKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxzLm5ld0ZvbGRlclwiXG4gICAgICAgIFt0aXRsZV09XCJsYWJlbHMubmV3Rm9sZGVyXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE4cHg7d2lkdGg6MThweDtoZWlnaHQ6MThweFwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2xsYXBzZWRcIj5cbiAgICA8IS0tIFNlYXJjaCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTMgY3FhLXBiLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVscy5zZWFyY2hGb2xkZXJzUGxhY2Vob2xkZXJcIlxuICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcigpXCJcbiAgICAgICAgPjwvY3FhLXNlYXJjaC1iYXI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJmb2xkZXJTZWFyY2hMb2FkaW5nXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcmlnaHQtOCBjcWEtaW5zZXQteS0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaGluZyBmb2xkZXJzXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjE0XCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVHJlZSAoZm9sZGVycyBvbmx5IOKAlCBVbm9yZ2FuaXNlZCBzaXRzIGRpcmVjdGx5IGJlbG93OyB0cmVlIGNhcHMgYXQgNjB2aCBhbmQgc2Nyb2xscyB3aGVuIG92ZXJmbG93aW5nKS5cbiAgICAgICAgIFNjcm9sbC1iYXNlZCBsYXp5LWxvYWRpbmcgYXQgdGhlIHJvb3QgbGV2ZWw6IG5lYXJpbmcgdGhlIGJvdHRvbSBlbWl0c1xuICAgICAgICAgYHJvb3RMb2FkTW9yZVJlcXVlc3RlZGAsIHdoaWNoIHRoZSBob3N0IHJlc3BvbmRzIHRvIGJ5IGZldGNoaW5nIHRoZVxuICAgICAgICAgbmV4dCBwYWdlIG9mIHJvb3RzLiAtLT5cbiAgICA8ZGl2IHJvbGU9XCJ0cmVlXCIgY2xhc3M9XCJjcWEtbWluLWgtMCBjcWEtbWF4LWgtWzYwdmhdIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLXB5LTEgY3FhLXNjcm9sbGJhci10aGluIGNxYS1zY3JvbGxiYXItdHJhY2stdHJhbnNwYXJlbnQgY3FhLXNjcm9sbGJhci10aHVtYi1bI0U1RTdFQl0gY3FhLXNjcm9sbGJhci10aHVtYi1yb3VuZGVkLWZ1bGwgY3FhLXNjcm9sbGJhci10aHVtYi1ob3ZlcjpjcWEtYmctWyNEMUQ1REJdXCJcbiAgICAgICAgIChzY3JvbGwpPVwib25UcmVlU2Nyb2xsKCRldmVudClcIj5cbiAgICAgIDwhLS0gSW5pdGlhbC1sb2FkIHNwaW5uZXI6IG9ubHkgcmVuZGVycyB3aGVuIHdlIGhhdmUgbm8gZm9sZGVycyB5ZXQgQU5EXG4gICAgICAgICAgIG5vIHNlYXJjaCBhY3RpdmUgKHNlYXJjaCBoYXMgaXRzIG93biBpbmxpbmUgc3Bpbm5lcikuIC0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInJvb3RGb2xkZXJzTG9hZGluZyAmJiBmb2xkZXJzLmxlbmd0aCA9PT0gMCAmJiAhc2VhcmNoVmFsdWU/LnRyaW0oKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXB5LTZcIlxuICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgPlxuICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIyMFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInNlYXJjaFZhbHVlPy50cmltKCkgJiYgcm93cy5sZW5ndGggPT09IDAgJiYgIWZvbGRlclNlYXJjaExvYWRpbmdcIlxuICAgICAgICBjbGFzcz1cImNxYS1weC0zIGNxYS1weS0yIGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS10ZXh0LWNlbnRlclwiXG4gICAgICA+XG4gICAgICAgIHt7IGxhYmVscy5ub0ZvbGRlcnNGb3VuZCB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVJvd1wiPlxuICAgICAgICA8IS0tIFN5bnRoZXRpYyBsb2FkaW5nIHJvdyAobGF6eSBmZXRjaCBpbiBmbGlnaHQpIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJyb3cua2luZCA9PT0gJ2xvYWRpbmcnXCJcbiAgICAgICAgICBbc3R5bGUucGFkZGluZ0xlZnQucHhdPVwiOCArIHJvdy5kZXB0aCAqIDE2XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDBcIlxuICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIxNFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8c3Bhbj5Mb2FkaW5n4oCmPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTeW50aGV0aWMgbG9hZC1tb3JlIHJvdyAobW9yZSBjaGlsZHJlbiBhdmFpbGFibGUgb24gYmFja2VuZCkgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInJvdy5raW5kID09PSAnbG9hZC1tb3JlJ1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cIjggKyByb3cuZGVwdGggKiAxNlwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS13LWZ1bGwgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1pbmRpZ28tNjAwIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uTG9hZE1vcmUocm93Lm5vZGUpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+TG9hZCBtb3JlICh7eyAocm93Lm5vZGUudG90YWxDaGlsZHJlbiA/PyAwKSAtIChyb3cubm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDApIH19KTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwhLS0gUmVhbCBmb2xkZXIgcm93IC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJyb3cua2luZCA9PT0gJ2ZvbGRlcidcIlxuICAgICAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInJvdy5oYXNDaGlsZHJlbiA/IGlzRXhwYW5kZWQocm93Lm5vZGUuaWQpIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKVwiXG4gICAgICAgICAgW2F0dHIuZGF0YS1mb2xkZXItcm93LWlkXT1cInJvdy5ub2RlLmlkXCJcbiAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJyb3cubm9kZS5pZFwiXG4gICAgICAgICAgW2Ryb3BFbmFibGVkXT1cImFsbG93RHJvcFwiXG4gICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJyb3dEcm9wcGVkKHJvdy5ub2RlLmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICAoZm9sZGVyRHJvcHBlZCk9XCJvbkZvbGRlclJvd0Ryb3BwZWQocm93Lm5vZGUuaWQsICRldmVudClcIlxuICAgICAgICAgIFtjcWFGb2xkZXJEcmFnXT1cInJvdy5ub2RlLmlkXCJcbiAgICAgICAgICBbZHJhZ0VuYWJsZWRdPVwiYWxsb3dEcm9wXCJcbiAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRm9sZGVyRHJhZ1N0YXJ0KHJvdy5ub2RlKVwiXG4gICAgICAgICAgKGRyYWdlbmQpPVwib25Gb2xkZXJEcmFnRW5kKClcIlxuICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkZvbGRlclJvd0RyYWdPdmVyKHJvdylcIlxuICAgICAgICAgIChkcmFnbGVhdmUpPVwib25Gb2xkZXJSb3dEcmFnTGVhdmUocm93KVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0KHJvdy5ub2RlKVwiXG4gICAgICAgICAgKGNvbnRleHRtZW51KT1cIm9wZW5Db250ZXh0TWVudShyb3cubm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24pPVwib25Sb3dLZXlkb3duKCRldmVudCwgcm93LCBpKVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXByLTMgY3FhLXB5LTEuNSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWluZGlnby01MCBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzOmNxYS1iZy1pbmRpZ28tNTAgY3FhLXJlbGF0aXZlXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWJnLWluZGlnby01MF09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKSB8fCBjb250ZXh0TWVudUZvbGRlcklkID09PSByb3cubm9kZS5pZFwiXG4gICAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cIjggKyByb3cuZGVwdGggKiAxNlwiXG4gICAgICAgICAgW2F0dHIudGl0bGVdPVwicm93Lm5vZGUudG90YWxDb3VudCAhPSBudWxsID8gKHJvdy5ub2RlLnRvdGFsQ291bnQgKyAnIHRvdGFsIGluY2x1ZGluZyBzdWJmb2xkZXJzJykgOiBudWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTAgY3FhLXRvcC0wIGNxYS1ib3R0b20tMCBjcWEtdy1bM3B4XSBjcWEtYmctaW5kaWdvLTYwMFwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMFwiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiaXNTZWxlY3RlZChyb3cubm9kZS5pZCkgPyAnIzNGNDNFRScgOiAnIzRDNEM1MSdcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwicm93Lmhhc0NoaWxkcmVuID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlKHJvdy5ub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNFeHBhbmRlZChyb3cubm9kZS5pZCkgPyAnQ29sbGFwc2UnIDogJ0V4cGFuZCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5cbiAgICAgICAgICAgICAge3sgaXNFeHBhbmRlZChyb3cubm9kZS5pZCkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uOyBjb250ZXh0OiB7IGNvbG9yOiByb3cubm9kZS5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVuYW1pbmdJZCA9PT0gcm93Lm5vZGUuaWQ7IGVsc2UgbmFtZVRwbFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgc2l6ZT1cIjFcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvbGRlci1yZW5hbWUtaW5wdXRdPVwicm93Lm5vZGUuaWRcIlxuICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwicmVuYW1lTWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS13LWZ1bGwgY3FhLXB4LTIgY3FhLXB5LTAuNSBjcWEtcm91bmRlZCBjcWEtYm9yZGVyIGNxYS1iZy13aGl0ZSBjcWEtdGV4dC1zbSBjcWEtc2hhZG93LXNtIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLXJpbmctMVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpc1JlbmFtZURyYWZ0VmFsaWQgJiYgIXJlbmFtZUxpbWl0Rmxhc2gpXG4gICAgICAgICAgICAgICAgPyAnY3FhLWJvcmRlci1uZXV0cmFsLTMwMCBmb2N1czpjcWEtYm9yZGVyLWluZGlnby00MDAgZm9jdXM6Y3FhLXJpbmctaW5kaWdvLTIwMCdcbiAgICAgICAgICAgICAgICA6ICdjcWEtYm9yZGVyLVsjRUY0NDQ0XSBmb2N1czpjcWEtYm9yZGVyLVsjRUY0NDQ0XSBmb2N1czpjcWEtcmluZy1bI0ZDQTVBNV0nXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIiFpc1JlbmFtZURyYWZ0VmFsaWQgfHwgcmVuYW1lTGltaXRGbGFzaFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVuYW1lRHJhZnRcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblJlbmFtZUtleSgkZXZlbnQsIHJvdy5ub2RlKVwiXG4gICAgICAgICAgICAgIChrZXlwcmVzcyk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAoa2V5dXApPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiY29tbWl0UmVuYW1lKHJvdy5ub2RlKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25hbWVUcGw+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXRleHQtc20gY3FhLXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpID8gJyMzRjQzRUUnIDogJyM0QzRDNTEnXCJcbiAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImJlZ2luUmVuYW1lKHJvdy5ub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgID57eyByb3cubm9kZS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8IS0tIENvdW50IHNob3duIGF0IHJlc3Q7IGhpZGRlbiBvbiByb3cgaG92ZXIgd2hlbiBkZWxldGUgaXMgYWxsb3dlZCAtLT5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q291bnRzICYmIHJvdy5ub2RlLmNvdW50ICE9IG51bGxcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGFidWxhci1udW1zIGNxYS1tbC0xXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKSA/ICcjM0Y0M0VFJyA6ICcjNEM0QzUxJ1wiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaG92ZXI6Y3FhLWhpZGRlbl09XCJhbGxvd0RlbGV0ZVwiXG4gICAgICAgICAgPnt7IHJvdy5ub2RlLmNvdW50IH19PC9zcGFuPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJoYXNBbnlDb250ZXh0QWN0aW9uXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0wLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMjAwXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKSB8fCBjb250ZXh0TWVudUZvbGRlcklkID09PSByb3cubm9kZS5pZCA/ICcjM0Y0M0VFJyA6ICcjNEM0QzUxJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWhpZGRlbl09XCJjb250ZXh0TWVudUZvbGRlcklkICE9PSByb3cubm9kZS5pZFwiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaG92ZXI6Y3FhLWlubGluZS1mbGV4XT1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1pbmxpbmUtZmxleF09XCJjb250ZXh0TWVudUZvbGRlcklkID09PSByb3cubm9kZS5pZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbnRleHRNZW51KHJvdy5ub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09wZW4gYWN0aW9ucyBmb3IgJyArIHJvdy5ub2RlLm5hbWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbWVudSdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjb250ZXh0TWVudUZvbGRlcklkID09PSByb3cubm9kZS5pZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPm1vcmVfaG9yaXo8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPCEtLSBSb290LWxldmVsIHBhZ2luYXRpb24gaXMgbm93IGRyaXZlbiBieSBzY3JvbGwgKHNlZSBgKHNjcm9sbClgIG9uIHRoZVxuICAgICAgICAgICB0cmVlIGNvbnRhaW5lciBhYm92ZSkuIFBlci1mb2xkZXIgY2hpbGRyZW4gcmV0YWluIHRoZSBleHBsaWNpdFxuICAgICAgICAgICBcIkxvYWQgbW9yZVwiIGJ1dHRvbiByZW5kZXJlZCBpbnNpZGUgdGhlIHJvd3MgbG9vcCBhYm92ZSwgc2luY2VcbiAgICAgICAgICAgc3VidHJlZXMgYXJlbid0IGluZGVwZW5kZW50bHkgc2Nyb2xsYWJsZS4gLS0+XG4gICAgICA8IS0tIFBhZ2luYXRpb24gc3Bpbm5lciDigJQgdmlzaWJsZSBvbmx5IHdoZW4gZmV0Y2hpbmcgYW4gYWRkaXRpb25hbCBwYWdlXG4gICAgICAgICAgIG9mIHJvb3RzIChmb2xkZXJzLmxlbmd0aCA+IDAgZGlzdGluZ3Vpc2hlcyBmcm9tIGluaXRpYWwtbG9hZCBjYXNlKS4gLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwicm9vdEZvbGRlcnNMb2FkaW5nICYmIGZvbGRlcnMubGVuZ3RoID4gMCAmJiAhc2VhcmNoVmFsdWU/LnRyaW0oKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXB5LTJcIlxuICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgPlxuICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCIxNFwiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEaXZpZGVyIGJldHdlZW4gZm9sZGVyIHRyZWUgYW5kIHBpbm5lZCBVbm9yZ2FuaXNlZCB0YWIgLS0+XG4gICAgPGRpdlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGNsYXNzPVwiY3FhLW14LTMgY3FhLXNocmluay0wXCJcbiAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxcHg7IGJhY2tncm91bmQtY29sb3I6ICNFNUU3RUI7IG1hcmdpbi10b3A6IDZweDsgbWFyZ2luLWJvdHRvbTogNnB4O1wiXG4gICAgPjwvZGl2PlxuXG4gICAgPCEtLSBVbm9yZ2FuaXNlZCDigJQgcGlubmVkIGJlbG93IHRoZSBzY3JvbGxhYmxlIGZvbGRlciB0cmVlIHNvIGl0IHN0YXlzIHZpc2libGUgcmVnYXJkbGVzcyBvZiBmb2xkZXIgY291bnQgLS0+XG4gICAgPGRpdlxuICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQobnVsbClcIlxuICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLWJnLWluZGlnby01MCBjcWEtcmVsYXRpdmUgY3FhLXNocmluay0wXCJcbiAgICAgIFtjbGFzcy5jcWEtYmctaW5kaWdvLTUwXT1cImlzU2VsZWN0ZWQobnVsbClcIlxuICAgICAgW2NxYUZvbGRlckRyb3BdPVwibnVsbFwiXG4gICAgICBbZHJvcEVuYWJsZWRdPVwiYWxsb3dEcm9wXCJcbiAgICAgICh0ZXN0c0Ryb3BwZWQpPVwicm93RHJvcHBlZChudWxsLCAkZXZlbnQpXCJcbiAgICAgIChmb2xkZXJEcm9wcGVkKT1cIm9uRm9sZGVyUm93RHJvcHBlZChudWxsLCAkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJvblNlbGVjdFVub3JnYW5pc2VkKClcIlxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwiaXNTZWxlY3RlZChudWxsKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTAgY3FhLXRvcC0wIGNxYS1ib3R0b20tMCBjcWEtdy1bM3B4XSBjcWEtYmctaW5kaWdvLTYwMFwiXG4gICAgICA+PC9zcGFuPlxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJpc1NlbGVjdGVkKG51bGwpID8gJyMzRjQzRUUnIDogJyM0QzRDNTEnXCIgc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+aW5ib3g8L21hdC1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LXNtXCIgW3N0eWxlLmNvbG9yXT1cImlzU2VsZWN0ZWQobnVsbCkgPyAnIzNGNDNFRScgOiAnIzRDNEM1MSdcIj57eyBsYWJlbHMudW5vcmdhbmlzZWQgfX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dDb3VudHNcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10YWJ1bGFyLW51bXNcIiBbc3R5bGUuY29sb3JdPVwiaXNTZWxlY3RlZChudWxsKSA/ICcjM0Y0M0VFJyA6ICcjNEM0QzUxJ1wiPnt7IHVub3JnYW5pc2VkQ291bnQgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvbGRlciBjb250ZXh0IG1lbnUgKHJpZ2h0LWNsaWNrIC8gZWxsaXBzaXMpLiBBIDDDlzAgZml4ZWQtcG9zaXRpb25cbiAgICAgICAgIGFuY2hvciBhdCB0aGUgY2xpY2sgY29vcmRzIGRyaXZlcyBhIGNka0Nvbm5lY3RlZE92ZXJsYXk7IENESydzXG4gICAgICAgICBmbGV4aWJsZS1jb25uZWN0ZWQgcG9zaXRpb25pbmcgYXV0by1mbGlwcyB1cC9sZWZ0IHdoZW4gdGhlIG1lbnVcbiAgICAgICAgIHdvdWxkIG92ZXJmbG93IHRoZSB2aWV3cG9ydCAobGFzdC1mb2xkZXItbmVhci1ib3R0b20gY2FzZSkuIC0tPlxuICAgIDxkaXYgI2N0eEFuY2hvciBjZGtPdmVybGF5T3JpZ2luXG4gICAgICAgICBjbGFzcz1cImNxYS1maXhlZCBjcWEtdy0wIGNxYS1oLTAgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29udGV4dE1lbnVQb3NpdGlvbi54XCJcbiAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCI+PC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cImN0eEFuY2hvclwiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiY29udGV4dE1lbnVGb2xkZXJJZCAhPT0gbnVsbFwiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJjb250ZXh0TWVudVBvc2l0aW9uc1wiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cImZhbHNlXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zXT1cImZhbHNlXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UHVzaF09XCJ0cnVlXCJcbiAgICAgIChvdmVybGF5T3V0c2lkZUNsaWNrKT1cIm9uT3ZlcmxheU91dHNpZGVDbGljaygpXCJcbiAgICAgIChkZXRhY2gpPVwiY2xvc2VDb250ZXh0TWVudSgpXCJcbiAgICA+XG4gICAgICA8IS0tIFRoZSBsaWIncyB0YWlsd2luZCBjb25maWcgc2V0cyBpbXBvcnRhbnQ6ICcuY3FhLXVpLXJvb3QnLCB3aGljaFxuICAgICAgICAgICBlbWl0cyBkZXNjZW5kYW50IHNlbGVjdG9ycyBsaWtlIGAuY3FhLXVpLXJvb3QgLmNxYS1iZy13aGl0ZWAuXG4gICAgICAgICAgIENESyBPdmVybGF5IHRlbGVwb3J0cyB0aGlzIHRlbXBsYXRlIGludG8gdGhlIGdsb2JhbCBvdmVybGF5XG4gICAgICAgICAgIGNvbnRhaW5lciAob3V0c2lkZSB0aGUgaG9zdCdzIGNxYS11aS1yb290KSwgc28gd2Ugd3JhcCB0aGUgbWVudSBpblxuICAgICAgICAgICBhbiBhbmNlc3RvciBjcWEtdWktcm9vdCBkaXYgdG8gcmUtZXN0YWJsaXNoIHRoZSB1dGlsaXR5IHNjb3BlLiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiPlxuICAgICAgPGRpdlxuICAgICAgICByb2xlPVwibWVudVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LVsxODBweF0gY3FhLWJnLXdoaXRlIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1uZXV0cmFsLTIwMCBjcWEtcm91bmRlZC1tZCBjcWEtc2hhZG93LWxnIGNxYS1weS0xXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIChjb250ZXh0bWVudSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvbGRlckJ5SWQoY29udGV4dE1lbnVGb2xkZXJJZCkgYXMgbWVudU5vZGVcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0Q3JlYXRlU3ViZm9sZGVyKG1lbnVOb2RlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmNyZWF0ZV9uZXdfZm9sZGVyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51Q3JlYXRlU3ViZm9sZGVyIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dSZW5hbWVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHRSZW5hbWUobWVudU5vZGUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyBsYWJlbHMuZm9sZGVyTWVudVJlbmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImFsbG93TW92ZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS13LWZ1bGwgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctaW5kaWdvLTUwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29udGV4dE1vdmUobWVudU5vZGUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+ZHJpdmVfZmlsZV9tb3ZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51TW92ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImFsbG93RHVwbGljYXRlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0RHVwbGljYXRlKG1lbnVOb2RlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyBsYWJlbHMuZm9sZGVyTWVudUR1cGxpY2F0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWxsb3dEZWxldGUgJiYgKGFsbG93Q3JlYXRlIHx8IGFsbG93UmVuYW1lIHx8IGFsbG93TW92ZSB8fCBhbGxvd0R1cGxpY2F0ZSlcIiBjbGFzcz1cImNxYS1oLXB4IGNxYS1iZy1uZXV0cmFsLTIwMCBjcWEtbXktMVwiPjwvZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiYWxsb3dEZWxldGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtcmVkLTYwMCBob3ZlcjpjcWEtYmctcmVkLTUwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29udGV4dERlbGV0ZShtZW51Tm9kZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyBsYWJlbHMuZm9sZGVyTWVudURlbGV0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgPC9uZy1jb250YWluZXI+XG48L2FzaWRlPlxuIl19
|