@cqa-lib/cqa-ui 1.1.528 → 1.1.530

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.
Files changed (35) hide show
  1. package/esm2020/lib/audit-log-drawer/audit-log-drawer.component.mjs +146 -0
  2. package/esm2020/lib/audit-log-drawer/audit-log-drawer.models.mjs +2 -0
  3. package/esm2020/lib/audit-log-drawer/audit-log-drawer.service.mjs +84 -0
  4. package/esm2020/lib/audit-log-drawer/audit-log-entry-card.component.mjs +30 -0
  5. package/esm2020/lib/dialog/dialog.component.mjs +15 -3
  6. package/esm2020/lib/dialog/dialog.models.mjs +1 -1
  7. package/esm2020/lib/manage-columns-dialog/manage-columns-dialog.component.mjs +133 -0
  8. package/esm2020/lib/manage-columns-dialog/manage-columns-dialog.models.mjs +2 -0
  9. package/esm2020/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.mjs +38 -13
  10. package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +79 -87
  11. package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +21 -4
  12. package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +3 -1
  13. package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +3 -1
  14. package/esm2020/lib/ui-kit.module.mjs +16 -1
  15. package/esm2020/public-api.mjs +7 -1
  16. package/fesm2015/cqa-lib-cqa-ui.mjs +536 -105
  17. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  18. package/fesm2020/cqa-lib-cqa-ui.mjs +531 -103
  19. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  20. package/lib/audit-log-drawer/audit-log-drawer.component.d.ts +34 -0
  21. package/lib/audit-log-drawer/audit-log-drawer.models.d.ts +43 -0
  22. package/lib/audit-log-drawer/audit-log-drawer.service.d.ts +13 -0
  23. package/lib/audit-log-drawer/audit-log-entry-card.component.d.ts +10 -0
  24. package/lib/dialog/dialog.component.d.ts +1 -0
  25. package/lib/dialog/dialog.models.d.ts +4 -0
  26. package/lib/manage-columns-dialog/manage-columns-dialog.component.d.ts +32 -0
  27. package/lib/manage-columns-dialog/manage-columns-dialog.models.d.ts +11 -0
  28. package/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.d.ts +12 -2
  29. package/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.d.ts +23 -30
  30. package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +4 -0
  31. package/lib/templates/modular-table-template/modular-table-template.models.d.ts +2 -0
  32. package/lib/ui-kit.module.d.ts +92 -89
  33. package/package.json +1 -1
  34. package/public-api.d.ts +6 -0
  35. package/styles.css +1 -1
