@cqa-lib/cqa-ui 1.1.525 → 1.1.526
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/assets/images/image-assets.constants.mjs +3 -1
- package/esm2020/lib/compare-runs/compare-runs.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/segment-control/segment-control.component.mjs +6 -3
- package/esm2020/lib/simulator/simulator.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.mjs +1 -1
- package/esm2020/lib/table/dynamic-table/dynamic-table.component.mjs +148 -4
- package/esm2020/lib/templates/modular-table-template/dialogs/delete-folder-dialog.component.mjs +181 -0
- package/esm2020/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.mjs +264 -0
- package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +352 -0
- package/esm2020/lib/templates/modular-table-template/directives/folder-drag.directive.mjs +45 -0
- package/esm2020/lib/templates/modular-table-template/directives/folder-drop.directive.mjs +95 -0
- package/esm2020/lib/templates/modular-table-template/directives/row-drag.directive.mjs +44 -0
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +479 -0
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +1475 -0
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +79 -0
- package/esm2020/lib/templates/table-template.component.mjs +88 -12
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +1 -1
- package/esm2020/lib/ui-kit.module.mjs +41 -1
- package/esm2020/public-api.mjs +10 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +3408 -178
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +3388 -176
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/assets/images/image-assets.constants.d.ts +1 -0
- package/lib/segment-control/segment-control.component.d.ts +2 -1
- package/lib/table/dynamic-table/dynamic-table.component.d.ts +43 -1
- package/lib/templates/modular-table-template/dialogs/delete-folder-dialog.component.d.ts +34 -0
- package/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.d.ts +57 -0
- package/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.d.ts +79 -0
- package/lib/templates/modular-table-template/directives/folder-drag.directive.d.ts +10 -0
- package/lib/templates/modular-table-template/directives/folder-drop.directive.d.ts +22 -0
- package/lib/templates/modular-table-template/directives/row-drag.directive.d.ts +10 -0
- package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +149 -0
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +453 -0
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +150 -0
- package/lib/templates/table-template.component.d.ts +40 -2
- package/lib/ui-kit.module.d.ts +153 -145
- package/package.json +1 -1
- package/public-api.d.ts +9 -0
- package/src/lib/assets/images/EmptyFolderState.png +0 -0
- package/src/lib/assets/images/image-assets.constants.ts +3 -0
- package/styles.css +1 -1
|
@@ -5,7 +5,18 @@ import * as i1 from "@angular/platform-browser";
|
|
|
5
5
|
import * as i2 from "../../full-table-loader/full-table-loader.component";
|
|
6
6
|
import * as i3 from "../../table-data-loader/table-data-loader.component";
|
|
7
7
|
import * as i4 from "@angular/common";
|
|
8
|
-
import * as i5 from "
|
|
8
|
+
import * as i5 from "ngx-drag-drop";
|
|
9
|
+
import * as i6 from "./dynamic-cell-container.directive";
|
|
10
|
+
const DYNAMIC_TABLE_REORDER_STYLES = `
|
|
11
|
+
.reorder-handle-cell { width: 44px; }
|
|
12
|
+
.reorder-handle-icon { display: inline-flex; align-items: center; justify-content: center; color: #6B7280; }
|
|
13
|
+
.cqa-row-draggable { cursor: grab; }
|
|
14
|
+
.cqa-row-draggable:active { cursor: grabbing; }
|
|
15
|
+
.cqa-row-draggable.dndDragging { opacity: 0.5; }
|
|
16
|
+
.cqa-row-draggable.dndDraggingSource { opacity: 0.3; }
|
|
17
|
+
tr.cqa-row-drop-above > td { box-shadow: inset 0 3px 0 0 #3F43EE; }
|
|
18
|
+
tr.cqa-row-drop-below > td { box-shadow: inset 0 -3px 0 0 #3F43EE; }
|
|
19
|
+
`;
|
|
9
20
|
export class DynamicTableComponent {
|
|
10
21
|
constructor(sanitizer, cdr) {
|
|
11
22
|
this.sanitizer = sanitizer;
|
|
@@ -18,6 +29,26 @@ export class DynamicTableComponent {
|
|
|
18
29
|
this.enableLocalSort = true;
|
|
19
30
|
// Emit sort changes so parent can perform server-side sort if desired
|
|
20
31
|
this.sortChange = new EventEmitter();
|
|
32
|
+
/**
|
|
33
|
+
* When true, renders a drag-handle column as the leftmost cell and enables
|
|
34
|
+
* row drag-and-drop reordering via ngx-drag-drop. Off by default so existing
|
|
35
|
+
* consumers are unaffected.
|
|
36
|
+
*/
|
|
37
|
+
this.enableRowReorder = false;
|
|
38
|
+
/** Tooltip for the drag handle icon. */
|
|
39
|
+
this.reorderHandleTooltip = 'Drag to reorder';
|
|
40
|
+
/**
|
|
41
|
+
* Emitted after a successful row drop. `orderedData` is a freshly allocated
|
|
42
|
+
* array reflecting the new order — parents should assign it back to `[data]`
|
|
43
|
+
* rather than relying on in-place mutation.
|
|
44
|
+
*/
|
|
45
|
+
this.rowReorder = new EventEmitter();
|
|
46
|
+
/** Index of the row the cursor is currently hovering during a reorder drag. */
|
|
47
|
+
this.dropHoverIndex = null;
|
|
48
|
+
/** Whether the cursor is in the top or bottom half of the hovered row. */
|
|
49
|
+
this.dropPosition = null;
|
|
50
|
+
/** The row currently being dragged — used to suppress the indicator on the source row. */
|
|
51
|
+
this.draggedRow = null;
|
|
21
52
|
// Map to store component references for cleanup: rowIndex_colId -> ComponentRef
|
|
22
53
|
this.componentRefs = new Map();
|
|
23
54
|
// Caches for expensive getters
|
|
@@ -247,6 +278,113 @@ export class DynamicTableComponent {
|
|
|
247
278
|
trackByIndex(index) {
|
|
248
279
|
return index;
|
|
249
280
|
}
|
|
281
|
+
onRowDragStart(row) {
|
|
282
|
+
if (!this.enableRowReorder)
|
|
283
|
+
return;
|
|
284
|
+
this.draggedRow = row;
|
|
285
|
+
}
|
|
286
|
+
onRowDragEnd() {
|
|
287
|
+
this.draggedRow = null;
|
|
288
|
+
this.clearDropIndicator();
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Fires continuously while a drag is over a row. Computes whether the cursor
|
|
292
|
+
* is in the top or bottom half of the row and updates the indicator state.
|
|
293
|
+
* Suppresses the indicator on the dragged row itself.
|
|
294
|
+
*/
|
|
295
|
+
onRowDragOver(event, rowIndex) {
|
|
296
|
+
if (!this.enableRowReorder)
|
|
297
|
+
return;
|
|
298
|
+
const drag = event;
|
|
299
|
+
drag.preventDefault();
|
|
300
|
+
const row = this.computedData?.[rowIndex];
|
|
301
|
+
if (this.draggedRow && row === this.draggedRow) {
|
|
302
|
+
if (this.dropHoverIndex !== null || this.dropPosition !== null) {
|
|
303
|
+
this.dropHoverIndex = null;
|
|
304
|
+
this.dropPosition = null;
|
|
305
|
+
this.cdr.markForCheck();
|
|
306
|
+
}
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const el = drag.currentTarget;
|
|
310
|
+
if (!el)
|
|
311
|
+
return;
|
|
312
|
+
const rect = el.getBoundingClientRect();
|
|
313
|
+
const midY = rect.top + rect.height / 2;
|
|
314
|
+
const pos = drag.clientY < midY ? 'above' : 'below';
|
|
315
|
+
if (this.dropHoverIndex !== rowIndex || this.dropPosition !== pos) {
|
|
316
|
+
this.dropHoverIndex = rowIndex;
|
|
317
|
+
this.dropPosition = pos;
|
|
318
|
+
this.cdr.markForCheck();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** Clears the indicator when the cursor leaves the tbody entirely. */
|
|
322
|
+
onTbodyDragLeave(event) {
|
|
323
|
+
if (!this.enableRowReorder)
|
|
324
|
+
return;
|
|
325
|
+
const drag = event;
|
|
326
|
+
const tbody = drag.currentTarget;
|
|
327
|
+
const related = drag.relatedTarget;
|
|
328
|
+
if (!tbody || !related || !tbody.contains(related)) {
|
|
329
|
+
this.clearDropIndicator();
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
clearDropIndicator() {
|
|
333
|
+
if (this.dropHoverIndex !== null || this.dropPosition !== null) {
|
|
334
|
+
this.dropHoverIndex = null;
|
|
335
|
+
this.dropPosition = null;
|
|
336
|
+
this.cdr.markForCheck();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Handles a row drop from ngx-drag-drop. Prefers the tracked dragover position
|
|
341
|
+
* (which the user can see live via the insertion line) over `event.index` when
|
|
342
|
+
* computing the final insert slot. Emits a fresh array — does not mutate `data`.
|
|
343
|
+
*/
|
|
344
|
+
onRowDndDrop(event) {
|
|
345
|
+
if (!this.enableRowReorder)
|
|
346
|
+
return;
|
|
347
|
+
const dragged = event?.data;
|
|
348
|
+
if (dragged == null) {
|
|
349
|
+
this.clearDropIndicator();
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const source = this.computedData || [];
|
|
353
|
+
let previousIndex = source.indexOf(dragged);
|
|
354
|
+
if (previousIndex < 0 && dragged && dragged.id != null) {
|
|
355
|
+
previousIndex = source.findIndex(r => r && r.id === dragged.id);
|
|
356
|
+
}
|
|
357
|
+
if (previousIndex < 0) {
|
|
358
|
+
this.clearDropIndicator();
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
// Prefer the indicator position (what the user just saw) over event.index.
|
|
362
|
+
let insertIndex;
|
|
363
|
+
if (this.dropHoverIndex != null && this.dropPosition) {
|
|
364
|
+
insertIndex = this.dropPosition === 'above' ? this.dropHoverIndex : this.dropHoverIndex + 1;
|
|
365
|
+
}
|
|
366
|
+
else if (typeof event.index === 'number') {
|
|
367
|
+
insertIndex = event.index;
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
insertIndex = source.length;
|
|
371
|
+
}
|
|
372
|
+
const next = [...source];
|
|
373
|
+
next.splice(previousIndex, 1);
|
|
374
|
+
// Removing the source above the target shifts later items up by one.
|
|
375
|
+
if (previousIndex < insertIndex)
|
|
376
|
+
insertIndex -= 1;
|
|
377
|
+
if (insertIndex < 0)
|
|
378
|
+
insertIndex = 0;
|
|
379
|
+
if (insertIndex > next.length)
|
|
380
|
+
insertIndex = next.length;
|
|
381
|
+
this.clearDropIndicator();
|
|
382
|
+
this.draggedRow = null;
|
|
383
|
+
if (insertIndex === previousIndex)
|
|
384
|
+
return;
|
|
385
|
+
next.splice(insertIndex, 0, dragged);
|
|
386
|
+
this.rowReorder.emit({ previousIndex, currentIndex: insertIndex, orderedData: next });
|
|
387
|
+
}
|
|
250
388
|
copyCellJsonPath(path, event, source = 'dbQueryResponse') {
|
|
251
389
|
if (!path)
|
|
252
390
|
return;
|
|
@@ -459,10 +597,10 @@ export class DynamicTableComponent {
|
|
|
459
597
|
}
|
|
460
598
|
}
|
|
461
599
|
DynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
462
|
-
DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", rowSelectable: "rowSelectable", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading", cellJsonPathGetter: "cellJsonPathGetter", onJsonPathCopiedHandler: "onJsonPathCopiedHandler" }, outputs: { sortChange: "sortChange" }, host: { classAttribute: "cqa-ui-root" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\"\n [class.is-loading]=\"true\"\n [style.min-width.px]=\"computedTableMinWidth || null\"\n *ngIf=\"!showTableLoading\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left',\n cellJsonPathGetter && col.fieldId !== 'checkbox' && col.fieldId !== 'actions' ? 'cqa-cursor-pointer' : ''\n ]\"\n (dblclick)=\"cellJsonPathGetter && col?.fieldId !== 'checkbox' && col?.fieldId !== 'actions' && copyCellJsonPath(cellJsonPathGetter(rowIndex, col?.fieldId, row), $event, 'dbQueryResponse')\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n [disabled]=\"!isRowSelectable(row)\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [style.opacity]=\"!isRowSelectable(row) ? '0.45' : null\"\n [style.cursor]=\"!isRowSelectable(row) ? 'not-allowed' : null\"\n [style.pointer-events]=\"!isRowSelectable(row) ? 'none' : null\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", components: [{ type: i2.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i3.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.DynamicCellContainerDirective, selector: "[cqaCellContainer]", inputs: ["componentConfig", "row", "column", "rowIndex", "colId"], exportAs: ["cqaCellContainer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
600
|
+
DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicTableComponent, selector: "app-dynamic-table", inputs: { data: "data", columns: "columns", emptyState: "emptyState", gridTemplateColumns: "gridTemplateColumns", screenWidth: "screenWidth", enableSelectAll: "enableSelectAll", rowSelectable: "rowSelectable", enableLocalSort: "enableLocalSort", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading", cellJsonPathGetter: "cellJsonPathGetter", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", enableRowReorder: "enableRowReorder", reorderHandleTooltip: "reorderHandleTooltip" }, outputs: { sortChange: "sortChange", rowReorder: "rowReorder" }, host: { classAttribute: "cqa-ui-root" }, queries: [{ propertyName: "emptyTableTpl", first: true, predicate: ["emptyTableTpl"], descendants: true, read: TemplateRef }, { propertyName: "cellTemplates", predicate: DynamicCellTemplateDirective }, { propertyName: "headerTemplates", predicate: DynamicHeaderTemplateDirective }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\"\n [class.is-loading]=\"true\"\n [style.min-width.px]=\"computedTableMinWidth || null\"\n *ngIf=\"!showTableLoading\">\n <colgroup>\n <col *ngIf=\"enableRowReorder\" style=\"width: 44px\" />\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <th\n *ngIf=\"enableRowReorder\"\n class=\"header-cell reorder-handle-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7] cqa-text-center\"\n aria-label=\"Reorder\">\n <span class=\"cqa-sr-only\">Reorder</span>\n </th>\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\"\n [dndDropzone]=\"['cqa-row']\"\n [dndDisableIf]=\"!enableRowReorder\"\n dndEffectAllowed=\"move\"\n (dragleave)=\"onTbodyDragLeave($event)\"\n (dndDrop)=\"onRowDndDrop($event)\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\"\n *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\"\n [class.cqa-row-draggable]=\"enableRowReorder\"\n [class.cqa-row-drop-above]=\"dropHoverIndex === rowIndex && dropPosition === 'above'\"\n [class.cqa-row-drop-below]=\"dropHoverIndex === rowIndex && dropPosition === 'below'\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"!enableRowReorder\"\n dndEffectAllowed=\"move\"\n dndType=\"cqa-row\"\n (dndStart)=\"onRowDragStart(row)\"\n (dndEnd)=\"onRowDragEnd()\"\n (dragover)=\"onRowDragOver($event, rowIndex)\">\n <td *ngIf=\"enableRowReorder\" class=\"cell reorder-handle-cell cqa-px-[10.5px] cqa-py-[11px] cqa-text-center\" [attr.title]=\"reorderHandleTooltip\">\n <span class=\"reorder-handle-icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"3\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"10\" cy=\"3\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"6\" cy=\"8\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"10\" cy=\"8\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"6\" cy=\"13\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"10\" cy=\"13\" r=\"1.25\" fill=\"currentColor\"></circle>\n </svg>\n </span>\n </td>\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left',\n cellJsonPathGetter && col.fieldId !== 'checkbox' && col.fieldId !== 'actions' ? 'cqa-cursor-pointer' : ''\n ]\"\n (dblclick)=\"cellJsonPathGetter && col?.fieldId !== 'checkbox' && col?.fieldId !== 'actions' && copyCellJsonPath(cellJsonPathGetter(rowIndex, col?.fieldId, row), $event, 'dbQueryResponse')\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n [disabled]=\"!isRowSelectable(row)\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [style.opacity]=\"!isRowSelectable(row) ? '0.45' : null\"\n [style.cursor]=\"!isRowSelectable(row) ? 'not-allowed' : null\"\n [style.pointer-events]=\"!isRowSelectable(row) ? 'none' : null\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [".reorder-handle-cell{width:44px}.reorder-handle-icon{display:inline-flex;align-items:center;justify-content:center;color:#6b7280}.cqa-row-draggable{cursor:grab}.cqa-row-draggable:active{cursor:grabbing}.cqa-row-draggable.dndDragging{opacity:.5}.cqa-row-draggable.dndDraggingSource{opacity:.3}tr.cqa-row-drop-above>td{box-shadow:inset 0 3px #3f43ee}tr.cqa-row-drop-below>td{box-shadow:inset 0 -3px #3f43ee}\n"], components: [{ type: i2.FullTableLoaderComponent, selector: "cqa-full-table-loader", inputs: ["label"] }, { type: i3.TableDataLoaderComponent, selector: "cqa-table-data-loader", inputs: ["label", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i5.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i6.DynamicCellContainerDirective, selector: "[cqaCellContainer]", inputs: ["componentConfig", "row", "column", "rowIndex", "colId"], exportAs: ["cqaCellContainer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
463
601
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicTableComponent, decorators: [{
|
|
464
602
|
type: Component,
|
|
465
|
-
args: [{ selector: "app-dynamic-table", host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\"\n [class.is-loading]=\"true\"\n [style.min-width.px]=\"computedTableMinWidth || null\"\n *ngIf=\"!showTableLoading\">\n <colgroup>\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\" *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\">\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left',\n cellJsonPathGetter && col.fieldId !== 'checkbox' && col.fieldId !== 'actions' ? 'cqa-cursor-pointer' : ''\n ]\"\n (dblclick)=\"cellJsonPathGetter && col?.fieldId !== 'checkbox' && col?.fieldId !== 'actions' && copyCellJsonPath(cellJsonPathGetter(rowIndex, col?.fieldId, row), $event, 'dbQueryResponse')\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n [disabled]=\"!isRowSelectable(row)\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [style.opacity]=\"!isRowSelectable(row) ? '0.45' : null\"\n [style.cursor]=\"!isRowSelectable(row) ? 'not-allowed' : null\"\n [style.pointer-events]=\"!isRowSelectable(row) ? 'none' : null\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>", styles: [] }]
|
|
603
|
+
args: [{ selector: "app-dynamic-table", styles: [DYNAMIC_TABLE_REORDER_STYLES], host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <div class=\"cqa-relative\" [class.cqa-max-h-[100px]]=\"showTableLoading\">\n <cqa-full-table-loader *ngIf=\"showTableLoading\"></cqa-full-table-loader>\n <cqa-table-data-loader *ngIf=\"showTableDataLoading\"></cqa-table-data-loader>\n <table class=\"table-inner cqa-w-full cqa-border cqa-border-solid cqa-border-gray-200\"\n [class.is-loading]=\"true\"\n [style.min-width.px]=\"computedTableMinWidth || null\"\n *ngIf=\"!showTableLoading\">\n <colgroup>\n <col *ngIf=\"enableRowReorder\" style=\"width: 44px\" />\n <ng-container *ngFor=\"let width of computedColumnWidths; trackBy: trackByIndex\">\n <col [style.width]=\"width\" />\n </ng-container>\n </colgroup>\n\n <thead *ngIf=\"data?.length\">\n <tr class=\"table-header cqa-items-center\">\n <th\n *ngIf=\"enableRowReorder\"\n class=\"header-cell reorder-handle-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7] cqa-text-center\"\n aria-label=\"Reorder\">\n <span class=\"cqa-sr-only\">Reorder</span>\n </th>\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <th\n class=\"header-cell cqa-py-[13.25px] cqa-px-[10.5px] cqa-text-xs cqa-font-semibold cqa-text-[#374151] cqa-bg-[#eff0f7]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left'\n ]\">\n <!-- Built-in select-all for checkbox column when enabled and no custom header template -->\n <ng-container\n *ngIf=\"col.fieldId === 'checkbox' && enableSelectAll && !getHeaderTemplate(col.fieldId); else headerTplOrDefault\">\n <div class=\"custom-checkbox\">\n <input type=\"checkbox\" id=\"checkbox\" aria-label=\"Select all rows\" [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\" (change)=\"onSelectAllChange($event)\" class=\"hidden-checkbox\" />\n <label for=\"checkbox\" class=\"custom-checkbox-label\"></label>\n </div>\n </ng-container>\n <ng-template #headerTplOrDefault>\n <ng-container *ngIf=\"getHeaderTemplate(col.fieldId) as headerTpl; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTpl\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <ng-container *ngIf=\"col.sortable; else plainHeader\">\n <button type=\"button\" class=\"header-text cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-0\"\n (click)=\"toggleSort(col)\" [attr.aria-label]=\"'Sort by ' + (col.fieldName || col.fieldId)\">\n <span class=\"cqa-text-[12.3px] cqa-leading-[17.5px] cqa-text-[#0A0A0A] cqa-font-medium\">{{\n col.fieldName }}</span>\n <span *ngIf=\"isSortedAsc(col.fieldId)\">\u25B2</span>\n <span *ngIf=\"isSortedDesc(col.fieldId)\">\u25BC</span>\n </button>\n </ng-container>\n <ng-template #plainHeader>\n <span class=\"header-text\">{{ col.fieldName }}</span>\n </ng-template>\n </ng-template>\n </ng-template>\n </th>\n </ng-container>\n </tr>\n </thead>\n\n <tbody class=\"table-body cqa-w-full\"\n [dndDropzone]=\"['cqa-row']\"\n [dndDisableIf]=\"!enableRowReorder\"\n dndEffectAllowed=\"move\"\n (dragleave)=\"onTbodyDragLeave($event)\"\n (dndDrop)=\"onRowDndDrop($event)\">\n <tr class=\"table-row cqa-bg-surface-default hover:cqa-bg-surface-hover\"\n *ngFor=\"let row of computedData; let rowIndex = index; trackBy: trackByIndex\"\n [class.selected]=\"row?.isSelected\"\n [class.cqa-row-draggable]=\"enableRowReorder\"\n [class.cqa-row-drop-above]=\"dropHoverIndex === rowIndex && dropPosition === 'above'\"\n [class.cqa-row-drop-below]=\"dropHoverIndex === rowIndex && dropPosition === 'below'\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"!enableRowReorder\"\n dndEffectAllowed=\"move\"\n dndType=\"cqa-row\"\n (dndStart)=\"onRowDragStart(row)\"\n (dndEnd)=\"onRowDragEnd()\"\n (dragover)=\"onRowDragOver($event, rowIndex)\">\n <td *ngIf=\"enableRowReorder\" class=\"cell reorder-handle-cell cqa-px-[10.5px] cqa-py-[11px] cqa-text-center\" [attr.title]=\"reorderHandleTooltip\">\n <span class=\"reorder-handle-icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"3\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"10\" cy=\"3\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"6\" cy=\"8\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"10\" cy=\"8\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"6\" cy=\"13\" r=\"1.25\" fill=\"currentColor\"></circle>\n <circle cx=\"10\" cy=\"13\" r=\"1.25\" fill=\"currentColor\"></circle>\n </svg>\n </span>\n </td>\n <ng-container *ngFor=\"let col of visibleColumns; trackBy: trackByIndex\">\n <td class=\"cell cqa-px-[10.5px] cqa-py-[11px]\"\n [style.min-width.px]=\"col.minWidth\"\n [ngClass]=\"[\n col.fieldId + '-cell',\n col.align === 'center' ? 'cqa-text-center' : col.align === 'right' ? 'cqa-text-right' : 'cqa-text-left',\n cellJsonPathGetter && col.fieldId !== 'checkbox' && col.fieldId !== 'actions' ? 'cqa-cursor-pointer' : ''\n ]\"\n (dblclick)=\"cellJsonPathGetter && col?.fieldId !== 'checkbox' && col?.fieldId !== 'actions' && copyCellJsonPath(cellJsonPathGetter(rowIndex, col?.fieldId, row), $event, 'dbQueryResponse')\">\n <!-- Built-in checkbox cell when no custom template is provided -->\n <ng-container *ngIf=\"col.fieldId === 'checkbox' && !getCellTemplate(col.fieldId); else regularCell\">\n <div class=\"custom-checkbox\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + rowIndex\"\n aria-label=\"Select row\"\n [checked]=\"row?.isSelected\"\n [disabled]=\"!isRowSelectable(row)\"\n (change)=\"onRowSelectChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [style.opacity]=\"!isRowSelectable(row) ? '0.45' : null\"\n [style.cursor]=\"!isRowSelectable(row) ? 'not-allowed' : null\"\n [style.pointer-events]=\"!isRowSelectable(row) ? 'none' : null\"\n [attr.for]=\"'row-checkbox-' + rowIndex\">\n </label>\n </div>\n </ng-container>\n <ng-template #regularCell>\n <ng-container *ngIf=\"getCellTemplate(col.fieldId) as cellTpl; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: {$implicit: row, row: row, value: getCellValue(row, col.fieldValue)}\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <ng-container *ngIf=\"getRenderedValue(row, col) as renderedValue\">\n <ng-container *ngIf=\"isComponent(renderedValue); else nonComponentCell\">\n <ng-container \n cqaCellContainer \n #cellContainer=\"cqaCellContainer\"\n [componentConfig]=\"renderedValue\"\n [row]=\"row\"\n [column]=\"col\"\n [rowIndex]=\"rowIndex\"\n [colId]=\"col.fieldId\">\n </ng-container>\n </ng-container>\n <ng-template #nonComponentCell>\n <ng-container *ngIf=\"isHtmlString(renderedValue); else textCell\">\n <div class=\"cqa-text-xs cqa-leading-[17px]\" [innerHTML]=\"getSanitizedHtml(renderedValue)\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\"></div>\n </ng-container>\n <ng-template #textCell>\n <span class=\"cqa-text-xs cqa-text-[#374151]\" [ngClass]=\"[\n col.align === 'center' ? 'cqa-flex cqa-justify-center' : col.align === 'right' ? 'cqa-flex cqa-justify-end' : ''\n ]\">{{ renderedValue }}</span>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n</div>" }]
|
|
466
604
|
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
|
|
467
605
|
type: Input
|
|
468
606
|
}], columns: [{
|
|
@@ -489,6 +627,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
489
627
|
type: Input
|
|
490
628
|
}], onJsonPathCopiedHandler: [{
|
|
491
629
|
type: Input
|
|
630
|
+
}], enableRowReorder: [{
|
|
631
|
+
type: Input
|
|
632
|
+
}], reorderHandleTooltip: [{
|
|
633
|
+
type: Input
|
|
634
|
+
}], rowReorder: [{
|
|
635
|
+
type: Output
|
|
492
636
|
}], cellTemplates: [{
|
|
493
637
|
type: ContentChildren,
|
|
494
638
|
args: [DynamicCellTemplateDirective]
|
|
@@ -499,4 +643,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
499
643
|
type: ContentChild,
|
|
500
644
|
args: ['emptyTableTpl', { read: TemplateRef }]
|
|
501
645
|
}] } });
|
|
502
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUEyRyx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoUSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQW1DeEcsTUFBTSxPQUFPLHFCQUFxQjtJQTREaEMsWUFDVSxTQUF1QixFQUN2QixHQUFzQjtRQUR0QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0R2QixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBUzVDLDhEQUE4RDtRQUNyRCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUl6QyxzRkFBc0Y7UUFDN0Usb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFPekMsc0VBQXNFO1FBQzVELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBOEUsQ0FBQztRQWN0SCxnRkFBZ0Y7UUFDeEUsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUU3RCwrQkFBK0I7UUFDL0IsbUJBQWMsR0FBeUIsRUFBRSxDQUFDO1FBQzFDLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyx5QkFBb0IsR0FBYSxFQUFFLENBQUM7UUFDcEM7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SSxlQUFlO3NCQUEvRCxlQUFlO3VCQUFDLDhCQUE4QjtnQkFHTyxhQUFhO3NCQUFsRSxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBJbnB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgQ29tcG9uZW50UmVmLCBUeXBlLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xuaW1wb3J0IHsgRHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgRHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZHluYW1pYy1jZWxsLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyQ29uZmlnIH0gZnJvbSBcIi4vY29tcG9uZW50LXJlbmRlci1jb25maWcuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCB7IENvbXBvbmVudFJlbmRlckNvbmZpZyB9IGZyb20gXCIuL2NvbXBvbmVudC1yZW5kZXItY29uZmlnLmludGVyZmFjZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNUYWJsZUNvbHVtbiB7XG4gIGZpZWxkSWQ6IHN0cmluZztcbiAgZmllbGROYW1lPzogc3RyaW5nO1xuICBmaWVsZFZhbHVlPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIHJlbmRlcmVyIGludm9rZWQgd2hlbiBubyBwcm9qZWN0ZWQgY2VsbCB0ZW1wbGF0ZSBpcyBwcm92aWRlZC5cbiAgICogUmV0dXJucyB0aGUgc3RyaW5nL251bWJlci9IVE1MIHN0cmluZy9Db21wb25lbnQgY2xhc3MvQ29tcG9uZW50UmVuZGVyQ29uZmlnIHRvIGRpc3BsYXkgZm9yIHRoZSBnaXZlbiByb3cuXG4gICAqIEhUTUwgc3RyaW5ncyB3aWxsIGJlIHNhbml0aXplZCBhbmQgcmVuZGVyZWQgc2FmZWx5LlxuICAgKiBDb21wb25lbnQgY2xhc3NlcyB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZC5cbiAgICovXG4gIHJlbmRlcj86IChyb3c6IGFueSwgY29sdW1uOiBEeW5hbWljVGFibGVDb2x1bW4pID0+IHN0cmluZyB8IG51bWJlciB8IFNhZmVIdG1sIHwgVHlwZTxhbnk+IHwgQ29tcG9uZW50UmVuZGVyQ29uZmlnO1xuICBpc0RlZmF1bHQ/OiBib29sZWFuO1xuICBzb3J0YWJsZT86IGJvb2xlYW47XG4gIGlzU2hvdz86IGJvb2xlYW47XG4gIC8vIE5ldyBjb25maWd1cmF0aW9uIGZpZWxkcyB0byB1bmlmeSBsYXlvdXQgbG9naWNcbiAgd2VpZ2h0PzogbnVtYmVyOyAvLyByZWxhdGl2ZSB3ZWlnaHQgZm9yIGR5bmFtaWMgc2hhcmVcbiAgZml4ZWRQeD86IG51bWJlcjsgLy8gZml4ZWQgd2lkdGggaW4gcHggKGUuZy4gY2hlY2tib3gvYWN0aW9ucylcbiAgLyoqIE1pbmltdW0gd2lkdGggaW4gcHgg4oCUIGFwcGxpZWQgdG8gYm90aCB0aGUgaGVhZGVyIGNlbGwgYW5kIGV2ZXJ5IGJvZHkgY2VsbCBvZiB0aGlzIGNvbHVtbi4gKi9cbiAgbWluV2lkdGg/OiBudW1iZXI7XG4gIHJlc3BvbnNpdmU/OiB7IHhzPzogYm9vbGVhbjsgc20/OiBib29sZWFuOyBtZD86IGJvb2xlYW4gfTsgLy8gaGlkZSBhdCBzcGVjaWZpYyBicmVha3BvaW50c1xuICBhbGlnbj86ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1keW5hbWljLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgd2hlbiBubyBjdXN0b20gZW1wdHkgdGVtcGxhdGUgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBASW5wdXQoKSBlbXB0eVN0YXRlPzogeyB0aXRsZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGltYWdlVXJsPzogc3RyaW5nOyBhY3Rpb25zPzogYW55W10gfTtcbiAgLy8gT3B0aW9uYWwgb3ZlcnJpZGU7IGlmIG9taXR0ZWQgd2UgY29tcHV0ZSBmcm9tIGNvbHVtbnNcbiAgQElucHV0KCkgZ3JpZFRlbXBsYXRlQ29sdW1ucz86IHN0cmluZztcbiAgLy8gQnJlYWtwb2ludC1hd2FyZSBzaXppbmc7IHByb3ZpZGUgZnJvbSBwYXJlbnQgdG8gYXZvaWQgZXh0cmEgbGlzdGVuZXJzXG4gIEBJbnB1dCgpIHNjcmVlbldpZHRoPzogbnVtYmVyO1xuICAvLyBFbmFibGUgYnVpbHQtaW4gc2VsZWN0LWFsbCBiZWhhdmlvciBmb3IgYSAnY2hlY2tib3gnIGNvbHVtblxuICBASW5wdXQoKSBlbmFibGVTZWxlY3RBbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBPcHRpb25hbCBwcmVkaWNhdGUgdG8gY29udHJvbCB3aGV0aGVyIGEgcm93IGlzIHNlbGVjdGFibGUuXG4gIC8vIElmIG5vdCBwcm92aWRlZCwgYWxsIHJvd3MgYXJlIHNlbGVjdGFibGUgKGJhY2t3YXJkIGNvbXBhdGlibGUgYmVoYXZpb3IpLlxuICBASW5wdXQoKSByb3dTZWxlY3RhYmxlPzogKHJvdzogYW55KSA9PiBib29sZWFuO1xuICAvLyBFbmFibGUgc2ltcGxlIGNsaWVudC1zaWRlIHNvcnRpbmcgd2hlbiBjbGlja2luZyBzb3J0YWJsZSBoZWFkZXJzIChubyBjdXN0b20gaGVhZGVyKVxuICBASW5wdXQoKSBlbmFibGVMb2NhbFNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBCYWNrd2FyZC1jb21wYXQgbG9hZGluZyBmbGFnIChhcHBsaWVzIHRvIGJvdGggbG9hZGVycyBpZiBzcGVjaWZpYyBmbGFncyBub3QgcHJvdmlkZWQpXG4gIFxuICAvLyBOZXc6IGNvbnRyb2xzIHRoZSBmdWxsIHRhYmxlIG92ZXJsYXkgbG9hZGVyXG4gIEBJbnB1dCgpIGlzVGFibGVMb2FkaW5nPzogYm9vbGVhbjtcbiAgLy8gTmV3OiBjb250cm9scyB0aGUgaW5saW5lIGRhdGEgbG9hZGVyIGFib3ZlIHRoZSB0YWJsZVxuICBASW5wdXQoKSBpc1RhYmxlRGF0YUxvYWRpbmc/OiBib29sZWFuO1xuICAvLyBFbWl0IHNvcnQgY2hhbmdlcyBzbyBwYXJlbnQgY2FuIHBlcmZvcm0gc2VydmVyLXNpZGUgc29ydCBpZiBkZXNpcmVkXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkSWQ6IHN0cmluZzsgZmllbGRWYWx1ZT86IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgfT4oKTtcblxuICAvLyBPcHRpb25hbCBnZXR0ZXIgZm9yIEpTT04gcGF0aCBwZXIgY2VsbC4gV2hlbiBwcm92aWRlZCwgZG91YmxlLWNsaWNraW5nIGEgY2VsbCBjb3BpZXMgdGhlIHBhdGguXG4gIEBJbnB1dCgpIGNlbGxKc29uUGF0aEdldHRlcj86IChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nLCByb3c6IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8vIE9wdGlvbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBKU09OIHBhdGggaXMgY29waWVkIGZyb20gYSB0YWJsZSBjZWxsXG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiBzdHJpbmcgfSkgPT4gdm9pZDtcblxuICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUpIGNlbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKSBoZWFkZXJUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8RHluYW1pY0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgLy8gQWxsb3cgY29uc3VtZXJzIHRvIHByb2plY3QgYSBjdXN0b20gZW1wdHktc3RhdGUgdGVtcGxhdGUgdXNpbmcgYSB0ZW1wbGF0ZSByZWYgbmFtZVxuICAvLyBlLmcuIDxuZy10ZW1wbGF0ZSAjZW1wdHlUYWJsZVRwbD5DdXN0b20gZW1wdHkgVUk8L25nLXRlbXBsYXRlPlxuICBAQ29udGVudENoaWxkKCdlbXB0eVRhYmxlVHBsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBlbXB0eVRhYmxlVHBsPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyBNYXAgdG8gc3RvcmUgY29tcG9uZW50IHJlZmVyZW5jZXMgZm9yIGNsZWFudXA6IHJvd0luZGV4X2NvbElkIC0+IENvbXBvbmVudFJlZlxuICBwcml2YXRlIGNvbXBvbmVudFJlZnMgPSBuZXcgTWFwPHN0cmluZywgQ29tcG9uZW50UmVmPGFueT4+KCk7XG5cbiAgLy8gQ2FjaGVzIGZvciBleHBlbnNpdmUgZ2V0dGVyc1xuICB2aXNpYmxlQ29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgY29tcHV0ZWREYXRhOiBhbnlbXSA9IFtdO1xuICBjb21wdXRlZEdyaWRUZW1wbGF0ZTogc3RyaW5nID0gJyc7XG4gIGNvbXB1dGVkQ29sdW1uV2lkdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAvKipcbiAgICogSGFyZCBmbG9vciBvbiB0aGUgYDx0YWJsZT5gIHdpZHRoID0gc3VtIG9mIGV2ZXJ5IHZpc2libGUgY29sdW1uJ3MgbWluaW11bSAoZml4ZWRcbiAgICogd2lkdGhzICsgZHluYW1pYyBjb2x1bW5zJyBgbWluV2lkdGhgKS4gV2l0aCBgdGFibGUtbGF5b3V0OiBmaXhlZDsgd2lkdGg6IDEwMCU7YCBzZXRcbiAgICogYnkgY29uc3VtZXJzLCBgPGNvbD5gIHdpZHRocyBiZWNvbWUgYWR2aXNvcnkgb25jZSB0aGUgY29udGFpbmVyIGlzIG5hcnJvd2VyIHRoYW5cbiAgICogdGhlIGNvbHVtbi13aWR0aCBzdW0g4oCUIHRoZSBicm93c2VyIHNpbGVudGx5IHNocmlua3MgdGhlbS4gUGlubmluZyBgbWluLXdpZHRoYCBvblxuICAgKiB0aGUgdGFibGUgaXRzZWxmIHByZXZlbnRzIHRoYXQgY29tcGFjdGlvbjsgdGhlIGNvbnN1bWVyJ3MgYG92ZXJmbG93LXg6IGF1dG9gXG4gICAqIHdyYXBwZXIgdGhlbiBzY3JvbGxzIGhvcml6b250YWxseSBpbnN0ZWFkIG9mIHNxdWlzaGluZyBjb2x1bW5zIHRvIHplcm8gd2lkdGguXG4gICAqL1xuICBjb21wdXRlZFRhYmxlTWluV2lkdGggPSAwO1xuXG4gIC8vIENhY2hlIGZvciBzYW5pdGl6ZWQgSFRNTCB0byBhdm9pZCByZWR1bmRhbnQgaW5uZXJIVE1MIHJlbmRlcnNcbiAgcHJpdmF0ZSBodG1sQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgU2FmZUh0bWw+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ3NjcmVlbldpZHRoJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICAgIHRoaXMudXBkYXRlR3JpZFRlbXBsYXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ2VuYWJsZUxvY2FsU29ydCddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsZWFuIHVwIGFsbCBkeW5hbWljYWxseSBjcmVhdGVkIGNvbXBvbmVudHNcbiAgICB0aGlzLmNvbXBvbmVudFJlZnMuZm9yRWFjaChyZWYgPT4gcmVmLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy5odG1sQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzWHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdyA9IHRoaXMuc2NyZWVuV2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHcgPD0gNDgwO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzU20oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdyA9IHRoaXMuc2NyZWVuV2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHcgPD0gNzY4O1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdyA9IHRoaXMuc2NyZWVuV2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHcgPD0gOTkyO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCByZXNwb25zaXZlRmlsdGVyID0gKGM6IER5bmFtaWNUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgciA9IGM/LnJlc3BvbnNpdmUgfHwge307XG4gICAgICBpZiAoci54cyAmJiB0aGlzLmlzWHMpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChyLnNtICYmIHRoaXMuaXNTbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHIubWQgJiYgdGhpcy5pc01kKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoYyA9PiBjLmlzU2hvdyAhPT0gZmFsc2UpLmZpbHRlcihyZXNwb25zaXZlRmlsdGVyKTtcbiAgfVxuXG4gIGdldEhlYWRlclRlbXBsYXRlKGNvbElkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgdHBsID0gdGhpcy5oZWFkZXJUZW1wbGF0ZXM/LmZpbmQodCA9PiB0Lm5hbWUgPT09IGNvbElkKTtcbiAgICByZXR1cm4gdHBsID8gdHBsLnRlbXBsYXRlIDogbnVsbDtcbiAgfVxuXG4gIGdldENlbGxUZW1wbGF0ZShjb2xJZDogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IHRwbCA9IHRoaXMuY2VsbFRlbXBsYXRlcz8uZmluZCh0ID0+IHQubmFtZSA9PT0gY29sSWQpO1xuICAgIHJldHVybiB0cGwgPyB0cGwudGVtcGxhdGUgOiBudWxsO1xuICB9XG5cbiAgZ2V0UmVuZGVyZWRWYWx1ZShyb3c6IGFueSwgY29sdW1uOiBEeW5hbWljVGFibGVDb2x1bW4pOiBhbnkge1xuICAgIGlmIChjb2x1bW4/LnJlbmRlciAmJiB0eXBlb2YgY29sdW1uLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5yZW5kZXIocm93LCBjb2x1bW4pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRHluYW1pY1RhYmxlIHJlbmRlciBmdW5jdGlvbiB0aHJldyBhbiBlcnJvciBmb3IgY29sdW1uJywgY29sdW1uPy5maWVsZElkLCBlcnIpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldENlbGxWYWx1ZShyb3csIGNvbHVtbj8uZmllbGRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBhIGNvbXBvbmVudCBjbGFzcyBvciBjb21wb25lbnQgY29uZmlnXG4gICAqL1xuICBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgY2xhc3MgKGhhcyBAQ29tcG9uZW50IGRlY29yYXRvciBtZXRhZGF0YSlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLnByb3RvdHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBDb21wb25lbnRSZW5kZXJDb25maWdcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb21wb25lbnQgJiYgdHlwZW9mIHZhbHVlLmNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb21wb25lbnQgY2xhc3MgZnJvbSBhIHJlbmRlciB2YWx1ZSAoY291bGQgYmUgY2xhc3Mgb3IgY29uZmlnKVxuICAgKi9cbiAgZ2V0Q29tcG9uZW50Q2xhc3ModmFsdWU6IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZyk6IFR5cGU8YW55PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5jb21wb25lbnQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb21wb25lbnQgdmFsdWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbXBvbmVudCBpbnB1dHMgZnJvbSBhIHJlbmRlciB2YWx1ZVxuICAgKi9cbiAgZ2V0Q29tcG9uZW50SW5wdXRzKHZhbHVlOiBUeXBlPGFueT4gfCBDb21wb25lbnRSZW5kZXJDb25maWcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pbnB1dHMpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5pbnB1dHM7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbXBvbmVudCBvdXRwdXRzIGZyb20gYSByZW5kZXIgdmFsdWVcbiAgICovXG4gIGdldENvbXBvbmVudE91dHB1dHModmFsdWU6IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZyk6IHsgW2tleTogc3RyaW5nXTogKGV2ZW50OiBhbnkpID0+IHZvaWQgfSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUub3V0cHV0cykge1xuICAgICAgcmV0dXJuIHZhbHVlLm91dHB1dHM7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIGNvbXBvbmVudCBpbiBhIFZpZXdDb250YWluZXJSZWYgKGNhbGxlZCBmcm9tIHRlbXBsYXRlKVxuICAgKi9cbiAgaW5pdENvbXBvbmVudChcbiAgICB2Y3I6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcmVuZGVyZWRWYWx1ZTogVHlwZTxhbnk+IHwgQ29tcG9uZW50UmVuZGVyQ29uZmlnLFxuICAgIHJvdzogYW55LFxuICAgIGNvbHVtbjogRHluYW1pY1RhYmxlQ29sdW1uLFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sSWQ6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXZjcikgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGNvbnN0IGtleSA9IGAke3Jvd0luZGV4fV8ke2NvbElkfWA7XG4gICAgXG4gICAgLy8gSWYgY29tcG9uZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGNlbGwsIGRvbid0IHJlY3JlYXRlXG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmcy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5nZXRDb21wb25lbnRDbGFzcyhyZW5kZXJlZFZhbHVlKTtcbiAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuZ2V0Q29tcG9uZW50SW5wdXRzKHJlbmRlcmVkVmFsdWUpO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMuZ2V0Q29tcG9uZW50T3V0cHV0cyhyZW5kZXJlZFZhbHVlKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZjci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgICAgXG4gICAgICAvLyBTZXQgaW5wdXRzXG4gICAgICBPYmplY3Qua2V5cyhpbnB1dHMpLmZvckVhY2goaW5wdXRLZXkgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluc3RhbmNlICYmIGlucHV0S2V5IGluIGNvbXBvbmVudFJlZi5pbnN0YW5jZSkge1xuICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgYW55KVtpbnB1dEtleV0gPSBpbnB1dHNbaW5wdXRLZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3Vic2NyaWJlIHRvIG91dHB1dHNcbiAgICAgIE9iamVjdC5rZXlzKG91dHB1dHMpLmZvckVhY2gob3V0cHV0S2V5ID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSAmJiBvdXRwdXRLZXkgaW4gY29tcG9uZW50UmVmLmluc3RhbmNlKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBhbnkpW291dHB1dEtleV07XG4gICAgICAgICAgaWYgKG91dHB1dCAmJiB0eXBlb2Ygb3V0cHV0LnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3V0cHV0LnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gb3V0cHV0c1tvdXRwdXRLZXldO1xuICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgaGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dCAmJiB0eXBlb2Ygb3V0cHV0LmVtaXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEZvciBFdmVudEVtaXR0ZXIsIHdyYXAgdGhlIGVtaXQgdG8gY2FsbCB0aGUgaGFuZGxlclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbWl0ID0gb3V0cHV0LmVtaXQuYmluZChvdXRwdXQpO1xuICAgICAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBhbnkpW291dHB1dEtleV0gPSB7XG4gICAgICAgICAgICAgIGVtaXQ6IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gb3V0cHV0c1tvdXRwdXRLZXldO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc3Vic2NyaWJlOiBvdXRwdXQuc3Vic2NyaWJlLmJpbmQob3V0cHV0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBNYXJrIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgdGhpcy5jb21wb25lbnRSZWZzLnNldChrZXksIGNvbXBvbmVudFJlZik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY29tcG9uZW50IGluIHRhYmxlIGNlbGw6JywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBhbiBIVE1MIHN0cmluZyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoIGlubmVySFRNTFxuICAgKi9cbiAgaXNIdG1sU3RyaW5nKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEZhc3RlciBjaGVjazogaWYgaXQgY29udGFpbnMgYW4gb3BlbmluZyB0YWcgcGF0dGVybiBuZWFyIHRoZSBzdGFydFxuICAgIC8vIG9yIGp1c3QgaGFzIGFueSBicmFja2V0cy4gV3JhcHBpbmcgaW4gYSByZWdleCB3aXRoIFtcXHNcXFNdKiBpcyB2ZXJ5IHNsb3cuXG4gICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKCc8JykgJiYgLzxbYS16L11bXj5dKj4vaS50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgSFRNTCBzdHJpbmcgZm9yIHNhZmUgcmVuZGVyaW5nIHdpdGggY2FjaGluZ1xuICAgKi9cbiAgZ2V0U2FuaXRpemVkSHRtbCh2YWx1ZTogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIGxldCBjYWNoZWQgPSB0aGlzLmh0bWxDYWNoZS5nZXQodmFsdWUpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh2YWx1ZSk7XG4gICAgICB0aGlzLmh0bWxDYWNoZS5zZXQodmFsdWUsIGNhY2hlZCk7XG4gICAgICBcbiAgICAgIC8vIFNpbXBsZSBjYWNoZSBldmljdGlvblxuICAgICAgaWYgKHRoaXMuaHRtbENhY2hlLnNpemUgPiAxMDAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5odG1sQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmh0bWxDYWNoZS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBnZXRDZWxsVmFsdWUocm93OiBhbnksIHBhdGg/OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghcm93IHx8ICFwYXRoKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgIGxldCBjdXJyZW50ID0gcm93O1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQgPz8gXCJcIjtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBjb3B5Q2VsbEpzb25QYXRoKHBhdGg6IHN0cmluZywgZXZlbnQ6IEV2ZW50LCBzb3VyY2U6IHN0cmluZyA9ICdkYlF1ZXJ5UmVzcG9uc2UnKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChwYXRoKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcih7IHBhdGgsIHNvdXJjZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoaGFuZGxlckVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gb25Kc29uUGF0aENvcGllZEhhbmRsZXI6JywgaGFuZGxlckVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY29weSBqc29uUGF0aDonLCBlcnIpO1xuICAgICAgLy8gU3RpbGwgY2FsbCB0aGUgaGFuZGxlciBldmVuIG9uIGZhaWx1cmUgKHNpbWlsYXIgdG8gYXBpLXN0ZXAgcGF0dGVybilcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcih7IHBhdGgsIHNvdXJjZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoaGFuZGxlckVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gb25Kc29uUGF0aENvcGllZEhhbmRsZXI6JywgaGFuZGxlckVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29tcHV0ZSBncmlkLXRlbXBsYXRlLWNvbHVtbnMgc3RyaW5nIGZyb20gY29sdW1uIGNvbmZpZ1xuICBwcml2YXRlIHVwZGF0ZUdyaWRUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAoIWNvbHM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb21wdXRlZEdyaWRUZW1wbGF0ZSA9ICcnO1xuICAgICAgdGhpcy5jb21wdXRlZENvbHVtbldpZHRocyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBmaXhlZFB4ID0gY29scy5yZWR1Y2UoKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCB8fCAwKSwgMCk7XG4gICAgY29uc3QgZHluYW1pY0NvbHMgPSBjb2xzLmZpbHRlcihjID0+ICFjLmZpeGVkUHgpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gZHluYW1pY0NvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLndlaWdodCB8fCAxKSwgMCkgfHwgMTtcblxuICAgIC8vIEZsb29yIG9uIHRoZSB0YWJsZSBpdHNlbGYgPSBldmVyeSBjb2x1bW4ncyBtaW5pbXVtIHdpZHRoIGNvbnRyaWJ1dGlvbi4gRml4ZWRcbiAgICAvLyBjb2x1bW5zIGNvbnRyaWJ1dGUgYGZpeGVkUHhgOyBkeW5hbWljIGNvbHVtbnMgY29udHJpYnV0ZSBgbWluV2lkdGhgIChvciAwIHdoZW5cbiAgICAvLyB1bnNldCkuIFRoZSB0ZW1wbGF0ZSBiaW5kcyB0aGlzIHZpYSBgW3N0eWxlLm1pbi13aWR0aC5weF1gIG9uIHRoZSA8dGFibGU+IHNvXG4gICAgLy8gbmFycm93IGNvbnRhaW5lcnMgZm9yY2UgaG9yaXpvbnRhbCBzY3JvbGwgaW5zdGVhZCBvZiBzcXVpc2hpbmcgY29sdW1ucyB0byAwLlxuICAgIHRoaXMuY29tcHV0ZWRUYWJsZU1pbldpZHRoID0gY29scy5yZWR1Y2UoXG4gICAgICAoc3VtLCBjKSA9PiBzdW0gKyAoYy5maXhlZFB4ICYmIGMuZml4ZWRQeCA+IDAgPyBjLmZpeGVkUHggOiAoYy5taW5XaWR0aCB8fCAwKSksXG4gICAgICAwLFxuICAgICk7XG5cbiAgICB0aGlzLmNvbXB1dGVkQ29sdW1uV2lkdGhzID0gY29scy5tYXAoYyA9PiB7XG4gICAgICBpZiAoYy5maXhlZFB4ICYmIGMuZml4ZWRQeCA+IDApIHtcbiAgICAgICAgLy8gRml4ZWQtd2lkdGggY29sdW1ucyBzdGlsbCByZXNwZWN0IG1pbldpZHRoIGluIHRoZSAocmFyZSkgY2FzZSB0aGUgY29uc3VtZXJcbiAgICAgICAgLy8gY29uZmlndXJlZCBib3RoIOKAlCBgbWF4KGZpeGVkLCBtaW4pYCBwaWNrcyB3aGljaGV2ZXIgaXMgbGFyZ2VyLlxuICAgICAgICByZXR1cm4gYy5taW5XaWR0aCAmJiBjLm1pbldpZHRoID4gYy5maXhlZFB4XG4gICAgICAgICAgPyBgbWF4KCR7Yy5maXhlZFB4fXB4LCAke2MubWluV2lkdGh9cHgpYFxuICAgICAgICAgIDogYCR7Yy5maXhlZFB4fXB4YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNoYXJlID0gKGMud2VpZ2h0IHx8IDEpIC8gdG90YWxXZWlnaHQ7XG4gICAgICBjb25zdCBkeW5hbWljV2lkdGggPSBgY2FsYygoMTAwJSAtICR7Zml4ZWRQeH1weCkgKiAke3NoYXJlLnRvRml4ZWQoNCl9KWA7XG4gICAgICAvLyBEeW5hbWljLXNoYXJlIGNvbHVtbnMgY2FuIGNvbGxhcHNlIHRvIH4wIHdoZW4gdGhlIHRhYmxlIGlzIG5hcnJvd2VyIHRoYW5cbiAgICAgIC8vIChzdW0gb2YgZml4ZWQgd2lkdGhzKSArIHRoZSBzaGFyZSB0aGV5J2QgY29tcHV0ZSB0by4gVXNpbmcgQ1NTIGBtYXgoKWAgZmxvb3JzXG4gICAgICAvLyB0aGUgY29sdW1uIGF0IGBtaW5XaWR0aGAgc28gaXQgZ3Jvd3MgbmF0dXJhbGx5IGFzIHRoZSB0YWJsZSB3aWRlbnMgYnV0IG5ldmVyXG4gICAgICAvLyBzaHJpbmtzIGJlbG93IHRoZSBjb25maWd1cmVkIHBpeGVsIG1pbmltdW0uIFdpdGggYHRhYmxlLWxheW91dDogZml4ZWRgLCB0aGVcbiAgICAgIC8vIDxjb2w+IHdpZHRoIGlzIGF1dGhvcml0YXRpdmUg4oCUIHdpdGhvdXQgbWF4KCkgaGVyZSB0aGUgY2VsbC1sZXZlbCBgbWluLXdpZHRoYFxuICAgICAgLy8gd2Ugc2V0IG9uIDx0aD4vPHRkPiBpcyBpZ25vcmVkIGFuZCBjb2x1bW5zIHZpc3VhbGx5IGRpc2FwcGVhciBhdCBuYXJyb3cgd2lkdGhzLlxuICAgICAgcmV0dXJuIGMubWluV2lkdGggJiYgYy5taW5XaWR0aCA+IDBcbiAgICAgICAgPyBgbWF4KCR7Yy5taW5XaWR0aH1weCwgJHtkeW5hbWljV2lkdGh9KWBcbiAgICAgICAgOiBkeW5hbWljV2lkdGg7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnY29tcHV0ZWRDb2x1bW5XaWR0aHMnLCB0aGlzLmNvbXB1dGVkQ29sdW1uV2lkdGhzKTtcbiAgICBcbiAgICBpZiAodGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkR3JpZFRlbXBsYXRlID0gdGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbXB1dGVkR3JpZFRlbXBsYXRlID0gdGhpcy5jb21wdXRlZENvbHVtbldpZHRocy5qb2luKCcgJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VsZWN0aW9uIGhlbHBlcnNcbiAgaXNSb3dTZWxlY3RhYmxlKHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRoaXMucm93U2VsZWN0YWJsZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMucm93U2VsZWN0YWJsZShyb3cpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSAodGhpcy5kYXRhIHx8IFtdKS5maWx0ZXIoKHIpID0+IHRoaXMuaXNSb3dTZWxlY3RhYmxlKHIpKTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHJvd3MuZXZlcnkociA9PiAhIXI/LmlzU2VsZWN0ZWQpO1xuICB9XG5cbiAgZ2V0IHNvbWVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dzID0gKHRoaXMuZGF0YSB8fCBbXSkuZmlsdGVyKChyKSA9PiB0aGlzLmlzUm93U2VsZWN0YWJsZShyKSk7XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFueVNlbGVjdGVkID0gcm93cy5zb21lKHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgICByZXR1cm4gYW55U2VsZWN0ZWQgJiYgIXRoaXMuYWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBvblNlbGVjdEFsbENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnRvZ2dsZVNlbGVjdEFsbCh0YXJnZXQuY2hlY2tlZCk7XG4gIH1cblxuICBvblJvd1NlbGVjdENoYW5nZShldmVudDogRXZlbnQsIHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUm93U2VsZWN0YWJsZShyb3cpKSB7XG4gICAgICByb3cuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICByb3cuaXNTZWxlY3RlZCA9IHRhcmdldC5jaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlU2VsZWN0QWxsKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LmlzU2VsZWN0ZWQgPSB0aGlzLmlzUm93U2VsZWN0YWJsZShyb3cpID8gY2hlY2tlZCA6IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFNvcnRpbmcgc3VwcG9ydCA9PT09PVxuICBwcml2YXRlIF9zb3J0QWN0aXZlPzogc3RyaW5nO1xuICBwcml2YXRlIF9zb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgdXBkYXRlQ29tcHV0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlTG9jYWxTb3J0IHx8ICF0aGlzLl9zb3J0QWN0aXZlIHx8ICF0aGlzLl9zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IHNvdXJjZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKGMgPT4gYy5maWVsZElkID09PSB0aGlzLl9zb3J0QWN0aXZlKTtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmZpZWxkVmFsdWUpIHtcbiAgICAgIHRoaXMuY29tcHV0ZWREYXRhID0gc291cmNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXIgPSB0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBjb2wuZmllbGRWYWx1ZTtcbiAgICBjb25zdCBvdXQgPSBbLi4uc291cmNlXTtcbiAgICBvdXQuc29ydCgoYSwgYikgPT4gZGlyICogdGhpcy5jb21wYXJlVmFsdWVzKHRoaXMuZ2V0Q2VsbFZhbHVlKGEsIGZpZWxkUGF0aCksIHRoaXMuZ2V0Q2VsbFZhbHVlKGIsIGZpZWxkUGF0aCkpKTtcbiAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IG91dDtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIGxvYWRpbmcgZmxhZ3MgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGdldCBzaG93VGFibGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVMb2FkaW5nID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHNob3dUYWJsZURhdGFMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVGFibGVEYXRhTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0YWJsZSBoYXMgbm8gZGF0YSBhbmQgaXMgbm90IGN1cnJlbnRseSBsb2FkaW5nIOKAlCB1c2VkIHRvIHNob3cgYW4gZW1wdHkgc3RhdGVcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW55TG9hZGluZyA9IHRoaXMuc2hvd1RhYmxlTG9hZGluZyB8fCB0aGlzLnNob3dUYWJsZURhdGFMb2FkaW5nO1xuICAgIHJldHVybiAhYW55TG9hZGluZyAmJiAoISh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCkgfHwgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCk7XG4gIH1cblxuICBpc1NvcnRlZEFzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnO1xuICB9XG5cbiAgaXNTb3J0ZWREZXNjKGNvbElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEFjdGl2ZSA9PT0gY29sSWQgJiYgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICB9XG5cbiAgdG9nZ2xlU29ydChjb2w6IER5bmFtaWNUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sPy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbElkID0gY29sLmZpZWxkSWQ7XG4gICAgaWYgKHRoaXMuX3NvcnRBY3RpdmUgIT09IGNvbElkKSB7XG4gICAgICB0aGlzLl9zb3J0QWN0aXZlID0gY29sSWQ7XG4gICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGN5Y2xlIGFzYyAtPiBkZXNjIC0+IG51bGwgLT4gYXNjXG4gICAgICBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHRoaXMuX3NvcnREaXJlY3Rpb24gPSBudWxsO1xuICAgICAgZWxzZSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29tcHV0ZWREYXRhKCk7XG4gICAgdGhpcy5zb3J0Q2hhbmdlLmVtaXQoeyBmaWVsZElkOiB0aGlzLl9zb3J0QWN0aXZlLCBmaWVsZFZhbHVlOiBjb2wuZmllbGRWYWx1ZSwgZGlyZWN0aW9uOiB0aGlzLl9zb3J0RGlyZWN0aW9uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGE6IGFueSwgYjogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIDE7IC8vIG51bGxzIGxhc3QgaW4gYXNjIChoYW5kbGVkIGJ5IGRpciBtdWx0aXBsaWVyKVxuICAgIGlmIChiID09IG51bGwpIHJldHVybiAtMTtcblxuICAgIGNvbnN0IG51bUEgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBhIDogTnVtYmVyKGEpO1xuICAgIGNvbnN0IG51bUIgPSB0eXBlb2YgYiA9PT0gJ251bWJlcicgPyBiIDogTnVtYmVyKGIpO1xuICAgIGNvbnN0IGFJc051bSA9ICFpc05hTihudW1BKSAmJiBhICE9PSAnJyAmJiBhICE9PSBudWxsICYmIGEgIT09IGZhbHNlO1xuICAgIGNvbnN0IGJJc051bSA9ICFpc05hTihudW1CKSAmJiBiICE9PSAnJyAmJiBiICE9PSBudWxsICYmIGIgIT09IGZhbHNlO1xuICAgIGlmIChhSXNOdW0gJiYgYklzTnVtKSB7XG4gICAgICBpZiAobnVtQSA8IG51bUIpIHJldHVybiAtMTtcbiAgICAgIGlmIChudW1BID4gbnVtQikgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBEYXRlIGRldGVjdGlvbjogYXR0ZW1wdCBwYXJzZSB3aGVuIGJvdGggdmFsdWVzIGFyZSBzdHJpbmdzIGFuZCBwYXJzZWFibGVcbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBiID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdHNBID0gRGF0ZS5wYXJzZShhKTtcbiAgICAgIGNvbnN0IHRzQiA9IERhdGUucGFyc2UoYik7XG4gICAgICBpZiAoIWlzTmFOKHRzQSkgJiYgIWlzTmFOKHRzQikpIHtcbiAgICAgICAgaWYgKHRzQSA8IHRzQikgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodHNBID4gdHNCKSByZXR1cm4gMTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvLyBsb2NhbGVDb21wYXJlLCBjYXNlLWluc2Vuc2l0aXZlXG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnLCBudW1lcmljOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHN0cmluZyBjb21wYXJpc29uXG4gICAgY29uc3Qgc2EgPSBTdHJpbmcoYSk7XG4gICAgY29uc3Qgc2IgPSBTdHJpbmcoYik7XG4gICAgcmV0dXJuIHNhLmxvY2FsZUNvbXBhcmUoc2IsIHVuZGVmaW5lZCwgeyBzZW5zaXRpdml0eTogJ2Jhc2UnLCBudW1lcmljOiB0cnVlIH0pO1xuICB9XG59XG5cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBbY2xhc3MuY3FhLW1heC1oLVsxMDBweF1dPVwic2hvd1RhYmxlTG9hZGluZ1wiPlxuICAgIDxjcWEtZnVsbC10YWJsZS1sb2FkZXIgKm5nSWY9XCJzaG93VGFibGVMb2FkaW5nXCI+PC9jcWEtZnVsbC10YWJsZS1sb2FkZXI+XG4gICAgPGNxYS10YWJsZS1kYXRhLWxvYWRlciAqbmdJZj1cInNob3dUYWJsZURhdGFMb2FkaW5nXCI+PC9jcWEtdGFibGUtZGF0YS1sb2FkZXI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUtaW5uZXIgY3FhLXctZnVsbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1ncmF5LTIwMFwiXG4gICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cInRydWVcIlxuICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbXB1dGVkVGFibGVNaW5XaWR0aCB8fCBudWxsXCJcbiAgICAgICAgICAgKm5nSWY9XCIhc2hvd1RhYmxlTG9hZGluZ1wiPlxuICAgICAgPGNvbGdyb3VwPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWR0aCBvZiBjb21wdXRlZENvbHVtbldpZHRoczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgPGNvbCBbc3R5bGUud2lkdGhdPVwid2lkdGhcIiAvPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvY29sZ3JvdXA+XG5cbiAgICAgIDx0aGVhZCAqbmdJZj1cImRhdGE/Lmxlbmd0aFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1oZWFkZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY2VsbCBjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJnLVsjZWZmMGY3XVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgIGNvbC5maWVsZElkICsgJy1jZWxsJyxcbiAgICAgICAgICAgICAgICBjb2wuYWxpZ24gPT09ICdjZW50ZXInID8gJ2NxYS10ZXh0LWNlbnRlcicgOiBjb2wuYWxpZ24gPT09ICdyaWdodCcgPyAnY3FhLXRleHQtcmlnaHQnIDogJ2NxYS10ZXh0LWxlZnQnXG4gICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPCEtLSBCdWlsdC1pbiBzZWxlY3QtYWxsIGZvciBjaGVja2JveCBjb2x1bW4gd2hlbiBlbmFibGVkIGFuZCBubyBjdXN0b20gaGVhZGVyIHRlbXBsYXRlIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuZmllbGRJZCA9PT0gJ2NoZWNrYm94JyAmJiBlbmFibGVTZWxlY3RBbGwgJiYgIWdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKTsgZWxzZSBoZWFkZXJUcGxPckRlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjaGVja2JveFwiIGFyaWEtbGFiZWw9XCJTZWxlY3QgYWxsIHJvd3NcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzb21lU2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIiBjbGFzcz1cImhpZGRlbi1jaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbE9yRGVmYXVsdD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0SGVhZGVyVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGhlYWRlclRwbDsgZWxzZSBkZWZhdWx0SGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5zb3J0YWJsZTsgZWxzZSBwbGFpbkhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhlYWRlci10ZXh0IGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNvcnQoY29sKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NvcnQgYnkgJyArIChjb2wuZmllbGROYW1lIHx8IGNvbC5maWVsZElkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEyLjNweF0gY3FhLWxlYWRpbmctWzE3LjVweF0gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LW1lZGl1bVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWRBc2MoY29sLmZpZWxkSWQpXCI+4payPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWREZXNjKGNvbC5maWVsZElkKVwiPuKWvDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5IZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRleHRcIj57eyBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInRhYmxlLWJvZHkgY3FhLXctZnVsbFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJ0YWJsZS1yb3cgY3FhLWJnLXN1cmZhY2UtZGVmYXVsdCBob3ZlcjpjcWEtYmctc3VyZmFjZS1ob3ZlclwiICpuZ0Zvcj1cImxldCByb3cgb2YgY29tcHV0ZWREYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicm93Py5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNlbGwgY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF1cIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5taW5XaWR0aFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICBjb2wuZmllbGRJZCArICctY2VsbCcsXG4gICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtdGV4dC1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS10ZXh0LXJpZ2h0JyA6ICdjcWEtdGV4dC1sZWZ0JyxcbiAgICAgICAgICAgICAgICBjZWxsSnNvblBhdGhHZXR0ZXIgJiYgY29sLmZpZWxkSWQgIT09ICdjaGVja2JveCcgJiYgY29sLmZpZWxkSWQgIT09ICdhY3Rpb25zJyA/ICdjcWEtY3Vyc29yLXBvaW50ZXInIDogJydcbiAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgIChkYmxjbGljayk9XCJjZWxsSnNvblBhdGhHZXR0ZXIgJiYgY29sPy5maWVsZElkICE9PSAnY2hlY2tib3gnICYmIGNvbD8uZmllbGRJZCAhPT0gJ2FjdGlvbnMnICYmIGNvcHlDZWxsSnNvblBhdGgoY2VsbEpzb25QYXRoR2V0dGVyKHJvd0luZGV4LCBjb2w/LmZpZWxkSWQsIHJvdyksICRldmVudCwgJ2RiUXVlcnlSZXNwb25zZScpXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gY2hlY2tib3ggY2VsbCB3aGVuIG5vIGN1c3RvbSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZElkID09PSAnY2hlY2tib3gnICYmICFnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpOyBlbHNlIHJlZ3VsYXJDZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICAgIGNvbC5hbGlnbiA9PT0gJ2NlbnRlcicgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyJyA6IGNvbC5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQnIDogJydcbiAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4tY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIncm93LWNoZWNrYm94LScgKyByb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3Qgcm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicm93Py5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Sb3dTZWxlY3RDaGFuZ2UoJGV2ZW50LCByb3cpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KSA/ICcwLjQ1JyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY3Vyc29yXT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KSA/ICdub3QtYWxsb3dlZCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KSA/ICdub25lJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5mb3JdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXJDZWxsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGNlbGxUcGw7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVHBsOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3csIHJvdzogcm93LCB2YWx1ZTogZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmZpZWxkVmFsdWUpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGw+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmVuZGVyZWRWYWx1ZShyb3csIGNvbCkgYXMgcmVuZGVyZWRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb21wb25lbnQocmVuZGVyZWRWYWx1ZSk7IGVsc2Ugbm9uQ29tcG9uZW50Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICBjcWFDZWxsQ29udGFpbmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NlbGxDb250YWluZXI9XCJjcWFDZWxsQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRDb25maWddPVwicmVuZGVyZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbElkXT1cImNvbC5maWVsZElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkNvbXBvbmVudENlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSHRtbFN0cmluZyhyZW5kZXJlZFZhbHVlKTsgZWxzZSB0ZXh0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxN3B4XVwiIFtpbm5lckhUTUxdPVwiZ2V0U2FuaXRpemVkSHRtbChyZW5kZXJlZFZhbHVlKVwiIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5hbGlnbiA9PT0gJ2NlbnRlcicgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyJyA6IGNvbC5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICBdXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZXh0Q2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgIF1cIj57eyByZW5kZXJlZFZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RhYmxlL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUEyRyx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdoUSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7QUFLeEcsTUFBTSw0QkFBNEIsR0FBRzs7Ozs7Ozs7O0NBU3BDLENBQUM7QUFnQ0YsTUFBTSxPQUFPLHFCQUFxQjtJQWtGaEMsWUFDVSxTQUF1QixFQUN2QixHQUFzQjtRQUR0QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbkZ2QixTQUFJLEdBQVUsRUFBRSxDQUFDO1FBQ2pCLFlBQU8sR0FBeUIsRUFBRSxDQUFDO1FBUzVDLDhEQUE4RDtRQUNyRCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUl6QyxzRkFBc0Y7UUFDN0Usb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFPekMsc0VBQXNFO1FBQzVELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBOEUsQ0FBQztRQVF0SDs7OztXQUlHO1FBQ00scUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQzNDLHdDQUF3QztRQUMvQix5QkFBb0IsR0FBVyxpQkFBaUIsQ0FBQztRQUMxRDs7OztXQUlHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUF1RSxDQUFDO1FBRS9H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QUE4QjtnQkFHTyxhQUFhO3NCQUFsRSxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBJbnB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgQ29tcG9uZW50UmVmLCBUeXBlLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xuaW1wb3J0IHsgRG5kRHJvcEV2ZW50IH0gZnJvbSBcIm5neC1kcmFnLWRyb3BcIjtcbmltcG9ydCB7IER5bmFtaWNDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIER5bmFtaWNIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL2R5bmFtaWMtY2VsbC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlckNvbmZpZyB9IGZyb20gXCIuL2NvbXBvbmVudC1yZW5kZXItY29uZmlnLmludGVyZmFjZVwiO1xuXG5leHBvcnQgeyBDb21wb25lbnRSZW5kZXJDb25maWcgfSBmcm9tIFwiLi9jb21wb25lbnQtcmVuZGVyLWNvbmZpZy5pbnRlcmZhY2VcIjtcblxuY29uc3QgRFlOQU1JQ19UQUJMRV9SRU9SREVSX1NUWUxFUyA9IGBcbiAgLnJlb3JkZXItaGFuZGxlLWNlbGwgeyB3aWR0aDogNDRweDsgfVxuICAucmVvcmRlci1oYW5kbGUtaWNvbiB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgY29sb3I6ICM2QjcyODA7IH1cbiAgLmNxYS1yb3ctZHJhZ2dhYmxlIHsgY3Vyc29yOiBncmFiOyB9XG4gIC5jcWEtcm93LWRyYWdnYWJsZTphY3RpdmUgeyBjdXJzb3I6IGdyYWJiaW5nOyB9XG4gIC5jcWEtcm93LWRyYWdnYWJsZS5kbmREcmFnZ2luZyB7IG9wYWNpdHk6IDAuNTsgfVxuICAuY3FhLXJvdy1kcmFnZ2FibGUuZG5kRHJhZ2dpbmdTb3VyY2UgeyBvcGFjaXR5OiAwLjM7IH1cbiAgdHIuY3FhLXJvdy1kcm9wLWFib3ZlID4gdGQgeyBib3gtc2hhZG93OiBpbnNldCAwIDNweCAwIDAgIzNGNDNFRTsgfVxuICB0ci5jcWEtcm93LWRyb3AtYmVsb3cgPiB0ZCB7IGJveC1zaGFkb3c6IGluc2V0IDAgLTNweCAwIDAgIzNGNDNFRTsgfVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljVGFibGVDb2x1bW4ge1xuICBmaWVsZElkOiBzdHJpbmc7XG4gIGZpZWxkTmFtZT86IHN0cmluZztcbiAgZmllbGRWYWx1ZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSByZW5kZXJlciBpbnZva2VkIHdoZW4gbm8gcHJvamVjdGVkIGNlbGwgdGVtcGxhdGUgaXMgcHJvdmlkZWQuXG4gICAqIFJldHVybnMgdGhlIHN0cmluZy9udW1iZXIvSFRNTCBzdHJpbmcvQ29tcG9uZW50IGNsYXNzL0NvbXBvbmVudFJlbmRlckNvbmZpZyB0byBkaXNwbGF5IGZvciB0aGUgZ2l2ZW4gcm93LlxuICAgKiBIVE1MIHN0cmluZ3Mgd2lsbCBiZSBzYW5pdGl6ZWQgYW5kIHJlbmRlcmVkIHNhZmVseS5cbiAgICogQ29tcG9uZW50IGNsYXNzZXMgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZWQuXG4gICAqL1xuICByZW5kZXI/OiAocm93OiBhbnksIGNvbHVtbjogRHluYW1pY1RhYmxlQ29sdW1uKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBTYWZlSHRtbCB8IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZztcbiAgaXNEZWZhdWx0PzogYm9vbGVhbjtcbiAgc29ydGFibGU/OiBib29sZWFuO1xuICBpc1Nob3c/OiBib29sZWFuO1xuICAvLyBOZXcgY29uZmlndXJhdGlvbiBmaWVsZHMgdG8gdW5pZnkgbGF5b3V0IGxvZ2ljXG4gIHdlaWdodD86IG51bWJlcjsgLy8gcmVsYXRpdmUgd2VpZ2h0IGZvciBkeW5hbWljIHNoYXJlXG4gIGZpeGVkUHg/OiBudW1iZXI7IC8vIGZpeGVkIHdpZHRoIGluIHB4IChlLmcuIGNoZWNrYm94L2FjdGlvbnMpXG4gIC8qKiBNaW5pbXVtIHdpZHRoIGluIHB4IOKAlCBhcHBsaWVkIHRvIGJvdGggdGhlIGhlYWRlciBjZWxsIGFuZCBldmVyeSBib2R5IGNlbGwgb2YgdGhpcyBjb2x1bW4uICovXG4gIG1pbldpZHRoPzogbnVtYmVyO1xuICByZXNwb25zaXZlPzogeyB4cz86IGJvb2xlYW47IHNtPzogYm9vbGVhbjsgbWQ/OiBib29sZWFuIH07IC8vIGhpZGUgYXQgc3BlY2lmaWMgYnJlYWtwb2ludHNcbiAgYWxpZ24/OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhcHAtZHluYW1pYy10YWJsZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVzOiBbRFlOQU1JQ19UQUJMRV9SRU9SREVSX1NUWUxFU10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBEeW5hbWljVGFibGVDb2x1bW5bXSA9IFtdO1xuICAvKipcbiAgICogT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCB3aGVuIG5vIGN1c3RvbSBlbXB0eSB0ZW1wbGF0ZSBpcyBwcm92aWRlZC5cbiAgICovXG4gIEBJbnB1dCgpIGVtcHR5U3RhdGU/OiB7IHRpdGxlPzogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgaW1hZ2VVcmw/OiBzdHJpbmc7IGFjdGlvbnM/OiBhbnlbXSB9O1xuICAvLyBPcHRpb25hbCBvdmVycmlkZTsgaWYgb21pdHRlZCB3ZSBjb21wdXRlIGZyb20gY29sdW1uc1xuICBASW5wdXQoKSBncmlkVGVtcGxhdGVDb2x1bW5zPzogc3RyaW5nO1xuICAvLyBCcmVha3BvaW50LWF3YXJlIHNpemluZzsgcHJvdmlkZSBmcm9tIHBhcmVudCB0byBhdm9pZCBleHRyYSBsaXN0ZW5lcnNcbiAgQElucHV0KCkgc2NyZWVuV2lkdGg/OiBudW1iZXI7XG4gIC8vIEVuYWJsZSBidWlsdC1pbiBzZWxlY3QtYWxsIGJlaGF2aW9yIGZvciBhICdjaGVja2JveCcgY29sdW1uXG4gIEBJbnB1dCgpIGVuYWJsZVNlbGVjdEFsbDogYm9vbGVhbiA9IHRydWU7XG4gIC8vIE9wdGlvbmFsIHByZWRpY2F0ZSB0byBjb250cm9sIHdoZXRoZXIgYSByb3cgaXMgc2VsZWN0YWJsZS5cbiAgLy8gSWYgbm90IHByb3ZpZGVkLCBhbGwgcm93cyBhcmUgc2VsZWN0YWJsZSAoYmFja3dhcmQgY29tcGF0aWJsZSBiZWhhdmlvcikuXG4gIEBJbnB1dCgpIHJvd1NlbGVjdGFibGU/OiAocm93OiBhbnkpID0+IGJvb2xlYW47XG4gIC8vIEVuYWJsZSBzaW1wbGUgY2xpZW50LXNpZGUgc29ydGluZyB3aGVuIGNsaWNraW5nIHNvcnRhYmxlIGhlYWRlcnMgKG5vIGN1c3RvbSBoZWFkZXIpXG4gIEBJbnB1dCgpIGVuYWJsZUxvY2FsU29ydDogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEJhY2t3YXJkLWNvbXBhdCBsb2FkaW5nIGZsYWcgKGFwcGxpZXMgdG8gYm90aCBsb2FkZXJzIGlmIHNwZWNpZmljIGZsYWdzIG5vdCBwcm92aWRlZClcbiAgXG4gIC8vIE5ldzogY29udHJvbHMgdGhlIGZ1bGwgdGFibGUgb3ZlcmxheSBsb2FkZXJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xuICAvLyBOZXc6IGNvbnRyb2xzIHRoZSBpbmxpbmUgZGF0YSBsb2FkZXIgYWJvdmUgdGhlIHRhYmxlXG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEVtaXQgc29ydCBjaGFuZ2VzIHNvIHBhcmVudCBjYW4gcGVyZm9ybSBzZXJ2ZXItc2lkZSBzb3J0IGlmIGRlc2lyZWRcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmllbGRJZDogc3RyaW5nOyBmaWVsZFZhbHVlPzogc3RyaW5nOyBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbCB9PigpO1xuXG4gIC8vIE9wdGlvbmFsIGdldHRlciBmb3IgSlNPTiBwYXRoIHBlciBjZWxsLiBXaGVuIHByb3ZpZGVkLCBkb3VibGUtY2xpY2tpbmcgYSBjZWxsIGNvcGllcyB0aGUgcGF0aC5cbiAgQElucHV0KCkgY2VsbEpzb25QYXRoR2V0dGVyPzogKHJvd0luZGV4OiBudW1iZXIsIGNvbElkOiBzdHJpbmcsIHJvdzogYW55KSA9PiBzdHJpbmc7XG5cbiAgLy8gT3B0aW9uYWwgaGFuZGxlciBjYWxsZWQgd2hlbiBhIEpTT04gcGF0aCBpcyBjb3BpZWQgZnJvbSBhIHRhYmxlIGNlbGxcbiAgQElucHV0KCkgb25Kc29uUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgcGF0aDogc3RyaW5nOyBzb3VyY2U6IHN0cmluZyB9KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHJlbmRlcnMgYSBkcmFnLWhhbmRsZSBjb2x1bW4gYXMgdGhlIGxlZnRtb3N0IGNlbGwgYW5kIGVuYWJsZXNcbiAgICogcm93IGRyYWctYW5kLWRyb3AgcmVvcmRlcmluZyB2aWEgbmd4LWRyYWctZHJvcC4gT2ZmIGJ5IGRlZmF1bHQgc28gZXhpc3RpbmdcbiAgICogY29uc3VtZXJzIGFyZSB1bmFmZmVjdGVkLlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlUm93UmVvcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVG9vbHRpcCBmb3IgdGhlIGRyYWcgaGFuZGxlIGljb24uICovXG4gIEBJbnB1dCgpIHJlb3JkZXJIYW5kbGVUb29sdGlwOiBzdHJpbmcgPSAnRHJhZyB0byByZW9yZGVyJztcbiAgLyoqXG4gICAqIEVtaXR0ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHJvdyBkcm9wLiBgb3JkZXJlZERhdGFgIGlzIGEgZnJlc2hseSBhbGxvY2F0ZWRcbiAgICogYXJyYXkgcmVmbGVjdGluZyB0aGUgbmV3IG9yZGVyIOKAlCBwYXJlbnRzIHNob3VsZCBhc3NpZ24gaXQgYmFjayB0byBgW2RhdGFdYFxuICAgKiByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGluLXBsYWNlIG11dGF0aW9uLlxuICAgKi9cbiAgQE91dHB1dCgpIHJvd1Jlb3JkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcHJldmlvdXNJbmRleDogbnVtYmVyOyBjdXJyZW50SW5kZXg6IG51bWJlcjsgb3JkZXJlZERhdGE6IGFueVtdIH0+KCk7XG5cbiAgLyoqIEluZGV4IG9mIHRoZSByb3cgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgaG92ZXJpbmcgZHVyaW5nIGEgcmVvcmRlciBkcmFnLiAqL1xuICBkcm9wSG92ZXJJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIHRoZSBjdXJzb3IgaXMgaW4gdGhlIHRvcCBvciBib3R0b20gaGFsZiBvZiB0aGUgaG92ZXJlZCByb3cuICovXG4gIGRyb3BQb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSByb3cgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQg4oCUIHVzZWQgdG8gc3VwcHJlc3MgdGhlIGluZGljYXRvciBvbiB0aGUgc291cmNlIHJvdy4gKi9cbiAgcHJpdmF0ZSBkcmFnZ2VkUm93OiBhbnkgPSBudWxsO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY0NlbGxUZW1wbGF0ZURpcmVjdGl2ZSkgY2VsbFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxEeW5hbWljQ2VsbFRlbXBsYXRlRGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihEeW5hbWljSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpIGhlYWRlclRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxEeW5hbWljSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAvLyBBbGxvdyBjb25zdW1lcnMgdG8gcHJvamVjdCBhIGN1c3RvbSBlbXB0eS1zdGF0ZSB0ZW1wbGF0ZSB1c2luZyBhIHRlbXBsYXRlIHJlZiBuYW1lXG4gIC8vIGUuZy4gPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlVHBsPkN1c3RvbSBlbXB0eSBVSTwvbmctdGVtcGxhdGU+XG4gIEBDb250ZW50Q2hpbGQoJ2VtcHR5VGFibGVUcGwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIGVtcHR5VGFibGVUcGw/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vIE1hcCB0byBzdG9yZSBjb21wb25lbnQgcmVmZXJlbmNlcyBmb3IgY2xlYW51cDogcm93SW5kZXhfY29sSWQgLT4gQ29tcG9uZW50UmVmXG4gIHByaXZhdGUgY29tcG9uZW50UmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcblxuICAvLyBDYWNoZXMgZm9yIGV4cGVuc2l2ZSBnZXR0ZXJzXG4gIHZpc2libGVDb2x1bW5zOiBEeW5hbWljVGFibGVDb2x1bW5bXSA9IFtdO1xuICBjb21wdXRlZERhdGE6IGFueVtdID0gW107XG4gIGNvbXB1dGVkR3JpZFRlbXBsYXRlOiBzdHJpbmcgPSAnJztcbiAgY29tcHV0ZWRDb2x1bW5XaWR0aHM6IHN0cmluZ1tdID0gW107XG4gIC8qKlxuICAgKiBIYXJkIGZsb29yIG9uIHRoZSBgPHRhYmxlPmAgd2lkdGggPSBzdW0gb2YgZXZlcnkgdmlzaWJsZSBjb2x1bW4ncyBtaW5pbXVtIChmaXhlZFxuICAgKiB3aWR0aHMgKyBkeW5hbWljIGNvbHVtbnMnIGBtaW5XaWR0aGApLiBXaXRoIGB0YWJsZS1sYXlvdXQ6IGZpeGVkOyB3aWR0aDogMTAwJTtgIHNldFxuICAgKiBieSBjb25zdW1lcnMsIGA8Y29sPmAgd2lkdGhzIGJlY29tZSBhZHZpc29yeSBvbmNlIHRoZSBjb250YWluZXIgaXMgbmFycm93ZXIgdGhhblxuICAgKiB0aGUgY29sdW1uLXdpZHRoIHN1bSDigJQgdGhlIGJyb3dzZXIgc2lsZW50bHkgc2hyaW5rcyB0aGVtLiBQaW5uaW5nIGBtaW4td2lkdGhgIG9uXG4gICAqIHRoZSB0YWJsZSBpdHNlbGYgcHJldmVudHMgdGhhdCBjb21wYWN0aW9uOyB0aGUgY29uc3VtZXIncyBgb3ZlcmZsb3cteDogYXV0b2BcbiAgICogd3JhcHBlciB0aGVuIHNjcm9sbHMgaG9yaXpvbnRhbGx5IGluc3RlYWQgb2Ygc3F1aXNoaW5nIGNvbHVtbnMgdG8gemVybyB3aWR0aC5cbiAgICovXG4gIGNvbXB1dGVkVGFibGVNaW5XaWR0aCA9IDA7XG5cbiAgLy8gQ2FjaGUgZm9yIHNhbml0aXplZCBIVE1MIHRvIGF2b2lkIHJlZHVuZGFudCBpbm5lckhUTUwgcmVuZGVyc1xuICBwcml2YXRlIGh0bWxDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBTYWZlSHRtbD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snc2NyZWVuV2lkdGgnXSkge1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlQ29sdW1ucygpO1xuICAgICAgdGhpcy51cGRhdGVHcmlkVGVtcGxhdGUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snZW5hYmxlTG9jYWxTb3J0J10pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29tcHV0ZWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gQ2xlYW4gdXAgYWxsIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29tcG9uZW50c1xuICAgIHRoaXMuY29tcG9uZW50UmVmcy5mb3JFYWNoKHJlZiA9PiByZWYuZGVzdHJveSgpKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLmh0bWxDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNYcygpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ID0gdGhpcy5zY3JlZW5XaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4gdyA8PSA0ODA7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNTbSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ID0gdGhpcy5zY3JlZW5XaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4gdyA8PSA3Njg7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNNZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB3ID0gdGhpcy5zY3JlZW5XaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4gdyA8PSA5OTI7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVDb2x1bW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3BvbnNpdmVGaWx0ZXIgPSAoYzogRHluYW1pY1RhYmxlQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCByID0gYz8ucmVzcG9uc2l2ZSB8fCB7fTtcbiAgICAgIGlmIChyLnhzICYmIHRoaXMuaXNYcykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHIuc20gJiYgdGhpcy5pc1NtKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoci5tZCAmJiB0aGlzLmlzTWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbHRlcihjID0+IGMuaXNTaG93ICE9PSBmYWxzZSkuZmlsdGVyKHJlc3BvbnNpdmVGaWx0ZXIpO1xuICB9XG5cbiAgZ2V0SGVhZGVyVGVtcGxhdGUoY29sSWQ6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCB0cGwgPSB0aGlzLmhlYWRlclRlbXBsYXRlcz8uZmluZCh0ID0+IHQubmFtZSA9PT0gY29sSWQpO1xuICAgIHJldHVybiB0cGwgPyB0cGwudGVtcGxhdGUgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q2VsbFRlbXBsYXRlKGNvbElkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgdHBsID0gdGhpcy5jZWxsVGVtcGxhdGVzPy5maW5kKHQgPT4gdC5uYW1lID09PSBjb2xJZCk7XG4gICAgcmV0dXJuIHRwbCA/IHRwbC50ZW1wbGF0ZSA6IG51bGw7XG4gIH1cblxuICBnZXRSZW5kZXJlZFZhbHVlKHJvdzogYW55LCBjb2x1bW46IER5bmFtaWNUYWJsZUNvbHVtbik6IGFueSB7XG4gICAgaWYgKGNvbHVtbj8ucmVuZGVyICYmIHR5cGVvZiBjb2x1bW4ucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY29sdW1uLnJlbmRlcihyb3csIGNvbHVtbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEeW5hbWljVGFibGUgcmVuZGVyIGZ1bmN0aW9uIHRocmV3IGFuIGVycm9yIGZvciBjb2x1bW4nLCBjb2x1bW4/LmZpZWxkSWQsIGVycik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uPy5maWVsZFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGEgY29tcG9uZW50IGNsYXNzIG9yIGNvbXBvbmVudCBjb25maWdcbiAgICovXG4gIGlzQ29tcG9uZW50KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNvbXBvbmVudCBjbGFzcyAoaGFzIEBDb21wb25lbnQgZGVjb3JhdG9yIG1ldGFkYXRhKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUucHJvdG90eXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIENvbXBvbmVudFJlbmRlckNvbmZpZ1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNvbXBvbmVudCAmJiB0eXBlb2YgdmFsdWUuY29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbXBvbmVudCBjbGFzcyBmcm9tIGEgcmVuZGVyIHZhbHVlIChjb3VsZCBiZSBjbGFzcyBvciBjb25maWcpXG4gICAqL1xuICBnZXRDb21wb25lbnRDbGFzcyh2YWx1ZTogVHlwZTxhbnk+IHwgQ29tcG9uZW50UmVuZGVyQ29uZmlnKTogVHlwZTxhbnk+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHZhbHVlLmNvbXBvbmVudDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbXBvbmVudCB2YWx1ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29tcG9uZW50IGlucHV0cyBmcm9tIGEgcmVuZGVyIHZhbHVlXG4gICAqL1xuICBnZXRDb21wb25lbnRJbnB1dHModmFsdWU6IFR5cGU8YW55PiB8IENvbXBvbmVudFJlbmRlckNvbmZpZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmlucHV0cykge1xuICAgICAgcmV0dXJuIHZhbHVlLmlucHV0cztcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29tcG9uZW50IG91dHB1dHMgZnJvbSBhIHJlbmRlciB2YWx1ZVxuICAgKi9cbiAgZ2V0Q29tcG9uZW50T3V0cHV0cyh2YWx1ZTogVHlwZTxhbnk+IHwgQ29tcG9uZW50UmVuZGVyQ29uZmlnKTogeyBba2V5OiBzdHJpbmddOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCB9IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5vdXRwdXRzKSB7XG4gICAgICByZXR1cm4gdmFsdWUub3V0cHV0cztcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgY29tcG9uZW50IGluIGEgVmlld0NvbnRhaW5lclJlZiAoY2FsbGVkIGZyb20gdGVtcGxhdGUpXG4gICAqL1xuICBpbml0Q29tcG9uZW50KFxuICAgIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICByZW5kZXJlZFZhbHVlOiBUeXBlPGFueT4gfCBDb21wb25lbnRSZW5kZXJDb25maWcsXG4gICAgcm93OiBhbnksXG4gICAgY29sdW1uOiBEeW5hbWljVGFibGVDb2x1bW4sXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2xJZDogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdmNyKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgY29uc3Qga2V5ID0gYCR7cm93SW5kZXh9XyR7Y29sSWR9YDtcbiAgICBcbiAgICAvLyBJZiBjb21wb25lbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgY2VsbCwgZG9uJ3QgcmVjcmVhdGVcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWZzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmdldENvbXBvbmVudENsYXNzKHJlbmRlcmVkVmFsdWUpO1xuICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5nZXRDb21wb25lbnRJbnB1dHMocmVuZGVyZWRWYWx1ZSk7XG4gICAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5nZXRDb21wb25lbnRPdXRwdXRzKHJlbmRlcmVkVmFsdWUpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudFxuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdmNyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgICBcbiAgICAgIC8vIFNldCBpbnB1dHNcbiAgICAgIE9iamVjdC5rZXlzKGlucHV0cykuZm9yRWFjaChpbnB1dEtleSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5zdGFuY2UgJiYgaW5wdXRLZXkgaW4gY29tcG9uZW50UmVmLmluc3RhbmNlKSB7XG4gICAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBhbnkpW2lucHV0S2V5XSA9IGlucHV0c1tpbnB1dEtleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gb3V0cHV0c1xuICAgICAgT2JqZWN0LmtleXMob3V0cHV0cykuZm9yRWFjaChvdXRwdXRLZXkgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluc3RhbmNlICYmIG91dHB1dEtleSBpbiBjb21wb25lbnRSZWYuaW5zdGFuY2UpIHtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSAoY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIGFueSlbb3V0cHV0S2V5XTtcbiAgICAgICAgICBpZiAob3V0cHV0ICYmIHR5cGVvZiBvdXRwdXQuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvdXRwdXQuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBvdXRwdXRzW291dHB1dEtleV07XG4gICAgICAgICAgICAgIGlmIChoYW5kbGVyKSBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0ICYmIHR5cGVvZiBvdXRwdXQuZW1pdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gRm9yIEV2ZW50RW1pdHRlciwgd3JhcCB0aGUgZW1pdCB0byBjYWxsIHRoZSBoYW5kbGVyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEVtaXQgPSBvdXRwdXQuZW1pdC5iaW5kKG91dHB1dCk7XG4gICAgICAgICAgICAoY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIGFueSlbb3V0cHV0S2V5XSA9IHtcbiAgICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBvdXRwdXRzW291dHB1dEtleV07XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzdWJzY3JpYmU6IG91dHB1dC5zdWJzY3JpYmUuYmluZChvdXRwdXQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIE1hcmsgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIFxuICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIGZvciBjbGVhbnVwXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZnMuc2V0KGtleSwgY29tcG9uZW50UmVmKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjb21wb25lbnQgaW4gdGFibGUgY2VsbDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGFuIEhUTUwgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGggaW5uZXJIVE1MXG4gICAqL1xuICBpc0h0bWxTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRmFzdGVyIGNoZWNrOiBpZiBpdCBjb250YWlucyBhbiBvcGVuaW5nIHRhZyBwYXR0ZXJuIG5lYXIgdGhlIHN0YXJ0XG4gICAgLy8gb3IganVzdCBoYXMgYW55IGJyYWNrZXRzLiBXcmFwcGluZyBpbiBhIHJlZ2V4IHdpdGggW1xcc1xcU10qIGlzIHZlcnkgc2xvdy5cbiAgICByZXR1cm4gdmFsdWUuaW5jbHVkZXMoJzwnKSAmJiAvPFthLXovXVtePl0qPi9pLnRlc3QodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplcyBIVE1MIHN0cmluZyBmb3Igc2FmZSByZW5kZXJpbmcgd2l0aCBjYWNoaW5nXG4gICAqL1xuICBnZXRTYW5pdGl6ZWRIdG1sKHZhbHVlOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgbGV0IGNhY2hlZCA9IHRoaXMuaHRtbENhY2hlLmdldCh2YWx1ZSk7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGNhY2hlZCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHZhbHVlKTtcbiAgICAgIHRoaXMuaHRtbENhY2hlLnNldCh2YWx1ZSwgY2FjaGVkKTtcbiAgICAgIFxuICAgICAgLy8gU2ltcGxlIGNhY2hlIGV2aWN0aW9uXG4gICAgICBpZiAodGhpcy5odG1sQ2FjaGUuc2l6ZSA+IDEwMDApIHtcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLmh0bWxDYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAoZmlyc3RLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaHRtbENhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGdldENlbGxWYWx1ZShyb3c6IGFueSwgcGF0aD86IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFyb3cgfHwgIXBhdGgpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGN1cnJlbnQgPSByb3c7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudCA/PyBcIlwiO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIG9uUm93RHJhZ1N0YXJ0KHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVJvd1Jlb3JkZXIpIHJldHVybjtcbiAgICB0aGlzLmRyYWdnZWRSb3cgPSByb3c7XG4gIH1cblxuICBvblJvd0RyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2VkUm93ID0gbnVsbDtcbiAgICB0aGlzLmNsZWFyRHJvcEluZGljYXRvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGNvbnRpbnVvdXNseSB3aGlsZSBhIGRyYWcgaXMgb3ZlciBhIHJvdy4gQ29tcHV0ZXMgd2hldGhlciB0aGUgY3Vyc29yXG4gICAqIGlzIGluIHRoZSB0b3Agb3IgYm90dG9tIGhhbGYgb2YgdGhlIHJvdyBhbmQgdXBkYXRlcyB0aGUgaW5kaWNhdG9yIHN0YXRlLlxuICAgKiBTdXBwcmVzc2VzIHRoZSBpbmRpY2F0b3Igb24gdGhlIGRyYWdnZWQgcm93IGl0c2VsZi5cbiAgICovXG4gIG9uUm93RHJhZ092ZXIoZXZlbnQ6IEV2ZW50LCByb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVJvd1Jlb3JkZXIpIHJldHVybjtcbiAgICBjb25zdCBkcmFnID0gZXZlbnQgYXMgRHJhZ0V2ZW50O1xuICAgIGRyYWcucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCByb3cgPSB0aGlzLmNvbXB1dGVkRGF0YT8uW3Jvd0luZGV4XTtcbiAgICBpZiAodGhpcy5kcmFnZ2VkUm93ICYmIHJvdyA9PT0gdGhpcy5kcmFnZ2VkUm93KSB7XG4gICAgICBpZiAodGhpcy5kcm9wSG92ZXJJbmRleCAhPT0gbnVsbCB8fCB0aGlzLmRyb3BQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRyb3BIb3ZlckluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcm9wUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWwgPSBkcmFnLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWlkWSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IHBvczogJ2Fib3ZlJyB8ICdiZWxvdycgPSBkcmFnLmNsaWVudFkgPCBtaWRZID8gJ2Fib3ZlJyA6ICdiZWxvdyc7XG4gICAgaWYgKHRoaXMuZHJvcEhvdmVySW5kZXggIT09IHJvd0luZGV4IHx8IHRoaXMuZHJvcFBvc2l0aW9uICE9PSBwb3MpIHtcbiAgICAgIHRoaXMuZHJvcEhvdmVySW5kZXggPSByb3dJbmRleDtcbiAgICAgIHRoaXMuZHJvcFBvc2l0aW9uID0gcG9zO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFycyB0aGUgaW5kaWNhdG9yIHdoZW4gdGhlIGN1cnNvciBsZWF2ZXMgdGhlIHRib2R5IGVudGlyZWx5LiAqL1xuICBvblRib2R5RHJhZ0xlYXZlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVSb3dSZW9yZGVyKSByZXR1cm47XG4gICAgY29uc3QgZHJhZyA9IGV2ZW50IGFzIERyYWdFdmVudDtcbiAgICBjb25zdCB0Ym9keSA9IGRyYWcuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgcmVsYXRlZCA9IGRyYWcucmVsYXRlZFRhcmdldCBhcyBOb2RlIHwgbnVsbDtcbiAgICBpZiAoIXRib2R5IHx8ICFyZWxhdGVkIHx8ICF0Ym9keS5jb250YWlucyhyZWxhdGVkKSkge1xuICAgICAgdGhpcy5jbGVhckRyb3BJbmRpY2F0b3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyRHJvcEluZGljYXRvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcm9wSG92ZXJJbmRleCAhPT0gbnVsbCB8fCB0aGlzLmRyb3BQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5kcm9wSG92ZXJJbmRleCA9IG51bGw7XG4gICAgICB0aGlzLmRyb3BQb3NpdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIHJvdyBkcm9wIGZyb20gbmd4LWRyYWctZHJvcC4gUHJlZmVycyB0aGUgdHJhY2tlZCBkcmFnb3ZlciBwb3NpdGlvblxuICAgKiAod2hpY2ggdGhlIHVzZXIgY2FuIHNlZSBsaXZlIHZpYSB0aGUgaW5zZXJ0aW9uIGxpbmUpIG92ZXIgYGV2ZW50LmluZGV4YCB3aGVuXG4gICAqIGNvbXB1dGluZyB0aGUgZmluYWwgaW5zZXJ0IHNsb3QuIEVtaXRzIGEgZnJlc2ggYXJyYXkg4oCUIGRvZXMgbm90IG11dGF0ZSBgZGF0YWAuXG4gICAqL1xuICBvblJvd0RuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVSb3dSZW9yZGVyKSByZXR1cm47XG4gICAgY29uc3QgZHJhZ2dlZCA9IGV2ZW50Py5kYXRhO1xuICAgIGlmIChkcmFnZ2VkID09IG51bGwpIHtcbiAgICAgIHRoaXMuY2xlYXJEcm9wSW5kaWNhdG9yKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29tcHV0ZWREYXRhIHx8IFtdO1xuICAgIGxldCBwcmV2aW91c0luZGV4ID0gc291cmNlLmluZGV4T2YoZHJhZ2dlZCk7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPCAwICYmIGRyYWdnZWQgJiYgZHJhZ2dlZC5pZCAhPSBudWxsKSB7XG4gICAgICBwcmV2aW91c0luZGV4ID0gc291cmNlLmZpbmRJbmRleChyID0+IHIgJiYgci5pZCA9PT0gZHJhZ2dlZC5pZCk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91c0luZGV4IDwgMCkge1xuICAgICAgdGhpcy5jbGVhckRyb3BJbmRpY2F0b3IoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVmZXIgdGhlIGluZGljYXRvciBwb3NpdGlvbiAod2hhdCB0aGUgdXNlciBqdXN0IHNhdykgb3ZlciBldmVudC5pbmRleC5cbiAgICBsZXQgaW5zZXJ0SW5kZXg6IG51bWJlcjtcbiAgICBpZiAodGhpcy5kcm9wSG92ZXJJbmRleCAhPSBudWxsICYmIHRoaXMuZHJvcFBvc2l0aW9uKSB7XG4gICAgICBpbnNlcnRJbmRleCA9IHRoaXMuZHJvcFBvc2l0aW9uID09PSAnYWJvdmUnID8gdGhpcy5kcm9wSG92ZXJJbmRleCA6IHRoaXMuZHJvcEhvdmVySW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgaW5zZXJ0SW5kZXggPSBldmVudC5pbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zZXJ0SW5kZXggPSBzb3VyY2UubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBbLi4uc291cmNlXTtcbiAgICBuZXh0LnNwbGljZShwcmV2aW91c0luZGV4LCAxKTtcbiAgICAvLyBSZW1vdmluZyB0aGUgc291cmNlIGFib3ZlIHRoZSB0YXJnZXQgc2hpZnRzIGxhdGVyIGl0ZW1zIHVwIGJ5IG9uZS5cbiAgICBpZiAocHJldmlvdXNJbmRleCA8IGluc2VydEluZGV4KSBpbnNlcnRJbmRleCAtPSAxO1xuICAgIGlmIChpbnNlcnRJbmRleCA8IDApIGluc2VydEluZGV4ID0gMDtcbiAgICBpZiAoaW5zZXJ0SW5kZXggPiBuZXh0Lmxlbmd0aCkgaW5zZXJ0SW5kZXggPSBuZXh0Lmxlbmd0aDtcblxuICAgIHRoaXMuY2xlYXJEcm9wSW5kaWNhdG9yKCk7XG4gICAgdGhpcy5kcmFnZ2VkUm93ID0gbnVsbDtcblxuICAgIGlmIChpbnNlcnRJbmRleCA9PT0gcHJldmlvdXNJbmRleCkgcmV0dXJuO1xuICAgIG5leHQuc3BsaWNlKGluc2VydEluZGV4LCAwLCBkcmFnZ2VkKTtcbiAgICB0aGlzLnJvd1Jlb3JkZXIuZW1pdCh7IHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleDogaW5zZXJ0SW5kZXgsIG9yZGVyZWREYXRhOiBuZXh0IH0pO1xuICB9XG5cbiAgY29weUNlbGxKc29uUGF0aChwYXRoOiBzdHJpbmcsIGV2ZW50OiBFdmVudCwgc291cmNlOiBzdHJpbmcgPSAnZGJRdWVyeVJlc3BvbnNlJyk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQocGF0aCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIGlmIHByb3ZpZGVkXG4gICAgICBpZiAodGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXIoeyBwYXRoLCBzb3VyY2UgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGhhbmRsZXJFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyOicsIGhhbmRsZXJFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvcHkganNvblBhdGg6JywgZXJyKTtcbiAgICAgIC8vIFN0aWxsIGNhbGwgdGhlIGhhbmRsZXIgZXZlbiBvbiBmYWlsdXJlIChzaW1pbGFyIHRvIGFwaS1zdGVwIHBhdHRlcm4pXG4gICAgICBpZiAodGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXIoeyBwYXRoLCBzb3VyY2UgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGhhbmRsZXJFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyOicsIGhhbmRsZXJFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIENvbXB1dGUgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHN0cmluZyBmcm9tIGNvbHVtbiBjb25maWdcbiAgcHJpdmF0ZSB1cGRhdGVHcmlkVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKCFjb2xzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29tcHV0ZWRHcmlkVGVtcGxhdGUgPSAnJztcbiAgICAgIHRoaXMuY29tcHV0ZWRDb2x1bW5XaWR0aHMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZml4ZWRQeCA9IGNvbHMucmVkdWNlKChzdW0sIGMpID0+IHN1bSArIChjLmZpeGVkUHggfHwgMCksIDApO1xuICAgIGNvbnN0IGR5bmFtaWNDb2xzID0gY29scy5maWx0ZXIoYyA9PiAhYy5maXhlZFB4KTtcbiAgICBjb25zdCB0b3RhbFdlaWdodCA9IGR5bmFtaWNDb2xzLnJlZHVjZSgoc3VtLCBjKSA9PiBzdW0gKyAoYy53ZWlnaHQgfHwgMSksIDApIHx8IDE7XG5cbiAgICAvLyBGbG9vciBvbiB0aGUgdGFibGUgaXRzZWxmID0gZXZlcnkgY29sdW1uJ3MgbWluaW11bSB3aWR0aCBjb250cmlidXRpb24uIEZpeGVkXG4gICAgLy8gY29sdW1ucyBjb250cmlidXRlIGBmaXhlZFB4YDsgZHluYW1pYyBjb2x1bW5zIGNvbnRyaWJ1dGUgYG1pbldpZHRoYCAob3IgMCB3aGVuXG4gICAgLy8gdW5zZXQpLiBUaGUgdGVtcGxhdGUgYmluZHMgdGhpcyB2aWEgYFtzdHlsZS5taW4td2lkdGgucHhdYCBvbiB0aGUgPHRhYmxlPiBzb1xuICAgIC8vIG5hcnJvdyBjb250YWluZXJzIGZvcmNlIGhvcml6b250YWwgc2Nyb2xsIGluc3RlYWQgb2Ygc3F1aXNoaW5nIGNvbHVtbnMgdG8gMC5cbiAgICB0aGlzLmNvbXB1dGVkVGFibGVNaW5XaWR0aCA9IGNvbHMucmVkdWNlKFxuICAgICAgKHN1bSwgYykgPT4gc3VtICsgKGMuZml4ZWRQeCAmJiBjLmZpeGVkUHggPiAwID8gYy5maXhlZFB4IDogKGMubWluV2lkdGggfHwgMCkpLFxuICAgICAgMCxcbiAgICApO1xuXG4gICAgdGhpcy5jb21wdXRlZENvbHVtbldpZHRocyA9IGNvbHMubWFwKGMgPT4ge1xuICAgICAgaWYgKGMuZml4ZWRQeCAmJiBjLmZpeGVkUHggPiAwKSB7XG4gICAgICAgIC8vIEZpeGVkLXdpZHRoIGNvbHVtbnMgc3RpbGwgcmVzcGVjdCBtaW5XaWR0aCBpbiB0aGUgKHJhcmUpIGNhc2UgdGhlIGNvbnN1bWVyXG4gICAgICAgIC8vIGNvbmZpZ3VyZWQgYm90aCDigJQgYG1heChmaXhlZCwgbWluKWAgcGlja3Mgd2hpY2hldmVyIGlzIGxhcmdlci5cbiAgICAgICAgcmV0dXJuIGMubWluV2lkdGggJiYgYy5taW5XaWR0aCA+IGMuZml4ZWRQeFxuICAgICAgICAgID8gYG1heCgke2MuZml4ZWRQeH1weCwgJHtjLm1pbldpZHRofXB4KWBcbiAgICAgICAgICA6IGAke2MuZml4ZWRQeH1weGA7XG4gICAgICB9XG4gICAgICBjb25zdCBzaGFyZSA9IChjLndlaWdodCB8fCAxKSAvIHRvdGFsV2VpZ2h0O1xuICAgICAgY29uc3QgZHluYW1pY1dpZHRoID0gYGNhbGMoKDEwMCUgLSAke2ZpeGVkUHh9cHgpICogJHtzaGFyZS50b0ZpeGVkKDQpfSlgO1xuICAgICAgLy8gRHluYW1pYy1zaGFyZSBjb2x1bW5zIGNhbiBjb2xsYXBzZSB0byB+MCB3aGVuIHRoZSB0YWJsZSBpcyBuYXJyb3dlciB0aGFuXG4gICAgICAvLyAoc3VtIG9mIGZpeGVkIHdpZHRocykgKyB0aGUgc2hhcmUgdGhleSdkIGNvbXB1dGUgdG8uIFVzaW5nIENTUyBgbWF4KClgIGZsb29yc1xuICAgICAgLy8gdGhlIGNvbHVtbiBhdCBgbWluV2lkdGhgIHNvIGl0IGdyb3dzIG5hdHVyYWxseSBhcyB0aGUgdGFibGUgd2lkZW5zIGJ1dCBuZXZlclxuICAgICAgLy8gc2hyaW5rcyBiZWxvdyB0aGUgY29uZmlndXJlZCBwaXhlbCBtaW5pbXVtLiBXaXRoIGB0YWJsZS1sYXlvdXQ6IGZpeGVkYCwgdGhlXG4gICAgICAvLyA8Y29sPiB3aWR0aCBpcyBhdXRob3JpdGF0aXZlIOKAlCB3aXRob3V0IG1heCgpIGhlcmUgdGhlIGNlbGwtbGV2ZWwgYG1pbi13aWR0aGBcbiAgICAgIC8vIHdlIHNldCBvbiA8dGg+Lzx0ZD4gaXMgaWdub3JlZCBhbmQgY29sdW1ucyB2aXN1YWxseSBkaXNhcHBlYXIgYXQgbmFycm93IHdpZHRocy5cbiAgICAgIHJldHVybiBjLm1pbldpZHRoICYmIGMubWluV2lkdGggPiAwXG4gICAgICAgID8gYG1heCgke2MubWluV2lkdGh9cHgsICR7ZHluYW1pY1dpZHRofSlgXG4gICAgICAgIDogZHluYW1pY1dpZHRoO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ2NvbXB1dGVkQ29sdW1uV2lkdGhzJywgdGhpcy5jb21wdXRlZENvbHVtbldpZHRocyk7XG4gICAgXG4gICAgaWYgKHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucykge1xuICAgICAgdGhpcy5jb21wdXRlZEdyaWRUZW1wbGF0ZSA9IHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21wdXRlZEdyaWRUZW1wbGF0ZSA9IHRoaXMuY29tcHV0ZWRDb2x1bW5XaWR0aHMuam9pbignICcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlbGVjdGlvbiBoZWxwZXJzXG4gIGlzUm93U2VsZWN0YWJsZShyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghcm93KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJvd1NlbGVjdGFibGUgIT09ICdmdW5jdGlvbicpIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLnJvd1NlbGVjdGFibGUocm93KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dzID0gKHRoaXMuZGF0YSB8fCBbXSkuZmlsdGVyKChyKSA9PiB0aGlzLmlzUm93U2VsZWN0YWJsZShyKSk7XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByb3dzLmV2ZXJ5KHIgPT4gISFyPy5pc1NlbGVjdGVkKTtcbiAgfVxuXG4gIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93cyA9ICh0aGlzLmRhdGEgfHwgW10pLmZpbHRlcigocikgPT4gdGhpcy5pc1Jvd1NlbGVjdGFibGUocikpO1xuICAgIGlmICghcm93cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhbnlTZWxlY3RlZCA9IHJvd3Muc29tZShyID0+ICEhcj8uaXNTZWxlY3RlZCk7XG4gICAgcmV0dXJuIGFueVNlbGVjdGVkICYmICF0aGlzLmFsbFNlbGVjdGVkO1xuICB9XG5cbiAgb25TZWxlY3RBbGxDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy50b2dnbGVTZWxlY3RBbGwodGFyZ2V0LmNoZWNrZWQpO1xuICB9XG5cbiAgb25Sb3dTZWxlY3RDaGFuZ2UoZXZlbnQ6IEV2ZW50LCByb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1Jvd1NlbGVjdGFibGUocm93KSkge1xuICAgICAgcm93LmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgcm93LmlzU2VsZWN0ZWQgPSB0YXJnZXQuY2hlY2tlZDtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdEFsbChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGF0YSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAocm93KSB7XG4gICAgICAgIHJvdy5pc1NlbGVjdGVkID0gdGhpcy5pc1Jvd1NlbGVjdGFibGUocm93KSA/IGNoZWNrZWQgOiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBTb3J0aW5nIHN1cHBvcnQgPT09PT1cbiAgcHJpdmF0ZSBfc29ydEFjdGl2ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHVwZGF0ZUNvbXB1dGVkRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgaWYgKCF0aGlzLmVuYWJsZUxvY2FsU29ydCB8fCAhdGhpcy5fc29ydEFjdGl2ZSB8fCAhdGhpcy5fc29ydERpcmVjdGlvbikge1xuICAgICAgdGhpcy5jb21wdXRlZERhdGEgPSBzb3VyY2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZChjID0+IGMuZmllbGRJZCA9PT0gdGhpcy5fc29ydEFjdGl2ZSk7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5maWVsZFZhbHVlKSB7XG4gICAgICB0aGlzLmNvbXB1dGVkRGF0YSA9IHNvdXJjZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGlyID0gdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTE7XG4gICAgY29uc3QgZmllbGRQYXRoID0gY29sLmZpZWxkVmFsdWU7XG4gICAgY29uc3Qgb3V0ID0gWy4uLnNvdXJjZV07XG4gICAgb3V0LnNvcnQoKGEsIGIpID0+IGRpciAqIHRoaXMuY29tcGFyZVZhbHVlcyh0aGlzLmdldENlbGxWYWx1ZShhLCBmaWVsZFBhdGgpLCB0aGlzLmdldENlbGxWYWx1ZShiLCBmaWVsZFBhdGgpKSk7XG4gICAgdGhpcy5jb21wdXRlZERhdGEgPSBvdXQ7XG4gIH1cblxuICAvLyBDb21wdXRlZCBsb2FkaW5nIGZsYWdzIHRvIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBnZXQgc2hvd1RhYmxlTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlTG9hZGluZyA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCBzaG93VGFibGVEYXRhTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1RhYmxlRGF0YUxvYWRpbmcgPz8gZmFsc2U7XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGFibGUgaGFzIG5vIGRhdGEgYW5kIGlzIG5vdCBjdXJyZW50bHkgbG9hZGluZyDigJQgdXNlZCB0byBzaG93IGFuIGVtcHR5IHN0YXRlXG4gIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFueUxvYWRpbmcgPSB0aGlzLnNob3dUYWJsZUxvYWRpbmcgfHwgdGhpcy5zaG93VGFibGVEYXRhTG9hZGluZztcbiAgICByZXR1cm4gIWFueUxvYWRpbmcgJiYgKCEodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5sZW5ndGgpIHx8IHRoaXMuZGF0YS5sZW5ndGggPT09IDApO1xuICB9XG5cbiAgaXNTb3J0ZWRBc2MoY29sSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0QWN0aXZlID09PSBjb2xJZCAmJiB0aGlzLl9zb3J0RGlyZWN0aW9uID09PSAnYXNjJztcbiAgfVxuXG4gIGlzU29ydGVkRGVzYyhjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRBY3RpdmUgPT09IGNvbElkICYmIHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdkZXNjJztcbiAgfVxuXG4gIHRvZ2dsZVNvcnQoY29sOiBEeW5hbWljVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbD8uc29ydGFibGUpIHJldHVybjtcbiAgICBjb25zdCBjb2xJZCA9IGNvbC5maWVsZElkO1xuICAgIGlmICh0aGlzLl9zb3J0QWN0aXZlICE9PSBjb2xJZCkge1xuICAgICAgdGhpcy5fc29ydEFjdGl2ZSA9IGNvbElkO1xuICAgICAgdGhpcy5fc29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjeWNsZSBhc2MgLT4gZGVzYyAtPiBudWxsIC0+IGFzY1xuICAgICAgaWYgKHRoaXMuX3NvcnREaXJlY3Rpb24gPT09ICdhc2MnKSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gJ2Rlc2MnO1xuICAgICAgZWxzZSBpZiAodGhpcy5fc29ydERpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB0aGlzLl9zb3J0RGlyZWN0aW9uID0gbnVsbDtcbiAgICAgIGVsc2UgdGhpcy5fc29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbXB1dGVkRGF0YSgpO1xuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgZmllbGRJZDogdGhpcy5fc29ydEFjdGl2ZSwgZmllbGRWYWx1ZTogY29sLmZpZWxkVmFsdWUsIGRpcmVjdGlvbjogdGhpcy5fc29ydERpcmVjdGlvbiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwO1xuICAgIGlmIChhID09IG51bGwpIHJldHVybiAxOyAvLyBudWxscyBsYXN0IGluIGFzYyAoaGFuZGxlZCBieSBkaXIgbXVsdGlwbGllcilcbiAgICBpZiAoYiA9PSBudWxsKSByZXR1cm4gLTE7XG5cbiAgICBjb25zdCBudW1BID0gdHlwZW9mIGEgPT09ICdudW1iZXInID8gYSA6IE51bWJlcihhKTtcbiAgICBjb25zdCBudW1CID0gdHlwZW9mIGIgPT09ICdudW1iZXInID8gYiA6IE51bWJlcihiKTtcbiAgICBjb25zdCBhSXNOdW0gPSAhaXNOYU4obnVtQSkgJiYgYSAhPT0gJycgJiYgYSAhPT0gbnVsbCAmJiBhICE9PSBmYWxzZTtcbiAgICBjb25zdCBiSXNOdW0gPSAhaXNOYU4obnVtQikgJiYgYiAhPT0gJycgJiYgYiAhPT0gbnVsbCAmJiBiICE9PSBmYWxzZTtcbiAgICBpZiAoYUlzTnVtICYmIGJJc051bSkge1xuICAgICAgaWYgKG51bUEgPCBudW1CKSByZXR1cm4gLTE7XG4gICAgICBpZiAobnVtQSA+IG51bUIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gRGF0ZSBkZXRlY3Rpb246IGF0dGVtcHQgcGFyc2Ugd2hlbiBib3RoIHZhbHVlcyBhcmUgc3RyaW5ncyBhbmQgcGFyc2VhYmxlXG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRzQSA9IERhdGUucGFyc2UoYSk7XG4gICAgICBjb25zdCB0c0IgPSBEYXRlLnBhcnNlKGIpO1xuICAgICAgaWYgKCFpc05hTih0c0EpICYmICFpc05hTih0c0IpKSB7XG4gICAgICAgIGlmICh0c0EgPCB0c0IpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKHRzQSA+IHRzQikgcmV0dXJuIDE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLy8gbG9jYWxlQ29tcGFyZSwgY2FzZS1pbnNlbnNpdGl2ZVxuICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBzdHJpbmcgY29tcGFyaXNvblxuICAgIGNvbnN0IHNhID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHNiID0gU3RyaW5nKGIpO1xuICAgIHJldHVybiBzYS5sb2NhbGVDb21wYXJlKHNiLCB1bmRlZmluZWQsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgbnVtZXJpYzogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlXCIgW2NsYXNzLmNxYS1tYXgtaC1bMTAwcHhdXT1cInNob3dUYWJsZUxvYWRpbmdcIj5cbiAgICA8Y3FhLWZ1bGwtdGFibGUtbG9hZGVyICpuZ0lmPVwic2hvd1RhYmxlTG9hZGluZ1wiPjwvY3FhLWZ1bGwtdGFibGUtbG9hZGVyPlxuICAgIDxjcWEtdGFibGUtZGF0YS1sb2FkZXIgKm5nSWY9XCJzaG93VGFibGVEYXRhTG9hZGluZ1wiPjwvY3FhLXRhYmxlLWRhdGEtbG9hZGVyPlxuICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlLWlubmVyIGNxYS13LWZ1bGwgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItZ3JheS0yMDBcIlxuICAgICAgICAgICBbY2xhc3MuaXMtbG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb21wdXRlZFRhYmxlTWluV2lkdGggfHwgbnVsbFwiXG4gICAgICAgICAgICpuZ0lmPVwiIXNob3dUYWJsZUxvYWRpbmdcIj5cbiAgICAgIDxjb2xncm91cD5cbiAgICAgICAgPGNvbCAqbmdJZj1cImVuYWJsZVJvd1Jlb3JkZXJcIiBzdHlsZT1cIndpZHRoOiA0NHB4XCIgLz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgd2lkdGggb2YgY29tcHV0ZWRDb2x1bW5XaWR0aHM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuICAgICAgICAgIDxjb2wgW3N0eWxlLndpZHRoXT1cIndpZHRoXCIgLz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2NvbGdyb3VwPlxuXG4gICAgICA8dGhlYWQgKm5nSWY9XCJkYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtaGVhZGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlUm93UmVvcmRlclwiXG4gICAgICAgICAgICBjbGFzcz1cImhlYWRlci1jZWxsIHJlb3JkZXItaGFuZGxlLWNlbGwgY3FhLXB5LVsxMy4yNXB4XSBjcWEtcHgtWzEwLjVweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1iZy1bI2VmZjBmN10gY3FhLXRleHQtY2VudGVyXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW9yZGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1zci1vbmx5XCI+UmVvcmRlcjwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiB2aXNpYmxlQ29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY2VsbCBjcWEtcHktWzEzLjI1cHhdIGNxYS1weC1bMTAuNXB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJnLVsjZWZmMGY3XVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgIGNvbC5maWVsZElkICsgJy1jZWxsJyxcbiAgICAgICAgICAgICAgICBjb2wuYWxpZ24gPT09ICdjZW50ZXInID8gJ2NxYS10ZXh0LWNlbnRlcicgOiBjb2wuYWxpZ24gPT09ICdyaWdodCcgPyAnY3FhLXRleHQtcmlnaHQnIDogJ2NxYS10ZXh0LWxlZnQnXG4gICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPCEtLSBCdWlsdC1pbiBzZWxlY3QtYWxsIGZvciBjaGVja2JveCBjb2x1bW4gd2hlbiBlbmFibGVkIGFuZCBubyBjdXN0b20gaGVhZGVyIHRlbXBsYXRlIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuZmllbGRJZCA9PT0gJ2NoZWNrYm94JyAmJiBlbmFibGVTZWxlY3RBbGwgJiYgIWdldEhlYWRlclRlbXBsYXRlKGNvbC5maWVsZElkKTsgZWxzZSBoZWFkZXJUcGxPckRlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJjaGVja2JveFwiIGFyaWEtbGFiZWw9XCJTZWxlY3QgYWxsIHJvd3NcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzb21lU2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIiBjbGFzcz1cImhpZGRlbi1jaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlclRwbE9yRGVmYXVsdD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0SGVhZGVyVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGhlYWRlclRwbDsgZWxzZSBkZWZhdWx0SGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5zb3J0YWJsZTsgZWxzZSBwbGFpbkhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImhlYWRlci10ZXh0IGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtcHgtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNvcnQoY29sKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NvcnQgYnkgJyArIChjb2wuZmllbGROYW1lIHx8IGNvbC5maWVsZElkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEyLjNweF0gY3FhLWxlYWRpbmctWzE3LjVweF0gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LW1lZGl1bVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWRBc2MoY29sLmZpZWxkSWQpXCI+4payPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTb3J0ZWREZXNjKGNvbC5maWVsZElkKVwiPuKWvDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5IZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRleHRcIj57eyBjb2wuZmllbGROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keSBjbGFzcz1cInRhYmxlLWJvZHkgY3FhLXctZnVsbFwiXG4gICAgICAgIFtkbmREcm9wem9uZV09XCJbJ2NxYS1yb3cnXVwiXG4gICAgICAgIFtkbmREaXNhYmxlSWZdPVwiIWVuYWJsZVJvd1Jlb3JkZXJcIlxuICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgIChkcmFnbGVhdmUpPVwib25UYm9keURyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGRuZERyb3ApPVwib25Sb3dEbmREcm9wKCRldmVudClcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtcm93IGNxYS1iZy1zdXJmYWNlLWRlZmF1bHQgaG92ZXI6Y3FhLWJnLXN1cmZhY2UtaG92ZXJcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgY29tcHV0ZWREYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicm93Py5pc1NlbGVjdGVkXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLXJvdy1kcmFnZ2FibGVdPVwiZW5hYmxlUm93UmVvcmRlclwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1yb3ctZHJvcC1hYm92ZV09XCJkcm9wSG92ZXJJbmRleCA9PT0gcm93SW5kZXggJiYgZHJvcFBvc2l0aW9uID09PSAnYWJvdmUnXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLXJvdy1kcm9wLWJlbG93XT1cImRyb3BIb3ZlckluZGV4ID09PSByb3dJbmRleCAmJiBkcm9wUG9zaXRpb24gPT09ICdiZWxvdydcIlxuICAgICAgICAgIFtkbmREcmFnZ2FibGVdPVwicm93XCJcbiAgICAgICAgICBbZG5kRGlzYWJsZUlmXT1cIiFlbmFibGVSb3dSZW9yZGVyXCJcbiAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICAgICAgZG5kVHlwZT1cImNxYS1yb3dcIlxuICAgICAgICAgIChkbmRTdGFydCk9XCJvblJvd0RyYWdTdGFydChyb3cpXCJcbiAgICAgICAgICAoZG5kRW5kKT1cIm9uUm93RHJhZ0VuZCgpXCJcbiAgICAgICAgICAoZHJhZ292ZXIpPVwib25Sb3dEcmFnT3ZlcigkZXZlbnQsIHJvd0luZGV4KVwiPlxuICAgICAgICAgIDx0ZCAqbmdJZj1cImVuYWJsZVJvd1Jlb3JkZXJcIiBjbGFzcz1cImNlbGwgcmVvcmRlci1oYW5kbGUtY2VsbCBjcWEtcHgtWzEwLjVweF0gY3FhLXB5LVsxMXB4XSBjcWEtdGV4dC1jZW50ZXJcIiBbYXR0ci50aXRsZV09XCJyZW9yZGVySGFuZGxlVG9vbHRpcFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZW9yZGVyLWhhbmRsZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCIzXCIgcj1cIjEuMjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIzXCIgcj1cIjEuMjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjZcIiBjeT1cIjhcIiByPVwiMS4yNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjhcIiByPVwiMS4yNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiMTNcIiByPVwiMS4yNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjEzXCIgcj1cIjEuMjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNlbGwgY3FhLXB4LVsxMC41cHhdIGNxYS1weS1bMTFweF1cIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5taW5XaWR0aFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICBjb2wuZmllbGRJZCArICctY2VsbCcsXG4gICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtdGV4dC1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS10ZXh0LXJpZ2h0JyA6ICdjcWEtdGV4dC1sZWZ0JyxcbiAgICAgICAgICAgICAgICBjZWxsSnNvblBhdGhHZXR0ZXIgJiYgY29sLmZpZWxkSWQgIT09ICdjaGVja2JveCcgJiYgY29sLmZpZWxkSWQgIT09ICdhY3Rpb25zJyA/ICdjcWEtY3Vyc29yLXBvaW50ZXInIDogJydcbiAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgIChkYmxjbGljayk9XCJjZWxsSnNvblBhdGhHZXR0ZXIgJiYgY29sPy5maWVsZElkICE9PSAnY2hlY2tib3gnICYmIGNvbD8uZmllbGRJZCAhPT0gJ2FjdGlvbnMnICYmIGNvcHlDZWxsSnNvblBhdGgoY2VsbEpzb25QYXRoR2V0dGVyKHJvd0luZGV4LCBjb2w/LmZpZWxkSWQsIHJvdyksICRldmVudCwgJ2RiUXVlcnlSZXNwb25zZScpXCI+XG4gICAgICAgICAgICAgIDwhLS0gQnVpbHQtaW4gY2hlY2tib3ggY2VsbCB3aGVuIG5vIGN1c3RvbSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZElkID09PSAnY2hlY2tib3gnICYmICFnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpOyBlbHNlIHJlZ3VsYXJDZWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICAgIGNvbC5hbGlnbiA9PT0gJ2NlbnRlcicgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyJyA6IGNvbC5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQnIDogJydcbiAgICAgICAgICAgICAgICBdXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4tY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIncm93LWNoZWNrYm94LScgKyByb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3Qgcm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicm93Py5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Sb3dTZWxlY3RDaGFuZ2UoJGV2ZW50LCByb3cpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KSA/ICcwLjQ1JyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY3Vyc29yXT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KSA/ICdub3QtYWxsb3dlZCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIiFpc1Jvd1NlbGVjdGFibGUocm93KSA/ICdub25lJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5mb3JdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXJDZWxsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDZWxsVGVtcGxhdGUoY29sLmZpZWxkSWQpIGFzIGNlbGxUcGw7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVHBsOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3csIHJvdzogcm93LCB2YWx1ZTogZ2V0Q2VsbFZhbHVlKHJvdywgY29sLmZpZWxkVmFsdWUpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGw+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmVuZGVyZWRWYWx1ZShyb3csIGNvbCkgYXMgcmVuZGVyZWRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb21wb25lbnQocmVuZGVyZWRWYWx1ZSk7IGVsc2Ugbm9uQ29tcG9uZW50Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICBjcWFDZWxsQ29udGFpbmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NlbGxDb250YWluZXI9XCJjcWFDZWxsQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRDb25maWddPVwicmVuZGVyZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbElkXT1cImNvbC5maWVsZElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkNvbXBvbmVudENlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSHRtbFN0cmluZyhyZW5kZXJlZFZhbHVlKTsgZWxzZSB0ZXh0Q2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1sZWFkaW5nLVsxN3B4XVwiIFtpbm5lckhUTUxdPVwiZ2V0U2FuaXRpemVkSHRtbChyZW5kZXJlZFZhbHVlKVwiIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5hbGlnbiA9PT0gJ2NlbnRlcicgPyAnY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyJyA6IGNvbC5hbGlnbiA9PT0gJ3JpZ2h0JyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1lbmQnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICBdXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZXh0Q2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmFsaWduID09PSAnY2VudGVyJyA/ICdjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXInIDogY29sLmFsaWduID09PSAncmlnaHQnID8gJ2NxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCcgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgIF1cIj57eyByZW5kZXJlZFZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|