@cqa-lib/cqa-ui 1.1.555 → 1.1.556

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.
@@ -3,7 +3,7 @@ import { DEFAULT_MODULAR_LABELS, } from '../../templates/modular-table-template/
3
3
  import { DEFAULT_TEST_SUITE_LABELS } from '../test-suite.models';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../../custom-input/custom-input.component";
6
- import * as i2 from "../../templates/modular-table-template/dialogs/move-to-folder-dialog.component";
6
+ import * as i2 from "@angular/common";
7
7
  /**
8
8
  * Body of the "Move Test Suite" dialog.
9
9
  *
@@ -60,6 +60,12 @@ export class MoveTestSuiteDialogComponent {
60
60
  this.pickedFolderIdChange = new EventEmitter();
61
61
  this.submitted = new EventEmitter();
62
62
  this.cancelled = new EventEmitter();
63
+ /** Fires when a folder needs its children fetched. Emitted by `pick` (row
64
+ * click) and `toggleExpanded` (chevron click) when the target node has
65
+ * `hasChildren = true` but `loadedPages == null` and is not already fetching.
66
+ * Hosts subscribe and call their paginated fetch, mutating the FolderNode
67
+ * in place (set `children`, `loadedPages`, `childrenLoading`). */
68
+ this.folderChildrenRequested = new EventEmitter();
63
69
  /** Bubble cqa-custom-input focus/blur events up to hosts. Useful when
64
70
  * `fieldsDisabled = false` and the host wants to react to interaction. */
65
71
  this.currentFieldFocus = new EventEmitter();
@@ -71,6 +77,11 @@ export class MoveTestSuiteDialogComponent {
71
77
  * suite starts in Unorganized (`currentFolderId = null`) so a fresh dialog
72
78
  * doesn't appear valid just because `pickedFolderId` also defaults to null. */
73
79
  this.pickedTouched = false;
80
+ /** Folder ids currently expanded in the inlined picker. Managed entirely
81
+ * inside this component (no external Input) so it survives the host pushing
82
+ * a new `folders` reference after each lazy-fetch resolves. */
83
+ this.expandedIds = new Set();
84
+ this.trackById = (_, row) => row.id;
74
85
  }