@@ -0,0 +1,133 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ import * as i2 from "../custom-input/custom-input.component";
5
+ import * as i3 from "../button/button.component";
6
+ import * as i4 from "ngx-drag-drop";
7
+ import * as i5 from "@angular/common";
8
+ export class ManageColumnsDialogComponent {
9
+ constructor() {
10
+ this.columns = [];
11
+ this.lockedColumns = [];
12
+ this.items = [];
13
+ this.newColName = '';
14
+ this.columnsError = null;
15
+ this.trackByUid = (_, item) => item.uid;
16
+ this.nextUid = 1;
17
+ }
18
+ ngOnInit() {
19
+ const initial = Array.isArray(this.columns) ? this.columns : [];
20
+ this.items = initial.map(name => ({
21
+ uid: this.nextUid++,
22
+ originalName: name,
23
+ name,
24
+ }));
25
+ }
26
+ isLocked(item) {
27
+ if (!this.lockedColumns || this.lockedColumns.length === 0) {
28
+ return false;
29
+ }
30
+ if (item.originalName != null && this.lockedColumns.indexOf(item.originalName) !== -1) {
31
+ return true;
32
+ }
33
+ return this.lockedColumns.indexOf(item.name) !== -1;
34
+ }
35
+ onDndDrop(event) {
36
+ const dragged = event.data;
37
+ if (!dragged || event.index == null) {
38
+ return;
39
+ }
40
+ const from = this.items.findIndex(it => it.uid === dragged.uid);
41
+ if (from < 0) {
42
+ return;
43
+ }
44
+ const next = this.items.slice();
45
+ next.splice(from, 1);
46
+ const to = event.index > from ? event.index - 1 : event.index;
47
+ next.splice(to, 0, dragged);
48
+ this.items = next;
49
+ }
50
+ onMove(index, dir) {
51
+ const target = index + dir;
52
+ if (target < 0 || target >= this.items.length) {
53
+ return;
54
+ }
55
+ const next = this.items.slice();
56
+ [next[index], next[target]] = [next[target], next[index]];
57
+ this.items = next;
58
+ }
59
+ onRename(index, value) {
60
+ if (!this.items[index]) {
61
+ return;
62
+ }
63
+ this.items = this.items.map((it, i) => i === index ? { ...it, name: value } : it);
64
+ this.columnsError = null;
65
+ }
66
+ onRemove(index) {
67
+ const item = this.items[index];
68
+ if (!item || this.isLocked(item)) {
69
+ return;
70
+ }
71
+ this.items = this.items.filter((_, i) => i !== index);
72
+ this.columnsError = null;
73
+ }
74
+ onNewColNameChange(value) {
75
+ this.newColName = value;
76
+ }
77
+ onAdd() {
78
+ const trimmed = (this.newColName || '').trim();
79
+ if (!trimmed || this.itemsHasName(trimmed)) {
80
+ return;
81
+ }
82
+ this.items = [...this.items, {
83
+ uid: this.nextUid++,
84
+ originalName: null,
85
+ name: trimmed,
86
+ }];
87
+ this.newColName = '';
88
+ this.columnsError = null;
89
+ }
90
+ get canAdd() {
91
+ const trimmed = (this.newColName || '').trim();
92
+ if (!trimmed) {
93
+ return false;
94
+ }
95
+ return !this.itemsHasName(trimmed);
96
+ }
97
+ getValue() {
98
+ const trimmed = this.items.map(it => ({
99
+ originalName: it.originalName,
100
+ name: (it.name || '').trim(),
101
+ }));
102
+ if (trimmed.length === 0) {
103
+ this.columnsError = 'At least one column is required.';
104
+ return null;
105
+ }
106
+ if (trimmed.some(c => c.name.length === 0)) {
107
+ this.columnsError = 'Column names cannot be empty.';
108
+ return null;
109
+ }
110
+ const lowered = trimmed.map(c => c.name.toLowerCase());
111
+ if (new Set(lowered).size !== trimmed.length) {
112
+ this.columnsError = 'Column names must be unique.';
113
+ return null;
114
+ }
115
+ this.columnsError = null;
116
+ return { columns: trimmed };
117
+ }
118
+ itemsHasName(candidate) {
119
+ const lowered = candidate.toLowerCase();
120
+ return this.items.some(it => (it.name || '').trim().toLowerCase() === lowered);
121
+ }
122
+ }
123
+ ManageColumnsDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ManageColumnsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
124
+ ManageColumnsDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ManageColumnsDialogComponent, selector: "cqa-manage-columns-dialog", inputs: { columns: "columns", lockedColumns: "lockedColumns" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-w-full\">\n\n <div class=\"manage-cols-drop-list cqa-flex cqa-flex-col cqa-gap-2\"\n [dndDropzone]=\"['col']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"manage-cols-placeholder\">Drop here</div>\n <div *ngFor=\"let item of items; let i = index; trackBy: trackByUid\"\n class=\"manage-cols-row cqa-flex cqa-items-center cqa-gap-2 cqa-px-2 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-gray-200 cqa-bg-gray-50\">\n <span class=\"manage-cols-handle cqa-flex cqa-items-center cqa-justify-center cqa-text-gray-400\"\n [dndDraggable]=\"item\"\n [dndDisableIf]=\"isLocked(item)\"\n dndType=\"col\"\n dndEffectAllowed=\"move\">\n <mat-icon style=\"font-size:18px;width:18px;height:18px;line-height:18px;\">drag_indicator</mat-icon>\n </span>\n <cqa-custom-input\n class=\"cqa-flex-1\"\n [value]=\"item.name\"\n [fullWidth]=\"true\"\n [disabled]=\"isLocked(item)\"\n inputInlineStyle=\"font-family: 'Inter', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onRename(i, $event)\">\n </cqa-custom-input>\n <button type=\"button\" class=\"manage-cols-icon-btn\"\n title=\"Move up\"\n [disabled]=\"i === 0\"\n (click)=\"onMove(i, -1)\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"manage-cols-icon-btn\"\n title=\"Move down\"\n [disabled]=\"i === items.length - 1\"\n (click)=\"onMove(i, 1)\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button type=\"button\" class=\"manage-cols-icon-btn manage-cols-icon-btn-danger\"\n title=\"Delete column\"\n [disabled]=\"isLocked(item)\"\n (click)=\"onRemove(i)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-pt-3 cqa-mt-1 cqa-border-t cqa-border-dashed cqa-border-gray-200\">\n <cqa-custom-input\n class=\"cqa-flex-1\"\n [value]=\"newColName\"\n [fullWidth]=\"true\"\n placeholder=\"New column name (e.g. currency)\"\n inputInlineStyle=\"font-family: 'Inter', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onNewColNameChange($event)\"\n (enterPressed)=\"onAdd()\">\n </cqa-custom-input>\n <cqa-button\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"add\"\n text=\"Add column\"\n [disabled]=\"!canAdd\"\n (clicked)=\"onAdd()\">\n </cqa-button>\n </div>\n\n <span *ngIf=\"columnsError\" class=\"cqa-text-xs cqa-text-red-600\">{{ columnsError }}</span>\n\n <div class=\"cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-primary-surface cqa-border cqa-border-success-100 cqa-text-xs cqa-text-gray-700\">\n <strong class=\"cqa-text-gray-900\">Heads up:</strong>\n Deleting a column removes its data from every environment. Renaming keeps the data in place.\n </div>\n\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i4.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ManageColumnsDialogComponent, decorators: [{
126
+ type: Component,
127
+ args: [{ selector: 'cqa-manage-columns-dialog', host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-w-full\">\n\n <div class=\"manage-cols-drop-list cqa-flex cqa-flex-col cqa-gap-2\"\n [dndDropzone]=\"['col']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"manage-cols-placeholder\">Drop here</div>\n <div *ngFor=\"let item of items; let i = index; trackBy: trackByUid\"\n class=\"manage-cols-row cqa-flex cqa-items-center cqa-gap-2 cqa-px-2 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-gray-200 cqa-bg-gray-50\">\n <span class=\"manage-cols-handle cqa-flex cqa-items-center cqa-justify-center cqa-text-gray-400\"\n [dndDraggable]=\"item\"\n [dndDisableIf]=\"isLocked(item)\"\n dndType=\"col\"\n dndEffectAllowed=\"move\">\n <mat-icon style=\"font-size:18px;width:18px;height:18px;line-height:18px;\">drag_indicator</mat-icon>\n </span>\n <cqa-custom-input\n class=\"cqa-flex-1\"\n [value]=\"item.name\"\n [fullWidth]=\"true\"\n [disabled]=\"isLocked(item)\"\n inputInlineStyle=\"font-family: 'Inter', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onRename(i, $event)\">\n </cqa-custom-input>\n <button type=\"button\" class=\"manage-cols-icon-btn\"\n title=\"Move up\"\n [disabled]=\"i === 0\"\n (click)=\"onMove(i, -1)\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"manage-cols-icon-btn\"\n title=\"Move down\"\n [disabled]=\"i === items.length - 1\"\n (click)=\"onMove(i, 1)\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n <button type=\"button\" class=\"manage-cols-icon-btn manage-cols-icon-btn-danger\"\n title=\"Delete column\"\n [disabled]=\"isLocked(item)\"\n (click)=\"onRemove(i)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-pt-3 cqa-mt-1 cqa-border-t cqa-border-dashed cqa-border-gray-200\">\n <cqa-custom-input\n class=\"cqa-flex-1\"\n [value]=\"newColName\"\n [fullWidth]=\"true\"\n placeholder=\"New column name (e.g. currency)\"\n inputInlineStyle=\"font-family: 'Inter', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onNewColNameChange($event)\"\n (enterPressed)=\"onAdd()\">\n </cqa-custom-input>\n <cqa-button\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"add\"\n text=\"Add column\"\n [disabled]=\"!canAdd\"\n (clicked)=\"onAdd()\">\n </cqa-button>\n </div>\n\n <span *ngIf=\"columnsError\" class=\"cqa-text-xs cqa-text-red-600\">{{ columnsError }}</span>\n\n <div class=\"cqa-px-3 cqa-py-2 cqa-rounded-md cqa-bg-primary-surface cqa-border cqa-border-success-100 cqa-text-xs cqa-text-gray-700\">\n <strong class=\"cqa-text-gray-900\">Heads up:</strong>\n Deleting a column removes its data from every environment. Renaming keeps the data in place.\n </div>\n\n</div>\n" }]
128
+ }], propDecorators: { columns: [{
129
+ type: Input
130
+ }], lockedColumns: [{
131
+ type: Input
132
+ }] } });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLWNvbHVtbnMtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbWFuYWdlLWNvbHVtbnMtZGlhbG9nL21hbmFnZS1jb2x1bW5zLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL21hbmFnZS1jb2x1bW5zLWRpYWxvZy9tYW5hZ2UtY29sdW1ucy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFtQnpELE1BQU0sT0FBTyw0QkFBNEI7SUFMekM7UUFNVyxZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBRS9CLFVBQUssR0FBd0IsRUFBRSxDQUFDO1FBQ2hDLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBRW5DLGVBQVUsR0FBRyxDQUFDLENBQVMsRUFBRSxJQUF1QixFQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBRXJFLFlBQU8sR0FBRyxDQUFDLENBQUM7S0FzR3JCO0lBcEdDLFFBQVE7UUFDTixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkIsWUFBWSxFQUFFLElBQUk7WUFDbEIsSUFBSTtTQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVNLFFB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QUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQ2pGLENBQUM7O3lIQS9HVSw0QkFBNEI7NkdBQTVCLDRCQUE0Qix1TkNuQnpDLGd0R0EwRUE7MkZEdkRhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSwyQkFBMkIsUUFFL0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBRTs4QkFHekQsT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuXG5pbXBvcnQge1xuICBNYW5hZ2VDb2x1bW5zRGlhbG9nQ29sdW1uLFxuICBNYW5hZ2VDb2x1bW5zRGlhbG9nVmFsdWUsXG59IGZyb20gJy4vbWFuYWdlLWNvbHVtbnMtZGlhbG9nLm1vZGVscyc7XG5cbmludGVyZmFjZSBNYW5hZ2VDb2x1bW5zSXRlbSB7XG4gIHVpZDogbnVtYmVyO1xuICBvcmlnaW5hbE5hbWU6IHN0cmluZyB8IG51bGw7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLW1hbmFnZS1jb2x1bW5zLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYW5hZ2UtY29sdW1ucy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnLCBzdHlsZTogJ2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTsnIH0sXG59KVxuZXhwb3J0IGNsYXNzIE1hbmFnZUNvbHVtbnNEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBjb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBsb2NrZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBpdGVtczogTWFuYWdlQ29sdW1uc0l0ZW1bXSA9IFtdO1xuICBwdWJsaWMgbmV3Q29sTmFtZSA9ICcnO1xuICBwdWJsaWMgY29sdW1uc0Vycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgdHJhY2tCeVVpZCA9IChfOiBudW1iZXIsIGl0ZW06IE1hbmFnZUNvbHVtbnNJdGVtKTogbnVtYmVyID0+IGl0ZW0udWlkO1xuXG4gIHByaXZhdGUgbmV4dFVpZCA9IDE7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbCA9IEFycmF5LmlzQXJyYXkodGhpcy5jb2x1bW5zKSA/IHRoaXMuY29sdW1ucyA6IFtdO1xuICAgIHRoaXMuaXRlbXMgPSBpbml0aWFsLm1hcChuYW1lID0+ICh7XG4gICAgICB1aWQ6IHRoaXMubmV4dFVpZCsrLFxuICAgICAgb3JpZ2luYWxOYW1lOiBuYW1lLFxuICAgICAgbmFtZSxcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgaXNMb2NrZWQoaXRlbTogTWFuYWdlQ29sdW1uc0l0ZW0pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubG9ja2VkQ29sdW1ucyB8fCB0aGlzLmxvY2tlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChpdGVtLm9yaWdpbmFsTmFtZSAhPSBudWxsICYmIHRoaXMubG9ja2VkQ29sdW1ucy5pbmRleE9mKGl0ZW0ub3JpZ2luYWxOYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2NrZWRDb2x1bW5zLmluZGV4T2YoaXRlbS5uYW1lKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgb25EbmREcm9wKGV2ZW50OiBEbmREcm9wRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFnZ2VkID0gZXZlbnQuZGF0YSBhcyBNYW5hZ2VDb2x1bW5zSXRlbSB8IG51bGw7XG4gICAgaWYgKCFkcmFnZ2VkIHx8IGV2ZW50LmluZGV4ID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuaXRlbXMuZmluZEluZGV4KGl0ID0+IGl0LnVpZCA9PT0gZHJhZ2dlZC51aWQpO1xuICAgIGlmIChmcm9tIDwgMCkgeyByZXR1cm47IH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pdGVtcy5zbGljZSgpO1xuICAgIG5leHQuc3BsaWNlKGZyb20sIDEpO1xuICAgIGNvbnN0IHRvID0gZXZlbnQuaW5kZXggPiBmcm9tID8gZXZlbnQuaW5kZXggLSAxIDogZXZlbnQuaW5kZXg7XG4gICAgbmV4dC5zcGxpY2UodG8sIDAsIGRyYWdnZWQpO1xuICAgIHRoaXMuaXRlbXMgPSBuZXh0O1xuICB9XG5cbiAgcHVibGljIG9uTW92ZShpbmRleDogbnVtYmVyLCBkaXI6IC0xIHwgMSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGluZGV4ICsgZGlyO1xuICAgIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSB0aGlzLml0ZW1zLmxlbmd0aCkgeyByZXR1cm47IH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5pdGVtcy5zbGljZSgpO1xuICAgIFtuZXh0W2luZGV4XSwgbmV4dFt0YXJnZXRdXSA9IFtuZXh0W3RhcmdldF0sIG5leHRbaW5kZXhdXTtcbiAgICB0aGlzLml0ZW1zID0gbmV4dDtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbmFtZShpbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLml0ZW1zW2luZGV4XSkgeyByZXR1cm47IH1cbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5tYXAoKGl0LCBpKSA9PiBpID09PSBpbmRleCA/IHsgLi4uaXQsIG5hbWU6IHZhbHVlIH0gOiBpdCk7XG4gICAgdGhpcy5jb2x1bW5zRXJyb3IgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uUmVtb3ZlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1tpbmRleF07XG4gICAgaWYgKCFpdGVtIHx8IHRoaXMuaXNMb2NrZWQoaXRlbSkpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy5jb2x1bW5zRXJyb3IgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uTmV3Q29sTmFtZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5uZXdDb2xOYW1lID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgb25BZGQoKTogdm9pZCB7XG4gICAgY29uc3QgdHJpbW1lZCA9ICh0aGlzLm5ld0NvbE5hbWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQgfHwgdGhpcy5pdGVtc0hhc05hbWUodHJpbW1lZCkpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zLCB7XG4gICAgICB1aWQ6IHRoaXMubmV4dFVpZCsrLFxuICAgICAgb3JpZ2luYWxOYW1lOiBudWxsLFxuICAgICAgbmFtZTogdHJpbW1lZCxcbiAgICB9XTtcbiAgICB0aGlzLm5ld0NvbE5hbWUgPSAnJztcbiAgICB0aGlzLmNvbHVtbnNFcnJvciA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhbkFkZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmltbWVkID0gKHRoaXMubmV3Q29sTmFtZSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gIXRoaXMuaXRlbXNIYXNOYW1lKHRyaW1tZWQpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlKCk6IE1hbmFnZUNvbHVtbnNEaWFsb2dWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IHRyaW1tZWQ6IE1hbmFnZUNvbHVtbnNEaWFsb2dDb2x1bW5bXSA9IHRoaXMuaXRlbXMubWFwKGl0ID0+ICh7XG4gICAgICBvcmlnaW5hbE5hbWU6IGl0Lm9yaWdpbmFsTmFtZSxcbiAgICAgIG5hbWU6IChpdC5uYW1lIHx8ICcnKS50cmltKCksXG4gICAgfSkpO1xuXG4gICAgaWYgKHRyaW1tZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnNFcnJvciA9ICdBdCBsZWFzdCBvbmUgY29sdW1uIGlzIHJlcXVpcmVkLic7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRyaW1tZWQuc29tZShjID0+IGMubmFtZS5sZW5ndGggPT09IDApKSB7XG4gICAgICB0aGlzLmNvbHVtbnNFcnJvciA9ICdDb2x1bW4gbmFtZXMgY2Fubm90IGJlIGVtcHR5Lic7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbG93ZXJlZCA9IHRyaW1tZWQubWFwKGMgPT4gYy5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChuZXcgU2V0KGxvd2VyZWQpLnNpemUgIT09IHRyaW1tZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbHVtbnNFcnJvciA9ICdDb2x1bW4gbmFtZXMgbXVzdCBiZSB1bmlxdWUuJztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuY29sdW1uc0Vycm9yID0gbnVsbDtcbiAgICByZXR1cm4geyBjb2x1bW5zOiB0cmltbWVkIH07XG4gIH1cblxuICBwcml2YXRlIGl0ZW1zSGFzTmFtZShjYW5kaWRhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxvd2VyZWQgPSBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zb21lKGl0ID0+IChpdC5uYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gbG93ZXJlZCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS13LWZ1bGxcIj5cblxuICA8ZGl2IGNsYXNzPVwibWFuYWdlLWNvbHMtZHJvcC1saXN0IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIlxuICAgICAgIFtkbmREcm9wem9uZV09XCJbJ2NvbCddXCJcbiAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgZG5kRHJhZ292ZXJDbGFzcz1cImRuZERyYWdvdmVyXCJcbiAgICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJtYW5hZ2UtY29scy1wbGFjZWhvbGRlclwiPkRyb3AgaGVyZTwvZGl2PlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlVaWRcIlxuICAgICAgICAgY2xhc3M9XCJtYW5hZ2UtY29scy1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTIgY3FhLXB5LTEuNSBjcWEtcm91bmRlZC1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0yMDAgY3FhLWJnLWdyYXktNTBcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibWFuYWdlLWNvbHMtaGFuZGxlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwXCJcbiAgICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwiaXRlbVwiXG4gICAgICAgICAgICBbZG5kRGlzYWJsZUlmXT1cImlzTG9ja2VkKGl0ZW0pXCJcbiAgICAgICAgICAgIGRuZFR5cGU9XCJjb2xcIlxuICAgICAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIj5cbiAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE4cHg7d2lkdGg6MThweDtoZWlnaHQ6MThweDtsaW5lLWhlaWdodDoxOHB4O1wiPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXgtMVwiXG4gICAgICAgIFt2YWx1ZV09XCJpdGVtLm5hbWVcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2NrZWQoaXRlbSlcIlxuICAgICAgICBpbnB1dElubGluZVN0eWxlPVwiZm9udC1mYW1pbHk6ICdJbnRlcicsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1wiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblJlbmFtZShpLCAkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1hbmFnZS1jb2xzLWljb24tYnRuXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJNb3ZlIHVwXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImkgPT09IDBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Nb3ZlKGksIC0xKVwiPlxuICAgICAgICA8bWF0LWljb24+YXJyb3dfdXB3YXJkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYW5hZ2UtY29scy1pY29uLWJ0blwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiTW92ZSBkb3duXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImkgPT09IGl0ZW1zLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Nb3ZlKGksIDEpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFuYWdlLWNvbHMtaWNvbi1idG4gbWFuYWdlLWNvbHMtaWNvbi1idG4tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgY29sdW1uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9ja2VkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlKGkpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHQtMyBjcWEtbXQtMSBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICBjbGFzcz1cImNxYS1mbGV4LTFcIlxuICAgICAgW3ZhbHVlXT1cIm5ld0NvbE5hbWVcIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiTmV3IGNvbHVtbiBuYW1lIChlLmcuIGN1cnJlbmN5KVwiXG4gICAgICBpbnB1dElubGluZVN0eWxlPVwiZm9udC1mYW1pbHk6ICdJbnRlcicsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1wiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25OZXdDb2xOYW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGVudGVyUHJlc3NlZCk9XCJvbkFkZCgpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIGljb249XCJhZGRcIlxuICAgICAgdGV4dD1cIkFkZCBjb2x1bW5cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYW5BZGRcIlxuICAgICAgKGNsaWNrZWQpPVwib25BZGQoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gKm5nSWY9XCJjb2x1bW5zRXJyb3JcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LXJlZC02MDBcIj57eyBjb2x1bW5zRXJyb3IgfX08L3NwYW4+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1weC0zIGNxYS1weS0yIGNxYS1yb3VuZGVkLW1kIGNxYS1iZy1wcmltYXJ5LXN1cmZhY2UgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXN1Y2Nlc3MtMTAwIGNxYS10ZXh0LXhzIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgPHN0cm9uZyBjbGFzcz1cImNxYS10ZXh0LWdyYXktOTAwXCI+SGVhZHMgdXA6PC9zdHJvbmc+XG4gICAgRGVsZXRpbmcgYSBjb2x1bW4gcmVtb3ZlcyBpdHMgZGF0YSBmcm9tIGV2ZXJ5IGVudmlyb25tZW50LiBSZW5hbWluZyBrZWVwcyB0aGUgZGF0YSBpbiBwbGFjZS5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLWNvbHVtbnMtZGlhbG9nLm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvbWFuYWdlLWNvbHVtbnMtZGlhbG9nL21hbmFnZS1jb2x1bW5zLWRpYWxvZy5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlQ29sdW1uc0RpYWxvZ0NvbHVtbiB7XG4gIG9yaWdpbmFsTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZUNvbHVtbnNEaWFsb2dWYWx1ZSB7XG4gIGNvbHVtbnM6IE1hbmFnZUNvbHVtbnNEaWFsb2dDb2x1bW5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VDb2x1bW5zRGlhbG9nSW5wdXRzIHtcbiAgY29sdW1ucz86IHN0cmluZ1tdO1xuICBsb2NrZWRDb2x1bW5zPzogc3RyaW5nW107XG59XG4iXX0=
@@ -28,6 +28,14 @@ export class MoveToFolderDialogComponent {
28
28
  this.currentFolderId = null;
29
29
  /** Controls which folder is visually selected. Two-way-bind friendly via `pickedFolderIdChange`. */
30
30
  this.pickedFolderId = null;
31
+ /** Disables the top-level "Unorganised / no folder" row. Decoupled from `currentFolderId`
32
+ * so consumers that reuse this picker for non-move flows (e.g. parent-folder selection
33
+ * inside the New Folder dialog) can keep the root option clickable. The move flows wire
34
+ * this to `currentFolderId == null`. */
35
+ this.rootDisabled = false;
36
+ /** CSS height for the scrollable picker container. Lets embedders shrink the picker when
37
+ * it shares space with other fields (e.g. inside the New Folder dialog). */
38
+ this.pickerHeight = '360px';
31
39
  /** Fires whenever the user picks a destination. */
32
40
  this.folderPicked = new EventEmitter();
33
41
  /** Companion output for banana-in-the-box `[(pickedFolderId)]` binding. */
@@ -39,7 +47,7 @@ export class MoveToFolderDialogComponent {
39
47
  this.seedExpandedIds();
40
48
  }
41
49
  ngOnChanges(changes) {
42
- if (changes['initialExpandedIds'] || changes['currentFolderId'] || changes['folders']) {
50
+ if (changes['initialExpandedIds'] || changes['currentFolderId'] || changes['pickedFolderId'] || changes['folders']) {
43
51
  this.seedExpandedIds();
44
52
  }
45
53
  }
@@ -49,9 +57,13 @@ export class MoveToFolderDialogComponent {
49
57
  return;
50
58
  }
51
59
  this.expandedIds = new Set();
52
- if (this.currentFolderId != null) {
60
+ // Prefer currentFolderId (the disabled "self" row) so the user lands on it; fall back
61
+ // to pickedFolderId so non-move flows (e.g. parent picker) still open with the
62
+ // pre-selected node visible.
63
+ const seed = this.currentFolderId != null ? this.currentFolderId : this.pickedFolderId;
64
+ if (seed != null) {
53
65
  const trail = [];
54
- this.collectAncestors(this.folders, this.currentFolderId, trail);
66
+ this.collectAncestors(this.folders, seed, trail);
55
67
  trail.forEach(id => this.expandedIds.add(id));
56
68
  }
57
69
  }
@@ -90,6 +102,9 @@ export class MoveToFolderDialogComponent {
90
102
  isPicked(id) {
91
103
  return this.pickedFolderId === id;
92
104
  }
105
+ get isUnorganisedDisabled() {
106
+ return this.rootDisabled;
107
+ }
93
108
  pick(id) {
94
109
  this.pickedFolderId = id;
95
110
  this.folderPicked.emit(id);
@@ -108,7 +123,7 @@ export class MoveToFolderDialogComponent {
108
123
  }
109
124
  }
110
125
  MoveToFolderDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MoveToFolderDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
111
- MoveToFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveToFolderDialogComponent, selector: "cqa-move-to-folder-dialog", inputs: { folders: "folders", labels: "labels", currentFolderId: "currentFolderId", pickedFolderId: "pickedFolderId", initialExpandedIds: "initialExpandedIds" }, outputs: { folderPicked: "folderPicked", pickedFolderIdChange: "pickedFolderIdChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: `
126
+ MoveToFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveToFolderDialogComponent, selector: "cqa-move-to-folder-dialog", inputs: { folders: "folders", labels: "labels", currentFolderId: "currentFolderId", pickedFolderId: "pickedFolderId", initialExpandedIds: "initialExpandedIds", rootDisabled: "rootDisabled", pickerHeight: "pickerHeight" }, outputs: { folderPicked: "folderPicked", pickedFolderIdChange: "pickedFolderIdChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: `
112
127
  <!-- Reusable outlined folder icon. Stroke uses currentColor so the row's text color drives the icon. -->
113
128
  <ng-template #folderIconTpl>
114
129
  <svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="cqa-shrink-0">
@@ -123,16 +138,19 @@ MoveToFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.
123
138
  </svg>
124
139
  </ng-template>
125
140
 
126
- <div class="cqa-flex cqa-flex-col cqa-border-solid cqa-border cqa-border-[#E2E2E3] cqa-rounded-[10px] cqa-py-2 cqa-w-full cqa-h-[360px] cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin">
141
+ <div class="cqa-flex cqa-flex-col cqa-border-solid cqa-border cqa-border-[#E2E2E3] cqa-rounded-[10px] cqa-py-2 cqa-w-full cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin" [style.height]="pickerHeight">
127
142
  <!-- Unorganised (root / no folder) -->
128
143
  <div
129
144
  role="button"
130
145
  tabindex="0"
131
146
  class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-px-4 cqa-py-2 cqa-cursor-pointer cqa-transition-colors cqa-text-sm"
132
147
  [ngClass]="isPicked(null) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
133
- (click)="pick(null)"
134
- (keydown.enter)="pick(null)"
135
- (keydown.space)="$event.preventDefault(); pick(null)"
148
+ [class.cqa-opacity-40]="isUnorganisedDisabled"
149
+ [class.cqa-cursor-not-allowed]="isUnorganisedDisabled"
150
+ [attr.aria-disabled]="isUnorganisedDisabled || null"
151
+ (click)="!isUnorganisedDisabled && pick(null)"
152
+ (keydown.enter)="!isUnorganisedDisabled && pick(null)"
153
+ (keydown.space)="$event.preventDefault(); !isUnorganisedDisabled && pick(null)"
136
154
  >
137
155
  <!-- chevron-slot placeholder so all rows line up -->
138
156
  <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-shrink-0"></span>
@@ -193,16 +211,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
193
211
  </svg>
194
212
  </ng-template>
195
213
 
196
- <div class="cqa-flex cqa-flex-col cqa-border-solid cqa-border cqa-border-[#E2E2E3] cqa-rounded-[10px] cqa-py-2 cqa-w-full cqa-h-[360px] cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin">
214
+ <div class="cqa-flex cqa-flex-col cqa-border-solid cqa-border cqa-border-[#E2E2E3] cqa-rounded-[10px] cqa-py-2 cqa-w-full cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin" [style.height]="pickerHeight">
197
215
  <!-- Unorganised (root / no folder) -->
198
216
  <div
199
217
  role="button"
200
218
  tabindex="0"
201
219
  class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-px-4 cqa-py-2 cqa-cursor-pointer cqa-transition-colors cqa-text-sm"
202
220
  [ngClass]="isPicked(null) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
203
- (click)="pick(null)"
204
- (keydown.enter)="pick(null)"
205
- (keydown.space)="$event.preventDefault(); pick(null)"
221
+ [class.cqa-opacity-40]="isUnorganisedDisabled"
222
+ [class.cqa-cursor-not-allowed]="isUnorganisedDisabled"
223
+ [attr.aria-disabled]="isUnorganisedDisabled || null"
224
+ (click)="!isUnorganisedDisabled && pick(null)"
225
+ (keydown.enter)="!isUnorganisedDisabled && pick(null)"
226
+ (keydown.space)="$event.preventDefault(); !isUnorganisedDisabled && pick(null)"
206
227
  >
207
228
  <!-- chevron-slot placeholder so all rows line up -->
208
229
  <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-shrink-0"></span>
@@ -256,9 +277,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
256
277
  type: Input
257
278
  }], initialExpandedIds: [{
258
279
  type: Input
280
+ }], rootDisabled: [{
281
+ type: Input
282
+ }], pickerHeight: [{
283
+ type: Input
259
284
  }], folderPicked: [{
260
285
  type: Output
261
286
  }], pickedFolderIdChange: [{
262
287
  type: Output
263
288
  }] } });
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVtcGxhdGVzL21vZHVsYXItdGFibGUtdGVtcGxhdGUvZGlhbG9ncy9tb3ZlLXRvLWZvbGRlci1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBNkIsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBV3JHOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBMkVILE1BQU0sT0FBTywyQkFBMkI7SUFtQnRDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEIxQyxnQ0FBZ0M7UUFDdkIsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDcEMsdUJBQXVCO1FBQ2QsV0FBTSxHQUFrQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUMvRCw4RkFBOEY7UUFDckYsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBQy9DLG9HQUFvRztRQUMzRixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFJOUMsbURBQW1EO1FBQ3pDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDM0QsMkVBQTJFO1FBQ2pFLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRTNELGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQStFeEMsY0FBUyxHQUFHLENBQUMsQ0FBUyxFQUFFLEdBQWtCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUE3RWYsQ0FBQztJQUU5QyxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMQVJfTEFCRUxTLCBGb2xkZXJOb2RlLCBNb2R1bGFyTGFiZWxzIH0gZnJvbSAnLi4vbW9kdWxhci10YWJsZS10ZW1wbGF0ZS5tb2RlbHMnO1xuXG5pbnRlcmZhY2UgRmxhdEZvbGRlclJvdyB7XG4gIGlkOiBudW1iZXIgfCBudWxsO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlcHRoOiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBoYXNDaGlsZHJlbjogYm9vbGVhbjtcbiAgZXhwYW5kZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRm9sZGVyLXBpY2tlciBib2R5IHVzZWQgaW5zaWRlIHRoZSBNb3ZlLXRvLUZvbGRlciBkaWFsb2cuXG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gYmUgdXNhYmxlIHR3byB3YXlzOlxuICpcbiAqICAxLiAqKkZyb20gaW5zaWRlIHRoZSBsaWJyYXJ5KiogdmlhIGBEaWFsb2dTZXJ2aWNlLm9wZW4oeyBjb250ZW50OiB7IHR5cGU6ICdjb21wb25lbnQnLCBjb21wb25lbnQ6IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCwgaW5wdXRzOiB7Li4ufSB9IH0pYC5cbiAqICAgICBUaGUgb3V0ZXIgYGNxYS1kaWFsb2dgIHByb3ZpZGVzIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24sIENhbmNlbCBhbmQgXCJNb3ZlIGhlcmVcIlxuICogICAgIGJ1dHRvbnM7IHRoZSBNb3ZlIGJ1dHRvbiByZWFkcyBgcGlja2VkRm9sZGVySWRgIHZpYSBgZGlhbG9nUmVmLmdldENvbXBvbmVudEluc3RhbmNlKClgLlxuICpcbiAqICAyLiAqKkZyb20gdGhlIGhvc3QvVUkgbGF5ZXIgZGlyZWN0bHkqKiBvbmNlIEFQSSBvd25lcnNoaXAgbW92ZXMgdXAuIFRoZSBob3N0XG4gKiAgICAgcmVuZGVycyBgPGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+YCBpbnNpZGUgaXRzIG93biBtb2RhbCBzaGVsbCBhbmRcbiAqICAgICBsaXN0ZW5zIHRvIGAoZm9sZGVyUGlja2VkKWAgKGZpcmVzIG9uIGV2ZXJ5IHBpY2spIHRvIGRyaXZlIGl0cyBvd24gXCJNb3ZlIGhlcmVcIlxuICogICAgIGJ1dHRvbi4gQWxsIHZpc3VhbCBzdGF0ZSBsaXZlcyBvbiBgcGlja2VkRm9sZGVySWRgIHNvIGhvc3RzIGNhbiBhbHNvIHR3by13YXlcbiAqICAgICBiaW5kIGlmIHRoZXkgcHJlZmVyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW92ZS10by1mb2xkZXItZGlhbG9nJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIFJldXNhYmxlIG91dGxpbmVkIGZvbGRlciBpY29uLiBTdHJva2UgdXNlcyBjdXJyZW50Q29sb3Igc28gdGhlIHJvdydzIHRleHQgY29sb3IgZHJpdmVzIHRoZSBpY29uLiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2ZvbGRlckljb25UcGw+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTcgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImNxYS1zaHJpbmstMFwiPlxuICAgICAgICA8cGF0aCBkPVwiTTE1LjYzNzUgMTIuNjM3N0MxNS42Mzc1IDEzLjAzNTUgMTUuNDc5NCAxMy40MTcxIDE1LjE5ODEgMTMuNjk4NEMxNC45MTY4IDEzLjk3OTcgMTQuNTM1MyAxNC4xMzc3IDE0LjEzNzUgMTQuMTM3N0gyLjEzNzQ1QzEuNzM5NjMgMTQuMTM3NyAxLjM1ODEgMTMuOTc5NyAxLjA3Njc5IDEzLjY5ODRDMC43OTU0ODYgMTMuNDE3MSAwLjYzNzQ1MSAxMy4wMzU1IDAuNjM3NDUxIDEyLjYzNzdWMi4xMzc3QzAuNjM3NDUxIDEuNzM5ODcgMC43OTU0ODYgMS4zNTgzNCAxLjA3Njc5IDEuMDc3MDRDMS4zNTgxIDAuNzk1NzMxIDEuNzM5NjMgMC42Mzc2OTUgMi4xMzc0NSAwLjYzNzY5NUg1Ljg4NzQ1TDcuMzg3NDUgMi44ODc3SDE0LjEzNzVDMTQuNTM1MyAyLjg4NzcgMTQuOTE2OCAzLjA0NTczIDE1LjE5ODEgMy4zMjcwNEMxNS40Nzk0IDMuNjA4MzQgMTUuNjM3NSAzLjk4OTg3IDE1LjYzNzUgNC4zODc3VjEyLjYzNzdaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSZXVzYWJsZSBvdXRsaW5lZCBhcmNoaXZlL2luYm94IGljb24gZm9yIHRoZSBcIlVub3JnYW5pc2VkXCIgZW50cnkuIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjdW5vcmdhbmlzZWRJY29uVHBsPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDE3IDE1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJjcWEtc2hyaW5rLTBcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xNC42ODc1IDUuNVYxMi41QzE0LjY4NzUgMTMuMyAxNC4wMzc1IDE0IDEzLjE4NzUgMTRIMy44MTI1QzIuOTYyNSAxNCAyLjMxMjUgMTMuMyAyLjMxMjUgMTIuNVY1LjVNMTQuNjg3NSA1LjVMMTIuNzg3NSAxLjdDMTIuNTM3NSAxLjIgMTIuMDg3NSAxIDExLjU4NzUgMUg1LjQxMjVDNC45MTI1IDEgNC40NjI1IDEuMiA0LjIxMjUgMS43TDIuMzEyNSA1LjVNMTQuNjg3NSA1LjVIMi4zMTI1TTYuMTg3NSA4LjVIMTAuODEyNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjc1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtcHktMiBjcWEtdy1mdWxsIGNxYS1oLVszNjBweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXNjcm9sbGJhci10aGluXCI+XG4gICAgICA8IS0tIFVub3JnYW5pc2VkIChyb290IC8gbm8gZm9sZGVyKSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIuNSBjcWEtcHgtNCBjcWEtcHktMiBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS10ZXh0LXNtXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaXNQaWNrZWQobnVsbCkgPyAnY3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1pbmRpZ28tNzAwJyA6ICdjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC01MCdcIlxuICAgICAgICAoY2xpY2spPVwicGljayhudWxsKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cInBpY2sobnVsbClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgcGljayhudWxsKVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gY2hldnJvbi1zbG90IHBsYWNlaG9sZGVyIHNvIGFsbCByb3dzIGxpbmUgdXAgLS0+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy01IGNxYS1oLTUgY3FhLXNocmluay0wXCI+PC9zcGFuPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidW5vcmdhbmlzZWRJY29uVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxzcGFuPnt7IGxhYmVscy5tb3ZlRGlhbG9nUm9vdCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZvbGRlciByb3dzIChmbGF0dGVuZWQsIGRlcHRoLWluZGVudGVkLCBjb2xsYXBzaWJsZSkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgZmxhdFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yLjUgY3FhLXB5LTIgY3FhLXByLTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtdGV4dC1zbVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlzUGlja2VkKHJvdy5pZCkgPyAnY3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1pbmRpZ28tNzAwJyA6ICdjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC01MCdcIlxuICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktNDBdPVwicm93LmRpc2FibGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1jdXJzb3Itbm90LWFsbG93ZWRdPVwicm93LmRpc2FibGVkXCJcbiAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cIjE2ICsgcm93LmRlcHRoICogMjRcIlxuICAgICAgICAoY2xpY2spPVwiIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIhcm93LmRpc2FibGVkICYmIHBpY2socm93LmlkKVwiXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiFyb3cuZGlzYWJsZWQgJiYgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICFyb3cuZGlzYWJsZWQgJiYgcGljayhyb3cuaWQpXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBDaGV2cm9uIHRvZ2dsZSBmb3IgZXhwYW5kYWJsZSBmb2xkZXJzIChwbGFjZWhvbGRlciBvdGhlcndpc2Ugc28gYWxpZ25tZW50IHN0YXlzKSAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwicm93Lmhhc0NoaWxkcmVuOyBlbHNlIGNoZXZyb25QbGFjZWhvbGRlclwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctNSBjcWEtaC01IGNxYS1zaHJpbmstMCBjcWEtcm91bmRlZCBjcWEtdGV4dC1uZXV0cmFsLTYwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgaG92ZXI6Y3FhLXRleHQtbmV1dHJhbC05MDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicm93LmV4cGFuZGVkID8gJ0NvbGxhcHNlICcgKyByb3cubmFtZSA6ICdFeHBhbmQgJyArIHJvdy5uYW1lXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQocm93LmlkISwgJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgW2NsYXNzLmNxYS1yb3RhdGUtOTBdPVwicm93LmV4cGFuZGVkXCIgc3R5bGU9XCJ0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTIwbXMgZWFzZTtcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSAzTDkgN0w1IDExXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjaGV2cm9uUGxhY2Vob2xkZXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrIGNxYS13LTUgY3FhLWgtNSBjcWEtc2hyaW5rLTBcIj48L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb25UcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdHJ1bmNhdGVcIj57eyByb3cubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBGb2xkZXIgdHJlZSB0byBwaWNrIGZyb20uICovXG4gIEBJbnB1dCgpIGZvbGRlcnM6IEZvbGRlck5vZGVbXSA9IFtdO1xuICAvKiogTGFiZWwgb3ZlcnJpZGVzLiAqL1xuICBASW5wdXQoKSBsYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgLyoqIFRoZSBmb2xkZXIgdGhlIHRlc3RzIGN1cnJlbnRseSBsaXZlIGluIOKAlCByZW5kZXJlZCBhcyBkaXNhYmxlZCAoY2FuJ3QgbW92ZSBpbnRvIGl0c2VsZikuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb250cm9scyB3aGljaCBmb2xkZXIgaXMgdmlzdWFsbHkgc2VsZWN0ZWQuIFR3by13YXktYmluZCBmcmllbmRseSB2aWEgYHBpY2tlZEZvbGRlcklkQ2hhbmdlYC4gKi9cbiAgQElucHV0KCkgcGlja2VkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogRm9sZGVyIGlkcyB0byBleHBhbmQgYnkgZGVmYXVsdC4gSWYgbm90IHByb3ZpZGVkLCBhbmNlc3RvcnMgb2YgYGN1cnJlbnRGb2xkZXJJZGAgYXJlIGV4cGFuZGVkLiAqL1xuICBASW5wdXQoKSBpbml0aWFsRXhwYW5kZWRJZHM/OiBudW1iZXJbXTtcblxuICAvKiogRmlyZXMgd2hlbmV2ZXIgdGhlIHVzZXIgcGlja3MgYSBkZXN0aW5hdGlvbi4gKi9cbiAgQE91dHB1dCgpIGZvbGRlclBpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgLyoqIENvbXBhbmlvbiBvdXRwdXQgZm9yIGJhbmFuYS1pbi10aGUtYm94IGBbKHBpY2tlZEZvbGRlcklkKV1gIGJpbmRpbmcuICovXG4gIEBPdXRwdXQoKSBwaWNrZWRGb2xkZXJJZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwcml2YXRlIGV4cGFuZGVkSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VlZEV4cGFuZGVkSWRzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxFeHBhbmRlZElkcyddIHx8IGNoYW5nZXNbJ2N1cnJlbnRGb2xkZXJJZCddIHx8IGNoYW5nZXNbJ2ZvbGRlcnMnXSkge1xuICAgICAgdGhpcy5zZWVkRXhwYW5kZWRJZHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlZWRFeHBhbmRlZElkcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsRXhwYW5kZWRJZHM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5leHBhbmRlZElkcyA9IG5ldyBTZXQodGhpcy5pbml0aWFsRXhwYW5kZWRJZHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuZGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRGb2xkZXJJZCAhPSBudWxsKSB7XG4gICAgICBjb25zdCB0cmFpbDogbnVtYmVyW10gPSBbXTtcbiAgICAgIHRoaXMuY29sbGVjdEFuY2VzdG9ycyh0aGlzLmZvbGRlcnMsIHRoaXMuY3VycmVudEZvbGRlcklkLCB0cmFpbCk7XG4gICAgICB0cmFpbC5mb3JFYWNoKGlkID0+IHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QW5jZXN0b3JzKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIsIGFjYzogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4uaWQpO1xuICAgICAgaWYgKG4uaWQgPT09IHRhcmdldElkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIHRoaXMuY29sbGVjdEFuY2VzdG9ycyhuLmNoaWxkcmVuLCB0YXJnZXRJZCwgYWNjKSkgcmV0dXJuIHRydWU7XG4gICAgICBhY2MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBmbGF0Um93cygpOiBGbGF0Rm9sZGVyUm93W10ge1xuICAgIGNvbnN0IG91dDogRmxhdEZvbGRlclJvd1tdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIShuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkSWRzLmhhcyhuLmlkKTtcbiAgICAgICAgb3V0LnB1c2goe1xuICAgICAgICAgIGlkOiBuLmlkLFxuICAgICAgICAgIG5hbWU6IG4ubmFtZSxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBkaXNhYmxlZDogbi5pZCA9PT0gdGhpcy5jdXJyZW50Rm9sZGVySWQsXG4gICAgICAgICAgaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgZXhwYW5kZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzQ2hpbGRyZW4gJiYgZXhwYW5kZWQpIHdhbGsobi5jaGlsZHJlbiEsIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgMCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlzUGlja2VkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VkRm9sZGVySWQgPT09IGlkO1xuICB9XG5cbiAgcGljayhpZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucGlja2VkRm9sZGVySWQgPSBpZDtcbiAgICB0aGlzLmZvbGRlclBpY2tlZC5lbWl0KGlkKTtcbiAgICB0aGlzLnBpY2tlZEZvbGRlcklkQ2hhbmdlLmVtaXQoaWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlRXhwYW5kZWQoaWQ6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZXhwYW5kZWRJZHMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5leHBhbmRlZElkcy5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGVkSWRzLmFkZChpZCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUlkID0gKF86IG51bWJlciwgcm93OiBGbGF0Rm9sZGVyUm93KSA9PiByb3cuaWQgPz8gLTE7XG59XG4iXX0=
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVtcGxhdGVzL21vZHVsYXItdGFibGUtdGVtcGxhdGUvZGlhbG9ncy9tb3ZlLXRvLWZvbGRlci1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBNkIsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBV3JHOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBOEVILE1BQU0sT0FBTywyQkFBMkI7SUE4QnRDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0IxQyxnQ0FBZ0M7UUFDdkIsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDcEMsdUJBQXVCO1FBQ2QsV0FBTSxHQUFrQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUMvRCw4RkFBOEY7UUFDckYsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBQy9DLG9HQUFvRztRQUMzRixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFLOUM7OztpREFHeUM7UUFDaEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkM7cUZBQzZFO1FBQ3BFLGlCQUFZLEdBQVcsT0FBTyxDQUFDO1FBRXhDLG1EQUFtRDtRQUN6QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQzNELDJFQUEyRTtRQUNqRSx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUUzRCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUF1RnhDLGNBQVMsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFrQixFQUFFLEVBQUUsQ0FBQyxHQUFHLENB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QkFBMkIsWUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRVQsUUFFSyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTt3R0FJdEMsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfTU9EVUxBUl9MQUJFTFMsIEZvbGRlck5vZGUsIE1vZHVsYXJMYWJlbHMgfSBmcm9tICcuLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5cbmludGVyZmFjZSBGbGF0Rm9sZGVyUm93IHtcbiAgaWQ6IG51bWJlciB8IG51bGw7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVwdGg6IG51bWJlcjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGhhc0NoaWxkcmVuOiBib29sZWFuO1xuICBleHBhbmRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGb2xkZXItcGlja2VyIGJvZHkgdXNlZCBpbnNpZGUgdGhlIE1vdmUtdG8tRm9sZGVyIGRpYWxvZy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBiZSB1c2FibGUgdHdvIHdheXM6XG4gKlxuICogIDEuICoqRnJvbSBpbnNpZGUgdGhlIGxpYnJhcnkqKiB2aWEgYERpYWxvZ1NlcnZpY2Uub3Blbih7IGNvbnRlbnQ6IHsgdHlwZTogJ2NvbXBvbmVudCcsIGNvbXBvbmVudDogTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50LCBpbnB1dHM6IHsuLi59IH0gfSlgLlxuICogICAgIFRoZSBvdXRlciBgY3FhLWRpYWxvZ2AgcHJvdmlkZXMgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiwgQ2FuY2VsIGFuZCBcIk1vdmUgaGVyZVwiXG4gKiAgICAgYnV0dG9uczsgdGhlIE1vdmUgYnV0dG9uIHJlYWRzIGBwaWNrZWRGb2xkZXJJZGAgdmlhIGBkaWFsb2dSZWYuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKWAuXG4gKlxuICogIDIuICoqRnJvbSB0aGUgaG9zdC9VSSBsYXllciBkaXJlY3RseSoqIG9uY2UgQVBJIG93bmVyc2hpcCBtb3ZlcyB1cC4gVGhlIGhvc3RcbiAqICAgICByZW5kZXJzIGA8Y3FhLW1vdmUtdG8tZm9sZGVyLWRpYWxvZz5gIGluc2lkZSBpdHMgb3duIG1vZGFsIHNoZWxsIGFuZFxuICogICAgIGxpc3RlbnMgdG8gYChmb2xkZXJQaWNrZWQpYCAoZmlyZXMgb24gZXZlcnkgcGljaykgdG8gZHJpdmUgaXRzIG93biBcIk1vdmUgaGVyZVwiXG4gKiAgICAgYnV0dG9uLiBBbGwgdmlzdWFsIHN0YXRlIGxpdmVzIG9uIGBwaWNrZWRGb2xkZXJJZGAgc28gaG9zdHMgY2FuIGFsc28gdHdvLXdheVxuICogICAgIGJpbmQgaWYgdGhleSBwcmVmZXIuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gUmV1c2FibGUgb3V0bGluZWQgZm9sZGVyIGljb24uIFN0cm9rZSB1c2VzIGN1cnJlbnRDb2xvciBzbyB0aGUgcm93J3MgdGV4dCBjb2xvciBkcml2ZXMgdGhlIGljb24uIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjZm9sZGVySWNvblRwbD5cbiAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAxNyAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiY3FhLXNocmluay0wXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTUuNjM3NSAxMi42Mzc3QzE1LjYzNzUgMTMuMDM1NSAxNS40Nzk0IDEzLjQxNzEgMTUuMTk4MSAxMy42OTg0QzE0LjkxNjggMTMuOTc5NyAxNC41MzUzIDE0LjEzNzcgMTQuMTM3NSAxNC4xMzc3SDIuMTM3NDVDMS43Mzk2MyAxNC4xMzc3IDEuMzU4MSAxMy45Nzk3IDEuMDc2NzkgMTMuNjk4NEMwLjc5NTQ4NiAxMy40MTcxIDAuNjM3NDUxIDEzLjAzNTUgMC42Mzc0NTEgMTIuNjM3N1YyLjEzNzdDMC42Mzc0NTEgMS43Mzk4NyAwLjc5NTQ4NiAxLjM1ODM0IDEuMDc2NzkgMS4wNzcwNEMxLjM1ODEgMC43OTU3MzEgMS43Mzk2MyAwLjYzNzY5NSAyLjEzNzQ1IDAuNjM3Njk1SDUuODg3NDVMNy4zODc0NSAyLjg4NzdIMTQuMTM3NUMxNC41MzUzIDIuODg3NyAxNC45MTY4IDMuMDQ1NzMgMTUuMTk4MSAzLjMyNzA0QzE1LjQ3OTQgMy42MDgzNCAxNS42Mzc1IDMuOTg5ODcgMTUuNjM3NSA0LjM4NzdWMTIuNjM3N1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI3NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJldXNhYmxlIG91dGxpbmVkIGFyY2hpdmUvaW5ib3ggaWNvbiBmb3IgdGhlIFwiVW5vcmdhbmlzZWRcIiBlbnRyeS4gLS0+XG4gICAgPG5nLXRlbXBsYXRlICN1bm9yZ2FuaXNlZEljb25UcGw+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTcgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImNxYS1zaHJpbmstMFwiPlxuICAgICAgICA8cGF0aCBkPVwiTTE0LjY4NzUgNS41VjEyLjVDMTQuNjg3NSAxMy4zIDE0LjAzNzUgMTQgMTMuMTg3NSAxNEgzLjgxMjVDMi45NjI1IDE0IDIuMzEyNSAxMy4zIDIuMzEyNSAxMi41VjUuNU0xNC42ODc1IDUuNUwxMi43ODc1IDEuN0MxMi41Mzc1IDEuMiAxMi4wODc1IDEgMTEuNTg3NSAxSDUuNDEyNUM0LjkxMjUgMSA0LjQ2MjUgMS4yIDQuMjEyNSAxLjdMMi4zMTI1IDUuNU0xNC42ODc1IDUuNUgyLjMxMjVNNi4xODc1IDguNUgxMC44MTI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1weS0yIGNxYS13LWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXNjcm9sbGJhci10aGluXCIgW3N0eWxlLmhlaWdodF09XCJwaWNrZXJIZWlnaHRcIj5cbiAgICAgIDwhLS0gVW5vcmdhbmlzZWQgKHJvb3QgLyBubyBmb2xkZXIpIC0tPlxuICAgICAgPGRpdlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weC00IGNxYS1weS0yIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXRleHQtc21cIlxuICAgICAgICBbbmdDbGFzc109XCJpc1BpY2tlZChudWxsKSA/ICdjcWEtYmctaW5kaWdvLTUwIGNxYS10ZXh0LWluZGlnby03MDAnIDogJ2NxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTUwJ1wiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS00MF09XCJpc1Vub3JnYW5pc2VkRGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJpc1Vub3JnYW5pc2VkRGlzYWJsZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzVW5vcmdhbmlzZWREaXNhYmxlZCB8fCBudWxsXCJcbiAgICAgICAgKGNsaWNrKT1cIiFpc1Vub3JnYW5pc2VkRGlzYWJsZWQgJiYgcGljayhudWxsKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIiFpc1Vub3JnYW5pc2VkRGlzYWJsZWQgJiYgcGljayhudWxsKVwiXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAhaXNVbm9yZ2FuaXNlZERpc2FibGVkICYmIHBpY2sobnVsbClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIGNoZXZyb24tc2xvdCBwbGFjZWhvbGRlciBzbyBhbGwgcm93cyBsaW5lIHVwIC0tPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2sgY3FhLXctNSBjcWEtaC01IGNxYS1zaHJpbmstMFwiPjwvc3Bhbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInVub3JnYW5pc2VkSWNvblRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3Bhbj57eyBsYWJlbHMubW92ZURpYWxvZ1Jvb3QgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGb2xkZXIgcm93cyAoZmxhdHRlbmVkLCBkZXB0aC1pbmRlbnRlZCwgY29sbGFwc2libGUpIC0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIGZsYXRSb3dzOyB0cmFja0J5OiB0cmFja0J5SWRcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weS0yIGNxYS1wci00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXRleHQtc21cIlxuICAgICAgICBbbmdDbGFzc109XCJpc1BpY2tlZChyb3cuaWQpID8gJ2NxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtaW5kaWdvLTcwMCcgOiAnY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtNTAnXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTQwXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLW5vdC1hbGxvd2VkXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCIxNiArIHJvdy5kZXB0aCAqIDI0XCJcbiAgICAgICAgKGNsaWNrKT1cIiFyb3cuZGlzYWJsZWQgJiYgcGljayhyb3cuaWQpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIhcm93LmRpc2FibGVkICYmICRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAhcm93LmRpc2FibGVkICYmIHBpY2socm93LmlkKVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQ2hldnJvbiB0b2dnbGUgZm9yIGV4cGFuZGFibGUgZm9sZGVycyAocGxhY2Vob2xkZXIgb3RoZXJ3aXNlIHNvIGFsaWdubWVudCBzdGF5cykgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInJvdy5oYXNDaGlsZHJlbjsgZWxzZSBjaGV2cm9uUGxhY2Vob2xkZXJcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTUgY3FhLWgtNSBjcWEtc2hyaW5rLTAgY3FhLXJvdW5kZWQgY3FhLXRleHQtbmV1dHJhbC02MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGhvdmVyOmNxYS10ZXh0LW5ldXRyYWwtOTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJvdy5leHBhbmRlZCA/ICdDb2xsYXBzZSAnICsgcm93Lm5hbWUgOiAnRXhwYW5kICcgKyByb3cubmFtZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZGVkKHJvdy5pZCEsICRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jcWEtcm90YXRlLTkwXT1cInJvdy5leHBhbmRlZFwiIHN0eWxlPVwidHJhbnNpdGlvbjogdHJhbnNmb3JtIDEyMG1zIGVhc2U7XCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgM0w5IDdMNSAxMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hldnJvblBsYWNlaG9sZGVyPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy01IGNxYS1oLTUgY3FhLXNocmluay0wXCI+PC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRydW5jYXRlXCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogRm9sZGVyIHRyZWUgdG8gcGljayBmcm9tLiAqL1xuICBASW5wdXQoKSBmb2xkZXJzOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgLyoqIExhYmVsIG92ZXJyaWRlcy4gKi9cbiAgQElucHV0KCkgbGFiZWxzOiBNb2R1bGFyTGFiZWxzID0geyAuLi5ERUZBVUxUX01PRFVMQVJfTEFCRUxTIH07XG4gIC8qKiBUaGUgZm9sZGVyIHRoZSB0ZXN0cyBjdXJyZW50bHkgbGl2ZSBpbiDigJQgcmVuZGVyZWQgYXMgZGlzYWJsZWQgKGNhbid0IG1vdmUgaW50byBpdHNlbGYpLiAqL1xuICBASW5wdXQoKSBjdXJyZW50Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogQ29udHJvbHMgd2hpY2ggZm9sZGVyIGlzIHZpc3VhbGx5IHNlbGVjdGVkLiBUd28td2F5LWJpbmQgZnJpZW5kbHkgdmlhIGBwaWNrZWRGb2xkZXJJZENoYW5nZWAuICovXG4gIEBJbnB1dCgpIHBpY2tlZEZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZvbGRlciBpZHMgdG8gZXhwYW5kIGJ5IGRlZmF1bHQuIElmIG5vdCBwcm92aWRlZCwgYW5jZXN0b3JzIG9mIGBjdXJyZW50Rm9sZGVySWRgIChvclxuICAgKiAgYHBpY2tlZEZvbGRlcklkYCwgd2hlbiBubyBjdXJyZW50IGNvbnRleHQgZXhpc3RzKSBhcmUgZXhwYW5kZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxFeHBhbmRlZElkcz86IG51bWJlcltdO1xuXG4gIC8qKiBEaXNhYmxlcyB0aGUgdG9wLWxldmVsIFwiVW5vcmdhbmlzZWQgLyBubyBmb2xkZXJcIiByb3cuIERlY291cGxlZCBmcm9tIGBjdXJyZW50Rm9sZGVySWRgXG4gICAqICBzbyBjb25zdW1lcnMgdGhhdCByZXVzZSB0aGlzIHBpY2tlciBmb3Igbm9uLW1vdmUgZmxvd3MgKGUuZy4gcGFyZW50LWZvbGRlciBzZWxlY3Rpb25cbiAgICogIGluc2lkZSB0aGUgTmV3IEZvbGRlciBkaWFsb2cpIGNhbiBrZWVwIHRoZSByb290IG9wdGlvbiBjbGlja2FibGUuIFRoZSBtb3ZlIGZsb3dzIHdpcmVcbiAgICogIHRoaXMgdG8gYGN1cnJlbnRGb2xkZXJJZCA9PSBudWxsYC4gKi9cbiAgQElucHV0KCkgcm9vdERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIENTUyBoZWlnaHQgZm9yIHRoZSBzY3JvbGxhYmxlIHBpY2tlciBjb250YWluZXIuIExldHMgZW1iZWRkZXJzIHNocmluayB0aGUgcGlja2VyIHdoZW5cbiAgICogIGl0IHNoYXJlcyBzcGFjZSB3aXRoIG90aGVyIGZpZWxkcyAoZS5nLiBpbnNpZGUgdGhlIE5ldyBGb2xkZXIgZGlhbG9nKS4gKi9cbiAgQElucHV0KCkgcGlja2VySGVpZ2h0OiBzdHJpbmcgPSAnMzYwcHgnO1xuXG4gIC8qKiBGaXJlcyB3aGVuZXZlciB0aGUgdXNlciBwaWNrcyBhIGRlc3RpbmF0aW9uLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyUGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuICAvKiogQ29tcGFuaW9uIG91dHB1dCBmb3IgYmFuYW5hLWluLXRoZS1ib3ggYFsocGlja2VkRm9sZGVySWQpXWAgYmluZGluZy4gKi9cbiAgQE91dHB1dCgpIHBpY2tlZEZvbGRlcklkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuXG4gIHByaXZhdGUgZXhwYW5kZWRJZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWVkRXhwYW5kZWRJZHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEV4cGFuZGVkSWRzJ10gfHwgY2hhbmdlc1snY3VycmVudEZvbGRlcklkJ10gfHwgY2hhbmdlc1sncGlja2VkRm9sZGVySWQnXSB8fCBjaGFuZ2VzWydmb2xkZXJzJ10pIHtcbiAgICAgIHRoaXMuc2VlZEV4cGFuZGVkSWRzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWVkRXhwYW5kZWRJZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbEV4cGFuZGVkSWRzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRJZHMgPSBuZXcgU2V0KHRoaXMuaW5pdGlhbEV4cGFuZGVkSWRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZElkcyA9IG5ldyBTZXQoKTtcbiAgICAvLyBQcmVmZXIgY3VycmVudEZvbGRlcklkICh0aGUgZGlzYWJsZWQgXCJzZWxmXCIgcm93KSBzbyB0aGUgdXNlciBsYW5kcyBvbiBpdDsgZmFsbCBiYWNrXG4gICAgLy8gdG8gcGlja2VkRm9sZGVySWQgc28gbm9uLW1vdmUgZmxvd3MgKGUuZy4gcGFyZW50IHBpY2tlcikgc3RpbGwgb3BlbiB3aXRoIHRoZVxuICAgIC8vIHByZS1zZWxlY3RlZCBub2RlIHZpc2libGUuXG4gICAgY29uc3Qgc2VlZCA9IHRoaXMuY3VycmVudEZvbGRlcklkICE9IG51bGwgPyB0aGlzLmN1cnJlbnRGb2xkZXJJZCA6IHRoaXMucGlja2VkRm9sZGVySWQ7XG4gICAgaWYgKHNlZWQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdHJhaWw6IG51bWJlcltdID0gW107XG4gICAgICB0aGlzLmNvbGxlY3RBbmNlc3RvcnModGhpcy5mb2xkZXJzLCBzZWVkLCB0cmFpbCk7XG4gICAgICB0cmFpbC5mb3JFYWNoKGlkID0+IHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QW5jZXN0b3JzKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIsIGFjYzogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4uaWQpO1xuICAgICAgaWYgKG4uaWQgPT09IHRhcmdldElkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIHRoaXMuY29sbGVjdEFuY2VzdG9ycyhuLmNoaWxkcmVuLCB0YXJnZXRJZCwgYWNjKSkgcmV0dXJuIHRydWU7XG4gICAgICBhY2MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBmbGF0Um93cygpOiBGbGF0Rm9sZGVyUm93W10ge1xuICAgIGNvbnN0IG91dDogRmxhdEZvbGRlclJvd1tdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIShuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkSWRzLmhhcyhuLmlkKTtcbiAgICAgICAgb3V0LnB1c2goe1xuICAgICAgICAgIGlkOiBuLmlkLFxuICAgICAgICAgIG5hbWU6IG4ubmFtZSxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBkaXNhYmxlZDogbi5pZCA9PT0gdGhpcy5jdXJyZW50Rm9sZGVySWQsXG4gICAgICAgICAgaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgZXhwYW5kZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzQ2hpbGRyZW4gJiYgZXhwYW5kZWQpIHdhbGsobi5jaGlsZHJlbiEsIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgMCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlzUGlja2VkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VkRm9sZGVySWQgPT09IGlkO1xuICB9XG5cbiAgZ2V0IGlzVW5vcmdhbmlzZWREaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb290RGlzYWJsZWQ7XG4gIH1cblxuICBwaWNrKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZWRGb2xkZXJJZCA9IGlkO1xuICAgIHRoaXMuZm9sZGVyUGlja2VkLmVtaXQoaWQpO1xuICAgIHRoaXMucGlja2VkRm9sZGVySWRDaGFuZ2UuZW1pdChpZCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0b2dnbGVFeHBhbmRlZChpZDogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5leHBhbmRlZElkcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkSWRzLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0cmFja0J5SWQgPSAoXzogbnVtYmVyLCByb3c6IEZsYXRGb2xkZXJSb3cpID0+IHJvdy5pZCA/PyAtMTtcbn1cbiJdfQ==