@oneteme/jquery-table 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/component/organizer-button/organizer-button.component.mjs +49 -0
- package/esm2022/lib/component/table.component.mjs +185 -114
- package/esm2022/lib/jqt-i18n.token.mjs +2 -2
- package/esm2022/lib/jquery-table.model.mjs +1 -1
- package/esm2022/public-api.mjs +4 -3
- package/fesm2022/oneteme-jquery-table.mjs +265 -1112
- package/fesm2022/oneteme-jquery-table.mjs.map +1 -1
- package/lib/component/organizer-button/organizer-button.component.d.ts +12 -0
- package/lib/component/table.component.d.ts +10 -8
- package/lib/jquery-table.model.d.ts +2 -2
- package/package.json +3 -2
- package/public-api.d.ts +3 -2
- package/esm2022/lib/component/group-by.manager.mjs +0 -99
- package/esm2022/lib/component/lazy-column-manager.mjs +0 -99
- package/esm2022/lib/component/slice-panel/slice-panel.component.mjs +0 -477
- package/esm2022/lib/component/slice-panel/slice-panel.model.mjs +0 -2
- package/esm2022/lib/component/view/view.facade.mjs +0 -304
- package/lib/component/group-by.manager.d.ts +0 -44
- package/lib/component/lazy-column-manager.d.ts +0 -26
- package/lib/component/slice-panel/slice-panel.component.d.ts +0 -81
- package/lib/component/slice-panel/slice-panel.model.d.ts +0 -69
- package/lib/component/view/view.facade.d.ts +0 -95
|
@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms';
|
|
|
4
4
|
import { MatButtonModule } from '@angular/material/button';
|
|
5
5
|
import { MatDividerModule } from '@angular/material/divider';
|
|
6
6
|
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
-
import { MatMenuModule
|
|
7
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
8
8
|
import { MatPaginator, MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';
|
|
9
9
|
import { MatSelectModule } from '@angular/material/select';
|
|
10
10
|
import { MatSort, MatSortModule } from '@angular/material/sort';
|
|
@@ -12,26 +12,22 @@ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
|
12
12
|
import { Subject, takeUntil } from 'rxjs';
|
|
13
13
|
import { JQT_I18N, JQT_I18N_DEFAULTS } from '../jqt-i18n.token';
|
|
14
14
|
import { JqtCellDefDirective } from '../directive/jqt-cell-def.directive';
|
|
15
|
-
import { SlicePanelComponent } from '
|
|
15
|
+
import { SlicePanelComponent, OrganizerFacade, GroupByManager, LazyFieldManager } from '@oneteme/jquery-organizer';
|
|
16
16
|
import { getFrenchPaginatorIntl, humanizeKey, normalizeCellValue } from './table.utils';
|
|
17
|
-
import { ViewFacade } from './view/view.facade';
|
|
18
|
-
import { LazyColumnManager } from './lazy-column-manager';
|
|
19
17
|
import { TablePreferencesManager } from './table-preferences.manager';
|
|
20
|
-
import { GroupByManager } from './group-by.manager';
|
|
21
18
|
import { ExportManager } from './export.manager';
|
|
22
19
|
import { GROUP_ROW_COLUMN, GROUP_HEADER_MARKER, GROUP_KEY_LAZY_LOADING, GROUP_KEY_TOO_MANY, ROW_RAW_KEY, ROW_INDEX_KEY, ROW_GROUP_KEY, ROW_GROUP_COUNT, ROW_GROUP_PAGE, ROW_GROUP_PAGE_COUNT, LAZY_LOADING_VALUE, LAZY_ERROR_VALUE, } from './table.constants';
|
|
20
|
+
import { OrganizerButtonWrapperComponent } from './organizer-button/organizer-button.component';
|
|
23
21
|
import * as i0 from "@angular/core";
|
|
24
22
|
import * as i1 from "@angular/common";
|
|
25
23
|
import * as i2 from "@angular/forms";
|
|
26
24
|
import * as i3 from "@angular/material/table";
|
|
27
|
-
import * as i4 from "@angular/material/
|
|
28
|
-
import * as i5 from "@angular/material/
|
|
29
|
-
import * as i6 from "@angular/material/
|
|
30
|
-
import * as i7 from "@angular/material/
|
|
31
|
-
import * as i8 from "@angular/material/
|
|
32
|
-
import * as i9 from "@angular/material/
|
|
33
|
-
import * as i10 from "@angular/material/select";
|
|
34
|
-
import * as i11 from "@angular/material/core";
|
|
25
|
+
import * as i4 from "@angular/material/paginator";
|
|
26
|
+
import * as i5 from "@angular/material/sort";
|
|
27
|
+
import * as i6 from "@angular/material/icon";
|
|
28
|
+
import * as i7 from "@angular/material/form-field";
|
|
29
|
+
import * as i8 from "@angular/material/select";
|
|
30
|
+
import * as i9 from "@angular/material/core";
|
|
35
31
|
export class TableComponent {
|
|
36
32
|
constructor() {
|
|
37
33
|
this.isLoading = false;
|
|
@@ -64,12 +60,12 @@ export class TableComponent {
|
|
|
64
60
|
this._ROW_GROUP_PAGE = ROW_GROUP_PAGE;
|
|
65
61
|
this._ROW_GROUP_PAGE_COUNT = ROW_GROUP_PAGE_COUNT;
|
|
66
62
|
/** Facade View : état et actions centralisés (Champs / Group by / Slice by) */
|
|
67
|
-
this.
|
|
63
|
+
this._organizer = new OrganizerFacade();
|
|
68
64
|
/**
|
|
69
|
-
* Snapshot stable synchronisé depuis
|
|
65
|
+
* Snapshot stable synchronisé depuis _organizer.fields.activeFields dans refreshViewModel().
|
|
70
66
|
* Propriété (non getter) pour qu'Angular puisse la suivre sans NG0100.
|
|
71
67
|
*/
|
|
72
|
-
this.
|
|
68
|
+
this.activeFields = [];
|
|
73
69
|
this.activeSliceFilter = () => true;
|
|
74
70
|
// Propriétés stables pour les bindings du template (contre erreur NG0100)
|
|
75
71
|
this._sliceConfigs = [];
|
|
@@ -91,7 +87,7 @@ export class TableComponent {
|
|
|
91
87
|
/** Gestionnaire du mode Group By (état collapsed, pagination, tri des groupes). */
|
|
92
88
|
this._groupBy = new GroupByManager(() => { this._projectCurrentPage(); this._cdr.markForCheck(); }, () => this.refreshViewModel());
|
|
93
89
|
/** Gestionnaire du cycle de vie des colonnes lazy (fetch, annulation, statuts, données). */
|
|
94
|
-
this._lazy = new
|
|
90
|
+
this._lazy = new LazyFieldManager();
|
|
95
91
|
this._cdr = inject(ChangeDetectorRef);
|
|
96
92
|
this._el = inject((ElementRef));
|
|
97
93
|
this._ngZone = inject(NgZone);
|
|
@@ -100,7 +96,7 @@ export class TableComponent {
|
|
|
100
96
|
this.i18n = { ...JQT_I18N_DEFAULTS, ...(this._i18nRaw ?? {}) };
|
|
101
97
|
this.isGroupHeader = (_, row) => row[GROUP_HEADER_MARKER] === true;
|
|
102
98
|
/** Gestionnaire export CSV. */
|
|
103
|
-
this._export = new ExportManager(() => this._allFilteredRows, () => this.
|
|
99
|
+
this._export = new ExportManager(() => this._allFilteredRows, () => this.activeFields, () => this.resolvedConfig.export, (col, row, idx) => this.resolveCellValue(col, row, idx));
|
|
104
100
|
// ── Lifecycle
|
|
105
101
|
this.pageSize = 5;
|
|
106
102
|
this.pageSizeOptions = [5, 10, 20];
|
|
@@ -138,6 +134,7 @@ export class TableComponent {
|
|
|
138
134
|
this._configHiddenKeys = new Set();
|
|
139
135
|
/** Clés des colonnes visibles du dernier émission columnsChange (pour éviter les émissions dupliquement). */
|
|
140
136
|
this._prevColumnKeys = [];
|
|
137
|
+
this._organizerConfigCache = null;
|
|
141
138
|
this.trackRowFn = (_index, row) => row[GROUP_HEADER_MARKER] ? `__group_${row[ROW_GROUP_KEY]}` : row[ROW_INDEX_KEY] ?? _index;
|
|
142
139
|
this._preferencesMessageTimer = null;
|
|
143
140
|
}
|
|
@@ -157,12 +154,12 @@ export class TableComponent {
|
|
|
157
154
|
}
|
|
158
155
|
get paginator() { return this._paginator; }
|
|
159
156
|
// Délégués vers _view (conservés pour compatibilité template sans refactoring HTML)
|
|
160
|
-
get _staticSlicesForMenu() { return this.
|
|
161
|
-
get _activeDynamicSliceColumns() { return this.
|
|
162
|
-
get _availableColumnsForDynamicSlice() { return this.
|
|
163
|
-
get _allDynamicSliceColumns() { return this.
|
|
164
|
-
get _activeSliceByLabel() { return this.
|
|
165
|
-
get activeGroupByKey() { return this.
|
|
157
|
+
get _staticSlicesForMenu() { return this._organizer.staticSlicesForMenu; }
|
|
158
|
+
get _activeDynamicSliceColumns() { return this._organizer.sliceBy.activeDynamicFields; }
|
|
159
|
+
get _availableColumnsForDynamicSlice() { return this._organizer.sliceBy.availableForDynamic; }
|
|
160
|
+
get _allDynamicSliceColumns() { return this._organizer.sliceBy.allDynamicFields; }
|
|
161
|
+
get _activeSliceByLabel() { return this._organizer.sliceBy.activeLabel; }
|
|
162
|
+
get activeGroupByKey() { return this._organizer.groupBy.activeKey; }
|
|
166
163
|
/** Délégués vers GroupByManager pour la compatibilité des templates. */
|
|
167
164
|
get groupPageSize() { return this._groupBy.groupPageSize; }
|
|
168
165
|
set groupPageSize(v) { this._groupBy.groupPageSize = v; }
|
|
@@ -195,9 +192,10 @@ export class TableComponent {
|
|
|
195
192
|
if (changes['config']) {
|
|
196
193
|
this.applyConfigSearchReset();
|
|
197
194
|
this.applyInitialSearchQuery();
|
|
195
|
+
this._invalidateOrganizerConfig(); // les colonnes ont pu changer
|
|
198
196
|
}
|
|
199
197
|
if (dataChanged) {
|
|
200
|
-
this.
|
|
198
|
+
this.activeFields.filter(c => c.lazy).forEach(c => this.triggerLazyFetch(c));
|
|
201
199
|
}
|
|
202
200
|
}
|
|
203
201
|
ngAfterContentInit() {
|
|
@@ -223,25 +221,24 @@ export class TableComponent {
|
|
|
223
221
|
const filters = this._pendingSliceFilters ? { ...this._pendingSliceFilters } : null;
|
|
224
222
|
this._pendingDynamicSliceKeys = null;
|
|
225
223
|
this._pendingSliceFilters = null;
|
|
226
|
-
// Tout est différé dans le même setTimeout pour :
|
|
227
|
-
// 1. Éviter NG0100 (modifications après vérification dans ngAfterViewInit)
|
|
228
|
-
// 2. Garantir que les dynamic slices sont ajoutées AVANT la restauration des filtres
|
|
229
|
-
// (les indices dans sliceFilters dépendent de l'ordre final de _cachedSlices)
|
|
230
224
|
setTimeout(() => {
|
|
225
|
+
if (this._resolvedData.length === 0) {
|
|
226
|
+
console.log('[SliceRestore] ngAfterViewInit: données absentes, restauration différée à _recomputeShowSlicePanel', { keys, filters });
|
|
227
|
+
if (filters)
|
|
228
|
+
this._pendingSliceFilters = filters;
|
|
229
|
+
if (keys.length > 0)
|
|
230
|
+
this._pendingDynamicSliceKeys = [...keys];
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
console.log('[SliceRestore] ngAfterViewInit: données présentes, application immédiate', { keys, filters });
|
|
231
234
|
keys.forEach(key => {
|
|
232
235
|
const col = allCols.find(c => c.key === key);
|
|
233
236
|
if (col)
|
|
234
237
|
this.addDynamicSlice(col);
|
|
235
238
|
});
|
|
236
|
-
if (filters) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
// slicePanelRef toujours null (données pas encore arrivées) :
|
|
242
|
-
// remettre en attente pour que _recomputeShowSlicePanel les applique
|
|
243
|
-
this._pendingSliceFilters = filters;
|
|
244
|
-
}
|
|
239
|
+
if (filters && this.slicePanelRef) {
|
|
240
|
+
console.log('[SliceRestore] restoreFilters depuis ngAfterViewInit', filters);
|
|
241
|
+
this.slicePanelRef.restoreFilters(filters);
|
|
245
242
|
}
|
|
246
243
|
this._cdr.markForCheck();
|
|
247
244
|
});
|
|
@@ -257,7 +254,7 @@ export class TableComponent {
|
|
|
257
254
|
this._resizeState = null;
|
|
258
255
|
this._destroy$.next();
|
|
259
256
|
this._destroy$.complete();
|
|
260
|
-
this.
|
|
257
|
+
this._organizer.destroy();
|
|
261
258
|
}
|
|
262
259
|
_measureHeaderHeight() {
|
|
263
260
|
const measure = () => {
|
|
@@ -274,7 +271,73 @@ export class TableComponent {
|
|
|
274
271
|
};
|
|
275
272
|
this._ngZone.runOutsideAngular(() => requestAnimationFrame(() => measure()));
|
|
276
273
|
}
|
|
277
|
-
|
|
274
|
+
_invalidateOrganizerConfig() { this._organizerConfigCache = null; }
|
|
275
|
+
get organizerConfig() {
|
|
276
|
+
if (this._organizerConfigCache)
|
|
277
|
+
return this._organizerConfigCache;
|
|
278
|
+
const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];
|
|
279
|
+
this._organizerConfigCache = {
|
|
280
|
+
fields: this._organizer.showFields ? allCols.map(c => ({
|
|
281
|
+
id: c.key,
|
|
282
|
+
label: this.colLabel(c),
|
|
283
|
+
icon: c.icon,
|
|
284
|
+
state: 'ready',
|
|
285
|
+
})) : undefined,
|
|
286
|
+
groups: this._organizer.showGroupBySection ? this._organizer.groupByFields.map(c => ({
|
|
287
|
+
id: c.key,
|
|
288
|
+
label: this.colLabel(c),
|
|
289
|
+
icon: c.icon,
|
|
290
|
+
})) : undefined,
|
|
291
|
+
slices: this._organizer.showSliceBySection ? this._sliceByMenuItems.map(item => ({
|
|
292
|
+
id: item.key,
|
|
293
|
+
label: item.title,
|
|
294
|
+
icon: item.icon,
|
|
295
|
+
})) : undefined,
|
|
296
|
+
showExport: this.showExportButton,
|
|
297
|
+
onExport: () => this.onExport(),
|
|
298
|
+
showPreferences: this.showPreferencesMenu,
|
|
299
|
+
hasSavedPreferences: this.hasSavedPreferences,
|
|
300
|
+
onPreferencesEdit: () => this.enterEditMode(),
|
|
301
|
+
onPreferencesSave: () => this.savePreferences(),
|
|
302
|
+
onPreferencesClear: () => this.clearPreferences(),
|
|
303
|
+
};
|
|
304
|
+
return this._organizerConfigCache;
|
|
305
|
+
}
|
|
306
|
+
get organizerState() {
|
|
307
|
+
return {
|
|
308
|
+
visibleFields: this.visibleColumns.map(c => c.key),
|
|
309
|
+
selectedGroupBy: this.activeGroupByKey ?? undefined,
|
|
310
|
+
selectedSlices: this._sliceByMenuItems
|
|
311
|
+
.filter(i => this.isSliceMenuItemActive(i))
|
|
312
|
+
.map(i => i.key),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
onOrganizerViewChange(event) {
|
|
316
|
+
if (event.type === 'fieldToggled') {
|
|
317
|
+
const allCols = [...this._organizer.menuBaseFields, ...this._organizer.menuOptionalFields];
|
|
318
|
+
const newVisible = new Set(event.state.visibleFields ?? []);
|
|
319
|
+
for (const col of allCols) {
|
|
320
|
+
const isNowVisible = newVisible.has(col.key);
|
|
321
|
+
if (this.isColumnVisible(col.key) !== isNowVisible) {
|
|
322
|
+
this.onColumnVisibilityChange(col, isNowVisible);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
else if (event.type === 'groupBySelected') {
|
|
327
|
+
const newKey = event.state.selectedGroupBy ?? null;
|
|
328
|
+
this.onGroupByChange(newKey === this.activeGroupByKey ? null : newKey);
|
|
329
|
+
}
|
|
330
|
+
else if (event.type === 'sliceSelected') {
|
|
331
|
+
const prevSlices = new Set(this.organizerState.selectedSlices ?? []);
|
|
332
|
+
const clickedId = (event.state.selectedSlices ?? []).find(id => !prevSlices.has(id));
|
|
333
|
+
if (clickedId) {
|
|
334
|
+
const item = this._sliceByMenuItems.find(i => i.key === clickedId);
|
|
335
|
+
if (item)
|
|
336
|
+
this.onSliceMenuItemClick(item);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
this._cdr.markForCheck();
|
|
340
|
+
}
|
|
278
341
|
get title() {
|
|
279
342
|
return this.resolvedConfig.title ?? '';
|
|
280
343
|
}
|
|
@@ -282,10 +345,11 @@ export class TableComponent {
|
|
|
282
345
|
return !!this.resolvedConfig.title;
|
|
283
346
|
}
|
|
284
347
|
get visibleColumns() {
|
|
285
|
-
return this.
|
|
348
|
+
return this.activeFields;
|
|
286
349
|
}
|
|
287
350
|
get showSearchBar() { return this.resolvedConfig.search?.enabled === true; }
|
|
288
|
-
get showViewButton() { return this.
|
|
351
|
+
get showViewButton() { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }
|
|
352
|
+
get showOrganizerButton() { return this._organizer.enabled || this.showExportButton || this.showPreferencesMenu; }
|
|
289
353
|
get showSliceExpandBtn() { return this._showSlicePanel && this._slicePanelCollapsed && this._sliceShowToggle; }
|
|
290
354
|
get showExportButton() {
|
|
291
355
|
return this.resolvedConfig.export?.enabled === true;
|
|
@@ -303,21 +367,20 @@ export class TableComponent {
|
|
|
303
367
|
expandSlicePanel() {
|
|
304
368
|
this.slicePanelRef?.togglePanel();
|
|
305
369
|
}
|
|
306
|
-
get showFields() { return this.
|
|
307
|
-
get showGroupBySection() { return this.
|
|
370
|
+
get showFields() { return this._organizer.showFields; }
|
|
371
|
+
get showGroupBySection() { return this._organizer.showGroupBySection; }
|
|
308
372
|
get filteredRowCount() {
|
|
309
373
|
return this.activeGroupByKey ? this._totalFilteredCount : this._allFilteredRows.length;
|
|
310
374
|
}
|
|
311
|
-
get activeGroupByLabel() { return this.
|
|
312
|
-
get totalColumnCount() { return this.
|
|
313
|
-
get activeSliceByLabel() { return this.
|
|
314
|
-
get activeDynamicSliceColumns() { return this.
|
|
375
|
+
get activeGroupByLabel() { return this._organizer.activeGroupByLabel; }
|
|
376
|
+
get totalColumnCount() { return this._organizer.totalFieldCount; }
|
|
377
|
+
get activeSliceByLabel() { return this._organizer.sliceBy.activeLabel; }
|
|
378
|
+
get activeDynamicSliceColumns() { return this._organizer.sliceBy.activeDynamicFields; }
|
|
315
379
|
removeDynamicSliceByKey(key) {
|
|
316
380
|
this.slicePanelRef?.removeDynamicSliceByKey(key);
|
|
317
381
|
}
|
|
318
|
-
get groupByColumns() { return this.
|
|
319
|
-
colLabel(col) { return this.
|
|
320
|
-
// ── Actions utilisateur
|
|
382
|
+
get groupByColumns() { return this._organizer.groupByFields; }
|
|
383
|
+
colLabel(col) { return this._organizer.fieldLabel(col); }
|
|
321
384
|
onSearchChange() {
|
|
322
385
|
this._preservePageIndex = 0;
|
|
323
386
|
this.refreshViewModel();
|
|
@@ -325,7 +388,7 @@ export class TableComponent {
|
|
|
325
388
|
this.searchChange.emit(this.searchQuery);
|
|
326
389
|
}
|
|
327
390
|
onGroupByChange(key) {
|
|
328
|
-
this.
|
|
391
|
+
this._organizer.setGroupBy(key);
|
|
329
392
|
this._groupBy.setDefaultCollapsed(key !== null);
|
|
330
393
|
this._groupBy.reset();
|
|
331
394
|
this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();
|
|
@@ -333,7 +396,6 @@ export class TableComponent {
|
|
|
333
396
|
this.paginator?.firstPage();
|
|
334
397
|
this.groupByChange.emit(key);
|
|
335
398
|
if (key) {
|
|
336
|
-
this.viewMenuTrigger?.closeMenu();
|
|
337
399
|
const colDef = (this.resolvedConfig.columns || []).find(c => c.key === key);
|
|
338
400
|
if (colDef?.lazy && this._lazyColumnStatus.get(key) !== 'loaded') {
|
|
339
401
|
this.triggerLazyFetch(colDef);
|
|
@@ -353,7 +415,6 @@ export class TableComponent {
|
|
|
353
415
|
this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));
|
|
354
416
|
});
|
|
355
417
|
}
|
|
356
|
-
// ── Lazy loading
|
|
357
418
|
getLazyColumnStatus(key) {
|
|
358
419
|
return this._lazy.getStatus(key);
|
|
359
420
|
}
|
|
@@ -372,7 +433,6 @@ export class TableComponent {
|
|
|
372
433
|
onMarkForCheck: () => this._cdr.markForCheck(),
|
|
373
434
|
};
|
|
374
435
|
}
|
|
375
|
-
// ── Groupement
|
|
376
436
|
toggleGroupCollapse(groupKey) {
|
|
377
437
|
this._groupBy.toggleGroupCollapse(groupKey, (key) => {
|
|
378
438
|
this._ngZone.runOutsideAngular(() => setTimeout(() => this.scrollToGroupHeader(key), 0));
|
|
@@ -401,24 +461,22 @@ export class TableComponent {
|
|
|
401
461
|
groupPageForward(groupKey, totalCount) {
|
|
402
462
|
this._groupBy.groupPageForward(groupKey, totalCount);
|
|
403
463
|
}
|
|
404
|
-
// ── Colonnes
|
|
405
464
|
get hasAddableColumns() {
|
|
406
|
-
return this.
|
|
465
|
+
return this._organizer.menuBaseFields.length > 0 || this._organizer.menuOptionalFields.length > 0;
|
|
407
466
|
}
|
|
408
467
|
get menuBaseColumns() {
|
|
409
|
-
return this.
|
|
468
|
+
return this._organizer.menuBaseFields;
|
|
410
469
|
}
|
|
411
470
|
get menuOptionalColumns() {
|
|
412
|
-
return this.
|
|
471
|
+
return this._organizer.menuOptionalFields;
|
|
413
472
|
}
|
|
414
473
|
get availableColumnsToAdd() {
|
|
415
|
-
const activeKeys = new Set(this.
|
|
474
|
+
const activeKeys = new Set(this.activeFields.map((column) => column.key));
|
|
416
475
|
return (this.resolvedConfig.columns || []).filter((c) => c.optional && !activeKeys.has(c.key));
|
|
417
476
|
}
|
|
418
477
|
get allowColumnRemoval() {
|
|
419
|
-
return this.
|
|
478
|
+
return this._organizer.allowFieldRemoval;
|
|
420
479
|
}
|
|
421
|
-
// ── Slices
|
|
422
480
|
get hasSliceConfig() {
|
|
423
481
|
return (this.resolvedConfig.slices?.length ?? 0) > 0;
|
|
424
482
|
}
|
|
@@ -430,28 +488,43 @@ export class TableComponent {
|
|
|
430
488
|
this._cdr.markForCheck();
|
|
431
489
|
}
|
|
432
490
|
_recomputeShowSlicePanel() {
|
|
433
|
-
const hasCfg = this._sliceConfigs.length > 0 || this.
|
|
491
|
+
const hasCfg = this._sliceConfigs.length > 0 || this._organizer.sliceBy.activeDynamicFields.length > 0;
|
|
434
492
|
const wasVisible = this._showSlicePanel;
|
|
435
493
|
this._showSlicePanel = hasCfg && this._resolvedData.length > 0;
|
|
436
|
-
//
|
|
437
|
-
//
|
|
438
|
-
|
|
494
|
+
// Les données viennent d'arriver : appliquer les dynamic slices ET les filtres en attente.
|
|
495
|
+
// Les dynamic slices doivent être ajoutées AVANT restoreFilters car les indices de
|
|
496
|
+
// sliceFilters dépendent de l'ordre final de _cachedSlices.
|
|
497
|
+
if (!wasVisible && this._showSlicePanel && (this._pendingSliceFilters || this._pendingDynamicSliceKeys)) {
|
|
439
498
|
const filters = this._pendingSliceFilters;
|
|
499
|
+
const dynamicKeys = this._pendingDynamicSliceKeys;
|
|
440
500
|
this._pendingSliceFilters = null;
|
|
501
|
+
this._pendingDynamicSliceKeys = null;
|
|
502
|
+
const allCols = this.resolvedConfig.columns ?? [];
|
|
503
|
+
console.log('[SliceRestore] _recomputeShowSlicePanel: données arrivées', { dynamicKeys, filters });
|
|
441
504
|
setTimeout(() => {
|
|
442
|
-
|
|
505
|
+
if (dynamicKeys) {
|
|
506
|
+
dynamicKeys.forEach(key => {
|
|
507
|
+
const col = allCols.find(c => c.key === key);
|
|
508
|
+
if (col)
|
|
509
|
+
this.addDynamicSlice(col);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
if (filters && this.slicePanelRef) {
|
|
513
|
+
console.log('[SliceRestore] restoreFilters depuis _recomputeShowSlicePanel', filters);
|
|
514
|
+
this.slicePanelRef.restoreFilters(filters);
|
|
515
|
+
}
|
|
443
516
|
this._cdr.markForCheck();
|
|
444
517
|
});
|
|
445
518
|
}
|
|
446
519
|
}
|
|
447
520
|
get showAddSliceButton() {
|
|
448
|
-
return this.
|
|
521
|
+
return this._organizer.showSliceBySection;
|
|
449
522
|
}
|
|
450
523
|
get staticSlicesForMenu() {
|
|
451
|
-
return this.
|
|
524
|
+
return this._organizer.staticSlicesForMenu;
|
|
452
525
|
}
|
|
453
526
|
get availableColumnsForDynamicSlice() {
|
|
454
|
-
return this.
|
|
527
|
+
return this._organizer.sliceBy.availableForDynamic;
|
|
455
528
|
}
|
|
456
529
|
isStaticSliceVisible(columnKey) {
|
|
457
530
|
return !this._staticSliceHiddenKeys.has(columnKey);
|
|
@@ -463,7 +536,7 @@ export class TableComponent {
|
|
|
463
536
|
else
|
|
464
537
|
next.add(columnKey);
|
|
465
538
|
this._staticSliceHiddenKeys = next;
|
|
466
|
-
this.
|
|
539
|
+
this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);
|
|
467
540
|
this._sliceConfigs = this._computeSliceConfigs();
|
|
468
541
|
// Si une slice vient d'être cachée, réinitialise le filtre actif pour éviter
|
|
469
542
|
// un filtre orphelin (la slice n'est plus visible mais son filtre resterait actif)
|
|
@@ -484,7 +557,7 @@ export class TableComponent {
|
|
|
484
557
|
return this._allDynamicSliceColumns;
|
|
485
558
|
}
|
|
486
559
|
isDynamicSliceActive(key) {
|
|
487
|
-
return this.
|
|
560
|
+
return this._organizer.isDynamicSliceActive(key);
|
|
488
561
|
}
|
|
489
562
|
toggleDynamicSlice(col) {
|
|
490
563
|
if (this.isDynamicSliceActive(col.key)) {
|
|
@@ -501,7 +574,7 @@ export class TableComponent {
|
|
|
501
574
|
this.paginator?.firstPage();
|
|
502
575
|
}
|
|
503
576
|
onDynamicSliceKeysChange(keys) {
|
|
504
|
-
this.
|
|
577
|
+
this._organizer.onDynamicSliceKeysChange(keys);
|
|
505
578
|
this._recomputeShowSlicePanel();
|
|
506
579
|
this._cdr.markForCheck();
|
|
507
580
|
}
|
|
@@ -527,7 +600,7 @@ export class TableComponent {
|
|
|
527
600
|
return this.resolvedConfig.pagination?.showFirstLastButtons === true;
|
|
528
601
|
}
|
|
529
602
|
get isColumnDragDropEnabled() {
|
|
530
|
-
return this.
|
|
603
|
+
return this._organizer.isFieldDragDropEnabled;
|
|
531
604
|
}
|
|
532
605
|
get totalRows() {
|
|
533
606
|
return this.activeGroupByKey
|
|
@@ -536,7 +609,7 @@ export class TableComponent {
|
|
|
536
609
|
}
|
|
537
610
|
// ── Gestion des colonnes
|
|
538
611
|
onAddColumn(column) {
|
|
539
|
-
this.
|
|
612
|
+
this._organizer.addField(column);
|
|
540
613
|
this._preservePageIndex = this.paginator?.pageIndex ?? null;
|
|
541
614
|
this.refreshViewModel();
|
|
542
615
|
if (column.lazy) {
|
|
@@ -546,13 +619,13 @@ export class TableComponent {
|
|
|
546
619
|
this.columnAdded.emit(column);
|
|
547
620
|
}
|
|
548
621
|
onColumnVisibilityChange(column, checked) {
|
|
549
|
-
const isVisible = this.
|
|
622
|
+
const isVisible = this._organizer.isFieldVisible(column.key);
|
|
550
623
|
if (checked && !isVisible) {
|
|
551
624
|
this.onAddColumn(column);
|
|
552
625
|
return;
|
|
553
626
|
}
|
|
554
627
|
if (!checked && isVisible) {
|
|
555
|
-
const removed = this.
|
|
628
|
+
const removed = this._organizer.removeField(column.key);
|
|
556
629
|
if (!removed)
|
|
557
630
|
return;
|
|
558
631
|
this._preservePageIndex = this.paginator?.pageIndex ?? null;
|
|
@@ -561,14 +634,14 @@ export class TableComponent {
|
|
|
561
634
|
}
|
|
562
635
|
}
|
|
563
636
|
isColumnVisible(columnKey) {
|
|
564
|
-
return this.
|
|
637
|
+
return this.activeFields.some(c => c.key === columnKey);
|
|
565
638
|
}
|
|
566
639
|
onRemoveColumn(columnKey, event) {
|
|
567
640
|
event?.stopPropagation();
|
|
568
|
-
const column = this.
|
|
641
|
+
const column = this.activeFields.find(item => item.key === columnKey);
|
|
569
642
|
if (!column)
|
|
570
643
|
return;
|
|
571
|
-
const removed = this.
|
|
644
|
+
const removed = this._organizer.removeField(columnKey);
|
|
572
645
|
if (!removed)
|
|
573
646
|
return;
|
|
574
647
|
this.refreshViewModel();
|
|
@@ -592,11 +665,11 @@ export class TableComponent {
|
|
|
592
665
|
* Seules les valeurs explicitement en `px` sont sommables ; les pourcentages ou autres unités sont ignorés. */
|
|
593
666
|
get tableMinWidth() {
|
|
594
667
|
const hasResized = Object.keys(this._columnWidths).length > 0;
|
|
595
|
-
const hasSomeExplicitWidth = hasResized || this.
|
|
668
|
+
const hasSomeExplicitWidth = hasResized || this.activeFields.some(c => c.width);
|
|
596
669
|
if (!hasSomeExplicitWidth)
|
|
597
670
|
return null;
|
|
598
671
|
let sum = 0;
|
|
599
|
-
for (const col of this.
|
|
672
|
+
for (const col of this.activeFields) {
|
|
600
673
|
if (this._columnWidths[col.key] != null) {
|
|
601
674
|
sum += this._columnWidths[col.key];
|
|
602
675
|
}
|
|
@@ -655,7 +728,7 @@ export class TableComponent {
|
|
|
655
728
|
return;
|
|
656
729
|
}
|
|
657
730
|
event.preventDefault();
|
|
658
|
-
const moved = this.
|
|
731
|
+
const moved = this._organizer.reorderFields(this.draggedColumnKey, targetColumnKey);
|
|
659
732
|
if (!moved) {
|
|
660
733
|
this.onHeaderDragEnd();
|
|
661
734
|
return;
|
|
@@ -737,12 +810,12 @@ export class TableComponent {
|
|
|
737
810
|
savePreferences() {
|
|
738
811
|
if (!this._preferencesManager)
|
|
739
812
|
return;
|
|
740
|
-
const dynamicSliceKeys = this.
|
|
813
|
+
const dynamicSliceKeys = this._organizer.sliceBy.activeDynamicFields.map(c => c.key);
|
|
741
814
|
const config = {
|
|
742
815
|
search: this.searchQuery || undefined,
|
|
743
816
|
groupBy: this.activeGroupByKey,
|
|
744
|
-
columnOrder: this.
|
|
745
|
-
visibleColumns: this.
|
|
817
|
+
columnOrder: this.activeFields.map(c => c.key),
|
|
818
|
+
visibleColumns: this.activeFields.map(c => c.key),
|
|
746
819
|
columnWidths: Object.keys(this._columnWidths).length ? { ...this._columnWidths } : undefined,
|
|
747
820
|
slicePanelCollapsed: this._slicePanelCollapsed,
|
|
748
821
|
hiddenSliceKeys: [...this._staticSliceHiddenKeys],
|
|
@@ -759,7 +832,7 @@ export class TableComponent {
|
|
|
759
832
|
this._preferencesManager.clear();
|
|
760
833
|
this._hasSavedConfig = false;
|
|
761
834
|
// Capturer les dynamic slices actives AVANT le reset (resetToDefaults() les vide)
|
|
762
|
-
const dynamicSlicesToRemove = this.
|
|
835
|
+
const dynamicSlicesToRemove = this._organizer.sliceBy.activeDynamicFields.slice();
|
|
763
836
|
// Reset complet de l'état vers les valeurs par défaut de la config
|
|
764
837
|
this.searchQuery = '';
|
|
765
838
|
this._columnWidths = {};
|
|
@@ -774,9 +847,9 @@ export class TableComponent {
|
|
|
774
847
|
this._groupBy.setDefaultCollapsed(false);
|
|
775
848
|
// Slices statiques : revenir aux seules celles cachées par la config (pas par l'utilisateur)
|
|
776
849
|
this._staticSliceHiddenKeys = new Set(this._configHiddenKeys);
|
|
777
|
-
this.
|
|
850
|
+
this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);
|
|
778
851
|
// Colonnes et groupBy : reset via la facade (retire les optionnelles, remet l'ordre config)
|
|
779
|
-
this.
|
|
852
|
+
this._organizer.resetToDefaults();
|
|
780
853
|
this._defaultGroupByApplied = false;
|
|
781
854
|
// Dynamic slices : les retirer du slice panel avec la liste capturée avant le reset
|
|
782
855
|
dynamicSlicesToRemove.forEach(col => {
|
|
@@ -787,8 +860,8 @@ export class TableComponent {
|
|
|
787
860
|
if (this.slicePanelRef)
|
|
788
861
|
this.slicePanelRef.restoreFilters({});
|
|
789
862
|
// Rafraîchit toute la vue
|
|
790
|
-
this.
|
|
791
|
-
this.renderedColumns = this.
|
|
863
|
+
this.activeFields = this._organizer.fields.activeFields;
|
|
864
|
+
this.renderedColumns = this.activeFields.map(c => c.key);
|
|
792
865
|
this._pendingDynamicSliceKeys = null;
|
|
793
866
|
this._pendingSliceFilters = null;
|
|
794
867
|
this.refreshViewModel();
|
|
@@ -816,7 +889,7 @@ export class TableComponent {
|
|
|
816
889
|
this._columnWidths = { ...saved.columnWidths };
|
|
817
890
|
// Group by
|
|
818
891
|
if (saved.groupBy !== undefined) {
|
|
819
|
-
this.
|
|
892
|
+
this._organizer.setGroupBy(saved.groupBy);
|
|
820
893
|
if (saved.groupBy) {
|
|
821
894
|
this._groupBy.setDefaultCollapsed(true);
|
|
822
895
|
this._groupBy.reset();
|
|
@@ -828,9 +901,9 @@ export class TableComponent {
|
|
|
828
901
|
// Slices statiques cachées — on utilise la valeur exacte sauvegardée (pas les defaults de config)
|
|
829
902
|
if (saved.hiddenSliceKeys !== undefined) {
|
|
830
903
|
this._staticSliceHiddenKeys = new Set(saved.hiddenSliceKeys);
|
|
831
|
-
this.
|
|
904
|
+
this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);
|
|
832
905
|
}
|
|
833
|
-
// Colonnes visibles + ordre — reconstruit
|
|
906
|
+
// Colonnes visibles + ordre — reconstruit activeFields en une seule passe.
|
|
834
907
|
// On part de saved.columnOrder (ordre sauvegardé) si disponible, sinon saved.visibleColumns.
|
|
835
908
|
// Cela gère à la fois : colonnes optionnelles ajoutées, colonnes retirées, et réordonnancement.
|
|
836
909
|
const targetKeys = saved.columnOrder ?? saved.visibleColumns;
|
|
@@ -843,7 +916,7 @@ export class TableComponent {
|
|
|
843
916
|
// Colonnes actives actuelllement non présentes dans targetKeys (non-optional passées sous silence)
|
|
844
917
|
// → on les exclut : l'utilisateur avait explicitement choisi ce sous-ensemble
|
|
845
918
|
if (ordered.length > 0) {
|
|
846
|
-
this.
|
|
919
|
+
this._organizer.setActiveFields(ordered);
|
|
847
920
|
}
|
|
848
921
|
}
|
|
849
922
|
// Dynamic slices — différé : slicePanelRef pas encore disponible au moment de ngOnChanges
|
|
@@ -859,9 +932,9 @@ export class TableComponent {
|
|
|
859
932
|
}
|
|
860
933
|
}
|
|
861
934
|
canRemoveColumn(column) {
|
|
862
|
-
return (this.
|
|
935
|
+
return (this._organizer.allowFieldRemoval &&
|
|
863
936
|
column.removable !== false &&
|
|
864
|
-
this.
|
|
937
|
+
this.activeFields.length > 1);
|
|
865
938
|
}
|
|
866
939
|
isCellEmpty(value) {
|
|
867
940
|
return value === '' || value == null;
|
|
@@ -886,7 +959,7 @@ export class TableComponent {
|
|
|
886
959
|
? this.resolvedConfig.preferences.tableId
|
|
887
960
|
: null;
|
|
888
961
|
const currentId = prefsId ?? null;
|
|
889
|
-
// Préférences à appliquer après
|
|
962
|
+
// Préférences à appliquer après _organizer.update() (quand activeFields est déjà peuplé)
|
|
890
963
|
let pendingPrefs = null;
|
|
891
964
|
if (currentId && this._preferencesManager?.key !== ('jqt_prefs_' + currentId)) {
|
|
892
965
|
this._preferencesManager = new TablePreferencesManager(currentId);
|
|
@@ -898,21 +971,21 @@ export class TableComponent {
|
|
|
898
971
|
this._hasSavedConfig = false;
|
|
899
972
|
}
|
|
900
973
|
// Délègue à la facade : mise à jour de l'état View (colonnes, groupBy meta, sliceBy meta)
|
|
901
|
-
this.
|
|
974
|
+
this._organizer.update({
|
|
902
975
|
config: this.resolvedConfig.view,
|
|
903
|
-
|
|
976
|
+
fields: this.resolvedConfig.columns ?? [],
|
|
904
977
|
sliceConfigs: this.resolvedConfig.slices ?? [],
|
|
905
978
|
defaultGroupBy: this.resolvedConfig.defaultGroupBy,
|
|
906
979
|
});
|
|
907
|
-
if (!pendingPrefs && !this._defaultGroupByApplied && !this.
|
|
980
|
+
if (!pendingPrefs && !this._defaultGroupByApplied && !this._organizer.groupBy.userCustomized && this._organizer.groupBy.activeKey != null) {
|
|
908
981
|
this._defaultGroupByApplied = true;
|
|
909
982
|
this._groupBy.setDefaultCollapsed(true);
|
|
910
983
|
this._groupBy.reset();
|
|
911
984
|
this._groupBy.groupPageSize = this.resolveDefaultGroupPageSize();
|
|
912
985
|
}
|
|
913
986
|
// Synchronise la propriété stable (évite NG0100 — la facade est source de vérité)
|
|
914
|
-
this.
|
|
915
|
-
this.renderedColumns = this.
|
|
987
|
+
this.activeFields = this._organizer.fields.activeFields;
|
|
988
|
+
this.renderedColumns = this.activeFields.map(c => c.key);
|
|
916
989
|
this.pageSize = this.paginator?.pageSize || this.resolvePageSize();
|
|
917
990
|
this.pageSizeOptions = this.resolvePageSizeOptions();
|
|
918
991
|
this.pageSizeOptionsGroupBy = this.resolvePageSizeOptionsGroupBy();
|
|
@@ -930,10 +1003,10 @@ export class TableComponent {
|
|
|
930
1003
|
// (pendingPrefs les gèrera lui-même via _applyPreferences → hiddenSliceKeys)
|
|
931
1004
|
if (!pendingPrefs) {
|
|
932
1005
|
this._staticSliceHiddenKeys = new Set(newConfigHidden);
|
|
933
|
-
this.
|
|
1006
|
+
this._organizer.updateHiddenStaticKeys(this._staticSliceHiddenKeys);
|
|
934
1007
|
}
|
|
935
1008
|
}
|
|
936
|
-
// Applique les préférences ICI, APRÈS
|
|
1009
|
+
// Applique les préférences ICI, APRÈS _organizer.update() ET après _configHiddenKeys mis à jour,
|
|
937
1010
|
// mais avant _computeSliceConfigs() pour que hiddenSliceKeys soit déjà restauré.
|
|
938
1011
|
if (pendingPrefs) {
|
|
939
1012
|
this._applyPreferences(pendingPrefs);
|
|
@@ -991,6 +1064,7 @@ export class TableComponent {
|
|
|
991
1064
|
}
|
|
992
1065
|
}
|
|
993
1066
|
this._sliceByMenuItems = items;
|
|
1067
|
+
this._invalidateOrganizerConfig(); // les slices ont changé
|
|
994
1068
|
}
|
|
995
1069
|
get sliceByMenuItems() { return this._sliceByMenuItems; }
|
|
996
1070
|
onSliceMenuItemClick(item) {
|
|
@@ -1051,7 +1125,7 @@ export class TableComponent {
|
|
|
1051
1125
|
pageRows.forEach((row, i) => {
|
|
1052
1126
|
const idx = start + i;
|
|
1053
1127
|
const p = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };
|
|
1054
|
-
this.
|
|
1128
|
+
this.activeFields.forEach((col) => {
|
|
1055
1129
|
p[col.key] = this.resolveCellValue(col, row, idx);
|
|
1056
1130
|
});
|
|
1057
1131
|
projected.push(p);
|
|
@@ -1164,7 +1238,7 @@ export class TableComponent {
|
|
|
1164
1238
|
const result = [];
|
|
1165
1239
|
rows.forEach((row, index) => {
|
|
1166
1240
|
const projected = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: index };
|
|
1167
|
-
this.
|
|
1241
|
+
this.activeFields.forEach((col) => {
|
|
1168
1242
|
projected[col.key] = this.resolveCellValue(col, row, index);
|
|
1169
1243
|
});
|
|
1170
1244
|
result.push(projected);
|
|
@@ -1272,7 +1346,7 @@ export class TableComponent {
|
|
|
1272
1346
|
groupRows.slice(start, end).forEach((row, i) => {
|
|
1273
1347
|
const idx = start + i;
|
|
1274
1348
|
const projected = { [ROW_RAW_KEY]: row, [ROW_INDEX_KEY]: idx };
|
|
1275
|
-
this.
|
|
1349
|
+
this.activeFields.forEach((col) => {
|
|
1276
1350
|
projected[col.key] = this.resolveCellValue(col, row, idx);
|
|
1277
1351
|
});
|
|
1278
1352
|
result.push(projected);
|
|
@@ -1426,11 +1500,11 @@ export class TableComponent {
|
|
|
1426
1500
|
}
|
|
1427
1501
|
}
|
|
1428
1502
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1429
|
-
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", clearSearchInput: "clearSearchInput" }, outputs: { addRequested: "addRequested", columnAdded: "columnAdded", columnRemoved: "columnRemoved", categorySelected: "categorySelected", rowSelected: "rowSelected", sortChange: "sortChange", pageChange: "pageChange", searchChange: "searchChange", groupByChange: "groupByChange", columnsChange: "columnsChange" }, 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 }, { propertyName: "viewMenuTrigger", first: true, predicate: ["viewMenuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<section class=\"jquery-table-wrapper\">\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=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">\u21BB</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">\u26A0</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\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\" *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\" *ngIf=\"!isDefaultGroupByActive\" (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\" *ngIf=\"!isDefaultGroupByActive\"></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}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.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}.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 .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:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;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;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;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;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;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: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i10.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i11.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1503
|
+
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", clearSearchInput: "clearSearchInput" }, outputs: { addRequested: "addRequested", columnAdded: "columnAdded", columnRemoved: "columnRemoved", categorySelected: "categorySelected", rowSelected: "rowSelected", sortChange: "sortChange", pageChange: "pageChange", searchChange: "searchChange", groupByChange: "groupByChange", columnsChange: "columnsChange" }, 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 <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 ></mat-paginator>\n <div class=\"paginator-range-loader\" *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}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.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}.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 .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:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;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;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;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;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;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 }); }
|
|
1430
1504
|
}
|
|
1431
1505
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableComponent, decorators: [{
|
|
1432
1506
|
type: Component,
|
|
1433
|
-
args: [{ standalone: true, selector: 'jquery-table', imports: [CommonModule, FormsModule, MatTableModule, MatButtonModule, MatDividerModule, MatPaginatorModule, MatSortModule, MatMenuModule, MatIconModule, MatSelectModule, SlicePanelComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: MatPaginatorIntl, useFactory: getFrenchPaginatorIntl }], template: "<section class=\"jquery-table-wrapper\">\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=\"showViewButton\" class=\"table-toolbar-right\">\n <button *ngIf=\"showViewButton\" type=\"button\" class=\"view-btn\" [matMenuTriggerFor]=\"viewMenu\" #viewMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"view-btn-icon\">settings</mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\" [panelClass]=\"'view-menu-panel'\">\n <button *ngIf=\"showFields\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuFields }}</span>\n <span class=\"view-menu-sub-value\">{{ visibleColumns.length }}/{{ totalColumnCount }}</span>\n </button>\n <button *ngIf=\"showGroupBySection\" mat-menu-item [matMenuTriggerFor]=\"groupBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuGroupBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeGroupByLabel }}</span>\n </button>\n <button *ngIf=\"showAddSliceButton\" mat-menu-item [matMenuTriggerFor]=\"sliceBySubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.viewMenuSliceBy }}</span>\n <span class=\"view-menu-sub-value\">{{ activeSliceByLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showExportButton\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showExportButton\" mat-menu-item type=\"button\" class=\"view-menu-export-item\"\n (click)=\"onExport(); viewMenuTrigger.closeMenu()\">\n <mat-icon class=\"view-menu-export-icon\">download</mat-icon>\n <span class=\"view-menu-sub-label\">{{ i18n.exportButtonLabel }}</span>\n </button>\n <mat-divider *ngIf=\"showPreferencesMenu\" class=\"view-menu-export-divider\"></mat-divider>\n <button *ngIf=\"showPreferencesMenu\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"view-menu-sub-trigger\">\n <span class=\"view-menu-sub-label\">{{ i18n.preferencesMenuLabel }}</span>\n </button>\n </mat-menu>\n\n <mat-menu #preferencesSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"enterEditMode(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">edit</mat-icon>\n {{ i18n.preferencesEdit }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" (mousedown)=\"savePreferences(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">save</mat-icon>\n {{ i18n.preferencesSave }}\n </button>\n <button type=\"button\" class=\"view-menu-item\" [disabled]=\"!hasSavedPreferences\" (mousedown)=\"clearPreferences(); viewMenuTrigger.closeMenu()\">\n <span class=\"view-menu-check\" aria-hidden=\"true\"></span>\n <mat-icon class=\"view-menu-col-icon\">delete_outline</mat-icon>\n {{ i18n.preferencesClear }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #fieldsSubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuBaseColumns\"\n [disabled]=\"!column.optional && !allowColumnRemoval\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n </button>\n <ng-container *ngIf=\"menuOptionalColumns.length > 0\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let column of menuOptionalColumns\"\n [disabled]=\"(isColumnVisible(column.key) && visibleColumns.length === 1) || getLazyColumnStatus(column.key) === 'loading'\"\n (mousedown)=\"onColumnVisibilityChange(column, !isColumnVisible(column.key))\">\n <span class=\"view-menu-check\">{{ isColumnVisible(column.key) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"column.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ column.icon }}</mat-icon>\n {{ colLabel(column) }}\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'loading'\" class=\"lazy-menu-spinner\">\u21BB</span>\n <span *ngIf=\"column.lazy && getLazyColumnStatus(column.key) === 'error'\" class=\"lazy-menu-error\" [title]=\"i18n.lazyErrorMenuTitle\">\u26A0</span>\n </button>\n </ng-container>\n </div>\n </mat-menu>\n\n <mat-menu #groupBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let col of groupByColumns\"\n [class.active]=\"activeGroupByKey === col.key\"\n (mousedown)=\"onGroupByChange(activeGroupByKey === col.key ? null : col.key)\">\n <span class=\"view-menu-check\">{{ activeGroupByKey === col.key ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"col.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ col.icon }}</mat-icon>\n {{ colLabel(col) }}\n </button>\n </div>\n </mat-menu>\n\n <mat-menu #sliceBySubMenu=\"matMenu\" [panelClass]=\"'view-submenu-panel'\">\n <div class=\"view-submenu\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"view-menu-item\" *ngFor=\"let item of sliceByMenuItems\"\n [class.active]=\"isSliceMenuItemActive(item)\"\n (mousedown)=\"onSliceMenuItemClick(item)\">\n <span class=\"view-menu-check\">{{ isSliceMenuItemActive(item) ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"item.icon\" class=\"view-menu-col-icon\" fontSet=\"material-icons-outlined\">{{ item.icon }}</mat-icon>\n {{ item.title }}\n </button>\n </div>\n </mat-menu>\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\" *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\" *ngIf=\"!isDefaultGroupByActive\" (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\" *ngIf=\"!isDefaultGroupByActive\"></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}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.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}.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 .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:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;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;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;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;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;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"] }]
|
|
1507
|
+
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 <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 ></mat-paginator>\n <div class=\"paginator-range-loader\" *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}.jquery-table-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:inherit;padding:2px 2px 0;box-sizing:border-box}.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}.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 .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:nowrap;height:var(--actual-header-height, 56px);padding:0 16px;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;gap:8px;flex-shrink:0}.group-sort-controls{display:flex;align-items:center;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;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;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"] }]
|
|
1434
1508
|
}], propDecorators: { config: [{
|
|
1435
1509
|
type: Input
|
|
1436
1510
|
}], dataSource: [{
|
|
@@ -1481,11 +1555,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1481
1555
|
}], slicePanelRef: [{
|
|
1482
1556
|
type: ViewChild,
|
|
1483
1557
|
args: [SlicePanelComponent]
|
|
1484
|
-
}], viewMenuTrigger: [{
|
|
1485
|
-
type: ViewChild,
|
|
1486
|
-
args: ['viewMenuTrigger']
|
|
1487
1558
|
}], _cellDefs: [{
|
|
1488
1559
|
type: ContentChildren,
|
|
1489
1560
|
args: [JqtCellDefDirective]
|
|
1490
1561
|
}] } });
|
|
1491
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBbUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QixNQUFNLEVBQUUsU0FBUyxFQUE4QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDelEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFN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QUFNLGFBQ3BDLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLENBQUM7OEJBR3JFLE1BQU07c0JBQWQsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFRSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0gsU0FBUztzQkFEWixTQUFTO3VCQUFDLFlBQVk7Z0JBVUgsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUNZLGtCQUFrQjtzQkFBL0MsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0ksYUFBYTtzQkFBNUMsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0EsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ1UsU0FBUztzQkFBOUMsZUFBZTt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgTWF0UGFnaW5hdG9ySW50bCwgTWF0UGFnaW5hdG9yTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtblByb3ZpZGVyLCBUYWJsZUV4cG9ydENvbmZpZywgVGFibGVQcmVmZXJlbmNlc0NvbmZpZywgVGFibGVQcm92aWRlciwgVGFibGVWaWV3Q29uZmlnIH0gZnJvbSAnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IEpxdEkxOG4sIEpRVF9JMThOLCBKUVRfSTE4Tl9ERUZBVUxUUyB9IGZyb20gJy4uL2pxdC1pMThuLnRva2VuJztcbmltcG9ydCB7IEpxdENlbGxEZWZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmUvanF0LWNlbGwtZGVmLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTbGljZUNvbmZpZyB9IGZyb20gJy4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwubW9kZWwnO1xuaW1wb3J0IHsgU2xpY2VQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50JztcbmltcG9ydCB7IGdldEZyZW5jaFBhZ2luYXRvckludGwsIGh1bWFuaXplS2V5LCBub3JtYWxpemVDZWxsVmFsdWUgfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7IFZpZXdGYWNhZGUgfSBmcm9tICcuL3ZpZXcvdmlldy5mYWNhZGUnO1xuaW1wb3J0IHsgTGF6eUNvbHVtbk1hbmFnZXIgfSBmcm9tICcuL2xhenktY29sdW1uLW1hbmFnZXInO1xuaW1wb3J0IHsgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIgfSBmcm9tICcuL3RhYmxlLXByZWZlcmVuY2VzLm1hbmFnZXInO1xuaW1wb3J0IHsgR3JvdXBCeU1hbmFnZXIgfSBmcm9tICcuL2dyb3VwLWJ5Lm1hbmFnZXInO1xuaW1wb3J0IHsgRXhwb3J0TWFuYWdlciB9IGZyb20gJy4vZXhwb3J0Lm1hbmFnZXInO1xuaW1wb3J0IHtcbiAgR1JPVVBfUk9XX0NPTFVNTiwgR1JPVVBfSEVBREVSX01BUktFUixcbiAgR1JPVVBfS0VZX0xBWllfTE9BRElORywgR1JPVVBfS0VZX1RPT19NQU5ZLFxuICBST1dfUkFXX0tFWSwgUk9XX0lOREVYX0tFWSxcbiAgUk9XX0dST1VQX0tFWSwgUk9XX0dST1VQX0NPVU5ULCBST1dfR1JPVVBfUEFHRSwgUk9XX0dST1VQX1BBR0VfQ09VTlQsXG4gIExBWllfTE9BRElOR19WQUxVRSwgTEFaWV9FUlJPUl9WQUxVRSxcbn0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xuXG4vKiogQ2FjaGUgaW50ZXJuZSBkdSBncm91cGVtZW50IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgbGVzIGRvbm7DqWVzLCBsYSBjbMOpIG91IGxlcyBwYXJhbcOodHJlcyBkZSB0cmkgY2hhbmdlbnQuICovXG5pbnRlcmZhY2UgR3JvdXBCeUNhY2hlPFQ+IHtcbiAgcm93czogVFtdO1xuICBrZXk6IHN0cmluZztcbiAgc29ydE9yZGVyOiAnYXNjJyB8ICdkZXNjJztcbiAgc29ydEFjdGl2ZTogc3RyaW5nO1xuICBzb3J0RGlyOiBzdHJpbmc7XG4gIG9yZGVyOiBzdHJpbmdbXTtcbiAgbWFwOiBNYXA8c3RyaW5nLCBUW10+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdqcXVlcnktdGFibGUnLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdFRhYmxlTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdERpdmlkZXJNb2R1bGUsIE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0U29ydE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlLCBTbGljZVBhbmVsQ29tcG9uZW50IF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdFBhZ2luYXRvckludGwsIHVzZUZhY3Rvcnk6IGdldEZyZW5jaFBhZ2luYXRvckludGwgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc/OiBUYWJsZVByb3ZpZGVyPFQ+O1xuXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U/OiBUW10gfCB7IGRhdGE6IFRbXSB9O1xuICBASW5wdXQoKSBkYXRhPzogVFtdO1xuICBASW5wdXQoKSBkaXNwbGF5ZWRDb2x1bW5zPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGNvbHVtbnNDb25maWc/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W107XG5cbiAgLyoqXG4gICAqIE1vZGUgSFRNTCA6IGFjdGl2ZSBldCBjb25maWd1cmUgbGUgcGFubmVhdSBWaWV3IGluZMOpcGVuZGFtbWVudCBkdSBgW2NvbmZpZ11gLlxuICAgKiBQcmVuZCBsZSBkZXNzdXMgc3VyIGBjb25maWcudmlld2Agc2kgZMOpZmluaS5cbiAgICogRXhlbXBsZSA6IGA8anF1ZXJ5LXRhYmxlIFt2aWV3XT1cInsgZW5hYmxlZDogdHJ1ZSB9XCI+YFxuICAgKi9cbiAgQElucHV0KCkgdmlldz86IFRhYmxlVmlld0NvbmZpZztcblxuICBASW5wdXQoKSBjb2x1bW5MYWJlbHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBASW5wdXQoKSBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAvKiogUGFyYW3DqHRyZSBkZSBjb250csO0bGUgcG91ciByw6lpbml0aWFsaXNlciBiYXJyZSBkZSByZWNoZXJjaGUuICovXG4gIEBJbnB1dCgpXG4gIHNldCBjbGVhclNlYXJjaElucHV0KHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xuICAgICAgdGhpcy5vblNlYXJjaENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBhZGRSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcbiAgQE91dHB1dCgpIGNvbHVtblJlbW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+KCk7XG4gIEBPdXRwdXQoKSBjYXRlZ29yeVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKiogw4ltaXMgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgdHJpICh5IGNvbXByaXMgbGUgdHJpIGluaXRpYWwpLiAqL1xuICBAT3V0cHV0KCkgc29ydENoYW5nZSAgICA9IG5ldyBFdmVudEVtaXR0ZXI8eyBhY3RpdmU6IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnIH0+KCk7XG4gIC8qKiDDiW1pcyDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBwYWdlIG91IGRlIHRhaWxsZSBkZSBwYWdlLiAqL1xuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSAgICA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYWdlSW5kZXg6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9PigpO1xuICAvKiogw4ltaXMgw6AgY2hhcXVlIGNoYW5nZW1lbnQgZGUgbGEgcmVjaGVyY2hlIHRleHRlLiAqL1xuICBAT3V0cHV0KCkgc2VhcmNoQ2hhbmdlICA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogw4ltaXMgcXVhbmQgbGUgR3JvdXAgYnkgY2hhbmdlIChjbMOpIGRlIGNvbG9ubmUsIG91IGBudWxsYCBzaSBkw6lzYWN0aXbDqSkuICovXG4gIEBPdXRwdXQoKSBncm91cEJ5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBudWxsPigpO1xuICAvKiogw4ltaXMgcXVhbmQgbGEgbGlzdGUgZGVzIGNvbG9ubmVzIHZpc2libGVzIGNoYW5nZSAoY2zDqXMgZGFucyBs4oCZb3JkcmUgZOKAmWFmZmljaGFnZSkuICovXG4gIEBPdXRwdXQoKSBjb2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcblxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcilcbiAgc2V0IHBhZ2luYXRvcih2YWx1ZTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFnaW5hdG9yID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHBhZ2luYXRvcigpOiBNYXRQYWdpbmF0b3IgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fcGFnaW5hdG9yOyB9XG4gIHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0PzogTWF0U29ydDtcbiAgQFZpZXdDaGlsZCgndGFibGVCb2R5U2Nyb2xsJykgdGFibGVCb2R5U2Nyb2xsUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoU2xpY2VQYW5lbENvbXBvbmVudCkgc2xpY2VQYW5lbFJlZj86IFNsaWNlUGFuZWxDb21wb25lbnQ8VD47XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdNZW51VHJpZ2dlcicpIHZpZXdNZW51VHJpZ2dlcj86IE1hdE1lbnVUcmlnZ2VyO1xuICBAQ29udGVudENoaWxkcmVuKEpxdENlbGxEZWZEaXJlY3RpdmUpIF9jZWxsRGVmcyE6IFF1ZXJ5TGlzdDxKcXRDZWxsRGVmRGlyZWN0aXZlPjtcbiAgLyoqIE1hcCBjbMOp4oaSVGVtcGxhdGVSZWYgcHLDqS1jYWxjdWzDqWUgZGVwdWlzIF9jZWxsRGVmcy4gTWlzZSDDoCBqb3VyIGRhbnMgbmdBZnRlckNvbnRlbnRJbml0IGV0IHN1ciBfY2VsbERlZnMuY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfY2VsbERlZk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogYW55OyBpbmRleDogbnVtYmVyIH0+PigpO1xuXG4gIHJlbmRlcmVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgdGFibGVEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcblxuICAvKiogQ29uc3RhbnRlIGV4cG9zw6llIGF1IHRlbXBsYXRlIHBvdXIgbGUgbWF0Q29sdW1uRGVmIGRlIGxhIGxpZ25lIGRlIGdyb3VwZS4gKi9cbiAgcmVhZG9ubHkgX0dST1VQX1JPV19DT0xVTU4gPSBHUk9VUF9ST1dfQ09MVU1OO1xuICAvKiogQ2zDqXMgZCdhY2PDqHMgYXV4IHByb3ByacOpdMOpcyBkZXMgbGlnbmVzIHByb2pldMOpZXMg4oCUIGV4cG9zw6llcyBwb3VyIGxlIHRlbXBsYXRlLiAqL1xuICByZWFkb25seSBfUk9XX1JBV19LRVkgPSBST1dfUkFXX0tFWTtcbiAgcmVhZG9ubHkgX1JPV19JTkRFWF9LRVkgPSBST1dfSU5ERVhfS0VZO1xuICByZWFkb25seSBfUk9XX0dST1VQX0tFWSA9IFJPV19HUk9VUF9LRVk7XG4gIHJlYWRvbmx5IF9ST1dfR1JPVVBfQ09VTlQgPSBST1dfR1JPVVBfQ09VTlQ7XG4gIHJlYWRvbmx5IF9ST1dfR1JPVVBfUEFHRSA9IFJPV19HUk9VUF9QQUdFO1xuICByZWFkb25seSBfUk9XX0dST1VQX1BBR0VfQ09VTlQgPSBST1dfR1JPVVBfUEFHRV9DT1VOVDtcblxuICAvKiogRmFjYWRlIFZpZXcgOiDDqXRhdCBldCBhY3Rpb25zIGNlbnRyYWxpc8OpcyAoQ2hhbXBzIC8gR3JvdXAgYnkgLyBTbGljZSBieSkgKi9cbiAgcmVhZG9ubHkgX3ZpZXcgPSBuZXcgVmlld0ZhY2FkZTxUPigpO1xuXG4gIC8qKlxuICAgKiBTbmFwc2hvdCBzdGFibGUgc3luY2hyb25pc8OpIGRlcHVpcyBfdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucyBkYW5zIHJlZnJlc2hWaWV3TW9kZWwoKS5cbiAgICogUHJvcHJpw6l0w6kgKG5vbiBnZXR0ZXIpIHBvdXIgcXUnQW5ndWxhciBwdWlzc2UgbGEgc3VpdnJlIHNhbnMgTkcwMTAwLlxuICAgKi9cbiAgYWN0aXZlQ29sdW1uczogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdID0gW107XG5cbiAgYWN0aXZlU2xpY2VGaWx0ZXI6IChyb3c6IFQpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlO1xuXG4gIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlIChjb250cmUgZXJyZXVyIE5HMDEwMClcbiAgX3NsaWNlQ29uZmlnczogYW55W10gPSBbXTtcbiAgX3NsaWNlQ29sdW1uczogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdID0gW107XG4gIF9zbGljZURhdGE6IFRbXSA9IFtdO1xuICBfc2xpY2VTaG93VG9nZ2xlID0gdHJ1ZTtcbiAgLyoqIFNuYXBzaG90IHN0YWJsZSBkZSBsYSB2aXNpYmlsaXTDqSBkdSBwYW5uZWF1IHNsaWNlIOKAlCBqYW1haXMgY2FsY3Vsw6kgZGVwdWlzIEBWaWV3Q2hpbGQgKi9cbiAgX3Nob3dTbGljZVBhbmVsID0gZmFsc2U7XG4gIC8qKiBTbmFwc2hvdCBzdGFibGUgZGUgbCfDqXRhdCBjb2xsYXBzZWQgZHUgcGFubmVhdSBzbGljZSwgbWlzIMOgIGpvdXIgdmlhIChjb2xsYXBzZWRDaGFuZ2UpICovXG4gIF9zbGljZVBhbmVsQ29sbGFwc2VkID0gZmFsc2U7XG5cbiAgLy8gRMOpbMOpZ3XDqXMgdmVycyBfdmlldyAoY29uc2VydsOpcyBwb3VyIGNvbXBhdGliaWxpdMOpIHRlbXBsYXRlIHNhbnMgcmVmYWN0b3JpbmcgSFRNTClcbiAgZ2V0IF9zdGF0aWNTbGljZXNGb3JNZW51KCk6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGljb24/OiBzdHJpbmcgfT4geyByZXR1cm4gdGhpcy5fdmlldy5zdGF0aWNTbGljZXNGb3JNZW51OyB9XG4gIGdldCBfYWN0aXZlRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zOyB9XG4gIGdldCBfYXZhaWxhYmxlQ29sdW1uc0ZvckR5bmFtaWNTbGljZSgpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmF2YWlsYWJsZUZvckR5bmFtaWM7IH1cbiAgZ2V0IF9hbGxEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl92aWV3LnNsaWNlQnkuYWxsRHluYW1pY0NvbHVtbnM7IH1cbiAgZ2V0IF9hY3RpdmVTbGljZUJ5TGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVMYWJlbDsgfVxuICBfc2xpY2VCeU1lbnVJdGVtczogQXJyYXk8eyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGljb24/OiBzdHJpbmc7IGNvbD86IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4gfT4gPSBbXTtcblxuICBzZWFyY2hRdWVyeSA9ICcnO1xuICBnZXQgYWN0aXZlR3JvdXBCeUtleSgpOiBzdHJpbmcgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3ZpZXcuZ3JvdXBCeS5hY3RpdmVLZXk7IH1cbiAgX21hdFNvcnRBY3RpdmUgPSAnJztcbiAgX21hdFNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJycgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aXZlU29ydDogeyBhY3RpdmU6IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnIH0gPSB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgfTtcbiAgcHJpdmF0ZSBfc29ydFN1YnNjcmliZWQ6IE1hdFNvcnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF90b3RhbEZpbHRlcmVkQ291bnQgPSAwO1xuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZHUgbW9kZSBHcm91cCBCeSAow6l0YXQgY29sbGFwc2VkLCBwYWdpbmF0aW9uLCB0cmkgZGVzIGdyb3VwZXMpLiAqL1xuICByZWFkb25seSBfZ3JvdXBCeSA9IG5ldyBHcm91cEJ5TWFuYWdlcihcbiAgICAoKSA9PiB7IHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpOyB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7IH0sXG4gICAgKCkgPT4gdGhpcy5yZWZyZXNoVmlld01vZGVsKCksXG4gICk7XG5cbiAgLyoqIETDqWzDqWd1w6lzIHZlcnMgR3JvdXBCeU1hbmFnZXIgcG91ciBsYSBjb21wYXRpYmlsaXTDqSBkZXMgdGVtcGxhdGVzLiAqL1xuICBnZXQgZ3JvdXBQYWdlU2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplOyB9XG4gIHNldCBncm91cFBhZ2VTaXplKHY6IG51bWJlcikgeyB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB2OyB9XG4gIGdldCBncm91cFNvcnRPcmRlcigpOiAnYXNjJyB8ICdkZXNjJyB7IHJldHVybiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyOyB9XG4gIHNldCBncm91cFNvcnRPcmRlcih2OiAnYXNjJyB8ICdkZXNjJykgeyB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyID0gdjsgfVxuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZHUgY3ljbGUgZGUgdmllIGRlcyBjb2xvbm5lcyBsYXp5IChmZXRjaCwgYW5udWxhdGlvbiwgc3RhdHV0cywgZG9ubsOpZXMpLiAqL1xuICBwcml2YXRlIF9sYXp5ID0gbmV3IExhenlDb2x1bW5NYW5hZ2VyPFQ+KCk7XG4gIC8qKiBDb21wYXRpYmlsaXTDqSB0ZW1wbGF0ZSA6IHJldG91cm5lIGxhIG1hcCBkZSBzdGF0dXRzIGxhenkuICovXG4gIGdldCBfbGF6eUNvbHVtblN0YXR1cygpIHsgcmV0dXJuIHRoaXMuX2xhenkuc3RhdHVzOyB9XG4gIC8qKiBDb21wYXRpYmlsaXTDqSB0ZW1wbGF0ZSA6IHJldG91cm5lIGxhIG1hcCBkZSBkb25uw6llcyBsYXp5LiAqL1xuICBnZXQgX2xhenlDb2x1bW5EYXRhKCkgeyByZXR1cm4gdGhpcy5fbGF6eS5kYXRhOyB9XG4gIHByaXZhdGUgX2NkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX2VsID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgcHJpdmF0ZSBfbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgX2kxOG5SYXcgPSBpbmplY3QoSlFUX0kxOE4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgLyoqIExhYmVscyBkZSBs4oCZaW50ZXJmYWNlLiBGdXNpb25uw6lzIGRlcHVpcyBKUVRfSTE4Tl9ERUZBVUxUUyBldCBsZSB0b2tlbiBKUVRfSTE4TiBpbmplY3TDqS4gKi9cbiAgcmVhZG9ubHkgaTE4bjogSnF0STE4biA9IHsgLi4uSlFUX0kxOE5fREVGQVVMVFMsIC4uLih0aGlzLl9pMThuUmF3ID8/IHt9KSB9O1xuXG4gIGlzR3JvdXBIZWFkZXIgPSAoXzogbnVtYmVyLCByb3c6IGFueSk6IGJvb2xlYW4gPT4gcm93W0dST1VQX0hFQURFUl9NQVJLRVJdID09PSB0cnVlO1xuXG4gIC8qKiBSZXRvdXJuZSB0cnVlIHNpIGxhIGxpZ25lIGRlIGdyb3VwZSBlc3QgdW5lIGxpZ25lIG5vcm1hbGUgKG5pIGxhenksIG5pIHRvby1tYW55KS4gKi9cbiAgaXNOb3JtYWxHcm91cFJvdyhyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByb3dbUk9XX0dST1VQX0tFWV0gIT09IEdST1VQX0tFWV9MQVpZX0xPQURJTkcgJiYgcm93W1JPV19HUk9VUF9LRVldICE9PSBHUk9VUF9LRVlfVE9PX01BTlk7XG4gIH1cbiAgaXNHcm91cFJvd0xvYWRpbmcocm93OiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHJvd1tST1dfR1JPVVBfS0VZXSA9PT0gR1JPVVBfS0VZX0xBWllfTE9BRElORzsgfVxuICBpc0dyb3VwUm93VG9vTWFueShyb3c6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gcm93W1JPV19HUk9VUF9LRVldID09PSBHUk9VUF9LRVlfVE9PX01BTlk7IH1cblxuICAvKiogR8OocmUgbGUgY2xpYyBzdXIgdW5lIGxpZ25lIGQnZW4tdMOqdGUgZGUgZ3JvdXBlIChuby1vcCBwb3VyIGxlcyDDqXRhdHMgc3DDqWNpYXV4KS4gKi9cbiAgb25Hcm91cEhlYWRlckNsaWNrKHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTm9ybWFsR3JvdXBSb3cocm93KSkgcmV0dXJuO1xuICAgIHRoaXMudG9nZ2xlR3JvdXBDb2xsYXBzZShyb3dbUk9XX0dST1VQX0tFWV0pO1xuICB9XG5cbiAgLyoqIEdlc3Rpb25uYWlyZSBleHBvcnQgQ1NWLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leHBvcnQgPSBuZXcgRXhwb3J0TWFuYWdlcjxUPihcbiAgICAoKSA9PiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MsXG4gICAgKCkgPT4gdGhpcy5hY3RpdmVDb2x1bW5zLFxuICAgICgpID0+IHRoaXMucmVzb2x2ZWRDb25maWcuZXhwb3J0LFxuICAgIChjb2wsIHJvdywgaWR4KSA9PiB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCksXG4gICk7XG5cbiAgLy8g4pSA4pSAIExpZmVjeWNsZVxuXG4gIHBhZ2VTaXplID0gNTtcbiAgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjBdO1xuICBwYWdlU2l6ZU9wdGlvbnNHcm91cEJ5OiBudW1iZXJbXSA9IFs1LCAxMCwgMjBdO1xuXG4gIGRyYWdnZWRDb2x1bW5LZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBkcmFnT3ZlckNvbHVtbktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8g4pSA4pSAIE1vZGUgw6lkaXRpb24gKFByw6lmw6lyZW5jZXMpXG4gIC8qKiBWcmFpIHF1YW5kIGxlIG1vZGUgw6lkaXRpb24gZXN0IGFjdGlmIChyZXNpemUgKyBkcmFnIGNvbG9ubmVzLCBpbnRlcmFjdGlvbnMgZMOpc2FjdGl2w6llcykuICovXG4gIF9lZGl0TW9kZSA9IGZhbHNlO1xuICAvKiogTGFyZ2V1cnMgZGUgY29sb25uZXMgcGVyc29ubmFsaXPDqWVzIHBhciBsJ3V0aWxpc2F0ZXVyIChjbMOpIOKGkiBweCkuICovXG4gIF9jb2x1bW5XaWR0aHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgLyoqIE1lc3NhZ2UgZGUgZmVlZGJhY2sgYXByw6hzIHNhdmUvY2xlYXIuIGBudWxsYCA9IHBhcyBkZSBtZXNzYWdlLiAqL1xuICBfcHJlZmVyZW5jZXNNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZyYWkgc2kgdW5lIGNvbmZpZ3VyYXRpb24gZXN0IHNhdXZlZ2FyZMOpZSBwb3VyIGNlIHRhYmxlYXUuICovXG4gIF9oYXNTYXZlZENvbmZpZyA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmVmZXJlbmNlc01hbmFnZXI6IFRhYmxlUHJlZmVyZW5jZXNNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiB0cnVlIHVuZSBmb2lzIHF1ZSBsZSBncm91cC1ieSBwYXIgZMOpZmF1dCBhIMOpdMOpIGluaXRpYWxpc8OpICjDqXZpdGUgZGUgcmVjb25maWd1cmVyIEdyb3VwQnlNYW5hZ2VyIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIGRvbm7DqWVzKS4gKi9cbiAgcHJpdmF0ZSBfZGVmYXVsdEdyb3VwQnlBcHBsaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3Jlc2l6ZVN0YXRlOiB7IGtleTogc3RyaW5nOyBzdGFydFg6IG51bWJlcjsgc3RhcnRXaWR0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgLyoqIER5bmFtaWMgc2xpY2Uga2V5cyDDoCByZXN0YXVyZXIgYXByw6hzIG5nQWZ0ZXJWaWV3SW5pdCAoc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvKS4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ0R5bmFtaWNTbGljZUtleXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaWx0cmVzIGRlIHNsaWNlIMOgIHJlc3RhdXJlciBhcHLDqHMgbmdBZnRlclZpZXdJbml0IChzbGljZVBhbmVsUmVmIHBhcyBlbmNvcmUgZGlzcG8pLiAqL1xuICBwcml2YXRlIF9wZW5kaW5nU2xpY2VGaWx0ZXJzOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmdbXT4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlc29sdmVkQ29uZmlnOiBUYWJsZVByb3ZpZGVyPFQ+ID0geyBjb2x1bW5zOiBbXSB9O1xuICBwcml2YXRlIF9jb2x1bW5NYXA6IE1hcDxzdHJpbmcsIFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9yZXNvbHZlZERhdGE6IFRbXSA9IFtdO1xuICBwcml2YXRlIF9wcmVzZXJ2ZVBhZ2VJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2xhc3RDb25maWdDbGVhclNlYXJjaElucHV0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvLyBTZXVpbCBhdS1kZWzDoCBkdXF1ZWwgbGUgcmVuZHUgZ3JvdXDDqSBlc3QgYmxvcXXDqSBwb3VyIHByb3TDqWdlciBsZSBuYXZpZ2F0ZXVyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9HUk9VUF9DT1VOVCA9IDUwMDtcblxuICAvLyDilIDilIAgT3B0aW1pc2F0aW9uIHBlcmZvcm1hbmNlXG4gIHByaXZhdGUgX2FsbEZpbHRlcmVkUm93czogVFtdID0gW107XG4gIHByaXZhdGUgX3BhZ2luYXRvclN1YnNjcmliZWQ6IE1hdFBhZ2luYXRvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBDYWNoZSBncm91cEJ5IOKAlCBpbnZhbGlkw6kgZMOocyBxdWUgcm93cy9rZXkvdHJpIGNoYW5nZW50LiAqL1xuICBwcml2YXRlIF9ncm91cENhY2hlOiBHcm91cEJ5Q2FjaGU8VD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlbmRlcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfY29uZmlnSGlkZGVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5cbiAgLyoqIENsw6lzIGRlcyBjb2xvbm5lcyB2aXNpYmxlcyBkdSBkZXJuaWVyIMOpbWlzc2lvbiBjb2x1bW5zQ2hhbmdlIChwb3VyIMOpdml0ZXIgbGVzIMOpbWlzc2lvbnMgZHVwbGlxdWVtZW50KS4gKi9cbiAgcHJpdmF0ZSBfcHJldkNvbHVtbktleXM6IHN0cmluZ1tdID0gW107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFDaGFuZ2VkID0gISEoY2hhbmdlc1snY29uZmlnJ10gfHwgY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2RhdGFTb3VyY2UnXSk7XG4gICAgaWYgKGRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9sYXp5LmNhbmNlbEFsbCgpO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlDb25maWdTZWFyY2hSZXNldCgpO1xuICAgICAgdGhpcy5hcHBseUluaXRpYWxTZWFyY2hRdWVyeSgpO1xuICAgIH1cbiAgICBpZiAoZGF0YUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmxhenkpLmZvckVhY2goYyA9PiB0aGlzLnRyaWdnZXJMYXp5RmV0Y2goYykpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWJ1aWxkQ2VsbERlZk1hcCgpO1xuICAgIHRoaXMuX2NlbGxEZWZzLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVidWlsZENlbGxEZWZNYXAoKTtcbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgIHRoaXMuYXR0YWNoU29ydCgpO1xuICAgIHRoaXMuX21lYXN1cmVIZWFkZXJIZWlnaHQoKTtcbiAgICB0aGlzLl9hcHBseVBlbmRpbmdEeW5hbWljU2xpY2VLZXlzKCk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVBlbmRpbmdEeW5hbWljU2xpY2VLZXlzKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc1BlbmRpbmdEeW5hbWljID0gISF0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cztcbiAgICBjb25zdCBoYXNQZW5kaW5nRmlsdGVycyA9ICEhdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycztcbiAgICBpZiAoIWhhc1BlbmRpbmdEeW5hbWljICYmICFoYXNQZW5kaW5nRmlsdGVycykgcmV0dXJuO1xuXG4gICAgY29uc3QgYWxsQ29scyA9IHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXTtcbiAgICBjb25zdCBrZXlzID0gaGFzUGVuZGluZ0R5bmFtaWMgPyBbLi4udGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMhXSA6IFtdO1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID8geyAuLi50aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzIH0gOiBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gbnVsbDtcblxuICAgIC8vIFRvdXQgZXN0IGRpZmbDqXLDqSBkYW5zIGxlIG3Dqm1lIHNldFRpbWVvdXQgcG91ciA6XG4gICAgLy8gMS4gw4l2aXRlciBORzAxMDAgKG1vZGlmaWNhdGlvbnMgYXByw6hzIHbDqXJpZmljYXRpb24gZGFucyBuZ0FmdGVyVmlld0luaXQpXG4gICAgLy8gMi4gR2FyYW50aXIgcXVlIGxlcyBkeW5hbWljIHNsaWNlcyBzb250IGFqb3V0w6llcyBBVkFOVCBsYSByZXN0YXVyYXRpb24gZGVzIGZpbHRyZXNcbiAgICAvLyAgICAobGVzIGluZGljZXMgZGFucyBzbGljZUZpbHRlcnMgZMOpcGVuZGVudCBkZSBsJ29yZHJlIGZpbmFsIGRlIF9jYWNoZWRTbGljZXMpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29sID0gYWxsQ29scy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgIGlmIChjb2wpIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLnNsaWNlUGFuZWxSZWYpIHtcbiAgICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoZmlsdGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc2xpY2VQYW5lbFJlZiB0b3Vqb3VycyBudWxsIChkb25uw6llcyBwYXMgZW5jb3JlIGFycml2w6llcykgOlxuICAgICAgICAgIC8vIHJlbWV0dHJlIGVuIGF0dGVudGUgcG91ciBxdWUgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsIGxlcyBhcHBsaXF1ZVxuICAgICAgICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ1JlbmRlciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3BlbmRpbmdSZW5kZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lcik7XG4gICAgfVxuICAgIC8vIE5ldHRvaWUgdW4gw6l2ZW50dWVsIHJlc2l6ZSBlbiBjb3VycyAobGlzdGVuZXJzIHdpbmRvdyBub24gcmV0aXLDqXMpXG4gICAgdGhpcy5fcmVzaXplU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3ZpZXcuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWVhc3VyZUhlYWRlckhlaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBtZWFzdXJlID0gKCkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyUm93ID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ci5tYXQtbWRjLWhlYWRlci1yb3cnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmIChoZWFkZXJSb3cpIHtcbiAgICAgICAgY29uc3QgaCA9IGhlYWRlclJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIGlmIChoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tYWN0dWFsLWhlYWRlci1oZWlnaHQnLCBoICsgJ3B4Jyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBIZWFkZXIgcGFzIGVuY29yZSByZW5kdSAoZXg6IGxhenkgQW5ndWxhciBNYXRlcmlhbCksIG9uIHLDqWVzc2FpZSBhcHLDqHMgbGUgcHJvY2hhaW4gZnJhbWVcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbWVhc3VyZSgpKSk7XG4gICAgfTtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IG1lYXN1cmUoKSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEdldHRlcnMgZCdhZmZpY2hhZ2VcblxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy50aXRsZSA/PyAnJztcbiAgfVxuXG4gIGdldCBzaG93VGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlZENvbmZpZy50aXRsZTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUNvbHVtbnM7XG4gIH1cblxuICBnZXQgc2hvd1NlYXJjaEJhcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcuc2VhcmNoPy5lbmFibGVkID09PSB0cnVlOyB9XG4gIGdldCBzaG93Vmlld0J1dHRvbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3ZpZXcuZW5hYmxlZCB8fCB0aGlzLnNob3dFeHBvcnRCdXR0b24gfHwgdGhpcy5zaG93UHJlZmVyZW5jZXNNZW51OyB9XG4gIGdldCBzaG93U2xpY2VFeHBhbmRCdG4oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zaG93U2xpY2VQYW5lbCAmJiB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkICYmIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZTsgfVxuICBnZXQgc2hvd0V4cG9ydEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5leHBvcnQ/LmVuYWJsZWQgPT09IHRydWU7XG4gIH1cbiAgZ2V0IHNob3dQcmVmZXJlbmNlc01lbnUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXM/LmVuYWJsZWQgPT09IHRydWU7XG4gIH1cblxuICBnZXQgaXNEZWZhdWx0R3JvdXBCeUFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlR3JvdXBCeUtleSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPT09IHRoaXMucmVzb2x2ZWRDb25maWcuZGVmYXVsdEdyb3VwQnk7XG4gIH1cblxuICBnZXQgaGFzU2F2ZWRQcmVmZXJlbmNlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hhc1NhdmVkQ29uZmlnOyB9XG5cbiAgZ2V0IHNob3dUb29sYmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zaG93U2VhcmNoQmFyIHx8IHRoaXMuc2hvd1ZpZXdCdXR0b24gfHwgdGhpcy5zaG93U2xpY2VFeHBhbmRCdG47IH1cblxuICBleHBhbmRTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8udG9nZ2xlUGFuZWwoKTtcbiAgfVxuICBnZXQgc2hvd0ZpZWxkcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2hvd0ZpZWxkczsgfVxuICBnZXQgc2hvd0dyb3VwQnlTZWN0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlldy5zaG93R3JvdXBCeVNlY3Rpb247IH1cblxuICBnZXQgZmlsdGVyZWRSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPyB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUdyb3VwQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmlldy5hY3RpdmVHcm91cEJ5TGFiZWw7IH1cblxuICBnZXQgdG90YWxDb2x1bW5Db3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdmlldy50b3RhbENvbHVtbkNvdW50OyB9XG5cbiAgZ2V0IGFjdGl2ZVNsaWNlQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUxhYmVsOyB9XG5cbiAgZ2V0IGFjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1uczsgfVxuXG4gIHJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXkpO1xuICB9XG5cbiAgZ2V0IGdyb3VwQnlDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl92aWV3Lmdyb3VwQnlDb2x1bW5zOyB9XG5cbiAgY29sTGFiZWwoY29sOiB7IGtleTogc3RyaW5nOyBoZWFkZXI/OiBzdHJpbmcgfSk6IHN0cmluZyB7IHJldHVybiB0aGlzLl92aWV3LmNvbExhYmVsKGNvbCk7IH1cblxuICAvLyDilIDilIAgQWN0aW9ucyB1dGlsaXNhdGV1clxuXG4gIG9uU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFF1ZXJ5KTtcbiAgfVxuXG4gIG9uR3JvdXBCeUNoYW5nZShrZXk6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3LnNldEdyb3VwQnkoa2V5KTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoa2V5ICE9PSBudWxsKTtcbiAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5ncm91cEJ5Q2hhbmdlLmVtaXQoa2V5KTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICB0aGlzLnZpZXdNZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gICAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICBpZiAoY29sRGVmPy5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGtleSkgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2xEZWYpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICB9LCAwKSk7XG4gICAgfVxuICB9XG5cbiAgb25Hcm91cFBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkub25Hcm91cFBhZ2VTaXplQ2hhbmdlKE51bWJlcihzaXplKSk7XG4gIH1cblxuICBvbkdyb3VwU29ydFRvZ2dsZShkaXI6ICdhc2MnIHwgJ2Rlc2MnKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5vbkdyb3VwU29ydFRvZ2dsZShkaXIsIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgTGF6eSBsb2FkaW5nXG5cbiAgZ2V0TGF6eUNvbHVtblN0YXR1cyhrZXk6IHN0cmluZyk6ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnIHwgJ2Vycm9yJyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhenkuZ2V0U3RhdHVzKGtleSk7XG4gIH1cblxuICBnZXRMYXp5UmVuZGVyVHlwZShyb3dWYWx1ZTogYW55KTogJ2xvYWRpbmcnIHwgJ2Vycm9yJyB8ICd2YWx1ZScge1xuICAgIHJldHVybiB0aGlzLl9sYXp5LmdldFJlbmRlclR5cGUocm93VmFsdWUpO1xuICB9XG5cbiAgcmV0cnlMYXp5Q29sdW1uKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX2xhenkucmV0cnkoY29sdW1uLCB0aGlzLl9yZXNvbHZlZERhdGEsIHRoaXMuX2xhenlDYWxsYmFja3MoKSk7XG4gIH1cblxuICB0cmlnZ2VyTGF6eUZldGNoKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuX2xhenkuZmV0Y2goY29sdW1uLCB0aGlzLl9yZXNvbHZlZERhdGEsIHRoaXMuX2xhenlDYWxsYmFja3MoKSk7XG4gIH1cblxuICBwcml2YXRlIF9sYXp5Q2FsbGJhY2tzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvblJlZnJlc2g6ICgpID0+IHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpLFxuICAgICAgb25NYXJrRm9yQ2hlY2s6ICgpID0+IHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIEdyb3VwZW1lbnRcblxuICB0b2dnbGVHcm91cENvbGxhcHNlKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5LnRvZ2dsZUdyb3VwQ29sbGFwc2UoZ3JvdXBLZXksIChrZXkpID0+IHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Hcm91cEhlYWRlcihrZXkpLCAwKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvR3JvdXBIZWFkZXIoZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3Qgcm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0cltkYXRhLWdyb3VwLWtleT1cIiR7Q1NTLmVzY2FwZShncm91cEtleSl9XCJdYCk7XG4gICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUZsb2F0KFxuICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLWFjdHVhbC1oZWFkZXItaGVpZ2h0JykgfHwgJzU2J1xuICAgICkgfHwgNTY7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByb3dSZWN0ID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGN1cnJlbnRTY3JvbGxUb3AgKyAocm93UmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCkgLSBoZWFkZXJIZWlnaHQ7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvKHsgdG9wOiB0YXJnZXRTY3JvbGxUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfVxuXG4gIGlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEJ5LmlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBLZXkpO1xuICB9XG5cbiAgZ3JvdXBQYWdlQmFjayhncm91cEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VCYWNrKGdyb3VwS2V5KTtcbiAgfVxuXG4gIGdyb3VwUGFnZUZvcndhcmQoZ3JvdXBLZXk6IHN0cmluZywgdG90YWxDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VGb3J3YXJkKGdyb3VwS2V5LCB0b3RhbENvdW50KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb2xvbm5lc1xuXG4gIGdldCBoYXNBZGRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5tZW51QmFzZUNvbHVtbnMubGVuZ3RoID4gMCB8fCB0aGlzLl92aWV3Lm1lbnVPcHRpb25hbENvbHVtbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBtZW51QmFzZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5tZW51QmFzZUNvbHVtbnM7XG4gIH1cblxuICBnZXQgbWVudU9wdGlvbmFsQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl92aWV3Lm1lbnVPcHRpb25hbENvbHVtbnM7XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlQ29sdW1uc1RvQWRkKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IG5ldyBTZXQodGhpcy5hY3RpdmVDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KSk7XG4gICAgcmV0dXJuICh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4gYy5vcHRpb25hbCAmJiAhYWN0aXZlS2V5cy5oYXMoYy5rZXkpKTtcbiAgfVxuXG4gIGdldCBhbGxvd0NvbHVtblJlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXcuYWxsb3dDb2x1bW5SZW1vdmFsO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNsaWNlc1xuXG4gIGdldCBoYXNTbGljZUNvbmZpZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgZ2V0IHNob3dTbGljZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgfVxuXG4gIG9uU2xpY2VQYW5lbENvbGxhcHNlZENoYW5nZShjb2xsYXBzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gY29sbGFwc2VkO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0NmZyA9IHRoaXMuX3NsaWNlQ29uZmlncy5sZW5ndGggPiAwIHx8IHRoaXMuX3ZpZXcuc2xpY2VCeS5hY3RpdmVEeW5hbWljQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHdhc1Zpc2libGUgPSB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgICB0aGlzLl9zaG93U2xpY2VQYW5lbCA9IGhhc0NmZyAmJiB0aGlzLl9yZXNvbHZlZERhdGEubGVuZ3RoID4gMDtcbiAgICAvLyBMZSBTbGljZVBhbmVsQ29tcG9uZW50IHZpZW50IGQnw6p0cmUgcmVuZHUgcG91ciBsYSAxw6hyZSBmb2lzXG4gICAgLy8gKGRvbm7DqWVzIGFycml2w6llcykg4oaSIGFwcGxpcXVlciBsZXMgZmlsdHJlcyBlbiBhdHRlbnRlXG4gICAgaWYgKCF3YXNWaXNpYmxlICYmIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzO1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZXN0b3JlRmlsdGVycyhmaWx0ZXJzKTtcbiAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dBZGRTbGljZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zaG93U2xpY2VCeVNlY3Rpb247XG4gIH1cblxuICBnZXQgc3RhdGljU2xpY2VzRm9yTWVudSgpOiBBcnJheTx7IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zdGF0aWNTbGljZXNGb3JNZW51O1xuICB9XG5cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnNGb3JEeW5hbWljU2xpY2UoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldy5zbGljZUJ5LmF2YWlsYWJsZUZvckR5bmFtaWM7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhjb2x1bW5LZXkpO1xuICB9XG5cbiAgdG9nZ2xlU3RhdGljU2xpY2UoY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSBuZXh0LmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgIGVsc2UgbmV4dC5hZGQoY29sdW1uS2V5KTtcbiAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXh0O1xuICAgIHRoaXMuX3ZpZXcudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICAvLyBTaSB1bmUgc2xpY2UgdmllbnQgZCfDqnRyZSBjYWNow6llLCByw6lpbml0aWFsaXNlIGxlIGZpbHRyZSBhY3RpZiBwb3VyIMOpdml0ZXJcbiAgICAvLyB1biBmaWx0cmUgb3JwaGVsaW4gKGxhIHNsaWNlIG4nZXN0IHBsdXMgdmlzaWJsZSBtYWlzIHNvbiBmaWx0cmUgcmVzdGVyYWl0IGFjdGlmKVxuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwoKTtcbiAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFkZER5bmFtaWNTbGljZShjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUGFuZWxSZWY/LmFkZER5bmFtaWNTbGljZShjb2x1bW4pO1xuICAgIGlmIChjb2x1bW4ubGF6eSAmJiB0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChjb2x1bW4ua2V5KSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHRoaXMudHJpZ2dlckxhenlGZXRjaChjb2x1bW4pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnM7XG4gIH1cblxuICBpc0R5bmFtaWNTbGljZUFjdGl2ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92aWV3LmlzRHluYW1pY1NsaWNlQWN0aXZlKGtleSk7XG4gIH1cblxuICB0b2dnbGVEeW5hbWljU2xpY2UoY29sOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEeW5hbWljU2xpY2VBY3RpdmUoY29sLmtleSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgfVxuICB9XG5cbiAgb25TbGljZUZpbHRlckNoYW5nZShwcmVkOiAocm93OiBUKSA9PiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVTbGljZUZpbHRlciA9IHByZWQ7XG4gICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSAwO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgfVxuXG4gIG9uRHluYW1pY1NsaWNlS2V5c0NoYW5nZShrZXlzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXcub25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKGtleXMpO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGVtcHR5U3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmxhYmVscz8uZW1wdHkgfHwgdGhpcy5pMThuLmVtcHR5U3RhdGU7XG4gIH1cblxuICBnZXQgbG9hZGluZ1N0YXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5sYWJlbHM/LmxvYWRpbmcgfHwgdGhpcy5pMThuLmxvYWRpbmdTdGF0ZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gX3BlbmRpbmdSZW5kZXIgOiBsZSByZW5kdSBpbnRlcm5lIG4nZXN0IHBhcyBlbmNvcmUgdGVybWluw6kg4oaSIHBhcyBkZSBtZXNzYWdlIHZpZGUgcHLDqW1hdHVyw6lcbiAgICByZXR1cm4gIXRoaXMuaXNMb2FkaW5nICYmIHRoaXMuX3BlbmRpbmdSZW5kZXIgPT09IG51bGwgJiYgdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBzaG93UGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5ICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRQYWdpbmF0aW9uU2hvd0ZpcnN0TGFzdEJ1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPT09IHRydWU7XG4gIH1cblxuICBnZXQgaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXcuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQ7XG4gIH1cblxuICBnZXQgdG90YWxSb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXBCeUtleVxuICAgICAgPyB0aGlzLnRhYmxlRGF0YVNvdXJjZS5kYXRhLmZpbHRlcigocikgPT4gIXJbR1JPVVBfSEVBREVSX01BUktFUl0pLmxlbmd0aFxuICAgICAgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIEdlc3Rpb24gZGVzIGNvbG9ubmVzXG5cbiAgb25BZGRDb2x1bW4oY29sdW1uOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fdmlldy5hZGRDb2x1bW4oY29sdW1uKTtcbiAgICB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdG9yPy5wYWdlSW5kZXggPz8gbnVsbDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcblxuICAgIGlmIChjb2x1bW4ubGF6eSkge1xuICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRSZXF1ZXN0ZWQuZW1pdCgpO1xuICAgIHRoaXMuY29sdW1uQWRkZWQuZW1pdChjb2x1bW4pO1xuICB9XG5cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuX3ZpZXcuaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5rZXkpO1xuXG4gICAgaWYgKGNoZWNrZWQgJiYgIWlzVmlzaWJsZSkge1xuICAgICAgdGhpcy5vbkFkZENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hlY2tlZCAmJiBpc1Zpc2libGUpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl92aWV3LnJlbW92ZUNvbHVtbihjb2x1bW4ua2V5KTtcbiAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IG51bGw7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICAgIHRoaXMuY29sdW1uUmVtb3ZlZC5lbWl0KGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgaXNDb2x1bW5WaXNpYmxlKGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlQ29sdW1ucy5zb21lKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gIH1cblxuICBvblJlbW92ZUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmFjdGl2ZUNvbHVtbnMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3ZpZXcucmVtb3ZlQ29sdW1uKGNvbHVtbktleSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm47XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgdGhpcy5jb2x1bW5SZW1vdmVkLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWduZXNcblxuICBwcml2YXRlIF9yZWJ1aWxkQ2VsbERlZk1hcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jZWxsRGVmTWFwID0gbmV3IE1hcChcbiAgICAgICh0aGlzLl9jZWxsRGVmcyA/PyBbXSkubWFwKGQgPT4gW2QuY29sdW1uS2V5LCBkLnRlbXBsYXRlXSBhcyBbc3RyaW5nLCBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogYW55OyBpbmRleDogbnVtYmVyIH0+XSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Q2VsbFRlbXBsYXRlKGtleTogc3RyaW5nKTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jZWxsRGVmTWFwLmdldChrZXkpID8/IG51bGw7XG4gIH1cblxuICBnZXQgaGFzQ3VzdG9tQ2VsbERlZnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxEZWZNYXAuc2l6ZSA+IDA7XG4gIH1cblxuICBnZXQgaGFzUm93Q2xpY2tIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGVkLm9ic2VydmVkIHx8ICEhdGhpcy5yZXNvbHZlZENvbmZpZy5vblJvd1NlbGVjdGVkO1xuICB9XG5cbiAgLyoqIExhcmdldXIgbWluaW1hbGUgZHUgdGFibGVhdSBlbiBweCwgY2FsY3Vsw6llIGRlcHVpcyBsZXMgbGFyZ2V1cnMgZXhwbGljaXRlcyBkZXMgY29sb25uZXMgYWN0aXZlcy5cbiAgICogUmV0b3VybmUgbnVsbCBzaSBhdWN1bmUgY29sb25uZSBuJ2EgZGUgbGFyZ2V1ciBkw6lmaW5pZSAobGUgdGFibGVhdSByZW1wbGl0IGFsb3JzIDEwMCUgZHUgY29udGVuZXVyKS5cbiAgICogU2V1bGVzIGxlcyB2YWxldXJzIGV4cGxpY2l0ZW1lbnQgZW4gYHB4YCBzb250IHNvbW1hYmxlcyA7IGxlcyBwb3VyY2VudGFnZXMgb3UgYXV0cmVzIHVuaXTDqXMgc29udCBpZ25vcsOpcy4gKi9cbiAgZ2V0IHRhYmxlTWluV2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGFzUmVzaXplZCA9IE9iamVjdC5rZXlzKHRoaXMuX2NvbHVtbldpZHRocykubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNTb21lRXhwbGljaXRXaWR0aCA9IGhhc1Jlc2l6ZWQgfHwgdGhpcy5hY3RpdmVDb2x1bW5zLnNvbWUoYyA9PiBjLndpZHRoKTtcbiAgICBpZiAoIWhhc1NvbWVFeHBsaWNpdFdpZHRoKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmFjdGl2ZUNvbHVtbnMpIHtcbiAgICAgIGlmICh0aGlzLl9jb2x1bW5XaWR0aHNbY29sLmtleV0gIT0gbnVsbCkge1xuICAgICAgICBzdW0gKz0gdGhpcy5fY29sdW1uV2lkdGhzW2NvbC5rZXldO1xuICAgICAgfSBlbHNlIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgY29uc3QgaXNQeCA9IGNvbC53aWR0aC50cmltKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgncHgnKTtcbiAgICAgICAgY29uc3QgcHggPSBOdW1iZXIucGFyc2VGbG9hdChjb2wud2lkdGgpO1xuICAgICAgICBpZiAoaXNQeCAmJiAhTnVtYmVyLmlzTmFOKHB4KSkgeyBzdW0gKz0gcHg7IH1cbiAgICAgICAgZWxzZSB7IHN1bSArPSAxNTA7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1bSArPSAxMjA7IC8vIGxhcmdldXIgbWluaW1hbGUgZXN0aW3DqWUgcG91ciB1bmUgY29sb25uZSBzYW5zIGxhcmdldXIgZXhwbGljaXRlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdW0gKyAncHgnO1xuICB9XG5cbiAgdHJhY2tSb3dGbiA9IChfaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBhbnkgPT5cbiAgICByb3dbR1JPVVBfSEVBREVSX01BUktFUl0gPyBgX19ncm91cF8ke3Jvd1tST1dfR1JPVVBfS0VZXX1gIDogcm93W1JPV19JTkRFWF9LRVldID8/IF9pbmRleDtcblxuICBnZXRSb3dDbGFzcyhyb3c6IGFueSk6IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5yZXNvbHZlZENvbmZpZy5yb3dDbGFzcztcbiAgICBpZiAoIWZuIHx8IHJvdz8uW0dST1VQX0hFQURFUl9NQVJLRVJdKSByZXR1cm4ge307XG4gICAgcmV0dXJuIGZuKHJvd1tST1dfUkFXX0tFWV0gPz8gcm93LCByb3dbUk9XX0lOREVYX0tFWV0gPz8gMCk7XG4gIH1cblxuICBvblJvd0NsaWNrKHJvdzogYW55LCBldmVudDogTW91c2VFdmVudCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocm93Py5bR1JPVVBfSEVBREVSX01BUktFUl0pIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaGFzUm93Q2xpY2tIYW5kbGVyKSByZXR1cm47XG4gICAgY29uc3QgcmVzb2x2ZWQgPSAocm93Py5bUk9XX1JBV19LRVldID8/IHJvdykgYXMgVDtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnLm9uUm93U2VsZWN0ZWQ/LihyZXNvbHZlZCwgZXZlbnQpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyZXNvbHZlZCk7XG4gIH1cblxuICAvLyDilIDilIAgRHJhZyAmIGRyb3BcblxuICBvbkhlYWRlckRyYWdTdGFydChjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBjb2x1bW5LZXk7XG4gICAgdGhpcy5kcmFnT3ZlckNvbHVtbktleSA9IG51bGw7XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsIGNvbHVtbktleSk7XG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJEcmFnT3Zlcihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICgoIXRoaXMuaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQgJiYgIXRoaXMuX2VkaXRNb2RlKSB8fCAhdGhpcy5kcmFnZ2VkQ29sdW1uS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gY29sdW1uS2V5O1xuICB9XG5cbiAgb25IZWFkZXJEcm9wKHRhcmdldENvbHVtbktleTogc3RyaW5nLCBldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCghdGhpcy5pc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCAmJiAhdGhpcy5fZWRpdE1vZGUpIHx8ICF0aGlzLmRyYWdnZWRDb2x1bW5LZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgbW92ZWQgPSB0aGlzLl92aWV3LnJlb3JkZXJDb2x1bW5zKHRoaXMuZHJhZ2dlZENvbHVtbktleSwgdGFyZ2V0Q29sdW1uS2V5KTtcbiAgICBpZiAoIW1vdmVkKSB7XG4gICAgICB0aGlzLm9uSGVhZGVyRHJhZ0VuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMub25IZWFkZXJEcmFnRW5kKCk7XG4gIH1cblxuICBvbkhlYWRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID0gbnVsbDtcbiAgfVxuXG4gIGlzSGVhZGVyRHJvcFRhcmdldChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZHJhZ2dlZENvbHVtbktleSAmJiB0aGlzLmRyYWdPdmVyQ29sdW1uS2V5ID09PSBjb2x1bW5LZXkgJiYgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBjb2x1bW5LZXk7XG4gIH1cblxuICAvLyDilIDilIAgUHLDqWbDqXJlbmNlcyA6IG1vZGUgw6lkaXRpb25cblxuICBlbnRlckVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBEw6ltYXJyZSBsZSByZXNpemUgZCd1bmUgY29sb25uZSAobW91c2Vkb3duIHN1ciBsYSBwb2lnbsOpZSBkcm9pdGUpLiAqL1xuICBvblJlc2l6ZVN0YXJ0KGNvbHVtbktleTogc3RyaW5nLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZWRpdE1vZGUpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgdGggPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCd0aCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBzY3JvbGxFbCA9IHRoaXMudGFibGVCb2R5U2Nyb2xsUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChzY3JvbGxFbCkge1xuICAgICAgY29uc3QgYWxsVGggPSBzY3JvbGxFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGgubWF0LW1kYy1oZWFkZXItY2VsbCcpO1xuICAgICAgYWxsVGguZm9yRWFjaCh0aEVsID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhFbC5nZXRBdHRyaWJ1dGUoJ21hdC1jb2x1bW4taGVhZGVyJykgfHwgdGhFbC5nZXRBdHRyaWJ1dGUoJ21hdC1zb3J0LWhlYWRlcicpIHx8ICcnO1xuICAgICAgICBjb25zdCBjb2xDbGFzcyA9IEFycmF5LmZyb20odGhFbC5jbGFzc0xpc3QpLmZpbmQoYyA9PiBjLnN0YXJ0c1dpdGgoJ21hdC1jb2x1bW4tJykpO1xuICAgICAgICBjb25zdCBjb2xLZXkgPSBjb2xDbGFzcyA/IGNvbENsYXNzLnJlcGxhY2UoJ21hdC1jb2x1bW4tJywgJycpIDogbnVsbDtcbiAgICAgICAgaWYgKGNvbEtleSAmJiB0aGlzLl9jb2x1bW5XaWR0aHNbY29sS2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGhzID0geyAuLi50aGlzLl9jb2x1bW5XaWR0aHMsIFtjb2xLZXldOiB0aEVsLm9mZnNldFdpZHRoIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc2l6ZVN0YXRlID0geyBrZXk6IGNvbHVtbktleSwgc3RhcnRYOiBldmVudC5jbGllbnRYLCBzdGFydFdpZHRoOiB0aC5vZmZzZXRXaWR0aCB9O1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5fcmVzaXplU3RhdGUpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbHRhID0gZS5jbGllbnRYIC0gdGhpcy5fcmVzaXplU3RhdGUuc3RhcnRYO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCg2MCwgdGhpcy5fcmVzaXplU3RhdGUuc3RhcnRXaWR0aCArIGRlbHRhKTtcbiAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzLCBbdGhpcy5fcmVzaXplU3RhdGUua2V5XTogbmV3V2lkdGggfTtcbiAgICAgIC8vIGRldGVjdENoYW5nZXMoKSBwb3VyIGZvcmNlciBsYSBtaXNlIMOgIGpvdXIgaW1tw6lkaWF0ZSBlbiBtb2RlIE9uUHVzaFxuICAgICAgLy8gKGxlcyBsaXN0ZW5lcnMgd2luZG93IHRvdXJuZW50IGhvcnMgem9uZSBBbmd1bGFyIGF2ZWMgcnVuT3V0c2lkZUFuZ3VsYXIpXG4gICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblVwID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmVzaXplU3RhdGUgPSBudWxsO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH07XG5cbiAgICAvLyBMaXN0ZW5lcnMgaG9ycyB6b25lIEFuZ3VsYXIgcG91ciDDqXZpdGVyIGRlcyBjeWNsZXMgQ0Qgw6AgY2hhcXVlIG1vdXNlbW92ZVxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0b3VybmUgbGEgbGFyZ2V1ciBDU1MgZCd1bmUgY29sb25uZSAocHggc2kgcGVyc29ubmFsaXPDqWUsIHNpbm9uIGxhIHZhbGV1ciBkZSBjb25maWcgb3UgYXV0bykuICovXG4gIGdldENvbHVtbldpZHRoKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fY29sdW1uV2lkdGhzW2tleV0gIT0gbnVsbCkgcmV0dXJuIHRoaXMuX2NvbHVtbldpZHRoc1trZXldICsgJ3B4JztcbiAgICBjb25zdCBjb2wgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGNvbD8ud2lkdGggPz8gJ2F1dG8nO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByw6lmw6lyZW5jZXMgOiBzYXZlIC8gY2xlYXJcblxuICBzYXZlUHJlZmVyZW5jZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIpIHJldHVybjtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VLZXlzID0gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLm1hcChjID0+IGMua2V5KTtcbiAgICBjb25zdCBjb25maWc6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyA9IHtcbiAgICAgIHNlYXJjaDogICAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnkgfHwgdW5kZWZpbmVkLFxuICAgICAgZ3JvdXBCeTogICAgICAgICAgICAgdGhpcy5hY3RpdmVHcm91cEJ5S2V5LFxuICAgICAgY29sdW1uT3JkZXI6ICAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KSxcbiAgICAgIHZpc2libGVDb2x1bW5zOiAgICAgIHRoaXMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBjb2x1bW5XaWR0aHM6ICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9jb2x1bW5XaWR0aHMpLmxlbmd0aCA/IHsgLi4udGhpcy5fY29sdW1uV2lkdGhzIH0gOiB1bmRlZmluZWQsXG4gICAgICBzbGljZVBhbmVsQ29sbGFwc2VkOiB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkLFxuICAgICAgaGlkZGVuU2xpY2VLZXlzOiAgICAgWy4uLnRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5c10sXG4gICAgICBkeW5hbWljU2xpY2VLZXlzOiAgICBkeW5hbWljU2xpY2VLZXlzLmxlbmd0aCA/IGR5bmFtaWNTbGljZUtleXMgOiB1bmRlZmluZWQsXG4gICAgICBzbGljZUZpbHRlcnM6ICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYgPyB0aGlzLnNsaWNlUGFuZWxSZWYuZ2V0QWN0aXZlRmlsdGVycygpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLnNhdmUoY29uZmlnKTtcbiAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IHRydWU7XG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNTYXZlZE1lc3NhZ2UpO1xuICB9XG5cbiAgY2xlYXJQcmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcikgcmV0dXJuO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5jbGVhcigpO1xuICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG5cbiAgICAvLyBDYXB0dXJlciBsZXMgZHluYW1pYyBzbGljZXMgYWN0aXZlcyBBVkFOVCBsZSByZXNldCAocmVzZXRUb0RlZmF1bHRzKCkgbGVzIHZpZGUpXG4gICAgY29uc3QgZHluYW1pY1NsaWNlc1RvUmVtb3ZlID0gdGhpcy5fdmlldy5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNDb2x1bW5zLnNsaWNlKCk7XG5cbiAgICAvLyBSZXNldCBjb21wbGV0IGRlIGwnw6l0YXQgdmVycyBsZXMgdmFsZXVycyBwYXIgZMOpZmF1dCBkZSBsYSBjb25maWdcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5fY29sdW1uV2lkdGhzID0ge307XG4gICAgdGhpcy5fc2xpY2VQYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuICAgIC8vIFN5bmNocm9uaXNlciBsJ8OpdGF0IGludGVybmUgZHUgc2xpY2UtcGFuZWwgOiBzaSBsZSBjb21wb3NhbnQgZXN0IGVuIMOpdGF0IGNvbGxhcHNlZFxuICAgIC8vIChsJ3V0aWxpc2F0ZXVyIGwnYXZhaXQgZmVybcOpIGFwcsOocyBsYSBzYXV2ZWdhcmRlKSwgbGUgcm91dnJpciBleHBsaWNpdGVtZW50IHBvdXJcbiAgICAvLyDDqXZpdGVyIHF1ZSBkaXNwbGF5Om5vbmUgc29pdCByZXRpcsOpIG1haXMgcXVlIGlzQ29sbGFwc2VkIGludGVybmUgcmVzdGUgw6AgdHJ1ZS5cbiAgICBpZiAodGhpcy5zbGljZVBhbmVsUmVmPy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5zbGljZVBhbmVsUmVmLnRvZ2dsZVBhbmVsKCk7XG4gICAgfVxuICAgIHRoaXMuX2dyb3VwQnkucmVzZXQoKTtcbiAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQoZmFsc2UpO1xuXG4gICAgLy8gU2xpY2VzIHN0YXRpcXVlcyA6IHJldmVuaXIgYXV4IHNldWxlcyBjZWxsZXMgY2FjaMOpZXMgcGFyIGxhIGNvbmZpZyAocGFzIHBhciBsJ3V0aWxpc2F0ZXVyKVxuICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQodGhpcy5fY29uZmlnSGlkZGVuS2V5cyk7XG4gICAgdGhpcy5fdmlldy51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG5cbiAgICAvLyBDb2xvbm5lcyBldCBncm91cEJ5IDogcmVzZXQgdmlhIGxhIGZhY2FkZSAocmV0aXJlIGxlcyBvcHRpb25uZWxsZXMsIHJlbWV0IGwnb3JkcmUgY29uZmlnKVxuICAgIHRoaXMuX3ZpZXcucmVzZXRUb0RlZmF1bHRzKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdyb3VwQnlBcHBsaWVkID0gZmFsc2U7XG5cbiAgICAvLyBEeW5hbWljIHNsaWNlcyA6IGxlcyByZXRpcmVyIGR1IHNsaWNlIHBhbmVsIGF2ZWMgbGEgbGlzdGUgY2FwdHVyw6llIGF2YW50IGxlIHJlc2V0XG4gICAgZHluYW1pY1NsaWNlc1RvUmVtb3ZlLmZvckVhY2goY29sID0+IHtcbiAgICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8ucmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoY29sLmtleSk7XG4gICAgfSk7XG5cbiAgICAvLyBGaWx0cmUgZGUgc2xpY2UgYWN0aWZcbiAgICB0aGlzLmFjdGl2ZVNsaWNlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zbGljZVBhbmVsUmVmKSB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoe30pO1xuXG4gICAgLy8gUmFmcmHDrmNoaXQgdG91dGUgbGEgdnVlXG4gICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5fdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucztcbiAgICB0aGlzLnJlbmRlcmVkQ29sdW1ucyA9IHRoaXMuYWN0aXZlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSk7XG4gICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnMgPSBudWxsO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuXG4gICAgdGhpcy5fc2hvd1ByZWZlcmVuY2VzTWVzc2FnZSh0aGlzLmkxOG4ucHJlZmVyZW5jZXNDbGVhcmVkTWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIF9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9zaG93UHJlZmVyZW5jZXNNZXNzYWdlKG1zZzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyICE9PSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIpO1xuICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG1zZztcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZVRpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWVzc2FnZSA9IG51bGw7XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgNDAwMCk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVByZWZlcmVuY2VzKHNhdmVkOiBpbXBvcnQoJy4uL2pxdWVyeS10YWJsZS5tb2RlbCcpLlNhdmVkVGFibGVDb25maWcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFzYXZlZCkgcmV0dXJuO1xuICAgIC8vIFJlY2hlcmNoZVxuICAgIGlmIChzYXZlZC5zZWFyY2gpIHRoaXMuc2VhcmNoUXVlcnkgPSBzYXZlZC5zZWFyY2g7XG4gICAgLy8gTGFyZ2V1cnMgY29sb25uZXNcbiAgICBpZiAoc2F2ZWQuY29sdW1uV2lkdGhzKSB0aGlzLl9jb2x1bW5XaWR0aHMgPSB7IC4uLnNhdmVkLmNvbHVtbldpZHRocyB9O1xuICAgIC8vIEdyb3VwIGJ5XG4gICAgaWYgKHNhdmVkLmdyb3VwQnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdmlldy5zZXRHcm91cEJ5KHNhdmVkLmdyb3VwQnkpO1xuICAgICAgaWYgKHNhdmVkLmdyb3VwQnkpIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBCeS5zZXREZWZhdWx0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIMOJdGF0IHBhbm5lYXUgc2xpY2VcbiAgICBpZiAoc2F2ZWQuc2xpY2VQYW5lbENvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9zbGljZVBhbmVsQ29sbGFwc2VkID0gc2F2ZWQuc2xpY2VQYW5lbENvbGxhcHNlZDtcbiAgICAvLyBTbGljZXMgc3RhdGlxdWVzIGNhY2jDqWVzIOKAlCBvbiB1dGlsaXNlIGxhIHZhbGV1ciBleGFjdGUgc2F1dmVnYXJkw6llIChwYXMgbGVzIGRlZmF1bHRzIGRlIGNvbmZpZylcbiAgICBpZiAoc2F2ZWQuaGlkZGVuU2xpY2VLZXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyA9IG5ldyBTZXQoc2F2ZWQuaGlkZGVuU2xpY2VLZXlzKTtcbiAgICAgIHRoaXMuX3ZpZXcudXBkYXRlSGlkZGVuU3RhdGljS2V5cyh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIH1cbiAgICAvLyBDb2xvbm5lcyB2aXNpYmxlcyArIG9yZHJlIOKAlCByZWNvbnN0cnVpdCBhY3RpdmVDb2x1bW5zIGVuIHVuZSBzZXVsZSBwYXNzZS5cbiAgICAvLyBPbiBwYXJ0IGRlIHNhdmVkLmNvbHVtbk9yZGVyIChvcmRyZSBzYXV2ZWdhcmTDqSkgc2kgZGlzcG9uaWJsZSwgc2lub24gc2F2ZWQudmlzaWJsZUNvbHVtbnMuXG4gICAgLy8gQ2VsYSBnw6hyZSDDoCBsYSBmb2lzIDogY29sb25uZXMgb3B0aW9ubmVsbGVzIGFqb3V0w6llcywgY29sb25uZXMgcmV0aXLDqWVzLCBldCByw6lvcmRvbm5hbmNlbWVudC5cbiAgICBjb25zdCB0YXJnZXRLZXlzID0gc2F2ZWQuY29sdW1uT3JkZXIgPz8gc2F2ZWQudmlzaWJsZUNvbHVtbnM7XG4gICAgaWYgKHRhcmdldEtleXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYWxsQnlLZXkgPSBuZXcgTWFwKCh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcChjID0+IFtjLmtleSwgY10pKTtcbiAgICAgIC8vIENvbG9ubmVzIGRhbnMgbCdvcmRyZSBzYXV2ZWdhcmTDqSAob24gbmUgZ2FyZGUgcXVlIGNlbGxlcyBjb25udWVzIGRlIGxhIGNvbmZpZylcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSB0YXJnZXRLZXlzXG4gICAgICAgIC5tYXAoa2V5ID0+IGFsbEJ5S2V5LmdldChrZXkpKVxuICAgICAgICAuZmlsdGVyKChjKTogYyBpcyBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+ID0+IGMgIT09IHVuZGVmaW5lZCk7XG4gICAgICAvLyBDb2xvbm5lcyBhY3RpdmVzIGFjdHVlbGxsZW1lbnQgbm9uIHByw6lzZW50ZXMgZGFucyB0YXJnZXRLZXlzIChub24tb3B0aW9uYWwgcGFzc8OpZXMgc291cyBzaWxlbmNlKVxuICAgICAgLy8g4oaSIG9uIGxlcyBleGNsdXQgOiBsJ3V0aWxpc2F0ZXVyIGF2YWl0IGV4cGxpY2l0ZW1lbnQgY2hvaXNpIGNlIHNvdXMtZW5zZW1ibGVcbiAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fdmlldy5zZXRBY3RpdmVDb2x1bW5zKG9yZGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEeW5hbWljIHNsaWNlcyDigJQgZGlmZsOpcsOpIDogc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvbmlibGUgYXUgbW9tZW50IGRlIG5nT25DaGFuZ2VzXG4gICAgaWYgKHNhdmVkLmR5bmFtaWNTbGljZUtleXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBzYXZlZC5keW5hbWljU2xpY2VLZXlzO1xuICAgIH1cbiAgICAvLyBGaWx0cmVzIGFjdGlmcyBkdSBzbGljZSBwYW5lbFxuICAgIC8vIEZpbHRyZXMgYWN0aWZzIGR1IHNsaWNlIHBhbmVsIOKAlCB0b3Vqb3VycyBzdG9ja8OpcyBlbiBwZW5kaW5nIDpcbiAgICAvLyBhcHBsaXF1w6lzIHBhciBfYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cyAoc2kgZHluYW1pYyBzbGljZXMpIG91XG4gICAgLy8gcGFyIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCAocXVhbmQgbGVzIGRvbm7DqWVzIGFycml2ZW50IGV0IHJlbmRlbnQgbGUgcGFuZWwgdmlzaWJsZSlcbiAgICBpZiAoc2F2ZWQuc2xpY2VGaWx0ZXJzICYmIE9iamVjdC5rZXlzKHNhdmVkLnNsaWNlRmlsdGVycykubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gc2F2ZWQuc2xpY2VGaWx0ZXJzO1xuICAgIH1cbiAgfVxuXG4gIGNhblJlbW92ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fdmlldy5hbGxvd0NvbHVtblJlbW92YWwgJiZcbiAgICAgIGNvbHVtbi5yZW1vdmFibGUgIT09IGZhbHNlICYmXG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cblxuICBpc0NlbGxFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PSBudWxsO1xuICB9XG5cbiAgYXNUaXRsZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFeHBvcnQgQ1NWXG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZXhwb3J0LmV4cG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIGRlIGRvbm7DqWVzIChwcml2w6kpXG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlld01vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc29sdmVkRGF0YSA9IHRoaXMucmVzb2x2ZURhdGEoKTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnID0gdGhpcy5idWlsZEVmZmVjdGl2ZUNvbmZpZygpO1xuICAgIHRoaXMuX2NvbHVtbk1hcCA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuXG4gICAgLy8g4pSA4pSAIEluaXRpYWxpc2VyIGxlIGdlc3Rpb25uYWlyZSBkZSBwcsOpZsOpcmVuY2VzIHNpIGwnb3B0aW9uIGVzdCBhY3RpdsOpZVxuICAgIGNvbnN0IHByZWZzSWQgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzPy5lbmFibGVkXG4gICAgICA/IHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXMudGFibGVJZFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRJZCA9IHByZWZzSWQgPz8gbnVsbDtcbiAgICAvLyBQcsOpZsOpcmVuY2VzIMOgIGFwcGxpcXVlciBhcHLDqHMgX3ZpZXcudXBkYXRlKCkgKHF1YW5kIGFjdGl2ZUNvbHVtbnMgZXN0IGTDqWrDoCBwZXVwbMOpKVxuICAgIGxldCBwZW5kaW5nUHJlZnM6IGltcG9ydCgnLi4vanF1ZXJ5LXRhYmxlLm1vZGVsJykuU2F2ZWRUYWJsZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdXJyZW50SWQgJiYgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyPy5rZXkgIT09ICgnanF0X3ByZWZzXycgKyBjdXJyZW50SWQpKSB7XG4gICAgICB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIgPSBuZXcgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIoY3VycmVudElkKTtcbiAgICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLmhhc1NhdmVkKCk7XG4gICAgICBwZW5kaW5nUHJlZnMgPSB0aGlzLl9wcmVmZXJlbmNlc01hbmFnZXIubG9hZCgpO1xuICAgIH0gZWxzZSBpZiAoIWN1cnJlbnRJZCkge1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyID0gbnVsbDtcbiAgICAgIHRoaXMuX2hhc1NhdmVkQ29uZmlnID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRMOpbMOoZ3VlIMOgIGxhIGZhY2FkZSA6IG1pc2Ugw6Agam91ciBkZSBsJ8OpdGF0IFZpZXcgKGNvbG9ubmVzLCBncm91cEJ5IG1ldGEsIHNsaWNlQnkgbWV0YSlcbiAgICB0aGlzLl92aWV3LnVwZGF0ZSh7XG4gICAgICBjb25maWc6IHRoaXMucmVzb2x2ZWRDb25maWcudmlldyxcbiAgICAgIGNvbHVtbnM6IHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyA/PyBbXSxcbiAgICAgIHNsaWNlQ29uZmlnczogdGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10sXG4gICAgICBkZWZhdWx0R3JvdXBCeTogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0R3JvdXBCeSxcbiAgICB9KTtcblxuICAgIGlmICghcGVuZGluZ1ByZWZzICYmICF0aGlzLl9kZWZhdWx0R3JvdXBCeUFwcGxpZWQgJiYgIXRoaXMuX3ZpZXcuZ3JvdXBCeS51c2VyQ3VzdG9taXplZCAmJiB0aGlzLl92aWV3Lmdyb3VwQnkuYWN0aXZlS2V5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8vIFN5bmNocm9uaXNlIGxhIHByb3ByacOpdMOpIHN0YWJsZSAow6l2aXRlIE5HMDEwMCDigJQgbGEgZmFjYWRlIGVzdCBzb3VyY2UgZGUgdsOpcml0w6kpXG4gICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5fdmlldy5maWVsZHMuYWN0aXZlQ29sdW1ucztcblxuICAgIHRoaXMucmVuZGVyZWRDb2x1bW5zID0gdGhpcy5hY3RpdmVDb2x1bW5zLm1hcChjID0+IGMua2V5KTtcblxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2luYXRvcj8ucGFnZVNpemUgfHwgdGhpcy5yZXNvbHZlUGFnZVNpemUoKTtcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplT3B0aW9ucygpO1xuICAgIHRoaXMucGFnZVNpemVPcHRpb25zR3JvdXBCeSA9IHRoaXMucmVzb2x2ZVBhZ2VTaXplT3B0aW9uc0dyb3VwQnkoKTtcbiAgICBpZiAodGhpcy5ncm91cFBhZ2VTaXplICE9PSAwICYmICF0aGlzLnBhZ2VTaXplT3B0aW9uc0dyb3VwQnkuaW5jbHVkZXModGhpcy5ncm91cFBhZ2VTaXplKSkge1xuICAgICAgdGhpcy5ncm91cFBhZ2VTaXplID0gdGhpcy5yZXNvbHZlRGVmYXVsdEdyb3VwUGFnZVNpemUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF0dGFjaFBhZ2luYXRvcigpO1xuICAgIHRoaXMuYXR0YWNoU29ydCgpO1xuXG4gICAgLy8gUsOpaW5pdGlhbGlzZSBfc3RhdGljU2xpY2VIaWRkZW5LZXlzIHNldWxlbWVudCBzaSBsZXMgY2zDqXMgaGlkZGVuIGRlIGxhIGNvbmZpZyBvbnQgdnJhaW1lbnQgY2hhbmfDqVxuICAgIC8vIEVUIHF1J2lsIG4neSBhIHBhcyBkZSBwcsOpZsOpcmVuY2VzIHNhdXZlZ2FyZMOpZXMgKHF1aSBnw6lyZXJvbnQgaGlkZGVuU2xpY2VLZXlzIGVsbGVzLW3Dqm1lcykuXG4gICAgY29uc3QgbmV3Q29uZmlnSGlkZGVuID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIocyA9PiBzLmhpZGRlbiAmJiBzLmNvbHVtbktleSkubWFwKHMgPT4gcy5jb2x1bW5LZXkhKVxuICAgICk7XG4gICAgaWYgKCFUYWJsZUNvbXBvbmVudC5fc2V0c0VxdWFsKG5ld0NvbmZpZ0hpZGRlbiwgdGhpcy5fY29uZmlnSGlkZGVuS2V5cykpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ0hpZGRlbktleXMgPSBuZXdDb25maWdIaWRkZW47XG4gICAgICAvLyBOJ8OpY3Jhc2VyIF9zdGF0aWNTbGljZUhpZGRlbktleXMgcXVlIHNpIG9uIG4nZXN0IFBBUyBlbiB0cmFpbiBkJ2FwcGxpcXVlciBkZXMgcHJlZnNcbiAgICAgIC8vIChwZW5kaW5nUHJlZnMgbGVzIGfDqHJlcmEgbHVpLW3Dqm1lIHZpYSBfYXBwbHlQcmVmZXJlbmNlcyDihpIgaGlkZGVuU2xpY2VLZXlzKVxuICAgICAgaWYgKCFwZW5kaW5nUHJlZnMpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzID0gbmV3IFNldChuZXdDb25maWdIaWRkZW4pO1xuICAgICAgICB0aGlzLl92aWV3LnVwZGF0ZUhpZGRlblN0YXRpY0tleXModGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBsaXF1ZSBsZXMgcHLDqWbDqXJlbmNlcyBJQ0ksIEFQUsOIUyBfdmlldy51cGRhdGUoKSBFVCBhcHLDqHMgX2NvbmZpZ0hpZGRlbktleXMgbWlzIMOgIGpvdXIsXG4gICAgLy8gbWFpcyBhdmFudCBfY29tcHV0ZVNsaWNlQ29uZmlncygpIHBvdXIgcXVlIGhpZGRlblNsaWNlS2V5cyBzb2l0IGTDqWrDoCByZXN0YXVyw6kuXG4gICAgaWYgKHBlbmRpbmdQcmVmcykge1xuICAgICAgdGhpcy5fYXBwbHlQcmVmZXJlbmNlcyhwZW5kaW5nUHJlZnMpO1xuICAgIH1cblxuICAgIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlXG4gICAgLy8gT24gcmVjYWxjdWxlIF9zbGljZUNvbmZpZ3MgZW4gcmVmbMOpdGFudCBsJ8OpdGF0IGNvdXJhbnQgZGVzIHNsaWNlcyBjYWNow6llcyxcbiAgICAvLyBwb3VyIHF1ZSBTbGljZVBhbmVsQ29tcG9uZW50Lm5nT25Jbml0IHJlw6dvaXZlIGxhIGJvbm5lIHZhbGV1ciBkZSBgaGlkZGVuYFxuICAgIC8vIG3Dqm1lIHF1YW5kIGxlIGNvbXBvc2FudCBlc3QgY3LDqcOpIHBvdXIgbGEgMcOocmUgZm9pcyBhcHLDqHMgdW4gdG9nZ2xlLlxuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICB0aGlzLl9zbGljZUNvbHVtbnMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5fc2xpY2VEYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuICAgIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZSA9IHRoaXMucmVzb2x2ZWRDb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgIT09IGZhbHNlO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVTb3J0LmFjdGl2ZSAmJiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0KSB7XG4gICAgICB0aGlzLl9tYXRTb3J0QWN0aXZlID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5hY3RpdmU7XG4gICAgICB0aGlzLl9tYXRTb3J0RGlyZWN0aW9uID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5kaXJlY3Rpb247XG4gICAgfVxuICAgIHRoaXMuX2J1aWxkU2xpY2VCeU1lbnVJdGVtcygpO1xuXG4gICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBSZXRvdXJuZSB1bmlxdWVtZW50IGxlcyBzbGljZXMgdmlzaWJsZXMgKG5vbiBjYWNow6llcyBwYXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cykuXG4gICAqIExlIFNsaWNlUGFuZWxDb21wb25lbnQgYWZmaWNoZSB0b3V0IGNlIHF1J2lsIHJlw6dvaXQg4oCUIGMnZXN0IGljaSBxdWUgc2UgZmFpdCBsZSBmaWx0cmFnZS4gKi9cbiAgcHJpdmF0ZSBfY29tcHV0ZVNsaWNlQ29uZmlncygpOiBTbGljZUNvbmZpZzxUPltdIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIoXG4gICAgICBzID0+ICFzLmNvbHVtbktleSB8fCAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3NldHNFcXVhbChhOiBTZXQ8c3RyaW5nPiwgYjogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgYSkgaWYgKCFiLmhhcyh2KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTbGljZUJ5TWVudUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlTWFwID0gbmV3IE1hcCh0aGlzLl9zdGF0aWNTbGljZXNGb3JNZW51Lm1hcChzID0+IFtzLmtleSwgc10pKTtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VTZXQgPSBuZXcgU2V0KHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnMubWFwKGMgPT4gYy5rZXkpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sLmtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YXRpY1NsaWNlTWFwLmhhcyhjb2wua2V5KSkge1xuICAgICAgICBjb25zdCBzID0gc3RhdGljU2xpY2VNYXAuZ2V0KGNvbC5rZXkpITtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgICBzZWVuLmFkZChjb2wua2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY1NsaWNlU2V0Lmhhcyhjb2wua2V5KSkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IGZhbHNlLCBrZXk6IGNvbC5rZXksIHRpdGxlOiB0aGlzLmNvbExhYmVsKGNvbCksIGljb246IGNvbC5pY29uLCBjb2wgfSk7XG4gICAgICAgIHNlZW4uYWRkKGNvbC5rZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdGljU2xpY2VzRm9yTWVudSkge1xuICAgICAgaWYgKCFzZWVuLmhhcyhzLmtleSkpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zID0gaXRlbXM7XG4gIH1cblxuICBnZXQgc2xpY2VCeU1lbnVJdGVtcygpIHsgcmV0dXJuIHRoaXMuX3NsaWNlQnlNZW51SXRlbXM7IH1cblxuICBvblNsaWNlTWVudUl0ZW1DbGljayhpdGVtOiB7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZzsgY29sPzogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaXNTdGF0aWMpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGljU2xpY2UoaXRlbS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5jb2wpIHtcbiAgICAgIHRoaXMudG9nZ2xlRHluYW1pY1NsaWNlKGl0ZW0uY29sKTtcbiAgICB9XG4gIH1cblxuICBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbTogeyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmlzU3RhdGljID8gdGhpcy5pc1N0YXRpY1NsaWNlVmlzaWJsZShpdGVtLmtleSkgOiB0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGl0ZW0ua2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlUmVuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVuZGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZW5kZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fZXhlY3V0ZVJlbmRlcigpKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZVJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjYXRlZ29yeVJvd3MgPSB0aGlzLmdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgLy8gRW4gbW9kZSBncm91cEJ5LCBwcm9qZWN0Um93cyBnw6hyZSB0b3V0IGxlIHRyaSBpbnRlcm5lbWVudCDigJQgcGFzIGRlIHNvcnQgZ2xvYmFsIGludXRpbGVcbiAgICAgIHRoaXMuX2FsbEZpbHRlcmVkUm93cyA9IGNhdGVnb3J5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcGFyZUZuID0gdGhpcy5fYnVpbGRTb3J0Q29tcGFyYXRvcigpO1xuICAgICAgdGhpcy5fYWxsRmlsdGVyZWRSb3dzID0gY29tcGFyZUZuID8gWy4uLmNhdGVnb3J5Um93c10uc29ydChjb21wYXJlRm4pIDogY2F0ZWdvcnlSb3dzO1xuICAgIH1cblxuICAgIC8vIE1ldHRyZSDDoCBqb3VyIGxlIHBhZ2luYXRvciBhdmVjIGxlIG5vdXZlYXUgdG90YWxcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA/PyB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSAtIDEpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IubGVuZ3RoID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IE1hdGgubWluKHNhdmVkSW5kZXgsIG1heFBhZ2UpO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgIC8vIGRldGVjdENoYW5nZXMoKSBhdSBsaWV1IGRlIG1hcmtGb3JDaGVjaygpIDogbWV0IMOgIGpvdXIgdW5pcXVlbWVudCBDRSBjb21wb3NhbnRcbiAgICAvLyBzYW5zIGTDqWNsZW5jaGVyIHVuIGN5Y2xlIENEIGdsb2JhbCBxdWkgcHJvdm9xdWVyYWl0IE5HMDEwMCBkYW5zIGxlcyBwYXJlbnRzLlxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0Q3VycmVudFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMucHJvamVjdFJvd3ModGhpcy5fYWxsRmlsdGVyZWRSb3dzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IDA7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IHBhZ2VSb3dzID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xuXG4gICAgY29uc3QgcHJvamVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIHBhZ2VSb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgY29uc3QgcDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgIHBbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGlkeCk7XG4gICAgICB9KTtcbiAgICAgIHByb2plY3RlZC5wdXNoKHApO1xuICAgIH0pO1xuICAgIHRoaXMudGFibGVEYXRhU291cmNlLmRhdGEgPSBwcm9qZWN0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRWZmZWN0aXZlQ29uZmlnKCk6IFRhYmxlUHJvdmlkZXI8VD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHt9O1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9yZXNvbHZlZERhdGE7XG5cbiAgICBjb25zdCBjb2x1bW5zID1cbiAgICAgIGNvbmZpZy5jb2x1bW5zIHx8XG4gICAgICB0aGlzLmNvbHVtbnNDb25maWcgfHxcbiAgICAgIHRoaXMucmVzb2x2ZUNvbHVtbnNGcm9tQ29tcGF0KHJvd3MpO1xuXG4gICAgLy8gTW9kZSBIVE1MIDogW3ZpZXddIHByZW5kIGxlIGRlc3N1cyBzdXIgY29uZmlnLnZpZXcgc2kgZm91cm5pIChQaGFzZSAzKS5cbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3ID8/IGNvbmZpZy52aWV3O1xuXG4gICAgY29uc3QgYXV0b1RhYmxlSWQgPSBjb25maWcucHJlZmVyZW5jZXM/LnRhYmxlSWQgfHwgVGFibGVDb21wb25lbnQuX2hhc2hDb2x1bW5zKChjb2x1bW5zIHx8IFtdKS5tYXAoYyA9PiBjLmtleSkpO1xuICAgIGNvbnN0IGV4cG9ydENvbmZpZzogVGFibGVFeHBvcnRDb25maWc8VD4gPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgZmlsZW5hbWU6IGF1dG9UYWJsZUlkLFxuICAgICAgLi4uY29uZmlnLmV4cG9ydCxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJlZnNDb25maWc6IFRhYmxlUHJlZmVyZW5jZXNDb25maWcgPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgdGFibGVJZDogYXV0b1RhYmxlSWQsXG4gICAgICAuLi5jb25maWcucHJlZmVyZW5jZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb2x1bW5zLFxuICAgICAgdmlldyxcbiAgICAgIHNsaWNlczogY29uZmlnLnNsaWNlcyB8fCBbXSxcbiAgICAgIGVuYWJsZVNsaWNlVG9nZ2xlOiBjb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgPz8gdHJ1ZSxcbiAgICAgIGV4cG9ydDogZXhwb3J0Q29uZmlnLFxuICAgICAgcHJlZmVyZW5jZXM6IHByZWZzQ29uZmlnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q29uZmlnU2VhcmNoUmVzZXQoKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJUb2tlbiA9IHRoaXMucmVzb2x2ZWRDb25maWcuY2xlYXJTZWFyY2hJbnB1dDtcbiAgICBjb25zdCBzaG91bGRDbGVhciA9ICEhY2xlYXJUb2tlbiAmJiBjbGVhclRva2VuICE9PSB0aGlzLl9sYXN0Q29uZmlnQ2xlYXJTZWFyY2hJbnB1dDtcblxuICAgIHRoaXMuX2xhc3RDb25maWdDbGVhclNlYXJjaElucHV0ID0gY2xlYXJUb2tlbjtcblxuICAgIGlmICghc2hvdWxkQ2xlYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5vblNlYXJjaENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUluaXRpYWxTZWFyY2hRdWVyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsUXVlcnkgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnNlYXJjaD8uaW5pdGlhbFF1ZXJ5O1xuICAgIGlmIChpbml0aWFsUXVlcnkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBpbml0aWFsUXVlcnk7XG4gICAgdGhpcy5vblNlYXJjaENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2hhc2hDb2x1bW5zKGtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHIgPSBrZXlzLmpvaW4oJ3wnKTtcbiAgICBsZXQgaCA9IDB4ODExYzlkYzU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGggXj0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICBoID0gTWF0aC5pbXVsKGgsIDB4MDEwMDAxOTMpID4+PiAwO1xuICAgIH1cbiAgICByZXR1cm4gaC50b1N0cmluZygxNikucGFkU3RhcnQoOCwgJzAnKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZURhdGEoKTogVFtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiBBcnJheS5pc0FycmF5KCh0aGlzLmRhdGFTb3VyY2UgYXMgYW55KS5kYXRhKSkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFTb3VyY2UgYXMgYW55KS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbnNGcm9tQ29tcGF0KHJvd3M6IFRbXSk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjogdGhpcy5jb2x1bW5MYWJlbHM/LltrZXldIHx8IGh1bWFuaXplS2V5KGtleSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RSb3cgPSByb3dzWzBdIGFzIGFueTtcbiAgICBpZiAoIWZpcnN0Um93IHx8IHR5cGVvZiBmaXJzdFJvdyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZmlyc3RSb3cpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAga2V5LFxuICAgICAgaGVhZGVyOiB0aGlzLmNvbHVtbkxhYmVscz8uW2tleV0gfHwgaHVtYW5pemVLZXkoa2V5KSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk6IFRbXSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX3Jlc29sdmVkRGF0YTtcblxuICAgIGxldCBmaWx0ZXJlZCA9IGRhdGEuZmlsdGVyKHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIpO1xuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5Py50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIGNvbnN0IHJlc3RyaWN0ZWRLZXlzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5zZWFyY2g/LnNlYXJjaENvbHVtbnM7XG4gICAgICBjb25zdCBzZWFyY2hDb2xzID0gcmVzdHJpY3RlZEtleXM/Lmxlbmd0aFxuICAgICAgICA/IFsuLi50aGlzLl9jb2x1bW5NYXAudmFsdWVzKCldLmZpbHRlcihjb2wgPT4gcmVzdHJpY3RlZEtleXMuaW5jbHVkZXMoY29sLmtleSkpXG4gICAgICAgIDogWy4uLnRoaXMuX2NvbHVtbk1hcC52YWx1ZXMoKV07XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocm93KSA9PlxuICAgICAgICBzZWFyY2hDb2xzLnNvbWUoKGNvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RGlzcGxheVZhbHVlRm9yU2VhcmNoKGNvbCwgcm93KTtcbiAgICAgICAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICBwcml2YXRlIHByb2plY3RSb3dzKHJvd3M6IFRbXSk6IGFueVtdIHtcbiAgICBjb25zdCBncm91cEtleSA9IHRoaXMuYWN0aXZlR3JvdXBCeUtleTtcblxuICAgIGlmICghZ3JvdXBLZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgIHJvd3MuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWQ6IGFueSA9IHsgW1JPV19SQVdfS0VZXTogcm93LCBbUk9XX0lOREVYX0tFWV06IGluZGV4IH07XG4gICAgICAgIHRoaXMuYWN0aXZlQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICBwcm9qZWN0ZWRbY29sLmtleV0gPSB0aGlzLnJlc29sdmVDZWxsVmFsdWUoY29sLCByb3csIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHByb2plY3RlZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBDb2xEZWYgPSB0aGlzLl9jb2x1bW5NYXAuZ2V0KGdyb3VwS2V5KTtcbiAgICBjb25zdCBncm91cExhenlTdGF0dXMgPSBncm91cENvbERlZj8ubGF6eSA/ICh0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChncm91cEtleSkgPz8gJ2lkbGUnKSA6ICdsb2FkZWQnO1xuXG4gICAgaWYgKGdyb3VwTGF6eVN0YXR1cyAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHRoaXMuX3RvdGFsRmlsdGVyZWRDb3VudCA9IHJvd3MubGVuZ3RoO1xuICAgICAgcmV0dXJuIFt7IFtHUk9VUF9IRUFERVJfTUFSS0VSXTogdHJ1ZSwgW1JPV19HUk9VUF9LRVldOiBHUk9VUF9LRVlfTEFaWV9MT0FESU5HLCBbUk9XX0dST1VQX0NPVU5UXTogcm93cy5sZW5ndGgsIFtST1dfR1JPVVBfUEFHRV06IDAsIFtST1dfR1JPVVBfUEFHRV9DT1VOVF06IDEgfV07XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0aXZlU29ydCA9IHRoaXMuX2FjdGl2ZVNvcnQuYWN0aXZlICYmIHRoaXMuX2FjdGl2ZVNvcnQuZGlyZWN0aW9uXG4gICAgICA/IHRoaXMuX2FjdGl2ZVNvcnRcbiAgICAgIDogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydCA/PyB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgYXMgY29uc3QgfTtcblxuICAgIC8vIFbDqXJpZmllIHNpIGxlIGNhY2hlIGVzdCBlbmNvcmUgdmFsaWRlIChtw6ptZSByw6lmw6lyZW5jZSBkZSByb3dzICsgbcOqbWUgcGFyYW3DqHRyZXMgZGUgdHJpL2dyb3VwZSlcbiAgICBjb25zdCBjYWNoZVZhbGlkID1cbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUucm93cyA9PT0gcm93cyAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5rZXkgPT09IGdyb3VwS2V5ICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnRPcmRlciA9PT0gdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlciAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5zb3J0QWN0aXZlID09PSAoZWZmZWN0aXZlU29ydC5hY3RpdmUgPz8gJycpICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnNvcnREaXIgPT09IChlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbiA/PyAnJyk7XG5cbiAgICBsZXQgZ3JvdXBPcmRlcjogc3RyaW5nW107XG4gICAgbGV0IGdyb3VwTWFwOiBNYXA8c3RyaW5nLCBUW10+O1xuXG4gICAgaWYgKGNhY2hlVmFsaWQpIHtcbiAgICAgIGdyb3VwT3JkZXIgPSB0aGlzLl9ncm91cENhY2hlIS5vcmRlcjtcbiAgICAgIGdyb3VwTWFwID0gdGhpcy5fZ3JvdXBDYWNoZSEubWFwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQcsOpLWNhbGN1bCBkZXMgdmFsZXVycyBkZSBncm91cGUgZW4gdW4gc2V1bCBwYXNzYWdlICjDqXZpdGUgTyhuKSBmaW5kKCkgcGFyIGNvbXBhcmFpc29uKVxuICAgICAgY29uc3QgZ3JvdXBWYWx1ZUNhY2hlID0gbmV3IE1hcDxULCBzdHJpbmc+KCk7XG4gICAgICByb3dzLmZvckVhY2gocm93ID0+IGdyb3VwVmFsdWVDYWNoZS5zZXQocm93LCBTdHJpbmcodGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShncm91cEtleSwgcm93KSA/PyAnJykpKTtcblxuICAgICAgLy8gUHLDqS1jYWxjdWwgZGVzIHZhbGV1cnMgZGUgdHJpICjDqXZpdGUgTyhuIGxvZyBuKSDDlyBnZXRMYXp5QXdhcmVWYWx1ZSBkYW5zIGxlIGNvbXBhcmF0ZXVyKVxuICAgICAgbGV0IGZhc3RDb21wYXJlRm46ICgoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGVmZmVjdGl2ZVNvcnQuYWN0aXZlICYmIGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNvcnRWYWx1ZUNhY2hlID0gbmV3IE1hcDxULCBhbnk+KCk7XG4gICAgICAgIHJvd3MuZm9yRWFjaChyb3cgPT4gc29ydFZhbHVlQ2FjaGUuc2V0KHJvdywgdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShlZmZlY3RpdmVTb3J0LmFjdGl2ZSwgcm93KSkpO1xuICAgICAgICBjb25zdCBkaXIgPSBlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbjtcbiAgICAgICAgZmFzdENvbXBhcmVGbiA9IChhOiBULCBiOiBUKTogbnVtYmVyID0+IHtcbiAgICAgICAgICBjb25zdCB2YSA9IHNvcnRWYWx1ZUNhY2hlLmdldChhKTtcbiAgICAgICAgICBjb25zdCB2YiA9IHNvcnRWYWx1ZUNhY2hlLmdldChiKTtcbiAgICAgICAgICBsZXQgY21wID0gMDtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjbXAgPSB2YSA8IHZiID8gLTEgOiB2YSA+IHZiID8gMSA6IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNhID0gdmEgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2IgPSB2YiA9PSBudWxsID8gJycgOiBTdHJpbmcodmIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjbXAgPSBzYSA8IHNiID8gLTEgOiBzYSA+IHNiID8gMSA6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkaXIgPT09ICdhc2MnID8gY21wIDogLWNtcDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgdmEgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KGEpITtcbiAgICAgICAgY29uc3QgdmIgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KGIpITtcbiAgICAgICAgY29uc3QgY21wID0gdmEubG9jYWxlQ29tcGFyZSh2Yik7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyID09PSAnZGVzYycgPyAtY21wIDogY21wO1xuICAgICAgfSk7XG5cbiAgICAgIGdyb3VwT3JkZXIgPSBbXTtcbiAgICAgIGdyb3VwTWFwID0gbmV3IE1hcDxzdHJpbmcsIFRbXT4oKTtcbiAgICAgIHNvcnRlZC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWVDYWNoZS5nZXQocm93KSE7XG4gICAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGdyb3VwVmFsdWUpKSB7XG4gICAgICAgICAgZ3JvdXBPcmRlci5wdXNoKGdyb3VwVmFsdWUpO1xuICAgICAgICAgIGdyb3VwTWFwLnNldChncm91cFZhbHVlLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBNYXAuZ2V0KGdyb3VwVmFsdWUpIS5wdXNoKHJvdyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVHJpIGludHJhLWdyb3VwZSBzdG9ja8OpIGRhbnMgbGUgY2FjaGUg4oCUIMOpdml0ZSBsZSByZS10cmkgc3VyIGNvbGxhcHNlL2V4cGFuZC9wYWdpbmF0aW9uXG4gICAgICBpZiAoZmFzdENvbXBhcmVGbikge1xuICAgICAgICBjb25zdCBmbiA9IGZhc3RDb21wYXJlRm47XG4gICAgICAgIGdyb3VwTWFwLmZvckVhY2goKGdyb3VwUm93cywga2V5KSA9PiB7XG4gICAgICAgICAgZ3JvdXBNYXAuc2V0KGtleSwgWy4uLmdyb3VwUm93c10uc29ydChmbikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTWlzZSBlbiBjYWNoZVxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZSA9IHtcbiAgICAgICAgcm93cyxcbiAgICAgICAga2V5OiBncm91cEtleSxcbiAgICAgICAgc29ydE9yZGVyOiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyLFxuICAgICAgICBzb3J0QWN0aXZlOiBlZmZlY3RpdmVTb3J0LmFjdGl2ZSA/PyAnJyxcbiAgICAgICAgc29ydERpcjogZWZmZWN0aXZlU29ydC5kaXJlY3Rpb24gPz8gJycsXG4gICAgICAgIG9yZGVyOiBncm91cE9yZGVyLFxuICAgICAgICBtYXA6IGdyb3VwTWFwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgPSByb3dzLmxlbmd0aDtcblxuICAgIC8vIFByb3RlY3Rpb24gY29udHJlIGxlcyBqZXV4IGRlIGRvbm7DqWVzIMOgIHRyb3AgaGF1dGUgY2FyZGluYWxpdMOpXG4gICAgaWYgKGdyb3VwT3JkZXIubGVuZ3RoID4gVGFibGVDb21wb25lbnQuTUFYX0dST1VQX0NPVU5UKSB7XG4gICAgICByZXR1cm4gW3sgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IEdST1VQX0tFWV9UT09fTUFOWSwgW1JPV19HUk9VUF9DT1VOVF06IGdyb3VwT3JkZXIubGVuZ3RoLCBbUk9XX0dST1VQX1BBR0VdOiAwLCBbUk9XX0dST1VQX1BBR0VfQ09VTlRdOiAxIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5ncm91cFBhZ2VTaXplO1xuICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcblxuICAgIGdyb3VwT3JkZXIuZm9yRWFjaCgoZ3JvdXBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBSb3dzID0gZ3JvdXBNYXAuZ2V0KGdyb3VwVmFsdWUpITtcbiAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBncm91cFJvd3MubGVuZ3RoO1xuICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBwYWdlU2l6ZSA9PT0gMCA/IDAgOiB0aGlzLl9ncm91cEJ5LmdldFBhZ2UoZ3JvdXBWYWx1ZSk7XG4gICAgICBjb25zdCBwYWdlQ291bnQgPSBwYWdlU2l6ZSA9PT0gMCA/IDEgOiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWxDb3VudCAvIHBhZ2VTaXplKSk7XG4gICAgICBjb25zdCBjb2xsYXBzZWQgPSB0aGlzLmlzR3JvdXBDb2xsYXBzZWQoZ3JvdXBWYWx1ZSk7XG5cbiAgICAgIHJlc3VsdC5wdXNoKHsgW0dST1VQX0hFQURFUl9NQVJLRVJdOiB0cnVlLCBbUk9XX0dST1VQX0tFWV06IGdyb3VwVmFsdWUsIFtST1dfR1JPVVBfQ09VTlRdOiB0b3RhbENvdW50LCBbUk9XX0dST1VQX1BBR0VdOiBjdXJyZW50UGFnZSwgW1JPV19HUk9VUF9QQUdFX0NPVU5UXTogcGFnZUNvdW50IH0pO1xuXG4gICAgICBpZiAoIWNvbGxhcHNlZCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhZ2VTaXplID09PSAwID8gMCA6IGN1cnJlbnRQYWdlICogcGFnZVNpemU7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhZ2VTaXplID09PSAwID8gdG90YWxDb3VudCA6IE1hdGgubWluKHN0YXJ0ICsgcGFnZVNpemUsIHRvdGFsQ291bnQpO1xuICAgICAgICBncm91cFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCkuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgICAgIGNvbnN0IHByb2plY3RlZDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgcHJvamVjdGVkW2NvbC5rZXldID0gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpZHgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHByb2plY3RlZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkU29ydENvbXBhcmF0b3IoKTogKChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHwgbnVsbCB7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMuX2FjdGl2ZVNvcnQuYWN0aXZlICYmIHRoaXMuX2FjdGl2ZVNvcnQuZGlyZWN0aW9uXG4gICAgICA/IHRoaXMuX2FjdGl2ZVNvcnRcbiAgICAgIDogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydCA/PyB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgYXMgY29uc3QgfTtcbiAgICBjb25zdCB7IGFjdGl2ZSwgZGlyZWN0aW9uIH0gPSBzb3J0O1xuICAgIGlmICghYWN0aXZlIHx8ICFkaXJlY3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiAoYTogVCwgYjogVCk6IG51bWJlciA9PiB7XG4gICAgICBjb25zdCB2YSA9IHRoaXMuZ2V0TGF6eUF3YXJlVmFsdWUoYWN0aXZlLCBhKTtcbiAgICAgIGNvbnN0IHZiID0gdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShhY3RpdmUsIGIpO1xuICAgICAgbGV0IGNtcCA9IDA7XG4gICAgICBpZiAodHlwZW9mIHZhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNtcCA9IHZhIDwgdmIgPyAtMSA6IHZhID4gdmIgPyAxIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNhID0gdmEgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBzYiA9IHZiID09IG51bGwgPyAnJyA6IFN0cmluZyh2YikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY21wID0gc2EgPCBzYiA/IC0xIDogc2EgPiBzYiA/IDEgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyBjbXAgOiAtY21wO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgbGEgdmFsZXVyIHRlbGxlIHF1J2VsbGUgZXN0IGFmZmljaMOpZSBkYW5zIGxhIGNlbGx1bGUsIGVuIHN1aXZhbnQgZXhhY3RlbWVudFxuICAgKiBsZSBtw6ptZSBjaGVtaW4gcXVlIHJlc29sdmVDZWxsVmFsdWUg4oCUIHV0aWxpc8OpZSBwb3VyIGxhIHJlY2hlcmNoZSBwbGVpbi10ZXh0ZS5cbiAgICogTmUgcGFzc2UgcGFzIHBhciBzb3J0VmFsdWUgKHZhbGV1ciBicnV0ZSBkZSB0cmkpIGNvbnRyYWlyZW1lbnQgw6AgZ2V0TGF6eUF3YXJlVmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGdldERpc3BsYXlWYWx1ZUZvclNlYXJjaChjb2w6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4sIHJvdzogVCk6IGFueSB7XG4gICAgaWYgKGNvbC5sYXp5KSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChjb2wua2V5KSA/PyAnaWRsZSc7XG4gICAgICBpZiAoc3RhdHVzICE9PSAnbG9hZGVkJykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCByb3dNYXAgPSB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sLmtleSk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJvd01hcD8uZ2V0KHJvdykgPz8gJycpO1xuICAgIH1cbiAgICBpZiAoY29sLnNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sLnNlYXJjaFZhbHVlKHJvdywgMCk7XG4gICAgfVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gY29sLnZhbHVlID8gY29sLnZhbHVlKHJvdywgMCkgOiAocm93IGFzIGFueSk/Lltjb2wua2V5XTtcbiAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJhd1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5OiBzdHJpbmcsIHJvdzogVCk6IGFueSB7XG4gICAgY29uc3QgY29sRGVmID0gdGhpcy5fY29sdW1uTWFwLmdldChjb2x1bW5LZXkpO1xuICAgIGlmIChjb2xEZWY/LmxhenkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sdW1uS2V5KT8uZ2V0KHJvdykgPz8gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNvbERlZj8uc29ydFZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKGNvbERlZi5zb3J0VmFsdWUocm93LCAwKSk7XG4gICAgfVxuICAgIGlmIChjb2xEZWY/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKGNvbERlZi52YWx1ZShyb3csIDApKTtcbiAgICB9XG4gICAgcmV0dXJuIChyb3cgYXMgYW55KVtjb2x1bW5LZXldO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ2VsbFZhbHVlKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBULCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoY29sLmxhenkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbC5rZXkpID8/ICdpZGxlJztcbiAgICAgIGlmIChzdGF0dXMgPT09ICdsb2FkaW5nJykgcmV0dXJuIExBWllfTE9BRElOR19WQUxVRTtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdlcnJvcicpIHJldHVybiBMQVpZX0VSUk9SX1ZBTFVFO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgY29uc3Qgcm93TWFwID0gdGhpcy5fbGF6eUNvbHVtbkRhdGEuZ2V0KGNvbC5rZXkpO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJvd01hcD8uZ2V0KHJvdykgPz8gJycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZVByb3ZpZGVyID0gY29sLnZhbHVlO1xuICAgIGNvbnN0IHJhd1ZhbHVlID0gdmFsdWVQcm92aWRlciA/IHZhbHVlUHJvdmlkZXIocm93LCBpbmRleCkgOiAocm93IGFzIGFueSk/Lltjb2wua2V5XTtcbiAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJhd1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgdGhpcy5wYWdlU2l6ZSB8fCA1KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhZ2VTaXplT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFs1LCAxMCwgMjBdO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KG9wdGlvbnMuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgPiAwKSldO1xuXG4gICAgaWYgKCF1bmlxdWUuaW5jbHVkZXModGhpcy5wYWdlU2l6ZSkpIHtcbiAgICAgIHVuaXF1ZS5wdXNoKHRoaXMucGFnZVNpemUpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemVPcHRpb25zR3JvdXBCeSgpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zR3JvdXBCeSB8fCB0aGlzLnJlc29sdmVkQ29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9ucyB8fCBbNSwgMTAsIDIwXTtcbiAgICBjb25zdCB1bmlxdWUgPSBbLi4ubmV3IFNldChvcHRpb25zLmZpbHRlcigodikgPT4gdiA+IDApKV07XG4gICAgaWYgKHRoaXMuZ3JvdXBQYWdlU2l6ZSA+IDAgJiYgIXVuaXF1ZS5pbmNsdWRlcyh0aGlzLmdyb3VwUGFnZVNpemUpKSB7XG4gICAgICB1bmlxdWUucHVzaCh0aGlzLmdyb3VwUGFnZVNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5pcXVlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRHcm91cFBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5yZXNvbHZlZENvbmZpZztcbiAgICBjb25zdCBvcHRpb25zID0gY2ZnLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9uc0dyb3VwQnkgfHwgY2ZnLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9ucztcbiAgICBpZiAob3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gb3B0aW9uc1swXTtcbiAgICByZXR1cm4gY2ZnLnBhZ2luYXRpb24/LnBhZ2VTaXplIHx8IDU7XG4gIH1cblxuICBwcml2YXRlIHVuaXF1ZUNvbHVtbnNCeUtleShjb2x1bW5zOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10pOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKHNlZW4uaGFzKGNvbHVtbi5rZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFBhZ2luYXRvcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWdpbmF0b3IpIHJldHVybjtcblxuICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XG4gICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuXG4gICAgaWYgKHRoaXMuX3BhZ2luYXRvclN1YnNjcmliZWQgIT09IHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0b3JTdWJzY3JpYmVkID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yIS5wYWdlU2l6ZTtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoeyBwYWdlSW5kZXg6IHRoaXMucGFnaW5hdG9yIS5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRvciEucGFnZVNpemUgfSk7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFNvcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNvcnQpIHJldHVybjtcblxuICAgIHRoaXMudGFibGVEYXRhU291cmNlLnNvcnQgPSBudWxsIGFzIGFueTtcblxuICAgIGlmICh0aGlzLl9zb3J0U3Vic2NyaWJlZCAhPT0gdGhpcy5zb3J0KSB7XG4gICAgICB0aGlzLl9zb3J0U3Vic2NyaWJlZCA9IHRoaXMuc29ydDtcbiAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU29ydCA9IHtcbiAgICAgICAgICBhY3RpdmU6IHRoaXMuc29ydC5hY3RpdmUsXG4gICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLnNvcnQuZGlyZWN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdCh7IGFjdGl2ZTogdGhpcy5zb3J0LmFjdGl2ZSwgZGlyZWN0aW9uOiB0aGlzLnNvcnQuZGlyZWN0aW9uIH0pO1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8c2VjdGlvbiBjbGFzcz1cImpxdWVyeS10YWJsZS13cmFwcGVyXCI+XG4gIDxoZWFkZXIgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiAqbmdJZj1cInNob3dUaXRsZVwiPlxuICAgIDxoMz57eyB0aXRsZSB9fTwvaDM+XG4gIDwvaGVhZGVyPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWxheW91dFwiXG4gICAgW2NsYXNzLm5vLXNsaWNlXT1cIiFfc2hvd1NsaWNlUGFuZWwgfHwgX3NsaWNlUGFuZWxDb2xsYXBzZWRcIlxuICA+XG4gICAgPHNsaWNlLXBhbmVsXG4gICAgICBbc3R5bGUuZGlzcGxheV09XCIhX3Nob3dTbGljZVBhbmVsIHx8IF9zbGljZVBhbmVsQ29sbGFwc2VkID8gJ25vbmUnIDogbnVsbFwiXG4gICAgICBbc2xpY2VDb25maWdzXT1cIl9zbGljZUNvbmZpZ3NcIlxuICAgICAgW2NvbHVtbnNdPVwiX3NsaWNlQ29sdW1uc1wiXG4gICAgICBbZGF0YV09XCJfc2xpY2VEYXRhXCJcbiAgICAgIFtsYXp5RGF0YV09XCJfbGF6eUNvbHVtbkRhdGFcIlxuICAgICAgW2xhenlTdGF0dXNdPVwiX2xhenlDb2x1bW5TdGF0dXNcIlxuICAgICAgW3Nob3dUb2dnbGVdPVwiX3NsaWNlU2hvd1RvZ2dsZVwiXG4gICAgICBbY29sbGFwc2VkQnlEZWZhdWx0XT1cIl9zbGljZVBhbmVsQ29sbGFwc2VkXCJcbiAgICAgIChmaWx0ZXJDaGFuZ2UpPVwib25TbGljZUZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChkeW5hbWljU2xpY2VLZXlzQ2hhbmdlKT1cIm9uRHluYW1pY1NsaWNlS2V5c0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChjb2xsYXBzZWRDaGFuZ2UpPVwib25TbGljZVBhbmVsQ29sbGFwc2VkQ2hhbmdlKCRldmVudClcIlxuICAgID48L3NsaWNlLXBhbmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLXNoZWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdG9vbGJhclwiICpuZ0lmPVwic2hvd1Rvb2xiYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRvb2xiYXItbGVmdFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1NsaWNlRXhwYW5kQnRuXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzbGljZS1leHBhbmQtYnRuXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJpMThuLmV4cGFuZEZpbHRlclRpdGxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRTbGljZVBhbmVsKClcIlxuICAgICAgICAgID48bWF0LWljb24gY2xhc3M9XCJzbGljZS1leHBhbmQtbWF0LWljb25cIj5maWx0ZXJfbGlzdDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTZWFyY2hCYXJcIiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwic2VhcmNoLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4LjVcIiBjeT1cIjguNVwiIHI9XCI1LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgMTNMMTcgMTdcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoUXVlcnlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImkxOG4uc2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWFyY2hRdWVyeVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlYXJjaC1jbGVhci1idG5cIiAoY2xpY2spPVwic2VhcmNoUXVlcnkgPSAnJzsgb25TZWFyY2hDaGFuZ2UoKVwiPsOXPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlYXJjaC1jb3VudFwiICpuZ0lmPVwiIWVmZmVjdGl2ZUlzTG9hZGluZ1wiPnt7IGZpbHRlcmVkUm93Q291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvdW50LWxvYWRlclwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93Vmlld0J1dHRvblwiIGNsYXNzPVwidGFibGUtdG9vbGJhci1yaWdodFwiPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93Vmlld0J1dHRvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctYnRuXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInZpZXdNZW51XCIgI3ZpZXdNZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInVmlldydcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInZpZXctYnRuLWljb25cIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8bWF0LW1lbnUgI3ZpZXdNZW51PVwibWF0TWVudVwiIFtwYW5lbENsYXNzXT1cIid2aWV3LW1lbnUtcGFuZWwnXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0ZpZWxkc1wiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImZpZWxkc1N1Yk1lbnVcIiBjbGFzcz1cInZpZXctbWVudS1zdWItdHJpZ2dlclwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItbGFiZWxcIj57eyBpMThuLnZpZXdNZW51RmllbGRzIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1zdWItdmFsdWVcIj57eyB2aXNpYmxlQ29sdW1ucy5sZW5ndGggfX0ve3sgdG90YWxDb2x1bW5Db3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dHcm91cEJ5U2VjdGlvblwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwQnlTdWJNZW51XCIgY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXRyaWdnZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLWxhYmVsXCI+e3sgaTE4bi52aWV3TWVudUdyb3VwQnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LXN1Yi12YWx1ZVwiPnt7IGFjdGl2ZUdyb3VwQnlMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dBZGRTbGljZUJ1dHRvblwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNsaWNlQnlTdWJNZW51XCIgY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXRyaWdnZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLWxhYmVsXCI+e3sgaTE4bi52aWV3TWVudVNsaWNlQnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LXN1Yi12YWx1ZVwiPnt7IGFjdGl2ZVNsaWNlQnlMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWV4cG9ydC1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCIgbWF0LW1lbnUtaXRlbSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtZXhwb3J0LWl0ZW1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25FeHBvcnQoKTsgdmlld01lbnVUcmlnZ2VyLmNsb3NlTWVudSgpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInZpZXctbWVudS1leHBvcnQtaWNvblwiPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLWxhYmVsXCI+e3sgaTE4bi5leHBvcnRCdXR0b25MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyICpuZ0lmPVwic2hvd1ByZWZlcmVuY2VzTWVudVwiIGNsYXNzPVwidmlldy1tZW51LWV4cG9ydC1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93UHJlZmVyZW5jZXNNZW51XCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwicHJlZmVyZW5jZXNTdWJNZW51XCIgY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLXRyaWdnZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtc3ViLWxhYmVsXCI+e3sgaTE4bi5wcmVmZXJlbmNlc01lbnVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbWF0LW1lbnU+XG5cbiAgICAgICAgICA8bWF0LW1lbnUgI3ByZWZlcmVuY2VzU3ViTWVudT1cIm1hdE1lbnVcIiBbcGFuZWxDbGFzc109XCIndmlldy1zdWJtZW51LXBhbmVsJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctc3VibWVudVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctbWVudS1pdGVtXCIgKG1vdXNlZG93bik9XCJlbnRlckVkaXRNb2RlKCk7IHZpZXdNZW51VHJpZ2dlci5jbG9zZU1lbnUoKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LWNoZWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIHt7IGkxOG4ucHJlZmVyZW5jZXNFZGl0IH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctbWVudS1pdGVtXCIgKG1vdXNlZG93bik9XCJzYXZlUHJlZmVyZW5jZXMoKTsgdmlld01lbnVUcmlnZ2VyLmNsb3NlTWVudSgpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCI+c2F2ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgaTE4bi5wcmVmZXJlbmNlc1NhdmUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiBbZGlzYWJsZWRdPVwiIWhhc1NhdmVkUHJlZmVyZW5jZXNcIiAobW91c2Vkb3duKT1cImNsZWFyUHJlZmVyZW5jZXMoKTsgdmlld01lbnVUcmlnZ2VyLmNsb3NlTWVudSgpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlldy1tZW51LWNvbC1pY29uXCI+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIHt7IGkxOG4ucHJlZmVyZW5jZXNDbGVhciB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LW1lbnU+XG5cbiAgICAgICAgICA8bWF0LW1lbnUgI2ZpZWxkc1N1Yk1lbnU9XCJtYXRNZW51XCIgW3BhbmVsQ2xhc3NdPVwiJ3ZpZXctc3VibWVudS1wYW5lbCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LXN1Ym1lbnVcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtaXRlbVwiICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgbWVudUJhc2VDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbHVtbi5vcHRpb25hbCAmJiAhYWxsb3dDb2x1bW5SZW1vdmFsXCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2x1bW4sICFpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSkpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtY2hlY2tcIj57eyBpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtY29sLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj57eyBjb2x1bW4uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgY29sTGFiZWwoY29sdW1uKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lbnVPcHRpb25hbENvbHVtbnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG1lbnVPcHRpb25hbENvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIihpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSkgJiYgdmlzaWJsZUNvbHVtbnMubGVuZ3RoID09PSAxKSB8fCBnZXRMYXp5Q29sdW1uU3RhdHVzKGNvbHVtbi5rZXkpID09PSAnbG9hZGluZydcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UoY29sdW1uLCAhaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5rZXkpKVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW1lbnUtY2hlY2tcIj57eyBpc0NvbHVtblZpc2libGUoY29sdW1uLmtleSkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb25cIiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnt7IGNvbHVtbi5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbExhYmVsKGNvbHVtbikgfX1cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmxhenkgJiYgZ2V0TGF6eUNvbHVtblN0YXR1cyhjb2x1bW4ua2V5KSA9PT0gJ2xvYWRpbmcnXCIgY2xhc3M9XCJsYXp5LW1lbnUtc3Bpbm5lclwiPuKGuzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29sdW1uLmxhenkgJiYgZ2V0TGF6eUNvbHVtblN0YXR1cyhjb2x1bW4ua2V5KSA9PT0gJ2Vycm9yJ1wiIGNsYXNzPVwibGF6eS1tZW51LWVycm9yXCIgW3RpdGxlXT1cImkxOG4ubGF6eUVycm9yTWVudVRpdGxlXCI+4pqgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LW1lbnU+XG5cbiAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwQnlTdWJNZW51PVwibWF0TWVudVwiIFtwYW5lbENsYXNzXT1cIid2aWV3LXN1Ym1lbnUtcGFuZWwnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1zdWJtZW51XCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGdyb3VwQnlDb2x1bW5zXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZUdyb3VwQnlLZXkgPT09IGNvbC5rZXlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Hcm91cEJ5Q2hhbmdlKGFjdGl2ZUdyb3VwQnlLZXkgPT09IGNvbC5rZXkgPyBudWxsIDogY29sLmtleSlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZXctbWVudS1jaGVja1wiPnt7IGFjdGl2ZUdyb3VwQnlLZXkgPT09IGNvbC5rZXkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbC5pY29uXCIgY2xhc3M9XCJ2aWV3LW1lbnUtY29sLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj57eyBjb2wuaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgY29sTGFiZWwoY29sKSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LW1lbnU+XG5cbiAgICAgICAgICA8bWF0LW1lbnUgI3NsaWNlQnlTdWJNZW51PVwibWF0TWVudVwiIFtwYW5lbENsYXNzXT1cIid2aWV3LXN1Ym1lbnUtcGFuZWwnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1zdWJtZW51XCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1tZW51LWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzbGljZUJ5TWVudUl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzU2xpY2VNZW51SXRlbUFjdGl2ZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblNsaWNlTWVudUl0ZW1DbGljayhpdGVtKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1tZW51LWNoZWNrXCI+e3sgaXNTbGljZU1lbnVJdGVtQWN0aXZlKGl0ZW0pID8gJ+KckycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJpdGVtLmljb25cIiBjbGFzcz1cInZpZXctbWVudS1jb2wtaWNvblwiIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnt7IGl0ZW0uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib2R5LXdyYXBwZXJcIj5cblxuICAgICAgPCEtLSBCYW5uacOocmUgbWVzc2FnZSBwcsOpZsOpcmVuY2VzIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIl9wcmVmZXJlbmNlc01lc3NhZ2VcIiBjbGFzcz1cInByZWZlcmVuY2VzLW1lc3NhZ2VcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicHJlZmVyZW5jZXMtbWVzc2FnZS1pY29uXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgX3ByZWZlcmVuY2VzTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJvdXRvbiBkZSBjb25maXJtYXRpb24gZHUgbW9kZSDDqWRpdGlvbiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJfZWRpdE1vZGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJlZGl0LWNvbmZpcm0tYnRuXCJcbiAgICAgICAgW3RpdGxlXT1cImkxOG4ucHJlZmVyZW5jZXNDb25maXJtRWRpdFwiXG4gICAgICAgIChjbGljayk9XCJjb25maXJtRWRpdE1vZGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keS1zY3JvbGxcIiAjdGFibGVCb2R5U2Nyb2xsPlxuICAgICAgPHRhYmxlIG1hdC10YWJsZSBtYXRTb3J0IFtkYXRhU291cmNlXT1cInRhYmxlRGF0YVNvdXJjZVwiIGNsYXNzPVwianF1ZXJ5LXRhYmxlXCJcbiAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cInRhYmxlTWluV2lkdGhcIlxuICAgICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrUm93Rm5cIlxuICAgICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cIl9tYXRTb3J0QWN0aXZlXCIgW21hdFNvcnREaXJlY3Rpb25dPVwiX21hdFNvcnREaXJlY3Rpb25cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHZpc2libGVDb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ua2V5XCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbbWF0LXNvcnQtaGVhZGVyXT1cIighX2VkaXRNb2RlICYmIGNvbHVtbi5zb3J0YWJsZSAhPT0gZmFsc2UpID8gY29sdW1uLmtleSA6ICcnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJfZWRpdE1vZGUgfHwgY29sdW1uLnNvcnRhYmxlID09PSBmYWxzZVwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiZ2V0Q29sdW1uV2lkdGgoY29sdW1uLmtleSlcIlxuICAgICAgICAgICAgW2NsYXNzLmRyYWctZW5hYmxlZF09XCJpc0NvbHVtbkRyYWdEcm9wRW5hYmxlZCB8fCBfZWRpdE1vZGVcIlxuICAgICAgICAgICAgW2NsYXNzLmRyb3AtdGFyZ2V0XT1cImlzSGVhZGVyRHJvcFRhcmdldChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLWhlYWRlcl09XCJfZWRpdE1vZGVcIlxuICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uSGVhZGVyRHJhZ092ZXIoY29sdW1uLmtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAoZHJvcCk9XCJvbkhlYWRlckRyb3AoY29sdW1uLmtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWQtY2VsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvblwiIGNsYXNzPVwiaGVhZC1pY29uXCIgZm9udFNldD1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+e3sgY29sdW1uLmljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWQtdGV4dFwiIFt0aXRsZV09XCJjb2x1bW4uaGVhZGVyXCI+e3sgY29sdW1uLmhlYWRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzQ29sdW1uRHJhZ0Ryb3BFbmFibGVkIHx8IF9lZGl0TW9kZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkhlYWRlckRyYWdTdGFydChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkhlYWRlckRyYWdFbmQoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUG9pZ27DqWUgZGUgcmVzaXplICh2aXNpYmxlIHVuaXF1ZW1lbnQgZW4gbW9kZSDDqWRpdGlvbikgLS0+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAqbmdJZj1cIl9lZGl0TW9kZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29sLXJlc2l6ZS1oYW5kbGVcIlxuICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25SZXNpemVTdGFydChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4ua2V5KVwiXG4gICAgICAgICAgICBbY2xhc3MuZWRpdC1tb2RlLWNlbGxdPVwiX2VkaXRNb2RlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIV9lZGl0TW9kZTsgZWxzZSBlZGl0TW9kZUNlbGxUcGxcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENlbGxUZW1wbGF0ZShjb2x1bW4ua2V5KSBhcyBjdXN0b21UcGw7IGVsc2UgZGVmYXVsdENlbGxUcGxcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93W19ST1dfUkFXX0tFWV0sIGluZGV4OiByb3dbX1JPV19JTkRFWF9LRVldIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGxUcGw+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLmxhenkgPyBnZXRMYXp5UmVuZGVyVHlwZShyb3dbY29sdW1uLmtleV0pIDogJ3ZhbHVlJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidsb2FkaW5nJ1wiIGNsYXNzPVwibGF6eS1za2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nU3dpdGNoQ2FzZT1cIidlcnJvcidcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJsYXp5LWVycm9yLWJ0blwiIChjbGljayk9XCJyZXRyeUxhenlDb2x1bW4oY29sdW1uKVwiIFt0aXRsZV09XCJpMThuLmxhenlFcnJvclRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1lcnJvci1pY29uXCI+4pqgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhenktZXJyb3ItbGFiZWxcIj57eyBpMThuLmxhenlSZXRyeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBjbGFzcz1cImNlbGwtdGV4dFwiIFtjbGFzcy5jZWxsLWVtcHR5XT1cImlzQ2VsbEVtcHR5KHJvd1tjb2x1bW4ua2V5XSlcIiBbdGl0bGVdPVwiYXNUaXRsZShyb3dbY29sdW1uLmtleV0pXCI+e3sgaXNDZWxsRW1wdHkocm93W2NvbHVtbi5rZXldKSA/IGkxOG4uY2VsbEVtcHR5IDogcm93W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRNb2RlQ2VsbFRwbD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZWxsLXRleHQgY2VsbC1lZGl0LW1vZGVcIiBbdGl0bGVdPVwiYXNUaXRsZShyb3dbY29sdW1uLmtleV0pXCI+e3sgcm93W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cInJlbmRlcmVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgICAgPHRyXG4gICAgICAgICAgbWF0LXJvd1xuICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiByZW5kZXJlZENvbHVtbnM7IHdoZW46ICFpc0dyb3VwSGVhZGVyXCJcbiAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJoYXNSb3dDbGlja0hhbmRsZXIgJiYgIV9lZGl0TW9kZSA/IDAgOiBudWxsXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRSb3dDbGFzcyhyb3cpXCJcbiAgICAgICAgICBbY2xhc3Mubm8tcG9pbnRlcl09XCIhaGFzUm93Q2xpY2tIYW5kbGVyIHx8IF9lZGl0TW9kZVwiXG4gICAgICAgICAgW2NsYXNzLmVkaXQtbW9kZS1yb3ddPVwiX2VkaXRNb2RlXCJcbiAgICAgICAgICAoY2xpY2spPVwiIV9lZGl0TW9kZSAmJiBvblJvd0NsaWNrKHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiIV9lZGl0TW9kZSAmJiBvblJvd0NsaWNrKHJvdywgbnVsbClcIlxuICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiFfZWRpdE1vZGUgJiYgb25Sb3dDbGljayhyb3csIG51bGwpXCJcbiAgICAgICAgPjwvdHI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJfR1JPVVBfUk9XX0NPTFVNTlwiPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbYXR0ci5jb2xzcGFuXT1cInJlbmRlcmVkQ29sdW1ucy5sZW5ndGhcIiBjbGFzcz1cImdyb3VwLWhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtY2hldnJvblwiIFtjbGFzcy5jb2xsYXBzZWRdPVwiaXNHcm91cENvbGxhcHNlZChyb3dbX1JPV19HUk9VUF9LRVldKVwiICpuZ0lmPVwiaXNOb3JtYWxHcm91cFJvdyhyb3cpXCI+4oC6PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTm9ybWFsR3JvdXBSb3cocm93KVwiIGNsYXNzPVwiZ3JvdXAta2V5LWxhYmVsXCI+e3sgcm93W19ST1dfR1JPVVBfS0VZXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0dyb3VwUm93TG9hZGluZyhyb3cpXCIgY2xhc3M9XCJsYXp5LXNrZWxldG9uIGdyb3VwLWxhenkta2V5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzR3JvdXBSb3dUb29NYW55KHJvdylcIiBjbGFzcz1cImdyb3VwLXRvby1tYW55LWxhYmVsXCI+e3sgaTE4bi5ncm91cFRvb01hbnkocm93W19ST1dfR1JPVVBfQ09VTlRdKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1jb3VudC1iYWRnZVwiPnt7IHJvd1tfUk9XX0dST1VQX0NPVU5UXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXBhZ2luYXRpb25cIiAqbmdJZj1cIiFpc0dyb3VwQ29sbGFwc2VkKHJvd1tfUk9XX0dST1VQX0tFWV0pICYmIHJvd1tfUk9XX0dST1VQX1BBR0VfQ09VTlRdID4gMVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdyb3VwLXBhZ2UtYnRuXCIgW2Rpc2FibGVkXT1cInJvd1tfUk9XX0dST1VQX1BBR0VdID09PSAwXCIgKGNsaWNrKT1cImdyb3VwUGFnZUJhY2socm93W19ST1dfR1JPVVBfS0VZXSlcIj7igLk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXBhZ2UtaW5mb1wiPnt7IHJvd1tfUk9XX0dST1VQX1BBR0VdICsgMSB9fSAvIHt7IHJvd1tfUk9XX0dST1VQX1BBR0VfQ09VTlRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtcGFnZS1idG5cIiBbZGlzYWJsZWRdPVwicm93W19ST1dfR1JPVVBfUEFHRV0gPj0gcm93W19ST1dfR1JPVVBfUEFHRV9DT1VOVF0gLSAxXCIgKGNsaWNrKT1cImdyb3VwUGFnZUZvcndhcmQocm93W19ST1dfR1JPVVBfS0VZXSwgcm93W19ST1dfR1JPVVBfQ09VTlRdKVwiPuKAujwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogW19HUk9VUF9ST1dfQ09MVU1OXTsgd2hlbjogaXNHcm91cEhlYWRlclwiXG4gICAgICAgICAgICBjbGFzcz1cImdyb3VwLWhlYWRlci1yb3dcIlxuICAgICAgICAgICAgW2NsYXNzLmdyb3VwLWhlYWRlci1sb2FkaW5nXT1cImlzR3JvdXBSb3dMb2FkaW5nKHJvdylcIlxuICAgICAgICAgICAgW2NsYXNzLmdyb3VwLWhlYWRlci10b28tbWFueV09XCJpc0dyb3VwUm93VG9vTWFueShyb3cpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZ3JvdXAta2V5XT1cInJvd1tfUk9XX0dST1VQX0tFWV1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBIZWFkZXJDbGljayhyb3cpXCI+PC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1yb3cgbm8tZGF0YS1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBuby1kYXRhLWNlbGxcIiBbYXR0ci5jb2xzcGFuXT1cInJlbmRlcmVkQ29sdW1ucy5sZW5ndGhcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PjwhLS0gL3RhYmxlLWJvZHktc2Nyb2xsIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHktb3ZlcmxheVwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nIHx8IGlzRW1wdHlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWJsZS1ib2R5LW92ZXJsYXktdGV4dFwiPnt7IGVmZmVjdGl2ZUlzTG9hZGluZyA/IGxvYWRpbmdTdGF0ZUxhYmVsIDogZW1wdHlTdGF0ZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj48IS0tIC90YWJsZS1ib2R5LXdyYXBwZXIgLS0+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tYmFyXCIgW2NsYXNzLmlzLWxvYWRpbmddPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCIgKm5nSWY9XCJzaG93UGFnaW5hdGlvblwiPlxuICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgIFtsZW5ndGhdPVwidG90YWxSb3dzXCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgICBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwicmVzb2x2ZWRQYWdpbmF0aW9uU2hvd0ZpcnN0TGFzdEJ1dHRvbnNcIlxuICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdG9yLXJhbmdlLWxvYWRlclwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXJcIiAqbmdJZj1cImFjdGl2ZUdyb3VwQnlLZXlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXItbGVmdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1yZXNldC1idG5cIiAqbmdJZj1cIiFpc0RlZmF1bHRHcm91cEJ5QWN0aXZlXCIgKGNsaWNrKT1cIm9uR3JvdXBCeUNoYW5nZShudWxsKVwiPlxuICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImdyb3VwLXJlc2V0LWljb25cIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgOGE1IDUgMCAxIDAgNS01IDUgNSAwIDAgMC0zLjU0IDEuNDZMMyAzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAzdjIuNUg1LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICB7eyBpMThuLmdyb3VwUmVtb3ZlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1iYXItc2VwYXJhdG9yXCIgKm5nSWY9XCIhaXNEZWZhdWx0R3JvdXBCeUFjdGl2ZVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXNvcnQtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1zb3J0LWxhYmVsXCI+e3sgaTE4bi5ncm91cFNvcnRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1zb3J0LWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ3JvdXBTb3J0T3JkZXIgPT09ICdhc2MnXCIgKGNsaWNrKT1cIm9uR3JvdXBTb3J0VG9nZ2xlKCdhc2MnKVwiIFt0aXRsZV09XCJpMThuLmdyb3VwU29ydEFzY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1zb3J0LWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ3JvdXBTb3J0T3JkZXIgPT09ICdkZXNjJ1wiIChjbGljayk9XCJvbkdyb3VwU29ydFRvZ2dsZSgnZGVzYycpXCIgW3RpdGxlXT1cImkxOG4uZ3JvdXBTb3J0RGVzY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1sYWJlbFwiPnt7IGkxOG4uZ3JvdXBSb3dzUGVyR3JvdXAgfX08L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBjbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwUGFnZVNpemVcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uR3JvdXBQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwibWF0LW1kYy1wYWdpbmF0b3Itc2VsZWN0LXBhZ2Utc2l6ZSBncm91cC1wYWdlLXNpemUtcGFuZWxcIlxuICAgICAgICAgICAgICAgIFtwYW5lbFdpZHRoXT1cIidhdXRvJ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPnt7IGdyb3VwUGFnZVNpemUgPT09IDAgPyBpMThuLmdyb3VwU2hvd0FsbCA6IGdyb3VwUGFnZVNpemUgfX08L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIHBhZ2VTaXplT3B0aW9uc0dyb3VwQnlcIiBbdmFsdWVdPVwib3B0XCI+e3sgb3B0IH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIwXCI+e3sgaTE4bi5ncm91cFNob3dBbGwgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19
|
|
1562
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBbUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QixNQUFNLEVBQUUsU0FBUyxFQUE4QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDelEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBa0IsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixD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Q1ksa0JBQWtCO3NCQUEvQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDSSxhQUFhO3NCQUE1QyxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDUSxTQUFTO3NCQUE5QyxlQUFlO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlLCBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRQYWdpbmF0b3JJbnRsLCBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uUHJvdmlkZXIsIFRhYmxlRXhwb3J0Q29uZmlnLCBUYWJsZVByZWZlcmVuY2VzQ29uZmlnLCBUYWJsZVByb3ZpZGVyLCBUYWJsZVZpZXdDb25maWcgfSBmcm9tICcuLi9qcXVlcnktdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSnF0STE4biwgSlFUX0kxOE4sIEpRVF9JMThOX0RFRkFVTFRTIH0gZnJvbSAnLi4vanF0LWkxOG4udG9rZW4nO1xuaW1wb3J0IHsgSnF0Q2VsbERlZkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZS9qcXQtY2VsbC1kZWYuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNsaWNlQ29uZmlnLCBTbGljZVBhbmVsQ29tcG9uZW50LCBPcmdhbml6ZXJGYWNhZGUsIEdyb3VwQnlNYW5hZ2VyLCBMYXp5RmllbGRNYW5hZ2VyLCBPcmdhbml6ZXJDb25maWcsIE9yZ2FuaXplckJ1dHRvbkV2ZW50LCBPcmdhbml6ZXJTdGF0ZSB9IGZyb20gJ0BvbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXInO1xuaW1wb3J0IHsgZ2V0RnJlbmNoUGFnaW5hdG9ySW50bCwgaHVtYW5pemVLZXksIG5vcm1hbGl6ZUNlbGxWYWx1ZSB9IGZyb20gJy4vdGFibGUudXRpbHMnO1xuaW1wb3J0IHsgVGFibGVQcmVmZXJlbmNlc01hbmFnZXIgfSBmcm9tICcuL3RhYmxlLXByZWZlcmVuY2VzLm1hbmFnZXInO1xuaW1wb3J0IHsgRXhwb3J0TWFuYWdlciB9IGZyb20gJy4vZXhwb3J0Lm1hbmFnZXInO1xuaW1wb3J0IHtcbiAgR1JPVVBfUk9XX0NPTFVNTiwgR1JPVVBfSEVBREVSX01BUktFUixcbiAgR1JPVVBfS0VZX0xBWllfTE9BRElORywgR1JPVVBfS0VZX1RPT19NQU5ZLFxuICBST1dfUkFXX0tFWSwgUk9XX0lOREVYX0tFWSxcbiAgUk9XX0dST1VQX0tFWSwgUk9XX0dST1VQX0NPVU5ULCBST1dfR1JPVVBfUEFHRSwgUk9XX0dST1VQX1BBR0VfQ09VTlQsXG4gIExBWllfTE9BRElOR19WQUxVRSwgTEFaWV9FUlJPUl9WQUxVRSxcbn0gZnJvbSAnLi90YWJsZS5jb25zdGFudHMnO1xuaW1wb3J0IHsgT3JnYW5pemVyQnV0dG9uV3JhcHBlckNvbXBvbmVudCB9IGZyb20gJy4vb3JnYW5pemVyLWJ1dHRvbi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudCc7XG5cbi8qKiBDYWNoZSBpbnRlcm5lIGR1IGdyb3VwZW1lbnQg4oCUIGludmFsaWTDqSBkw6hzIHF1ZSBsZXMgZG9ubsOpZXMsIGxhIGNsw6kgb3UgbGVzIHBhcmFtw6h0cmVzIGRlIHRyaSBjaGFuZ2VudC4gKi9cbmludGVyZmFjZSBHcm91cEJ5Q2FjaGU8VD4ge1xuICByb3dzOiBUW107XG4gIGtleTogc3RyaW5nO1xuICBzb3J0T3JkZXI6ICdhc2MnIHwgJ2Rlc2MnO1xuICBzb3J0QWN0aXZlOiBzdHJpbmc7XG4gIHNvcnREaXI6IHN0cmluZztcbiAgb3JkZXI6IHN0cmluZ1tdO1xuICBtYXA6IE1hcDxzdHJpbmcsIFRbXT47XG59XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2pxdWVyeS10YWJsZScsXG4gIGltcG9ydHM6IFsgQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0VGFibGVNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0RGl2aWRlck1vZHVsZSwgTWF0UGFnaW5hdG9yTW9kdWxlLCBNYXRTb3J0TW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGUsIFNsaWNlUGFuZWxDb21wb25lbnQsIE9yZ2FuaXplckJ1dHRvbldyYXBwZXJDb21wb25lbnQgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0UGFnaW5hdG9ySW50bCwgdXNlRmFjdG9yeTogZ2V0RnJlbmNoUGFnaW5hdG9ySW50bCB9XSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCA9IGFueT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZz86IFRhYmxlUHJvdmlkZXI8VD47XG5cbiAgQElucHV0KCkgZGF0YVNvdXJjZT86IFRbXSB8IHsgZGF0YTogVFtdIH07XG4gIEBJbnB1dCgpIGRhdGE/OiBUW107XG4gIEBJbnB1dCgpIGRpc3BsYXllZENvbHVtbnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgY29sdW1uc0NvbmZpZz86IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXTtcblxuICAvKipcbiAgICogTW9kZSBIVE1MIDogYWN0aXZlIGV0IGNvbmZpZ3VyZSBsZSBwYW5uZWF1IFZpZXcgaW5kw6lwZW5kYW1tZW50IGR1IGBbY29uZmlnXWAuXG4gICAqIFByZW5kIGxlIGRlc3N1cyBzdXIgYGNvbmZpZy52aWV3YCBzaSBkw6lmaW5pLlxuICAgKiBFeGVtcGxlIDogYDxqcXVlcnktdGFibGUgW3ZpZXddPVwieyBlbmFibGVkOiB0cnVlIH1cIj5gXG4gICAqL1xuICBASW5wdXQoKSB2aWV3PzogVGFibGVWaWV3Q29uZmlnO1xuXG4gIEBJbnB1dCgpIGNvbHVtbkxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIEBJbnB1dCgpIGlzTG9hZGluZyA9IGZhbHNlO1xuXG4gIC8qKiBQYXJhbcOodHJlIGRlIGNvbnRyw7RsZSBwb3VyIHLDqWluaXRpYWxpc2VyIGJhcnJlIGRlIHJlY2hlcmNoZS4gKi9cbiAgQElucHV0KClcbiAgc2V0IGNsZWFyU2VhcmNoSW5wdXQodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XG4gICAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIGFkZFJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PigpO1xuICBAT3V0cHV0KCkgY29sdW1uUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcbiAgQE91dHB1dCgpIGNhdGVnb3J5U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKiDDiW1pcyDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSB0cmkgKHkgY29tcHJpcyBsZSB0cmkgaW5pdGlhbCkuICovXG4gIEBPdXRwdXQoKSBzb3J0Q2hhbmdlICAgID0gbmV3IEV2ZW50RW1pdHRlcjx7IGFjdGl2ZTogc3RyaW5nOyBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJycgfT4oKTtcbiAgLyoqIMOJbWlzIMOgIGNoYXF1ZSBjaGFuZ2VtZW50IGRlIHBhZ2Ugb3UgZGUgdGFpbGxlIGRlIHBhZ2UuICovXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlICAgID0gbmV3IEV2ZW50RW1pdHRlcjx7IHBhZ2VJbmRleDogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0+KCk7XG4gIC8qKiDDiW1pcyDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBsYSByZWNoZXJjaGUgdGV4dGUuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiDDiW1pcyBxdWFuZCBsZSBHcm91cCBieSBjaGFuZ2UgKGNsw6kgZGUgY29sb25uZSwgb3UgYG51bGxgIHNpIGTDqXNhY3RpdsOpKS4gKi9cbiAgQE91dHB1dCgpIGdyb3VwQnlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG4gIC8qKiDDiW1pcyBxdWFuZCBsYSBsaXN0ZSBkZXMgY29sb25uZXMgdmlzaWJsZXMgY2hhbmdlIChjbMOpcyBkYW5zIGzigJlvcmRyZSBk4oCZYWZmaWNoYWdlKS4gKi9cbiAgQE91dHB1dCgpIGNvbHVtbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKVxuICBzZXQgcGFnaW5hdG9yKHZhbHVlOiBNYXRQYWdpbmF0b3IgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYWdpbmF0b3IgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuYXR0YWNoUGFnaW5hdG9yKCk7XG4gICAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICAgIH1cbiAgfVxuICBnZXQgcGFnaW5hdG9yKCk6IE1hdFBhZ2luYXRvciB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9wYWdpbmF0b3I7IH1cbiAgcHJpdmF0ZSBfcGFnaW5hdG9yPzogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ/OiBNYXRTb3J0O1xuICBAVmlld0NoaWxkKCd0YWJsZUJvZHlTY3JvbGwnKSB0YWJsZUJvZHlTY3JvbGxSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChTbGljZVBhbmVsQ29tcG9uZW50KSBzbGljZVBhbmVsUmVmPzogU2xpY2VQYW5lbENvbXBvbmVudDxUPjtcbiAgQENvbnRlbnRDaGlsZHJlbihKcXRDZWxsRGVmRGlyZWN0aXZlKSBfY2VsbERlZnMhOiBRdWVyeUxpc3Q8SnF0Q2VsbERlZkRpcmVjdGl2ZT47XG4gIC8qKiBNYXAgY2zDqeKGklRlbXBsYXRlUmVmIHByw6ktY2FsY3Vsw6llIGRlcHVpcyBfY2VsbERlZnMuIE1pc2Ugw6Agam91ciBkYW5zIG5nQWZ0ZXJDb250ZW50SW5pdCBldCBzdXIgX2NlbGxEZWZzLmNoYW5nZXMuICovXG4gIHByaXZhdGUgX2NlbGxEZWZNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IGFueTsgaW5kZXg6IG51bWJlciB9Pj4oKTtcblxuICByZW5kZXJlZENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG5cbiAgLyoqIENvbnN0YW50ZSBleHBvc8OpZSBhdSB0ZW1wbGF0ZSBwb3VyIGxlIG1hdENvbHVtbkRlZiBkZSBsYSBsaWduZSBkZSBncm91cGUuICovXG4gIHJlYWRvbmx5IF9HUk9VUF9ST1dfQ09MVU1OID0gR1JPVVBfUk9XX0NPTFVNTjtcbiAgLyoqIENsw6lzIGQnYWNjw6hzIGF1eCBwcm9wcmnDqXTDqXMgZGVzIGxpZ25lcyBwcm9qZXTDqWVzIOKAlCBleHBvc8OpZXMgcG91ciBsZSB0ZW1wbGF0ZS4gKi9cbiAgcmVhZG9ubHkgX1JPV19SQVdfS0VZID0gUk9XX1JBV19LRVk7XG4gIHJlYWRvbmx5IF9ST1dfSU5ERVhfS0VZID0gUk9XX0lOREVYX0tFWTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9LRVkgPSBST1dfR1JPVVBfS0VZO1xuICByZWFkb25seSBfUk9XX0dST1VQX0NPVU5UID0gUk9XX0dST1VQX0NPVU5UO1xuICByZWFkb25seSBfUk9XX0dST1VQX1BBR0UgPSBST1dfR1JPVVBfUEFHRTtcbiAgcmVhZG9ubHkgX1JPV19HUk9VUF9QQUdFX0NPVU5UID0gUk9XX0dST1VQX1BBR0VfQ09VTlQ7XG5cbiAgLyoqIEZhY2FkZSBWaWV3IDogw6l0YXQgZXQgYWN0aW9ucyBjZW50cmFsaXPDqXMgKENoYW1wcyAvIEdyb3VwIGJ5IC8gU2xpY2UgYnkpICovXG4gIHJlYWRvbmx5IF9vcmdhbml6ZXIgPSBuZXcgT3JnYW5pemVyRmFjYWRlPFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4+KCk7XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IHN0YWJsZSBzeW5jaHJvbmlzw6kgZGVwdWlzIF9vcmdhbml6ZXIuZmllbGRzLmFjdGl2ZUZpZWxkcyBkYW5zIHJlZnJlc2hWaWV3TW9kZWwoKS5cbiAgICogUHJvcHJpw6l0w6kgKG5vbiBnZXR0ZXIpIHBvdXIgcXUnQW5ndWxhciBwdWlzc2UgbGEgc3VpdnJlIHNhbnMgTkcwMTAwLlxuICAgKi9cbiAgYWN0aXZlRmllbGRzOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10gPSBbXTtcblxuICBhY3RpdmVTbGljZUZpbHRlcjogKHJvdzogVCkgPT4gYm9vbGVhbiA9ICgpID0+IHRydWU7XG5cbiAgLy8gUHJvcHJpw6l0w6lzIHN0YWJsZXMgcG91ciBsZXMgYmluZGluZ3MgZHUgdGVtcGxhdGUgKGNvbnRyZSBlcnJldXIgTkcwMTAwKVxuICBfc2xpY2VDb25maWdzOiBhbnlbXSA9IFtdO1xuICBfc2xpY2VDb2x1bW5zOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10gPSBbXTtcbiAgX3NsaWNlRGF0YTogVFtdID0gW107XG4gIF9zbGljZVNob3dUb2dnbGUgPSB0cnVlO1xuICAvKiogU25hcHNob3Qgc3RhYmxlIGRlIGxhIHZpc2liaWxpdMOpIGR1IHBhbm5lYXUgc2xpY2Ug4oCUIGphbWFpcyBjYWxjdWzDqSBkZXB1aXMgQFZpZXdDaGlsZCAqL1xuICBfc2hvd1NsaWNlUGFuZWwgPSBmYWxzZTtcbiAgLyoqIFNuYXBzaG90IHN0YWJsZSBkZSBsJ8OpdGF0IGNvbGxhcHNlZCBkdSBwYW5uZWF1IHNsaWNlLCBtaXMgw6Agam91ciB2aWEgKGNvbGxhcHNlZENoYW5nZSkgKi9cbiAgX3NsaWNlUGFuZWxDb2xsYXBzZWQgPSBmYWxzZTtcblxuICAvLyBEw6lsw6lndcOpcyB2ZXJzIF92aWV3IChjb25zZXJ2w6lzIHBvdXIgY29tcGF0aWJpbGl0w6kgdGVtcGxhdGUgc2FucyByZWZhY3RvcmluZyBIVE1MKVxuICBnZXQgX3N0YXRpY1NsaWNlc0Zvck1lbnUoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgaWNvbj86IHN0cmluZyB9PiB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc3RhdGljU2xpY2VzRm9yTWVudTsgfVxuICBnZXQgX2FjdGl2ZUR5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmFjdGl2ZUR5bmFtaWNGaWVsZHM7IH1cbiAgZ2V0IF9hdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc2xpY2VCeS5hdmFpbGFibGVGb3JEeW5hbWljOyB9XG4gIGdldCBfYWxsRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWxsRHluYW1pY0ZpZWxkczsgfVxuICBnZXQgX2FjdGl2ZVNsaWNlQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlTGFiZWw7IH1cbiAgX3NsaWNlQnlNZW51SXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG5cbiAgc2VhcmNoUXVlcnkgPSAnJztcbiAgZ2V0IGFjdGl2ZUdyb3VwQnlLZXkoKTogc3RyaW5nIHwgbnVsbCB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuZ3JvdXBCeS5hY3RpdmVLZXk7IH1cbiAgX21hdFNvcnRBY3RpdmUgPSAnJztcbiAgX21hdFNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJycgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aXZlU29ydDogeyBhY3RpdmU6IHN0cmluZzsgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8ICcnIH0gPSB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgfTtcbiAgcHJpdmF0ZSBfc29ydFN1YnNjcmliZWQ6IE1hdFNvcnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF90b3RhbEZpbHRlcmVkQ291bnQgPSAwO1xuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZHUgbW9kZSBHcm91cCBCeSAow6l0YXQgY29sbGFwc2VkLCBwYWdpbmF0aW9uLCB0cmkgZGVzIGdyb3VwZXMpLiAqL1xuICByZWFkb25seSBfZ3JvdXBCeSA9IG5ldyBHcm91cEJ5TWFuYWdlcihcbiAgICAoKSA9PiB7IHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpOyB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7IH0sXG4gICAgKCkgPT4gdGhpcy5yZWZyZXNoVmlld01vZGVsKCksXG4gICk7XG5cbiAgLyoqIETDqWzDqWd1w6lzIHZlcnMgR3JvdXBCeU1hbmFnZXIgcG91ciBsYSBjb21wYXRpYmlsaXTDqSBkZXMgdGVtcGxhdGVzLiAqL1xuICBnZXQgZ3JvdXBQYWdlU2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFBhZ2VTaXplOyB9XG4gIHNldCBncm91cFBhZ2VTaXplKHY6IG51bWJlcikgeyB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB2OyB9XG4gIGdldCBncm91cFNvcnRPcmRlcigpOiAnYXNjJyB8ICdkZXNjJyB7IHJldHVybiB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyOyB9XG4gIHNldCBncm91cFNvcnRPcmRlcih2OiAnYXNjJyB8ICdkZXNjJykgeyB0aGlzLl9ncm91cEJ5Lmdyb3VwU29ydE9yZGVyID0gdjsgfVxuXG4gIC8qKiBHZXN0aW9ubmFpcmUgZHUgY3ljbGUgZGUgdmllIGRlcyBjb2xvbm5lcyBsYXp5IChmZXRjaCwgYW5udWxhdGlvbiwgc3RhdHV0cywgZG9ubsOpZXMpLiAqL1xuICBwcml2YXRlIF9sYXp5ID0gbmV3IExhenlGaWVsZE1hbmFnZXI8VGFibGVDb2x1bW5Qcm92aWRlcjxUPj4oKTtcbiAgLyoqIENvbXBhdGliaWxpdMOpIHRlbXBsYXRlIDogcmV0b3VybmUgbGEgbWFwIGRlIHN0YXR1dHMgbGF6eS4gKi9cbiAgZ2V0IF9sYXp5Q29sdW1uU3RhdHVzKCkgeyByZXR1cm4gdGhpcy5fbGF6eS5zdGF0dXM7IH1cbiAgLyoqIENvbXBhdGliaWxpdMOpIHRlbXBsYXRlIDogcmV0b3VybmUgbGEgbWFwIGRlIGRvbm7DqWVzIGxhenkuICovXG4gIGdldCBfbGF6eUNvbHVtbkRhdGEoKSB7IHJldHVybiB0aGlzLl9sYXp5LmRhdGE7IH1cbiAgcHJpdmF0ZSBfY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfZWwgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuICBwcml2YXRlIF9uZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBfaTE4blJhdyA9IGluamVjdChKUVRfSTE4TiwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKiogTGFiZWxzIGRlIGzigJlpbnRlcmZhY2UuIEZ1c2lvbm7DqXMgZGVwdWlzIEpRVF9JMThOX0RFRkFVTFRTIGV0IGxlIHRva2VuIEpRVF9JMThOIGluamVjdMOpLiAqL1xuICByZWFkb25seSBpMThuOiBKcXRJMThuID0geyAuLi5KUVRfSTE4Tl9ERUZBVUxUUywgLi4uKHRoaXMuX2kxOG5SYXcgPz8ge30pIH07XG5cbiAgaXNHcm91cEhlYWRlciA9IChfOiBudW1iZXIsIHJvdzogYW55KTogYm9vbGVhbiA9PiByb3dbR1JPVVBfSEVBREVSX01BUktFUl0gPT09IHRydWU7XG5cbiAgLyoqIFJldG91cm5lIHRydWUgc2kgbGEgbGlnbmUgZGUgZ3JvdXBlIGVzdCB1bmUgbGlnbmUgbm9ybWFsZSAobmkgbGF6eSwgbmkgdG9vLW1hbnkpLiAqL1xuICBpc05vcm1hbEdyb3VwUm93KHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJvd1tST1dfR1JPVVBfS0VZXSAhPT0gR1JPVVBfS0VZX0xBWllfTE9BRElORyAmJiByb3dbUk9XX0dST1VQX0tFWV0gIT09IEdST1VQX0tFWV9UT09fTUFOWTtcbiAgfVxuICBpc0dyb3VwUm93TG9hZGluZyhyb3c6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gcm93W1JPV19HUk9VUF9LRVldID09PSBHUk9VUF9LRVlfTEFaWV9MT0FESU5HOyB9XG4gIGlzR3JvdXBSb3dUb29NYW55KHJvdzogYW55KTogYm9vbGVhbiB7IHJldHVybiByb3dbUk9XX0dST1VQX0tFWV0gPT09IEdST1VQX0tFWV9UT09fTUFOWTsgfVxuXG4gIC8qKiBHw6hyZSBsZSBjbGljIHN1ciB1bmUgbGlnbmUgZCdlbi10w6p0ZSBkZSBncm91cGUgKG5vLW9wIHBvdXIgbGVzIMOpdGF0cyBzcMOpY2lhdXgpLiAqL1xuICBvbkdyb3VwSGVhZGVyQ2xpY2socm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNOb3JtYWxHcm91cFJvdyhyb3cpKSByZXR1cm47XG4gICAgdGhpcy50b2dnbGVHcm91cENvbGxhcHNlKHJvd1tST1dfR1JPVVBfS0VZXSk7XG4gIH1cblxuICAvKiogR2VzdGlvbm5haXJlIGV4cG9ydCBDU1YuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4cG9ydCA9IG5ldyBFeHBvcnRNYW5hZ2VyPFQ+KFxuICAgICgpID0+IHRoaXMuX2FsbEZpbHRlcmVkUm93cyxcbiAgICAoKSA9PiB0aGlzLmFjdGl2ZUZpZWxkcyxcbiAgICAoKSA9PiB0aGlzLnJlc29sdmVkQ29uZmlnLmV4cG9ydCxcbiAgICAoY29sLCByb3csIGlkeCkgPT4gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpZHgpLFxuICApO1xuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGVcblxuICBwYWdlU2l6ZSA9IDU7XG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcbiAgcGFnZVNpemVPcHRpb25zR3JvdXBCeTogbnVtYmVyW10gPSBbNSwgMTAsIDIwXTtcblxuICBkcmFnZ2VkQ29sdW1uS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZHJhZ092ZXJDb2x1bW5LZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIOKUgOKUgCBNb2RlIMOpZGl0aW9uIChQcsOpZsOpcmVuY2VzKVxuICAvKiogVnJhaSBxdWFuZCBsZSBtb2RlIMOpZGl0aW9uIGVzdCBhY3RpZiAocmVzaXplICsgZHJhZyBjb2xvbm5lcywgaW50ZXJhY3Rpb25zIGTDqXNhY3RpdsOpZXMpLiAqL1xuICBfZWRpdE1vZGUgPSBmYWxzZTtcbiAgLyoqIExhcmdldXJzIGRlIGNvbG9ubmVzIHBlcnNvbm5hbGlzw6llcyBwYXIgbCd1dGlsaXNhdGV1ciAoY2zDqSDihpIgcHgpLiAqL1xuICBfY29sdW1uV2lkdGhzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gIC8qKiBNZXNzYWdlIGRlIGZlZWRiYWNrIGFwcsOocyBzYXZlL2NsZWFyLiBgbnVsbGAgPSBwYXMgZGUgbWVzc2FnZS4gKi9cbiAgX3ByZWZlcmVuY2VzTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWcmFpIHNpIHVuZSBjb25maWd1cmF0aW9uIGVzdCBzYXV2ZWdhcmTDqWUgcG91ciBjZSB0YWJsZWF1LiAqL1xuICBfaGFzU2F2ZWRDb25maWcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcHJlZmVyZW5jZXNNYW5hZ2VyOiBUYWJsZVByZWZlcmVuY2VzTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKiogdHJ1ZSB1bmUgZm9pcyBxdWUgbGUgZ3JvdXAtYnkgcGFyIGTDqWZhdXQgYSDDqXTDqSBpbml0aWFsaXPDqSAow6l2aXRlIGRlIHJlY29uZmlndXJlciBHcm91cEJ5TWFuYWdlciDDoCBjaGFxdWUgY2hhbmdlbWVudCBkZSBkb25uw6llcykuICovXG4gIHByaXZhdGUgX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXNpemVTdGF0ZTogeyBrZXk6IHN0cmluZzsgc3RhcnRYOiBudW1iZXI7IHN0YXJ0V2lkdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEeW5hbWljIHNsaWNlIGtleXMgw6AgcmVzdGF1cmVyIGFwcsOocyBuZ0FmdGVyVmlld0luaXQgKHNsaWNlUGFuZWxSZWYgcGFzIGVuY29yZSBkaXNwbykuICovXG4gIHByaXZhdGUgX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogRmlsdHJlcyBkZSBzbGljZSDDoCByZXN0YXVyZXIgYXByw6hzIG5nQWZ0ZXJWaWV3SW5pdCAoc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvKS4gKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1NsaWNlRmlsdGVyczogUmVjb3JkPG51bWJlciwgc3RyaW5nW10+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZXNvbHZlZENvbmZpZzogVGFibGVQcm92aWRlcjxUPiA9IHsgY29sdW1uczogW10gfTtcbiAgcHJpdmF0ZSBfY29sdW1uTWFwOiBNYXA8c3RyaW5nLCBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfcmVzb2x2ZWREYXRhOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSBfcHJlc2VydmVQYWdlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9sYXN0Q29uZmlnQ2xlYXJTZWFyY2hJbnB1dDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLy8gU2V1aWwgYXUtZGVsw6AgZHVxdWVsIGxlIHJlbmR1IGdyb3Vww6kgZXN0IGJsb3F1w6kgcG91ciBwcm90w6lnZXIgbGUgbmF2aWdhdGV1clxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfR1JPVVBfQ09VTlQgPSA1MDA7XG5cbiAgLy8g4pSA4pSAIE9wdGltaXNhdGlvbiBwZXJmb3JtYW5jZVxuICBwcml2YXRlIF9hbGxGaWx0ZXJlZFJvd3M6IFRbXSA9IFtdO1xuICBwcml2YXRlIF9wYWdpbmF0b3JTdWJzY3JpYmVkOiBNYXRQYWdpbmF0b3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogQ2FjaGUgZ3JvdXBCeSDigJQgaW52YWxpZMOpIGTDqHMgcXVlIHJvd3Mva2V5L3RyaSBjaGFuZ2VudC4gKi9cbiAgcHJpdmF0ZSBfZ3JvdXBDYWNoZTogR3JvdXBCeUNhY2hlPFQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdSZW5kZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfc3RhdGljU2xpY2VIaWRkZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2NvbmZpZ0hpZGRlbktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuXG4gIC8qKiBDbMOpcyBkZXMgY29sb25uZXMgdmlzaWJsZXMgZHUgZGVybmllciDDqW1pc3Npb24gY29sdW1uc0NoYW5nZSAocG91ciDDqXZpdGVyIGxlcyDDqW1pc3Npb25zIGR1cGxpcXVlbWVudCkuICovXG4gIHByaXZhdGUgX3ByZXZDb2x1bW5LZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhQ2hhbmdlZCA9ICEhKGNoYW5nZXNbJ2NvbmZpZyddIHx8IGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydkYXRhU291cmNlJ10pO1xuICAgIGlmIChkYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fbGF6eS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVmlld01vZGVsKCk7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLmFwcGx5Q29uZmlnU2VhcmNoUmVzZXQoKTtcbiAgICAgIHRoaXMuYXBwbHlJbml0aWFsU2VhcmNoUXVlcnkoKTtcbiAgICAgIHRoaXMuX2ludmFsaWRhdGVPcmdhbml6ZXJDb25maWcoKTsgLy8gbGVzIGNvbG9ubmVzIG9udCBwdSBjaGFuZ2VyXG4gICAgfVxuICAgIGlmIChkYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5hY3RpdmVGaWVsZHMuZmlsdGVyKGMgPT4gYy5sYXp5KS5mb3JFYWNoKGMgPT4gdGhpcy50cmlnZ2VyTGF6eUZldGNoKGMpKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVidWlsZENlbGxEZWZNYXAoKTtcbiAgICB0aGlzLl9jZWxsRGVmcy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX3JlYnVpbGRDZWxsRGVmTWFwKCk7XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hQYWdpbmF0b3IoKTtcbiAgICB0aGlzLmF0dGFjaFNvcnQoKTtcbiAgICB0aGlzLl9tZWFzdXJlSGVhZGVySGVpZ2h0KCk7XG4gICAgdGhpcy5fYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cygpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNQZW5kaW5nRHluYW1pYyA9ICEhdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXM7XG4gICAgY29uc3QgaGFzUGVuZGluZ0ZpbHRlcnMgPSAhIXRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnM7XG4gICAgaWYgKCFoYXNQZW5kaW5nRHluYW1pYyAmJiAhaGFzUGVuZGluZ0ZpbHRlcnMpIHJldHVybjtcblxuICAgIGNvbnN0IGFsbENvbHMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgY29uc3Qga2V5cyA9IGhhc1BlbmRpbmdEeW5hbWljID8gWy4uLnRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzIV0gOiBbXTtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA/IHsgLi4udGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyB9IDogbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9yZXNvbHZlZERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2xpY2VSZXN0b3JlXSBuZ0FmdGVyVmlld0luaXQ6IGRvbm7DqWVzIGFic2VudGVzLCByZXN0YXVyYXRpb24gZGlmZsOpcsOpZSDDoCBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwnLCB7IGtleXMsIGZpbHRlcnMgfSk7XG4gICAgICAgIGlmIChmaWx0ZXJzKSB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBbLi4ua2V5c107XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCdbU2xpY2VSZXN0b3JlXSBuZ0FmdGVyVmlld0luaXQ6IGRvbm7DqWVzIHByw6lzZW50ZXMsIGFwcGxpY2F0aW9uIGltbcOpZGlhdGUnLCB7IGtleXMsIGZpbHRlcnMgfSk7XG4gICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29sID0gYWxsQ29scy5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgIGlmIChjb2wpIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChmaWx0ZXJzICYmIHRoaXMuc2xpY2VQYW5lbFJlZikge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NsaWNlUmVzdG9yZV0gcmVzdG9yZUZpbHRlcnMgZGVwdWlzIG5nQWZ0ZXJWaWV3SW5pdCcsIGZpbHRlcnMpO1xuICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoZmlsdGVycyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ1JlbmRlciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3BlbmRpbmdSZW5kZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcHJlZmVyZW5jZXNNZXNzYWdlVGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wcmVmZXJlbmNlc01lc3NhZ2VUaW1lcik7XG4gICAgfVxuICAgIC8vIE5ldHRvaWUgdW4gw6l2ZW50dWVsIHJlc2l6ZSBlbiBjb3VycyAobGlzdGVuZXJzIHdpbmRvdyBub24gcmV0aXLDqXMpXG4gICAgdGhpcy5fcmVzaXplU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29yZ2FuaXplci5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIF9tZWFzdXJlSGVhZGVySGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1lYXN1cmUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RyLm1hdC1tZGMtaGVhZGVyLXJvdycpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKGhlYWRlclJvdykge1xuICAgICAgICBjb25zdCBoID0gaGVhZGVyUm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgaWYgKGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hY3R1YWwtaGVhZGVyLWhlaWdodCcsIGggKyAncHgnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEhlYWRlciBwYXMgZW5jb3JlIHJlbmR1IChleDogbGF6eSBBbmd1bGFyIE1hdGVyaWFsKSwgb24gcsOpZXNzYWllIGFwcsOocyBsZSBwcm9jaGFpbiBmcmFtZVxuICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBtZWFzdXJlKCkpKTtcbiAgICB9O1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbWVhc3VyZSgpKSk7XG4gIH1cblxuICBwcml2YXRlIF9vcmdhbml6ZXJDb25maWdDYWNoZTogT3JnYW5pemVyQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2ludmFsaWRhdGVPcmdhbml6ZXJDb25maWcoKTogdm9pZCB7IHRoaXMuX29yZ2FuaXplckNvbmZpZ0NhY2hlID0gbnVsbDsgfVxuICBnZXQgb3JnYW5pemVyQ29uZmlnKCk6IE9yZ2FuaXplckNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX29yZ2FuaXplckNvbmZpZ0NhY2hlKSByZXR1cm4gdGhpcy5fb3JnYW5pemVyQ29uZmlnQ2FjaGU7XG4gICAgY29uc3QgYWxsQ29scyA9IFsuLi50aGlzLl9vcmdhbml6ZXIubWVudUJhc2VGaWVsZHMsIC4uLnRoaXMuX29yZ2FuaXplci5tZW51T3B0aW9uYWxGaWVsZHNdO1xuICAgIHRoaXMuX29yZ2FuaXplckNvbmZpZ0NhY2hlID0ge1xuICAgICAgZmllbGRzOiB0aGlzLl9vcmdhbml6ZXIuc2hvd0ZpZWxkcyA/IGFsbENvbHMubWFwKGMgPT4gKHtcbiAgICAgICAgaWQ6IGMua2V5LFxuICAgICAgICBsYWJlbDogdGhpcy5jb2xMYWJlbChjKSxcbiAgICAgICAgaWNvbjogYy5pY29uLFxuICAgICAgICBzdGF0ZTogJ3JlYWR5JyBhcyBjb25zdCxcbiAgICAgIH0pKSA6IHVuZGVmaW5lZCxcbiAgICAgIGdyb3VwczogdGhpcy5fb3JnYW5pemVyLnNob3dHcm91cEJ5U2VjdGlvbiA/IHRoaXMuX29yZ2FuaXplci5ncm91cEJ5RmllbGRzLm1hcChjID0+ICh7XG4gICAgICAgIGlkOiBjLmtleSxcbiAgICAgICAgbGFiZWw6IHRoaXMuY29sTGFiZWwoYyksXG4gICAgICAgIGljb246IGMuaWNvbixcbiAgICAgIH0pKSA6IHVuZGVmaW5lZCxcbiAgICAgIHNsaWNlczogdGhpcy5fb3JnYW5pemVyLnNob3dTbGljZUJ5U2VjdGlvbiA/IHRoaXMuX3NsaWNlQnlNZW51SXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgaWQ6IGl0ZW0ua2V5LFxuICAgICAgICBsYWJlbDogaXRlbS50aXRsZSxcbiAgICAgICAgaWNvbjogaXRlbS5pY29uLFxuICAgICAgfSkpIDogdW5kZWZpbmVkLFxuICAgICAgc2hvd0V4cG9ydDogdGhpcy5zaG93RXhwb3J0QnV0dG9uLFxuICAgICAgb25FeHBvcnQ6ICgpID0+IHRoaXMub25FeHBvcnQoKSxcbiAgICAgIHNob3dQcmVmZXJlbmNlczogdGhpcy5zaG93UHJlZmVyZW5jZXNNZW51LFxuICAgICAgaGFzU2F2ZWRQcmVmZXJlbmNlczogdGhpcy5oYXNTYXZlZFByZWZlcmVuY2VzLFxuICAgICAgb25QcmVmZXJlbmNlc0VkaXQ6ICgpID0+IHRoaXMuZW50ZXJFZGl0TW9kZSgpLFxuICAgICAgb25QcmVmZXJlbmNlc1NhdmU6ICgpID0+IHRoaXMuc2F2ZVByZWZlcmVuY2VzKCksXG4gICAgICBvblByZWZlcmVuY2VzQ2xlYXI6ICgpID0+IHRoaXMuY2xlYXJQcmVmZXJlbmNlcygpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplckNvbmZpZ0NhY2hlO1xuICB9XG5cbiAgZ2V0IG9yZ2FuaXplclN0YXRlKCk6IE9yZ2FuaXplclN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZUZpZWxkczogdGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoYyA9PiBjLmtleSksXG4gICAgICBzZWxlY3RlZEdyb3VwQnk6IHRoaXMuYWN0aXZlR3JvdXBCeUtleSA/PyB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZFNsaWNlczogdGhpcy5fc2xpY2VCeU1lbnVJdGVtc1xuICAgICAgICAuZmlsdGVyKGkgPT4gdGhpcy5pc1NsaWNlTWVudUl0ZW1BY3RpdmUoaSkpXG4gICAgICAgIC5tYXAoaSA9PiBpLmtleSksXG4gICAgfTtcbiAgfVxuXG4gIG9uT3JnYW5pemVyVmlld0NoYW5nZShldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2ZpZWxkVG9nZ2xlZCcpIHtcbiAgICAgIGNvbnN0IGFsbENvbHMgPSBbLi4udGhpcy5fb3JnYW5pemVyLm1lbnVCYXNlRmllbGRzLCAuLi50aGlzLl9vcmdhbml6ZXIubWVudU9wdGlvbmFsRmllbGRzXTtcbiAgICAgIGNvbnN0IG5ld1Zpc2libGUgPSBuZXcgU2V0KGV2ZW50LnN0YXRlLnZpc2libGVGaWVsZHMgPz8gW10pO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgYWxsQ29scykge1xuICAgICAgICBjb25zdCBpc05vd1Zpc2libGUgPSBuZXdWaXNpYmxlLmhhcyhjb2wua2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNDb2x1bW5WaXNpYmxlKGNvbC5rZXkpICE9PSBpc05vd1Zpc2libGUpIHtcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZShjb2wsIGlzTm93VmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09ICdncm91cEJ5U2VsZWN0ZWQnKSB7XG4gICAgICBjb25zdCBuZXdLZXkgPSBldmVudC5zdGF0ZS5zZWxlY3RlZEdyb3VwQnkgPz8gbnVsbDtcbiAgICAgIHRoaXMub25Hcm91cEJ5Q2hhbmdlKG5ld0tleSA9PT0gdGhpcy5hY3RpdmVHcm91cEJ5S2V5ID8gbnVsbCA6IG5ld0tleSk7XG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAnc2xpY2VTZWxlY3RlZCcpIHtcbiAgICAgIGNvbnN0IHByZXZTbGljZXMgPSBuZXcgU2V0KHRoaXMub3JnYW5pemVyU3RhdGUuc2VsZWN0ZWRTbGljZXMgPz8gW10pO1xuICAgICAgY29uc3QgY2xpY2tlZElkID0gKGV2ZW50LnN0YXRlLnNlbGVjdGVkU2xpY2VzID8/IFtdKS5maW5kKGlkID0+ICFwcmV2U2xpY2VzLmhhcyhpZCkpO1xuICAgICAgaWYgKGNsaWNrZWRJZCkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fc2xpY2VCeU1lbnVJdGVtcy5maW5kKGkgPT4gaS5rZXkgPT09IGNsaWNrZWRJZCk7XG4gICAgICAgIGlmIChpdGVtKSB0aGlzLm9uU2xpY2VNZW51SXRlbUNsaWNrKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy50aXRsZSA/PyAnJztcbiAgfVxuXG4gIGdldCBzaG93VGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlZENvbmZpZy50aXRsZTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpZWxkcztcbiAgfVxuXG4gIGdldCBzaG93U2VhcmNoQmFyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5zZWFyY2g/LmVuYWJsZWQgPT09IHRydWU7IH1cbiAgZ2V0IHNob3dWaWV3QnV0dG9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmVuYWJsZWQgfHwgdGhpcy5zaG93RXhwb3J0QnV0dG9uIHx8IHRoaXMuc2hvd1ByZWZlcmVuY2VzTWVudTsgfVxuICBnZXQgc2hvd09yZ2FuaXplckJ1dHRvbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5lbmFibGVkIHx8IHRoaXMuc2hvd0V4cG9ydEJ1dHRvbiB8fCB0aGlzLnNob3dQcmVmZXJlbmNlc01lbnU7IH1cbiAgZ2V0IHNob3dTbGljZUV4cGFuZEJ0bigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgJiYgdGhpcy5fc2xpY2VTaG93VG9nZ2xlOyB9XG4gIGdldCBzaG93RXhwb3J0QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmV4cG9ydD8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuICBnZXQgc2hvd1ByZWZlcmVuY2VzTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5wcmVmZXJlbmNlcz8uZW5hYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBpc0RlZmF1bHRHcm91cEJ5QWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hY3RpdmVHcm91cEJ5S2V5KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXBCeUtleSA9PT0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0R3JvdXBCeTtcbiAgfVxuXG4gIGdldCBoYXNTYXZlZFByZWZlcmVuY2VzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faGFzU2F2ZWRDb25maWc7IH1cblxuICBnZXQgc2hvd1Rvb2xiYXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnNob3dTZWFyY2hCYXIgfHwgdGhpcy5zaG93Vmlld0J1dHRvbiB8fCB0aGlzLnNob3dTbGljZUV4cGFuZEJ0bjsgfVxuXG4gIGV4cGFuZFNsaWNlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBhbmVsUmVmPy50b2dnbGVQYW5lbCgpO1xuICB9XG4gIGdldCBzaG93RmllbGRzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNob3dGaWVsZHM7IH1cbiAgZ2V0IHNob3dHcm91cEJ5U2VjdGlvbigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zaG93R3JvdXBCeVNlY3Rpb247IH1cblxuICBnZXQgZmlsdGVyZWRSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXkgPyB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgOiB0aGlzLl9hbGxGaWx0ZXJlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUdyb3VwQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmFjdGl2ZUdyb3VwQnlMYWJlbDsgfVxuXG4gIGdldCB0b3RhbENvbHVtbkNvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIudG90YWxGaWVsZENvdW50OyB9XG5cbiAgZ2V0IGFjdGl2ZVNsaWNlQnlMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlTGFiZWw7IH1cblxuICBnZXQgYWN0aXZlRHluYW1pY1NsaWNlQ29sdW1ucygpOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10geyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlRHluYW1pY0ZpZWxkczsgfVxuXG4gIHJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBhbmVsUmVmPy5yZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXkpO1xuICB9XG5cbiAgZ2V0IGdyb3VwQnlDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7IHJldHVybiB0aGlzLl9vcmdhbml6ZXIuZ3JvdXBCeUZpZWxkczsgfVxuXG4gIGNvbExhYmVsKGNvbDogeyBrZXk6IHN0cmluZzsgaGVhZGVyPzogc3RyaW5nIH0pOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmZpZWxkTGFiZWwoY29sKTsgfVxuXG4gIG9uU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFF1ZXJ5KTtcbiAgfVxuXG4gIG9uR3JvdXBCeUNoYW5nZShrZXk6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9vcmdhbml6ZXIuc2V0R3JvdXBCeShrZXkpO1xuICAgIHRoaXMuX2dyb3VwQnkuc2V0RGVmYXVsdENvbGxhcHNlZChrZXkgIT09IG51bGwpO1xuICAgIHRoaXMuX2dyb3VwQnkucmVzZXQoKTtcbiAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIHRoaXMucmVmcmVzaFZpZXdNb2RlbCgpO1xuICAgIHRoaXMucGFnaW5hdG9yPy5maXJzdFBhZ2UoKTtcbiAgICB0aGlzLmdyb3VwQnlDaGFuZ2UuZW1pdChrZXkpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIGNvbnN0IGNvbERlZiA9ICh0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICAgIGlmIChjb2xEZWY/LmxhenkgJiYgdGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoa2V5KSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbERlZik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50YWJsZUJvZHlTY3JvbGxSZWY/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgIH0sIDApKTtcbiAgICB9XG4gIH1cblxuICBvbkdyb3VwUGFnZVNpemVDaGFuZ2Uoc2l6ZTogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBCeS5vbkdyb3VwUGFnZVNpemVDaGFuZ2UoTnVtYmVyKHNpemUpKTtcbiAgfVxuXG4gIG9uR3JvdXBTb3J0VG9nZ2xlKGRpcjogJ2FzYycgfCAnZGVzYycpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5Lm9uR3JvdXBTb3J0VG9nZ2xlKGRpciwgKGtleSkgPT4ge1xuICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0dyb3VwSGVhZGVyKGtleSksIDApKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldExhenlDb2x1bW5TdGF0dXMoa2V5OiBzdHJpbmcpOiAnaWRsZScgfCAnbG9hZGluZycgfCAnbG9hZGVkJyB8ICdlcnJvcicge1xuICAgIHJldHVybiB0aGlzLl9sYXp5LmdldFN0YXR1cyhrZXkpO1xuICB9XG5cbiAgZ2V0TGF6eVJlbmRlclR5cGUocm93VmFsdWU6IGFueSk6ICdsb2FkaW5nJyB8ICdlcnJvcicgfCAndmFsdWUnIHtcbiAgICByZXR1cm4gdGhpcy5fbGF6eS5nZXRSZW5kZXJUeXBlKHJvd1ZhbHVlKTtcbiAgfVxuXG4gIHJldHJ5TGF6eUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiB2b2lkIHtcbiAgICB0aGlzLl9sYXp5LnJldHJ5KGNvbHVtbiwgdGhpcy5fcmVzb2x2ZWREYXRhLCB0aGlzLl9sYXp5Q2FsbGJhY2tzKCkpO1xuICB9XG5cbiAgdHJpZ2dlckxhenlGZXRjaChjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiB2b2lkIHtcbiAgICB0aGlzLl9sYXp5LmZldGNoKGNvbHVtbiwgdGhpcy5fcmVzb2x2ZWREYXRhLCB0aGlzLl9sYXp5Q2FsbGJhY2tzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGF6eUNhbGxiYWNrcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25SZWZyZXNoOiAoKSA9PiB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKSxcbiAgICAgIG9uTWFya0ZvckNoZWNrOiAoKSA9PiB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCksXG4gICAgfTtcbiAgfVxuXG4gIHRvZ2dsZUdyb3VwQ29sbGFwc2UoZ3JvdXBLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2dyb3VwQnkudG9nZ2xlR3JvdXBDb2xsYXBzZShncm91cEtleSwgKGtleSkgPT4ge1xuICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0dyb3VwSGVhZGVyKGtleSksIDApKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Hcm91cEhlYWRlcihncm91cEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy50YWJsZUJvZHlTY3JvbGxSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCByb3cgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYHRyW2RhdGEtZ3JvdXAta2V5PVwiJHtDU1MuZXNjYXBlKGdyb3VwS2V5KX1cIl1gKTtcbiAgICBpZiAoIXJvdykgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHBhcnNlRmxvYXQoXG4gICAgICB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tYWN0dWFsLWhlYWRlci1oZWlnaHQnKSB8fCAnNTYnXG4gICAgKSB8fCA1NjtcbiAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHJvd1JlY3QgPSByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY3VycmVudFNjcm9sbFRvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG4gICAgY29uc3QgdGFyZ2V0U2Nyb2xsVG9wID0gY3VycmVudFNjcm9sbFRvcCArIChyb3dSZWN0LnRvcCAtIGNvbnRhaW5lclJlY3QudG9wKSAtIGhlYWRlckhlaWdodDtcbiAgICBjb250YWluZXIuc2Nyb2xsVG8oeyB0b3A6IHRhcmdldFNjcm9sbFRvcCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICB9XG5cbiAgaXNHcm91cENvbGxhcHNlZChncm91cEtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2dyb3VwQnkuaXNHcm91cENvbGxhcHNlZChncm91cEtleSk7XG4gIH1cblxuICBncm91cFBhZ2VCYWNrKGdyb3VwS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZUJhY2soZ3JvdXBLZXkpO1xuICB9XG5cbiAgZ3JvdXBQYWdlRm9yd2FyZChncm91cEtleTogc3RyaW5nLCB0b3RhbENvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZUZvcndhcmQoZ3JvdXBLZXksIHRvdGFsQ291bnQpO1xuICB9XG5cbiAgZ2V0IGhhc0FkZGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIubWVudUJhc2VGaWVsZHMubGVuZ3RoID4gMCB8fCB0aGlzLl9vcmdhbml6ZXIubWVudU9wdGlvbmFsRmllbGRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgbWVudUJhc2VDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5tZW51QmFzZUZpZWxkcztcbiAgfVxuXG4gIGdldCBtZW51T3B0aW9uYWxDb2x1bW5zKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5tZW51T3B0aW9uYWxGaWVsZHM7XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlQ29sdW1uc1RvQWRkKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IG5ldyBTZXQodGhpcy5hY3RpdmVGaWVsZHMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpKTtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKChjKSA9PiBjLm9wdGlvbmFsICYmICFhY3RpdmVLZXlzLmhhcyhjLmtleSkpO1xuICB9XG5cbiAgZ2V0IGFsbG93Q29sdW1uUmVtb3ZhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLmFsbG93RmllbGRSZW1vdmFsO1xuICB9XG5cbiAgZ2V0IGhhc1NsaWNlQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXM/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gIH1cblxuICBnZXQgc2hvd1NsaWNlUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dTbGljZVBhbmVsO1xuICB9XG5cbiAgb25TbGljZVBhbmVsQ29sbGFwc2VkQ2hhbmdlKGNvbGxhcHNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3NsaWNlUGFuZWxDb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzQ2ZnID0gdGhpcy5fc2xpY2VDb25maWdzLmxlbmd0aCA+IDAgfHwgdGhpcy5fb3JnYW5pemVyLnNsaWNlQnkuYWN0aXZlRHluYW1pY0ZpZWxkcy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHdhc1Zpc2libGUgPSB0aGlzLl9zaG93U2xpY2VQYW5lbDtcbiAgICB0aGlzLl9zaG93U2xpY2VQYW5lbCA9IGhhc0NmZyAmJiB0aGlzLl9yZXNvbHZlZERhdGEubGVuZ3RoID4gMDtcbiAgICAvLyBMZXMgZG9ubsOpZXMgdmllbm5lbnQgZCdhcnJpdmVyIDogYXBwbGlxdWVyIGxlcyBkeW5hbWljIHNsaWNlcyBFVCBsZXMgZmlsdHJlcyBlbiBhdHRlbnRlLlxuICAgIC8vIExlcyBkeW5hbWljIHNsaWNlcyBkb2l2ZW50IMOqdHJlIGFqb3V0w6llcyBBVkFOVCByZXN0b3JlRmlsdGVycyBjYXIgbGVzIGluZGljZXMgZGVcbiAgICAvLyBzbGljZUZpbHRlcnMgZMOpcGVuZGVudCBkZSBsJ29yZHJlIGZpbmFsIGRlIF9jYWNoZWRTbGljZXMuXG4gICAgaWYgKCF3YXNWaXNpYmxlICYmIHRoaXMuX3Nob3dTbGljZVBhbmVsICYmICh0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzIHx8IHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzKSkge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX3BlbmRpbmdTbGljZUZpbHRlcnM7XG4gICAgICBjb25zdCBkeW5hbWljS2V5cyA9IHRoaXMuX3BlbmRpbmdEeW5hbWljU2xpY2VLZXlzO1xuICAgICAgdGhpcy5fcGVuZGluZ1NsaWNlRmlsdGVycyA9IG51bGw7XG4gICAgICB0aGlzLl9wZW5kaW5nRHluYW1pY1NsaWNlS2V5cyA9IG51bGw7XG4gICAgICBjb25zdCBhbGxDb2xzID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdO1xuICAgICAgY29uc29sZS5sb2coJ1tTbGljZVJlc3RvcmVdIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbDogZG9ubsOpZXMgYXJyaXbDqWVzJywgeyBkeW5hbWljS2V5cywgZmlsdGVycyB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoZHluYW1pY0tleXMpIHtcbiAgICAgICAgICBkeW5hbWljS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2wgPSBhbGxDb2xzLmZpbmQoYyA9PiBjLmtleSA9PT0ga2V5KTtcbiAgICAgICAgICAgIGlmIChjb2wpIHRoaXMuYWRkRHluYW1pY1NsaWNlKGNvbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcnMgJiYgdGhpcy5zbGljZVBhbmVsUmVmKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTbGljZVJlc3RvcmVdIHJlc3RvcmVGaWx0ZXJzIGRlcHVpcyBfcmVjb21wdXRlU2hvd1NsaWNlUGFuZWwnLCBmaWx0ZXJzKTtcbiAgICAgICAgICB0aGlzLnNsaWNlUGFuZWxSZWYucmVzdG9yZUZpbHRlcnMoZmlsdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dBZGRTbGljZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3JnYW5pemVyLnNob3dTbGljZUJ5U2VjdGlvbjtcbiAgfVxuXG4gIGdldCBzdGF0aWNTbGljZXNGb3JNZW51KCk6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGljb24/OiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLl9vcmdhbml6ZXIuc3RhdGljU2xpY2VzRm9yTWVudTtcbiAgfVxuXG4gIGdldCBhdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5zbGljZUJ5LmF2YWlsYWJsZUZvckR5bmFtaWM7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhjb2x1bW5LZXkpO1xuICB9XG5cbiAgdG9nZ2xlU3RhdGljU2xpY2UoY29sdW1uS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldCh0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMpO1xuICAgIGlmIChuZXh0Lmhhcyhjb2x1bW5LZXkpKSBuZXh0LmRlbGV0ZShjb2x1bW5LZXkpO1xuICAgIGVsc2UgbmV4dC5hZGQoY29sdW1uS2V5KTtcbiAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXh0O1xuICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG4gICAgdGhpcy5fc2xpY2VDb25maWdzID0gdGhpcy5fY29tcHV0ZVNsaWNlQ29uZmlncygpO1xuICAgIC8vIFNpIHVuZSBzbGljZSB2aWVudCBkJ8OqdHJlIGNhY2jDqWUsIHLDqWluaXRpYWxpc2UgbGUgZmlsdHJlIGFjdGlmIHBvdXIgw6l2aXRlclxuICAgIC8vIHVuIGZpbHRyZSBvcnBoZWxpbiAobGEgc2xpY2Ugbidlc3QgcGx1cyB2aXNpYmxlIG1haXMgc29uIGZpbHRyZSByZXN0ZXJhaXQgYWN0aWYpXG4gICAgaWYgKG5leHQuaGFzKGNvbHVtbktleSkpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIgPSAoKSA9PiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCgpO1xuICAgIHRoaXMuX3NjaGVkdWxlUmVuZGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYWRkRHluYW1pY1NsaWNlKGNvbHVtbjogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VQYW5lbFJlZj8uYWRkRHluYW1pY1NsaWNlKGNvbHVtbik7XG4gICAgaWYgKGNvbHVtbi5sYXp5ICYmIHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbHVtbi5rZXkpICE9PSAnbG9hZGVkJykge1xuICAgICAgdGhpcy50cmlnZ2VyTGF6eUZldGNoKGNvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsbER5bmFtaWNTbGljZUNvbHVtbnMoKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsRHluYW1pY1NsaWNlQ29sdW1ucztcbiAgfVxuXG4gIGlzRHluYW1pY1NsaWNlQWN0aXZlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5pc0R5bmFtaWNTbGljZUFjdGl2ZShrZXkpO1xuICB9XG5cbiAgdG9nZ2xlRHluYW1pY1NsaWNlKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGNvbC5rZXkpKSB7XG4gICAgICB0aGlzLnJlbW92ZUR5bmFtaWNTbGljZUJ5S2V5KGNvbC5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZER5bmFtaWNTbGljZShjb2wpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2xpY2VGaWx0ZXJDaGFuZ2UocHJlZDogKHJvdzogVCkgPT4gYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlU2xpY2VGaWx0ZXIgPSBwcmVkO1xuICAgIHRoaXMuX3ByZXNlcnZlUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hWaWV3TW9kZWwoKTtcbiAgICB0aGlzLnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XG4gIH1cblxuICBvbkR5bmFtaWNTbGljZUtleXNDaGFuZ2Uoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLl9vcmdhbml6ZXIub25EeW5hbWljU2xpY2VLZXlzQ2hhbmdlKGtleXMpO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGVtcHR5U3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnLmxhYmVscz8uZW1wdHkgfHwgdGhpcy5pMThuLmVtcHR5U3RhdGU7XG4gIH1cblxuICBnZXQgbG9hZGluZ1N0YXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZENvbmZpZy5sYWJlbHM/LmxvYWRpbmcgfHwgdGhpcy5pMThuLmxvYWRpbmdTdGF0ZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gX3BlbmRpbmdSZW5kZXIgOiBsZSByZW5kdSBpbnRlcm5lIG4nZXN0IHBhcyBlbmNvcmUgdGVybWluw6kg4oaSIHBhcyBkZSBtZXNzYWdlIHZpZGUgcHLDqW1hdHVyw6lcbiAgICByZXR1cm4gIXRoaXMuaXNMb2FkaW5nICYmIHRoaXMuX3BlbmRpbmdSZW5kZXIgPT09IG51bGwgJiYgdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCBzaG93UGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVHcm91cEJ5S2V5ICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRQYWdpbmF0aW9uU2hvd0ZpcnN0TGFzdEJ1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPT09IHRydWU7XG4gIH1cblxuICBnZXQgaXNDb2x1bW5EcmFnRHJvcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29yZ2FuaXplci5pc0ZpZWxkRHJhZ0Ryb3BFbmFibGVkO1xuICB9XG5cbiAgZ2V0IHRvdGFsUm93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwQnlLZXlcbiAgICAgID8gdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YS5maWx0ZXIoKHIpID0+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/PyBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuICAgICAgLy8gQ29sb25uZXMgZGFucyBsJ29yZHJlIHNhdXZlZ2FyZMOpIChvbiBuZSBnYXJkZSBxdWUgY2VsbGVzIGNvbm51ZXMgZGUgbGEgY29uZmlnKVxuICAgICAgY29uc3Qgb3JkZXJlZCA9IHRhcmdldEtleXNcbiAgICAgICAgLm1hcChrZXkgPT4gYWxsQnlLZXkuZ2V0KGtleSkpXG4gICAgICAgIC5maWx0ZXIoKGMpOiBjIGlzIFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4gPT4gYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIC8vIENvbG9ubmVzIGFjdGl2ZXMgYWN0dWVsbGxlbWVudCBub24gcHLDqXNlbnRlcyBkYW5zIHRhcmdldEtleXMgKG5vbi1vcHRpb25hbCBwYXNzw6llcyBzb3VzIHNpbGVuY2UpXG4gICAgICAvLyDihpIgb24gbGVzIGV4Y2x1dCA6IGwndXRpbGlzYXRldXIgYXZhaXQgZXhwbGljaXRlbWVudCBjaG9pc2kgY2Ugc291cy1lbnNlbWJsZVxuICAgICAgaWYgKG9yZGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9vcmdhbml6ZXIuc2V0QWN0aXZlRmllbGRzKG9yZGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEeW5hbWljIHNsaWNlcyDigJQgZGlmZsOpcsOpIDogc2xpY2VQYW5lbFJlZiBwYXMgZW5jb3JlIGRpc3BvbmlibGUgYXUgbW9tZW50IGRlIG5nT25DaGFuZ2VzXG4gICAgaWYgKHNhdmVkLmR5bmFtaWNTbGljZUtleXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fcGVuZGluZ0R5bmFtaWNTbGljZUtleXMgPSBzYXZlZC5keW5hbWljU2xpY2VLZXlzO1xuICAgIH1cbiAgICAvLyBGaWx0cmVzIGFjdGlmcyBkdSBzbGljZSBwYW5lbFxuICAgIC8vIEZpbHRyZXMgYWN0aWZzIGR1IHNsaWNlIHBhbmVsIOKAlCB0b3Vqb3VycyBzdG9ja8OpcyBlbiBwZW5kaW5nIDpcbiAgICAvLyBhcHBsaXF1w6lzIHBhciBfYXBwbHlQZW5kaW5nRHluYW1pY1NsaWNlS2V5cyAoc2kgZHluYW1pYyBzbGljZXMpIG91XG4gICAgLy8gcGFyIF9yZWNvbXB1dGVTaG93U2xpY2VQYW5lbCAocXVhbmQgbGVzIGRvbm7DqWVzIGFycml2ZW50IGV0IHJlbmRlbnQgbGUgcGFuZWwgdmlzaWJsZSlcbiAgICBpZiAoc2F2ZWQuc2xpY2VGaWx0ZXJzICYmIE9iamVjdC5rZXlzKHNhdmVkLnNsaWNlRmlsdGVycykubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nU2xpY2VGaWx0ZXJzID0gc2F2ZWQuc2xpY2VGaWx0ZXJzO1xuICAgIH1cbiAgfVxuXG4gIGNhblJlbW92ZUNvbHVtbihjb2x1bW46IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fb3JnYW5pemVyLmFsbG93RmllbGRSZW1vdmFsICYmXG4gICAgICBjb2x1bW4ucmVtb3ZhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgdGhpcy5hY3RpdmVGaWVsZHMubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cblxuICBpc0NlbGxFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PSBudWxsO1xuICB9XG5cbiAgYXNUaXRsZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFeHBvcnQgQ1NWXG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5fZXhwb3J0LmV4cG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIGRlIGRvbm7DqWVzIChwcml2w6kpXG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlld01vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc29sdmVkRGF0YSA9IHRoaXMucmVzb2x2ZURhdGEoKTtcbiAgICB0aGlzLnJlc29sdmVkQ29uZmlnID0gdGhpcy5idWlsZEVmZmVjdGl2ZUNvbmZpZygpO1xuICAgIHRoaXMuX2NvbHVtbk1hcCA9IG5ldyBNYXAoKHRoaXMucmVzb2x2ZWRDb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGMgPT4gW2Mua2V5LCBjXSkpO1xuXG4gICAgLy8g4pSA4pSAIEluaXRpYWxpc2VyIGxlIGdlc3Rpb25uYWlyZSBkZSBwcsOpZsOpcmVuY2VzIHNpIGwnb3B0aW9uIGVzdCBhY3RpdsOpZVxuICAgIGNvbnN0IHByZWZzSWQgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnByZWZlcmVuY2VzPy5lbmFibGVkXG4gICAgICA/IHRoaXMucmVzb2x2ZWRDb25maWcucHJlZmVyZW5jZXMudGFibGVJZFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGN1cnJlbnRJZCA9IHByZWZzSWQgPz8gbnVsbDtcbiAgICAvLyBQcsOpZsOpcmVuY2VzIMOgIGFwcGxpcXVlciBhcHLDqHMgX29yZ2FuaXplci51cGRhdGUoKSAocXVhbmQgYWN0aXZlRmllbGRzIGVzdCBkw6lqw6AgcGV1cGzDqSlcbiAgICBsZXQgcGVuZGluZ1ByZWZzOiBpbXBvcnQoJy4uL2pxdWVyeS10YWJsZS5tb2RlbCcpLlNhdmVkVGFibGVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3VycmVudElkICYmIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlcj8ua2V5ICE9PSAoJ2pxdF9wcmVmc18nICsgY3VycmVudElkKSkge1xuICAgICAgdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyID0gbmV3IFRhYmxlUHJlZmVyZW5jZXNNYW5hZ2VyKGN1cnJlbnRJZCk7XG4gICAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlci5oYXNTYXZlZCgpO1xuICAgICAgcGVuZGluZ1ByZWZzID0gdGhpcy5fcHJlZmVyZW5jZXNNYW5hZ2VyLmxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKCFjdXJyZW50SWQpIHtcbiAgICAgIHRoaXMuX3ByZWZlcmVuY2VzTWFuYWdlciA9IG51bGw7XG4gICAgICB0aGlzLl9oYXNTYXZlZENvbmZpZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIETDqWzDqGd1ZSDDoCBsYSBmYWNhZGUgOiBtaXNlIMOgIGpvdXIgZGUgbCfDqXRhdCBWaWV3IChjb2xvbm5lcywgZ3JvdXBCeSBtZXRhLCBzbGljZUJ5IG1ldGEpXG4gICAgdGhpcy5fb3JnYW5pemVyLnVwZGF0ZSh7XG4gICAgICBjb25maWc6IHRoaXMucmVzb2x2ZWRDb25maWcudmlldyxcbiAgICAgIGZpZWxkczogdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdLFxuICAgICAgc2xpY2VDb25maWdzOiB0aGlzLnJlc29sdmVkQ29uZmlnLnNsaWNlcyA/PyBbXSxcbiAgICAgIGRlZmF1bHRHcm91cEJ5OiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRHcm91cEJ5LFxuICAgIH0pO1xuXG4gICAgaWYgKCFwZW5kaW5nUHJlZnMgJiYgIXRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCAmJiAhdGhpcy5fb3JnYW5pemVyLmdyb3VwQnkudXNlckN1c3RvbWl6ZWQgJiYgdGhpcy5fb3JnYW5pemVyLmdyb3VwQnkuYWN0aXZlS2V5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRHcm91cEJ5QXBwbGllZCA9IHRydWU7XG4gICAgICB0aGlzLl9ncm91cEJ5LnNldERlZmF1bHRDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICB0aGlzLl9ncm91cEJ5LnJlc2V0KCk7XG4gICAgICB0aGlzLl9ncm91cEJ5Lmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8vIFN5bmNocm9uaXNlIGxhIHByb3ByacOpdMOpIHN0YWJsZSAow6l2aXRlIE5HMDEwMCDigJQgbGEgZmFjYWRlIGVzdCBzb3VyY2UgZGUgdsOpcml0w6kpXG4gICAgdGhpcy5hY3RpdmVGaWVsZHMgPSB0aGlzLl9vcmdhbml6ZXIuZmllbGRzLmFjdGl2ZUZpZWxkcztcblxuICAgIHRoaXMucmVuZGVyZWRDb2x1bW5zID0gdGhpcy5hY3RpdmVGaWVsZHMubWFwKGMgPT4gYy5rZXkpO1xuXG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yPy5wYWdlU2l6ZSB8fCB0aGlzLnJlc29sdmVQYWdlU2l6ZSgpO1xuICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gdGhpcy5yZXNvbHZlUGFnZVNpemVPcHRpb25zKCk7XG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnNHcm91cEJ5ID0gdGhpcy5yZXNvbHZlUGFnZVNpemVPcHRpb25zR3JvdXBCeSgpO1xuICAgIGlmICh0aGlzLmdyb3VwUGFnZVNpemUgIT09IDAgJiYgIXRoaXMucGFnZVNpemVPcHRpb25zR3JvdXBCeS5pbmNsdWRlcyh0aGlzLmdyb3VwUGFnZVNpemUpKSB7XG4gICAgICB0aGlzLmdyb3VwUGFnZVNpemUgPSB0aGlzLnJlc29sdmVEZWZhdWx0R3JvdXBQYWdlU2l6ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuYXR0YWNoUGFnaW5hdG9yKCk7XG4gICAgdGhpcy5hdHRhY2hTb3J0KCk7XG5cbiAgICAvLyBSw6lpbml0aWFsaXNlIF9zdGF0aWNTbGljZUhpZGRlbktleXMgc2V1bGVtZW50IHNpIGxlcyBjbMOpcyBoaWRkZW4gZGUgbGEgY29uZmlnIG9udCB2cmFpbWVudCBjaGFuZ8OpXG4gICAgLy8gRVQgcXUnaWwgbid5IGEgcGFzIGRlIHByw6lmw6lyZW5jZXMgc2F1dmVnYXJkw6llcyAocXVpIGfDqXJlcm9udCBoaWRkZW5TbGljZUtleXMgZWxsZXMtbcOqbWVzKS5cbiAgICBjb25zdCBuZXdDb25maWdIaWRkZW4gPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICAodGhpcy5yZXNvbHZlZENvbmZpZy5zbGljZXMgPz8gW10pLmZpbHRlcihzID0+IHMuaGlkZGVuICYmIHMuY29sdW1uS2V5KS5tYXAocyA9PiBzLmNvbHVtbktleSEpXG4gICAgKTtcbiAgICBpZiAoIVRhYmxlQ29tcG9uZW50Ll9zZXRzRXF1YWwobmV3Q29uZmlnSGlkZGVuLCB0aGlzLl9jb25maWdIaWRkZW5LZXlzKSkge1xuICAgICAgdGhpcy5fY29uZmlnSGlkZGVuS2V5cyA9IG5ld0NvbmZpZ0hpZGRlbjtcbiAgICAgIC8vIE4nw6ljcmFzZXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyBxdWUgc2kgb24gbidlc3QgUEFTIGVuIHRyYWluIGQnYXBwbGlxdWVyIGRlcyBwcmVmc1xuICAgICAgLy8gKHBlbmRpbmdQcmVmcyBsZXMgZ8OocmVyYSBsdWktbcOqbWUgdmlhIF9hcHBseVByZWZlcmVuY2VzIOKGkiBoaWRkZW5TbGljZUtleXMpXG4gICAgICBpZiAoIXBlbmRpbmdQcmVmcykge1xuICAgICAgICB0aGlzLl9zdGF0aWNTbGljZUhpZGRlbktleXMgPSBuZXcgU2V0KG5ld0NvbmZpZ0hpZGRlbik7XG4gICAgICAgIHRoaXMuX29yZ2FuaXplci51cGRhdGVIaWRkZW5TdGF0aWNLZXlzKHRoaXMuX3N0YXRpY1NsaWNlSGlkZGVuS2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbGlxdWUgbGVzIHByw6lmw6lyZW5jZXMgSUNJLCBBUFLDiFMgX29yZ2FuaXplci51cGRhdGUoKSBFVCBhcHLDqHMgX2NvbmZpZ0hpZGRlbktleXMgbWlzIMOgIGpvdXIsXG4gICAgLy8gbWFpcyBhdmFudCBfY29tcHV0ZVNsaWNlQ29uZmlncygpIHBvdXIgcXVlIGhpZGRlblNsaWNlS2V5cyBzb2l0IGTDqWrDoCByZXN0YXVyw6kuXG4gICAgaWYgKHBlbmRpbmdQcmVmcykge1xuICAgICAgdGhpcy5fYXBwbHlQcmVmZXJlbmNlcyhwZW5kaW5nUHJlZnMpO1xuICAgIH1cblxuICAgIC8vIFByb3ByacOpdMOpcyBzdGFibGVzIHBvdXIgbGVzIGJpbmRpbmdzIGR1IHRlbXBsYXRlXG4gICAgLy8gT24gcmVjYWxjdWxlIF9zbGljZUNvbmZpZ3MgZW4gcmVmbMOpdGFudCBsJ8OpdGF0IGNvdXJhbnQgZGVzIHNsaWNlcyBjYWNow6llcyxcbiAgICAvLyBwb3VyIHF1ZSBTbGljZVBhbmVsQ29tcG9uZW50Lm5nT25Jbml0IHJlw6dvaXZlIGxhIGJvbm5lIHZhbGV1ciBkZSBgaGlkZGVuYFxuICAgIC8vIG3Dqm1lIHF1YW5kIGxlIGNvbXBvc2FudCBlc3QgY3LDqcOpIHBvdXIgbGEgMcOocmUgZm9pcyBhcHLDqHMgdW4gdG9nZ2xlLlxuICAgIHRoaXMuX3NsaWNlQ29uZmlncyA9IHRoaXMuX2NvbXB1dGVTbGljZUNvbmZpZ3MoKTtcbiAgICB0aGlzLl9zbGljZUNvbHVtbnMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLmNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5fc2xpY2VEYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuICAgIHRoaXMuX3NsaWNlU2hvd1RvZ2dsZSA9IHRoaXMucmVzb2x2ZWRDb25maWcuZW5hYmxlU2xpY2VUb2dnbGUgIT09IGZhbHNlO1xuICAgIHRoaXMuX3JlY29tcHV0ZVNob3dTbGljZVBhbmVsKCk7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVTb3J0LmFjdGl2ZSAmJiB0aGlzLnJlc29sdmVkQ29uZmlnLmRlZmF1bHRTb3J0KSB7XG4gICAgICB0aGlzLl9tYXRTb3J0QWN0aXZlID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5hY3RpdmU7XG4gICAgICB0aGlzLl9tYXRTb3J0RGlyZWN0aW9uID0gdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydC5kaXJlY3Rpb247XG4gICAgfVxuICAgIHRoaXMuX2J1aWxkU2xpY2VCeU1lbnVJdGVtcygpO1xuXG4gICAgdGhpcy5fc2NoZWR1bGVSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBSZXRvdXJuZSB1bmlxdWVtZW50IGxlcyBzbGljZXMgdmlzaWJsZXMgKG5vbiBjYWNow6llcyBwYXIgX3N0YXRpY1NsaWNlSGlkZGVuS2V5cykuXG4gICAqIExlIFNsaWNlUGFuZWxDb21wb25lbnQgYWZmaWNoZSB0b3V0IGNlIHF1J2lsIHJlw6dvaXQg4oCUIGMnZXN0IGljaSBxdWUgc2UgZmFpdCBsZSBmaWx0cmFnZS4gKi9cbiAgcHJpdmF0ZSBfY29tcHV0ZVNsaWNlQ29uZmlncygpOiBTbGljZUNvbmZpZzxUPltdIHtcbiAgICByZXR1cm4gKHRoaXMucmVzb2x2ZWRDb25maWcuc2xpY2VzID8/IFtdKS5maWx0ZXIoXG4gICAgICBzID0+ICFzLmNvbHVtbktleSB8fCAhdGhpcy5fc3RhdGljU2xpY2VIaWRkZW5LZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3NldHNFcXVhbChhOiBTZXQ8c3RyaW5nPiwgYjogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgYSkgaWYgKCFiLmhhcyh2KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRTbGljZUJ5TWVudUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlTWFwID0gbmV3IE1hcCh0aGlzLl9zdGF0aWNTbGljZXNGb3JNZW51Lm1hcChzID0+IFtzLmtleSwgc10pKTtcbiAgICBjb25zdCBkeW5hbWljU2xpY2VTZXQgPSBuZXcgU2V0KHRoaXMuX2FsbER5bmFtaWNTbGljZUNvbHVtbnMubWFwKGMgPT4gYy5rZXkpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PHsgaXNTdGF0aWM6IGJvb2xlYW47IGtleTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBjb2w/OiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+IH0+ID0gW107XG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5yZXNvbHZlZENvbmZpZy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY29sLmtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YXRpY1NsaWNlTWFwLmhhcyhjb2wua2V5KSkge1xuICAgICAgICBjb25zdCBzID0gc3RhdGljU2xpY2VNYXAuZ2V0KGNvbC5rZXkpITtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgICBzZWVuLmFkZChjb2wua2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY1NsaWNlU2V0Lmhhcyhjb2wua2V5KSkge1xuICAgICAgICBpdGVtcy5wdXNoKHsgaXNTdGF0aWM6IGZhbHNlLCBrZXk6IGNvbC5rZXksIHRpdGxlOiB0aGlzLmNvbExhYmVsKGNvbCksIGljb246IGNvbC5pY29uLCBjb2wgfSk7XG4gICAgICAgIHNlZW4uYWRkKGNvbC5rZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdGljU2xpY2VzRm9yTWVudSkge1xuICAgICAgaWYgKCFzZWVuLmhhcyhzLmtleSkpIHtcbiAgICAgICAgaXRlbXMucHVzaCh7IGlzU3RhdGljOiB0cnVlLCBrZXk6IHMua2V5LCB0aXRsZTogcy50aXRsZSwgaWNvbjogcy5pY29uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zbGljZUJ5TWVudUl0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5faW52YWxpZGF0ZU9yZ2FuaXplckNvbmZpZygpOyAvLyBsZXMgc2xpY2VzIG9udCBjaGFuZ8OpXG4gIH1cblxuICBnZXQgc2xpY2VCeU1lbnVJdGVtcygpIHsgcmV0dXJuIHRoaXMuX3NsaWNlQnlNZW51SXRlbXM7IH1cblxuICBvblNsaWNlTWVudUl0ZW1DbGljayhpdGVtOiB7IGlzU3RhdGljOiBib29sZWFuOyBrZXk6IHN0cmluZzsgY29sPzogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaXNTdGF0aWMpIHtcbiAgICAgIHRoaXMudG9nZ2xlU3RhdGljU2xpY2UoaXRlbS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5jb2wpIHtcbiAgICAgIHRoaXMudG9nZ2xlRHluYW1pY1NsaWNlKGl0ZW0uY29sKTtcbiAgICB9XG4gIH1cblxuICBpc1NsaWNlTWVudUl0ZW1BY3RpdmUoaXRlbTogeyBpc1N0YXRpYzogYm9vbGVhbjsga2V5OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmlzU3RhdGljID8gdGhpcy5pc1N0YXRpY1NsaWNlVmlzaWJsZShpdGVtLmtleSkgOiB0aGlzLmlzRHluYW1pY1NsaWNlQWN0aXZlKGl0ZW0ua2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlUmVuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ1JlbmRlcik7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVuZGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZW5kZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fZXhlY3V0ZVJlbmRlcigpKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXhlY3V0ZVJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjYXRlZ29yeVJvd3MgPSB0aGlzLmdldENhdGVnb3J5RmlsdGVyZWREYXRhKCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgLy8gRW4gbW9kZSBncm91cEJ5LCBwcm9qZWN0Um93cyBnw6hyZSB0b3V0IGxlIHRyaSBpbnRlcm5lbWVudCDigJQgcGFzIGRlIHNvcnQgZ2xvYmFsIGludXRpbGVcbiAgICAgIHRoaXMuX2FsbEZpbHRlcmVkUm93cyA9IGNhdGVnb3J5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcGFyZUZuID0gdGhpcy5fYnVpbGRTb3J0Q29tcGFyYXRvcigpO1xuICAgICAgdGhpcy5fYWxsRmlsdGVyZWRSb3dzID0gY29tcGFyZUZuID8gWy4uLmNhdGVnb3J5Um93c10uc29ydChjb21wYXJlRm4pIDogY2F0ZWdvcnlSb3dzO1xuICAgIH1cblxuICAgIC8vIE1ldHRyZSDDoCBqb3VyIGxlIHBhZ2luYXRvciBhdmVjIGxlIG5vdXZlYXUgdG90YWxcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLl9wcmVzZXJ2ZVBhZ2VJbmRleCA/PyB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuX2FsbEZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSAtIDEpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IubGVuZ3RoID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLmxlbmd0aDtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IE1hdGgubWluKHNhdmVkSW5kZXgsIG1heFBhZ2UpO1xuICAgICAgdGhpcy5fcHJlc2VydmVQYWdlSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgIC8vIGRldGVjdENoYW5nZXMoKSBhdSBsaWV1IGRlIG1hcmtGb3JDaGVjaygpIDogbWV0IMOgIGpvdXIgdW5pcXVlbWVudCBDRSBjb21wb3NhbnRcbiAgICAvLyBzYW5zIGTDqWNsZW5jaGVyIHVuIGN5Y2xlIENEIGdsb2JhbCBxdWkgcHJvdm9xdWVyYWl0IE5HMDEwMCBkYW5zIGxlcyBwYXJlbnRzLlxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9qZWN0Q3VycmVudFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlR3JvdXBCeUtleSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHRoaXMucHJvamVjdFJvd3ModGhpcy5fYWxsRmlsdGVyZWRSb3dzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLnBhZ2luYXRvcj8ucGFnZUluZGV4ID8/IDA7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IHBhZ2VSb3dzID0gdGhpcy5fYWxsRmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xuXG4gICAgY29uc3QgcHJvamVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIHBhZ2VSb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gc3RhcnQgKyBpO1xuICAgICAgY29uc3QgcDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaWR4IH07XG4gICAgICB0aGlzLmFjdGl2ZUZpZWxkcy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgcFtjb2wua2V5XSA9IHRoaXMucmVzb2x2ZUNlbGxWYWx1ZShjb2wsIHJvdywgaWR4KTtcbiAgICAgIH0pO1xuICAgICAgcHJvamVjdGVkLnB1c2gocCk7XG4gICAgfSk7XG4gICAgdGhpcy50YWJsZURhdGFTb3VyY2UuZGF0YSA9IHByb2plY3RlZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFZmZlY3RpdmVDb25maWcoKTogVGFibGVQcm92aWRlcjxUPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcgfHwge307XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX3Jlc29sdmVkRGF0YTtcblxuICAgIGNvbnN0IGNvbHVtbnMgPVxuICAgICAgY29uZmlnLmNvbHVtbnMgfHxcbiAgICAgIHRoaXMuY29sdW1uc0NvbmZpZyB8fFxuICAgICAgdGhpcy5yZXNvbHZlQ29sdW1uc0Zyb21Db21wYXQocm93cyk7XG5cbiAgICAvLyBNb2RlIEhUTUwgOiBbdmlld10gcHJlbmQgbGUgZGVzc3VzIHN1ciBjb25maWcudmlldyBzaSBmb3VybmkgKFBoYXNlIDMpLlxuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXcgPz8gY29uZmlnLnZpZXc7XG5cbiAgICBjb25zdCBhdXRvVGFibGVJZCA9IGNvbmZpZy5wcmVmZXJlbmNlcz8udGFibGVJZCB8fCBUYWJsZUNvbXBvbmVudC5faGFzaENvbHVtbnMoKGNvbHVtbnMgfHwgW10pLm1hcChjID0+IGMua2V5KSk7XG4gICAgY29uc3QgZXhwb3J0Q29uZmlnOiBUYWJsZUV4cG9ydENvbmZpZzxUPiA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBmaWxlbmFtZTogYXV0b1RhYmxlSWQsXG4gICAgICAuLi5jb25maWcuZXhwb3J0LFxuICAgIH07XG5cbiAgICBjb25zdCBwcmVmc0NvbmZpZzogVGFibGVQcmVmZXJlbmNlc0NvbmZpZyA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB0YWJsZUlkOiBhdXRvVGFibGVJZCxcbiAgICAgIC4uLmNvbmZpZy5wcmVmZXJlbmNlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICB2aWV3LFxuICAgICAgc2xpY2VzOiBjb25maWcuc2xpY2VzIHx8IFtdLFxuICAgICAgZW5hYmxlU2xpY2VUb2dnbGU6IGNvbmZpZy5lbmFibGVTbGljZVRvZ2dsZSA/PyB0cnVlLFxuICAgICAgZXhwb3J0OiBleHBvcnRDb25maWcsXG4gICAgICBwcmVmZXJlbmNlczogcHJlZnNDb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDb25maWdTZWFyY2hSZXNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhclRva2VuID0gdGhpcy5yZXNvbHZlZENvbmZpZy5jbGVhclNlYXJjaElucHV0O1xuICAgIGNvbnN0IHNob3VsZENsZWFyID0gISFjbGVhclRva2VuICYmIGNsZWFyVG9rZW4gIT09IHRoaXMuX2xhc3RDb25maWdDbGVhclNlYXJjaElucHV0O1xuXG4gICAgdGhpcy5fbGFzdENvbmZpZ0NsZWFyU2VhcmNoSW5wdXQgPSBjbGVhclRva2VuO1xuXG4gICAgaWYgKCFzaG91bGRDbGVhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcbiAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5SW5pdGlhbFNlYXJjaFF1ZXJ5KCk6IHZvaWQge1xuICAgIGNvbnN0IGluaXRpYWxRdWVyeSA9IHRoaXMucmVzb2x2ZWRDb25maWcuc2VhcmNoPy5pbml0aWFsUXVlcnk7XG4gICAgaWYgKGluaXRpYWxRdWVyeSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9IGluaXRpYWxRdWVyeTtcbiAgICB0aGlzLm9uU2VhcmNoQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfaGFzaENvbHVtbnMoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ciA9IGtleXMuam9pbignfCcpO1xuICAgIGxldCBoID0gMHg4MTFjOWRjNTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgaCBePSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBNYXRoLmltdWwoaCwgMHgwMTAwMDE5MykgPj4+IDA7XG4gICAgfVxuICAgIHJldHVybiBoLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAnMCcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGF0YSgpOiBUW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuZGF0YVNvdXJjZSBhcyBhbnkpLmRhdGEpKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YVNvdXJjZSBhcyBhbnkpLmRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uc0Zyb21Db21wYXQocm93czogVFtdKTogVGFibGVDb2x1bW5Qcm92aWRlcjxUPltdIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnMubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiB0aGlzLmNvbHVtbkxhYmVscz8uW2tleV0gfHwgaHVtYW5pemVLZXkoa2V5KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFJvdyA9IHJvd3NbMF0gYXMgYW55O1xuICAgIGlmICghZmlyc3RSb3cgfHwgdHlwZW9mIGZpcnN0Um93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhmaXJzdFJvdykubWFwKChrZXkpID0+ICh7XG4gICAgICBrZXksXG4gICAgICBoZWFkZXI6IHRoaXMuY29sdW1uTGFiZWxzPy5ba2V5XSB8fCBodW1hbml6ZUtleShrZXkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2F0ZWdvcnlGaWx0ZXJlZERhdGEoKTogVFtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fcmVzb2x2ZWREYXRhO1xuXG4gICAgbGV0IGZpbHRlcmVkID0gZGF0YS5maWx0ZXIodGhpcy5hY3RpdmVTbGljZUZpbHRlcik7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VhcmNoUXVlcnk/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgY29uc3QgcmVzdHJpY3RlZEtleXMgPSB0aGlzLnJlc29sdmVkQ29uZmlnLnNlYXJjaD8uc2VhcmNoQ29sdW1ucztcbiAgICAgIGNvbnN0IHNlYXJjaENvbHMgPSByZXN0cmljdGVkS2V5cz8ubGVuZ3RoXG4gICAgICAgID8gWy4uLnRoaXMuX2NvbHVtbk1hcC52YWx1ZXMoKV0uZmlsdGVyKGNvbCA9PiByZXN0cmljdGVkS2V5cy5pbmNsdWRlcyhjb2wua2V5KSlcbiAgICAgICAgOiBbLi4udGhpcy5fY29sdW1uTWFwLnZhbHVlcygpXTtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChyb3cpID0+XG4gICAgICAgIHNlYXJjaENvbHMuc29tZSgoY29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXREaXNwbGF5VmFsdWVGb3JTZWFyY2goY29sLCByb3cpO1xuICAgICAgICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvamVjdFJvd3Mocm93czogVFtdKTogYW55W10ge1xuICAgIGNvbnN0IGdyb3VwS2V5ID0gdGhpcy5hY3RpdmVHcm91cEJ5S2V5O1xuXG4gICAgaWYgKCFncm91cEtleSkge1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgcm93cy5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZDogYW55ID0geyBbUk9XX1JBV19LRVldOiByb3csIFtST1dfSU5ERVhfS0VZXTogaW5kZXggfTtcbiAgICAgICAgdGhpcy5hY3RpdmVGaWVsZHMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgcHJvamVjdGVkW2NvbC5rZXldID0gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQucHVzaChwcm9qZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwQ29sRGVmID0gdGhpcy5fY29sdW1uTWFwLmdldChncm91cEtleSk7XG4gICAgY29uc3QgZ3JvdXBMYXp5U3RhdHVzID0gZ3JvdXBDb2xEZWY/LmxhenkgPyAodGhpcy5fbGF6eUNvbHVtblN0YXR1cy5nZXQoZ3JvdXBLZXkpID8/ICdpZGxlJykgOiAnbG9hZGVkJztcblxuICAgIGlmIChncm91cExhenlTdGF0dXMgIT09ICdsb2FkZWQnKSB7XG4gICAgICB0aGlzLl90b3RhbEZpbHRlcmVkQ291bnQgPSByb3dzLmxlbmd0aDtcbiAgICAgIHJldHVybiBbeyBbR1JPVVBfSEVBREVSX01BUktFUl06IHRydWUsIFtST1dfR1JPVVBfS0VZXTogR1JPVVBfS0VZX0xBWllfTE9BRElORywgW1JPV19HUk9VUF9DT1VOVF06IHJvd3MubGVuZ3RoLCBbUk9XX0dST1VQX1BBR0VdOiAwLCBbUk9XX0dST1VQX1BBR0VfQ09VTlRdOiAxIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IGVmZmVjdGl2ZVNvcnQgPSB0aGlzLl9hY3RpdmVTb3J0LmFjdGl2ZSAmJiB0aGlzLl9hY3RpdmVTb3J0LmRpcmVjdGlvblxuICAgICAgPyB0aGlzLl9hY3RpdmVTb3J0XG4gICAgICA6IHRoaXMucmVzb2x2ZWRDb25maWcuZGVmYXVsdFNvcnQgPz8geyBhY3RpdmU6ICcnLCBkaXJlY3Rpb246ICcnIGFzIGNvbnN0IH07XG5cbiAgICAvLyBWw6lyaWZpZSBzaSBsZSBjYWNoZSBlc3QgZW5jb3JlIHZhbGlkZSAobcOqbWUgcsOpZsOpcmVuY2UgZGUgcm93cyArIG3Dqm1lIHBhcmFtw6h0cmVzIGRlIHRyaS9ncm91cGUpXG4gICAgY29uc3QgY2FjaGVWYWxpZCA9XG4gICAgICB0aGlzLl9ncm91cENhY2hlICE9PSBudWxsICYmXG4gICAgICB0aGlzLl9ncm91cENhY2hlLnJvd3MgPT09IHJvd3MgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUua2V5ID09PSBncm91cEtleSAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5zb3J0T3JkZXIgPT09IHRoaXMuX2dyb3VwQnkuZ3JvdXBTb3J0T3JkZXIgJiZcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUuc29ydEFjdGl2ZSA9PT0gKGVmZmVjdGl2ZVNvcnQuYWN0aXZlID8/ICcnKSAmJlxuICAgICAgdGhpcy5fZ3JvdXBDYWNoZS5zb3J0RGlyID09PSAoZWZmZWN0aXZlU29ydC5kaXJlY3Rpb24gPz8gJycpO1xuXG4gICAgbGV0IGdyb3VwT3JkZXI6IHN0cmluZ1tdO1xuICAgIGxldCBncm91cE1hcDogTWFwPHN0cmluZywgVFtdPjtcblxuICAgIGlmIChjYWNoZVZhbGlkKSB7XG4gICAgICBncm91cE9yZGVyID0gdGhpcy5fZ3JvdXBDYWNoZSEub3JkZXI7XG4gICAgICBncm91cE1hcCA9IHRoaXMuX2dyb3VwQ2FjaGUhLm1hcDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUHLDqS1jYWxjdWwgZGVzIHZhbGV1cnMgZGUgZ3JvdXBlIGVuIHVuIHNldWwgcGFzc2FnZSAow6l2aXRlIE8obikgZmluZCgpIHBhciBjb21wYXJhaXNvbilcbiAgICAgIGNvbnN0IGdyb3VwVmFsdWVDYWNoZSA9IG5ldyBNYXA8VCwgc3RyaW5nPigpO1xuICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiBncm91cFZhbHVlQ2FjaGUuc2V0KHJvdywgU3RyaW5nKHRoaXMuZ2V0TGF6eUF3YXJlVmFsdWUoZ3JvdXBLZXksIHJvdykgPz8gJycpKSk7XG5cbiAgICAgIC8vIFByw6ktY2FsY3VsIGRlcyB2YWxldXJzIGRlIHRyaSAow6l2aXRlIE8obiBsb2cgbikgw5cgZ2V0TGF6eUF3YXJlVmFsdWUgZGFucyBsZSBjb21wYXJhdGV1cilcbiAgICAgIGxldCBmYXN0Q29tcGFyZUZuOiAoKGE6IFQsIGI6IFQpID0+IG51bWJlcikgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChlZmZlY3RpdmVTb3J0LmFjdGl2ZSAmJiBlZmZlY3RpdmVTb3J0LmRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBzb3J0VmFsdWVDYWNoZSA9IG5ldyBNYXA8VCwgYW55PigpO1xuICAgICAgICByb3dzLmZvckVhY2gocm93ID0+IHNvcnRWYWx1ZUNhY2hlLnNldChyb3csIHRoaXMuZ2V0TGF6eUF3YXJlVmFsdWUoZWZmZWN0aXZlU29ydC5hY3RpdmUsIHJvdykpKTtcbiAgICAgICAgY29uc3QgZGlyID0gZWZmZWN0aXZlU29ydC5kaXJlY3Rpb247XG4gICAgICAgIGZhc3RDb21wYXJlRm4gPSAoYTogVCwgYjogVCk6IG51bWJlciA9PiB7XG4gICAgICAgICAgY29uc3QgdmEgPSBzb3J0VmFsdWVDYWNoZS5nZXQoYSk7XG4gICAgICAgICAgY29uc3QgdmIgPSBzb3J0VmFsdWVDYWNoZS5nZXQoYik7XG4gICAgICAgICAgbGV0IGNtcCA9IDA7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHZiID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY21wID0gdmEgPCB2YiA/IC0xIDogdmEgPiB2YiA/IDEgOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzYSA9IHZhID09IG51bGwgPyAnJyA6IFN0cmluZyh2YSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IHNiID0gdmIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY21wID0gc2EgPCBzYiA/IC0xIDogc2EgPiBzYiA/IDEgOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGlyID09PSAnYXNjJyA/IGNtcCA6IC1jbXA7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhID0gZ3JvdXBWYWx1ZUNhY2hlLmdldChhKSE7XG4gICAgICAgIGNvbnN0IHZiID0gZ3JvdXBWYWx1ZUNhY2hlLmdldChiKSE7XG4gICAgICAgIGNvbnN0IGNtcCA9IHZhLmxvY2FsZUNvbXBhcmUodmIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gLWNtcCA6IGNtcDtcbiAgICAgIH0pO1xuXG4gICAgICBncm91cE9yZGVyID0gW107XG4gICAgICBncm91cE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUW10+KCk7XG4gICAgICBzb3J0ZWQuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwVmFsdWUgPSBncm91cFZhbHVlQ2FjaGUuZ2V0KHJvdykhO1xuICAgICAgICBpZiAoIWdyb3VwTWFwLmhhcyhncm91cFZhbHVlKSkge1xuICAgICAgICAgIGdyb3VwT3JkZXIucHVzaChncm91cFZhbHVlKTtcbiAgICAgICAgICBncm91cE1hcC5zZXQoZ3JvdXBWYWx1ZSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwTWFwLmdldChncm91cFZhbHVlKSEucHVzaChyb3cpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRyaSBpbnRyYS1ncm91cGUgc3RvY2vDqSBkYW5zIGxlIGNhY2hlIOKAlCDDqXZpdGUgbGUgcmUtdHJpIHN1ciBjb2xsYXBzZS9leHBhbmQvcGFnaW5hdGlvblxuICAgICAgaWYgKGZhc3RDb21wYXJlRm4pIHtcbiAgICAgICAgY29uc3QgZm4gPSBmYXN0Q29tcGFyZUZuO1xuICAgICAgICBncm91cE1hcC5mb3JFYWNoKChncm91cFJvd3MsIGtleSkgPT4ge1xuICAgICAgICAgIGdyb3VwTWFwLnNldChrZXksIFsuLi5ncm91cFJvd3NdLnNvcnQoZm4pKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1pc2UgZW4gY2FjaGVcbiAgICAgIHRoaXMuX2dyb3VwQ2FjaGUgPSB7XG4gICAgICAgIHJvd3MsXG4gICAgICAgIGtleTogZ3JvdXBLZXksXG4gICAgICAgIHNvcnRPcmRlcjogdGhpcy5fZ3JvdXBCeS5ncm91cFNvcnRPcmRlcixcbiAgICAgICAgc29ydEFjdGl2ZTogZWZmZWN0aXZlU29ydC5hY3RpdmUgPz8gJycsXG4gICAgICAgIHNvcnREaXI6IGVmZmVjdGl2ZVNvcnQuZGlyZWN0aW9uID8/ICcnLFxuICAgICAgICBvcmRlcjogZ3JvdXBPcmRlcixcbiAgICAgICAgbWFwOiBncm91cE1hcCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdG90YWxGaWx0ZXJlZENvdW50ID0gcm93cy5sZW5ndGg7XG5cbiAgICAvLyBQcm90ZWN0aW9uIGNvbnRyZSBsZXMgamV1eCBkZSBkb25uw6llcyDDoCB0cm9wIGhhdXRlIGNhcmRpbmFsaXTDqVxuICAgIGlmIChncm91cE9yZGVyLmxlbmd0aCA+IFRhYmxlQ29tcG9uZW50Lk1BWF9HUk9VUF9DT1VOVCkge1xuICAgICAgcmV0dXJuIFt7IFtHUk9VUF9IRUFERVJfTUFSS0VSXTogdHJ1ZSwgW1JPV19HUk9VUF9LRVldOiBHUk9VUF9LRVlfVE9PX01BTlksIFtST1dfR1JPVVBfQ09VTlRdOiBncm91cE9yZGVyLmxlbmd0aCwgW1JPV19HUk9VUF9QQUdFXTogMCwgW1JPV19HUk9VUF9QQUdFX0NPVU5UXTogMSB9XTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuZ3JvdXBQYWdlU2l6ZTtcbiAgICBjb25zdCByZXN1bHQ6IGFueVtdID0gW107XG5cbiAgICBncm91cE9yZGVyLmZvckVhY2goKGdyb3VwVmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwUm93cyA9IGdyb3VwTWFwLmdldChncm91cFZhbHVlKSE7XG4gICAgICBjb25zdCB0b3RhbENvdW50ID0gZ3JvdXBSb3dzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gcGFnZVNpemUgPT09IDAgPyAwIDogdGhpcy5fZ3JvdXBCeS5nZXRQYWdlKGdyb3VwVmFsdWUpO1xuICAgICAgY29uc3QgcGFnZUNvdW50ID0gcGFnZVNpemUgPT09IDAgPyAxIDogTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsQ291bnQgLyBwYWdlU2l6ZSkpO1xuICAgICAgY29uc3QgY29sbGFwc2VkID0gdGhpcy5pc0dyb3VwQ29sbGFwc2VkKGdyb3VwVmFsdWUpO1xuXG4gICAgICByZXN1bHQucHVzaCh7IFtHUk9VUF9IRUFERVJfTUFSS0VSXTogdHJ1ZSwgW1JPV19HUk9VUF9LRVldOiBncm91cFZhbHVlLCBbUk9XX0dST1VQX0NPVU5UXTogdG90YWxDb3VudCwgW1JPV19HUk9VUF9QQUdFXTogY3VycmVudFBhZ2UsIFtST1dfR1JPVVBfUEFHRV9DT1VOVF06IHBhZ2VDb3VudCB9KTtcblxuICAgICAgaWYgKCFjb2xsYXBzZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWdlU2l6ZSA9PT0gMCA/IDAgOiBjdXJyZW50UGFnZSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBwYWdlU2l6ZSA9PT0gMCA/IHRvdGFsQ291bnQgOiBNYXRoLm1pbihzdGFydCArIHBhZ2VTaXplLCB0b3RhbENvdW50KTtcbiAgICAgICAgZ3JvdXBSb3dzLnNsaWNlKHN0YXJ0LCBlbmQpLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkeCA9IHN0YXJ0ICsgaTtcbiAgICAgICAgICBjb25zdCBwcm9qZWN0ZWQ6IGFueSA9IHsgW1JPV19SQVdfS0VZXTogcm93LCBbUk9XX0lOREVYX0tFWV06IGlkeCB9O1xuICAgICAgICAgIHRoaXMuYWN0aXZlRmllbGRzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgcHJvamVjdGVkW2NvbC5rZXldID0gdGhpcy5yZXNvbHZlQ2VsbFZhbHVlKGNvbCwgcm93LCBpZHgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHByb2plY3RlZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkU29ydENvbXBhcmF0b3IoKTogKChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHwgbnVsbCB7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMuX2FjdGl2ZVNvcnQuYWN0aXZlICYmIHRoaXMuX2FjdGl2ZVNvcnQuZGlyZWN0aW9uXG4gICAgICA/IHRoaXMuX2FjdGl2ZVNvcnRcbiAgICAgIDogdGhpcy5yZXNvbHZlZENvbmZpZy5kZWZhdWx0U29ydCA/PyB7IGFjdGl2ZTogJycsIGRpcmVjdGlvbjogJycgYXMgY29uc3QgfTtcbiAgICBjb25zdCB7IGFjdGl2ZSwgZGlyZWN0aW9uIH0gPSBzb3J0O1xuICAgIGlmICghYWN0aXZlIHx8ICFkaXJlY3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiAoYTogVCwgYjogVCk6IG51bWJlciA9PiB7XG4gICAgICBjb25zdCB2YSA9IHRoaXMuZ2V0TGF6eUF3YXJlVmFsdWUoYWN0aXZlLCBhKTtcbiAgICAgIGNvbnN0IHZiID0gdGhpcy5nZXRMYXp5QXdhcmVWYWx1ZShhY3RpdmUsIGIpO1xuICAgICAgbGV0IGNtcCA9IDA7XG4gICAgICBpZiAodHlwZW9mIHZhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNtcCA9IHZhIDwgdmIgPyAtMSA6IHZhID4gdmIgPyAxIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNhID0gdmEgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBzYiA9IHZiID09IG51bGwgPyAnJyA6IFN0cmluZyh2YikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY21wID0gc2EgPCBzYiA/IC0xIDogc2EgPiBzYiA/IDEgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyBjbXAgOiAtY21wO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgbGEgdmFsZXVyIHRlbGxlIHF1J2VsbGUgZXN0IGFmZmljaMOpZSBkYW5zIGxhIGNlbGx1bGUsIGVuIHN1aXZhbnQgZXhhY3RlbWVudFxuICAgKiBsZSBtw6ptZSBjaGVtaW4gcXVlIHJlc29sdmVDZWxsVmFsdWUg4oCUIHV0aWxpc8OpZSBwb3VyIGxhIHJlY2hlcmNoZSBwbGVpbi10ZXh0ZS5cbiAgICogTmUgcGFzc2UgcGFzIHBhciBzb3J0VmFsdWUgKHZhbGV1ciBicnV0ZSBkZSB0cmkpIGNvbnRyYWlyZW1lbnQgw6AgZ2V0TGF6eUF3YXJlVmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGdldERpc3BsYXlWYWx1ZUZvclNlYXJjaChjb2w6IFRhYmxlQ29sdW1uUHJvdmlkZXI8VD4sIHJvdzogVCk6IGFueSB7XG4gICAgaWYgKGNvbC5sYXp5KSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLl9sYXp5Q29sdW1uU3RhdHVzLmdldChjb2wua2V5KSA/PyAnaWRsZSc7XG4gICAgICBpZiAoc3RhdHVzICE9PSAnbG9hZGVkJykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCByb3dNYXAgPSB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sLmtleSk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJvd01hcD8uZ2V0KHJvdykgPz8gJycpO1xuICAgIH1cbiAgICBpZiAoY29sLnNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sLnNlYXJjaFZhbHVlKHJvdywgMCk7XG4gICAgfVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gY29sLnZhbHVlID8gY29sLnZhbHVlKHJvdywgMCkgOiAocm93IGFzIGFueSk/Lltjb2wua2V5XTtcbiAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJhd1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5OiBzdHJpbmcsIHJvdzogVCk6IGFueSB7XG4gICAgY29uc3QgY29sRGVmID0gdGhpcy5fY29sdW1uTWFwLmdldChjb2x1bW5LZXkpO1xuICAgIGlmIChjb2xEZWY/LmxhenkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXp5Q29sdW1uRGF0YS5nZXQoY29sdW1uS2V5KT8uZ2V0KHJvdykgPz8gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNvbERlZj8uc29ydFZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKGNvbERlZi5zb3J0VmFsdWUocm93LCAwKSk7XG4gICAgfVxuICAgIGlmIChjb2xEZWY/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKGNvbERlZi52YWx1ZShyb3csIDApKTtcbiAgICB9XG4gICAgcmV0dXJuIChyb3cgYXMgYW55KVtjb2x1bW5LZXldO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ2VsbFZhbHVlKGNvbDogVGFibGVDb2x1bW5Qcm92aWRlcjxUPiwgcm93OiBULCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoY29sLmxhenkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuX2xhenlDb2x1bW5TdGF0dXMuZ2V0KGNvbC5rZXkpID8/ICdpZGxlJztcbiAgICAgIGlmIChzdGF0dXMgPT09ICdsb2FkaW5nJykgcmV0dXJuIExBWllfTE9BRElOR19WQUxVRTtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdlcnJvcicpIHJldHVybiBMQVpZX0VSUk9SX1ZBTFVFO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgY29uc3Qgcm93TWFwID0gdGhpcy5fbGF6eUNvbHVtbkRhdGEuZ2V0KGNvbC5rZXkpO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJvd01hcD8uZ2V0KHJvdykgPz8gJycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZVByb3ZpZGVyID0gY29sLnZhbHVlO1xuICAgIGNvbnN0IHJhd1ZhbHVlID0gdmFsdWVQcm92aWRlciA/IHZhbHVlUHJvdmlkZXIocm93LCBpbmRleCkgOiAocm93IGFzIGFueSk/Lltjb2wua2V5XTtcbiAgICByZXR1cm4gbm9ybWFsaXplQ2VsbFZhbHVlKHJhd1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwgdGhpcy5wYWdlU2l6ZSB8fCA1KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhZ2VTaXplT3B0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zIHx8IFs1LCAxMCwgMjBdO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KG9wdGlvbnMuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgPiAwKSldO1xuXG4gICAgaWYgKCF1bmlxdWUuaW5jbHVkZXModGhpcy5wYWdlU2l6ZSkpIHtcbiAgICAgIHVuaXF1ZS5wdXNoKHRoaXMucGFnZVNpemUpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFnZVNpemVPcHRpb25zR3JvdXBCeSgpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zR3JvdXBCeSB8fCB0aGlzLnJlc29sdmVkQ29uZmlnLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9ucyB8fCBbNSwgMTAsIDIwXTtcbiAgICBjb25zdCB1bmlxdWUgPSBbLi4ubmV3IFNldChvcHRpb25zLmZpbHRlcigodikgPT4gdiA+IDApKV07XG4gICAgaWYgKHRoaXMuZ3JvdXBQYWdlU2l6ZSA+IDAgJiYgIXVuaXF1ZS5pbmNsdWRlcyh0aGlzLmdyb3VwUGFnZVNpemUpKSB7XG4gICAgICB1bmlxdWUucHVzaCh0aGlzLmdyb3VwUGFnZVNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5pcXVlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRHcm91cFBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5yZXNvbHZlZENvbmZpZztcbiAgICBjb25zdCBvcHRpb25zID0gY2ZnLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9uc0dyb3VwQnkgfHwgY2ZnLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9ucztcbiAgICBpZiAob3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gb3B0aW9uc1swXTtcbiAgICByZXR1cm4gY2ZnLnBhZ2luYXRpb24/LnBhZ2VTaXplIHx8IDU7XG4gIH1cblxuICBwcml2YXRlIHVuaXF1ZUNvbHVtbnNCeUtleShjb2x1bW5zOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10pOiBUYWJsZUNvbHVtblByb3ZpZGVyPFQ+W10ge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICByZXR1cm4gY29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgaWYgKHNlZW4uaGFzKGNvbHVtbi5rZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFBhZ2luYXRvcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWdpbmF0b3IpIHJldHVybjtcblxuICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IG51bGw7XG4gICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuXG4gICAgaWYgKHRoaXMuX3BhZ2luYXRvclN1YnNjcmliZWQgIT09IHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0b3JTdWJzY3JpYmVkID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yIS5wYWdlU2l6ZTtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoeyBwYWdlSW5kZXg6IHRoaXMucGFnaW5hdG9yIS5wYWdlSW5kZXgsIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRvciEucGFnZVNpemUgfSk7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nUmVuZGVyICE9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Byb2plY3RDdXJyZW50UGFnZSgpO1xuICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFNvcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNvcnQpIHJldHVybjtcblxuICAgIHRoaXMudGFibGVEYXRhU291cmNlLnNvcnQgPSBudWxsIGFzIGFueTtcblxuICAgIGlmICh0aGlzLl9zb3J0U3Vic2NyaWJlZCAhPT0gdGhpcy5zb3J0KSB7XG4gICAgICB0aGlzLl9zb3J0U3Vic2NyaWJlZCA9IHRoaXMuc29ydDtcbiAgICAgIHRoaXMuc29ydC5zb3J0Q2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fYWN0aXZlU29ydCA9IHtcbiAgICAgICAgICBhY3RpdmU6IHRoaXMuc29ydC5hY3RpdmUsXG4gICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLnNvcnQuZGlyZWN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdCh7IGFjdGl2ZTogdGhpcy5zb3J0LmFjdGl2ZSwgZGlyZWN0aW9uOiB0aGlzLnNvcnQuZGlyZWN0aW9uIH0pO1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlbmRlcigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8c2VjdGlvbiBjbGFzcz1cImpxdWVyeS10YWJsZS13cmFwcGVyXCI+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+XG4gICAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbFJvd3NcIlxuICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICA+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdG9yLXJhbmdlLWxvYWRlclwiICpuZ0lmPVwiZWZmZWN0aXZlSXNMb2FkaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXJcIiAqbmdJZj1cImFjdGl2ZUdyb3VwQnlLZXlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJvdHRvbS1iYXItbGVmdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cC1yZXNldC1idG5cIiAoY2xpY2spPVwib25Hcm91cEJ5Q2hhbmdlKG51bGwpXCI+XG4gICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiZ3JvdXAtcmVzZXQtaWNvblwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA4YTUgNSAwIDEgMCA1LTUgNSA1IDAgMCAwLTMuNTQgMS40NkwzIDNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDN2Mi41SDUuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIHt7IGkxOG4uZ3JvdXBSZW1vdmUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWJhci1zZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1zb3J0LWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtc29ydC1sYWJlbFwiPnt7IGkxOG4uZ3JvdXBTb3J0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtc29ydC1idG5cIiBbY2xhc3MuYWN0aXZlXT1cImdyb3VwU29ydE9yZGVyID09PSAnYXNjJ1wiIChjbGljayk9XCJvbkdyb3VwU29ydFRvZ2dsZSgnYXNjJylcIiBbdGl0bGVdPVwiaTE4bi5ncm91cFNvcnRBc2NcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfdXB3YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ3JvdXAtc29ydC1idG5cIiBbY2xhc3MuYWN0aXZlXT1cImdyb3VwU29ydE9yZGVyID09PSAnZGVzYydcIiAoY2xpY2spPVwib25Hcm91cFNvcnRUb2dnbGUoJ2Rlc2MnKVwiIFt0aXRsZV09XCJpMThuLmdyb3VwU29ydERlc2NcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemUtbGFiZWxcIj57eyBpMThuLmdyb3VwUm93c1Blckdyb3VwIH19PC9kaXY+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCIgY2xhc3M9XCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJncm91cFBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cIm1hdC1tZGMtcGFnaW5hdG9yLXNlbGVjdC1wYWdlLXNpemUgZ3JvdXAtcGFnZS1zaXplLXBhbmVsXCJcbiAgICAgICAgICAgICAgICBbcGFuZWxXaWR0aF09XCInYXV0bydcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj57eyBncm91cFBhZ2VTaXplID09PSAwID8gaTE4bi5ncm91cFNob3dBbGwgOiBncm91cFBhZ2VTaXplIH19PC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBwYWdlU2l6ZU9wdGlvbnNHcm91cEJ5XCIgW3ZhbHVlXT1cIm9wdFwiPnt7IG9wdCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMFwiPnt7IGkxOG4uZ3JvdXBTaG93QWxsIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==
|