@oneteme/jquery-table 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,433 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { MatIconModule } from '@angular/material/icon';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, inject } from '@angular/core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/material/icon";
7
+ const EMPTY_CATEGORY_KEY = '__empty__';
8
+ const EMPTY_CATEGORY_LABEL = 'Vide';
9
+ export class SlicePanelComponent {
10
+ constructor() {
11
+ this.sliceConfigs = [];
12
+ this.columns = [];
13
+ this.data = [];
14
+ this.lazyData = new Map();
15
+ this.lazyStatus = new Map();
16
+ this.showToggle = true;
17
+ this.showCounts = true;
18
+ this.collapsedByDefault = false;
19
+ this.alwaysShow = false;
20
+ this.filterChange = new EventEmitter();
21
+ this.activeKeysChange = new EventEmitter();
22
+ this.dynamicSliceKeysChange = new EventEmitter();
23
+ this.collapsedChange = new EventEmitter();
24
+ this._cdr = inject(ChangeDetectorRef);
25
+ this.isCollapsed = false;
26
+ this.activeKeysBySlice = new Map();
27
+ this._expandedSlices = new Set();
28
+ this._dynamicSlices = [];
29
+ this._hiddenStaticSliceKeys = new Set();
30
+ // ── Cache ─────────────────────────────────────────────────────
31
+ this._cachedSlices = [];
32
+ this._countCache = new Map();
33
+ this.trackBySliceIndex = (index, _) => index;
34
+ this.trackByCategoryKey = (_, cat) => cat.key;
35
+ }
36
+ // ── Lifecycle ─────────────────────────────────────────────────
37
+ ngOnInit() {
38
+ this.isCollapsed = this.collapsedByDefault;
39
+ const initiallyHidden = (this.sliceConfigs || [])
40
+ .filter(s => s.hidden === true && !!s.columnKey)
41
+ .map(s => s.columnKey);
42
+ if (initiallyHidden.length) {
43
+ this._hiddenStaticSliceKeys = new Set([...this._hiddenStaticSliceKeys, ...initiallyHidden]);
44
+ }
45
+ }
46
+ ngOnChanges(changes) {
47
+ if (changes['sliceConfigs'] || changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']) {
48
+ this._refreshDynamicSlices();
49
+ this._rebuildCache();
50
+ this._cdr.markForCheck();
51
+ }
52
+ }
53
+ // ── Computed ──────────────────────────────────────────────────
54
+ get showPanel() {
55
+ const visibleStaticCount = (this.sliceConfigs || []).filter((s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)).length;
56
+ const hasCfg = visibleStaticCount > 0 || this._dynamicSlices.length > 0;
57
+ if (this.alwaysShow)
58
+ return hasCfg;
59
+ return hasCfg && (this.data?.length ?? 0) > 0;
60
+ }
61
+ get slices() {
62
+ return this._cachedSlices;
63
+ }
64
+ get staticSliceCount() {
65
+ return (this.sliceConfigs || []).filter((s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)).length;
66
+ }
67
+ get staticSlicesForMenu() {
68
+ return (this.sliceConfigs || [])
69
+ .filter((s) => !!s.columnKey)
70
+ .map((s) => ({ key: s.columnKey, title: s.title || s.columnKey }));
71
+ }
72
+ get activeDynamicSliceColumns() {
73
+ return this._dynamicSlices
74
+ .map((d) => (this.columns || []).find((c) => c.key === d.key))
75
+ .filter((c) => !!c);
76
+ }
77
+ get availableColumnsForDynamicSlice() {
78
+ const dynamicKeys = new Set(this._dynamicSlices.map((d) => d.key));
79
+ const staticKeys = new Set((this.sliceConfigs || []).map((s) => s.columnKey).filter((k) => !!k));
80
+ const existingKeys = new Set([...dynamicKeys, ...staticKeys]);
81
+ const seen = new Set();
82
+ return (this.columns || []).filter((c) => {
83
+ if (existingKeys.has(c.key) || seen.has(c.key))
84
+ return false;
85
+ seen.add(c.key);
86
+ return true;
87
+ });
88
+ }
89
+ get activeSliceByLabel() {
90
+ const staticActiveCount = (this.sliceConfigs || []).filter((s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey)).length;
91
+ const total = staticActiveCount + this._dynamicSlices.length;
92
+ if (total === 0)
93
+ return 'Aucun';
94
+ if (total === 1) {
95
+ const first = (this.sliceConfigs || []).find((s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey));
96
+ if (first)
97
+ return first.title || first.columnKey || '1';
98
+ return this.activeDynamicSliceColumns[0]?.header || '1';
99
+ }
100
+ return `${total} actifs`;
101
+ }
102
+ // ── UI state ──────────────────────────────────────────────────
103
+ isSliceCollapsed(sliceIndex) {
104
+ if (this._cachedSlices.length === 1) {
105
+ return this._expandedSlices.has(-1 - sliceIndex);
106
+ }
107
+ return !this._expandedSlices.has(sliceIndex);
108
+ }
109
+ toggleSliceCollapse(sliceIndex) {
110
+ if (this.slices.length === 1) {
111
+ const closedKey = -1 - sliceIndex;
112
+ if (this._expandedSlices.has(closedKey)) {
113
+ this._expandedSlices.delete(closedKey);
114
+ }
115
+ else {
116
+ this._expandedSlices.add(closedKey);
117
+ this._scrollSliceTitleIntoView(sliceIndex);
118
+ }
119
+ }
120
+ else {
121
+ if (this._expandedSlices.has(sliceIndex)) {
122
+ this._expandedSlices.delete(sliceIndex);
123
+ }
124
+ else {
125
+ this._expandedSlices.clear();
126
+ this._expandedSlices.add(sliceIndex);
127
+ this._scrollSliceTitleIntoView(sliceIndex);
128
+ }
129
+ }
130
+ this._cdr.markForCheck();
131
+ }
132
+ togglePanel() {
133
+ this.isCollapsed = !this.isCollapsed;
134
+ this.collapsedChange.emit(this.isCollapsed);
135
+ this._cdr.markForCheck();
136
+ }
137
+ isSliceDynamic(sliceIndex) {
138
+ return sliceIndex >= this.staticSliceCount;
139
+ }
140
+ isSliceLoading(sliceIndex) {
141
+ const staticSlice = (this.sliceConfigs || [])[sliceIndex];
142
+ if (staticSlice?.columnKey) {
143
+ const colDef = (this.columns || []).find(c => c.key === staticSlice.columnKey);
144
+ if (colDef?.lazy) {
145
+ const status = this.lazyStatus.get(staticSlice.columnKey) ?? 'idle';
146
+ return status === 'loading' || status === 'idle';
147
+ }
148
+ return false;
149
+ }
150
+ const key = this._getDynamicSliceColumnKey(sliceIndex);
151
+ if (!key)
152
+ return false;
153
+ const colDef = (this.columns || []).find(c => c.key === key);
154
+ if (!colDef?.lazy)
155
+ return false;
156
+ const status = this.lazyStatus.get(key) ?? 'idle';
157
+ return status === 'loading' || status === 'idle';
158
+ }
159
+ isStaticSliceVisible(columnKey) {
160
+ return !this._hiddenStaticSliceKeys.has(columnKey);
161
+ }
162
+ toggleStaticSlice(columnKey) {
163
+ const next = new Set(this._hiddenStaticSliceKeys);
164
+ if (next.has(columnKey))
165
+ next.delete(columnKey);
166
+ else
167
+ next.add(columnKey);
168
+ this._hiddenStaticSliceKeys = next;
169
+ this._rebuildCache();
170
+ this._emitFilter();
171
+ this._cdr.markForCheck();
172
+ }
173
+ // ── Selection ─────────────────────────────────────────────────
174
+ getSliceIcon(slice) {
175
+ if (slice.icon)
176
+ return slice.icon;
177
+ if (slice.columnKey) {
178
+ return (this.columns || []).find(c => c.key === slice.columnKey)?.icon;
179
+ }
180
+ return undefined;
181
+ }
182
+ isSliceCategoryActive(sliceIndex, categoryKey) {
183
+ return this.activeKeysBySlice.get(sliceIndex)?.has(categoryKey) ?? false;
184
+ }
185
+ isSliceAllActive(sliceIndex) {
186
+ return !this.activeKeysBySlice.has(sliceIndex) || this.activeKeysBySlice.get(sliceIndex).size === 0;
187
+ }
188
+ sliceCategoryCount(sliceIndex, categoryKey) {
189
+ const cacheKey = `${sliceIndex}:${categoryKey}`;
190
+ if (this._countCache.has(cacheKey)) {
191
+ return this._countCache.get(cacheKey);
192
+ }
193
+ const slice = this._cachedSlices[sliceIndex];
194
+ if (!slice)
195
+ return 0;
196
+ const category = (slice.categories || []).find((c) => c.key === categoryKey);
197
+ const count = category ? (this.data || []).filter((row) => category.filter(row)).length : 0;
198
+ this._countCache.set(cacheKey, count);
199
+ return count;
200
+ }
201
+ isSliceEmpty(sliceIndex) {
202
+ const slice = this._cachedSlices[sliceIndex];
203
+ if (!slice)
204
+ return true;
205
+ return (slice.categories || []).every(c => this.sliceCategoryCount(sliceIndex, c.key) === 0);
206
+ }
207
+ onSliceCategorySelected(sliceIndex, categoryKey) {
208
+ const slice = this.slices[sliceIndex];
209
+ if (!slice)
210
+ return;
211
+ if (!this.activeKeysBySlice.has(sliceIndex)) {
212
+ this.activeKeysBySlice.set(sliceIndex, new Set());
213
+ }
214
+ const activeKeys = this.activeKeysBySlice.get(sliceIndex);
215
+ if (slice.multiSelect === false) {
216
+ if (activeKeys.has(categoryKey)) {
217
+ activeKeys.clear();
218
+ }
219
+ else {
220
+ activeKeys.clear();
221
+ activeKeys.add(categoryKey);
222
+ }
223
+ }
224
+ else {
225
+ if (activeKeys.has(categoryKey)) {
226
+ activeKeys.delete(categoryKey);
227
+ }
228
+ else {
229
+ activeKeys.add(categoryKey);
230
+ }
231
+ }
232
+ this._emitFilter();
233
+ this._cdr.markForCheck();
234
+ }
235
+ onSliceAllSelected(sliceIndex) {
236
+ if (this.activeKeysBySlice.has(sliceIndex)) {
237
+ this.activeKeysBySlice.get(sliceIndex).clear();
238
+ }
239
+ this._emitFilter();
240
+ this._cdr.markForCheck();
241
+ }
242
+ // ── Dynamic slice management ──────────────────────────────────
243
+ addDynamicSlice(column) {
244
+ const distinctValues = this._computeDistinctValues(column.key);
245
+ const newSlice = {
246
+ title: column.header,
247
+ columnKey: column.key,
248
+ categories: distinctValues.map((v) => this._buildCategoryFromValue(column.key, v)),
249
+ };
250
+ this._dynamicSlices = [...this._dynamicSlices, { key: column.key, slice: newSlice }];
251
+ this._rebuildCache();
252
+ this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));
253
+ this._emitFilter();
254
+ this._cdr.markForCheck();
255
+ }
256
+ removeDynamicSlice(sliceIndex) {
257
+ const dynamicIndex = sliceIndex - this.staticSliceCount;
258
+ if (dynamicIndex < 0)
259
+ return;
260
+ const newActiveKeys = new Map();
261
+ this.activeKeysBySlice.forEach((keys, idx) => {
262
+ if (idx < sliceIndex)
263
+ newActiveKeys.set(idx, keys);
264
+ else if (idx > sliceIndex)
265
+ newActiveKeys.set(idx - 1, keys);
266
+ });
267
+ this.activeKeysBySlice = newActiveKeys;
268
+ this._dynamicSlices = this._dynamicSlices.filter((_, i) => i !== dynamicIndex);
269
+ this._rebuildCache();
270
+ this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));
271
+ this._emitFilter();
272
+ this._cdr.markForCheck();
273
+ }
274
+ removeDynamicSliceByKey(key) {
275
+ const dynamicIndex = this._dynamicSlices.findIndex((d) => d.key === key);
276
+ if (dynamicIndex < 0)
277
+ return;
278
+ const sliceIndex = this.staticSliceCount + dynamicIndex;
279
+ this.removeDynamicSlice(sliceIndex);
280
+ }
281
+ // ── Private helpers ───────────────────────────────────────────
282
+ _emitFilter() {
283
+ const slices = this.slices;
284
+ const activeKeysBySlice = this.activeKeysBySlice;
285
+ this.activeKeysChange.emit(slices.map((_, i) => {
286
+ const keys = activeKeysBySlice.get(i);
287
+ return keys ? [...keys] : [];
288
+ }));
289
+ const pred = (row) => slices.every((slice, sliceIndex) => {
290
+ const activeKeys = activeKeysBySlice.get(sliceIndex);
291
+ if (!activeKeys || activeKeys.size === 0)
292
+ return true;
293
+ return [...activeKeys].some((key) => {
294
+ const category = (slice.categories || []).find((c) => c.key === key);
295
+ return category ? category.filter(row) : false;
296
+ });
297
+ });
298
+ this.filterChange.emit(pred);
299
+ }
300
+ _getDynamicSliceColumnKey(sliceIndex) {
301
+ const dynamicIndex = sliceIndex - this.staticSliceCount;
302
+ return this._dynamicSlices[dynamicIndex]?.key ?? null;
303
+ }
304
+ _materializeSlice(slice) {
305
+ if (!slice.columnKey || (slice.categories && slice.categories.length > 0)) {
306
+ return slice;
307
+ }
308
+ const col = (this.columns || []).find(c => c.key === slice.columnKey);
309
+ const isLazy = !!col?.lazy;
310
+ if (isLazy && this.lazyStatus.get(slice.columnKey) !== 'loaded') {
311
+ return { ...slice, categories: [] };
312
+ }
313
+ if (slice.bucket) {
314
+ const distinctValues = [...new Set((this.data || []).map(slice.bucket))].sort();
315
+ return {
316
+ ...slice,
317
+ categories: distinctValues.map((v) => ({
318
+ key: v,
319
+ label: v,
320
+ filter: (row) => slice.bucket(row) === v,
321
+ })),
322
+ };
323
+ }
324
+ const distinctValues = this._computeDistinctValues(slice.columnKey);
325
+ return {
326
+ ...slice,
327
+ categories: distinctValues.map((v) => this._buildCategoryFromValue(slice.columnKey, v)),
328
+ };
329
+ }
330
+ _buildCategoryFromValue(columnKey, v) {
331
+ if (v === EMPTY_CATEGORY_KEY) {
332
+ return {
333
+ key: EMPTY_CATEGORY_KEY,
334
+ label: EMPTY_CATEGORY_LABEL,
335
+ filter: (row) => {
336
+ const val = this._getLazyAwareValue(columnKey, row);
337
+ return val == null || val === '';
338
+ },
339
+ };
340
+ }
341
+ return {
342
+ key: v,
343
+ label: v,
344
+ filter: (row) => String(this._getLazyAwareValue(columnKey, row) ?? '') === v,
345
+ };
346
+ }
347
+ _computeDistinctValues(columnKey) {
348
+ const rawValues = (this.data || []).map((row) => {
349
+ const val = this._getLazyAwareValue(columnKey, row);
350
+ return val != null && val !== '' ? String(val) : null;
351
+ });
352
+ const distinct = [...new Set(rawValues.filter((v) => v !== null))].sort();
353
+ if (rawValues.some(v => v === null)) {
354
+ distinct.push(EMPTY_CATEGORY_KEY);
355
+ }
356
+ return distinct;
357
+ }
358
+ _getLazyAwareValue(columnKey, row) {
359
+ const colDef = (this.columns || []).find(c => c.key === columnKey);
360
+ if (colDef?.lazy) {
361
+ return this.lazyData.get(columnKey)?.get(row) ?? null;
362
+ }
363
+ if (colDef?.value) {
364
+ return colDef.value(row, 0);
365
+ }
366
+ return row[columnKey];
367
+ }
368
+ _rebuildCache() {
369
+ const staticSlices = (this.sliceConfigs || []).filter((s) => !s.columnKey || !this._hiddenStaticSliceKeys.has(s.columnKey));
370
+ const allSlices = [...staticSlices, ...this._dynamicSlices.map((d) => d.slice)];
371
+ this._cachedSlices = allSlices.map((slice) => this._materializeSlice(slice));
372
+ this._countCache.clear();
373
+ }
374
+ _refreshDynamicSlices() {
375
+ this._dynamicSlices = this._dynamicSlices.map(({ key, slice }) => {
376
+ const distinctValues = this._computeDistinctValues(key);
377
+ return {
378
+ key,
379
+ slice: {
380
+ ...slice,
381
+ categories: distinctValues.map((v) => this._buildCategoryFromValue(key, v)),
382
+ },
383
+ };
384
+ });
385
+ }
386
+ _scrollSliceTitleIntoView(sliceIndex) {
387
+ setTimeout(() => {
388
+ const container = this.slicePanelBodyRef?.nativeElement;
389
+ if (!container)
390
+ return;
391
+ const row = container.querySelector(`[data-slice-index="${sliceIndex}"]`);
392
+ if (!row)
393
+ return;
394
+ row.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
395
+ }, 0);
396
+ }
397
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlicePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
398
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SlicePanelComponent, isStandalone: true, selector: "slice-panel", inputs: { sliceConfigs: "sliceConfigs", columns: "columns", data: "data", lazyData: "lazyData", lazyStatus: "lazyStatus", showToggle: "showToggle", showCounts: "showCounts", collapsedByDefault: "collapsedByDefault", alwaysShow: "alwaysShow" }, outputs: { filterChange: "filterChange", activeKeysChange: "activeKeysChange", dynamicSliceKeysChange: "dynamicSliceKeysChange", collapsedChange: "collapsedChange" }, viewQueries: [{ propertyName: "slicePanelBodyRef", first: true, predicate: ["slicePanelBody"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n <mat-icon class=\"slice-panel-title-icon\" fontSet=\"material-icons-outlined\">filter_list</mat-icon>\n {{ slices.length > 1 ? 'Filtres' : 'Filtre' }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? 'D\u00E9plier le filtre' : 'Replier le filtre'\"\n (click)=\"togglePanel()\"\n >\n <span class=\"slice-toggle-icon\">{{ isCollapsed ? '\u203A' : '\u2039' }}</span>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">\u203A</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\" fontSet=\"material-icons-outlined\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || 'Filtrer' }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >\u00D7</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">Aucune donn\u00E9e</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box}.slice-panel-wrapper{height:100%;max-height:100%;overflow-y:auto;box-sizing:border-box}.slice-panel{margin-top:0;border:1px solid var(--jqt-border-color);border-radius:10px;background:var(--jqt-surface-color);display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden;box-sizing:border-box}.slice-panel-header{flex-shrink:0;display:flex;justify-content:flex-end;align-items:center;height:34px;padding:0 8px;margin-bottom:8px}.slice-panel-header:has(.slice-panel-title){justify-content:space-between;padding-left:12px}.slice-panel-body{flex:1 1 0;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:4px;padding:4px 10px 10px;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-panel-body::-webkit-scrollbar{width:2px}.slice-panel-body::-webkit-scrollbar-thumb{background:var(--jqt-primary-color);border-radius:4px}.slice-panel-title{margin:0;padding-top:2px;font-size:11px;font-weight:700;line-height:1;text-transform:uppercase;letter-spacing:.08em;color:var(--jqt-text-color);-webkit-user-select:none;user-select:none;align-self:center;display:inline-flex;align-items:center;gap:5px}.slice-panel-title .slice-panel-title-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.slice-section-items{display:flex;flex-direction:column;gap:2px;flex:0 0 auto;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-section-items::-webkit-scrollbar{width:2px}.slice-section-items .slice-empty-state{padding:8px 10px;font-size:12px;color:var(--jqt-text-muted, #9ca3af);font-style:italic;text-align:center}.slice-section-items::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.slice-toggle{border:0;background:var(--jqt-surface-color);color:var(--jqt-text-color);border-radius:6px;width:22px;height:22px;padding:0;font-size:14px;text-align:center;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1}.slice-toggle-icon{width:100%;height:100%;display:inline-flex;align-items:center;justify-content:center;line-height:1}.slice-panel.collapsed{border-color:transparent;background:transparent;overflow:visible}.slice-panel.collapsed .slice-panel-header{height:34px;padding:0;justify-content:center;align-items:center}.slice-panel.collapsed .slice-toggle{width:34px;height:34px;border:1px solid var(--jqt-border-color);background:var(--jqt-surface-color);border-radius:8px;font-size:16px}.slice-panel.collapsed .slice-toggle:hover{border-color:var(--jqt-text-muted)}.slice-title-row{display:flex;align-items:center;justify-content:space-between;gap:6px;margin:4px 0 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.slice-title-row:hover .slice-title{color:var(--jqt-text-color)}.slice-title-row:hover .slice-title-chevron{color:var(--jqt-text-secondary)}.slice-title-row:first-of-type .slice-title{margin-top:0}.slice-title-chevron{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:var(--jqt-text-muted);transition:transform .15s ease;transform:rotate(0);position:relative;top:-1px}.slice-title-chevron.expanded{transform:rotate(90deg)}.slice-title{flex:1 1 auto;margin:0;font-size:14px;font-weight:600;color:var(--jqt-title-color)}.slice-title-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-title-color)}.slice-remove-btn{background:none;border:none;cursor:pointer;color:var(--jqt-border-color);font-size:12px;padding:0 2px;line-height:1;flex-shrink:0;opacity:.5;transition:opacity .15s,color .15s}.slice-remove-btn:hover{color:var(--jqt-text-secondary);opacity:1}.slice-title-row:hover .slice-remove-btn{opacity:.8}.slice-item{display:flex;justify-content:space-between;align-items:center;text-align:left;width:100%;padding:5px 10px 5px 16px;background:transparent;border:0;cursor:pointer;border-radius:8px;color:var(--jqt-text-color);box-sizing:border-box;min-width:0;gap:8px}.slice-item.active{background:var(--jqt-row-hover-bg);font-weight:600}.slice-item.slice-multi{padding-left:6px}.slice-item span:first-child{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slice-item span:last-child{flex:0 0 auto;min-width:1.2em;text-align:right}.slice-check-box{flex:0 0 16px;width:16px;height:16px;border:1.5px solid var(--jqt-text-muted);border-radius:4px;background:var(--jqt-surface-color);display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;transition:background .15s,border-color .15s}.slice-check-box.checked{background:var(--jqt-text-secondary);border-color:var(--jqt-text-secondary)}.slice-check-box.checked:after{content:\"\";display:block;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translateY(-1px)}.slice-divider{border:none;border-top:1px solid var(--jqt-border-color);margin:6px 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}.slice-lazy-loading{display:flex;flex-direction:column;gap:8px;padding:8px 10px}.slice-lazy-loading .lazy-skeleton{width:80%}.slice-lazy-loading .lazy-skeleton:nth-child(2){width:60%}.slice-lazy-loading .lazy-skeleton:nth-child(3){width:45%}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
399
+ }
400
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlicePanelComponent, decorators: [{
401
+ type: Component,
402
+ args: [{ standalone: true, selector: 'slice-panel', imports: [CommonModule, MatIconModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n <mat-icon class=\"slice-panel-title-icon\" fontSet=\"material-icons-outlined\">filter_list</mat-icon>\n {{ slices.length > 1 ? 'Filtres' : 'Filtre' }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? 'D\u00E9plier le filtre' : 'Replier le filtre'\"\n (click)=\"togglePanel()\"\n >\n <span class=\"slice-toggle-icon\">{{ isCollapsed ? '\u203A' : '\u2039' }}</span>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">\u203A</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\" fontSet=\"material-icons-outlined\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || 'Filtrer' }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >\u00D7</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">Aucune donn\u00E9e</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box}.slice-panel-wrapper{height:100%;max-height:100%;overflow-y:auto;box-sizing:border-box}.slice-panel{margin-top:0;border:1px solid var(--jqt-border-color);border-radius:10px;background:var(--jqt-surface-color);display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden;box-sizing:border-box}.slice-panel-header{flex-shrink:0;display:flex;justify-content:flex-end;align-items:center;height:34px;padding:0 8px;margin-bottom:8px}.slice-panel-header:has(.slice-panel-title){justify-content:space-between;padding-left:12px}.slice-panel-body{flex:1 1 0;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:4px;padding:4px 10px 10px;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-panel-body::-webkit-scrollbar{width:2px}.slice-panel-body::-webkit-scrollbar-thumb{background:var(--jqt-primary-color);border-radius:4px}.slice-panel-title{margin:0;padding-top:2px;font-size:11px;font-weight:700;line-height:1;text-transform:uppercase;letter-spacing:.08em;color:var(--jqt-text-color);-webkit-user-select:none;user-select:none;align-self:center;display:inline-flex;align-items:center;gap:5px}.slice-panel-title .slice-panel-title-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.slice-section-items{display:flex;flex-direction:column;gap:2px;flex:0 0 auto;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-section-items::-webkit-scrollbar{width:2px}.slice-section-items .slice-empty-state{padding:8px 10px;font-size:12px;color:var(--jqt-text-muted, #9ca3af);font-style:italic;text-align:center}.slice-section-items::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.slice-toggle{border:0;background:var(--jqt-surface-color);color:var(--jqt-text-color);border-radius:6px;width:22px;height:22px;padding:0;font-size:14px;text-align:center;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1}.slice-toggle-icon{width:100%;height:100%;display:inline-flex;align-items:center;justify-content:center;line-height:1}.slice-panel.collapsed{border-color:transparent;background:transparent;overflow:visible}.slice-panel.collapsed .slice-panel-header{height:34px;padding:0;justify-content:center;align-items:center}.slice-panel.collapsed .slice-toggle{width:34px;height:34px;border:1px solid var(--jqt-border-color);background:var(--jqt-surface-color);border-radius:8px;font-size:16px}.slice-panel.collapsed .slice-toggle:hover{border-color:var(--jqt-text-muted)}.slice-title-row{display:flex;align-items:center;justify-content:space-between;gap:6px;margin:4px 0 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.slice-title-row:hover .slice-title{color:var(--jqt-text-color)}.slice-title-row:hover .slice-title-chevron{color:var(--jqt-text-secondary)}.slice-title-row:first-of-type .slice-title{margin-top:0}.slice-title-chevron{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:var(--jqt-text-muted);transition:transform .15s ease;transform:rotate(0);position:relative;top:-1px}.slice-title-chevron.expanded{transform:rotate(90deg)}.slice-title{flex:1 1 auto;margin:0;font-size:14px;font-weight:600;color:var(--jqt-title-color)}.slice-title-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-title-color)}.slice-remove-btn{background:none;border:none;cursor:pointer;color:var(--jqt-border-color);font-size:12px;padding:0 2px;line-height:1;flex-shrink:0;opacity:.5;transition:opacity .15s,color .15s}.slice-remove-btn:hover{color:var(--jqt-text-secondary);opacity:1}.slice-title-row:hover .slice-remove-btn{opacity:.8}.slice-item{display:flex;justify-content:space-between;align-items:center;text-align:left;width:100%;padding:5px 10px 5px 16px;background:transparent;border:0;cursor:pointer;border-radius:8px;color:var(--jqt-text-color);box-sizing:border-box;min-width:0;gap:8px}.slice-item.active{background:var(--jqt-row-hover-bg);font-weight:600}.slice-item.slice-multi{padding-left:6px}.slice-item span:first-child{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slice-item span:last-child{flex:0 0 auto;min-width:1.2em;text-align:right}.slice-check-box{flex:0 0 16px;width:16px;height:16px;border:1.5px solid var(--jqt-text-muted);border-radius:4px;background:var(--jqt-surface-color);display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;transition:background .15s,border-color .15s}.slice-check-box.checked{background:var(--jqt-text-secondary);border-color:var(--jqt-text-secondary)}.slice-check-box.checked:after{content:\"\";display:block;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translateY(-1px)}.slice-divider{border:none;border-top:1px solid var(--jqt-border-color);margin:6px 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}.slice-lazy-loading{display:flex;flex-direction:column;gap:8px;padding:8px 10px}.slice-lazy-loading .lazy-skeleton{width:80%}.slice-lazy-loading .lazy-skeleton:nth-child(2){width:60%}.slice-lazy-loading .lazy-skeleton:nth-child(3){width:45%}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}\n"] }]
403
+ }], propDecorators: { sliceConfigs: [{
404
+ type: Input
405
+ }], columns: [{
406
+ type: Input
407
+ }], data: [{
408
+ type: Input
409
+ }], lazyData: [{
410
+ type: Input
411
+ }], lazyStatus: [{
412
+ type: Input
413
+ }], showToggle: [{
414
+ type: Input
415
+ }], showCounts: [{
416
+ type: Input
417
+ }], collapsedByDefault: [{
418
+ type: Input
419
+ }], alwaysShow: [{
420
+ type: Input
421
+ }], filterChange: [{
422
+ type: Output
423
+ }], activeKeysChange: [{
424
+ type: Output
425
+ }], dynamicSliceKeysChange: [{
426
+ type: Output
427
+ }], collapsedChange: [{
428
+ type: Output
429
+ }], slicePanelBodyRef: [{
430
+ type: ViewChild,
431
+ args: ['slicePanelBody']
432
+ }] } });
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUNyRCxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUMzQyxTQUFTLEVBQUUsTUFBTSxFQUNqQyxNQUFNLGVBQWUsQ0FBQzs7OztBQUd2QixNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztBQUN2QyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQVVwQyxNQUFNLE9BQU8sbUJBQW1CO0lBUmhDO1FBVVcsaUJBQVksR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLFlBQU8sR0FBd0IsRUFBRSxDQUFDO1FBQ2xDLFNBQUksR0FBUSxFQUFFLENBQUM7UUFDZixhQUFRLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsZUFBVSxHQUF5RCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzdFLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVsQixpQkFBWSxH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O3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFc0IsaUJBQWlCO3NCQUE3QyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTbGljZUNvbHVtbkRlZiwgU2xpY2VDb25maWcgfSBmcm9tICcuL3NsaWNlLXBhbmVsLm1vZGVsJztcblxuY29uc3QgRU1QVFlfQ0FURUdPUllfS0VZID0gJ19fZW1wdHlfXyc7XG5jb25zdCBFTVBUWV9DQVRFR09SWV9MQUJFTCA9ICdWaWRlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnc2xpY2UtcGFuZWwnLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWNlLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2xpY2UtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNsaWNlUGFuZWxDb21wb25lbnQ8VCA9IGFueT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgc2xpY2VDb25maWdzOiBTbGljZUNvbmZpZzxUPltdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IFNsaWNlQ29sdW1uRGVmPFQ+W10gPSBbXTtcbiAgQElucHV0KCkgZGF0YTogVFtdID0gW107XG4gIEBJbnB1dCgpIGxhenlEYXRhOiBNYXA8c3RyaW5nLCBNYXA8YW55LCBhbnk+PiA9IG5ldyBNYXAoKTtcbiAgQElucHV0KCkgbGF6eVN0YXR1czogTWFwPHN0cmluZywgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InPiA9IG5ldyBNYXAoKTtcbiAgQElucHV0KCkgc2hvd1RvZ2dsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDb3VudHMgPSB0cnVlO1xuICBASW5wdXQoKSBjb2xsYXBzZWRCeURlZmF1bHQgPSBmYWxzZTtcbiAgQElucHV0KCkgYWx3YXlzU2hvdyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPChyb3c6IFQpID0+IGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBhY3RpdmVLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXVtdPigpO1xuICBAT3V0cHV0KCkgZHluYW1pY1NsaWNlS2V5c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIEBPdXRwdXQoKSBjb2xsYXBzZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2xpY2VQYW5lbEJvZHknKSBzbGljZVBhbmVsQm9keVJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgX2NkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgaXNDb2xsYXBzZWQgPSBmYWxzZTtcbiAgYWN0aXZlS2V5c0J5U2xpY2U6IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfZXhwYW5kZWRTbGljZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgX2R5bmFtaWNTbGljZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHNsaWNlOiBTbGljZUNvbmZpZzxUPiB9PiA9IFtdO1xuICBwcml2YXRlIF9oaWRkZW5TdGF0aWNTbGljZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyDilIDilIAgQ2FjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIF9jYWNoZWRTbGljZXM6IFNsaWNlQ29uZmlnPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBfY291bnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgcmVhZG9ubHkgdHJhY2tCeVNsaWNlSW5kZXggPSAoaW5kZXg6IG51bWJlciwgXzogYW55KTogbnVtYmVyID0+IGluZGV4O1xuICByZWFkb25seSB0cmFja0J5Q2F0ZWdvcnlLZXkgPSAoXzogbnVtYmVyLCBjYXQ6IGFueSk6IHN0cmluZyA9PiBjYXQua2V5O1xuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IHRoaXMuY29sbGFwc2VkQnlEZWZhdWx0O1xuICAgIGNvbnN0IGluaXRpYWxseUhpZGRlbiA9ICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSlcbiAgICAgIC5maWx0ZXIocyA9PiBzLmhpZGRlbiA9PT0gdHJ1ZSAmJiAhIXMuY29sdW1uS2V5KVxuICAgICAgLm1hcChzID0+IHMuY29sdW1uS2V5ISk7XG4gICAgaWYgKGluaXRpYWxseUhpZGRlbi5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hpZGRlblN0YXRpY1NsaWNlS2V5cyA9IG5ldyBTZXQoWy4uLnRoaXMuX2hpZGRlblN0YXRpY1NsaWNlS2V5cywgLi4uaW5pdGlhbGx5SGlkZGVuXSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzbGljZUNvbmZpZ3MnXSB8fCBjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY29sdW1ucyddIHx8IGNoYW5nZXNbJ2xhenlEYXRhJ10gfHwgY2hhbmdlc1snbGF6eVN0YXR1cyddKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoRHluYW1pY1NsaWNlcygpO1xuICAgICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbXB1dGVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldCBzaG93UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmlzaWJsZVN0YXRpY0NvdW50ID0gKHRoaXMuc2xpY2VDb25maWdzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAocykgPT4gIXMuY29sdW1uS2V5IHx8ICF0aGlzLl9oaWRkZW5TdGF0aWNTbGljZUtleXMuaGFzKHMuY29sdW1uS2V5KVxuICAgICkubGVuZ3RoO1xuICAgIGNvbnN0IGhhc0NmZyA9IHZpc2libGVTdGF0aWNDb3VudCA+IDAgfHwgdGhpcy5fZHluYW1pY1NsaWNlcy5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHJldHVybiBoYXNDZmc7XG4gICAgcmV0dXJuIGhhc0NmZyAmJiAodGhpcy5kYXRhPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgZ2V0IHNsaWNlcygpOiBTbGljZUNvbmZpZzxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU2xpY2VzO1xuICB9XG5cbiAgZ2V0IHN0YXRpY1NsaWNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuc2xpY2VDb25maWdzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAocykgPT4gIXMuY29sdW1uS2V5IHx8ICF0aGlzLl9oaWRkZW5TdGF0aWNTbGljZUtleXMuaGFzKHMuY29sdW1uS2V5KVxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHN0YXRpY1NsaWNlc0Zvck1lbnUoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoKHMpID0+ICEhcy5jb2x1bW5LZXkpXG4gICAgICAubWFwKChzKSA9PiAoeyBrZXk6IHMuY29sdW1uS2V5ISwgdGl0bGU6IHMudGl0bGUgfHwgcy5jb2x1bW5LZXkhIH0pKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFNsaWNlQ29sdW1uRGVmPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9keW5hbWljU2xpY2VzXG4gICAgICAubWFwKChkKSA9PiAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKChjKSA9PiBjLmtleSA9PT0gZC5rZXkpKVxuICAgICAgLmZpbHRlcigoYyk6IGMgaXMgU2xpY2VDb2x1bW5EZWY8VD4gPT4gISFjKTtcbiAgfVxuXG4gIGdldCBhdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFNsaWNlQ29sdW1uRGVmPFQ+W10ge1xuICAgIGNvbnN0IGR5bmFtaWNLZXlzID0gbmV3IFNldCh0aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5rZXkpKTtcbiAgICBjb25zdCBzdGF0aWNLZXlzID0gbmV3IFNldChcbiAgICAgICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkubWFwKChzKSA9PiBzLmNvbHVtbktleSkuZmlsdGVyKChrKTogayBpcyBzdHJpbmcgPT4gISFrKVxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChbLi4uZHluYW1pY0tleXMsIC4uLnN0YXRpY0tleXNdKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nS2V5cy5oYXMoYy5rZXkpIHx8IHNlZW4uaGFzKGMua2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoYy5rZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgYWN0aXZlU2xpY2VCeUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhdGljQWN0aXZlQ291bnQgPSAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLmZpbHRlcihcbiAgICAgIChzKSA9PiAhcy5jb2x1bW5LZXkgfHwgIXRoaXMuX2hpZGRlblN0YXRpY1NsaWNlS2V5cy5oYXMocy5jb2x1bW5LZXkpXG4gICAgKS5sZW5ndGg7XG4gICAgY29uc3QgdG90YWwgPSBzdGF0aWNBY3RpdmVDb3VudCArIHRoaXMuX2R5bmFtaWNTbGljZXMubGVuZ3RoO1xuICAgIGlmICh0b3RhbCA9PT0gMCkgcmV0dXJuICdBdWN1bic7XG4gICAgaWYgKHRvdGFsID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdCA9ICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkuZmluZChcbiAgICAgICAgKHMpID0+ICFzLmNvbHVtbktleSB8fCAhdGhpcy5faGlkZGVuU3RhdGljU2xpY2VLZXlzLmhhcyhzLmNvbHVtbktleSlcbiAgICAgICk7XG4gICAgICBpZiAoZmlyc3QpIHJldHVybiBmaXJzdC50aXRsZSB8fCBmaXJzdC5jb2x1bW5LZXkgfHwgJzEnO1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRHluYW1pY1NsaWNlQ29sdW1uc1swXT8uaGVhZGVyIHx8ICcxJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3RvdGFsfSBhY3RpZnNgO1xuICB9XG5cbiAgLy8g4pSA4pSAIFVJIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGlzU2xpY2VDb2xsYXBzZWQoc2xpY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZFNsaWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9leHBhbmRlZFNsaWNlcy5oYXMoLTEgLSBzbGljZUluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLl9leHBhbmRlZFNsaWNlcy5oYXMoc2xpY2VJbmRleCk7XG4gIH1cblxuICB0b2dnbGVTbGljZUNvbGxhcHNlKHNsaWNlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNsaWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNsb3NlZEtleSA9IC0xIC0gc2xpY2VJbmRleDtcbiAgICAgIGlmICh0aGlzLl9leHBhbmRlZFNsaWNlcy5oYXMoY2xvc2VkS2V5KSkge1xuICAgICAgICB0aGlzLl9leHBhbmRlZFNsaWNlcy5kZWxldGUoY2xvc2VkS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmFkZChjbG9zZWRLZXkpO1xuICAgICAgICB0aGlzLl9zY3JvbGxTbGljZVRpdGxlSW50b1ZpZXcoc2xpY2VJbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9leHBhbmRlZFNsaWNlcy5oYXMoc2xpY2VJbmRleCkpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRTbGljZXMuZGVsZXRlKHNsaWNlSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRTbGljZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRTbGljZXMuYWRkKHNsaWNlSW5kZXgpO1xuICAgICAgICB0aGlzLl9zY3JvbGxTbGljZVRpdGxlSW50b1ZpZXcoc2xpY2VJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHRvZ2dsZVBhbmVsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSAhdGhpcy5pc0NvbGxhcHNlZDtcbiAgICB0aGlzLmNvbGxhcHNlZENoYW5nZS5lbWl0KHRoaXMuaXNDb2xsYXBzZWQpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGlzU2xpY2VEeW5hbWljKHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzbGljZUluZGV4ID49IHRoaXMuc3RhdGljU2xpY2VDb3VudDtcbiAgfVxuXG4gIGlzU2xpY2VMb2FkaW5nKHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXRpY1NsaWNlID0gKHRoaXMuc2xpY2VDb25maWdzIHx8IFtdKVtzbGljZUluZGV4XTtcbiAgICBpZiAoc3RhdGljU2xpY2U/LmNvbHVtbktleSkge1xuICAgICAgY29uc3QgY29sRGVmID0gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmluZChjID0+IGMua2V5ID09PSBzdGF0aWNTbGljZS5jb2x1bW5LZXkpO1xuICAgICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmxhenlTdGF0dXMuZ2V0KHN0YXRpY1NsaWNlLmNvbHVtbktleSEpID8/ICdpZGxlJztcbiAgICAgICAgcmV0dXJuIHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ2lkbGUnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSB0aGlzLl9nZXREeW5hbWljU2xpY2VDb2x1bW5LZXkoc2xpY2VJbmRleCk7XG4gICAgaWYgKCFrZXkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgaWYgKCFjb2xEZWY/LmxhenkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmxhenlTdGF0dXMuZ2V0KGtleSkgPz8gJ2lkbGUnO1xuICAgIHJldHVybiBzdGF0dXMgPT09ICdsb2FkaW5nJyB8fCBzdGF0dXMgPT09ICdpZGxlJztcbiAgfVxuXG4gIGlzU3RhdGljU2xpY2VWaXNpYmxlKGNvbHVtbktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9oaWRkZW5TdGF0aWNTbGljZUtleXMuaGFzKGNvbHVtbktleSk7XG4gIH1cblxuICB0b2dnbGVTdGF0aWNTbGljZShjb2x1bW5LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHRoaXMuX2hpZGRlblN0YXRpY1NsaWNlS2V5cyk7XG4gICAgaWYgKG5leHQuaGFzKGNvbHVtbktleSkpIG5leHQuZGVsZXRlKGNvbHVtbktleSk7XG4gICAgZWxzZSBuZXh0LmFkZChjb2x1bW5LZXkpO1xuICAgIHRoaXMuX2hpZGRlblN0YXRpY1NsaWNlS2V5cyA9IG5leHQ7XG4gICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFNsaWNlSWNvbihzbGljZTogU2xpY2VDb25maWc8VD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChzbGljZS5pY29uKSByZXR1cm4gc2xpY2UuaWNvbjtcbiAgICBpZiAoc2xpY2UuY29sdW1uS2V5KSB7XG4gICAgICByZXR1cm4gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmluZChjID0+IGMua2V5ID09PSBzbGljZS5jb2x1bW5LZXkpPy5pY29uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlzU2xpY2VDYXRlZ29yeUFjdGl2ZShzbGljZUluZGV4OiBudW1iZXIsIGNhdGVnb3J5S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCk/LmhhcyhjYXRlZ29yeUtleSkgPz8gZmFsc2U7XG4gIH1cblxuICBpc1NsaWNlQWxsQWN0aXZlKHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5oYXMoc2xpY2VJbmRleCkgfHwgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCkhLnNpemUgPT09IDA7XG4gIH1cblxuICBzbGljZUNhdGVnb3J5Q291bnQoc2xpY2VJbmRleDogbnVtYmVyLCBjYXRlZ29yeUtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3NsaWNlSW5kZXh9OiR7Y2F0ZWdvcnlLZXl9YDtcbiAgICBpZiAodGhpcy5fY291bnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY291bnRDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLl9jYWNoZWRTbGljZXNbc2xpY2VJbmRleF07XG4gICAgaWYgKCFzbGljZSkgcmV0dXJuIDA7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSAoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkuZmluZCgoYykgPT4gYy5rZXkgPT09IGNhdGVnb3J5S2V5KTtcbiAgICBjb25zdCBjb3VudCA9IGNhdGVnb3J5ID8gKHRoaXMuZGF0YSB8fCBbXSkuZmlsdGVyKChyb3cpID0+IGNhdGVnb3J5LmZpbHRlcihyb3cpKS5sZW5ndGggOiAwO1xuICAgIHRoaXMuX2NvdW50Q2FjaGUuc2V0KGNhY2hlS2V5LCBjb3VudCk7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgaXNTbGljZUVtcHR5KHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5fY2FjaGVkU2xpY2VzW3NsaWNlSW5kZXhdO1xuICAgIGlmICghc2xpY2UpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkuZXZlcnkoYyA9PiB0aGlzLnNsaWNlQ2F0ZWdvcnlDb3VudChzbGljZUluZGV4LCBjLmtleSkgPT09IDApO1xuICB9XG5cbiAgb25TbGljZUNhdGVnb3J5U2VsZWN0ZWQoc2xpY2VJbmRleDogbnVtYmVyLCBjYXRlZ29yeUtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLnNsaWNlc1tzbGljZUluZGV4XTtcbiAgICBpZiAoIXNsaWNlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmhhcyhzbGljZUluZGV4KSkge1xuICAgICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5zZXQoc2xpY2VJbmRleCwgbmV3IFNldCgpKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UuZ2V0KHNsaWNlSW5kZXgpITtcbiAgICBpZiAoc2xpY2UubXVsdGlTZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoYWN0aXZlS2V5cy5oYXMoY2F0ZWdvcnlLZXkpKSB7XG4gICAgICAgIGFjdGl2ZUtleXMuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZUtleXMuY2xlYXIoKTtcbiAgICAgICAgYWN0aXZlS2V5cy5hZGQoY2F0ZWdvcnlLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWN0aXZlS2V5cy5oYXMoY2F0ZWdvcnlLZXkpKSB7XG4gICAgICAgIGFjdGl2ZUtleXMuZGVsZXRlKGNhdGVnb3J5S2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZUtleXMuYWRkKGNhdGVnb3J5S2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uU2xpY2VBbGxTZWxlY3RlZChzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVLZXlzQnlTbGljZS5oYXMoc2xpY2VJbmRleCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UuZ2V0KHNsaWNlSW5kZXgpIS5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLl9lbWl0RmlsdGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIER5bmFtaWMgc2xpY2UgbWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhZGREeW5hbWljU2xpY2UoY29sdW1uOiBTbGljZUNvbHVtbkRlZjxUPik6IHZvaWQge1xuICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gdGhpcy5fY29tcHV0ZURpc3RpbmN0VmFsdWVzKGNvbHVtbi5rZXkpO1xuICAgIGNvbnN0IG5ld1NsaWNlOiBTbGljZUNvbmZpZzxUPiA9IHtcbiAgICAgIHRpdGxlOiBjb2x1bW4uaGVhZGVyLFxuICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5LFxuICAgICAgY2F0ZWdvcmllczogZGlzdGluY3RWYWx1ZXMubWFwKCh2KSA9PiB0aGlzLl9idWlsZENhdGVnb3J5RnJvbVZhbHVlKGNvbHVtbi5rZXksIHYpKSxcbiAgICB9O1xuICAgIHRoaXMuX2R5bmFtaWNTbGljZXMgPSBbLi4udGhpcy5fZHluYW1pY1NsaWNlcywgeyBrZXk6IGNvbHVtbi5rZXksIHNsaWNlOiBuZXdTbGljZSB9XTtcbiAgICB0aGlzLl9yZWJ1aWxkQ2FjaGUoKTtcbiAgICB0aGlzLmR5bmFtaWNTbGljZUtleXNDaGFuZ2UuZW1pdCh0aGlzLl9keW5hbWljU2xpY2VzLm1hcChkID0+IGQua2V5KSk7XG4gICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlbW92ZUR5bmFtaWNTbGljZShzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkeW5hbWljSW5kZXggPSBzbGljZUluZGV4IC0gdGhpcy5zdGF0aWNTbGljZUNvdW50O1xuICAgIGlmIChkeW5hbWljSW5kZXggPCAwKSByZXR1cm47XG4gICAgY29uc3QgbmV3QWN0aXZlS2V5cyA9IG5ldyBNYXA8bnVtYmVyLCBTZXQ8c3RyaW5nPj4oKTtcbiAgICB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmZvckVhY2goKGtleXMsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA8IHNsaWNlSW5kZXgpIG5ld0FjdGl2ZUtleXMuc2V0KGlkeCwga2V5cyk7XG4gICAgICBlbHNlIGlmIChpZHggPiBzbGljZUluZGV4KSBuZXdBY3RpdmVLZXlzLnNldChpZHggLSAxLCBrZXlzKTtcbiAgICB9KTtcbiAgICB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlID0gbmV3QWN0aXZlS2V5cztcbiAgICB0aGlzLl9keW5hbWljU2xpY2VzID0gdGhpcy5fZHluYW1pY1NsaWNlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGR5bmFtaWNJbmRleCk7XG4gICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgdGhpcy5keW5hbWljU2xpY2VLZXlzQ2hhbmdlLmVtaXQodGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoZCA9PiBkLmtleSkpO1xuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZW1vdmVEeW5hbWljU2xpY2VCeUtleShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGR5bmFtaWNJbmRleCA9IHRoaXMuX2R5bmFtaWNTbGljZXMuZmluZEluZGV4KChkKSA9PiBkLmtleSA9PT0ga2V5KTtcbiAgICBpZiAoZHluYW1pY0luZGV4IDwgMCkgcmV0dXJuO1xuICAgIGNvbnN0IHNsaWNlSW5kZXggPSB0aGlzLnN0YXRpY1NsaWNlQ291bnQgKyBkeW5hbWljSW5kZXg7XG4gICAgdGhpcy5yZW1vdmVEeW5hbWljU2xpY2Uoc2xpY2VJbmRleCk7XG4gIH1cblxuICAvLyDilIDilIAgUHJpdmF0ZSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgX2VtaXRGaWx0ZXIoKTogdm9pZCB7XG4gICAgY29uc3Qgc2xpY2VzID0gdGhpcy5zbGljZXM7XG4gICAgY29uc3QgYWN0aXZlS2V5c0J5U2xpY2UgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlO1xuXG4gICAgdGhpcy5hY3RpdmVLZXlzQ2hhbmdlLmVtaXQoXG4gICAgICBzbGljZXMubWFwKChfLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhY3RpdmVLZXlzQnlTbGljZS5nZXQoaSk7XG4gICAgICAgIHJldHVybiBrZXlzID8gWy4uLmtleXNdIDogW107XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBwcmVkID0gKHJvdzogVCk6IGJvb2xlYW4gPT5cbiAgICAgIHNsaWNlcy5ldmVyeSgoc2xpY2UsIHNsaWNlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlS2V5cyA9IGFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KTtcbiAgICAgICAgaWYgKCFhY3RpdmVLZXlzIHx8IGFjdGl2ZUtleXMuc2l6ZSA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBbLi4uYWN0aXZlS2V5c10uc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSAoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkuZmluZCgoYykgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgICAgcmV0dXJuIGNhdGVnb3J5ID8gY2F0ZWdvcnkuZmlsdGVyKHJvdykgOiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHByZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RHluYW1pY1NsaWNlQ29sdW1uS2V5KHNsaWNlSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGR5bmFtaWNJbmRleCA9IHNsaWNlSW5kZXggLSB0aGlzLnN0YXRpY1NsaWNlQ291bnQ7XG4gICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNTbGljZXNbZHluYW1pY0luZGV4XT8ua2V5ID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9tYXRlcmlhbGl6ZVNsaWNlKHNsaWNlOiBTbGljZUNvbmZpZzxUPik6IFNsaWNlQ29uZmlnPFQ+IHtcbiAgICBpZiAoIXNsaWNlLmNvbHVtbktleSB8fCAoc2xpY2UuY2F0ZWdvcmllcyAmJiBzbGljZS5jYXRlZ29yaWVzLmxlbmd0aCA+IDApKSB7XG4gICAgICByZXR1cm4gc2xpY2U7XG4gICAgfVxuICAgIGNvbnN0IGNvbCA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0gc2xpY2UuY29sdW1uS2V5KTtcbiAgICBjb25zdCBpc0xhenkgPSAhIWNvbD8ubGF6eTtcbiAgICBpZiAoaXNMYXp5ICYmIHRoaXMubGF6eVN0YXR1cy5nZXQoc2xpY2UuY29sdW1uS2V5ISkgIT09ICdsb2FkZWQnKSB7XG4gICAgICByZXR1cm4geyAuLi5zbGljZSwgY2F0ZWdvcmllczogW10gfTtcbiAgICB9XG4gICAgaWYgKHNsaWNlLmJ1Y2tldCkge1xuICAgICAgY29uc3QgZGlzdGluY3RWYWx1ZXMgPSBbLi4ubmV3IFNldCgodGhpcy5kYXRhIHx8IFtdKS5tYXAoc2xpY2UuYnVja2V0KSldLnNvcnQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNsaWNlLFxuICAgICAgICBjYXRlZ29yaWVzOiBkaXN0aW5jdFZhbHVlcy5tYXAoKHYpID0+ICh7XG4gICAgICAgICAga2V5OiB2LFxuICAgICAgICAgIGxhYmVsOiB2LFxuICAgICAgICAgIGZpbHRlcjogKHJvdzogVCkgPT4gc2xpY2UuYnVja2V0IShyb3cpID09PSB2LFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBkaXN0aW5jdFZhbHVlcyA9IHRoaXMuX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhzbGljZS5jb2x1bW5LZXkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2xpY2UsXG4gICAgICBjYXRlZ29yaWVzOiBkaXN0aW5jdFZhbHVlcy5tYXAoKHYpID0+IHRoaXMuX2J1aWxkQ2F0ZWdvcnlGcm9tVmFsdWUoc2xpY2UuY29sdW1uS2V5ISwgdikpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9idWlsZENhdGVnb3J5RnJvbVZhbHVlKGNvbHVtbktleTogc3RyaW5nLCB2OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBmaWx0ZXI6IChyb3c6IFQpID0+IGJvb2xlYW4gfSB7XG4gICAgaWYgKHYgPT09IEVNUFRZX0NBVEVHT1JZX0tFWSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBFTVBUWV9DQVRFR09SWV9LRVksXG4gICAgICAgIGxhYmVsOiBFTVBUWV9DQVRFR09SWV9MQUJFTCxcbiAgICAgICAgZmlsdGVyOiAocm93OiBUKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5fZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5LCByb3cpO1xuICAgICAgICAgIHJldHVybiB2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdixcbiAgICAgIGxhYmVsOiB2LFxuICAgICAgZmlsdGVyOiAocm93OiBUKSA9PiBTdHJpbmcodGhpcy5fZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5LCByb3cpID8/ICcnKSA9PT0gdixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcHV0ZURpc3RpbmN0VmFsdWVzKGNvbHVtbktleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJhd1ZhbHVlcyA9ICh0aGlzLmRhdGEgfHwgW10pLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXksIHJvdyk7XG4gICAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJyA/IFN0cmluZyh2YWwpIDogbnVsbDtcbiAgICB9KTtcbiAgICBjb25zdCBkaXN0aW5jdCA9IFsuLi5uZXcgU2V0KHJhd1ZhbHVlcy5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9PSBudWxsKSldLnNvcnQoKTtcbiAgICBpZiAocmF3VmFsdWVzLnNvbWUodiA9PiB2ID09PSBudWxsKSkge1xuICAgICAgZGlzdGluY3QucHVzaChFTVBUWV9DQVRFR09SWV9LRVkpO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGluY3Q7XG4gIH1cblxuICBwcml2YXRlIF9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMubGF6eURhdGEuZ2V0KGNvbHVtbktleSk/LmdldChyb3cpID8/IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2xEZWY/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sRGVmLnZhbHVlKHJvdywgMCk7XG4gICAgfVxuICAgIHJldHVybiAocm93IGFzIGFueSlbY29sdW1uS2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYnVpbGRDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0aWNTbGljZXMgPSAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLmZpbHRlcihcbiAgICAgIChzKSA9PiAhcy5jb2x1bW5LZXkgfHwgIXRoaXMuX2hpZGRlblN0YXRpY1NsaWNlS2V5cy5oYXMocy5jb2x1bW5LZXkpXG4gICAgKTtcbiAgICBjb25zdCBhbGxTbGljZXMgPSBbLi4uc3RhdGljU2xpY2VzLCAuLi50aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5zbGljZSldO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcyA9IGFsbFNsaWNlcy5tYXAoKHNsaWNlKSA9PiB0aGlzLl9tYXRlcmlhbGl6ZVNsaWNlKHNsaWNlKSk7XG4gICAgdGhpcy5fY291bnRDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaER5bmFtaWNTbGljZXMoKTogdm9pZCB7XG4gICAgdGhpcy5fZHluYW1pY1NsaWNlcyA9IHRoaXMuX2R5bmFtaWNTbGljZXMubWFwKCh7IGtleSwgc2xpY2UgfSkgPT4ge1xuICAgICAgY29uc3QgZGlzdGluY3RWYWx1ZXMgPSB0aGlzLl9jb21wdXRlRGlzdGluY3RWYWx1ZXMoa2V5KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleSxcbiAgICAgICAgc2xpY2U6IHtcbiAgICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgICBjYXRlZ29yaWVzOiBkaXN0aW5jdFZhbHVlcy5tYXAoKHYpID0+IHRoaXMuX2J1aWxkQ2F0ZWdvcnlGcm9tVmFsdWUoa2V5LCB2KSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2Nyb2xsU2xpY2VUaXRsZUludG9WaWV3KHNsaWNlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zbGljZVBhbmVsQm9keVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgICBjb25zdCByb3cgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2RhdGEtc2xpY2UtaW5kZXg9XCIke3NsaWNlSW5kZXh9XCJdYCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIXJvdykgcmV0dXJuO1xuICAgICAgcm93LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH0sIDApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2xpY2UtcGFuZWwtd3JhcHBlclwiIFtjbGFzcy5jb2xsYXBzZWRdPVwiaXNDb2xsYXBzZWRcIj5cbiAgPGFzaWRlIGNsYXNzPVwic2xpY2UtcGFuZWxcIiBbY2xhc3MuY29sbGFwc2VkXT1cImlzQ29sbGFwc2VkXCI+XG4gICAgPGRpdiBjbGFzcz1cInNsaWNlLXBhbmVsLWhlYWRlclwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDb2xsYXBzZWRcIiBjbGFzcz1cInNsaWNlLXBhbmVsLXRpdGxlXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNsaWNlLXBhbmVsLXRpdGxlLWljb25cIiBmb250U2V0PVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj5maWx0ZXJfbGlzdDwvbWF0LWljb24+XG4gICAgICAgIHt7IHNsaWNlcy5sZW5ndGggPiAxID8gJ0ZpbHRyZXMnIDogJ0ZpbHRyZScgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93VG9nZ2xlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic2xpY2UtdG9nZ2xlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc0NvbGxhcHNlZCA/ICdEw6lwbGllciBsZSBmaWx0cmUnIDogJ1JlcGxpZXIgbGUgZmlsdHJlJ1wiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgpXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGljZS10b2dnbGUtaWNvblwiPnt7IGlzQ29sbGFwc2VkID8gJ+KAuicgOiAn4oC5JyB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNsaWNlLXBhbmVsLWJvZHlcIiAqbmdJZj1cIiFpc0NvbGxhcHNlZFwiICNzbGljZVBhbmVsQm9keT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNsaWNlIG9mIHNsaWNlczsgbGV0IHNpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTbGljZUluZGV4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbGljZS10aXRsZS1yb3dcIiBbYXR0ci5kYXRhLXNsaWNlLWluZGV4XT1cInNpXCIgKGNsaWNrKT1cInRvZ2dsZVNsaWNlQ29sbGFwc2Uoc2kpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGljZS10aXRsZS1jaGV2cm9uXCIgW2NsYXNzLmV4cGFuZGVkXT1cIiFpc1NsaWNlQ29sbGFwc2VkKHNpKVwiPuKAujwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJnZXRTbGljZUljb24oc2xpY2UpXCIgY2xhc3M9XCJzbGljZS10aXRsZS1pY29uXCIgZm9udFNldD1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+e3sgZ2V0U2xpY2VJY29uKHNsaWNlKSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgPHAgY2xhc3M9XCJzbGljZS10aXRsZVwiPnt7IHNsaWNlLnRpdGxlIHx8ICdGaWx0cmVyJyB9fTwvcD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImlzU2xpY2VEeW5hbWljKHNpKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2xpY2UtcmVtb3ZlLWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVEeW5hbWljU2xpY2Uoc2kpXCJcbiAgICAgICAgICA+w5c8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNsaWNlLXNlY3Rpb24taXRlbXNcIiAqbmdJZj1cIiFpc1NsaWNlQ29sbGFwc2VkKHNpKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1NsaWNlTG9hZGluZyhzaSk7IGVsc2Ugc2xpY2VDb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpY2UtbGF6eS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1za2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhenktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NsaWNlQ29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIHNsaWNlLmNhdGVnb3JpZXM7IHRyYWNrQnk6IHRyYWNrQnlDYXRlZ29yeUtleVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzbGljZUNhdGVnb3J5Q291bnQoc2ksIGNhdGVnb3J5LmtleSkgPiAwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNsaWNlLWl0ZW1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNTbGljZUNhdGVnb3J5QWN0aXZlKHNpLCBjYXRlZ29yeS5rZXkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWNhdGVnb3J5LWtleV09XCJjYXRlZ29yeS5rZXlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjYXRlZ29yeS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2xpY2VDYXRlZ29yeVNlbGVjdGVkKHNpLCBjYXRlZ29yeS5rZXkpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNhdGVnb3J5LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0NvdW50c1wiPnt7IHNsaWNlQ2F0ZWdvcnlDb3VudChzaSwgY2F0ZWdvcnkua2V5KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1NsaWNlRW1wdHkoc2kpXCIgY2xhc3M9XCJzbGljZS1lbXB0eS1zdGF0ZVwiPkF1Y3VuZSBkb25uw6llPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGhyICpuZ0lmPVwic2kgPCBzbGljZXMubGVuZ3RoIC0gMVwiIGNsYXNzPVwic2xpY2UtZGl2aWRlclwiIC8+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9hc2lkZT5cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtcGFuZWwubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS10YWJsZS9zcmMvbGliL2NvbXBvbmVudC9zbGljZS1wYW5lbC9zbGljZS1wYW5lbC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSAnQG9uZXRlbWUvanF1ZXJ5LWNvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKiogVW5lIGNhdMOpZ29yaWUgY2xpcXVhYmxlIGRhbnMgdW4gc2xpY2UgKGV4OiBcIkVuIGNvdXJzXCIsIFwiVGVybWluw6lcIikuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlQ2F0ZWdvcnk8VCA9IGFueT4ge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZmlsdGVyOiAocm93OiBUKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdyb3VwZSBkZSBmaWx0cmVzIGFmZmljaMOpIGRhbnMgbGUgcGFubmVhdSBsYXTDqXJhbC5cbiAqXG4gKiAqKk1vZGUgY29sb25uZSoqIChgY29sdW1uS2V5YCkgOiBsZSBzbGljZSBsaXQgYXV0b21hdGlxdWVtZW50IGxlcyB2YWxldXJzIGRpc3RpbmN0ZXNcbiAqIGRlIGxhIGNvbG9ubmUgZMOpc2lnbsOpZSBwb3VyIGfDqW7DqXJlciBsZXMgY2F0w6lnb3JpZXMuIGBidWNrZXRgIHBlcm1ldCBkZSByZWdyb3VwZXJcbiAqIGRlcyB2YWxldXJzIGNvbnRpbnVlcyAoZXg6IHBsYWdlcyBkZSBkdXLDqWUpLiBgaGlkZGVuYCBsZSBtYXNxdWUgcGFyIGTDqWZhdXQgZXRcbiAqIGxhaXNzZSBsYSB0YWJsZSBsZSByZW5kcmUgZGlzcG9uaWJsZSBkYW5zIGxlIG1lbnUgXCJBam91dGVyIHVuIGZpbHRyZVwiLlxuICpcbiAqICoqTW9kZSBtYW51ZWwqKiAoYGNhdGVnb3JpZXNgKSA6IGxlcyBjYXTDqWdvcmllcyBzb250IGTDqWZpbmllcyBleHBsaWNpdGVtZW50IGF2ZWNcbiAqIGxldXIgcHJvcHJlIGZvbmN0aW9uIGBmaWx0ZXJgLiBgY29sdW1uS2V5YCBwZXV0IGNvZXhpc3RlciBwb3VyIGxlIGxpZW4gYXZlYyBsYVxuICogY29sb25uZSAoaWPDtG5lLCBsYWJlbCksIG1haXMgYGNhdGVnb3JpZXNgIHByZW5kIGxlIGRlc3N1cyBzdXIgbGUgYnVja2V0aW5nIGF1dG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpY2VDb25maWc8VCA9IGFueT4ge1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIEljw7RuZSBNYXRlcmlhbCBhZmZpY2jDqWUgZGFucyBsZSB0aXRyZSBkdSBzbGljZSAoZXg6ICdzY2hlZHVsZScsICdkbnMnKS4gKi9cbiAgaWNvbj86IHN0cmluZztcbiAgLyoqIEF1dG9yaXNlIGxhIHPDqWxlY3Rpb24gc2ltdWx0YW7DqWUgZGUgcGx1c2lldXJzIGNhdMOpZ29yaWVzLiBQYXIgZMOpZmF1dCA6IGBmYWxzZWAuICovXG4gIG11bHRpU2VsZWN0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENsw6kgZGUgbGEgY29sb25uZSBhc3NvY2nDqWUgw6AgY2Ugc2xpY2UuXG4gICAqIEVuICoqbW9kZSBjb2xvbm5lKiosIGxlcyB2YWxldXJzIGRpc3RpbmN0ZXMgZGUgY2V0dGUgY29sb25uZSBnw6luw6hyZW50IGxlcyBjYXTDqWdvcmllcy5cbiAgICogRW4gKiptb2RlIG1hbnVlbCoqLCBzZXJ0IHVuaXF1ZW1lbnQgw6AgbGllciB2aXN1ZWxsZW1lbnQgbGUgc2xpY2Ugw6AgbGEgY29sb25uZS5cbiAgICovXG4gIGNvbHVtbktleT86IHN0cmluZztcbiAgLyoqIE1hc3F1w6kgcGFyIGTDqWZhdXQgOyBkaXNwb25pYmxlIHZpYSBsZSBtZW51IFwiQWpvdXRlciB1biBmaWx0cmVcIi4gUGFyIGTDqWZhdXQgOiBgZmFsc2VgLiAqL1xuICBoaWRkZW4/OiBib29sZWFuO1xuICAvKipcbiAgICogVHJhbnNmb3JtZSBjaGFxdWUgdmFsZXVyIGRlIGxpZ25lIGVuIGxhYmVsIGRlIHRyYW5jaGUgYXZhbnQgcmVncm91cGVtZW50LlxuICAgKiBVdGlsaXPDqSBlbiAqKm1vZGUgY29sb25uZSoqIHBvdXIgZGVzIHZhbGV1cnMgY29udGludWVzIChleDogZHVyw6llcywgbW9udGFudHMpLlxuICAgKiBJZ25vcsOpIHNpIGBjYXRlZ29yaWVzYCBlc3QgZMOpZmluaS5cbiAgICovXG4gIGJ1Y2tldD86IChyb3c6IFQpID0+IHN0cmluZztcbiAgLyoqIENhdMOpZ29yaWVzIGV4cGxpY2l0ZXMgKCoqbW9kZSBtYW51ZWwqKikuIFNpIGFic2VudCwgZ8OpbsOpcsOpZXMgYXV0byBkZXB1aXMgYGNvbHVtbktleWAuICovXG4gIGNhdGVnb3JpZXM/OiBTbGljZUNhdGVnb3J5PFQ+W107XG59XG5cbi8qKlxuICogRGVzY3JpcHRpb24gbWluaW1hbGUgZCd1bmUgY29sb25uZSBuw6ljZXNzYWlyZSBhdSBwYW5uZWF1IGRlIHNsaWNlcy5cbiAqIFV0aWxpc8OpIGluZMOpcGVuZGFtbWVudCBkZSBsYSB0YWJsZSA6IHBhcyBkZSBwcm9wcmnDqXTDqXMgZGUgcmVuZHUgKHRyaSwgc3VwcHJlc3Npb24sIGdyb3VwZW1lbnQuLi4pLlxuICogYFRhYmxlQ29sdW1uUHJvdmlkZXJgIChsaWJyYWlyaWUgdGFibGUpIGVzdCB1biBzdXBlcnNldCBzdHJ1Y3R1cmVsIGNvbXBhdGlibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpY2VDb2x1bW5EZWY8VCA9IGFueT4ge1xuICBrZXk6IHN0cmluZztcbiAgaGVhZGVyPzogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICB2YWx1ZT86IERhdGFQcm92aWRlcjxhbnk+O1xuICAvKiogQ2hhcmdlbWVudCBkaWZmw6lyw6kgOiBsYSBwcsOpc2VuY2UgZGUgY2V0IG9iamV0IGFjdGl2ZSBsZSBtb2RlIGxhenkuICovXG4gIGxhenk/OiB7XG4gICAgLyoqIEZvbmN0aW9uIGFwcGVsw6llIHBvdXIgY2hhcmdlciBsZXMgdmFsZXVycyBkZSBsYSBjb2xvbm5lLiBSZXRvdXJuZSB1biB0YWJsZWF1IGRhbnMgbGUgbcOqbWUgb3JkcmUgcXVlIGxlcyBsaWduZXMuICovXG4gICAgZmV0Y2hGbjogKCkgPT4gT2JzZXJ2YWJsZTxhbnlbXT47XG4gIH07XG59XG5cbiJdfQ==