@oneteme/jquery-table 0.0.13 → 0.0.14

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.
@@ -80,6 +80,7 @@ export class TableComponent {
80
80
  this._showSlicePanel = false;
81
81
  /** Snapshot stable de l'état collapsed du panneau slice, mis à jour via (collapsedChange) */
82
82
  this._slicePanelCollapsed = false;
83
+ this._initialSlicePanelCollapsedApplied = false;
83
84
  this._sliceByMenuItems = [];
84
85
  this.searchQuery = '';
85
86
  this._matSortActive = '';
@@ -95,10 +96,14 @@ export class TableComponent {
95
96
  this._cdr = inject(ChangeDetectorRef);
96
97
  this._el = inject((ElementRef));
97
98
  this._ngZone = inject(NgZone);
99
+ this._paginatorIntl = inject(MatPaginatorIntl);
98
100
  this._i18nRaw = inject(JQT_I18N, { optional: true });
101
+ this._fullItemsPerPageLabel = this._paginatorIntl.itemsPerPageLabel;
99
102
  this.copyFeedbackMessage = '';
100
103
  /** Labels de l’interface. Fusionnés depuis JQT_I18N_DEFAULTS et le token JQT_I18N injecté. */
101
- this.i18n = { ...JQT_I18N_DEFAULTS, ...(this._i18nRaw ?? {}) };
104
+ this.i18n = this._i18nRaw
105
+ ? { ...JQT_I18N_DEFAULTS, ...this._i18nRaw }
106
+ : { ...JQT_I18N_DEFAULTS };
102
107
  this.isGroupHeader = (_, row) => row[GROUP_HEADER_MARKER] === true;
103
108
  /** Gestionnaire export CSV. */
104
109
  this._export = new ExportManager(() => this._allFilteredRows, () => this.activeFields, () => this.resolvedConfig.export, (col, row, idx) => this.resolveCellValue(col, row, idx));
@@ -136,12 +141,21 @@ export class TableComponent {
136
141
  /** Cache groupBy — invalidé dès que rows/key/tri changent. */
137
142
  this._groupCache = null;
138
143
  this._pendingRender = null;
144
+ this._deferredTimers = new Set();
145
+ this._headerMeasureFrame = null;
146
+ this._destroyed = false;
139
147
  this._staticSliceHiddenKeys = new Set();
140
148
  this._configHiddenKeys = new Set();
141
149
  /** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */
142
150
  this._prevColumnKeys = [];
143
151
  this._organizerConfigCache = null;
144
- this.trackRowFn = (_index, row) => row[GROUP_HEADER_MARKER] ? `__group_${row[ROW_GROUP_KEY]}` : row[ROW_INDEX_KEY] ?? _index;
152
+ this.trackRowFn = (_index, row) => {
153
+ if (row[GROUP_HEADER_MARKER])
154
+ return `__group_${row[ROW_GROUP_KEY]}`;
155
+ if (row[ROW_GROUP_KEY] !== undefined)
156
+ return `__row_${row[ROW_GROUP_KEY]}_${row[ROW_INDEX_KEY] ?? _index}`;
157
+ return row[ROW_INDEX_KEY] ?? _index;
158
+ };
145
159
  this._preferencesMessageTimer = null;
146
160
  }
147
161
  /** Paramètre de contrôle pour réinitialiser barre de recherche. */
@@ -189,6 +203,14 @@ export class TableComponent {
189
203
  }
190
204
  // Seuil au-delà duquel le rendu groupé est bloqué pour protéger le navigateur
191
205
  static { this.MAX_GROUP_COUNT = 500; }
206
+ emitColumnsChangeIfNeeded() {
207
+ const nextKeys = [...this.renderedColumns];
208
+ if (nextKeys.length === this._prevColumnKeys.length
209
+ && nextKeys.every((key, index) => key === this._prevColumnKeys[index]))
210
+ return;
211
+ this._prevColumnKeys = nextKeys;
212
+ this.columnsChange.emit(nextKeys);
213
+ }
192
214
  ngOnChanges(changes) {
193
215
  const dataChanged = !!(changes['config'] || changes['data'] || changes['dataSource']);
194
216
  if (dataChanged) {
@@ -215,8 +237,26 @@ export class TableComponent {
215
237
  this.attachPaginator();
216
238
  this.attachSort();
217
239
  this._measureHeaderHeight();
240
+ this._observeTableShellWidth();
218
241
  this._applyPendingDynamicSliceKeys();
219
242
  }
243
+ _observeTableShellWidth() {
244
+ const tableShell = this.tableShellRef?.nativeElement;
245
+ if (!tableShell || typeof ResizeObserver === 'undefined')
246
+ return;
247
+ this._tableShellResizeObserver = new ResizeObserver(([entry]) => {
248
+ const compact = entry.contentRect.width < 660;
249
+ const label = compact ? 'Par page :' : this._fullItemsPerPageLabel;
250
+ if (this._paginatorIntl.itemsPerPageLabel === label)
251
+ return;
252
+ this._ngZone.run(() => {
253
+ this._paginatorIntl.itemsPerPageLabel = label;
254
+ this._paginatorIntl.changes.next();
255
+ this._cdr.markForCheck();
256
+ });
257
+ });
258
+ this._tableShellResizeObserver.observe(tableShell);
259
+ }
220
260
  _applyPendingDynamicSliceKeys() {
221
261
  const hasPendingDynamic = !!this._pendingDynamicSliceKeys;
222
262
  const hasPendingFilters = !!this._pendingSliceFilters;
@@ -227,7 +267,7 @@ export class TableComponent {
227
267
  const filters = this._pendingSliceFilters ? { ...this._pendingSliceFilters } : null;
228
268
  this._pendingDynamicSliceKeys = null;
229
269
  this._pendingSliceFilters = null;
230
- setTimeout(() => {
270
+ this._scheduleDeferred(() => {
231
271
  if (this._resolvedData.length === 0) {
232
272
  console.log('[SliceRestore] ngAfterViewInit: données absentes, restauration différée à _recomputeShowSlicePanel', { keys, filters });
233
273
  if (filters)
@@ -250,6 +290,8 @@ export class TableComponent {
250
290
  });
251
291
  }
252
292
  ngOnDestroy() {
293
+ this._destroyed = true;
294
+ this._tableShellResizeObserver?.disconnect();
253
295
  if (this._copyFeedbackTimer !== undefined)
254
296
  window.clearTimeout(this._copyFeedbackTimer);
255
297
  if (this._pendingRender !== null) {
@@ -258,6 +300,10 @@ export class TableComponent {
258
300
  if (this._preferencesMessageTimer !== null) {
259
301
  clearTimeout(this._preferencesMessageTimer);
260
302
  }
303
+ this._deferredTimers.forEach(timer => clearTimeout(timer));
304
+ this._deferredTimers.clear();
305
+ if (this._headerMeasureFrame !== null)
306
+ cancelAnimationFrame(this._headerMeasureFrame);
261
307
  // Nettoie un éventuel resize en cours (listeners window non retirés)
262
308
  this._resizeState = null;
263
309
  this._destroy$.next();
@@ -266,6 +312,8 @@ export class TableComponent {
266
312
  }
267
313
  _measureHeaderHeight() {
268
314
  const measure = () => {
315
+ if (this._destroyed)
316
+ return;
269
317
  const headerRow = this._el.nativeElement.querySelector('tr.mat-mdc-header-row');
270
318
  if (headerRow) {
271
319
  const h = headerRow.getBoundingClientRect().height;
@@ -275,15 +323,32 @@ export class TableComponent {
275
323
  }
276
324
  }
277
325
  // Header pas encore rendu (ex: lazy Angular Material), on réessaie après le prochain frame
278
- this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));
326
+ this._scheduleHeaderMeasure(measure);
279
327
  };
280
- this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));
328
+ this._scheduleHeaderMeasure(measure);
329
+ }
330
+ _scheduleHeaderMeasure(measure) {
331
+ this._ngZone.runOutsideAngular(() => {
332
+ this._headerMeasureFrame = requestAnimationFrame(() => {
333
+ this._headerMeasureFrame = null;
334
+ measure();
335
+ });
336
+ });
337
+ }
338
+ _scheduleDeferred(callback) {
339
+ const timer = setTimeout(() => {
340
+ this._deferredTimers.delete(timer);
341
+ if (!this._destroyed)
342
+ callback();
343
+ }, 0);
344
+ this._deferredTimers.add(timer);
281
345
  }
282
346
  _invalidateOrganizerConfig() { this._organizerConfigCache = null; }
283
347
  get organizerConfig() {
284
348
  if (this._organizerConfigCache)
285
349
  return this._organizerConfigCache;
286
350
  const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];
351
+ const organizerOptions = this.resolvedConfig.organizer;
287
352
  this._organizerConfigCache = {
288
353
  fields: this._organizer.showFields ? allCols.map(c => ({
289
354
  id: c.key,
@@ -301,6 +366,9 @@ export class TableComponent {
301
366
  label: item.title,
302
367
  icon: item.icon,
303
368
  })) : undefined,
369
+ buttonLabel: organizerOptions?.buttonLabel,
370
+ buttonIcon: organizerOptions?.buttonIcon,
371
+ showButtonIcon: organizerOptions?.showButtonIcon,
304
372
  showExport: this.showExportButton,
305
373
  onExport: () => this.onExport(),
306
374
  showPreferences: this.showPreferencesMenu,
@@ -315,6 +383,9 @@ export class TableComponent {
315
383
  };
316
384
  return this._organizerConfigCache;
317
385
  }
386
+ get organizerHideMenuValues() {
387
+ return this.resolvedConfig.organizer?.hideMenuValues === true;
388
+ }
318
389
  get organizerState() {
319
390
  return {
320
391
  visibleFields: this.visibleColumns.map(c => c.key),
@@ -435,14 +506,20 @@ export class TableComponent {
435
506
  this.paginator?.firstPage();
436
507
  this.searchChange.emit(this.searchQuery);
437
508
  }
438
- onGroupByChange(key) {
509
+ setGroupByAndEmit(key) {
510
+ const previousKey = this._organizer.groupBy.activeKey ?? null;
439
511
  this._organizer.setGroupBy(key);
512
+ const nextKey = this._organizer.groupBy.activeKey ?? null;
513
+ if (previousKey !== nextKey)
514
+ this.groupByChange.emit(nextKey);
515
+ }
516
+ onGroupByChange(key) {
517
+ this.setGroupByAndEmit(key);
440
518
  this._groupBy.setDefaultCollapsed(key !== null);
441
519
  this._groupBy.reset();
442
520
  this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();
443
521
  this.refreshViewModel();
444
522
  this.paginator?.firstPage();
445
- this.groupByChange.emit(key);
446
523
  if (key) {
447
524
  const colDef = (this.resolvedConfig.columns || []).find(c => c.key === key);
448
525
  if (colDef?.lazy && this._lazyColumnStatus.get(key) !== 'loaded') {
@@ -450,9 +527,9 @@ export class TableComponent {
450
527
  }
451
528
  }
452
529
  else {
453
- this._ngZone.runOutsideAngular(() => setTimeout(() => {
530
+ this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => {
454
531
  this.tableBodyScrollRef?.nativeElement.scrollTo({ top: 0, behavior: 'smooth' });
455
- }, 0));
532
+ }));
456
533
  }
457
534
  }
458
535
  onGroupPageSizeChange(size) {
@@ -460,7 +537,7 @@ export class TableComponent {
460
537
  }
461
538
  onGroupSortToggle(dir) {
462
539
  this._groupBy.onGroupSortToggle(dir, (key) => {
463
- this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));
540
+ this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => this.scrollToGroupHeader(key)));
464
541
  });
465
542
  }
466
543
  getLazyColumnStatus(key) {
@@ -483,7 +560,7 @@ export class TableComponent {
483
560
  }
484
561
  toggleGroupCollapse(groupKey) {
485
562
  this._groupBy.toggleGroupCollapse(groupKey, (key) => {
486
- this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));
563
+ this._ngZone.runOutsideAngular(() => this._scheduleDeferred(() => this.scrollToGroupHeader(key)));
487
564
  });
488
565
  }
489
566
  scrollToGroupHeader(groupKey) {
@@ -493,7 +570,7 @@ export class TableComponent {
493
570
  const row = container.querySelector(`tr[data-group-key="${CSS.escape(groupKey)}"]`);
494
571
  if (!row)
495
572
  return;
496
- const headerHeight = parseFloat(this._el.nativeElement.style.getPropertyValue('--actual-header-height') || '56') || 56;
573
+ const headerHeight = Number.parseFloat(this._el.nativeElement.style.getPropertyValue('--actual-header-height') || '56') || 56;
497
574
  const containerRect = container.getBoundingClientRect();
498
575
  const rowRect = row.getBoundingClientRect();
499
576
  const currentScrollTop = container.scrollTop;
@@ -551,7 +628,7 @@ export class TableComponent {
551
628
  this._pendingDynamicSliceKeys = null;
552
629
  const allCols = this.resolvedConfig.columns ?? [];
553
630
  console.log('[SliceRestore] _recomputeShowSlicePanel: données arrivées', { dynamicKeys, filters });
554
- setTimeout(() => {
631
+ this._scheduleDeferred(() => {
555
632
  if (dynamicKeys) {
556
633
  dynamicKeys.forEach(key => {
557
634
  const col = allCols.find(c => c.key === key);
@@ -710,6 +787,9 @@ export class TableComponent {
710
787
  get hasRowClickHandler() {
711
788
  return this.rowSelected.observed || !!this.resolvedConfig.onRowSelected;
712
789
  }
790
+ rowActionLabel(row) {
791
+ return `Sélectionner la ligne ${(row?.[ROW_INDEX_KEY] ?? 0) + 1}`;
792
+ }
713
793
  /** Largeur minimale du tableau en px, calculée depuis les largeurs explicites des colonnes actives.
714
794
  * Retourne null si aucune colonne n'a de largeur définie (le tableau remplit alors 100% du conteneur).
715
795
  * Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */
@@ -729,9 +809,6 @@ export class TableComponent {
729
809
  if (isPx && !Number.isNaN(px)) {
730
810
  sum += px;
731
811
  }
732
- else {
733
- sum += 150;
734
- }
735
812
  }
736
813
  else {
737
814
  sum += 120; // largeur minimale estimée pour une colonne sans largeur explicite
@@ -766,6 +843,20 @@ export class TableComponent {
766
843
  event.dataTransfer.setData('text/plain', columnKey);
767
844
  }
768
845
  }
846
+ onHeaderKeyDown(columnKey, event) {
847
+ if ((!this.isColumnDragDropEnabled && !this._editMode)
848
+ || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight'))
849
+ return;
850
+ const currentIndex = this.activeFields.findIndex(column => column.key === columnKey);
851
+ const targetIndex = event.key === 'ArrowLeft' ? currentIndex - 1 : currentIndex + 1;
852
+ if (currentIndex < 0 || targetIndex < 0 || targetIndex >= this.activeFields.length)
853
+ return;
854
+ event.preventDefault();
855
+ const reordered = [...this.activeFields];
856
+ [reordered[currentIndex], reordered[targetIndex]] = [reordered[targetIndex], reordered[currentIndex]];
857
+ this._organizer.setActiveFields(reordered);
858
+ this.refreshViewModel();
859
+ }
769
860
  onHeaderDragOver(columnKey, event) {
770
861
  if ((!this.isColumnDragDropEnabled && !this._editMode) || !this.draggedColumnKey) {
771
862
  return;
@@ -816,7 +907,6 @@ export class TableComponent {
816
907
  if (scrollEl) {
817
908
  const allTh = scrollEl.querySelectorAll('th.mat-mdc-header-cell');
818
909
  allTh.forEach(thEl => {
819
- const key = thEl.getAttribute('mat-column-header') || thEl.getAttribute('mat-sort-header') || '';
820
910
  const colClass = Array.from(thEl.classList).find(c => c.startsWith('mat-column-'));
821
911
  const colKey = colClass ? colClass.replace('mat-column-', '') : null;
822
912
  if (colKey && this._columnWidths[colKey] == null) {
@@ -939,7 +1029,7 @@ export class TableComponent {
939
1029
  this._columnWidths = { ...saved.columnWidths };
940
1030
  // Group by
941
1031
  if (saved.groupBy !== undefined) {
942
- this._organizer.setGroupBy(saved.groupBy);
1032
+ this.setGroupByAndEmit(saved.groupBy);
943
1033
  if (saved.groupBy) {
944
1034
  this._groupBy.setDefaultCollapsed(true);
945
1035
  this._groupBy.reset();
@@ -1068,7 +1158,7 @@ export class TableComponent {
1068
1158
  }
1069
1159
  if (state.groupBy === null || typeof state.groupBy === 'string') {
1070
1160
  const groupKey = state.groupBy && available.has(state.groupBy) ? state.groupBy : null;
1071
- this._organizer.setGroupBy(groupKey);
1161
+ this.setGroupByAndEmit(groupKey);
1072
1162
  restored.push('groupBy');
1073
1163
  }
1074
1164
  if (state.columnWidths) {
@@ -1089,6 +1179,10 @@ export class TableComponent {
1089
1179
  this._resolvedData = this.resolveData();
1090
1180
  this.resolvedConfig = this.buildEffectiveConfig();
1091
1181
  this._columnMap = new Map((this.resolvedConfig.columns || []).map(c => [c.key, c]));
1182
+ if (!this._initialSlicePanelCollapsedApplied) {
1183
+ this._slicePanelCollapsed = this.resolvedConfig.slicePanelCollapsed === true;
1184
+ this._initialSlicePanelCollapsedApplied = true;
1185
+ }
1092
1186
  // ── Initialiser le gestionnaire de préférences si l'option est activée
1093
1187
  const prefsId = this.resolvedConfig.preferences?.enabled
1094
1188
  ? this.resolvedConfig.preferences.tableId
@@ -1117,10 +1211,12 @@ export class TableComponent {
1117
1211
  this._groupBy.setDefaultCollapsed(true);
1118
1212
  this._groupBy.reset();
1119
1213
  this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();
1214
+ this.groupByChange.emit(this._organizer.groupBy.activeKey);
1120
1215
  }
1121
1216
  // Synchronise la propriété stable (évite NG0100 — la facade est source de vérité)
1122
1217
  this.activeFields = this._organizer.fields.activeFields;
1123
1218
  this.renderedColumns = this.activeFields.map(c => c.key);
1219
+ this.emitColumnsChangeIfNeeded();
1124
1220
  this.pageSize = this.paginator?.pageSize || this.resolvePageSize();
1125
1221
  this.pageSizeOptions = this.resolvePageSizeOptions();
1126
1222
  this.pageSizeOptionsGroupBy = this.resolvePageSizeOptionsGroupBy();
@@ -1410,26 +1506,7 @@ export class TableComponent {
1410
1506
  const groupValueCache = new Map();
1411
1507
  rows.forEach(row => groupValueCache.set(row, String(this.getLazyAwareValue(groupKey, row) ?? '')));
1412
1508
  // Pré-calcul des valeurs de tri (évite O(n log n) × getLazyAwareValue dans le comparateur)
1413
- let fastCompareFn = null;
1414
- if (effectiveSort.active && effectiveSort.direction) {
1415
- const sortValueCache = new Map();
1416
- rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(effectiveSort.active, row)));
1417
- const dir = effectiveSort.direction;
1418
- fastCompareFn = (a, b) => {
1419
- const va = sortValueCache.get(a);
1420
- const vb = sortValueCache.get(b);
1421
- let cmp = 0;
1422
- if (typeof va === 'number' && typeof vb === 'number') {
1423
- cmp = va < vb ? -1 : va > vb ? 1 : 0;
1424
- }
1425
- else {
1426
- const sa = va == null ? '' : String(va).toLowerCase();
1427
- const sb = vb == null ? '' : String(vb).toLowerCase();
1428
- cmp = sa < sb ? -1 : sa > sb ? 1 : 0;
1429
- }
1430
- return dir === 'asc' ? cmp : -cmp;
1431
- };
1432
- }
1509
+ const fastCompareFn = this._buildCachedSortComparator(rows, effectiveSort);
1433
1510
  const sorted = [...rows].sort((a, b) => {
1434
1511
  const va = groupValueCache.get(a);
1435
1512
  const vb = groupValueCache.get(b);
@@ -1471,6 +1548,8 @@ export class TableComponent {
1471
1548
  }
1472
1549
  const pageSize = this.groupPageSize;
1473
1550
  const result = [];
1551
+ const rowIndexes = new Map();
1552
+ rows.forEach((row, index) => rowIndexes.set(row, index));
1474
1553
  groupOrder.forEach((groupValue) => {
1475
1554
  const groupRows = groupMap.get(groupValue);
1476
1555
  const totalCount = groupRows.length;
@@ -1481,9 +1560,9 @@ export class TableComponent {
1481
1560
  if (!collapsed) {
1482
1561
  const start = pageSize === 0 ? 0 : currentPage * pageSize;
1483
1562
  const end = pageSize === 0 ? totalCount : Math.min(start + pageSize, totalCount);
1484
- groupRows.slice(start, end).forEach((row, i) => {
1485
- const idx = start + i;
1486
- const projected = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };
1563
+ groupRows.slice(start, end).forEach((row) => {
1564
+ const idx = rowIndexes.get(row) ?? 0;
1565
+ const projected = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx, [ROW_GROUP_KEY]: groupValue };
1487
1566
  this.activeFields.forEach((col) => {
1488
1567
  projected[col.key] = this.resolveCellValue(col, row, idx);
1489
1568
  });
@@ -1500,21 +1579,43 @@ export class TableComponent {
1500
1579
  const { active, direction } = sort;
1501
1580
  if (!active || !direction)
1502
1581
  return null;
1582
+ const sortDirection = direction;
1503
1583
  return (a, b) => {
1504
- const va = this.getLazyAwareValue(active, a);
1505
- const vb = this.getLazyAwareValue(active, b);
1506
- let cmp = 0;
1507
- if (typeof va === 'number' && typeof vb === 'number') {
1508
- cmp = va < vb ? -1 : va > vb ? 1 : 0;
1509
- }
1510
- else {
1511
- const sa = va == null ? '' : String(va).toLowerCase();
1512
- const sb = vb == null ? '' : String(vb).toLowerCase();
1513
- cmp = sa < sb ? -1 : sa > sb ? 1 : 0;
1514
- }
1515
- return direction === 'asc' ? cmp : -cmp;
1584
+ const comparison = this._compareSortValues(this.getLazyAwareValue(active, a), this.getLazyAwareValue(active, b));
1585
+ return this._applySortDirection(comparison, sortDirection);
1516
1586
  };
1517
1587
  }
1588
+ _buildCachedSortComparator(rows, sort) {
1589
+ if (!sort.active || !sort.direction)
1590
+ return null;
1591
+ const sortKey = sort.active;
1592
+ const sortDirection = sort.direction;
1593
+ const sortValueCache = new Map();
1594
+ rows.forEach(row => sortValueCache.set(row, this.getLazyAwareValue(sortKey, row)));
1595
+ return (left, right) => this._applySortDirection(this._compareSortValues(sortValueCache.get(left), sortValueCache.get(right)), sortDirection);
1596
+ }
1597
+ _compareSortValues(left, right) {
1598
+ if (typeof left === 'number' && typeof right === 'number') {
1599
+ if (left < right)
1600
+ return -1;
1601
+ if (left > right)
1602
+ return 1;
1603
+ return 0;
1604
+ }
1605
+ const leftText = this._normalizeSortValue(left);
1606
+ const rightText = this._normalizeSortValue(right);
1607
+ if (leftText < rightText)
1608
+ return -1;
1609
+ if (leftText > rightText)
1610
+ return 1;
1611
+ return 0;
1612
+ }
1613
+ _normalizeSortValue(value) {
1614
+ return value == null ? '' : String(value).toLowerCase();
1615
+ }
1616
+ _applySortDirection(comparison, direction) {
1617
+ return direction === 'asc' ? comparison : -comparison;
1618
+ }
1518
1619
  /**
1519
1620
  * Retourne la valeur telle qu'elle est affichée dans la cellule, en suivant exactement
1520
1621
  * le même chemin que resolveCellValue — utilisée pour la recherche plein-texte.
@@ -1638,11 +1739,11 @@ export class TableComponent {
1638
1739
  }
1639
1740
  }
1640
1741
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1641
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "jquery-table", inputs: { config: "config", dataSource: "dataSource", data: "data", displayedColumns: "displayedColumns", columnsConfig: "columnsConfig", view: "view", columnLabels: "columnLabels", isLoading: "isLoading", copyFeedback: "copyFeedback", clearSearchInput: "clearSearchInput" }, outputs: { addRequested: "addRequested", columnAdded: "columnAdded", columnRemoved: "columnRemoved", categorySelected: "categorySelected", rowSelected: "rowSelected", sortChange: "sortChange", pageChange: "pageChange", searchChange: "searchChange", groupByChange: "groupByChange", columnsChange: "columnsChange", visualCopied: "visualCopied" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()" }, properties: { "class.visual-fullscreen": "this._isFullscreen" } }, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], queries: [{ propertyName: "_cellDefs", predicate: JqtCellDefDirective }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableBodyScrollRef", first: true, predicate: ["tableBodyScroll"], descendants: true }, { propertyName: "slicePanelRef", first: true, predicate: SlicePanelComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"jquery-table-wrapper\">\n <div class=\"visual-copy-feedback\" *ngIf=\"copyFeedbackMessage\" role=\"status\">{{ copyFeedbackMessage }}</div>\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151}:host.visual-fullscreen{display:block;width:100vw;height:100vh;background:#fff}.jquery-table-wrapper{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.visual-copy-feedback{position:absolute;top:8px;left:50%;z-index:20;transform:translate(-50%);padding:7px 12px;border:1px solid #c7dfd1;border-radius:5px;background:#f4fbf7f5;color:#24613b;font-size:12px;pointer-events:none}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(155px,190px) minmax(0,1fr);gap:12px;align-items:stretch;min-height:inherit;height:100%}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.table-action-btn{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:inherit;cursor:pointer}.table-action-btn:hover{background:#00000014}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-count-loader{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:20px;height:20px}.spinner{width:14px;height:14px;border:2px solid #d1d5db;border-top-color:#374151;border-radius:50%;animation:spin .8s linear infinite}.search-count-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}@keyframes spin{to{transform:rotate(360deg)}}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:34px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border-radius:4px;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;position:relative;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;min-height:0;height:var(--actual-header-height, 56px);padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .bottom-bar.is-loading .mat-mdc-paginator-range-label{visibility:hidden}.paginator-range-loader{position:absolute;right:0;top:50%;transform:translateY(-50%);margin-right:145px;display:flex;align-items:center;justify-content:center;width:auto;padding:0 16px;height:24px}.paginator-range-loader--no-first-last{margin-right:80px}.paginator-range-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;min-height:var(--actual-header-height, 56px);height:auto;padding:8px 12px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;flex:1 1 280px;min-width:0;flex-wrap:wrap;gap:8px}.group-sort-controls{display:flex;align-items:center;min-width:0;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;flex:0 1 auto;min-width:0;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i4.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i8.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: SlicePanelComponent, selector: "slice-panel", inputs: ["sliceConfigs", "columns", "data", "lazyData", "lazyStatus", "showToggle", "showCounts", "collapsedByDefault", "alwaysShow"], outputs: ["filterChange", "activeKeysChange", "dynamicSliceKeysChange", "collapsedChange"] }, { kind: "component", type: OrganizerButtonWrapperComponent, selector: "table-organizer-button", inputs: ["config", "state", "hideMenuValues"], outputs: ["viewChange", "sliceStateChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1742
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableComponent, isStandalone: true, selector: "jquery-table", inputs: { config: "config", dataSource: "dataSource", data: "data", displayedColumns: "displayedColumns", columnsConfig: "columnsConfig", view: "view", columnLabels: "columnLabels", isLoading: "isLoading", copyFeedback: "copyFeedback", clearSearchInput: "clearSearchInput" }, outputs: { addRequested: "addRequested", columnAdded: "columnAdded", columnRemoved: "columnRemoved", categorySelected: "categorySelected", rowSelected: "rowSelected", sortChange: "sortChange", pageChange: "pageChange", searchChange: "searchChange", groupByChange: "groupByChange", columnsChange: "columnsChange", visualCopied: "visualCopied" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()" }, properties: { "class.visual-fullscreen": "this._isFullscreen" } }, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], queries: [{ propertyName: "_cellDefs", predicate: JqtCellDefDirective }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableBodyScrollRef", first: true, predicate: ["tableBodyScroll"], descendants: true }, { propertyName: "tableShellRef", first: true, predicate: ["tableShell"], descendants: true }, { propertyName: "slicePanelRef", first: true, predicate: SlicePanelComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"jquery-table-wrapper\">\n <output class=\"visual-copy-feedback\" *ngIf=\"copyFeedbackMessage\" aria-live=\"polite\">{{ copyFeedbackMessage }}</output>\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\" #tableShell>\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n [attr.aria-label]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n [hideMenuValues]=\"organizerHideMenuValues\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <button\n type=\"button\"\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n tabindex=\"0\"\n [attr.aria-label]=\"'R\u00E9ordonner la colonne ' + column.header\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (keydown)=\"onHeaderKeyDown(column.key, $event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [attr.aria-label]=\"hasRowClickHandler && !_editMode ? rowActionLabel(row) : null\"\n [attr.aria-keyshortcuts]=\"hasRowClickHandler && !_editMode ? 'Enter Space' : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null); $event.preventDefault()\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n [attr.tabindex]=\"isNormalGroupRow(row) ? 0 : null\"\n [attr.aria-expanded]=\"isNormalGroupRow(row) ? !isGroupCollapsed(row[_ROW_GROUP_KEY]) : null\"\n (click)=\"onGroupHeaderClick(row)\"\n (keydown.enter)=\"onGroupHeaderClick(row)\"\n (keydown.space)=\"onGroupHeaderClick(row); $event.preventDefault()\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-header-height: 56px;--jqt-header-cell-padding-y: 0px;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151;--jqt-footer-height: var(--jqt-header-height);--jqt-toolbar-control-height: 34px;--jqt-slice-panel-min-width: 155px;--jqt-slice-panel-max-width: 190px;--jqt-slice-header-height: 34px;--jqt-slice-header-margin-bottom: 8px;--jqt-slice-body-padding: 4px 10px 10px;--jqt-slice-section-title-font-size: 14px;--jqt-slice-item-font-size: 13px;--jqt-slice-item-min-height: 30px;--jqt-slice-item-padding: 5px 10px 5px 16px}:host.visual-fullscreen{display:block;width:100vw;height:100vh;background:#fff}.jquery-table-wrapper{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.visual-copy-feedback{display:block;position:absolute;top:8px;left:50%;z-index:20;transform:translate(-50%);padding:7px 12px;border:1px solid #c7dfd1;border-radius:5px;background:#f4fbf7f5;color:#24613b;font-size:12px;pointer-events:none}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(var(--jqt-slice-panel-min-width),var(--jqt-slice-panel-max-width)) minmax(0,1fr);gap:12px;align-items:stretch;flex:1 1 0;min-height:0;height:auto}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.table-action-btn{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:inherit;cursor:pointer}.table-action-btn:hover{background:#00000014}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:var(--jqt-toolbar-control-height);border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-count-loader{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:20px;height:20px}.spinner{width:14px;height:14px;border:2px solid #d1d5db;border-top-color:#374151;border-radius:50%;animation:spin .8s linear infinite}.search-count-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}@keyframes spin{to{transform:rotate(360deg)}}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:var(--jqt-toolbar-control-height);height:var(--jqt-toolbar-control-height);border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg);height:var(--jqt-header-height);min-height:var(--jqt-header-height)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color);height:var(--jqt-header-height);min-height:var(--jqt-header-height);padding-top:var(--jqt-header-cell-padding-y);padding-bottom:var(--jqt-header-cell-padding-y)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row:not(.no-pointer):focus-visible{outline:2px solid var(--jqt-primary-color);outline-offset:-2px}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border:0;background:transparent;border-radius:4px;font:inherit;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;min-height:var(--jqt-footer-height, var(--actual-header-height, 56px));position:relative;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;min-width:0;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex;width:100%}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;justify-content:flex-end;width:100%;min-height:0;height:var(--jqt-footer-height, var(--actual-header-height, 56px));padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{flex-shrink:0;font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size,:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-actions{display:flex;flex-shrink:0;align-items:center;white-space:nowrap}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label{margin:0 12px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .bottom-bar.is-loading .mat-mdc-paginator-range-label{visibility:hidden}.paginator-range-loader{position:absolute;right:0;top:50%;transform:translateY(-50%);margin-right:145px;display:flex;align-items:center;justify-content:center;width:auto;padding:0 16px;height:24px}.paginator-range-loader--no-first-last{margin-right:80px}.paginator-range-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;min-height:var(--actual-header-height, 56px);height:auto;padding:8px 12px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;flex:1 1 280px;min-width:0;flex-wrap:wrap;gap:8px}.group-sort-controls{display:flex;align-items:center;min-width:0;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;flex:0 1 auto;min-width:0;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i3.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i4.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i8.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: SlicePanelComponent, selector: "slice-panel", inputs: ["sliceConfigs", "columns", "data", "lazyData", "lazyStatus", "showToggle", "showCounts", "collapsedByDefault", "alwaysShow"], outputs: ["filterChange", "activeKeysChange", "dynamicSliceKeysChange", "collapsedChange"] }, { kind: "component", type: OrganizerButtonWrapperComponent, selector: "table-organizer-button", inputs: ["config", "state", "hideMenuValues"], outputs: ["viewChange", "sliceStateChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1642
1743
  }
1643
1744
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
1644
1745
  type: Component,
1645
- args: [{ standalone: true, selector: 'jquery-table', imports: [CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent, OrganizerButtonWrapperComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], template: "<section class=\"jquery-table-wrapper\">\n <div class=\"visual-copy-feedback\" *ngIf=\"copyFeedbackMessage\" role=\"status\">{{ copyFeedbackMessage }}</div>\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\">\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <span\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </span>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null)\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n (click)=\"onGroupHeaderClick(row)\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151}:host.visual-fullscreen{display:block;width:100vw;height:100vh;background:#fff}.jquery-table-wrapper{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.visual-copy-feedback{position:absolute;top:8px;left:50%;z-index:20;transform:translate(-50%);padding:7px 12px;border:1px solid #c7dfd1;border-radius:5px;background:#f4fbf7f5;color:#24613b;font-size:12px;pointer-events:none}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(155px,190px) minmax(0,1fr);gap:12px;align-items:stretch;min-height:inherit;height:100%}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.table-action-btn{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:inherit;cursor:pointer}.table-action-btn:hover{background:#00000014}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-count-loader{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:20px;height:20px}.spinner{width:14px;height:14px;border:2px solid #d1d5db;border-top-color:#374151;border-radius:50%;animation:spin .8s linear infinite}.search-count-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}@keyframes spin{to{transform:rotate(360deg)}}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:34px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border-radius:4px;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;position:relative;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;min-height:0;height:var(--actual-header-height, 56px);padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .bottom-bar.is-loading .mat-mdc-paginator-range-label{visibility:hidden}.paginator-range-loader{position:absolute;right:0;top:50%;transform:translateY(-50%);margin-right:145px;display:flex;align-items:center;justify-content:center;width:auto;padding:0 16px;height:24px}.paginator-range-loader--no-first-last{margin-right:80px}.paginator-range-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;min-height:var(--actual-header-height, 56px);height:auto;padding:8px 12px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;flex:1 1 280px;min-width:0;flex-wrap:wrap;gap:8px}.group-sort-controls{display:flex;align-items:center;min-width:0;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;flex:0 1 auto;min-width:0;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
1746
+ args: [{ standalone: true, selector: 'jquery-table', imports: [CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent, OrganizerButtonWrapperComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], template: "<section class=\"jquery-table-wrapper\">\n <output class=\"visual-copy-feedback\" *ngIf=\"copyFeedbackMessage\" aria-live=\"polite\">{{ copyFeedbackMessage }}</output>\n <header class=\"table-header\" *ngIf=\"showTitle\">\n <h3>{{ title }}</h3>\n </header>\n\n <div\n class=\"table-layout\"\n [class.no-slice]=\"!_showSlicePanel || _slicePanelCollapsed\"\n >\n <slice-panel\n [style.display]=\"!_showSlicePanel || _slicePanelCollapsed ? 'none' : null\"\n [sliceConfigs]=\"_sliceConfigs\"\n [columns]=\"_sliceColumns\"\n [data]=\"_sliceData\"\n [lazyData]=\"_lazyColumnData\"\n [lazyStatus]=\"_lazyColumnStatus\"\n [showToggle]=\"_sliceShowToggle\"\n [collapsedByDefault]=\"_slicePanelCollapsed\"\n (filterChange)=\"onSliceFilterChange($event)\"\n (dynamicSliceKeysChange)=\"onDynamicSliceKeysChange($event)\"\n (collapsedChange)=\"onSlicePanelCollapsedChange($event)\"\n ></slice-panel>\n\n <div class=\"table-shell\" #tableShell>\n <div class=\"table-toolbar\" *ngIf=\"showToolbar\">\n <div class=\"table-toolbar-left\">\n <button\n *ngIf=\"showSliceExpandBtn\"\n type=\"button\"\n class=\"slice-expand-btn\"\n [title]=\"i18n.expandFilterTitle\"\n (click)=\"expandSlicePanel()\"\n ><mat-icon class=\"slice-expand-mat-icon\">filter_list</mat-icon></button>\n <div *ngIf=\"showSearchBar\" class=\"search-input-wrapper\">\n <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M13 13L17 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <input\n class=\"search-input\"\n type=\"text\"\n [(ngModel)]=\"searchQuery\"\n (ngModelChange)=\"onSearchChange()\"\n [placeholder]=\"i18n.searchPlaceholder\"\n [attr.aria-label]=\"i18n.searchPlaceholder\"\n autocomplete=\"off\"\n />\n <button *ngIf=\"searchQuery\" type=\"button\" class=\"search-clear-btn\" (click)=\"searchQuery = ''; onSearchChange()\">\u00D7</button>\n <span class=\"search-count\" *ngIf=\"!effectiveIsLoading\">{{ filteredRowCount }}</span>\n <div class=\"search-count-loader\" *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"showOrganizerButton\" class=\"table-toolbar-right\">\n <table-organizer-button\n [config]=\"organizerConfig\"\n [state]=\"organizerState\"\n [hideMenuValues]=\"organizerHideMenuValues\"\n (viewChange)=\"onOrganizerViewChange($event)\">\n </table-organizer-button>\n </div>\n </div>\n\n <div class=\"table-body-wrapper\">\n\n <!-- Banni\u00E8re message pr\u00E9f\u00E9rences -->\n <div *ngIf=\"_preferencesMessage\" class=\"preferences-message\">\n <mat-icon class=\"preferences-message-icon\">check_circle</mat-icon>\n <span>{{ _preferencesMessage }}</span>\n </div>\n\n <!-- Bouton de confirmation du mode \u00E9dition -->\n <button\n *ngIf=\"_editMode\"\n type=\"button\"\n class=\"edit-confirm-btn\"\n [title]=\"i18n.preferencesConfirmEdit\"\n (click)=\"confirmEditMode()\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n <div class=\"table-body-scroll\" #tableBodyScroll>\n <table mat-table matSort [dataSource]=\"tableDataSource\" class=\"jquery-table\"\n [style.min-width]=\"tableMinWidth\"\n [trackBy]=\"trackRowFn\"\n [matSortActive]=\"_matSortActive\" [matSortDirection]=\"_matSortDirection\">\n <ng-container *ngFor=\"let column of visibleColumns\" [matColumnDef]=\"column.key\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [mat-sort-header]=\"(!_editMode && column.sortable !== false) ? column.key : ''\"\n [disabled]=\"_editMode || column.sortable === false\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.drag-enabled]=\"isColumnDragDropEnabled || _editMode\"\n [class.drop-target]=\"isHeaderDropTarget(column.key)\"\n [class.edit-mode-header]=\"_editMode\"\n (dragover)=\"onHeaderDragOver(column.key, $event)\"\n (drop)=\"onHeaderDrop(column.key, $event)\"\n >\n <div class=\"head-cell\">\n <mat-icon *ngIf=\"column.icon\" class=\"head-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n <span class=\"head-text\" [title]=\"column.header\">{{ column.header }}</span>\n <button\n type=\"button\"\n *ngIf=\"isColumnDragDropEnabled || _editMode\"\n class=\"drag-handle\"\n draggable=\"true\"\n tabindex=\"0\"\n [attr.aria-label]=\"'R\u00E9ordonner la colonne ' + column.header\"\n (dragstart)=\"onHeaderDragStart(column.key, $event)\"\n (dragend)=\"onHeaderDragEnd()\"\n (keydown)=\"onHeaderKeyDown(column.key, $event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <!-- Poign\u00E9e de resize (visible uniquement en mode \u00E9dition) -->\n <span\n *ngIf=\"_editMode\"\n class=\"col-resize-handle\"\n draggable=\"false\"\n (mousedown)=\"onResizeStart(column.key, $event)\"\n ></span>\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [style.width]=\"getColumnWidth(column.key)\"\n [class.edit-mode-cell]=\"_editMode\">\n <ng-container *ngIf=\"!_editMode; else editModeCellTpl\">\n <ng-container *ngIf=\"getCellTemplate(column.key) as customTpl; else defaultCellTpl\">\n <ng-container *ngTemplateOutlet=\"customTpl; context: { $implicit: row[_ROW_RAW_KEY], index: row[_ROW_INDEX_KEY] }\"></ng-container>\n </ng-container>\n <ng-template #defaultCellTpl>\n <ng-container [ngSwitch]=\"column.lazy ? getLazyRenderType(row[column.key]) : 'value'\">\n <span *ngSwitchCase=\"'loading'\" class=\"lazy-skeleton\"></span>\n <button *ngSwitchCase=\"'error'\" type=\"button\" class=\"lazy-error-btn\" (click)=\"retryLazyColumn(column)\" [title]=\"i18n.lazyErrorTitle\">\n <span class=\"lazy-error-icon\">\u26A0</span>\n <span class=\"lazy-error-label\">{{ i18n.lazyRetry }}</span>\n </button>\n <span *ngSwitchDefault class=\"cell-text\" [class.cell-empty]=\"isCellEmpty(row[column.key])\" [title]=\"asTitle(row[column.key])\">{{ isCellEmpty(row[column.key]) ? i18n.cellEmpty : row[column.key] }}</span>\n </ng-container>\n </ng-template>\n </ng-container>\n <ng-template #editModeCellTpl>\n <span class=\"cell-text cell-edit-mode\" [title]=\"asTitle(row[column.key])\">{{ row[column.key] }}</span>\n </ng-template>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"renderedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: renderedColumns; when: !isGroupHeader\"\n [attr.tabindex]=\"hasRowClickHandler && !_editMode ? 0 : null\"\n [attr.aria-label]=\"hasRowClickHandler && !_editMode ? rowActionLabel(row) : null\"\n [attr.aria-keyshortcuts]=\"hasRowClickHandler && !_editMode ? 'Enter Space' : null\"\n [ngClass]=\"getRowClass(row)\"\n [class.no-pointer]=\"!hasRowClickHandler || _editMode\"\n [class.edit-mode-row]=\"_editMode\"\n (click)=\"!_editMode && onRowClick(row, $event)\"\n (keydown.enter)=\"!_editMode && onRowClick(row, null)\"\n (keydown.space)=\"!_editMode && onRowClick(row, null); $event.preventDefault()\"\n ></tr>\n <ng-container [matColumnDef]=\"_GROUP_ROW_COLUMN\">\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"renderedColumns.length\" class=\"group-header-cell\">\n <div class=\"group-header-label\">\n <span class=\"group-chevron\" [class.collapsed]=\"isGroupCollapsed(row[_ROW_GROUP_KEY])\" *ngIf=\"isNormalGroupRow(row)\">\u203A</span>\n <span *ngIf=\"isNormalGroupRow(row)\" class=\"group-key-label\">{{ row[_ROW_GROUP_KEY] }}</span>\n <span *ngIf=\"isGroupRowLoading(row)\" class=\"lazy-skeleton group-lazy-key-skeleton\"></span>\n <span *ngIf=\"isGroupRowTooMany(row)\" class=\"group-too-many-label\">{{ i18n.groupTooMany(row[_ROW_GROUP_COUNT]) }}</span>\n <span class=\"group-count-badge\">{{ row[_ROW_GROUP_COUNT] }}</span>\n <div class=\"group-pagination\" *ngIf=\"!isGroupCollapsed(row[_ROW_GROUP_KEY]) && row[_ROW_GROUP_PAGE_COUNT] > 1\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] === 0\" (click)=\"groupPageBack(row[_ROW_GROUP_KEY])\">\u2039</button>\n <span class=\"group-page-info\">{{ row[_ROW_GROUP_PAGE] + 1 }} / {{ row[_ROW_GROUP_PAGE_COUNT] }}</span>\n <button type=\"button\" class=\"group-page-btn\" [disabled]=\"row[_ROW_GROUP_PAGE] >= row[_ROW_GROUP_PAGE_COUNT] - 1\" (click)=\"groupPageForward(row[_ROW_GROUP_KEY], row[_ROW_GROUP_COUNT])\">\u203A</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: [_GROUP_ROW_COLUMN]; when: isGroupHeader\"\n class=\"group-header-row\"\n [class.group-header-loading]=\"isGroupRowLoading(row)\"\n [class.group-header-too-many]=\"isGroupRowTooMany(row)\"\n [attr.data-group-key]=\"row[_ROW_GROUP_KEY]\"\n [attr.tabindex]=\"isNormalGroupRow(row) ? 0 : null\"\n [attr.aria-expanded]=\"isNormalGroupRow(row) ? !isGroupCollapsed(row[_ROW_GROUP_KEY]) : null\"\n (click)=\"onGroupHeaderClick(row)\"\n (keydown.enter)=\"onGroupHeaderClick(row)\"\n (keydown.space)=\"onGroupHeaderClick(row); $event.preventDefault()\"></tr>\n <tr class=\"mat-mdc-row no-data-row\" *matNoDataRow>\n <td class=\"mat-mdc-cell no-data-cell\" [attr.colspan]=\"renderedColumns.length\"></td>\n </tr>\n </table>\n </div><!-- /table-body-scroll -->\n <div class=\"table-body-overlay\" *ngIf=\"effectiveIsLoading || isEmpty\">\n <span class=\"table-body-overlay-text\">{{ effectiveIsLoading ? loadingStateLabel : emptyStateLabel }}</span>\n </div>\n </div><!-- /table-body-wrapper -->\n\n <div class=\"bottom-bar\" [class.is-loading]=\"effectiveIsLoading\" *ngIf=\"showPagination\">\n <mat-paginator\n [length]=\"totalRows\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showFirstLastButtons]=\"resolvedPaginationShowFirstLastButtons\"\n ></mat-paginator>\n <div class=\"paginator-range-loader\" \n [class.paginator-range-loader--no-first-last]=\"!resolvedPaginationShowFirstLastButtons\"\n *ngIf=\"effectiveIsLoading\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n\n <div class=\"group-bottom-bar\" *ngIf=\"activeGroupByKey\">\n <div class=\"group-bottom-bar-container\">\n <div class=\"group-bottom-bar-left\">\n <button type=\"button\" class=\"group-reset-btn\" (click)=\"onGroupByChange(null)\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"group-reset-icon\">\n <path d=\"M3 8a5 5 0 1 0 5-5 5 5 0 0 0-3.54 1.46L3 3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3 3v2.5H5.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ i18n.groupRemove }}\n </button>\n <div class=\"group-bar-separator\"></div>\n <div class=\"group-sort-controls\">\n <span class=\"group-sort-label\">{{ i18n.groupSortLabel }}</span>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'asc'\" (click)=\"onGroupSortToggle('asc')\" [title]=\"i18n.groupSortAsc\">\n <mat-icon>arrow_upward</mat-icon>\n </button>\n <button type=\"button\" class=\"group-sort-btn\" [class.active]=\"groupSortOrder === 'desc'\" (click)=\"onGroupSortToggle('desc')\" [title]=\"i18n.groupSortDesc\">\n <mat-icon>arrow_downward</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"mat-mdc-paginator-page-size\">\n <div class=\"mat-mdc-paginator-page-size-label\">{{ i18n.groupRowsPerGroup }}</div>\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"mat-mdc-paginator-page-size-select\">\n <mat-select\n [(ngModel)]=\"groupPageSize\"\n (ngModelChange)=\"onGroupPageSizeChange($event)\"\n panelClass=\"mat-mdc-paginator-select-page-size group-page-size-panel\"\n [panelWidth]=\"'auto'\"\n >\n <mat-select-trigger>{{ groupPageSize === 0 ? i18n.groupShowAll : groupPageSize }}</mat-select-trigger>\n <mat-option *ngFor=\"let opt of pageSizeOptionsGroupBy\" [value]=\"opt\">{{ opt }}</mat-option>\n <mat-option [value]=\"0\">{{ i18n.groupShowAll }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n </div>\n</section>\n", styles: [":host{display:block;max-height:100%;min-height:inherit;--jqt-title-color: #1f2937;--jqt-text-color: #111827;--jqt-text-secondary: #6b7280;--jqt-text-muted: #9ca3af;--jqt-surface-color: #ffffff;--jqt-surface-alt-color: #f9fafb;--jqt-row-hover-bg: #f3f4f6;--jqt-border-color: #e5e7eb;--jqt-group-bg: #eef2f7;--jqt-group-bg-hover: #e4ecf4;--jqt-group-accent: #94a3b8;--jqt-group-border: #d1d9e4;--jqt-primary-color: #1d4ed8;--jqt-danger-color: #dc2626;--jqt-danger-hover-bg: #fef2f2;--jqt-danger-border: #fca5a5;--jqt-header-bg: #f5f5f5;--jqt-header-text-color: #374151;--jqt-header-height: 56px;--jqt-header-cell-padding-y: 0px;--jqt-cell-bg: #ffffff;--jqt-footer-bg: #f5f5f5;--jqt-footer-text-color: #374151;--jqt-footer-icon-color: #374151;--jqt-footer-height: var(--jqt-header-height);--jqt-toolbar-control-height: 34px;--jqt-slice-panel-min-width: 155px;--jqt-slice-panel-max-width: 190px;--jqt-slice-header-height: 34px;--jqt-slice-header-margin-bottom: 8px;--jqt-slice-body-padding: 4px 10px 10px;--jqt-slice-section-title-font-size: 14px;--jqt-slice-item-font-size: 13px;--jqt-slice-item-min-height: 30px;--jqt-slice-item-padding: 5px 10px 5px 16px}:host.visual-fullscreen{display:block;width:100vw;height:100vh;background:#fff}.jquery-table-wrapper{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.visual-copy-feedback{display:block;position:absolute;top:8px;left:50%;z-index:20;transform:translate(-50%);padding:7px 12px;border:1px solid #c7dfd1;border-radius:5px;background:#f4fbf7f5;color:#24613b;font-size:12px;pointer-events:none}.table-header{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-bottom:12px}.table-header h3{margin:0;font-size:20px;font-weight:600;color:var(--jqt-title-color)}.table-layout{display:grid;grid-template-columns:minmax(var(--jqt-slice-panel-min-width),var(--jqt-slice-panel-max-width)) minmax(0,1fr);gap:12px;align-items:stretch;flex:1 1 0;min-height:0;height:auto}.table-layout.no-slice{grid-template-columns:minmax(0,1fr)}.table-layout.slice-collapsed{grid-template-columns:40px minmax(0,1fr)}.table-shell{display:flex;flex-direction:column;flex:1 1 0;min-height:0;min-width:0;width:100%;max-width:100%}.table-body-wrapper{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.table-body-scroll{flex:1 1 0;overflow-x:auto;overflow-y:auto;min-height:0;border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:8px 8px 0 0;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.table-body-scroll::-webkit-scrollbar{width:6px}.table-body-scroll::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.table-body-overlay{position:absolute;top:var(--actual-header-height, 56px);left:0;right:0;bottom:0;z-index:3;display:flex;align-items:center;justify-content:center;background:var(--jqt-surface-color);border-right:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);pointer-events:none}.table-body-overlay-text{font-size:14px;color:var(--jqt-text-secondary)}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 0 8px}.table-toolbar-left{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:6px}.table-toolbar-right{flex:0 0 auto;display:flex;align-items:center;gap:6px}.table-action-btn{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;background:transparent;color:inherit;cursor:pointer}.table-action-btn:hover{background:#00000014}.search-input-wrapper{position:relative;display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;height:var(--jqt-toolbar-control-height);border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 8px;box-sizing:border-box;gap:6px}.search-input-wrapper:focus-within{border-color:var(--jqt-text-muted)}.search-input-wrapper .search-icon{flex-shrink:0;width:14px;height:14px;color:var(--jqt-text-muted)}.search-input{flex:1;border:none;outline:none;font-size:13px;color:var(--jqt-text-color);background:transparent;padding:7px 0;min-width:0}.search-input::placeholder{color:var(--jqt-text-muted)}.search-count{flex-shrink:0;font-size:12px;font-weight:600;color:var(--jqt-text-secondary);background:var(--jqt-row-hover-bg);border-radius:10px;padding:1px 7px;min-width:20px;text-align:center;line-height:18px}.search-count-loader{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:20px;height:20px}.spinner{width:14px;height:14px;border:2px solid #d1d5db;border-top-color:#374151;border-radius:50%;animation:spin .8s linear infinite}.search-count-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}@keyframes spin{to{transform:rotate(360deg)}}.search-clear-btn{background:none;border:none;cursor:pointer;color:var(--jqt-text-muted);font-size:16px;padding:0;line-height:1;flex-shrink:0}.search-clear-btn:hover{color:var(--jqt-text-color)}.slice-expand-btn{flex-shrink:0;width:var(--jqt-toolbar-control-height);height:var(--jqt-toolbar-control-height);border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--jqt-text-color);padding:0;line-height:1}.slice-expand-btn:hover{border-color:var(--jqt-text-muted)}.slice-expand-mat-icon{font-size:18px;width:18px;height:18px;line-height:1}.view-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.view-btn:hover{border-color:var(--jqt-text-muted)}.view-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.export-btn{display:inline-flex;align-items:center;gap:5px;height:34px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);padding:0 12px;font-size:13px;font-weight:500;color:var(--jqt-text-color);cursor:pointer;white-space:nowrap;box-sizing:border-box}.export-btn:hover{border-color:var(--jqt-text-muted)}.export-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.view-menu-export-divider{margin:4px 0!important}.view-menu-export-item{display:flex;align-items:center;gap:6px;width:100%;padding:0 16px;height:40px;border:none;background:transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--jqt-text-color);text-align:left;box-sizing:border-box}.view-menu-export-item:hover{background:#0000000a}.view-menu-export-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.edit-confirm-btn{position:absolute;top:10px;right:10px;z-index:200;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:50%;background:#16a34a;cursor:pointer;box-shadow:0 2px 8px #00000040;transition:background .15s}.edit-confirm-btn mat-icon{color:#fff;font-size:22px;width:22px;height:22px}.edit-confirm-btn:hover{background:#15803d}.preferences-message{display:flex;align-items:center;gap:8px;margin:0 0 8px;padding:8px 12px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;font-size:12px;color:#15803d}.preferences-message .preferences-message-icon{font-size:16px;width:16px;height:16px}:host ::ng-deep .edit-mode-header{background:#3b82f60a!important;cursor:grab!important;-webkit-user-select:none;user-select:none;overflow:visible!important}.col-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize!important;background:#3b82f640;z-index:20}.col-resize-handle:hover{background:#3b82f6b3}.col-resize-handle:active{background:#3b82f6e6}:host ::ng-deep th.mat-mdc-header-cell{position:relative}:host ::ng-deep th.mat-mdc-header-cell.drag-enabled{overflow:visible!important}:host ::ng-deep .edit-mode-row{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.8}.cell-edit-mode{pointer-events:none;-webkit-user-select:none;user-select:none;color:var(--jqt-text-muted)}.group-header-row{cursor:pointer}:host ::ng-deep .jquery-table{border-spacing:0}:host ::ng-deep .group-header-row td{padding:0!important;background:var(--jqt-group-bg);border-bottom:1px solid var(--jqt-group-border);border-top:1px solid var(--jqt-group-border);border-left:3px solid var(--jqt-group-accent);position:sticky;top:var(--actual-header-height, 56px);z-index:2;box-shadow:-4px 0 0 0 var(--jqt-group-bg)}:host ::ng-deep .group-header-row:hover td{background:var(--jqt-group-bg-hover);box-shadow:-4px 0 0 0 var(--jqt-group-bg-hover)}:host ::ng-deep .group-header-loading td,:host ::ng-deep .group-header-loading:hover td,:host ::ng-deep .group-header-too-many td,:host ::ng-deep .group-header-too-many:hover td{cursor:default;background:var(--jqt-surface-alt-color)}.group-too-many-label{font-size:12px;font-weight:500;color:var(--jqt-warn-color, #b45309);font-style:italic}.group-header-cell{padding:0!important}.group-header-label{display:flex;align-items:center;gap:6px;padding:6px 16px;font-size:12px;font-weight:700;color:var(--jqt-text-color);text-transform:uppercase;letter-spacing:.04em}.group-key-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-count-badge{flex-shrink:0;font-size:11px;line-height:1;font-weight:600;color:#fff;background:var(--jqt-text-secondary, #6b7280);border-radius:10px;padding:3px 7px;min-width:20px;text-align:center;text-transform:none;letter-spacing:0}.group-pagination{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.group-page-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--jqt-border-color);border-radius:5px;background:var(--jqt-surface-color);cursor:pointer;font-size:14px;color:var(--jqt-text-color);line-height:1;padding:0 0 3px;text-transform:none;letter-spacing:0}.group-page-btn:hover:not(:disabled){border-color:var(--jqt-text-muted);background:var(--jqt-surface-alt-color)}.group-page-btn:disabled{opacity:.35;cursor:default}.group-page-info{font-size:11px;color:var(--jqt-text-secondary);min-width:36px;text-align:center;font-weight:500;text-transform:none;letter-spacing:0}.group-chevron{flex-shrink:0;font-size:14px;font-weight:700;padding-bottom:3px;transition:transform .15s ease;transform:rotate(90deg)}.group-chevron.collapsed{transform:rotate(0)}.no-data-row{cursor:default!important}.no-data-cell{padding:0!important;height:0!important;border:none!important}.jquery-table{width:100%;table-layout:fixed}:host ::ng-deep .mat-mdc-table{width:100%;background:transparent}:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host ::ng-deep .mat-mdc-header-row{background:var(--jqt-header-bg);height:var(--jqt-header-height);min-height:var(--jqt-header-height)}:host ::ng-deep .mat-mdc-header-cell{background:var(--jqt-header-bg);color:var(--jqt-header-text-color);height:var(--jqt-header-height);min-height:var(--jqt-header-height);padding-top:var(--jqt-header-cell-padding-y);padding-bottom:var(--jqt-header-cell-padding-y)}:host ::ng-deep .mat-mdc-row,:host ::ng-deep .mat-mdc-cell{background:var(--jqt-cell-bg)}:host ::ng-deep .mat-mdc-row{cursor:pointer;border-bottom-color:var(--jqt-border-color)}:host ::ng-deep .mat-mdc-row.no-pointer{cursor:auto}:host ::ng-deep .mat-mdc-row:not(.no-pointer):focus-visible{outline:2px solid var(--jqt-primary-color);outline-offset:-2px}:host ::ng-deep .mat-mdc-row.no-data-row{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drag-enabled{-webkit-user-select:none;user-select:none}:host ::ng-deep .mat-mdc-header-cell.drag-enabled:active{cursor:default}:host ::ng-deep .mat-mdc-header-cell.drop-target{background:var(--jqt-row-hover-bg)}.head-cell{display:flex;align-items:center;justify-content:space-between;gap:6px;min-width:0}.drag-handle{display:inline-flex;align-items:center;cursor:grab;color:var(--jqt-border-color);flex-shrink:0;padding:0 2px;border:0;background:transparent;border-radius:4px;font:inherit;line-height:1}.drag-handle:active{cursor:grabbing}.drag-handle:hover{color:var(--jqt-text-muted)}.drag-handle mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.head-icon{font-size:14px;width:14px;height:14px;line-height:1;flex-shrink:0;color:var(--jqt-text-muted)}.head-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;font-size:11px;font-weight:600;letter-spacing:.05em}.head-actions{display:inline-flex;align-items:center;gap:6px}.cell-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-empty{color:var(--jqt-empty-cell-color, #9ca3af);font-style:italic}.bottom-bar{display:flex;align-items:center;flex:0 0 auto;min-height:var(--jqt-footer-height, var(--actual-header-height, 56px));position:relative;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}:host ::ng-deep .bottom-bar mat-paginator{flex:1 1 auto;min-width:0;background:transparent;color:var(--jqt-footer-text-color)}:host ::ng-deep .bottom-bar .mat-mdc-paginator-outer-container{display:flex;width:100%}:host ::ng-deep .bottom-bar .mat-mdc-paginator-container{display:flex;align-items:center;flex-wrap:nowrap;justify-content:flex-end;width:100%;min-height:0;height:var(--jqt-footer-height, var(--actual-header-height, 56px));padding:0 8px;box-sizing:border-box}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label,:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-label{flex-shrink:0;font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size,:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-actions{display:flex;flex-shrink:0;align-items:center;white-space:nowrap}:host ::ng-deep .bottom-bar .mat-mdc-paginator-range-label{margin:0 12px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button{color:var(--jqt-footer-icon-color);width:28px;height:28px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center;--mdc-icon-button-state-layer-size: 28px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-mdc-button-persistent-ripple,:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mdc-icon-button__state-layer{width:28px;height:28px;top:50%;left:50%;transform:translate(-50%,-50%)}:host ::ng-deep .bottom-bar .mat-mdc-icon-button .mat-icon{font-size:18px;width:18px;height:18px;line-height:18px}:host ::ng-deep .bottom-bar .mat-mdc-icon-button:disabled{opacity:.35}:host ::ng-deep .bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .bottom-bar.is-loading .mat-mdc-paginator-range-label{visibility:hidden}.paginator-range-loader{position:absolute;right:0;top:50%;transform:translateY(-50%);margin-right:145px;display:flex;align-items:center;justify-content:center;width:auto;padding:0 16px;height:24px}.paginator-range-loader--no-first-last{margin-right:80px}.paginator-range-loader .spinner{width:16px;height:16px;border:2.5px solid #e5e7eb;border-top-color:#a0a5ad}.group-bottom-bar{display:flex;align-items:center;flex:0 0 auto;background:var(--jqt-footer-bg);border-top:1px solid var(--jqt-border-color);border-right:1px solid var(--jqt-border-color);border-bottom:1px solid var(--jqt-border-color);border-left:1px solid var(--jqt-border-color);border-radius:0 0 8px 8px}.group-bottom-bar-container{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;min-height:var(--actual-header-height, 56px);height:auto;padding:8px 12px;gap:16px;width:100%;box-sizing:border-box}.group-bar-separator{width:1px;height:20px;background:#9ca3af;flex-shrink:0;margin:0 4px}.group-bottom-bar-left{display:flex;align-items:center;flex:1 1 280px;min-width:0;flex-wrap:wrap;gap:8px}.group-sort-controls{display:flex;align-items:center;min-width:0;gap:2px}.group-sort-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap;margin-right:2px}.group-sort-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--jqt-footer-icon-color);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.group-sort-btn mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.group-sort-btn:hover{background:#0000000a}.group-sort-btn.active{color:var(--jqt-primary-color, #1976d2);border-color:var(--jqt-primary-color, #1976d2);background:#1976d214}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size{display:flex;align-items:center;flex:0 1 auto;min-width:0;gap:8px}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-label{font-size:12px;color:var(--jqt-footer-text-color);white-space:nowrap}:host ::ng-deep .group-bottom-bar .mat-mdc-paginator-page-size-select{width:72px;font-size:12px}:host ::ng-deep .group-bottom-bar .mat-mdc-text-field-wrapper{padding:0 8px}:host ::ng-deep .group-bottom-bar .mdc-text-field--outlined{height:28px}:host ::ng-deep .group-bottom-bar .mat-mdc-form-field-infix{padding-top:0;padding-bottom:0;min-height:0;height:28px;display:flex;align-items:center}:host ::ng-deep .group-bottom-bar .mat-mdc-select-value-text{font-size:12px;color:var(--jqt-text-color)}:host ::ng-deep .group-bottom-bar .mdc-notched-outline__leading,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__notch,:host ::ng-deep .group-bottom-bar .mdc-notched-outline__trailing{border-color:var(--jqt-border-color)}:host ::ng-deep .group-bottom-bar .mat-mdc-select-arrow{color:var(--jqt-footer-text-color)}.group-reset-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--jqt-border-color);border-radius:8px;background:var(--jqt-surface-color);color:var(--jqt-text-secondary);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}.group-reset-btn:hover{background:var(--jqt-danger-hover-bg);color:var(--jqt-danger-color);border-color:var(--jqt-danger-border)}.group-reset-icon{width:14px;height:14px;flex-shrink:0}::ng-deep .mat-mdc-paginator-select-page-size .mat-pseudo-checkbox{display:none!important}::ng-deep .group-page-size-panel{min-width:90px!important}::ng-deep .group-page-size-panel .mat-mdc-option{justify-content:center;min-height:40px}::ng-deep .group-page-size-panel .mdc-list-item__primary-text{text-align:center;width:100%}@media (max-width: 960px){.table-layout{grid-template-columns:1fr}}::ng-deep .view-menu-panel .mat-mdc-menu-panel{min-width:220px!important;overflow:visible!important}::ng-deep .view-menu-panel .mat-mdc-menu-content{padding:4px 0!important}::ng-deep .view-submenu-panel .mat-mdc-menu-panel{min-width:200px!important}::ng-deep .view-submenu-panel .mat-mdc-menu-content{padding:0!important}::ng-deep .view-menu-panel .view-menu-sub-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}::ng-deep .view-menu-panel .view-menu-sub-trigger .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;gap:0;overflow:hidden}::ng-deep .view-menu-sub-label{font-size:13px;font-weight:500;color:var(--jqt-text-color);flex:0 0 auto;white-space:nowrap;padding-right:8px}::ng-deep .view-menu-sub-value{font-size:12px;color:var(--jqt-text-secondary);flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}::ng-deep .view-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}::ng-deep .view-submenu .view-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:var(--jqt-text-color);cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}::ng-deep .view-submenu .view-menu-item:hover{background:var(--jqt-row-hover-bg)}::ng-deep .view-submenu .view-menu-item.active{font-weight:600}::ng-deep .view-submenu .view-menu-item:disabled{opacity:.4;cursor:default}::ng-deep .view-menu-col-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-text-muted)}::ng-deep .view-menu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:var(--jqt-text-color)}::ng-deep .view-menu-separator{border:none;border-top:1px solid var(--jqt-border-color);margin:4px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.group-lazy-key-skeleton{flex:1 1 auto;min-width:80px;height:13px;border-radius:4px}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.lazy-error-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid #fca5a5;border-radius:4px;padding:2px 6px;cursor:pointer;color:#ef4444;font-size:12px;opacity:.85;transition:opacity .15s}.lazy-error-btn:hover{opacity:1;background:#fef2f2}.lazy-error-icon{font-size:12px}.lazy-error-label{font-size:11px;font-weight:500}::ng-deep .lazy-menu-spinner{display:inline-block;margin-left:auto;font-size:13px;color:var(--jqt-text-secondary);animation:lazy-spin 1s linear infinite}::ng-deep .lazy-menu-error{display:inline-block;margin-left:auto;font-size:13px;color:#ef4444}@keyframes lazy-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
1646
1747
  }], propDecorators: { _isFullscreen: [{
1647
1748
  type: HostBinding,
1648
1749
  args: ['class.visual-fullscreen']
@@ -1697,6 +1798,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1697
1798
  }], tableBodyScrollRef: [{
1698
1799
  type: ViewChild,
1699
1800
  args: ['tableBodyScroll']
1801
+ }], tableShellRef: [{
1802
+ type: ViewChild,
1803
+ args: ['tableShell']
1700
1804
  }], slicePanelRef: [{
1701
1805
  type: ViewChild,
1702
1806
  args: [SlicePanelComponent]
@@ -1721,4 +1825,4 @@ function serializableColumn(column) {
1721
1825
  lazy: !!column.lazy,
1722
1826
  };
1723
1827
  }
1724
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBbUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXdCLE1BQU0sRUFBRSxTQUFTLEVBQThCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwUyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFrQixNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FB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QUFNO2dCQUdILFNBQVM7c0JBRFosU0FBUzt1QkFBQyxZQUFZO2dCQVVILElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFDWSxrQkFBa0I7c0JBQS9DLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNJLGFBQWE7c0JBQTVDLFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNRLFNBQVM7c0JBQTlDLGVBQWU7dUJBQUMsbUJBQW1CO2dCQWtZcEMsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLDJCQUEyQjs7QUFvNEMzQyxTQUFTLGtCQUFrQixDQUFJLE1BQThCO0lBQzNELE9BQU87UUFDTCxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7UUFDZixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQzNCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7S0FDcEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBpbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9ySW50bCwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtblByb3ZpZGVyLCBUYWJsZUV4cG9ydENvbmZpZywgVGFibGVQcmVmZXJlbmNlc0NvbmZpZywgVGFibGVQcm92aWRlciwgVGFibGVWaWV3Q29uZmlnIH0gZnJvbSAnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IEpxdEkxOG4sIEpRVF9JMThOLCBKUVRfSTE4Tl9ERUZBVUxUUyB9IGZyb20gJy4uL2pxdC1pMThuLnRva2VuJztcbmltcG9ydCB7IEpxdENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmUvanF0LWNlbGwtZGVmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTbGljZUNvbmZpZywgU2xpY2VQYW5lbENvbXBvbmVudCwgT3JnYW5pemVyRmFjYWRlLCBHcm91cEJ5TWFuYWdlciwgTGF6eUZpZWxkTWFuYWdlciwgT3JnYW5pemVyQ29uZmlnLCBPcmdhbml6ZXJCdXR0b25FdmVudCwgT3JnYW5pemVyU3RhdGUgfSBmcm9tICdAb25ldGVtZS9qcXVlcnktb3JnYW5pemVyJztcbmltcG9ydCB7IGdldEZyZW5jaFBhZ2luYXRvckludGwsIGh1bWFuaXplS2V5LCBub3JtYWxpemVDZWxsVmFsdWUgfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7IFRhYmxlUHJlZmVyZW5jZXNNYW5hZ2VyIH0gZnJvbSAnLi90YWJsZS1wcmVmZXJlbmNlcy5tYW5hZ2VyJztcbmltcG9ydCB7IEV4cG9ydE1hbmFnZXIgfSBmcm9tICcuL2V4cG9ydC5tYW5hZ2VyJztcbmltcG9ydCB7XG4gIEdST1VQX1JPV19DT0xVTU4sIEdST1VQX0hFQURFUl9NQVJLRVIsXG4gIEdST1VQX0tFWV9MQVpZX0xPQURJTkcsIEdST1VQX0tFWV9UT09fTUFOWSxcbiAgUk9XX1JBV19LRVksIFJPV19JTkRFWF9LRVksXG4gIFJPV19HUk9VUF9LRVksIFJPV19HUk9VUF9DT1VOVCwgUk9XX0dST1VQX1BBR0UsIFJPV19HUk9VUF9QQUdFX0NPVU5ULFxuICBMQVpZX0xPQURJTkdfVkFMVUUsIExBWllfRVJST1JfVkFMVUUsXG59IGZyb20gJy4vdGFibGUuY29uc3RhbnRzJztcbmltcG9ydCB7IE9yZ2FuaXplckJ1dHRvbldyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL29yZ2FuaXplci1idXR0b24vb3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgY2xvbmVTZXJpYWxpemFibGUsIGNvbnRhaW5zRnVuY3Rpb24sIEZ1bGxzY3JlZW5NYW5hZ2VyLCBWaXN1YWxDb3B5RmVlZGJhY2tDb25maWcsIFZpc3VhbFNuYXBzaG90LCBWaXN1YWxTbmFwc2hvdEFwcGx5UmVzdWx0LCBWaXN1YWxTbmFwc2hvdERyYWZ0LCBWaXN1YWxTbmFwc2hvdFN0b3JhZ2UgfSBmcm9tICdAb25ldGVtZS9qcXVlcnktY29yZSc7XG5cbi8qKiBDYWNoZSBpbnRlcm5lIGR1IGdyb3VwZW1lbnQg4oCUIGludmFsaWTDqSBkw6hzIHF1ZSBsZXMgZG9ubsOpZXMsIGxhIGNsw6kgb3UgbGVzIHBhcmFtw6h0cmVzIGRlIHRyaSBjaGFuZ2VudC4gKi9cbmludGVyZmFjZSBHcm91cEJ5Q2FjaGU8VD4ge1xuICByb3dzOiBUW107XG4gIGtleTogc3RyaW5nO1xuICBzb3J0T3JkZXI6ICdhc2MnIHwgJ2Rlc2MnO1xuICBzb3J0QWN0aXZlOiBzdHJpbmc7XG4gIHNvcnREaXI6IHN0cmluZztcbiAgb3JkZXI6IHN0cmluZ1tdO1xuICBtYXA6IE1hcDxzdHJpbmcsIFRbXT47XG59XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2pxdWVyeS10YWJsZScsXG4gIGltcG9ydHM6IFsgQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0VGFibGVNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0RGl2aWRlck1vZHVsZSwgTWF0UGFnaW5hdG9yTW9kdWxlLCBNYXRTb3J0TW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGUsIFNsaWNlUGFuZWxDb21wb25lbnQsIE9yZ2FuaXplckJ1dHRvbldyYXBwZXJDb21wb25lbnQgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0UGFnaW5hdG9ySW50bCwgdXNlRmFjdG9yeTogZ2V0RnJlbmNoUGFnaW5hdG9ySW50bCB9XSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCA9IGFueT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MudmlzdWFsLWZ1bGxzY3JlZW4nKSBfaXNGdWxsc2NyZWVuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpZz86IFRhYmxlUHJvdmlkZXI8VD47XG5cbiAgQElucHV0KCkgZGF0YVNvdXJjZT86IFRbXSB8IHsgZGF0YTogVFtdIH07XG4gIEBJbnB1dCgpIGRhdGE/OiBUW107XG4gIEBJbnB1dCgpIGRpc3BsYXllZENvbHVtbnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgY29sdW1uc0NvbmZpZz86IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXTtcblxuICAvKipcbiAgICogTW9kZSBIVE1MIDogYWN0aXZlIGV0IGNvbmZpZ3VyZSBsZSBwYW5uZWF1IFZpZXcgaW5kw6lwZW5kYW1tZW50IGR1IGBbY29uZmlnXWAuXG4gICAqIFByZW5kIGxlIGRlc3N1cyBzdXIgYGNvbmZpZy52aWV3YCBzaSBkw6lmaW5pLlxuICAgKiBFeGVtcGxlIDogYDxqcXVlcnktdGFibGUgW3ZpZXddPVwieyBlbmFibGVkOiB0cnVlIH1cIj5gXG4gICAqL1xuICBASW5wdXQoKSB2aWV3PzogVGFibGVWaWV3Q29uZmlnO1xuXG4gIEBJbnB1dCgpIGNvbHVtbkxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIEBJbnB1dCgpIGlzTG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBjb3B5RmVlZGJhY2s6IFZpc3VhbENvcHlGZWVkYmFja0NvbmZpZyA9IHt9O1xuXG4gIC8qKiBQYXJhbcOodHJlIGRlIGNvbnRyw7RsZSBwb3VyIHLDqWluaXRpYWxpc2VyIGJhcnJlIGRlIHJlY2hlcmNoZS4gKi9cbiAgQElucHV0KClcbiAgc2V0IGNsZWFyU2VhcmNoSW5wdXQodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIGFkZFJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PigpO1xuICBAT3V0cHV0KCkgY29sdW1uUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcbiAgQE91dHB1dCgpIGNhdGVnb3J5U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKiDDiW1pcyDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSB0cmkgKHkgY29tcHJpcyBsZSB0cmkgaW5pdGlhbCkuICovXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlICAgID0gbmV3IEV2ZW50RW1pdHRlcjx7IGFjdGl2ZTogc3RyaW5nOyBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJycgfT4oKTtcbiAgLyoqIMOJbWlzIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIHBhZ2Ugb3UgZGUgdGFpbGxlIGRlIHBhZ2UuICovXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlICAgID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0+KCk7XG4gIC8qKiDDiW1pcyDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBsYSByZWNoZXJjaGUgdGV4dGUuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiDDiW1pcyBxdWFuZCBsZSBHcm91cCBieSBjaGFuZ2UgKGNsw6kgZGUgY29sb25uZSwgb3UgYG51bGxgIHNpIGTDqXNhY3RpdsOpKS4gKi9cbiAgQE91dHB1dCgpIGdyb3VwQnlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG4gIC8qKiDDiW1pcyBxdWFuZCBsYSBsaXN0ZSBkZXMgY29sb25uZXMgdmlzaWJsZXMgY2hhbmdlIChjbMOpcyBkYW5zIGzigJlvcmRyZSBk4oCZYWZmaWNoYWdlKS4gKi9cbiAgQE91dHB1dCgpIGNvbHVtbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgdmlzdWFsQ29waWVkID0gbmV3IEV2ZW50RW1pdHRlcjxWaXN1YWxTbmFwc2hvdD4oKTtcblxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcilcbiAgc2V0IHBhZ2luYXRvcih2YWx1ZTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFnaW5hdG9yID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHBhZ2luYXRvcigpOiBNYXRQYWdpbmF0b3IgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fcGFnaW5hdG9yOyB9XG4gIHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0PzogTWF0U29ydDtcbiAgQFZpZXdDaGlsZCgndGFibGVCb2R5U2Nyb2xsJykgdGFibGVCb2R5U2Nyb2xsUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoU2xpY2VQYW5lbENvbXBvbmVudCkgc2xpY2VQYW5lbFJlZj86IFNsaWNlUGFuZWxDb21wb25lbnQ8VD47XG4gIEBDb250ZW50Q2hpbGRyZW4oSnF0Q2VsbERlZkRpcmVjdGl2ZSkgX2NlbGxEZWZzITogUXVlcnlMaXN0PEpxdENlbGxEZWZEaXJlY3RpdmU+O1xuICAvKiogTWFwIGNsw6nihpJUZW1wbGF0ZVJlZiBwcsOpLWNhbGN1bMOpZSBkZXB1aXMgX2NlbGxEZWZzLiBNaXNlIMOgIGpvdXIgZGFucyBuZ0FmdGVyQ29udGVudEluaXQgZXQgc3VyIF9jZWxsRGVmcy5jaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9jZWxsRGVmTWFwID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBhbnk7IGluZGV4OiBudW1iZXIgfT4+KCk7XG5cbiAgcmVuZGVyZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICB0YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuXG4gIC8qKiBDb25zdGFudGUgZXhwb3PDqWUgYXUgdGVtcGxhdGUgcG91ciBsZSBtYXRDb2x1bW5EZWYgZGUgbGEgbGlnbmUgZGUgZ3JvdXBlLiAqL1xuICByZWFkb25seSBfR1JPVVBfUk9XX0NPTFVNTiA9IEdST1VQX1JPV19DT0xVTU47XG4gIC8qKiBDbMOpcyBkJ2FjY8OocyBhdXggcHJvcHJpw6l0w6lzIGRlcyBsaWduZXMgcHJvamV0w6llcyDigJQgZXhwb3PDqWVzIHBvdXIgbGUgdGVtcGxhdGUuICovXG4gIHJlYWRvbmx5IF9ST1dfUkFXX0tFWSA9IFJPV19SQVdfS0VZO1xuICByZWFkb25seSBfUk9XX0lOREVYX0tFWSA9IFJPV19JTkRFWF9LRVk7XG4gIHJlYWRvbmx5IF9ST1dfR1JPVVBfS0VZID0gUk9XX0dST1VQX0tFWTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9DT1VOVCA9IFJPV19HUk9VUF9DT1VOVDtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9QQUdFID0gUk9XX0dST1VQX1BBR0U7XG4gIHJlYWRvbmx5IF9ST1dfR1JPVVBfUEFHRV9DT1VOVCA9IFJPV19HUk9VUF9QQUdFX0NPVU5UO1xuXG4gIC8qKiBGYWNhZGUgVmlldyA6IMOpdGF0IGV0IGFjdGlvbnMgY2VudHJhbGlzw6lzIChDaGFtcHMgLyBHcm91cCBieSAvIFNsaWNlIGJ5KSAqL1xuICByZWFkb25seSBfb3JnYW5pemVyID0gbmV3IE9yZ2FuaXplckZhY2FkZTxUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PigpO1xuXG4gIC8qKlxuICAgKiBTbmFwc2hvdCBzdGFibGUgc3luY2hyb25pc8OpIGRlcHVpcyBfb3JnYW5pemVyLmZpZWxkcy5hY3RpdmVGaWVsZHMgZGFucyByZWZyZXNoVmlld01vZGVsKCkuXG4gICAqIFByb3ByacOpdMOpIChub24gZ2V0dGVyKSBwb3VyIHF1J0FuZ3VsYXIgcHVpc3NlIGxhIHN1aXZyZSBzYW5zIE5HMDEwMC5cbiAgICovXG4gIGFjdGl2ZUZpZWxkczogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdID0gW107XG5cbiAgYWN0aXZlU2xpY2VGaWx0ZXI6IChyb3c6IFQpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlO1xuXG4gIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlIChjb250cmUgZXJyZXVyIE5HMDEwMClcbiAgX3NsaWNlQ29uZmlnczogYW55W10gPSBbXTtcbiAgX3NsaWNlQ29sdW1uczogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdID0gW107XG4gIF9zbGljZURhdGE6IFRbXSA9IFtdO1xuICBfc2xpY2VTaG93VG9nZ2xlID0gdHJ1ZTtcbiAgLyoqIFNuYXBzaG90IHN0YWJsZSBkZSBsYSB2aXNpYmlsaXTDqSBkdSBwYW5uZWF1IHNsaWNlIOKAlCBqYW1haXMgY2FsY3Vsw6kgZGVwdWlzIEBWaWV3Q2hpbGQgKi9cbiAgX3Nob3dTbGljZVBhbmVsID0gZmFsc2U7XG4gIC8qKiBTbmFwc2hvdCBzdGFibGUgZGUgbCfDqXRhdCBjb2xsYXBzZWQgZHUgcGFubmVhdSBzbGljZSwgbWlzIMOgIGpvdXIgdmlhIChjb2xsYXBzZWRDaGFuZ2UpICovXG4gIF9zbGljZVBhbmVsQ29sbGFwc2VkID0gZmFsc2U7XG5cbiAgLy8gRMOpbMOpZ3XDqXMgdmVycyBfdmlldyAoY29uc2VydsOpcyBwb3VyIGNvbXBhdGliaWxpdMOpIHRlbXBsYXRlIHNhbnMgcmVmYWN0b3JpbmcgSFRNTClcbiAgZ2V0IF9zdGF0aWNTbGljZXNGb3JNZW51KCk6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGljb24/OiBzdHJpbmcgfT4geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnN0YXRpY1NsaWNlc0Zvck1lbnU7IH1cbiAgZ2V0IF9hY3RpdmVEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hY3RpdmVEeW5hbWljRmllbGRzOyB9XG4gIGdldCBfYXZhaWxhYmxlQ29sdW1uc0ZvckR5bmFtaWNTbGljZSgpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYXZhaWxhYmxlRm9yRHluYW1pYzsgfVxuICBnZXQgX2FsbER5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFsbER5bmFtaWNGaWVsZHM7IH1cbiAgZ2V0IF9hY3RpdmVTbGljZUJ5TGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUxhYmVsOyB9XG4gIF9zbGljZUJ5TWVudUl0ZW1zOiBBcnJheTx7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgaWNvbj86IHN0cmluZzsgY29sPzogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiB9PiA9IFtdO1xuXG4gIHNlYXJjaFF1ZXJ5ID0gJyc7XG4gIGdldCBhY3RpdmVHcm91cEJ5S2V5KCk6IHN0cmluZyB8IG51bGwgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmdyb3VwQnkuYWN0aXZlS2V5OyB9XG4gIF9tYXRTb3J0QWN0aXZlID0gJyc7XG4gIF9tYXRTb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnID0gJyc7XG4gIHByaXZhdGUgX2FjdGl2ZVNvcnQ6IHsgYWN0aXZlOiBzdHJpbmc7IGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnJyB9ID0geyBhY3RpdmU6ICcnLCBkaXJlY3Rpb246ICcnIH07XG4gIHByaXZhdGUgX3NvcnRTdWJzY3JpYmVkOiBNYXRTb3J0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfdG90YWxGaWx0ZXJlZENvdW50ID0gMDtcblxuICAvKiogR2VzdGlvbm5haXJlIGR1IG1vZGUgR3JvdXAgQnkgKMOpdGF0IGNvbGxhcHNlZCwgcGFnaW5hdGlvbiwgdHJpIGRlcyBncm91cGVzKS4gKi9cbiAgcmVhZG9ubHkgX2dyb3VwQnkgPSBuZXcgR3JvdXBCeU1hbmFnZXIoXG4gICAgKCkgPT4geyB0aGlzLl9wcm9qZWN0Q3VycmVudFBhZ2UoKTsgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpOyB9LFxuICAgICgpID0+IHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpLFxuICApO1xuXG4gIC8qKiBEw6lsw6lndcOpcyB2ZXJzIEdyb3VwQnlNYW5hZ2VyIHBvdXIgbGEgY29tcGF0aWJpbGl0w6kgZGVzIHRlbXBsYXRlcy4gKi9cbiAgZ2V0IGdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2dyb3VwQnkuZ3JvdXBQYWdlU2l6ZTsgfVxuICBzZXQgZ3JvdXBQYWdlU2l6ZSh2OiBudW1iZXIpIHsgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdjsgfVxuICBnZXQgZ3JvdXBTb3J0T3JkZXIoKTogJ2FzYycgfCAnZGVzYycgeyByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlcjsgfVxuICBzZXQgZ3JvdXBTb3J0T3JkZXIodjogJ2FzYycgfCAnZGVzYycpIHsgdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlciA9IHY7IH1cblxuICAvKiogR2VzdGlvbm5haXJlIGR1IGN5Y2xlIGRlIHZpZSBkZXMgY29sb25uZXMgbGF6eSAoZmV0Y2gsIGFubnVsYXRpb24sIHN0YXR1dHMsIGRvbm7DqWVzKS4gKi9cbiAgcHJpdmF0ZSBfbGF6eSA9IG5ldyBMYXp5RmllbGRNYW5hZ2VyPFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+KCk7XG4gIC8qKiBDb21wYXRpYmlsaXTDqSB0ZW1wbGF0ZSA6IHJldG91cm5lIGxhIG1hcCBkZSBzdGF0dXRzIGxhenkuICovXG4gIGdldCBfbGF6eUNvbHVtblN0YXR1cygpIHsgcmV0dXJuIHRoaXMuX2xhenkuc3RhdHVzOyB9XG4gIC8qKiBDb21wYXRpYmlsaXTDqSB0ZW1wbGF0ZSA6IHJldG91cm5lIGxhIG1hcCBkZSBkb25uw6llcyBsYXp5LiAqL1xuICBnZXQgX2xhenlDb2x1bW5EYXRhKCkgeyByZXR1cm4gdGhpcy5fbGF6eS5kYXRhOyB9XG4gIHByaXZhdGUgX2NkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX2VsID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSBfbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgX2kxOG5SYXcgPSBpbmplY3QoSlFUX0kxOE4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIGNvcHlGZWVkYmFja01lc3NhZ2UgPSAnJztcbiAgcHJpdmF0ZSBfY29weUZlZWRiYWNrVGltZXI/OiBudW1iZXI7XG5cbiAgLyoqIExhYmVscyBkZSBs4oCZaW50ZXJmYWNlLiBGdXNpb25uw6lzIGRlcHVpcyBKUVRfSTE4Tl9ERUZBVUxUUyBldCBsZSB0b2tlbiBKUVRfSTE4TiBpbmplY3TDqS4gKi9cbiAgcmVhZG9ubHkgaTE4bjogSnF0STE4biA9IHsgLi4uSlFUX0kxOE5fREVGQVVMVFMsIC4uLih0aGlzLl9pMThuUmF3ID8/IHt9KSB9O1xuXG4gIGlzR3JvdXBIZWFkZXIgPSAoXzogbnVtYmVyLCByb3c6IGFueSk6IGJvb2xlYW4gPT4gcm93W0dST1VQX0hFQURFUl9NQVJLRVJdID09PSB0cnVlO1xuXG4gIC8qKiBSZXRvdXJuZSB0cnVlIHNpIGxhIGxpZ25lIGRlIGdyb3VwZSBlc3QgdW5lIGxpZ25lIG5vcm1hbGUgKG5pIGxhenksIG5pIHRvby1tYW55KS4gKi9cbiAgaXNOb3JtYWxHcm91cFJvdyhyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByb3dbUk9XX0dST1VQX0tFWV0gIT09IEdST1VQX0tFWV9MQVpZX0xPQURJTkcgJiYgcm93W1JPV19HUk9VUF9LRVldICE9PSBHUk9VUF9LRVlfVE9PX01BTlk7XG4gIH1cbiAgaXNHcm91cFJvd0xvYWRpbmcocm93OiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHJvd1tST1dfR1JPVVBfS0VZXSA9PT0gR1JPVVBfS0VZX0xBWllfTE9BRElORzsgfVxuICBpc0dyb3VwUm93VG9vTWFueShyb3c6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gcm93W1JPV19HUk9VUF9LRVldID09PSBHUk9VUF9LRVlfVE9PX01BTlk7IH1cblxuICAvKiogR8OocmUgbGUgY2xpYyBzdXIgdW5lIGxpZ25lIGQnZW4tdMOqdGUgZGUgZ3JvdXBlIChuby1vcCBwb3VyIGxlcyDDqXRhdHMgc3DDqWNpYXV4KS4gKi9cbiAgb25Hcm91cEhlYWRlckNsaWNrKHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTm9ybWFsR3JvdXBSb3cocm93KSkgcmV0dXJuO1xuICAgIHRoaXMudG9nZ2xlR3JvdXBDb2xsYXBzZShyb3dbUk9XX0dST1VQX0tFWV0pO1xuICB9XG5cbiAgLyoqIEdlc3Rpb25uYWlyZSBleHBvcnQgQ1NWLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leHBvcnQgPSBuZXcgRXhwb3J0TWFuYWdlcjxUPihcbiAgICAoKSA9PiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MsXG4gICAgKCkgPT4gdGhpcy5hY3RpdmVGaWVsZHMsXG4gICAgKCkgPT4gdGhpcy5yZXNvbHZlZENvbmZpZy5leHBvcnQsXG4gICAgKGNvbCwgcm93LCBpZHgpID0+IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaWR4KSxcbiAgKTtcblxuICAvLyDilIDilIAgTGlmZWN5Y2xlXG5cbiAgcGFnZVNpemUgPSA1O1xuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XG4gIHBhZ2VTaXplT3B0aW9uc0dyb3VwQnk6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XG5cbiAgZHJhZ2dlZENvbHVtbktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdPdmVyQ29sdW1uS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyDilIDilIAgTW9kZSDDqWRpdGlvbiAoUHLDqWbDqXJlbmNlcylcbiAgLyoqIFZyYWkgcXVhbmQgbGUgbW9kZSDDqWRpdGlvbiBlc3QgYWN0aWYgKHJlc2l6ZSArIGRyYWcgY29sb25uZXMsIGludGVyYWN0aW9ucyBkw6lzYWN0aXbDqWVzKS4gKi9cbiAgX2VkaXRNb2RlID0gZmFsc2U7XG4gIC8qKiBMYXJnZXVycyBkZSBjb2xvbm5lcyBwZXJzb25uYWxpc8OpZXMgcGFyIGwndXRpbGlzYXRldXIgKGNsw6kg4oaSIHB4KS4gKi9cbiAgX2NvbHVtbldpZHRoczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAvKiogTWVzc2FnZSBkZSBmZWVkYmFjayBhcHLDqHMgc2F2ZS9jbGVhci4gYG51bGxgID0gcGFzIGRlIG1lc3NhZ2UuICovXG4gIF9wcmVmZXJlbmNlc01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVnJhaSBzaSB1bmUgY29uZmlndXJhdGlvbiBlc3Qgc2F1dmVnYXJkw6llIHBvdXIgY2UgdGFibGVhdS4gKi9cbiAgX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZWZlcmVuY2VzTWFuYWdlcjogVGFibGVQcmVmZXJlbmNlc01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIHRydWUgdW5lIGZvaXMgcXVlIGxlIGdyb3VwLWJ5IHBhciBkw6lmYXV0IGEgw6l0w6kgaW5pdGlhbGlzw6kgKMOpdml0ZSBkZSByZWNvbmZpZ3VyZXIgR3JvdXBCeU1hbmFnZXIgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgZG9ubsOpZXMpLiAqL1xuICBwcml2YXRlIF9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVzaXplU3RhdGU6IHsga2V5OiBzdHJpbmc7IHN0YXJ0WDogbnVtYmVyOyBzdGFydFdpZHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogRHluYW1pYyBzbGljZSBrZXlzIMOgIHJlc3RhdXJlciBhcHLDqHMgbmdBZnRlclZpZXdJbml0IChzbGljZVBhbmVsUmVmIHBhcyBlbmNvcmUgZGlzcG8pLiAqL1xuICBwcml2YXRlIF9wZW5kaW5nRHluYW1pY1NsaWNlS2V5czogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIEZpbHRyZXMgZGUgc2xpY2Ugw6AgcmVzdGF1cmVyIGFwcsOocyBuZ0FmdGVyVmlld0luaXQgKHNsaWNlUGFuZWxSZWYgcGFzIGVuY29yZSBkaXNwbykuICovXG4gIHByaXZhdGUgX3BlbmRpbmdTbGljZUZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVzb2x2ZWRDb25maWc6IFRhYmxlUHJvdmlkZXI8VD4gPSB7IGNvbHVtbnM6IFtdIH07XG4gIHByaXZhdGUgX2NvbHVtbk1hcDogTWFwPHN0cmluZywgVGFibGVDb2x1bW5Qcm92aWRlcjxUPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3Jlc29sdmVkRGF0YTogVFtdID0gW107XG4gIHByaXZhdGUgX3ByZXNlcnZlUGFnZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdENvbmZpZ0NsZWFyU2VhcmNoSW5wdXQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9pbml0aWFsU2VhcmNoUXVlcnlBcHBsaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2xhc3RJbml0aWFsU2VhcmNoUXVlcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBTZXVpbCBhdS1kZWzDoCBkdXF1ZWwgbGUgcmVuZHUgZ3JvdXDDqSBlc3QgYmxvcXXDqSBwb3VyIHByb3TDqWdlciBsZSBuYXZpZ2F0ZXVyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9HUk9VUF9DT1VOVCA9IDUwMDtcblxuICAvLyDilIDilIAgT3B0aW1pc2F0aW9uIHBlcmZvcm1hbmNlXG4gIHByaXZhdGUgX2FsbEZpbHRlcmVkUm93czogVFtdID0gW107XG4gIHByaXZhdGUgX3BhZ2luYXRvclN1YnNjcmliZWQ6IE1hdFBhZ2luYXRvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBDYWNoZSBncm91cEJ5IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgcm93cy9rZXkvdHJpIGNoYW5nZW50LiAqL1xuICBwcml2YXRlIF9ncm91cENhY2hlOiBHcm91cEJ5Q2FjaGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlbmRlcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfY29uZmlnSGlkZGVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cbiAgLyoqIENsw6lzIGRlcyBjb2xvbm5lcyB2aXNpYmxlcyBkdSBkZXJuaWVyIMOpbWlzc2lvbiBjb2x1bW5zQ2hhbmdlIChwb3VyIMOpdml0ZXIgbGVzIMOpbWlzc2lvbnMgZHVwbGlxdWVtZW50KS4gKi9cbiAgcHJpdmF0ZSBfcHJldkNvbHVtbktleXM6IHN0cmluZ1tdID0gW107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFDaGFuZ2VkID0gISEoY2hhbmdlc1snY29uZmlnJ10gfHwgY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2RhdGFTb3VyY2UnXSk7XG4gICAgaWYgKGRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9sYXp5LmNhbmNlbEFsbCgpO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlDb25maWdTZWFyY2hSZXNldCgpO1xuICAgICAgdGhpcy5hcHBseUluaXRpYWxTZWFyY2hRdWVyeShjaGFuZ2VzWydjb25maWcnXS5maXJzdENoYW5nZSk7XG4gICAgICB0aGlzLl9pbnZhbGlkYXRlT3JnYW5pemVyQ29uZmlnKCk7IC8vIGxlcyBjb2xvbm5lcyBvbnQgcHUgY2hhbmdlclxuICAgIH1cbiAgICBpZiAoZGF0YUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlRmllbGRzLmZpbHRlcihjID0+IGMubGF6eSkuZm9yRWFjaChjID0+IHRoaXMudHJpZ2dlckxhenlGZXRjaChjKSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlYnVpbGRDZWxsRGVmTWFwKCk7XG4gICAgdGhpcy5fY2VsbERlZnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZWJ1aWxkQ2VsbERlZk1hcCgpO1xuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoUGFnaW5hdG9yKCk7XG4gICAgdGhpcy5hdHRhY2hTb3J0KCk7XG4gICAgdGhpcy5fbWVhc3VyZUhlYWRlckhlaWdodCgpO1xuICAgIHRoaXMuX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzUGVuZGluZ0R5bmFtaWMgPSAhIXRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdGaWx0ZXJzID0gISF0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgIGlmICghaGFzUGVuZGluZ0R5bmFtaWMgJiYgIWhhc1BlbmRpbmdGaWx0ZXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxDb2xzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdO1xuICAgIGNvbnN0IGtleXMgPSBoYXNQZW5kaW5nRHluYW1pYyA/IFsuLi50aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyFdIDogW107XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPyB7IC4uLnRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgfSA6IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVzb2x2ZWREYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gbmdBZnRlclZpZXdJbml0OiBkb25uw6llcyBhYnNlbnRlcywgcmVzdGF1cmF0aW9uIGRpZmbDqXLDqWUgw6AgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsJywgeyBrZXlzLCBmaWx0ZXJzIH0pO1xuICAgICAgICBpZiAoZmlsdGVycykgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzID0gWy4uLmtleXNdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gbmdBZnRlclZpZXdJbml0OiBkb25uw6llcyBwcsOpc2VudGVzLCBhcHBsaWNhdGlvbiBpbW3DqWRpYXRlJywgeyBrZXlzLCBmaWx0ZXJzIH0pO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGFsbENvbHMuZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgICAgICBpZiAoY29sKSB0aGlzLmFkZER5bmFtaWNTbGljZShjb2wpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmlsdGVycyAmJiB0aGlzLnNsaWNlUGFuZWxSZWYpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTbGljZVJlc3RvcmVdIHJlc3RvcmVGaWx0ZXJzIGRlcHVpcyBuZ0FmdGVyVmlld0luaXQnLCBmaWx0ZXJzKTtcbiAgICAgICAgdGhpcy5zbGljZVBhbmVsUmVmLnJlc3RvcmVGaWx0ZXJzKGZpbHRlcnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvcHlGZWVkYmFja1RpbWVyICE9PSB1bmRlZmluZWQpIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fY29weUZlZWRiYWNrVGltZXIpO1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyKTtcbiAgICB9XG4gICAgLy8gTmV0dG9pZSB1biDDqXZlbnR1ZWwgcmVzaXplIGVuIGNvdXJzIChsaXN0ZW5lcnMgd2luZG93IG5vbiByZXRpcsOpcylcbiAgICB0aGlzLl9yZXNpemVTdGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fb3JnYW5pemVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIHByaXZhdGUgX21lYXN1cmVIZWFkZXJIZWlnaHQoKTogdm9pZCB7XG4gICAgY29uc3QgbWVhc3VyZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndHIubWF0LW1kYy1oZWFkZXItcm93JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoaGVhZGVyUm93KSB7XG4gICAgICAgIGNvbnN0IGggPSBoZWFkZXJSb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICBpZiAoaCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWFjdHVhbC1oZWFkZXItaGVpZ2h0JywgaCArICdweCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gSGVhZGVyIHBhcyBlbmNvcmUgcmVuZHUgKGV4OiBsYXp5IEFuZ3VsYXIgTWF0ZXJpYWwpLCBvbiByw6llc3NhaWUgYXByw6hzIGxlIHByb2NoYWluIGZyYW1lXG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IG1lYXN1cmUoKSkpO1xuICAgIH07XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBtZWFzdXJlKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX29yZ2FuaXplckNvbmZpZ0NhY2hlOiBPcmdhbml6ZXJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaW52YWxpZGF0ZU9yZ2FuaXplckNvbmZpZygpOiB2b2lkIHsgdGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGUgPSBudWxsOyB9XG4gIGdldCBvcmdhbml6ZXJDb25maWcoKTogT3JnYW5pemVyQ29uZmlnIHtcbiAgICBpZiAodGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGUpIHJldHVybiB0aGlzLl9vcmdhbml6ZXJDb25maWdDYWNoZTtcbiAgICBjb25zdCBhbGxDb2xzID0gWy4uLnRoaXMuX29yZ2FuaXplci5tZW51QmFzZUZpZWxkcywgLi4udGhpcy5fb3JnYW5pemVyLm1lbnVPcHRpb25hbEZpZWxkc107XG4gICAgdGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGUgPSB7XG4gICAgICBmaWVsZHM6IHRoaXMuX29yZ2FuaXplci5zaG93RmllbGRzID8gYWxsQ29scy5tYXAoYyA9PiAoe1xuICAgICAgICBpZDogYy5rZXksXG4gICAgICAgIGxhYmVsOiB0aGlzLmNvbExhYmVsKGMpLFxuICAgICAgICBpY29uOiBjLmljb24sXG4gICAgICAgIHN0YXRlOiAncmVhZHknIGFzIGNvbnN0LFxuICAgICAgfSkpIDogdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBzOiB0aGlzLl9vcmdhbml6ZXIuc2hvd0dyb3VwQnlTZWN0aW9uID8gdGhpcy5fb3JnYW5pemVyLmdyb3VwQnlGaWVsZHMubWFwKGMgPT4gKHtcbiAgICAgICAgaWQ6IGMua2V5LFxuICAgICAgICBsYWJlbDogdGhpcy5jb2xMYWJlbChjKSxcbiAgICAgICAgaWNvbjogYy5pY29uLFxuICAgICAgfSkpIDogdW5kZWZpbmVkLFxuICAgICAgc2xpY2VzOiB0aGlzLl9vcmdhbml6ZXIuc2hvd1NsaWNlQnlTZWN0aW9uID8gdGhpcy5fc2xpY2VCeU1lbnVJdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICBpZDogaXRlbS5rZXksXG4gICAgICAgIGxhYmVsOiBpdGVtLnRpdGxlLFxuICAgICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICB9KSkgOiB1bmRlZmluZWQsXG4gICAgICBzaG93RXhwb3J0OiB0aGlzLnNob3dFeHBvcnRCdXR0b24sXG4gICAgICBvbkV4cG9ydDogKCkgPT4gdGhpcy5vbkV4cG9ydCgpLFxuICAgICAgc2hvd1ByZWZlcmVuY2VzOiB0aGlzLnNob3dQcmVmZXJlbmNlc01lbnUsXG4gICAgICBoYXNTYXZlZFByZWZlcmVuY2VzOiB0aGlzLmhhc1NhdmVkUHJlZmVyZW5jZXMsXG4gICAgICBvblByZWZlcmVuY2VzRWRpdDogKCkgPT4gdGhpcy5lbnRlckVkaXRNb2RlKCksXG4gICAgICBvblByZWZlcmVuY2VzU2F2ZTogKCkgPT4gdGhpcy5zYXZlUHJlZmVyZW5jZXMoKSxcbiAgICAgIG9uUHJlZmVyZW5jZXNDbGVhcjogKCkgPT4gdGhpcy5jbGVhclByZWZlcmVuY2VzKCksXG4gICAgICBzaG93QWN0aW9uczogdGhpcy5yZXNvbHZlZENvbmZpZy5zaG93QWN0aW9ucyA9PT0gdHJ1ZSxcbiAgICAgIG9uQ29weVZpc3VhbDogdGhpcy5yZXNvbHZlZENvbmZpZy5vbkNvcHlWaXN1YWwgPz8gKCgpID0+IHRoaXMuY29weVZpc3VhbFNuYXBzaG90KCkpLFxuICAgICAgb25Ub2dnbGVGdWxsc2NyZWVuOiB0aGlzLnJlc29sdmVkQ29uZmlnLm9uVG9nZ2xlRnVsbHNjcmVlbiA/PyAodGhpcy5mdWxsc2NyZWVuU3VwcG9ydGVkID8gKCkgPT4gdGhpcy50b2dnbGVGdWxsc2NyZWVuKCkgOiB1bmRlZmluZWQpLFxuICAgICAgaXNGdWxsc2NyZWVuOiB0aGlzLl9pc0Z1bGxzY3JlZW4sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGU7XG4gIH1cblxuICBnZXQgb3JnYW5pemVyU3RhdGUoKTogT3JnYW5pemVyU3RhdGUge1xuICAgIHJldHVybiB7XG4gICAgICB2aXNpYmxlRmllbGRzOiB0aGlzLnZpc2libGVDb2x1bW5zLm1hcChjID0+IGMua2V5KSxcbiAgICAgIHNlbGVjdGVkR3JvdXBCeTogdGhpcy5hY3RpdmVHcm91cEJ5S2V5ID8/IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkU2xpY2VzOiB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zXG4gICAgICAgIC5maWx0ZXIoaSA9PiB0aGlzLmlzU2xpY2VNZW51SXRlbUFjdGl2ZShpKSlcbiAgICAgICAgLm1hcChpID0+IGkua2V5KSxcbiAgICB9O1xuICB9XG5cbiAgb25Pcmdhbml6ZXJWaWV3Q2hhbmdlKGV2ZW50OiBPcmdhbml6ZXJCdXR0b25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50eXBlID09PSAnZmllbGRUb2dnbGVkJykge1xuICAgICAgY29uc3QgYWxsQ29scyA9IFsuLi50aGlzLl9vcmdhbml6ZXIubWVudUJhc2VGaWVsZHMsIC4uLnRoaXMuX29yZ2FuaXplci5tZW51T3B0aW9uYWxGaWVsZHNdO1xuICAgICAgY29uc3QgbmV3VmlzaWJsZSA9IG5ldyBTZXQoZXZlbnQuc3RhdGUudmlzaWJsZUZpZWxkcyA/PyBbXSk7XG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBhbGxDb2xzKSB7XG4gICAgICAgIGNvbnN0IGlzTm93VmlzaWJsZSA9IG5ld1Zpc2libGUuaGFzKGNvbC5rZXkpO1xuICAgICAgICBpZiAodGhpcy5pc0NvbHVtblZpc2libGUoY29sLmtleSkgIT09IGlzTm93VmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbCwgaXNOb3dWaXNpYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gJ2dyb3VwQnlTZWxlY3RlZCcpIHtcbiAgICAgIGNvbnN0IG5ld0tleSA9IGV2ZW50LnN0YXRlLnNlbGVjdGVkR3JvdXBCeSA/PyBudWxsO1xuICAgICAgdGhpcy5vbkdyb3VwQnlDaGFuZ2UobmV3S2V5ID09PSB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPyBudWxsIDogbmV3S2V5KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09ICdzbGljZVNlbGVjdGVkJykge1xuICAgICAgY29uc3QgcHJldlNsaWNlcyA9IG5ldyBTZXQodGhpcy5vcmdhbml6ZXJTdGF0ZS5zZWxlY3RlZFNsaWNlcyA/PyBbXSk7XG4gICAgICBjb25zdCBuZXh0U2xpY2VzID0gbmV3IFNldChldmVudC5zdGF0ZS5zZWxlY3RlZFNsaWNlcyA/PyBbXSk7XG4gICAgICBjb25zdCBjbGlja2VkSWQgPSBbLi4ucHJldlNsaWNlc10uZmluZChpZCA9PiAhbmV4dFNsaWNlcy5oYXMoaWQpKVxuICAgICAgICA/PyBbLi4ubmV4dFNsaWNlc10uZmluZChpZCA9PiAhcHJldlNsaWNlcy5oYXMoaWQpKTtcbiAgICAgIGlmIChjbGlja2VkSWQpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3NsaWNlQnlNZW51SXRlbXMuZmluZChpID0+IGkua2V5ID09PSBjbGlja2VkSWQpO1xuICAgICAgICBpZiAoaXRlbSkgdGhpcy5vblNsaWNlTWVudUl0ZW1DbGljayhpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcudGl0bGUgPz8gJyc7XG4gIH1cblxuICBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucmVzb2x2ZWRDb25maWcudGl0bGU7XG4gIH1cblxuICBnZXQgdmlzaWJsZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGaWVsZHM7XG4gIH1cblxuICBnZXQgc2hvd1NlYXJjaEJhcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcuc2VhcmNoPy5lbmFibGVkID09PSB0cnVlOyB9XG4gIGdldCBzaG93Vmlld0J1dHRvbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5lbmFibGVkIHx8IHRoaXMuc2hvd0V4cG9ydEJ1dHRvbiB8fCB0aGlzLnNob3dQcmVmZXJlbmNlc01lbnU7IH1cbiAgZ2V0IHNob3dPcmdhbml6ZXJCdXR0b24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuZW5hYmxlZCB8fCB0aGlzLnNob3dFeHBvcnRCdXR0b24gfHwgdGhpcy5zaG93UHJlZmVyZW5jZXNNZW51OyB9XG4gIGdldCBzaG93U2xpY2VFeHBhbmRCdG4oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zaG93U2xpY2VQYW5lbCAmJiB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkICYmIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZTsgfVxuICBnZXQgc2hvd0V4cG9ydEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5leHBvcnQ/LmVuYWJsZWQgPT09IHRydWU7XG4gIH1cbiAgZ2V0IHNob3dQcmVmZXJlbmNlc01lbnUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXM/LmVuYWJsZWQgPT09IHRydWU7XG4gIH1cblxuICBnZXQgaXNEZWZhdWx0R3JvdXBCeUFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlR3JvdXBCeUtleSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPT09IHRoaXMucmVzb2x2ZWRDb25maWcuZGVmYXVsdEdyb3VwQnk7XG4gIH1cblxuICBnZXQgaGFzU2F2ZWRQcmVmZXJlbmNlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hhc1NhdmVkQ29uZmlnOyB9XG5cbiAgZ2V0IHNob3dUb29sYmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zaG93U2VhcmNoQmFyIHx8IHRoaXMuc2hvd1ZpZXdCdXR0b24gfHwgdGhpcy5zaG93U2xpY2VFeHBhbmRCdG47IH1cbiAgZ2V0IGZ1bGxzY3JlZW5TdXBwb3J0ZWQoKTogYm9vbGVhbiB7IHJldHVybiBGdWxsc2NyZWVuTWFuYWdlci5pc1N1cHBvcnRlZCh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KTsgfVxuXG4gIGFzeW5jIHRvZ2dsZUZ1bGxzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IEZ1bGxzY3JlZW5NYW5hZ2VyLnRvZ2dsZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuX2lzRnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9pbnZhbGlkYXRlT3JnYW5pemVyQ29uZmlnKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIENyw6llIHVuIHNuYXBzaG90IGF1dG9ub21lIGV0IGxlIHBsYWNlIGRhbnMgbGUgc3RvY2thZ2UgcGFydGFnw6kuICovXG4gIGNvcHlWaXN1YWxTbmFwc2hvdChsYWJlbD86IHN0cmluZyk6IFZpc3VhbFNuYXBzaG90IHwgbnVsbCB7XG4gICAgY29uc3Qgc25hcHNob3RMYWJlbCA9IGxhYmVsID8/ICh0aGlzLnRpdGxlIHx8ICdUYWJsZWF1Jyk7XG4gICAgaWYgKCFzbmFwc2hvdExhYmVsPy50cmltKCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFZpc3VhbFNuYXBzaG90U3RvcmFnZSgpLmNyZWF0ZSh0aGlzLmNyZWF0ZVZpc3VhbFNuYXBzaG90KHNuYXBzaG90TGFiZWwudHJpbSgpKSk7XG4gICAgdGhpcy52aXN1YWxDb3BpZWQuZW1pdChzbmFwc2hvdCk7XG4gICAgdGhpcy5zaG93Q29weUZlZWRiYWNrKCk7XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q29weUZlZWRiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvcHlGZWVkYmFjay5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgIHRoaXMuY29weUZlZWRiYWNrTWVzc2FnZSA9IHRoaXMuY29weUZlZWRiYWNrLm1lc3NhZ2UgfHwgJ0NvcGnDqSc7XG4gICAgaWYgKHRoaXMuX2NvcHlGZWVkYmFja1RpbWVyICE9PSB1bmRlZmluZWQpIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fY29weUZlZWRiYWNrVGltZXIpO1xuICAgIHRoaXMuX2NvcHlGZWVkYmFja1RpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb3B5RmVlZGJhY2tNZXNzYWdlID0gJycsIHRoaXMuY29weUZlZWRiYWNrLmR1cmF0aW9uTXMgPz8gMjIwMCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpmdWxsc2NyZWVuY2hhbmdlJylcbiAgb25GdWxsc2NyZWVuQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRnVsbHNjcmVlbiA9IEZ1bGxzY3JlZW5NYW5hZ2VyLmlzQWN0aXZlKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuX2ludmFsaWRhdGVPcmdhbml6ZXJDb25maWcoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBleHBhbmRTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8udG9nZ2xlUGFuZWwoKTtcbiAgfVxuICBnZXQgc2hvd0ZpZWxkcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zaG93RmllbGRzOyB9XG4gIGdldCBzaG93R3JvdXBCeVNlY3Rpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2hvd0dyb3VwQnlTZWN0aW9uOyB9XG5cbiAgZ2V0IGZpbHRlcmVkUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVHcm91cEJ5S2V5ID8gdGhpcy5fdG90YWxGaWx0ZXJlZENvdW50IDogdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBhY3RpdmVHcm91cEJ5TGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5hY3RpdmVHcm91cEJ5TGFiZWw7IH1cblxuICBnZXQgdG90YWxDb2x1bW5Db3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnRvdGFsRmllbGRDb3VudDsgfVxuXG4gIGdldCBhY3RpdmVTbGljZUJ5TGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUxhYmVsOyB9XG5cbiAgZ2V0IGFjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNGaWVsZHM7IH1cblxuICByZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8ucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoa2V5KTtcbiAgfVxuXG4gIGdldCBncm91cEJ5Q29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmdyb3VwQnlGaWVsZHM7IH1cblxuICBjb2xMYWJlbChjb2w6IHsga2V5OiBzdHJpbmc7IGhlYWRlcj86IHN0cmluZyB9KTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5maWVsZExhYmVsKGNvbCk7IH1cblxuICBvblNlYXJjaENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgdGhpcy5wYWdpbmF0b3I/LmZpcnN0UGFnZSgpO1xuICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hRdWVyeSk7XG4gIH1cblxuICBvbkdyb3VwQnlDaGFuZ2Uoa2V5OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fb3JnYW5pemVyLnNldEdyb3VwQnkoa2V5KTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoa2V5ICE9PSBudWxsKTtcbiAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5ncm91cEJ5Q2hhbmdlLmVtaXQoa2V5KTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoY29sRGVmPy5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGtleSkgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2xEZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9LCAwKSk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkub25Hcm91cFBhZ2VTaXplQ2hhbmdlKE51bWJlcihzaXplKSk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5vbkdyb3VwU29ydFRvZ2dsZShkaXIsIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXp5Q29sdW1uU3RhdHVzKGtleTogc3RyaW5nKTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InIHtcbiAgICByZXR1cm4gdGhpcy5fbGF6eS5nZXRTdGF0dXMoa2V5KTtcbiAgfVxuXG4gIGdldExhenlSZW5kZXJUeXBlKHJvd1ZhbHVlOiBhbnkpOiAnbG9hZGluZycgfCAnZXJyb3InIHwgJ3ZhbHVlJyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhenkuZ2V0UmVuZGVyVHlwZShyb3dWYWx1ZSk7XG4gIH1cblxuICByZXRyeUxhenlDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fbGF6eS5yZXRyeShjb2x1bW4sIHRoaXMuX3Jlc29sdmVkRGF0YSwgdGhpcy5fbGF6eUNhbGxiYWNrcygpKTtcbiAgfVxuXG4gIHRyaWdnZXJMYXp5RmV0Y2goY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fbGF6eS5mZXRjaChjb2x1bW4sIHRoaXMuX3Jlc29sdmVkRGF0YSwgdGhpcy5fbGF6eUNhbGxiYWNrcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xhenlDYWxsYmFja3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4gdGhpcy5yZWZyZXNoVmlld01vZGVsKCksXG4gICAgICBvbk1hcmtGb3JDaGVjazogKCkgPT4gdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpLFxuICAgIH07XG4gIH1cblxuICB0b2dnbGVHcm91cENvbGxhcHNlKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5LnRvZ2dsZUdyb3VwQ29sbGFwc2UoZ3JvdXBLZXksIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvR3JvdXBIZWFkZXIoZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3Qgcm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0cltkYXRhLWdyb3VwLWtleT1cIiR7Q1NTLmVzY2FwZShncm91cEtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUZsb2F0KFxuICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLWFjdHVhbC1oZWFkZXItaGVpZ2h0JykgfHwgJzU2J1xuICAgICkgfHwgNTY7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByb3dSZWN0ID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGN1cnJlbnRTY3JvbGxUb3AgKyAocm93UmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCkgLSBoZWFkZXJIZWlnaHQ7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHsgdG9wOiB0YXJnZXRTY3JvbGxUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfVxuXG4gIGlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEJ5LmlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXkpO1xuICB9XG5cbiAgZ3JvdXBQYWdlQmFjayhncm91cEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VCYWNrKGdyb3VwS2V5KTtcbiAgfVxuXG4gIGdyb3VwUGFnZUZvcndhcmQoZ3JvdXBLZXk6IHN0cmluZywgdG90YWxDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VGb3J3YXJkKGdyb3VwS2V5LCB0b3RhbENvdW50KTtcbiAgfVxuXG4gIGdldCBoYXNBZGRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLm1lbnVCYXNlRmllbGRzLmxlbmd0aCA+IDAgfHwgdGhpcy5fb3JnYW5pemVyLm1lbnVPcHRpb25hbEZpZWxkcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IG1lbnVCYXNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIubWVudUJhc2VGaWVsZHM7XG4gIH1cblxuICBnZXQgbWVudU9wdGlvbmFsQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIubWVudU9wdGlvbmFsRmllbGRzO1xuICB9XG5cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnNUb0FkZCgpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSBuZXcgU2V0KHRoaXMuYWN0aXZlRmllbGRzLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KSk7XG4gICAgcmV0dXJuICh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4gYy5vcHRpb25hbCAmJiAhYWN0aXZlS2V5cy5oYXMoYy5rZXkpKTtcbiAgfVxuXG4gIGdldCBhbGxvd0NvbHVtblJlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5hbGxvd0ZpZWxkUmVtb3ZhbDtcbiAgfVxuXG4gIGdldCBoYXNTbGljZUNvbmZpZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgZ2V0IHNob3dTbGljZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgfVxuXG4gIG9uU2xpY2VQYW5lbENvbGxhcHNlZENoYW5nZShjb2xsYXBzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc1BlbmRpbmdEeW5hbWljU2xpY2VzID0gKHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzPy5sZW5ndGggPz8gMCkgPiAwO1xuICAgIGNvbnN0IGhhc0NmZyA9IHRoaXMuX3NsaWNlQ29uZmlncy5sZW5ndGggPiAwXG4gICAgICB8fCB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hY3RpdmVEeW5hbWljRmllbGRzLmxlbmd0aCA+IDBcbiAgICAgIHx8IGhhc1BlbmRpbmdEeW5hbWljU2xpY2VzO1xuICAgIGNvbnN0IHdhc1Zpc2libGUgPSB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgICB0aGlzLl9zaG93U2xpY2VQYW5lbCA9IGhhc0NmZyAmJiB0aGlzLl9yZXNvbHZlZERhdGEubGVuZ3RoID4gMDtcbiAgICAvLyBMZXMgZG9ubsOpZXMgdmllbm5lbnQgZCdhcnJpdmVyIDogYXBwbGlxdWVyIGxlcyBkeW5hbWljIHNsaWNlcyBldCBsZXMgZmlsdHJlcyBlbiBhdHRlbnRlLlxuICAgIC8vIExlcyBzbGljZXMgZHluYW1pcXVlcyBzb250IGFqb3V0w6llcyBhdmFudCBsZXMgZmlsdHJlcyBwb3VyIHJlbmRyZSBsZXVycyBjbMOpcyBkaXNwb25pYmxlcy5cbiAgICBpZiAoIXdhc1Zpc2libGUgJiYgdGhpcy5fc2hvd1NsaWNlUGFuZWwgJiYgKHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgfHwgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMpKSB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycztcbiAgICAgIGNvbnN0IGR5bmFtaWNLZXlzID0gdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXM7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gbnVsbDtcbiAgICAgIHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzID0gbnVsbDtcbiAgICAgIGNvbnN0IGFsbENvbHMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsOiBkb25uw6llcyBhcnJpdsOpZXMnLCB7IGR5bmFtaWNLZXlzLCBmaWx0ZXJzIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChkeW5hbWljS2V5cykge1xuICAgICAgICAgIGR5bmFtaWNLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGFsbENvbHMuZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgICAgICAgICAgaWYgKGNvbCkgdGhpcy5hZGREeW5hbWljU2xpY2UoY29sKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVycyAmJiB0aGlzLnNsaWNlUGFuZWxSZWYpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gcmVzdG9yZUZpbHRlcnMgZGVwdWlzIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCcsIGZpbHRlcnMpO1xuICAgICAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZi5yZXN0b3JlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd0FkZFNsaWNlQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2hvd1NsaWNlQnlTZWN0aW9uO1xuICB9XG5cbiAgZ2V0IHN0YXRpY1NsaWNlc0Zvck1lbnUoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgaWNvbj86IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zdGF0aWNTbGljZXNGb3JNZW51O1xuICB9XG5cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnNGb3JEeW5hbWljU2xpY2UoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYXZhaWxhYmxlRm9yRHluYW1pYztcbiAgfVxuXG4gIGlzU3RhdGljU2xpY2VWaXNpYmxlKGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMuaGFzKGNvbHVtbktleSk7XG4gIH1cblxuICB0b2dnbGVTdGF0aWNTbGljZShjb2x1bW5LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG4gICAgaWYgKG5leHQuaGFzKGNvbHVtbktleSkpIG5leHQuZGVsZXRlKGNvbHVtbktleSk7XG4gICAgZWxzZSBuZXh0LmFkZChjb2x1bW5LZXkpO1xuICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5leHQ7XG4gICAgdGhpcy5fb3JnYW5pemVyLnVwZGF0ZUhpZGRlblN0YXRpY0tleXModGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzKTtcbiAgICB0aGlzLl9zbGljZUNvbmZpZ3MgPSB0aGlzLl9jb21wdXRlU2xpY2VDb25maWdzKCk7XG4gICAgLy8gU2kgdW5lIHNsaWNlIHZpZW50IGQnw6p0cmUgY2FjaMOpZSwgcsOpaW5pdGlhbGlzZSBsZSBmaWx0cmUgYWN0aWYgcG91ciDDqXZpdGVyXG4gICAgLy8gdW4gZmlsdHJlIG9ycGhlbGluIChsYSBzbGljZSBuJ2VzdCBwbHVzIHZpc2libGUgbWFpcyBzb24gZmlsdHJlIHJlc3RlcmFpdCBhY3RpZilcbiAgICBpZiAobmV4dC5oYXMoY29sdW1uS2V5KSkge1xuICAgICAgdGhpcy5hY3RpdmVTbGljZUZpbHRlciA9ICgpID0+IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBhZGREeW5hbWljU2xpY2UoY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBhbmVsUmVmPy5hZGREeW5hbWljU2xpY2UoY29sdW1uKTtcbiAgICBpZiAoY29sdW1uLmxhenkgJiYgdGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoY29sdW1uLmtleSkgIT09ICdsb2FkZWQnKSB7XG4gICAgICB0aGlzLnRyaWdnZXJMYXp5RmV0Y2goY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWxsRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9hbGxEeW5hbWljU2xpY2VDb2x1bW5zO1xuICB9XG5cbiAgaXNEeW5hbWljU2xpY2VBY3RpdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmlzRHluYW1pY1NsaWNlQWN0aXZlKGtleSk7XG4gIH1cblxuICB0b2dnbGVEeW5hbWljU2xpY2UoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEeW5hbWljU2xpY2VBY3RpdmUoY29sLmtleSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgfVxuICB9XG5cbiAgb25TbGljZUZpbHRlckNoYW5nZShwcmVkOiAocm93OiBUKSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVTbGljZUZpbHRlciA9IHByZWQ7XG4gICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgfVxuXG4gIG9uRHluYW1pY1NsaWNlS2V5c0NoYW5nZShrZXlzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX29yZ2FuaXplci5vbkR5bmFtaWNTbGljZUtleXNDaGFuZ2Uoa2V5cyk7XG4gICAgdGhpcy5fcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgZW1wdHlTdGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcubGFiZWxzPy5lbXB0eSB8fCB0aGlzLmkxOG4uZW1wdHlTdGF0ZTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nU3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmxhYmVscz8ubG9hZGluZyB8fCB0aGlzLmkxOG4ubG9hZGluZ1N0YXRlO1xuICB9XG5cbiAgZ2V0IGVmZmVjdGl2ZUlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmc7XG4gIH1cblxuICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAvLyBfcGVuZGluZ1JlbmRlciA6IGxlIHJlbmR1IGludGVybmUgbidlc3QgcGFzIGVuY29yZSB0ZXJtaW7DqSDihpIgcGFzIGRlIG1lc3NhZ2UgdmlkZSBwcsOpbWF0dXLDqVxuICAgIHJldHVybiAhdGhpcy5pc0xvYWRpbmcgJiYgdGhpcy5fcGVuZGluZ1JlbmRlciA9PT0gbnVsbCAmJiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgZ2V0IHNob3dQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5lbmFibGVkICE9PSBmYWxzZTtcbiAgfVxuXG4gIGdldCByZXNvbHZlZFBhZ2luYXRpb25TaG93Rmlyc3RMYXN0QnV0dG9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5zaG93Rmlyc3RMYXN0QnV0dG9ucyAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5pc0ZpZWxkRHJhZ0Ryb3BFbmFibGVkO1xuICB9XG5cbiAgZ2V0IHRvdGFsUm93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXlcbiAgICAgID8gdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YS5maWx0ZXIoKHIpID0+ICFyW0dST1VQX0hFQURFUl9NQVJLRVJdKS5sZW5ndGhcbiAgICAgIDogdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBHZXN0aW9uIGRlcyBjb2xvbm5lc1xuXG4gIG9uQWRkQ29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX29yZ2FuaXplci5hZGRGaWVsZChjb2x1bW4pO1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gdGhpcy5wYWdpbmF0b3I/LnBhZ2VJbmRleCA/PyBudWxsO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuXG4gICAgaWYgKGNvbHVtbi5sYXp5KSB7XG4gICAgICB0aGlzLnRyaWdnZXJMYXp5RmV0Y2goY29sdW1uKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFJlcXVlc3RlZC5lbWl0KCk7XG4gICAgdGhpcy5jb2x1bW5BZGRlZC5lbWl0KGNvbHVtbik7XG4gIH1cblxuICBvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UoY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+LCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaXNWaXNpYmxlID0gdGhpcy5fb3JnYW5pemVyLmlzRmllbGRWaXNpYmxlKGNvbHVtbi5rZXkpO1xuXG4gICAgaWYgKGNoZWNrZWQgJiYgIWlzVmlzaWJsZSkge1xuICAgICAgdGhpcy5vbkFkZENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hlY2tlZCAmJiBpc1Zpc2libGUpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl9vcmdhbml6ZXIucmVtb3ZlRmllbGQoY29sdW1uLmtleSk7XG4gICAgICBpZiAoIXJlbW92ZWQpIHJldHVybjtcbiAgICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gdGhpcy5wYWdpbmF0b3I/LnBhZ2VJbmRleCA/PyBudWxsO1xuICAgICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgICB0aGlzLmNvbHVtblJlbW92ZWQuZW1pdChjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29sdW1uVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpZWxkcy5zb21lKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gIH1cblxuICBvblJlbW92ZUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmFjdGl2ZUZpZWxkcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKCFjb2x1bW4pIHJldHVybjtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fb3JnYW5pemVyLnJlbW92ZUZpZWxkKGNvbHVtbktleSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm47XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgdGhpcy5jb2x1bW5SZW1vdmVkLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWduZXNcblxuICBwcml2YXRlIF9yZWJ1aWxkQ2VsbERlZk1hcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jZWxsRGVmTWFwID0gbmV3IE1hcChcbiAgICAgICh0aGlzLl9jZWxsRGVmcyA/PyBbXSkubWFwKGQgPT4gW2QuY29sdW1uS2V5LCBkLnRlbXBsYXRlXSBhcyBbc3RyaW5nLCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogYW55OyBpbmRleDogbnVtYmVyIH0+XSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2VsbFRlbXBsYXRlKGtleTogc3RyaW5nKTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jZWxsRGVmTWFwLmdldChrZXkpID8/IG51bGw7XG4gIH1cblxuICBnZXQgaGFzQ3VzdG9tQ2VsbERlZnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxEZWZNYXAuc2l6ZSA+IDA7XG4gIH1cblxuICBnZXQgaGFzUm93Q2xpY2tIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGVkLm9ic2VydmVkIHx8ICEhdGhpcy5yZXNvbHZlZENvbmZpZy5vblJvd1NlbGVjdGVkO1xuICB9XG5cbiAgLyoqIExhcmdldXIgbWluaW1hbGUgZHUgdGFibGVhdSBlbiBweCwgY2FsY3Vsw6llIGRlcHVpcyBsZXMgbGFyZ2V1cnMgZXhwbGljaXRlcyBkZXMgY29sb25uZXMgYWN0aXZlcy5cbiAgICogUmV0b3VybmUgbnVsbCBzaSBhdWN1bmUgY29sb25uZSBuJ2EgZGUgbGFyZ2V1ciBkw6lmaW5pZSAobGUgdGFibGVhdSByZW1wbGl0IGFsb3JzIDEwMCUgZHUgY29udGVuZXVyKS5cbiAgICogU2V1bGVzIGxlcyB2YWxldXJzIGV4cGxpY2l0ZW1lbnQgZW4gYHB4YCBzb250IHNvbW1hYmxlcyA7IGxlcyBwb3VyY2VudGFnZXMgb3UgYXV0cmVzIHVuaXTDqXMgc29udCBpZ25vcsOpcy4gKi9cbiAgZ2V0IHRhYmxlTWluV2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGFzUmVzaXplZCA9IE9iamVjdC5rZXlzKHRoaXMuX2NvbHVtbldpZHRocykubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNTb21lRXhwbGljaXRXaWR0aCA9IGhhc1Jlc2l6ZWQgfHwgdGhpcy5hY3RpdmVGaWVsZHMuc29tZShjID0+IGMud2lkdGgpO1xuICAgIGlmICghaGFzU29tZUV4cGxpY2l0V2lkdGgpIHJldHVybiBudWxsO1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuYWN0aXZlRmllbGRzKSB7XG4gICAgICBpZiAodGhpcy5fY29sdW1uV2lkdGhzW2NvbC5rZXldICE9IG51bGwpIHtcbiAgICAgICAgc3VtICs9IHRoaXMuX2NvbHVtbldpZHRoc1tjb2wua2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoY29sLndpZHRoKSB7XG4gICAgICAgIGNvbnN0IGlzUHggPSBjb2wud2lkdGgudHJpbSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJ3B4Jyk7XG4gICAgICAgIGNvbnN0IHB4ID0gTnVtYmVyLnBhcnNlRmxvYXQoY29sLndpZHRoKTtcbiAgICAgICAgaWYgKGlzUHggJiYgIU51bWJlci5pc05hTihweCkpIHsgc3VtICs9IHB4OyB9XG4gICAgICAgIGVsc2UgeyBzdW0gKz0gMTUwOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdW0gKz0gMTIwOyAvLyBsYXJnZXVyIG1pbmltYWxlIGVzdGltw6llIHBvdXIgdW5lIGNvbG9ubmUgc2FucyBsYXJnZXVyIGV4cGxpY2l0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VtICsgJ3B4JztcbiAgfVxuXG4gIHRyYWNrUm93Rm4gPSAoX2luZGV4OiBudW1iZXIsIHJvdzogYW55KTogYW55ID0+XG4gICAgcm93W0dST1VQX0hFQURFUl9NQVJLRVJdID8gYF9fZ3JvdXBfJHtyb3dbUk9XX0dST1VQX0tFWV19YCA6IHJvd1tST1dfSU5ERVhfS0VZXSA/PyBfaW5kZXg7XG5cbiAgZ2V0Um93Q2xhc3Mocm93OiBhbnkpOiBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucmVzb2x2ZWRDb25maWcucm93Q2xhc3M7XG4gICAgaWYgKCFmbiB8fCByb3c/LltHUk9VUF9IRUFERVJfTUFSS0VSXSkgcmV0dXJuIHt9O1xuICAgIHJldHVybiBmbihyb3dbUk9XX1JBV19LRVldID8/IHJvdywgcm93W1JPV19JTkRFWF9LRVldID8/IDApO1xuICB9XG5cbiAgb25Sb3dDbGljayhyb3c6IGFueSwgZXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHJvdz8uW0dST1VQX0hFQURFUl9NQVJLRVJdKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmhhc1Jvd0NsaWNrSGFuZGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IHJlc29sdmVkID0gKHJvdz8uW1JPV19SQVdfS0VZXSA/PyByb3cpIGFzIFQ7XG4gICAgdGhpcy5yZXNvbHZlZENvbmZpZy5vblJvd1NlbGVjdGVkPy4ocmVzb2x2ZWQsIGV2ZW50KTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQocmVzb2x2ZWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERyYWcgJiBkcm9wXG5cbiAgb25IZWFkZXJEcmFnU3RhcnQoY29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgJiYgIXRoaXMuX2VkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gY29sdW1uS2V5O1xuICAgIHRoaXMuZHJhZ092ZXJDb2x1bW5LZXkgPSBudWxsO1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCBjb2x1bW5LZXkpO1xuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyRHJhZ092ZXIoY29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoKCF0aGlzLmlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkICYmICF0aGlzLl9lZGl0TW9kZSkgfHwgIXRoaXMuZHJhZ2dlZENvbHVtbktleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnT3ZlckNvbHVtbktleSA9IGNvbHVtbktleTtcbiAgfVxuXG4gIG9uSGVhZGVyRHJvcCh0YXJnZXRDb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICgoIXRoaXMuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgJiYgIXRoaXMuX2VkaXRNb2RlKSB8fCAhdGhpcy5kcmFnZ2VkQ29sdW1uS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IG1vdmVkID0gdGhpcy5fb3JnYW5pemVyLnJlb3JkZXJGaWVsZHModGhpcy5kcmFnZ2VkQ29sdW1uS2V5LCB0YXJnZXRDb2x1bW5LZXkpO1xuICAgIGlmICghbW92ZWQpIHtcbiAgICAgIHRoaXMub25IZWFkZXJEcmFnRW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgdGhpcy5vbkhlYWRlckRyYWdFbmQoKTtcbiAgfVxuXG4gIG9uSGVhZGVyRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBudWxsO1xuICAgIHRoaXMuZHJhZ092ZXJDb2x1bW5LZXkgPSBudWxsO1xuICB9XG5cbiAgaXNIZWFkZXJEcm9wVGFyZ2V0KGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICYmIHRoaXMuZHJhZ092ZXJDb2x1bW5LZXkgPT09IGNvbHVtbktleSAmJiB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgIT09IGNvbHVtbktleTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcsOpZsOpcmVuY2VzIDogbW9kZSDDqWRpdGlvblxuXG4gIGVudGVyRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdE1vZGUgPSB0cnVlO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG51bGw7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY29uZmlybUVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIETDqW1hcnJlIGxlIHJlc2l6ZSBkJ3VuZSBjb2xvbm5lIChtb3VzZWRvd24gc3VyIGxhIHBvaWduw6llIGRyb2l0ZSkuICovXG4gIG9uUmVzaXplU3RhcnQoY29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lZGl0TW9kZSkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB0aCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ3RoJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGgpIHJldHVybjtcblxuICAgIGNvbnN0IHNjcm9sbEVsID0gdGhpcy50YWJsZUJvZHlTY3JvbGxSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHNjcm9sbEVsKSB7XG4gICAgICBjb25zdCBhbGxUaCA9IHNjcm9sbEVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCd0aC5tYXQtbWRjLWhlYWRlci1jZWxsJyk7XG4gICAgICBhbGxUaC5mb3JFYWNoKHRoRWwgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aEVsLmdldEF0dHJpYnV0ZSgnbWF0LWNvbHVtbi1oZWFkZXInKSB8fCB0aEVsLmdldEF0dHJpYnV0ZSgnbWF0LXNvcnQtaGVhZGVyJykgfHwgJyc7XG4gICAgICAgIGNvbnN0IGNvbENsYXNzID0gQXJyYXkuZnJvbSh0aEVsLmNsYXNzTGlzdCkuZmluZChjID0+IGMuc3RhcnRzV2l0aCgnbWF0LWNvbHVtbi0nKSk7XG4gICAgICAgIGNvbnN0IGNvbEtleSA9IGNvbENsYXNzID8gY29sQ2xhc3MucmVwbGFjZSgnbWF0LWNvbHVtbi0nLCAnJykgOiBudWxsO1xuICAgICAgICBpZiAoY29sS2V5ICYmIHRoaXMuX2NvbHVtbldpZHRoc1tjb2xLZXldID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aHMgPSB7IC4uLnRoaXMuX2NvbHVtbldpZHRocywgW2NvbEtleV06IHRoRWwub2Zmc2V0V2lkdGggfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzaXplU3RhdGUgPSB7IGtleTogY29sdW1uS2V5LCBzdGFydFg6IGV2ZW50LmNsaWVudFgsIHN0YXJ0V2lkdGg6IHRoLm9mZnNldFdpZHRoIH07XG5cbiAgICBjb25zdCBvbk1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9yZXNpemVTdGF0ZSkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVsdGEgPSBlLmNsaWVudFggLSB0aGlzLl9yZXNpemVTdGF0ZS5zdGFydFg7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KDYwLCB0aGlzLl9yZXNpemVTdGF0ZS5zdGFydFdpZHRoICsgZGVsdGEpO1xuICAgICAgdGhpcy5fY29sdW1uV2lkdGhzID0geyAuLi50aGlzLl9jb2x1bW5XaWR0aHMsIFt0aGlzLl9yZXNpemVTdGF0ZS5rZXldOiBuZXdXaWR0aCB9O1xuICAgICAgLy8gZGV0ZWN0Q2hhbmdlcygpIHBvdXIgZm9yY2VyIGxhIG1pc2Ugw6Agam91ciBpbW3DqWRpYXRlIGVuIG1vZGUgT25QdXNoXG4gICAgICAvLyAobGVzIGxpc3RlbmVycyB3aW5kb3cgdG91cm5lbnQgaG9ycyB6b25lIEFuZ3VsYXIgYXZlYyBydW5PdXRzaWRlQW5ndWxhcilcbiAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uVXAgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9yZXNpemVTdGF0ZSA9IG51bGw7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgfTtcblxuICAgIC8vIExpc3RlbmVycyBob3JzIHpvbmUgQW5ndWxhciBwb3VyIMOpdml0ZXIgZGVzIGN5Y2xlcyBDRCDDoCBjaGFxdWUgbW91c2Vtb3ZlXG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXRvdXJuZSBsYSBsYXJnZXVyIENTUyBkJ3VuZSBjb2xvbm5lIChweCBzaSBwZXJzb25uYWxpc8OpZSwgc2lub24gbGEgdmFsZXVyIGRlIGNvbmZpZyBvdSBhdXRvKS4gKi9cbiAgZ2V0Q29sdW1uV2lkdGgoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9jb2x1bW5XaWR0aHNba2V5XSAhPSBudWxsKSByZXR1cm4gdGhpcy5fY29sdW1uV2lkdGhzW2tleV0gKyAncHgnO1xuICAgIGNvbnN0IGNvbCA9IHRoaXMuX2NvbHVtbk1hcC5nZXQoa2V5KTtcbiAgICByZXR1cm4gY29sPy53aWR0aCA/PyAnYXV0byc7XG4gIH1cblxuICAvLyDilIDilIAgUHLDqWbDqXJlbmNlcyA6IHNhdmUgLyBjbGVhclxuXG4gIHNhdmVQcmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR5bmFtaWNTbGljZUtleXMgPSB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hY3RpdmVEeW5hbWljRmllbGRzLm1hcChjID0+IGMua2V5KTtcbiAgICBjb25zdCBjb25maWc6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyA9IHtcbiAgICAgIHNlYXJjaDogICAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgfHwgdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBCeTogICAgICAgICAgICAgdGhpcy5hY3RpdmVHcm91cEJ5S2V5LFxuICAgICAgY29sdW1uT3JkZXI6ICAgICAgICAgdGhpcy5hY3RpdmVGaWVsZHMubWFwKGMgPT4gYy5rZXkpLFxuICAgICAgdmlzaWJsZUNvbHVtbnM6ICAgICAgdGhpcy5hY3RpdmVGaWVsZHMubWFwKGMgPT4gYy5rZXkpLFxuICAgICAgY29sdW1uV2lkdGhzOiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fY29sdW1uV2lkdGhzKS5sZW5ndGggPyB7IC4uLnRoaXMuX2NvbHVtbldpZHRocyB9IDogdW5kZWZpbmVkLFxuICAgICAgc2xpY2VQYW5lbENvbGxhcHNlZDogdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCxcbiAgICAgIGhpZGRlblNsaWNlS2V5czogICAgIFsuLi50aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXNdLFxuICAgICAgZHluYW1pY1NsaWNlS2V5czogICAgZHluYW1pY1NsaWNlS2V5cy5sZW5ndGggPyBkeW5hbWljU2xpY2VLZXlzIDogdW5kZWZpbmVkLFxuICAgICAgc2xpY2VGaWx0ZXJzOiAgICAgICAgdGhpcy5zbGljZVBhbmVsUmVmID8gdGhpcy5zbGljZVBhbmVsUmVmLmdldEFjdGl2ZUZpbHRlcnMoKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5zYXZlKGNvbmZpZyk7XG4gICAgdGhpcy5faGFzU2F2ZWRDb25maWcgPSB0cnVlO1xuICAgIHRoaXMuX3Nob3dQcmVmZXJlbmNlc01lc3NhZ2UodGhpcy5pMThuLnByZWZlcmVuY2VzU2F2ZWRNZXNzYWdlKTtcbiAgfVxuXG4gIGNsZWFyUHJlZmVyZW5jZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIpIHJldHVybjtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIuY2xlYXIoKTtcbiAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IGZhbHNlO1xuXG4gICAgLy8gQ2FwdHVyZXIgbGVzIGR5bmFtaWMgc2xpY2VzIGFjdGl2ZXMgQVZBTlQgbGUgcmVzZXQgKHJlc2V0VG9EZWZhdWx0cygpIGxlcyB2aWRlKVxuICAgIGNvbnN0IGR5bmFtaWNTbGljZXNUb1JlbW92ZSA9IHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNGaWVsZHMuc2xpY2UoKTtcblxuICAgIC8vIFJlc2V0IGNvbXBsZXQgZGUgbCfDqXRhdCB2ZXJzIGxlcyB2YWxldXJzIHBhciBkw6lmYXV0IGRlIGxhIGNvbmZpZ1xuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcbiAgICB0aGlzLl9jb2x1bW5XaWR0aHMgPSB7fTtcbiAgICB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gZmFsc2U7XG4gICAgLy8gU3luY2hyb25pc2VyIGwnw6l0YXQgaW50ZXJuZSBkdSBzbGljZS1wYW5lbCA6IHNpIGxlIGNvbXBvc2FudCBlc3QgZW4gw6l0YXQgY29sbGFwc2VkXG4gICAgLy8gKGwndXRpbGlzYXRldXIgbCdhdmFpdCBmZXJtw6kgYXByw6hzIGxhIHNhdXZlZ2FyZGUpLCBsZSByb3V2cmlyIGV4cGxpY2l0ZW1lbnQgcG91clxuICAgIC8vIMOpdml0ZXIgcXVlIGRpc3BsYXk6bm9uZSBzb2l0IHJldGlyw6kgbWFpcyBxdWUgaXNDb2xsYXBzZWQgaW50ZXJuZSByZXN0ZSDDoCB0cnVlLlxuICAgIGlmICh0aGlzLnNsaWNlUGFuZWxSZWY/LmlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLnNsaWNlUGFuZWxSZWYudG9nZ2xlUGFuZWwoKTtcbiAgICB9XG4gICAgdGhpcy5fZ3JvdXBCeS5yZXNldCgpO1xuICAgIHRoaXMuX2dyb3VwQnkuc2V0RGVmYXVsdENvbGxhcHNlZChmYWxzZSk7XG5cbiAgICAvLyBTbGljZXMgc3RhdGlxdWVzIDogcmV2ZW5pciBhdXggc2V1bGVzIGNlbGxlcyBjYWNow6llcyBwYXIgbGEgY29uZmlnIChwYXMgcGFyIGwndXRpbGlzYXRldXIpXG4gICAgdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzID0gbmV3IFNldCh0aGlzLl9jb25maWdIaWRkZW5LZXlzKTtcbiAgICB0aGlzLl9vcmdhbml6ZXIudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuXG4gICAgLy8gQ29sb25uZXMgZXQgZ3JvdXBCeSA6IHJlc2V0IHZpYSBsYSBmYWNhZGUgKHJldGlyZSBsZXMgb3B0aW9ubmVsbGVzLCByZW1ldCBsJ29yZHJlIGNvbmZpZylcbiAgICB0aGlzLl9vcmdhbml6ZXIucmVzZXRUb0RlZmF1bHRzKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdyb3VwQnlBcHBsaWVkID0gZmFsc2U7XG5cbiAgICAvLyBEeW5hbWljIHNsaWNlcyA6IGxlcyByZXRpcmVyIGR1IHNsaWNlIHBhbmVsIGF2ZWMgbGEgbGlzdGUgY2FwdHVyw6llIGF2YW50IGxlIHJlc2V0XG4gICAgZHluYW1pY1NsaWNlc1RvUmVtb3ZlLmZvckVhY2goY29sID0+IHtcbiAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8ucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSk7XG5cbiAgICAvLyBGaWx0cmUgZGUgc2xpY2UgYWN0aWZcbiAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zbGljZVBhbmVsUmVmKSB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoe30pO1xuXG4gICAgLy8gUmFmcmHDrmNoaXQgdG91dGUgbGEgdnVlXG4gICAgdGhpcy5hY3RpdmVGaWVsZHMgPSB0aGlzLl9vcmdhbml6ZXIuZmllbGRzLmFjdGl2ZUZpZWxkcztcbiAgICB0aGlzLnJlbmRlcmVkQ29sdW1ucyA9IHRoaXMuYWN0aXZlRmllbGRzLm1hcChjID0+IGMua2V5KTtcbiAgICB0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG5cbiAgICB0aGlzLl9zaG93UHJlZmVyZW5jZXNNZXNzYWdlKHRoaXMuaTE4bi5wcmVmZXJlbmNlc0NsZWFyZWRNZXNzYWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3Nob3dQcmVmZXJlbmNlc01lc3NhZ2UobXNnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgIT09IG51bGwpIGNsZWFyVGltZW91dCh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lcik7XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlID0gbXNnO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlID0gbnVsbDtcbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCA0MDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5UHJlZmVyZW5jZXMoc2F2ZWQ6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXNhdmVkKSByZXR1cm47XG4gICAgLy8gUmVjaGVyY2hlXG4gICAgaWYgKHNhdmVkLnNlYXJjaCkgdGhpcy5zZWFyY2hRdWVyeSA9IHNhdmVkLnNlYXJjaDtcbiAgICAvLyBMYXJnZXVycyBjb2xvbm5lc1xuICAgIGlmIChzYXZlZC5jb2x1bW5XaWR0aHMpIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4uc2F2ZWQuY29sdW1uV2lkdGhzIH07XG4gICAgLy8gR3JvdXAgYnlcbiAgICBpZiAoc2F2ZWQuZ3JvdXBCeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9vcmdhbml6ZXIuc2V0R3JvdXBCeShzYXZlZC5ncm91cEJ5KTtcbiAgICAgIGlmIChzYXZlZC5ncm91cEJ5KSB7XG4gICAgICAgIHRoaXMuX2dyb3VwQnkuc2V0RGVmYXVsdENvbGxhcHNlZCh0cnVlKTtcbiAgICAgICAgdGhpcy5fZ3JvdXBCeS5yZXNldCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDDiXRhdCBwYW5uZWF1IHNsaWNlXG4gICAgaWYgKHNhdmVkLnNsaWNlUGFuZWxDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCA9IHNhdmVkLnNsaWNlUGFuZWxDb2xsYXBzZWQ7XG4gICAgLy8gU2xpY2VzIHN0YXRpcXVlcyBjYWNow6llcyDigJQgb24gdXRpbGlzZSBsYSB2YWxldXIgZXhhY3RlIHNhdXZlZ2FyZMOpZSAocGFzIGxlcyBkZWZhdWx0cyBkZSBjb25maWcpXG4gICAgaWYgKHNhdmVkLmhpZGRlblNsaWNlS2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0KHNhdmVkLmhpZGRlblNsaWNlS2V5cyk7XG4gICAgICB0aGlzLl9vcmdhbml6ZXIudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIH1cbiAgICAvLyBDb2xvbm5lcyB2aXNpYmxlcyArIG9yZHJlIOKAlCByZWNvbnN0cnVpdCBhY3RpdmVGaWVsZHMgZW4gdW5lIHNldWxlIHBhc3NlLlxuICAgIC8vIE9uIHBhcnQgZGUgc2F2ZWQuY29sdW1uT3JkZXIgKG9yZHJlIHNhdXZlZ2FyZMOpKSBzaSBkaXNwb25pYmxlLCBzaW5vbiBzYXZlZC52aXNpYmxlQ29sdW1ucy5cbiAgICAvLyBDZWxhIGfDqHJlIMOgIGxhIGZvaXMgOiBjb2xvbm5lcyBvcHRpb25uZWxsZXMgYWpvdXTDqWVzLCBjb2xvbm5lcyByZXRpcsOpZXMsIGV0IHLDqW9yZG9ubmFuY2VtZW50LlxuICAgIGNvbnN0IHRhcmdldEtleXMgPSBzYXZlZC5jb2x1bW5PcmRlciA/PyBzYXZlZC52aXNpYmxlQ29sdW1ucztcbiAgICBpZiAodGFyZ2V0S2V5cz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhbGxCeUtleSA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuICAgICAgLy8gQ29sb25uZXMgZGFucyBsJ29yZHJlIHNhdXZlZ2FyZMOpIChvbiBuZSBnYXJkZSBxdWUgY2VsbGVzIGNvbm51ZXMgZGUgbGEgY29uZmlnKVxuICAgICAgY29uc3Qgb3JkZXJlZCA9IHRhcmdldEtleXNcbiAgICAgICAgLm1hcChrZXkgPT4gYWxsQnlLZXkuZ2V0KGtleSkpXG4gICAgICAgIC5maWx0ZXIoKGMpOiBjIGlzIFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4gPT4gYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIC8vIENvbG9ubmVzIGFjdGl2ZXMgYWN0dWVsbGxlbWVudCBub24gcHLDqXNlbnRlcyBkYW5zIHRhcmdldEtleXMgKG5vbi1vcHRpb25hbCBwYXNzw6llcyBzb3VzIHNpbGVuY2UpXG4gICAgICAvLyDihpIgb24gbGVzIGV4Y2x1dCA6IGwndXRpbGlzYXRldXIgYXZhaXQgZXhwbGljaXRlbWVudCBjaG9pc2kgY2Ugc291cy1lbnNlbWJsZVxuICAgICAgaWYgKG9yZGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9vcmdhbml6ZXIuc2V0QWN0aXZlRmllbGRzKG9yZGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0cmVzIGFjdGlmcyBkdSBzbGljZSBwYW5lbFxuICAgIC8vIEZpbHRyZXMgYWN0aWZzIGR1IHNsaWNlIHBhbmVsIOKAlCB0b3Vqb3VycyBzdG9ja8OpcyBlbiBwZW5kaW5nIDpcbiAgICAvLyBhcHBsaXF1w6lzIHBhciBfYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cyAoc2kgZHluYW1pYyBzbGljZXMpIG91XG4gICAgLy8gcGFyIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCAocXVhbmQgbGVzIGRvbm7DqWVzIGFycml2ZW50IGV0IHJlbmRlbnQgbGUgcGFuZWwgdmlzaWJsZSlcbiAgICBpZiAoc2F2ZWQuc2xpY2VGaWx0ZXJzICYmIE9iamVjdC5rZXlzKHNhdmVkLnNsaWNlRmlsdGVycykubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gc2F2ZWQuc2xpY2VGaWx0ZXJzO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUZpbHRlckNvbHVtbktleXMgPSBPYmplY3QuZW50cmllcyhzYXZlZC5zbGljZUZpbHRlcnMgPz8ge30pXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZXNdKSA9PiBrZXkuc3RhcnRzV2l0aCgnY29sdW1uOicpICYmIHZhbHVlcy5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleS5zbGljZSgnY29sdW1uOicubGVuZ3RoKSk7XG4gICAgY29uc3Qgc3RhdGljU2xpY2VLZXlzID0gbmV3IFNldChcbiAgICAgICh0aGlzLnJlc29sdmVkQ29uZmlnLnNsaWNlcyA/PyBbXSlcbiAgICAgICAgLm1hcChzbGljZSA9PiBzbGljZS5jb2x1bW5LZXkpXG4gICAgICAgIC5maWx0ZXIoKGtleSk6IGtleSBpcyBzdHJpbmcgPT4gISFrZXkpXG4gICAgKTtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VLZXlzID0gbmV3IFNldCh0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hbGxEeW5hbWljRmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZC5rZXkpKTtcblxuICAgIC8vIFVuIGZpbHRyZSBwZXJzaXN0YW50IGRvaXQgdG91am91cnMgcmV0cm91dmVyIHNhIHNsaWNlIDogdW5lIHByw6lmw6lyZW5jZVxuICAgIC8vIGFuY2llbm5lIG91IGluY29tcGzDqHRlIG5lIHBldXQgcGFzIGxhaXNzZXIgdW4gZmlsdHJlIHNhbnMgcGFubmVhdSB2aXNpYmxlLlxuICAgIGFjdGl2ZUZpbHRlckNvbHVtbktleXNcbiAgICAgIC5maWx0ZXIoa2V5ID0+IHN0YXRpY1NsaWNlS2V5cy5oYXMoa2V5KSlcbiAgICAgIC5mb3JFYWNoKGtleSA9PiB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMuZGVsZXRlKGtleSkpO1xuICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG5cbiAgICAvLyBVbmUgY2zDqSBkZSBmaWx0cmUgc3VyIHVuZSBjb2xvbm5lIG5vbiBzdGF0aXF1ZSBkw6lzaWduZSB1bmUgc2xpY2UgZHluYW1pcXVlLlxuICAgIC8vIEVsbGUgY29tcGzDqHRlIGR5bmFtaWNTbGljZUtleXMgcG91ciBsZXMgY29uZmlndXJhdGlvbnMgc2F1dmVnYXJkw6llcyBhdmFudFxuICAgIC8vIHF1ZSBjZSBjaGFtcCBuZSBzb2l0IHBlcnNpc3RhbnQuXG4gICAgY29uc3QgcGVyc2lzdGVkRHluYW1pY0tleXMgPSBbXG4gICAgICAuLi4oc2F2ZWQuZHluYW1pY1NsaWNlS2V5cyA/PyBbXSksXG4gICAgICAuLi5hY3RpdmVGaWx0ZXJDb2x1bW5LZXlzLFxuICAgIF07XG4gICAgY29uc3QgdW5pcXVlRHluYW1pY0tleXMgPSBbLi4ubmV3IFNldChwZXJzaXN0ZWREeW5hbWljS2V5cyldLmZpbHRlcihcbiAgICAgIGtleSA9PiAhc3RhdGljU2xpY2VLZXlzLmhhcyhrZXkpICYmIGR5bmFtaWNTbGljZUtleXMuaGFzKGtleSlcbiAgICApO1xuICAgIGlmICh1bmlxdWVEeW5hbWljS2V5cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzID0gdW5pcXVlRHluYW1pY0tleXM7XG4gICAgfVxuICB9XG5cbiAgY2FuUmVtb3ZlQ29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9vcmdhbml6ZXIuYWxsb3dGaWVsZFJlbW92YWwgJiZcbiAgICAgIGNvbHVtbi5yZW1vdmFibGUgIT09IGZhbHNlICYmXG4gICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5sZW5ndGggPiAxXG4gICAgKTtcbiAgfVxuXG4gIGlzQ2VsbEVtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnIHx8IHZhbHVlID09IG51bGw7XG4gIH1cblxuICBhc1RpdGxlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEV4cG9ydCBDU1ZcblxuICBvbkV4cG9ydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9leHBvcnQuZXhwb3J0KCk7XG4gIH1cblxuICAvKiogQ2FwdHVyZSBsZXMgbGlnbmVzIGV0IGwnw6l0YXQgYWN0dWVsbGVtZW50IHZpc2libGVzIGRhbnMgdW4gc25hcHNob3QgYXV0b25vbWUuICovXG4gIGNyZWF0ZVZpc3VhbFNuYXBzaG90KGxhYmVsID0gdGhpcy50aXRsZSB8fCAnVGFibGVhdScpOiBWaXN1YWxTbmFwc2hvdERyYWZ0IHtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoY29udGFpbnNGdW5jdGlvbih0aGlzLnJlc29sdmVkQ29uZmlnKSkge1xuICAgICAgd2FybmluZ3MucHVzaCgnQ2VydGFpbmVzIGZvbmN0aW9ucyBkZSBjb25maWd1cmF0aW9uIG5lIHNvbnQgcGFzIHRyYW5zcG9ydGFibGVzLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIGxhYmVsLFxuICAgICAgY29uZmlnOiBjbG9uZVNlcmlhbGl6YWJsZSh7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICBjb2x1bW5zOiB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnM/Lm1hcChjb2x1bW4gPT4gc2VyaWFsaXphYmxlQ29sdW1uKGNvbHVtbikpLFxuICAgICAgICBzZWFyY2g6IHRoaXMucmVzb2x2ZWRDb25maWcuc2VhcmNoLFxuICAgICAgICBwYWdpbmF0aW9uOiB0aGlzLnJlc29sdmVkQ29uZmlnLnBhZ2luYXRpb24sXG4gICAgICB9KSxcbiAgICAgIHN0YXRlOiBjbG9uZVNlcmlhbGl6YWJsZSh7XG4gICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hRdWVyeSxcbiAgICAgICAgZ3JvdXBCeTogdGhpcy5hY3RpdmVHcm91cEJ5S2V5LFxuICAgICAgICBjb2x1bW5PcmRlcjogdGhpcy5hY3RpdmVGaWVsZHMubWFwKGNvbHVtbiA9PiBjb2x1bW4ua2V5KSxcbiAgICAgICAgdmlzaWJsZUNvbHVtbnM6IHRoaXMuYWN0aXZlRmllbGRzLm1hcChjb2x1bW4gPT4gY29sdW1uLmtleSksXG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdpbmF0b3I/LnBhZ2VJbmRleCA/PyAwLFxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0b3I/LnBhZ2VTaXplID8/IHRoaXMucGFnZVNpemUsXG4gICAgICB9KSxcbiAgICAgIGRhdGE6IGNsb25lU2VyaWFsaXphYmxlKHRoaXMuX2FsbEZpbHRlcmVkUm93cyksXG4gICAgICB3YXJuaW5ncyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFwcGxpcXVlIGwnw6l0YXQgY29tcGF0aWJsZSBldCByZXRvdXJuZSBsZXMgZG9ubsOpZXMgw6AgZm91cm5pciBhdSBjb21wb3NhbnQgY2libGUuICovXG4gIGFwcGx5VmlzdWFsU25hcHNob3Qoc25hcHNob3Q6IFZpc3VhbFNuYXBzaG90KTogVmlzdWFsU25hcHNob3RBcHBseVJlc3VsdCB7XG4gICAgaWYgKHNuYXBzaG90LnR5cGUgIT09ICd0YWJsZScpIHtcbiAgICAgIHJldHVybiB7IGFwcGxpZWQ6IGZhbHNlLCByZXN0b3JlZDogW10sIHNraXBwZWQ6IFsndHlwZSddLCB3YXJuaW5nczogWydMZSBzbmFwc2hvdCBuXFwnZXN0IHBhcyB1biB0YWJsZWF1LiddIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSBzbmFwc2hvdC5zdGF0ZSBhcyB7XG4gICAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgICBncm91cEJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHZpc2libGVDb2x1bW5zPzogc3RyaW5nW107XG4gICAgICBjb2x1bW5PcmRlcj86IHN0cmluZ1tdO1xuICAgICAgY29sdW1uV2lkdGhzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICB9O1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXSkubWFwKGNvbHVtbiA9PiBbY29sdW1uLmtleSwgY29sdW1uXSkpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEtleXMgPSBzdGF0ZS5jb2x1bW5PcmRlciA/PyBzdGF0ZS52aXNpYmxlQ29sdW1ucyA/PyBbXTtcbiAgICBjb25zdCBjb21wYXRpYmxlS2V5cyA9IHJlcXVlc3RlZEtleXMuZmlsdGVyKGtleSA9PiBhdmFpbGFibGUuaGFzKGtleSkpO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXF1ZXN0ZWRLZXlzLmZpbHRlcihrZXkgPT4gIWF2YWlsYWJsZS5oYXMoa2V5KSk7XG4gICAgY29uc3QgcmVzdG9yZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY29tcGF0aWJsZUtleXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9vcmdhbml6ZXIuc2V0QWN0aXZlRmllbGRzKGNvbXBhdGlibGVLZXlzLm1hcChrZXkgPT4gYXZhaWxhYmxlLmdldChrZXkpISkpO1xuICAgICAgcmVzdG9yZWQucHVzaCgnY29sdW1ucycpO1xuICAgICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhdGUuc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHN0YXRlLnNlYXJjaDtcbiAgICAgIHJlc3RvcmVkLnB1c2goJ3NlYXJjaCcpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZ3JvdXBCeSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RhdGUuZ3JvdXBCeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGdyb3VwS2V5ID0gc3RhdGUuZ3JvdXBCeSAmJiBhdmFpbGFibGUuaGFzKHN0YXRlLmdyb3VwQnkpID8gc3RhdGUuZ3JvdXBCeSA6IG51bGw7XG4gICAgICB0aGlzLl9vcmdhbml6ZXIuc2V0R3JvdXBCeShncm91cEtleSk7XG4gICAgICByZXN0b3JlZC5wdXNoKCdncm91cEJ5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb2x1bW5XaWR0aHMpIHtcbiAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4uc3RhdGUuY29sdW1uV2lkdGhzIH07XG4gICAgICByZXN0b3JlZC5wdXNoKCdjb2x1bW5XaWR0aHMnKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcGxpZWQ6IHRydWUsXG4gICAgICByZXN0b3JlZCxcbiAgICAgIHNraXBwZWQsXG4gICAgICB3YXJuaW5nczogc25hcHNob3Qud2FybmluZ3MgPz8gW10sXG4gICAgICBkYXRhOiBjbG9uZVNlcmlhbGl6YWJsZShzbmFwc2hvdC5kYXRhKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIGRlIGRvbm7DqWVzIChwcml2w6kpXG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlld01vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc29sdmVkRGF0YSA9IHRoaXMucmVzb2x2ZURhdGEoKTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnID0gdGhpcy5idWlsZEVmZmVjdGl2ZUNvbmZpZygpO1xuICAgIHRoaXMuX2NvbHVtbk1hcCA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuXG4gICAgLy8g4pSA4pSAIEluaXRpYWxpc2VyIGxlIGdlc3Rpb25uYWlyZSBkZSBwcsOpZsOpcmVuY2VzIHNpIGwnb3B0aW9uIGVzdCBhY3RpdsOpZVxuICAgIGNvbnN0IHByZWZzSWQgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzPy5lbmFibGVkXG4gICAgICA/IHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXMudGFibGVJZFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRJZCA9IHByZWZzSWQgPz8gbnVsbDtcbiAgICAvLyBQcsOpZsOpcmVuY2VzIMOgIGFwcGxpcXVlciBhcHLDqHMgX29yZ2FuaXplci51cGRhdGUoKSAocXVhbmQgYWN0aXZlRmllbGRzIGVzdCBkw6lqw6AgcGV1cGzDqSlcbiAgICBsZXQgcGVuZGluZ1ByZWZzOiBpbXBvcnQoJy4uL2pxdWVyeS10YWJsZS5tb2RlbCcpLlNhdmVkVGFibGVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3VycmVudElkICYmIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcj8ua2V5ICE9PSAoJ2pxdF9wcmVmc18nICsgY3VycmVudElkKSkge1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyID0gbmV3IFRhYmxlUHJlZmVyZW5jZXNNYW5hZ2VyKGN1cnJlbnRJZCk7XG4gICAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5oYXNTYXZlZCgpO1xuICAgICAgcGVuZGluZ1ByZWZzID0gdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLmxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKCFjdXJyZW50SWQpIHtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlciA9IG51bGw7XG4gICAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIETDqWzDqGd1ZSDDoCBsYSBmYWNhZGUgOiBtaXNlIMOgIGpvdXIgZGUgbCfDqXRhdCBWaWV3IChjb2xvbm5lcywgZ3JvdXBCeSBtZXRhLCBzbGljZUJ5IG1ldGEpXG4gICAgdGhpcy5fb3JnYW5pemVyLnVwZGF0ZSh7XG4gICAgICBjb25maWc6IHRoaXMucmVzb2x2ZWRDb25maWcudmlldyxcbiAgICAgIGZpZWxkczogdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdLFxuICAgICAgc2xpY2VDb25maWdzOiB0aGlzLnJlc29sdmVkQ29uZmlnLnNsaWNlcyA/PyBbXSxcbiAgICAgIGRlZmF1bHRHcm91cEJ5OiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRHcm91cEJ5LFxuICAgIH0pO1xuXG4gICAgaWYgKCFwZW5kaW5nUHJlZnMgJiYgIXRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCAmJiAhdGhpcy5fb3JnYW5pemVyLmdyb3VwQnkudXNlckN1c3RvbWl6ZWQgJiYgdGhpcy5fb3JnYW5pemVyLmdyb3VwQnkuYWN0aXZlS2V5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8vIFN5bmNocm9uaXNlIGxhIHByb3ByacOpdMOpIHN0YWJsZSAow6l2aXRlIE5HMDEwMCDigJQgbGEgZmFjYWRlIGVzdCBzb3VyY2UgZGUgdsOpcml0w6kpXG4gICAgdGhpcy5hY3RpdmVGaWVsZHMgPSB0aGlzLl9vcmdhbml6ZXIuZmllbGRzLmFjdGl2ZUZpZWxkcztcblxuICAgIHRoaXMucmVuZGVyZWRDb2x1bW5zID0gdGhpcy5hY3RpdmVGaWVsZHMubWFwKGMgPT4gYy5rZXkpO1xuXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yPy5wYWdlU2l6ZSB8fCB0aGlzLnJlc29sdmVQYWdlU2l6ZSgpO1xuICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gdGhpcy5yZXNvbHZlUGFnZVNpemVPcHRpb25zKCk7XG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5ID0gdGhpcy5yZXNvbHZlUGFnZVNpemVPcHRpb25zR3JvdXBCeSgpO1xuICAgIGlmICh0aGlzLmdyb3VwUGFnZVNpemUgIT09IDAgJiYgIXRoaXMucGFnZVNpemVPcHRpb25zR3JvdXBCeS5pbmNsdWRlcyh0aGlzLmdyb3VwUGFnZVNpemUpKSB7XG4gICAgICB0aGlzLmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuYXR0YWNoUGFnaW5hdG9yKCk7XG4gICAgdGhpcy5hdHRhY2hTb3J0KCk7XG5cbiAgICAvLyBSw6lpbml0aWFsaXNlIF9zdGF0aWNTbGljZUhpZGRlbktleXMgc2V1bGVtZW50IHNpIGxlcyBjbMOpcyBoaWRkZW4gZGUgbGEgY29uZmlnIG9udCB2cmFpbWVudCBjaGFuZ8OpXG4gICAgLy8gRVQgcXUnaWwgbid5IGEgcGFzIGRlIHByw6lmw6lyZW5jZXMgc2F1dmVnYXJkw6llcyAocXVpIGfDqXJlcm9udCBoaWRkZW5TbGljZUtleXMgZWxsZXMtbcOqbWVzKS5cbiAgICBjb25zdCBuZXdDb25maWdIaWRkZW4gPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICAodGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10pLmZpbHRlcihzID0+IHMuaGlkZGVuICYmIHMuY29sdW1uS2V5KS5tYXAocyA9PiBzLmNvbHVtbktleSEpXG4gICAgKTtcbiAgICBpZiAoIVRhYmxlQ29tcG9uZW50Ll9zZXRzRXF1YWwobmV3Q29uZmlnSGlkZGVuLCB0aGlzLl9jb25maWdIaWRkZW5LZXlzKSkge1xuICAgICAgdGhpcy5fY29uZmlnSGlkZGVuS2V5cyA9IG5ld0NvbmZpZ0hpZGRlbjtcbiAgICAgIC8vIE4nw6ljcmFzZXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyBxdWUgc2kgb24gbidlc3QgUEFTIGVuIHRyYWluIGQnYXBwbGlxdWVyIGRlcyBwcmVmc1xuICAgICAgLy8gKHBlbmRpbmdQcmVmcyBsZXMgZ8OocmVyYSBsdWktbcOqbWUgdmlhIF9hcHBseVByZWZlcmVuY2VzIOKGkiBoaWRkZW5TbGljZUtleXMpXG4gICAgICBpZiAoIXBlbmRpbmdQcmVmcykge1xuICAgICAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0KG5ld0NvbmZpZ0hpZGRlbik7XG4gICAgICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbGlxdWUgbGVzIHByw6lmw6lyZW5jZXMgSUNJLCBBUFLDiFMgX29yZ2FuaXplci51cGRhdGUoKSBFVCBhcHLDqHMgX2NvbmZpZ0hpZGRlbktleXMgbWlzIMOgIGpvdXIsXG4gICAgLy8gbWFpcyBhdmFudCBfY29tcHV0ZVNsaWNlQ29uZmlncygpIHBvdXIgcXVlIGhpZGRlblNsaWNlS2V5cyBzb2l0IGTDqWrDoCByZXN0YXVyw6kuXG4gICAgaWYgKHBlbmRpbmdQcmVmcykge1xuICAgICAgdGhpcy5fYXBwbHlQcmVmZXJlbmNlcyhwZW5kaW5nUHJlZnMpO1xuICAgIH1cblxuICAgIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlXG4gICAgLy8gT24gcmVjYWxjdWxlIF9zbGljZUNvbmZpZ3MgZW4gcmVmbMOpdGFudCBsJ8OpdGF0IGNvdXJhbnQgZGVzIHNsaWNlcyBjYWNow6llcyxcbiAgICAvLyBwb3VyIHF1ZSBTbGljZVBhbmVsQ29tcG9uZW50Lm5nT25Jbml0IHJlw6dvaXZlIGxhIGJvbm5lIHZhbGV1ciBkZSBgaGlkZGVuYFxuICAgIC8vIG3Dqm1lIHF1YW5kIGxlIGNvbXBvc2FudCBlc3QgY3LDqcOpIHBvdXIgbGEgMcOocmUgZm9pcyBhcHLDqHMgdW4gdG9nZ2xlLlxuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICB0aGlzLl9zbGljZUNvbHVtbnMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5fc2xpY2VEYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuICAgIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZSA9IHRoaXMucmVzb2x2ZWRDb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgIT09IGZhbHNlO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVTb3J0LmFjdGl2ZSAmJiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0KSB7XG4gICAgICB0aGlzLl9tYXRTb3J0QWN0aXZlID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5hY3RpdmU7XG4gICAgICB0aGlzLl9tYXRTb3J0RGlyZWN0aW9uID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5kaXJlY3Rpb247XG4gICAgfVxuICAgIHRoaXMuX2J1aWxkU2xpY2VCeU1lbnVJdGVtcygpO1xuXG4gICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBSZXRvdXJuZSB1bmlxdWVtZW50IGxlcyBzbGljZXMgdmlzaWJsZXMgKG5vbiBjYWNow6llcyBwYXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cykuXG4gICAqIExlIFNsaWNlUGFuZWxDb21wb25lbnQgYWZmaWNoZSB0b3V0IGNlIHF1J2lsIHJlw6dvaXQg4oCUIGMnZXN0IGljaSBxdWUgc2UgZmFpdCBsZSBmaWx0cmFnZS4gKi9cbiAgcHJpdmF0ZSBfY29tcHV0ZVNsaWNlQ29uZmlncygpOiBTbGljZUNvbmZpZzxUPltdIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIoXG4gICAgICBzID0+ICFzLmNvbHVtbktleSB8fCAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3NldHNFcXVhbChhOiBTZXQ8c3RyaW5nPiwgYjogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgYSkgaWYgKCFiLmhhcyh2KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTbGljZUJ5TWVudUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlTWFwID0gbmV3IE1hcCh0aGlzLl9zdGF0aWNTbGljZXNGb3JNZW51Lm1hcChzID0+IFtzLmtleSwgc10pKTtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VTZXQgPSBuZXcgU2V0KHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnMubWFwKGMgPT4gYy5rZXkpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sLmtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YXRpY1NsaWNlTWFwLmhhcyhjb2wua2V5KSkge1xuICAgICAgICBjb25zdCBzID0gc3RhdGljU2xpY2VNYXAuZ2V0KGNvbC5rZXkpITtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgICBzZWVuLmFkZChjb2wua2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY1NsaWNlU2V0Lmhhcyhjb2wua2V5KSkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IGZhbHNlLCBrZXk6IGNvbC5rZXksIHRpdGxlOiB0aGlzLmNvbExhYmVsKGNvbCksIGljb246IGNvbC5pY29uLCBjb2wgfSk7XG4gICAgICAgIHNlZW4uYWRkKGNvbC5rZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdGljU2xpY2VzRm9yTWVudSkge1xuICAgICAgaWYgKCFzZWVuLmhhcyhzLmtleSkpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5faW52YWxpZGF0ZU9yZ2FuaXplckNvbmZpZygpOyAvLyBsZXMgc2xpY2VzIG9udCBjaGFuZ8OpXG4gIH1cblxuICBnZXQgc2xpY2VCeU1lbnVJdGVtcygpIHsgcmV0dXJuIHRoaXMuX3NsaWNlQnlNZW51SXRlbXM7IH1cblxuICBvblNsaWNlTWVudUl0ZW1DbGljayhpdGVtOiB7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZzsgY29sPzogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaXNTdGF0aWMpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGljU2xpY2UoaXRlbS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5jb2wpIHtcbiAgICAgIHRoaXMudG9nZ2xlRHluYW1pY1NsaWNlKGl0ZW0uY29sKTtcbiAgICB9XG4gIH1cblxuICBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbTogeyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmlzU3RhdGljID8gdGhpcy5pc1N0YXRpY1NsaWNlVmlzaWJsZShpdGVtLmtleSkgOiB0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGl0ZW0ua2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlUmVuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVuZGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZW5kZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fZXhlY3V0ZVJlbmRlcigpKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZVJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjYXRlZ29yeVJvd3MgPSB0aGlzLmdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgLy8gRW4gbW9kZSBncm91cEJ5LCBwcm9qZWN0Um93cyBnw6hyZSB0b3V0IGxlIHRyaSBpbnRlcm5lbWVudCDigJQgcGFzIGRlIHNvcnQgZ2xvYmFsIGludXRpbGVcbiAgICAgIHRoaXMuX2FsbEZpbHRlcmVkUm93cyA9IGNhdGVnb3J5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcGFyZUZuID0gdGhpcy5fYnVpbGRTb3J0Q29tcGFyYXRvcigpO1xuICAgICAgdGhpcy5fYWxsRmlsdGVyZWRSb3dzID0gY29tcGFyZUZuID8gWy4uLmNhdGVnb3J5Um93c10uc29ydChjb21wYXJlRm4pIDogY2F0ZWdvcnlSb3dzO1xuICAgIH1cblxuICAgIC8vIE1ldHRyZSDDoCBqb3VyIGxlIHBhZ2luYXRvciBhdmVjIGxlIG5vdXZlYXUgdG90YWxcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA/PyB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSAtIDEpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IubGVuZ3RoID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IE1hdGgubWluKHNhdmVkSW5kZXgsIG1heFBhZ2UpO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgIC8vIGRldGVjdENoYW5nZXMoKSBhdSBsaWV1IGRlIG1hcmtGb3JDaGVjaygpIDogbWV0IMOgIGpvdXIgdW5pcXVlbWVudCBDRSBjb21wb3NhbnRcbiAgICAvLyBzYW5zIGTDqWNsZW5jaGVyIHVuIGN5Y2xlIENEIGdsb2JhbCBxdWkgcHJvdm9xdWVyYWl0IE5HMDEwMCBkYW5zIGxlcyBwYXJlbnRzLlxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0Q3VycmVudFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMucHJvamVjdFJvd3ModGhpcy5fYWxsRmlsdGVyZWRSb3dzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IDA7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IHBhZ2VSb3dzID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xuXG4gICAgY29uc3QgcHJvamVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIHBhZ2VSb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgY29uc3QgcDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgcFtjb2wua2V5XSA9IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaWR4KTtcbiAgICAgIH0pO1xuICAgICAgcHJvamVjdGVkLnB1c2gocCk7XG4gICAgfSk7XG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHByb2plY3RlZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZmZlY3RpdmVDb25maWcoKTogVGFibGVQcm92aWRlcjxUPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcgfHwge307XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX3Jlc29sdmVkRGF0YTtcblxuICAgIGNvbnN0IGNvbHVtbnMgPVxuICAgICAgY29uZmlnLmNvbHVtbnMgfHxcbiAgICAgIHRoaXMuY29sdW1uc0NvbmZpZyB8fFxuICAgICAgdGhpcy5yZXNvbHZlQ29sdW1uc0Zyb21Db21wYXQocm93cyk7XG5cbiAgICAvLyBNb2RlIEhUTUwgOiBbdmlld10gcHJlbmQgbGUgZGVzc3VzIHN1ciBjb25maWcudmlldyBzaSBmb3VybmkgKFBoYXNlIDMpLlxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXcgPz8gY29uZmlnLnZpZXc7XG5cbiAgICBjb25zdCBhdXRvVGFibGVJZCA9IGNvbmZpZy5wcmVmZXJlbmNlcz8udGFibGVJZCB8fCBUYWJsZUNvbXBvbmVudC5faGFzaENvbHVtbnMoKGNvbHVtbnMgfHwgW10pLm1hcChjID0+IGMua2V5KSk7XG4gICAgY29uc3QgZXhwb3J0Q29uZmlnOiBUYWJsZUV4cG9ydENvbmZpZzxUPiA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBmaWxlbmFtZTogYXV0b1RhYmxlSWQsXG4gICAgICAuLi5jb25maWcuZXhwb3J0LFxuICAgIH07XG5cbiAgICBjb25zdCBwcmVmc0NvbmZpZzogVGFibGVQcmVmZXJlbmNlc0NvbmZpZyA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB0YWJsZUlkOiBhdXRvVGFibGVJZCxcbiAgICAgIC4uLmNvbmZpZy5wcmVmZXJlbmNlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICB2aWV3LFxuICAgICAgc2xpY2VzOiBjb25maWcuc2xpY2VzIHx8IFtdLFxuICAgICAgZW5hYmxlU2xpY2VUb2dnbGU6IGNvbmZpZy5lbmFibGVTbGljZVRvZ2dsZSA/PyB0cnVlLFxuICAgICAgZXhwb3J0OiBleHBvcnRDb25maWcsXG4gICAgICBwcmVmZXJlbmNlczogcHJlZnNDb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDb25maWdTZWFyY2hSZXNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhclRva2VuID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jbGVhclNlYXJjaElucHV0O1xuICAgIGNvbnN0IHNob3VsZENsZWFyID0gISFjbGVhclRva2VuICYmIGNsZWFyVG9rZW4gIT09IHRoaXMuX2xhc3RDb25maWdDbGVhclNlYXJjaElucHV0O1xuXG4gICAgdGhpcy5fbGFzdENvbmZpZ0NsZWFyU2VhcmNoSW5wdXQgPSBjbGVhclRva2VuO1xuXG4gICAgaWYgKCFzaG91bGRDbGVhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcbiAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbFNlYXJjaFF1ZXJ5KGlzRmlyc3RDb25maWdDaGFuZ2UgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWxRdWVyeSA9IHRoaXMucmVzb2x2ZWRDb25maWcuc2VhcmNoPy5pbml0aWFsUXVlcnk7XG4gICAgaWYgKGluaXRpYWxRdWVyeSA9PT0gdGhpcy5fbGFzdEluaXRpYWxTZWFyY2hRdWVyeVxuICAgICAgJiYgKHRoaXMuX2luaXRpYWxTZWFyY2hRdWVyeUFwcGxpZWQgfHwgIWlzRmlyc3RDb25maWdDaGFuZ2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdEluaXRpYWxTZWFyY2hRdWVyeSA9IGluaXRpYWxRdWVyeTtcbiAgICB0aGlzLl9pbml0aWFsU2VhcmNoUXVlcnlBcHBsaWVkID0gdHJ1ZTtcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gaW5pdGlhbFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9oYXNoQ29sdW1ucyhrZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyID0ga2V5cy5qb2luKCd8Jyk7XG4gICAgbGV0IGggPSAweDgxMWM5ZGM1O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoIF49IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgaCA9IE1hdGguaW11bChoLCAweDAxMDAwMTkzKSA+Pj4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICcwJyk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVEYXRhKCk6IFRbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5kYXRhU291cmNlIGFzIGFueSkuZGF0YSkpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhU291cmNlIGFzIGFueSkuZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5zRnJvbUNvbXBhdChyb3dzOiBUW10pOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIGlmICh0aGlzLmRpc3BsYXllZENvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IHRoaXMuY29sdW1uTGFiZWxzPy5ba2V5XSB8fCBodW1hbml6ZUtleShrZXkpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0Um93ID0gcm93c1swXSBhcyBhbnk7XG4gICAgaWYgKCFmaXJzdFJvdyB8fCB0eXBlb2YgZmlyc3RSb3cgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGZpcnN0Um93KS5tYXAoKGtleSkgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIGhlYWRlcjogdGhpcy5jb2x1bW5MYWJlbHM/LltrZXldIHx8IGh1bWFuaXplS2V5KGtleSksXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXRlZ29yeUZpbHRlcmVkRGF0YSgpOiBUW10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9yZXNvbHZlZERhdGE7XG5cbiAgICBsZXQgZmlsdGVyZWQgPSBkYXRhLmZpbHRlcih0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWFyY2hRdWVyeT8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHF1ZXJ5KSB7XG4gICAgICBjb25zdCByZXN0cmljdGVkS2V5cyA9IHRoaXMucmVzb2x2ZWRDb25maWcuc2VhcmNoPy5zZWFyY2hDb2x1bW5zO1xuICAgICAgY29uc3Qgc2VhcmNoQ29scyA9IHJlc3RyaWN0ZWRLZXlzPy5sZW5ndGhcbiAgICAgICAgPyBbLi4udGhpcy5fY29sdW1uTWFwLnZhbHVlcygpXS5maWx0ZXIoY29sID0+IHJlc3RyaWN0ZWRLZXlzLmluY2x1ZGVzKGNvbC5rZXkpKVxuICAgICAgICA6IFsuLi50aGlzLl9jb2x1bW5NYXAudmFsdWVzKCldO1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKHJvdykgPT5cbiAgICAgICAgc2VhcmNoQ29scy5zb21lKChjb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldERpc3BsYXlWYWx1ZUZvclNlYXJjaChjb2wsIHJvdyk7XG4gICAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9qZWN0Um93cyhyb3dzOiBUW10pOiBhbnlbXSB7XG4gICAgY29uc3QgZ3JvdXBLZXkgPSB0aGlzLmFjdGl2ZUdyb3VwQnlLZXk7XG5cbiAgICBpZiAoIWdyb3VwS2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQ6IGFueVtdID0gW107XG4gICAgICByb3dzLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkOiBhbnkgPSB7IFtST1dfUkFXX0tFWV06IHJvdywgW1JPV19JTkRFWF9LRVldOiBpbmRleCB9O1xuICAgICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICBwcm9qZWN0ZWRbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHByb2plY3RlZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBDb2xEZWYgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGdyb3VwS2V5KTtcbiAgICBjb25zdCBncm91cExhenlTdGF0dXMgPSBncm91cENvbERlZj8ubGF6eSA/ICh0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChncm91cEtleSkgPz8gJ2lkbGUnKSA6ICdsb2FkZWQnO1xuXG4gICAgaWYgKGdyb3VwTGF6eVN0YXR1cyAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHRoaXMuX3RvdGFsRmlsdGVyZWRDb3VudCA9IHJvd3MubGVuZ3RoO1xuICAgICAgcmV0dXJuIFt7IFtHUk9VUF9IRUFERVJfTUFSS0VSXTogdHJ1ZSwgW1JPV19HUk9VUF9LRVldOiBHUk9VUF9LRVlfTEFaWV9MT0FESU5HLCBbUk9XX0dST1VQX0NPVU5UXTogcm93cy5sZW5ndGgsIFtST1dfR1JPVVBfUEFHRV06IDAsIFtST1dfR1JPVVBfUEFHRV9DT1VOVF06IDEgfV07XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0aXZlU29ydCA9IHRoaXMuX2FjdGl2ZVNvcnQuYWN0aXZlICYmIHRoaXMuX2FjdGl2ZVNvcnQuZGlyZWN0aW9uXG4gICAgICA/IHRoaXMuX2FjdGl2ZVNvcnRcbiAgICAgIDogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydCA/PyB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgYXMgY29uc3QgfTtcblxuICAgIC8vIFbDqXJpZmllIHNpIGxlIGNhY2hlIGVzdCBlbmNvcmUgdmFsaWRlIChtw6ptZSByw6lmw6lyZW5jZSBkZSByb3dzICsgbcOqbWUgcGFyYW3DqHRyZXMgZGUgdHJpL2dyb3VwZSlcbiAgICBjb25zdCBjYWNoZVZhbGlkID1cbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUucm93cyA9PT0gcm93cyAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5rZXkgPT09IGdyb3VwS2V5ICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnRPcmRlciA9PT0gdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlciAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5zb3J0QWN0aXZlID09PSAoZWZmZWN0aXZlU29ydC5hY3RpdmUgPz8gJycpICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnREaXIgPT09IChlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbiA/PyAnJyk7XG5cbiAgICBsZXQgZ3JvdXBPcmRlcjogc3RyaW5nW107XG4gICAgbGV0IGdyb3VwTWFwOiBNYXA8c3RyaW5nLCBUW10+O1xuXG4gICAgaWYgKGNhY2hlVmFsaWQpIHtcbiAgICAgIGdyb3VwT3JkZXIgPSB0aGlzLl9ncm91cENhY2hlIS5vcmRlcjtcbiAgICAgIGdyb3VwTWFwID0gdGhpcy5fZ3JvdXBDYWNoZSEubWFwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQcsOpLWNhbGN1bCBkZXMgdmFsZXVycyBkZSBncm91cGUgZW4gdW4gc2V1bCBwYXNzYWdlICjDqXZpdGUgTyhuKSBmaW5kKCkgcGFyIGNvbXBhcmFpc29uKVxuICAgICAgY29uc3QgZ3JvdXBWYWx1ZUNhY2hlID0gbmV3IE1hcDxULCBzdHJpbmc+KCk7XG4gICAgICByb3dzLmZvckVhY2gocm93ID0+IGdyb3VwVmFsdWVDYWNoZS5zZXQocm93LCBTdHJpbmcodGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShncm91cEtleSwgcm93KSA/PyAnJykpKTtcblxuICAgICAgLy8gUHLDqS1jYWxjdWwgZGVzIHZhbGV1cnMgZGUgdHJpICjDqXZpdGUgTyhuIGxvZyBuKSDDlyBnZXRMYXp5QXdhcmVWYWx1ZSBkYW5zIGxlIGNvbXBhcmF0ZXVyKVxuICAgICAgbGV0IGZhc3RDb21wYXJlRm46ICgoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGVmZmVjdGl2ZVNvcnQuYWN0aXZlICYmIGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNvcnRWYWx1ZUNhY2hlID0gbmV3IE1hcDxULCBhbnk+KCk7XG4gICAgICAgIHJvd3MuZm9yRWFjaChyb3cgPT4gc29ydFZhbHVlQ2FjaGUuc2V0KHJvdywgdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShlZmZlY3RpdmVTb3J0LmFjdGl2ZSwgcm93KSkpO1xuICAgICAgICBjb25zdCBkaXIgPSBlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbjtcbiAgICAgICAgZmFzdENvbXBhcmVGbiA9IChhOiBULCBiOiBUKTogbnVtYmVyID0+IHtcbiAgICAgICAgICBjb25zdCB2YSA9IHNvcnRWYWx1ZUNhY2hlLmdldChhKTtcbiAgICAgICAgICBjb25zdCB2YiA9IHNvcnRWYWx1ZUNhY2hlLmdldChiKTtcbiAgICAgICAgICBsZXQgY21wID0gMDtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjbXAgPSB2YSA8IHZiID8gLTEgOiB2YSA+IHZiID8gMSA6IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNhID0gdmEgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2IgPSB2YiA9PSBudWxsID8gJycgOiBTdHJpbmcodmIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjbXAgPSBzYSA8IHNiID8gLTEgOiBzYSA+IHNiID8gMSA6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkaXIgPT09ICdhc2MnID8gY21wIDogLWNtcDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgdmEgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KGEpITtcbiAgICAgICAgY29uc3QgdmIgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KGIpITtcbiAgICAgICAgY29uc3QgY21wID0gdmEubG9jYWxlQ29tcGFyZSh2Yik7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyID09PSAnZGVzYycgPyAtY21wIDogY21wO1xuICAgICAgfSk7XG5cbiAgICAgIGdyb3VwT3JkZXIgPSBbXTtcbiAgICAgIGdyb3VwTWFwID0gbmV3IE1hcDxzdHJpbmcsIFRbXT4oKTtcbiAgICAgIHNvcnRlZC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWVDYWNoZS5nZXQocm93KSE7XG4gICAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGdyb3VwVmFsdWUpKSB7XG4gICAgICAgICAgZ3JvdXBPcmRlci5wdXNoKGdyb3VwVmFsdWUpO1xuICAgICAgICAgIGdyb3VwTWFwLnNldChncm91cFZhbHVlLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBNYXAuZ2V0KGdyb3VwVmFsdWUpIS5wdXNoKHJvdyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVHJpIGludHJhLWdyb3VwZSBzdG9ja8OpIGRhbnMgbGUgY2FjaGUg4oCUIMOpdml0ZSBsZSByZS10cmkgc3VyIGNvbGxhcHNlL2V4cGFuZC9wYWdpbmF0aW9uXG4gICAgICBpZiAoZmFzdENvbXBhcmVGbikge1xuICAgICAgICBjb25zdCBmbiA9IGZhc3RDb21wYXJlRm47XG4gICAgICAgIGdyb3VwTWFwLmZvckVhY2goKGdyb3VwUm93cywga2V5KSA9PiB7XG4gICAgICAgICAgZ3JvdXBNYXAuc2V0KGtleSwgWy4uLmdyb3VwUm93c10uc29ydChmbikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTWlzZSBlbiBjYWNoZVxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZSA9IHtcbiAgICAgICAgcm93cyxcbiAgICAgICAga2V5OiBncm91cEtleSxcbiAgICAgICAgc29ydE9yZGVyOiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyLFxuICAgICAgICBzb3J0QWN0aXZlOiBlZmZlY3RpdmVTb3J0LmFjdGl2ZSA/PyAnJyxcbiAgICAgICAgc29ydERpcjogZWZmZWN0aXZlU29ydC5kaXJlY3Rpb24gPz8gJycsXG4gICAgICAgIG9yZGVyOiBncm91cE9yZGVyLFxuICAgICAgICBtYXA6IGdyb3VwTWFwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgPSByb3dzLmxlbmd0aDtcblxuICAgIC8vIFByb3RlY3Rpb24gY29udHJlIGxlcyBqZXV4IGRlIGRvbm7DqWVzIMOgIHRyb3AgaGF1dGUgY2FyZGluYWxpdMOpXG4gICAgaWYgKGdyb3VwT3JkZXIubGVuZ3RoID4gVGFibGVDb21wb25lbnQuTUFYX0dST1VQX0NPVU5UKSB7XG4gICAgICByZXR1cm4gW3sgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IEdST1VQX0tFWV9UT09fTUFOWSwgW1JPV19HUk9VUF9DT1VOVF06IGdyb3VwT3JkZXIubGVuZ3RoLCBbUk9XX0dST1VQX1BBR0VdOiAwLCBbUk9XX0dST1VQX1BBR0VfQ09VTlRdOiAxIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5ncm91cFBhZ2VTaXplO1xuICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcblxuICAgIGdyb3VwT3JkZXIuZm9yRWFjaCgoZ3JvdXBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBSb3dzID0gZ3JvdXBNYXAuZ2V0KGdyb3VwVmFsdWUpITtcbiAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBncm91cFJvd3MubGVuZ3RoO1xuICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBwYWdlU2l6ZSA9PT0gMCA/IDAgOiB0aGlzLl9ncm91cEJ5LmdldFBhZ2UoZ3JvdXBWYWx1ZSk7XG4gICAgICBjb25zdCBwYWdlQ291bnQgPSBwYWdlU2l6ZSA9PT0gMCA/IDEgOiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWxDb3VudCAvIHBhZ2VTaXplKSk7XG4gICAgICBjb25zdCBjb2xsYXBzZWQgPSB0aGlzLmlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBWYWx1ZSk7XG5cbiAgICAgIHJlc3VsdC5wdXNoKHsgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IGdyb3VwVmFsdWUsIFtST1dfR1JPVVBfQ09VTlRdOiB0b3RhbENvdW50LCBbUk9XX0dST1VQX1BBR0VdOiBjdXJyZW50UGFnZSwgW1JPV19HUk9VUF9QQUdFX0NPVU5UXTogcGFnZUNvdW50IH0pO1xuXG4gICAgICBpZiAoIWNvbGxhcHNlZCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhZ2VTaXplID09PSAwID8gMCA6IGN1cnJlbnRQYWdlICogcGFnZVNpemU7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhZ2VTaXplID09PSAwID8gdG90YWxDb3VudCA6IE1hdGgubWluKHN0YXJ0ICsgcGFnZVNpemUsIHRvdGFsQ291bnQpO1xuICAgICAgICBncm91cFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCkuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgICAgIGNvbnN0IHByb2plY3RlZDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICAgICAgdGhpcy5hY3RpdmVGaWVsZHMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICBwcm9qZWN0ZWRbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTb3J0Q29tcGFyYXRvcigpOiAoKGE6IFQsIGI6IFQpID0+IG51bWJlcikgfCBudWxsIHtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuICAgIGNvbnN0IHsgYWN0aXZlLCBkaXJlY3Rpb24gfSA9IHNvcnQ7XG4gICAgaWYgKCFhY3RpdmUgfHwgIWRpcmVjdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIChhOiBULCBiOiBUKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IHZhID0gdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShhY3RpdmUsIGEpO1xuICAgICAgY29uc3QgdmIgPSB0aGlzLmdldExhenlBd2FyZVZhbHVlKGFjdGl2ZSwgYik7XG4gICAgICBsZXQgY21wID0gMDtcbiAgICAgIGlmICh0eXBlb2YgdmEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY21wID0gdmEgPCB2YiA/IC0xIDogdmEgPiB2YiA/IDEgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2EgPSB2YSA9PSBudWxsID8gJycgOiBTdHJpbmcodmEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNiID0gdmIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjbXAgPSBzYSA8IHNiID8gLTEgOiBzYSA+IHNiID8gMSA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNtcCA6IC1jbXA7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvdXJuZSBsYSB2YWxldXIgdGVsbGUgcXUnZWxsZSBlc3QgYWZmaWNow6llIGRhbnMgbGEgY2VsbHVsZSwgZW4gc3VpdmFudCBleGFjdGVtZW50XG4gICAqIGxlIG3Dqm1lIGNoZW1pbiBxdWUgcmVzb2x2ZUNlbGxWYWx1ZSDigJQgdXRpbGlzw6llIHBvdXIgbGEgcmVjaGVyY2hlIHBsZWluLXRleHRlLlxuICAgKiBOZSBwYXNzZSBwYXMgcGFyIHNvcnRWYWx1ZSAodmFsZXVyIGJydXRlIGRlIHRyaSkgY29udHJhaXJlbWVudCDDoCBnZXRMYXp5QXdhcmVWYWx1ZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlRm9yU2VhcmNoKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBUKTogYW55IHtcbiAgICBpZiAoY29sLmxhenkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbC5rZXkpID8/ICdpZGxlJztcbiAgICAgIGlmIChzdGF0dXMgIT09ICdsb2FkZWQnKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IHJvd01hcCA9IHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2wua2V5KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgfVxuICAgIGlmIChjb2wuc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2wuc2VhcmNoVmFsdWUocm93LCAwKTtcbiAgICB9XG4gICAgY29uc3QgcmF3VmFsdWUgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93LCAwKSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2x1bW5LZXkpPy5nZXQocm93KSA/PyBudWxsO1xuICAgIH1cbiAgICBpZiAoY29sRGVmPy5zb3J0VmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnNvcnRWYWx1ZShyb3csIDApKTtcbiAgICB9XG4gICAgaWYgKGNvbERlZj8udmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnZhbHVlKHJvdywgMCkpO1xuICAgIH1cbiAgICByZXR1cm4gKHJvdyBhcyBhbnkpW2NvbHVtbktleV07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDZWxsVmFsdWUoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+LCByb3c6IFQsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChjb2wubGF6eSkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoY29sLmtleSkgPz8gJ2lkbGUnO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnKSByZXR1cm4gTEFaWV9MT0FESU5HX1ZBTFVFO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykgcmV0dXJuIExBWllfRVJST1JfVkFMVUU7XG4gICAgICBpZiAoc3RhdHVzID09PSAnbG9hZGVkJykge1xuICAgICAgICBjb25zdCByb3dNYXAgPSB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sLmtleSk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUHJvdmlkZXIgPSBjb2wudmFsdWU7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZVByb3ZpZGVyID8gdmFsdWVQcm92aWRlcihyb3csIGluZGV4KSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplIHx8IDUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemVPcHRpb25zKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnMgfHwgWzUsIDEwLCAyMF07XG4gICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQob3B0aW9ucy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSA+IDApKV07XG5cbiAgICBpZiAoIXVuaXF1ZS5pbmNsdWRlcyh0aGlzLnBhZ2VTaXplKSkge1xuICAgICAgdW5pcXVlLnB1c2godGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYWdlU2l6ZU9wdGlvbnNHcm91cEJ5KCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5IHx8IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFs1LCAxMCwgMjBdO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KG9wdGlvbnMuZmlsdGVyKCh2KSA9PiB2ID4gMCkpXTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplID4gMCAmJiAhdW5pcXVlLmluY2x1ZGVzKHRoaXMuZ3JvdXBQYWdlU2l6ZSkpIHtcbiAgICAgIHVuaXF1ZS5wdXNoKHRoaXMuZ3JvdXBQYWdlU2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmlxdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLnJlc29sdmVkQ29uZmlnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zR3JvdXBCeSB8fCBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zO1xuICAgIGlmIChvcHRpb25zPy5sZW5ndGgpIHJldHVybiBvcHRpb25zWzBdO1xuICAgIHJldHVybiBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgNTtcbiAgfVxuXG4gIHByaXZhdGUgdW5pcXVlQ29sdW1uc0J5S2V5KGNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY29sdW1uLmtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoUGFnaW5hdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdGlvbikge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG5cbiAgICBpZiAodGhpcy5fcGFnaW5hdG9yU3Vic2NyaWJlZCAhPT0gdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRvclN1YnNjcmliZWQgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IhLnBhZ2VTaXplO1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdpbmF0b3IhLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yIS5wYWdlU2l6ZSB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdSZW5kZXIgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5fcHJvamVjdEN1cnJlbnRQYWdlKCk7XG4gICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoU29ydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc29ydCkgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2Uuc29ydCA9IG51bGwgYXMgYW55O1xuXG4gICAgaWYgKHRoaXMuX3NvcnRTdWJzY3JpYmVkICE9PSB0aGlzLnNvcnQpIHtcbiAgICAgIHRoaXMuX3NvcnRTdWJzY3JpYmVkID0gdGhpcy5zb3J0O1xuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9hY3RpdmVTb3J0ID0ge1xuICAgICAgICAgIGFjdGl2ZTogdGhpcy5zb3J0LmFjdGl2ZSxcbiAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlOiB0aGlzLnNvcnQuYWN0aXZlLCBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24gfSk7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXphYmxlQ29sdW1uPFQ+KGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGNvbHVtbi5rZXksXG4gICAgaGVhZGVyOiBjb2x1bW4uaGVhZGVyLFxuICAgIGljb246IGNvbHVtbi5pY29uLFxuICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgcmVtb3ZhYmxlOiBjb2x1bW4ucmVtb3ZhYmxlLFxuICAgIG9wdGlvbmFsOiBjb2x1bW4ub3B0aW9uYWwsXG4gICAgd2lkdGg6IGNvbHVtbi53aWR0aCxcbiAgICBncm91cGFibGU6IGNvbHVtbi5ncm91cGFibGUsXG4gICAgc2xpY2VhYmxlOiBjb2x1bW4uc2xpY2VhYmxlLFxuICAgIGxhenk6ICEhY29sdW1uLmxhenksXG4gIH07XG59XG4iLCI8c2VjdGlvbiBjbGFzcz1cImpxdWVyeS10YWJsZS13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ2aXN1YWwtY29weS1mZWVkYmFja1wiICpuZ0lmPVwiY29weUZlZWRiYWNrTWVzc2FnZVwiIHJvbGU9XCJzdGF0dXNcIj57eyBjb3B5RmVlZGJhY2tNZXNzYWdlIH19PC9kaXY+XG4gIDxoZWFkZXIgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiAqbmdJZj1cInNob3dUaXRsZVwiPlxuICAgIDxoMz57eyB0aXRsZSB9fTwvaDM+XG4gIDwvaGVhZGVyPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWxheW91dFwiXG4gICAgW2NsYXNzLm5vLXNsaWNlXT1cIiFfc2hvd1NsaWNlUGFuZWwgfHwgX3NsaWNlUGFuZWxDb2xsYXBzZWRcIlxuICA+XG4gICAgPHNsaWNlLXBhbmVsXG4gICAgICBbc3R5bGUuZGlzcGxheV09XCIhX3Nob3dTbGljZVBhbmVsIHx8IF9zbGljZVBhbmVsQ29sbGFwc2VkID8gJ25vbmUnIDogbnVsbFwiXG4gICAgICBbc2xpY2VDb25maWdzXT1cIl9zbGljZUNvbmZpZ3NcIlxuICAgICAgW2NvbHVtbnNdPVwiX3NsaWNlQ29sdW1uc1wiXG4gICAgICBbZGF0YV09XCJfc2xpY2VEYXRhXCJcbiAgICAgIFtsYXp5RGF0YV09XCJfbGF6eUNvbHVtbkRhdGFcIlxuICAgICAgW2xhenlTdGF0dXNdPVwiX2xhenlDb2x1bW5TdGF0dXNcIlxuICAgICAgW3Nob3dUb2dnbGVdPVwiX3NsaWNlU2hvd1RvZ2dsZVwiXG4gICAgICBbY29sbGFwc2VkQnlEZWZhdWx0XT1cIl9zbGljZVBhbmVsQ29sbGFwc2VkXCJcbiAgICAgIChmaWx0ZXJDaGFuZ2UpPVwib25TbGljZUZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChkeW5hbWljU2xpY2VLZXlzQ2hhbmdlKT1cIm9uRHluYW1pY1NsaWNlS2V5c0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChjb2xsYXBzZWRDaGFuZ2UpPVwib25TbGljZVBhbmVsQ29sbGFwc2VkQ2hhbmdlKCRldmVudClcIlxuICAgID48L3NsaWNlLXBhbmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLXNoZWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdG9vbGJhclwiICpuZ0lmPVwic2hvd1Rvb2xiYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRvb2xiYXItbGVmdFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1NsaWNlRXhwYW5kQnRuXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzbGljZS1leHBhbmQtYnRuXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJpMThuLmV4cGFuZEZpbHRlclRpdGxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRTbGljZVBhbmVsKClcIlxuICAgICAgICAgID48bWF0LWljb24gY2xhc3M9XCJzbGljZS1leHBhbmQtbWF0LWljb25cIj5maWx0ZXJfbGlzdDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTZWFyY2hCYXJcIiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwic2VhcmNoLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4LjVcIiBjeT1cIjguNVwiIHI9XCI1LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgMTNMMTcgMTdcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoUXVlcnlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImkxOG4uc2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWFyY2hRdWVyeVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlYXJjaC1jbGVhci1idG5cIiAoY2xpY2spPVwic2VhcmNoUXVlcnkgPSAnJzsgb25TZWFyY2hDaGFuZ2UoKVwiPsOXPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlYXJjaC1jb3VudFwiICpuZ0lmPVwiIWVmZmVjdGl2ZUlzTG9hZGluZ1wiPnt7IGZpbHRlcmVkUm93Q291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvdW50LWxvYWRlclwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93T3JnYW5pemVyQnV0dG9uXCIgY2xhc3M9XCJ0YWJsZS10b29sYmFyLXJpZ2h0XCI+XG4gICAgICAgICAgPHRhYmxlLW9yZ2FuaXplci1idXR0b25cbiAgICAgICAgICAgIFtjb25maWddPVwib3JnYW5pemVyQ29uZmlnXCJcbiAgICAgICAgICAgIFtzdGF0ZV09XCJvcmdhbml6ZXJTdGF0ZVwiXG4gICAgICAgICAgICAodmlld0NoYW5nZSk9XCJvbk9yZ2FuaXplclZpZXdDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvdGFibGUtb3JnYW5pemVyLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHktd3JhcHBlclwiPlxuXG4gICAgICA8IS0tIEJhbm5pw6hyZSBtZXNzYWdlIHByw6lmw6lyZW5jZXMgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiX3ByZWZlcmVuY2VzTWVzc2FnZVwiIGNsYXNzPVwicHJlZmVyZW5jZXMtbWVzc2FnZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJwcmVmZXJlbmNlcy1tZXNzYWdlLWljb25cIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBfcHJlZmVyZW5jZXNNZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQm91dG9uIGRlIGNvbmZpcm1hdGlvbiBkdSBtb2RlIMOpZGl0aW9uIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIl9lZGl0TW9kZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImVkaXQtY29uZmlybS1idG5cIlxuICAgICAgICBbdGl0bGVdPVwiaTE4bi5wcmVmZXJlbmNlc0NvbmZpcm1FZGl0XCJcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1FZGl0TW9kZSgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5LXNjcm9sbFwiICN0YWJsZUJvZHlTY3JvbGw+XG4gICAgICA8dGFibGUgbWF0LXRhYmxlIG1hdFNvcnQgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgY2xhc3M9XCJqcXVlcnktdGFibGVcIlxuICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwidGFibGVNaW5XaWR0aFwiXG4gICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tSb3dGblwiXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiX21hdFNvcnRBY3RpdmVcIiBbbWF0U29ydERpcmVjdGlvbl09XCJfbWF0U29ydERpcmVjdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5rZXlcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFttYXQtc29ydC1oZWFkZXJdPVwiKCFfZWRpdE1vZGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkgPyBjb2x1bW4ua2V5IDogJydcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9lZGl0TW9kZSB8fCBjb2x1bW4uc29ydGFibGUgPT09IGZhbHNlXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJhZy1lbmFibGVkXT1cImlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkIHx8IF9lZGl0TW9kZVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJvcC10YXJnZXRdPVwiaXNIZWFkZXJEcm9wVGFyZ2V0KGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtaGVhZGVyXT1cIl9lZGl0TW9kZVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25IZWFkZXJEcmFnT3Zlcihjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uSGVhZGVyRHJvcChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1jZWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uXCIgY2xhc3M9XCJoZWFkLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj57eyBjb2x1bW4uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZC10ZXh0XCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj57eyBjb2x1bW4uaGVhZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctaGFuZGxlXCJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uSGVhZGVyRHJhZ1N0YXJ0KGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIChkcmFnZW5kKT1cIm9uSGVhZGVyRHJhZ0VuZCgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBQb2lnbsOpZSBkZSByZXNpemUgKHZpc2libGUgdW5pcXVlbWVudCBlbiBtb2RlIMOpZGl0aW9uKSAtLT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiX2VkaXRNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtcmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc2l6ZVN0YXJ0KGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImdldENvbHVtbldpZHRoKGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtY2VsbF09XCJfZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2VkaXRNb2RlOyBlbHNlIGVkaXRNb2RlQ2VsbFRwbFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q2VsbFRlbXBsYXRlKGNvbHVtbi5rZXkpIGFzIGN1c3RvbVRwbDsgZWxzZSBkZWZhdWx0Q2VsbFRwbFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3dbX1JPV19SQVdfS0VZXSwgaW5kZXg6IHJvd1tfUk9XX0lOREVYX0tFWV0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2VsbFRwbD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubGF6eSA/IGdldExhenlSZW5kZXJUeXBlKHJvd1tjb2x1bW4ua2V5XSkgOiAndmFsdWUnXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2xvYWRpbmcnXCIgY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdTd2l0Y2hDYXNlPVwiJ2Vycm9yJ1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImxhenktZXJyb3ItYnRuXCIgKGNsaWNrKT1cInJldHJ5TGF6eUNvbHVtbihjb2x1bW4pXCIgW3RpdGxlXT1cImkxOG4ubGF6eUVycm9yVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LWVycm9yLWljb25cIj7imqA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1lcnJvci1sYWJlbFwiPnt7IGkxOG4ubGF6eVJldHJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IGNsYXNzPVwiY2VsbC10ZXh0XCIgW2NsYXNzLmNlbGwtZW1wdHldPVwiaXNDZWxsRW1wdHkocm93W2NvbHVtbi5rZXldKVwiIFt0aXRsZV09XCJhc1RpdGxlKHJvd1tjb2x1bW4ua2V5XSlcIj57eyBpc0NlbGxFbXB0eShyb3dbY29sdW1uLmtleV0pID8gaTE4bi5jZWxsRW1wdHkgOiByb3dbY29sdW1uLmtleV0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdE1vZGVDZWxsVHBsPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNlbGwtdGV4dCBjZWxsLWVkaXQtbW9kZVwiIFt0aXRsZV09XCJhc1RpdGxlKHJvd1tjb2x1bW4ua2V5XSlcIj57eyByb3dbY29sdW1uLmtleV0gfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwicmVuZGVyZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICA8dHJcbiAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHJlbmRlcmVkQ29sdW1uczsgd2hlbjogIWlzR3JvdXBIZWFkZXJcIlxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImhhc1Jvd0NsaWNrSGFuZGxlciAmJiAhX2VkaXRNb2RlID8gMCA6IG51bGxcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFJvd0NsYXNzKHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5uby1wb2ludGVyXT1cIiFoYXNSb3dDbGlja0hhbmRsZXIgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLXJvd109XCJfZWRpdE1vZGVcIlxuICAgICAgICAgIChjbGljayk9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCBudWxsKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIV9lZGl0TW9kZSAmJiBvblJvd0NsaWNrKHJvdywgbnVsbClcIlxuICAgICAgICA+PC90cj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIl9HUk9VUF9ST1dfQ09MVU1OXCI+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFthdHRyLmNvbHNwYW5dPVwicmVuZGVyZWRDb2x1bW5zLmxlbmd0aFwiIGNsYXNzPVwiZ3JvdXAtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1oZWFkZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1jaGV2cm9uXCIgW2NsYXNzLmNvbGxhcHNlZF09XCJpc0dyb3VwQ29sbGFwc2VkKHJvd1tfUk9XX0dST1VQX0tFWV0pXCIgKm5nSWY9XCJpc05vcm1hbEdyb3VwUm93KHJvdylcIj7igLo8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNOb3JtYWxHcm91cFJvdyhyb3cpXCIgY2xhc3M9XCJncm91cC1rZXktbGFiZWxcIj57eyByb3dbX1JPV19HUk9VUF9LRVldIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzR3JvdXBSb3dMb2FkaW5nKHJvdylcIiBjbGFzcz1cImxhenktc2tlbGV0b24gZ3JvdXAtbGF6eS1rZXktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNHcm91cFJvd1Rvb01hbnkocm93KVwiIGNsYXNzPVwiZ3JvdXAtdG9vLW1hbnktbGFiZWxcIj57eyBpMThuLmdyb3VwVG9vTWFueShyb3dbX1JPV19HUk9VUF9DT1VOVF0pIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLWNvdW50LWJhZGdlXCI+e3sgcm93W19ST1dfR1JPVVBfQ09VTlRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtcGFnaW5hdGlvblwiICpuZ0lmPVwiIWlzR3JvdXBDb2xsYXBzZWQocm93W19ST1dfR1JPVVBfS0VZXSkgJiYgcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gPiAxXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcGFnZS1idG5cIiBbZGlzYWJsZWRdPVwicm93W19ST1dfR1JPVVBfUEFHRV0gPT09IDBcIiAoY2xpY2spPVwiZ3JvdXBQYWdlQmFjayhyb3dbX1JPV19HUk9VUF9LRVldKVwiPuKAuTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtcGFnZS1pbmZvXCI+e3sgcm93W19ST1dfR1JPVVBfUEFHRV0gKyAxIH19IC8ge3sgcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1wYWdlLWJ0blwiIFtkaXNhYmxlZF09XCJyb3dbX1JPV19HUk9VUF9QQUdFXSA+PSByb3dbX1JPV19HUk9VUF9QQUdFX0NPVU5UXSAtIDFcIiAoY2xpY2spPVwiZ3JvdXBQYWdlRm9yd2FyZChyb3dbX1JPV19HUk9VUF9LRVldLCByb3dbX1JPV19HUk9VUF9DT1VOVF0pXCI+4oC6PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbX0dST1VQX1JPV19DT0xVTU5dOyB3aGVuOiBpc0dyb3VwSGVhZGVyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXJvd1wiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaGVhZGVyLWxvYWRpbmddPVwiaXNHcm91cFJvd0xvYWRpbmcocm93KVwiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaGVhZGVyLXRvby1tYW55XT1cImlzR3JvdXBSb3dUb29NYW55KHJvdylcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1ncm91cC1rZXldPVwicm93W19ST1dfR1JPVVBfS0VZXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Hcm91cEhlYWRlckNsaWNrKHJvdylcIj48L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvdyBuby1kYXRhLXJvd1wiICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIG5vLWRhdGEtY2VsbFwiIFthdHRyLmNvbHNwYW5dPVwicmVuZGVyZWRDb2x1bW5zLmxlbmd0aFwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+PCEtLSAvdGFibGUtYm9keS1zY3JvbGwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keS1vdmVybGF5XCIgKm5nSWY9XCJlZmZlY3RpdmVJc0xvYWRpbmcgfHwgaXNFbXB0eVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRhYmxlLWJvZHktb3ZlcmxheS10ZXh0XCI+e3sgZWZmZWN0aXZlSXNMb2FkaW5nID8gbG9hZGluZ1N0YXRlTGFiZWwgOiBlbXB0eVN0YXRlTGFiZWwgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PjwhLS0gL3RhYmxlLWJvZHktd3JhcHBlciAtLT5cblxuICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1iYXJcIiBbY2xhc3MuaXMtbG9hZGluZ109XCJlZmZlY3RpdmVJc0xvYWRpbmdcIiAqbmdJZj1cInNob3dQYWdpbmF0aW9uXCI+XG4gICAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbFJvd3NcIlxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICAgIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJyZXNvbHZlZFBhZ2luYXRpb25TaG93Rmlyc3RMYXN0QnV0dG9uc1wiXG4gICAgICAgID48L21hdC1wYWdpbmF0b3I+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0b3ItcmFuZ2UtbG9hZGVyXCIgXG4gICAgICAgICAgICAgW2NsYXNzLnBhZ2luYXRvci1yYW5nZS1sb2FkZXItLW5vLWZpcnN0LWxhc3RdPVwiIXJlc29sdmVkUGFnaW5hdGlvblNob3dGaXJzdExhc3RCdXR0b25zXCJcbiAgICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZUlzTG9hZGluZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1ib3R0b20tYmFyXCIgKm5nSWY9XCJhY3RpdmVHcm91cEJ5S2V5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1ib3R0b20tYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1ib3R0b20tYmFyLWxlZnRcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcmVzZXQtYnRuXCIgKGNsaWNrKT1cIm9uR3JvdXBCeUNoYW5nZShudWxsKVwiPlxuICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImdyb3VwLXJlc2V0LWljb25cIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgOGE1IDUgMCAxIDAgNS01IDUgNSAwIDAgMC0zLjU0IDEuNDZMMyAzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAzdjIuNUg1LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICB7eyBpMThuLmdyb3VwUmVtb3ZlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1iYXItc2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtc29ydC1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXNvcnQtbGFiZWxcIj57eyBpMThuLmdyb3VwU29ydExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXNvcnQtYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJncm91cFNvcnRPcmRlciA9PT0gJ2FzYydcIiAoY2xpY2spPVwib25Hcm91cFNvcnRUb2dnbGUoJ2FzYycpXCIgW3RpdGxlXT1cImkxOG4uZ3JvdXBTb3J0QXNjXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXNvcnQtYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJncm91cFNvcnRPcmRlciA9PT0gJ2Rlc2MnXCIgKGNsaWNrKT1cIm9uR3JvdXBTb3J0VG9nZ2xlKCdkZXNjJylcIiBbdGl0bGVdPVwiaTE4bi5ncm91cFNvcnREZXNjXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVsXCI+e3sgaTE4bi5ncm91cFJvd3NQZXJHcm91cCB9fTwvZGl2PlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGNsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdFwiPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ3JvdXBQYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Hcm91cFBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1zZWxlY3QtcGFnZS1zaXplIGdyb3VwLXBhZ2Utc2l6ZS1wYW5lbFwiXG4gICAgICAgICAgICAgICAgW3BhbmVsV2lkdGhdPVwiJ2F1dG8nXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+e3sgZ3JvdXBQYWdlU2l6ZSA9PT0gMCA/IGkxOG4uZ3JvdXBTaG93QWxsIDogZ3JvdXBQYWdlU2l6ZSB9fTwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHQgb2YgcGFnZVNpemVPcHRpb25zR3JvdXBCeVwiIFt2YWx1ZV09XCJvcHRcIj57eyBvcHQgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjBcIj57eyBpMThuLmdyb3VwU2hvd0FsbCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=
1828
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBbUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXdCLE1BQU0sRUFBRSxTQUFTLEVBQThCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwUyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFj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LGlCQUFpQjtnQkFDSCxhQUFhO3NCQUFyQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ1MsYUFBYTtzQkFBNUMsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ1EsU0FBUztzQkFBOUMsZUFBZTt1QkFBQyxtQkFBbUI7Z0JBcWNwQyxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsMkJBQTJCOztBQXE3QzNDLFNBQVMsa0JBQWtCLENBQUksTUFBOEI7SUFDM0QsT0FBTztRQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztRQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztRQUMzQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztRQUMzQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSTtLQUNwQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvckludGwsIE1hdFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5Qcm92aWRlciwgVGFibGVFeHBvcnRDb25maWcsIFRhYmxlUHJlZmVyZW5jZXNDb25maWcsIFRhYmxlUHJvdmlkZXIsIFRhYmxlVmlld0NvbmZpZyB9IGZyb20gJy4uL2pxdWVyeS10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBKcXRJMThuLCBKUVRfSTE4TiwgSlFUX0kxOE5fREVGQVVMVFMgfSBmcm9tICcuLi9qcXQtaTE4bi50b2tlbic7XG5pbXBvcnQgeyBKcXRDZWxsRGVmRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlL2pxdC1jZWxsLWRlZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2xpY2VDb25maWcsIFNsaWNlUGFuZWxDb21wb25lbnQsIE9yZ2FuaXplckZhY2FkZSwgR3JvdXBCeU1hbmFnZXIsIExhenlGaWVsZE1hbmFnZXIsIE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyQnV0dG9uRXZlbnQsIE9yZ2FuaXplclN0YXRlIH0gZnJvbSAnQG9uZXRlbWUvanF1ZXJ5LW9yZ2FuaXplcic7XG5pbXBvcnQgeyBnZXRGcmVuY2hQYWdpbmF0b3JJbnRsLCBodW1hbml6ZUtleSwgbm9ybWFsaXplQ2VsbFZhbHVlIH0gZnJvbSAnLi90YWJsZS51dGlscyc7XG5pbXBvcnQgeyBUYWJsZVByZWZlcmVuY2VzTWFuYWdlciB9IGZyb20gJy4vdGFibGUtcHJlZmVyZW5jZXMubWFuYWdlcic7XG5pbXBvcnQgeyBFeHBvcnRNYW5hZ2VyIH0gZnJvbSAnLi9leHBvcnQubWFuYWdlcic7XG5pbXBvcnQge1xuICBHUk9VUF9ST1dfQ09MVU1OLCBHUk9VUF9IRUFERVJfTUFSS0VSLFxuICBHUk9VUF9LRVlfTEFaWV9MT0FESU5HLCBHUk9VUF9LRVlfVE9PX01BTlksXG4gIFJPV19SQVdfS0VZLCBST1dfSU5ERVhfS0VZLFxuICBST1dfR1JPVVBfS0VZLCBST1dfR1JPVVBfQ09VTlQsIFJPV19HUk9VUF9QQUdFLCBST1dfR1JPVVBfUEFHRV9DT1VOVCxcbiAgTEFaWV9MT0FESU5HX1ZBTFVFLCBMQVpZX0VSUk9SX1ZBTFVFLFxufSBmcm9tICcuL3RhYmxlLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBPcmdhbml6ZXJCdXR0b25XcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi9vcmdhbml6ZXItYnV0dG9uL29yZ2FuaXplci1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IGNsb25lU2VyaWFsaXphYmxlLCBjb250YWluc0Z1bmN0aW9uLCBGdWxsc2NyZWVuTWFuYWdlciwgVmlzdWFsQ29weUZlZWRiYWNrQ29uZmlnLCBWaXN1YWxTbmFwc2hvdCwgVmlzdWFsU25hcHNob3RBcHBseVJlc3VsdCwgVmlzdWFsU25hcHNob3REcmFmdCwgVmlzdWFsU25hcHNob3RTdG9yYWdlIH0gZnJvbSAnQG9uZXRlbWUvanF1ZXJ5LWNvcmUnO1xuXG4vKiogQ2FjaGUgaW50ZXJuZSBkdSBncm91cGVtZW50IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgbGVzIGRvbm7DqWVzLCBsYSBjbMOpIG91IGxlcyBwYXJhbcOodHJlcyBkZSB0cmkgY2hhbmdlbnQuICovXG5pbnRlcmZhY2UgR3JvdXBCeUNhY2hlPFQ+IHtcbiAgcm93czogVFtdO1xuICBrZXk6IHN0cmluZztcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJztcbiAgc29ydEFjdGl2ZTogc3RyaW5nO1xuICBzb3J0RGlyOiBzdHJpbmc7XG4gIG9yZGVyOiBzdHJpbmdbXTtcbiAgbWFwOiBNYXA8c3RyaW5nLCBUW10+O1xufVxuXG5pbnRlcmZhY2UgVGFibGVTb3J0U3RhdGUge1xuICBhY3RpdmU6IHN0cmluZztcbiAgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdqcXVlcnktdGFibGUnLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdFRhYmxlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdERpdmlkZXJNb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0U29ydE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBTbGljZVBhbmVsQ29tcG9uZW50LCBPcmdhbml6ZXJCdXR0b25XcmFwcGVyQ29tcG9uZW50IF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdFBhZ2luYXRvckludGwsIHVzZUZhY3Rvcnk6IGdldEZyZW5jaFBhZ2luYXRvckludGwgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnZpc3VhbC1mdWxsc2NyZWVuJykgX2lzRnVsbHNjcmVlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb25maWc/OiBUYWJsZVByb3ZpZGVyPFQ+O1xuXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U/OiBUW10gfCB7IGRhdGE6IFRbXSB9O1xuICBASW5wdXQoKSBkYXRhPzogVFtdO1xuICBASW5wdXQoKSBkaXNwbGF5ZWRDb2x1bW5zPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGNvbHVtbnNDb25maWc/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W107XG5cbiAgLyoqXG4gICAqIE1vZGUgSFRNTCA6IGFjdGl2ZSBldCBjb25maWd1cmUgbGUgcGFubmVhdSBWaWV3IGluZMOpcGVuZGFtbWVudCBkdSBgW2NvbmZpZ11gLlxuICAgKiBQcmVuZCBsZSBkZXNzdXMgc3VyIGBjb25maWcudmlld2Agc2kgZMOpZmluaS5cbiAgICogRXhlbXBsZSA6IGA8anF1ZXJ5LXRhYmxlIFt2aWV3XT1cInsgZW5hYmxlZDogdHJ1ZSB9XCI+YFxuICAgKi9cbiAgQElucHV0KCkgdmlldz86IFRhYmxlVmlld0NvbmZpZztcblxuICBASW5wdXQoKSBjb2x1bW5MYWJlbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBASW5wdXQoKSBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgY29weUZlZWRiYWNrOiBWaXN1YWxDb3B5RmVlZGJhY2tDb25maWcgPSB7fTtcblxuICAvKiogUGFyYW3DqHRyZSBkZSBjb250csO0bGUgcG91ciByw6lpbml0aWFsaXNlciBiYXJyZSBkZSByZWNoZXJjaGUuICovXG4gIEBJbnB1dCgpXG4gIHNldCBjbGVhclNlYXJjaElucHV0KHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xuICAgICAgdGhpcy5vblNlYXJjaENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSByZWFkb25seSBhZGRSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBjb2x1bW5BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbHVtblJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBjYXRlZ29yeVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKiogw4ltaXMgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgdHJpICh5IGNvbXByaXMgbGUgdHJpIGluaXRpYWwpLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc29ydENoYW5nZSAgICA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTb3J0U3RhdGU+KCk7XG4gIC8qKiDDiW1pcyDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBwYWdlIG91IGRlIHRhaWxsZSBkZSBwYWdlLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcGFnZUNoYW5nZSAgICA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYWdlSW5kZXg6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9PigpO1xuICAvKiogw4ltaXMgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgbGEgcmVjaGVyY2hlIHRleHRlLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VhcmNoQ2hhbmdlICA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogw4ltaXMgcXVhbmQgbGUgR3JvdXAgYnkgY2hhbmdlIChjbMOpIGRlIGNvbG9ubmUsIG91IGBudWxsYCBzaSBkw6lzYWN0aXbDqSkuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBncm91cEJ5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBudWxsPigpO1xuICAvKiogw4ltaXMgcXVhbmQgbGEgbGlzdGUgZGVzIGNvbG9ubmVzIHZpc2libGVzIGNoYW5nZSAoY2zDqXMgZGFucyBs4oCZb3JkcmUgZOKAmWFmZmljaGFnZSkuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBjb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZpc3VhbENvcGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8VmlzdWFsU25hcHNob3Q+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpXG4gIHNldCBwYWdpbmF0b3IodmFsdWU6IE1hdFBhZ2luYXRvciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2luYXRvciA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5hdHRhY2hQYWdpbmF0b3IoKTtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgfVxuICB9XG4gIGdldCBwYWdpbmF0b3IoKTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjsgfVxuICBwcml2YXRlIF9wYWdpbmF0b3I/OiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydD86IE1hdFNvcnQ7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keVNjcm9sbCcpIHRhYmxlQm9keVNjcm9sbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0YWJsZVNoZWxsJykgdGFibGVTaGVsbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFNsaWNlUGFuZWxDb21wb25lbnQpIHNsaWNlUGFuZWxSZWY/OiBTbGljZVBhbmVsQ29tcG9uZW50PFQ+O1xuICBAQ29udGVudENoaWxkcmVuKEpxdENlbGxEZWZEaXJlY3RpdmUpIF9jZWxsRGVmcyE6IFF1ZXJ5TGlzdDxKcXRDZWxsRGVmRGlyZWN0aXZlPjtcbiAgLyoqIE1hcCBjbMOp4oaSVGVtcGxhdGVSZWYgcHLDqS1jYWxjdWzDqWUgZGVwdWlzIF9jZWxsRGVmcy4gTWlzZSDDoCBqb3VyIGRhbnMgbmdBZnRlckNvbnRlbnRJbml0IGV0IHN1ciBfY2VsbERlZnMuY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfY2VsbERlZk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogYW55OyBpbmRleDogbnVtYmVyIH0+PigpO1xuXG4gIHJlbmRlcmVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgdGFibGVEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcblxuICAvKiogQ29uc3RhbnRlIGV4cG9zw6llIGF1IHRlbXBsYXRlIHBvdXIgbGUgbWF0Q29sdW1uRGVmIGRlIGxhIGxpZ25lIGRlIGdyb3VwZS4gKi9cbiAgcmVhZG9ubHkgX0dST1VQX1JPV19DT0xVTU4gPSBHUk9VUF9ST1dfQ09MVU1OO1xuICAvKiogQ2zDqXMgZCdhY2PDqHMgYXV4IHByb3ByacOpdMOpcyBkZXMgbGlnbmVzIHByb2pldMOpZXMg4oCUIGV4cG9zw6llcyBwb3VyIGxlIHRlbXBsYXRlLiAqL1xuICByZWFkb25seSBfUk9XX1JBV19LRVkgPSBST1dfUkFXX0tFWTtcbiAgcmVhZG9ubHkgX1JPV19JTkRFWF9LRVkgPSBST1dfSU5ERVhfS0VZO1xuICByZWFkb25seSBfUk9XX0dST1VQX0tFWSA9IFJPV19HUk9VUF9LRVk7XG4gIHJlYWRvbmx5IF9ST1dfR1JPVVBfQ09VTlQgPSBST1dfR1JPVVBfQ09VTlQ7XG4gIHJlYWRvbmx5IF9ST1dfR1JPVVBfUEFHRSA9IFJPV19HUk9VUF9QQUdFO1xuICByZWFkb25seSBfUk9XX0dST1VQX1BBR0VfQ09VTlQgPSBST1dfR1JPVVBfUEFHRV9DT1VOVDtcblxuICAvKiogRmFjYWRlIFZpZXcgOiDDqXRhdCBldCBhY3Rpb25zIGNlbnRyYWxpc8OpcyAoQ2hhbXBzIC8gR3JvdXAgYnkgLyBTbGljZSBieSkgKi9cbiAgcmVhZG9ubHkgX29yZ2FuaXplciA9IG5ldyBPcmdhbml6ZXJGYWNhZGU8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcblxuICAvKipcbiAgICogU25hcHNob3Qgc3RhYmxlIHN5bmNocm9uaXPDqSBkZXB1aXMgX29yZ2FuaXplci5maWVsZHMuYWN0aXZlRmllbGRzIGRhbnMgcmVmcmVzaFZpZXdNb2RlbCgpLlxuICAgKiBQcm9wcmnDqXTDqSAobm9uIGdldHRlcikgcG91ciBxdSdBbmd1bGFyIHB1aXNzZSBsYSBzdWl2cmUgc2FucyBORzAxMDAuXG4gICAqL1xuICBhY3RpdmVGaWVsZHM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSA9IFtdO1xuXG4gIGFjdGl2ZVNsaWNlRmlsdGVyOiAocm93OiBUKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZTtcblxuICAvLyBQcm9wcmnDqXTDqXMgc3RhYmxlcyBwb3VyIGxlcyBiaW5kaW5ncyBkdSB0ZW1wbGF0ZSAoY29udHJlIGVycmV1ciBORzAxMDApXG4gIF9zbGljZUNvbmZpZ3M6IGFueVtdID0gW107XG4gIF9zbGljZUNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSA9IFtdO1xuICBfc2xpY2VEYXRhOiBUW10gPSBbXTtcbiAgX3NsaWNlU2hvd1RvZ2dsZSA9IHRydWU7XG4gIC8qKiBTbmFwc2hvdCBzdGFibGUgZGUgbGEgdmlzaWJpbGl0w6kgZHUgcGFubmVhdSBzbGljZSDigJQgamFtYWlzIGNhbGN1bMOpIGRlcHVpcyBAVmlld0NoaWxkICovXG4gIF9zaG93U2xpY2VQYW5lbCA9IGZhbHNlO1xuICAvKiogU25hcHNob3Qgc3RhYmxlIGRlIGwnw6l0YXQgY29sbGFwc2VkIGR1IHBhbm5lYXUgc2xpY2UsIG1pcyDDoCBqb3VyIHZpYSAoY29sbGFwc2VkQ2hhbmdlKSAqL1xuICBfc2xpY2VQYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9pbml0aWFsU2xpY2VQYW5lbENvbGxhcHNlZEFwcGxpZWQgPSBmYWxzZTtcblxuICAvLyBEw6lsw6lndcOpcyB2ZXJzIF92aWV3IChjb25zZXJ2w6lzIHBvdXIgY29tcGF0aWJpbGl0w6kgdGVtcGxhdGUgc2FucyByZWZhY3RvcmluZyBIVE1MKVxuICBnZXQgX3N0YXRpY1NsaWNlc0Zvck1lbnUoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgaWNvbj86IHN0cmluZyB9PiB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc3RhdGljU2xpY2VzRm9yTWVudTsgfVxuICBnZXQgX2FjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNGaWVsZHM7IH1cbiAgZ2V0IF9hdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hdmFpbGFibGVGb3JEeW5hbWljOyB9XG4gIGdldCBfYWxsRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWxsRHluYW1pY0ZpZWxkczsgfVxuICBnZXQgX2FjdGl2ZVNsaWNlQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlTGFiZWw7IH1cbiAgX3NsaWNlQnlNZW51SXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG5cbiAgc2VhcmNoUXVlcnkgPSAnJztcbiAgZ2V0IGFjdGl2ZUdyb3VwQnlLZXkoKTogc3RyaW5nIHwgbnVsbCB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuZ3JvdXBCeS5hY3RpdmVLZXk7IH1cbiAgX21hdFNvcnRBY3RpdmUgPSAnJztcbiAgX21hdFNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJycgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aXZlU29ydDogVGFibGVTb3J0U3RhdGUgPSB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgfTtcbiAgcHJpdmF0ZSBfc29ydFN1YnNjcmliZWQ6IE1hdFNvcnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF90b3RhbEZpbHRlcmVkQ291bnQgPSAwO1xuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZHUgbW9kZSBHcm91cCBCeSAow6l0YXQgY29sbGFwc2VkLCBwYWdpbmF0aW9uLCB0cmkgZGVzIGdyb3VwZXMpLiAqL1xuICByZWFkb25seSBfZ3JvdXBCeSA9IG5ldyBHcm91cEJ5TWFuYWdlcihcbiAgICAoKSA9PiB7IHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpOyB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7IH0sXG4gICAgKCkgPT4gdGhpcy5yZWZyZXNoVmlld01vZGVsKCksXG4gICk7XG5cbiAgLyoqIETDqWzDqWd1w6lzIHZlcnMgR3JvdXBCeU1hbmFnZXIgcG91ciBsYSBjb21wYXRpYmlsaXTDqSBkZXMgdGVtcGxhdGVzLiAqL1xuICBnZXQgZ3JvdXBQYWdlU2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplOyB9XG4gIHNldCBncm91cFBhZ2VTaXplKHY6IG51bWJlcikgeyB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB2OyB9XG4gIGdldCBncm91cFNvcnRPcmRlcigpOiAnYXNjJyB8ICdkZXNjJyB7IHJldHVybiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyOyB9XG4gIHNldCBncm91cFNvcnRPcmRlcih2OiAnYXNjJyB8ICdkZXNjJykgeyB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyID0gdjsgfVxuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZHUgY3ljbGUgZGUgdmllIGRlcyBjb2xvbm5lcyBsYXp5IChmZXRjaCwgYW5udWxhdGlvbiwgc3RhdHV0cywgZG9ubsOpZXMpLiAqL1xuICBwcml2YXRlIF9sYXp5ID0gbmV3IExhenlGaWVsZE1hbmFnZXI8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcbiAgLyoqIENvbXBhdGliaWxpdMOpIHRlbXBsYXRlIDogcmV0b3VybmUgbGEgbWFwIGRlIHN0YXR1dHMgbGF6eS4gKi9cbiAgZ2V0IF9sYXp5Q29sdW1uU3RhdHVzKCkgeyByZXR1cm4gdGhpcy5fbGF6eS5zdGF0dXM7IH1cbiAgLyoqIENvbXBhdGliaWxpdMOpIHRlbXBsYXRlIDogcmV0b3VybmUgbGEgbWFwIGRlIGRvbm7DqWVzIGxhenkuICovXG4gIGdldCBfbGF6eUNvbHVtbkRhdGEoKSB7IHJldHVybiB0aGlzLl9sYXp5LmRhdGE7IH1cbiAgcHJpdmF0ZSBfY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfZWwgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuICBwcml2YXRlIF9uZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBfcGFnaW5hdG9ySW50bCA9IGluamVjdChNYXRQYWdpbmF0b3JJbnRsKTtcbiAgcHJpdmF0ZSBfaTE4blJhdyA9IGluamVjdChKUVRfSTE4TiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBfdGFibGVTaGVsbFJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Z1bGxJdGVtc1BlclBhZ2VMYWJlbCA9IHRoaXMuX3BhZ2luYXRvckludGwuaXRlbXNQZXJQYWdlTGFiZWw7XG4gIGNvcHlGZWVkYmFja01lc3NhZ2UgPSAnJztcbiAgcHJpdmF0ZSBfY29weUZlZWRiYWNrVGltZXI/OiBudW1iZXI7XG5cbiAgLyoqIExhYmVscyBkZSBs4oCZaW50ZXJmYWNlLiBGdXNpb25uw6lzIGRlcHVpcyBKUVRfSTE4Tl9ERUZBVUxUUyBldCBsZSB0b2tlbiBKUVRfSTE4TiBpbmplY3TDqS4gKi9cbiAgcmVhZG9ubHkgaTE4bjogSnF0STE4biA9IHRoaXMuX2kxOG5SYXdcbiAgICA/IHsgLi4uSlFUX0kxOE5fREVGQVVMVFMsIC4uLnRoaXMuX2kxOG5SYXcgfVxuICAgIDogeyAuLi5KUVRfSTE4Tl9ERUZBVUxUUyB9O1xuXG4gIGlzR3JvdXBIZWFkZXIgPSAoXzogbnVtYmVyLCByb3c6IGFueSk6IGJvb2xlYW4gPT4gcm93W0dST1VQX0hFQURFUl9NQVJLRVJdID09PSB0cnVlO1xuXG4gIC8qKiBSZXRvdXJuZSB0cnVlIHNpIGxhIGxpZ25lIGRlIGdyb3VwZSBlc3QgdW5lIGxpZ25lIG5vcm1hbGUgKG5pIGxhenksIG5pIHRvby1tYW55KS4gKi9cbiAgaXNOb3JtYWxHcm91cFJvdyhyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByb3dbUk9XX0dST1VQX0tFWV0gIT09IEdST1VQX0tFWV9MQVpZX0xPQURJTkcgJiYgcm93W1JPV19HUk9VUF9LRVldICE9PSBHUk9VUF9LRVlfVE9PX01BTlk7XG4gIH1cbiAgaXNHcm91cFJvd0xvYWRpbmcocm93OiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHJvd1tST1dfR1JPVVBfS0VZXSA9PT0gR1JPVVBfS0VZX0xBWllfTE9BRElORzsgfVxuICBpc0dyb3VwUm93VG9vTWFueShyb3c6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gcm93W1JPV19HUk9VUF9LRVldID09PSBHUk9VUF9LRVlfVE9PX01BTlk7IH1cblxuICAvKiogR8OocmUgbGUgY2xpYyBzdXIgdW5lIGxpZ25lIGQnZW4tdMOqdGUgZGUgZ3JvdXBlIChuby1vcCBwb3VyIGxlcyDDqXRhdHMgc3DDqWNpYXV4KS4gKi9cbiAgb25Hcm91cEhlYWRlckNsaWNrKHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTm9ybWFsR3JvdXBSb3cocm93KSkgcmV0dXJuO1xuICAgIHRoaXMudG9nZ2xlR3JvdXBDb2xsYXBzZShyb3dbUk9XX0dST1VQX0tFWV0pO1xuICB9XG5cbiAgLyoqIEdlc3Rpb25uYWlyZSBleHBvcnQgQ1NWLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leHBvcnQgPSBuZXcgRXhwb3J0TWFuYWdlcjxUPihcbiAgICAoKSA9PiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MsXG4gICAgKCkgPT4gdGhpcy5hY3RpdmVGaWVsZHMsXG4gICAgKCkgPT4gdGhpcy5yZXNvbHZlZENvbmZpZy5leHBvcnQsXG4gICAgKGNvbCwgcm93LCBpZHgpID0+IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaWR4KSxcbiAgKTtcblxuICAvLyDilIDilIAgTGlmZWN5Y2xlXG5cbiAgcGFnZVNpemUgPSA1O1xuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XG4gIHBhZ2VTaXplT3B0aW9uc0dyb3VwQnk6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XG5cbiAgZHJhZ2dlZENvbHVtbktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdPdmVyQ29sdW1uS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyDilIDilIAgTW9kZSDDqWRpdGlvbiAoUHLDqWbDqXJlbmNlcylcbiAgLyoqIFZyYWkgcXVhbmQgbGUgbW9kZSDDqWRpdGlvbiBlc3QgYWN0aWYgKHJlc2l6ZSArIGRyYWcgY29sb25uZXMsIGludGVyYWN0aW9ucyBkw6lzYWN0aXbDqWVzKS4gKi9cbiAgX2VkaXRNb2RlID0gZmFsc2U7XG4gIC8qKiBMYXJnZXVycyBkZSBjb2xvbm5lcyBwZXJzb25uYWxpc8OpZXMgcGFyIGwndXRpbGlzYXRldXIgKGNsw6kg4oaSIHB4KS4gKi9cbiAgX2NvbHVtbldpZHRoczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAvKiogTWVzc2FnZSBkZSBmZWVkYmFjayBhcHLDqHMgc2F2ZS9jbGVhci4gYG51bGxgID0gcGFzIGRlIG1lc3NhZ2UuICovXG4gIF9wcmVmZXJlbmNlc01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVnJhaSBzaSB1bmUgY29uZmlndXJhdGlvbiBlc3Qgc2F1dmVnYXJkw6llIHBvdXIgY2UgdGFibGVhdS4gKi9cbiAgX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZWZlcmVuY2VzTWFuYWdlcjogVGFibGVQcmVmZXJlbmNlc01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIHRydWUgdW5lIGZvaXMgcXVlIGxlIGdyb3VwLWJ5IHBhciBkw6lmYXV0IGEgw6l0w6kgaW5pdGlhbGlzw6kgKMOpdml0ZSBkZSByZWNvbmZpZ3VyZXIgR3JvdXBCeU1hbmFnZXIgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgZG9ubsOpZXMpLiAqL1xuICBwcml2YXRlIF9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVzaXplU3RhdGU6IHsga2V5OiBzdHJpbmc7IHN0YXJ0WDogbnVtYmVyOyBzdGFydFdpZHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogRHluYW1pYyBzbGljZSBrZXlzIMOgIHJlc3RhdXJlciBhcHLDqHMgbmdBZnRlclZpZXdJbml0IChzbGljZVBhbmVsUmVmIHBhcyBlbmNvcmUgZGlzcG8pLiAqL1xuICBwcml2YXRlIF9wZW5kaW5nRHluYW1pY1NsaWNlS2V5czogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIEZpbHRyZXMgZGUgc2xpY2Ugw6AgcmVzdGF1cmVyIGFwcsOocyBuZ0FmdGVyVmlld0luaXQgKHNsaWNlUGFuZWxSZWYgcGFzIGVuY29yZSBkaXNwbykuICovXG4gIHByaXZhdGUgX3BlbmRpbmdTbGljZUZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVzb2x2ZWRDb25maWc6IFRhYmxlUHJvdmlkZXI8VD4gPSB7IGNvbHVtbnM6IFtdIH07XG4gIHByaXZhdGUgX2NvbHVtbk1hcDogTWFwPHN0cmluZywgVGFibGVDb2x1bW5Qcm92aWRlcjxUPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3Jlc29sdmVkRGF0YTogVFtdID0gW107XG4gIHByaXZhdGUgX3ByZXNlcnZlUGFnZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdENvbmZpZ0NsZWFyU2VhcmNoSW5wdXQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9pbml0aWFsU2VhcmNoUXVlcnlBcHBsaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2xhc3RJbml0aWFsU2VhcmNoUXVlcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBTZXVpbCBhdS1kZWzDoCBkdXF1ZWwgbGUgcmVuZHUgZ3JvdXDDqSBlc3QgYmxvcXXDqSBwb3VyIHByb3TDqWdlciBsZSBuYXZpZ2F0ZXVyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9HUk9VUF9DT1VOVCA9IDUwMDtcblxuICAvLyDilIDilIAgT3B0aW1pc2F0aW9uIHBlcmZvcm1hbmNlXG4gIHByaXZhdGUgX2FsbEZpbHRlcmVkUm93czogVFtdID0gW107XG4gIHByaXZhdGUgX3BhZ2luYXRvclN1YnNjcmliZWQ6IE1hdFBhZ2luYXRvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBDYWNoZSBncm91cEJ5IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgcm93cy9rZXkvdHJpIGNoYW5nZW50LiAqL1xuICBwcml2YXRlIF9ncm91cENhY2hlOiBHcm91cEJ5Q2FjaGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlbmRlcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmZXJyZWRUaW1lcnMgPSBuZXcgU2V0PFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+PigpO1xuICBwcml2YXRlIF9oZWFkZXJNZWFzdXJlRnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9kZXN0cm95ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfY29uZmlnSGlkZGVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cbiAgLyoqIENsw6lzIGRlcyBjb2xvbm5lcyB2aXNpYmxlcyBkdSBkZXJuaWVyIMOpbWlzc2lvbiBjb2x1bW5zQ2hhbmdlIChwb3VyIMOpdml0ZXIgbGVzIMOpbWlzc2lvbnMgZHVwbGlxdWVtZW50KS4gKi9cbiAgcHJpdmF0ZSBfcHJldkNvbHVtbktleXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBlbWl0Q29sdW1uc0NoYW5nZUlmTmVlZGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRLZXlzID0gWy4uLnRoaXMucmVuZGVyZWRDb2x1bW5zXTtcbiAgICBpZiAobmV4dEtleXMubGVuZ3RoID09PSB0aGlzLl9wcmV2Q29sdW1uS2V5cy5sZW5ndGhcbiAgICAgICYmIG5leHRLZXlzLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBrZXkgPT09IHRoaXMuX3ByZXZDb2x1bW5LZXlzW2luZGV4XSkpIHJldHVybjtcbiAgICB0aGlzLl9wcmV2Q29sdW1uS2V5cyA9IG5leHRLZXlzO1xuICAgIHRoaXMuY29sdW1uc0NoYW5nZS5lbWl0KG5leHRLZXlzKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhQ2hhbmdlZCA9ICEhKGNoYW5nZXNbJ2NvbmZpZyddIHx8IGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydkYXRhU291cmNlJ10pO1xuICAgIGlmIChkYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fbGF6eS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLmFwcGx5Q29uZmlnU2VhcmNoUmVzZXQoKTtcbiAgICAgIHRoaXMuYXBwbHlJbml0aWFsU2VhcmNoUXVlcnkoY2hhbmdlc1snY29uZmlnJ10uZmlyc3RDaGFuZ2UpO1xuICAgICAgdGhpcy5faW52YWxpZGF0ZU9yZ2FuaXplckNvbmZpZygpOyAvLyBsZXMgY29sb25uZXMgb250IHB1IGNoYW5nZXJcbiAgICB9XG4gICAgaWYgKGRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5maWx0ZXIoYyA9PiBjLmxhenkpLmZvckVhY2goYyA9PiB0aGlzLnRyaWdnZXJMYXp5RmV0Y2goYykpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWJ1aWxkQ2VsbERlZk1hcCgpO1xuICAgIHRoaXMuX2NlbGxEZWZzLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVidWlsZENlbGxEZWZNYXAoKTtcbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgIHRoaXMuYXR0YWNoU29ydCgpO1xuICAgIHRoaXMuX21lYXN1cmVIZWFkZXJIZWlnaHQoKTtcbiAgICB0aGlzLl9vYnNlcnZlVGFibGVTaGVsbFdpZHRoKCk7XG4gICAgdGhpcy5fYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb2JzZXJ2ZVRhYmxlU2hlbGxXaWR0aCgpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJsZVNoZWxsID0gdGhpcy50YWJsZVNoZWxsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdGFibGVTaGVsbCB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG5cbiAgICB0aGlzLl90YWJsZVNoZWxsUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKFtlbnRyeV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbXBhY3QgPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aCA8IDY2MDtcbiAgICAgIGNvbnN0IGxhYmVsID0gY29tcGFjdCA/ICdQYXIgcGFnZSA6JyA6IHRoaXMuX2Z1bGxJdGVtc1BlclBhZ2VMYWJlbDtcbiAgICAgIGlmICh0aGlzLl9wYWdpbmF0b3JJbnRsLml0ZW1zUGVyUGFnZUxhYmVsID09PSBsYWJlbCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdG9ySW50bC5pdGVtc1BlclBhZ2VMYWJlbCA9IGxhYmVsO1xuICAgICAgICB0aGlzLl9wYWdpbmF0b3JJbnRsLmNoYW5nZXMubmV4dCgpO1xuICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl90YWJsZVNoZWxsUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0YWJsZVNoZWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzUGVuZGluZ0R5bmFtaWMgPSAhIXRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdGaWx0ZXJzID0gISF0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgIGlmICghaGFzUGVuZGluZ0R5bmFtaWMgJiYgIWhhc1BlbmRpbmdGaWx0ZXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxDb2xzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdO1xuICAgIGNvbnN0IGtleXMgPSBoYXNQZW5kaW5nRHluYW1pYyA/IFsuLi50aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyFdIDogW107XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPyB7IC4uLnRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgfSA6IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuXG4gICAgdGhpcy5fc2NoZWR1bGVEZWZlcnJlZCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVzb2x2ZWREYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gbmdBZnRlclZpZXdJbml0OiBkb25uw6llcyBhYnNlbnRlcywgcmVzdGF1cmF0aW9uIGRpZmbDqXLDqWUgw6AgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsJywgeyBrZXlzLCBmaWx0ZXJzIH0pO1xuICAgICAgICBpZiAoZmlsdGVycykgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzID0gWy4uLmtleXNdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gbmdBZnRlclZpZXdJbml0OiBkb25uw6llcyBwcsOpc2VudGVzLCBhcHBsaWNhdGlvbiBpbW3DqWRpYXRlJywgeyBrZXlzLCBmaWx0ZXJzIH0pO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGFsbENvbHMuZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgICAgICBpZiAoY29sKSB0aGlzLmFkZER5bmFtaWNTbGljZShjb2wpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmlsdGVycyAmJiB0aGlzLnNsaWNlUGFuZWxSZWYpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTbGljZVJlc3RvcmVdIHJlc3RvcmVGaWx0ZXJzIGRlcHVpcyBuZ0FmdGVyVmlld0luaXQnLCBmaWx0ZXJzKTtcbiAgICAgICAgdGhpcy5zbGljZVBhbmVsUmVmLnJlc3RvcmVGaWx0ZXJzKGZpbHRlcnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLl90YWJsZVNoZWxsUmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5fY29weUZlZWRiYWNrVGltZXIgIT09IHVuZGVmaW5lZCkgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9jb3B5RmVlZGJhY2tUaW1lcik7XG4gICAgaWYgKHRoaXMuX3BlbmRpbmdSZW5kZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nUmVuZGVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIpO1xuICAgIH1cbiAgICB0aGlzLl9kZWZlcnJlZFRpbWVycy5mb3JFYWNoKHRpbWVyID0+IGNsZWFyVGltZW91dCh0aW1lcikpO1xuICAgIHRoaXMuX2RlZmVycmVkVGltZXJzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuX2hlYWRlck1lYXN1cmVGcmFtZSAhPT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faGVhZGVyTWVhc3VyZUZyYW1lKTtcbiAgICAvLyBOZXR0b2llIHVuIMOpdmVudHVlbCByZXNpemUgZW4gY291cnMgKGxpc3RlbmVycyB3aW5kb3cgbm9uIHJldGlyw6lzKVxuICAgIHRoaXMuX3Jlc2l6ZVN0YXRlID0gbnVsbDtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9vcmdhbml6ZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWVhc3VyZUhlYWRlckhlaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBtZWFzdXJlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ci5tYXQtbWRjLWhlYWRlci1yb3cnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmIChoZWFkZXJSb3cpIHtcbiAgICAgICAgY29uc3QgaCA9IGhlYWRlclJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIGlmIChoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tYWN0dWFsLWhlYWRlci1oZWlnaHQnLCBoICsgJ3B4Jyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBIZWFkZXIgcGFzIGVuY29yZSByZW5kdSAoZXg6IGxhenkgQW5ndWxhciBNYXRlcmlhbCksIG9uIHLDqWVzc2FpZSBhcHLDqHMgbGUgcHJvY2hhaW4gZnJhbWVcbiAgICAgIHRoaXMuX3NjaGVkdWxlSGVhZGVyTWVhc3VyZShtZWFzdXJlKTtcbiAgICB9O1xuICAgIHRoaXMuX3NjaGVkdWxlSGVhZGVyTWVhc3VyZShtZWFzdXJlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlSGVhZGVyTWVhc3VyZShtZWFzdXJlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2hlYWRlck1lYXN1cmVGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2hlYWRlck1lYXN1cmVGcmFtZSA9IG51bGw7XG4gICAgICAgIG1lYXN1cmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NoZWR1bGVEZWZlcnJlZChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9kZWZlcnJlZFRpbWVycy5kZWxldGUodGltZXIpO1xuICAgICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIGNhbGxiYWNrKCk7XG4gICAgfSwgMCk7XG4gICAgdGhpcy5fZGVmZXJyZWRUaW1lcnMuYWRkKHRpbWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX29yZ2FuaXplckNvbmZpZ0NhY2hlOiBPcmdhbml6ZXJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaW52YWxpZGF0ZU9yZ2FuaXplckNvbmZpZygpOiB2b2lkIHsgdGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGUgPSBudWxsOyB9XG4gIGdldCBvcmdhbml6ZXJDb25maWcoKTogT3JnYW5pemVyQ29uZmlnIHtcbiAgICBpZiAodGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGUpIHJldHVybiB0aGlzLl9vcmdhbml6ZXJDb25maWdDYWNoZTtcbiAgICBjb25zdCBhbGxDb2xzID0gWy4uLnRoaXMuX29yZ2FuaXplci5tZW51QmFzZUZpZWxkcywgLi4udGhpcy5fb3JnYW5pemVyLm1lbnVPcHRpb25hbEZpZWxkc107XG4gICAgY29uc3Qgb3JnYW5pemVyT3B0aW9ucyA9IHRoaXMucmVzb2x2ZWRDb25maWcub3JnYW5pemVyO1xuICAgIHRoaXMuX29yZ2FuaXplckNvbmZpZ0NhY2hlID0ge1xuICAgICAgZmllbGRzOiB0aGlzLl9vcmdhbml6ZXIuc2hvd0ZpZWxkcyA/IGFsbENvbHMubWFwKGMgPT4gKHtcbiAgICAgICAgaWQ6IGMua2V5LFxuICAgICAgICBsYWJlbDogdGhpcy5jb2xMYWJlbChjKSxcbiAgICAgICAgaWNvbjogYy5pY29uLFxuICAgICAgICBzdGF0ZTogJ3JlYWR5JyBhcyBjb25zdCxcbiAgICAgIH0pKSA6IHVuZGVmaW5lZCxcbiAgICAgIGdyb3VwczogdGhpcy5fb3JnYW5pemVyLnNob3dHcm91cEJ5U2VjdGlvbiA/IHRoaXMuX29yZ2FuaXplci5ncm91cEJ5RmllbGRzLm1hcChjID0+ICh7XG4gICAgICAgIGlkOiBjLmtleSxcbiAgICAgICAgbGFiZWw6IHRoaXMuY29sTGFiZWwoYyksXG4gICAgICAgIGljb246IGMuaWNvbixcbiAgICAgIH0pKSA6IHVuZGVmaW5lZCxcbiAgICAgIHNsaWNlczogdGhpcy5fb3JnYW5pemVyLnNob3dTbGljZUJ5U2VjdGlvbiA/IHRoaXMuX3NsaWNlQnlNZW51SXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgaWQ6IGl0ZW0ua2V5LFxuICAgICAgICBsYWJlbDogaXRlbS50aXRsZSxcbiAgICAgICAgaWNvbjogaXRlbS5pY29uLFxuICAgICAgfSkpIDogdW5kZWZpbmVkLFxuICAgICAgYnV0dG9uTGFiZWw6IG9yZ2FuaXplck9wdGlvbnM/LmJ1dHRvbkxhYmVsLFxuICAgICAgYnV0dG9uSWNvbjogb3JnYW5pemVyT3B0aW9ucz8uYnV0dG9uSWNvbixcbiAgICAgIHNob3dCdXR0b25JY29uOiBvcmdhbml6ZXJPcHRpb25zPy5zaG93QnV0dG9uSWNvbixcbiAgICAgIHNob3dFeHBvcnQ6IHRoaXMuc2hvd0V4cG9ydEJ1dHRvbixcbiAgICAgIG9uRXhwb3J0OiAoKSA9PiB0aGlzLm9uRXhwb3J0KCksXG4gICAgICBzaG93UHJlZmVyZW5jZXM6IHRoaXMuc2hvd1ByZWZlcmVuY2VzTWVudSxcbiAgICAgIGhhc1NhdmVkUHJlZmVyZW5jZXM6IHRoaXMuaGFzU2F2ZWRQcmVmZXJlbmNlcyxcbiAgICAgIG9uUHJlZmVyZW5jZXNFZGl0OiAoKSA9PiB0aGlzLmVudGVyRWRpdE1vZGUoKSxcbiAgICAgIG9uUHJlZmVyZW5jZXNTYXZlOiAoKSA9PiB0aGlzLnNhdmVQcmVmZXJlbmNlcygpLFxuICAgICAgb25QcmVmZXJlbmNlc0NsZWFyOiAoKSA9PiB0aGlzLmNsZWFyUHJlZmVyZW5jZXMoKSxcbiAgICAgIHNob3dBY3Rpb25zOiB0aGlzLnJlc29sdmVkQ29uZmlnLnNob3dBY3Rpb25zID09PSB0cnVlLFxuICAgICAgb25Db3B5VmlzdWFsOiB0aGlzLnJlc29sdmVkQ29uZmlnLm9uQ29weVZpc3VhbCA/PyAoKCkgPT4gdGhpcy5jb3B5VmlzdWFsU25hcHNob3QoKSksXG4gICAgICBvblRvZ2dsZUZ1bGxzY3JlZW46IHRoaXMucmVzb2x2ZWRDb25maWcub25Ub2dnbGVGdWxsc2NyZWVuID8/ICh0aGlzLmZ1bGxzY3JlZW5TdXBwb3J0ZWQgPyAoKSA9PiB0aGlzLnRvZ2dsZUZ1bGxzY3JlZW4oKSA6IHVuZGVmaW5lZCksXG4gICAgICBpc0Z1bGxzY3JlZW46IHRoaXMuX2lzRnVsbHNjcmVlbixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXJDb25maWdDYWNoZTtcbiAgfVxuXG4gIGdldCBvcmdhbml6ZXJIaWRlTWVudVZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5vcmdhbml6ZXI/LmhpZGVNZW51VmFsdWVzID09PSB0cnVlO1xuICB9XG5cbiAgZ2V0IG9yZ2FuaXplclN0YXRlKCk6IE9yZ2FuaXplclN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZUZpZWxkczogdGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBzZWxlY3RlZEdyb3VwQnk6IHRoaXMuYWN0aXZlR3JvdXBCeUtleSA/PyB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZFNsaWNlczogdGhpcy5fc2xpY2VCeU1lbnVJdGVtc1xuICAgICAgICAuZmlsdGVyKGkgPT4gdGhpcy5pc1NsaWNlTWVudUl0ZW1BY3RpdmUoaSkpXG4gICAgICAgIC5tYXAoaSA9PiBpLmtleSksXG4gICAgfTtcbiAgfVxuXG4gIG9uT3JnYW5pemVyVmlld0NoYW5nZShldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2ZpZWxkVG9nZ2xlZCcpIHtcbiAgICAgIGNvbnN0IGFsbENvbHMgPSBbLi4udGhpcy5fb3JnYW5pemVyLm1lbnVCYXNlRmllbGRzLCAuLi50aGlzLl9vcmdhbml6ZXIubWVudU9wdGlvbmFsRmllbGRzXTtcbiAgICAgIGNvbnN0IG5ld1Zpc2libGUgPSBuZXcgU2V0KGV2ZW50LnN0YXRlLnZpc2libGVGaWVsZHMgPz8gW10pO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgYWxsQ29scykge1xuICAgICAgICBjb25zdCBpc05vd1Zpc2libGUgPSBuZXdWaXNpYmxlLmhhcyhjb2wua2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNDb2x1bW5WaXNpYmxlKGNvbC5rZXkpICE9PSBpc05vd1Zpc2libGUpIHtcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2wsIGlzTm93VmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09ICdncm91cEJ5U2VsZWN0ZWQnKSB7XG4gICAgICBjb25zdCBuZXdLZXkgPSBldmVudC5zdGF0ZS5zZWxlY3RlZEdyb3VwQnkgPz8gbnVsbDtcbiAgICAgIHRoaXMub25Hcm91cEJ5Q2hhbmdlKG5ld0tleSA9PT0gdGhpcy5hY3RpdmVHcm91cEJ5S2V5ID8gbnVsbCA6IG5ld0tleSk7XG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAnc2xpY2VTZWxlY3RlZCcpIHtcbiAgICAgIGNvbnN0IHByZXZTbGljZXMgPSBuZXcgU2V0KHRoaXMub3JnYW5pemVyU3RhdGUuc2VsZWN0ZWRTbGljZXMgPz8gW10pO1xuICAgICAgY29uc3QgbmV4dFNsaWNlcyA9IG5ldyBTZXQoZXZlbnQuc3RhdGUuc2VsZWN0ZWRTbGljZXMgPz8gW10pO1xuICAgICAgY29uc3QgY2xpY2tlZElkID0gWy4uLnByZXZTbGljZXNdLmZpbmQoaWQgPT4gIW5leHRTbGljZXMuaGFzKGlkKSlcbiAgICAgICAgPz8gWy4uLm5leHRTbGljZXNdLmZpbmQoaWQgPT4gIXByZXZTbGljZXMuaGFzKGlkKSk7XG4gICAgICBpZiAoY2xpY2tlZElkKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zLmZpbmQoaSA9PiBpLmtleSA9PT0gY2xpY2tlZElkKTtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMub25TbGljZU1lbnVJdGVtQ2xpY2soaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLnRpdGxlID8/ICcnO1xuICB9XG5cbiAgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnJlc29sdmVkQ29uZmlnLnRpdGxlO1xuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRmllbGRzO1xuICB9XG5cbiAgZ2V0IHNob3dTZWFyY2hCYXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLnNlYXJjaD8uZW5hYmxlZCA9PT0gdHJ1ZTsgfVxuICBnZXQgc2hvd1ZpZXdCdXR0b24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuZW5hYmxlZCB8fCB0aGlzLnNob3dFeHBvcnRCdXR0b24gfHwgdGhpcy5zaG93UHJlZmVyZW5jZXNNZW51OyB9XG4gIGdldCBzaG93T3JnYW5pemVyQnV0dG9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmVuYWJsZWQgfHwgdGhpcy5zaG93RXhwb3J0QnV0dG9uIHx8IHRoaXMuc2hvd1ByZWZlcmVuY2VzTWVudTsgfVxuICBnZXQgc2hvd1NsaWNlRXhwYW5kQnRuKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fc2hvd1NsaWNlUGFuZWwgJiYgdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCAmJiB0aGlzLl9zbGljZVNob3dUb2dnbGU7IH1cbiAgZ2V0IHNob3dFeHBvcnRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcuZXhwb3J0Py5lbmFibGVkID09PSB0cnVlO1xuICB9XG4gIGdldCBzaG93UHJlZmVyZW5jZXNNZW51KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzPy5lbmFibGVkID09PSB0cnVlO1xuICB9XG5cbiAgZ2V0IGlzRGVmYXVsdEdyb3VwQnlBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUdyb3VwQnlLZXkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVHcm91cEJ5S2V5ID09PSB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRHcm91cEJ5O1xuICB9XG5cbiAgZ2V0IGhhc1NhdmVkUHJlZmVyZW5jZXMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oYXNTYXZlZENvbmZpZzsgfVxuXG4gIGdldCBzaG93VG9vbGJhcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc2hvd1NlYXJjaEJhciB8fCB0aGlzLnNob3dWaWV3QnV0dG9uIHx8IHRoaXMuc2hvd1NsaWNlRXhwYW5kQnRuOyB9XG4gIGdldCBmdWxsc2NyZWVuU3VwcG9ydGVkKCk6IGJvb2xlYW4geyByZXR1cm4gRnVsbHNjcmVlbk1hbmFnZXIuaXNTdXBwb3J0ZWQodGhpcy5fZWwubmF0aXZlRWxlbWVudCk7IH1cblxuICBhc3luYyB0b2dnbGVGdWxsc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBGdWxsc2NyZWVuTWFuYWdlci50b2dnbGUodGhpcy5fZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLl9pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5faW52YWxpZGF0ZU9yZ2FuaXplckNvbmZpZygpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBDcsOpZSB1biBzbmFwc2hvdCBhdXRvbm9tZSBldCBsZSBwbGFjZSBkYW5zIGxlIHN0b2NrYWdlIHBhcnRhZ8OpLiAqL1xuICBjb3B5VmlzdWFsU25hcHNob3QobGFiZWw/OiBzdHJpbmcpOiBWaXN1YWxTbmFwc2hvdCB8IG51bGwge1xuICAgIGNvbnN0IHNuYXBzaG90TGFiZWwgPSBsYWJlbCA/PyAodGhpcy50aXRsZSB8fCAnVGFibGVhdScpO1xuICAgIGlmICghc25hcHNob3RMYWJlbD8udHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBWaXN1YWxTbmFwc2hvdFN0b3JhZ2UoKS5jcmVhdGUodGhpcy5jcmVhdGVWaXN1YWxTbmFwc2hvdChzbmFwc2hvdExhYmVsLnRyaW0oKSkpO1xuICAgIHRoaXMudmlzdWFsQ29waWVkLmVtaXQoc25hcHNob3QpO1xuICAgIHRoaXMuc2hvd0NvcHlGZWVkYmFjaygpO1xuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0NvcHlGZWVkYmFjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3B5RmVlZGJhY2suZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcbiAgICB0aGlzLmNvcHlGZWVkYmFja01lc3NhZ2UgPSB0aGlzLmNvcHlGZWVkYmFjay5tZXNzYWdlIHx8ICdDb3Bpw6knO1xuICAgIGlmICh0aGlzLl9jb3B5RmVlZGJhY2tUaW1lciAhPT0gdW5kZWZpbmVkKSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2NvcHlGZWVkYmFja1RpbWVyKTtcbiAgICB0aGlzLl9jb3B5RmVlZGJhY2tUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuY29weUZlZWRiYWNrTWVzc2FnZSA9ICcnLCB0aGlzLmNvcHlGZWVkYmFjay5kdXJhdGlvbk1zID8/IDIyMDApO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6ZnVsbHNjcmVlbmNoYW5nZScpXG4gIG9uRnVsbHNjcmVlbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Z1bGxzY3JlZW4gPSBGdWxsc2NyZWVuTWFuYWdlci5pc0FjdGl2ZSh0aGlzLl9lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9pbnZhbGlkYXRlT3JnYW5pemVyQ29uZmlnKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZXhwYW5kU2xpY2VQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUGFuZWxSZWY/LnRvZ2dsZVBhbmVsKCk7XG4gIH1cbiAgZ2V0IHNob3dGaWVsZHMoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2hvd0ZpZWxkczsgfVxuICBnZXQgc2hvd0dyb3VwQnlTZWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNob3dHcm91cEJ5U2VjdGlvbjsgfVxuXG4gIGdldCBmaWx0ZXJlZFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXBCeUtleSA/IHRoaXMuX3RvdGFsRmlsdGVyZWRDb3VudCA6IHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGg7XG4gIH1cblxuICBnZXQgYWN0aXZlR3JvdXBCeUxhYmVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuYWN0aXZlR3JvdXBCeUxhYmVsOyB9XG5cbiAgZ2V0IHRvdGFsQ29sdW1uQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci50b3RhbEZpZWxkQ291bnQ7IH1cblxuICBnZXQgYWN0aXZlU2xpY2VCeUxhYmVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hY3RpdmVMYWJlbDsgfVxuXG4gIGdldCBhY3RpdmVEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hY3RpdmVEeW5hbWljRmllbGRzOyB9XG5cbiAgcmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUGFuZWxSZWY/LnJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGtleSk7XG4gIH1cblxuICBnZXQgZ3JvdXBCeUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5ncm91cEJ5RmllbGRzOyB9XG5cbiAgY29sTGFiZWwoY29sOiB7IGtleTogc3RyaW5nOyBoZWFkZXI/OiBzdHJpbmcgfSk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuZmllbGRMYWJlbChjb2wpOyB9XG5cbiAgb25TZWFyY2hDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgICB0aGlzLnNlYXJjaENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoUXVlcnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRHcm91cEJ5QW5kRW1pdChrZXk6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0tleSA9IHRoaXMuX29yZ2FuaXplci5ncm91cEJ5LmFjdGl2ZUtleSA/PyBudWxsO1xuICAgIHRoaXMuX29yZ2FuaXplci5zZXRHcm91cEJ5KGtleSk7XG4gICAgY29uc3QgbmV4dEtleSA9IHRoaXMuX29yZ2FuaXplci5ncm91cEJ5LmFjdGl2ZUtleSA/PyBudWxsO1xuICAgIGlmIChwcmV2aW91c0tleSAhPT0gbmV4dEtleSkgdGhpcy5ncm91cEJ5Q2hhbmdlLmVtaXQobmV4dEtleSk7XG4gIH1cblxuICBvbkdyb3VwQnlDaGFuZ2Uoa2V5OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRHcm91cEJ5QW5kRW1pdChrZXkpO1xuICAgIHRoaXMuX2dyb3VwQnkuc2V0RGVmYXVsdENvbGxhcHNlZChrZXkgIT09IG51bGwpO1xuICAgIHRoaXMuX2dyb3VwQnkucmVzZXQoKTtcbiAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoY29sRGVmPy5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGtleSkgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2xEZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5fc2NoZWR1bGVEZWZlcnJlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkub25Hcm91cFBhZ2VTaXplQ2hhbmdlKE51bWJlcihzaXplKSk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5vbkdyb3VwU29ydFRvZ2dsZShkaXIsIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLl9zY2hlZHVsZURlZmVycmVkKCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpKSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXp5Q29sdW1uU3RhdHVzKGtleTogc3RyaW5nKTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InIHtcbiAgICByZXR1cm4gdGhpcy5fbGF6eS5nZXRTdGF0dXMoa2V5KTtcbiAgfVxuXG4gIGdldExhenlSZW5kZXJUeXBlKHJvd1ZhbHVlOiBhbnkpOiAnbG9hZGluZycgfCAnZXJyb3InIHwgJ3ZhbHVlJyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhenkuZ2V0UmVuZGVyVHlwZShyb3dWYWx1ZSk7XG4gIH1cblxuICByZXRyeUxhenlDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fbGF6eS5yZXRyeShjb2x1bW4sIHRoaXMuX3Jlc29sdmVkRGF0YSwgdGhpcy5fbGF6eUNhbGxiYWNrcygpKTtcbiAgfVxuXG4gIHRyaWdnZXJMYXp5RmV0Y2goY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fbGF6eS5mZXRjaChjb2x1bW4sIHRoaXMuX3Jlc29sdmVkRGF0YSwgdGhpcy5fbGF6eUNhbGxiYWNrcygpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xhenlDYWxsYmFja3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4gdGhpcy5yZWZyZXNoVmlld01vZGVsKCksXG4gICAgICBvbk1hcmtGb3JDaGVjazogKCkgPT4gdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpLFxuICAgIH07XG4gIH1cblxuICB0b2dnbGVHcm91cENvbGxhcHNlKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5LnRvZ2dsZUdyb3VwQ29sbGFwc2UoZ3JvdXBLZXksIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLl9zY2hlZHVsZURlZmVycmVkKCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvR3JvdXBIZWFkZXIoZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3Qgcm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0cltkYXRhLWdyb3VwLWtleT1cIiR7Q1NTLmVzY2FwZShncm91cEtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBOdW1iZXIucGFyc2VGbG9hdChcbiAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1hY3R1YWwtaGVhZGVyLWhlaWdodCcpIHx8ICc1NidcbiAgICApIHx8IDU2O1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgcm93UmVjdCA9IHJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDtcbiAgICBjb25zdCB0YXJnZXRTY3JvbGxUb3AgPSBjdXJyZW50U2Nyb2xsVG9wICsgKHJvd1JlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3ApIC0gaGVhZGVySGVpZ2h0O1xuICAgIGNvbnRhaW5lci5zY3JvbGxUbyh7IHRvcDogdGFyZ2V0U2Nyb2xsVG9wLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICBpc0dyb3VwQ29sbGFwc2VkKGdyb3VwS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBCeS5pc0dyb3VwQ29sbGFwc2VkKGdyb3VwS2V5KTtcbiAgfVxuXG4gIGdyb3VwUGFnZUJhY2soZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkuZ3JvdXBQYWdlQmFjayhncm91cEtleSk7XG4gIH1cblxuICBncm91cFBhZ2VGb3J3YXJkKGdyb3VwS2V5OiBzdHJpbmcsIHRvdGFsQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkuZ3JvdXBQYWdlRm9yd2FyZChncm91cEtleSwgdG90YWxDb3VudCk7XG4gIH1cblxuICBnZXQgaGFzQWRkYWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5tZW51QmFzZUZpZWxkcy5sZW5ndGggPiAwIHx8IHRoaXMuX29yZ2FuaXplci5tZW51T3B0aW9uYWxGaWVsZHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBtZW51QmFzZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLm1lbnVCYXNlRmllbGRzO1xuICB9XG5cbiAgZ2V0IG1lbnVPcHRpb25hbENvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLm1lbnVPcHRpb25hbEZpZWxkcztcbiAgfVxuXG4gIGdldCBhdmFpbGFibGVDb2x1bW5zVG9BZGQoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gbmV3IFNldCh0aGlzLmFjdGl2ZUZpZWxkcy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSkpO1xuICAgIHJldHVybiAodGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGMpID0+IGMub3B0aW9uYWwgJiYgIWFjdGl2ZUtleXMuaGFzKGMua2V5KSk7XG4gIH1cblxuICBnZXQgYWxsb3dDb2x1bW5SZW1vdmFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIuYWxsb3dGaWVsZFJlbW92YWw7XG4gIH1cblxuICBnZXQgaGFzU2xpY2VDb25maWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlc29sdmVkQ29uZmlnLnNsaWNlcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIGdldCBzaG93U2xpY2VQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd1NsaWNlUGFuZWw7XG4gIH1cblxuICBvblNsaWNlUGFuZWxDb2xsYXBzZWRDaGFuZ2UoY29sbGFwc2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCgpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNQZW5kaW5nRHluYW1pY1NsaWNlcyA9ICh0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cz8ubGVuZ3RoID8/IDApID4gMDtcbiAgICBjb25zdCBoYXNDZmcgPSB0aGlzLl9zbGljZUNvbmZpZ3MubGVuZ3RoID4gMFxuICAgICAgfHwgdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlRHluYW1pY0ZpZWxkcy5sZW5ndGggPiAwXG4gICAgICB8fCBoYXNQZW5kaW5nRHluYW1pY1NsaWNlcztcbiAgICBjb25zdCB3YXNWaXNpYmxlID0gdGhpcy5fc2hvd1NsaWNlUGFuZWw7XG4gICAgdGhpcy5fc2hvd1NsaWNlUGFuZWwgPSBoYXNDZmcgJiYgdGhpcy5fcmVzb2x2ZWREYXRhLmxlbmd0aCA+IDA7XG4gICAgLy8gTGVzIGRvbm7DqWVzIHZpZW5uZW50IGQnYXJyaXZlciA6IGFwcGxpcXVlciBsZXMgZHluYW1pYyBzbGljZXMgZXQgbGVzIGZpbHRyZXMgZW4gYXR0ZW50ZS5cbiAgICAvLyBMZXMgc2xpY2VzIGR5bmFtaXF1ZXMgc29udCBham91dMOpZXMgYXZhbnQgbGVzIGZpbHRyZXMgcG91ciByZW5kcmUgbGV1cnMgY2zDqXMgZGlzcG9uaWJsZXMuXG4gICAgaWYgKCF3YXNWaXNpYmxlICYmIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmICh0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzIHx8IHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzKSkge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnM7XG4gICAgICBjb25zdCBkeW5hbWljS2V5cyA9IHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzO1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG4gICAgICB0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyA9IG51bGw7XG4gICAgICBjb25zdCBhbGxDb2xzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdO1xuICAgICAgY29uc29sZS5sb2coJ1tTbGljZVJlc3RvcmVdIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbDogZG9ubsOpZXMgYXJyaXbDqWVzJywgeyBkeW5hbWljS2V5cywgZmlsdGVycyB9KTtcbiAgICAgIHRoaXMuX3NjaGVkdWxlRGVmZXJyZWQoKCkgPT4ge1xuICAgICAgICBpZiAoZHluYW1pY0tleXMpIHtcbiAgICAgICAgICBkeW5hbWljS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSBhbGxDb2xzLmZpbmQoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICAgICAgICAgIGlmIChjb2wpIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcnMgJiYgdGhpcy5zbGljZVBhbmVsUmVmKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTbGljZVJlc3RvcmVdIHJlc3RvcmVGaWx0ZXJzIGRlcHVpcyBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwnLCBmaWx0ZXJzKTtcbiAgICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoZmlsdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dBZGRTbGljZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNob3dTbGljZUJ5U2VjdGlvbjtcbiAgfVxuXG4gIGdldCBzdGF0aWNTbGljZXNGb3JNZW51KCk6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGljb24/OiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc3RhdGljU2xpY2VzRm9yTWVudTtcbiAgfVxuXG4gIGdldCBhdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmF2YWlsYWJsZUZvckR5bmFtaWM7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhjb2x1bW5LZXkpO1xuICB9XG5cbiAgdG9nZ2xlU3RhdGljU2xpY2UoY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSBuZXh0LmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgIGVsc2UgbmV4dC5hZGQoY29sdW1uS2V5KTtcbiAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXh0O1xuICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG4gICAgdGhpcy5fc2xpY2VDb25maWdzID0gdGhpcy5fY29tcHV0ZVNsaWNlQ29uZmlncygpO1xuICAgIC8vIFNpIHVuZSBzbGljZSB2aWVudCBkJ8OqdHJlIGNhY2jDqWUsIHLDqWluaXRpYWxpc2UgbGUgZmlsdHJlIGFjdGlmIHBvdXIgw6l2aXRlclxuICAgIC8vIHVuIGZpbHRyZSBvcnBoZWxpbiAobGEgc2xpY2Ugbidlc3QgcGx1cyB2aXNpYmxlIG1haXMgc29uIGZpbHRyZSByZXN0ZXJhaXQgYWN0aWYpXG4gICAgaWYgKG5leHQuaGFzKGNvbHVtbktleSkpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIgPSAoKSA9PiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCgpO1xuICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYWRkRHluYW1pY1NsaWNlKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8uYWRkRHluYW1pY1NsaWNlKGNvbHVtbik7XG4gICAgaWYgKGNvbHVtbi5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbHVtbi5rZXkpICE9PSAnbG9hZGVkJykge1xuICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsbER5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsRHluYW1pY1NsaWNlQ29sdW1ucztcbiAgfVxuXG4gIGlzRHluYW1pY1NsaWNlQWN0aXZlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5pc0R5bmFtaWNTbGljZUFjdGl2ZShrZXkpO1xuICB9XG5cbiAgdG9nZ2xlRHluYW1pY1NsaWNlKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGNvbC5rZXkpKSB7XG4gICAgICB0aGlzLnJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGNvbC5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZER5bmFtaWNTbGljZShjb2wpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2xpY2VGaWx0ZXJDaGFuZ2UocHJlZDogKHJvdzogVCkgPT4gYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIgPSBwcmVkO1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gIH1cblxuICBvbkR5bmFtaWNTbGljZUtleXNDaGFuZ2Uoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLl9vcmdhbml6ZXIub25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKGtleXMpO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGVtcHR5U3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmxhYmVscz8uZW1wdHkgfHwgdGhpcy5pMThuLmVtcHR5U3RhdGU7XG4gIH1cblxuICBnZXQgbG9hZGluZ1N0YXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5sYWJlbHM/LmxvYWRpbmcgfHwgdGhpcy5pMThuLmxvYWRpbmdTdGF0ZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gX3BlbmRpbmdSZW5kZXIgOiBsZSByZW5kdSBpbnRlcm5lIG4nZXN0IHBhcyBlbmNvcmUgdGVybWluw6kg4oaSIHBhcyBkZSBtZXNzYWdlIHZpZGUgcHLDqW1hdHVyw6lcbiAgICByZXR1cm4gIXRoaXMuaXNMb2FkaW5nICYmIHRoaXMuX3BlbmRpbmdSZW5kZXIgPT09IG51bGwgJiYgdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBzaG93UGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5ICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRQYWdpbmF0aW9uU2hvd0ZpcnN0TGFzdEJ1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgIT09IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIuaXNGaWVsZERyYWdEcm9wRW5hYmxlZDtcbiAgfVxuXG4gIGdldCB0b3RhbFJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVHcm91cEJ5S2V5XG4gICAgICA/IHRoaXMudGFibGVEYXRhU291cmNlLmRhdGEuZmlsdGVyKChyKSA9PiAhcltHUk9VUF9IRUFERVJfTUFSS0VSXSkubGVuZ3RoXG4gICAgICA6IHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGg7XG4gIH1cblxuICAvLyDilIDilIAgR2VzdGlvbiBkZXMgY29sb25uZXNcblxuICBvbkFkZENvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiB2b2lkIHtcbiAgICB0aGlzLl9vcmdhbml6ZXIuYWRkRmllbGQoY29sdW1uKTtcbiAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gbnVsbDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcblxuICAgIGlmIChjb2x1bW4ubGF6eSkge1xuICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRSZXF1ZXN0ZWQuZW1pdCgpO1xuICAgIHRoaXMuY29sdW1uQWRkZWQuZW1pdChjb2x1bW4pO1xuICB9XG5cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuX29yZ2FuaXplci5pc0ZpZWxkVmlzaWJsZShjb2x1bW4ua2V5KTtcblxuICAgIGlmIChjaGVja2VkICYmICFpc1Zpc2libGUpIHtcbiAgICAgIHRoaXMub25BZGRDb2x1bW4oY29sdW1uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoZWNrZWQgJiYgaXNWaXNpYmxlKSB7XG4gICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fb3JnYW5pemVyLnJlbW92ZUZpZWxkKGNvbHVtbi5rZXkpO1xuICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm47XG4gICAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gbnVsbDtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgICAgdGhpcy5jb2x1bW5SZW1vdmVkLmVtaXQoY29sdW1uKTtcbiAgICB9XG4gIH1cblxuICBpc0NvbHVtblZpc2libGUoY29sdW1uS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGaWVsZHMuc29tZShjID0+IGMua2V5ID09PSBjb2x1bW5LZXkpO1xuICB9XG5cbiAgb25SZW1vdmVDb2x1bW4oY29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5hY3RpdmVGaWVsZHMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX29yZ2FuaXplci5yZW1vdmVGaWVsZChjb2x1bW5LZXkpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMuY29sdW1uUmVtb3ZlZC5lbWl0KGNvbHVtbik7XG4gIH1cblxuICAvLyDilIDilIAgTGlnbmVzXG5cbiAgcHJpdmF0ZSBfcmVidWlsZENlbGxEZWZNYXAoKTogdm9pZCB7XG4gICAgdGhpcy5fY2VsbERlZk1hcCA9IG5ldyBNYXAoXG4gICAgICAodGhpcy5fY2VsbERlZnMgPz8gW10pLm1hcChkID0+IFtkLmNvbHVtbktleSwgZC50ZW1wbGF0ZV0gYXMgW3N0cmluZywgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9Pl0pXG4gICAgKTtcbiAgfVxuXG4gIGdldENlbGxUZW1wbGF0ZShrZXk6IHN0cmluZyk6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBhbnk7IGluZGV4OiBudW1iZXIgfT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2VsbERlZk1hcC5nZXQoa2V5KSA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGhhc0N1c3RvbUNlbGxEZWZzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jZWxsRGVmTWFwLnNpemUgPiAwO1xuICB9XG5cbiAgZ2V0IGhhc1Jvd0NsaWNrSGFuZGxlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3RlZC5vYnNlcnZlZCB8fCAhIXRoaXMucmVzb2x2ZWRDb25maWcub25Sb3dTZWxlY3RlZDtcbiAgfVxuXG4gIHJvd0FjdGlvbkxhYmVsKHJvdzogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFPDqWxlY3Rpb25uZXIgbGEgbGlnbmUgJHsocm93Py5bUk9XX0lOREVYX0tFWV0gPz8gMCkgKyAxfWA7XG4gIH1cblxuICAvKiogTGFyZ2V1ciBtaW5pbWFsZSBkdSB0YWJsZWF1IGVuIHB4LCBjYWxjdWzDqWUgZGVwdWlzIGxlcyBsYXJnZXVycyBleHBsaWNpdGVzIGRlcyBjb2xvbm5lcyBhY3RpdmVzLlxuICAgKiBSZXRvdXJuZSBudWxsIHNpIGF1Y3VuZSBjb2xvbm5lIG4nYSBkZSBsYXJnZXVyIGTDqWZpbmllIChsZSB0YWJsZWF1IHJlbXBsaXQgYWxvcnMgMTAwJSBkdSBjb250ZW5ldXIpLlxuICAgKiBTZXVsZXMgbGVzIHZhbGV1cnMgZXhwbGljaXRlbWVudCBlbiBgcHhgIHNvbnQgc29tbWFibGVzIDsgbGVzIHBvdXJjZW50YWdlcyBvdSBhdXRyZXMgdW5pdMOpcyBzb250IGlnbm9yw6lzLiAqL1xuICBnZXQgdGFibGVNaW5XaWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoYXNSZXNpemVkID0gT2JqZWN0LmtleXModGhpcy5fY29sdW1uV2lkdGhzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGhhc1NvbWVFeHBsaWNpdFdpZHRoID0gaGFzUmVzaXplZCB8fCB0aGlzLmFjdGl2ZUZpZWxkcy5zb21lKGMgPT4gYy53aWR0aCk7XG4gICAgaWYgKCFoYXNTb21lRXhwbGljaXRXaWR0aCkgcmV0dXJuIG51bGw7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5hY3RpdmVGaWVsZHMpIHtcbiAgICAgIGlmICh0aGlzLl9jb2x1bW5XaWR0aHNbY29sLmtleV0gIT0gbnVsbCkge1xuICAgICAgICBzdW0gKz0gdGhpcy5fY29sdW1uV2lkdGhzW2NvbC5rZXldO1xuICAgICAgfSBlbHNlIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgY29uc3QgaXNQeCA9IGNvbC53aWR0aC50cmltKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgncHgnKTtcbiAgICAgICAgY29uc3QgcHggPSBOdW1iZXIucGFyc2VGbG9hdChjb2wud2lkdGgpO1xuICAgICAgICBpZiAoaXNQeCAmJiAhTnVtYmVyLmlzTmFOKHB4KSkgeyBzdW0gKz0gcHg7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1bSArPSAxMjA7IC8vIGxhcmdldXIgbWluaW1hbGUgZXN0aW3DqWUgcG91ciB1bmUgY29sb25uZSBzYW5zIGxhcmdldXIgZXhwbGljaXRlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdW0gKyAncHgnO1xuICB9XG5cbiAgdHJhY2tSb3dGbiA9IChfaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBhbnkgPT4ge1xuICAgIGlmIChyb3dbR1JPVVBfSEVBREVSX01BUktFUl0pIHJldHVybiBgX19ncm91cF8ke3Jvd1tST1dfR1JPVVBfS0VZXX1gO1xuICAgIGlmIChyb3dbUk9XX0dST1VQX0tFWV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGBfX3Jvd18ke3Jvd1tST1dfR1JPVVBfS0VZXX1fJHtyb3dbUk9XX0lOREVYX0tFWV0gPz8gX2luZGV4fWA7XG4gICAgcmV0dXJuIHJvd1tST1dfSU5ERVhfS0VZXSA/PyBfaW5kZXg7XG4gIH07XG5cbiAgZ2V0Um93Q2xhc3Mocm93OiBhbnkpOiBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucmVzb2x2ZWRDb25maWcucm93Q2xhc3M7XG4gICAgaWYgKCFmbiB8fCByb3c/LltHUk9VUF9IRUFERVJfTUFSS0VSXSkgcmV0dXJuIHt9O1xuICAgIHJldHVybiBmbihyb3dbUk9XX1JBV19LRVldID8/IHJvdywgcm93W1JPV19JTkRFWF9LRVldID8/IDApO1xuICB9XG5cbiAgb25Sb3dDbGljayhyb3c6IGFueSwgZXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHJvdz8uW0dST1VQX0hFQURFUl9NQVJLRVJdKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmhhc1Jvd0NsaWNrSGFuZGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IHJlc29sdmVkID0gKHJvdz8uW1JPV19SQVdfS0VZXSA/PyByb3cpIGFzIFQ7XG4gICAgdGhpcy5yZXNvbHZlZENvbmZpZy5vblJvd1NlbGVjdGVkPy4ocmVzb2x2ZWQsIGV2ZW50KTtcbiAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQocmVzb2x2ZWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERyYWcgJiBkcm9wXG5cbiAgb25IZWFkZXJEcmFnU3RhcnQoY29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgJiYgIXRoaXMuX2VkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gY29sdW1uS2V5O1xuICAgIHRoaXMuZHJhZ092ZXJDb2x1bW5LZXkgPSBudWxsO1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCBjb2x1bW5LZXkpO1xuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyS2V5RG93bihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoKCF0aGlzLmlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkICYmICF0aGlzLl9lZGl0TW9kZSlcbiAgICAgIHx8IChldmVudC5rZXkgIT09ICdBcnJvd0xlZnQnICYmIGV2ZW50LmtleSAhPT0gJ0Fycm93UmlnaHQnKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5hY3RpdmVGaWVsZHMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4ua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyA/IGN1cnJlbnRJbmRleCAtIDEgOiBjdXJyZW50SW5kZXggKyAxO1xuICAgIGlmIChjdXJyZW50SW5kZXggPCAwIHx8IHRhcmdldEluZGV4IDwgMCB8fCB0YXJnZXRJbmRleCA+PSB0aGlzLmFjdGl2ZUZpZWxkcy5sZW5ndGgpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgcmVvcmRlcmVkID0gWy4uLnRoaXMuYWN0aXZlRmllbGRzXTtcbiAgICBbcmVvcmRlcmVkW2N1cnJlbnRJbmRleF0sIHJlb3JkZXJlZFt0YXJnZXRJbmRleF1dID0gW3Jlb3JkZXJlZFt0YXJnZXRJbmRleF0sIHJlb3JkZXJlZFtjdXJyZW50SW5kZXhdXTtcbiAgICB0aGlzLl9vcmdhbml6ZXIuc2V0QWN0aXZlRmllbGRzKHJlb3JkZXJlZCk7XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gIH1cblxuICBvbkhlYWRlckRyYWdPdmVyKGNvbHVtbktleTogc3RyaW5nLCBldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHx8ICF0aGlzLmRyYWdnZWRDb2x1bW5LZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ092ZXJDb2x1bW5LZXkgPSBjb2x1bW5LZXk7XG4gIH1cblxuICBvbkhlYWRlckRyb3AodGFyZ2V0Q29sdW1uS2V5OiBzdHJpbmcsIGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoKCF0aGlzLmlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkICYmICF0aGlzLl9lZGl0TW9kZSkgfHwgIXRoaXMuZHJhZ2dlZENvbHVtbktleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBtb3ZlZCA9IHRoaXMuX29yZ2FuaXplci5yZW9yZGVyRmllbGRzKHRoaXMuZHJhZ2dlZENvbHVtbktleSwgdGFyZ2V0Q29sdW1uS2V5KTtcbiAgICBpZiAoIW1vdmVkKSB7XG4gICAgICB0aGlzLm9uSGVhZGVyRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMub25IZWFkZXJEcmFnRW5kKCk7XG4gIH1cblxuICBvbkhlYWRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gbnVsbDtcbiAgfVxuXG4gIGlzSGVhZGVyRHJvcFRhcmdldChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZHJhZ2dlZENvbHVtbktleSAmJiB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID09PSBjb2x1bW5LZXkgJiYgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBjb2x1bW5LZXk7XG4gIH1cblxuICAvLyDilIDilIAgUHLDqWbDqXJlbmNlcyA6IG1vZGUgw6lkaXRpb25cblxuICBlbnRlckVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBEw6ltYXJyZSBsZSByZXNpemUgZCd1bmUgY29sb25uZSAobW91c2Vkb3duIHN1ciBsYSBwb2lnbsOpZSBkcm9pdGUpLiAqL1xuICBvblJlc2l6ZVN0YXJ0KGNvbHVtbktleTogc3RyaW5nLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZWRpdE1vZGUpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgdGggPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCd0aCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBzY3JvbGxFbCA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChzY3JvbGxFbCkge1xuICAgICAgY29uc3QgYWxsVGggPSBzY3JvbGxFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGgubWF0LW1kYy1oZWFkZXItY2VsbCcpO1xuICAgICAgYWxsVGguZm9yRWFjaCh0aEVsID0+IHtcbiAgICAgICAgY29uc3QgY29sQ2xhc3MgPSBBcnJheS5mcm9tKHRoRWwuY2xhc3NMaXN0KS5maW5kKGMgPT4gYy5zdGFydHNXaXRoKCdtYXQtY29sdW1uLScpKTtcbiAgICAgICAgY29uc3QgY29sS2V5ID0gY29sQ2xhc3MgPyBjb2xDbGFzcy5yZXBsYWNlKCdtYXQtY29sdW1uLScsICcnKSA6IG51bGw7XG4gICAgICAgIGlmIChjb2xLZXkgJiYgdGhpcy5fY29sdW1uV2lkdGhzW2NvbEtleV0gPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzLCBbY29sS2V5XTogdGhFbC5vZmZzZXRXaWR0aCB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNpemVTdGF0ZSA9IHsga2V5OiBjb2x1bW5LZXksIHN0YXJ0WDogZXZlbnQuY2xpZW50WCwgc3RhcnRXaWR0aDogdGgub2Zmc2V0V2lkdGggfTtcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3Jlc2l6ZVN0YXRlKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkZWx0YSA9IGUuY2xpZW50WCAtIHRoaXMuX3Jlc2l6ZVN0YXRlLnN0YXJ0WDtcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5tYXgoNjAsIHRoaXMuX3Jlc2l6ZVN0YXRlLnN0YXJ0V2lkdGggKyBkZWx0YSk7XG4gICAgICB0aGlzLl9jb2x1bW5XaWR0aHMgPSB7IC4uLnRoaXMuX2NvbHVtbldpZHRocywgW3RoaXMuX3Jlc2l6ZVN0YXRlLmtleV06IG5ld1dpZHRoIH07XG4gICAgICAvLyBkZXRlY3RDaGFuZ2VzKCkgcG91ciBmb3JjZXIgbGEgbWlzZSDDoCBqb3VyIGltbcOpZGlhdGUgZW4gbW9kZSBPblB1c2hcbiAgICAgIC8vIChsZXMgbGlzdGVuZXJzIHdpbmRvdyB0b3VybmVudCBob3JzIHpvbmUgQW5ndWxhciBhdmVjIHJ1bk91dHNpZGVBbmd1bGFyKVxuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25VcCA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3Jlc2l6ZVN0YXRlID0gbnVsbDtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuZXJzIGhvcnMgem9uZSBBbmd1bGFyIHBvdXIgw6l2aXRlciBkZXMgY3ljbGVzIENEIMOgIGNoYXF1ZSBtb3VzZW1vdmVcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldG91cm5lIGxhIGxhcmdldXIgQ1NTIGQndW5lIGNvbG9ubmUgKHB4IHNpIHBlcnNvbm5hbGlzw6llLCBzaW5vbiBsYSB2YWxldXIgZGUgY29uZmlnIG91IGF1dG8pLiAqL1xuICBnZXRDb2x1bW5XaWR0aChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX2NvbHVtbldpZHRoc1trZXldICE9IG51bGwpIHJldHVybiB0aGlzLl9jb2x1bW5XaWR0aHNba2V5XSArICdweCc7XG4gICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1uTWFwLmdldChrZXkpO1xuICAgIHJldHVybiBjb2w/LndpZHRoID8/ICdhdXRvJztcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcsOpZsOpcmVuY2VzIDogc2F2ZSAvIGNsZWFyXG5cbiAgc2F2ZVByZWZlcmVuY2VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyKSByZXR1cm47XG4gICAgY29uc3QgZHluYW1pY1NsaWNlS2V5cyA9IHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNGaWVsZHMubWFwKGMgPT4gYy5rZXkpO1xuICAgIGNvbnN0IGNvbmZpZzogaW1wb3J0KCcuLi9qcXVlcnktdGFibGUubW9kZWwnKS5TYXZlZFRhYmxlQ29uZmlnID0ge1xuICAgICAgc2VhcmNoOiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeSB8fCB1bmRlZmluZWQsXG4gICAgICBncm91cEJ5OiAgICAgICAgICAgICB0aGlzLmFjdGl2ZUdyb3VwQnlLZXksXG4gICAgICBjb2x1bW5PcmRlcjogICAgICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5tYXAoYyA9PiBjLmtleSksXG4gICAgICB2aXNpYmxlQ29sdW1uczogICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBjb2x1bW5XaWR0aHM6ICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9jb2x1bW5XaWR0aHMpLmxlbmd0aCA/IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzIH0gOiB1bmRlZmluZWQsXG4gICAgICBzbGljZVBhbmVsQ29sbGFwc2VkOiB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkLFxuICAgICAgaGlkZGVuU2xpY2VLZXlzOiAgICAgWy4uLnRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5c10sXG4gICAgICBkeW5hbWljU2xpY2VLZXlzOiAgICBkeW5hbWljU2xpY2VLZXlzLmxlbmd0aCA/IGR5bmFtaWNTbGljZUtleXMgOiB1bmRlZmluZWQsXG4gICAgICBzbGljZUZpbHRlcnM6ICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYgPyB0aGlzLnNsaWNlUGFuZWxSZWYuZ2V0QWN0aXZlRmlsdGVycygpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLnNhdmUoY29uZmlnKTtcbiAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IHRydWU7XG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNTYXZlZE1lc3NhZ2UpO1xuICB9XG5cbiAgY2xlYXJQcmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcikgcmV0dXJuO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5jbGVhcigpO1xuICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG5cbiAgICAvLyBDYXB0dXJlciBsZXMgZHluYW1pYyBzbGljZXMgYWN0aXZlcyBBVkFOVCBsZSByZXNldCAocmVzZXRUb0RlZmF1bHRzKCkgbGVzIHZpZGUpXG4gICAgY29uc3QgZHluYW1pY1NsaWNlc1RvUmVtb3ZlID0gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlRHluYW1pY0ZpZWxkcy5zbGljZSgpO1xuXG4gICAgLy8gUmVzZXQgY29tcGxldCBkZSBsJ8OpdGF0IHZlcnMgbGVzIHZhbGV1cnMgcGFyIGTDqWZhdXQgZGUgbGEgY29uZmlnXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xuICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHt9O1xuICAgIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAvLyBTeW5jaHJvbmlzZXIgbCfDqXRhdCBpbnRlcm5lIGR1IHNsaWNlLXBhbmVsIDogc2kgbGUgY29tcG9zYW50IGVzdCBlbiDDqXRhdCBjb2xsYXBzZWRcbiAgICAvLyAobCd1dGlsaXNhdGV1ciBsJ2F2YWl0IGZlcm3DqSBhcHLDqHMgbGEgc2F1dmVnYXJkZSksIGxlIHJvdXZyaXIgZXhwbGljaXRlbWVudCBwb3VyXG4gICAgLy8gw6l2aXRlciBxdWUgZGlzcGxheTpub25lIHNvaXQgcmV0aXLDqSBtYWlzIHF1ZSBpc0NvbGxhcHNlZCBpbnRlcm5lIHJlc3RlIMOgIHRydWUuXG4gICAgaWYgKHRoaXMuc2xpY2VQYW5lbFJlZj8uaXNDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZi50b2dnbGVQYW5lbCgpO1xuICAgIH1cbiAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgdGhpcy5fZ3JvdXBCeS5zZXREZWZhdWx0Q29sbGFwc2VkKGZhbHNlKTtcblxuICAgIC8vIFNsaWNlcyBzdGF0aXF1ZXMgOiByZXZlbmlyIGF1eCBzZXVsZXMgY2VsbGVzIGNhY2jDqWVzIHBhciBsYSBjb25maWcgKHBhcyBwYXIgbCd1dGlsaXNhdGV1cilcbiAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0KHRoaXMuX2NvbmZpZ0hpZGRlbktleXMpO1xuICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG5cbiAgICAvLyBDb2xvbm5lcyBldCBncm91cEJ5IDogcmVzZXQgdmlhIGxhIGZhY2FkZSAocmV0aXJlIGxlcyBvcHRpb25uZWxsZXMsIHJlbWV0IGwnb3JkcmUgY29uZmlnKVxuICAgIHRoaXMuX29yZ2FuaXplci5yZXNldFRvRGVmYXVsdHMoKTtcbiAgICB0aGlzLl9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgPSBmYWxzZTtcblxuICAgIC8vIER5bmFtaWMgc2xpY2VzIDogbGVzIHJldGlyZXIgZHUgc2xpY2UgcGFuZWwgYXZlYyBsYSBsaXN0ZSBjYXB0dXLDqWUgYXZhbnQgbGUgcmVzZXRcbiAgICBkeW5hbWljU2xpY2VzVG9SZW1vdmUuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZW1vdmVEeW5hbWljU2xpY2VCeUtleShjb2wua2V5KTtcbiAgICB9KTtcblxuICAgIC8vIEZpbHRyZSBkZSBzbGljZSBhY3RpZlxuICAgIHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIgPSAoKSA9PiB0cnVlO1xuICAgIGlmICh0aGlzLnNsaWNlUGFuZWxSZWYpIHRoaXMuc2xpY2VQYW5lbFJlZi5yZXN0b3JlRmlsdGVycyh7fSk7XG5cbiAgICAvLyBSYWZyYcOuY2hpdCB0b3V0ZSBsYSB2dWVcbiAgICB0aGlzLmFjdGl2ZUZpZWxkcyA9IHRoaXMuX29yZ2FuaXplci5maWVsZHMuYWN0aXZlRmllbGRzO1xuICAgIHRoaXMucmVuZGVyZWRDb2x1bW5zID0gdGhpcy5hY3RpdmVGaWVsZHMubWFwKGMgPT4gYy5rZXkpO1xuICAgIHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gbnVsbDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcblxuICAgIHRoaXMuX3Nob3dQcmVmZXJlbmNlc01lc3NhZ2UodGhpcy5pMThuLnByZWZlcmVuY2VzQ2xlYXJlZE1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlZmVyZW5jZXNNZXNzYWdlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfc2hvd1ByZWZlcmVuY2VzTWVzc2FnZShtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lciAhPT0gbnVsbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyKTtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2UgPSBtc2c7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2UgPSBudWxsO1xuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDQwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlQcmVmZXJlbmNlcyhzYXZlZDogaW1wb3J0KCcuLi9qcXVlcnktdGFibGUubW9kZWwnKS5TYXZlZFRhYmxlQ29uZmlnIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghc2F2ZWQpIHJldHVybjtcbiAgICAvLyBSZWNoZXJjaGVcbiAgICBpZiAoc2F2ZWQuc2VhcmNoKSB0aGlzLnNlYXJjaFF1ZXJ5ID0gc2F2ZWQuc2VhcmNoO1xuICAgIC8vIExhcmdldXJzIGNvbG9ubmVzXG4gICAgaWYgKHNhdmVkLmNvbHVtbldpZHRocykgdGhpcy5fY29sdW1uV2lkdGhzID0geyAuLi5zYXZlZC5jb2x1bW5XaWR0aHMgfTtcbiAgICAvLyBHcm91cCBieVxuICAgIGlmIChzYXZlZC5ncm91cEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0R3JvdXBCeUFuZEVtaXQoc2F2ZWQuZ3JvdXBCeSk7XG4gICAgICBpZiAoc2F2ZWQuZ3JvdXBCeSkge1xuICAgICAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2dyb3VwQnkucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gw4l0YXQgcGFubmVhdSBzbGljZVxuICAgIGlmIChzYXZlZC5zbGljZVBhbmVsQ29sbGFwc2VkICE9PSB1bmRlZmluZWQpIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgPSBzYXZlZC5zbGljZVBhbmVsQ29sbGFwc2VkO1xuICAgIC8vIFNsaWNlcyBzdGF0aXF1ZXMgY2FjaMOpZXMg4oCUIG9uIHV0aWxpc2UgbGEgdmFsZXVyIGV4YWN0ZSBzYXV2ZWdhcmTDqWUgKHBhcyBsZXMgZGVmYXVsdHMgZGUgY29uZmlnKVxuICAgIGlmIChzYXZlZC5oaWRkZW5TbGljZUtleXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzID0gbmV3IFNldChzYXZlZC5oaWRkZW5TbGljZUtleXMpO1xuICAgICAgdGhpcy5fb3JnYW5pemVyLnVwZGF0ZUhpZGRlblN0YXRpY0tleXModGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzKTtcbiAgICB9XG4gICAgLy8gQ29sb25uZXMgdmlzaWJsZXMgKyBvcmRyZSDigJQgcmVjb25zdHJ1aXQgYWN0aXZlRmllbGRzIGVuIHVuZSBzZXVsZSBwYXNzZS5cbiAgICAvLyBPbiBwYXJ0IGRlIHNhdmVkLmNvbHVtbk9yZGVyIChvcmRyZSBzYXV2ZWdhcmTDqSkgc2kgZGlzcG9uaWJsZSwgc2lub24gc2F2ZWQudmlzaWJsZUNvbHVtbnMuXG4gICAgLy8gQ2VsYSBnw6hyZSDDoCBsYSBmb2lzIDogY29sb25uZXMgb3B0aW9ubmVsbGVzIGFqb3V0w6llcywgY29sb25uZXMgcmV0aXLDqWVzLCBldCByw6lvcmRvbm5hbmNlbWVudC5cbiAgICBjb25zdCB0YXJnZXRLZXlzID0gc2F2ZWQuY29sdW1uT3JkZXIgPz8gc2F2ZWQudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKHRhcmdldEtleXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYWxsQnlLZXkgPSBuZXcgTWFwKCh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcChjID0+IFtjLmtleSwgY10pKTtcbiAgICAgIC8vIENvbG9ubmVzIGRhbnMgbCdvcmRyZSBzYXV2ZWdhcmTDqSAob24gbmUgZ2FyZGUgcXVlIGNlbGxlcyBjb25udWVzIGRlIGxhIGNvbmZpZylcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSB0YXJnZXRLZXlzXG4gICAgICAgIC5tYXAoa2V5ID0+IGFsbEJ5S2V5LmdldChrZXkpKVxuICAgICAgICAuZmlsdGVyKChjKTogYyBpcyBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+ID0+IGMgIT09IHVuZGVmaW5lZCk7XG4gICAgICAvLyBDb2xvbm5lcyBhY3RpdmVzIGFjdHVlbGxsZW1lbnQgbm9uIHByw6lzZW50ZXMgZGFucyB0YXJnZXRLZXlzIChub24tb3B0aW9uYWwgcGFzc8OpZXMgc291cyBzaWxlbmNlKVxuICAgICAgLy8g4oaSIG9uIGxlcyBleGNsdXQgOiBsJ3V0aWxpc2F0ZXVyIGF2YWl0IGV4cGxpY2l0ZW1lbnQgY2hvaXNpIGNlIHNvdXMtZW5zZW1ibGVcbiAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fb3JnYW5pemVyLnNldEFjdGl2ZUZpZWxkcyhvcmRlcmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRmlsdHJlcyBhY3RpZnMgZHUgc2xpY2UgcGFuZWxcbiAgICAvLyBGaWx0cmVzIGFjdGlmcyBkdSBzbGljZSBwYW5lbCDigJQgdG91am91cnMgc3RvY2vDqXMgZW4gcGVuZGluZyA6XG4gICAgLy8gYXBwbGlxdcOpcyBwYXIgX2FwcGx5UGVuZGluZ0R5bmFtaWNTbGljZUtleXMgKHNpIGR5bmFtaWMgc2xpY2VzKSBvdVxuICAgIC8vIHBhciBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwgKHF1YW5kIGxlcyBkb25uw6llcyBhcnJpdmVudCBldCByZW5kZW50IGxlIHBhbmVsIHZpc2libGUpXG4gICAgaWYgKHNhdmVkLnNsaWNlRmlsdGVycyAmJiBPYmplY3Qua2V5cyhzYXZlZC5zbGljZUZpbHRlcnMpLmxlbmd0aCkge1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IHNhdmVkLnNsaWNlRmlsdGVycztcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVGaWx0ZXJDb2x1bW5LZXlzID0gT2JqZWN0LmVudHJpZXMoc2F2ZWQuc2xpY2VGaWx0ZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVzXSkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2NvbHVtbjonKSAmJiB2YWx1ZXMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkuc2xpY2UoJ2NvbHVtbjonLmxlbmd0aCkpO1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlS2V5cyA9IG5ldyBTZXQoXG4gICAgICAodGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10pXG4gICAgICAgIC5tYXAoc2xpY2UgPT4gc2xpY2UuY29sdW1uS2V5KVxuICAgICAgICAuZmlsdGVyKChrZXkpOiBrZXkgaXMgc3RyaW5nID0+ICEha2V5KVxuICAgICk7XG4gICAgY29uc3QgZHluYW1pY1NsaWNlS2V5cyA9IG5ldyBTZXQodGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWxsRHluYW1pY0ZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQua2V5KSk7XG5cbiAgICAvLyBVbiBmaWx0cmUgcGVyc2lzdGFudCBkb2l0IHRvdWpvdXJzIHJldHJvdXZlciBzYSBzbGljZSA6IHVuZSBwcsOpZsOpcmVuY2VcbiAgICAvLyBhbmNpZW5uZSBvdSBpbmNvbXBsw6h0ZSBuZSBwZXV0IHBhcyBsYWlzc2VyIHVuIGZpbHRyZSBzYW5zIHBhbm5lYXUgdmlzaWJsZS5cbiAgICBhY3RpdmVGaWx0ZXJDb2x1bW5LZXlzXG4gICAgICAuZmlsdGVyKGtleSA9PiBzdGF0aWNTbGljZUtleXMuaGFzKGtleSkpXG4gICAgICAuZm9yRWFjaChrZXkgPT4gdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmRlbGV0ZShrZXkpKTtcbiAgICB0aGlzLl9vcmdhbml6ZXIudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuXG4gICAgLy8gVW5lIGNsw6kgZGUgZmlsdHJlIHN1ciB1bmUgY29sb25uZSBub24gc3RhdGlxdWUgZMOpc2lnbmUgdW5lIHNsaWNlIGR5bmFtaXF1ZS5cbiAgICAvLyBFbGxlIGNvbXBsw6h0ZSBkeW5hbWljU2xpY2VLZXlzIHBvdXIgbGVzIGNvbmZpZ3VyYXRpb25zIHNhdXZlZ2FyZMOpZXMgYXZhbnRcbiAgICAvLyBxdWUgY2UgY2hhbXAgbmUgc29pdCBwZXJzaXN0YW50LlxuICAgIGNvbnN0IHBlcnNpc3RlZER5bmFtaWNLZXlzID0gW1xuICAgICAgLi4uKHNhdmVkLmR5bmFtaWNTbGljZUtleXMgPz8gW10pLFxuICAgICAgLi4uYWN0aXZlRmlsdGVyQ29sdW1uS2V5cyxcbiAgICBdO1xuICAgIGNvbnN0IHVuaXF1ZUR5bmFtaWNLZXlzID0gWy4uLm5ldyBTZXQocGVyc2lzdGVkRHluYW1pY0tleXMpXS5maWx0ZXIoXG4gICAgICBrZXkgPT4gIXN0YXRpY1NsaWNlS2V5cy5oYXMoa2V5KSAmJiBkeW5hbWljU2xpY2VLZXlzLmhhcyhrZXkpXG4gICAgKTtcbiAgICBpZiAodW5pcXVlRHluYW1pY0tleXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyA9IHVuaXF1ZUR5bmFtaWNLZXlzO1xuICAgIH1cbiAgfVxuXG4gIGNhblJlbW92ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fb3JnYW5pemVyLmFsbG93RmllbGRSZW1vdmFsICYmXG4gICAgICBjb2x1bW4ucmVtb3ZhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgdGhpcy5hY3RpdmVGaWVsZHMubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cblxuICBpc0NlbGxFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PSBudWxsO1xuICB9XG5cbiAgYXNUaXRsZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFeHBvcnQgQ1NWXG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZXhwb3J0LmV4cG9ydCgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgbGVzIGxpZ25lcyBldCBsJ8OpdGF0IGFjdHVlbGxlbWVudCB2aXNpYmxlcyBkYW5zIHVuIHNuYXBzaG90IGF1dG9ub21lLiAqL1xuICBjcmVhdGVWaXN1YWxTbmFwc2hvdChsYWJlbCA9IHRoaXMudGl0bGUgfHwgJ1RhYmxlYXUnKTogVmlzdWFsU25hcHNob3REcmFmdCB7XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKGNvbnRhaW5zRnVuY3Rpb24odGhpcy5yZXNvbHZlZENvbmZpZykpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goJ0NlcnRhaW5lcyBmb25jdGlvbnMgZGUgY29uZmlndXJhdGlvbiBuZSBzb250IHBhcyB0cmFuc3BvcnRhYmxlcy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICBsYWJlbCxcbiAgICAgIGNvbmZpZzogY2xvbmVTZXJpYWxpemFibGUoe1xuICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgY29sdW1uczogdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zPy5tYXAoY29sdW1uID0+IHNlcmlhbGl6YWJsZUNvbHVtbihjb2x1bW4pKSxcbiAgICAgICAgc2VhcmNoOiB0aGlzLnJlc29sdmVkQ29uZmlnLnNlYXJjaCxcbiAgICAgICAgcGFnaW5hdGlvbjogdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uLFxuICAgICAgfSksXG4gICAgICBzdGF0ZTogY2xvbmVTZXJpYWxpemFibGUoe1xuICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoUXVlcnksXG4gICAgICAgIGdyb3VwQnk6IHRoaXMuYWN0aXZlR3JvdXBCeUtleSxcbiAgICAgICAgY29sdW1uT3JkZXI6IHRoaXMuYWN0aXZlRmllbGRzLm1hcChjb2x1bW4gPT4gY29sdW1uLmtleSksXG4gICAgICAgIHZpc2libGVDb2x1bW5zOiB0aGlzLmFjdGl2ZUZpZWxkcy5tYXAoY29sdW1uID0+IGNvbHVtbi5rZXkpLFxuICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gMCxcbiAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yPy5wYWdlU2l6ZSA/PyB0aGlzLnBhZ2VTaXplLFxuICAgICAgfSksXG4gICAgICBkYXRhOiBjbG9uZVNlcmlhbGl6YWJsZSh0aGlzLl9hbGxGaWx0ZXJlZFJvd3MpLFxuICAgICAgd2FybmluZ3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBcHBsaXF1ZSBsJ8OpdGF0IGNvbXBhdGlibGUgZXQgcmV0b3VybmUgbGVzIGRvbm7DqWVzIMOgIGZvdXJuaXIgYXUgY29tcG9zYW50IGNpYmxlLiAqL1xuICBhcHBseVZpc3VhbFNuYXBzaG90KHNuYXBzaG90OiBWaXN1YWxTbmFwc2hvdCk6IFZpc3VhbFNuYXBzaG90QXBwbHlSZXN1bHQge1xuICAgIGlmIChzbmFwc2hvdC50eXBlICE9PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4geyBhcHBsaWVkOiBmYWxzZSwgcmVzdG9yZWQ6IFtdLCBza2lwcGVkOiBbJ3R5cGUnXSwgd2FybmluZ3M6IFsnTGUgc25hcHNob3QgblxcJ2VzdCBwYXMgdW4gdGFibGVhdS4nXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gc25hcHNob3Quc3RhdGUgYXMge1xuICAgICAgc2VhcmNoPzogc3RyaW5nO1xuICAgICAgZ3JvdXBCeT86IHN0cmluZyB8IG51bGw7XG4gICAgICB2aXNpYmxlQ29sdW1ucz86IHN0cmluZ1tdO1xuICAgICAgY29sdW1uT3JkZXI/OiBzdHJpbmdbXTtcbiAgICAgIGNvbHVtbldpZHRocz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgfTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBuZXcgTWFwKCh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcChjb2x1bW4gPT4gW2NvbHVtbi5rZXksIGNvbHVtbl0pKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRLZXlzID0gc3RhdGUuY29sdW1uT3JkZXIgPz8gc3RhdGUudmlzaWJsZUNvbHVtbnMgPz8gW107XG4gICAgY29uc3QgY29tcGF0aWJsZUtleXMgPSByZXF1ZXN0ZWRLZXlzLmZpbHRlcihrZXkgPT4gYXZhaWxhYmxlLmhhcyhrZXkpKTtcbiAgICBjb25zdCBza2lwcGVkID0gcmVxdWVzdGVkS2V5cy5maWx0ZXIoa2V5ID0+ICFhdmFpbGFibGUuaGFzKGtleSkpO1xuICAgIGNvbnN0IHJlc3RvcmVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGNvbXBhdGlibGVLZXlzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fb3JnYW5pemVyLnNldEFjdGl2ZUZpZWxkcyhjb21wYXRpYmxlS2V5cy5tYXAoa2V5ID0+IGF2YWlsYWJsZS5nZXQoa2V5KSEpKTtcbiAgICAgIHJlc3RvcmVkLnB1c2goJ2NvbHVtbnMnKTtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN0YXRlLnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBzdGF0ZS5zZWFyY2g7XG4gICAgICByZXN0b3JlZC5wdXNoKCdzZWFyY2gnKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmdyb3VwQnkgPT09IG51bGwgfHwgdHlwZW9mIHN0YXRlLmdyb3VwQnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBncm91cEtleSA9IHN0YXRlLmdyb3VwQnkgJiYgYXZhaWxhYmxlLmhhcyhzdGF0ZS5ncm91cEJ5KSA/IHN0YXRlLmdyb3VwQnkgOiBudWxsO1xuICAgICAgdGhpcy5zZXRHcm91cEJ5QW5kRW1pdChncm91cEtleSk7XG4gICAgICByZXN0b3JlZC5wdXNoKCdncm91cEJ5Jyk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb2x1bW5XaWR0aHMpIHtcbiAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4uc3RhdGUuY29sdW1uV2lkdGhzIH07XG4gICAgICByZXN0b3JlZC5wdXNoKCdjb2x1bW5XaWR0aHMnKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcGxpZWQ6IHRydWUsXG4gICAgICByZXN0b3JlZCxcbiAgICAgIHNraXBwZWQsXG4gICAgICB3YXJuaW5nczogc25hcHNob3Qud2FybmluZ3MgPz8gW10sXG4gICAgICBkYXRhOiBjbG9uZVNlcmlhbGl6YWJsZShzbmFwc2hvdC5kYXRhKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIGRlIGRvbm7DqWVzIChwcml2w6kpXG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlld01vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc29sdmVkRGF0YSA9IHRoaXMucmVzb2x2ZURhdGEoKTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnID0gdGhpcy5idWlsZEVmZmVjdGl2ZUNvbmZpZygpO1xuICAgIHRoaXMuX2NvbHVtbk1hcCA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsU2xpY2VQYW5lbENvbGxhcHNlZEFwcGxpZWQpIHtcbiAgICAgIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnNsaWNlUGFuZWxDb2xsYXBzZWQgPT09IHRydWU7XG4gICAgICB0aGlzLl9pbml0aWFsU2xpY2VQYW5lbENvbGxhcHNlZEFwcGxpZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBJbml0aWFsaXNlciBsZSBnZXN0aW9ubmFpcmUgZGUgcHLDqWbDqXJlbmNlcyBzaSBsJ29wdGlvbiBlc3QgYWN0aXbDqWVcbiAgICBjb25zdCBwcmVmc0lkID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wcmVmZXJlbmNlcz8uZW5hYmxlZFxuICAgICAgPyB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzLnRhYmxlSWRcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjdXJyZW50SWQgPSBwcmVmc0lkID8/IG51bGw7XG4gICAgLy8gUHLDqWbDqXJlbmNlcyDDoCBhcHBsaXF1ZXIgYXByw6hzIF9vcmdhbml6ZXIudXBkYXRlKCkgKHF1YW5kIGFjdGl2ZUZpZWxkcyBlc3QgZMOpasOgIHBldXBsw6kpXG4gICAgbGV0IHBlbmRpbmdQcmVmczogaW1wb3J0KCcuLi9qcXVlcnktdGFibGUubW9kZWwnKS5TYXZlZFRhYmxlQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGN1cnJlbnRJZCAmJiB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXI/LmtleSAhPT0gKCdqcXRfcHJlZnNfJyArIGN1cnJlbnRJZCkpIHtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlciA9IG5ldyBUYWJsZVByZWZlcmVuY2VzTWFuYWdlcihjdXJyZW50SWQpO1xuICAgICAgdGhpcy5faGFzU2F2ZWRDb25maWcgPSB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIuaGFzU2F2ZWQoKTtcbiAgICAgIHBlbmRpbmdQcmVmcyA9IHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5sb2FkKCk7XG4gICAgfSBlbHNlIGlmICghY3VycmVudElkKSB7XG4gICAgICB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIgPSBudWxsO1xuICAgICAgdGhpcy5faGFzU2F2ZWRDb25maWcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEw6lsw6hndWUgw6AgbGEgZmFjYWRlIDogbWlzZSDDoCBqb3VyIGRlIGwnw6l0YXQgVmlldyAoY29sb25uZXMsIGdyb3VwQnkgbWV0YSwgc2xpY2VCeSBtZXRhKVxuICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGUoe1xuICAgICAgY29uZmlnOiB0aGlzLnJlc29sdmVkQ29uZmlnLnZpZXcsXG4gICAgICBmaWVsZHM6IHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXSxcbiAgICAgIHNsaWNlQ29uZmlnczogdGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10sXG4gICAgICBkZWZhdWx0R3JvdXBCeTogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0R3JvdXBCeSxcbiAgICB9KTtcblxuICAgIGlmICghcGVuZGluZ1ByZWZzICYmICF0aGlzLl9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgJiYgIXRoaXMuX29yZ2FuaXplci5ncm91cEJ5LnVzZXJDdXN0b21pemVkICYmIHRoaXMuX29yZ2FuaXplci5ncm91cEJ5LmFjdGl2ZUtleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fZ3JvdXBCeS5zZXREZWZhdWx0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgdGhpcy5fZ3JvdXBCeS5yZXNldCgpO1xuICAgICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICAgIHRoaXMuZ3JvdXBCeUNoYW5nZS5lbWl0KHRoaXMuX29yZ2FuaXplci5ncm91cEJ5LmFjdGl2ZUtleSk7XG4gICAgfVxuXG4gICAgLy8gU3luY2hyb25pc2UgbGEgcHJvcHJpw6l0w6kgc3RhYmxlICjDqXZpdGUgTkcwMTAwIOKAlCBsYSBmYWNhZGUgZXN0IHNvdXJjZSBkZSB2w6lyaXTDqSlcbiAgICB0aGlzLmFjdGl2ZUZpZWxkcyA9IHRoaXMuX29yZ2FuaXplci5maWVsZHMuYWN0aXZlRmllbGRzO1xuXG4gICAgdGhpcy5yZW5kZXJlZENvbHVtbnMgPSB0aGlzLmFjdGl2ZUZpZWxkcy5tYXAoYyA9PiBjLmtleSk7XG4gICAgdGhpcy5lbWl0Q29sdW1uc0NoYW5nZUlmTmVlZGVkKCk7XG5cbiAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3I/LnBhZ2VTaXplIHx8IHRoaXMucmVzb2x2ZVBhZ2VTaXplKCk7XG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLnJlc29sdmVQYWdlU2l6ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9uc0dyb3VwQnkgPSB0aGlzLnJlc29sdmVQYWdlU2l6ZU9wdGlvbnNHcm91cEJ5KCk7XG4gICAgaWYgKHRoaXMuZ3JvdXBQYWdlU2l6ZSAhPT0gMCAmJiAhdGhpcy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5LmluY2x1ZGVzKHRoaXMuZ3JvdXBQYWdlU2l6ZSkpIHtcbiAgICAgIHRoaXMuZ3JvdXBQYWdlU2l6ZSA9IHRoaXMucmVzb2x2ZURlZmF1bHRHcm91cFBhZ2VTaXplKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hdHRhY2hQYWdpbmF0b3IoKTtcbiAgICB0aGlzLmF0dGFjaFNvcnQoKTtcblxuICAgIC8vIFLDqWluaXRpYWxpc2UgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyBzZXVsZW1lbnQgc2kgbGVzIGNsw6lzIGhpZGRlbiBkZSBsYSBjb25maWcgb250IHZyYWltZW50IGNoYW5nw6lcbiAgICAvLyBFVCBxdSdpbCBuJ3kgYSBwYXMgZGUgcHLDqWbDqXJlbmNlcyBzYXV2ZWdhcmTDqWVzIChxdWkgZ8OpcmVyb250IGhpZGRlblNsaWNlS2V5cyBlbGxlcy1tw6ptZXMpLlxuICAgIGNvbnN0IG5ld0NvbmZpZ0hpZGRlbiA9IG5ldyBTZXQ8c3RyaW5nPihcbiAgICAgICh0aGlzLnJlc29sdmVkQ29uZmlnLnNsaWNlcyA/PyBbXSkuZmlsdGVyKHMgPT4gcy5oaWRkZW4gJiYgcy5jb2x1bW5LZXkpLm1hcChzID0+IHMuY29sdW1uS2V5ISlcbiAgICApO1xuICAgIGlmICghVGFibGVDb21wb25lbnQuX3NldHNFcXVhbChuZXdDb25maWdIaWRkZW4sIHRoaXMuX2NvbmZpZ0hpZGRlbktleXMpKSB7XG4gICAgICB0aGlzLl9jb25maWdIaWRkZW5LZXlzID0gbmV3Q29uZmlnSGlkZGVuO1xuICAgICAgLy8gTifDqWNyYXNlciBfc3RhdGljU2xpY2VIaWRkZW5LZXlzIHF1ZSBzaSBvbiBuJ2VzdCBQQVMgZW4gdHJhaW4gZCdhcHBsaXF1ZXIgZGVzIHByZWZzXG4gICAgICAvLyAocGVuZGluZ1ByZWZzIGxlcyBnw6hyZXJhIGx1aS1tw6ptZSB2aWEgX2FwcGx5UHJlZmVyZW5jZXMg4oaSIGhpZGRlblNsaWNlS2V5cylcbiAgICAgIGlmICghcGVuZGluZ1ByZWZzKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQobmV3Q29uZmlnSGlkZGVuKTtcbiAgICAgICAgdGhpcy5fb3JnYW5pemVyLnVwZGF0ZUhpZGRlblN0YXRpY0tleXModGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBsaXF1ZSBsZXMgcHLDqWbDqXJlbmNlcyBJQ0ksIEFQUsOIUyBfb3JnYW5pemVyLnVwZGF0ZSgpIEVUIGFwcsOocyBfY29uZmlnSGlkZGVuS2V5cyBtaXMgw6Agam91cixcbiAgICAvLyBtYWlzIGF2YW50IF9jb21wdXRlU2xpY2VDb25maWdzKCkgcG91ciBxdWUgaGlkZGVuU2xpY2VLZXlzIHNvaXQgZMOpasOgIHJlc3RhdXLDqS5cbiAgICBpZiAocGVuZGluZ1ByZWZzKSB7XG4gICAgICB0aGlzLl9hcHBseVByZWZlcmVuY2VzKHBlbmRpbmdQcmVmcyk7XG4gICAgfVxuXG4gICAgLy8gUHJvcHJpw6l0w6lzIHN0YWJsZXMgcG91ciBsZXMgYmluZGluZ3MgZHUgdGVtcGxhdGVcbiAgICAvLyBPbiByZWNhbGN1bGUgX3NsaWNlQ29uZmlncyBlbiByZWZsw6l0YW50IGwnw6l0YXQgY291cmFudCBkZXMgc2xpY2VzIGNhY2jDqWVzLFxuICAgIC8vIHBvdXIgcXVlIFNsaWNlUGFuZWxDb21wb25lbnQubmdPbkluaXQgcmXDp29pdmUgbGEgYm9ubmUgdmFsZXVyIGRlIGBoaWRkZW5gXG4gICAgLy8gbcOqbWUgcXVhbmQgbGUgY29tcG9zYW50IGVzdCBjcsOpw6kgcG91ciBsYSAxw6hyZSBmb2lzIGFwcsOocyB1biB0b2dnbGUuXG4gICAgdGhpcy5fc2xpY2VDb25maWdzID0gdGhpcy5fY29tcHV0ZVNsaWNlQ29uZmlncygpO1xuICAgIHRoaXMuX3NsaWNlQ29sdW1ucyA9IHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXTtcbiAgICB0aGlzLl9zbGljZURhdGEgPSB0aGlzLl9yZXNvbHZlZERhdGE7XG4gICAgdGhpcy5fc2xpY2VTaG93VG9nZ2xlID0gdGhpcy5yZXNvbHZlZENvbmZpZy5lbmFibGVTbGljZVRvZ2dsZSAhPT0gZmFsc2U7XG4gICAgdGhpcy5fcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwoKTtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZVNvcnQuYWN0aXZlICYmIHRoaXMucmVzb2x2ZWRDb25maWcuZGVmYXVsdFNvcnQpIHtcbiAgICAgIHRoaXMuX21hdFNvcnRBY3RpdmUgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0LmFjdGl2ZTtcbiAgICAgIHRoaXMuX21hdFNvcnREaXJlY3Rpb24gPSB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgdGhpcy5fYnVpbGRTbGljZUJ5TWVudUl0ZW1zKCk7XG5cbiAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFJldG91cm5lIHVuaXF1ZW1lbnQgbGVzIHNsaWNlcyB2aXNpYmxlcyAobm9uIGNhY2jDqWVzIHBhciBfc3RhdGljU2xpY2VIaWRkZW5LZXlzKS5cbiAgICogTGUgU2xpY2VQYW5lbENvbXBvbmVudCBhZmZpY2hlIHRvdXQgY2UgcXUnaWwgcmXDp29pdCDigJQgYydlc3QgaWNpIHF1ZSBzZSBmYWl0IGxlIGZpbHRyYWdlLiAqL1xuICBwcml2YXRlIF9jb21wdXRlU2xpY2VDb25maWdzKCk6IFNsaWNlQ29uZmlnPFQ+W10ge1xuICAgIHJldHVybiAodGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10pLmZpbHRlcihcbiAgICAgIHMgPT4gIXMuY29sdW1uS2V5IHx8ICF0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMuaGFzKHMuY29sdW1uS2V5KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfc2V0c0VxdWFsKGE6IFNldDxzdHJpbmc+LCBiOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgdiBvZiBhKSBpZiAoIWIuaGFzKHYpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZFNsaWNlQnlNZW51SXRlbXMoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGljU2xpY2VNYXAgPSBuZXcgTWFwKHRoaXMuX3N0YXRpY1NsaWNlc0Zvck1lbnUubWFwKHMgPT4gW3Mua2V5LCBzXSkpO1xuICAgIGNvbnN0IGR5bmFtaWNTbGljZVNldCA9IG5ldyBTZXQodGhpcy5fYWxsRHluYW1pY1NsaWNlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSkpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8eyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGljb24/OiBzdHJpbmc7IGNvbD86IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4gfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW10pIHtcbiAgICAgIGlmIChzZWVuLmhhcyhjb2wua2V5KSkgY29udGludWU7XG4gICAgICBpZiAoc3RhdGljU2xpY2VNYXAuaGFzKGNvbC5rZXkpKSB7XG4gICAgICAgIGNvbnN0IHMgPSBzdGF0aWNTbGljZU1hcC5nZXQoY29sLmtleSkhO1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IHRydWUsIGtleTogcy5rZXksIHRpdGxlOiBzLnRpdGxlLCBpY29uOiBzLmljb24gfSk7XG4gICAgICAgIHNlZW4uYWRkKGNvbC5rZXkpO1xuICAgICAgfSBlbHNlIGlmIChkeW5hbWljU2xpY2VTZXQuaGFzKGNvbC5rZXkpKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goeyBpc1N0YXRpYzogZmFsc2UsIGtleTogY29sLmtleSwgdGl0bGU6IHRoaXMuY29sTGFiZWwoY29sKSwgaWNvbjogY29sLmljb24sIGNvbCB9KTtcbiAgICAgICAgc2Vlbi5hZGQoY29sLmtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLl9zdGF0aWNTbGljZXNGb3JNZW51KSB7XG4gICAgICBpZiAoIXNlZW4uaGFzKHMua2V5KSkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IHRydWUsIGtleTogcy5rZXksIHRpdGxlOiBzLnRpdGxlLCBpY29uOiBzLmljb24gfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NsaWNlQnlNZW51SXRlbXMgPSBpdGVtcztcbiAgICB0aGlzLl9pbnZhbGlkYXRlT3JnYW5pemVyQ29uZmlnKCk7IC8vIGxlcyBzbGljZXMgb250IGNoYW5nw6lcbiAgfVxuXG4gIGdldCBzbGljZUJ5TWVudUl0ZW1zKCkgeyByZXR1cm4gdGhpcy5fc2xpY2VCeU1lbnVJdGVtczsgfVxuXG4gIG9uU2xpY2VNZW51SXRlbUNsaWNrKGl0ZW06IHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5pc1N0YXRpYykge1xuICAgICAgdGhpcy50b2dnbGVTdGF0aWNTbGljZShpdGVtLmtleSk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmNvbCkge1xuICAgICAgdGhpcy50b2dnbGVEeW5hbWljU2xpY2UoaXRlbS5jb2wpO1xuICAgIH1cbiAgfVxuXG4gIGlzU2xpY2VNZW51SXRlbUFjdGl2ZShpdGVtOiB7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGl0ZW0uaXNTdGF0aWMgPyB0aGlzLmlzU3RhdGljU2xpY2VWaXNpYmxlKGl0ZW0ua2V5KSA6IHRoaXMuaXNEeW5hbWljU2xpY2VBY3RpdmUoaXRlbS5rZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NoZWR1bGVSZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BlbmRpbmdSZW5kZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nUmVuZGVyKTtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZW5kZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5fcGVuZGluZ1JlbmRlciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9wZW5kaW5nUmVuZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLl9leGVjdXRlUmVuZGVyKCkpO1xuICAgICAgfSwgMCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlUmVuZGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNhdGVnb3J5Um93cyA9IHRoaXMuZ2V0Q2F0ZWdvcnlGaWx0ZXJlZERhdGEoKTtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5KSB7XG4gICAgICAvLyBFbiBtb2RlIGdyb3VwQnksIHByb2plY3RSb3dzIGfDqHJlIHRvdXQgbGUgdHJpIGludGVybmVtZW50IOKAlCBwYXMgZGUgc29ydCBnbG9iYWwgaW51dGlsZVxuICAgICAgdGhpcy5fYWxsRmlsdGVyZWRSb3dzID0gY2F0ZWdvcnlSb3dzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wYXJlRm4gPSB0aGlzLl9idWlsZFNvcnRDb21wYXJhdG9yKCk7XG4gICAgICB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MgPSBjb21wYXJlRm4gPyBbLi4uY2F0ZWdvcnlSb3dzXS5zb3J0KGNvbXBhcmVGbikgOiBjYXRlZ29yeVJvd3M7XG4gICAgfVxuXG4gICAgLy8gTWV0dHJlIMOgIGpvdXIgbGUgcGFnaW5hdG9yIGF2ZWMgbGUgbm91dmVhdSB0b3RhbFxuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgY29uc3Qgc2F2ZWRJbmRleCA9IHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID8/IHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleDtcbiAgICAgIGNvbnN0IG1heFBhZ2UgPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwodGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpIC0gMSk7XG4gICAgICB0aGlzLnBhZ2luYXRvci5sZW5ndGggPSB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gTWF0aC5taW4oc2F2ZWRJbmRleCwgbWF4UGFnZSk7XG4gICAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvamVjdEN1cnJlbnRQYWdlKCk7XG4gICAgLy8gZGV0ZWN0Q2hhbmdlcygpIGF1IGxpZXUgZGUgbWFya0ZvckNoZWNrKCkgOiBtZXQgw6Agam91ciB1bmlxdWVtZW50IENFIGNvbXBvc2FudFxuICAgIC8vIHNhbnMgZMOpY2xlbmNoZXIgdW4gY3ljbGUgQ0QgZ2xvYmFsIHF1aSBwcm92b3F1ZXJhaXQgTkcwMTAwIGRhbnMgbGVzIHBhcmVudHMuXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2plY3RDdXJyZW50UGFnZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5KSB7XG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5kYXRhID0gdGhpcy5wcm9qZWN0Um93cyh0aGlzLl9hbGxGaWx0ZXJlZFJvd3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gMDtcbiAgICBjb25zdCBzdGFydCA9IHBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gICAgY29uc3QgcGFnZVJvd3MgPSB0aGlzLl9hbGxGaWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5wYWdlU2l6ZSk7XG5cbiAgICBjb25zdCBwcm9qZWN0ZWQ6IGFueVtdID0gW107XG4gICAgcGFnZVJvd3MuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBzdGFydCArIGk7XG4gICAgICBjb25zdCBwOiBhbnkgPSB7IFtST1dfUkFXX0tFWV06IHJvdywgW1JPV19JTkRFWF9LRVldOiBpZHggfTtcbiAgICAgIHRoaXMuYWN0aXZlRmllbGRzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBwW2NvbC5rZXldID0gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpZHgpO1xuICAgICAgfSk7XG4gICAgICBwcm9qZWN0ZWQucHVzaChwKTtcbiAgICB9KTtcbiAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5kYXRhID0gcHJvamVjdGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVmZmVjdGl2ZUNvbmZpZygpOiBUYWJsZVByb3ZpZGVyPFQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZyB8fCB7fTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuXG4gICAgY29uc3QgY29sdW1ucyA9XG4gICAgICBjb25maWcuY29sdW1ucyB8fFxuICAgICAgdGhpcy5jb2x1bW5zQ29uZmlnIHx8XG4gICAgICB0aGlzLnJlc29sdmVDb2x1bW5zRnJvbUNvbXBhdChyb3dzKTtcblxuICAgIC8vIE1vZGUgSFRNTCA6IFt2aWV3XSBwcmVuZCBsZSBkZXNzdXMgc3VyIGNvbmZpZy52aWV3IHNpIGZvdXJuaSAoUGhhc2UgMykuXG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlldyA/PyBjb25maWcudmlldztcblxuICAgIGNvbnN0IGF1dG9UYWJsZUlkID0gY29uZmlnLnByZWZlcmVuY2VzPy50YWJsZUlkIHx8IFRhYmxlQ29tcG9uZW50Ll9oYXNoQ29sdW1ucygoY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gYy5rZXkpKTtcbiAgICBjb25zdCBleHBvcnRDb25maWc6IFRhYmxlRXhwb3J0Q29uZmlnPFQ+ID0ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGZpbGVuYW1lOiBhdXRvVGFibGVJZCxcbiAgICAgIC4uLmNvbmZpZy5leHBvcnQsXG4gICAgfTtcblxuICAgIGNvbnN0IHByZWZzQ29uZmlnOiBUYWJsZVByZWZlcmVuY2VzQ29uZmlnID0ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHRhYmxlSWQ6IGF1dG9UYWJsZUlkLFxuICAgICAgLi4uY29uZmlnLnByZWZlcmVuY2VzLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHZpZXcsXG4gICAgICBzbGljZXM6IGNvbmZpZy5zbGljZXMgfHwgW10sXG4gICAgICBlbmFibGVTbGljZVRvZ2dsZTogY29uZmlnLmVuYWJsZVNsaWNlVG9nZ2xlID8/IHRydWUsXG4gICAgICBleHBvcnQ6IGV4cG9ydENvbmZpZyxcbiAgICAgIHByZWZlcmVuY2VzOiBwcmVmc0NvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUNvbmZpZ1NlYXJjaFJlc2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNsZWFyVG9rZW4gPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNsZWFyU2VhcmNoSW5wdXQ7XG4gICAgY29uc3Qgc2hvdWxkQ2xlYXIgPSAhIWNsZWFyVG9rZW4gJiYgY2xlYXJUb2tlbiAhPT0gdGhpcy5fbGFzdENvbmZpZ0NsZWFyU2VhcmNoSW5wdXQ7XG5cbiAgICB0aGlzLl9sYXN0Q29uZmlnQ2xlYXJTZWFyY2hJbnB1dCA9IGNsZWFyVG9rZW47XG5cbiAgICBpZiAoIXNob3VsZENsZWFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xuICAgIHRoaXMub25TZWFyY2hDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbml0aWFsU2VhcmNoUXVlcnkoaXNGaXJzdENvbmZpZ0NoYW5nZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbFF1ZXJ5ID0gdGhpcy5yZXNvbHZlZENvbmZpZy5zZWFyY2g/LmluaXRpYWxRdWVyeTtcbiAgICBpZiAoaW5pdGlhbFF1ZXJ5ID09PSB0aGlzLl9sYXN0SW5pdGlhbFNlYXJjaFF1ZXJ5XG4gICAgICAmJiAodGhpcy5faW5pdGlhbFNlYXJjaFF1ZXJ5QXBwbGllZCB8fCAhaXNGaXJzdENvbmZpZ0NoYW5nZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0SW5pdGlhbFNlYXJjaFF1ZXJ5ID0gaW5pdGlhbFF1ZXJ5O1xuICAgIHRoaXMuX2luaXRpYWxTZWFyY2hRdWVyeUFwcGxpZWQgPSB0cnVlO1xuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBpbml0aWFsUXVlcnkgPz8gJyc7XG4gICAgdGhpcy5vblNlYXJjaENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2hhc2hDb2x1bW5zKGtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHIgPSBrZXlzLmpvaW4oJ3wnKTtcbiAgICBsZXQgaCA9IDB4ODExYzlkYzU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGggXj0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICBoID0gTWF0aC5pbXVsKGgsIDB4MDEwMDAxOTMpID4+PiAwO1xuICAgIH1cbiAgICByZXR1cm4gaC50b1N0cmluZygxNikucGFkU3RhcnQoOCwgJzAnKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZURhdGEoKTogVFtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiBBcnJheS5pc0FycmF5KCh0aGlzLmRhdGFTb3VyY2UgYXMgYW55KS5kYXRhKSkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFTb3VyY2UgYXMgYW55KS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbnNGcm9tQ29tcGF0KHJvd3M6IFRbXSk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjogdGhpcy5jb2x1bW5MYWJlbHM/LltrZXldIHx8IGh1bWFuaXplS2V5KGtleSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RSb3cgPSByb3dzWzBdIGFzIGFueTtcbiAgICBpZiAoIWZpcnN0Um93IHx8IHR5cGVvZiBmaXJzdFJvdyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZmlyc3RSb3cpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAga2V5LFxuICAgICAgaGVhZGVyOiB0aGlzLmNvbHVtbkxhYmVscz8uW2tleV0gfHwgaHVtYW5pemVLZXkoa2V5KSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk6IFRbXSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX3Jlc29sdmVkRGF0YTtcblxuICAgIGxldCBmaWx0ZXJlZCA9IGRhdGEuZmlsdGVyKHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIpO1xuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5Py50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIGNvbnN0IHJlc3RyaWN0ZWRLZXlzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5zZWFyY2g/LnNlYXJjaENvbHVtbnM7XG4gICAgICBjb25zdCBzZWFyY2hDb2xzID0gcmVzdHJpY3RlZEtleXM/Lmxlbmd0aFxuICAgICAgICA/IFsuLi50aGlzLl9jb2x1bW5NYXAudmFsdWVzKCldLmZpbHRlcihjb2wgPT4gcmVzdHJpY3RlZEtleXMuaW5jbHVkZXMoY29sLmtleSkpXG4gICAgICAgIDogWy4uLnRoaXMuX2NvbHVtbk1hcC52YWx1ZXMoKV07XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocm93KSA9PlxuICAgICAgICBzZWFyY2hDb2xzLnNvbWUoKGNvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RGlzcGxheVZhbHVlRm9yU2VhcmNoKGNvbCwgcm93KTtcbiAgICAgICAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICBwcml2YXRlIHByb2plY3RSb3dzKHJvd3M6IFRbXSk6IGFueVtdIHtcbiAgICBjb25zdCBncm91cEtleSA9IHRoaXMuYWN0aXZlR3JvdXBCeUtleTtcblxuICAgIGlmICghZ3JvdXBLZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgIHJvd3MuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWQ6IGFueSA9IHsgW1JPV19SQVdfS0VZXTogcm93LCBbUk9XX0lOREVYX0tFWV06IGluZGV4IH07XG4gICAgICAgIHRoaXMuYWN0aXZlRmllbGRzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgIHByb2plY3RlZFtjb2wua2V5XSA9IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cENvbERlZiA9IHRoaXMuX2NvbHVtbk1hcC5nZXQoZ3JvdXBLZXkpO1xuICAgIGNvbnN0IGdyb3VwTGF6eVN0YXR1cyA9IGdyb3VwQ29sRGVmPy5sYXp5ID8gKHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGdyb3VwS2V5KSA/PyAnaWRsZScpIDogJ2xvYWRlZCc7XG5cbiAgICBpZiAoZ3JvdXBMYXp5U3RhdHVzICE9PSAnbG9hZGVkJykge1xuICAgICAgdGhpcy5fdG90YWxGaWx0ZXJlZENvdW50ID0gcm93cy5sZW5ndGg7XG4gICAgICByZXR1cm4gW3sgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IEdST1VQX0tFWV9MQVpZX0xPQURJTkcsIFtST1dfR1JPVVBfQ09VTlRdOiByb3dzLmxlbmd0aCwgW1JPV19HUk9VUF9QQUdFXTogMCwgW1JPV19HUk9VUF9QQUdFX0NPVU5UXTogMSB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBlZmZlY3RpdmVTb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuXG4gICAgLy8gVsOpcmlmaWUgc2kgbGUgY2FjaGUgZXN0IGVuY29yZSB2YWxpZGUgKG3Dqm1lIHLDqWbDqXJlbmNlIGRlIHJvd3MgKyBtw6ptZSBwYXJhbcOodHJlcyBkZSB0cmkvZ3JvdXBlKVxuICAgIGNvbnN0IGNhY2hlVmFsaWQgPVxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5yb3dzID09PSByb3dzICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLmtleSA9PT0gZ3JvdXBLZXkgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydE9yZGVyID09PSB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnRBY3RpdmUgPT09IChlZmZlY3RpdmVTb3J0LmFjdGl2ZSA/PyAnJykgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydERpciA9PT0gKGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uID8/ICcnKTtcblxuICAgIGxldCBncm91cE9yZGVyOiBzdHJpbmdbXTtcbiAgICBsZXQgZ3JvdXBNYXA6IE1hcDxzdHJpbmcsIFRbXT47XG5cbiAgICBpZiAoY2FjaGVWYWxpZCkge1xuICAgICAgZ3JvdXBPcmRlciA9IHRoaXMuX2dyb3VwQ2FjaGUhLm9yZGVyO1xuICAgICAgZ3JvdXBNYXAgPSB0aGlzLl9ncm91cENhY2hlIS5tYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFByw6ktY2FsY3VsIGRlcyB2YWxldXJzIGRlIGdyb3VwZSBlbiB1biBzZXVsIHBhc3NhZ2UgKMOpdml0ZSBPKG4pIGZpbmQoKSBwYXIgY29tcGFyYWlzb24pXG4gICAgICBjb25zdCBncm91cFZhbHVlQ2FjaGUgPSBuZXcgTWFwPFQsIHN0cmluZz4oKTtcbiAgICAgIHJvd3MuZm9yRWFjaChyb3cgPT4gZ3JvdXBWYWx1ZUNhY2hlLnNldChyb3csIFN0cmluZyh0aGlzLmdldExhenlBd2FyZVZhbHVlKGdyb3VwS2V5LCByb3cpID8/ICcnKSkpO1xuXG4gICAgICAvLyBQcsOpLWNhbGN1bCBkZXMgdmFsZXVycyBkZSB0cmkgKMOpdml0ZSBPKG4gbG9nIG4pIMOXIGdldExhenlBd2FyZVZhbHVlIGRhbnMgbGUgY29tcGFyYXRldXIpXG4gICAgICBjb25zdCBmYXN0Q29tcGFyZUZuID0gdGhpcy5fYnVpbGRDYWNoZWRTb3J0Q29tcGFyYXRvcihyb3dzLCBlZmZlY3RpdmVTb3J0KTtcblxuICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgdmEgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KGEpITtcbiAgICAgICAgY29uc3QgdmIgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KGIpITtcbiAgICAgICAgY29uc3QgY21wID0gdmEubG9jYWxlQ29tcGFyZSh2Yik7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyID09PSAnZGVzYycgPyAtY21wIDogY21wO1xuICAgICAgfSk7XG5cbiAgICAgIGdyb3VwT3JkZXIgPSBbXTtcbiAgICAgIGdyb3VwTWFwID0gbmV3IE1hcDxzdHJpbmcsIFRbXT4oKTtcbiAgICAgIHNvcnRlZC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWVDYWNoZS5nZXQocm93KSE7XG4gICAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGdyb3VwVmFsdWUpKSB7XG4gICAgICAgICAgZ3JvdXBPcmRlci5wdXNoKGdyb3VwVmFsdWUpO1xuICAgICAgICAgIGdyb3VwTWFwLnNldChncm91cFZhbHVlLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBNYXAuZ2V0KGdyb3VwVmFsdWUpIS5wdXNoKHJvdyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVHJpIGludHJhLWdyb3VwZSBzdG9ja8OpIGRhbnMgbGUgY2FjaGUg4oCUIMOpdml0ZSBsZSByZS10cmkgc3VyIGNvbGxhcHNlL2V4cGFuZC9wYWdpbmF0aW9uXG4gICAgICBpZiAoZmFzdENvbXBhcmVGbikge1xuICAgICAgICBjb25zdCBmbiA9IGZhc3RDb21wYXJlRm47XG4gICAgICAgIGdyb3VwTWFwLmZvckVhY2goKGdyb3VwUm93cywga2V5KSA9PiB7XG4gICAgICAgICAgZ3JvdXBNYXAuc2V0KGtleSwgWy4uLmdyb3VwUm93c10uc29ydChmbikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTWlzZSBlbiBjYWNoZVxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZSA9IHtcbiAgICAgICAgcm93cyxcbiAgICAgICAga2V5OiBncm91cEtleSxcbiAgICAgICAgc29ydE9yZGVyOiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyLFxuICAgICAgICBzb3J0QWN0aXZlOiBlZmZlY3RpdmVTb3J0LmFjdGl2ZSA/PyAnJyxcbiAgICAgICAgc29ydERpcjogZWZmZWN0aXZlU29ydC5kaXJlY3Rpb24gPz8gJycsXG4gICAgICAgIG9yZGVyOiBncm91cE9yZGVyLFxuICAgICAgICBtYXA6IGdyb3VwTWFwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgPSByb3dzLmxlbmd0aDtcblxuICAgIC8vIFByb3RlY3Rpb24gY29udHJlIGxlcyBqZXV4IGRlIGRvbm7DqWVzIMOgIHRyb3AgaGF1dGUgY2FyZGluYWxpdMOpXG4gICAgaWYgKGdyb3VwT3JkZXIubGVuZ3RoID4gVGFibGVDb21wb25lbnQuTUFYX0dST1VQX0NPVU5UKSB7XG4gICAgICByZXR1cm4gW3sgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IEdST1VQX0tFWV9UT09fTUFOWSwgW1JPV19HUk9VUF9DT1VOVF06IGdyb3VwT3JkZXIubGVuZ3RoLCBbUk9XX0dST1VQX1BBR0VdOiAwLCBbUk9XX0dST1VQX1BBR0VfQ09VTlRdOiAxIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5ncm91cFBhZ2VTaXplO1xuICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICBjb25zdCByb3dJbmRleGVzID0gbmV3IE1hcDxULCBudW1iZXI+KCk7XG4gICAgcm93cy5mb3JFYWNoKChyb3csIGluZGV4KSA9PiByb3dJbmRleGVzLnNldChyb3csIGluZGV4KSk7XG5cbiAgICBncm91cE9yZGVyLmZvckVhY2goKGdyb3VwVmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwUm93cyA9IGdyb3VwTWFwLmdldChncm91cFZhbHVlKSE7XG4gICAgICBjb25zdCB0b3RhbENvdW50ID0gZ3JvdXBSb3dzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gcGFnZVNpemUgPT09IDAgPyAwIDogdGhpcy5fZ3JvdXBCeS5nZXRQYWdlKGdyb3VwVmFsdWUpO1xuICAgICAgY29uc3QgcGFnZUNvdW50ID0gcGFnZVNpemUgPT09IDAgPyAxIDogTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsQ291bnQgLyBwYWdlU2l6ZSkpO1xuICAgICAgY29uc3QgY29sbGFwc2VkID0gdGhpcy5pc0dyb3VwQ29sbGFwc2VkKGdyb3VwVmFsdWUpO1xuXG4gICAgICByZXN1bHQucHVzaCh7IFtHUk9VUF9IRUFERVJfTUFSS0VSXTogdHJ1ZSwgW1JPV19HUk9VUF9LRVldOiBncm91cFZhbHVlLCBbUk9XX0dST1VQX0NPVU5UXTogdG90YWxDb3VudCwgW1JPV19HUk9VUF9QQUdFXTogY3VycmVudFBhZ2UsIFtST1dfR1JPVVBfUEFHRV9DT1VOVF06IHBhZ2VDb3VudCB9KTtcblxuICAgICAgaWYgKCFjb2xsYXBzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWdlU2l6ZSA9PT0gMCA/IDAgOiBjdXJyZW50UGFnZSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBwYWdlU2l6ZSA9PT0gMCA/IHRvdGFsQ291bnQgOiBNYXRoLm1pbihzdGFydCArIHBhZ2VTaXplLCB0b3RhbENvdW50KTtcbiAgICAgICAgZ3JvdXBSb3dzLnNsaWNlKHN0YXJ0LCBlbmQpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkeCA9IHJvd0luZGV4ZXMuZ2V0KHJvdykgPz8gMDtcbiAgICAgICAgICBjb25zdCBwcm9qZWN0ZWQ6IGFueSA9IHsgW1JPV19SQVdfS0VZXTogcm93LCBbUk9XX0lOREVYX0tFWV06IGlkeCwgW1JPV19HUk9VUF9LRVldOiBncm91cFZhbHVlIH07XG4gICAgICAgICAgdGhpcy5hY3RpdmVGaWVsZHMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICBwcm9qZWN0ZWRbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocHJvamVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTb3J0Q29tcGFyYXRvcigpOiAoKGE6IFQsIGI6IFQpID0+IG51bWJlcikgfCBudWxsIHtcbiAgICBjb25zdCBzb3J0ID0gdGhpcy5fYWN0aXZlU29ydC5hY3RpdmUgJiYgdGhpcy5fYWN0aXZlU29ydC5kaXJlY3Rpb25cbiAgICAgID8gdGhpcy5fYWN0aXZlU29ydFxuICAgICAgOiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0ID8/IHsgYWN0aXZlOiAnJywgZGlyZWN0aW9uOiAnJyBhcyBjb25zdCB9O1xuICAgIGNvbnN0IHsgYWN0aXZlLCBkaXJlY3Rpb24gfSA9IHNvcnQ7XG4gICAgaWYgKCFhY3RpdmUgfHwgIWRpcmVjdGlvbikgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSBkaXJlY3Rpb247XG4gICAgcmV0dXJuIChhOiBULCBiOiBUKTogbnVtYmVyID0+IHtcbiAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSB0aGlzLl9jb21wYXJlU29ydFZhbHVlcyhcbiAgICAgICAgdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShhY3RpdmUsIGEpLFxuICAgICAgICB0aGlzLmdldExhenlBd2FyZVZhbHVlKGFjdGl2ZSwgYiksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5U29ydERpcmVjdGlvbihjb21wYXJpc29uLCBzb3J0RGlyZWN0aW9uKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRDYWNoZWRTb3J0Q29tcGFyYXRvcihcbiAgICByb3dzOiBUW10sXG4gICAgc29ydDogVGFibGVTb3J0U3RhdGUsXG4gICk6ICgoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB8IG51bGwge1xuICAgIGlmICghc29ydC5hY3RpdmUgfHwgIXNvcnQuZGlyZWN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzb3J0S2V5ID0gc29ydC5hY3RpdmU7XG4gICAgY29uc3Qgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSBzb3J0LmRpcmVjdGlvbjtcbiAgICBjb25zdCBzb3J0VmFsdWVDYWNoZSA9IG5ldyBNYXA8VCwgdW5rbm93bj4oKTtcbiAgICByb3dzLmZvckVhY2gocm93ID0+IHNvcnRWYWx1ZUNhY2hlLnNldChyb3csIHRoaXMuZ2V0TGF6eUF3YXJlVmFsdWUoc29ydEtleSwgcm93KSkpO1xuICAgIHJldHVybiAobGVmdDogVCwgcmlnaHQ6IFQpOiBudW1iZXIgPT4gdGhpcy5fYXBwbHlTb3J0RGlyZWN0aW9uKFxuICAgICAgdGhpcy5fY29tcGFyZVNvcnRWYWx1ZXMoc29ydFZhbHVlQ2FjaGUuZ2V0KGxlZnQpLCBzb3J0VmFsdWVDYWNoZS5nZXQocmlnaHQpKSxcbiAgICAgIHNvcnREaXJlY3Rpb24sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmVTb3J0VmFsdWVzKGxlZnQ6IHVua25vd24sIHJpZ2h0OiB1bmtub3duKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIGxlZnQgPT09ICdudW1iZXInICYmIHR5cGVvZiByaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChsZWZ0IDwgcmlnaHQpIHJldHVybiAtMTtcbiAgICAgIGlmIChsZWZ0ID4gcmlnaHQpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdFRleHQgPSB0aGlzLl9ub3JtYWxpemVTb3J0VmFsdWUobGVmdCk7XG4gICAgY29uc3QgcmlnaHRUZXh0ID0gdGhpcy5fbm9ybWFsaXplU29ydFZhbHVlKHJpZ2h0KTtcbiAgICBpZiAobGVmdFRleHQgPCByaWdodFRleHQpIHJldHVybiAtMTtcbiAgICBpZiAobGVmdFRleHQgPiByaWdodFRleHQpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfbm9ybWFsaXplU29ydFZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVNvcnREaXJlY3Rpb24oY29tcGFyaXNvbjogbnVtYmVyLCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNvbXBhcmlzb24gOiAtY29tcGFyaXNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvdXJuZSBsYSB2YWxldXIgdGVsbGUgcXUnZWxsZSBlc3QgYWZmaWNow6llIGRhbnMgbGEgY2VsbHVsZSwgZW4gc3VpdmFudCBleGFjdGVtZW50XG4gICAqIGxlIG3Dqm1lIGNoZW1pbiBxdWUgcmVzb2x2ZUNlbGxWYWx1ZSDigJQgdXRpbGlzw6llIHBvdXIgbGEgcmVjaGVyY2hlIHBsZWluLXRleHRlLlxuICAgKiBOZSBwYXNzZSBwYXMgcGFyIHNvcnRWYWx1ZSAodmFsZXVyIGJydXRlIGRlIHRyaSkgY29udHJhaXJlbWVudCDDoCBnZXRMYXp5QXdhcmVWYWx1ZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzcGxheVZhbHVlRm9yU2VhcmNoKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBUKTogYW55IHtcbiAgICBpZiAoY29sLmxhenkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbC5rZXkpID8/ICdpZGxlJztcbiAgICAgIGlmIChzdGF0dXMgIT09ICdsb2FkZWQnKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IHJvd01hcCA9IHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2wua2V5KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgfVxuICAgIGlmIChjb2wuc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiBjb2wuc2VhcmNoVmFsdWUocm93LCAwKTtcbiAgICB9XG4gICAgY29uc3QgcmF3VmFsdWUgPSBjb2wudmFsdWUgPyBjb2wudmFsdWUocm93LCAwKSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xhenlDb2x1bW5EYXRhLmdldChjb2x1bW5LZXkpPy5nZXQocm93KSA/PyBudWxsO1xuICAgIH1cbiAgICBpZiAoY29sRGVmPy5zb3J0VmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnNvcnRWYWx1ZShyb3csIDApKTtcbiAgICB9XG4gICAgaWYgKGNvbERlZj8udmFsdWUpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUoY29sRGVmLnZhbHVlKHJvdywgMCkpO1xuICAgIH1cbiAgICByZXR1cm4gKHJvdyBhcyBhbnkpW2NvbHVtbktleV07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDZWxsVmFsdWUoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+LCByb3c6IFQsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChjb2wubGF6eSkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoY29sLmtleSkgPz8gJ2lkbGUnO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnKSByZXR1cm4gTEFaWV9MT0FESU5HX1ZBTFVFO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykgcmV0dXJuIExBWllfRVJST1JfVkFMVUU7XG4gICAgICBpZiAoc3RhdHVzID09PSAnbG9hZGVkJykge1xuICAgICAgICBjb25zdCByb3dNYXAgPSB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sLmtleSk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocm93TWFwPy5nZXQocm93KSA/PyAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUHJvdmlkZXIgPSBjb2wudmFsdWU7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZVByb3ZpZGVyID8gdmFsdWVQcm92aWRlcihyb3csIGluZGV4KSA6IChyb3cgYXMgYW55KT8uW2NvbC5rZXldO1xuICAgIHJldHVybiBub3JtYWxpemVDZWxsVmFsdWUocmF3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplIHx8IDUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemVPcHRpb25zKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnMgfHwgWzUsIDEwLCAyMF07XG4gICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQob3B0aW9ucy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSA+IDApKV07XG5cbiAgICBpZiAoIXVuaXF1ZS5pbmNsdWRlcyh0aGlzLnBhZ2VTaXplKSkge1xuICAgICAgdW5pcXVlLnB1c2godGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYWdlU2l6ZU9wdGlvbnNHcm91cEJ5KCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlZENvbmZpZy5wYWdpbmF0aW9uPy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5IHx8IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFs1LCAxMCwgMjBdO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KG9wdGlvbnMuZmlsdGVyKCh2KSA9PiB2ID4gMCkpXTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplID4gMCAmJiAhdW5pcXVlLmluY2x1ZGVzKHRoaXMuZ3JvdXBQYWdlU2l6ZSkpIHtcbiAgICAgIHVuaXF1ZS5wdXNoKHRoaXMuZ3JvdXBQYWdlU2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmlxdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLnJlc29sdmVkQ29uZmlnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zR3JvdXBCeSB8fCBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zO1xuICAgIGlmIChvcHRpb25zPy5sZW5ndGgpIHJldHVybiBvcHRpb25zWzBdO1xuICAgIHJldHVybiBjZmcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgNTtcbiAgfVxuXG4gIHByaXZhdGUgdW5pcXVlQ29sdW1uc0J5S2V5KGNvbHVtbnM6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY29sdW1uLmtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoUGFnaW5hdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdGlvbikge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gbnVsbDtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG5cbiAgICBpZiAodGhpcy5fcGFnaW5hdG9yU3Vic2NyaWJlZCAhPT0gdGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMuX3BhZ2luYXRvclN1YnNjcmliZWQgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IhLnBhZ2VTaXplO1xuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh7IHBhZ2VJbmRleDogdGhpcy5wYWdpbmF0b3IhLnBhZ2VJbmRleCwgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yIS5wYWdlU2l6ZSB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdSZW5kZXIgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5fcHJvamVjdEN1cnJlbnRQYWdlKCk7XG4gICAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoU29ydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc29ydCkgcmV0dXJuO1xuXG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2Uuc29ydCA9IG51bGwgYXMgYW55O1xuXG4gICAgaWYgKHRoaXMuX3NvcnRTdWJzY3JpYmVkICE9PSB0aGlzLnNvcnQpIHtcbiAgICAgIHRoaXMuX3NvcnRTdWJzY3JpYmVkID0gdGhpcy5zb3J0O1xuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9hY3RpdmVTb3J0ID0ge1xuICAgICAgICAgIGFjdGl2ZTogdGhpcy5zb3J0LmFjdGl2ZSxcbiAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlOiB0aGlzLnNvcnQuYWN0aXZlLCBkaXJlY3Rpb246IHRoaXMuc29ydC5kaXJlY3Rpb24gfSk7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXphYmxlQ29sdW1uPFQ+KGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGNvbHVtbi5rZXksXG4gICAgaGVhZGVyOiBjb2x1bW4uaGVhZGVyLFxuICAgIGljb246IGNvbHVtbi5pY29uLFxuICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgcmVtb3ZhYmxlOiBjb2x1bW4ucmVtb3ZhYmxlLFxuICAgIG9wdGlvbmFsOiBjb2x1bW4ub3B0aW9uYWwsXG4gICAgd2lkdGg6IGNvbHVtbi53aWR0aCxcbiAgICBncm91cGFibGU6IGNvbHVtbi5ncm91cGFibGUsXG4gICAgc2xpY2VhYmxlOiBjb2x1bW4uc2xpY2VhYmxlLFxuICAgIGxhenk6ICEhY29sdW1uLmxhenksXG4gIH07XG59XG4iLCI8c2VjdGlvbiBjbGFzcz1cImpxdWVyeS10YWJsZS13cmFwcGVyXCI+XG4gIDxvdXRwdXQgY2xhc3M9XCJ2aXN1YWwtY29weS1mZWVkYmFja1wiICpuZ0lmPVwiY29weUZlZWRiYWNrTWVzc2FnZVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPnt7IGNvcHlGZWVkYmFja01lc3NhZ2UgfX08L291dHB1dD5cbiAgPGhlYWRlciBjbGFzcz1cInRhYmxlLWhlYWRlclwiICpuZ0lmPVwic2hvd1RpdGxlXCI+XG4gICAgPGgzPnt7IHRpdGxlIH19PC9oMz5cbiAgPC9oZWFkZXI+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtbGF5b3V0XCJcbiAgICBbY2xhc3Mubm8tc2xpY2VdPVwiIV9zaG93U2xpY2VQYW5lbCB8fCBfc2xpY2VQYW5lbENvbGxhcHNlZFwiXG4gID5cbiAgICA8c2xpY2UtcGFuZWxcbiAgICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFfc2hvd1NsaWNlUGFuZWwgfHwgX3NsaWNlUGFuZWxDb2xsYXBzZWQgPyAnbm9uZScgOiBudWxsXCJcbiAgICAgIFtzbGljZUNvbmZpZ3NdPVwiX3NsaWNlQ29uZmlnc1wiXG4gICAgICBbY29sdW1uc109XCJfc2xpY2VDb2x1bW5zXCJcbiAgICAgIFtkYXRhXT1cIl9zbGljZURhdGFcIlxuICAgICAgW2xhenlEYXRhXT1cIl9sYXp5Q29sdW1uRGF0YVwiXG4gICAgICBbbGF6eVN0YXR1c109XCJfbGF6eUNvbHVtblN0YXR1c1wiXG4gICAgICBbc2hvd1RvZ2dsZV09XCJfc2xpY2VTaG93VG9nZ2xlXCJcbiAgICAgIFtjb2xsYXBzZWRCeURlZmF1bHRdPVwiX3NsaWNlUGFuZWxDb2xsYXBzZWRcIlxuICAgICAgKGZpbHRlckNoYW5nZSk9XCJvblNsaWNlRmlsdGVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGR5bmFtaWNTbGljZUtleXNDaGFuZ2UpPVwib25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGNvbGxhcHNlZENoYW5nZSk9XCJvblNsaWNlUGFuZWxDb2xsYXBzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvc2xpY2UtcGFuZWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtc2hlbGxcIiAjdGFibGVTaGVsbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10b29sYmFyXCIgKm5nSWY9XCJzaG93VG9vbGJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdG9vbGJhci1sZWZ0XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93U2xpY2VFeHBhbmRCdG5cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNsaWNlLWV4cGFuZC1idG5cIlxuICAgICAgICAgICAgW3RpdGxlXT1cImkxOG4uZXhwYW5kRmlsdGVyVGl0bGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZFNsaWNlUGFuZWwoKVwiXG4gICAgICAgICAgPjxtYXQtaWNvbiBjbGFzcz1cInNsaWNlLWV4cGFuZC1tYXQtaWNvblwiPmZpbHRlcl9saXN0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiIGNsYXNzPVwic2VhcmNoLWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZWFyY2gtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjguNVwiIGN5PVwiOC41XCIgcj1cIjUuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAxM0wxNyAxN1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hRdWVyeVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKClcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiaTE4bi5zZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaTE4bi5zZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlYXJjaFF1ZXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VhcmNoLWNsZWFyLWJ0blwiIChjbGljayk9XCJzZWFyY2hRdWVyeSA9ICcnOyBvblNlYXJjaENoYW5nZSgpXCI+w5c8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VhcmNoLWNvdW50XCIgKm5nSWY9XCIhZWZmZWN0aXZlSXNMb2FkaW5nXCI+e3sgZmlsdGVyZWRSb3dDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY291bnQtbG9hZGVyXCIgKm5nSWY9XCJlZmZlY3RpdmVJc0xvYWRpbmdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dPcmdhbml6ZXJCdXR0b25cIiBjbGFzcz1cInRhYmxlLXRvb2xiYXItcmlnaHRcIj5cbiAgICAgICAgICA8dGFibGUtb3JnYW5pemVyLWJ1dHRvblxuICAgICAgICAgICAgW2NvbmZpZ109XCJvcmdhbml6ZXJDb25maWdcIlxuICAgICAgICAgICAgW3N0YXRlXT1cIm9yZ2FuaXplclN0YXRlXCJcbiAgICAgICAgICAgIFtoaWRlTWVudVZhbHVlc109XCJvcmdhbml6ZXJIaWRlTWVudVZhbHVlc1wiXG4gICAgICAgICAgICAodmlld0NoYW5nZSk9XCJvbk9yZ2FuaXplclZpZXdDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvdGFibGUtb3JnYW5pemVyLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHktd3JhcHBlclwiPlxuXG4gICAgICA8IS0tIEJhbm5pw6hyZSBtZXNzYWdlIHByw6lmw6lyZW5jZXMgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiX3ByZWZlcmVuY2VzTWVzc2FnZVwiIGNsYXNzPVwicHJlZmVyZW5jZXMtbWVzc2FnZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJwcmVmZXJlbmNlcy1tZXNzYWdlLWljb25cIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBfcHJlZmVyZW5jZXNNZXNzYWdlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQm91dG9uIGRlIGNvbmZpcm1hdGlvbiBkdSBtb2RlIMOpZGl0aW9uIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIl9lZGl0TW9kZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImVkaXQtY29uZmlybS1idG5cIlxuICAgICAgICBbdGl0bGVdPVwiaTE4bi5wcmVmZXJlbmNlc0NvbmZpcm1FZGl0XCJcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1FZGl0TW9kZSgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5LXNjcm9sbFwiICN0YWJsZUJvZHlTY3JvbGw+XG4gICAgICA8dGFibGUgbWF0LXRhYmxlIG1hdFNvcnQgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgY2xhc3M9XCJqcXVlcnktdGFibGVcIlxuICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwidGFibGVNaW5XaWR0aFwiXG4gICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tSb3dGblwiXG4gICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiX21hdFNvcnRBY3RpdmVcIiBbbWF0U29ydERpcmVjdGlvbl09XCJfbWF0U29ydERpcmVjdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5rZXlcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFttYXQtc29ydC1oZWFkZXJdPVwiKCFfZWRpdE1vZGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkgPyBjb2x1bW4ua2V5IDogJydcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9lZGl0TW9kZSB8fCBjb2x1bW4uc29ydGFibGUgPT09IGZhbHNlXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJhZy1lbmFibGVkXT1cImlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkIHx8IF9lZGl0TW9kZVwiXG4gICAgICAgICAgICBbY2xhc3MuZHJvcC10YXJnZXRdPVwiaXNIZWFkZXJEcm9wVGFyZ2V0KGNvbHVtbi5rZXkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5lZGl0LW1vZGUtaGVhZGVyXT1cIl9lZGl0TW9kZVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25IZWFkZXJEcmFnT3Zlcihjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uSGVhZGVyRHJvcChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1jZWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uXCIgY2xhc3M9XCJoZWFkLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj57eyBjb2x1bW4uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZC10ZXh0XCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj57eyBjb2x1bW4uaGVhZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCB8fCBfZWRpdE1vZGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJhZy1oYW5kbGVcIlxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUsOpb3Jkb25uZXIgbGEgY29sb25uZSAnICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkhlYWRlckRyYWdTdGFydChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkhlYWRlckRyYWdFbmQoKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25IZWFkZXJLZXlEb3duKGNvbHVtbi5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUG9pZ27DqWUgZGUgcmVzaXplICh2aXNpYmxlIHVuaXF1ZW1lbnQgZW4gbW9kZSDDqWRpdGlvbikgLS0+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAqbmdJZj1cIl9lZGl0TW9kZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29sLXJlc2l6ZS1oYW5kbGVcIlxuICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25SZXNpemVTdGFydChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLWNlbGxdPVwiX2VkaXRNb2RlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIV9lZGl0TW9kZTsgZWxzZSBlZGl0TW9kZUNlbGxUcGxcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENlbGxUZW1wbGF0ZShjb2x1bW4ua2V5KSBhcyBjdXN0b21UcGw7IGVsc2UgZGVmYXVsdENlbGxUcGxcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93W19ST1dfUkFXX0tFWV0sIGluZGV4OiByb3dbX1JPV19JTkRFWF9LRVldIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUcGw+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLmxhenkgPyBnZXRMYXp5UmVuZGVyVHlwZShyb3dbY29sdW1uLmtleV0pIDogJ3ZhbHVlJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidsb2FkaW5nJ1wiIGNsYXNzPVwibGF6eS1za2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nU3dpdGNoQ2FzZT1cIidlcnJvcidcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJsYXp5LWVycm9yLWJ0blwiIChjbGljayk9XCJyZXRyeUxhenlDb2x1bW4oY29sdW1uKVwiIFt0aXRsZV09XCJpMThuLmxhenlFcnJvclRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1lcnJvci1pY29uXCI+4pqgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhenktZXJyb3ItbGFiZWxcIj57eyBpMThuLmxhenlSZXRyeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBjbGFzcz1cImNlbGwtdGV4dFwiIFtjbGFzcy5jZWxsLWVtcHR5XT1cImlzQ2VsbEVtcHR5KHJvd1tjb2x1bW4ua2V5XSlcIiBbdGl0bGVdPVwiYXNUaXRsZShyb3dbY29sdW1uLmtleV0pXCI+e3sgaXNDZWxsRW1wdHkocm93W2NvbHVtbi5rZXldKSA/IGkxOG4uY2VsbEVtcHR5IDogcm93W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRNb2RlQ2VsbFRwbD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZWxsLXRleHQgY2VsbC1lZGl0LW1vZGVcIiBbdGl0bGVdPVwiYXNUaXRsZShyb3dbY29sdW1uLmtleV0pXCI+e3sgcm93W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cInJlbmRlcmVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgbWF0LXJvd1xuICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiByZW5kZXJlZENvbHVtbnM7IHdoZW46ICFpc0dyb3VwSGVhZGVyXCJcbiAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJoYXNSb3dDbGlja0hhbmRsZXIgJiYgIV9lZGl0TW9kZSA/IDAgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImhhc1Jvd0NsaWNrSGFuZGxlciAmJiAhX2VkaXRNb2RlID8gcm93QWN0aW9uTGFiZWwocm93KSA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEta2V5c2hvcnRjdXRzXT1cImhhc1Jvd0NsaWNrSGFuZGxlciAmJiAhX2VkaXRNb2RlID8gJ0VudGVyIFNwYWNlJyA6IG51bGxcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFJvd0NsYXNzKHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5uby1wb2ludGVyXT1cIiFoYXNSb3dDbGlja0hhbmRsZXIgfHwgX2VkaXRNb2RlXCJcbiAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLXJvd109XCJfZWRpdE1vZGVcIlxuICAgICAgICAgIChjbGljayk9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIhX2VkaXRNb2RlICYmIG9uUm93Q2xpY2socm93LCBudWxsKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIV9lZGl0TW9kZSAmJiBvblJvd0NsaWNrKHJvdywgbnVsbCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgPjwvdHI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJfR1JPVVBfUk9XX0NPTFVNTlwiPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbYXR0ci5jb2xzcGFuXT1cInJlbmRlcmVkQ29sdW1ucy5sZW5ndGhcIiBjbGFzcz1cImdyb3VwLWhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtY2hldnJvblwiIFtjbGFzcy5jb2xsYXBzZWRdPVwiaXNHcm91cENvbGxhcHNlZChyb3dbX1JPV19HUk9VUF9LRVldKVwiICpuZ0lmPVwiaXNOb3JtYWxHcm91cFJvdyhyb3cpXCI+4oC6PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTm9ybWFsR3JvdXBSb3cocm93KVwiIGNsYXNzPVwiZ3JvdXAta2V5LWxhYmVsXCI+e3sgcm93W19ST1dfR1JPVVBfS0VZXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0dyb3VwUm93TG9hZGluZyhyb3cpXCIgY2xhc3M9XCJsYXp5LXNrZWxldG9uIGdyb3VwLWxhenkta2V5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzR3JvdXBSb3dUb29NYW55KHJvdylcIiBjbGFzcz1cImdyb3VwLXRvby1tYW55LWxhYmVsXCI+e3sgaTE4bi5ncm91cFRvb01hbnkocm93W19ST1dfR1JPVVBfQ09VTlRdKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1jb3VudC1iYWRnZVwiPnt7IHJvd1tfUk9XX0dST1VQX0NPVU5UXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXBhZ2luYXRpb25cIiAqbmdJZj1cIiFpc0dyb3VwQ29sbGFwc2VkKHJvd1tfUk9XX0dST1VQX0tFWV0pICYmIHJvd1tfUk9XX0dST1VQX1BBR0VfQ09VTlRdID4gMVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXBhZ2UtYnRuXCIgW2Rpc2FibGVkXT1cInJvd1tfUk9XX0dST1VQX1BBR0VdID09PSAwXCIgKGNsaWNrKT1cImdyb3VwUGFnZUJhY2socm93W19ST1dfR1JPVVBfS0VZXSlcIj7igLk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXBhZ2UtaW5mb1wiPnt7IHJvd1tfUk9XX0dST1VQX1BBR0VdICsgMSB9fSAvIHt7IHJvd1tfUk9XX0dST1VQX1BBR0VfQ09VTlRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcGFnZS1idG5cIiBbZGlzYWJsZWRdPVwicm93W19ST1dfR1JPVVBfUEFHRV0gPj0gcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gLSAxXCIgKGNsaWNrKT1cImdyb3VwUGFnZUZvcndhcmQocm93W19ST1dfR1JPVVBfS0VZXSwgcm93W19ST1dfR1JPVVBfQ09VTlRdKVwiPuKAujwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogW19HUk9VUF9ST1dfQ09MVU1OXTsgd2hlbjogaXNHcm91cEhlYWRlclwiXG4gICAgICAgICAgICBjbGFzcz1cImdyb3VwLWhlYWRlci1yb3dcIlxuICAgICAgICAgICAgW2NsYXNzLmdyb3VwLWhlYWRlci1sb2FkaW5nXT1cImlzR3JvdXBSb3dMb2FkaW5nKHJvdylcIlxuICAgICAgICAgICAgW2NsYXNzLmdyb3VwLWhlYWRlci10b28tbWFueV09XCJpc0dyb3VwUm93VG9vTWFueShyb3cpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZ3JvdXAta2V5XT1cInJvd1tfUk9XX0dST1VQX0tFWV1cIlxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzTm9ybWFsR3JvdXBSb3cocm93KSA/IDAgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzTm9ybWFsR3JvdXBSb3cocm93KSA/ICFpc0dyb3VwQ29sbGFwc2VkKHJvd1tfUk9XX0dST1VQX0tFWV0pIDogbnVsbFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBIZWFkZXJDbGljayhyb3cpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkdyb3VwSGVhZGVyQ2xpY2socm93KVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25Hcm91cEhlYWRlckNsaWNrKHJvdyk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+PC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1yb3cgbm8tZGF0YS1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBuby1kYXRhLWNlbGxcIiBbYXR0ci5jb2xzcGFuXT1cInJlbmRlcmVkQ29sdW1ucy5sZW5ndGhcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PjwhLS0gL3RhYmxlLWJvZHktc2Nyb2xsIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHktb3ZlcmxheVwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nIHx8IGlzRW1wdHlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWJsZS1ib2R5LW92ZXJsYXktdGV4dFwiPnt7IGVmZmVjdGl2ZUlzTG9hZGluZyA/IGxvYWRpbmdTdGF0ZUxhYmVsIDogZW1wdHlTdGF0ZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj48IS0tIC90YWJsZS1ib2R5LXdyYXBwZXIgLS0+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tYmFyXCIgW2NsYXNzLmlzLWxvYWRpbmddPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCIgKm5nSWY9XCJzaG93UGFnaW5hdGlvblwiPlxuICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgIFtsZW5ndGhdPVwidG90YWxSb3dzXCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgICBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwicmVzb2x2ZWRQYWdpbmF0aW9uU2hvd0ZpcnN0TGFzdEJ1dHRvbnNcIlxuICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdG9yLXJhbmdlLWxvYWRlclwiIFxuICAgICAgICAgICAgIFtjbGFzcy5wYWdpbmF0b3ItcmFuZ2UtbG9hZGVyLS1uby1maXJzdC1sYXN0XT1cIiFyZXNvbHZlZFBhZ2luYXRpb25TaG93Rmlyc3RMYXN0QnV0dG9uc1wiXG4gICAgICAgICAgICAgKm5nSWY9XCJlZmZlY3RpdmVJc0xvYWRpbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtYm90dG9tLWJhclwiICpuZ0lmPVwiYWN0aXZlR3JvdXBCeUtleVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtYm90dG9tLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtYm90dG9tLWJhci1sZWZ0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXJlc2V0LWJ0blwiIChjbGljayk9XCJvbkdyb3VwQnlDaGFuZ2UobnVsbClcIj5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJncm91cC1yZXNldC1pY29uXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDhhNSA1IDAgMSAwIDUtNSA1IDUgMCAwIDAtMy41NCAxLjQ2TDMgM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgM3YyLjVINS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAge3sgaTE4bi5ncm91cFJlbW92ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtYmFyLXNlcGFyYXRvclwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXNvcnQtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1zb3J0LWxhYmVsXCI+e3sgaTE4bi5ncm91cFNvcnRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1zb3J0LWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ3JvdXBTb3J0T3JkZXIgPT09ICdhc2MnXCIgKGNsaWNrKT1cIm9uR3JvdXBTb3J0VG9nZ2xlKCdhc2MnKVwiIFt0aXRsZV09XCJpMThuLmdyb3VwU29ydEFzY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1zb3J0LWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ3JvdXBTb3J0T3JkZXIgPT09ICdkZXNjJ1wiIChjbGljayk9XCJvbkdyb3VwU29ydFRvZ2dsZSgnZGVzYycpXCIgW3RpdGxlXT1cImkxOG4uZ3JvdXBTb3J0RGVzY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1sYWJlbFwiPnt7IGkxOG4uZ3JvdXBSb3dzUGVyR3JvdXAgfX08L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBjbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwUGFnZVNpemVcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uR3JvdXBQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3Itc2VsZWN0LXBhZ2Utc2l6ZSBncm91cC1wYWdlLXNpemUtcGFuZWxcIlxuICAgICAgICAgICAgICAgIFtwYW5lbFdpZHRoXT1cIidhdXRvJ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPnt7IGdyb3VwUGFnZVNpemUgPT09IDAgPyBpMThuLmdyb3VwU2hvd0FsbCA6IGdyb3VwUGFnZVNpemUgfX08L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIHBhZ2VTaXplT3B0aW9uc0dyb3VwQnlcIiBbdmFsdWVdPVwib3B0XCI+e3sgb3B0IH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIwXCI+e3sgaTE4bi5ncm91cFNob3dBbGwgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19