@wemake4u/form-player-se 1.0.9 → 1.0.10

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.
@@ -0,0 +1,483 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { PaginationModule, ClientSideRowModelModule, InfiniteRowModelModule, LocaleModule, CellStyleModule, TextFilterModule, NumberFilterModule, DateFilterModule, themeQuartz, iconSetAlpine, ClientSideRowModelApiModule, ColumnAutoSizeModule, ColumnApiModule } from 'ag-grid-community';
3
+ import { AG_GRID_LOCALE_IT } from '@ag-grid-community/locale';
4
+ import { ObjectURLRendererComponent, DeleteRowCellRenderer, ActionsCellRenderer } from '../utils/gridCells';
5
+ import { SetFilterComponent } from '../utils/setFilter';
6
+ import { isRecord, isLabeledRecord, isNumericKey } from '../common/record';
7
+ import { getLabelSymbol } from '../common/symbols';
8
+ import { Texts } from '../locale/locale-it';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../services/formatter.service";
11
+ import * as i2 from "../services/programmability.service";
12
+ export class GridService {
13
+ formatter;
14
+ programmability;
15
+ constructor(formatter, programmability) {
16
+ this.formatter = formatter;
17
+ this.programmability = programmability;
18
+ }
19
+ getGridModules() {
20
+ return [
21
+ ClientSideRowModelModule,
22
+ InfiniteRowModelModule,
23
+ PaginationModule,
24
+ LocaleModule,
25
+ CellStyleModule,
26
+ ClientSideRowModelApiModule,
27
+ TextFilterModule,
28
+ NumberFilterModule,
29
+ DateFilterModule,
30
+ ColumnAutoSizeModule,
31
+ ColumnApiModule
32
+ ];
33
+ }
34
+ ;
35
+ getGridOptions(component, formGroup) {
36
+ const columnDefs = this.getGridColumns(component, formGroup);
37
+ const pagination = this.getGridPaginable(component);
38
+ const pageSize = this.getGridPageSize(component);
39
+ const texts = this.getGridTexts();
40
+ const theme = this.getGridTheme();
41
+ return {
42
+ defaultColDef: {
43
+ floatingFilter: (component.floatingFilter === true),
44
+ headerClass: (component.floatingFilter === true)
45
+ ? 'show-filter' : 'hide-filter'
46
+ },
47
+ dataTypeDefinitions: this.getDataTypeDefinitions(),
48
+ columnDefs: columnDefs,
49
+ pagination: pagination,
50
+ paginationPageSize: pageSize,
51
+ cacheBlockSize: pageSize,
52
+ paginationPageSizeSelector: [5, 10, 20, 50],
53
+ localeText: texts,
54
+ enableCellTextSelection: true,
55
+ theme: theme,
56
+ onGridReady: (params) => {
57
+ params.api.autoSizeColumns(["actions"]);
58
+ }
59
+ };
60
+ }
61
+ getGridColumns(component, formGroup) {
62
+ if (Array.isArray(component.columns)) {
63
+ const columns = component.columns.map((column) => {
64
+ const colDef = {
65
+ field: column.key,
66
+ headerName: column.label,
67
+ };
68
+ this.setCellDataType(column, colDef);
69
+ const map = this.getMap(column, colDef, formGroup);
70
+ this.setCellRenderer(column, colDef, map);
71
+ this.setResizable(column, colDef);
72
+ this.setSortable(column, colDef);
73
+ this.setFilter(column, colDef, map);
74
+ this.setFilterParams(column, colDef, map);
75
+ this.setSuppressMovable(column, colDef);
76
+ this.setFlex(column, colDef);
77
+ this.setAlign(column, colDef);
78
+ this.setPinned(column, colDef);
79
+ this.setWidth(column, colDef);
80
+ this.setValueFormatter(column, colDef, map);
81
+ return colDef;
82
+ });
83
+ if (Array.isArray(component.actions) && component.actions.length > 0) {
84
+ columns.push({
85
+ colId: 'actions',
86
+ headerName: Texts.Actions,
87
+ resizable: false,
88
+ cellDataType: false,
89
+ pinned: "right",
90
+ cellRendererParams: {
91
+ component: component,
92
+ formGroup: formGroup
93
+ },
94
+ cellRenderer: ActionsCellRenderer,
95
+ suppressKeyboardEvent: this.navigateInsideCell
96
+ });
97
+ }
98
+ return columns;
99
+ }
100
+ else {
101
+ return [];
102
+ }
103
+ }
104
+ setCellDataType(column, colDef) {
105
+ if (typeof column.dataType === "string"
106
+ && column.dataType.trim() !== ""
107
+ && column.dataType !== "auto") {
108
+ colDef.cellDataType = column.dataType;
109
+ }
110
+ }
111
+ setCellRenderer(column, colDef, map) {
112
+ if (column.format === "objectURL") {
113
+ colDef.cellRenderer = ObjectURLRendererComponent;
114
+ }
115
+ if (column.format === "deleteRow") {
116
+ colDef.cellRenderer = DeleteRowCellRenderer;
117
+ }
118
+ if (colDef.cellDataType === "boolean" && map) {
119
+ colDef.cellRenderer = (params) => {
120
+ return this.formatMap(params.value, map);
121
+ };
122
+ }
123
+ }
124
+ setResizable(column, colDef) {
125
+ colDef.resizable = (column.resize === true);
126
+ }
127
+ setSortable(column, colDef) {
128
+ colDef.sortable = (column.sort === true);
129
+ }
130
+ setFilter(column, colDef, map) {
131
+ if (column.filter === true) {
132
+ colDef.filter = true;
133
+ if (map) {
134
+ colDef.filter = SetFilterComponent;
135
+ }
136
+ }
137
+ }
138
+ setFilterParams(column, colDef, map) {
139
+ const filterParams = {};
140
+ if (column.dataType === 'uuid') {
141
+ this.setUuidFilterParams(filterParams);
142
+ }
143
+ else if (column.dataType === 'integer') {
144
+ this.setIntegerFilterParams(filterParams);
145
+ }
146
+ else if (column.dataType === 'date') {
147
+ this.setDateFilterParams(filterParams);
148
+ }
149
+ else if (column.dataType === 'boolean') {
150
+ this.setBooleanFilterParams(filterParams);
151
+ }
152
+ if (map) {
153
+ filterParams.map = map;
154
+ }
155
+ colDef.filterParams = filterParams;
156
+ }
157
+ setUuidFilterParams(filterParams) {
158
+ filterParams.filterOptions = ['equals', 'notEqual'];
159
+ }
160
+ setIntegerFilterParams(filterParams) {
161
+ filterParams.allowedCharPattern = '\\d';
162
+ }
163
+ setDateFilterParams(filterParams) {
164
+ filterParams.comparator = (filterLocalDateAtMidnight, cellValue) => {
165
+ if (!cellValue)
166
+ return -1;
167
+ const cellDate = new Date(cellValue);
168
+ if (isNaN(cellDate.getTime()))
169
+ return -1;
170
+ const cellDateNoTime = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());
171
+ if (cellDateNoTime < filterLocalDateAtMidnight)
172
+ return -1;
173
+ if (cellDateNoTime > filterLocalDateAtMidnight)
174
+ return 1;
175
+ return 0;
176
+ };
177
+ }
178
+ setBooleanFilterParams(filterParams) {
179
+ filterParams.filterOptions = [
180
+ {
181
+ displayKey: 'includeAll',
182
+ displayName: Texts.ChooseOne,
183
+ numberOfInputs: 0,
184
+ predicate: ([filter], value) => true
185
+ },
186
+ {
187
+ displayKey: 'true',
188
+ displayName: Texts.True,
189
+ numberOfInputs: 0,
190
+ predicate: ([filter], value) => value === true
191
+ },
192
+ {
193
+ displayKey: 'false',
194
+ displayName: Texts.False,
195
+ numberOfInputs: 0,
196
+ predicate: ([filter], value) => value === false
197
+ },
198
+ {
199
+ displayKey: 'blank',
200
+ displayName: Texts.Blank,
201
+ numberOfInputs: 0,
202
+ predicate: ([filter], value) => value === null
203
+ },
204
+ {
205
+ displayKey: 'notBlank',
206
+ displayName: Texts.NotBlank,
207
+ numberOfInputs: 0,
208
+ predicate: ([filter], value) => value !== null
209
+ },
210
+ ];
211
+ filterParams.suppressAndOrCondition = true;
212
+ }
213
+ setSuppressMovable(column, colDef) {
214
+ if (!(column.move === true)) {
215
+ colDef.suppressMovable = true;
216
+ }
217
+ }
218
+ setFlex(column, colDef) {
219
+ if (column.flex === true) {
220
+ colDef.flex = 1;
221
+ }
222
+ }
223
+ setAlign(column, colDef) {
224
+ if (column.align === "left") {
225
+ colDef.cellStyle = { textAlign: 'left' };
226
+ }
227
+ else if (column.align === "center") {
228
+ colDef.cellStyle = { textAlign: 'center' };
229
+ }
230
+ else if (column.align === "right") {
231
+ colDef.cellStyle = { textAlign: 'right' };
232
+ }
233
+ }
234
+ setPinned(column, colDef) {
235
+ if (typeof column.pinned === "string") {
236
+ colDef.pinned = column.pinned;
237
+ }
238
+ }
239
+ setWidth(column, colDef) {
240
+ if (typeof column.width === "number") {
241
+ colDef.width = column.width;
242
+ }
243
+ if (typeof column.minWidth === "number") {
244
+ colDef.minWidth = column.minWidth;
245
+ }
246
+ if (typeof column.maxWidth === "number") {
247
+ colDef.maxWidth = column.maxWidth;
248
+ }
249
+ }
250
+ setValueFormatter(column, colDef, map) {
251
+ if (map) {
252
+ colDef.valueFormatter = (params) => this.formatMap(params.value, map);
253
+ }
254
+ }
255
+ getGridPaginable(component) {
256
+ return (typeof component.rowCount === 'number' && component.rowCount > 0);
257
+ }
258
+ getGridPageSize(component) {
259
+ if (typeof component.rowCount === 'number') {
260
+ return component.rowCount;
261
+ }
262
+ }
263
+ getGridTexts() {
264
+ return {
265
+ ...AG_GRID_LOCALE_IT,
266
+ "pageSizeSelectorLabel": "Elementi per pagina:",
267
+ "to": "-",
268
+ };
269
+ }
270
+ getGridTheme() {
271
+ return themeQuartz
272
+ .withPart(iconSetAlpine)
273
+ .withParams({
274
+ backgroundColor: "#FAFAFA",
275
+ borderColor: "#D9E4F7",
276
+ browserColorScheme: "light",
277
+ cellTextColor: "#00121A",
278
+ columnBorder: true,
279
+ fontFamily: "inherit",
280
+ fontSize: 16,
281
+ headerBackgroundColor: "#002460",
282
+ headerColumnBorder: true,
283
+ headerColumnResizeHandleColor: "#F2F6FC",
284
+ headerColumnResizeHandleWidth: 2,
285
+ headerFontSize: 16,
286
+ headerFontWeight: 600,
287
+ headerRowBorder: false,
288
+ headerTextColor: "#F2F6FC",
289
+ rowBorder: true
290
+ });
291
+ }
292
+ getDataTypeDefinitions() {
293
+ return {
294
+ uuid: {
295
+ baseDataType: 'text',
296
+ extendsDataType: 'text'
297
+ },
298
+ date: {
299
+ baseDataType: 'dateString',
300
+ extendsDataType: 'dateString',
301
+ dateParser: (value) => {
302
+ return value ? new Date(value) : undefined;
303
+ },
304
+ valueFormatter: params => {
305
+ return this.formatter.formatDate(params.value);
306
+ }
307
+ },
308
+ dateTime: {
309
+ baseDataType: 'dateString',
310
+ extendsDataType: 'dateString',
311
+ dateParser: (value) => {
312
+ return value ? new Date(value) : undefined;
313
+ },
314
+ valueFormatter: params => {
315
+ return this.formatter.formatDateTime(params.value);
316
+ }
317
+ },
318
+ currency: {
319
+ extendsDataType: 'number',
320
+ baseDataType: 'number',
321
+ valueFormatter: params => params.value == null
322
+ ? ''
323
+ : this.formatter.formatCurrency(params.value)
324
+ },
325
+ integer: {
326
+ extendsDataType: 'number',
327
+ baseDataType: 'number',
328
+ valueFormatter: params => params.value == null
329
+ ? ''
330
+ : this.formatter.formatInteger(params.value)
331
+ },
332
+ percentage: {
333
+ extendsDataType: 'number',
334
+ baseDataType: 'number',
335
+ valueFormatter: params => params.value == null
336
+ ? ''
337
+ : `${Math.round(params.value * 100)}%`,
338
+ },
339
+ flags: {
340
+ extendsDataType: 'number',
341
+ baseDataType: 'number'
342
+ }
343
+ };
344
+ }
345
+ getMap(column, colDef, formGroup) {
346
+ const allowed = (colDef.cellDataType === "boolean"
347
+ || colDef.cellDataType === "text"
348
+ || colDef.cellDataType === "number"
349
+ || colDef.cellDataType === "flags");
350
+ if (allowed && column.map) {
351
+ const map = this.programmability.evaluate(formGroup, column.mapValues);
352
+ const valid = isRecord(map, key => typeof key === 'string' || typeof key === 'number', val => typeof val === 'string');
353
+ if (!valid)
354
+ return null;
355
+ if (colDef.cellDataType === "flags") {
356
+ map[getLabelSymbol] = (key) => this.formatFlags(key, map);
357
+ }
358
+ return map;
359
+ }
360
+ else {
361
+ return null;
362
+ }
363
+ }
364
+ formatMap(value, map) {
365
+ if (value == null) {
366
+ return '';
367
+ }
368
+ if (map) {
369
+ var result = map[value];
370
+ if (result === undefined) {
371
+ const labeled = isLabeledRecord(map, key => typeof key === 'string' || typeof key === 'number', val => typeof val === 'string', getLabelSymbol);
372
+ if (labeled) {
373
+ result = map[getLabelSymbol](value);
374
+ }
375
+ }
376
+ return result ?? value.toString();
377
+ }
378
+ else {
379
+ return value.toString();
380
+ }
381
+ }
382
+ formatFlags(value, map) {
383
+ if (typeof value === 'number' &&
384
+ isRecord(map, isNumericKey, val => typeof val === 'string')) {
385
+ if (value == 0) {
386
+ return map[0] ?? "0";
387
+ }
388
+ const availableFlags = Object.keys(map)
389
+ .map(Number)
390
+ .filter(flag => flag !== 0);
391
+ const flags = availableFlags.filter(flag => (value & flag) === flag);
392
+ const sumFlags = flags.reduce((sum, f) => sum | f, 0);
393
+ if ((value & sumFlags) !== value) {
394
+ return null;
395
+ }
396
+ return flags
397
+ .map(flag => map[flag])
398
+ .filter((label) => !!label)
399
+ .join(', ');
400
+ }
401
+ else {
402
+ return null;
403
+ }
404
+ }
405
+ navigateInsideCell({ event }) {
406
+ const GRID_CELL_CLASSNAME = "ag-cell";
407
+ const { key, shiftKey } = event;
408
+ const path = this.getEventPath(event);
409
+ const isTabForward = key === "Tab" && shiftKey === false;
410
+ const isTabBackward = key === "Tab" && shiftKey === true;
411
+ let suppressEvent = false;
412
+ // Handle cell children tabbing
413
+ if (isTabForward || isTabBackward) {
414
+ const eGridCell = path.find((el) => {
415
+ if (el.classList === undefined)
416
+ return false;
417
+ return el.classList.contains(GRID_CELL_CLASSNAME);
418
+ });
419
+ if (!eGridCell) {
420
+ return suppressEvent;
421
+ }
422
+ const focusableChildrenElements = this.getAllFocusableElementsOf(eGridCell);
423
+ const lastCellChildEl = focusableChildrenElements[focusableChildrenElements.length - 1];
424
+ const firstCellChildEl = focusableChildrenElements[0];
425
+ // Suppress keyboard event if tabbing forward within the cell and the current focused element is not the last child
426
+ if (focusableChildrenElements.length === 0) {
427
+ return false;
428
+ }
429
+ const currentIndex = focusableChildrenElements.indexOf(document.activeElement);
430
+ if (isTabForward) {
431
+ const isLastChildFocused = lastCellChildEl && document.activeElement === lastCellChildEl;
432
+ if (!isLastChildFocused) {
433
+ suppressEvent = true;
434
+ if (currentIndex !== -1 || document.activeElement === eGridCell) {
435
+ event.preventDefault();
436
+ focusableChildrenElements[currentIndex + 1].focus();
437
+ }
438
+ }
439
+ }
440
+ // Suppress keyboard event if tabbing backwards within the cell, and the current focused element is not the first child
441
+ else {
442
+ const cellHasFocusedChildren = eGridCell.contains(document.activeElement) &&
443
+ eGridCell !== document.activeElement;
444
+ // Manually set focus to the last child element if cell doesn't have focused children
445
+ if (!cellHasFocusedChildren) {
446
+ lastCellChildEl.focus();
447
+ // Cancel keyboard press, so that it doesn't focus on the last child and then pass through the keyboard press to
448
+ // move to the 2nd last child element
449
+ event.preventDefault();
450
+ }
451
+ const isFirstChildFocused = firstCellChildEl && document.activeElement === firstCellChildEl;
452
+ if (!isFirstChildFocused) {
453
+ suppressEvent = true;
454
+ if (currentIndex !== -1 || document.activeElement === eGridCell) {
455
+ event.preventDefault();
456
+ focusableChildrenElements[currentIndex - 1].focus();
457
+ }
458
+ }
459
+ }
460
+ }
461
+ return suppressEvent;
462
+ }
463
+ getEventPath(event) {
464
+ const path = [];
465
+ let currentTarget = event.target;
466
+ while (currentTarget) {
467
+ path.push(currentTarget);
468
+ currentTarget = currentTarget.parentElement;
469
+ }
470
+ return path;
471
+ }
472
+ getAllFocusableElementsOf(el) {
473
+ return Array.from(el.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')).filter((focusableEl) => {
474
+ return focusableEl.tabIndex !== -1 && !focusableEl.hasAttribute('disabled');
475
+ });
476
+ }
477
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridService, deps: [{ token: i1.FormatterService }, { token: i2.ProgrammabilityService }], target: i0.ɵɵFactoryTarget.Injectable });
478
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridService });
479
+ }
480
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GridService, decorators: [{
481
+ type: Injectable
482
+ }], ctorParameters: () => [{ type: i1.FormatterService }, { type: i2.ProgrammabilityService }] });
483
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNpcmlvL3NyYy9saWIvc2VydmljZXMvZ3JpZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNHLGdCQUFnQixFQUFFLHdCQUF3QixFQUFFLHNCQUFzQixFQUN4RSxZQUFZLEVBQUUsZUFBZSxFQUM3QixnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFDOUMsV0FBVyxFQUFFLGFBQWEsRUFDbEMsMkJBQTJCLEVBQ1gsb0JBQW9CLEVBQUUsZUFBZSxFQUV4RCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTlELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzVHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFLNUMsTUFBTSxPQUFPLFdBQVc7SUFFRjtJQUNWO0lBRFYsWUFBb0IsU0FBMkIsRUFDckMsZUFBdUM7UUFEN0IsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDckMsb0JBQWUsR0FBZixlQUFlLENBQXdCO0lBQ2pELENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTztZQUNMLHdCQUF3QjtZQUN0QixzQkFBc0I7WUFDdEIsZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixlQUFlO1lB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QUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFZO1FBQy9CLE1BQU0sSUFBSSxHQUFrQixFQUFFLENBQUM7UUFDL0IsSUFBSSxhQUFhLEdBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN0QyxPQUFPLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekIsYUFBYSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLHlCQUF5QixDQUFDLEVBQWU7UUFDL0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUNmLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FDakIsMEVBQTBFLENBQzNFLENBQ0YsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN2QixPQUFPLFdBQVcsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F6aEJVLFdBQVc7NEdBQVgsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBNb2R1bGUsIFBhZ2luYXRpb25Nb2R1bGUsIENsaWVudFNpZGVSb3dNb2RlbE1vZHVsZSwgSW5maW5pdGVSb3dNb2RlbE1vZHVsZVxyXG4gICwgTG9jYWxlTW9kdWxlLCBDZWxsU3R5bGVNb2R1bGUsIFZhbGlkYXRpb25Nb2R1bGVcclxuICAsIFRleHRGaWx0ZXJNb2R1bGUsIE51bWJlckZpbHRlck1vZHVsZSwgRGF0ZUZpbHRlck1vZHVsZVxyXG4gICwgQ29sRGVmLCB0aGVtZVF1YXJ0eiwgaWNvblNldEFscGluZSwgR3JpZE9wdGlvbnMsIERhdGFUeXBlRGVmaW5pdGlvblxyXG4gICwgQ2xpZW50U2lkZVJvd01vZGVsQXBpTW9kdWxlXHJcbiAgLCBHcmlkUmVhZHlFdmVudCwgQ29sdW1uQXV0b1NpemVNb2R1bGUsIENvbHVtbkFwaU1vZHVsZVxyXG4gICwgU3VwcHJlc3NLZXlib2FyZEV2ZW50UGFyYW1zXHJcbn0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xyXG5pbXBvcnQgeyBBR19HUklEX0xPQ0FMRV9JVCB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9sb2NhbGUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9iamVjdFVSTFJlbmRlcmVyQ29tcG9uZW50LCBEZWxldGVSb3dDZWxsUmVuZGVyZXIsIEFjdGlvbnNDZWxsUmVuZGVyZXIgfSBmcm9tICcuLi91dGlscy9ncmlkQ2VsbHMnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZm9ybWF0dGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9ncmFtbWFiaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZ3JhbW1hYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXRGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi91dGlscy9zZXRGaWx0ZXInO1xyXG5pbXBvcnQgeyBpc1JlY29yZCwgaXNMYWJlbGVkUmVjb3JkLCBpc051bWVyaWNLZXkgfSBmcm9tICcuLi9jb21tb24vcmVjb3JkJztcclxuaW1wb3J0IHsgZ2V0TGFiZWxTeW1ib2wgfSBmcm9tICcuLi9jb21tb24vc3ltYm9scyc7XHJcbmltcG9ydCB7IFRleHRzIH0gZnJvbSAnLi4vbG9jYWxlL2xvY2FsZS1pdCc7XHJcblxyXG50eXBlIE1hcFR5cGUgPSBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBzdHJpbmc+IHwgbnVsbDtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEdyaWRTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtYXR0ZXI6IEZvcm1hdHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHByb2dyYW1tYWJpbGl0eTogUHJvZ3JhbW1hYmlsaXR5U2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZE1vZHVsZXMoKTogTW9kdWxlW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgQ2xpZW50U2lkZVJvd01vZGVsTW9kdWxlXHJcbiAgICAgICwgSW5maW5pdGVSb3dNb2RlbE1vZHVsZVxyXG4gICAgICAsIFBhZ2luYXRpb25Nb2R1bGVcclxuICAgICAgLCBMb2NhbGVNb2R1bGVcclxuICAgICAgLCBDZWxsU3R5bGVNb2R1bGVcclxuICAgICAgLCBDbGllbnRTaWRlUm93TW9kZWxBcGlNb2R1bGVcclxuICAgICAgLCBUZXh0RmlsdGVyTW9kdWxlXHJcbiAgICAgICwgTnVtYmVyRmlsdGVyTW9kdWxlXHJcbiAgICAgICwgRGF0ZUZpbHRlck1vZHVsZVxyXG4gICAgICAsIENvbHVtbkF1dG9TaXplTW9kdWxlXHJcbiAgICAgICwgQ29sdW1uQXBpTW9kdWxlICAgICAgXHJcbiAgICBdO1xyXG4gIH07XHJcblxyXG4gIGdldEdyaWRPcHRpb25zKGNvbXBvbmVudDogYW55LCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IEdyaWRPcHRpb25zIHtcclxuICAgIGNvbnN0IGNvbHVtbkRlZnMgPSB0aGlzLmdldEdyaWRDb2x1bW5zKGNvbXBvbmVudCwgZm9ybUdyb3VwKTtcclxuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB0aGlzLmdldEdyaWRQYWdpbmFibGUoY29tcG9uZW50KTtcclxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5nZXRHcmlkUGFnZVNpemUoY29tcG9uZW50KTtcclxuICAgIGNvbnN0IHRleHRzID0gdGhpcy5nZXRHcmlkVGV4dHMoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gdGhpcy5nZXRHcmlkVGhlbWUoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRlZmF1bHRDb2xEZWY6IHtcclxuICAgICAgICBmbG9hdGluZ0ZpbHRlcjogKGNvbXBvbmVudC5mbG9hdGluZ0ZpbHRlciA9PT0gdHJ1ZSksXHJcbiAgICAgICAgaGVhZGVyQ2xhc3M6IChjb21wb25lbnQuZmxvYXRpbmdGaWx0ZXIgPT09IHRydWUpXHJcbiAgICAgICAgICA/ICdzaG93LWZpbHRlcicgOiAnaGlkZS1maWx0ZXInXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGFUeXBlRGVmaW5pdGlvbnM6IHRoaXMuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpLFxyXG4gICAgICBjb2x1bW5EZWZzOiBjb2x1bW5EZWZzLFxyXG4gICAgICBwYWdpbmF0aW9uOiBwYWdpbmF0aW9uLFxyXG4gICAgICBwYWdpbmF0aW9uUGFnZVNpemU6IHBhZ2VTaXplLFxyXG4gICAgICBjYWNoZUJsb2NrU2l6ZTogcGFnZVNpemUsXHJcbiAgICAgIHBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yOiBbNSwgMTAsIDIwLCA1MF0sXHJcbiAgICAgIGxvY2FsZVRleHQ6IHRleHRzLFxyXG4gICAgICBlbmFibGVDZWxsVGV4dFNlbGVjdGlvbjogdHJ1ZSxcclxuICAgICAgdGhlbWU6IHRoZW1lLFxyXG4gICAgICBvbkdyaWRSZWFkeTogKHBhcmFtczogR3JpZFJlYWR5RXZlbnQpID0+IHtcclxuICAgICAgICBwYXJhbXMuYXBpLmF1dG9TaXplQ29sdW1ucyhbXCJhY3Rpb25zXCJdKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JpZENvbHVtbnMoY29tcG9uZW50OiBhbnksIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogQ29sRGVmW10ge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LmNvbHVtbnMpKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBjb21wb25lbnQuY29sdW1ucy5tYXAoKGNvbHVtbjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICAgICAgICBmaWVsZDogY29sdW1uLmtleSxcclxuICAgICAgICAgIGhlYWRlck5hbWU6IGNvbHVtbi5sYWJlbCxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q2VsbERhdGFUeXBlKGNvbHVtbiwgY29sRGVmKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5nZXRNYXAoY29sdW1uLCBjb2xEZWYsIGZvcm1Hcm91cCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q2VsbFJlbmRlcmVyKGNvbHVtbiwgY29sRGVmLCBtYXApO1xyXG4gICAgICAgIHRoaXMuc2V0UmVzaXphYmxlKGNvbHVtbiwgY29sRGVmKTtcclxuICAgICAgICB0aGlzLnNldFNvcnRhYmxlKGNvbHVtbiwgY29sRGVmKTtcclxuICAgICAgICB0aGlzLnNldEZpbHRlcihjb2x1bW4sIGNvbERlZiwgbWFwKTtcclxuICAgICAgICB0aGlzLnNldEZpbHRlclBhcmFtcyhjb2x1bW4sIGNvbERlZiwgbWFwKTtcclxuICAgICAgICB0aGlzLnNldFN1cHByZXNzTW92YWJsZShjb2x1bW4sIGNvbERlZik7XHJcbiAgICAgICAgdGhpcy5zZXRGbGV4KGNvbHVtbiwgY29sRGVmKTtcclxuICAgICAgICB0aGlzLnNldEFsaWduKGNvbHVtbiwgY29sRGVmKTtcclxuICAgICAgICB0aGlzLnNldFBpbm5lZChjb2x1bW4sIGNvbERlZik7XHJcbiAgICAgICAgdGhpcy5zZXRXaWR0aChjb2x1bW4sIGNvbERlZik7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZUZvcm1hdHRlcihjb2x1bW4sIGNvbERlZiwgbWFwKTsgICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb2xEZWY7XHJcbiAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5hY3Rpb25zKSAmJiBjb21wb25lbnQuYWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgIGNvbElkOiAnYWN0aW9ucycsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBUZXh0cy5BY3Rpb25zLFxyXG4gICAgICAgICAgcmVzaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgIGNlbGxEYXRhVHlwZTogZmFsc2UsXHJcbiAgICAgICAgICBwaW5uZWQ6IFwicmlnaHRcIixcclxuICAgICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczoge1xyXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcclxuICAgICAgICAgICAgZm9ybUdyb3VwOiBmb3JtR3JvdXBcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjZWxsUmVuZGVyZXI6IEFjdGlvbnNDZWxsUmVuZGVyZXIsXHJcbiAgICAgICAgICBzdXBwcmVzc0tleWJvYXJkRXZlbnQ6IHRoaXMubmF2aWdhdGVJbnNpZGVDZWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBjb2x1bW5zO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q2VsbERhdGFUeXBlKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZikge1xyXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGF0YVR5cGUgPT09IFwic3RyaW5nXCJcclxuICAgICAgJiYgY29sdW1uLmRhdGFUeXBlLnRyaW0oKSAhPT0gXCJcIlxyXG4gICAgICAmJiBjb2x1bW4uZGF0YVR5cGUgIT09IFwiYXV0b1wiKSB7XHJcbiAgICAgIGNvbERlZi5jZWxsRGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENlbGxSZW5kZXJlcihjb2x1bW46IGFueSwgY29sRGVmOiBDb2xEZWYsIG1hcDogTWFwVHlwZSkge1xyXG4gICAgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFwib2JqZWN0VVJMXCIpIHtcclxuICAgICAgY29sRGVmLmNlbGxSZW5kZXJlciA9IE9iamVjdFVSTFJlbmRlcmVyQ29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2x1bW4uZm9ybWF0ID09PSBcImRlbGV0ZVJvd1wiKSB7XHJcbiAgICAgIGNvbERlZi5jZWxsUmVuZGVyZXIgPSBEZWxldGVSb3dDZWxsUmVuZGVyZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbERlZi5jZWxsRGF0YVR5cGUgPT09IFwiYm9vbGVhblwiICYmIG1hcCkge1xyXG4gICAgICBjb2xEZWYuY2VsbFJlbmRlcmVyID0gKHBhcmFtczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0TWFwKHBhcmFtcy52YWx1ZSwgbWFwKTsgXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UmVzaXphYmxlKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZiApIHtcclxuICAgIGNvbERlZi5yZXNpemFibGUgPSAoY29sdW1uLnJlc2l6ZSA9PT0gdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNvcnRhYmxlKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZikge1xyXG4gICAgY29sRGVmLnNvcnRhYmxlID0gKGNvbHVtbi5zb3J0ID09PSB0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RmlsdGVyKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZiwgbWFwOiBNYXBUeXBlKSB7XHJcbiAgICBpZiAoY29sdW1uLmZpbHRlciA9PT0gdHJ1ZSkge1xyXG4gICAgICBjb2xEZWYuZmlsdGVyID0gdHJ1ZTtcclxuICAgICAgaWYgKG1hcCkge1xyXG4gICAgICAgIGNvbERlZi5maWx0ZXIgPSBTZXRGaWx0ZXJDb21wb25lbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RmlsdGVyUGFyYW1zKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZiwgbWFwOiBNYXBUeXBlKSB7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyUGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcbiAgICBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAndXVpZCcpIHtcclxuICAgICAgdGhpcy5zZXRVdWlkRmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChjb2x1bW4uZGF0YVR5cGUgPT09ICdpbnRlZ2VyJykge1xyXG4gICAgICB0aGlzLnNldEludGVnZXJGaWx0ZXJQYXJhbXMoZmlsdGVyUGFyYW1zKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNvbHVtbi5kYXRhVHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgIHRoaXMuc2V0RGF0ZUZpbHRlclBhcmFtcyhmaWx0ZXJQYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29sdW1uLmRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zZXRCb29sZWFuRmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChtYXApIHtcclxuICAgICAgZmlsdGVyUGFyYW1zLm1hcCA9IG1hcDtcclxuICAgIH1cclxuXHJcbiAgICBjb2xEZWYuZmlsdGVyUGFyYW1zID0gZmlsdGVyUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVdWlkRmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtczogYW55KSB7XHJcbiAgICBmaWx0ZXJQYXJhbXMuZmlsdGVyT3B0aW9ucyA9IFsnZXF1YWxzJywgJ25vdEVxdWFsJ107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEludGVnZXJGaWx0ZXJQYXJhbXMoZmlsdGVyUGFyYW1zOiBhbnkpIHtcclxuICAgIGZpbHRlclBhcmFtcy5hbGxvd2VkQ2hhclBhdHRlcm4gPSAnXFxcXGQnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREYXRlRmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtczogYW55KSB7XHJcbiAgICBmaWx0ZXJQYXJhbXMuY29tcGFyYXRvciA9IChmaWx0ZXJMb2NhbERhdGVBdE1pZG5pZ2h0OiBEYXRlLCBjZWxsVmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoIWNlbGxWYWx1ZSkgcmV0dXJuIC0xO1xyXG4gICAgICBjb25zdCBjZWxsRGF0ZSA9IG5ldyBEYXRlKGNlbGxWYWx1ZSk7XHJcbiAgICAgIGlmIChpc05hTihjZWxsRGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gLTE7XHJcblxyXG4gICAgICBjb25zdCBjZWxsRGF0ZU5vVGltZSA9IG5ldyBEYXRlKGNlbGxEYXRlLmdldEZ1bGxZZWFyKCksIGNlbGxEYXRlLmdldE1vbnRoKCksIGNlbGxEYXRlLmdldERhdGUoKSk7XHJcblxyXG4gICAgICBpZiAoY2VsbERhdGVOb1RpbWUgPCBmaWx0ZXJMb2NhbERhdGVBdE1pZG5pZ2h0KSByZXR1cm4gLTE7XHJcbiAgICAgIGlmIChjZWxsRGF0ZU5vVGltZSA+IGZpbHRlckxvY2FsRGF0ZUF0TWlkbmlnaHQpIHJldHVybiAxO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Qm9vbGVhbkZpbHRlclBhcmFtcyhmaWx0ZXJQYXJhbXM6IGFueSkge1xyXG4gICAgZmlsdGVyUGFyYW1zLmZpbHRlck9wdGlvbnMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBkaXNwbGF5S2V5OiAnaW5jbHVkZUFsbCcsXHJcbiAgICAgICAgZGlzcGxheU5hbWU6IFRleHRzLkNob29zZU9uZSxcclxuICAgICAgICBudW1iZXJPZklucHV0czogMCxcclxuICAgICAgICBwcmVkaWNhdGU6IChbZmlsdGVyXTogW2FueV0sIHZhbHVlOiBhbnkpID0+IHRydWVcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGRpc3BsYXlLZXk6ICd0cnVlJyxcclxuICAgICAgICBkaXNwbGF5TmFtZTogVGV4dHMuVHJ1ZSxcclxuICAgICAgICBudW1iZXJPZklucHV0czogMCxcclxuICAgICAgICBwcmVkaWNhdGU6IChbZmlsdGVyXTogW2FueV0sIHZhbHVlOiBhbnkpID0+IHZhbHVlID09PSB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBkaXNwbGF5S2V5OiAnZmFsc2UnLFxyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBUZXh0cy5GYWxzZSxcclxuICAgICAgICBudW1iZXJPZklucHV0czogMCxcclxuICAgICAgICBwcmVkaWNhdGU6IChbZmlsdGVyXTogW2FueV0sIHZhbHVlOiBhbnkpID0+IHZhbHVlID09PSBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGlzcGxheUtleTogJ2JsYW5rJyxcclxuICAgICAgICBkaXNwbGF5TmFtZTogVGV4dHMuQmxhbmssXHJcbiAgICAgICAgbnVtYmVyT2ZJbnB1dHM6IDAsXHJcbiAgICAgICAgcHJlZGljYXRlOiAoW2ZpbHRlcl06IFthbnldLCB2YWx1ZTogYW55KSA9PiB2YWx1ZSA9PT0gbnVsbFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgZGlzcGxheUtleTogJ25vdEJsYW5rJyxcclxuICAgICAgICBkaXNwbGF5TmFtZTogVGV4dHMuTm90QmxhbmssXHJcbiAgICAgICAgbnVtYmVyT2ZJbnB1dHM6IDAsXHJcbiAgICAgICAgcHJlZGljYXRlOiAoW2ZpbHRlcl06IFthbnldLCB2YWx1ZTogYW55KSA9PiB2YWx1ZSAhPT0gbnVsbFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIGZpbHRlclBhcmFtcy5zdXBwcmVzc0FuZE9yQ29uZGl0aW9uID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U3VwcHJlc3NNb3ZhYmxlKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZikge1xyXG4gICAgaWYgKCEoY29sdW1uLm1vdmUgPT09IHRydWUpKSB7IFxyXG4gICAgICBjb2xEZWYuc3VwcHJlc3NNb3ZhYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RmxleChjb2x1bW46IGFueSwgY29sRGVmOiBDb2xEZWYpIHtcclxuICAgIGlmIChjb2x1bW4uZmxleCA9PT0gdHJ1ZSkgeyBcclxuICAgICAgY29sRGVmLmZsZXggPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRBbGlnbihjb2x1bW46IGFueSwgY29sRGVmOiBDb2xEZWYpIHtcclxuICAgIGlmIChjb2x1bW4uYWxpZ24gPT09IFwibGVmdFwiKSB7XHJcbiAgICAgIGNvbERlZi5jZWxsU3R5bGUgPSB7IHRleHRBbGlnbjogJ2xlZnQnIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChjb2x1bW4uYWxpZ24gPT09IFwiY2VudGVyXCIpIHtcclxuICAgICAgY29sRGVmLmNlbGxTdHlsZSA9IHsgdGV4dEFsaWduOiAnY2VudGVyJyB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29sdW1uLmFsaWduID09PSBcInJpZ2h0XCIpIHsgXHJcbiAgICAgIGNvbERlZi5jZWxsU3R5bGUgPSB7IHRleHRBbGlnbjogJ3JpZ2h0JyB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQaW5uZWQoY29sdW1uOiBhbnksIGNvbERlZjogQ29sRGVmKSB7XHJcbiAgICBpZiAodHlwZW9mIGNvbHVtbi5waW5uZWQgPT09IFwic3RyaW5nXCIpIHsgXHJcbiAgICAgIGNvbERlZi5waW5uZWQgPSBjb2x1bW4ucGlubmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRXaWR0aChjb2x1bW46IGFueSwgY29sRGVmOiBDb2xEZWYpIHtcclxuICAgIGlmICh0eXBlb2YgY29sdW1uLndpZHRoID09PSBcIm51bWJlclwiKSB7IFxyXG4gICAgICBjb2xEZWYud2lkdGggPSBjb2x1bW4ud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4ubWluV2lkdGggPT09IFwibnVtYmVyXCIpIHsgXHJcbiAgICAgIGNvbERlZi5taW5XaWR0aCA9IGNvbHVtbi5taW5XaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGNvbHVtbi5tYXhXaWR0aCA9PT0gXCJudW1iZXJcIikgeyBcclxuICAgICAgY29sRGVmLm1heFdpZHRoID0gY29sdW1uLm1heFdpZHRoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZUZvcm1hdHRlcihjb2x1bW46IGFueSwgY29sRGVmOiBDb2xEZWYsIG1hcDogTWFwVHlwZSkge1xyXG4gICAgaWYgKG1hcCkge1xyXG4gICAgICBjb2xEZWYudmFsdWVGb3JtYXR0ZXIgPSAocGFyYW1zKSA9PiB0aGlzLmZvcm1hdE1hcChwYXJhbXMudmFsdWUsIG1hcCk7ICAgICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRQYWdpbmFibGUoY29tcG9uZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodHlwZW9mIGNvbXBvbmVudC5yb3dDb3VudCA9PT0gJ251bWJlcicgJiYgY29tcG9uZW50LnJvd0NvdW50ID4gMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRQYWdlU2l6ZShjb21wb25lbnQ6IGFueSkge1xyXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQucm93Q291bnQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiBjb21wb25lbnQucm93Q291bnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRUZXh0cygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLkFHX0dSSURfTE9DQUxFX0lULFxyXG4gICAgICBcInBhZ2VTaXplU2VsZWN0b3JMYWJlbFwiOiBcIkVsZW1lbnRpIHBlciBwYWdpbmE6XCIsXHJcbiAgICAgIFwidG9cIjogXCItXCIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRHcmlkVGhlbWUoKSB7XHJcbiAgICByZXR1cm4gdGhlbWVRdWFydHpcclxuICAgICAgLndpdGhQYXJ0KGljb25TZXRBbHBpbmUpXHJcbiAgICAgIC53aXRoUGFyYW1zKHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI0ZBRkFGQVwiLFxyXG4gICAgICAgIGJvcmRlckNvbG9yOiBcIiNEOUU0RjdcIixcclxuICAgICAgICBicm93c2VyQ29sb3JTY2hlbWU6IFwibGlnaHRcIixcclxuICAgICAgICBjZWxsVGV4dENvbG9yOiBcIiMwMDEyMUFcIixcclxuICAgICAgICBjb2x1bW5Cb3JkZXI6IHRydWUsXHJcbiAgICAgICAgZm9udEZhbWlseTogXCJpbmhlcml0XCIsXHJcbiAgICAgICAgZm9udFNpemU6IDE2LFxyXG4gICAgICAgIGhlYWRlckJhY2tncm91bmRDb2xvcjogXCIjMDAyNDYwXCIsXHJcbiAgICAgICAgaGVhZGVyQ29sdW1uQm9yZGVyOiB0cnVlLFxyXG4gICAgICAgIGhlYWRlckNvbHVtblJlc2l6ZUhhbmRsZUNvbG9yOiBcIiNGMkY2RkNcIixcclxuICAgICAgICBoZWFkZXJDb2x1bW5SZXNpemVIYW5kbGVXaWR0aDogMixcclxuICAgICAgICBoZWFkZXJGb250U2l6ZTogMTYsXHJcbiAgICAgICAgaGVhZGVyRm9udFdlaWdodDogNjAwLFxyXG4gICAgICAgIGhlYWRlclJvd0JvcmRlcjogZmFsc2UsXHJcbiAgICAgICAgaGVhZGVyVGV4dENvbG9yOiBcIiNGMkY2RkNcIixcclxuICAgICAgICByb3dCb3JkZXI6IHRydWVcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERhdGFUeXBlRGVmaW5pdGlvbnMoKTogeyBbY2VsbERhdGFUeXBlOiBzdHJpbmddOiBEYXRhVHlwZURlZmluaXRpb248YW55PjsgfSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1dWlkOiB7XHJcbiAgICAgICAgYmFzZURhdGFUeXBlOiAndGV4dCcsXHJcbiAgICAgICAgZXh0ZW5kc0RhdGFUeXBlOiAndGV4dCdcclxuICAgICAgfSxcclxuICAgICAgZGF0ZToge1xyXG4gICAgICAgIGJhc2VEYXRhVHlwZTogJ2RhdGVTdHJpbmcnLFxyXG4gICAgICAgIGV4dGVuZHNEYXRhVHlwZTogJ2RhdGVTdHJpbmcnLFxyXG4gICAgICAgIGRhdGVQYXJzZXI6ICh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB2YWx1ZUZvcm1hdHRlcjogcGFyYW1zID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlci5mb3JtYXREYXRlKHBhcmFtcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBkYXRlVGltZToge1xyXG4gICAgICAgIGJhc2VEYXRhVHlwZTogJ2RhdGVTdHJpbmcnLFxyXG4gICAgICAgIGV4dGVuZHNEYXRhVHlwZTogJ2RhdGVTdHJpbmcnLFxyXG4gICAgICAgIGRhdGVQYXJzZXI6ICh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB2YWx1ZUZvcm1hdHRlcjogcGFyYW1zID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlci5mb3JtYXREYXRlVGltZShwYXJhbXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgY3VycmVuY3k6IHtcclxuICAgICAgICBleHRlbmRzRGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgIGJhc2VEYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgdmFsdWVGb3JtYXR0ZXI6IHBhcmFtcyA9PiBwYXJhbXMudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgOiB0aGlzLmZvcm1hdHRlci5mb3JtYXRDdXJyZW5jeShwYXJhbXMudmFsdWUpXHJcbiAgICAgIH0sXHJcbiAgICAgIGludGVnZXI6IHtcclxuICAgICAgICBleHRlbmRzRGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgIGJhc2VEYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgdmFsdWVGb3JtYXR0ZXI6IHBhcmFtcyA9PiBwYXJhbXMudmFsdWUgPT0gbnVsbFxyXG4gICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgOiB0aGlzLmZvcm1hdHRlci5mb3JtYXRJbnRlZ2VyKHBhcmFtcy52YWx1ZSlcclxuICAgICAgfSxcclxuICAgICAgcGVyY2VudGFnZToge1xyXG4gICAgICAgIGV4dGVuZHNEYXRhVHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgYmFzZURhdGFUeXBlOiAnbnVtYmVyJyxcclxuICAgICAgICB2YWx1ZUZvcm1hdHRlcjogcGFyYW1zID0+IHBhcmFtcy52YWx1ZSA9PSBudWxsXHJcbiAgICAgICAgICA/ICcnXHJcbiAgICAgICAgICA6IGAke01hdGgucm91bmQocGFyYW1zLnZhbHVlICogMTAwKX0lYCxcclxuICAgICAgfSxcclxuICAgICAgZmxhZ3M6IHtcclxuICAgICAgICBleHRlbmRzRGF0YVR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgIGJhc2VEYXRhVHlwZTogJ251bWJlcidcclxuICAgICAgfSAgICAgIFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TWFwKGNvbHVtbjogYW55LCBjb2xEZWY6IENvbERlZiwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBNYXBUeXBlIHtcclxuXHJcbiAgICBjb25zdCBhbGxvd2VkID0gKGNvbERlZi5jZWxsRGF0YVR5cGUgPT09IFwiYm9vbGVhblwiXHJcbiAgICAgIHx8IGNvbERlZi5jZWxsRGF0YVR5cGUgPT09IFwidGV4dFwiXHJcbiAgICAgIHx8IGNvbERlZi5jZWxsRGF0YVR5cGUgPT09IFwibnVtYmVyXCJcclxuICAgICAgfHwgY29sRGVmLmNlbGxEYXRhVHlwZSA9PT0gXCJmbGFnc1wiKTtcclxuXHJcbiAgICBpZiAoYWxsb3dlZCAmJiBjb2x1bW4ubWFwKSB7XHJcbiAgICAgIGNvbnN0IG1hcCA9IHRoaXMucHJvZ3JhbW1hYmlsaXR5LmV2YWx1YXRlKGZvcm1Hcm91cCwgY29sdW1uLm1hcFZhbHVlcyk7XHJcblxyXG4gICAgICBjb25zdCB2YWxpZCA9IGlzUmVjb3JkKFxyXG4gICAgICAgIG1hcCxcclxuICAgICAgICBrZXkgPT4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleSA9PT0gJ251bWJlcicsXHJcbiAgICAgICAgdmFsID0+IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXZhbGlkKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgaWYgKGNvbERlZi5jZWxsRGF0YVR5cGUgPT09IFwiZmxhZ3NcIikge1xyXG4gICAgICAgIChtYXAgYXMgYW55KVtnZXRMYWJlbFN5bWJvbF0gPSAoa2V5OiBhbnkpID0+IHRoaXMuZm9ybWF0RmxhZ3Moa2V5LCBtYXApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbWFwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRNYXAodmFsdWU6IGFueSwgbWFwOiBNYXBUeXBlKVxyXG4gIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWFwKSB7XHJcbiAgICAgIHZhciByZXN1bHQgPSBtYXBbdmFsdWVdO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgbGFiZWxlZCA9IGlzTGFiZWxlZFJlY29yZChcclxuICAgICAgICAgIG1hcCxcclxuICAgICAgICAgIGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyxcclxuICAgICAgICAgIHZhbCA9PiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyxcclxuICAgICAgICAgIGdldExhYmVsU3ltYm9sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGxhYmVsZWQpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IG1hcFtnZXRMYWJlbFN5bWJvbF0odmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuIHJlc3VsdCA/PyB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRGbGFncyh2YWx1ZTogYW55LCBtYXA6IE1hcFR5cGUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXHJcbiAgICAgIGlzUmVjb3JkKG1hcCwgaXNOdW1lcmljS2V5LCB2YWwgPT4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXHJcbiAgICApIHtcclxuICAgICAgaWYgKHZhbHVlID09IDApIHtcclxuICAgICAgICByZXR1cm4gbWFwWzBdID8/IFwiMFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBhdmFpbGFibGVGbGFncyA9IE9iamVjdC5rZXlzKG1hcClcclxuICAgICAgICAubWFwKE51bWJlcilcclxuICAgICAgICAuZmlsdGVyKGZsYWcgPT4gZmxhZyAhPT0gMCk7XHJcblxyXG4gICAgICBjb25zdCBmbGFncyA9IGF2YWlsYWJsZUZsYWdzLmZpbHRlcihmbGFnID0+ICh2YWx1ZSAmIGZsYWcpID09PSBmbGFnKTtcclxuXHJcbiAgICAgIGNvbnN0IHN1bUZsYWdzID0gZmxhZ3MucmVkdWNlKChzdW0sIGYpID0+IHN1bSB8IGYsIDApO1xyXG5cclxuICAgICAgaWYgKCh2YWx1ZSAmIHN1bUZsYWdzKSAhPT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGZsYWdzXHJcbiAgICAgICAgLm1hcChmbGFnID0+IG1hcFtmbGFnXSlcclxuICAgICAgICAuZmlsdGVyKChsYWJlbCk6IGxhYmVsIGlzIHN0cmluZyA9PiAhIWxhYmVsKVxyXG4gICAgICAgIC5qb2luKCcsICcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlSW5zaWRlQ2VsbCh7IGV2ZW50IH06IFN1cHByZXNzS2V5Ym9hcmRFdmVudFBhcmFtczxhbnk+KSB7XHJcbiAgICBjb25zdCBHUklEX0NFTExfQ0xBU1NOQU1FID0gXCJhZy1jZWxsXCI7XHJcbiAgICBjb25zdCB7IGtleSwgc2hpZnRLZXkgfSA9IGV2ZW50O1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0RXZlbnRQYXRoKGV2ZW50KTtcclxuICAgIGNvbnN0IGlzVGFiRm9yd2FyZCA9IGtleSA9PT0gXCJUYWJcIiAmJiBzaGlmdEtleSA9PT0gZmFsc2U7XHJcbiAgICBjb25zdCBpc1RhYkJhY2t3YXJkID0ga2V5ID09PSBcIlRhYlwiICYmIHNoaWZ0S2V5ID09PSB0cnVlO1xyXG4gICAgbGV0IHN1cHByZXNzRXZlbnQgPSBmYWxzZTtcclxuICAgIC8vIEhhbmRsZSBjZWxsIGNoaWxkcmVuIHRhYmJpbmdcclxuICAgIGlmIChpc1RhYkZvcndhcmQgfHwgaXNUYWJCYWNrd2FyZCkge1xyXG4gICAgICBjb25zdCBlR3JpZENlbGwgPSBwYXRoLmZpbmQoKGVsKSA9PiB7XHJcbiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyhHUklEX0NFTExfQ0xBU1NOQU1FKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghZUdyaWRDZWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cHByZXNzRXZlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZm9jdXNhYmxlQ2hpbGRyZW5FbGVtZW50cyA9IHRoaXMuZ2V0QWxsRm9jdXNhYmxlRWxlbWVudHNPZihlR3JpZENlbGwpO1xyXG4gICAgICBjb25zdCBsYXN0Q2VsbENoaWxkRWwgPVxyXG4gICAgICAgIGZvY3VzYWJsZUNoaWxkcmVuRWxlbWVudHNbZm9jdXNhYmxlQ2hpbGRyZW5FbGVtZW50cy5sZW5ndGggLSAxXTtcclxuICAgICAgY29uc3QgZmlyc3RDZWxsQ2hpbGRFbCA9IGZvY3VzYWJsZUNoaWxkcmVuRWxlbWVudHNbMF07XHJcbiAgICAgIC8vIFN1cHByZXNzIGtleWJvYXJkIGV2ZW50IGlmIHRhYmJpbmcgZm9yd2FyZCB3aXRoaW4gdGhlIGNlbGwgYW5kIHRoZSBjdXJyZW50IGZvY3VzZWQgZWxlbWVudCBpcyBub3QgdGhlIGxhc3QgY2hpbGRcclxuICAgICAgaWYgKGZvY3VzYWJsZUNoaWxkcmVuRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUNoaWxkcmVuRWxlbWVudHMuaW5kZXhPZihcclxuICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50LFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaXNUYWJGb3J3YXJkKSB7XHJcbiAgICAgICAgY29uc3QgaXNMYXN0Q2hpbGRGb2N1c2VkID1cclxuICAgICAgICAgIGxhc3RDZWxsQ2hpbGRFbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBsYXN0Q2VsbENoaWxkRWw7XHJcbiAgICAgICAgaWYgKCFpc0xhc3RDaGlsZEZvY3VzZWQpIHtcclxuICAgICAgICAgIHN1cHByZXNzRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gLTEgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZUdyaWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGZvY3VzYWJsZUNoaWxkcmVuRWxlbWVudHNbY3VycmVudEluZGV4ICsgMV0uZm9jdXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gU3VwcHJlc3Mga2V5Ym9hcmQgZXZlbnQgaWYgdGFiYmluZyBiYWNrd2FyZHMgd2l0aGluIHRoZSBjZWxsLCBhbmQgdGhlIGN1cnJlbnQgZm9jdXNlZCBlbGVtZW50IGlzIG5vdCB0aGUgZmlyc3QgY2hpbGRcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY2VsbEhhc0ZvY3VzZWRDaGlsZHJlbiA9XHJcbiAgICAgICAgICBlR3JpZENlbGwuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgJiZcclxuICAgICAgICAgIGVHcmlkQ2VsbCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuICAgICAgICAvLyBNYW51YWxseSBzZXQgZm9jdXMgdG8gdGhlIGxhc3QgY2hpbGQgZWxlbWVudCBpZiBjZWxsIGRvZXNuJ3QgaGF2ZSBmb2N1c2VkIGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKCFjZWxsSGFzRm9jdXNlZENoaWxkcmVuKSB7XHJcbiAgICAgICAgICBsYXN0Q2VsbENoaWxkRWwuZm9jdXMoKTtcclxuICAgICAgICAgIC8vIENhbmNlbCBrZXlib2FyZCBwcmVzcywgc28gdGhhdCBpdCBkb2Vzbid0IGZvY3VzIG9uIHRoZSBsYXN0IGNoaWxkIGFuZCB0aGVuIHBhc3MgdGhyb3VnaCB0aGUga2V5Ym9hcmQgcHJlc3MgdG9cclxuICAgICAgICAgIC8vIG1vdmUgdG8gdGhlIDJuZCBsYXN0IGNoaWxkIGVsZW1lbnRcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlzRmlyc3RDaGlsZEZvY3VzZWQgPVxyXG4gICAgICAgICAgZmlyc3RDZWxsQ2hpbGRFbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBmaXJzdENlbGxDaGlsZEVsO1xyXG4gICAgICAgIGlmICghaXNGaXJzdENoaWxkRm9jdXNlZCkge1xyXG4gICAgICAgICAgc3VwcHJlc3NFdmVudCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4ICE9PSAtMSB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBlR3JpZENlbGwpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZm9jdXNhYmxlQ2hpbGRyZW5FbGVtZW50c1tjdXJyZW50SW5kZXggLSAxXS5mb2N1cygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1cHByZXNzRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEV2ZW50UGF0aChldmVudDogRXZlbnQpOiBIVE1MRWxlbWVudFtdIHtcclxuICAgIGNvbnN0IHBhdGg6IEhUTUxFbGVtZW50W10gPSBbXTtcclxuICAgIGxldCBjdXJyZW50VGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XHJcbiAgICB3aGlsZSAoY3VycmVudFRhcmdldCkge1xyXG4gICAgICBwYXRoLnB1c2goY3VycmVudFRhcmdldCk7XHJcbiAgICAgIGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRm9jdXNhYmxlRWxlbWVudHNPZihlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihcclxuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbChcclxuICAgICAgICAnYnV0dG9uLCBbaHJlZl0sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknLFxyXG4gICAgICApXHJcbiAgICApLmZpbHRlcigoZm9jdXNhYmxlRWwpID0+IHtcclxuICAgICAgcmV0dXJuIGZvY3VzYWJsZUVsLnRhYkluZGV4ICE9PSAtMSAmJiAhZm9jdXNhYmxlRWwuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==