75
86
  set folders(value) {
76
87
  this._folders = value || [];
@@ -87,18 +98,79 @@ export class MoveTestSuiteDialogComponent {
87
98
  this.cdr.markForCheck();
88
99
  }
89
100
  get testSuiteLabels() { return this._testSuiteLabels; }
90
- onParentPicked(id) {
91
- let next = null;
92
- if (id != null) {
93
- const coerced = typeof id === 'number' ? id : Number(id);
94
- if (Number.isFinite(coerced))
95
- next = coerced;
101
+ ngOnInit() {
102
+ this.seedExpandedIds();
103
+ }
104
+ ngOnChanges(changes) {
105
+ // Re-seed only when expansion-intent inputs change. NEVER on `folders` —
106
+ // the host pushes a new top-level reference after every lazy fetch and a
107
+ // reseed there would collapse the folder the user just expanded.
108
+ if (changes['currentFolderId'] || changes['pickedFolderId']) {
109
+ this.seedExpandedIds();
96
110
  }
97
- this.pickedFolderId = next;
111
+ }
112
+ /** Folder-row click handler. Selects the folder as the destination and, when
113
+ * the folder has unloaded children, auto-expands it and asks the host to
114
+ * fetch its children. */
115
+ pick(id) {
116
+ this.pickedFolderId = id;
98
117
  this.pickedTouched = true;
99
- this.pickedFolderIdChange.emit(next);
118
+ this.pickedFolderIdChange.emit(id);
119
+ if (id != null) {
120
+ this.expandedIds.add(id);
121
+ this.requestChildrenIfMissing(id);
122
+ }
100
123
  this.cdr.markForCheck();
101
124
  }
125
+ /** Chevron click handler. Toggles expansion locally; on expand path, asks
126
+ * the host to fetch children when not already loaded. */
127
+ toggleExpanded(id, event) {
128
+ event.stopPropagation();
129
+ if (this.expandedIds.has(id)) {
130
+ this.expandedIds.delete(id);
131
+ }
132
+ else {
133
+ this.expandedIds.add(id);
134
+ this.requestChildrenIfMissing(id);
135
+ }
136
+ this.cdr.markForCheck();
137
+ }
138
+ isPicked(id) {
139
+ return this.pickedFolderId === id;
140
+ }
141
+ /** "Unorganized" row is disabled when the suite is already in Unorganized. */
142
+ get isUnorganizedDisabled() {
143
+ return this.currentFolderId == null;
144
+ }
145
+ /** Flattened, depth-indented row descriptors fed into the template `*ngFor`.
146
+ * Walks `_folders`, derives chevron / loading / expanded state per node. */
147
+ get flatRows() {
148
+ const out = [];
149
+ const walk = (nodes, depth) => {
150
+ for (const n of nodes || []) {
151
+ // Drive the chevron from the backend's authoritative `hasChildren` so
152
+ // it shows BEFORE children are loaded — required for lazy-load.
153
+ const hasChildren = !!n.hasChildren;
154
+ const expanded = this.expandedIds.has(n.id);
155
+ const childrenLoading = !!n.childrenLoading;
156
+ const childrenLoaded = !!(n.children && n.children.length);
157
+ out.push({
158
+ id: n.id,
159
+ name: n.name,
160
+ depth,
161
+ disabled: n.id === this.currentFolderId,
162
+ hasChildren,
163
+ expanded,
164
+ childrenLoading,
165
+ showLoadingPlaceholder: expanded && childrenLoading && !childrenLoaded,
166
+ });
167
+ if (expanded && childrenLoaded)
168
+ walk(n.children, depth + 1);
169
+ }
170
+ };
171
+ walk(this._folders, 0);
172
+ return out;
173
+ }
102
174
  /** True once the user has picked a destination via the embedded tree. Drives
103
175
  * the destination-readout styling (indigo when picked, muted when not). */
104
176
  get hasPick() {
@@ -167,6 +239,46 @@ export class MoveTestSuiteDialogComponent {
167
239
  onDestinationFieldBlurred(event) {
168
240
  this.destinationFieldBlur.emit(event);
169
241
  }
242
+ requestChildrenIfMissing(id) {
243
+ const node = this.findNode(this._folders, id);
244
+ if (!node)
245
+ return;
246
+ if (node.hasChildren && node.loadedPages == null && !node.childrenLoading) {
247
+ this.folderChildrenRequested.emit(id);
248
+ }
249
+ }
250
+ seedExpandedIds() {
251
+ this.expandedIds = new Set();
252
+ const seed = this.currentFolderId != null ? this.currentFolderId : this.pickedFolderId;
253
+ if (seed != null) {
254
+ const trail = [];
255
+ this.collectAncestors(this._folders, seed, trail);
256
+ trail.forEach((id) => this.expandedIds.add(id));
257
+ }
258
+ }
259
+ collectAncestors(nodes, targetId, acc) {
260
+ for (const n of nodes || []) {
261
+ acc.push(n.id);
262
+ if (n.id === targetId)
263
+ return true;
264
+ if (n.children && this.collectAncestors(n.children, targetId, acc))
265
+ return true;
266
+ acc.pop();
267
+ }
268
+ return false;
269
+ }
270
+ findNode(nodes, id) {
271
+ for (const n of nodes || []) {
272
+ if (n.id === id)
273
+ return n;
274
+ if (n.children?.length) {
275
+ const hit = this.findNode(n.children, id);
276
+ if (hit)
277
+ return hit;
278
+ }
279
+ }
280
+ return null;
281
+ }
170
282
  findFolderName(nodes, id) {
171
283
  for (const n of nodes || []) {
172
284
  if (n.id === id)
@@ -181,7 +293,7 @@ export class MoveTestSuiteDialogComponent {
181
293
  }
182
294
  }
183
295
  MoveTestSuiteDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MoveTestSuiteDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
184
- MoveTestSuiteDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveTestSuiteDialogComponent, selector: "cqa-move-test-suite-dialog", inputs: { folders: "folders", labels: "labels", testSuiteLabels: "testSuiteLabels", currentFolderId: "currentFolderId", currentFolderName: "currentFolderName", suiteName: "suiteName", pickedFolderId: "pickedFolderId", pickerHeight: "pickerHeight", fieldsDisabled: "fieldsDisabled" }, outputs: { pickedFolderIdChange: "pickedFolderIdChange", submitted: "submitted", cancelled: "cancelled", currentFieldFocus: "currentFieldFocus", currentFieldBlur: "currentFieldBlur", destinationFieldFocus: "destinationFieldFocus", destinationFieldBlur: "destinationFieldBlur" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: `
296
+ MoveTestSuiteDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveTestSuiteDialogComponent, selector: "cqa-move-test-suite-dialog", inputs: { folders: "folders", labels: "labels", testSuiteLabels: "testSuiteLabels", currentFolderId: "currentFolderId", currentFolderName: "currentFolderName", suiteName: "suiteName", pickedFolderId: "pickedFolderId", pickerHeight: "pickerHeight", fieldsDisabled: "fieldsDisabled" }, outputs: { pickedFolderIdChange: "pickedFolderIdChange", submitted: "submitted", cancelled: "cancelled", folderChildrenRequested: "folderChildrenRequested", currentFieldFocus: "currentFieldFocus", currentFieldBlur: "currentFieldBlur", destinationFieldFocus: "destinationFieldFocus", destinationFieldBlur: "destinationFieldBlur" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: `
185
297
  <div class="cqa-flex cqa-flex-col cqa-gap-2 cqa-w-full">
186
298
  <!-- Test suite name (read-only display; surfaces which suite is being moved) -->
187
299
  <cqa-custom-input
@@ -214,17 +326,84 @@ MoveTestSuiteDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
214
326
  (blurred)="onDestinationFieldBlurred($event)"
215
327
  ></cqa-custom-input>
216
328
 
217
- <!-- Folder tree picker -->
218
- <cqa-move-to-folder-dialog
219
- [folders]="folders"
220
- [labels]="labels"
221
- [currentFolderId]="currentFolderId"
222
- [pickedFolderId]="pickedFolderId"
223
- [pickerHeight]="pickerHeight"
224
- (pickedFolderIdChange)="onParentPicked($event)"
225
- ></cqa-move-to-folder-dialog>
329
+ <!-- Folder tree picker (inlined; takes reference from cqa-move-to-folder-dialog
330
+ but does not embed it, so the lazy-fetch wiring and expansion state stay
331
+ local to this dialog). -->
332
+ <ng-template #folderIconTpl>
333
+ <svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="cqa-flex-shrink-0">
334
+ <path d="M15.6375 12.6377C15.6375 13.0355 15.4794 13.4171 15.1981 13.6984C14.9168 13.9797 14.5353 14.1377 14.1375 14.1377H2.13745C1.73963 14.1377 1.3581 13.9797 1.07679 13.6984C0.795486 13.4171 0.637451 13.0355 0.637451 12.6377V2.1377C0.637451 1.73987 0.795486 1.35834 1.07679 1.07704C1.3581 0.795731 1.73963 0.637695 2.13745 0.637695H5.88745L7.38745 2.8877H14.1375C14.5353 2.8877 14.9168 3.04573 15.1981 3.32704C15.4794 3.60834 15.6375 3.98987 15.6375 4.3877V12.6377Z" stroke="currentColor" stroke-width="1.275" stroke-linecap="round" stroke-linejoin="round"/>
335
+ </svg>
336
+ </ng-template>
337
+
338
+ <ng-template #unorganizedIconTpl>
339
+ <svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="cqa-flex-shrink-0">
340
+ <path d="M14.6875 5.5V12.5C14.6875 13.3 14.0375 14 13.1875 14H3.8125C2.9625 14 2.3125 13.3 2.3125 12.5V5.5M14.6875 5.5L12.7875 1.7C12.5375 1.2 12.0875 1 11.5875 1H5.4125C4.9125 1 4.4625 1.2 4.2125 1.7L2.3125 5.5M14.6875 5.5H2.3125M6.1875 8.5H10.8125" stroke="currentColor" stroke-width="1.275" stroke-linecap="round" stroke-linejoin="round"/>
341
+ </svg>
342
+ </ng-template>
343
+
344
+ <div class="cqa-flex cqa-flex-col cqa-border-solid cqa-border cqa-border-[#E2E2E3] cqa-rounded-[10px] cqa-py-2 cqa-w-full cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin" [style.height]="pickerHeight">
345
+ <div
346
+ role="button"
347
+ tabindex="0"
348
+ class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-px-4 cqa-py-2 cqa-cursor-pointer cqa-transition-colors cqa-text-sm"
349
+ [ngClass]="isPicked(null) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
350
+ [class.cqa-opacity-40]="isUnorganizedDisabled"
351
+ [class.cqa-cursor-not-allowed]="isUnorganizedDisabled"
352
+ [attr.aria-disabled]="isUnorganizedDisabled || null"
353
+ (click)="!isUnorganizedDisabled && pick(null)"
354
+ (keydown.enter)="!isUnorganizedDisabled && pick(null)"
355
+ (keydown.space)="$event.preventDefault(); !isUnorganizedDisabled && pick(null)"
356
+ >
357
+ <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-flex-shrink-0"></span>
358
+ <ng-container *ngTemplateOutlet="unorganizedIconTpl"></ng-container>
359
+ <span>{{ labels.moveDialogRoot }}</span>
360
+ </div>
361
+
362
+ <ng-container *ngFor="let row of flatRows; trackBy: trackById">
363
+ <div
364
+ role="button"
365
+ tabindex="0"
366
+ class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-py-2 cqa-pr-4 cqa-cursor-pointer cqa-transition-colors cqa-text-sm"
367
+ [ngClass]="isPicked(row.id) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
368
+ [class.cqa-opacity-40]="row.disabled"
369
+ [class.cqa-cursor-not-allowed]="row.disabled"
370
+ [style.paddingLeft.px]="16 + row.depth * 24"
371
+ (click)="!row.disabled && pick(row.id)"
372
+ (keydown.enter)="!row.disabled && pick(row.id)"
373
+ (keydown.space)="!row.disabled && $event.preventDefault(); !row.disabled && pick(row.id)"
374
+ >
375
+ <button
376
+ *ngIf="row.hasChildren; else chevronPlaceholder"
377
+ type="button"
378
+ class="cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-5 cqa-h-5 cqa-flex-shrink-0 cqa-rounded cqa-text-neutral-600 hover:cqa-bg-neutral-100 hover:cqa-text-neutral-900"
379
+ [attr.aria-label]="row.expanded ? 'Collapse ' + row.name : 'Expand ' + row.name"
380
+ (click)="toggleExpanded(row.id!, $event)"
381
+ >
382
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"
383
+ [class.cqa-rotate-90]="row.expanded" style="transition: transform 120ms ease;">
384
+ <path d="M5 3L9 7L5 11" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
385
+ </svg>
386
+ </button>
387
+ <ng-template #chevronPlaceholder>
388
+ <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-flex-shrink-0"></span>
389
+ </ng-template>
390
+
391
+ <ng-container *ngTemplateOutlet="folderIconTpl"></ng-container>
392
+ <span class="cqa-truncate">{{ row.name }}</span>
393
+ </div>
394
+
395
+ <div
396
+ *ngIf="row.showLoadingPlaceholder"
397
+ class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-py-2 cqa-pr-4 cqa-text-sm cqa-text-neutral-500 cqa-italic"
398
+ [style.paddingLeft.px]="16 + (row.depth + 1) * 24"
399
+ >
400
+ <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-flex-shrink-0"></span>
401
+ <span>Loading…</span>
402
+ </div>
403
+ </ng-container>
404
+ </div>
226
405
  </div>
227
- `, isInline: true, components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.MoveToFolderDialogComponent, selector: "cqa-move-to-folder-dialog", inputs: ["folders", "labels", "currentFolderId", "pickedFolderId", "initialExpandedIds", "rootDisabled", "pickerHeight"], outputs: ["folderPicked", "pickedFolderIdChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
406
+ `, isInline: true, components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
228
407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MoveTestSuiteDialogComponent, decorators: [{
229
408
  type: Component,
230
409
  args: [{ selector: 'cqa-move-test-suite-dialog', template: `
@@ -260,15 +439,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
260
439
  (blurred)="onDestinationFieldBlurred($event)"
261
440
  ></cqa-custom-input>
262
441
 
263
- <!-- Folder tree picker -->
264
- <cqa-move-to-folder-dialog
265
- [folders]="folders"
266
- [labels]="labels"
267
- [currentFolderId]="currentFolderId"
268
- [pickedFolderId]="pickedFolderId"
269
- [pickerHeight]="pickerHeight"
270
- (pickedFolderIdChange)="onParentPicked($event)"
271
- ></cqa-move-to-folder-dialog>
442
+ <!-- Folder tree picker (inlined; takes reference from cqa-move-to-folder-dialog
443
+ but does not embed it, so the lazy-fetch wiring and expansion state stay
444
+ local to this dialog). -->
445
+ <ng-template #folderIconTpl>
446
+ <svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="cqa-flex-shrink-0">
447
+ <path d="M15.6375 12.6377C15.6375 13.0355 15.4794 13.4171 15.1981 13.6984C14.9168 13.9797 14.5353 14.1377 14.1375 14.1377H2.13745C1.73963 14.1377 1.3581 13.9797 1.07679 13.6984C0.795486 13.4171 0.637451 13.0355 0.637451 12.6377V2.1377C0.637451 1.73987 0.795486 1.35834 1.07679 1.07704C1.3581 0.795731 1.73963 0.637695 2.13745 0.637695H5.88745L7.38745 2.8877H14.1375C14.5353 2.8877 14.9168 3.04573 15.1981 3.32704C15.4794 3.60834 15.6375 3.98987 15.6375 4.3877V12.6377Z" stroke="currentColor" stroke-width="1.275" stroke-linecap="round" stroke-linejoin="round"/>
448
+ </svg>
449
+ </ng-template>
450
+
451
+ <ng-template #unorganizedIconTpl>
452
+ <svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="cqa-flex-shrink-0">
453
+ <path d="M14.6875 5.5V12.5C14.6875 13.3 14.0375 14 13.1875 14H3.8125C2.9625 14 2.3125 13.3 2.3125 12.5V5.5M14.6875 5.5L12.7875 1.7C12.5375 1.2 12.0875 1 11.5875 1H5.4125C4.9125 1 4.4625 1.2 4.2125 1.7L2.3125 5.5M14.6875 5.5H2.3125M6.1875 8.5H10.8125" stroke="currentColor" stroke-width="1.275" stroke-linecap="round" stroke-linejoin="round"/>
454
+ </svg>
455
+ </ng-template>
456
+
457
+ <div class="cqa-flex cqa-flex-col cqa-border-solid cqa-border cqa-border-[#E2E2E3] cqa-rounded-[10px] cqa-py-2 cqa-w-full cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin" [style.height]="pickerHeight">
458
+ <div
459
+ role="button"
460
+ tabindex="0"
461
+ class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-px-4 cqa-py-2 cqa-cursor-pointer cqa-transition-colors cqa-text-sm"
462
+ [ngClass]="isPicked(null) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
463
+ [class.cqa-opacity-40]="isUnorganizedDisabled"
464
+ [class.cqa-cursor-not-allowed]="isUnorganizedDisabled"
465
+ [attr.aria-disabled]="isUnorganizedDisabled || null"
466
+ (click)="!isUnorganizedDisabled && pick(null)"
467
+ (keydown.enter)="!isUnorganizedDisabled && pick(null)"
468
+ (keydown.space)="$event.preventDefault(); !isUnorganizedDisabled && pick(null)"
469
+ >
470
+ <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-flex-shrink-0"></span>
471
+ <ng-container *ngTemplateOutlet="unorganizedIconTpl"></ng-container>
472
+ <span>{{ labels.moveDialogRoot }}</span>
473
+ </div>
474
+
475
+ <ng-container *ngFor="let row of flatRows; trackBy: trackById">
476
+ <div
477
+ role="button"
478
+ tabindex="0"
479
+ class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-py-2 cqa-pr-4 cqa-cursor-pointer cqa-transition-colors cqa-text-sm"
480
+ [ngClass]="isPicked(row.id) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
481
+ [class.cqa-opacity-40]="row.disabled"
482
+ [class.cqa-cursor-not-allowed]="row.disabled"
483
+ [style.paddingLeft.px]="16 + row.depth * 24"
484
+ (click)="!row.disabled && pick(row.id)"
485
+ (keydown.enter)="!row.disabled && pick(row.id)"
486
+ (keydown.space)="!row.disabled && $event.preventDefault(); !row.disabled && pick(row.id)"
487
+ >
488
+ <button
489
+ *ngIf="row.hasChildren; else chevronPlaceholder"
490
+ type="button"
491
+ class="cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-5 cqa-h-5 cqa-flex-shrink-0 cqa-rounded cqa-text-neutral-600 hover:cqa-bg-neutral-100 hover:cqa-text-neutral-900"
492
+ [attr.aria-label]="row.expanded ? 'Collapse ' + row.name : 'Expand ' + row.name"
493
+ (click)="toggleExpanded(row.id!, $event)"
494
+ >
495
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"
496
+ [class.cqa-rotate-90]="row.expanded" style="transition: transform 120ms ease;">
497
+ <path d="M5 3L9 7L5 11" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
498
+ </svg>
499
+ </button>
500
+ <ng-template #chevronPlaceholder>
501
+ <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-flex-shrink-0"></span>
502
+ </ng-template>
503
+
504
+ <ng-container *ngTemplateOutlet="folderIconTpl"></ng-container>
505
+ <span class="cqa-truncate">{{ row.name }}</span>
506
+ </div>
507
+
508
+ <div
509
+ *ngIf="row.showLoadingPlaceholder"
510
+ class="cqa-flex cqa-items-center cqa-gap-2.5 cqa-py-2 cqa-pr-4 cqa-text-sm cqa-text-neutral-500 cqa-italic"
511
+ [style.paddingLeft.px]="16 + (row.depth + 1) * 24"
512
+ >
513
+ <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-flex-shrink-0"></span>
514
+ <span>Loading…</span>
515
+ </div>
516
+ </ng-container>
517
+ </div>
272
518
  </div>
273
519
  `, host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [] }]
274
520
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { folders: [{
@@ -295,6 +541,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
295
541
  type: Output
296
542
  }], cancelled: [{
297
543
  type: Output
544
+ }], folderChildrenRequested: [{
545
+ type: Output
298
546
  }], currentFieldFocus: [{
299
547
  type: Output
300
548
  }], currentFieldBlur: [{
@@ -304,4 +552,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
304
552
  }], destinationFieldBlur: [{
305
553
  type: Output
306
554
  }] } });
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10ZXN0LXN1aXRlLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3Qtc3VpdGUvbW92ZS10ZXN0LXN1aXRlLWRpYWxvZy9tb3ZlLXRlc3Qtc3VpdGUtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sc0VBQXNFLENBQUM7QUFDOUUsT0FBTyxFQUFFLHlCQUF5QixFQUFtQixNQUFNLHNCQUFzQixDQUFDOzs7O0FBRWxGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQW1ESCxNQUFNLE9BQU8sNEJBQTRCO0lBMkV2QyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTFFMUMsd0ZBQXdGO1FBQ3hGLGlGQUFpRjtRQUNqRixpRkFBaUY7UUFDakYsa0ZBQWtGO1FBQ2xGLHNGQUFzRjtRQUU5RSxhQUFRLEdBQWlCLEVBQUUsQ0FBQztRQU81QixZQUFPLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBTy9EOzs7dUZBRytFO1FBQ3ZFLHFCQUFnQixHQUFvQixFQUFFLEdBQUcseUJBQXlCLEVBQUUsQ0FBQztRQU83RTswRUFDa0U7UUFDekQsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBRS9DOztpRkFFeUU7UUFDaEUsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUVqRDs7b0RBRTRDO1FBQ25DLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFFaEMsdUVBQXVFO1FBQzlELG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUU5Qzt1RkFDK0U7UUFDdEUsaUJBQVksR0FBVyxPQUFPLENBQUM7UUFFeEM7O3FGQUU2RTtR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O3NCQUFsQixLQUFLO2dCQVdPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSztnQkFFSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUlHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgRm9sZGVyTm9kZSxcbiAgTW9kdWxhckxhYmVscyxcbn0gZnJvbSAnLi4vLi4vdGVtcGxhdGVzL21vZHVsYXItdGFibGUtdGVtcGxhdGUvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS5tb2RlbHMnO1xuaW1wb3J0IHsgREVGQVVMVF9URVNUX1NVSVRFX0xBQkVMUywgVGVzdFN1aXRlTGFiZWxzIH0gZnJvbSAnLi4vdGVzdC1zdWl0ZS5tb2RlbHMnO1xuXG4vKipcbiAqIEJvZHkgb2YgdGhlIFwiTW92ZSBUZXN0IFN1aXRlXCIgZGlhbG9nLlxuICpcbiAqIFJldXNlcyBgPGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+YCBhcyB0aGUgdHJlZSBwaWNrZXIgKHNhbWUgZW1iZWRkaW5nIHBhdHRlcm5cbiAqIGFzIGBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnRgKSBzbyBjb25zdW1lcnMgZ2V0IHRoZSBzYW1lIGZvbGRlci10cmVlIFVYLCB3aGlsZVxuICogYWRkaW5nIHR3byByZWFkLW9ubHkgcm93cyBhYm92ZSBpdDogdGhlIHN1aXRlJ3MgKipjdXJyZW50IGZvbGRlcioqIChzb3VyY2UpXG4gKiBhbmQgdGhlICoqZGVzdGluYXRpb24gZm9sZGVyKiogdGhlIHVzZXIgaGFzIHBpY2tlZCAobGl2ZS11cGRhdGVzKS5cbiAqXG4gKiBUd28gaW50ZWdyYXRpb24gcGF0aHM6XG4gKlxuICogIDEuICoqRnJvbSB3aXRoaW4gdGhpcyBsaWJyYXJ5KiogdmlhIGBEaWFsb2dTZXJ2aWNlLm9wZW4oLi4uKWAuIFRoZSBvdXRlclxuICogICAgIGBjcWEtZGlhbG9nYCBzdXBwbGllcyB0aXRsZS9kZXNjcmlwdGlvbi9DYW5jZWwvTW92ZSBidXR0b25zOyB0aGUgTW92ZVxuICogICAgIGJ1dHRvbiByZWFkcyBgcGlja2VkRm9sZGVySWRgIHZpYSBgZGlhbG9nUmVmLmdldENvbXBvbmVudEluc3RhbmNlKClgIGFuZFxuICogICAgIGNoZWNrcyBgaXNWYWxpZGAgYmVmb3JlIGNsb3NpbmcuXG4gKlxuICogIDIuICoqSG9zdC1kcml2ZW4qKiDigJQgaG9zdCByZW5kZXJzIGA8Y3FhLW1vdmUtdGVzdC1zdWl0ZS1kaWFsb2c+YCBpbnNpZGUgaXRzXG4gKiAgICAgb3duIG1vZGFsIGFuZCBsaXN0ZW5zIHRvIGAoc3VibWl0dGVkKWAgLyBgKGNhbmNlbGxlZClgIC8gYChwaWNrZWRGb2xkZXJJZENoYW5nZSlgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW92ZS10ZXN0LXN1aXRlLWRpYWxvZycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLXctZnVsbFwiPlxuICAgICAgPCEtLSBUZXN0IHN1aXRlIG5hbWUgKHJlYWQtb25seSBkaXNwbGF5OyBzdXJmYWNlcyB3aGljaCBzdWl0ZSBpcyBiZWluZyBtb3ZlZCkgLS0+XG4gICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICBbbGFiZWxdPVwidGVzdFN1aXRlTGFiZWxzLm1vdmVUZXN0U3VpdGVEaWFsb2dTdWl0ZU5hbWVMYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJzdWl0ZU5hbWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGRzRGlzYWJsZWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgPjwvY3FhLWN1c3RvbS1pbnB1dD5cblxuICAgICAgPCEtLSBDdXJyZW50IGZvbGRlciAocmVuZGVyZWQgYXMgYSBkaXNhYmxlZCBpbnB1dCkgLS0+XG4gICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICBbbGFiZWxdPVwidGVzdFN1aXRlTGFiZWxzLm1vdmVUZXN0U3VpdGVEaWFsb2dDdXJyZW50TGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwicmVzb2x2ZWRDdXJyZW50TmFtZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZHNEaXNhYmxlZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkN1cnJlbnRGaWVsZFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXNlZCk9XCJvbkN1cnJlbnRGaWVsZEZvY3VzZWQoJGV2ZW50KVwiXG4gICAgICAgIChibHVycmVkKT1cIm9uQ3VycmVudEZpZWxkQmx1cnJlZCgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgIDwhLS0gRGVzdGluYXRpb24gZm9sZGVyIChyZW5kZXJlZCBhcyBhIGRpc2FibGVkIGlucHV0OyB2YWx1ZSBkcml2ZW4gYnkgdGhlIHRyZWUgcGlja2VyIGJlbG93KSAtLT5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIFtsYWJlbF09XCJ0ZXN0U3VpdGVMYWJlbHMubW92ZVRlc3RTdWl0ZURpYWxvZ0Rlc3RpbmF0aW9uTGFiZWxcIlxuICAgICAgICBbdmFsdWVdPVwiZGVzdGluYXRpb25GaWVsZFZhbHVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlc3RpbmF0aW9uRmllbGRQbGFjZWhvbGRlclwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZHNEaXNhYmxlZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkRlc3RpbmF0aW9uRmllbGRWYWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzZWQpPVwib25EZXN0aW5hdGlvbkZpZWxkRm9jdXNlZCgkZXZlbnQpXCJcbiAgICAgICAgKGJsdXJyZWQpPVwib25EZXN0aW5hdGlvbkZpZWxkQmx1cnJlZCgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgIDwhLS0gRm9sZGVyIHRyZWUgcGlja2VyIC0tPlxuICAgICAgPGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2dcbiAgICAgICAgW2ZvbGRlcnNdPVwiZm9sZGVyc1wiXG4gICAgICAgIFtsYWJlbHNdPVwibGFiZWxzXCJcbiAgICAgICAgW2N1cnJlbnRGb2xkZXJJZF09XCJjdXJyZW50Rm9sZGVySWRcIlxuICAgICAgICBbcGlja2VkRm9sZGVySWRdPVwicGlja2VkRm9sZGVySWRcIlxuICAgICAgICBbcGlja2VySGVpZ2h0XT1cInBpY2tlckhlaWdodFwiXG4gICAgICAgIChwaWNrZWRGb2xkZXJJZENoYW5nZSk9XCJvblBhcmVudFBpY2tlZCgkZXZlbnQpXCJcbiAgICAgID48L2NxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1vdmVUZXN0U3VpdGVEaWFsb2dDb21wb25lbnQge1xuICAvLyBOT1RFOiBgZm9sZGVyc2AgYW5kIGBsYWJlbHNgIGFyZSBkZWNsYXJlZCBhcyBzZXR0ZXJzIChpbnN0ZWFkIG9mIHBsYWluIEBJbnB1dCBmaWVsZHMpXG4gIC8vIGJlY2F1c2UgYERpYWxvZ1NlcnZpY2Uub3BlbiguLi4pYCBhc3NpZ25zIHRoZSBgaW5wdXRzYCBtYXAgdmlhIGRpcmVjdCBwcm9wZXJ0eVxuICAvLyBhc3NpZ25tZW50ICphZnRlciogYGF0dGFjaENvbXBvbmVudGAgaGFzIGFscmVhZHkgcnVuIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGVcbiAgLy8gaG9va3Mg4oCUIGRpcmVjdCBhc3NpZ25tZW50IGJ5cGFzc2VzIGBuZ09uQ2hhbmdlc2AsIHNvIHNldHRlcnMga2VlcCBkZXJpdmVkIHN0YXRlXG4gIC8vIGluIHN5bmMgbm8gbWF0dGVyIHRoZSBhc3NpZ25tZW50IG9yZGVyLiBTYW1lIHBhdHRlcm4gYXMgYE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudGAuXG5cbiAgcHJpdmF0ZSBfZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNldCBmb2xkZXJzKHZhbHVlOiBGb2xkZXJOb2RlW10pIHtcbiAgICB0aGlzLl9mb2xkZXJzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGZvbGRlcnMoKTogRm9sZGVyTm9kZVtdIHsgcmV0dXJuIHRoaXMuX2ZvbGRlcnM7IH1cblxuICBwcml2YXRlIF9sYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgc2V0IGxhYmVscyh2YWx1ZTogTW9kdWxhckxhYmVscykge1xuICAgIHRoaXMuX2xhYmVscyA9IHZhbHVlIHx8IHsgLi4uREVGQVVMVF9NT0RVTEFSX0xBQkVMUyB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBsYWJlbHMoKTogTW9kdWxhckxhYmVscyB7IHJldHVybiB0aGlzLl9sYWJlbHM7IH1cblxuICAvKiogVGVzdC1zdWl0ZS1zZWN0aW9uIGxhYmVscyAodGl0bGUsIGRlc2NyaXB0aW9uLCBidXR0b24gdGV4dCwgZmllbGQgbGFiZWxzLFxuICAgKiAgcGxhY2Vob2xkZXIpLiBLZXB0IHNlcGFyYXRlIGZyb20gYGxhYmVsc2AgKE1vZHVsYXJMYWJlbHMpIHNvIHRoZSBlbWJlZGRlZFxuICAgKiAgcGlja2VyIGNhbiBrZWVwIGl0cyBtb2R1bGFyLXRhYmxlLXRlbXBsYXRlIGxhYmVsIG1vZGVsLiBTYW1lIHNldHRlclxuICAgKiAgcGF0dGVybiBhcyBgbGFiZWxzYCBmb3IgRGlhbG9nU2VydmljZSBwcm9wZXJ0eS1hc3NpZ25tZW50IGNvbXBhdGliaWxpdHkuICovXG4gIHByaXZhdGUgX3Rlc3RTdWl0ZUxhYmVsczogVGVzdFN1aXRlTGFiZWxzID0geyAuLi5ERUZBVUxUX1RFU1RfU1VJVEVfTEFCRUxTIH07XG4gIEBJbnB1dCgpIHNldCB0ZXN0U3VpdGVMYWJlbHModmFsdWU6IFRlc3RTdWl0ZUxhYmVscykge1xuICAgIHRoaXMuX3Rlc3RTdWl0ZUxhYmVscyA9IHZhbHVlIHx8IHsgLi4uREVGQVVMVF9URVNUX1NVSVRFX0xBQkVMUyB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB0ZXN0U3VpdGVMYWJlbHMoKTogVGVzdFN1aXRlTGFiZWxzIHsgcmV0dXJuIHRoaXMuX3Rlc3RTdWl0ZUxhYmVsczsgfVxuXG4gIC8qKiBGb2xkZXIgdGhlIHN1aXRlIGN1cnJlbnRseSBsaXZlcyBpbi4gVXNlZCBib3RoIHRvIGdyYXkgb3V0IHRoZSByb3cgaW4gdGhlXG4gICAqICBlbWJlZGRlZCBwaWNrZXIgYW5kIHRvIHJlbmRlciB0aGUgXCJDdXJyZW50IGZvbGRlclwiIHJlYWRvdXQuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgY3VycmVudC1mb2xkZXIgZGlzcGxheSBuYW1lLiBXaGVuIG5vdCBwcm92aWRlZCxcbiAgICogIHRoZSBjb21wb25lbnQgcmVzb2x2ZXMgdGhlIG5hbWUgZnJvbSBgZm9sZGVyc2AgYnkgd2Fsa2luZyB0byBgY3VycmVudEZvbGRlcklkYCxcbiAgICogIGZhbGxpbmcgYmFjayB0byBgbGFiZWxzLm1vdmVEaWFsb2dSb290YCAoXCJVbm9yZ2FuaXplZFwiKSB3aGVuIG51bGwuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogTmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSBiZWluZyBtb3ZlZC4gUmVuZGVyZWQgYXMgYSBkaXNhYmxlZCBpbnB1dCBhdCB0aGVcbiAgICogIHRvcCBvZiB0aGUgZGlhbG9nIGJvZHkgc28gdGhlIHVzZXIgY2FuIGNvbmZpcm0gd2hpY2ggc3VpdGUgdGhlIG1vdmVcbiAgICogIGFwcGxpZXMgdG8uIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZy4gKi9cbiAgQElucHV0KCkgc3VpdGVOYW1lOiBzdHJpbmcgPSAnJztcblxuICAvKiogRGVzdGluYXRpb24gZm9sZGVyIGlkIHBpY2tlZCBieSB0aGUgdXNlci4gVHdvLXdheS1iaW5kIGZyaWVuZGx5LiAqL1xuICBASW5wdXQoKSBwaWNrZWRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhlaWdodCBvZiB0aGUgZW1iZWRkZWQgcGlja2VyLiBEZWZhdWx0cyB0byAyNDBweCAobWF0Y2hlcyB0aGUgcGFyZW50LWZvbGRlclxuICAgKiAgcGlja2VyIGhlaWdodCBpbiBgTmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50YCkgc28gdGhlIG1vZGFsIHN0YXlzIGNvbXBhY3QuICovXG4gIEBJbnB1dCgpIHBpY2tlckhlaWdodDogc3RyaW5nID0gJzI0MHB4JztcblxuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYm90aCB0aGUgQ3VycmVudCBmb2xkZXIgYW5kIERlc3RpbmF0aW9uIGZvbGRlciBpbnB1dHNcbiAgICogIHJlbmRlciBhcyBkaXNhYmxlZCAocmVhZC1vbmx5IHZpYSB0aGUgY3FhLWN1c3RvbS1pbnB1dCBgW2Rpc2FibGVkXWAgZmxhZykuXG4gICAqICBTZXQgdG8gZmFsc2UgaWYgYSBob3N0IG5lZWRzIHRvIHJlLWVuYWJsZSBpbnRlcmFjdGlvbiBvbiB0aG9zZSBmaWVsZHMuICovXG4gIEBJbnB1dCgpIGZpZWxkc0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgcGlja2VkRm9sZGVySWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGFyZ2V0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogQnViYmxlIGNxYS1jdXN0b20taW5wdXQgZm9jdXMvYmx1ciBldmVudHMgdXAgdG8gaG9zdHMuIFVzZWZ1bCB3aGVuXG4gICAqICBgZmllbGRzRGlzYWJsZWQgPSBmYWxzZWAgYW5kIHRoZSBob3N0IHdhbnRzIHRvIHJlYWN0IHRvIGludGVyYWN0aW9uLiAqL1xuICBAT3V0cHV0KCkgY3VycmVudEZpZWxkRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjdXJyZW50RmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZGVzdGluYXRpb25GaWVsZEZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZGVzdGluYXRpb25GaWVsZEJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgLyoqIFNldCB0byB0cnVlIHRoZSBmaXJzdCB0aW1lIHRoZSB1c2VyIHBpY2tzIGFueXRoaW5nLiBMZXRzIGBpc1ZhbGlkYCB0cmVhdFxuICAgKiAgdGhlIGluaXRpYWwgcHJlLXRvdWNoIHN0YXRlIGFzIFwibm90aGluZyBzZWxlY3RlZFwiIOKAlCBpbXBvcnRhbnQgd2hlbiB0aGVcbiAgICogIHN1aXRlIHN0YXJ0cyBpbiBVbm9yZ2FuaXplZCAoYGN1cnJlbnRGb2xkZXJJZCA9IG51bGxgKSBzbyBhIGZyZXNoIGRpYWxvZ1xuICAgKiAgZG9lc24ndCBhcHBlYXIgdmFsaWQganVzdCBiZWNhdXNlIGBwaWNrZWRGb2xkZXJJZGAgYWxzbyBkZWZhdWx0cyB0byBudWxsLiAqL1xuICBwcml2YXRlIHBpY2tlZFRvdWNoZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25QYXJlbnRQaWNrZWQoaWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBsZXQgbmV4dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvZXJjZWQgPSB0eXBlb2YgaWQgPT09ICdudW1iZXInID8gaWQgOiBOdW1iZXIoaWQpO1xuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShjb2VyY2VkKSkgbmV4dCA9IGNvZXJjZWQ7XG4gICAgfVxuICAgIHRoaXMucGlja2VkRm9sZGVySWQgPSBuZXh0O1xuICAgIHRoaXMucGlja2VkVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5waWNrZWRGb2xkZXJJZENoYW5nZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRydWUgb25jZSB0aGUgdXNlciBoYXMgcGlja2VkIGEgZGVzdGluYXRpb24gdmlhIHRoZSBlbWJlZGRlZCB0cmVlLiBEcml2ZXNcbiAgICogIHRoZSBkZXN0aW5hdGlvbi1yZWFkb3V0IHN0eWxpbmcgKGluZGlnbyB3aGVuIHBpY2tlZCwgbXV0ZWQgd2hlbiBub3QpLiAqL1xuICBnZXQgaGFzUGljaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZWRUb3VjaGVkO1xuICB9XG5cbiAgZ2V0IHJlc29sdmVkQ3VycmVudE5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVyTmFtZSAmJiB0aGlzLmN1cnJlbnRGb2xkZXJOYW1lLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRGb2xkZXJOYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVySWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWxzLm1vdmVEaWFsb2dSb290O1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdGhpcy5maW5kRm9sZGVyTmFtZSh0aGlzLl9mb2xkZXJzLCB0aGlzLmN1cnJlbnRGb2xkZXJJZCk7XG4gICAgcmV0dXJuIG5hbWUgPz8gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gIH1cblxuICAvKiogVmFsdWUgc2hvd24gaW5zaWRlIHRoZSBEZXN0aW5hdGlvbiBpbnB1dC4gRW1wdHkgdW50aWwgdGhlIHVzZXIgcGlja3M7IG9uY2VcbiAgICogIHBpY2tlZCwgdGhlIHJlc29sdmVkIGZvbGRlciBuYW1lIChvciBgbGFiZWxzLm1vdmVEaWFsb2dSb290YCBmb3IgVW5vcmdhbml6ZWQpLlxuICAgKiAgRW1wdHkgc3RhdGUgbGV0cyB0aGUgaW5wdXQncyBgW3BsYWNlaG9sZGVyXWAgc2hvdyB0aHJvdWdoLiAqL1xuICBnZXQgZGVzdGluYXRpb25GaWVsZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnBpY2tlZFRvdWNoZWQpIHJldHVybiAnJztcbiAgICBpZiAodGhpcy5waWNrZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gICAgcmV0dXJuIHRoaXMuZmluZEZvbGRlck5hbWUodGhpcy5fZm9sZGVycywgdGhpcy5waWNrZWRGb2xkZXJJZCkgPz8gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gIH1cblxuICAvKiogUGxhY2Vob2xkZXIgc2hvd24gaW4gdGhlIERlc3RpbmF0aW9uIGlucHV0IGJlZm9yZSB0aGUgdXNlciBwaWNrcy4gKi9cbiAgZ2V0IGRlc3RpbmF0aW9uRmllbGRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90ZXN0U3VpdGVMYWJlbHMubW92ZVRlc3RTdWl0ZURpYWxvZ0Rlc3RpbmF0aW9uUGxhY2Vob2xkZXI7XG4gIH1cblxuICAvKiogTW92ZSBpcyB2YWxpZCB3aGVuIHRoZSB1c2VyIGhhcyBwaWNrZWQgYSBkZXN0aW5hdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICogIGN1cnJlbnQgZm9sZGVyLiBQaWNraW5nIHRoZSBzYW1lIGZvbGRlciBhcyB0aGUgc291cmNlIGlzIGEgbm8tb3AsIGFuZCB3ZVxuICAgKiAgYWxzbyByZXF1aXJlIGFuIGV4cGxpY2l0IGludGVyYWN0aW9uIChgcGlja2VkVG91Y2hlZGApLiAqL1xuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucGlja2VkVG91Y2hlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBpY2tlZEZvbGRlcklkICE9PSB0aGlzLmN1cnJlbnRGb2xkZXJJZDtcbiAgfVxuXG4gIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoeyB0YXJnZXRGb2xkZXJJZDogdGhpcy5waWNrZWRGb2xkZXJJZCB9KTtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICAvKiogSG9va3MgZm9yIHRoZSBDdXJyZW50IGZvbGRlciBjcWEtY3VzdG9tLWlucHV0LiBGaWVsZCBpcyBkaXNhYmxlZCBieVxuICAgKiAgZGVmYXVsdCwgc28gdGhlc2UgbW9zdGx5IG5vLW9wOyB0aGV5J3JlIHdpcmVkIHNvIHRoZSBjb21wb25lbnQgc3RpbGxcbiAgICogIGJlaGF2ZXMgY29ycmVjdGx5IHdoZW4gYGZpZWxkc0Rpc2FibGVkID0gZmFsc2VgLiAqL1xuICBvbkN1cnJlbnRGaWVsZFZhbHVlQ2hhbmdlKF92YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVhZC1vbmx5IGZpZWxkIOKAlCBpZ25vcmUgcHJvZ3JhbW1hdGljIGNoYW5nZXMuXG4gIH1cbiAgb25DdXJyZW50RmllbGRGb2N1c2VkKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50RmllbGRGb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuICBvbkN1cnJlbnRGaWVsZEJsdXJyZWQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRGaWVsZEJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKiogSG9va3MgZm9yIHRoZSBEZXN0aW5hdGlvbiBmb2xkZXIgY3FhLWN1c3RvbS1pbnB1dC4gVmFsdWUgaXMgZHJpdmVuIGJ5IHRoZVxuICAgKiAgdHJlZSBwaWNrZXIgYmVsb3csIHNvIHRoZSBpbnB1dCBpdHNlbGYgaXMgaW5mb3JtYXRpb25hbC4gKi9cbiAgb25EZXN0aW5hdGlvbkZpZWxkVmFsdWVDaGFuZ2UoX3ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBEZXN0aW5hdGlvbiBpcyBkcml2ZW4gYnkgdGhlIHRyZWUgcGlja2VyLCBub3QgdGhlIGlucHV0IGl0c2VsZi5cbiAgfVxuICBvbkRlc3RpbmF0aW9uRmllbGRGb2N1c2VkKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbkZpZWxkRm9jdXMuZW1pdChldmVudCk7XG4gIH1cbiAgb25EZXN0aW5hdGlvbkZpZWxkQmx1cnJlZChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdGluYXRpb25GaWVsZEJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRGb2xkZXJOYW1lKG5vZGVzOiBGb2xkZXJOb2RlW10sIGlkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGlmIChuLmlkID09PSBpZCkgcmV0dXJuIG4ubmFtZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgaGl0ID0gdGhpcy5maW5kRm9sZGVyTmFtZShuLmNoaWxkcmVuLCBpZCk7XG4gICAgICAgIGlmIChoaXQgIT0gbnVsbCkgcmV0dXJuIGhpdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10ZXN0LXN1aXRlLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3Qtc3VpdGUvbW92ZS10ZXN0LXN1aXRlLWRpYWxvZy9tb3ZlLXRlc3Qtc3VpdGUtZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sc0VBQXNFLENBQUM7QUFDOUUsT0FBTyxFQUFFLHlCQUF5QixFQUFtQixNQUFNLHNCQUFzQixDQUFDOzs7O0FBYWxGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQXNISCxNQUFNLE9BQU8sNEJBQTRCO0lBc0Z2QyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXJGMUMsd0ZBQXdGO1FBQ3hGLGlGQUFpRjtRQUNqRixpRkFBaUY7UUFDakYsa0ZBQWtGO1FBQ2xGLHNGQUFzRjtRQUU5RSxhQUFRLEdBQWlCLEVBQUUsQ0FBQztRQU81QixZQUFPLEdBQWtCLEVBQUUsR0FBRyxzQkFBc0IsRUFBRSxDQUFDO1FBTy9EOzs7dUZBRytFO1FBQ3ZFLHFCQUFnQixHQUFvQixFQUFFLEdBQUcseUJBQXlCLEVBQUUsQ0FBQztRQU83RTswRUFDa0U7UUFDekQsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBRS9DOztpRkFFeUU7UUFDaEUsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUVqRDs7b0RBRTRDO1FBQ25DLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFFaEMsdUVBQXVFO1FBQzlELG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUU5Qzt1RkFDK0U7UUFDdEUsaUJBQVksR0FBVyxPQUFPLENBQUM7UUFFeEM7O3FGQUU2RTtR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RyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBERUZBVUxUX01PRFVMQVJfTEFCRUxTLFxuICBGb2xkZXJOb2RlLFxuICBNb2R1bGFyTGFiZWxzLFxufSBmcm9tICcuLi8uLi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5pbXBvcnQgeyBERUZBVUxUX1RFU1RfU1VJVEVfTEFCRUxTLCBUZXN0U3VpdGVMYWJlbHMgfSBmcm9tICcuLi90ZXN0LXN1aXRlLm1vZGVscyc7XG5cbmludGVyZmFjZSBGbGF0Rm9sZGVyUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXB0aDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgaGFzQ2hpbGRyZW46IGJvb2xlYW47XG4gIGV4cGFuZGVkOiBib29sZWFuO1xuICBjaGlsZHJlbkxvYWRpbmc6IGJvb2xlYW47XG4gIHNob3dMb2FkaW5nUGxhY2Vob2xkZXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQm9keSBvZiB0aGUgXCJNb3ZlIFRlc3QgU3VpdGVcIiBkaWFsb2cuXG4gKlxuICogUmV1c2VzIGA8Y3FhLW1vdmUtdG8tZm9sZGVyLWRpYWxvZz5gIGFzIHRoZSB0cmVlIHBpY2tlciAoc2FtZSBlbWJlZGRpbmcgcGF0dGVyblxuICogYXMgYE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudGApIHNvIGNvbnN1bWVycyBnZXQgdGhlIHNhbWUgZm9sZGVyLXRyZWUgVVgsIHdoaWxlXG4gKiBhZGRpbmcgdHdvIHJlYWQtb25seSByb3dzIGFib3ZlIGl0OiB0aGUgc3VpdGUncyAqKmN1cnJlbnQgZm9sZGVyKiogKHNvdXJjZSlcbiAqIGFuZCB0aGUgKipkZXN0aW5hdGlvbiBmb2xkZXIqKiB0aGUgdXNlciBoYXMgcGlja2VkIChsaXZlLXVwZGF0ZXMpLlxuICpcbiAqIFR3byBpbnRlZ3JhdGlvbiBwYXRoczpcbiAqXG4gKiAgMS4gKipGcm9tIHdpdGhpbiB0aGlzIGxpYnJhcnkqKiB2aWEgYERpYWxvZ1NlcnZpY2Uub3BlbiguLi4pYC4gVGhlIG91dGVyXG4gKiAgICAgYGNxYS1kaWFsb2dgIHN1cHBsaWVzIHRpdGxlL2Rlc2NyaXB0aW9uL0NhbmNlbC9Nb3ZlIGJ1dHRvbnM7IHRoZSBNb3ZlXG4gKiAgICAgYnV0dG9uIHJlYWRzIGBwaWNrZWRGb2xkZXJJZGAgdmlhIGBkaWFsb2dSZWYuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKWAgYW5kXG4gKiAgICAgY2hlY2tzIGBpc1ZhbGlkYCBiZWZvcmUgY2xvc2luZy5cbiAqXG4gKiAgMi4gKipIb3N0LWRyaXZlbioqIOKAlCBob3N0IHJlbmRlcnMgYDxjcWEtbW92ZS10ZXN0LXN1aXRlLWRpYWxvZz5gIGluc2lkZSBpdHNcbiAqICAgICBvd24gbW9kYWwgYW5kIGxpc3RlbnMgdG8gYChzdWJtaXR0ZWQpYCAvIGAoY2FuY2VsbGVkKWAgLyBgKHBpY2tlZEZvbGRlcklkQ2hhbmdlKWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1tb3ZlLXRlc3Qtc3VpdGUtZGlhbG9nJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtdy1mdWxsXCI+XG4gICAgICA8IS0tIFRlc3Qgc3VpdGUgbmFtZSAocmVhZC1vbmx5IGRpc3BsYXk7IHN1cmZhY2VzIHdoaWNoIHN1aXRlIGlzIGJlaW5nIG1vdmVkKSAtLT5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIFtsYWJlbF09XCJ0ZXN0U3VpdGVMYWJlbHMubW92ZVRlc3RTdWl0ZURpYWxvZ1N1aXRlTmFtZUxhYmVsXCJcbiAgICAgICAgW3ZhbHVlXT1cInN1aXRlTmFtZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZHNEaXNhYmxlZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICA+PC9jcWEtY3VzdG9tLWlucHV0PlxuXG4gICAgICA8IS0tIEN1cnJlbnQgZm9sZGVyIChyZW5kZXJlZCBhcyBhIGRpc2FibGVkIGlucHV0KSAtLT5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIFtsYWJlbF09XCJ0ZXN0U3VpdGVMYWJlbHMubW92ZVRlc3RTdWl0ZURpYWxvZ0N1cnJlbnRMYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJyZXNvbHZlZEN1cnJlbnROYW1lXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkc0Rpc2FibGVkXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ3VycmVudEZpZWxkVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChmb2N1c2VkKT1cIm9uQ3VycmVudEZpZWxkRm9jdXNlZCgkZXZlbnQpXCJcbiAgICAgICAgKGJsdXJyZWQpPVwib25DdXJyZW50RmllbGRCbHVycmVkKCRldmVudClcIlxuICAgICAgPjwvY3FhLWN1c3RvbS1pbnB1dD5cblxuICAgICAgPCEtLSBEZXN0aW5hdGlvbiBmb2xkZXIgKHJlbmRlcmVkIGFzIGEgZGlzYWJsZWQgaW5wdXQ7IHZhbHVlIGRyaXZlbiBieSB0aGUgdHJlZSBwaWNrZXIgYmVsb3cpIC0tPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgW2xhYmVsXT1cInRlc3RTdWl0ZUxhYmVscy5tb3ZlVGVzdFN1aXRlRGlhbG9nRGVzdGluYXRpb25MYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJkZXN0aW5hdGlvbkZpZWxkVmFsdWVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGVzdGluYXRpb25GaWVsZFBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkc0Rpc2FibGVkXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRGVzdGluYXRpb25GaWVsZFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXNlZCk9XCJvbkRlc3RpbmF0aW9uRmllbGRGb2N1c2VkKCRldmVudClcIlxuICAgICAgICAoYmx1cnJlZCk9XCJvbkRlc3RpbmF0aW9uRmllbGRCbHVycmVkKCRldmVudClcIlxuICAgICAgPjwvY3FhLWN1c3RvbS1pbnB1dD5cblxuICAgICAgPCEtLSBGb2xkZXIgdHJlZSBwaWNrZXIgKGlubGluZWQ7IHRha2VzIHJlZmVyZW5jZSBmcm9tIGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2dcbiAgICAgICAgICAgYnV0IGRvZXMgbm90IGVtYmVkIGl0LCBzbyB0aGUgbGF6eS1mZXRjaCB3aXJpbmcgYW5kIGV4cGFuc2lvbiBzdGF0ZSBzdGF5XG4gICAgICAgICAgIGxvY2FsIHRvIHRoaXMgZGlhbG9nKS4gLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI2ZvbGRlckljb25UcGw+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAxNyAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE1LjYzNzUgMTIuNjM3N0MxNS42Mzc1IDEzLjAzNTUgMTUuNDc5NCAxMy40MTcxIDE1LjE5ODEgMTMuNjk4NEMxNC45MTY4IDEzLjk3OTcgMTQuNTM1MyAxNC4xMzc3IDE0LjEzNzUgMTQuMTM3N0gyLjEzNzQ1QzEuNzM5NjMgMTQuMTM3NyAxLjM1ODEgMTMuOTc5NyAxLjA3Njc5IDEzLjY5ODRDMC43OTU0ODYgMTMuNDE3MSAwLjYzNzQ1MSAxMy4wMzU1IDAuNjM3NDUxIDEyLjYzNzdWMi4xMzc3QzAuNjM3NDUxIDEuNzM5ODcgMC43OTU0ODYgMS4zNTgzNCAxLjA3Njc5IDEuMDc3MDRDMS4zNTgxIDAuNzk1NzMxIDEuNzM5NjMgMC42Mzc2OTUgMi4xMzc0NSAwLjYzNzY5NUg1Ljg4NzQ1TDcuMzg3NDUgMi44ODc3SDE0LjEzNzVDMTQuNTM1MyAyLjg4NzcgMTQuOTE2OCAzLjA0NTczIDE1LjE5ODEgMy4zMjcwNEMxNS40Nzk0IDMuNjA4MzQgMTUuNjM3NSAzLjk4OTg3IDE1LjYzNzUgNC4zODc3VjEyLjYzNzdaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlICN1bm9yZ2FuaXplZEljb25UcGw+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAxNyAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE0LjY4NzUgNS41VjEyLjVDMTQuNjg3NSAxMy4zIDE0LjAzNzUgMTQgMTMuMTg3NSAxNEgzLjgxMjVDMi45NjI1IDE0IDIuMzEyNSAxMy4zIDIuMzEyNSAxMi41VjUuNU0xNC42ODc1IDUuNUwxMi43ODc1IDEuN0MxMi41Mzc1IDEuMiAxMi4wODc1IDEgMTEuNTg3NSAxSDUuNDEyNUM0LjkxMjUgMSA0LjQ2MjUgMS4yIDQuMjEyNSAxLjdMMi4zMTI1IDUuNU0xNC42ODc1IDUuNUgyLjMxMjVNNi4xODc1IDguNUgxMC44MTI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1weS0yIGNxYS13LWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXNjcm9sbGJhci10aGluXCIgW3N0eWxlLmhlaWdodF09XCJwaWNrZXJIZWlnaHRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weC00IGNxYS1weS0yIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXRleHQtc21cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImlzUGlja2VkKG51bGwpID8gJ2NxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtaW5kaWdvLTcwMCcgOiAnY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtNTAnXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktNDBdPVwiaXNVbm9yZ2FuaXplZERpc2FibGVkXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJpc1Vub3JnYW5pemVkRGlzYWJsZWRcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNVbm9yZ2FuaXplZERpc2FibGVkIHx8IG51bGxcIlxuICAgICAgICAgIChjbGljayk9XCIhaXNVbm9yZ2FuaXplZERpc2FibGVkICYmIHBpY2sobnVsbClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiFpc1Vub3JnYW5pemVkRGlzYWJsZWQgJiYgcGljayhudWxsKVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICFpc1Vub3JnYW5pemVkRGlzYWJsZWQgJiYgcGljayhudWxsKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2sgY3FhLXctNSBjcWEtaC01IGNxYS1mbGV4LXNocmluay0wXCI+PC9zcGFuPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ1bm9yZ2FuaXplZEljb25UcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8c3Bhbj57eyBsYWJlbHMubW92ZURpYWxvZ1Jvb3QgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiBmbGF0Um93czsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weS0yIGNxYS1wci00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXRleHQtc21cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNQaWNrZWQocm93LmlkKSA/ICdjcWEtYmctaW5kaWdvLTUwIGNxYS10ZXh0LWluZGlnby03MDAnIDogJ2NxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTUwJ1wiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktNDBdPVwicm93LmRpc2FibGVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLW5vdC1hbGxvd2VkXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgICAgICBbc3R5bGUucGFkZGluZ0xlZnQucHhdPVwiMTYgKyByb3cuZGVwdGggKiAyNFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIXJvdy5kaXNhYmxlZCAmJiAkZXZlbnQucHJldmVudERlZmF1bHQoKTsgIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJyb3cuaGFzQ2hpbGRyZW47IGVsc2UgY2hldnJvblBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTUgY3FhLWgtNSBjcWEtZmxleC1zaHJpbmstMCBjcWEtcm91bmRlZCBjcWEtdGV4dC1uZXV0cmFsLTYwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgaG92ZXI6Y3FhLXRleHQtbmV1dHJhbC05MDBcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJvdy5leHBhbmRlZCA/ICdDb2xsYXBzZSAnICsgcm93Lm5hbWUgOiAnRXhwYW5kICcgKyByb3cubmFtZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmRlZChyb3cuaWQhLCAkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3FhLXJvdGF0ZS05MF09XCJyb3cuZXhwYW5kZWRcIiBzdHlsZT1cInRyYW5zaXRpb246IHRyYW5zZm9ybSAxMjBtcyBlYXNlO1wiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSAzTDkgN0w1IDExXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGV2cm9uUGxhY2Vob2xkZXI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy01IGNxYS1oLTUgY3FhLWZsZXgtc2hyaW5rLTBcIj48L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvblRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdHJ1bmNhdGVcIj57eyByb3cubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwicm93LnNob3dMb2FkaW5nUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weS0yIGNxYS1wci00IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNTAwIGNxYS1pdGFsaWNcIlxuICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cIjE2ICsgKHJvdy5kZXB0aCArIDEpICogMjRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy01IGNxYS1oLTUgY3FhLWZsZXgtc2hyaW5rLTBcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj5Mb2FkaW5n4oCmPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNb3ZlVGVzdFN1aXRlRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvLyBOT1RFOiBgZm9sZGVyc2AgYW5kIGBsYWJlbHNgIGFyZSBkZWNsYXJlZCBhcyBzZXR0ZXJzIChpbnN0ZWFkIG9mIHBsYWluIEBJbnB1dCBmaWVsZHMpXG4gIC8vIGJlY2F1c2UgYERpYWxvZ1NlcnZpY2Uub3BlbiguLi4pYCBhc3NpZ25zIHRoZSBgaW5wdXRzYCBtYXAgdmlhIGRpcmVjdCBwcm9wZXJ0eVxuICAvLyBhc3NpZ25tZW50ICphZnRlciogYGF0dGFjaENvbXBvbmVudGAgaGFzIGFscmVhZHkgcnVuIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGVcbiAgLy8gaG9va3Mg4oCUIGRpcmVjdCBhc3NpZ25tZW50IGJ5cGFzc2VzIGBuZ09uQ2hhbmdlc2AsIHNvIHNldHRlcnMga2VlcCBkZXJpdmVkIHN0YXRlXG4gIC8vIGluIHN5bmMgbm8gbWF0dGVyIHRoZSBhc3NpZ25tZW50IG9yZGVyLiBTYW1lIHBhdHRlcm4gYXMgYE5ld0ZvbGRlckRpYWxvZ0NvbXBvbmVudGAuXG5cbiAgcHJpdmF0ZSBfZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNldCBmb2xkZXJzKHZhbHVlOiBGb2xkZXJOb2RlW10pIHtcbiAgICB0aGlzLl9mb2xkZXJzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGZvbGRlcnMoKTogRm9sZGVyTm9kZVtdIHsgcmV0dXJuIHRoaXMuX2ZvbGRlcnM7IH1cblxuICBwcml2YXRlIF9sYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgQElucHV0KCkgc2V0IGxhYmVscyh2YWx1ZTogTW9kdWxhckxhYmVscykge1xuICAgIHRoaXMuX2xhYmVscyA9IHZhbHVlIHx8IHsgLi4uREVGQVVMVF9NT0RVTEFSX0xBQkVMUyB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBsYWJlbHMoKTogTW9kdWxhckxhYmVscyB7IHJldHVybiB0aGlzLl9sYWJlbHM7IH1cblxuICAvKiogVGVzdC1zdWl0ZS1zZWN0aW9uIGxhYmVscyAodGl0bGUsIGRlc2NyaXB0aW9uLCBidXR0b24gdGV4dCwgZmllbGQgbGFiZWxzLFxuICAgKiAgcGxhY2Vob2xkZXIpLiBLZXB0IHNlcGFyYXRlIGZyb20gYGxhYmVsc2AgKE1vZHVsYXJMYWJlbHMpIHNvIHRoZSBlbWJlZGRlZFxuICAgKiAgcGlja2VyIGNhbiBrZWVwIGl0cyBtb2R1bGFyLXRhYmxlLXRlbXBsYXRlIGxhYmVsIG1vZGVsLiBTYW1lIHNldHRlclxuICAgKiAgcGF0dGVybiBhcyBgbGFiZWxzYCBmb3IgRGlhbG9nU2VydmljZSBwcm9wZXJ0eS1hc3NpZ25tZW50IGNvbXBhdGliaWxpdHkuICovXG4gIHByaXZhdGUgX3Rlc3RTdWl0ZUxhYmVsczogVGVzdFN1aXRlTGFiZWxzID0geyAuLi5ERUZBVUxUX1RFU1RfU1VJVEVfTEFCRUxTIH07XG4gIEBJbnB1dCgpIHNldCB0ZXN0U3VpdGVMYWJlbHModmFsdWU6IFRlc3RTdWl0ZUxhYmVscykge1xuICAgIHRoaXMuX3Rlc3RTdWl0ZUxhYmVscyA9IHZhbHVlIHx8IHsgLi4uREVGQVVMVF9URVNUX1NVSVRFX0xBQkVMUyB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB0ZXN0U3VpdGVMYWJlbHMoKTogVGVzdFN1aXRlTGFiZWxzIHsgcmV0dXJuIHRoaXMuX3Rlc3RTdWl0ZUxhYmVsczsgfVxuXG4gIC8qKiBGb2xkZXIgdGhlIHN1aXRlIGN1cnJlbnRseSBsaXZlcyBpbi4gVXNlZCBib3RoIHRvIGdyYXkgb3V0IHRoZSByb3cgaW4gdGhlXG4gICAqICBlbWJlZGRlZCBwaWNrZXIgYW5kIHRvIHJlbmRlciB0aGUgXCJDdXJyZW50IGZvbGRlclwiIHJlYWRvdXQuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgY3VycmVudC1mb2xkZXIgZGlzcGxheSBuYW1lLiBXaGVuIG5vdCBwcm92aWRlZCxcbiAgICogIHRoZSBjb21wb25lbnQgcmVzb2x2ZXMgdGhlIG5hbWUgZnJvbSBgZm9sZGVyc2AgYnkgd2Fsa2luZyB0byBgY3VycmVudEZvbGRlcklkYCxcbiAgICogIGZhbGxpbmcgYmFjayB0byBgbGFiZWxzLm1vdmVEaWFsb2dSb290YCAoXCJVbm9yZ2FuaXplZFwiKSB3aGVuIG51bGwuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogTmFtZSBvZiB0aGUgdGVzdCBzdWl0ZSBiZWluZyBtb3ZlZC4gUmVuZGVyZWQgYXMgYSBkaXNhYmxlZCBpbnB1dCBhdCB0aGVcbiAgICogIHRvcCBvZiB0aGUgZGlhbG9nIGJvZHkgc28gdGhlIHVzZXIgY2FuIGNvbmZpcm0gd2hpY2ggc3VpdGUgdGhlIG1vdmVcbiAgICogIGFwcGxpZXMgdG8uIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZy4gKi9cbiAgQElucHV0KCkgc3VpdGVOYW1lOiBzdHJpbmcgPSAnJztcblxuICAvKiogRGVzdGluYXRpb24gZm9sZGVyIGlkIHBpY2tlZCBieSB0aGUgdXNlci4gVHdvLXdheS1iaW5kIGZyaWVuZGx5LiAqL1xuICBASW5wdXQoKSBwaWNrZWRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhlaWdodCBvZiB0aGUgZW1iZWRkZWQgcGlja2VyLiBEZWZhdWx0cyB0byAyNDBweCAobWF0Y2hlcyB0aGUgcGFyZW50LWZvbGRlclxuICAgKiAgcGlja2VyIGhlaWdodCBpbiBgTmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50YCkgc28gdGhlIG1vZGFsIHN0YXlzIGNvbXBhY3QuICovXG4gIEBJbnB1dCgpIHBpY2tlckhlaWdodDogc3RyaW5nID0gJzI0MHB4JztcblxuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYm90aCB0aGUgQ3VycmVudCBmb2xkZXIgYW5kIERlc3RpbmF0aW9uIGZvbGRlciBpbnB1dHNcbiAgICogIHJlbmRlciBhcyBkaXNhYmxlZCAocmVhZC1vbmx5IHZpYSB0aGUgY3FhLWN1c3RvbS1pbnB1dCBgW2Rpc2FibGVkXWAgZmxhZykuXG4gICAqICBTZXQgdG8gZmFsc2UgaWYgYSBob3N0IG5lZWRzIHRvIHJlLWVuYWJsZSBpbnRlcmFjdGlvbiBvbiB0aG9zZSBmaWVsZHMuICovXG4gIEBJbnB1dCgpIGZpZWxkc0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgcGlja2VkRm9sZGVySWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGFyZ2V0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEZpcmVzIHdoZW4gYSBmb2xkZXIgbmVlZHMgaXRzIGNoaWxkcmVuIGZldGNoZWQuIEVtaXR0ZWQgYnkgYHBpY2tgIChyb3dcbiAgICogIGNsaWNrKSBhbmQgYHRvZ2dsZUV4cGFuZGVkYCAoY2hldnJvbiBjbGljaykgd2hlbiB0aGUgdGFyZ2V0IG5vZGUgaGFzXG4gICAqICBgaGFzQ2hpbGRyZW4gPSB0cnVlYCBidXQgYGxvYWRlZFBhZ2VzID09IG51bGxgIGFuZCBpcyBub3QgYWxyZWFkeSBmZXRjaGluZy5cbiAgICogIEhvc3RzIHN1YnNjcmliZSBhbmQgY2FsbCB0aGVpciBwYWdpbmF0ZWQgZmV0Y2gsIG11dGF0aW5nIHRoZSBGb2xkZXJOb2RlXG4gICAqICBpbiBwbGFjZSAoc2V0IGBjaGlsZHJlbmAsIGBsb2FkZWRQYWdlc2AsIGBjaGlsZHJlbkxvYWRpbmdgKS4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckNoaWxkcmVuUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgLyoqIEJ1YmJsZSBjcWEtY3VzdG9tLWlucHV0IGZvY3VzL2JsdXIgZXZlbnRzIHVwIHRvIGhvc3RzLiBVc2VmdWwgd2hlblxuICAgKiAgYGZpZWxkc0Rpc2FibGVkID0gZmFsc2VgIGFuZCB0aGUgaG9zdCB3YW50cyB0byByZWFjdCB0byBpbnRlcmFjdGlvbi4gKi9cbiAgQE91dHB1dCgpIGN1cnJlbnRGaWVsZEZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCkgY3VycmVudEZpZWxkQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRlc3RpbmF0aW9uRmllbGRGb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRlc3RpbmF0aW9uRmllbGRCbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuXG4gIC8qKiBTZXQgdG8gdHJ1ZSB0aGUgZmlyc3QgdGltZSB0aGUgdXNlciBwaWNrcyBhbnl0aGluZy4gTGV0cyBgaXNWYWxpZGAgdHJlYXRcbiAgICogIHRoZSBpbml0aWFsIHByZS10b3VjaCBzdGF0ZSBhcyBcIm5vdGhpbmcgc2VsZWN0ZWRcIiDigJQgaW1wb3J0YW50IHdoZW4gdGhlXG4gICAqICBzdWl0ZSBzdGFydHMgaW4gVW5vcmdhbml6ZWQgKGBjdXJyZW50Rm9sZGVySWQgPSBudWxsYCkgc28gYSBmcmVzaCBkaWFsb2dcbiAgICogIGRvZXNuJ3QgYXBwZWFyIHZhbGlkIGp1c3QgYmVjYXVzZSBgcGlja2VkRm9sZGVySWRgIGFsc28gZGVmYXVsdHMgdG8gbnVsbC4gKi9cbiAgcHJpdmF0ZSBwaWNrZWRUb3VjaGVkID0gZmFsc2U7XG5cbiAgLyoqIEZvbGRlciBpZHMgY3VycmVudGx5IGV4cGFuZGVkIGluIHRoZSBpbmxpbmVkIHBpY2tlci4gTWFuYWdlZCBlbnRpcmVseVxuICAgKiAgaW5zaWRlIHRoaXMgY29tcG9uZW50IChubyBleHRlcm5hbCBJbnB1dCkgc28gaXQgc3Vydml2ZXMgdGhlIGhvc3QgcHVzaGluZ1xuICAgKiAgYSBuZXcgYGZvbGRlcnNgIHJlZmVyZW5jZSBhZnRlciBlYWNoIGxhenktZmV0Y2ggcmVzb2x2ZXMuICovXG4gIHByaXZhdGUgZXhwYW5kZWRJZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWVkRXhwYW5kZWRJZHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBSZS1zZWVkIG9ubHkgd2hlbiBleHBhbnNpb24taW50ZW50IGlucHV0cyBjaGFuZ2UuIE5FVkVSIG9uIGBmb2xkZXJzYCDigJRcbiAgICAvLyB0aGUgaG9zdCBwdXNoZXMgYSBuZXcgdG9wLWxldmVsIHJlZmVyZW5jZSBhZnRlciBldmVyeSBsYXp5IGZldGNoIGFuZCBhXG4gICAgLy8gcmVzZWVkIHRoZXJlIHdvdWxkIGNvbGxhcHNlIHRoZSBmb2xkZXIgdGhlIHVzZXIganVzdCBleHBhbmRlZC5cbiAgICBpZiAoY2hhbmdlc1snY3VycmVudEZvbGRlcklkJ10gfHwgY2hhbmdlc1sncGlja2VkRm9sZGVySWQnXSkge1xuICAgICAgdGhpcy5zZWVkRXhwYW5kZWRJZHMoKTtcbiAgICB9XG4gIH1cblxuICAvKiogRm9sZGVyLXJvdyBjbGljayBoYW5kbGVyLiBTZWxlY3RzIHRoZSBmb2xkZXIgYXMgdGhlIGRlc3RpbmF0aW9uIGFuZCwgd2hlblxuICAgKiAgdGhlIGZvbGRlciBoYXMgdW5sb2FkZWQgY2hpbGRyZW4sIGF1dG8tZXhwYW5kcyBpdCBhbmQgYXNrcyB0aGUgaG9zdCB0b1xuICAgKiAgZmV0Y2ggaXRzIGNoaWxkcmVuLiAqL1xuICBwaWNrKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZWRGb2xkZXJJZCA9IGlkO1xuICAgIHRoaXMucGlja2VkVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5waWNrZWRGb2xkZXJJZENoYW5nZS5lbWl0KGlkKTtcbiAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5leHBhbmRlZElkcy5hZGQoaWQpO1xuICAgICAgdGhpcy5yZXF1ZXN0Q2hpbGRyZW5JZk1pc3NpbmcoaWQpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBDaGV2cm9uIGNsaWNrIGhhbmRsZXIuIFRvZ2dsZXMgZXhwYW5zaW9uIGxvY2FsbHk7IG9uIGV4cGFuZCBwYXRoLCBhc2tzXG4gICAqICB0aGUgaG9zdCB0byBmZXRjaCBjaGlsZHJlbiB3aGVuIG5vdCBhbHJlYWR5IGxvYWRlZC4gKi9cbiAgdG9nZ2xlRXhwYW5kZWQoaWQ6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZXhwYW5kZWRJZHMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5leHBhbmRlZElkcy5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGVkSWRzLmFkZChpZCk7XG4gICAgICB0aGlzLnJlcXVlc3RDaGlsZHJlbklmTWlzc2luZyhpZCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNQaWNrZWQoaWQ6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZWRGb2xkZXJJZCA9PT0gaWQ7XG4gIH1cblxuICAvKiogXCJVbm9yZ2FuaXplZFwiIHJvdyBpcyBkaXNhYmxlZCB3aGVuIHRoZSBzdWl0ZSBpcyBhbHJlYWR5IGluIFVub3JnYW5pemVkLiAqL1xuICBnZXQgaXNVbm9yZ2FuaXplZERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRGb2xkZXJJZCA9PSBudWxsO1xuICB9XG5cbiAgLyoqIEZsYXR0ZW5lZCwgZGVwdGgtaW5kZW50ZWQgcm93IGRlc2NyaXB0b3JzIGZlZCBpbnRvIHRoZSB0ZW1wbGF0ZSBgKm5nRm9yYC5cbiAgICogIFdhbGtzIGBfZm9sZGVyc2AsIGRlcml2ZXMgY2hldnJvbiAvIGxvYWRpbmcgLyBleHBhbmRlZCBzdGF0ZSBwZXIgbm9kZS4gKi9cbiAgZ2V0IGZsYXRSb3dzKCk6IEZsYXRGb2xkZXJSb3dbXSB7XG4gICAgY29uc3Qgb3V0OiBGbGF0Rm9sZGVyUm93W10gPSBbXTtcbiAgICBjb25zdCB3YWxrID0gKG5vZGVzOiBGb2xkZXJOb2RlW10sIGRlcHRoOiBudW1iZXIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICAvLyBEcml2ZSB0aGUgY2hldnJvbiBmcm9tIHRoZSBiYWNrZW5kJ3MgYXV0aG9yaXRhdGl2ZSBgaGFzQ2hpbGRyZW5gIHNvXG4gICAgICAgIC8vIGl0IHNob3dzIEJFRk9SRSBjaGlsZHJlbiBhcmUgbG9hZGVkIOKAlCByZXF1aXJlZCBmb3IgbGF6eS1sb2FkLlxuICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9ICEhbi5oYXNDaGlsZHJlbjtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkSWRzLmhhcyhuLmlkKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Mb2FkaW5nID0gISFuLmNoaWxkcmVuTG9hZGluZztcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Mb2FkZWQgPSAhIShuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgb3V0LnB1c2goe1xuICAgICAgICAgIGlkOiBuLmlkLFxuICAgICAgICAgIG5hbWU6IG4ubmFtZSxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBkaXNhYmxlZDogbi5pZCA9PT0gdGhpcy5jdXJyZW50Rm9sZGVySWQsXG4gICAgICAgICAgaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgZXhwYW5kZWQsXG4gICAgICAgICAgY2hpbGRyZW5Mb2FkaW5nLFxuICAgICAgICAgIHNob3dMb2FkaW5nUGxhY2Vob2xkZXI6IGV4cGFuZGVkICYmIGNoaWxkcmVuTG9hZGluZyAmJiAhY2hpbGRyZW5Mb2FkZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZXhwYW5kZWQgJiYgY2hpbGRyZW5Mb2FkZWQpIHdhbGsobi5jaGlsZHJlbiEsIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuX2ZvbGRlcnMsIDApO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICB0cmFja0J5SWQgPSAoXzogbnVtYmVyLCByb3c6IEZsYXRGb2xkZXJSb3cpID0+IHJvdy5pZDtcblxuICAvKiogVHJ1ZSBvbmNlIHRoZSB1c2VyIGhhcyBwaWNrZWQgYSBkZXN0aW5hdGlvbiB2aWEgdGhlIGVtYmVkZGVkIHRyZWUuIERyaXZlc1xuICAgKiAgdGhlIGRlc3RpbmF0aW9uLXJlYWRvdXQgc3R5bGluZyAoaW5kaWdvIHdoZW4gcGlja2VkLCBtdXRlZCB3aGVuIG5vdCkuICovXG4gIGdldCBoYXNQaWNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpY2tlZFRvdWNoZWQ7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRDdXJyZW50TmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRGb2xkZXJOYW1lICYmIHRoaXMuY3VycmVudEZvbGRlck5hbWUudHJpbSgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEZvbGRlck5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2xkZXJJZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWJlbHMubW92ZURpYWxvZ1Jvb3Q7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmZpbmRGb2xkZXJOYW1lKHRoaXMuX2ZvbGRlcnMsIHRoaXMuY3VycmVudEZvbGRlcklkKTtcbiAgICByZXR1cm4gbmFtZSA/PyB0aGlzLmxhYmVscy5tb3ZlRGlhbG9nUm9vdDtcbiAgfVxuXG4gIC8qKiBWYWx1ZSBzaG93biBpbnNpZGUgdGhlIERlc3RpbmF0aW9uIGlucHV0LiBFbXB0eSB1bnRpbCB0aGUgdXNlciBwaWNrczsgb25jZVxuICAgKiAgcGlja2VkLCB0aGUgcmVzb2x2ZWQgZm9sZGVyIG5hbWUgKG9yIGBsYWJlbHMubW92ZURpYWxvZ1Jvb3RgIGZvciBVbm9yZ2FuaXplZCkuXG4gICAqICBFbXB0eSBzdGF0ZSBsZXRzIHRoZSBpbnB1dCdzIGBbcGxhY2Vob2xkZXJdYCBzaG93IHRocm91Z2guICovXG4gIGdldCBkZXN0aW5hdGlvbkZpZWxkVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucGlja2VkVG91Y2hlZCkgcmV0dXJuICcnO1xuICAgIGlmICh0aGlzLnBpY2tlZEZvbGRlcklkID09IG51bGwpIHJldHVybiB0aGlzLmxhYmVscy5tb3ZlRGlhbG9nUm9vdDtcbiAgICByZXR1cm4gdGhpcy5maW5kRm9sZGVyTmFtZSh0aGlzLl9mb2xkZXJzLCB0aGlzLnBpY2tlZEZvbGRlcklkKSA/PyB0aGlzLmxhYmVscy5tb3ZlRGlhbG9nUm9vdDtcbiAgfVxuXG4gIC8qKiBQbGFjZWhvbGRlciBzaG93biBpbiB0aGUgRGVzdGluYXRpb24gaW5wdXQgYmVmb3JlIHRoZSB1c2VyIHBpY2tzLiAqL1xuICBnZXQgZGVzdGluYXRpb25GaWVsZFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RTdWl0ZUxhYmVscy5tb3ZlVGVzdFN1aXRlRGlhbG9nRGVzdGluYXRpb25QbGFjZWhvbGRlcjtcbiAgfVxuXG4gIC8qKiBNb3ZlIGlzIHZhbGlkIHdoZW4gdGhlIHVzZXIgaGFzIHBpY2tlZCBhIGRlc3RpbmF0aW9uIGRpZmZlcmVudCBmcm9tIHRoZVxuICAgKiAgY3VycmVudCBmb2xkZXIuIFBpY2tpbmcgdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSBzb3VyY2UgaXMgYSBuby1vcCwgYW5kIHdlXG4gICAqICBhbHNvIHJlcXVpcmUgYW4gZXhwbGljaXQgaW50ZXJhY3Rpb24gKGBwaWNrZWRUb3VjaGVkYCkuICovXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5waWNrZWRUb3VjaGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGlja2VkRm9sZGVySWQgIT09IHRoaXMuY3VycmVudEZvbGRlcklkO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm47XG4gICAgdGhpcy5zdWJtaXR0ZWQuZW1pdCh7IHRhcmdldEZvbGRlcklkOiB0aGlzLnBpY2tlZEZvbGRlcklkIH0pO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBIb29rcyBmb3IgdGhlIEN1cnJlbnQgZm9sZGVyIGNxYS1jdXN0b20taW5wdXQuIEZpZWxkIGlzIGRpc2FibGVkIGJ5XG4gICAqICBkZWZhdWx0LCBzbyB0aGVzZSBtb3N0bHkgbm8tb3A7IHRoZXkncmUgd2lyZWQgc28gdGhlIGNvbXBvbmVudCBzdGlsbFxuICAgKiAgYmVoYXZlcyBjb3JyZWN0bHkgd2hlbiBgZmllbGRzRGlzYWJsZWQgPSBmYWxzZWAuICovXG4gIG9uQ3VycmVudEZpZWxkVmFsdWVDaGFuZ2UoX3ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZWFkLW9ubHkgZmllbGQg4oCUIGlnbm9yZSBwcm9ncmFtbWF0aWMgY2hhbmdlcy5cbiAgfVxuICBvbkN1cnJlbnRGaWVsZEZvY3VzZWQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRGaWVsZEZvY3VzLmVtaXQoZXZlbnQpO1xuICB9XG4gIG9uQ3VycmVudEZpZWxkQmx1cnJlZChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudEZpZWxkQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBIb29rcyBmb3IgdGhlIERlc3RpbmF0aW9uIGZvbGRlciBjcWEtY3VzdG9tLWlucHV0LiBWYWx1ZSBpcyBkcml2ZW4gYnkgdGhlXG4gICAqICB0cmVlIHBpY2tlciBiZWxvdywgc28gdGhlIGlucHV0IGl0c2VsZiBpcyBpbmZvcm1hdGlvbmFsLiAqL1xuICBvbkRlc3RpbmF0aW9uRmllbGRWYWx1ZUNoYW5nZShfdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIERlc3RpbmF0aW9uIGlzIGRyaXZlbiBieSB0aGUgdHJlZSBwaWNrZXIsIG5vdCB0aGUgaW5wdXQgaXRzZWxmLlxuICB9XG4gIG9uRGVzdGluYXRpb25GaWVsZEZvY3VzZWQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3RpbmF0aW9uRmllbGRGb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuICBvbkRlc3RpbmF0aW9uRmllbGRCbHVycmVkKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbkZpZWxkQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdENoaWxkcmVuSWZNaXNzaW5nKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZSh0aGlzLl9mb2xkZXJzLCBpZCk7XG4gICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgaWYgKG5vZGUuaGFzQ2hpbGRyZW4gJiYgbm9kZS5sb2FkZWRQYWdlcyA9PSBudWxsICYmICFub2RlLmNoaWxkcmVuTG9hZGluZykge1xuICAgICAgdGhpcy5mb2xkZXJDaGlsZHJlblJlcXVlc3RlZC5lbWl0KGlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlZWRFeHBhbmRlZElkcygpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3Qgc2VlZCA9IHRoaXMuY3VycmVudEZvbGRlcklkICE9IG51bGwgPyB0aGlzLmN1cnJlbnRGb2xkZXJJZCA6IHRoaXMucGlja2VkRm9sZGVySWQ7XG4gICAgaWYgKHNlZWQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdHJhaWw6IG51bWJlcltdID0gW107XG4gICAgICB0aGlzLmNvbGxlY3RBbmNlc3RvcnModGhpcy5fZm9sZGVycywgc2VlZCwgdHJhaWwpO1xuICAgICAgdHJhaWwuZm9yRWFjaCgoaWQpID0+IHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QW5jZXN0b3JzKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIsIGFjYzogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4uaWQpO1xuICAgICAgaWYgKG4uaWQgPT09IHRhcmdldElkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIHRoaXMuY29sbGVjdEFuY2VzdG9ycyhuLmNoaWxkcmVuLCB0YXJnZXRJZCwgYWNjKSkgcmV0dXJuIHRydWU7XG4gICAgICBhY2MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE5vZGUobm9kZXM6IEZvbGRlck5vZGVbXSwgaWQ6IG51bWJlcik6IEZvbGRlck5vZGUgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGlmIChuLmlkID09PSBpZCkgcmV0dXJuIG47XG4gICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGhpdCA9IHRoaXMuZmluZE5vZGUobi5jaGlsZHJlbiwgaWQpO1xuICAgICAgICBpZiAoaGl0KSByZXR1cm4gaGl0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEZvbGRlck5hbWUobm9kZXM6IEZvbGRlck5vZGVbXSwgaWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgaWYgKG4uaWQgPT09IGlkKSByZXR1cm4gbi5uYW1lO1xuICAgICAgaWYgKG4uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBoaXQgPSB0aGlzLmZpbmRGb2xkZXJOYW1lKG4uY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGhpdCAhPSBudWxsKSByZXR1cm4gaGl0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19