@angular-generic-table/core 5.0.0-rc.16 → 5.0.0-rc.17
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/core.component.mjs +83 -24
- package/esm2020/lib/models/gt-pagination.mjs +1 -1
- package/esm2020/lib/models/table-events.interface.mjs +1 -1
- package/esm2020/lib/models/table-info.interface.mjs +1 -1
- package/esm2020/lib/pagination/pagination.component.mjs +86 -27
- package/esm2020/lib/utilities/utilities.mjs +36 -1
- package/esm2020/public-api.mjs +8 -1
- package/fesm2015/angular-generic-table-core.mjs +206 -53
- package/fesm2015/angular-generic-table-core.mjs.map +1 -1
- package/fesm2020/angular-generic-table-core.mjs +202 -49
- package/fesm2020/angular-generic-table-core.mjs.map +1 -1
- package/lib/core.component.d.ts +20 -7
- package/lib/models/gt-pagination.d.ts +8 -0
- package/lib/models/table-events.interface.d.ts +4 -0
- package/lib/models/table-info.interface.d.ts +3 -1
- package/lib/pagination/pagination.component.d.ts +49 -11
- package/lib/utilities/utilities.d.ts +21 -1
- package/package.json +1 -1
- package/public-api.d.ts +7 -0
- package/scss/index.scss +6 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
2
|
import { BehaviorSubject, combineLatest, isObservable, of, ReplaySubject, } from 'rxjs';
|
|
3
3
|
import { AsyncPipe, KeyValuePipe, NgClass, NgForOf, NgIf, NgTemplateOutlet, SlicePipe, } from '@angular/common';
|
|
4
|
-
import { debounceTime, distinctUntilChanged, map, shareReplay, startWith, switchMap, take, tap, withLatestFrom, } from 'rxjs/operators';
|
|
4
|
+
import { debounceTime, distinctUntilChanged, filter, map, shareReplay, startWith, switchMap, take, tap, withLatestFrom, } from 'rxjs/operators';
|
|
5
5
|
import { calculate, chunk, search, sortOnMultipleKeys, } from './utilities/utilities';
|
|
6
6
|
import { CapitalCasePipe } from './pipes/capital-case.pipe';
|
|
7
7
|
import { SortClassPipe } from './pipes/sort-class.pipe';
|
|
@@ -16,11 +16,23 @@ export class CoreComponent {
|
|
|
16
16
|
this._rowHover$ = new ReplaySubject(1);
|
|
17
17
|
this.rowHover = new EventEmitter();
|
|
18
18
|
this.columnSort = new EventEmitter();
|
|
19
|
+
/** page change event - emitted when current page/index changes for pagination */
|
|
20
|
+
this.pageChange = new EventEmitter();
|
|
19
21
|
this.rowHover$ = this._rowHover$.asObservable().pipe(debounceTime(50), distinctUntilChanged((p, q) => p.index === q.index), tap((event) => this.rowHover.emit(event)), shareReplay(1));
|
|
20
22
|
this._loading$ = new ReplaySubject(1);
|
|
21
23
|
this._sortOrder$ = new BehaviorSubject([]);
|
|
22
24
|
this._searchBy$ = new ReplaySubject(1);
|
|
23
25
|
this.searchBy$ = this._searchBy$.pipe(startWith(''), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
26
|
+
this._pagingInfo$ = new BehaviorSubject({
|
|
27
|
+
pageCurrent: null,
|
|
28
|
+
pageNext: null,
|
|
29
|
+
pagePrevious: null,
|
|
30
|
+
pageSize: null,
|
|
31
|
+
numberOfRecords: null,
|
|
32
|
+
//recordsAfterFilter: null,
|
|
33
|
+
//recordsAfterSearch: null,
|
|
34
|
+
//recordsAll: null,
|
|
35
|
+
});
|
|
24
36
|
// tslint:disable-next-line:variable-name
|
|
25
37
|
this._tableConfig$ = new BehaviorSubject({});
|
|
26
38
|
this.tableConfig$ = this._tableConfig$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
@@ -49,11 +61,11 @@ export class CoreComponent {
|
|
|
49
61
|
}), switchMap((obs) => combineLatest([of(obs), this.sortOrder$, this.searchBy$])), map(([table, sortBy, searchBy]) => {
|
|
50
62
|
// create a new array reference and sort new array (prevent mutating existing state)
|
|
51
63
|
table.data = [...table.data];
|
|
52
|
-
return !sortBy
|
|
53
|
-
? searchBy
|
|
64
|
+
return !sortBy?.length || table.config?.disableTableSort
|
|
65
|
+
? searchBy && !this.tableInfo?.lazyLoaded
|
|
54
66
|
? search(searchBy, false, table.data, table.config)
|
|
55
67
|
: table.data
|
|
56
|
-
: searchBy
|
|
68
|
+
: searchBy && !this.tableInfo?.lazyLoaded
|
|
57
69
|
? search(searchBy, false, table.data, table.config)?.sort(sortOnMultipleKeys(sortBy))
|
|
58
70
|
: table.data?.sort(sortOnMultipleKeys(sortBy));
|
|
59
71
|
}), shareReplay(1));
|
|
@@ -61,14 +73,30 @@ export class CoreComponent {
|
|
|
61
73
|
this.table$ = combineLatest([
|
|
62
74
|
this.data$,
|
|
63
75
|
this.tableConfig$,
|
|
64
|
-
|
|
76
|
+
this._pagingInfo$,
|
|
77
|
+
]).pipe(map(([sorted, config, pagingInfo]) => {
|
|
78
|
+
if (pagingInfo.pageCurrent !== null &&
|
|
79
|
+
pagingInfo.numberOfRecords !== null &&
|
|
80
|
+
pagingInfo.pageSize !== null) {
|
|
81
|
+
return {
|
|
82
|
+
data: [sorted],
|
|
83
|
+
config,
|
|
84
|
+
info: {
|
|
85
|
+
lazyLoaded: true,
|
|
86
|
+
numberOfRecords: pagingInfo.numberOfRecords,
|
|
87
|
+
pageSize: pagingInfo.pageSize,
|
|
88
|
+
pageTotal: pagingInfo.pageTotal ??
|
|
89
|
+
Math.ceil(pagingInfo.numberOfRecords / pagingInfo.pageSize),
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
65
93
|
// if pagination is disabled...
|
|
66
94
|
if (!config.pagination || config.pagination.length === 0) {
|
|
67
95
|
// ...return unaltered array
|
|
68
96
|
return {
|
|
69
97
|
data: [sorted],
|
|
70
98
|
config,
|
|
71
|
-
info: {
|
|
99
|
+
info: { numberOfRecords: sorted.length, pageTotal: 1 },
|
|
72
100
|
};
|
|
73
101
|
}
|
|
74
102
|
// return record set
|
|
@@ -76,19 +104,24 @@ export class CoreComponent {
|
|
|
76
104
|
data: chunk(sorted, +(config.pagination.length || 0)),
|
|
77
105
|
config,
|
|
78
106
|
info: {
|
|
79
|
-
|
|
107
|
+
numberOfRecords: sorted.length,
|
|
80
108
|
pageTotal: Math.ceil(sorted.length / +(config.pagination.length || 0)),
|
|
81
109
|
},
|
|
82
110
|
};
|
|
83
|
-
}), shareReplay(1));
|
|
84
|
-
this.
|
|
85
|
-
this.
|
|
111
|
+
}), tap((meta) => this._tableInfo$.next(meta.info)), shareReplay(1));
|
|
112
|
+
this._tableInfo$ = new BehaviorSubject(undefined);
|
|
113
|
+
this._currentPaginationIndex$ = new BehaviorSubject(0);
|
|
114
|
+
this.currentPaginationIndex$ = combineLatest([
|
|
115
|
+
this._currentPaginationIndex$,
|
|
116
|
+
this.table$,
|
|
117
|
+
]).pipe(map(([page, table]) => {
|
|
86
118
|
// determine last page
|
|
87
119
|
const lastPage = Math.ceil(table.info.records /
|
|
88
|
-
(table.
|
|
89
|
-
|
|
120
|
+
(table.info.recordLength ??
|
|
121
|
+
(table.config?.pagination?.length || table.info.records))) - 1;
|
|
122
|
+
// determine min/max position
|
|
90
123
|
return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;
|
|
91
|
-
}), shareReplay(1));
|
|
124
|
+
}), distinctUntilChanged(), tap((index) => this.pageChange.emit({ index })), shareReplay(1));
|
|
92
125
|
this.colspan$ = this.tableConfig$.pipe(switchMap((config) => config.columns
|
|
93
126
|
? of(Object.values(config.columns || config.rows || {}).filter((value) => value.hidden !== true).length)
|
|
94
127
|
: this.data$.pipe(map((data) => data.length + 1))), shareReplay(1));
|
|
@@ -112,8 +145,17 @@ export class CoreComponent {
|
|
|
112
145
|
set loading(isLoading) {
|
|
113
146
|
this._loading$.next(isLoading);
|
|
114
147
|
}
|
|
115
|
-
set
|
|
116
|
-
this.
|
|
148
|
+
set paginationIndex(pageIndex) {
|
|
149
|
+
this._currentPaginationIndex$.next(pageIndex);
|
|
150
|
+
}
|
|
151
|
+
set pagingInfo(value) {
|
|
152
|
+
if (value) {
|
|
153
|
+
this._pagingInfo$.next(value);
|
|
154
|
+
if (value.pageCurrent !== this._currentPaginationIndex$.getValue() + 1 &&
|
|
155
|
+
value.pageCurrent !== null) {
|
|
156
|
+
this.paginationIndex = value.pageCurrent - 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
117
159
|
}
|
|
118
160
|
set search(string) {
|
|
119
161
|
this._searchBy$.next(string);
|
|
@@ -152,12 +194,22 @@ export class CoreComponent {
|
|
|
152
194
|
get loading$() {
|
|
153
195
|
return this._loading$.pipe(startWith(false), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
154
196
|
}
|
|
197
|
+
/** tableInfo$ - returns observable for table info
|
|
198
|
+
* @return Observable<TableInfo> */
|
|
199
|
+
get tableInfo$() {
|
|
200
|
+
return this._tableInfo$.asObservable().pipe(filter((info) => !!info), shareReplay(1));
|
|
201
|
+
}
|
|
202
|
+
/** tableInfo - returns the current table info
|
|
203
|
+
* @return TableInfo */
|
|
204
|
+
get tableInfo() {
|
|
205
|
+
return this._tableInfo$.getValue();
|
|
206
|
+
}
|
|
155
207
|
/** sortByKey - Sort by key in table row
|
|
156
208
|
* @param key - key to sort by
|
|
157
209
|
* @param { MouseEvent } [$event] - Mouse event triggering sort, if shift key is pressed sort key will be added to already present sort keys
|
|
158
210
|
*/
|
|
159
211
|
sortByKey(key, $event) {
|
|
160
|
-
const shiftKey = $event?.shiftKey;
|
|
212
|
+
const shiftKey = $event?.shiftKey === true;
|
|
161
213
|
const currentOrder = this._sortOrder$.value;
|
|
162
214
|
let sortOrder = 'asc';
|
|
163
215
|
let newOrder = [];
|
|
@@ -205,6 +257,7 @@ export class CoreComponent {
|
|
|
205
257
|
key,
|
|
206
258
|
order: sortOrder,
|
|
207
259
|
currentSortOrder: newOrder,
|
|
260
|
+
addSortKey: shiftKey,
|
|
208
261
|
};
|
|
209
262
|
// if event is passed to sort function...
|
|
210
263
|
if ($event) {
|
|
@@ -213,8 +266,11 @@ export class CoreComponent {
|
|
|
213
266
|
}
|
|
214
267
|
// emit sort event
|
|
215
268
|
this.columnSort.emit(sortEvent);
|
|
216
|
-
//
|
|
217
|
-
this.
|
|
269
|
+
// if table is not lazy loaded (sorting is then handled server-side)...
|
|
270
|
+
if (!this.tableInfo?.lazyLoaded) {
|
|
271
|
+
// ...update sort order
|
|
272
|
+
this.sortOrder = newOrder;
|
|
273
|
+
}
|
|
218
274
|
}
|
|
219
275
|
nestedValue(object, mapTo, missingValue = null) {
|
|
220
276
|
const levels = mapTo.split('.');
|
|
@@ -223,7 +279,7 @@ export class CoreComponent {
|
|
|
223
279
|
}
|
|
224
280
|
}
|
|
225
281
|
CoreComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
226
|
-
CoreComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: CoreComponent, isStandalone: true, selector: "angular-generic-table", inputs: { loading: "loading", page: "page", search: "search", config: "config", data: "data", sortOrder: "sortOrder" }, outputs: { rowClick: "rowClick", sortOrderChange: "sortOrderChange", rowHover: "rowHover", columnSort: "columnSort" }, ngImport: i0, template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortOrder$ | async | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n [attr.data-sort-order]=\"\n sortOrder$ | async | sortClass: column.key:'order'\n \"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading ||\n !column.value.sortable ||\n sortByKey(column.key, $event)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"\n sortOrder$ | async | sortClass: headerRow.key:'aria'\n \"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortOrder$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading ||\n !headerRow.value.sortable ||\n sortByKey(headerRow.key, $event)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"loading$ | async; else tableContent\">\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"\n !calculations.calculated[column.key][calculation]\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n row: calculations.calculated[column.key],\n column: calculation,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![(currentPage$ | async) || 0];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n </ng-container>\n</ng-template>\n<ng-template #noData>\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n</ng-template>\n<ng-template\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: CapitalCasePipe, name: "capitalCase" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: SortClassPipe, name: "sortClass" }, { kind: "pipe", type: DashCasePipe, name: "dashCase" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SlicePipe, name: "slice" }, { kind: "pipe", type: DynamicPipe, name: "dynamicPipe" }, { kind: "pipe", type: HighlightPipe, name: "highlight" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
282
|
+
CoreComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: CoreComponent, isStandalone: true, selector: "angular-generic-table", inputs: { loading: "loading", paginationIndex: "paginationIndex", pagingInfo: "pagingInfo", search: "search", config: "config", data: "data", sortOrder: "sortOrder" }, outputs: { rowClick: "rowClick", sortOrderChange: "sortOrderChange", rowHover: "rowHover", columnSort: "columnSort", pageChange: "pageChange" }, ngImport: i0, template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortOrder$ | async | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n [attr.data-sort-order]=\"\n sortOrder$ | async | sortClass: column.key:'order'\n \"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading ||\n !column.value.sortable ||\n sortByKey(column.key, $event)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"\n sortOrder$ | async | sortClass: headerRow.key:'aria'\n \"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortOrder$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading ||\n !headerRow.value.sortable ||\n sortByKey(headerRow.key, $event)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"loading$ | async; else tableContent\">\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"\n !calculations.calculated[column.key][calculation]\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n row: calculations.calculated[column.key],\n column: calculation,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![\n table.info.lazyLoaded ? 0 : (currentPaginationIndex$ | async) || 0\n ];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n </ng-container>\n</ng-template>\n<ng-template #noData>\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n</ng-template>\n<ng-template\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: CapitalCasePipe, name: "capitalCase" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: SortClassPipe, name: "sortClass" }, { kind: "pipe", type: DashCasePipe, name: "dashCase" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SlicePipe, name: "slice" }, { kind: "pipe", type: DynamicPipe, name: "dynamicPipe" }, { kind: "pipe", type: HighlightPipe, name: "highlight" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
227
283
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreComponent, decorators: [{
|
|
228
284
|
type: Component,
|
|
229
285
|
args: [{ selector: 'angular-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
@@ -239,10 +295,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
|
|
|
239
295
|
NgClass,
|
|
240
296
|
NgIf,
|
|
241
297
|
NgForOf,
|
|
242
|
-
], template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortOrder$ | async | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n [attr.data-sort-order]=\"\n sortOrder$ | async | sortClass: column.key:'order'\n \"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading ||\n !column.value.sortable ||\n sortByKey(column.key, $event)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"\n sortOrder$ | async | sortClass: headerRow.key:'aria'\n \"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortOrder$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading ||\n !headerRow.value.sortable ||\n sortByKey(headerRow.key, $event)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"loading$ | async; else tableContent\">\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"\n !calculations.calculated[column.key][calculation]\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n row: calculations.calculated[column.key],\n column: calculation,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![(currentPage$ | async) || 0];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n </ng-container>\n</ng-template>\n<ng-template #noData>\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n</ng-template>\n<ng-template\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n" }]
|
|
298
|
+
], template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortOrder$ | async | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n [attr.data-sort-order]=\"\n sortOrder$ | async | sortClass: column.key:'order'\n \"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading ||\n !column.value.sortable ||\n sortByKey(column.key, $event)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"\n sortOrder$ | async | sortClass: headerRow.key:'aria'\n \"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortOrder$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading ||\n !headerRow.value.sortable ||\n sortByKey(headerRow.key, $event)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"loading$ | async; else tableContent\">\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"\n !calculations.calculated[column.key][calculation]\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n row: calculations.calculated[column.key],\n column: calculation,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![\n table.info.lazyLoaded ? 0 : (currentPaginationIndex$ | async) || 0\n ];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n </ng-container>\n</ng-template>\n<ng-template #noData>\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n</ng-template>\n<ng-template\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n" }]
|
|
243
299
|
}], propDecorators: { loading: [{
|
|
244
300
|
type: Input
|
|
245
|
-
}],
|
|
301
|
+
}], paginationIndex: [{
|
|
302
|
+
type: Input
|
|
303
|
+
}], pagingInfo: [{
|
|
246
304
|
type: Input
|
|
247
305
|
}], search: [{
|
|
248
306
|
type: Input
|
|
@@ -255,11 +313,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImpor
|
|
|
255
313
|
}], rowClick: [{
|
|
256
314
|
type: Output
|
|
257
315
|
}], sortOrderChange: [{
|
|
258
|
-
type: Output
|
|
259
|
-
args: ['sortOrderChange']
|
|
316
|
+
type: Output
|
|
260
317
|
}], rowHover: [{
|
|
261
318
|
type: Output
|
|
262
319
|
}], columnSort: [{
|
|
263
320
|
type: Output
|
|
321
|
+
}], pageChange: [{
|
|
322
|
+
type: Output
|
|
264
323
|
}] } });
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvY29yZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvY29yZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBRVosRUFBRSxFQUNGLGFBQWEsR0FDZCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE9BQU8sRUFDUCxPQUFPLEVBQ1AsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sa0JBQWtCLEdBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFTL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFzQnZELE1BQU0s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bkQsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDOzswR0ExVVUsYUFBYTs4RkFBYixhQUFhLGdVQzlFMUIsczZaQTJXQSx1Q0QzU0ksZUFBZSwrQ0FDZixZQUFZLDRDQUNaLGFBQWEsNkNBQ2IsWUFBWSw0Q0FDWixTQUFTLDhDQUNULGdCQUFnQiwrSUFDaEIsU0FBUyx5Q0FDVCxXQUFXLCtDQUNYLGFBQWEsa0RBQ2IsT0FBTyxvRkFDUCxJQUFJLDZGQUNKLE9BQU87MkZBR0UsYUFBYTtrQkFwQnpCLFNBQVM7K0JBQ0UsdUJBQXVCLG1CQUVoQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixZQUFZO3dCQUNaLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixTQUFTO3dCQUNULFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixPQUFPO3dCQUNQLElBQUk7d0JBQ0osT0FBTztxQkFDUjs4QkFPWSxPQUFPO3NCQUFuQixLQUFLO2dCQUlGLElBQUk7c0JBRFAsS0FBSztnQkFNRixNQUFNO3NCQURULEtBQUs7Z0JBTUYsTUFBTTtzQkFEVCxLQUFLO2dCQU1GLElBQUk7c0JBRFAsS0FBSztnQkFLTyxTQUFTO3NCQUFyQixLQUFLO2dCQU9JLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ29CLGVBQWU7c0JBQXpDLE1BQU07dUJBQUMsaUJBQWlCO2dCQVNmLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFJlcGxheVN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVDb25maWcgfSBmcm9tICcuL21vZGVscy90YWJsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEFzeW5jUGlwZSxcbiAgS2V5VmFsdWUsXG4gIEtleVZhbHVlUGlwZSxcbiAgTmdDbGFzcyxcbiAgTmdGb3JPZixcbiAgTmdJZixcbiAgTmdUZW1wbGF0ZU91dGxldCxcbiAgU2xpY2VQaXBlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbiAgd2l0aExhdGVzdEZyb20sXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi9tb2RlbHMvdGFibGUtY29sdW1uLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGUsXG4gIGNodW5rLFxuICBzZWFyY2gsXG4gIHNvcnRPbk11bHRpcGxlS2V5cyxcbn0gZnJvbSAnLi91dGlsaXRpZXMvdXRpbGl0aWVzJztcbmltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnLi9tb2RlbHMvdGFibGUtcm93LmludGVyZmFjZSc7XG5pbXBvcnQgeyBHdE9yZGVyLCBHdFNvcnRPcmRlciB9IGZyb20gJy4vbW9kZWxzL3RhYmxlLXNvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlTWV0YSB9IGZyb20gJy4vbW9kZWxzL3RhYmxlLW1ldGEuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEd0Um93Q2xpY2tFdmVudCxcbiAgR3RSb3dIb3ZlckV2ZW50LFxuICBHdFNvcnRFdmVudCxcbn0gZnJvbSAnLi9tb2RlbHMvdGFibGUtZXZlbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDYXBpdGFsQ2FzZVBpcGUgfSBmcm9tICcuL3BpcGVzL2NhcGl0YWwtY2FzZS5waXBlJztcbmltcG9ydCB7IFNvcnRDbGFzc1BpcGUgfSBmcm9tICcuL3BpcGVzL3NvcnQtY2xhc3MucGlwZSc7XG5pbXBvcnQgeyBEYXNoQ2FzZVBpcGUgfSBmcm9tICcuL3BpcGVzL2Rhc2gtY2FzZS5waXBlJztcbmltcG9ydCB7IER5bmFtaWNQaXBlIH0gZnJvbSAnLi9waXBlcy9keW5hbWljLnBpcGUnO1xuaW1wb3J0IHsgSGlnaGxpZ2h0UGlwZSB9IGZyb20gJy4vcGlwZXMvaGlnaGxpZ2h0LnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmd1bGFyLWdlbmVyaWMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29yZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ2FwaXRhbENhc2VQaXBlLFxuICAgIEtleVZhbHVlUGlwZSxcbiAgICBTb3J0Q2xhc3NQaXBlLFxuICAgIERhc2hDYXNlUGlwZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBTbGljZVBpcGUsXG4gICAgRHluYW1pY1BpcGUsXG4gICAgSGlnaGxpZ2h0UGlwZSxcbiAgICBOZ0NsYXNzLFxuICAgIE5nSWYsXG4gICAgTmdGb3JPZixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29yZUNvbXBvbmVudCB7XG4gIGdldCBzb3J0T3JkZXIkKCk6IE9ic2VydmFibGU8R3RTb3J0T3JkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fc29ydE9yZGVyJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBsb2FkaW5nKGlzTG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9sb2FkaW5nJC5uZXh0KGlzTG9hZGluZyk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UkLm5leHQocGFnZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc2VhcmNoKHN0cmluZzogT2JzZXJ2YWJsZTxzdHJpbmc+IHwgc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlYXJjaEJ5JC5uZXh0KHN0cmluZyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgY29uZmlnKGNvbmZpZzogT2JzZXJ2YWJsZTxUYWJsZUNvbmZpZzxhbnk+PiB8IFRhYmxlQ29uZmlnPGFueT4pIHtcbiAgICB0aGlzLl90YWJsZUNvbmZpZyQubmV4dChjb25maWcpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGRhdGEoZGF0YTogT2JzZXJ2YWJsZTxBcnJheTxUYWJsZVJvdz4+IHwgQXJyYXk8VGFibGVSb3c+KSB7XG4gICAgdGhpcy5fZGF0YSQubmV4dChkYXRhKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzb3J0T3JkZXIoc29ydENvbmZpZzogR3RTb3J0T3JkZXI8YW55Pikge1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShzb3J0Q29uZmlnKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fc29ydE9yZGVyJC52YWx1ZSkpIHtcbiAgICAgIHRoaXMuc29ydE9yZGVyQ2hhbmdlLmVtaXQoc29ydENvbmZpZyk7XG4gICAgICB0aGlzLl9zb3J0T3JkZXIkLm5leHQoc29ydENvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIHJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxHdFJvd0NsaWNrRXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ3NvcnRPcmRlckNoYW5nZScpIHNvcnRPcmRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgR3RTb3J0T3JkZXI8VGFibGVSb3c+XG4gID4oKTtcblxuICBfcm93Q2xpY2socm93OiBUYWJsZVJvdywgaW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoeyByb3csIGluZGV4LCBldmVudCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jvd0hvdmVyJCA9IG5ldyBSZXBsYXlTdWJqZWN0PEd0Um93SG92ZXJFdmVudD4oMSk7XG4gIEBPdXRwdXQoKSByb3dIb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8R3RSb3dIb3ZlckV2ZW50PigpO1xuICBAT3V0cHV0KCkgY29sdW1uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8R3RTb3J0RXZlbnQ+KCk7XG4gIHJvd0hvdmVyJCA9IHRoaXMuX3Jvd0hvdmVyJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgIGRlYm91bmNlVGltZSg1MCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIHEpID0+IHAuaW5kZXggPT09IHEuaW5kZXgpLFxuICAgIHRhcCgoZXZlbnQpID0+IHRoaXMucm93SG92ZXIuZW1pdChldmVudCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgaG92ZXJSb3coaWQ6IHN0cmluZyk6IHZvaWQ7XG4gIGhvdmVyUm93KGluZGV4OiBudW1iZXIpOiB2b2lkO1xuICBob3ZlclJvdyhub25lOiBudWxsKTogdm9pZDtcbiAgaG92ZXJSb3coYXJnOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmRhdGEkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgoZGF0YSkgPT4gZGF0YVthcmddKSxcbiAgICAgICAgICB0YWtlKDEpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocm93KSA9PiB0aGlzLl9ob3ZlclJvdyhyb3csIGFyZykpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRPRE86IGltcGxlbWVudCBob3ZlciBieSBpZFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ob3ZlclJvdyhudWxsLCBudWxsKTtcbiAgICB9XG4gIH1cbiAgX2hvdmVyUm93KFxuICAgIHJvdzogVGFibGVSb3cgfCBudWxsLFxuICAgIGluZGV4OiBudW1iZXIgfCBudWxsLFxuICAgIGV2ZW50PzogTW91c2VFdmVudFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dIb3ZlciQubmV4dCh7IHJvdywgaW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC5waXBlKFxuICAgICAgc3RhcnRXaXRoKGZhbHNlKSxcbiAgICAgIG1hcCgodmFsdWUpID0+IChpc09ic2VydmFibGUodmFsdWUpID8gdmFsdWUgOiBvZih2YWx1ZSkpKSxcbiAgICAgIHN3aXRjaE1hcCgob2JzKSA9PiBvYnMpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZGluZyQ6IFJlcGxheVN1YmplY3Q8T2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4+ID1cbiAgICBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgcHJpdmF0ZSBfc29ydE9yZGVyJDogQmVoYXZpb3JTdWJqZWN0PEd0U29ydE9yZGVyPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxHdFNvcnRPcmRlcj4oW10pO1xuICBwcml2YXRlIF9zZWFyY2hCeSQ6IFJlcGxheVN1YmplY3Q8T2JzZXJ2YWJsZTxzdHJpbmc+IHwgc3RyaW5nIHwgbnVsbD4gPVxuICAgIG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBzZWFyY2hCeSQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gPSB0aGlzLl9zZWFyY2hCeSQucGlwZShcbiAgICBzdGFydFdpdGgoJycpLFxuICAgIG1hcCgodmFsdWUpID0+IChpc09ic2VydmFibGUodmFsdWUpID8gdmFsdWUgOiBvZih2YWx1ZSkpKSxcbiAgICBzd2l0Y2hNYXAoKG9icykgPT4gb2JzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX3RhYmxlQ29uZmlnJDogQmVoYXZpb3JTdWJqZWN0PFxuICAgIFRhYmxlQ29uZmlnPGFueT4gfCBPYnNlcnZhYmxlPFRhYmxlQ29uZmlnPGFueT4+XG4gID4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgdGFibGVDb25maWckID0gdGhpcy5fdGFibGVDb25maWckLnBpcGUoXG4gICAgbWFwKCh2YWx1ZSkgPT4gKGlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZSA6IG9mKHZhbHVlKSkpLFxuICAgIHN3aXRjaE1hcCgob2JzKSA9PiBvYnMpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcHJpdmF0ZSBfZGF0YSQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8VGFibGVSb3c+IHwgT2JzZXJ2YWJsZTxBcnJheTxUYWJsZVJvdz4+PiA9XG4gICAgbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIGRhdGEkOiBPYnNlcnZhYmxlPEFycmF5PFRhYmxlUm93Pj4gPSB0aGlzLl9kYXRhJC5waXBlKFxuICAgIG1hcCgodmFsdWUpID0+IChpc09ic2VydmFibGUodmFsdWUpID8gdmFsdWUgOiBvZih2YWx1ZSkpKSxcbiAgICBzd2l0Y2hNYXAoKG9icykgPT4gY29tYmluZUxhdGVzdChbb2JzXSkpLFxuICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMudGFibGVDb25maWckKSxcbiAgICBtYXAoKFtbZGF0YV0sIGNvbmZpZ10pID0+IHtcbiAgICAgIC8vIGlmIGNvbHVtbnMgb3Igcm93cyBjb250YWlucyBjb25maWcgZm9yIG1hcFRvLi4uXG4gICAgICBpZiAoXG4gICAgICAgIChjb25maWcuY29sdW1ucyAmJlxuICAgICAgICAgICEhT2JqZWN0LnZhbHVlcyhjb25maWcuY29sdW1ucykuZmluZCgoY29sdW1uKSA9PiAhIWNvbHVtbi5tYXBUbykpIHx8XG4gICAgICAgIChjb25maWcucm93cyAmJlxuICAgICAgICAgICEhT2JqZWN0LnZhbHVlcyhjb25maWcucm93cykuZmluZCgoY29sdW1uKSA9PiAhIWNvbHVtbi5tYXBUbykpXG4gICAgICApIHtcbiAgICAgICAgLy8gLi4ubWFwIGRhdGEgdG8gbmV3IGtleXMgb24gcm93Li4uXG4gICAgICAgIGNvbnN0IG5ld0RhdGE6IFRhYmxlUm93W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgcm93ID0gZGF0YVtpXTtcbiAgICAgICAgICBjb25zdCBuZXdLZXlzID0gT2JqZWN0LmVudHJpZXMoY29uZmlnLmNvbHVtbnMgfHwgY29uZmlnLnJvd3MgfHwgW10pXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+ICEhdmFsdWUubWFwVG8pIC8vIGFkZCBrZXlzIGZvciBjb2x1bW5zIHdpdGggbWFwVG8gY29uZmlnLi4uXG4gICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAocHJldmlvdXNWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICAgICAgW2tleV06IHRoaXMubmVzdGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5tYXBUbyEucGF0aCxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLm1hcFRvPy5taXNzaW5nVmFsdWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgbmV3RGF0YVtpXSA9IHsgLi4ucm93LCAuLi5uZXdLZXlzIH07XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IG5ld0RhdGE7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhLCBjb25maWcgfTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoKG9icykgPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW29mKG9icyksIHRoaXMuc29ydE9yZGVyJCwgdGhpcy5zZWFyY2hCeSRdKVxuICAgICksXG4gICAgbWFwKChbdGFibGUsIHNvcnRCeSwgc2VhcmNoQnldKSA9PiB7XG4gICAgICAvLyBjcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIGFuZCBzb3J0IG5ldyBhcnJheSAocHJldmVudCBtdXRhdGluZyBleGlzdGluZyBzdGF0ZSlcbiAgICAgIHRhYmxlLmRhdGEgPSBbLi4udGFibGUuZGF0YV07XG4gICAgICByZXR1cm4gIXNvcnRCeS5sZW5ndGggfHwgdGFibGUuY29uZmlnPy5kaXNhYmxlVGFibGVTb3J0XG4gICAgICAgID8gc2VhcmNoQnlcbiAgICAgICAgICA/IHNlYXJjaChzZWFyY2hCeSwgZmFsc2UsIHRhYmxlLmRhdGEsIHRhYmxlLmNvbmZpZylcbiAgICAgICAgICA6IHRhYmxlLmRhdGFcbiAgICAgICAgOiBzZWFyY2hCeVxuICAgICAgICA/IHNlYXJjaChzZWFyY2hCeSwgZmFsc2UsIHRhYmxlLmRhdGEsIHRhYmxlLmNvbmZpZyk/LnNvcnQoXG4gICAgICAgICAgICBzb3J0T25NdWx0aXBsZUtleXMoc29ydEJ5KVxuICAgICAgICAgIClcbiAgICAgICAgOiB0YWJsZS5kYXRhPy5zb3J0KHNvcnRPbk11bHRpcGxlS2V5cyhzb3J0QnkpKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNhbGN1bGF0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGEkLCB0aGlzLnRhYmxlQ29uZmlnJF0pLnBpcGUoXG4gICAgbWFwKChbZGF0YSwgY29uZmlnXSkgPT4gY2FsY3VsYXRlKGRhdGEsIGNvbmZpZykpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgdGFibGUkOiBPYnNlcnZhYmxlPFRhYmxlTWV0YT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRhdGEkLFxuICAgIHRoaXMudGFibGVDb25maWckLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NvcnRlZCwgY29uZmlnXSkgPT4ge1xuICAgICAgLy8gaWYgcGFnaW5hdGlvbiBpcyBkaXNhYmxlZC4uLlxuICAgICAgaWYgKCFjb25maWcucGFnaW5hdGlvbiB8fCBjb25maWcucGFnaW5hdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gLi4ucmV0dXJuIHVuYWx0ZXJlZCBhcnJheVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IFtzb3J0ZWRdLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBpbmZvOiB7IHJlY29yZHM6IHNvcnRlZC5sZW5ndGgsIHBhZ2VUb3RhbDogMSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHJlY29yZCBzZXRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNodW5rKHNvcnRlZCwgKyhjb25maWcucGFnaW5hdGlvbi5sZW5ndGggfHwgMCkpLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZm86IHtcbiAgICAgICAgICByZWNvcmRzOiBzb3J0ZWQubGVuZ3RoLFxuICAgICAgICAgIHBhZ2VUb3RhbDogTWF0aC5jZWlsKFxuICAgICAgICAgICAgc29ydGVkLmxlbmd0aCAvICsoY29uZmlnLnBhZ2luYXRpb24ubGVuZ3RoIHx8IDApXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBwcml2YXRlIF9jdXJyZW50UGFnZSQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcbiAgY3VycmVudFBhZ2UkID0gY29tYmluZUxhdGVzdChbdGhpcy5fY3VycmVudFBhZ2UkLCB0aGlzLnRhYmxlJF0pLnBpcGUoXG4gICAgbWFwKChbcGFnZSwgdGFibGVdOiBhbnkpID0+IHtcbiAgICAgIC8vIGRldGVybWluZSBsYXN0IHBhZ2VcbiAgICAgIGNvbnN0IGxhc3RQYWdlID1cbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIHRhYmxlLmluZm8ucmVjb3JkcyAvXG4gICAgICAgICAgICAodGFibGUuY29uZmlnPy5wYWdpbmF0aW9uPy5sZW5ndGggfHwgdGFibGUuaW5mby5yZWNvcmRzKVxuICAgICAgICApIC0gMTtcbiAgICAgIC8vIGRldGVybWluZSBtYXgvbWluIHBvc2l0aW9uXG4gICAgICByZXR1cm4gK3BhZ2UgPCAwID8gMCA6ICtwYWdlID4gbGFzdFBhZ2UgPyBsYXN0UGFnZSA6ICtwYWdlO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgY29sc3BhbiQgPSB0aGlzLnRhYmxlQ29uZmlnJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoY29uZmlnKSA9PlxuICAgICAgY29uZmlnLmNvbHVtbnNcbiAgICAgICAgPyBvZihcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoY29uZmlnLmNvbHVtbnMgfHwgY29uZmlnLnJvd3MgfHwge30pLmZpbHRlcihcbiAgICAgICAgICAgICAgKHZhbHVlKSA9PiB2YWx1ZS5oaWRkZW4gIT09IHRydWVcbiAgICAgICAgICAgICkubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICA6IHRoaXMuZGF0YSQucGlwZShtYXAoKGRhdGEpID0+IGRhdGEubGVuZ3RoICsgMSkpXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGZvb3RlckNvbHNwYW4kID0gdGhpcy50YWJsZUNvbmZpZyQucGlwZShcbiAgICBtYXAoKGNvbmZpZykgPT4ge1xuICAgICAgbGV0IGNvbHNwYW4gPSAwO1xuICAgICAgT2JqZWN0LnZhbHVlcyhjb25maWc/LmZvb3Rlcj8uY29sdW1ucyB8fCB7fSkuZm9yRWFjaCgoY2FsY3VsYXRpb25zKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3QudmFsdWVzKGNhbGN1bGF0aW9ucykuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgLmxlbmd0aCA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbHNwYW4gKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSwge30pO1xuICAgICAgcmV0dXJuIGNvbHNwYW47XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKiogc29ydEJ5S2V5IC0gU29ydCBieSBrZXkgaW4gdGFibGUgcm93XG4gICAqIEBwYXJhbSBrZXkgLSBrZXkgdG8gc29ydCBieVxuICAgKiBAcGFyYW0geyBNb3VzZUV2ZW50IH0gWyRldmVudF0gLSBNb3VzZSBldmVudCB0cmlnZ2VyaW5nIHNvcnQsIGlmIHNoaWZ0IGtleSBpcyBwcmVzc2VkIHNvcnQga2V5IHdpbGwgYmUgYWRkZWQgdG8gYWxyZWFkeSBwcmVzZW50IHNvcnQga2V5c1xuICAgKi9cbiAgc29ydEJ5S2V5KGtleToga2V5b2YgVGFibGVSb3csICRldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzaGlmdEtleSA9ICRldmVudD8uc2hpZnRLZXk7XG4gICAgY29uc3QgY3VycmVudE9yZGVyID0gdGhpcy5fc29ydE9yZGVyJC52YWx1ZTtcbiAgICBsZXQgc29ydE9yZGVyOiBHdE9yZGVyID0gJ2FzYyc7XG4gICAgbGV0IG5ld09yZGVyOiBHdFNvcnRPcmRlciA9IFtdO1xuICAgIC8vIGlmIHNoaWZ0IGtleSBpcyBwcmVzc2VkIHdoaWxlIHNvcnRpbmcuLi5cbiAgICBpZiAoc2hpZnRLZXkpIHtcbiAgICAgIC8vIC4uLmNoZWNrIGlmIGtleSBpcyBhbHJlYWR5IHNvcnRlZFxuICAgICAgY29uc3QgZXhpc3RpbmdTb3J0UG9zaXRpb24gPSBjdXJyZW50T3JkZXIuZmluZEluZGV4KFxuICAgICAgICAodmFsdWUpID0+IHZhbHVlLmtleSA9PT0ga2V5XG4gICAgICApO1xuICAgICAgaWYgKGV4aXN0aW5nU29ydFBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICAvLyAuLi5pZiBrZXkgaXMgbm90IHNvcnRlZCwgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIHNvcnQgb3JkZXJcbiAgICAgICAgbmV3T3JkZXIgPSBbLi4uY3VycmVudE9yZGVyLCB7IGtleSwgb3JkZXI6ICdhc2MnIH1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gLi4uaWYga2V5IGlzIGFscmVhZHkgc29ydGVkLCB0b2dnbGUgc29ydCBvcmRlclxuICAgICAgICBzb3J0T3JkZXIgPSBjdXJyZW50T3JkZXJbZXhpc3RpbmdTb3J0UG9zaXRpb25dLm9yZGVyO1xuICAgICAgICBjb25zdCBuZXdTb3J0T3JkZXIgPSBzb3J0T3JkZXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgICAgIG5ld09yZGVyID0gWy4uLmN1cnJlbnRPcmRlcl07XG4gICAgICAgIG5ld09yZGVyW2V4aXN0aW5nU29ydFBvc2l0aW9uXSA9IHtcbiAgICAgICAgICAuLi5uZXdPcmRlcltleGlzdGluZ1NvcnRQb3NpdGlvbl0sXG4gICAgICAgICAgb3JkZXI6IG5ld1NvcnRPcmRlcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLi4uZWxzZSBpZiBzaGlmdCBrZXkgaXMgbm90IHByZXNzZWQuLi5cbiAgICAgIGlmIChjdXJyZW50T3JkZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyAuLi5jaGVjayBpZiBrZXkgaXMgYWxyZWFkeSBzb3J0ZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTb3J0UG9zaXRpb24gPSBjdXJyZW50T3JkZXIuZmluZEluZGV4KFxuICAgICAgICAgICh2YWx1ZSkgPT4gdmFsdWUua2V5ID09PSBrZXlcbiAgICAgICAgKTtcbiAgICAgICAgLy8gLi4uaWYga2V5IGlzIGFscmVhZHkgc29ydGVkLCB0b2dnbGUgc29ydCBvcmRlclxuICAgICAgICBpZiAoZXhpc3RpbmdTb3J0UG9zaXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgbmV3T3JkZXIgPSBbeyBrZXksIG9yZGVyOiAnYXNjJyB9XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0T3JkZXIgPSBjdXJyZW50T3JkZXJbZXhpc3RpbmdTb3J0UG9zaXRpb25dLm9yZGVyO1xuICAgICAgICAgIGNvbnN0IG5ld1NvcnRPcmRlciA9IHNvcnRPcmRlciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcbiAgICAgICAgICBuZXdPcmRlciA9IFt7IGtleSwgb3JkZXI6IG5ld1NvcnRPcmRlciB9XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gLi4uaWYga2V5IGlzIG5vdCBzb3J0ZWQgc2V0IHNvcnQgb3JkZXIgZm9yIGtleSB0byBhc2NlbmRpbmdcbiAgICAgICAgbmV3T3JkZXIgPSBbeyBrZXksIG9yZGVyOiBzb3J0T3JkZXIgfV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZSBzb3J0IGV2ZW50XG4gICAgY29uc3Qgc29ydEV2ZW50OiBHdFNvcnRFdmVudCA9IHtcbiAgICAgIGtleSxcbiAgICAgIG9yZGVyOiBzb3J0T3JkZXIsXG4gICAgICBjdXJyZW50U29ydE9yZGVyOiBuZXdPcmRlcixcbiAgICB9O1xuXG4gICAgLy8gaWYgZXZlbnQgaXMgcGFzc2VkIHRvIHNvcnQgZnVuY3Rpb24uLi5cbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICAvLyAuLi5lbWl0IGl0IGFzIHdlbGxcbiAgICAgIHNvcnRFdmVudC5ldmVudCA9ICRldmVudDtcbiAgICB9XG4gICAgLy8gZW1pdCBzb3J0IGV2ZW50XG4gICAgdGhpcy5jb2x1bW5Tb3J0LmVtaXQoc29ydEV2ZW50KTtcbiAgICAvLyB1cGRhdGUgc29ydCBvcmRlclxuICAgIHRoaXMuc29ydE9yZGVyID0gbmV3T3JkZXI7XG4gIH1cblxuICBjb2x1bW5PcmRlciA9IChcbiAgICBhOiBLZXlWYWx1ZTxzdHJpbmcsIFRhYmxlQ29sdW1uPixcbiAgICBiOiBLZXlWYWx1ZTxzdHJpbmcsIFRhYmxlQ29sdW1uPlxuICApOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiAoYS52YWx1ZS5vcmRlciB8fCAwKSAtIChiLnZhbHVlLm9yZGVyIHx8IDApO1xuICB9O1xuXG4gIG5lc3RlZFZhbHVlKFxuICAgIG9iamVjdDogYW55LFxuICAgIG1hcFRvOiBzdHJpbmcsXG4gICAgbWlzc2luZ1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbFxuICApOiB1bmtub3duIHtcbiAgICBjb25zdCBsZXZlbHMgPSBtYXBUby5zcGxpdCgnLicpO1xuICAgIHJldHVybiBsZXZlbHMucmVkdWNlKFxuICAgICAgKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSwgaW5kZXgpID0+XG4gICAgICAgIHByZXZpb3VzVmFsdWVbY3VycmVudFZhbHVlXSB8fFxuICAgICAgICAoaW5kZXggPT09IGxldmVscy5sZW5ndGggLSAxID8gbWlzc2luZ1ZhbHVlIDoge30pLFxuICAgICAgb2JqZWN0XG4gICAgKTtcbiAgfVxufVxuIiwiPHRhYmxlXG4gIFtuZ0NsYXNzXT1cIih0YWJsZUNvbmZpZyQgfCBhc3luYyk/LmNsYXNzIHx8ICd0YWJsZSdcIlxuICBbY2xhc3MudGFibGUtbW9iaWxlXT1cIih0YWJsZUNvbmZpZyQgfCBhc3luYyk/Lm1vYmlsZUxheW91dFwiXG4gIFtjbGFzcy50YWJsZS1ob3Jpem9udGFsXT1cIih0YWJsZUNvbmZpZyQgfCBhc3luYyk/LnJvd3NcIlxuICBbY2xhc3MudGFibGUtbG9hZGluZ109XCJsb2FkaW5nJCB8IGFzeW5jXCJcbiAgW2NsYXNzLmd0LXN0aWNreS1yb3ctaGVhZGVyXT1cIlxuICAgICh0YWJsZUNvbmZpZyQgfCBhc3luYyk/LnN0aWNreUhlYWRlcnM/LnJvdyAmJiAodGFibGVDb25maWckIHwgYXN5bmMpPy5yb3dzXG4gIFwiXG4gIFtjbGFzcy5ndC1zdGlja3ktY29sdW1uLWhlYWRlcl09XCJcbiAgICAodGFibGVDb25maWckIHwgYXN5bmMpPy5zdGlja3lIZWFkZXJzPy5jb2x1bW5cbiAgXCJcbiAgW2F0dHIuYXJpYS1idXN5XT1cIihsb2FkaW5nJCB8IGFzeW5jKSA9PT0gdHJ1ZSA/IHRydWUgOiBudWxsXCJcbj5cbiAgPHRoZWFkPlxuICAgIDx0clxuICAgICAgKm5nSWY9XCJ7XG4gICAgICAgIGNvbmZpZzogKHRhYmxlQ29uZmlnJCB8IGFzeW5jKSEsXG4gICAgICAgIGlzTG9hZGluZzogbG9hZGluZyQgfCBhc3luY1xuICAgICAgfSBhcyB0YWJsZVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHRhYmxlLmNvbmZpZz8uY29sdW1ucyB8IGtleXZhbHVlOiBjb2x1bW5PcmRlclwiXG4gICAgICA+XG4gICAgICAgIDx0aFxuICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi52YWx1ZT8uaGlkZGVuXCJcbiAgICAgICAgICBuZ0NsYXNzPVwie3sgKGNvbHVtbi5rZXkgfCBkYXNoQ2FzZSkgKyAnLWNvbHVtbicgfX0ge3tcbiAgICAgICAgICAgIGNvbHVtbi52YWx1ZS5jbGFzc1xuICAgICAgICAgIH19XCJcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwidGFibGUuaXNMb2FkaW5nXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwic29ydE9yZGVyJCB8IGFzeW5jIHwgc29ydENsYXNzOiBjb2x1bW4ua2V5OidhcmlhJ1wiXG4gICAgICAgICAgW2NsYXNzLmd0LXNvcnRhYmxlXT1cInRydWVcIlxuICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnZhbHVlPy5zb3J0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNvcnQtb3JkZXJdPVwiXG4gICAgICAgICAgICAgIHNvcnRPcmRlciQgfCBhc3luYyB8IHNvcnRDbGFzczogY29sdW1uLmtleTonb3JkZXInXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJndC1zb3J0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgdGFibGUuaXNMb2FkaW5nIHx8XG4gICAgICAgICAgICAgICAgIWNvbHVtbi52YWx1ZS5zb3J0YWJsZSB8fFxuICAgICAgICAgICAgICAgIHNvcnRCeUtleShjb2x1bW4ua2V5LCAkZXZlbnQpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLnZhbHVlPy5oZWFkZXIgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgY29sdW1uLnZhbHVlLmhlYWRlciB8fCBjb2x1bW4ua2V5IHwgY2FwaXRhbENhc2VcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4udmFsdWU/LnNvcnRhYmxlICYmIGNvbHVtbi52YWx1ZT8uaGVhZGVyICE9PSBmYWxzZVwiXG4gICAgICAgICAgICA+e3sgY29sdW1uLnZhbHVlLmhlYWRlciB8fCBjb2x1bW4ua2V5IHwgY2FwaXRhbENhc2UgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAoKHRhYmxlPy5jb25maWc/LnJvd3MgfCBrZXl2YWx1ZTogY29sdW1uT3JkZXIpIHx8IFtdKVswXSBhcyBoZWFkZXJSb3dcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHRoXG4gICAgICAgICAgY2xhc3M9XCJyb3ctaGVhZGVyXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNvcnRdPVwiXG4gICAgICAgICAgICBzb3J0T3JkZXIkIHwgYXN5bmMgfCBzb3J0Q2xhc3M6IGhlYWRlclJvdy5rZXk6J2FyaWEnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBuZ0NsYXNzPVwie3sgaGVhZGVyUm93LnZhbHVlLnNvcnRhYmxlID8gJ3NvcnQgJyA6ICcnIH19IHt7XG4gICAgICAgICAgICBzb3J0T3JkZXIkIHwgYXN5bmMgfCBzb3J0Q2xhc3M6IGhlYWRlclJvdy5rZXlcbiAgICAgICAgICB9fSB7eyAoaGVhZGVyUm93LmtleSB8IGRhc2hDYXNlKSArICctY29sdW1uJyB9fVwiXG4gICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgdGFibGUuaXNMb2FkaW5nIHx8XG4gICAgICAgICAgICAgICFoZWFkZXJSb3cudmFsdWUuc29ydGFibGUgfHxcbiAgICAgICAgICAgICAgc29ydEJ5S2V5KGhlYWRlclJvdy5rZXksICRldmVudClcbiAgICAgICAgICBcIlxuICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJSb3c/LnZhbHVlPy5oZWFkZXIgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgIGhlYWRlclJvdz8udmFsdWU/LmhlYWRlciB8fCBoZWFkZXJSb3cua2V5IHwgY2FwaXRhbENhc2VcbiAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGhcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mICgodGFibGUkIHwgYXN5bmMpPy5kYXRhIHx8IFtdKVswXVwiXG4gICAgICAgICAgbmdDbGFzcz1cInt7IGhlYWRlclJvdy52YWx1ZS5jbGFzcyB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgICAgKHRhYmxlLmNvbmZpZy5yb3dzIHx8IHt9KVtoZWFkZXJSb3cua2V5XS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgID8gdGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICA6ICh0YWJsZS5jb25maWcucm93cyB8fCB7fSlbaGVhZGVyUm93LmtleV0udHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgPyB0cmFuc2Zvcm1EYXRhXG4gICAgICAgICAgICAgICAgOiByYXdEYXRhXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgcm93OiBjb2x1bW4sXG4gICAgICAgICAgICAgIGNvbHVtbjogaGVhZGVyUm93LFxuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh0YWJsZS5jb25maWcucm93cyB8fCB7fSlbaGVhZGVyUm93LmtleV0udHJhbnNmb3JtLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZjogKHRhYmxlLmNvbmZpZy5yb3dzIHx8IHt9KVtoZWFkZXJSb3cua2V5XS50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgaW5kZXg6IDBcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90aD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keSAqbmdJZj1cImxvYWRpbmckIHwgYXN5bmM7IGVsc2UgdGFibGVDb250ZW50XCI+XG4gICAgPHRyPlxuICAgICAgPHRkIGNsYXNzPVwicC0wXCIgW2NvbFNwYW5dPVwiY29sc3BhbiQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCIudGFibGUtbG9hZGluZ1wiPjwvbmctY29udGVudD5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbiAgPHRmb290ICpuZ0lmPVwiKHRhYmxlJCB8IGFzeW5jKSEgYXMgdGFibGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGUuZGF0YS5sZW5ndGggPiAwICYmICEobG9hZGluZyQgfCBhc3luYylcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoY2FsY3VsYXRpb25zJCB8IGFzeW5jKSEgYXMgY2FsY3VsYXRpb25zXCI+XG4gICAgICAgIDx0clxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjYWxjdWxhdGlvbiBvZiBjYWxjdWxhdGlvbnMuY2FsY3VsYXRpb25zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwie1xuICAgICAgICAgICAgICBzaG93SGVhZGVyOiAoY29sc3BhbiQgfCBhc3luYykgIT09IChmb290ZXJDb2xzcGFuJCB8IGFzeW5jKVxuICAgICAgICAgICAgfSBhcyBmb290ZXJSb3dcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAqbmdJZj1cImZvb3RlclJvdy5zaG93SGVhZGVyXCJcbiAgICAgICAgICAgICAgW2NvbFNwYW5dPVwiXG4gICAgICAgICAgICAgICAgKChjb2xzcGFuJCB8IGFzeW5jKSB8fCAwKSAtICgoZm9vdGVyQ29sc3BhbiQgfCBhc3luYykgfHwgMClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWJsZS5jb25maWc/LmZvb3Rlcj8uaGVhZGVycz8uW2NhbGN1bGF0aW9uXSBhcyBzaG93SGVhZGVyXCJcbiAgICAgICAgICAgICAgICA+e3tzaG93SGVhZGVyID09PSB0cnVlID8gKGNhbGN1bGF0aW9uIHwgY2FwaXRhbENhc2UpOiB0YWJsZS5jb25maWcuZm9vdGVyPy5oZWFkZXJzPy5bY2FsY3VsYXRpb25dfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIHRhYmxlLmNvbmZpZz8uY29sdW1ucyB8IGtleXZhbHVlOiBjb2x1bW5PcmRlclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgIWNvbHVtbi52YWx1ZT8uaGlkZGVuICYmIGNhbGN1bGF0aW9ucy5jYWxjdWxhdGVkW2NvbHVtbi5rZXldXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBuZ0NsYXNzPVwie3sgKGNvbHVtbi5rZXkgfCBkYXNoQ2FzZSkgKyAnLWNvbHVtbicgfX0ge3tcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi52YWx1ZS5jbGFzc1xuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWhlYWRlcl09XCJcbiAgICAgICAgICAgICAgICAgICFmb290ZXJSb3cuc2hvd0hlYWRlciAmJiB0YWJsZS5jb25maWcuZm9vdGVyPy5oZWFkZXJzPy5bY2FsY3VsYXRpb25dXG4gICAgICAgICAgICAgICAgICAgID8gdGFibGUuY29uZmlnLmZvb3Rlcj8uaGVhZGVycz8uW2NhbGN1bGF0aW9uXSA9PT0gdHJ1ZSA/IChjYWxjdWxhdGlvbiB8IGNhcGl0YWxDYXNlKSA6IHRhYmxlLmNvbmZpZy5mb290ZXI/LmhlYWRlcnM/LltjYWxjdWxhdGlvbl1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgdGFibGUuY29uZmlnLm1vYmlsZUxheW91dCAmJiBjb2x1bW4udmFsdWUubW9iaWxlSGVhZGVyXG4gICAgICAgICAgICAgICAgICAgID8gY29sdW1uLnZhbHVlLm1vYmlsZUhlYWRlciAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgID8gY29sdW1uLnZhbHVlLm1vYmlsZUhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgIDogKGNvbHVtbi52YWx1ZS5oZWFkZXIgfHwgY29sdW1uLmtleSB8IGNhcGl0YWxDYXNlKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ndC1uby1jb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICAgIWNhbGN1bGF0aW9ucy5jYWxjdWxhdGVkW2NvbHVtbi5rZXldW2NhbGN1bGF0aW9uXVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgICAgICAgICAgKHRhYmxlLmNvbmZpZy5jb2x1bW5zIHx8IHt9KVtjb2x1bW4ua2V5XS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgICAgID8gdGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgICA6ICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV0udHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgPyB0cmFuc2Zvcm1Gb290ZXJcbiAgICAgICAgICAgICAgICAgICAgICA6IHJhd0Zvb3RlclxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYWxjdWxhdGlvbnMuY2FsY3VsYXRlZFtjb2x1bW4ua2V5XVtjYWxjdWxhdGlvbl0sXG4gICAgICAgICAgICAgICAgICAgIHJvdzogY2FsY3VsYXRpb25zLmNhbGN1bGF0ZWRbY29sdW1uLmtleV0sXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY2FsY3VsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiAodGFibGUuY29uZmlnLmNvbHVtbnMgfHwge30pW2NvbHVtbi5rZXldXG4gICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV1cbiAgICAgICAgICAgICAgICAgICAgICAudHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3Rmb290PlxuPC90YWJsZT5cbjxuZy10ZW1wbGF0ZSAjdGFibGVDb250ZW50PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRhYmxlJCB8IGFzeW5jKSEgYXMgdGFibGVcIj5cbiAgICA8dGJvZHkgKm5nSWY9XCIodGFibGUhLmRhdGEhWzBdIHx8IHRhYmxlIS5kYXRhISkubGVuZ3RoID4gMDsgZWxzZSBub0RhdGFcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZS5jb25maWcuY29sdW1uc1wiPlxuICAgICAgICA8dHJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCByb3cgb2YgdGFibGUhLmRhdGEhWyhjdXJyZW50UGFnZSQgfCBhc3luYykgfHwgMF07XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbYXR0ci5pZF09XCIndGFibGVSb3dfJyArIGlcIlxuICAgICAgICAgIChjbGljayk9XCJ0YWJsZT8uY29uZmlnPy5yb3dDbGljayAmJiBfcm93Q2xpY2socm93LCBpLCAkZXZlbnQpXCJcbiAgICAgICAgICAobW91c2VvdmVyKT1cInRhYmxlPy5jb25maWc/LnJvd0hvdmVyICYmIF9ob3ZlclJvdyhyb3csIGksICRldmVudClcIlxuICAgICAgICAgIChtb3VzZW91dCk9XCJ0YWJsZT8uY29uZmlnPy5yb3dIb3ZlciAmJiBfaG92ZXJSb3cobnVsbCwgbnVsbCwgJGV2ZW50KVwiXG4gICAgICAgICAgW2NsYXNzLmd0LWhvdmVyXT1cIihyb3dIb3ZlciQgfCBhc3luYyk/LmluZGV4ID09PSBpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGFibGUuY29uZmlnPy5jb2x1bW5zIHwga2V5dmFsdWU6IGNvbHVtbk9yZGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLnZhbHVlPy5oaWRkZW5cIlxuICAgICAgICAgICAgICBuZ0NsYXNzPVwie3sgKGNvbHVtbi5rZXkgfCBkYXNoQ2FzZSkgKyAnLWNvbHVtbicgfX0ge3tcbiAgICAgICAgICAgICAgICBjb2x1bW4udmFsdWUuY2xhc3NcbiAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgIHRhYmxlLmNvbmZpZy5tb2JpbGVMYXlvdXQgJiYgY29sdW1uLnZhbHVlLm1vYmlsZUhlYWRlclxuICAgICAgICAgICAgICAgICAgPyBjb2x1bW4udmFsdWUubW9iaWxlSGVhZGVyICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgID8gY29sdW1uLnZhbHVlLm1vYmlsZUhlYWRlclxuICAgICAgICAgICAgICAgICAgICA6IChjb2x1bW4udmFsdWUuaGVhZGVyIHx8IGNvbHVtbi5rZXkgfCBjYXBpdGFsQ2FzZSlcbiAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQnkkIHwgYXN5bmMpICYmXG4gICAgICAgICAgICAgICAgICAhKHRhYmxlLmNvbmZpZy5jb2x1bW5zIHx8IHt9KVtjb2x1bW4ua2V5XS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgICA/IGhpZ2hsaWdodGVkXG4gICAgICAgICAgICAgICAgICAgIDogKHRhYmxlLmNvbmZpZy5jb2x1bW5zIHx8IHt9KVtjb2x1bW4ua2V5XS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgICA/IHRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICAgIDogKHRhYmxlLmNvbmZpZy5jb2x1bW5zIHx8IHt9KVtjb2x1bW4ua2V5XS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgPyB0cmFuc2Zvcm1EYXRhXG4gICAgICAgICAgICAgICAgICAgIDogcmF3RGF0YVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICBzZWFyY2g6IChzZWFyY2hCeSQgfCBhc3luYyksXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV0udHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6ICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV1cbiAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgICAgICBkYXRhOiB0YWJsZS5kYXRhWyhjdXJyZW50UGFnZSQgfCBhc3luYykgfHwgMF1cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYmxlLmNvbmZpZy5yb3dzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCByb3cgb2YgdGFibGU/LmNvbmZpZz8ucm93cyB8IGtleXZhbHVlOiBjb2x1bW5PcmRlciB8IHNsaWNlOiAxO1xuICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8dHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXJvdy52YWx1ZT8uaGlkZGVuXCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cIid0YWJsZVJvd18nICsgaVwiXG4gICAgICAgICAgICBuZ0NsYXNzPVwie3sgKHJvdy5rZXkgfCBkYXNoQ2FzZSkgKyAnLXJvdycgfX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRhYmxlPy5jb25maWc/LnJvd0NsaWNrICYmIF9yb3dDbGljayhyb3csIGksICRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJ0YWJsZT8uY29uZmlnPy5yb3dIb3ZlciAmJiBfaG92ZXJSb3cocm93LCBpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZW91dCk9XCJcbiAgICAgICAgICAgICAgdGFibGU/LmNvbmZpZz8ucm93SG92ZXIgJiYgX2hvdmVyUm93KG51bGwsIG51bGwsICRldmVudClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbY2xhc3MuZ3QtaG92ZXJdPVwiKHJvd0hvdmVyJCB8IGFzeW5jKT8uaW5kZXggPT09IGlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInJvdy1oZWFkZXJcIiBzY29wZT1cInJvd1wiPlxuICAgICAgICAgICAgICB7eyByb3cudmFsdWUuaGVhZGVyIHx8IHJvdy5rZXkgfCBjYXBpdGFsQ2FzZSB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mICh0YWJsZT8uZGF0YSB8fCBbXSlbMF07IGxldCB5ID0gaW5kZXhcIlxuICAgICAgICAgICAgICBuZ0NsYXNzPVwie3sgcm93LnZhbHVlLmNsYXNzIH19XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgICAgICAgKHRhYmxlLmNvbmZpZy5yb3dzIHx8IHt9KVtyb3cua2V5XS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgICA/IHRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICAgIDogKHRhYmxlLmNvbmZpZy5yb3dzIHx8IHt9KVtyb3cua2V5XS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgPyB0cmFuc2Zvcm1EYXRhXG4gICAgICAgICAgICAgICAgICAgIDogcmF3RGF0YVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgIHJvdzogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgY29sdW1uOiByb3csXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh0YWJsZS5jb25maWcucm93cyB8fCB7fSlbcm93LmtleV0udHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6ICh0YWJsZS5jb25maWcucm93cyB8fCB7fSlbcm93LmtleV0udGVtcGxhdGVSZWYsXG4gICAgICAgICAgICAgICAgICBpbmRleDogdGFibGUuY29uZmlnLnJvd3MgPyB5IDogaSxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHRhYmxlLmRhdGFbKGN1cnJlbnRQYWdlJCB8IGFzeW5jKSB8fCAwXVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGJvZHk+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICA8dGJvZHk+XG4gICAgPHRyPlxuICAgICAgPHRkIGNsYXNzPVwicC0wXCIgW2NvbFNwYW5dPVwiY29sc3BhbiQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCIudGFibGUtbm8tZGF0YVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgI2hpZ2hsaWdodGVkXG4gIGxldC1yb3c9XCJyb3dcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCJcbiAgbGV0LXNlYXJjaD1cInNlYXJjaFwiXG4gIGxldC10cmFuc2Zvcm09XCJ0cmFuc2Zvcm1cIlxuPlxuICA8ZGl2XG4gICAgKm5nSWY9XCIhdHJhbnNmb3JtXCJcbiAgICBbaW5uZXJIVE1MXT1cInJvd1tjb2x1bW4ua2V5XSB8IGhpZ2hsaWdodDogc2VhcmNoXCJcbiAgPjwvZGl2PlxuICA8ZGl2XG4gICAgKm5nSWY9XCJ0cmFuc2Zvcm1cIlxuICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICByb3dbY29sdW1uLmtleV1cbiAgICAgICAgfCBkeW5hbWljUGlwZTogdHJhbnNmb3JtLnBpcGU6dHJhbnNmb3JtPy5hcmdzXG4gICAgICAgIHwgaGlnaGxpZ2h0OiBzZWFyY2hcbiAgICBcIlxuICA+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNyYXdEYXRhIGxldC1yb3c9XCJyb3dcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIHt7IHJvd1tjb2x1bW4ua2V5XSB9fVxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZVxuICAjdHJhbnNmb3JtRGF0YVxuICBsZXQtcm93PVwicm93XCJcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiXG4gIGxldC10cmFuc2Zvcm09XCJ0cmFuc2Zvcm1cIlxuICBsZXQtZGF0YT1cImRhdGFcIlxuPlxuICB7eyByb3dbY29sdW1uLmtleV0gfCBkeW5hbWljUGlwZTogdHJhbnNmb3JtLnBpcGU6dHJhbnNmb3JtPy5hcmdzIH19XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICN0cmFuc2Zvcm1Gb290ZXIgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtdHJhbnNmb3JtPVwidHJhbnNmb3JtXCI+XG4gIHt7XG4gICAgKHZhbHVlIHwgZHluYW1pY1BpcGU6IHRyYW5zZm9ybS5waXBlOnRyYW5zZm9ybT8uYXJncykgfHxcbiAgICAgICh0YWJsZUNvbmZpZyQgfCBhc3luYyk/LmZvb3Rlcj8uZW1wdHlDb250ZW50XG4gIH19XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNyYXdGb290ZXIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAge3sgdmFsdWUgfHwgKHRhYmxlQ29uZmlnJCB8IGFzeW5jKT8uZm9vdGVyPy5lbXB0eUNvbnRlbnQgfX1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlUmVmXG4gIGxldC1yb3c9XCJyb3dcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCJcbiAgbGV0LWluZGV4PVwiaW5kZXhcIlxuICBsZXQtdGVtcGxhdGVSZWY9XCJ0ZW1wbGF0ZVJlZlwiXG4gIGxldC1kYXRhPVwiZGF0YVwiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVJlZlwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sOiBjb2x1bW4sXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfVwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
324
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvY29yZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvY29yZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBRVosRUFBRSxFQUNGLGFBQWEsR0FDZCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE9BQU8sRUFDUCxPQUFPLEVBQ1AsSUFBSSxFQUNKLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEVBQ0gsY0FBYyxHQUNmLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLGtCQUFrQixHQUNuQixNQUFNLHVCQUF1QixDQUFDO0FBVS9CLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FB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Q2IsWUFBWSw0Q0FDWixTQUFTLDhDQUNULGdCQUFnQiwrSUFDaEIsU0FBUyx5Q0FDVCxXQUFXLCtDQUNYLGFBQWEsa0RBQ2IsT0FBTyxvRkFDUCxJQUFJLDZGQUNKLE9BQU87MkZBR0UsYUFBYTtrQkFwQnpCLFNBQVM7K0JBQ0UsdUJBQXVCLG1CQUVoQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixZQUFZO3dCQUNaLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixTQUFTO3dCQUNULFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixPQUFPO3dCQUNQLElBQUk7d0JBQ0osT0FBTztxQkFDUjs4QkFPWSxPQUFPO3NCQUFuQixLQUFLO2dCQUlGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBS08sVUFBVTtzQkFBdEIsS0FBSztnQkFhRixNQUFNO3NCQURULEtBQUs7Z0JBTUYsTUFBTTtzQkFEVCxLQUFLO2dCQU1GLElBQUk7c0JBRFAsS0FBSztnQkFLTyxTQUFTO3NCQUFyQixLQUFLO2dCQU9JLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFPRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFJlcGxheVN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVDb25maWcgfSBmcm9tICcuL21vZGVscy90YWJsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEFzeW5jUGlwZSxcbiAgS2V5VmFsdWUsXG4gIEtleVZhbHVlUGlwZSxcbiAgTmdDbGFzcyxcbiAgTmdGb3JPZixcbiAgTmdJZixcbiAgTmdUZW1wbGF0ZU91dGxldCxcbiAgU2xpY2VQaXBlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuL21vZGVscy90YWJsZS1jb2x1bW4uaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZSxcbiAgY2h1bmssXG4gIHNlYXJjaCxcbiAgc29ydE9uTXVsdGlwbGVLZXlzLFxufSBmcm9tICcuL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuaW1wb3J0IHsgVGFibGVSb3cgfSBmcm9tICcuL21vZGVscy90YWJsZS1yb3cuaW50ZXJmYWNlJztcbmltcG9ydCB7IEd0T3JkZXIsIEd0U29ydE9yZGVyIH0gZnJvbSAnLi9tb2RlbHMvdGFibGUtc29ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVNZXRhIH0gZnJvbSAnLi9tb2RlbHMvdGFibGUtbWV0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgR3RQYWdlQ2hhbmdlRXZlbnQsXG4gIEd0Um93Q2xpY2tFdmVudCxcbiAgR3RSb3dIb3ZlckV2ZW50LFxuICBHdFNvcnRFdmVudCxcbn0gZnJvbSAnLi9tb2RlbHMvdGFibGUtZXZlbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDYXBpdGFsQ2FzZVBpcGUgfSBmcm9tICcuL3BpcGVzL2NhcGl0YWwtY2FzZS5waXBlJztcbmltcG9ydCB7IFNvcnRDbGFzc1BpcGUgfSBmcm9tICcuL3BpcGVzL3NvcnQtY2xhc3MucGlwZSc7XG5pbXBvcnQgeyBEYXNoQ2FzZVBpcGUgfSBmcm9tICcuL3BpcGVzL2Rhc2gtY2FzZS5waXBlJztcbmltcG9ydCB7IER5bmFtaWNQaXBlIH0gZnJvbSAnLi9waXBlcy9keW5hbWljLnBpcGUnO1xuaW1wb3J0IHsgSGlnaGxpZ2h0UGlwZSB9IGZyb20gJy4vcGlwZXMvaGlnaGxpZ2h0LnBpcGUnO1xuaW1wb3J0IHsgR3RQYWdpbmF0aW9uSW5mbyB9IGZyb20gJy4vbW9kZWxzL2d0LXBhZ2luYXRpb24nO1xuaW1wb3J0IHsgVGFibGVJbmZvIH0gZnJvbSAnLi9tb2RlbHMvdGFibGUtaW5mby5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmd1bGFyLWdlbmVyaWMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29yZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ2FwaXRhbENhc2VQaXBlLFxuICAgIEtleVZhbHVlUGlwZSxcbiAgICBTb3J0Q2xhc3NQaXBlLFxuICAgIERhc2hDYXNlUGlwZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBTbGljZVBpcGUsXG4gICAgRHluYW1pY1BpcGUsXG4gICAgSGlnaGxpZ2h0UGlwZSxcbiAgICBOZ0NsYXNzLFxuICAgIE5nSWYsXG4gICAgTmdGb3JPZixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29yZUNvbXBvbmVudCB7XG4gIGdldCBzb3J0T3JkZXIkKCk6IE9ic2VydmFibGU8R3RTb3J0T3JkZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fc29ydE9yZGVyJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBsb2FkaW5nKGlzTG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9sb2FkaW5nJC5uZXh0KGlzTG9hZGluZyk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBhZ2luYXRpb25JbmRleChwYWdlSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRQYWdpbmF0aW9uSW5kZXgkLm5leHQocGFnZUluZGV4KTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmdJbmZvKHZhbHVlOiBHdFBhZ2luYXRpb25JbmZvIHwgbnVsbCkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fcGFnaW5nSW5mbyQubmV4dCh2YWx1ZSk7XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlLnBhZ2VDdXJyZW50ICE9PSB0aGlzLl9jdXJyZW50UGFnaW5hdGlvbkluZGV4JC5nZXRWYWx1ZSgpICsgMSAmJlxuICAgICAgICB2YWx1ZS5wYWdlQ3VycmVudCAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkluZGV4ID0gdmFsdWUucGFnZUN1cnJlbnQgLSAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWFyY2goc3RyaW5nOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlYXJjaEJ5JC5uZXh0KHN0cmluZyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgY29uZmlnKGNvbmZpZzogT2JzZXJ2YWJsZTxUYWJsZUNvbmZpZzxhbnk+PiB8IFRhYmxlQ29uZmlnPGFueT4pIHtcbiAgICB0aGlzLl90YWJsZUNvbmZpZyQubmV4dChjb25maWcpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGRhdGEoZGF0YTogT2JzZXJ2YWJsZTxBcnJheTxUYWJsZVJvdz4+IHwgQXJyYXk8VGFibGVSb3c+KSB7XG4gICAgdGhpcy5fZGF0YSQubmV4dChkYXRhKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzb3J0T3JkZXIoc29ydENvbmZpZzogR3RTb3J0T3JkZXI8VGFibGVSb3c+IHwgYW55KSB7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNvcnRDb25maWcpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLl9zb3J0T3JkZXIkLnZhbHVlKSkge1xuICAgICAgdGhpcy5zb3J0T3JkZXJDaGFuZ2UuZW1pdChzb3J0Q29uZmlnKTtcbiAgICAgIHRoaXMuX3NvcnRPcmRlciQubmV4dChzb3J0Q29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEd0Um93Q2xpY2tFdmVudD4oKTtcbiAgQE91dHB1dCgpIHNvcnRPcmRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3RTb3J0T3JkZXI8VGFibGVSb3c+PigpO1xuXG4gIF9yb3dDbGljayhyb3c6IFRhYmxlUm93LCBpbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMucm93Q2xpY2suZW1pdCh7IHJvdywgaW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcm93SG92ZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8R3RSb3dIb3ZlckV2ZW50PigxKTtcbiAgQE91dHB1dCgpIHJvd0hvdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxHdFJvd0hvdmVyRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5Tb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxHdFNvcnRFdmVudD4oKTtcbiAgLyoqIHBhZ2UgY2hhbmdlIGV2ZW50IC0gZW1pdHRlZCB3aGVuIGN1cnJlbnQgcGFnZS9pbmRleCBjaGFuZ2VzIGZvciBwYWdpbmF0aW9uICovXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHdFBhZ2VDaGFuZ2VFdmVudD4oKTtcbiAgcm93SG92ZXIkID0gdGhpcy5fcm93SG92ZXIkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgZGVib3VuY2VUaW1lKDUwKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgcSkgPT4gcC5pbmRleCA9PT0gcS5pbmRleCksXG4gICAgdGFwKChldmVudCkgPT4gdGhpcy5yb3dIb3Zlci5lbWl0KGV2ZW50KSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBob3ZlclJvdyhpZDogc3RyaW5nKTogdm9pZDtcbiAgaG92ZXJSb3coaW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIGhvdmVyUm93KG5vbmU6IG51bGwpOiB2b2lkO1xuICBob3ZlclJvdyhhcmc6IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZGF0YSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChkYXRhKSA9PiBkYXRhW2FyZ10pLFxuICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyb3cpID0+IHRoaXMuX2hvdmVyUm93KHJvdywgYXJnKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGhvdmVyIGJ5IGlkXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hvdmVyUm93KG51bGwsIG51bGwpO1xuICAgIH1cbiAgfVxuICBfaG92ZXJSb3coXG4gICAgcm93OiBUYWJsZVJvdyB8IG51bGwsXG4gICAgaW5kZXg6IG51bWJlciB8IG51bGwsXG4gICAgZXZlbnQ/OiBNb3VzZUV2ZW50XG4gICk6IHZvaWQge1xuICAgIHRoaXMuX3Jvd0hvdmVyJC5uZXh0KHsgcm93LCBpbmRleCwgZXZlbnQgfSk7XG4gIH1cblxuICBnZXQgbG9hZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmckLnBpcGUoXG4gICAgICBzdGFydFdpdGgoZmFsc2UpLFxuICAgICAgbWFwKCh2YWx1ZSkgPT4gKGlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZSA6IG9mKHZhbHVlKSkpLFxuICAgICAgc3dpdGNoTWFwKChvYnMpID0+IG9icyksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkaW5nJDogUmVwbGF5U3ViamVjdDxPYnNlcnZhYmxlPGJvb2xlYW4+IHwgYm9vbGVhbj4gPVxuICAgIG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBwcml2YXRlIF9zb3J0T3JkZXIkOiBCZWhhdmlvclN1YmplY3Q8R3RTb3J0T3JkZXI+ID1cbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PEd0U29ydE9yZGVyPihbXSk7XG4gIHByaXZhdGUgX3NlYXJjaEJ5JDogUmVwbGF5U3ViamVjdDxPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgc3RyaW5nIHwgbnVsbD4gPVxuICAgIG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBzZWFyY2hCeSQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gPSB0aGlzLl9zZWFyY2hCeSQucGlwZShcbiAgICBzdGFydFdpdGgoJycpLFxuICAgIG1hcCgodmFsdWUpID0+IChpc09ic2VydmFibGUodmFsdWUpID8gdmFsdWUgOiBvZih2YWx1ZSkpKSxcbiAgICBzd2l0Y2hNYXAoKG9icykgPT4gb2JzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHByaXZhdGUgX3BhZ2luZ0luZm8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHdFBhZ2luYXRpb25JbmZvPih7XG4gICAgcGFnZUN1cnJlbnQ6IG51bGwsXG4gICAgcGFnZU5leHQ6IG51bGwsXG4gICAgcGFnZVByZXZpb3VzOiBudWxsLFxuICAgIHBhZ2VTaXplOiBudWxsLFxuICAgIG51bWJlck9mUmVjb3JkczogbnVsbCxcbiAgICAvL3JlY29yZHNBZnRlckZpbHRlcjogbnVsbCxcbiAgICAvL3JlY29yZHNBZnRlclNlYXJjaDogbnVsbCxcbiAgICAvL3JlY29yZHNBbGw6IG51bGwsXG4gIH0pO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByaXZhdGUgX3RhYmxlQ29uZmlnJDogQmVoYXZpb3JTdWJqZWN0PFxuICAgIFRhYmxlQ29uZmlnPGFueT4gfCBPYnNlcnZhYmxlPFRhYmxlQ29uZmlnPGFueT4+XG4gID4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgdGFibGVDb25maWckID0gdGhpcy5fdGFibGVDb25maWckLnBpcGUoXG4gICAgbWFwKCh2YWx1ZSkgPT4gKGlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZSA6IG9mKHZhbHVlKSkpLFxuICAgIHN3aXRjaE1hcCgob2JzKSA9PiBvYnMpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcHJpdmF0ZSBfZGF0YSQ6IFJlcGxheVN1YmplY3Q8QXJyYXk8VGFibGVSb3c+IHwgT2JzZXJ2YWJsZTxBcnJheTxUYWJsZVJvdz4+PiA9XG4gICAgbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIGRhdGEkOiBPYnNlcnZhYmxlPEFycmF5PFRhYmxlUm93Pj4gPSB0aGlzLl9kYXRhJC5waXBlKFxuICAgIG1hcCgodmFsdWUpID0+IChpc09ic2VydmFibGUodmFsdWUpID8gdmFsdWUgOiBvZih2YWx1ZSkpKSxcbiAgICBzd2l0Y2hNYXAoKG9icykgPT4gY29tYmluZUxhdGVzdChbb2JzXSkpLFxuICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMudGFibGVDb25maWckKSxcbiAgICBtYXAoKFtbZGF0YV0sIGNvbmZpZ10pID0+IHtcbiAgICAgIC8vIGlmIGNvbHVtbnMgb3Igcm93cyBjb250YWlucyBjb25maWcgZm9yIG1hcFRvLi4uXG4gICAgICBpZiAoXG4gICAgICAgIChjb25maWcuY29sdW1ucyAmJlxuICAgICAgICAgICEhT2JqZWN0LnZhbHVlcyhjb25maWcuY29sdW1ucykuZmluZCgoY29sdW1uKSA9PiAhIWNvbHVtbi5tYXBUbykpIHx8XG4gICAgICAgIChjb25maWcucm93cyAmJlxuICAgICAgICAgICEhT2JqZWN0LnZhbHVlcyhjb25maWcucm93cykuZmluZCgoY29sdW1uKSA9PiAhIWNvbHVtbi5tYXBUbykpXG4gICAgICApIHtcbiAgICAgICAgLy8gLi4ubWFwIGRhdGEgdG8gbmV3IGtleXMgb24gcm93Li4uXG4gICAgICAgIGNvbnN0IG5ld0RhdGE6IFRhYmxlUm93W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgcm93ID0gZGF0YVtpXTtcbiAgICAgICAgICBjb25zdCBuZXdLZXlzID0gT2JqZWN0LmVudHJpZXMoY29uZmlnLmNvbHVtbnMgfHwgY29uZmlnLnJvd3MgfHwgW10pXG4gICAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+ICEhdmFsdWUubWFwVG8pIC8vIGFkZCBrZXlzIGZvciBjb2x1bW5zIHdpdGggbWFwVG8gY29uZmlnLi4uXG4gICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAocHJldmlvdXNWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICAgICAgW2tleV06IHRoaXMubmVzdGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5tYXBUbyEucGF0aCxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLm1hcFRvPy5taXNzaW5nVmFsdWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgbmV3RGF0YVtpXSA9IHsgLi4ucm93LCAuLi5uZXdLZXlzIH07XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IG5ld0RhdGE7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhLCBjb25maWcgfTtcbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoKG9icykgPT5cbiAgICAgIGNvbWJpbmVMYXRlc3QoW29mKG9icyksIHRoaXMuc29ydE9yZGVyJCwgdGhpcy5zZWFyY2hCeSRdKVxuICAgICksXG4gICAgbWFwKChbdGFibGUsIHNvcnRCeSwgc2VhcmNoQnldKSA9PiB7XG4gICAgICAvLyBjcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIGFuZCBzb3J0IG5ldyBhcnJheSAocHJldmVudCBtdXRhdGluZyBleGlzdGluZyBzdGF0ZSlcbiAgICAgIHRhYmxlLmRhdGEgPSBbLi4udGFibGUuZGF0YV07XG4gICAgICByZXR1cm4gIXNvcnRCeT8ubGVuZ3RoIHx8IHRhYmxlLmNvbmZpZz8uZGlzYWJsZVRhYmxlU29ydFxuICAgICAgICA/IHNlYXJjaEJ5ICYmICF0aGlzLnRhYmxlSW5mbz8ubGF6eUxvYWRlZFxuICAgICAgICAgID8gc2VhcmNoKHNlYXJjaEJ5LCBmYWxzZSwgdGFibGUuZGF0YSwgdGFibGUuY29uZmlnKVxuICAgICAgICAgIDogdGFibGUuZGF0YVxuICAgICAgICA6IHNlYXJjaEJ5ICYmICF0aGlzLnRhYmxlSW5mbz8ubGF6eUxvYWRlZFxuICAgICAgICA/IHNlYXJjaChzZWFyY2hCeSwgZmFsc2UsIHRhYmxlLmRhdGEsIHRhYmxlLmNvbmZpZyk/LnNvcnQoXG4gICAgICAgICAgICBzb3J0T25NdWx0aXBsZUtleXMoc29ydEJ5KVxuICAgICAgICAgIClcbiAgICAgICAgOiB0YWJsZS5kYXRhPy5zb3J0KHNvcnRPbk11bHRpcGxlS2V5cyhzb3J0QnkpKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNhbGN1bGF0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGEkLCB0aGlzLnRhYmxlQ29uZmlnJF0pLnBpcGUoXG4gICAgbWFwKChbZGF0YSwgY29uZmlnXSkgPT4gY2FsY3VsYXRlKGRhdGEsIGNvbmZpZykpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgdGFibGUkOiBPYnNlcnZhYmxlPFRhYmxlTWV0YT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRhdGEkLFxuICAgIHRoaXMudGFibGVDb25maWckLFxuICAgIHRoaXMuX3BhZ2luZ0luZm8kLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NvcnRlZCwgY29uZmlnLCBwYWdpbmdJbmZvXSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYWdpbmdJbmZvLnBhZ2VDdXJyZW50ICE9PSBudWxsICYmXG4gICAgICAgIHBhZ2luZ0luZm8ubnVtYmVyT2ZSZWNvcmRzICE9PSBudWxsICYmXG4gICAgICAgIHBhZ2luZ0luZm8ucGFnZVNpemUgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IFtzb3J0ZWRdLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBpbmZvOiA8VGFibGVJbmZvPntcbiAgICAgICAgICAgIGxhenlMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICBudW1iZXJPZlJlY29yZHM6IHBhZ2luZ0luZm8ubnVtYmVyT2ZSZWNvcmRzLFxuICAgICAgICAgICAgcGFnZVNpemU6IHBhZ2luZ0luZm8ucGFnZVNpemUsXG4gICAgICAgICAgICBwYWdlVG90YWw6XG4gICAgICAgICAgICAgIHBhZ2luZ0luZm8ucGFnZVRvdGFsID8/XG4gICAgICAgICAgICAgIE1hdGguY2VpbChwYWdpbmdJbmZvLm51bWJlck9mUmVjb3JkcyAvIHBhZ2luZ0luZm8ucGFnZVNpemUpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBpZiBwYWdpbmF0aW9uIGlzIGRpc2FibGVkLi4uXG4gICAgICBpZiAoIWNvbmZpZy5wYWdpbmF0aW9uIHx8IGNvbmZpZy5wYWdpbmF0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyAuLi5yZXR1cm4gdW5hbHRlcmVkIGFycmF5XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogW3NvcnRlZF0sXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGluZm86IDxUYWJsZUluZm8+eyBudW1iZXJPZlJlY29yZHM6IHNvcnRlZC5sZW5ndGgsIHBhZ2VUb3RhbDogMSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHJlY29yZCBzZXRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNodW5rKHNvcnRlZCwgKyhjb25maWcucGFnaW5hdGlvbi5sZW5ndGggfHwgMCkpLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZm86IDxUYWJsZUluZm8+e1xuICAgICAgICAgIG51bWJlck9mUmVjb3Jkczogc29ydGVkLmxlbmd0aCxcbiAgICAgICAgICBwYWdlVG90YWw6IE1hdGguY2VpbChcbiAgICAgICAgICAgIHNvcnRlZC5sZW5ndGggLyArKGNvbmZpZy5wYWdpbmF0aW9uLmxlbmd0aCB8fCAwKVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pLFxuICAgIHRhcCgobWV0YSkgPT4gdGhpcy5fdGFibGVJbmZvJC5uZXh0KG1ldGEuaW5mbykpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqIHRhYmxlSW5mbyQgLSByZXR1cm5zIG9ic2VydmFibGUgZm9yIHRhYmxlIGluZm9cbiAgICogQHJldHVybiBPYnNlcnZhYmxlPFRhYmxlSW5mbz4gKi9cbiAgZ2V0IHRhYmxlSW5mbyQoKTogT2JzZXJ2YWJsZTxUYWJsZUluZm8gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvJC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgZmlsdGVyKChpbmZvKSA9PiAhIWluZm8pLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqIHRhYmxlSW5mbyAtIHJldHVybnMgdGhlIGN1cnJlbnQgdGFibGUgaW5mb1xuICAgKiBAcmV0dXJuIFRhYmxlSW5mbyAqL1xuICBnZXQgdGFibGVJbmZvKCk6IFRhYmxlSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mbyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RhYmxlSW5mbyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhYmxlSW5mbyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9jdXJyZW50UGFnaW5hdGlvbkluZGV4JDogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4gPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG4gIGN1cnJlbnRQYWdpbmF0aW9uSW5kZXgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fY3VycmVudFBhZ2luYXRpb25JbmRleCQsXG4gICAgdGhpcy50YWJsZSQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbcGFnZSwgdGFibGVdOiBhbnkpID0+IHtcbiAgICAgIC8vIGRldGVybWluZSBsYXN0IHBhZ2VcbiAgICAgIGNvbnN0IGxhc3RQYWdlID1cbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIHRhYmxlLmluZm8ucmVjb3JkcyAvXG4gICAgICAgICAgICAodGFibGUuaW5mby5yZWNvcmRMZW5ndGggPz9cbiAgICAgICAgICAgICAgKHRhYmxlLmNvbmZpZz8ucGFnaW5hdGlvbj8ubGVuZ3RoIHx8IHRhYmxlLmluZm8ucmVjb3JkcykpXG4gICAgICAgICkgLSAxO1xuICAgICAgLy8gZGV0ZXJtaW5lIG1pbi9tYXggcG9zaXRpb25cbiAgICAgIHJldHVybiArcGFnZSA8IDAgPyAwIDogK3BhZ2UgPiBsYXN0UGFnZSA/IGxhc3RQYWdlIDogK3BhZ2U7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICB0YXAoKGluZGV4KSA9PiB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IGluZGV4IH0pKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNvbHNwYW4kID0gdGhpcy50YWJsZUNvbmZpZyQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGNvbmZpZykgPT5cbiAgICAgIGNvbmZpZy5jb2x1bW5zXG4gICAgICAgID8gb2YoXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGNvbmZpZy5jb2x1bW5zIHx8IGNvbmZpZy5yb3dzIHx8IHt9KS5maWx0ZXIoXG4gICAgICAgICAgICAgICh2YWx1ZSkgPT4gdmFsdWUuaGlkZGVuICE9PSB0cnVlXG4gICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgOiB0aGlzLmRhdGEkLnBpcGUobWFwKChkYXRhKSA9PiBkYXRhLmxlbmd0aCArIDEpKVxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICBmb290ZXJDb2xzcGFuJCA9IHRoaXMudGFibGVDb25maWckLnBpcGUoXG4gICAgbWFwKChjb25maWcpID0+IHtcbiAgICAgIGxldCBjb2xzcGFuID0gMDtcbiAgICAgIE9iamVjdC52YWx1ZXMoY29uZmlnPy5mb290ZXI/LmNvbHVtbnMgfHwge30pLmZvckVhY2goKGNhbGN1bGF0aW9ucykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhjYWxjdWxhdGlvbnMpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSBmYWxzZSlcbiAgICAgICAgICAgIC5sZW5ndGggPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb2xzcGFuICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0sIHt9KTtcbiAgICAgIHJldHVybiBjb2xzcGFuO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgLyoqIHNvcnRCeUtleSAtIFNvcnQgYnkga2V5IGluIHRhYmxlIHJvd1xuICAgKiBAcGFyYW0ga2V5IC0ga2V5IHRvIHNvcnQgYnlcbiAgICogQHBhcmFtIHsgTW91c2VFdmVudCB9IFskZXZlbnRdIC0gTW91c2UgZXZlbnQgdHJpZ2dlcmluZyBzb3J0LCBpZiBzaGlmdCBrZXkgaXMgcHJlc3NlZCBzb3J0IGtleSB3aWxsIGJlIGFkZGVkIHRvIGFscmVhZHkgcHJlc2VudCBzb3J0IGtleXNcbiAgICovXG4gIHNvcnRCeUtleShrZXk6IGtleW9mIFRhYmxlUm93LCAkZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2hpZnRLZXkgPSAkZXZlbnQ/LnNoaWZ0S2V5ID09PSB0cnVlO1xuICAgIGNvbnN0IGN1cnJlbnRPcmRlciA9IHRoaXMuX3NvcnRPcmRlciQudmFsdWU7XG4gICAgbGV0IHNvcnRPcmRlcjogR3RPcmRlciA9ICdhc2MnO1xuICAgIGxldCBuZXdPcmRlcjogR3RTb3J0T3JkZXIgPSBbXTtcbiAgICAvLyBpZiBzaGlmdCBrZXkgaXMgcHJlc3NlZCB3aGlsZSBzb3J0aW5nLi4uXG4gICAgaWYgKHNoaWZ0S2V5KSB7XG4gICAgICAvLyAuLi5jaGVjayBpZiBrZXkgaXMgYWxyZWFkeSBzb3J0ZWRcbiAgICAgIGNvbnN0IGV4aXN0aW5nU29ydFBvc2l0aW9uID0gY3VycmVudE9yZGVyLmZpbmRJbmRleChcbiAgICAgICAgKHZhbHVlKSA9PiB2YWx1ZS5rZXkgPT09IGtleVxuICAgICAgKTtcbiAgICAgIGlmIChleGlzdGluZ1NvcnRQb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgLy8gLi4uaWYga2V5IGlzIG5vdCBzb3J0ZWQsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBzb3J0IG9yZGVyXG4gICAgICAgIG5ld09yZGVyID0gWy4uLmN1cnJlbnRPcmRlciwgeyBrZXksIG9yZGVyOiAnYXNjJyB9XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIC4uLmlmIGtleSBpcyBhbHJlYWR5IHNvcnRlZCwgdG9nZ2xlIHNvcnQgb3JkZXJcbiAgICAgICAgc29ydE9yZGVyID0gY3VycmVudE9yZGVyW2V4aXN0aW5nU29ydFBvc2l0aW9uXS5vcmRlcjtcbiAgICAgICAgY29uc3QgbmV3U29ydE9yZGVyID0gc29ydE9yZGVyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xuICAgICAgICBuZXdPcmRlciA9IFsuLi5jdXJyZW50T3JkZXJdO1xuICAgICAgICBuZXdPcmRlcltleGlzdGluZ1NvcnRQb3NpdGlvbl0gPSB7XG4gICAgICAgICAgLi4ubmV3T3JkZXJbZXhpc3RpbmdTb3J0UG9zaXRpb25dLFxuICAgICAgICAgIG9yZGVyOiBuZXdTb3J0T3JkZXIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIC4uLmVsc2UgaWYgc2hpZnQga2V5IGlzIG5vdCBwcmVzc2VkLi4uXG4gICAgICBpZiAoY3VycmVudE9yZGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gLi4uY2hlY2sgaWYga2V5IGlzIGFscmVhZHkgc29ydGVkXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU29ydFBvc2l0aW9uID0gY3VycmVudE9yZGVyLmZpbmRJbmRleChcbiAgICAgICAgICAodmFsdWUpID0+IHZhbHVlLmtleSA9PT0ga2V5XG4gICAgICAgICk7XG4gICAgICAgIC8vIC4uLmlmIGtleSBpcyBhbHJlYWR5IHNvcnRlZCwgdG9nZ2xlIHNvcnQgb3JkZXJcbiAgICAgICAgaWYgKGV4aXN0aW5nU29ydFBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICAgIG5ld09yZGVyID0gW3sga2V5LCBvcmRlcjogJ2FzYycgfV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29ydE9yZGVyID0gY3VycmVudE9yZGVyW2V4aXN0aW5nU29ydFBvc2l0aW9uXS5vcmRlcjtcbiAgICAgICAgICBjb25zdCBuZXdTb3J0T3JkZXIgPSBzb3J0T3JkZXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgICAgICAgbmV3T3JkZXIgPSBbeyBrZXksIG9yZGVyOiBuZXdTb3J0T3JkZXIgfV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIC4uLmlmIGtleSBpcyBub3Qgc29ydGVkIHNldCBzb3J0IG9yZGVyIGZvciBrZXkgdG8gYXNjZW5kaW5nXG4gICAgICAgIG5ld09yZGVyID0gW3sga2V5LCBvcmRlcjogc29ydE9yZGVyIH1dO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjcmVhdGUgc29ydCBldmVudFxuICAgIGNvbnN0IHNvcnRFdmVudDogR3RTb3J0RXZlbnQgPSB7XG4gICAgICBrZXksXG4gICAgICBvcmRlcjogc29ydE9yZGVyLFxuICAgICAgY3VycmVudFNvcnRPcmRlcjogbmV3T3JkZXIsXG4gICAgICBhZGRTb3J0S2V5OiBzaGlmdEtleSxcbiAgICB9O1xuXG4gICAgLy8gaWYgZXZlbnQgaXMgcGFzc2VkIHRvIHNvcnQgZnVuY3Rpb24uLi5cbiAgICBpZiAoJGV2ZW50KSB7XG4gICAgICAvLyAuLi5lbWl0IGl0IGFzIHdlbGxcbiAgICAgIHNvcnRFdmVudC5ldmVudCA9ICRldmVudDtcbiAgICB9XG4gICAgLy8gZW1pdCBzb3J0IGV2ZW50XG4gICAgdGhpcy5jb2x1bW5Tb3J0LmVtaXQoc29ydEV2ZW50KTtcblxuICAgIC8vIGlmIHRhYmxlIGlzIG5vdCBsYXp5IGxvYWRlZCAoc29ydGluZyBpcyB0aGVuIGhhbmRsZWQgc2VydmVyLXNpZGUpLi4uXG4gICAgaWYgKCF0aGlzLnRhYmxlSW5mbz8ubGF6eUxvYWRlZCkge1xuICAgICAgLy8gLi4udXBkYXRlIHNvcnQgb3JkZXJcbiAgICAgIHRoaXMuc29ydE9yZGVyID0gbmV3T3JkZXI7XG4gICAgfVxuICB9XG5cbiAgY29sdW1uT3JkZXIgPSAoXG4gICAgYTogS2V5VmFsdWU8c3RyaW5nLCBUYWJsZUNvbHVtbj4sXG4gICAgYjogS2V5VmFsdWU8c3RyaW5nLCBUYWJsZUNvbHVtbj5cbiAgKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gKGEudmFsdWUub3JkZXIgfHwgMCkgLSAoYi52YWx1ZS5vcmRlciB8fCAwKTtcbiAgfTtcblxuICBuZXN0ZWRWYWx1ZShcbiAgICBvYmplY3Q6IGFueSxcbiAgICBtYXBUbzogc3RyaW5nLFxuICAgIG1pc3NpbmdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgKTogdW5rbm93biB7XG4gICAgY29uc3QgbGV2ZWxzID0gbWFwVG8uc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gbGV2ZWxzLnJlZHVjZShcbiAgICAgIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUsIGluZGV4KSA9PlxuICAgICAgICBwcmV2aW91c1ZhbHVlW2N1cnJlbnRWYWx1ZV0gfHxcbiAgICAgICAgKGluZGV4ID09PSBsZXZlbHMubGVuZ3RoIC0gMSA/IG1pc3NpbmdWYWx1ZSA6IHt9KSxcbiAgICAgIG9iamVjdFxuICAgICk7XG4gIH1cbn1cbiIsIjx0YWJsZVxuICBbbmdDbGFzc109XCIodGFibGVDb25maWckIHwgYXN5bmMpPy5jbGFzcyB8fCAndGFibGUnXCJcbiAgW2NsYXNzLnRhYmxlLW1vYmlsZV09XCIodGFibGVDb25maWckIHwgYXN5bmMpPy5tb2JpbGVMYXlvdXRcIlxuICBbY2xhc3MudGFibGUtaG9yaXpvbnRhbF09XCIodGFibGVDb25maWckIHwgYXN5bmMpPy5yb3dzXCJcbiAgW2NsYXNzLnRhYmxlLWxvYWRpbmddPVwibG9hZGluZyQgfCBhc3luY1wiXG4gIFtjbGFzcy5ndC1zdGlja3ktcm93LWhlYWRlcl09XCJcbiAgICAodGFibGVDb25maWckIHwgYXN5bmMpPy5zdGlja3lIZWFkZXJzPy5yb3cgJiYgKHRhYmxlQ29uZmlnJCB8IGFzeW5jKT8ucm93c1xuICBcIlxuICBbY2xhc3MuZ3Qtc3RpY2t5LWNvbHVtbi1oZWFkZXJdPVwiXG4gICAgKHRhYmxlQ29uZmlnJCB8IGFzeW5jKT8uc3RpY2t5SGVhZGVycz8uY29sdW1uXG4gIFwiXG4gIFthdHRyLmFyaWEtYnVzeV09XCIobG9hZGluZyQgfCBhc3luYykgPT09IHRydWUgPyB0cnVlIDogbnVsbFwiXG4+XG4gIDx0aGVhZD5cbiAgICA8dHJcbiAgICAgICpuZ0lmPVwie1xuICAgICAgICBjb25maWc6ICh0YWJsZUNvbmZpZyQgfCBhc3luYykhLFxuICAgICAgICBpc0xvYWRpbmc6IGxvYWRpbmckIHwgYXN5bmNcbiAgICAgIH0gYXMgdGFibGVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0YWJsZS5jb25maWc/LmNvbHVtbnMgfCBrZXl2YWx1ZTogY29sdW1uT3JkZXJcIlxuICAgICAgPlxuICAgICAgICA8dGhcbiAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4udmFsdWU/LmhpZGRlblwiXG4gICAgICAgICAgbmdDbGFzcz1cInt7IChjb2x1bW4ua2V5IHwgZGFzaENhc2UpICsgJy1jb2x1bW4nIH19IHt7XG4gICAgICAgICAgICBjb2x1bW4udmFsdWUuY2xhc3NcbiAgICAgICAgICB9fVwiXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInRhYmxlLmlzTG9hZGluZ1wiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cInNvcnRPcmRlciQgfCBhc3luYyB8IHNvcnRDbGFzczogY29sdW1uLmtleTonYXJpYSdcIlxuICAgICAgICAgIFtjbGFzcy5ndC1zb3J0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImNvbHVtbi52YWx1ZT8uc29ydGFibGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zb3J0LW9yZGVyXT1cIlxuICAgICAgICAgICAgICBzb3J0T3JkZXIkIHwgYXN5bmMgfCBzb3J0Q2xhc3M6IGNvbHVtbi5rZXk6J29yZGVyJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3Qtc29ydFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgIHRhYmxlLmlzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAgICFjb2x1bW4udmFsdWUuc29ydGFibGUgfHxcbiAgICAgICAgICAgICAgICBzb3J0QnlLZXkoY29sdW1uLmtleSwgJGV2ZW50KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbHVtbi52YWx1ZT8uaGVhZGVyICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgIGNvbHVtbi52YWx1ZS5oZWFkZXIgfHwgY29sdW1uLmtleSB8IGNhcGl0YWxDYXNlXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLnZhbHVlPy5zb3J0YWJsZSAmJiBjb2x1bW4udmFsdWU/LmhlYWRlciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgPnt7IGNvbHVtbi52YWx1ZS5oZWFkZXIgfHwgY29sdW1uLmtleSB8IGNhcGl0YWxDYXNlIH19PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgKCh0YWJsZT8uY29uZmlnPy5yb3dzIHwga2V5dmFsdWU6IGNvbHVtbk9yZGVyKSB8fCBbXSlbMF0gYXMgaGVhZGVyUm93XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDx0aFxuICAgICAgICAgIGNsYXNzPVwicm93LWhlYWRlclwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cIlxuICAgICAgICAgICAgc29ydE9yZGVyJCB8IGFzeW5jIHwgc29ydENsYXNzOiBoZWFkZXJSb3cua2V5OidhcmlhJ1xuICAgICAgICAgIFwiXG4gICAgICAgICAgbmdDbGFzcz1cInt7IGhlYWRlclJvdy52YWx1ZS5zb3J0YWJsZSA/ICdzb3J0ICcgOiAnJyB9fSB7e1xuICAgICAgICAgICAgc29ydE9yZGVyJCB8IGFzeW5jIHwgc29ydENsYXNzOiBoZWFkZXJSb3cua2V5XG4gICAgICAgICAgfX0ge3sgKGhlYWRlclJvdy5rZXkgfCBkYXNoQ2FzZSkgKyAnLWNvbHVtbicgfX1cIlxuICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgIHRhYmxlLmlzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAhaGVhZGVyUm93LnZhbHVlLnNvcnRhYmxlIHx8XG4gICAgICAgICAgICAgIHNvcnRCeUtleShoZWFkZXJSb3cua2V5LCAkZXZlbnQpXG4gICAgICAgICAgXCJcbiAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyUm93Py52YWx1ZT8uaGVhZGVyICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICBoZWFkZXJSb3c/LnZhbHVlPy5oZWFkZXIgfHwgaGVhZGVyUm93LmtleSB8IGNhcGl0YWxDYXNlXG4gICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRoXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiAoKHRhYmxlJCB8IGFzeW5jKT8uZGF0YSB8fCBbXSlbMF1cIlxuICAgICAgICAgIG5nQ2xhc3M9XCJ7eyBoZWFkZXJSb3cudmFsdWUuY2xhc3MgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiXG4gICAgICAgICAgICAgICh0YWJsZS5jb25maWcucm93cyB8fCB7fSlbaGVhZGVyUm93LmtleV0udGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICA/IHRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgOiAodGFibGUuY29uZmlnLnJvd3MgfHwge30pW2hlYWRlclJvdy5rZXldLnRyYW5zZm9ybVxuICAgICAgICAgICAgICAgID8gdHJhbnNmb3JtRGF0YVxuICAgICAgICAgICAgICAgIDogcmF3RGF0YVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgIHJvdzogY29sdW1uLFxuICAgICAgICAgICAgICBjb2x1bW46IGhlYWRlclJvdyxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAodGFibGUuY29uZmlnLnJvd3MgfHwge30pW2hlYWRlclJvdy5rZXldLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6ICh0YWJsZS5jb25maWcucm93cyB8fCB7fSlbaGVhZGVyUm93LmtleV0udGVtcGxhdGVSZWYsXG4gICAgICAgICAgICAgIGluZGV4OiAwXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHkgKm5nSWY9XCJsb2FkaW5nJCB8IGFzeW5jOyBlbHNlIHRhYmxlQ29udGVudFwiPlxuICAgIDx0cj5cbiAgICAgIDx0ZCBjbGFzcz1cInAtMFwiIFtjb2xTcGFuXT1cImNvbHNwYW4kIHwgYXN5bmNcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLnRhYmxlLWxvYWRpbmdcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG4gIDx0Zm9vdCAqbmdJZj1cIih0YWJsZSQgfCBhc3luYykhIGFzIHRhYmxlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYmxlLmRhdGEubGVuZ3RoID4gMCAmJiAhKGxvYWRpbmckIHwgYXN5bmMpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGNhbGN1bGF0aW9ucyQgfCBhc3luYykhIGFzIGNhbGN1bGF0aW9uc1wiPlxuICAgICAgICA8dHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY2FsY3VsYXRpb24gb2YgY2FsY3VsYXRpb25zLmNhbGN1bGF0aW9uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIntcbiAgICAgICAgICAgICAgc2hvd0hlYWRlcjogKGNvbHNwYW4kIHwgYXN5bmMpICE9PSAoZm9vdGVyQ29sc3BhbiQgfCBhc3luYylcbiAgICAgICAgICAgIH0gYXMgZm9vdGVyUm93XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgKm5nSWY9XCJmb290ZXJSb3cuc2hvd0hlYWRlclwiXG4gICAgICAgICAgICAgIFtjb2xTcGFuXT1cIlxuICAgICAgICAgICAgICAgICgoY29sc3BhbiQgfCBhc3luYykgfHwgMCkgLSAoKGZvb3RlckNvbHNwYW4kIHwgYXN5bmMpIHx8IDApXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIHNjb3BlPVwicm93XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidGFibGUuY29uZmlnPy5mb290ZXI/LmhlYWRlcnM/LltjYWxjdWxhdGlvbl0gYXMgc2hvd0hlYWRlclwiXG4gICAgICAgICAgICAgICAgPnt7c2hvd0hlYWRlciA9PT0gdHJ1ZSA/IChjYWxjdWxhdGlvbiB8IGNhcGl0YWxDYXNlKTogdGFibGUuY29uZmlnLmZvb3Rlcj8uaGVhZGVycz8uW2NhbGN1bGF0aW9uXX19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbiBvZiB0YWJsZS5jb25maWc/LmNvbHVtbnMgfCBrZXl2YWx1ZTogY29sdW1uT3JkZXJcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICFjb2x1bW4udmFsdWU/LmhpZGRlbiAmJiBjYWxjdWxhdGlvbnMuY2FsY3VsYXRlZFtjb2x1bW4ua2V5XVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgbmdDbGFzcz1cInt7IChjb2x1bW4ua2V5IHwgZGFzaENhc2UpICsgJy1jb2x1bW4nIH19IHt7XG4gICAgICAgICAgICAgICAgICBjb2x1bW4udmFsdWUuY2xhc3NcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1oZWFkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAhZm9vdGVyUm93LnNob3dIZWFkZXIgJiYgdGFibGUuY29uZmlnLmZvb3Rlcj8uaGVhZGVycz8uW2NhbGN1bGF0aW9uXVxuICAgICAgICAgICAgICAgICAgICA/IHRhYmxlLmNvbmZpZy5mb290ZXI/LmhlYWRlcnM/LltjYWxjdWxhdGlvbl0gPT09IHRydWUgPyAoY2FsY3VsYXRpb24gfCBjYXBpdGFsQ2FzZSkgOiB0YWJsZS5jb25maWcuZm9vdGVyPy5oZWFkZXJzPy5bY2FsY3VsYXRpb25dXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbmZpZy5tb2JpbGVMYXlvdXQgJiYgY29sdW1uLnZhbHVlLm1vYmlsZUhlYWRlclxuICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi52YWx1ZS5tb2JpbGVIZWFkZXIgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi52YWx1ZS5tb2JpbGVIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICA6IChjb2x1bW4udmFsdWUuaGVhZGVyIHx8IGNvbHVtbi5rZXkgfCBjYXBpdGFsQ2FzZSlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZ3Qtbm8tY29udGVudF09XCJcbiAgICAgICAgICAgICAgICAgICFjYWxjdWxhdGlvbnMuY2FsY3VsYXRlZFtjb2x1bW4ua2V5XVtjYWxjdWxhdGlvbl1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiXG4gICAgICAgICAgICAgICAgICAgICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV0udGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgICA/IHRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICAgICAgOiAodGFibGUuY29uZmlnLmNvbHVtbnMgfHwge30pW2NvbHVtbi5rZXldLnRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgID8gdHJhbnNmb3JtRm9vdGVyXG4gICAgICAgICAgICAgICAgICAgICAgOiByYXdGb290ZXJcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2FsY3VsYXRpb25zLmNhbGN1bGF0ZWRbY29sdW1uLmtleV1bY2FsY3VsYXRpb25dLFxuICAgICAgICAgICAgICAgICAgICByb3c6IGNhbGN1bGF0aW9ucy5jYWxjdWxhdGVkW2NvbHVtbi5rZXldLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNhbGN1bGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZjogKHRhYmxlLmNvbmZpZy5jb2x1bW5zIHx8IHt9KVtjb2x1bW4ua2V5XVxuICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAodGFibGUuY29uZmlnLmNvbHVtbnMgfHwge30pW2NvbHVtbi5rZXldXG4gICAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90Zm9vdD5cbjwvdGFibGU+XG48bmctdGVtcGxhdGUgI3RhYmxlQ29udGVudD5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih0YWJsZSQgfCBhc3luYykhIGFzIHRhYmxlXCI+XG4gICAgPHRib2R5ICpuZ0lmPVwiKHRhYmxlIS5kYXRhIVswXSB8fCB0YWJsZSEuZGF0YSEpLmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGUuY29uZmlnLmNvbHVtbnNcIj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICBsZXQgcm93IG9mIHRhYmxlIS5kYXRhIVtcbiAgICAgICAgICAgICAgdGFibGUuaW5mby5sYXp5TG9hZGVkID8gMCA6IChjdXJyZW50UGFnaW5hdGlvbkluZGV4JCB8IGFzeW5jKSB8fCAwXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2F0dHIuaWRdPVwiJ3RhYmxlUm93XycgKyBpXCJcbiAgICAgICAgICAoY2xpY2spPVwidGFibGU/LmNvbmZpZz8ucm93Q2xpY2sgJiYgX3Jvd0NsaWNrKHJvdywgaSwgJGV2ZW50KVwiXG4gICAgICAgICAgKG1vdXNlb3Zlcik9XCJ0YWJsZT8uY29uZmlnPy5yb3dIb3ZlciAmJiBfaG92ZXJSb3cocm93LCBpLCAkZXZlbnQpXCJcbiAgICAgICAgICAobW91c2VvdXQpPVwidGFibGU/LmNvbmZpZz8ucm93SG92ZXIgJiYgX2hvdmVyUm93KG51bGwsIG51bGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5ndC1ob3Zlcl09XCIocm93SG92ZXIkIHwgYXN5bmMpPy5pbmRleCA9PT0gaVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHRhYmxlLmNvbmZpZz8uY29sdW1ucyB8IGtleXZhbHVlOiBjb2x1bW5PcmRlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi52YWx1ZT8uaGlkZGVuXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7IChjb2x1bW4ua2V5IHwgZGFzaENhc2UpICsgJy1jb2x1bW4nIH19IHt7XG4gICAgICAgICAgICAgICAgY29sdW1uLnZhbHVlLmNsYXNzXG4gICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcubW9iaWxlTGF5b3V0ICYmIGNvbHVtbi52YWx1ZS5tb2JpbGVIZWFkZXJcbiAgICAgICAgICAgICAgICAgID8gY29sdW1uLnZhbHVlLm1vYmlsZUhlYWRlciAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi52YWx1ZS5tb2JpbGVIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgOiAoY29sdW1uLnZhbHVlLmhlYWRlciB8fCBjb2x1bW4ua2V5IHwgY2FwaXRhbENhc2UpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaEJ5JCB8IGFzeW5jKSAmJlxuICAgICAgICAgICAgICAgICAgISh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV0udGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgPyBoaWdobGlnaHRlZFxuICAgICAgICAgICAgICAgICAgICA6ICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV0udGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgPyB0ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgICA6ICh0YWJsZS5jb25maWcuY29sdW1ucyB8fCB7fSlbY29sdW1uLmtleV0udHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgID8gdHJhbnNmb3JtRGF0YVxuICAgICAgICAgICAgICAgICAgICA6IHJhd0RhdGFcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgc2VhcmNoOiAoc2VhcmNoQnkkIHwgYXN5bmMpLFxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAodGFibGUuY29uZmlnLmNvbHVtbnMgfHwge30pW2NvbHVtbi5rZXldLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiAodGFibGUuY29uZmlnLmNvbHVtbnMgfHwge30pW2NvbHVtbi5rZXldXG4gICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgZGF0YTogdGFibGUuZGF0YVtcbiAgICAgICAgICAgICAgICAgICAgdGFibGUuaW5mby5sYXp5TG9hZGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgOiAoY3VycmVudFBhZ2luYXRpb25JbmRleCQgfCBhc3luYykgfHwgMFxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGUuY29uZmlnLnJvd3NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IHJvdyBvZiB0YWJsZT8uY29uZmlnPy5yb3dzIHwga2V5dmFsdWU6IGNvbHVtbk9yZGVyIHwgc2xpY2U6IDE7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgKm5nSWY9XCIhcm93LnZhbHVlPy5oaWRkZW5cIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ3RhYmxlUm93XycgKyBpXCJcbiAgICAgICAgICAgIG5nQ2xhc3M9XCJ7eyAocm93LmtleSB8IGRhc2hDYXNlKSArICctcm93JyB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidGFibGU/LmNvbmZpZz8ucm93Q2xpY2sgJiYgX3Jvd0NsaWNrKHJvdywgaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VvdmVyKT1cInRhYmxlPy5jb25maWc/LnJvd0hvdmVyICYmIF9ob3ZlclJvdyhyb3csIGksICRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlb3V0KT1cIlxuICAgICAgICAgICAgICB0YWJsZT8uY29uZmlnPy5yb3dIb3ZlciAmJiBfaG92ZXJSb3cobnVsbCwgbnVsbCwgJGV2ZW50KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtjbGFzcy5ndC1ob3Zlcl09XCIocm93SG92ZXIkIHwgYXN5bmMpPy5pbmRleCA9PT0gaVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwicm93LWhlYWRlclwiIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICAgIHt7IHJvdy52YWx1ZS5oZWFkZXIgfHwgcm93LmtleSB8IGNhcGl0YWxDYXNlIH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgKHRhYmxlPy5kYXRhIHx8IFtdKVswXTsgbGV0IHkgPSBpbmRleFwiXG4gICAgICAgICAgICAgIG5nQ2xhc3M9XCJ7eyByb3cudmFsdWUuY2xhc3MgfX1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiXG4gICAgICAgICAgICAgICAgICAodGFibGUuY29uZmlnLnJvd3MgfHwge30pW3Jvdy5rZXldLnRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICAgID8gdGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgOiAodGFibGUuY29uZmlnLnJvd3MgfHwge30pW3Jvdy5rZXldLnRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICA/IHRyYW5zZm9ybURhdGFcbiAgICAgICAgICAgICAgICAgICAgOiByYXdEYXRhXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgcm93OiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICBjb2x1bW46IHJvdyxcbiAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKHRhYmxlLmNvbmZpZy5yb3dzIHx8IHt9KVtyb3cua2V5XS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlZjogKHRhYmxlLmNvbmZpZy5yb3dzIHx8IHt9KVtyb3cua2V5XS50ZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgICAgIGluZGV4OiB0YWJsZS5jb25maWcucm93cyA/IHkgOiBpLFxuICAgICAgICAgICAgICAgICAgZGF0YTogdGFibGUuZGF0YVtcbiAgICAgICAgICAgICAgICAgICAgdGFibGUuaW5mby5sYXp5TG9hZGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgOiAoY3VycmVudFBhZ2luYXRpb25JbmRleCQgfCBhc3luYykgfHwgMFxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGJvZHk+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICA8dGJvZHk+XG4gICAgPHRyPlxuICAgICAgPHRkIGNsYXNzPVwicC0wXCIgW2NvbFNwYW5dPVwiY29sc3BhbiQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCIudGFibGUtbm8tZGF0YVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgI2hpZ2hsaWdodGVkXG4gIGxldC1yb3c9XCJyb3dcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCJcbiAgbGV0LXNlYXJjaD1cInNlYXJjaFwiXG4gIGxldC10cmFuc2Zvcm09XCJ0cmFuc2Zvcm1cIlxuPlxuICA8ZGl2XG4gICAgKm5nSWY9XCIhdHJhbnNmb3JtXCJcbiAgICBbaW5uZXJIVE1MXT1cInJvd1tjb2x1bW4ua2V5XSB8IGhpZ2hsaWdodDogc2VhcmNoXCJcbiAgPjwvZGl2PlxuICA8ZGl2XG4gICAgKm5nSWY9XCJ0cmFuc2Zvcm1cIlxuICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICByb3dbY29sdW1uLmtleV1cbiAgICAgICAgfCBkeW5hbWljUGlwZTogdHJhbnNmb3JtLnBpcGU6dHJhbnNmb3JtPy5hcmdzXG4gICAgICAgIHwgaGlnaGxpZ2h0OiBzZWFyY2hcbiAgICBcIlxuICA+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNyYXdEYXRhIGxldC1yb3c9XCJyb3dcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIHt7IHJvd1tjb2x1bW4ua2V5XSB9fVxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZVxuICAjdHJhbnNmb3JtRGF0YVxuICBsZXQtcm93PVwicm93XCJcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiXG4gIGxldC10cmFuc2Zvcm09XCJ0cmFuc2Zvcm1cIlxuICBsZXQtZGF0YT1cImRhdGFcIlxuPlxuICB7eyByb3dbY29sdW1uLmtleV0gfCBkeW5hbWljUGlwZTogdHJhbnNmb3JtLnBpcGU6dHJhbnNmb3JtPy5hcmdzIH19XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICN0cmFuc2Zvcm1Gb290ZXIgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtdHJhbnNmb3JtPVwidHJhbnNmb3JtXCI+XG4gIHt7XG4gICAgKHZhbHVlIHwgZHluYW1pY1BpcGU6IHRyYW5zZm9ybS5waXBlOnRyYW5zZm9ybT8uYXJncykgfHxcbiAgICAgICh0YWJsZUNvbmZpZyQgfCBhc3luYyk/LmZvb3Rlcj8uZW1wdHlDb250ZW50XG4gIH19XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNyYXdGb290ZXIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAge3sgdmFsdWUgfHwgKHRhYmxlQ29uZmlnJCB8IGFzeW5jKT8uZm9vdGVyPy5lbXB0eUNvbnRlbnQgfX1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlUmVmXG4gIGxldC1yb3c9XCJyb3dcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCJcbiAgbGV0LWluZGV4PVwiaW5kZXhcIlxuICBsZXQtdGVtcGxhdGVSZWY9XCJ0ZW1wbGF0ZVJlZlwiXG4gIGxldC1kYXRhPVwiZGF0YVwiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVJlZlwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sOiBjb2x1bW4sXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfVwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3QtcGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9tb2RlbHMvZ3QtcGFnaW5hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBHdFBhZ2luYXRpb25DbGFzc2VzIHtcbiAgbmF2Pzogc3RyaW5nO1xuICB1bD86IHN0cmluZztcbiAgbGk/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3QtcGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9tb2RlbHMvZ3QtcGFnaW5hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBHdFBhZ2luYXRpb25DbGFzc2VzIHtcbiAgbmF2Pzogc3RyaW5nO1xuICB1bD86IHN0cmluZztcbiAgbGk/OiBzdHJpbmc7XG4gIGJ1dHRvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdFBhZ2luYXRpb25BcmlhTGFiZWxzIHtcbiAgbmF2OiBzdHJpbmc7XG4gIGJ1dHRvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd0UGFnaW5hdGlvbkluZm8ge1xuICBwYWdlTmV4dDogbnVtYmVyIHwgbnVsbDtcbiAgcGFnZUN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gIHBhZ2VQcmV2aW91czogbnVtYmVyIHwgbnVsbDtcbiAgcGFnZVNpemU6IG51bWJlciB8IG51bGw7XG4gIG51bWJlck9mUmVjb3JkczogbnVtYmVyIHwgbnVsbDtcbiAgcGFnZVRvdGFsPzogbnVtYmVyIHwgbnVsbDtcbn1cbiJdfQ==
|