ng-prime-tools 1.0.60 → 1.0.63
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/esm2022/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.mjs +128 -45
- package/esm2022/lib/pt-date-input/pt-date-input.component.mjs +3 -3
- package/esm2022/lib/pt-dialog/pt-dialog.component.mjs +2 -2
- package/esm2022/lib/pt-form-builder/pt-form-builder.component.mjs +12 -5
- package/esm2022/lib/pt-side-bar-menu/pt-side-bar-menu.component.mjs +2 -2
- package/fesm2022/ng-prime-tools.mjs +144 -54
- package/fesm2022/ng-prime-tools.mjs.map +1 -1
- package/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.d.ts +24 -3
- package/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.d.ts.map +1 -1
- package/lib/pt-form-builder/pt-form-builder.component.d.ts +8 -1
- package/lib/pt-form-builder/pt-form-builder.component.d.ts.map +1 -1
- package/lib/pt-metric-panel/pt-metric-panel.component.d.ts +1 -1
- package/package.json +1 -1
|
@@ -27,12 +27,18 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
27
27
|
this.hasColumnFilter = false;
|
|
28
28
|
/** paginator UI */
|
|
29
29
|
this.isPaginated = true;
|
|
30
|
-
/**
|
|
30
|
+
/** server-side mode */
|
|
31
31
|
this.isLazy = false;
|
|
32
32
|
this.actions = [];
|
|
33
33
|
this.isSortable = false;
|
|
34
34
|
this.loading = false;
|
|
35
35
|
this.maxHeight = null;
|
|
36
|
+
/**
|
|
37
|
+
* New unified lazy event.
|
|
38
|
+
* Use this in parent components for server-side pagination/filter/sort/search.
|
|
39
|
+
*/
|
|
40
|
+
this.lazyLoad = new EventEmitter();
|
|
41
|
+
/** Backward compatibility */
|
|
36
42
|
this.search = new EventEmitter();
|
|
37
43
|
this.exportExcelEvent = new EventEmitter();
|
|
38
44
|
this.exportPdfEvent = new EventEmitter();
|
|
@@ -48,6 +54,10 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
48
54
|
this.validCurrencyCodes = ['USD', 'EUR', 'MAD'];
|
|
49
55
|
this.iconWidth = 77;
|
|
50
56
|
this.rows = 0;
|
|
57
|
+
this.first = 0;
|
|
58
|
+
this.currentPage = 0;
|
|
59
|
+
this.currentSortField = null;
|
|
60
|
+
this.currentSortOrder = null;
|
|
51
61
|
this.hasGroupedColumns = false;
|
|
52
62
|
this.isDelete = false;
|
|
53
63
|
this.isEdit = false;
|
|
@@ -83,25 +93,45 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
83
93
|
if (col.isEditable === undefined)
|
|
84
94
|
col.isEditable = true;
|
|
85
95
|
if (col.isFilter !== false && col.code !== undefined) {
|
|
86
|
-
this.globalFilterFields.
|
|
96
|
+
if (!this.globalFilterFields.includes(col.code)) {
|
|
97
|
+
this.globalFilterFields.push(col.code);
|
|
98
|
+
}
|
|
87
99
|
}
|
|
88
100
|
if (!col.width)
|
|
89
101
|
col.width = this.calculateColumnWidth(col);
|
|
90
102
|
});
|
|
91
|
-
// ✅ client-side mode: totalRecords = data.length by default
|
|
92
103
|
if (!this.isLazy) {
|
|
93
104
|
this.totalRecords = this.data?.length ?? 0;
|
|
94
105
|
}
|
|
95
106
|
}
|
|
96
107
|
ngOnChanges(changes) {
|
|
97
|
-
// ✅ when data changes in client-side mode, keep paginator consistent
|
|
98
108
|
if (changes['data'] && !this.isLazy) {
|
|
99
109
|
this.totalRecords = this.data?.length ?? 0;
|
|
100
|
-
// if we were on page > 1, go back to first page (avoids empty view)
|
|
101
110
|
if (this.dt)
|
|
102
111
|
this.dt.first = 0;
|
|
103
112
|
}
|
|
104
113
|
}
|
|
114
|
+
// ---------- LAZY PAYLOAD ----------
|
|
115
|
+
emitLazyLoad() {
|
|
116
|
+
const payload = {
|
|
117
|
+
page: this.currentPage,
|
|
118
|
+
rows: this.rows,
|
|
119
|
+
first: this.first,
|
|
120
|
+
search: this.searchValue?.trim() || undefined,
|
|
121
|
+
sortField: this.currentSortField,
|
|
122
|
+
sortOrder: this.currentSortOrder,
|
|
123
|
+
filters: { ...this.latestFilterValues },
|
|
124
|
+
};
|
|
125
|
+
console.log('emitLazyLoad payload =', payload);
|
|
126
|
+
this.lazyLoad.emit(payload);
|
|
127
|
+
}
|
|
128
|
+
resetToFirstPage() {
|
|
129
|
+
this.currentPage = 0;
|
|
130
|
+
this.first = 0;
|
|
131
|
+
if (this.dt) {
|
|
132
|
+
this.dt.first = 0;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
105
135
|
// ---------- HEADER + BODY ALIGNMENT HELPERS ----------
|
|
106
136
|
getHeaderTitleClass(col) {
|
|
107
137
|
const align = col.headerAlign ?? AlignEnum.LEFT;
|
|
@@ -188,7 +218,10 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
188
218
|
initializeComposedFilters(col) {
|
|
189
219
|
col.composedNames?.forEach((composedName) => {
|
|
190
220
|
const code = col.code || '';
|
|
191
|
-
|
|
221
|
+
const composedCode = code + '.' + composedName;
|
|
222
|
+
if (!this.globalFilterFields.includes(composedCode)) {
|
|
223
|
+
this.globalFilterFields.push(composedCode);
|
|
224
|
+
}
|
|
192
225
|
this.filters[composedName] = {
|
|
193
226
|
options: col.filterOptions,
|
|
194
227
|
value: [],
|
|
@@ -212,8 +245,10 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
212
245
|
col.composedNames.forEach((name) => {
|
|
213
246
|
const key = `${col.code}.${name}`;
|
|
214
247
|
delete this.latestFilterValues[key];
|
|
215
|
-
if (this.filters[name])
|
|
248
|
+
if (this.filters[name]) {
|
|
216
249
|
this.filters[name].value = [];
|
|
250
|
+
}
|
|
251
|
+
this.clearedFields.add(key);
|
|
217
252
|
});
|
|
218
253
|
}
|
|
219
254
|
onComposedFilterValueChange(col, composedName, value, filterModel) {
|
|
@@ -250,11 +285,14 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
250
285
|
return;
|
|
251
286
|
const isEmpty = value === null ||
|
|
252
287
|
value === undefined ||
|
|
288
|
+
value === '' ||
|
|
253
289
|
(Array.isArray(value) && value.length === 0);
|
|
254
|
-
if (isEmpty)
|
|
290
|
+
if (isEmpty) {
|
|
255
291
|
delete this.latestFilterValues[field];
|
|
256
|
-
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
257
294
|
this.latestFilterValues[field] = value;
|
|
295
|
+
}
|
|
258
296
|
if (filterModel) {
|
|
259
297
|
filterModel.value = value;
|
|
260
298
|
if (Array.isArray(filterModel.constraints) &&
|
|
@@ -279,13 +317,22 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
279
317
|
return this.columns.find((c) => c.code === field || (c.code && field.startsWith(c.code + '.')));
|
|
280
318
|
}
|
|
281
319
|
filterColumn(event) {
|
|
320
|
+
console.log('filterColumn event =', event);
|
|
321
|
+
console.log('filterColumn event.filters =', event?.filters);
|
|
322
|
+
console.log('filterColumn latestFilterValues BEFORE =', this.latestFilterValues);
|
|
282
323
|
const filters = event?.filters;
|
|
283
324
|
if (!filters) {
|
|
284
|
-
if (this.isLazy)
|
|
325
|
+
if (this.isLazy) {
|
|
326
|
+
this.resetToFirstPage();
|
|
285
327
|
this.onFilterColumn.emit(event);
|
|
328
|
+
this.emitLazyLoad();
|
|
329
|
+
}
|
|
286
330
|
return;
|
|
287
331
|
}
|
|
288
332
|
const isNullish = (v) => v === null || v === undefined || v === '';
|
|
333
|
+
const nextFilterValues = {
|
|
334
|
+
...this.latestFilterValues,
|
|
335
|
+
};
|
|
289
336
|
Object.keys(filters).forEach((field) => {
|
|
290
337
|
const meta = filters[field];
|
|
291
338
|
const normalizeMeta = (m) => Array.isArray(m) && m.length > 0 ? m[0] : m;
|
|
@@ -294,21 +341,48 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
294
341
|
const wasCleared = this.clearedFields.has(field);
|
|
295
342
|
if (!m && !col)
|
|
296
343
|
return;
|
|
297
|
-
//
|
|
344
|
+
// ---- CLEARED FIELD ----
|
|
345
|
+
// Must be handled BEFORE COMPOSED logic
|
|
346
|
+
if (wasCleared) {
|
|
347
|
+
delete nextFilterValues[field];
|
|
348
|
+
if (col?.type === TableTypeEnum.COMPOSED &&
|
|
349
|
+
col.code &&
|
|
350
|
+
col.composedNames) {
|
|
351
|
+
col.composedNames.forEach((name) => {
|
|
352
|
+
delete nextFilterValues[`${col.code}.${name}`];
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
if (m) {
|
|
356
|
+
m.value = null;
|
|
357
|
+
if (Array.isArray(m.constraints) && m.constraints.length > 0) {
|
|
358
|
+
m.constraints.forEach((c) => (c.value = null));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
this.clearedFields.delete(field);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
// ---- COMPOSED FILTERS ----
|
|
298
365
|
if (col && col.type === TableTypeEnum.COMPOSED) {
|
|
299
366
|
const composedValues = {};
|
|
300
367
|
col.composedNames?.forEach((name) => {
|
|
301
368
|
const key = `${col.code}.${name}`;
|
|
302
|
-
|
|
369
|
+
if (this.clearedFields.has(key)) {
|
|
370
|
+
delete nextFilterValues[key];
|
|
371
|
+
this.clearedFields.delete(key);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
const val = nextFilterValues[key];
|
|
303
375
|
const empty = isNullish(val) || (Array.isArray(val) && val.length === 0);
|
|
304
|
-
if (!empty)
|
|
376
|
+
if (!empty) {
|
|
305
377
|
composedValues[name] = val;
|
|
378
|
+
}
|
|
306
379
|
});
|
|
307
380
|
if (Object.keys(composedValues).length === 0) {
|
|
308
381
|
if (m) {
|
|
309
382
|
m.value = null;
|
|
310
|
-
if (Array.isArray(m.constraints))
|
|
383
|
+
if (Array.isArray(m.constraints)) {
|
|
311
384
|
m.constraints.forEach((c) => (c.value = null));
|
|
385
|
+
}
|
|
312
386
|
}
|
|
313
387
|
}
|
|
314
388
|
else {
|
|
@@ -318,23 +392,14 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
318
392
|
}
|
|
319
393
|
if (!m)
|
|
320
394
|
return;
|
|
321
|
-
// CLEAR
|
|
322
|
-
if (wasCleared) {
|
|
323
|
-
delete this.latestFilterValues[field];
|
|
324
|
-
m.value = null;
|
|
325
|
-
if (Array.isArray(m.constraints) && m.constraints.length > 0) {
|
|
326
|
-
m.constraints[0].value = null;
|
|
327
|
-
}
|
|
328
|
-
this.clearedFields.delete(field);
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
395
|
let value = m.value;
|
|
332
396
|
if (Array.isArray(m.constraints) && m.constraints.length > 0) {
|
|
333
397
|
const cVal = m.constraints[0].value;
|
|
334
|
-
if (!isNullish(cVal))
|
|
398
|
+
if (!isNullish(cVal)) {
|
|
335
399
|
value = cVal;
|
|
400
|
+
}
|
|
336
401
|
}
|
|
337
|
-
const cached =
|
|
402
|
+
const cached = nextFilterValues[field];
|
|
338
403
|
const hasCached = !isNullish(cached) && (!Array.isArray(cached) || cached.length > 0);
|
|
339
404
|
if ((isNullish(value) || (Array.isArray(value) && value.length === 0)) &&
|
|
340
405
|
hasCached) {
|
|
@@ -342,16 +407,14 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
342
407
|
}
|
|
343
408
|
const isEmpty = isNullish(value) || (Array.isArray(value) && value.length === 0);
|
|
344
409
|
if (isEmpty) {
|
|
345
|
-
delete
|
|
410
|
+
delete nextFilterValues[field];
|
|
346
411
|
m.value = null;
|
|
347
412
|
if (Array.isArray(m.constraints) && m.constraints.length > 0) {
|
|
348
413
|
m.constraints[0].value = null;
|
|
349
414
|
}
|
|
350
415
|
return;
|
|
351
416
|
}
|
|
352
|
-
this.latestFilterValues[field] = value;
|
|
353
417
|
let emitValue = value;
|
|
354
|
-
// ✅ DATE / DATETIME normalization for server-side filtering
|
|
355
418
|
if (col &&
|
|
356
419
|
(col.type === TableTypeEnum.DATE || col.type === TableTypeEnum.DATETIME)) {
|
|
357
420
|
const d = this.parseAnyDate(value);
|
|
@@ -360,17 +423,21 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
360
423
|
? this.formatDateWithColumn(d, col)
|
|
361
424
|
: this.formatDateTimeWithColumn(d, col);
|
|
362
425
|
}
|
|
426
|
+
nextFilterValues[field] = emitValue;
|
|
363
427
|
m.value = emitValue;
|
|
364
428
|
if (Array.isArray(m.constraints) && m.constraints.length > 0) {
|
|
365
429
|
m.constraints[0].value = emitValue;
|
|
366
430
|
}
|
|
367
431
|
});
|
|
368
|
-
|
|
432
|
+
console.log('filterColumn nextFilterValues =', nextFilterValues);
|
|
433
|
+
this.latestFilterValues = nextFilterValues;
|
|
434
|
+
console.log('filterColumn latestFilterValues AFTER =', this.latestFilterValues);
|
|
369
435
|
if (this.isLazy) {
|
|
436
|
+
this.resetToFirstPage();
|
|
370
437
|
this.onFilterColumn.emit(event);
|
|
438
|
+
this.emitLazyLoad();
|
|
371
439
|
}
|
|
372
440
|
else {
|
|
373
|
-
// client-side: keep totalRecords in sync with filtered view
|
|
374
441
|
if (this.dt) {
|
|
375
442
|
const current = (this.dt.filteredValue ?? this.dt.value ?? []);
|
|
376
443
|
this.totalRecords = current?.length ?? 0;
|
|
@@ -381,14 +448,16 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
381
448
|
changePage(event) {
|
|
382
449
|
const page = event.page ?? Math.floor((event.first || 0) / event.rows);
|
|
383
450
|
const rows = event.rows;
|
|
451
|
+
const first = event.first ?? page * rows;
|
|
384
452
|
this.rows = rows;
|
|
385
|
-
|
|
453
|
+
this.currentPage = page;
|
|
454
|
+
this.first = first;
|
|
386
455
|
if (this.isLazy) {
|
|
387
456
|
this.onPageChange.emit({ page, rows });
|
|
457
|
+
this.emitLazyLoad();
|
|
388
458
|
}
|
|
389
459
|
}
|
|
390
460
|
sortColumn(event) {
|
|
391
|
-
// ✅ emit only when server-side sorting
|
|
392
461
|
if (!this.isLazy)
|
|
393
462
|
return;
|
|
394
463
|
let field = event.field;
|
|
@@ -397,15 +466,21 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
397
466
|
let textProp;
|
|
398
467
|
if (col.composedNames && col.composedTypes) {
|
|
399
468
|
const idx = col.composedTypes.findIndex((t) => t === TableTypeEnum.STRING);
|
|
400
|
-
if (idx >= 0 && idx < col.composedNames.length)
|
|
469
|
+
if (idx >= 0 && idx < col.composedNames.length) {
|
|
401
470
|
textProp = col.composedNames[idx];
|
|
471
|
+
}
|
|
402
472
|
}
|
|
403
|
-
if (!textProp && col.composedNames?.length)
|
|
473
|
+
if (!textProp && col.composedNames?.length) {
|
|
404
474
|
textProp = col.composedNames[0];
|
|
475
|
+
}
|
|
405
476
|
if (textProp)
|
|
406
477
|
field = `${field}.${textProp}`;
|
|
407
478
|
}
|
|
479
|
+
this.currentSortField = field ?? null;
|
|
480
|
+
this.currentSortOrder = event.order ?? null;
|
|
481
|
+
this.resetToFirstPage();
|
|
408
482
|
this.onSortColumn.emit({ ...event, field });
|
|
483
|
+
this.emitLazyLoad();
|
|
409
484
|
}
|
|
410
485
|
// ---------- EDIT HELPERS ----------
|
|
411
486
|
parseDate_ddMMyyyy(dateString) {
|
|
@@ -496,12 +571,13 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
496
571
|
filterGlobal(event) {
|
|
497
572
|
const target = event.target;
|
|
498
573
|
const value = (target.value || '').toLowerCase();
|
|
499
|
-
// ✅ server-side mode
|
|
500
574
|
if (this.isLazy) {
|
|
575
|
+
this.searchValue = value;
|
|
576
|
+
this.resetToFirstPage();
|
|
501
577
|
this.search.emit(value);
|
|
578
|
+
this.emitLazyLoad();
|
|
502
579
|
return;
|
|
503
580
|
}
|
|
504
|
-
// ✅ client-side mode
|
|
505
581
|
if (!value) {
|
|
506
582
|
this.dt.value = [...(this.data ?? [])];
|
|
507
583
|
this.totalRecords = (this.dt.value ?? []).length;
|
|
@@ -551,7 +627,7 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
551
627
|
}
|
|
552
628
|
return false;
|
|
553
629
|
}
|
|
554
|
-
// ----------
|
|
630
|
+
// ---------- DATE / DATETIME ----------
|
|
555
631
|
parseAnyDate(input) {
|
|
556
632
|
if (input === null || input === undefined || input === '')
|
|
557
633
|
return null;
|
|
@@ -624,16 +700,19 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
624
700
|
table.clear();
|
|
625
701
|
this.searchValue = '';
|
|
626
702
|
this.latestFilterValues = {};
|
|
703
|
+
this.clearedFields.clear();
|
|
704
|
+
this.currentSortField = null;
|
|
705
|
+
this.currentSortOrder = null;
|
|
627
706
|
Object.keys(this.filters).forEach((key) => {
|
|
628
707
|
if (this.filters[key])
|
|
629
708
|
this.filters[key].value = [];
|
|
630
709
|
});
|
|
631
|
-
// ✅ server-side: parent must reload
|
|
632
710
|
if (this.isLazy) {
|
|
711
|
+
this.resetToFirstPage();
|
|
633
712
|
this.onFilterColumn.emit({ cleared: true });
|
|
713
|
+
this.emitLazyLoad();
|
|
634
714
|
return;
|
|
635
715
|
}
|
|
636
|
-
// ✅ client-side: reset paginator totals
|
|
637
716
|
if (this.dt) {
|
|
638
717
|
this.dt.value = [...(this.data ?? [])];
|
|
639
718
|
this.totalRecords = (this.dt.value ?? []).length;
|
|
@@ -646,6 +725,8 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
646
725
|
this.rowsPerPage = [10, 20, 30];
|
|
647
726
|
}
|
|
648
727
|
this.rows = this.rowsPerPage[0];
|
|
728
|
+
this.currentPage = 0;
|
|
729
|
+
this.first = 0;
|
|
649
730
|
}
|
|
650
731
|
}
|
|
651
732
|
getCurrencySymbol(column) {
|
|
@@ -711,21 +792,21 @@ export class PTAdvancedPrimeTableComponent {
|
|
|
711
792
|
isActionVisible(action, row) {
|
|
712
793
|
const v = action?.visible;
|
|
713
794
|
if (v === undefined || v === null)
|
|
714
|
-
return true;
|
|
795
|
+
return true;
|
|
715
796
|
return typeof v === 'function' ? !!v(row) : !!v;
|
|
716
797
|
}
|
|
717
798
|
isActionDisabled(action, row) {
|
|
718
799
|
const d = action.disabled;
|
|
719
800
|
if (d === undefined || d === null)
|
|
720
|
-
return false;
|
|
801
|
+
return false;
|
|
721
802
|
return typeof d === 'function' ? !!d(row) : !!d;
|
|
722
803
|
}
|
|
723
804
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTAdvancedPrimeTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
724
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTAdvancedPrimeTableComponent, selector: "pt-advanced-prime-table", inputs: { data: "data", columns: "columns", totalRecords: "totalRecords", rowsPerPage: "rowsPerPage", hasSearchFilter: "hasSearchFilter", hasExportExcel: "hasExportExcel", hasExportPDF: "hasExportPDF", hasColumnFilter: "hasColumnFilter", isPaginated: "isPaginated", isLazy: "isLazy", actions: "actions", isSortable: "isSortable", loading: "loading", maxHeight: "maxHeight" }, outputs: { search: "search", exportExcelEvent: "exportExcelEvent", exportPdfEvent: "exportPdfEvent", onPageChange: "onPageChange", onSortColumn: "onSortColumn", onFilterColumn: "onFilterColumn" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"pt-advanced-prime-table table-container\">\n <p-table\n #dt\n [value]=\"data\"\n [loading]=\"loading\"\n [rows]=\"rows\"\n [paginator]=\"isPaginated\"\n [globalFilterFields]=\"globalFilterFields\"\n [rowsPerPageOptions]=\"rowsPerPage\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"isLazy\"\n dataKey=\"id\"\n styleClass=\"p-datatable-gridlines p-datatable-striped\"\n [scrollable]=\"true\"\n [scrollHeight]=\"maxHeight !== null ? maxHeight : undefined\"\n (onFilter)=\"filterColumn($event)\"\n (onPage)=\"changePage($event)\"\n (onSort)=\"sortColumn($event)\"\n >\n <!-- COLGROUP: sync header/body widths -->\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col\n *ngFor=\"let col of columns\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n />\n </colgroup>\n </ng-template>\n\n <!-- CAPTION -->\n <ng-template pTemplate=\"caption\">\n <div class=\"flex\">\n <div>\n <h3>Total: {{ totalRecords }}</h3>\n </div>\n\n <div>\n <!-- Clear filters -->\n <button\n *ngIf=\"hasSearchFilter\"\n pButton\n icon=\"pi pi-filter-slash\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"clear(dt)\"\n title=\"Clear filters\"\n ></button>\n\n <!-- Export to Excel Button -->\n <button\n *ngIf=\"hasExportExcel\"\n pButton\n icon=\"pi pi-file-excel\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportExcel()\"\n title=\"Export to Excel\"\n ></button>\n\n <!-- Export to PDF Button -->\n <button\n *ngIf=\"hasExportPDF\"\n pButton\n icon=\"pi pi-file-pdf\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportPdf()\"\n title=\"Export to PDF\"\n ></button>\n </div>\n\n <div class=\"ml-auto\" *ngIf=\"hasSearchFilter\">\n <p-iconField iconPosition=\"left\" class=\"ml-auto\">\n <p-inputIcon>\n <i class=\"pi pi-search\"></i>\n </p-inputIcon>\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"searchValue\"\n (input)=\"filterGlobal($event)\"\n placeholder=\"Search keyword\"\n />\n </p-iconField>\n </div>\n </div>\n </ng-template>\n\n <!-- HEADER -->\n <ng-template pTemplate=\"header\">\n <tr class=\"sticky-header\">\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"!col.children; else groupHeader\"\n pSortableColumn=\"{{ col.code }}\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [ngClass]=\"[\n getHeaderAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n colspan=\"1\"\n >\n <!-- SORTABLE HEADER -->\n <ng-container\n *ngIf=\"isSortable && col.isSortable !== false; else noSortHeader\"\n >\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n <div\n class=\"icons d-flex align-items-center\"\n [style.width]=\"'77px'\"\n >\n <p-sortIcon field=\"{{ col.code }}\" />\n\n <!-- COLUMN FILTERS -->\n <ng-container\n *ngIf=\"hasColumnFilter && col.isFilter !== false\"\n >\n <!-- COMPOSED FILTER (uses built-in Apply/Clear) -->\n <p-columnFilter\n *ngIf=\"col.type === TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n type=\"text\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n (onClear)=\"onComposedColumnClear(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n let-filterModel=\"filterModel\"\n >\n <div *ngFor=\"let composedName of col.composedNames\">\n <ng-container\n *ngIf=\"\n getComposedFieldType(col, composedName) ===\n TableTypeEnum.STRING\n \"\n >\n <p-multiSelect\n [options]=\"filters[composedName]?.options\"\n [ngModel]=\"filters[composedName]?.value\"\n (ngModelChange)=\"\n onComposedFilterValueChange(\n col,\n composedName,\n $event,\n filterModel\n )\n \"\n [placeholder]=\"filters[composedName]?.placeholder\"\n display=\"chip\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div class=\"custom-multiselect-item\">\n <img\n *ngIf=\"item.image\"\n [src]=\"item.image\"\n alt=\"icon\"\n class=\"filter-image\"\n />\n <span>{{ item.label }}</span>\n </div>\n </ng-template>\n </p-multiSelect>\n </ng-container>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- OTHER TYPES -->\n <p-columnFilter\n *ngIf=\"col.type !== TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n (onClear)=\"onFilterClear(col.code!)\"\n >\n <!-- NUMBER / AMOUNT: use text input so '.' works -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER ||\n col.type === TableTypeEnum.AMOUNT\n \"\n let-value\n >\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onNumberFilterChange(col.code!, $event)\n \"\n placeholder=\"Enter a number\"\n />\n </ng-template>\n\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"col.type === TableTypeEnum.DATE\"\n let-filterModel=\"filterModel\"\n >\n <p-calendar\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n dateFormat=\"dd/mm/yy\"\n placeholder=\"Choose a date\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.MULTISELECT &&\n col.filterOptions &&\n col.filterOptions.length > 0\n \"\n let-filterModel=\"filterModel\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n display=\"chip\"\n placeholder=\"Choose option\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- NON-SORTABLE HEADER -->\n <ng-template #noSortHeader>\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n\n <ng-container *ngIf=\"hasColumnFilter && col.isFilter !== false\">\n <!-- AMOUNT behaves like NUMBER -->\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-filterModel=\"filterModel\"\n >\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n placeholder=\"Enter an amount\"\n />\n </ng-template>\n </p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n >\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n let-filterModel=\"filterModel\"\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n dateFormat=\"dd/mm/yy\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n let-filterModel=\"filterModel\"\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n display=\"chip\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </ng-template>\n </th>\n\n <!-- GROUPED HEADER -->\n <ng-template #groupHeader>\n <th\n [attr.colspan]=\"col.children?.length\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getHeaderAlignClass(col)\"\n >\n <span>{{ col.title }}</span>\n </th>\n </ng-template>\n </ng-container>\n </tr>\n\n <!-- CHILD HEADERS -->\n <tr *ngIf=\"hasGroupedColumns\">\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.children\">\n <th\n *ngFor=\"let child of col.children\"\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [style.padding]=\"'0px'\"\n ></th>\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n\n <!-- EMPTY MESSAGE -->\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"p-datatable-emptymessage\">\n <!-- span all columns -->\n <td class=\"empty-message-cell\" [attr.colspan]=\"columns.length || 1\">\n <div class=\"empty-message-wrapper\">\n <div class=\"empty-message\">\n <i class=\"pi pi-info-circle\"></i>\n <p>No records available to display.</p>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <!-- BODY -->\n <ng-template\n pTemplate=\"body\"\n let-data\n let-editing=\"editing\"\n let-ri=\"rowIndex\"\n >\n <tr *ngIf=\"!loading\" [pEditableRow]=\"isEdit ? data : null\">\n <ng-container *ngFor=\"let col of columns\">\n <!-- SIMPLE COLUMNS (no children) -->\n <ng-container *ngIf=\"!col.children; else childColumns\">\n <!-- EDITABLE CELL -->\n <td\n *ngIf=\"\n isEditable(col.code!) && col.type !== TableTypeEnum.ACTION;\n else normalTD\n \"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getDataAlignClass(col)\"\n >\n <!-- Editable input for NUMBER/DATE/STRING/MULTISELECT -->\n <ng-container *ngIf=\"isMultiSelect(col.code); else datePicker\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect\n appendTo=\"body\"\n [ngModel]=\"data[col.code!]\"\n [style]=\"{ width: '100%' }\"\n (ngModelChange)=\"changeHandler(data.id, col.code, $event)\"\n [options]=\"optionValues\"\n ></p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div class=\"multi-select-container\">\n <ng-container *ngFor=\"let rec of data[col.code!]\">\n <p-tag [value]=\"rec\"></p-tag>\n </ng-container>\n </div>\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #datePicker>\n <ng-container *ngIf=\"isDatePicker(col.code); else normalInput\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-calendar\n [inputId]=\"data[col.code!]\"\n [ngModel]=\"data[col.code!]\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ data[col.code!] | customDate }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n </ng-template>\n\n <ng-template #normalInput>\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"data[col.code!]\"\n (change)=\"onChange($event, data.id, col.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.AMOUNT;\n else normalOutput\n \"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalOutput>\n {{ data[col.code!] }}\n </ng-template>\n </ng-template>\n </p-cellEditor>\n </ng-template>\n </td>\n\n <!-- NON-EDITABLE CELL (ALWAYS RENDERED) -->\n <ng-template #normalTD>\n <td\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"[\n getDataAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n >\n <!-- ACTION column: built-in edit/delete + custom actions -->\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.ACTION; else nonActionCell\"\n >\n <div class=\"action-buttons-container\">\n <!-- built-in delete -->\n <button\n *ngIf=\"isDelete\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-trash\"\n (click)=\"Delete(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n\n <!-- built-in inline edit -->\n <div *ngIf=\"isEdit\">\n <button\n pInitEditableRow\n *ngIf=\"!editing\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-pencil\"\n (click)=\"initEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pSaveEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-check\"\n (click)=\"saveEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pCancelEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-times\"\n (click)=\"cancelEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n\n <!-- custom actions -->\n <ng-container *ngFor=\"let act of customActions\">\n <button\n *ngIf=\"isActionVisible(act, data)\"\n pButton\n pRipple\n type=\"button\"\n class=\"p-button-rounded p-button-text\"\n [icon]=\"act.icon || 'pi pi-ellipsis-h'\"\n [ngClass]=\"act.styleClass\"\n [disabled]=\"isActionDisabled(act, data)\"\n (click)=\"onCustomActionClick(act, data)\"\n ></button>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- NON-ACTION cells -->\n <ng-template #nonActionCell>\n <!-- COMPOSED -->\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.COMPOSED;\n else nonComposed\n \"\n >\n <div class=\"composed-cell\">\n <ng-container\n *ngFor=\"\n let composedName of col.composedNames;\n let i = index\n \"\n >\n <!-- IMAGE -->\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.IMAGE\n \"\n >\n <img\n [src]=\"data[col.code!]?.[composedName]\"\n alt=\"composed-img\"\n class=\"composed-image\"\n [ngStyle]=\"\n getImageStyle(col.composedStyles?.[composedName])\n \"\n />\n </ng-container>\n\n <!-- STRING -->\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.STRING\n \"\n >\n <span\n class=\"composed-text\"\n [ngStyle]=\"\n getTitleStyle(col.composedStyles?.[composedName])\n \"\n >\n {{ data[col.code!]?.[composedName] }}\n </span>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #nonComposed>\n <!-- AMOUNT-->\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.AMOUNT; else nonAmount\"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n\n <ng-template #nonAmount>\n <!-- NUMBER-->\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER;\n else nonNumber\n \"\n >\n {{\n formatNumber(\n data[col.code!],\n col.decimalPlaces,\n col.thousandSeparator,\n col.decimalSeparator\n )\n }}\n </ng-container>\n\n <ng-template #nonNumber>\n <!-- DATE -->\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.DATE ||\n col.type === TableTypeEnum.DATETIME;\n else normalTypes\n \"\n >\n <ng-container *ngIf=\"col.type === TableTypeEnum.DATE\">\n {{\n formatDateWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.DATETIME\"\n >\n {{\n formatDateTimeWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n </ng-container>\n\n <ng-template #normalTypes>\n <!-- STRING, MULTISELECT-->\n <ng-container\n *ngIf=\"\n [\n TableTypeEnum.STRING,\n TableTypeEnum.MULTISELECT,\n ].includes(col.type!)\n \"\n >\n {{ data[col.code!] }}\n </ng-container>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-template>\n </ng-container>\n\n <!-- CHILD COLUMNS -->\n <ng-template #childColumns>\n <ng-container *ngFor=\"let child of col.children\">\n <td\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [ngClass]=\"getDataAlignClass(child)\"\n >\n <ng-container\n *ngIf=\"isEditable(child.code); else childNormalTD\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"child.code ? data[child.code] : null\"\n (change)=\"onChange($event, data.id, child.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #childNormalTD>\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </td>\n </ng-container>\n </ng-template>\n </ng-container>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: [".pt-advanced-prime-table .bread-crumb{margin-bottom:15px}.pt-advanced-prime-table .date{width:100%;height:5rem;display:grid;justify-items:start;align-items:center}.pt-advanced-prime-table .filter-container{width:100%;display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .settings{display:flex;gap:1rem}.pt-advanced-prime-table .multi-select-container{display:flex;justify-content:center;align-items:center;gap:.3rem}.pt-advanced-prime-table ::ng-deep p-table{min-width:50rem}.pt-advanced-prime-table ::ng-deep .custom-multiselect .p-hidden-accessible input{display:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column.p-highlight:hover{background:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column:focus{box-shadow:none;outline:0 none}.pt-advanced-prime-table ::ng-deep .header-container{display:flex;justify-content:space-between;align-items:center;width:100%}.pt-advanced-prime-table ::ng-deep .header-title-left,.pt-advanced-prime-table ::ng-deep .header-title-center,.pt-advanced-prime-table ::ng-deep .header-title-right{flex:1}.pt-advanced-prime-table ::ng-deep .header-title-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-title-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-title-right{text-align:right}.pt-advanced-prime-table ::ng-deep .header-align-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-align-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-align-right{text-align:right}.pt-advanced-prime-table ::ng-deep p-columnfilter.p-element.ng-star-inserted{margin-top:4px}.pt-advanced-prime-table .flex{display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .ml-auto{margin-left:auto}.pt-advanced-prime-table ::ng-deep p-inputicon{margin-right:-1.5rem;z-index:2;position:relative}.pt-advanced-prime-table ::ng-deep .p-inputtext{padding-left:1.7rem}.pt-advanced-prime-table ::ng-deep .bt-filter-btn button{cursor:pointer;margin-left:1rem}.pt-advanced-prime-table ::ng-deep .p-icon-field-left .p-input-icon:first-of-type{left:-1rem}.pt-advanced-prime-table .table-row{text-align:center;display:flex;gap:1rem;justify-content:center}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-excel{font-size:1.25em;color:green}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-pdf{font-size:1.25em;color:red}.pt-advanced-prime-table .table-container{display:block;width:100%}.pt-advanced-prime-table ::ng-deep .p-datatable-emptymessage>td.empty-message-cell{padding:0!important}.pt-advanced-prime-table .empty-message-wrapper{width:100%;height:100%;min-height:180px;display:flex;align-items:center;justify-content:center}.pt-advanced-prime-table .empty-message{text-align:center;color:#888;font-size:1.2rem}.pt-advanced-prime-table .empty-message i{display:block;font-size:2rem;margin-bottom:.5rem}.pt-advanced-prime-table th{white-space:normal;word-wrap:break-word}.filter-image{width:22px;height:14px;margin-right:5px}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-left{text-align:left!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-center{text-align:center!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-right{text-align:right!important}.pt-advanced-prime-table ::ng-deep th.action-column,.pt-advanced-prime-table ::ng-deep td.action-column{text-align:center!important;justify-content:center;align-items:center;overflow:hidden;white-space:nowrap;padding:0}.pt-advanced-prime-table ::ng-deep .action-buttons-container{width:100%;display:flex;justify-content:center!important;align-items:center!important;gap:.35rem}.pt-advanced-prime-table ::ng-deep .action-buttons-container .p-button.p-button-rounded.p-button-text{padding:.25rem!important;min-width:22px!important;height:22px!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i2.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i2.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i2.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i2.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i6.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i9.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: i10.IconField, selector: "p-iconField", inputs: ["iconPosition"] }, { kind: "component", type: i11.InputIcon, selector: "p-inputIcon", inputs: ["styleClass"] }, { kind: "pipe", type: i12.CustomCurrencyPipe, name: "customCurrency" }, { kind: "pipe", type: i13.CustomDatePipe, name: "customDate" }] }); }
|
|
805
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTAdvancedPrimeTableComponent, selector: "pt-advanced-prime-table", inputs: { data: "data", columns: "columns", totalRecords: "totalRecords", rowsPerPage: "rowsPerPage", hasSearchFilter: "hasSearchFilter", hasExportExcel: "hasExportExcel", hasExportPDF: "hasExportPDF", hasColumnFilter: "hasColumnFilter", isPaginated: "isPaginated", isLazy: "isLazy", actions: "actions", isSortable: "isSortable", loading: "loading", maxHeight: "maxHeight" }, outputs: { lazyLoad: "lazyLoad", search: "search", exportExcelEvent: "exportExcelEvent", exportPdfEvent: "exportPdfEvent", onPageChange: "onPageChange", onSortColumn: "onSortColumn", onFilterColumn: "onFilterColumn" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"pt-advanced-prime-table table-container\">\n <p-table\n #dt\n [value]=\"data\"\n [loading]=\"loading\"\n [rows]=\"rows\"\n [paginator]=\"isPaginated\"\n [globalFilterFields]=\"globalFilterFields\"\n [rowsPerPageOptions]=\"rowsPerPage\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"isLazy\"\n [filterDelay]=\"0\"\n dataKey=\"id\"\n styleClass=\"p-datatable-gridlines p-datatable-striped\"\n [scrollable]=\"true\"\n [scrollHeight]=\"maxHeight !== null ? maxHeight : undefined\"\n (onPage)=\"changePage($event)\"\n (onSort)=\"sortColumn($event)\"\n (onFilter)=\"filterColumn($event)\"\n >\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col\n *ngFor=\"let col of columns\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n />\n </colgroup>\n </ng-template>\n\n <ng-template pTemplate=\"caption\">\n <div class=\"flex\">\n <div>\n <h3>Total: {{ totalRecords }}</h3>\n </div>\n\n <div>\n <button\n *ngIf=\"hasSearchFilter\"\n pButton\n icon=\"pi pi-filter-slash\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"clear(dt)\"\n title=\"Clear filters\"\n ></button>\n\n <button\n *ngIf=\"hasExportExcel\"\n pButton\n icon=\"pi pi-file-excel\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportExcel()\"\n title=\"Export to Excel\"\n ></button>\n\n <button\n *ngIf=\"hasExportPDF\"\n pButton\n icon=\"pi pi-file-pdf\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportPdf()\"\n title=\"Export to PDF\"\n ></button>\n </div>\n\n <div class=\"ml-auto\" *ngIf=\"hasSearchFilter\">\n <p-iconField iconPosition=\"left\" class=\"ml-auto\">\n <p-inputIcon>\n <i class=\"pi pi-search\"></i>\n </p-inputIcon>\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"searchValue\"\n (input)=\"filterGlobal($event)\"\n placeholder=\"Search keyword\"\n />\n </p-iconField>\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr class=\"sticky-header\">\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"!col.children; else groupHeader\"\n [pSortableColumn]=\"col.code\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [ngClass]=\"[\n getHeaderAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n colspan=\"1\"\n >\n <ng-container\n *ngIf=\"isSortable && col.isSortable !== false; else noSortHeader\"\n >\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n\n <div\n class=\"icons d-flex align-items-center\"\n [style.width]=\"'77px'\"\n >\n <p-sortIcon [field]=\"col.code\" />\n\n <ng-container\n *ngIf=\"hasColumnFilter && col.isFilter !== false\"\n >\n <!-- COMPOSED FILTER -->\n <p-columnFilter\n *ngIf=\"col.type === TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n type=\"text\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n [showMatchModes]=\"false\"\n [showOperator]=\"false\"\n (onClear)=\"onComposedColumnClear(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n >\n <div *ngFor=\"let composedName of col.composedNames\">\n <ng-container\n *ngIf=\"\n getComposedFieldType(col, composedName) ===\n TableTypeEnum.STRING\n \"\n >\n <p-multiSelect\n [options]=\"filters[composedName]?.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"filters[composedName]?.value ?? []\"\n (ngModelChange)=\"\n onComposedFilterValueChange(\n col,\n composedName,\n $event\n );\n filter($event ?? [])\n \"\n [placeholder]=\"filters[composedName]?.placeholder\"\n display=\"chip\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div class=\"custom-multiselect-item\">\n <img\n *ngIf=\"item.image\"\n [src]=\"item.image\"\n alt=\"icon\"\n class=\"filter-image\"\n />\n <span>{{ item.label }}</span>\n </div>\n </ng-template>\n </p-multiSelect>\n </ng-container>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- OTHER TYPES -->\n <p-columnFilter\n *ngIf=\"col.type !== TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n [showMatchModes]=\"col.type !== TableTypeEnum.MULTISELECT\"\n [showOperator]=\"col.type !== TableTypeEnum.MULTISELECT\"\n [matchMode]=\"\n col.type === TableTypeEnum.MULTISELECT\n ? 'in'\n : undefined\n \"\n (onClear)=\"onFilterClear(col.code!)\"\n >\n <!-- NUMBER / AMOUNT -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER ||\n col.type === TableTypeEnum.AMOUNT\n \"\n let-value\n >\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onNumberFilterChange(col.code!, $event)\n \"\n placeholder=\"Enter a number\"\n />\n </ng-template>\n\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"col.type === TableTypeEnum.DATE\"\n let-filter=\"filterCallback\"\n let-value\n >\n <p-calendar\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event)\n \"\n dateFormat=\"dd/mm/yy\"\n placeholder=\"Choose a date\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.MULTISELECT &&\n col.filterOptions &&\n col.filterOptions.length > 0\n \"\n let-filter=\"filterCallback\"\n let-value\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? value ?? []\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event ?? [])\n \"\n display=\"chip\"\n placeholder=\"Choose option\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #noSortHeader>\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n\n <ng-container *ngIf=\"hasColumnFilter && col.isFilter !== false\">\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n >\n <ng-template pTemplate=\"filter\" let-value>\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event)\n \"\n placeholder=\"Enter an amount\"\n />\n </ng-template>\n </p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n [showMatchModes]=\"\n getColumnFilterType(col) !== 'multiSelect'\n \"\n [showOperator]=\"getColumnFilterType(col) !== 'multiSelect'\"\n [matchMode]=\"\n getColumnFilterType(col) === 'multiSelect'\n ? 'in'\n : undefined\n \"\n (onClear)=\"onFilterClear(col.code!)\"\n >\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n let-value\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event)\n \"\n dateFormat=\"dd/mm/yy\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n let-value\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value ?? []\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event ?? [])\n \"\n display=\"chip\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </ng-template>\n </th>\n\n <ng-template #groupHeader>\n <th\n [attr.colspan]=\"col.children?.length\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getHeaderAlignClass(col)\"\n >\n <span>{{ col.title }}</span>\n </th>\n </ng-template>\n </ng-container>\n </tr>\n\n <tr *ngIf=\"hasGroupedColumns\">\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.children\">\n <th\n *ngFor=\"let child of col.children\"\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [style.padding]=\"'0px'\"\n ></th>\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"p-datatable-emptymessage\">\n <td class=\"empty-message-cell\" [attr.colspan]=\"columns.length || 1\">\n <div class=\"empty-message-wrapper\">\n <div class=\"empty-message\">\n <i class=\"pi pi-info-circle\"></i>\n <p>No records available to display.</p>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-data\n let-editing=\"editing\"\n let-ri=\"rowIndex\"\n >\n <tr *ngIf=\"!loading\" [pEditableRow]=\"isEdit ? data : null\">\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"!col.children; else childColumns\">\n <td\n *ngIf=\"\n isEditable(col.code!) && col.type !== TableTypeEnum.ACTION;\n else normalTD\n \"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getDataAlignClass(col)\"\n >\n <ng-container *ngIf=\"isMultiSelect(col.code); else datePicker\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect\n appendTo=\"body\"\n [ngModel]=\"data[col.code!]\"\n [style]=\"{ width: '100%' }\"\n (ngModelChange)=\"changeHandler(data.id, col.code, $event)\"\n [options]=\"optionValues\"\n ></p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div class=\"multi-select-container\">\n <ng-container *ngFor=\"let rec of data[col.code!]\">\n <p-tag [value]=\"rec\"></p-tag>\n </ng-container>\n </div>\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #datePicker>\n <ng-container *ngIf=\"isDatePicker(col.code); else normalInput\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-calendar\n [inputId]=\"data[col.code!]\"\n [ngModel]=\"data[col.code!]\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ data[col.code!] | customDate }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n </ng-template>\n\n <ng-template #normalInput>\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"data[col.code!]\"\n (change)=\"onChange($event, data.id, col.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.AMOUNT;\n else normalOutput\n \"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalOutput>\n {{ data[col.code!] }}\n </ng-template>\n </ng-template>\n </p-cellEditor>\n </ng-template>\n </td>\n\n <ng-template #normalTD>\n <td\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"[\n getDataAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n >\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.ACTION; else nonActionCell\"\n >\n <div class=\"action-buttons-container\">\n <button\n *ngIf=\"isDelete\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-trash\"\n (click)=\"Delete(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n\n <div *ngIf=\"isEdit\">\n <button\n pInitEditableRow\n *ngIf=\"!editing\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-pencil\"\n (click)=\"initEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pSaveEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-check\"\n (click)=\"saveEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pCancelEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-times\"\n (click)=\"cancelEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n\n <ng-container *ngFor=\"let act of customActions\">\n <button\n *ngIf=\"isActionVisible(act, data)\"\n pButton\n pRipple\n type=\"button\"\n class=\"p-button-rounded p-button-text\"\n [icon]=\"act.icon || 'pi pi-ellipsis-h'\"\n [ngClass]=\"act.styleClass\"\n [disabled]=\"isActionDisabled(act, data)\"\n (click)=\"onCustomActionClick(act, data)\"\n ></button>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #nonActionCell>\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.COMPOSED;\n else nonComposed\n \"\n >\n <div class=\"composed-cell\">\n <ng-container\n *ngFor=\"\n let composedName of col.composedNames;\n let i = index\n \"\n >\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.IMAGE\n \"\n >\n <img\n [src]=\"data[col.code!]?.[composedName]\"\n alt=\"composed-img\"\n class=\"composed-image\"\n [ngStyle]=\"\n getImageStyle(col.composedStyles?.[composedName])\n \"\n />\n </ng-container>\n\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.STRING\n \"\n >\n <span\n class=\"composed-text\"\n [ngStyle]=\"\n getTitleStyle(col.composedStyles?.[composedName])\n \"\n >\n {{ data[col.code!]?.[composedName] }}\n </span>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #nonComposed>\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.AMOUNT; else nonAmount\"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n\n <ng-template #nonAmount>\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER;\n else nonNumber\n \"\n >\n {{\n formatNumber(\n data[col.code!],\n col.decimalPlaces,\n col.thousandSeparator,\n col.decimalSeparator\n )\n }}\n </ng-container>\n\n <ng-template #nonNumber>\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.DATE ||\n col.type === TableTypeEnum.DATETIME;\n else normalTypes\n \"\n >\n <ng-container *ngIf=\"col.type === TableTypeEnum.DATE\">\n {{\n formatDateWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.DATETIME\"\n >\n {{\n formatDateTimeWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n </ng-container>\n\n <ng-template #normalTypes>\n <ng-container\n *ngIf=\"\n [\n TableTypeEnum.STRING,\n TableTypeEnum.MULTISELECT,\n ].includes(col.type!)\n \"\n >\n {{ data[col.code!] }}\n </ng-container>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-template>\n </ng-container>\n\n <ng-template #childColumns>\n <ng-container *ngFor=\"let child of col.children\">\n <td\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [ngClass]=\"getDataAlignClass(child)\"\n >\n <ng-container\n *ngIf=\"isEditable(child.code); else childNormalTD\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"child.code ? data[child.code] : null\"\n (change)=\"onChange($event, data.id, child.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #childNormalTD>\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </td>\n </ng-container>\n </ng-template>\n </ng-container>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: [".pt-advanced-prime-table .bread-crumb{margin-bottom:15px}.pt-advanced-prime-table .date{width:100%;height:5rem;display:grid;justify-items:start;align-items:center}.pt-advanced-prime-table .filter-container{width:100%;display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .settings{display:flex;gap:1rem}.pt-advanced-prime-table .multi-select-container{display:flex;justify-content:center;align-items:center;gap:.3rem}.pt-advanced-prime-table ::ng-deep p-table{min-width:50rem}.pt-advanced-prime-table ::ng-deep .custom-multiselect .p-hidden-accessible input{display:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column.p-highlight:hover{background:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column:focus{box-shadow:none;outline:0 none}.pt-advanced-prime-table ::ng-deep .header-container{display:flex;justify-content:space-between;align-items:center;width:100%}.pt-advanced-prime-table ::ng-deep .header-title-left,.pt-advanced-prime-table ::ng-deep .header-title-center,.pt-advanced-prime-table ::ng-deep .header-title-right{flex:1}.pt-advanced-prime-table ::ng-deep .header-title-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-title-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-title-right{text-align:right}.pt-advanced-prime-table ::ng-deep .header-align-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-align-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-align-right{text-align:right}.pt-advanced-prime-table ::ng-deep p-columnfilter.p-element.ng-star-inserted{margin-top:4px}.pt-advanced-prime-table .flex{display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .ml-auto{margin-left:auto}.pt-advanced-prime-table ::ng-deep p-inputicon{margin-right:-1.5rem;z-index:2;position:relative}.pt-advanced-prime-table ::ng-deep .p-inputtext{padding-left:1.7rem}.pt-advanced-prime-table ::ng-deep .bt-filter-btn button{cursor:pointer;margin-left:1rem}.pt-advanced-prime-table ::ng-deep .p-icon-field-left .p-input-icon:first-of-type{left:-1rem}.pt-advanced-prime-table .table-row{text-align:center;display:flex;gap:1rem;justify-content:center}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-excel{font-size:1.25em;color:green}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-pdf{font-size:1.25em;color:red}.pt-advanced-prime-table .table-container{display:block;width:100%}.pt-advanced-prime-table ::ng-deep .p-datatable-emptymessage>td.empty-message-cell{padding:0!important}.pt-advanced-prime-table .empty-message-wrapper{width:100%;height:100%;min-height:180px;display:flex;align-items:center;justify-content:center}.pt-advanced-prime-table .empty-message{text-align:center;color:#888;font-size:1.2rem}.pt-advanced-prime-table .empty-message i{display:block;font-size:2rem;margin-bottom:.5rem}.pt-advanced-prime-table th{white-space:normal;word-wrap:break-word}.filter-image{width:22px;height:14px;margin-right:5px}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-left{text-align:left!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-center{text-align:center!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-right{text-align:right!important}.pt-advanced-prime-table ::ng-deep th.action-column,.pt-advanced-prime-table ::ng-deep td.action-column{text-align:center!important;justify-content:center;align-items:center;overflow:hidden;white-space:nowrap;padding:0}.pt-advanced-prime-table ::ng-deep .action-buttons-container{width:100%;display:flex;justify-content:center!important;align-items:center!important;gap:.35rem}.pt-advanced-prime-table ::ng-deep .action-buttons-container .p-button.p-button-rounded.p-button-text{padding:.25rem!important;min-width:22px!important;height:22px!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i2.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i2.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i2.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i2.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i6.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i9.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: i10.IconField, selector: "p-iconField", inputs: ["iconPosition"] }, { kind: "component", type: i11.InputIcon, selector: "p-inputIcon", inputs: ["styleClass"] }, { kind: "pipe", type: i12.CustomCurrencyPipe, name: "customCurrency" }, { kind: "pipe", type: i13.CustomDatePipe, name: "customDate" }] }); }
|
|
725
806
|
}
|
|
726
807
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTAdvancedPrimeTableComponent, decorators: [{
|
|
727
808
|
type: Component,
|
|
728
|
-
args: [{ selector: 'pt-advanced-prime-table', template: "<div class=\"pt-advanced-prime-table table-container\">\n <p-table\n #dt\n [value]=\"data\"\n [loading]=\"loading\"\n [rows]=\"rows\"\n [paginator]=\"isPaginated\"\n [globalFilterFields]=\"globalFilterFields\"\n [rowsPerPageOptions]=\"rowsPerPage\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"isLazy\"\n dataKey=\"id\"\n styleClass=\"p-datatable-gridlines p-datatable-striped\"\n [scrollable]=\"true\"\n [scrollHeight]=\"maxHeight !== null ? maxHeight : undefined\"\n (onFilter)=\"filterColumn($event)\"\n (onPage)=\"changePage($event)\"\n (onSort)=\"sortColumn($event)\"\n >\n <!-- COLGROUP: sync header/body widths -->\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col\n *ngFor=\"let col of columns\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n />\n </colgroup>\n </ng-template>\n\n <!-- CAPTION -->\n <ng-template pTemplate=\"caption\">\n <div class=\"flex\">\n <div>\n <h3>Total: {{ totalRecords }}</h3>\n </div>\n\n <div>\n <!-- Clear filters -->\n <button\n *ngIf=\"hasSearchFilter\"\n pButton\n icon=\"pi pi-filter-slash\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"clear(dt)\"\n title=\"Clear filters\"\n ></button>\n\n <!-- Export to Excel Button -->\n <button\n *ngIf=\"hasExportExcel\"\n pButton\n icon=\"pi pi-file-excel\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportExcel()\"\n title=\"Export to Excel\"\n ></button>\n\n <!-- Export to PDF Button -->\n <button\n *ngIf=\"hasExportPDF\"\n pButton\n icon=\"pi pi-file-pdf\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportPdf()\"\n title=\"Export to PDF\"\n ></button>\n </div>\n\n <div class=\"ml-auto\" *ngIf=\"hasSearchFilter\">\n <p-iconField iconPosition=\"left\" class=\"ml-auto\">\n <p-inputIcon>\n <i class=\"pi pi-search\"></i>\n </p-inputIcon>\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"searchValue\"\n (input)=\"filterGlobal($event)\"\n placeholder=\"Search keyword\"\n />\n </p-iconField>\n </div>\n </div>\n </ng-template>\n\n <!-- HEADER -->\n <ng-template pTemplate=\"header\">\n <tr class=\"sticky-header\">\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"!col.children; else groupHeader\"\n pSortableColumn=\"{{ col.code }}\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [ngClass]=\"[\n getHeaderAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n colspan=\"1\"\n >\n <!-- SORTABLE HEADER -->\n <ng-container\n *ngIf=\"isSortable && col.isSortable !== false; else noSortHeader\"\n >\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n <div\n class=\"icons d-flex align-items-center\"\n [style.width]=\"'77px'\"\n >\n <p-sortIcon field=\"{{ col.code }}\" />\n\n <!-- COLUMN FILTERS -->\n <ng-container\n *ngIf=\"hasColumnFilter && col.isFilter !== false\"\n >\n <!-- COMPOSED FILTER (uses built-in Apply/Clear) -->\n <p-columnFilter\n *ngIf=\"col.type === TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n type=\"text\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n (onClear)=\"onComposedColumnClear(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n let-filterModel=\"filterModel\"\n >\n <div *ngFor=\"let composedName of col.composedNames\">\n <ng-container\n *ngIf=\"\n getComposedFieldType(col, composedName) ===\n TableTypeEnum.STRING\n \"\n >\n <p-multiSelect\n [options]=\"filters[composedName]?.options\"\n [ngModel]=\"filters[composedName]?.value\"\n (ngModelChange)=\"\n onComposedFilterValueChange(\n col,\n composedName,\n $event,\n filterModel\n )\n \"\n [placeholder]=\"filters[composedName]?.placeholder\"\n display=\"chip\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div class=\"custom-multiselect-item\">\n <img\n *ngIf=\"item.image\"\n [src]=\"item.image\"\n alt=\"icon\"\n class=\"filter-image\"\n />\n <span>{{ item.label }}</span>\n </div>\n </ng-template>\n </p-multiSelect>\n </ng-container>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- OTHER TYPES -->\n <p-columnFilter\n *ngIf=\"col.type !== TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n (onClear)=\"onFilterClear(col.code!)\"\n >\n <!-- NUMBER / AMOUNT: use text input so '.' works -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER ||\n col.type === TableTypeEnum.AMOUNT\n \"\n let-value\n >\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onNumberFilterChange(col.code!, $event)\n \"\n placeholder=\"Enter a number\"\n />\n </ng-template>\n\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"col.type === TableTypeEnum.DATE\"\n let-filterModel=\"filterModel\"\n >\n <p-calendar\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n dateFormat=\"dd/mm/yy\"\n placeholder=\"Choose a date\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.MULTISELECT &&\n col.filterOptions &&\n col.filterOptions.length > 0\n \"\n let-filterModel=\"filterModel\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n display=\"chip\"\n placeholder=\"Choose option\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- NON-SORTABLE HEADER -->\n <ng-template #noSortHeader>\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n\n <ng-container *ngIf=\"hasColumnFilter && col.isFilter !== false\">\n <!-- AMOUNT behaves like NUMBER -->\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-filterModel=\"filterModel\"\n >\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n placeholder=\"Enter an amount\"\n />\n </ng-template>\n </p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n >\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n let-filterModel=\"filterModel\"\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n dateFormat=\"dd/mm/yy\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n let-filterModel=\"filterModel\"\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? filterModel?.value\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, filterModel, $event)\n \"\n display=\"chip\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </ng-template>\n </th>\n\n <!-- GROUPED HEADER -->\n <ng-template #groupHeader>\n <th\n [attr.colspan]=\"col.children?.length\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getHeaderAlignClass(col)\"\n >\n <span>{{ col.title }}</span>\n </th>\n </ng-template>\n </ng-container>\n </tr>\n\n <!-- CHILD HEADERS -->\n <tr *ngIf=\"hasGroupedColumns\">\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.children\">\n <th\n *ngFor=\"let child of col.children\"\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [style.padding]=\"'0px'\"\n ></th>\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n\n <!-- EMPTY MESSAGE -->\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"p-datatable-emptymessage\">\n <!-- span all columns -->\n <td class=\"empty-message-cell\" [attr.colspan]=\"columns.length || 1\">\n <div class=\"empty-message-wrapper\">\n <div class=\"empty-message\">\n <i class=\"pi pi-info-circle\"></i>\n <p>No records available to display.</p>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <!-- BODY -->\n <ng-template\n pTemplate=\"body\"\n let-data\n let-editing=\"editing\"\n let-ri=\"rowIndex\"\n >\n <tr *ngIf=\"!loading\" [pEditableRow]=\"isEdit ? data : null\">\n <ng-container *ngFor=\"let col of columns\">\n <!-- SIMPLE COLUMNS (no children) -->\n <ng-container *ngIf=\"!col.children; else childColumns\">\n <!-- EDITABLE CELL -->\n <td\n *ngIf=\"\n isEditable(col.code!) && col.type !== TableTypeEnum.ACTION;\n else normalTD\n \"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getDataAlignClass(col)\"\n >\n <!-- Editable input for NUMBER/DATE/STRING/MULTISELECT -->\n <ng-container *ngIf=\"isMultiSelect(col.code); else datePicker\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect\n appendTo=\"body\"\n [ngModel]=\"data[col.code!]\"\n [style]=\"{ width: '100%' }\"\n (ngModelChange)=\"changeHandler(data.id, col.code, $event)\"\n [options]=\"optionValues\"\n ></p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div class=\"multi-select-container\">\n <ng-container *ngFor=\"let rec of data[col.code!]\">\n <p-tag [value]=\"rec\"></p-tag>\n </ng-container>\n </div>\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #datePicker>\n <ng-container *ngIf=\"isDatePicker(col.code); else normalInput\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-calendar\n [inputId]=\"data[col.code!]\"\n [ngModel]=\"data[col.code!]\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ data[col.code!] | customDate }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n </ng-template>\n\n <ng-template #normalInput>\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"data[col.code!]\"\n (change)=\"onChange($event, data.id, col.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.AMOUNT;\n else normalOutput\n \"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalOutput>\n {{ data[col.code!] }}\n </ng-template>\n </ng-template>\n </p-cellEditor>\n </ng-template>\n </td>\n\n <!-- NON-EDITABLE CELL (ALWAYS RENDERED) -->\n <ng-template #normalTD>\n <td\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"[\n getDataAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n >\n <!-- ACTION column: built-in edit/delete + custom actions -->\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.ACTION; else nonActionCell\"\n >\n <div class=\"action-buttons-container\">\n <!-- built-in delete -->\n <button\n *ngIf=\"isDelete\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-trash\"\n (click)=\"Delete(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n\n <!-- built-in inline edit -->\n <div *ngIf=\"isEdit\">\n <button\n pInitEditableRow\n *ngIf=\"!editing\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-pencil\"\n (click)=\"initEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pSaveEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-check\"\n (click)=\"saveEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pCancelEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-times\"\n (click)=\"cancelEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n\n <!-- custom actions -->\n <ng-container *ngFor=\"let act of customActions\">\n <button\n *ngIf=\"isActionVisible(act, data)\"\n pButton\n pRipple\n type=\"button\"\n class=\"p-button-rounded p-button-text\"\n [icon]=\"act.icon || 'pi pi-ellipsis-h'\"\n [ngClass]=\"act.styleClass\"\n [disabled]=\"isActionDisabled(act, data)\"\n (click)=\"onCustomActionClick(act, data)\"\n ></button>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- NON-ACTION cells -->\n <ng-template #nonActionCell>\n <!-- COMPOSED -->\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.COMPOSED;\n else nonComposed\n \"\n >\n <div class=\"composed-cell\">\n <ng-container\n *ngFor=\"\n let composedName of col.composedNames;\n let i = index\n \"\n >\n <!-- IMAGE -->\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.IMAGE\n \"\n >\n <img\n [src]=\"data[col.code!]?.[composedName]\"\n alt=\"composed-img\"\n class=\"composed-image\"\n [ngStyle]=\"\n getImageStyle(col.composedStyles?.[composedName])\n \"\n />\n </ng-container>\n\n <!-- STRING -->\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.STRING\n \"\n >\n <span\n class=\"composed-text\"\n [ngStyle]=\"\n getTitleStyle(col.composedStyles?.[composedName])\n \"\n >\n {{ data[col.code!]?.[composedName] }}\n </span>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #nonComposed>\n <!-- AMOUNT-->\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.AMOUNT; else nonAmount\"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n\n <ng-template #nonAmount>\n <!-- NUMBER-->\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER;\n else nonNumber\n \"\n >\n {{\n formatNumber(\n data[col.code!],\n col.decimalPlaces,\n col.thousandSeparator,\n col.decimalSeparator\n )\n }}\n </ng-container>\n\n <ng-template #nonNumber>\n <!-- DATE -->\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.DATE ||\n col.type === TableTypeEnum.DATETIME;\n else normalTypes\n \"\n >\n <ng-container *ngIf=\"col.type === TableTypeEnum.DATE\">\n {{\n formatDateWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.DATETIME\"\n >\n {{\n formatDateTimeWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n </ng-container>\n\n <ng-template #normalTypes>\n <!-- STRING, MULTISELECT-->\n <ng-container\n *ngIf=\"\n [\n TableTypeEnum.STRING,\n TableTypeEnum.MULTISELECT,\n ].includes(col.type!)\n \"\n >\n {{ data[col.code!] }}\n </ng-container>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-template>\n </ng-container>\n\n <!-- CHILD COLUMNS -->\n <ng-template #childColumns>\n <ng-container *ngFor=\"let child of col.children\">\n <td\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [ngClass]=\"getDataAlignClass(child)\"\n >\n <ng-container\n *ngIf=\"isEditable(child.code); else childNormalTD\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"child.code ? data[child.code] : null\"\n (change)=\"onChange($event, data.id, child.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #childNormalTD>\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </td>\n </ng-container>\n </ng-template>\n </ng-container>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: [".pt-advanced-prime-table .bread-crumb{margin-bottom:15px}.pt-advanced-prime-table .date{width:100%;height:5rem;display:grid;justify-items:start;align-items:center}.pt-advanced-prime-table .filter-container{width:100%;display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .settings{display:flex;gap:1rem}.pt-advanced-prime-table .multi-select-container{display:flex;justify-content:center;align-items:center;gap:.3rem}.pt-advanced-prime-table ::ng-deep p-table{min-width:50rem}.pt-advanced-prime-table ::ng-deep .custom-multiselect .p-hidden-accessible input{display:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column.p-highlight:hover{background:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column:focus{box-shadow:none;outline:0 none}.pt-advanced-prime-table ::ng-deep .header-container{display:flex;justify-content:space-between;align-items:center;width:100%}.pt-advanced-prime-table ::ng-deep .header-title-left,.pt-advanced-prime-table ::ng-deep .header-title-center,.pt-advanced-prime-table ::ng-deep .header-title-right{flex:1}.pt-advanced-prime-table ::ng-deep .header-title-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-title-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-title-right{text-align:right}.pt-advanced-prime-table ::ng-deep .header-align-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-align-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-align-right{text-align:right}.pt-advanced-prime-table ::ng-deep p-columnfilter.p-element.ng-star-inserted{margin-top:4px}.pt-advanced-prime-table .flex{display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .ml-auto{margin-left:auto}.pt-advanced-prime-table ::ng-deep p-inputicon{margin-right:-1.5rem;z-index:2;position:relative}.pt-advanced-prime-table ::ng-deep .p-inputtext{padding-left:1.7rem}.pt-advanced-prime-table ::ng-deep .bt-filter-btn button{cursor:pointer;margin-left:1rem}.pt-advanced-prime-table ::ng-deep .p-icon-field-left .p-input-icon:first-of-type{left:-1rem}.pt-advanced-prime-table .table-row{text-align:center;display:flex;gap:1rem;justify-content:center}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-excel{font-size:1.25em;color:green}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-pdf{font-size:1.25em;color:red}.pt-advanced-prime-table .table-container{display:block;width:100%}.pt-advanced-prime-table ::ng-deep .p-datatable-emptymessage>td.empty-message-cell{padding:0!important}.pt-advanced-prime-table .empty-message-wrapper{width:100%;height:100%;min-height:180px;display:flex;align-items:center;justify-content:center}.pt-advanced-prime-table .empty-message{text-align:center;color:#888;font-size:1.2rem}.pt-advanced-prime-table .empty-message i{display:block;font-size:2rem;margin-bottom:.5rem}.pt-advanced-prime-table th{white-space:normal;word-wrap:break-word}.filter-image{width:22px;height:14px;margin-right:5px}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-left{text-align:left!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-center{text-align:center!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-right{text-align:right!important}.pt-advanced-prime-table ::ng-deep th.action-column,.pt-advanced-prime-table ::ng-deep td.action-column{text-align:center!important;justify-content:center;align-items:center;overflow:hidden;white-space:nowrap;padding:0}.pt-advanced-prime-table ::ng-deep .action-buttons-container{width:100%;display:flex;justify-content:center!important;align-items:center!important;gap:.35rem}.pt-advanced-prime-table ::ng-deep .action-buttons-container .p-button.p-button-rounded.p-button-text{padding:.25rem!important;min-width:22px!important;height:22px!important}\n"] }]
|
|
809
|
+
args: [{ selector: 'pt-advanced-prime-table', template: "<div class=\"pt-advanced-prime-table table-container\">\n <p-table\n #dt\n [value]=\"data\"\n [loading]=\"loading\"\n [rows]=\"rows\"\n [paginator]=\"isPaginated\"\n [globalFilterFields]=\"globalFilterFields\"\n [rowsPerPageOptions]=\"rowsPerPage\"\n [totalRecords]=\"totalRecords\"\n [lazy]=\"isLazy\"\n [filterDelay]=\"0\"\n dataKey=\"id\"\n styleClass=\"p-datatable-gridlines p-datatable-striped\"\n [scrollable]=\"true\"\n [scrollHeight]=\"maxHeight !== null ? maxHeight : undefined\"\n (onPage)=\"changePage($event)\"\n (onSort)=\"sortColumn($event)\"\n (onFilter)=\"filterColumn($event)\"\n >\n <ng-template pTemplate=\"colgroup\" let-columns>\n <colgroup>\n <col\n *ngFor=\"let col of columns\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n />\n </colgroup>\n </ng-template>\n\n <ng-template pTemplate=\"caption\">\n <div class=\"flex\">\n <div>\n <h3>Total: {{ totalRecords }}</h3>\n </div>\n\n <div>\n <button\n *ngIf=\"hasSearchFilter\"\n pButton\n icon=\"pi pi-filter-slash\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"clear(dt)\"\n title=\"Clear filters\"\n ></button>\n\n <button\n *ngIf=\"hasExportExcel\"\n pButton\n icon=\"pi pi-file-excel\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportExcel()\"\n title=\"Export to Excel\"\n ></button>\n\n <button\n *ngIf=\"hasExportPDF\"\n pButton\n icon=\"pi pi-file-pdf\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportPdf()\"\n title=\"Export to PDF\"\n ></button>\n </div>\n\n <div class=\"ml-auto\" *ngIf=\"hasSearchFilter\">\n <p-iconField iconPosition=\"left\" class=\"ml-auto\">\n <p-inputIcon>\n <i class=\"pi pi-search\"></i>\n </p-inputIcon>\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"searchValue\"\n (input)=\"filterGlobal($event)\"\n placeholder=\"Search keyword\"\n />\n </p-iconField>\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr class=\"sticky-header\">\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"!col.children; else groupHeader\"\n [pSortableColumn]=\"col.code\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [ngClass]=\"[\n getHeaderAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n colspan=\"1\"\n >\n <ng-container\n *ngIf=\"isSortable && col.isSortable !== false; else noSortHeader\"\n >\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n\n <div\n class=\"icons d-flex align-items-center\"\n [style.width]=\"'77px'\"\n >\n <p-sortIcon [field]=\"col.code\" />\n\n <ng-container\n *ngIf=\"hasColumnFilter && col.isFilter !== false\"\n >\n <!-- COMPOSED FILTER -->\n <p-columnFilter\n *ngIf=\"col.type === TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n type=\"text\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n [showMatchModes]=\"false\"\n [showOperator]=\"false\"\n (onClear)=\"onComposedColumnClear(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n >\n <div *ngFor=\"let composedName of col.composedNames\">\n <ng-container\n *ngIf=\"\n getComposedFieldType(col, composedName) ===\n TableTypeEnum.STRING\n \"\n >\n <p-multiSelect\n [options]=\"filters[composedName]?.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"filters[composedName]?.value ?? []\"\n (ngModelChange)=\"\n onComposedFilterValueChange(\n col,\n composedName,\n $event\n );\n filter($event ?? [])\n \"\n [placeholder]=\"filters[composedName]?.placeholder\"\n display=\"chip\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div class=\"custom-multiselect-item\">\n <img\n *ngIf=\"item.image\"\n [src]=\"item.image\"\n alt=\"icon\"\n class=\"filter-image\"\n />\n <span>{{ item.label }}</span>\n </div>\n </ng-template>\n </p-multiSelect>\n </ng-container>\n </div>\n </ng-template>\n </p-columnFilter>\n\n <!-- OTHER TYPES -->\n <p-columnFilter\n *ngIf=\"col.type !== TableTypeEnum.COMPOSED\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n [showMatchModes]=\"col.type !== TableTypeEnum.MULTISELECT\"\n [showOperator]=\"col.type !== TableTypeEnum.MULTISELECT\"\n [matchMode]=\"\n col.type === TableTypeEnum.MULTISELECT\n ? 'in'\n : undefined\n \"\n (onClear)=\"onFilterClear(col.code!)\"\n >\n <!-- NUMBER / AMOUNT -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER ||\n col.type === TableTypeEnum.AMOUNT\n \"\n let-value\n >\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onNumberFilterChange(col.code!, $event)\n \"\n placeholder=\"Enter a number\"\n />\n </ng-template>\n\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"col.type === TableTypeEnum.DATE\"\n let-filter=\"filterCallback\"\n let-value\n >\n <p-calendar\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event)\n \"\n dateFormat=\"dd/mm/yy\"\n placeholder=\"Choose a date\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n *ngIf=\"\n col.type === TableTypeEnum.MULTISELECT &&\n col.filterOptions &&\n col.filterOptions.length > 0\n \"\n let-filter=\"filterCallback\"\n let-value\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"\n latestFilterValues[col.code!] ?? value ?? []\n \"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event ?? [])\n \"\n display=\"chip\"\n placeholder=\"Choose option\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #noSortHeader>\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span [ngClass]=\"getHeaderTitleClass(col)\">\n {{ col.title }}\n </span>\n\n <ng-container *ngIf=\"hasColumnFilter && col.isFilter !== false\">\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n >\n <ng-template pTemplate=\"filter\" let-value>\n <input\n pInputText\n type=\"text\"\n inputmode=\"decimal\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event)\n \"\n placeholder=\"Enter an amount\"\n />\n </ng-template>\n </p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [showApplyButton]=\"true\"\n [showClearButton]=\"true\"\n [showMatchModes]=\"\n getColumnFilterType(col) !== 'multiSelect'\n \"\n [showOperator]=\"getColumnFilterType(col) !== 'multiSelect'\"\n [matchMode]=\"\n getColumnFilterType(col) === 'multiSelect'\n ? 'in'\n : undefined\n \"\n (onClear)=\"onFilterClear(col.code!)\"\n >\n <!-- DATE -->\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n let-value\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"latestFilterValues[col.code!] ?? value\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event)\n \"\n dateFormat=\"dd/mm/yy\"\n ></p-calendar>\n </ng-template>\n\n <!-- MULTISELECT -->\n <ng-template\n pTemplate=\"filter\"\n let-filter=\"filterCallback\"\n let-value\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"latestFilterValues[col.code!] ?? value ?? []\"\n (ngModelChange)=\"\n onFilterValueChange(col.code!, null, $event);\n filter($event ?? [])\n \"\n display=\"chip\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </ng-template>\n </th>\n\n <ng-template #groupHeader>\n <th\n [attr.colspan]=\"col.children?.length\"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getHeaderAlignClass(col)\"\n >\n <span>{{ col.title }}</span>\n </th>\n </ng-template>\n </ng-container>\n </tr>\n\n <tr *ngIf=\"hasGroupedColumns\">\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.children\">\n <th\n *ngFor=\"let child of col.children\"\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [style.padding]=\"'0px'\"\n ></th>\n </ng-container>\n </ng-container>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr class=\"p-datatable-emptymessage\">\n <td class=\"empty-message-cell\" [attr.colspan]=\"columns.length || 1\">\n <div class=\"empty-message-wrapper\">\n <div class=\"empty-message\">\n <i class=\"pi pi-info-circle\"></i>\n <p>No records available to display.</p>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-data\n let-editing=\"editing\"\n let-ri=\"rowIndex\"\n >\n <tr *ngIf=\"!loading\" [pEditableRow]=\"isEdit ? data : null\">\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"!col.children; else childColumns\">\n <td\n *ngIf=\"\n isEditable(col.code!) && col.type !== TableTypeEnum.ACTION;\n else normalTD\n \"\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"getDataAlignClass(col)\"\n >\n <ng-container *ngIf=\"isMultiSelect(col.code); else datePicker\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect\n appendTo=\"body\"\n [ngModel]=\"data[col.code!]\"\n [style]=\"{ width: '100%' }\"\n (ngModelChange)=\"changeHandler(data.id, col.code, $event)\"\n [options]=\"optionValues\"\n ></p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div class=\"multi-select-container\">\n <ng-container *ngFor=\"let rec of data[col.code!]\">\n <p-tag [value]=\"rec\"></p-tag>\n </ng-container>\n </div>\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #datePicker>\n <ng-container *ngIf=\"isDatePicker(col.code); else normalInput\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-calendar\n [inputId]=\"data[col.code!]\"\n [ngModel]=\"data[col.code!]\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ data[col.code!] | customDate }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n </ng-template>\n\n <ng-template #normalInput>\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"data[col.code!]\"\n (change)=\"onChange($event, data.id, col.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.AMOUNT;\n else normalOutput\n \"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalOutput>\n {{ data[col.code!] }}\n </ng-template>\n </ng-template>\n </p-cellEditor>\n </ng-template>\n </td>\n\n <ng-template #normalTD>\n <td\n [style.width]=\"col.width || getHeaderWidth(col)\"\n [ngClass]=\"[\n getDataAlignClass(col),\n col.type === TableTypeEnum.ACTION ? 'action-column' : '',\n ]\"\n >\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.ACTION; else nonActionCell\"\n >\n <div class=\"action-buttons-container\">\n <button\n *ngIf=\"isDelete\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-trash\"\n (click)=\"Delete(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n\n <div *ngIf=\"isEdit\">\n <button\n pInitEditableRow\n *ngIf=\"!editing\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-pencil\"\n (click)=\"initEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pSaveEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-check\"\n (click)=\"saveEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pCancelEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-times\"\n (click)=\"cancelEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n\n <ng-container *ngFor=\"let act of customActions\">\n <button\n *ngIf=\"isActionVisible(act, data)\"\n pButton\n pRipple\n type=\"button\"\n class=\"p-button-rounded p-button-text\"\n [icon]=\"act.icon || 'pi pi-ellipsis-h'\"\n [ngClass]=\"act.styleClass\"\n [disabled]=\"isActionDisabled(act, data)\"\n (click)=\"onCustomActionClick(act, data)\"\n ></button>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #nonActionCell>\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.COMPOSED;\n else nonComposed\n \"\n >\n <div class=\"composed-cell\">\n <ng-container\n *ngFor=\"\n let composedName of col.composedNames;\n let i = index\n \"\n >\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.IMAGE\n \"\n >\n <img\n [src]=\"data[col.code!]?.[composedName]\"\n alt=\"composed-img\"\n class=\"composed-image\"\n [ngStyle]=\"\n getImageStyle(col.composedStyles?.[composedName])\n \"\n />\n </ng-container>\n\n <ng-container\n *ngIf=\"\n col.composedTypes &&\n col.composedTypes[i] === TableTypeEnum.STRING\n \"\n >\n <span\n class=\"composed-text\"\n [ngStyle]=\"\n getTitleStyle(col.composedStyles?.[composedName])\n \"\n >\n {{ data[col.code!]?.[composedName] }}\n </span>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #nonComposed>\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.AMOUNT; else nonAmount\"\n >\n {{\n data[col.code!]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n\n <ng-template #nonAmount>\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.NUMBER;\n else nonNumber\n \"\n >\n {{\n formatNumber(\n data[col.code!],\n col.decimalPlaces,\n col.thousandSeparator,\n col.decimalSeparator\n )\n }}\n </ng-container>\n\n <ng-template #nonNumber>\n <ng-container\n *ngIf=\"\n col.type === TableTypeEnum.DATE ||\n col.type === TableTypeEnum.DATETIME;\n else normalTypes\n \"\n >\n <ng-container *ngIf=\"col.type === TableTypeEnum.DATE\">\n {{\n formatDateWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n\n <ng-container\n *ngIf=\"col.type === TableTypeEnum.DATETIME\"\n >\n {{\n formatDateTimeWithColumn(\n parseAnyDate(data[col.code!]),\n col\n )\n }}\n </ng-container>\n </ng-container>\n\n <ng-template #normalTypes>\n <ng-container\n *ngIf=\"\n [\n TableTypeEnum.STRING,\n TableTypeEnum.MULTISELECT,\n ].includes(col.type!)\n \"\n >\n {{ data[col.code!] }}\n </ng-container>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </ng-template>\n </td>\n </ng-template>\n </ng-container>\n\n <ng-template #childColumns>\n <ng-container *ngFor=\"let child of col.children\">\n <td\n [style.width]=\"child.width || getHeaderWidth(child)\"\n [ngClass]=\"getDataAlignClass(child)\"\n >\n <ng-container\n *ngIf=\"isEditable(child.code); else childNormalTD\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"child.code ? data[child.code] : null\"\n (change)=\"onChange($event, data.id, child.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <ng-template #childNormalTD>\n {{ child.code ? data[child.code] : \"\" }}\n </ng-template>\n </td>\n </ng-container>\n </ng-template>\n </ng-container>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: [".pt-advanced-prime-table .bread-crumb{margin-bottom:15px}.pt-advanced-prime-table .date{width:100%;height:5rem;display:grid;justify-items:start;align-items:center}.pt-advanced-prime-table .filter-container{width:100%;display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .settings{display:flex;gap:1rem}.pt-advanced-prime-table .multi-select-container{display:flex;justify-content:center;align-items:center;gap:.3rem}.pt-advanced-prime-table ::ng-deep p-table{min-width:50rem}.pt-advanced-prime-table ::ng-deep .custom-multiselect .p-hidden-accessible input{display:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column.p-highlight:hover{background:none}.pt-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column:focus{box-shadow:none;outline:0 none}.pt-advanced-prime-table ::ng-deep .header-container{display:flex;justify-content:space-between;align-items:center;width:100%}.pt-advanced-prime-table ::ng-deep .header-title-left,.pt-advanced-prime-table ::ng-deep .header-title-center,.pt-advanced-prime-table ::ng-deep .header-title-right{flex:1}.pt-advanced-prime-table ::ng-deep .header-title-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-title-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-title-right{text-align:right}.pt-advanced-prime-table ::ng-deep .header-align-left{text-align:left}.pt-advanced-prime-table ::ng-deep .header-align-center{text-align:center}.pt-advanced-prime-table ::ng-deep .header-align-right{text-align:right}.pt-advanced-prime-table ::ng-deep p-columnfilter.p-element.ng-star-inserted{margin-top:4px}.pt-advanced-prime-table .flex{display:flex;justify-content:space-between;align-items:center}.pt-advanced-prime-table .ml-auto{margin-left:auto}.pt-advanced-prime-table ::ng-deep p-inputicon{margin-right:-1.5rem;z-index:2;position:relative}.pt-advanced-prime-table ::ng-deep .p-inputtext{padding-left:1.7rem}.pt-advanced-prime-table ::ng-deep .bt-filter-btn button{cursor:pointer;margin-left:1rem}.pt-advanced-prime-table ::ng-deep .p-icon-field-left .p-input-icon:first-of-type{left:-1rem}.pt-advanced-prime-table .table-row{text-align:center;display:flex;gap:1rem;justify-content:center}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-excel{font-size:1.25em;color:green}.pt-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-pdf{font-size:1.25em;color:red}.pt-advanced-prime-table .table-container{display:block;width:100%}.pt-advanced-prime-table ::ng-deep .p-datatable-emptymessage>td.empty-message-cell{padding:0!important}.pt-advanced-prime-table .empty-message-wrapper{width:100%;height:100%;min-height:180px;display:flex;align-items:center;justify-content:center}.pt-advanced-prime-table .empty-message{text-align:center;color:#888;font-size:1.2rem}.pt-advanced-prime-table .empty-message i{display:block;font-size:2rem;margin-bottom:.5rem}.pt-advanced-prime-table th{white-space:normal;word-wrap:break-word}.filter-image{width:22px;height:14px;margin-right:5px}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-left{text-align:left!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-center{text-align:center!important}.pt-advanced-prime-table ::ng-deep .p-datatable-tbody>tr>td.cell-align-right{text-align:right!important}.pt-advanced-prime-table ::ng-deep th.action-column,.pt-advanced-prime-table ::ng-deep td.action-column{text-align:center!important;justify-content:center;align-items:center;overflow:hidden;white-space:nowrap;padding:0}.pt-advanced-prime-table ::ng-deep .action-buttons-container{width:100%;display:flex;justify-content:center!important;align-items:center!important;gap:.35rem}.pt-advanced-prime-table ::ng-deep .action-buttons-container .p-button.p-button-rounded.p-button-text{padding:.25rem!important;min-width:22px!important;height:22px!important}\n"] }]
|
|
729
810
|
}], propDecorators: { data: [{
|
|
730
811
|
type: Input
|
|
731
812
|
}], columns: [{
|
|
@@ -754,6 +835,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
754
835
|
type: Input
|
|
755
836
|
}], maxHeight: [{
|
|
756
837
|
type: Input
|
|
838
|
+
}], lazyLoad: [{
|
|
839
|
+
type: Output
|
|
757
840
|
}], search: [{
|
|
758
841
|
type: Output
|
|
759
842
|
}], exportExcelEvent: [{
|
|
@@ -770,4 +853,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
770
853
|
type: ViewChild,
|
|
771
854
|
args: ['dt', { static: false }]
|
|
772
855
|
}] } });
|
|
773
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcHJpbWUtdG9vbHMvc3JjL2xpYi9wdC1hZHZhbmNlZC1wcmltZS10YWJsZS9wdC1hZHZhbmNlZC1wcmltZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWFkdmFuY2VkLXByaW1lLXRhYmxlL3B0LWFkdmFuY2VkLXByaW1lLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxTQUFTLEVBR1QsYUFBYSxHQUVkLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWlCeEQsTUFBTSxPQUFPLDZCQUE2QjtJQUwxQztRQU1XLFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsZ0JBQVcsR0FBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFakMsbUJBQW1CO1FBQ1YsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFNUIsK0NBQStDO1FBQ3RDLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixZQUFPLEdBQTBCLEVBQUUsQ0FB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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDOytHQXQxQlUsNkJBQTZCO21HQUE3Qiw2QkFBNkIsMnVCQ25DMUMsb3Y1QkE2dEJBOzs0RkQxckJhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSx5QkFBeUI7OEJBSzFCLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksTUFBTTtzQkFBZixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUU2QixFQUFFO3NCQUFyQyxTQUFTO3VCQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWxpZ25FbnVtLFxuICBJbWFnZVN0eWxlLFxuICBUYWJsZUNvbHVtbixcbiAgVGFibGVUeXBlRW51bSxcbiAgVGl0bGVTdHlsZSxcbn0gZnJvbSAnLi4vLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBjYWxjdWxhdGVUZXh0V2lkdGggfSBmcm9tICcuLi91dGlscy90ZXh0LnV0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBUVGFibGVBY3Rpb25Db25maWcge1xuICBjb2RlOiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIHN0eWxlQ2xhc3M/OiBzdHJpbmc7XG4gIHRvb2x0aXA/OiBzdHJpbmc7XG4gIGFjdGlvbjogYW55O1xuICB2aXNpYmxlPzogYm9vbGVhbiB8ICgocm93OiBhbnkpID0+IGJvb2xlYW4pO1xuICBkaXNhYmxlZD86IGJvb2xlYW4gfCAoKHJvdzogYW55KSA9PiBib29sZWFuKTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtYWR2YW5jZWQtcHJpbWUtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHQtYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHQtYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFBUQWR2YW5jZWRQcmltZVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyA9IDA7XG4gIEBJbnB1dCgpIHJvd3NQZXJQYWdlOiBudW1iZXJbXSA9IFsxMCwgMjAsIDMwXTtcbiAgQElucHV0KCkgaGFzU2VhcmNoRmlsdGVyID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhhc0V4cG9ydEV4Y2VsID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhhc0V4cG9ydFBERiA9IGZhbHNlO1xuICBASW5wdXQoKSBoYXNDb2x1bW5GaWx0ZXIgPSBmYWxzZTtcblxuICAvKiogcGFnaW5hdG9yIFVJICovXG4gIEBJbnB1dCgpIGlzUGFnaW5hdGVkID0gdHJ1ZTtcblxuICAvKiog4pyFIHNlcnZlci1zaWRlIG1vZGUgKFByaW1lTkcgbGF6eSA9IHRydWUpICovXG4gIEBJbnB1dCgpIGlzTGF6eSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGFjdGlvbnM6IFBUVGFibGVBY3Rpb25Db25maWdbXSA9IFtdO1xuICBASW5wdXQoKSBpc1NvcnRhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgbWF4SGVpZ2h0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBleHBvcnRFeGNlbEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgZXhwb3J0UGRmRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvblBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFnZTogbnVtYmVyOyByb3dzOiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIG9uU29ydENvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25GaWx0ZXJDb2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdkdCcsIHsgc3RhdGljOiBmYWxzZSB9KSBkdCE6IFRhYmxlO1xuXG4gIHB1YmxpYyBUYWJsZVR5cGVFbnVtID0gVGFibGVUeXBlRW51bTtcbiAgcHVibGljIEFsaWduRW51bSA9IEFsaWduRW51bTtcblxuICBzZWFyY2hWYWx1ZSA9ICcnO1xuXG4gIHB1YmxpYyBmaWx0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGxhdGVzdEZpbHRlclZhbHVlczogeyBbZmllbGQ6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgY2xlYXJlZEZpZWxkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgdmFsaWRDdXJyZW5jeUNvZGVzID0gWydVU0QnLCAnRVVSJywgJ01BRCddO1xuICBpY29uV2lkdGggPSA3NztcblxuICByb3dzID0gMDtcbiAgaGFzR3JvdXBlZENvbHVtbnMgPSBmYWxzZTtcblxuICBpc0RlbGV0ZSA9IGZhbHNlO1xuICBpc0VkaXQgPSBmYWxzZTtcblxuICBEZWxldGU6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGluaXRFZGl0YWJsZVJvdzogKGRhdGE6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBzYXZlRWRpdGFibGVSb3c6IChkYXRhOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgY2FuY2VsRWRpdGFibGVSb3c6IChpdGVtOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjdXN0b21BY3Rpb25zOiBQVFRhYmxlQWN0aW9uQ29uZmlnW10gPSBbXTtcblxuICBkYXRhTWFwID0gbmV3IE1hcDxhbnksIGFueT4oKTtcbiAgbWFwID0gbmV3IE1hcDxhbnksIE1hcDxhbnksIGFueT4+KCk7XG4gIG9wdGlvbkVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gIG9wdGlvblZhbHVlczogYW55W10gPSBbXTtcbiAgZ2xvYmFsRmlsdGVyRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaGFzR3JvdXBlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuc29tZShcbiAgICAgIChjb2wpID0+IGNvbC5jaGlsZHJlbiAmJiBjb2wuY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMgPSB0aGlzLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLmNvZGUgIT09IHVuZGVmaW5lZCAmJiBjb2wuaXNGaWx0ZXIgIT09IGZhbHNlKVxuICAgICAgLm1hcCgoY29sKSA9PiBjb2wuY29kZSBhcyBzdHJpbmcpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUFjdGlvbnMoKTtcblxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BQ1RJT04pIHtcbiAgICAgICAgY29sLmlzRWRpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgY29sLmlzRmlsdGVyID0gZmFsc2U7XG4gICAgICAgIGNvbC5pc1NvcnRhYmxlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5DT01QT1NFRCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDb21wb3NlZEZpbHRlcnMoY29sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbC5pc1NvcnRhYmxlID09PSB1bmRlZmluZWQpIGNvbC5pc1NvcnRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChjb2wuaXNFZGl0YWJsZSA9PT0gdW5kZWZpbmVkKSBjb2wuaXNFZGl0YWJsZSA9IHRydWU7XG5cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXIgIT09IGZhbHNlICYmIGNvbC5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMucHVzaChjb2wuY29kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY29sLndpZHRoKSBjb2wud2lkdGggPSB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKGNvbCk7XG4gICAgfSk7XG5cbiAgICAvLyDinIUgY2xpZW50LXNpZGUgbW9kZTogdG90YWxSZWNvcmRzID0gZGF0YS5sZW5ndGggYnkgZGVmYXVsdFxuICAgIGlmICghdGhpcy5pc0xhenkpIHtcbiAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gdGhpcy5kYXRhPy5sZW5ndGggPz8gMDtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8g4pyFIHdoZW4gZGF0YSBjaGFuZ2VzIGluIGNsaWVudC1zaWRlIG1vZGUsIGtlZXAgcGFnaW5hdG9yIGNvbnNpc3RlbnRcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmICF0aGlzLmlzTGF6eSkge1xuICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLmRhdGE/Lmxlbmd0aCA/PyAwO1xuXG4gICAgICAvLyBpZiB3ZSB3ZXJlIG9uIHBhZ2UgPiAxLCBnbyBiYWNrIHRvIGZpcnN0IHBhZ2UgKGF2b2lkcyBlbXB0eSB2aWV3KVxuICAgICAgaWYgKHRoaXMuZHQpIHRoaXMuZHQuZmlyc3QgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gSEVBREVSICsgQk9EWSBBTElHTk1FTlQgSEVMUEVSUyAtLS0tLS0tLS0tXG5cbiAgZ2V0SGVhZGVyVGl0bGVDbGFzcyhjb2w6IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbiA9IGNvbC5oZWFkZXJBbGlnbiA/PyBBbGlnbkVudW0uTEVGVDtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlIEFsaWduRW51bS5DRU5URVI6XG4gICAgICAgIHJldHVybiAnaGVhZGVyLXRpdGxlLWNlbnRlcic7XG4gICAgICBjYXNlIEFsaWduRW51bS5SSUdIVDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItdGl0bGUtcmlnaHQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItdGl0bGUtbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVhZGVyQWxpZ25DbGFzcyhjb2w6IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbiA9IGNvbC5oZWFkZXJBbGlnbiA/PyBBbGlnbkVudW0uTEVGVDtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlIEFsaWduRW51bS5DRU5URVI6XG4gICAgICAgIHJldHVybiAnaGVhZGVyLWFsaWduLWNlbnRlcic7XG4gICAgICBjYXNlIEFsaWduRW51bS5SSUdIVDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItYWxpZ24tcmlnaHQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItYWxpZ24tbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGF0YUFsaWduQ2xhc3MoY29sOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3QgZWZmZWN0aXZlQWxpZ24gPVxuICAgICAgY29sLmRhdGFBbGlnbiA/P1xuICAgICAgKGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLk5VTUJFUiB8fCBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BTU9VTlRcbiAgICAgICAgPyBBbGlnbkVudW0uUklHSFRcbiAgICAgICAgOiBBbGlnbkVudW0uTEVGVCk7XG5cbiAgICBzd2l0Y2ggKGVmZmVjdGl2ZUFsaWduKSB7XG4gICAgICBjYXNlIEFsaWduRW51bS5DRU5URVI6XG4gICAgICAgIHJldHVybiAnY2VsbC1hbGlnbi1jZW50ZXInO1xuICAgICAgY2FzZSBBbGlnbkVudW0uUklHSFQ6XG4gICAgICAgIHJldHVybiAnY2VsbC1hbGlnbi1yaWdodCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NlbGwtYWxpZ24tbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLSBBQ1RJT05TIElOSVRJQUxJWkFUSU9OIC0tLS0tLS0tLS1cblxuICBwcml2YXRlIGluaXRpYWxpemVBY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEZWxldGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICAgIHRoaXMuRGVsZXRlID0gKCkgPT4ge307XG4gICAgdGhpcy5pbml0RWRpdGFibGVSb3cgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnNhdmVFZGl0YWJsZVJvdyA9ICgpID0+IHt9O1xuICAgIHRoaXMuY2FuY2VsRWRpdGFibGVSb3cgPSAoKSA9PiB7fTtcbiAgICB0aGlzLmN1c3RvbUFjdGlvbnMgPSBbXTtcblxuICAgIGlmICghdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRoaXMuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLmNvZGUpIHtcbiAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICB0aGlzLmlzRGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLkRlbGV0ZSA9IChyb3c6IGFueSkgPT4gYWN0aW9uLmFjdGlvbihyb3cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVFZGl0QWN0aW9ucyhhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuY3VzdG9tQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVFZGl0QWN0aW9ucyhhY3Rpb246IFBUVGFibGVBY3Rpb25Db25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdCA9IHRydWU7XG4gICAgdGhpcy5pbml0RWRpdGFibGVSb3cgPSAoZGF0YTogYW55KSA9PiBhY3Rpb24uYWN0aW9uLmluaXQoZGF0YSk7XG4gICAgdGhpcy5zYXZlRWRpdGFibGVSb3cgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLm1hcC5nZXQoZGF0YS5pZCk7XG4gICAgICBhY3Rpb24uYWN0aW9uLnNhdmUoZGF0YSwgcmVjb3JkKTtcbiAgICAgIHRoaXMuZGF0YU1hcC5jbGVhcigpO1xuICAgIH07XG4gICAgdGhpcy5jYW5jZWxFZGl0YWJsZVJvdyA9IChpdGVtOiBhbnkpID0+IGNvbnNvbGUubG9nKGl0ZW0pO1xuICB9XG5cbiAgb25DdXN0b21BY3Rpb25DbGljayhhY3Rpb246IFBUVGFibGVBY3Rpb25Db25maWcsIHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aW9uVmlzaWJsZShhY3Rpb24sIHJvdykpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0FjdGlvbkRpc2FibGVkKGFjdGlvbiwgcm93KSkgcmV0dXJuO1xuXG4gICAgaWYgKGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBhY3Rpb24uYWN0aW9uKHJvdyksIDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gRklMVEVSSU5HIC8gU09SVElORyAvIFBBR0lOQVRJT04gLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbXBvc2VkRmlsdGVycyhjb2w6IFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgY29sLmNvbXBvc2VkTmFtZXM/LmZvckVhY2goKGNvbXBvc2VkTmFtZSkgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IChjb2wuY29kZSBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMucHVzaChjb2RlICsgJy4nICsgY29tcG9zZWROYW1lKTtcbiAgICAgIHRoaXMuZmlsdGVyc1tjb21wb3NlZE5hbWVdID0ge1xuICAgICAgICBvcHRpb25zOiBjb2wuZmlsdGVyT3B0aW9ucyxcbiAgICAgICAgdmFsdWU6IFtdLFxuICAgICAgICBsYWJlbDogJ0ZpbHRlciBieSAnICsgY29tcG9zZWROYW1lLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBvcHRpb24nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbXBvc2VkRmllbGRUeXBlKFxuICAgIGNvbDogVGFibGVDb2x1bW4sXG4gICAgY29tcG9zZWROYW1lOiBzdHJpbmcsXG4gICk6IFRhYmxlVHlwZUVudW0gfCB1bmRlZmluZWQge1xuICAgIGlmIChjb2wuY29tcG9zZWROYW1lcyAmJiBjb2wuY29tcG9zZWRUeXBlcykge1xuICAgICAgY29uc3QgaW5kZXggPSBjb2wuY29tcG9zZWROYW1lcy5pbmRleE9mKGNvbXBvc2VkTmFtZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGNvbC5jb21wb3NlZFR5cGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gY29sLmNvbXBvc2VkVHlwZXNbaW5kZXhdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgb25Db21wb3NlZENvbHVtbkNsZWFyKGNvbDogVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbC5jb2RlIHx8ICFjb2wuY29tcG9zZWROYW1lcykgcmV0dXJuO1xuXG4gICAgY29sLmNvbXBvc2VkTmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7Y29sLmNvZGV9LiR7bmFtZX1gO1xuICAgICAgZGVsZXRlIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2tleV07XG4gICAgICBpZiAodGhpcy5maWx0ZXJzW25hbWVdKSB0aGlzLmZpbHRlcnNbbmFtZV0udmFsdWUgPSBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29tcG9zZWRGaWx0ZXJWYWx1ZUNoYW5nZShcbiAgICBjb2w6IFRhYmxlQ29sdW1uLFxuICAgIGNvbXBvc2VkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlbXSxcbiAgICBmaWx0ZXJNb2RlbD86IGFueSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7Y29sLmNvZGV9LiR7Y29tcG9zZWROYW1lfWA7XG5cbiAgICBpZiAoZmlsdGVyTW9kZWwpIHtcbiAgICAgIGZpbHRlck1vZGVsLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZmlsdGVyTW9kZWwuY29uc3RyYWludHMpICYmXG4gICAgICAgIGZpbHRlck1vZGVsLmNvbnN0cmFpbnRzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJNb2RlbC5jb25zdHJhaW50c1swXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5maWx0ZXJzW2NvbXBvc2VkTmFtZV0pIHtcbiAgICAgIHRoaXMuZmlsdGVyc1tjb21wb3NlZE5hbWVdID0ge1xuICAgICAgICBvcHRpb25zOiBjb2wuZmlsdGVyT3B0aW9ucyxcbiAgICAgICAgdmFsdWU6IFtdLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBvcHRpb24nLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJzW2NvbXBvc2VkTmFtZV0udmFsdWUgPSB2YWx1ZSB8fCBbXTtcblxuICAgIGNvbnN0IGlzRW1wdHkgPSAhdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCk7XG4gICAgaWYgKGlzRW1wdHkpIGRlbGV0ZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1trZXldO1xuICAgIGVsc2UgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgb25GaWx0ZXJDbGVhcihmaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuICAgIGRlbGV0ZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1tmaWVsZF07XG4gICAgdGhpcy5jbGVhcmVkRmllbGRzLmFkZChmaWVsZCk7XG4gIH1cblxuICBvbkZpbHRlclZhbHVlQ2hhbmdlKFxuICAgIGZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmlsdGVyTW9kZWw6IGFueSxcbiAgICB2YWx1ZTogYW55LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0VtcHR5ID1cbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcblxuICAgIGlmIChpc0VtcHR5KSBkZWxldGUgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNbZmllbGRdO1xuICAgIGVsc2UgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNbZmllbGRdID0gdmFsdWU7XG5cbiAgICBpZiAoZmlsdGVyTW9kZWwpIHtcbiAgICAgIGZpbHRlck1vZGVsLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZmlsdGVyTW9kZWwuY29uc3RyYWludHMpICYmXG4gICAgICAgIGZpbHRlck1vZGVsLmNvbnN0cmFpbnRzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJNb2RlbC5jb25zdHJhaW50c1swXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uTnVtYmVyRmlsdGVyQ2hhbmdlKGZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0VtcHR5ID1cbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB2YWx1ZSA9PT0gJycgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApO1xuXG4gICAgaWYgKGlzRW1wdHkpIGRlbGV0ZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1tmaWVsZF07XG4gICAgZWxzZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1tmaWVsZF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZENvbHVtbkJ5RmllbGQoZmllbGQ6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbmQoXG4gICAgICAoYykgPT4gYy5jb2RlID09PSBmaWVsZCB8fCAoYy5jb2RlICYmIGZpZWxkLnN0YXJ0c1dpdGgoYy5jb2RlICsgJy4nKSksXG4gICAgKTtcbiAgfVxuXG4gIGZpbHRlckNvbHVtbihldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVycyA9IGV2ZW50Py5maWx0ZXJzO1xuICAgIGlmICghZmlsdGVycykge1xuICAgICAgaWYgKHRoaXMuaXNMYXp5KSB0aGlzLm9uRmlsdGVyQ29sdW1uLmVtaXQoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzTnVsbGlzaCA9ICh2OiBhbnkpID0+IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnO1xuXG4gICAgT2JqZWN0LmtleXMoZmlsdGVycykuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSBmaWx0ZXJzW2ZpZWxkXTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZU1ldGEgPSAobTogYW55KSA9PlxuICAgICAgICBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID4gMCA/IG1bMF0gOiBtO1xuICAgICAgY29uc3QgbSA9IG5vcm1hbGl6ZU1ldGEobWV0YSk7XG4gICAgICBjb25zdCBjb2wgPSB0aGlzLmZpbmRDb2x1bW5CeUZpZWxkKGZpZWxkKTtcbiAgICAgIGNvbnN0IHdhc0NsZWFyZWQgPSB0aGlzLmNsZWFyZWRGaWVsZHMuaGFzKGZpZWxkKTtcblxuICAgICAgaWYgKCFtICYmICFjb2wpIHJldHVybjtcblxuICAgICAgLy8gQ09NUE9TRURcbiAgICAgIGlmIChjb2wgJiYgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRUQpIHtcbiAgICAgICAgY29uc3QgY29tcG9zZWRWYWx1ZXM6IGFueSA9IHt9O1xuXG4gICAgICAgIGNvbC5jb21wb3NlZE5hbWVzPy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gYCR7Y29sLmNvZGV9LiR7bmFtZX1gO1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2tleV07XG4gICAgICAgICAgY29uc3QgZW1wdHkgPVxuICAgICAgICAgICAgaXNOdWxsaXNoKHZhbCkgfHwgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID09PSAwKTtcbiAgICAgICAgICBpZiAoIWVtcHR5KSBjb21wb3NlZFZhbHVlc1tuYW1lXSA9IHZhbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbXBvc2VkVmFsdWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgbS52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtLmNvbnN0cmFpbnRzKSlcbiAgICAgICAgICAgICAgbS5jb25zdHJhaW50cy5mb3JFYWNoKChjOiBhbnkpID0+IChjLnZhbHVlID0gbnVsbCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtLnZhbHVlID0gY29tcG9zZWRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW0pIHJldHVybjtcblxuICAgICAgLy8gQ0xFQVJcbiAgICAgIGlmICh3YXNDbGVhcmVkKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1tmaWVsZF07XG4gICAgICAgIG0udmFsdWUgPSBudWxsO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtLmNvbnN0cmFpbnRzKSAmJiBtLmNvbnN0cmFpbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtLmNvbnN0cmFpbnRzWzBdLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyZWRGaWVsZHMuZGVsZXRlKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgdmFsdWU6IGFueSA9IG0udmFsdWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtLmNvbnN0cmFpbnRzKSAmJiBtLmNvbnN0cmFpbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY1ZhbCA9IG0uY29uc3RyYWludHNbMF0udmFsdWU7XG4gICAgICAgIGlmICghaXNOdWxsaXNoKGNWYWwpKSB2YWx1ZSA9IGNWYWw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2ZpZWxkXTtcbiAgICAgIGNvbnN0IGhhc0NhY2hlZCA9XG4gICAgICAgICFpc051bGxpc2goY2FjaGVkKSAmJiAoIUFycmF5LmlzQXJyYXkoY2FjaGVkKSB8fCBjYWNoZWQubGVuZ3RoID4gMCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKGlzTnVsbGlzaCh2YWx1ZSkgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpICYmXG4gICAgICAgIGhhc0NhY2hlZFxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlID0gY2FjaGVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0VtcHR5ID1cbiAgICAgICAgaXNOdWxsaXNoKHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcblxuICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2ZpZWxkXTtcbiAgICAgICAgbS52YWx1ZSA9IG51bGw7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG0uY29uc3RyYWludHMpICYmIG0uY29uc3RyYWludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG0uY29uc3RyYWludHNbMF0udmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNbZmllbGRdID0gdmFsdWU7XG5cbiAgICAgIGxldCBlbWl0VmFsdWU6IGFueSA9IHZhbHVlO1xuXG4gICAgICAvLyDinIUgREFURSAvIERBVEVUSU1FIG5vcm1hbGl6YXRpb24gZm9yIHNlcnZlci1zaWRlIGZpbHRlcmluZ1xuICAgICAgaWYgKFxuICAgICAgICBjb2wgJiZcbiAgICAgICAgKGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEUgfHwgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURVRJTUUpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZCA9IHRoaXMucGFyc2VBbnlEYXRlKHZhbHVlKTtcbiAgICAgICAgZW1pdFZhbHVlID1cbiAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFXG4gICAgICAgICAgICA/IHRoaXMuZm9ybWF0RGF0ZVdpdGhDb2x1bW4oZCwgY29sKVxuICAgICAgICAgICAgOiB0aGlzLmZvcm1hdERhdGVUaW1lV2l0aENvbHVtbihkLCBjb2wpO1xuICAgICAgfVxuXG4gICAgICBtLnZhbHVlID0gZW1pdFZhbHVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobS5jb25zdHJhaW50cykgJiYgbS5jb25zdHJhaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG0uY29uc3RyYWludHNbMF0udmFsdWUgPSBlbWl0VmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDinIUgZW1pdCBvbmx5IGluIHNlcnZlci1zaWRlIG1vZGVcbiAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgIHRoaXMub25GaWx0ZXJDb2x1bW4uZW1pdChldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNsaWVudC1zaWRlOiBrZWVwIHRvdGFsUmVjb3JkcyBpbiBzeW5jIHdpdGggZmlsdGVyZWQgdmlld1xuICAgICAgaWYgKHRoaXMuZHQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9ICh0aGlzLmR0LmZpbHRlcmVkVmFsdWUgPz8gdGhpcy5kdC52YWx1ZSA/PyBbXSkgYXMgYW55W107XG4gICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gY3VycmVudD8ubGVuZ3RoID8/IDA7XG4gICAgICAgIHRoaXMuZHQuZmlyc3QgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVBhZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudC5wYWdlID8/IE1hdGguZmxvb3IoKGV2ZW50LmZpcnN0IHx8IDApIC8gZXZlbnQucm93cyk7XG4gICAgY29uc3Qgcm93cyA9IGV2ZW50LnJvd3M7XG4gICAgdGhpcy5yb3dzID0gcm93cztcblxuICAgIC8vIOKchSBlbWl0IG9ubHkgd2hlbiBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uXG4gICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICB0aGlzLm9uUGFnZUNoYW5nZS5lbWl0KHsgcGFnZSwgcm93cyB9KTtcbiAgICB9XG4gIH1cblxuICBzb3J0Q29sdW1uKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvLyDinIUgZW1pdCBvbmx5IHdoZW4gc2VydmVyLXNpZGUgc29ydGluZ1xuICAgIGlmICghdGhpcy5pc0xhenkpIHJldHVybjtcblxuICAgIGxldCBmaWVsZCA9IGV2ZW50LmZpZWxkO1xuICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1ucy5maW5kKChjKSA9PiBjLmNvZGUgPT09IGZpZWxkKTtcblxuICAgIGlmIChjb2wgJiYgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRUQpIHtcbiAgICAgIGxldCB0ZXh0UHJvcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoY29sLmNvbXBvc2VkTmFtZXMgJiYgY29sLmNvbXBvc2VkVHlwZXMpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gY29sLmNvbXBvc2VkVHlwZXMuZmluZEluZGV4KFxuICAgICAgICAgICh0KSA9PiB0ID09PSBUYWJsZVR5cGVFbnVtLlNUUklORyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGNvbC5jb21wb3NlZE5hbWVzLmxlbmd0aClcbiAgICAgICAgICB0ZXh0UHJvcCA9IGNvbC5jb21wb3NlZE5hbWVzW2lkeF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGV4dFByb3AgJiYgY29sLmNvbXBvc2VkTmFtZXM/Lmxlbmd0aClcbiAgICAgICAgdGV4dFByb3AgPSBjb2wuY29tcG9zZWROYW1lc1swXTtcblxuICAgICAgaWYgKHRleHRQcm9wKSBmaWVsZCA9IGAke2ZpZWxkfS4ke3RleHRQcm9wfWA7XG4gICAgfVxuXG4gICAgdGhpcy5vblNvcnRDb2x1bW4uZW1pdCh7IC4uLmV2ZW50LCBmaWVsZCB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gRURJVCBIRUxQRVJTIC0tLS0tLS0tLS1cblxuICBwcml2YXRlIHBhcnNlRGF0ZV9kZE1NeXl5eShkYXRlU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRlU3RyaW5nLnNwbGl0KCcvJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKSAtIDE7XG4gICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICAgIHJldHVybiBpc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvbkNoYW5nZShldmVudDogRXZlbnQsIGlkOiBudW1iZXIsIGtleTogYW55KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5jaGFuZ2VIYW5kbGVyKGlkLCBrZXksIHRhcmdldC52YWx1ZSk7XG4gIH1cblxuICBjaGFuZ2VIYW5kbGVyKGlkOiBudW1iZXIsIGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KTtcblxuICAgIGlmICghdGhpcy5tYXAuZ2V0KGlkKSkge1xuICAgICAgaWYgKGNvbHVtbj8udHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFKSB7XG4gICAgICAgIHRoaXMuZGF0YU1hcC5zZXQoa2V5LCB0aGlzLnBhcnNlRGF0ZV9kZE1NeXl5eSh2YWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChpZCwgbmV3IE1hcCh0aGlzLmRhdGFNYXApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWFwSXRlbSA9IHRoaXMubWFwLmdldChpZCkgYXMgTWFwPGFueSwgYW55PjtcbiAgICAgIGlmIChjb2x1bW4/LnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURSkge1xuICAgICAgICBtYXBJdGVtLnNldChrZXksIHRoaXMucGFyc2VEYXRlX2RkTU15eXl5KHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBJdGVtLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tIFRZUEVTIC0tLS0tLS0tLS1cblxuICBnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbHVtbjogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5TVFJJTkc6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICBjYXNlIFRhYmxlVHlwZUVudW0uQU1PVU5UOlxuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLk5VTUJFUjpcbiAgICAgICAgcmV0dXJuICdudW1lcmljJztcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5EQVRFOlxuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLkRBVEVUSU1FOlxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLk1VTFRJU0VMRUNUOlxuICAgICAgICByZXR1cm4gJ211bHRpU2VsZWN0JztcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5CT09MRUFOOlxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLkNPTVBPU0VEOlxuICAgICAgICByZXR1cm4gJ2NvbXBvc2VkJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgfVxuICB9XG5cbiAgaXNFZGl0YWJsZShrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICgha2V5KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KTtcbiAgICByZXR1cm4gY29sdW1uPy5pc0VkaXRhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzTXVsdGlTZWxlY3Qoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBrZXkpO1xuICAgIGlmIChcbiAgICAgIGNvbHVtbj8udHlwZSA9PT0gVGFibGVUeXBlRW51bS5NVUxUSVNFTEVDVCAmJlxuICAgICAgY29sdW1uLm9wdGlvbnMgJiZcbiAgICAgIGNvbHVtbi5jb2RlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMub3B0aW9uRW50cmllcyA9IG5ldyBNYXAoW1xuICAgICAgICBbY29sdW1uLmNvZGUgYXMgc3RyaW5nLCBPYmplY3QudmFsdWVzKGNvbHVtbi5vcHRpb25zKV0sXG4gICAgICBdKTtcbiAgICAgIHRoaXMub3B0aW9uVmFsdWVzID0gdGhpcy5vcHRpb25FbnRyaWVzLmdldChrZXkpIHx8IFtdO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzRGF0ZVBpY2tlcihrZXk6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBrZXkpPy50eXBlO1xuICAgIHJldHVybiB0ID09PSBUYWJsZVR5cGVFbnVtLkRBVEUgfHwgdCA9PT0gVGFibGVUeXBlRW51bS5EQVRFVElNRTtcbiAgfVxuXG4gIGlzRGF0ZVRpbWVQaWNrZXIoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KT8udHlwZTtcbiAgICByZXR1cm4gdCA9PT0gVGFibGVUeXBlRW51bS5EQVRFVElNRTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gU0VBUkNIIC0tLS0tLS0tLS1cblxuICBmaWx0ZXJHbG9iYWwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSAodGFyZ2V0LnZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8g4pyFIHNlcnZlci1zaWRlIG1vZGVcbiAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgIHRoaXMuc2VhcmNoLmVtaXQodmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOKchSBjbGllbnQtc2lkZSBtb2RlXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5kdC52YWx1ZSA9IFsuLi4odGhpcy5kYXRhID8/IFtdKV07XG4gICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9ICh0aGlzLmR0LnZhbHVlID8/IFtdKS5sZW5ndGg7XG4gICAgICB0aGlzLmR0LmZpcnN0ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSAodGhpcy5kYXRhID8/IFtdKS5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAodGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMgPz8gW10pLnNvbWUoKGZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucz8uZmluZCgoY29sKSA9PiBjb2wuY29kZSA9PT0gZmllbGQpO1xuICAgICAgICBpZiAoIWNvbHVtbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSBpdGVtPy5bZmllbGRdO1xuXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZVdpdGhDb2x1bW4odGhpcy5wYXJzZUFueURhdGUoY2VsbCksIGNvbHVtbilcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEVUSU1FKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZVRpbWVXaXRoQ29sdW1uKHRoaXMucGFyc2VBbnlEYXRlKGNlbGwpLCBjb2x1bW4pXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5BTU9VTlQgfHxcbiAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5OVU1CRVJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhjZWxsID8/ICcnKVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRUQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJDb21wb3NlZENvbHVtbihjZWxsLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3RyaW5nKGNlbGwgPz8gJycpXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAuaW5jbHVkZXModmFsdWUpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuZHQudmFsdWUgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy50b3RhbFJlY29yZHMgPSBmaWx0ZXJlZERhdGEubGVuZ3RoO1xuICAgIHRoaXMuZHQuZmlyc3QgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJDb21wb3NlZENvbHVtbihjb21wb3NlZERhdGE6IGFueSwgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChjb21wb3NlZERhdGEpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjb21wb3NlZERhdGEpLnNvbWUoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSBjb21wb3NlZERhdGFba2V5XTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBjZWxsVmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBjZWxsVmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0g4pyFIERBVEUgLyBEQVRFVElNRSBQQVJTSU5HICsgRk9STUFUVElORyAtLS0tLS0tLS0tXG5cbiAgcHVibGljIHBhcnNlQW55RGF0ZShpbnB1dDogYW55KTogRGF0ZSB8IG51bGwge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkIHx8IGlucHV0ID09PSAnJykgcmV0dXJuIG51bGw7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlzTmFOKGlucHV0LmdldFRpbWUoKSkgPyBudWxsIDogaW5wdXQ7XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgIHJldHVybiBpc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgcyA9IGlucHV0LnRyaW0oKTtcbiAgICAgIGNvbnN0IGlzb1RyeSA9IG5ldyBEYXRlKHMpO1xuICAgICAgaWYgKCFpc05hTihpc29UcnkuZ2V0VGltZSgpKSkgcmV0dXJuIGlzb1RyeTtcblxuICAgICAgaWYgKHMuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHMuc3BsaXQoJyAnKVswXS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgLSAxO1xuICAgICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChwYXJ0c1syXSwgMTApO1xuICAgICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICAgICAgICByZXR1cm4gaXNOYU4oZC5nZXRUaW1lKCkpID8gbnVsbCA6IGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0V2l0aFBhdHRlcm4oZDogRGF0ZSB8IG51bGwsIHBhdHRlcm46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFkKSByZXR1cm4gJyc7XG4gICAgY29uc3QgcGFkMiA9IChuOiBudW1iZXIpID0+IFN0cmluZyhuKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGRkOiBwYWQyKGQuZ2V0RGF0ZSgpKSxcbiAgICAgIE1NOiBwYWQyKGQuZ2V0TW9udGgoKSArIDEpLFxuICAgICAgeXl5eTogU3RyaW5nKGQuZ2V0RnVsbFllYXIoKSksXG4gICAgICBISDogcGFkMihkLmdldEhvdXJzKCkpLFxuICAgICAgbW06IHBhZDIoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgc3M6IHBhZDIoZC5nZXRTZWNvbmRzKCkpLFxuICAgIH07XG5cbiAgICByZXR1cm4gcGF0dGVyblxuICAgICAgLnJlcGxhY2UoL3l5eXkvZywgbWFwLnl5eXkpXG4gICAgICAucmVwbGFjZSgvZGQvZywgbWFwLmRkKVxuICAgICAgLnJlcGxhY2UoL01NL2csIG1hcC5NTSlcbiAgICAgIC5yZXBsYWNlKC9ISC9nLCBtYXAuSEgpXG4gICAgICAucmVwbGFjZSgvbW0vZywgbWFwLm1tKVxuICAgICAgLnJlcGxhY2UoL3NzL2csIG1hcC5zcyk7XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IHRoaXMucGFyc2VBbnlEYXRlKGRhdGUpO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFdpdGhQYXR0ZXJuKGQsICdkZC9NTS95eXl5Jyk7XG4gIH1cblxuICBmb3JtYXREYXRlV2l0aENvbHVtbihkOiBEYXRlIHwgbnVsbCwgY29sOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3QgZm10ID0gY29sLmRhdGVGb3JtYXQ/LnRyaW0oKSB8fCAnZGQvTU0veXl5eSc7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0V2l0aFBhdHRlcm4oZCwgZm10KTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lV2l0aENvbHVtbihkOiBEYXRlIHwgbnVsbCwgY29sOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3QgZm10ID0gY29sLmRhdGVUaW1lRm9ybWF0Py50cmltKCkgfHwgJ2RkL01NL3l5eXkgSEg6bW06c3MnO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFdpdGhQYXR0ZXJuKGQsIGZtdCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tIE1JU0MgLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgoY29sOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3QgY2FsY3VsYXRlZFdpZHRoID0gY2FsY3VsYXRlVGV4dFdpZHRoKGNvbCwgY29sLnRpdGxlKTtcbiAgICBjb25zdCB0b3RhbFdpZHRoID0gY2FsY3VsYXRlZFdpZHRoICsgdGhpcy5pY29uV2lkdGggKyAyMDtcbiAgICByZXR1cm4gYCR7dG90YWxXaWR0aH1weGA7XG4gIH1cblxuICBnZXRIZWFkZXJXaWR0aChjb2w6IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29sLndpZHRoID8gY29sLndpZHRoIDogdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChjb2wpO1xuICB9XG5cbiAgY2xlYXIodGFibGU6IFRhYmxlKSB7XG4gICAgdGFibGUuY2xlYXIoKTtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXMgPSB7fTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzW2tleV0pIHRoaXMuZmlsdGVyc1trZXldLnZhbHVlID0gW107XG4gICAgfSk7XG5cbiAgICAvLyDinIUgc2VydmVyLXNpZGU6IHBhcmVudCBtdXN0IHJlbG9hZFxuICAgIGlmICh0aGlzLmlzTGF6eSkge1xuICAgICAgdGhpcy5vbkZpbHRlckNvbHVtbi5lbWl0KHsgY2xlYXJlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDinIUgY2xpZW50LXNpZGU6IHJlc2V0IHBhZ2luYXRvciB0b3RhbHNcbiAgICBpZiAodGhpcy5kdCkge1xuICAgICAgdGhpcy5kdC52YWx1ZSA9IFsuLi4odGhpcy5kYXRhID8/IFtdKV07XG4gICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9ICh0aGlzLmR0LnZhbHVlID8/IFtdKS5sZW5ndGg7XG4gICAgICB0aGlzLmR0LmZpcnN0ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUGFnaW5hdGVkKSB7XG4gICAgICBpZiAoIXRoaXMucm93c1BlclBhZ2UgfHwgdGhpcy5yb3dzUGVyUGFnZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yb3dzUGVyUGFnZSA9IFsxMCwgMjAsIDMwXTtcbiAgICAgIH1cbiAgICAgIHRoaXMucm93cyA9IHRoaXMucm93c1BlclBhZ2VbMF07XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVuY3lTeW1ib2woY29sdW1uOiBUYWJsZUNvbHVtbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFNT1VOVCAmJlxuICAgICAgY29sdW1uLmN1cnJlbmN5ICYmXG4gICAgICB0aGlzLmlzVmFsaWRDdXJyZW5jeUNvZGUoY29sdW1uLmN1cnJlbmN5KVxuICAgICAgPyBjb2x1bW4uY3VycmVuY3lcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQ3VycmVuY3lDb2RlKGN1cnJlbmN5Q29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRDdXJyZW5jeUNvZGVzLmluY2x1ZGVzKGN1cnJlbmN5Q29kZSk7XG4gIH1cblxuICBleHBvcnRFeGNlbCgpIHtcbiAgICB0aGlzLmV4cG9ydEV4Y2VsRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgZXhwb3J0UGRmKCkge1xuICAgIHRoaXMuZXhwb3J0UGRmRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgZ2V0SW1hZ2VTdHlsZShzdHlsZTogVGl0bGVTdHlsZSB8IEltYWdlU3R5bGUgfCB1bmRlZmluZWQpOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9IHtcbiAgICBpZiAoIXN0eWxlKSByZXR1cm4ge307XG4gICAgY29uc3QgaW1hZ2VTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIHdpZHRoOiAoc3R5bGUgYXMgSW1hZ2VTdHlsZSkud2lkdGggfHwgJ2F1dG8nLFxuICAgICAgaGVpZ2h0OiAoc3R5bGUgYXMgSW1hZ2VTdHlsZSkuaGVpZ2h0IHx8ICdhdXRvJyxcbiAgICB9O1xuICAgIGlmICgoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luKVxuICAgICAgaW1hZ2VTdHlsZS5tYXJnaW4gPSAoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luITtcbiAgICBpZiAoKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpbkxlZnQpXG4gICAgICBpbWFnZVN0eWxlLm1hcmdpbkxlZnQgPSAoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luTGVmdCE7XG4gICAgaWYgKChzdHlsZSBhcyBJbWFnZVN0eWxlKS5tYXJnaW5SaWdodClcbiAgICAgIGltYWdlU3R5bGUubWFyZ2luUmlnaHQgPSAoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luUmlnaHQhO1xuICAgIGlmICgoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luVG9wKVxuICAgICAgaW1hZ2VTdHlsZS5tYXJnaW5Ub3AgPSAoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luVG9wITtcbiAgICBpZiAoKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpbkJvdHRvbSlcbiAgICAgIGltYWdlU3R5bGUubWFyZ2luQm90dG9tID0gKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpbkJvdHRvbSE7XG4gICAgcmV0dXJuIGltYWdlU3R5bGU7XG4gIH1cblxuICBnZXRUaXRsZVN0eWxlKHN0eWxlOiBUaXRsZVN0eWxlIHwgSW1hZ2VTdHlsZSB8IHVuZGVmaW5lZCk6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0ge1xuICAgIGlmICghc3R5bGUpIHJldHVybiB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHN0eWxlLmNvbG9yIHx8ICdpbmhlcml0JyxcbiAgICAgIGZvbnRTaXplOiAoc3R5bGUgYXMgVGl0bGVTdHlsZSkuZm9udFNpemUgfHwgJ2luaGVyaXQnLFxuICAgICAgdGV4dEFsaWduOiAoc3R5bGUgYXMgVGl0bGVTdHlsZSkucG9zaXRpb24gfHwgJ2xlZnQnLFxuICAgIH07XG4gIH1cblxuICBmb3JtYXROdW1iZXIoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBkZWNpbWFsUGxhY2VzPzogbnVtYmVyLFxuICAgIHRob3VzYW5kU2VwYXJhdG9yOiAnY29tbWEnIHwgJ3NwYWNlJyA9ICdjb21tYScsXG4gICAgZGVjaW1hbFNlcGFyYXRvcjogJ2NvbW1hJyB8ICdkb3QnID0gJ2RvdCcsXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgaXNOYU4odmFsdWUpKSByZXR1cm4gJyc7XG5cbiAgICBsZXQgZm9ybWF0dGVkTnVtYmVyID1cbiAgICAgIGRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHZhbHVlLnRvRml4ZWQoZGVjaW1hbFBsYWNlcylcbiAgICAgICAgOiB2YWx1ZS50b1N0cmluZygpO1xuXG4gICAgaWYgKGRlY2ltYWxTZXBhcmF0b3IgPT09ICdjb21tYScpIHtcbiAgICAgIGZvcm1hdHRlZE51bWJlciA9IGZvcm1hdHRlZE51bWJlci5yZXBsYWNlKCcuJywgJywnKTtcbiAgICB9XG5cbiAgICBpZiAodGhvdXNhbmRTZXBhcmF0b3IgJiYgTWF0aC5hYnModmFsdWUpID49IDEwMDApIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVkTnVtYmVyLnNwbGl0KFxuICAgICAgICBkZWNpbWFsU2VwYXJhdG9yID09PSAnY29tbWEnID8gJywnIDogJy4nLFxuICAgICAgKTtcbiAgICAgIHBhcnRzWzBdID0gcGFydHNbMF0ucmVwbGFjZShcbiAgICAgICAgL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csXG4gICAgICAgIHRob3VzYW5kU2VwYXJhdG9yID09PSAnY29tbWEnID8gJywnIDogJyAnLFxuICAgICAgKTtcbiAgICAgIGZvcm1hdHRlZE51bWJlciA9IHBhcnRzLmpvaW4oZGVjaW1hbFNlcGFyYXRvciA9PT0gJ2NvbW1hJyA/ICcsJyA6ICcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZE51bWJlcjtcbiAgfVxuXG4gIGlzQWN0aW9uVmlzaWJsZShhY3Rpb246IFBUVGFibGVBY3Rpb25Db25maWcsIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdiA9IGFjdGlvbj8udmlzaWJsZTtcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHJldHVybiB0cnVlOyAvLyBkZWZhdWx0OiB2aXNpYmxlXG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nID8gISF2KHJvdykgOiAhIXY7XG4gIH1cblxuICBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogUFRUYWJsZUFjdGlvbkNvbmZpZywgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBkID0gYWN0aW9uLmRpc2FibGVkO1xuICAgIGlmIChkID09PSB1bmRlZmluZWQgfHwgZCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOyAvLyBkZWZhdWx0OiBlbmFibGVkXG4gICAgcmV0dXJuIHR5cGVvZiBkID09PSAnZnVuY3Rpb24nID8gISFkKHJvdykgOiAhIWQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwdC1hZHZhbmNlZC1wcmltZS10YWJsZSB0YWJsZS1jb250YWluZXJcIj5cbiAgPHAtdGFibGVcbiAgICAjZHRcbiAgICBbdmFsdWVdPVwiZGF0YVwiXG4gICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgW3Jvd3NdPVwicm93c1wiXG4gICAgW3BhZ2luYXRvcl09XCJpc1BhZ2luYXRlZFwiXG4gICAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJnbG9iYWxGaWx0ZXJGaWVsZHNcIlxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicm93c1BlclBhZ2VcIlxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgICBbbGF6eV09XCJpc0xhenlcIlxuICAgIGRhdGFLZXk9XCJpZFwiXG4gICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLWdyaWRsaW5lcyBwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBbc2Nyb2xsSGVpZ2h0XT1cIm1heEhlaWdodCAhPT0gbnVsbCA/IG1heEhlaWdodCA6IHVuZGVmaW5lZFwiXG4gICAgKG9uRmlsdGVyKT1cImZpbHRlckNvbHVtbigkZXZlbnQpXCJcbiAgICAob25QYWdlKT1cImNoYW5nZVBhZ2UoJGV2ZW50KVwiXG4gICAgKG9uU29ydCk9XCJzb3J0Q29sdW1uKCRldmVudClcIlxuICA+XG4gICAgPCEtLSBDT0xHUk9VUDogc3luYyBoZWFkZXIvYm9keSB3aWR0aHMgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbGdyb3VwXCIgbGV0LWNvbHVtbnM+XG4gICAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxjb2xcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggfHwgZ2V0SGVhZGVyV2lkdGgoY29sKVwiXG4gICAgICAgIC8+XG4gICAgICA8L2NvbGdyb3VwPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIENBUFRJT04gLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzPlRvdGFsOiB7eyB0b3RhbFJlY29yZHMgfX08L2gzPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDwhLS0gQ2xlYXIgZmlsdGVycyAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc1NlYXJjaEZpbHRlclwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsdGVyLXNsYXNoXCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcihkdClcIlxuICAgICAgICAgICAgdGl0bGU9XCJDbGVhciBmaWx0ZXJzXCJcbiAgICAgICAgICA+PC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIEV4cG9ydCB0byBFeGNlbCBCdXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJoYXNFeHBvcnRFeGNlbFwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsZS1leGNlbFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RXhjZWwoKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkV4cG9ydCB0byBFeGNlbFwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBFeHBvcnQgdG8gUERGIEJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc0V4cG9ydFBERlwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsZS1wZGZcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBkZigpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHRvIFBERlwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWwtYXV0b1wiICpuZ0lmPVwiaGFzU2VhcmNoRmlsdGVyXCI+XG4gICAgICAgICAgPHAtaWNvbkZpZWxkIGljb25Qb3NpdGlvbj1cImxlZnRcIiBjbGFzcz1cIm1sLWF1dG9cIj5cbiAgICAgICAgICAgIDxwLWlucHV0SWNvbj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+XG4gICAgICAgICAgICA8L3AtaW5wdXRJY29uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImZpbHRlckdsb2JhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2gga2V5d29yZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvcC1pY29uRmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gSEVBREVSIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgIDx0ciBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5jaGlsZHJlbjsgZWxzZSBncm91cEhlYWRlclwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJ7eyBjb2wuY29kZSB9fVwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoIHx8IGdldEhlYWRlcldpZHRoKGNvbClcIlxuICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmddPVwiJzBweCdcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICBnZXRIZWFkZXJBbGlnbkNsYXNzKGNvbCksXG4gICAgICAgICAgICAgIGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFDVElPTiA/ICdhY3Rpb24tY29sdW1uJyA6ICcnLFxuICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICBjb2xzcGFuPVwiMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSBTT1JUQUJMRSBIRUFERVIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNTb3J0YWJsZSAmJiBjb2wuaXNTb3J0YWJsZSAhPT0gZmFsc2U7IGVsc2Ugbm9Tb3J0SGVhZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoIHx8IGdldEhlYWRlcldpZHRoKGNvbClcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cIicwcHgnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luXT1cIicxMHB4J1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRIZWFkZXJUaXRsZUNsYXNzKGNvbClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbC50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIic3N3B4J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJ7eyBjb2wuY29kZSB9fVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgIDwhLS0gQ09MVU1OIEZJTFRFUlMgLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzQ29sdW1uRmlsdGVyICYmIGNvbC5pc0ZpbHRlciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIENPTVBPU0VEIEZJTFRFUiAodXNlcyBidWlsdC1pbiBBcHBseS9DbGVhcikgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRURcIlxuICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk9XCJtZW51XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sLmNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0FwcGx5QnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25Db21wb3NlZENvbHVtbkNsZWFyKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC1maWx0ZXJNb2RlbD1cImZpbHRlck1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb21wb3NlZE5hbWUgb2YgY29sLmNvbXBvc2VkTmFtZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb21wb3NlZEZpZWxkVHlwZShjb2wsIGNvbXBvc2VkTmFtZSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVR5cGVFbnVtLlNUUklOR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyc1tjb21wb3NlZE5hbWVdPy5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlcnNbY29tcG9zZWROYW1lXT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcG9zZWRGaWx0ZXJWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNb2RlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbHRlcnNbY29tcG9zZWROYW1lXT8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheT1cImNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tbXVsdGlzZWxlY3QtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cIml0ZW0uaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlci1pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBPVEhFUiBUWVBFUyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSAhPT0gVGFibGVUeXBlRW51bS5DT01QT1NFRFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheT1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuY29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29sdW1uRmlsdGVyVHlwZShjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0FwcGx5QnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25GaWx0ZXJDbGVhcihjb2wuY29kZSEpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTlVNQkVSIC8gQU1PVU5UOiB1c2UgdGV4dCBpbnB1dCBzbyAnLicgd29ya3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uTlVNQkVSIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFNT1VOVFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwiZGVjaW1hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxhdGVzdEZpbHRlclZhbHVlc1tjb2wuY29kZSFdID8/IHZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25OdW1iZXJGaWx0ZXJDaGFuZ2UoY29sLmNvZGUhLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgYSBudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBEQVRFIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQtZmlsdGVyTW9kZWw9XCJmaWx0ZXJNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0RmlsdGVyVmFsdWVzW2NvbC5jb2RlIV0gPz8gZmlsdGVyTW9kZWw/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBmaWx0ZXJNb2RlbCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0PVwiZGQvbW0veXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNob29zZSBhIGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBNVUxUSVNFTEVDVCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuZmlsdGVyT3B0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuZmlsdGVyT3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlck1vZGVsPVwiZmlsdGVyTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbC5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0RmlsdGVyVmFsdWVzW2NvbC5jb2RlIV0gPz8gZmlsdGVyTW9kZWw/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBmaWx0ZXJNb2RlbCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwiY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIG9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLW11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIE5PTi1TT1JUQUJMRSBIRUFERVIgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vU29ydEhlYWRlcj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoIHx8IGdldEhlYWRlcldpZHRoKGNvbClcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cIicwcHgnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luXT1cIicxMHB4J1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRIZWFkZXJUaXRsZUNsYXNzKGNvbClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbC50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNDb2x1bW5GaWx0ZXIgJiYgY29sLmlzRmlsdGVyICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgPCEtLSBBTU9VTlQgYmVoYXZlcyBsaWtlIE5VTUJFUiAtLT5cbiAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC50eXBlID09PSAnQU1PVU5UJ1wiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk9XCJtZW51XCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29sdW1uRmlsdGVyVHlwZShjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5XT1cImdldEN1cnJlbmN5U3ltYm9sKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0FwcGx5QnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIGxldC1maWx0ZXJNb2RlbD1cImZpbHRlck1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwiZGVjaW1hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0RmlsdGVyVmFsdWVzW2NvbC5jb2RlIV0gPz8gZmlsdGVyTW9kZWw/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBmaWx0ZXJNb2RlbCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgYW4gYW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgIT09ICdBTU9VTlQnXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheT1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sLmNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0FwcGx5QnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIERBVEUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlck1vZGVsPVwiZmlsdGVyTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Q29sdW1uRmlsdGVyVHlwZShjb2wpID09PSAnZGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RGaWx0ZXJWYWx1ZXNbY29sLmNvZGUhXSA/PyBmaWx0ZXJNb2RlbD8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaWx0ZXJWYWx1ZUNoYW5nZShjb2wuY29kZSEsIGZpbHRlck1vZGVsLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cImRkL21tL3l5XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTVVMVElTRUxFQ1QgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlck1vZGVsPVwiZmlsdGVyTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Q29sdW1uRmlsdGVyVHlwZShjb2wpID09PSAnbXVsdGlTZWxlY3QnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2wuZmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0RmlsdGVyVmFsdWVzW2NvbC5jb2RlIV0gPz8gZmlsdGVyTW9kZWw/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBmaWx0ZXJNb2RlbCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk9XCJjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLW11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8IS0tIEdST1VQRUQgSEVBREVSIC0tPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ3JvdXBIZWFkZXI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb2wuY2hpbGRyZW4/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggfHwgZ2V0SGVhZGVyV2lkdGgoY29sKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldEhlYWRlckFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuXG4gICAgICA8IS0tIENISUxEIEhFQURFUlMgLS0+XG4gICAgICA8dHIgKm5nSWY9XCJoYXNHcm91cGVkQ29sdW1uc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuY2hpbGRyZW5cIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgY29sLmNoaWxkcmVuXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNoaWxkLndpZHRoIHx8IGdldEhlYWRlcldpZHRoKGNoaWxkKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cIicwcHgnXCJcbiAgICAgICAgICAgID48L3RoPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gRU1QVFkgTUVTU0FHRSAtLT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICA8dHIgY2xhc3M9XCJwLWRhdGF0YWJsZS1lbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgPCEtLSBzcGFuIGFsbCBjb2x1bW5zIC0tPlxuICAgICAgICA8dGQgY2xhc3M9XCJlbXB0eS1tZXNzYWdlLWNlbGxcIiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoIHx8IDFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktbWVzc2FnZS13cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICA8cD5ObyByZWNvcmRzIGF2YWlsYWJsZSB0byBkaXNwbGF5LjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBCT0RZIC0tPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICBsZXQtZGF0YVxuICAgICAgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCJcbiAgICAgIGxldC1yaT1cInJvd0luZGV4XCJcbiAgICA+XG4gICAgICA8dHIgKm5nSWY9XCIhbG9hZGluZ1wiIFtwRWRpdGFibGVSb3ddPVwiaXNFZGl0ID8gZGF0YSA6IG51bGxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICA8IS0tIFNJTVBMRSBDT0xVTU5TIChubyBjaGlsZHJlbikgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2wuY2hpbGRyZW47IGVsc2UgY2hpbGRDb2x1bW5zXCI+XG4gICAgICAgICAgICA8IS0tIEVESVRBQkxFIENFTEwgLS0+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBpc0VkaXRhYmxlKGNvbC5jb2RlISkgJiYgY29sLnR5cGUgIT09IFRhYmxlVHlwZUVudW0uQUNUSU9OO1xuICAgICAgICAgICAgICAgIGVsc2Ugbm9ybWFsVERcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCB8fCBnZXRIZWFkZXJXaWR0aChjb2wpXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGF0YUFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwhLS0gRWRpdGFibGUgaW5wdXQgZm9yIE5VTUJFUi9EQVRFL1NUUklORy9NVUxUSVNFTEVDVCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTXVsdGlTZWxlY3QoY29sLmNvZGUpOyBlbHNlIGRhdGVQaWNrZXJcIj5cbiAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJkYXRhW2NvbC5jb2RlIV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlSGFuZGxlcihkYXRhLmlkLCBjb2wuY29kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVjIG9mIGRhdGFbY29sLmNvZGUhXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtdGFnIFt2YWx1ZV09XCJyZWNcIj48L3AtdGFnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEYXRlUGlja2VyKGNvbC5jb2RlKTsgZWxzZSBub3JtYWxJbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImRhdGFbY29sLmNvZGUhXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJkYXRhW2NvbC5jb2RlIV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhhbmRsZXIoZGF0YS5pZCwgY29sLmNvZGUsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInZGQvbW0veXknXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2wuY29kZSFdIHwgY3VzdG9tRGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxJbnB1dD5cbiAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZGF0YVtjb2wuY29kZSFdXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgZGF0YS5pZCwgY29sLmNvZGUpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQU1PVU5UO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBub3JtYWxPdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbY29sLmNvZGUhXVxuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN1c3RvbUN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRDdXJyZW5jeVN5bWJvbChjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wuZGVjaW1hbFBsYWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLnRob3VzYW5kU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wuZGVjaW1hbFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vcm1hbE91dHB1dD5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbC5jb2RlIV0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICA8IS0tIE5PTi1FRElUQUJMRSBDRUxMIChBTFdBWVMgUkVOREVSRUQpIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxURD5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCB8fCBnZXRIZWFkZXJXaWR0aChjb2wpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAgICAgICBnZXREYXRhQWxpZ25DbGFzcyhjb2wpLFxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQUNUSU9OID8gJ2FjdGlvbi1jb2x1bW4nIDogJycsXG4gICAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIEFDVElPTiBjb2x1bW46IGJ1aWx0LWluIGVkaXQvZGVsZXRlICsgY3VzdG9tIGFjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BQ1RJT047IGVsc2Ugbm9uQWN0aW9uQ2VsbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIGJ1aWx0LWluIGRlbGV0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNEZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiRGVsZXRlKGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIGJ1aWx0LWluIGlubGluZSBlZGl0IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluaXRFZGl0YWJsZVJvdyhkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBwU2F2ZUVkaXRhYmxlUm93XG4gICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUVkaXRhYmxlUm93KGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDYW5jZWxFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEVkaXRhYmxlUm93KGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gY3VzdG9tIGFjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdCBvZiBjdXN0b21BY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0FjdGlvblZpc2libGUoYWN0LCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImFjdC5pY29uIHx8ICdwaSBwaS1lbGxpcHNpcy1oJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Quc3R5bGVDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNBY3Rpb25EaXNhYmxlZChhY3QsIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkN1c3RvbUFjdGlvbkNsaWNrKGFjdCwgZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gTk9OLUFDVElPTiBjZWxscyAtLT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkFjdGlvbkNlbGw+XG4gICAgICAgICAgICAgICAgICA8IS0tIENPTVBPU0VEIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkNPTVBPU0VEO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugbm9uQ29tcG9zZWRcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvc2VkLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvc2VkTmFtZSBvZiBjb2wuY29tcG9zZWROYW1lcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElNQUdFIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jb21wb3NlZFR5cGVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNvbXBvc2VkVHlwZXNbaV0gPT09IFRhYmxlVHlwZUVudW0uSU1BR0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZGF0YVtjb2wuY29kZSFdPy5bY29tcG9zZWROYW1lXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiY29tcG9zZWQtaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbXBvc2VkLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEltYWdlU3R5bGUoY29sLmNvbXBvc2VkU3R5bGVzPy5bY29tcG9zZWROYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU1RSSU5HIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jb21wb3NlZFR5cGVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNvbXBvc2VkVHlwZXNbaV0gPT09IFRhYmxlVHlwZUVudW0uU1RSSU5HXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb21wb3NlZC10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRpdGxlU3R5bGUoY29sLmNvbXBvc2VkU3R5bGVzPy5bY29tcG9zZWROYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2wuY29kZSFdPy5bY29tcG9zZWROYW1lXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub25Db21wb3NlZD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBTU9VTlQtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQU1PVU5UOyBlbHNlIG5vbkFtb3VudFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtjb2wuY29kZSFdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3VzdG9tQ3VycmVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEN1cnJlbmN5U3ltYm9sKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC5kZWNpbWFsUGxhY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wudGhvdXNhbmRTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC5kZWNpbWFsU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub25BbW91bnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBOVU1CRVItLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5OVU1CRVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugbm9uTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE51bWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2NvbC5jb2RlIV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnRob3VzYW5kU2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5kZWNpbWFsU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbk51bWJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gREFURSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFVElNRTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG5vcm1hbFR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdERhdGVXaXRoQ29sdW1uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUFueURhdGUoZGF0YVtjb2wuY29kZSFdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURVRJTUVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdERhdGVUaW1lV2l0aENvbHVtbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VBbnlEYXRlKGRhdGFbY29sLmNvZGUhXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsVHlwZXM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU1RSSU5HLCBNVUxUSVNFTEVDVC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVUeXBlRW51bS5TVFJJTkcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHlwZUVudW0uTVVMVElTRUxFQ1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGNvbC50eXBlISlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2wuY29kZSFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gQ0hJTEQgQ09MVU1OUyAtLT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkQ29sdW1ucz5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGNvbC5jaGlsZHJlblwiPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY2hpbGQud2lkdGggfHwgZ2V0SGVhZGVyV2lkdGgoY2hpbGQpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXREYXRhQWxpZ25DbGFzcyhjaGlsZClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0VkaXRhYmxlKGNoaWxkLmNvZGUpOyBlbHNlIGNoaWxkTm9ybWFsVERcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY2hpbGQuY29kZSA/IGRhdGFbY2hpbGQuY29kZV0gOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBkYXRhLmlkLCBjaGlsZC5jb2RlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaWxkLmNvZGUgPyBkYXRhW2NoaWxkLmNvZGVdIDogXCJcIiB9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkTm9ybWFsVEQ+XG4gICAgICAgICAgICAgICAgICB7eyBjaGlsZC5jb2RlID8gZGF0YVtjaGlsZC5jb2RlXSA6IFwiXCIgfX1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC10YWJsZT5cbjwvZGl2PlxuIl19
|
|
856
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcHJpbWUtdG9vbHMvc3JjL2xpYi9wdC1hZHZhbmNlZC1wcmltZS10YWJsZS9wdC1hZHZhbmNlZC1wcmltZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWFkdmFuY2VkLXByaW1lLXRhYmxlL3B0LWFkdmFuY2VkLXByaW1lLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxTQUFTLEVBR1QsYUFBYSxHQUVkLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQTJCeEQsTUFBTSxPQUFPLDZCQUE2QjtJQUwxQztRQU1XLFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsZ0JBQVcsR0FBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFakMsbUJBQW1CO1FBQ1YsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFNUIsdUJBQXVCO1FBQ2QsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLFlBQU8sR0FBMEIsRUFBRSxDQUFD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TyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7K0dBaDlCVSw2QkFBNkI7bUdBQTdCLDZCQUE2Qixpd0JDN0MxQyx1KzRCQW90QkE7OzRGRHZxQmEsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLHlCQUF5Qjs4QkFLMUIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFNSSxRQUFRO3NCQUFqQixNQUFNO2dCQUdHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFNkIsRUFBRTtzQkFBckMsU0FBUzt1QkFBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7XG4gIEFsaWduRW51bSxcbiAgSW1hZ2VTdHlsZSxcbiAgVGFibGVDb2x1bW4sXG4gIFRhYmxlVHlwZUVudW0sXG4gIFRpdGxlU3R5bGUsXG59IGZyb20gJy4uLy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgY2FsY3VsYXRlVGV4dFdpZHRoIH0gZnJvbSAnLi4vdXRpbHMvdGV4dC51dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBQVFRhYmxlQWN0aW9uQ29uZmlnIHtcbiAgY29kZTogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBzdHlsZUNsYXNzPzogc3RyaW5nO1xuICB0b29sdGlwPzogc3RyaW5nO1xuICBhY3Rpb246IGFueTtcbiAgdmlzaWJsZT86IGJvb2xlYW4gfCAoKHJvdzogYW55KSA9PiBib29sZWFuKTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuIHwgKChyb3c6IGFueSkgPT4gYm9vbGVhbik7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUFRUYWJsZUxhenlMb2FkRXZlbnQge1xuICBwYWdlOiBudW1iZXI7XG4gIHJvd3M6IG51bWJlcjtcbiAgZmlyc3Q6IG51bWJlcjtcbiAgc2VhcmNoPzogc3RyaW5nO1xuICBzb3J0RmllbGQ/OiBzdHJpbmcgfCBudWxsO1xuICBzb3J0T3JkZXI/OiAxIHwgLTEgfCBudWxsO1xuICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtYWR2YW5jZWQtcHJpbWUtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHQtYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHQtYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFBUQWR2YW5jZWRQcmltZVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyA9IDA7XG4gIEBJbnB1dCgpIHJvd3NQZXJQYWdlOiBudW1iZXJbXSA9IFsxMCwgMjAsIDMwXTtcbiAgQElucHV0KCkgaGFzU2VhcmNoRmlsdGVyID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhhc0V4cG9ydEV4Y2VsID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhhc0V4cG9ydFBERiA9IGZhbHNlO1xuICBASW5wdXQoKSBoYXNDb2x1bW5GaWx0ZXIgPSBmYWxzZTtcblxuICAvKiogcGFnaW5hdG9yIFVJICovXG4gIEBJbnB1dCgpIGlzUGFnaW5hdGVkID0gdHJ1ZTtcblxuICAvKiogc2VydmVyLXNpZGUgbW9kZSAqL1xuICBASW5wdXQoKSBpc0xhenkgPSBmYWxzZTtcblxuICBASW5wdXQoKSBhY3Rpb25zOiBQVFRhYmxlQWN0aW9uQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgaXNTb3J0YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1heEhlaWdodDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIE5ldyB1bmlmaWVkIGxhenkgZXZlbnQuXG4gICAqIFVzZSB0aGlzIGluIHBhcmVudCBjb21wb25lbnRzIGZvciBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uL2ZpbHRlci9zb3J0L3NlYXJjaC5cbiAgICovXG4gIEBPdXRwdXQoKSBsYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8UFRUYWJsZUxhenlMb2FkRXZlbnQ+KCk7XG5cbiAgLyoqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi9cbiAgQE91dHB1dCgpIHNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZXhwb3J0RXhjZWxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGV4cG9ydFBkZkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgb25QYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2U6IG51bWJlcjsgcm93czogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoKSBvblNvcnRDb2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uRmlsdGVyQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZHQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZHQhOiBUYWJsZTtcblxuICBwdWJsaWMgVGFibGVUeXBlRW51bSA9IFRhYmxlVHlwZUVudW07XG4gIHB1YmxpYyBBbGlnbkVudW0gPSBBbGlnbkVudW07XG5cbiAgc2VhcmNoVmFsdWUgPSAnJztcblxuICBwdWJsaWMgZmlsdGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBsYXRlc3RGaWx0ZXJWYWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIGNsZWFyZWRGaWVsZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHZhbGlkQ3VycmVuY3lDb2RlcyA9IFsnVVNEJywgJ0VVUicsICdNQUQnXTtcbiAgaWNvbldpZHRoID0gNzc7XG5cbiAgcm93cyA9IDA7XG4gIGZpcnN0ID0gMDtcbiAgY3VycmVudFBhZ2UgPSAwO1xuICBjdXJyZW50U29ydEZpZWxkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY3VycmVudFNvcnRPcmRlcjogMSB8IC0xIHwgbnVsbCA9IG51bGw7XG5cbiAgaGFzR3JvdXBlZENvbHVtbnMgPSBmYWxzZTtcblxuICBpc0RlbGV0ZSA9IGZhbHNlO1xuICBpc0VkaXQgPSBmYWxzZTtcblxuICBEZWxldGU6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGluaXRFZGl0YWJsZVJvdzogKGRhdGE6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBzYXZlRWRpdGFibGVSb3c6IChkYXRhOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgY2FuY2VsRWRpdGFibGVSb3c6IChpdGVtOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjdXN0b21BY3Rpb25zOiBQVFRhYmxlQWN0aW9uQ29uZmlnW10gPSBbXTtcblxuICBkYXRhTWFwID0gbmV3IE1hcDxhbnksIGFueT4oKTtcbiAgbWFwID0gbmV3IE1hcDxhbnksIE1hcDxhbnksIGFueT4+KCk7XG4gIG9wdGlvbkVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gIG9wdGlvblZhbHVlczogYW55W10gPSBbXTtcbiAgZ2xvYmFsRmlsdGVyRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaGFzR3JvdXBlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuc29tZShcbiAgICAgIChjb2wpID0+IGNvbC5jaGlsZHJlbiAmJiBjb2wuY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMgPSB0aGlzLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLmNvZGUgIT09IHVuZGVmaW5lZCAmJiBjb2wuaXNGaWx0ZXIgIT09IGZhbHNlKVxuICAgICAgLm1hcCgoY29sKSA9PiBjb2wuY29kZSBhcyBzdHJpbmcpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUFjdGlvbnMoKTtcblxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BQ1RJT04pIHtcbiAgICAgICAgY29sLmlzRWRpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgY29sLmlzRmlsdGVyID0gZmFsc2U7XG4gICAgICAgIGNvbC5pc1NvcnRhYmxlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5DT01QT1NFRCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDb21wb3NlZEZpbHRlcnMoY29sKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbC5pc1NvcnRhYmxlID09PSB1bmRlZmluZWQpIGNvbC5pc1NvcnRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChjb2wuaXNFZGl0YWJsZSA9PT0gdW5kZWZpbmVkKSBjb2wuaXNFZGl0YWJsZSA9IHRydWU7XG5cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXIgIT09IGZhbHNlICYmIGNvbC5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5pbmNsdWRlcyhjb2wuY29kZSkpIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5wdXNoKGNvbC5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbC53aWR0aCkgY29sLndpZHRoID0gdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChjb2wpO1xuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLmlzTGF6eSkge1xuICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLmRhdGE/Lmxlbmd0aCA/PyAwO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmICF0aGlzLmlzTGF6eSkge1xuICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLmRhdGE/Lmxlbmd0aCA/PyAwO1xuXG4gICAgICBpZiAodGhpcy5kdCkgdGhpcy5kdC5maXJzdCA9IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLSBMQVpZIFBBWUxPQUQgLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgZW1pdExhenlMb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQ6IFBUVGFibGVMYXp5TG9hZEV2ZW50ID0ge1xuICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHJvd3M6IHRoaXMucm93cyxcbiAgICAgIGZpcnN0OiB0aGlzLmZpcnN0LFxuICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFZhbHVlPy50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgICAgc29ydEZpZWxkOiB0aGlzLmN1cnJlbnRTb3J0RmllbGQsXG4gICAgICBzb3J0T3JkZXI6IHRoaXMuY3VycmVudFNvcnRPcmRlcixcbiAgICAgIGZpbHRlcnM6IHsgLi4udGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXMgfSxcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKCdlbWl0TGF6eUxvYWQgcGF5bG9hZCA9JywgcGF5bG9hZCk7XG4gICAgdGhpcy5sYXp5TG9hZC5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRvRmlyc3RQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xuICAgIHRoaXMuZmlyc3QgPSAwO1xuXG4gICAgaWYgKHRoaXMuZHQpIHtcbiAgICAgIHRoaXMuZHQuZmlyc3QgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gSEVBREVSICsgQk9EWSBBTElHTk1FTlQgSEVMUEVSUyAtLS0tLS0tLS0tXG5cbiAgZ2V0SGVhZGVyVGl0bGVDbGFzcyhjb2w6IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbiA9IGNvbC5oZWFkZXJBbGlnbiA/PyBBbGlnbkVudW0uTEVGVDtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlIEFsaWduRW51bS5DRU5URVI6XG4gICAgICAgIHJldHVybiAnaGVhZGVyLXRpdGxlLWNlbnRlcic7XG4gICAgICBjYXNlIEFsaWduRW51bS5SSUdIVDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItdGl0bGUtcmlnaHQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItdGl0bGUtbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0SGVhZGVyQWxpZ25DbGFzcyhjb2w6IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbiA9IGNvbC5oZWFkZXJBbGlnbiA/PyBBbGlnbkVudW0uTEVGVDtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlIEFsaWduRW51bS5DRU5URVI6XG4gICAgICAgIHJldHVybiAnaGVhZGVyLWFsaWduLWNlbnRlcic7XG4gICAgICBjYXNlIEFsaWduRW51bS5SSUdIVDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItYWxpZ24tcmlnaHQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdoZWFkZXItYWxpZ24tbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGF0YUFsaWduQ2xhc3MoY29sOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgY29uc3QgZWZmZWN0aXZlQWxpZ24gPVxuICAgICAgY29sLmRhdGFBbGlnbiA/P1xuICAgICAgKGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLk5VTUJFUiB8fCBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BTU9VTlRcbiAgICAgICAgPyBBbGlnbkVudW0uUklHSFRcbiAgICAgICAgOiBBbGlnbkVudW0uTEVGVCk7XG5cbiAgICBzd2l0Y2ggKGVmZmVjdGl2ZUFsaWduKSB7XG4gICAgICBjYXNlIEFsaWduRW51bS5DRU5URVI6XG4gICAgICAgIHJldHVybiAnY2VsbC1hbGlnbi1jZW50ZXInO1xuICAgICAgY2FzZSBBbGlnbkVudW0uUklHSFQ6XG4gICAgICAgIHJldHVybiAnY2VsbC1hbGlnbi1yaWdodCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NlbGwtYWxpZ24tbGVmdCc7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLSBBQ1RJT05TIElOSVRJQUxJWkFUSU9OIC0tLS0tLS0tLS1cblxuICBwcml2YXRlIGluaXRpYWxpemVBY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEZWxldGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzRWRpdCA9IGZhbHNlO1xuICAgIHRoaXMuRGVsZXRlID0gKCkgPT4ge307XG4gICAgdGhpcy5pbml0RWRpdGFibGVSb3cgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnNhdmVFZGl0YWJsZVJvdyA9ICgpID0+IHt9O1xuICAgIHRoaXMuY2FuY2VsRWRpdGFibGVSb3cgPSAoKSA9PiB7fTtcbiAgICB0aGlzLmN1c3RvbUFjdGlvbnMgPSBbXTtcblxuICAgIGlmICghdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRoaXMuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLmNvZGUpIHtcbiAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICB0aGlzLmlzRGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLkRlbGV0ZSA9IChyb3c6IGFueSkgPT4gYWN0aW9uLmFjdGlvbihyb3cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVFZGl0QWN0aW9ucyhhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuY3VzdG9tQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVFZGl0QWN0aW9ucyhhY3Rpb246IFBUVGFibGVBY3Rpb25Db25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdCA9IHRydWU7XG4gICAgdGhpcy5pbml0RWRpdGFibGVSb3cgPSAoZGF0YTogYW55KSA9PiBhY3Rpb24uYWN0aW9uLmluaXQoZGF0YSk7XG4gICAgdGhpcy5zYXZlRWRpdGFibGVSb3cgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLm1hcC5nZXQoZGF0YS5pZCk7XG4gICAgICBhY3Rpb24uYWN0aW9uLnNhdmUoZGF0YSwgcmVjb3JkKTtcbiAgICAgIHRoaXMuZGF0YU1hcC5jbGVhcigpO1xuICAgIH07XG4gICAgdGhpcy5jYW5jZWxFZGl0YWJsZVJvdyA9IChpdGVtOiBhbnkpID0+IGNvbnNvbGUubG9nKGl0ZW0pO1xuICB9XG5cbiAgb25DdXN0b21BY3Rpb25DbGljayhhY3Rpb246IFBUVGFibGVBY3Rpb25Db25maWcsIHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aW9uVmlzaWJsZShhY3Rpb24sIHJvdykpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0FjdGlvbkRpc2FibGVkKGFjdGlvbiwgcm93KSkgcmV0dXJuO1xuXG4gICAgaWYgKGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBhY3Rpb24uYWN0aW9uKHJvdyksIDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gRklMVEVSSU5HIC8gU09SVElORyAvIFBBR0lOQVRJT04gLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbXBvc2VkRmlsdGVycyhjb2w6IFRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgY29sLmNvbXBvc2VkTmFtZXM/LmZvckVhY2goKGNvbXBvc2VkTmFtZSkgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IChjb2wuY29kZSBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgY29uc3QgY29tcG9zZWRDb2RlID0gY29kZSArICcuJyArIGNvbXBvc2VkTmFtZTtcblxuICAgICAgaWYgKCF0aGlzLmdsb2JhbEZpbHRlckZpZWxkcy5pbmNsdWRlcyhjb21wb3NlZENvZGUpKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzLnB1c2goY29tcG9zZWRDb2RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWx0ZXJzW2NvbXBvc2VkTmFtZV0gPSB7XG4gICAgICAgIG9wdGlvbnM6IGNvbC5maWx0ZXJPcHRpb25zLFxuICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgIGxhYmVsOiAnRmlsdGVyIGJ5ICcgKyBjb21wb3NlZE5hbWUsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wdGlvbicsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29tcG9zZWRGaWVsZFR5cGUoXG4gICAgY29sOiBUYWJsZUNvbHVtbixcbiAgICBjb21wb3NlZE5hbWU6IHN0cmluZyxcbiAgKTogVGFibGVUeXBlRW51bSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5jb21wb3NlZE5hbWVzICYmIGNvbC5jb21wb3NlZFR5cGVzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGNvbC5jb21wb3NlZE5hbWVzLmluZGV4T2YoY29tcG9zZWROYW1lKTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY29sLmNvbXBvc2VkVHlwZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjb2wuY29tcG9zZWRUeXBlc1tpbmRleF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBvbkNvbXBvc2VkQ29sdW1uQ2xlYXIoY29sOiBUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIGlmICghY29sLmNvZGUgfHwgIWNvbC5jb21wb3NlZE5hbWVzKSByZXR1cm47XG5cbiAgICBjb2wuY29tcG9zZWROYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtjb2wuY29kZX0uJHtuYW1lfWA7XG4gICAgICBkZWxldGUgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNba2V5XTtcblxuICAgICAgaWYgKHRoaXMuZmlsdGVyc1tuYW1lXSkge1xuICAgICAgICB0aGlzLmZpbHRlcnNbbmFtZV0udmFsdWUgPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGVhcmVkRmllbGRzLmFkZChrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgb25Db21wb3NlZEZpbHRlclZhbHVlQ2hhbmdlKFxuICAgIGNvbDogVGFibGVDb2x1bW4sXG4gICAgY29tcG9zZWROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVtdLFxuICAgIGZpbHRlck1vZGVsPzogYW55LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBgJHtjb2wuY29kZX0uJHtjb21wb3NlZE5hbWV9YDtcblxuICAgIGlmIChmaWx0ZXJNb2RlbCkge1xuICAgICAgZmlsdGVyTW9kZWwudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgQXJyYXkuaXNBcnJheShmaWx0ZXJNb2RlbC5jb25zdHJhaW50cykgJiZcbiAgICAgICAgZmlsdGVyTW9kZWwuY29uc3RyYWludHMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGZpbHRlck1vZGVsLmNvbnN0cmFpbnRzWzBdLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNbY29tcG9zZWROYW1lXSkge1xuICAgICAgdGhpcy5maWx0ZXJzW2NvbXBvc2VkTmFtZV0gPSB7XG4gICAgICAgIG9wdGlvbnM6IGNvbC5maWx0ZXJPcHRpb25zLFxuICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wdGlvbicsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNbY29tcG9zZWROYW1lXS52YWx1ZSA9IHZhbHVlIHx8IFtdO1xuXG4gICAgY29uc3QgaXNFbXB0eSA9ICF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcbiAgICBpZiAoaXNFbXB0eSkgZGVsZXRlIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2tleV07XG4gICAgZWxzZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1trZXldID0gdmFsdWU7XG4gIH1cblxuICBvbkZpbHRlckNsZWFyKGZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG4gICAgZGVsZXRlIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2ZpZWxkXTtcbiAgICB0aGlzLmNsZWFyZWRGaWVsZHMuYWRkKGZpZWxkKTtcbiAgfVxuXG4gIG9uRmlsdGVyVmFsdWVDaGFuZ2UoXG4gICAgZmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmaWx0ZXJNb2RlbDogYW55IHwgbnVsbCxcbiAgICB2YWx1ZTogYW55LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBpc0VtcHR5ID1cbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB2YWx1ZSA9PT0gJycgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApO1xuXG4gICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmxhdGVzdEZpbHRlclZhbHVlc1tmaWVsZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXJNb2RlbCkge1xuICAgICAgZmlsdGVyTW9kZWwudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBBcnJheS5pc0FycmF5KGZpbHRlck1vZGVsLmNvbnN0cmFpbnRzKSAmJlxuICAgICAgICBmaWx0ZXJNb2RlbC5jb25zdHJhaW50cy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgZmlsdGVyTW9kZWwuY29uc3RyYWludHNbMF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbk51bWJlckZpbHRlckNoYW5nZShmaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNFbXB0eSA9XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdmFsdWUgPT09ICcnIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcblxuICAgIGlmIChpc0VtcHR5KSBkZWxldGUgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNbZmllbGRdO1xuICAgIGVsc2UgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXNbZmllbGRdID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDb2x1bW5CeUZpZWxkKGZpZWxkOiBzdHJpbmcpOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKFxuICAgICAgKGMpID0+IGMuY29kZSA9PT0gZmllbGQgfHwgKGMuY29kZSAmJiBmaWVsZC5zdGFydHNXaXRoKGMuY29kZSArICcuJykpLFxuICAgICk7XG4gIH1cblxuICBmaWx0ZXJDb2x1bW4oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdmaWx0ZXJDb2x1bW4gZXZlbnQgPScsIGV2ZW50KTtcbiAgICBjb25zb2xlLmxvZygnZmlsdGVyQ29sdW1uIGV2ZW50LmZpbHRlcnMgPScsIGV2ZW50Py5maWx0ZXJzKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdmaWx0ZXJDb2x1bW4gbGF0ZXN0RmlsdGVyVmFsdWVzIEJFRk9SRSA9JyxcbiAgICAgIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzLFxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gZXZlbnQ/LmZpbHRlcnM7XG5cbiAgICBpZiAoIWZpbHRlcnMpIHtcbiAgICAgIGlmICh0aGlzLmlzTGF6eSkge1xuICAgICAgICB0aGlzLnJlc2V0VG9GaXJzdFBhZ2UoKTtcbiAgICAgICAgdGhpcy5vbkZpbHRlckNvbHVtbi5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc051bGxpc2ggPSAodjogYW55KSA9PiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJztcbiAgICBjb25zdCBuZXh0RmlsdGVyVmFsdWVzOiB7IFtmaWVsZDogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgICAuLi50aGlzLmxhdGVzdEZpbHRlclZhbHVlcyxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmtleXMoZmlsdGVycykuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSBmaWx0ZXJzW2ZpZWxkXTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZU1ldGEgPSAobTogYW55KSA9PlxuICAgICAgICBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID4gMCA/IG1bMF0gOiBtO1xuXG4gICAgICBjb25zdCBtID0gbm9ybWFsaXplTWV0YShtZXRhKTtcbiAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZmluZENvbHVtbkJ5RmllbGQoZmllbGQpO1xuICAgICAgY29uc3Qgd2FzQ2xlYXJlZCA9IHRoaXMuY2xlYXJlZEZpZWxkcy5oYXMoZmllbGQpO1xuXG4gICAgICBpZiAoIW0gJiYgIWNvbCkgcmV0dXJuO1xuXG4gICAgICAvLyAtLS0tIENMRUFSRUQgRklFTEQgLS0tLVxuICAgICAgLy8gTXVzdCBiZSBoYW5kbGVkIEJFRk9SRSBDT01QT1NFRCBsb2dpY1xuICAgICAgaWYgKHdhc0NsZWFyZWQpIHtcbiAgICAgICAgZGVsZXRlIG5leHRGaWx0ZXJWYWx1ZXNbZmllbGRdO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb2w/LnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRUQgJiZcbiAgICAgICAgICBjb2wuY29kZSAmJlxuICAgICAgICAgIGNvbC5jb21wb3NlZE5hbWVzXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbC5jb21wb3NlZE5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXh0RmlsdGVyVmFsdWVzW2Ake2NvbC5jb2RlfS4ke25hbWV9YF07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIG0udmFsdWUgPSBudWxsO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobS5jb25zdHJhaW50cykgJiYgbS5jb25zdHJhaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtLmNvbnN0cmFpbnRzLmZvckVhY2goKGM6IGFueSkgPT4gKGMudmFsdWUgPSBudWxsKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhcmVkRmllbGRzLmRlbGV0ZShmaWVsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gLS0tLSBDT01QT1NFRCBGSUxURVJTIC0tLS1cbiAgICAgIGlmIChjb2wgJiYgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRUQpIHtcbiAgICAgICAgY29uc3QgY29tcG9zZWRWYWx1ZXM6IGFueSA9IHt9O1xuXG4gICAgICAgIGNvbC5jb21wb3NlZE5hbWVzPy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gYCR7Y29sLmNvZGV9LiR7bmFtZX1gO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY2xlYXJlZEZpZWxkcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgZGVsZXRlIG5leHRGaWx0ZXJWYWx1ZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJlZEZpZWxkcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2YWwgPSBuZXh0RmlsdGVyVmFsdWVzW2tleV07XG4gICAgICAgICAgY29uc3QgZW1wdHkgPVxuICAgICAgICAgICAgaXNOdWxsaXNoKHZhbCkgfHwgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID09PSAwKTtcblxuICAgICAgICAgIGlmICghZW1wdHkpIHtcbiAgICAgICAgICAgIGNvbXBvc2VkVmFsdWVzW25hbWVdID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbXBvc2VkVmFsdWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgbS52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgICAgICBtLmNvbnN0cmFpbnRzLmZvckVhY2goKGM6IGFueSkgPT4gKGMudmFsdWUgPSBudWxsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0udmFsdWUgPSBjb21wb3NlZFZhbHVlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFtKSByZXR1cm47XG5cbiAgICAgIGxldCB2YWx1ZTogYW55ID0gbS52YWx1ZTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobS5jb25zdHJhaW50cykgJiYgbS5jb25zdHJhaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNWYWwgPSBtLmNvbnN0cmFpbnRzWzBdLnZhbHVlO1xuICAgICAgICBpZiAoIWlzTnVsbGlzaChjVmFsKSkge1xuICAgICAgICAgIHZhbHVlID0gY1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZWQgPSBuZXh0RmlsdGVyVmFsdWVzW2ZpZWxkXTtcbiAgICAgIGNvbnN0IGhhc0NhY2hlZCA9XG4gICAgICAgICFpc051bGxpc2goY2FjaGVkKSAmJiAoIUFycmF5LmlzQXJyYXkoY2FjaGVkKSB8fCBjYWNoZWQubGVuZ3RoID4gMCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKGlzTnVsbGlzaCh2YWx1ZSkgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpICYmXG4gICAgICAgIGhhc0NhY2hlZFxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlID0gY2FjaGVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0VtcHR5ID1cbiAgICAgICAgaXNOdWxsaXNoKHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcblxuICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgZGVsZXRlIG5leHRGaWx0ZXJWYWx1ZXNbZmllbGRdO1xuICAgICAgICBtLnZhbHVlID0gbnVsbDtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtLmNvbnN0cmFpbnRzKSAmJiBtLmNvbnN0cmFpbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtLmNvbnN0cmFpbnRzWzBdLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGVtaXRWYWx1ZTogYW55ID0gdmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY29sICYmXG4gICAgICAgIChjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFIHx8IGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEVUSU1FKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLnBhcnNlQW55RGF0ZSh2YWx1ZSk7XG4gICAgICAgIGVtaXRWYWx1ZSA9XG4gICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURVxuICAgICAgICAgICAgPyB0aGlzLmZvcm1hdERhdGVXaXRoQ29sdW1uKGQsIGNvbClcbiAgICAgICAgICAgIDogdGhpcy5mb3JtYXREYXRlVGltZVdpdGhDb2x1bW4oZCwgY29sKTtcbiAgICAgIH1cblxuICAgICAgbmV4dEZpbHRlclZhbHVlc1tmaWVsZF0gPSBlbWl0VmFsdWU7XG4gICAgICBtLnZhbHVlID0gZW1pdFZhbHVlO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtLmNvbnN0cmFpbnRzKSAmJiBtLmNvbnN0cmFpbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbS5jb25zdHJhaW50c1swXS52YWx1ZSA9IGVtaXRWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdmaWx0ZXJDb2x1bW4gbmV4dEZpbHRlclZhbHVlcyA9JywgbmV4dEZpbHRlclZhbHVlcyk7XG4gICAgdGhpcy5sYXRlc3RGaWx0ZXJWYWx1ZXMgPSBuZXh0RmlsdGVyVmFsdWVzO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ2ZpbHRlckNvbHVtbiBsYXRlc3RGaWx0ZXJWYWx1ZXMgQUZURVIgPScsXG4gICAgICB0aGlzLmxhdGVzdEZpbHRlclZhbHVlcyxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICB0aGlzLnJlc2V0VG9GaXJzdFBhZ2UoKTtcbiAgICAgIHRoaXMub25GaWx0ZXJDb2x1bW4uZW1pdChldmVudCk7XG4gICAgICB0aGlzLmVtaXRMYXp5TG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5kdCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gKHRoaXMuZHQuZmlsdGVyZWRWYWx1ZSA/PyB0aGlzLmR0LnZhbHVlID8/IFtdKSBhcyBhbnlbXTtcbiAgICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSBjdXJyZW50Py5sZW5ndGggPz8gMDtcbiAgICAgICAgdGhpcy5kdC5maXJzdCA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlUGFnZShldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgcGFnZSA9IGV2ZW50LnBhZ2UgPz8gTWF0aC5mbG9vcigoZXZlbnQuZmlyc3QgfHwgMCkgLyBldmVudC5yb3dzKTtcbiAgICBjb25zdCByb3dzID0gZXZlbnQucm93cztcbiAgICBjb25zdCBmaXJzdCA9IGV2ZW50LmZpcnN0ID8/IHBhZ2UgKiByb3dzO1xuXG4gICAgdGhpcy5yb3dzID0gcm93cztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7XG5cbiAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoeyBwYWdlLCByb3dzIH0pO1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBzb3J0Q29sdW1uKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNMYXp5KSByZXR1cm47XG5cbiAgICBsZXQgZmllbGQgPSBldmVudC5maWVsZDtcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbnMuZmluZCgoYykgPT4gYy5jb2RlID09PSBmaWVsZCk7XG5cbiAgICBpZiAoY29sICYmIGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkNPTVBPU0VEKSB7XG4gICAgICBsZXQgdGV4dFByb3A6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGNvbC5jb21wb3NlZE5hbWVzICYmIGNvbC5jb21wb3NlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGNvbC5jb21wb3NlZFR5cGVzLmZpbmRJbmRleChcbiAgICAgICAgICAodCkgPT4gdCA9PT0gVGFibGVUeXBlRW51bS5TVFJJTkcsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpZHggPj0gMCAmJiBpZHggPCBjb2wuY29tcG9zZWROYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICB0ZXh0UHJvcCA9IGNvbC5jb21wb3NlZE5hbWVzW2lkeF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0ZXh0UHJvcCAmJiBjb2wuY29tcG9zZWROYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRleHRQcm9wID0gY29sLmNvbXBvc2VkTmFtZXNbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXh0UHJvcCkgZmllbGQgPSBgJHtmaWVsZH0uJHt0ZXh0UHJvcH1gO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFNvcnRGaWVsZCA9IGZpZWxkID8/IG51bGw7XG4gICAgdGhpcy5jdXJyZW50U29ydE9yZGVyID0gKGV2ZW50Lm9yZGVyIGFzIDEgfCAtMSkgPz8gbnVsbDtcblxuICAgIHRoaXMucmVzZXRUb0ZpcnN0UGFnZSgpO1xuICAgIHRoaXMub25Tb3J0Q29sdW1uLmVtaXQoeyAuLi5ldmVudCwgZmllbGQgfSk7XG4gICAgdGhpcy5lbWl0TGF6eUxvYWQoKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gRURJVCBIRUxQRVJTIC0tLS0tLS0tLS1cblxuICBwcml2YXRlIHBhcnNlRGF0ZV9kZE1NeXl5eShkYXRlU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRlU3RyaW5nLnNwbGl0KCcvJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKSAtIDE7XG4gICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICAgIHJldHVybiBpc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvbkNoYW5nZShldmVudDogRXZlbnQsIGlkOiBudW1iZXIsIGtleTogYW55KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5jaGFuZ2VIYW5kbGVyKGlkLCBrZXksIHRhcmdldC52YWx1ZSk7XG4gIH1cblxuICBjaGFuZ2VIYW5kbGVyKGlkOiBudW1iZXIsIGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KTtcblxuICAgIGlmICghdGhpcy5tYXAuZ2V0KGlkKSkge1xuICAgICAgaWYgKGNvbHVtbj8udHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFKSB7XG4gICAgICAgIHRoaXMuZGF0YU1hcC5zZXQoa2V5LCB0aGlzLnBhcnNlRGF0ZV9kZE1NeXl5eSh2YWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChpZCwgbmV3IE1hcCh0aGlzLmRhdGFNYXApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWFwSXRlbSA9IHRoaXMubWFwLmdldChpZCkgYXMgTWFwPGFueSwgYW55PjtcbiAgICAgIGlmIChjb2x1bW4/LnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURSkge1xuICAgICAgICBtYXBJdGVtLnNldChrZXksIHRoaXMucGFyc2VEYXRlX2RkTU15eXl5KHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBJdGVtLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tIFRZUEVTIC0tLS0tLS0tLS1cblxuICBnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbHVtbjogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5TVFJJTkc6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICBjYXNlIFRhYmxlVHlwZUVudW0uQU1PVU5UOlxuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLk5VTUJFUjpcbiAgICAgICAgcmV0dXJuICdudW1lcmljJztcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5EQVRFOlxuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLkRBVEVUSU1FOlxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLk1VTFRJU0VMRUNUOlxuICAgICAgICByZXR1cm4gJ211bHRpU2VsZWN0JztcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5CT09MRUFOOlxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLkNPTVBPU0VEOlxuICAgICAgICByZXR1cm4gJ2NvbXBvc2VkJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgfVxuICB9XG5cbiAgaXNFZGl0YWJsZShrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICgha2V5KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KTtcbiAgICByZXR1cm4gY29sdW1uPy5pc0VkaXRhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzTXVsdGlTZWxlY3Qoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBrZXkpO1xuICAgIGlmIChcbiAgICAgIGNvbHVtbj8udHlwZSA9PT0gVGFibGVUeXBlRW51bS5NVUxUSVNFTEVDVCAmJlxuICAgICAgY29sdW1uLm9wdGlvbnMgJiZcbiAgICAgIGNvbHVtbi5jb2RlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMub3B0aW9uRW50cmllcyA9IG5ldyBNYXAoW1xuICAgICAgICBbY29sdW1uLmNvZGUgYXMgc3RyaW5nLCBPYmplY3QudmFsdWVzKGNvbHVtbi5vcHRpb25zKV0sXG4gICAgICBdKTtcbiAgICAgIHRoaXMub3B0aW9uVmFsdWVzID0gdGhpcy5vcHRpb25FbnRyaWVzLmdldChrZXkpIHx8IFtdO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzRGF0ZVBpY2tlcihrZXk6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBrZXkpPy50eXBlO1xuICAgIHJldHVybiB0ID09PSBUYWJsZVR5cGVFbnVtLkRBVEUgfHwgdCA9PT0gVGFibGVUeXBlRW51bS5EQVRFVElNRTtcbiAgfVxuXG4gIGlzRGF0ZVRpbWVQaWNrZXIoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KT8udHlwZTtcbiAgICByZXR1cm4gdCA9PT0gVGFibGVUeXBlRW51bS5EQVRFVElNRTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gU0VBUkNIIC0tLS0tLS0tLS1cblxuICBmaWx0ZXJHbG9iYWwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSAodGFyZ2V0LnZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnJlc2V0VG9GaXJzdFBhZ2UoKTtcbiAgICAgIHRoaXMuc2VhcmNoLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmR0LnZhbHVlID0gWy4uLih0aGlzLmRhdGEgPz8gW10pXTtcbiAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gKHRoaXMuZHQudmFsdWUgPz8gW10pLmxlbmd0aDtcbiAgICAgIHRoaXMuZHQuZmlyc3QgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9ICh0aGlzLmRhdGEgPz8gW10pLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICh0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyA/PyBbXSkuc29tZSgoZmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zPy5maW5kKChjb2wpID0+IGNvbC5jb2RlID09PSBmaWVsZCk7XG4gICAgICAgIGlmICghY29sdW1uKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY2VsbCA9IGl0ZW0/LltmaWVsZF07XG5cbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlV2l0aENvbHVtbih0aGlzLnBhcnNlQW55RGF0ZShjZWxsKSwgY29sdW1uKVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURVRJTUUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlVGltZVdpdGhDb2x1bW4odGhpcy5wYXJzZUFueURhdGUoY2VsbCksIGNvbHVtbilcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFNT1VOVCB8fFxuICAgICAgICAgIGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLk5VTUJFUlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGNlbGwgPz8gJycpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5DT01QT1NFRCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlckNvbXBvc2VkQ29sdW1uKGNlbGwsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBTdHJpbmcoY2VsbCA/PyAnJylcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5kdC52YWx1ZSA9IGZpbHRlcmVkRGF0YTtcbiAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IGZpbHRlcmVkRGF0YS5sZW5ndGg7XG4gICAgdGhpcy5kdC5maXJzdCA9IDA7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckNvbXBvc2VkQ29sdW1uKGNvbXBvc2VkRGF0YTogYW55LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbXBvc2VkRGF0YSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbXBvc2VkRGF0YSkuc29tZSgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGxWYWx1ZSA9IGNvbXBvc2VkRGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGNlbGxWYWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGNlbGxWYWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLSBEQVRFIC8gREFURVRJTUUgLS0tLS0tLS0tLVxuXG4gIHB1YmxpYyBwYXJzZUFueURhdGUoaW5wdXQ6IGFueSk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCB8fCBpbnB1dCA9PT0gJycpIHJldHVybiBudWxsO1xuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBpc05hTihpbnB1dC5nZXRUaW1lKCkpID8gbnVsbCA6IGlucHV0O1xuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICByZXR1cm4gaXNOYU4oZC5nZXRUaW1lKCkpID8gbnVsbCA6IGQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHMgPSBpbnB1dC50cmltKCk7XG4gICAgICBjb25zdCBpc29UcnkgPSBuZXcgRGF0ZShzKTtcbiAgICAgIGlmICghaXNOYU4oaXNvVHJ5LmdldFRpbWUoKSkpIHJldHVybiBpc29Ucnk7XG5cbiAgICAgIGlmIChzLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBzLnNwbGl0KCcgJylbMF0uc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KHBhcnRzWzBdLCAxMCk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChwYXJ0c1sxXSwgMTApIC0gMTtcbiAgICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcbiAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICAgICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IG51bGwgOiBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFdpdGhQYXR0ZXJuKGQ6IERhdGUgfCBudWxsLCBwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHBhZDIgPSAobjogbnVtYmVyKSA9PiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBkZDogcGFkMihkLmdldERhdGUoKSksXG4gICAgICBNTTogcGFkMihkLmdldE1vbnRoKCkgKyAxKSxcbiAgICAgIHl5eXk6IFN0cmluZyhkLmdldEZ1bGxZZWFyKCkpLFxuICAgICAgSEg6IHBhZDIoZC5nZXRIb3VycygpKSxcbiAgICAgIG1tOiBwYWQyKGQuZ2V0TWludXRlcygpKSxcbiAgICAgIHNzOiBwYWQyKGQuZ2V0U2Vjb25kcygpKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhdHRlcm5cbiAgICAgIC5yZXBsYWNlKC95eXl5L2csIG1hcC55eXl5KVxuICAgICAgLnJlcGxhY2UoL2RkL2csIG1hcC5kZClcbiAgICAgIC5yZXBsYWNlKC9NTS9nLCBtYXAuTU0pXG4gICAgICAucmVwbGFjZSgvSEgvZywgbWFwLkhIKVxuICAgICAgLnJlcGxhY2UoL21tL2csIG1hcC5tbSlcbiAgICAgIC5yZXBsYWNlKC9zcy9nLCBtYXAuc3MpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGQgPSB0aGlzLnBhcnNlQW55RGF0ZShkYXRlKTtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoUGF0dGVybihkLCAnZGQvTU0veXl5eScpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVdpdGhDb2x1bW4oZDogRGF0ZSB8IG51bGwsIGNvbDogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGZtdCA9IGNvbC5kYXRlRm9ybWF0Py50cmltKCkgfHwgJ2RkL01NL3l5eXknO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFdpdGhQYXR0ZXJuKGQsIGZtdCk7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZVdpdGhDb2x1bW4oZDogRGF0ZSB8IG51bGwsIGNvbDogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGZtdCA9IGNvbC5kYXRlVGltZUZvcm1hdD8udHJpbSgpIHx8ICdkZC9NTS95eXl5IEhIOm1tOnNzJztcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoUGF0dGVybihkLCBmbXQpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLSBNSVNDIC0tLS0tLS0tLS1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbldpZHRoKGNvbDogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRXaWR0aCA9IGNhbGN1bGF0ZVRleHRXaWR0aChjb2wsIGNvbC50aXRsZSk7XG4gICAgY29uc3QgdG90YWxXaWR0aCA9IGNhbGN1bGF0ZWRXaWR0aCArIHRoaXMuaWNvbldpZHRoICsgMjA7XG4gICAgcmV0dXJuIGAke3RvdGFsV2lkdGh9cHhgO1xuICB9XG5cbiAgZ2V0SGVhZGVyV2lkdGgoY29sOiBUYWJsZUNvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgoY29sKTtcbiAgfVxuXG4gIGNsZWFyKHRhYmxlOiBUYWJsZSkge1xuICAgIHRhYmxlLmNsZWFyKCk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMubGF0ZXN0RmlsdGVyVmFsdWVzID0ge307XG4gICAgdGhpcy5jbGVhcmVkRmllbGRzLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50U29ydEZpZWxkID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRTb3J0T3JkZXIgPSBudWxsO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnNba2V5XSkgdGhpcy5maWx0ZXJzW2tleV0udmFsdWUgPSBbXTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzTGF6eSkge1xuICAgICAgdGhpcy5yZXNldFRvRmlyc3RQYWdlKCk7XG4gICAgICB0aGlzLm9uRmlsdGVyQ29sdW1uLmVtaXQoeyBjbGVhcmVkOiB0cnVlIH0pO1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kdCkge1xuICAgICAgdGhpcy5kdC52YWx1ZSA9IFsuLi4odGhpcy5kYXRhID8/IFtdKV07XG4gICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9ICh0aGlzLmR0LnZhbHVlID8/IFtdKS5sZW5ndGg7XG4gICAgICB0aGlzLmR0LmZpcnN0ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUGFnaW5hdGVkKSB7XG4gICAgICBpZiAoIXRoaXMucm93c1BlclBhZ2UgfHwgdGhpcy5yb3dzUGVyUGFnZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yb3dzUGVyUGFnZSA9IFsxMCwgMjAsIDMwXTtcbiAgICAgIH1cbiAgICAgIHRoaXMucm93cyA9IHRoaXMucm93c1BlclBhZ2VbMF07XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMDtcbiAgICAgIHRoaXMuZmlyc3QgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbmN5U3ltYm9sKGNvbHVtbjogVGFibGVDb2x1bW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5BTU9VTlQgJiZcbiAgICAgIGNvbHVtbi5jdXJyZW5jeSAmJlxuICAgICAgdGhpcy5pc1ZhbGlkQ3VycmVuY3lDb2RlKGNvbHVtbi5jdXJyZW5jeSlcbiAgICAgID8gY29sdW1uLmN1cnJlbmN5XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEN1cnJlbmN5Q29kZShjdXJyZW5jeUNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkQ3VycmVuY3lDb2Rlcy5pbmNsdWRlcyhjdXJyZW5jeUNvZGUpO1xuICB9XG5cbiAgZXhwb3J0RXhjZWwoKSB7XG4gICAgdGhpcy5leHBvcnRFeGNlbEV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIGV4cG9ydFBkZigpIHtcbiAgICB0aGlzLmV4cG9ydFBkZkV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIGdldEltYWdlU3R5bGUoc3R5bGU6IFRpdGxlU3R5bGUgfCBJbWFnZVN0eWxlIHwgdW5kZWZpbmVkKToge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfSB7XG4gICAgaWYgKCFzdHlsZSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGltYWdlU3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICB3aWR0aDogKHN0eWxlIGFzIEltYWdlU3R5bGUpLndpZHRoIHx8ICdhdXRvJyxcbiAgICAgIGhlaWdodDogKHN0eWxlIGFzIEltYWdlU3R5bGUpLmhlaWdodCB8fCAnYXV0bycsXG4gICAgfTtcbiAgICBpZiAoKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpbilcbiAgICAgIGltYWdlU3R5bGUubWFyZ2luID0gKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpbiE7XG4gICAgaWYgKChzdHlsZSBhcyBJbWFnZVN0eWxlKS5tYXJnaW5MZWZ0KVxuICAgICAgaW1hZ2VTdHlsZS5tYXJnaW5MZWZ0ID0gKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpbkxlZnQhO1xuICAgIGlmICgoc3R5bGUgYXMgSW1hZ2VTdHlsZSkubWFyZ2luUmlnaHQpXG4gICAgICBpbWFnZVN0eWxlLm1hcmdpblJpZ2h0ID0gKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpblJpZ2h0ITtcbiAgICBpZiAoKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpblRvcClcbiAgICAgIGltYWdlU3R5bGUubWFyZ2luVG9wID0gKHN0eWxlIGFzIEltYWdlU3R5bGUpLm1hcmdpblRvcCE7XG4gICAgaWYgKChzdHlsZSBhcyBJbWFnZVN0eWxlKS5tYXJnaW5Cb3R0b20pXG4gICAgICBpbWFnZVN0eWxlLm1hcmdpbkJvdHRvbSA9IChzdHlsZSBhcyBJbWFnZVN0eWxlKS5tYXJnaW5Cb3R0b20hO1xuICAgIHJldHVybiBpbWFnZVN0eWxlO1xuICB9XG5cbiAgZ2V0VGl0bGVTdHlsZShzdHlsZTogVGl0bGVTdHlsZSB8IEltYWdlU3R5bGUgfCB1bmRlZmluZWQpOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9IHtcbiAgICBpZiAoIXN0eWxlKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiBzdHlsZS5jb2xvciB8fCAnaW5oZXJpdCcsXG4gICAgICBmb250U2l6ZTogKHN0eWxlIGFzIFRpdGxlU3R5bGUpLmZvbnRTaXplIHx8ICdpbmhlcml0JyxcbiAgICAgIHRleHRBbGlnbjogKHN0eWxlIGFzIFRpdGxlU3R5bGUpLnBvc2l0aW9uIHx8ICdsZWZ0JyxcbiAgICB9O1xuICB9XG5cbiAgZm9ybWF0TnVtYmVyKFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgZGVjaW1hbFBsYWNlcz86IG51bWJlcixcbiAgICB0aG91c2FuZFNlcGFyYXRvcjogJ2NvbW1hJyB8ICdzcGFjZScgPSAnY29tbWEnLFxuICAgIGRlY2ltYWxTZXBhcmF0b3I6ICdjb21tYScgfCAnZG90JyA9ICdkb3QnLFxuICApOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKHZhbHVlKSkgcmV0dXJuICcnO1xuXG4gICAgbGV0IGZvcm1hdHRlZE51bWJlciA9XG4gICAgICBkZWNpbWFsUGxhY2VzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB2YWx1ZS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpXG4gICAgICAgIDogdmFsdWUudG9TdHJpbmcoKTtcblxuICAgIGlmIChkZWNpbWFsU2VwYXJhdG9yID09PSAnY29tbWEnKSB7XG4gICAgICBmb3JtYXR0ZWROdW1iZXIgPSBmb3JtYXR0ZWROdW1iZXIucmVwbGFjZSgnLicsICcsJyk7XG4gICAgfVxuXG4gICAgaWYgKHRob3VzYW5kU2VwYXJhdG9yICYmIE1hdGguYWJzKHZhbHVlKSA+PSAxMDAwKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlZE51bWJlci5zcGxpdChcbiAgICAgICAgZGVjaW1hbFNlcGFyYXRvciA9PT0gJ2NvbW1hJyA/ICcsJyA6ICcuJyxcbiAgICAgICk7XG4gICAgICBwYXJ0c1swXSA9IHBhcnRzWzBdLnJlcGxhY2UoXG4gICAgICAgIC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLFxuICAgICAgICB0aG91c2FuZFNlcGFyYXRvciA9PT0gJ2NvbW1hJyA/ICcsJyA6ICcgJyxcbiAgICAgICk7XG4gICAgICBmb3JtYXR0ZWROdW1iZXIgPSBwYXJ0cy5qb2luKGRlY2ltYWxTZXBhcmF0b3IgPT09ICdjb21tYScgPyAnLCcgOiAnLicpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXR0ZWROdW1iZXI7XG4gIH1cblxuICBpc0FjdGlvblZpc2libGUoYWN0aW9uOiBQVFRhYmxlQWN0aW9uQ29uZmlnLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHYgPSBhY3Rpb24/LnZpc2libGU7XG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgPyAhIXYocm93KSA6ICEhdjtcbiAgfVxuXG4gIGlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uOiBQVFRhYmxlQWN0aW9uQ29uZmlnLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGQgPSBhY3Rpb24uZGlzYWJsZWQ7XG4gICAgaWYgKGQgPT09IHVuZGVmaW5lZCB8fCBkID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHR5cGVvZiBkID09PSAnZnVuY3Rpb24nID8gISFkKHJvdykgOiAhIWQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwdC1hZHZhbmNlZC1wcmltZS10YWJsZSB0YWJsZS1jb250YWluZXJcIj5cbiAgPHAtdGFibGVcbiAgICAjZHRcbiAgICBbdmFsdWVdPVwiZGF0YVwiXG4gICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXG4gICAgW3Jvd3NdPVwicm93c1wiXG4gICAgW3BhZ2luYXRvcl09XCJpc1BhZ2luYXRlZFwiXG4gICAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJnbG9iYWxGaWx0ZXJGaWVsZHNcIlxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicm93c1BlclBhZ2VcIlxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgICBbbGF6eV09XCJpc0xhenlcIlxuICAgIFtmaWx0ZXJEZWxheV09XCIwXCJcbiAgICBkYXRhS2V5PVwiaWRcIlxuICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1ncmlkbGluZXMgcC1kYXRhdGFibGUtc3RyaXBlZFwiXG4gICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgW3Njcm9sbEhlaWdodF09XCJtYXhIZWlnaHQgIT09IG51bGwgPyBtYXhIZWlnaHQgOiB1bmRlZmluZWRcIlxuICAgIChvblBhZ2UpPVwiY2hhbmdlUGFnZSgkZXZlbnQpXCJcbiAgICAob25Tb3J0KT1cInNvcnRDb2x1bW4oJGV2ZW50KVwiXG4gICAgKG9uRmlsdGVyKT1cImZpbHRlckNvbHVtbigkZXZlbnQpXCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxuICAgICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoIHx8IGdldEhlYWRlcldpZHRoKGNvbClcIlxuICAgICAgICAvPlxuICAgICAgPC9jb2xncm91cD5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzPlRvdGFsOiB7eyB0b3RhbFJlY29yZHMgfX08L2gzPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzU2VhcmNoRmlsdGVyXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGljb249XCJwaSBwaS1maWx0ZXItc2xhc2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKGR0KVwiXG4gICAgICAgICAgICB0aXRsZT1cIkNsZWFyIGZpbHRlcnNcIlxuICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzRXhwb3J0RXhjZWxcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWZpbGUtZXhjZWxcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydEV4Y2VsKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJFeHBvcnQgdG8gRXhjZWxcIlxuICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzRXhwb3J0UERGXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGljb249XCJwaSBwaS1maWxlLXBkZlwiXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UGRmKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJFeHBvcnQgdG8gUERGXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtbC1hdXRvXCIgKm5nSWY9XCJoYXNTZWFyY2hGaWx0ZXJcIj5cbiAgICAgICAgICA8cC1pY29uRmllbGQgaWNvblBvc2l0aW9uPVwibGVmdFwiIGNsYXNzPVwibWwtYXV0b1wiPlxuICAgICAgICAgICAgPHAtaW5wdXRJY29uPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNlYXJjaFwiPjwvaT5cbiAgICAgICAgICAgIDwvcC1pbnB1dEljb24+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiZmlsdGVyR2xvYmFsKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBrZXl3b3JkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9wLWljb25GaWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgPHRyIGNsYXNzPVwic3RpY2t5LWhlYWRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgKm5nSWY9XCIhY29sLmNoaWxkcmVuOyBlbHNlIGdyb3VwSGVhZGVyXCJcbiAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmNvZGVcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCB8fCBnZXRIZWFkZXJXaWR0aChjb2wpXCJcbiAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cIicwcHgnXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgICAgICAgZ2V0SGVhZGVyQWxpZ25DbGFzcyhjb2wpLFxuICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BQ1RJT04gPyAnYWN0aW9uLWNvbHVtbicgOiAnJyxcbiAgICAgICAgICAgIF1cIlxuICAgICAgICAgICAgY29sc3Bhbj1cIjFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NvcnRhYmxlICYmIGNvbC5pc1NvcnRhYmxlICE9PSBmYWxzZTsgZWxzZSBub1NvcnRIZWFkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggfHwgZ2V0SGVhZGVyV2lkdGgoY29sKVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmddPVwiJzBweCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5dPVwiJzEwcHgnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImdldEhlYWRlclRpdGxlQ2xhc3MoY29sKVwiPlxuICAgICAgICAgICAgICAgICAge3sgY29sLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInNzdweCdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuY29kZVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNDb2x1bW5GaWx0ZXIgJiYgY29sLmlzRmlsdGVyICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ09NUE9TRUQgRklMVEVSIC0tPlxuICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkNPTVBPU0VEXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dBcHBseUJ1dHRvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93TWF0Y2hNb2Rlc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dPcGVyYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25Db21wb3NlZENvbHVtbkNsZWFyKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb21wb3NlZE5hbWUgb2YgY29sLmNvbXBvc2VkTmFtZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb21wb3NlZEZpZWxkVHlwZShjb2wsIGNvbXBvc2VkTmFtZSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVR5cGVFbnVtLlNUUklOR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyc1tjb21wb3NlZE5hbWVdPy5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJzW2NvbXBvc2VkTmFtZV0/LnZhbHVlID8/IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbXBvc2VkRmlsdGVyVmFsdWVDaGFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2VkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCRldmVudCA/PyBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyc1tjb21wb3NlZE5hbWVdPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwiY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1tdWx0aXNlbGVjdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaXRlbS5pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIE9USEVSIFRZUEVTIC0tPlxuICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC50eXBlICE9PSBUYWJsZVR5cGVFbnVtLkNPTVBPU0VEXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93QXBwbHlCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd01hdGNoTW9kZXNdPVwiY29sLnR5cGUgIT09IFRhYmxlVHlwZUVudW0uTVVMVElTRUxFQ1RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93T3BlcmF0b3JdPVwiY29sLnR5cGUgIT09IFRhYmxlVHlwZUVudW0uTVVMVElTRUxFQ1RcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXRjaE1vZGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5NVUxUSVNFTEVDVFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdpbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uRmlsdGVyQ2xlYXIoY29sLmNvZGUhKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5VTUJFUiAvIEFNT1VOVCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5OVU1CRVIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQU1PVU5UXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJkZWNpbWFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF0ZXN0RmlsdGVyVmFsdWVzW2NvbC5jb2RlIV0gPz8gdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk51bWJlckZpbHRlckNoYW5nZShjb2wuY29kZSEsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhIG51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIERBVEUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC1maWx0ZXI9XCJmaWx0ZXJDYWxsYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXRlc3RGaWx0ZXJWYWx1ZXNbY29sLmNvZGUhXSA/PyB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBudWxsLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQ9XCJkZC9tbS95eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1VTFRJU0VMRUNUIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5maWx0ZXJPcHRpb25zICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5maWx0ZXJPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQtZmlsdGVyPVwiZmlsdGVyQ2FsbGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sLmZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEZpbHRlclZhbHVlc1tjb2wuY29kZSFdID8/IHZhbHVlID8/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBudWxsLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigkZXZlbnQgPz8gW10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk9XCJjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDaG9vc2Ugb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tbXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Tb3J0SGVhZGVyPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggfHwgZ2V0SGVhZGVyV2lkdGgoY29sKVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmddPVwiJzBweCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5dPVwiJzEwcHgnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImdldEhlYWRlclRpdGxlQ2xhc3MoY29sKVwiPlxuICAgICAgICAgICAgICAgICAge3sgY29sLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0NvbHVtbkZpbHRlciAmJiBjb2wuaXNGaWx0ZXIgIT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSA9PT0gJ0FNT1VOVCdcIlxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuY29kZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImdldENvbHVtbkZpbHRlclR5cGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeV09XCJnZXRDdXJyZW5jeVN5bWJvbChjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dBcHBseUJ1dHRvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cImRlY2ltYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibGF0ZXN0RmlsdGVyVmFsdWVzW2NvbC5jb2RlIV0gPz8gdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmlsdGVyVmFsdWVDaGFuZ2UoY29sLmNvZGUhLCBudWxsLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhbiBhbW91bnRcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxuXG4gICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSAhPT0gJ0FNT1VOVCdcIlxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuY29kZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImdldENvbHVtbkZpbHRlclR5cGUoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93QXBwbHlCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93TWF0Y2hNb2Rlc109XCJcbiAgICAgICAgICAgICAgICAgICAgICBnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbCkgIT09ICdtdWx0aVNlbGVjdCdcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dPcGVyYXRvcl09XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbCkgIT09ICdtdWx0aVNlbGVjdCdcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0Y2hNb2RlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGdldENvbHVtbkZpbHRlclR5cGUoY29sKSA9PT0gJ211bHRpU2VsZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnaW4nXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkZpbHRlckNsZWFyKGNvbC5jb2RlISlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIERBVEUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldENvbHVtbkZpbHRlclR5cGUoY29sKSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJsYXRlc3RGaWx0ZXJWYWx1ZXNbY29sLmNvZGUhXSA/PyB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaWx0ZXJWYWx1ZUNoYW5nZShjb2wuY29kZSEsIG51bGwsICRldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cImRkL21tL3l5XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTVVMVElTRUxFQ1QgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlcj1cImZpbHRlckNhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldENvbHVtbkZpbHRlclR5cGUoY29sKSA9PT0gJ211bHRpU2VsZWN0J1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sLmZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxhdGVzdEZpbHRlclZhbHVlc1tjb2wuY29kZSFdID8/IHZhbHVlID8/IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpbHRlclZhbHVlQ2hhbmdlKGNvbC5jb2RlISwgbnVsbCwgJGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCRldmVudCA/PyBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwiY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNncm91cEhlYWRlcj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNvbC5jaGlsZHJlbj8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCB8fCBnZXRIZWFkZXJXaWR0aChjb2wpXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SGVhZGVyQWxpZ25DbGFzcyhjb2wpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgY29sLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdHI+XG5cbiAgICAgIDx0ciAqbmdJZj1cImhhc0dyb3VwZWRDb2x1bW5zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5jaGlsZHJlblwiPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBjb2wuY2hpbGRyZW5cIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY2hpbGQud2lkdGggfHwgZ2V0SGVhZGVyV2lkdGgoY2hpbGQpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmddPVwiJzBweCdcIlxuICAgICAgICAgICAgPjwvdGg+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgPHRyIGNsYXNzPVwicC1kYXRhdGFibGUtZW1wdHltZXNzYWdlXCI+XG4gICAgICAgIDx0ZCBjbGFzcz1cImVtcHR5LW1lc3NhZ2UtY2VsbFwiIFthdHRyLmNvbHNwYW5dPVwiY29sdW1ucy5sZW5ndGggfHwgMVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1tZXNzYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgIDxwPk5vIHJlY29yZHMgYXZhaWxhYmxlIHRvIGRpc3BsYXkuPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgIHBUZW1wbGF0ZT1cImJvZHlcIlxuICAgICAgbGV0LWRhdGFcbiAgICAgIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiXG4gICAgICBsZXQtcmk9XCJyb3dJbmRleFwiXG4gICAgPlxuICAgICAgPHRyICpuZ0lmPVwiIWxvYWRpbmdcIiBbcEVkaXRhYmxlUm93XT1cImlzRWRpdCA/IGRhdGEgOiBudWxsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2wuY2hpbGRyZW47IGVsc2UgY2hpbGRDb2x1bW5zXCI+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBpc0VkaXRhYmxlKGNvbC5jb2RlISkgJiYgY29sLnR5cGUgIT09IFRhYmxlVHlwZUVudW0uQUNUSU9OO1xuICAgICAgICAgICAgICAgIGVsc2Ugbm9ybWFsVERcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCB8fCBnZXRIZWFkZXJXaWR0aChjb2wpXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGF0YUFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc011bHRpU2VsZWN0KGNvbC5jb2RlKTsgZWxzZSBkYXRlUGlja2VyXCI+XG4gICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZGF0YVtjb2wuY29kZSFdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogJzEwMCUnIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZUhhbmRsZXIoZGF0YS5pZCwgY29sLmNvZGUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm9wdGlvblZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgID48L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlYyBvZiBkYXRhW2NvbC5jb2RlIV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhZyBbdmFsdWVdPVwicmVjXCI+PC9wLXRhZz5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGF0ZVBpY2tlcihjb2wuY29kZSk7IGVsc2Ugbm9ybWFsSW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJkYXRhW2NvbC5jb2RlIV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZGF0YVtjb2wuY29kZSFdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIYW5kbGVyKGRhdGEuaWQsIGNvbC5jb2RlLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiJ2RkL21tL3l5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGFbY29sLmNvZGUhXSB8IGN1c3RvbURhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsSW5wdXQ+XG4gICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImRhdGFbY29sLmNvZGUhXVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIGRhdGEuaWQsIGNvbC5jb2RlKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFNT1VOVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugbm9ybWFsT3V0cHV0XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2NvbC5jb2RlIV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjdXN0b21DdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0Q3VycmVuY3lTeW1ib2woY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLmRlY2ltYWxQbGFjZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC50aG91c2FuZFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLmRlY2ltYWxTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxPdXRwdXQ+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2wuY29kZSFdIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxURD5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCB8fCBnZXRIZWFkZXJXaWR0aChjb2wpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAgICAgICBnZXREYXRhQWxpZ25DbGFzcyhjb2wpLFxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQUNUSU9OID8gJ2FjdGlvbi1jb2x1bW4nIDogJycsXG4gICAgICAgICAgICAgICAgXVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFDVElPTjsgZWxzZSBub25BY3Rpb25DZWxsXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIkRlbGV0ZShkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0RWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWVkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktcGVuY2lsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbml0RWRpdGFibGVSb3coZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVkaXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcFNhdmVFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVFZGl0YWJsZVJvdyhkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ2FuY2VsRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxFZGl0YWJsZVJvdyhkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Qgb2YgY3VzdG9tQWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNBY3Rpb25WaXNpYmxlKGFjdCwgZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJhY3QuaWNvbiB8fCAncGkgcGktZWxsaXBzaXMtaCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0LnN0eWxlQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQWN0aW9uRGlzYWJsZWQoYWN0LCBkYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DdXN0b21BY3Rpb25DbGljayhhY3QsIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkFjdGlvbkNlbGw+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uQ09NUE9TRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBub25Db21wb3NlZFxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9zZWQtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9zZWROYW1lIG9mIGNvbC5jb21wb3NlZE5hbWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuY29tcG9zZWRUeXBlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jb21wb3NlZFR5cGVzW2ldID09PSBUYWJsZVR5cGVFbnVtLklNQUdFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRhdGFbY29sLmNvZGUhXT8uW2NvbXBvc2VkTmFtZV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImNvbXBvc2VkLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb21wb3NlZC1pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbWFnZVN0eWxlKGNvbC5jb21wb3NlZFN0eWxlcz8uW2NvbXBvc2VkTmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNvbXBvc2VkVHlwZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuY29tcG9zZWRUeXBlc1tpXSA9PT0gVGFibGVUeXBlRW51bS5TVFJJTkdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbXBvc2VkLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGl0bGVTdHlsZShjb2wuY29tcG9zZWRTdHlsZXM/Lltjb21wb3NlZE5hbWVdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbC5jb2RlIV0/Lltjb21wb3NlZE5hbWVdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkNvbXBvc2VkPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5BTU9VTlQ7IGVsc2Ugbm9uQW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2NvbC5jb2RlIV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjdXN0b21DdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0Q3VycmVuY3lTeW1ib2woY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLmRlY2ltYWxQbGFjZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC50aG91c2FuZFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLmRlY2ltYWxTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbkFtb3VudD5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5OVU1CRVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugbm9uTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE51bWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2NvbC5jb2RlIV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnRob3VzYW5kU2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5kZWNpbWFsU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vbk51bWJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFVElNRTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG5vcm1hbFR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdERhdGVXaXRoQ29sdW1uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUFueURhdGUoZGF0YVtjb2wuY29kZSFdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgPT09IFRhYmxlVHlwZUVudW0uREFURVRJTUVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdERhdGVUaW1lV2l0aENvbHVtbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VBbnlEYXRlKGRhdGFbY29sLmNvZGUhXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsVHlwZXM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVR5cGVFbnVtLlNUUklORyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVUeXBlRW51bS5NVUxUSVNFTEVDVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoY29sLnR5cGUhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbC5jb2RlIV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGlsZENvbHVtbnM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBjb2wuY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNoaWxkLndpZHRoIHx8IGdldEhlYWRlcldpZHRoKGNoaWxkKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGF0YUFsaWduQ2xhc3MoY2hpbGQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNFZGl0YWJsZShjaGlsZC5jb2RlKTsgZWxzZSBjaGlsZE5vcm1hbFREXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNoaWxkLmNvZGUgPyBkYXRhW2NoaWxkLmNvZGVdIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgZGF0YS5pZCwgY2hpbGQuY29kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGlsZC5jb2RlID8gZGF0YVtjaGlsZC5jb2RlXSA6IFwiXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGlsZE5vcm1hbFREPlxuICAgICAgICAgICAgICAgICAge3sgY2hpbGQuY29kZSA/IGRhdGFbY2hpbGQuY29kZV0gOiBcIlwiIH19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG48L2Rpdj5cbiJdfQ==
|