@cqa-lib/cqa-ui 1.1.527 → 1.1.529

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.
Files changed (21) hide show
  1. package/esm2020/lib/dialog/dialog.component.mjs +15 -3
  2. package/esm2020/lib/dialog/dialog.models.mjs +1 -1
  3. package/esm2020/lib/step-builder/step-builder-group/step-builder-group.component.mjs +22 -7
  4. package/esm2020/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.mjs +38 -13
  5. package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +79 -87
  6. package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +21 -4
  7. package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +3 -1
  8. package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +3 -1
  9. package/fesm2015/cqa-lib-cqa-ui.mjs +169 -106
  10. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  11. package/fesm2020/cqa-lib-cqa-ui.mjs +169 -104
  12. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  13. package/lib/dialog/dialog.component.d.ts +1 -0
  14. package/lib/dialog/dialog.models.d.ts +4 -0
  15. package/lib/step-builder/step-builder-group/step-builder-group.component.d.ts +10 -1
  16. package/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.d.ts +12 -2
  17. package/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.d.ts +23 -30
  18. package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +4 -0
  19. package/lib/templates/modular-table-template/modular-table-template.models.d.ts +2 -0
  20. package/package.json +1 -1
  21. package/styles.css +1 -1
@@ -28,6 +28,14 @@ export class MoveToFolderDialogComponent {
28
28
  this.currentFolderId = null;
29
29
  /** Controls which folder is visually selected. Two-way-bind friendly via `pickedFolderIdChange`. */
30
30
  this.pickedFolderId = null;
31
+ /** Disables the top-level "Unorganised / no folder" row. Decoupled from `currentFolderId`
32
+ * so consumers that reuse this picker for non-move flows (e.g. parent-folder selection
33
+ * inside the New Folder dialog) can keep the root option clickable. The move flows wire
34
+ * this to `currentFolderId == null`. */
35
+ this.rootDisabled = false;
36
+ /** CSS height for the scrollable picker container. Lets embedders shrink the picker when
37
+ * it shares space with other fields (e.g. inside the New Folder dialog). */
38
+ this.pickerHeight = '360px';
31
39
  /** Fires whenever the user picks a destination. */
32
40
  this.folderPicked = new EventEmitter();
33
41
  /** Companion output for banana-in-the-box `[(pickedFolderId)]` binding. */
@@ -39,7 +47,7 @@ export class MoveToFolderDialogComponent {
39
47
  this.seedExpandedIds();
40
48
  }
41
49
  ngOnChanges(changes) {
42
- if (changes['initialExpandedIds'] || changes['currentFolderId'] || changes['folders']) {
50
+ if (changes['initialExpandedIds'] || changes['currentFolderId'] || changes['pickedFolderId'] || changes['folders']) {
43
51
  this.seedExpandedIds();
44
52
  }
45
53
  }
@@ -49,9 +57,13 @@ export class MoveToFolderDialogComponent {
49
57
  return;
50
58
  }
51
59
  this.expandedIds = new Set();
52
- if (this.currentFolderId != null) {
60
+ // Prefer currentFolderId (the disabled "self" row) so the user lands on it; fall back
61
+ // to pickedFolderId so non-move flows (e.g. parent picker) still open with the
62
+ // pre-selected node visible.
63
+ const seed = this.currentFolderId != null ? this.currentFolderId : this.pickedFolderId;
64
+ if (seed != null) {
53
65
  const trail = [];
54
- this.collectAncestors(this.folders, this.currentFolderId, trail);
66
+ this.collectAncestors(this.folders, seed, trail);
55
67
  trail.forEach(id => this.expandedIds.add(id));
56
68
  }
57
69
  }
@@ -90,6 +102,9 @@ export class MoveToFolderDialogComponent {
90
102
  isPicked(id) {
91
103
  return this.pickedFolderId === id;
92
104
  }
105
+ get isUnorganisedDisabled() {
106
+ return this.rootDisabled;
107
+ }
93
108
  pick(id) {
94
109
  this.pickedFolderId = id;
95
110
  this.folderPicked.emit(id);
@@ -108,7 +123,7 @@ export class MoveToFolderDialogComponent {
108
123
  }
109
124
  }
110
125
  MoveToFolderDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MoveToFolderDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
111
- MoveToFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveToFolderDialogComponent, selector: "cqa-move-to-folder-dialog", inputs: { folders: "folders", labels: "labels", currentFolderId: "currentFolderId", pickedFolderId: "pickedFolderId", initialExpandedIds: "initialExpandedIds" }, outputs: { folderPicked: "folderPicked", pickedFolderIdChange: "pickedFolderIdChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: `
126
+ MoveToFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: MoveToFolderDialogComponent, selector: "cqa-move-to-folder-dialog", inputs: { folders: "folders", labels: "labels", currentFolderId: "currentFolderId", pickedFolderId: "pickedFolderId", initialExpandedIds: "initialExpandedIds", rootDisabled: "rootDisabled", pickerHeight: "pickerHeight" }, outputs: { folderPicked: "folderPicked", pickedFolderIdChange: "pickedFolderIdChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: `
112
127
  <!-- Reusable outlined folder icon. Stroke uses currentColor so the row's text color drives the icon. -->
113
128
  <ng-template #folderIconTpl>
114
129
  <svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="cqa-shrink-0">
@@ -123,16 +138,19 @@ MoveToFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.
123
138
  </svg>
124
139
  </ng-template>
125
140
 
126
- <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-h-[360px] cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin">
141
+ <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">
127
142
  <!-- Unorganised (root / no folder) -->
128
143
  <div
129
144
  role="button"
130
145
  tabindex="0"
131
146
  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"
132
147
  [ngClass]="isPicked(null) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
133
- (click)="pick(null)"
134
- (keydown.enter)="pick(null)"
135
- (keydown.space)="$event.preventDefault(); pick(null)"
148
+ [class.cqa-opacity-40]="isUnorganisedDisabled"
149
+ [class.cqa-cursor-not-allowed]="isUnorganisedDisabled"
150
+ [attr.aria-disabled]="isUnorganisedDisabled || null"
151
+ (click)="!isUnorganisedDisabled && pick(null)"
152
+ (keydown.enter)="!isUnorganisedDisabled && pick(null)"
153
+ (keydown.space)="$event.preventDefault(); !isUnorganisedDisabled && pick(null)"
136
154
  >
137
155
  <!-- chevron-slot placeholder so all rows line up -->
138
156
  <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-shrink-0"></span>
@@ -193,16 +211,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
193
211
  </svg>
194
212
  </ng-template>
195
213
 
196
- <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-h-[360px] cqa-overflow-y-auto cqa-bg-white cqa-scrollbar-thin">
214
+ <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">
197
215
  <!-- Unorganised (root / no folder) -->
198
216
  <div
199
217
  role="button"
200
218
  tabindex="0"
201
219
  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"
202
220
  [ngClass]="isPicked(null) ? 'cqa-bg-indigo-50 cqa-text-indigo-700' : 'cqa-text-neutral-800 hover:cqa-bg-neutral-50'"
203
- (click)="pick(null)"
204
- (keydown.enter)="pick(null)"
205
- (keydown.space)="$event.preventDefault(); pick(null)"
221
+ [class.cqa-opacity-40]="isUnorganisedDisabled"
222
+ [class.cqa-cursor-not-allowed]="isUnorganisedDisabled"
223
+ [attr.aria-disabled]="isUnorganisedDisabled || null"
224
+ (click)="!isUnorganisedDisabled && pick(null)"
225
+ (keydown.enter)="!isUnorganisedDisabled && pick(null)"
226
+ (keydown.space)="$event.preventDefault(); !isUnorganisedDisabled && pick(null)"
206
227
  >
207
228
  <!-- chevron-slot placeholder so all rows line up -->
208
229
  <span class="cqa-inline-block cqa-w-5 cqa-h-5 cqa-shrink-0"></span>
@@ -256,9 +277,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
256
277
  type: Input
257
278
  }], initialExpandedIds: [{
258
279
  type: Input
280
+ }], rootDisabled: [{
281
+ type: Input
282
+ }], pickerHeight: [{
283
+ type: Input
259
284
  }], folderPicked: [{
260
285
  type: Output
261
286
  }], pickedFolderIdChange: [{
262
287
  type: Output
263
288
  }] } });
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVtcGxhdGVzL21vZHVsYXItdGFibGUtdGVtcGxhdGUvZGlhbG9ncy9tb3ZlLXRvLWZvbGRlci1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBNkIsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBV3JHOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBMkVILE1BQU0sT0FBTywyQkFBMkI7SUFtQnRDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEIxQyxnQ0FBZ0M7UUFDdkIsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDcEMsdUJBQXVCO1FBQ2QsV0FBTSxHQUFrQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUMvRCw4RkFBOEY7UUFDckYsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBQy9DLG9HQUFvRztRQUMzRixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFJOUMsbURBQW1EO1FBQ3pDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDM0QsMkVBQTJFO1FBQ2pFLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRTNELGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQStFeEMsY0FBUyxHQUFHLENBQUMsQ0FBUyxFQUFFLEdBQWtCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUE3RWYsQ0FBQztJQUU5QyxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMQVJfTEFCRUxTLCBGb2xkZXJOb2RlLCBNb2R1bGFyTGFiZWxzIH0gZnJvbSAnLi4vbW9kdWxhci10YWJsZS10ZW1wbGF0ZS5tb2RlbHMnO1xuXG5pbnRlcmZhY2UgRmxhdEZvbGRlclJvdyB7XG4gIGlkOiBudW1iZXIgfCBudWxsO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlcHRoOiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBoYXNDaGlsZHJlbjogYm9vbGVhbjtcbiAgZXhwYW5kZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRm9sZGVyLXBpY2tlciBib2R5IHVzZWQgaW5zaWRlIHRoZSBNb3ZlLXRvLUZvbGRlciBkaWFsb2cuXG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gYmUgdXNhYmxlIHR3byB3YXlzOlxuICpcbiAqICAxLiAqKkZyb20gaW5zaWRlIHRoZSBsaWJyYXJ5KiogdmlhIGBEaWFsb2dTZXJ2aWNlLm9wZW4oeyBjb250ZW50OiB7IHR5cGU6ICdjb21wb25lbnQnLCBjb21wb25lbnQ6IE1vdmVUb0ZvbGRlckRpYWxvZ0NvbXBvbmVudCwgaW5wdXRzOiB7Li4ufSB9IH0pYC5cbiAqICAgICBUaGUgb3V0ZXIgYGNxYS1kaWFsb2dgIHByb3ZpZGVzIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24sIENhbmNlbCBhbmQgXCJNb3ZlIGhlcmVcIlxuICogICAgIGJ1dHRvbnM7IHRoZSBNb3ZlIGJ1dHRvbiByZWFkcyBgcGlja2VkRm9sZGVySWRgIHZpYSBgZGlhbG9nUmVmLmdldENvbXBvbmVudEluc3RhbmNlKClgLlxuICpcbiAqICAyLiAqKkZyb20gdGhlIGhvc3QvVUkgbGF5ZXIgZGlyZWN0bHkqKiBvbmNlIEFQSSBvd25lcnNoaXAgbW92ZXMgdXAuIFRoZSBob3N0XG4gKiAgICAgcmVuZGVycyBgPGNxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+YCBpbnNpZGUgaXRzIG93biBtb2RhbCBzaGVsbCBhbmRcbiAqICAgICBsaXN0ZW5zIHRvIGAoZm9sZGVyUGlja2VkKWAgKGZpcmVzIG9uIGV2ZXJ5IHBpY2spIHRvIGRyaXZlIGl0cyBvd24gXCJNb3ZlIGhlcmVcIlxuICogICAgIGJ1dHRvbi4gQWxsIHZpc3VhbCBzdGF0ZSBsaXZlcyBvbiBgcGlja2VkRm9sZGVySWRgIHNvIGhvc3RzIGNhbiBhbHNvIHR3by13YXlcbiAqICAgICBiaW5kIGlmIHRoZXkgcHJlZmVyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbW92ZS10by1mb2xkZXItZGlhbG9nJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIFJldXNhYmxlIG91dGxpbmVkIGZvbGRlciBpY29uLiBTdHJva2UgdXNlcyBjdXJyZW50Q29sb3Igc28gdGhlIHJvdydzIHRleHQgY29sb3IgZHJpdmVzIHRoZSBpY29uLiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2ZvbGRlckljb25UcGw+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTcgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImNxYS1zaHJpbmstMFwiPlxuICAgICAgICA8cGF0aCBkPVwiTTE1LjYzNzUgMTIuNjM3N0MxNS42Mzc1IDEzLjAzNTUgMTUuNDc5NCAxMy40MTcxIDE1LjE5ODEgMTMuNjk4NEMxNC45MTY4IDEzLjk3OTcgMTQuNTM1MyAxNC4xMzc3IDE0LjEzNzUgMTQuMTM3N0gyLjEzNzQ1QzEuNzM5NjMgMTQuMTM3NyAxLjM1ODEgMTMuOTc5NyAxLjA3Njc5IDEzLjY5ODRDMC43OTU0ODYgMTMuNDE3MSAwLjYzNzQ1MSAxMy4wMzU1IDAuNjM3NDUxIDEyLjYzNzdWMi4xMzc3QzAuNjM3NDUxIDEuNzM5ODcgMC43OTU0ODYgMS4zNTgzNCAxLjA3Njc5IDEuMDc3MDRDMS4zNTgxIDAuNzk1NzMxIDEuNzM5NjMgMC42Mzc2OTUgMi4xMzc0NSAwLjYzNzY5NUg1Ljg4NzQ1TDcuMzg3NDUgMi44ODc3SDE0LjEzNzVDMTQuNTM1MyAyLjg4NzcgMTQuOTE2OCAzLjA0NTczIDE1LjE5ODEgMy4zMjcwNEMxNS40Nzk0IDMuNjA4MzQgMTUuNjM3NSAzLjk4OTg3IDE1LjYzNzUgNC4zODc3VjEyLjYzNzdaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSZXVzYWJsZSBvdXRsaW5lZCBhcmNoaXZlL2luYm94IGljb24gZm9yIHRoZSBcIlVub3JnYW5pc2VkXCIgZW50cnkuIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjdW5vcmdhbmlzZWRJY29uVHBsPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDE3IDE1XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJjcWEtc2hyaW5rLTBcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xNC42ODc1IDUuNVYxMi41QzE0LjY4NzUgMTMuMyAxNC4wMzc1IDE0IDEzLjE4NzUgMTRIMy44MTI1QzIuOTYyNSAxNCAyLjMxMjUgMTMuMyAyLjMxMjUgMTIuNVY1LjVNMTQuNjg3NSA1LjVMMTIuNzg3NSAxLjdDMTIuNTM3NSAxLjIgMTIuMDg3NSAxIDExLjU4NzUgMUg1LjQxMjVDNC45MTI1IDEgNC40NjI1IDEuMiA0LjIxMjUgMS43TDIuMzEyNSA1LjVNMTQuNjg3NSA1LjVIMi4zMTI1TTYuMTg3NSA4LjVIMTAuODEyNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjc1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFMkUyRTNdIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtcHktMiBjcWEtdy1mdWxsIGNxYS1oLVszNjBweF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXNjcm9sbGJhci10aGluXCI+XG4gICAgICA8IS0tIFVub3JnYW5pc2VkIChyb290IC8gbm8gZm9sZGVyKSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIuNSBjcWEtcHgtNCBjcWEtcHktMiBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS10ZXh0LXNtXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaXNQaWNrZWQobnVsbCkgPyAnY3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1pbmRpZ28tNzAwJyA6ICdjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC01MCdcIlxuICAgICAgICAoY2xpY2spPVwicGljayhudWxsKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cInBpY2sobnVsbClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgcGljayhudWxsKVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gY2hldnJvbi1zbG90IHBsYWNlaG9sZGVyIHNvIGFsbCByb3dzIGxpbmUgdXAgLS0+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy01IGNxYS1oLTUgY3FhLXNocmluay0wXCI+PC9zcGFuPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidW5vcmdhbmlzZWRJY29uVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxzcGFuPnt7IGxhYmVscy5tb3ZlRGlhbG9nUm9vdCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZvbGRlciByb3dzIChmbGF0dGVuZWQsIGRlcHRoLWluZGVudGVkLCBjb2xsYXBzaWJsZSkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgZmxhdFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yLjUgY3FhLXB5LTIgY3FhLXByLTQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtdGV4dC1zbVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlzUGlja2VkKHJvdy5pZCkgPyAnY3FhLWJnLWluZGlnby01MCBjcWEtdGV4dC1pbmRpZ28tNzAwJyA6ICdjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC01MCdcIlxuICAgICAgICBbY2xhc3MuY3FhLW9wYWNpdHktNDBdPVwicm93LmRpc2FibGVkXCJcbiAgICAgICAgW2NsYXNzLmNxYS1jdXJzb3Itbm90LWFsbG93ZWRdPVwicm93LmRpc2FibGVkXCJcbiAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cIjE2ICsgcm93LmRlcHRoICogMjRcIlxuICAgICAgICAoY2xpY2spPVwiIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIhcm93LmRpc2FibGVkICYmIHBpY2socm93LmlkKVwiXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiFyb3cuZGlzYWJsZWQgJiYgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICFyb3cuZGlzYWJsZWQgJiYgcGljayhyb3cuaWQpXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBDaGV2cm9uIHRvZ2dsZSBmb3IgZXhwYW5kYWJsZSBmb2xkZXJzIChwbGFjZWhvbGRlciBvdGhlcndpc2Ugc28gYWxpZ25tZW50IHN0YXlzKSAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwicm93Lmhhc0NoaWxkcmVuOyBlbHNlIGNoZXZyb25QbGFjZWhvbGRlclwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctNSBjcWEtaC01IGNxYS1zaHJpbmstMCBjcWEtcm91bmRlZCBjcWEtdGV4dC1uZXV0cmFsLTYwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgaG92ZXI6Y3FhLXRleHQtbmV1dHJhbC05MDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicm93LmV4cGFuZGVkID8gJ0NvbGxhcHNlICcgKyByb3cubmFtZSA6ICdFeHBhbmQgJyArIHJvdy5uYW1lXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQocm93LmlkISwgJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgW2NsYXNzLmNxYS1yb3RhdGUtOTBdPVwicm93LmV4cGFuZGVkXCIgc3R5bGU9XCJ0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTIwbXMgZWFzZTtcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSAzTDkgN0w1IDExXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjaGV2cm9uUGxhY2Vob2xkZXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrIGNxYS13LTUgY3FhLWgtNSBjcWEtc2hyaW5rLTBcIj48L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb25UcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdHJ1bmNhdGVcIj57eyByb3cubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNb3ZlVG9Gb2xkZXJEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBGb2xkZXIgdHJlZSB0byBwaWNrIGZyb20uICovXG4gIEBJbnB1dCgpIGZvbGRlcnM6IEZvbGRlck5vZGVbXSA9IFtdO1xuICAvKiogTGFiZWwgb3ZlcnJpZGVzLiAqL1xuICBASW5wdXQoKSBsYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgLyoqIFRoZSBmb2xkZXIgdGhlIHRlc3RzIGN1cnJlbnRseSBsaXZlIGluIOKAlCByZW5kZXJlZCBhcyBkaXNhYmxlZCAoY2FuJ3QgbW92ZSBpbnRvIGl0c2VsZikuICovXG4gIEBJbnB1dCgpIGN1cnJlbnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb250cm9scyB3aGljaCBmb2xkZXIgaXMgdmlzdWFsbHkgc2VsZWN0ZWQuIFR3by13YXktYmluZCBmcmllbmRseSB2aWEgYHBpY2tlZEZvbGRlcklkQ2hhbmdlYC4gKi9cbiAgQElucHV0KCkgcGlja2VkRm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogRm9sZGVyIGlkcyB0byBleHBhbmQgYnkgZGVmYXVsdC4gSWYgbm90IHByb3ZpZGVkLCBhbmNlc3RvcnMgb2YgYGN1cnJlbnRGb2xkZXJJZGAgYXJlIGV4cGFuZGVkLiAqL1xuICBASW5wdXQoKSBpbml0aWFsRXhwYW5kZWRJZHM/OiBudW1iZXJbXTtcblxuICAvKiogRmlyZXMgd2hlbmV2ZXIgdGhlIHVzZXIgcGlja3MgYSBkZXN0aW5hdGlvbi4gKi9cbiAgQE91dHB1dCgpIGZvbGRlclBpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcbiAgLyoqIENvbXBhbmlvbiBvdXRwdXQgZm9yIGJhbmFuYS1pbi10aGUtYm94IGBbKHBpY2tlZEZvbGRlcklkKV1gIGJpbmRpbmcuICovXG4gIEBPdXRwdXQoKSBwaWNrZWRGb2xkZXJJZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwcml2YXRlIGV4cGFuZGVkSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VlZEV4cGFuZGVkSWRzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxFeHBhbmRlZElkcyddIHx8IGNoYW5nZXNbJ2N1cnJlbnRGb2xkZXJJZCddIHx8IGNoYW5nZXNbJ2ZvbGRlcnMnXSkge1xuICAgICAgdGhpcy5zZWVkRXhwYW5kZWRJZHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlZWRFeHBhbmRlZElkcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsRXhwYW5kZWRJZHM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5leHBhbmRlZElkcyA9IG5ldyBTZXQodGhpcy5pbml0aWFsRXhwYW5kZWRJZHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuZGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRGb2xkZXJJZCAhPSBudWxsKSB7XG4gICAgICBjb25zdCB0cmFpbDogbnVtYmVyW10gPSBbXTtcbiAgICAgIHRoaXMuY29sbGVjdEFuY2VzdG9ycyh0aGlzLmZvbGRlcnMsIHRoaXMuY3VycmVudEZvbGRlcklkLCB0cmFpbCk7XG4gICAgICB0cmFpbC5mb3JFYWNoKGlkID0+IHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QW5jZXN0b3JzKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIsIGFjYzogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4uaWQpO1xuICAgICAgaWYgKG4uaWQgPT09IHRhcmdldElkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIHRoaXMuY29sbGVjdEFuY2VzdG9ycyhuLmNoaWxkcmVuLCB0YXJnZXRJZCwgYWNjKSkgcmV0dXJuIHRydWU7XG4gICAgICBhY2MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBmbGF0Um93cygpOiBGbGF0Rm9sZGVyUm93W10ge1xuICAgIGNvbnN0IG91dDogRmxhdEZvbGRlclJvd1tdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIShuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkSWRzLmhhcyhuLmlkKTtcbiAgICAgICAgb3V0LnB1c2goe1xuICAgICAgICAgIGlkOiBuLmlkLFxuICAgICAgICAgIG5hbWU6IG4ubmFtZSxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBkaXNhYmxlZDogbi5pZCA9PT0gdGhpcy5jdXJyZW50Rm9sZGVySWQsXG4gICAgICAgICAgaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgZXhwYW5kZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzQ2hpbGRyZW4gJiYgZXhwYW5kZWQpIHdhbGsobi5jaGlsZHJlbiEsIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgMCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlzUGlja2VkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VkRm9sZGVySWQgPT09IGlkO1xuICB9XG5cbiAgcGljayhpZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucGlja2VkRm9sZGVySWQgPSBpZDtcbiAgICB0aGlzLmZvbGRlclBpY2tlZC5lbWl0KGlkKTtcbiAgICB0aGlzLnBpY2tlZEZvbGRlcklkQ2hhbmdlLmVtaXQoaWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlRXhwYW5kZWQoaWQ6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZXhwYW5kZWRJZHMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5leHBhbmRlZElkcy5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGVkSWRzLmFkZChpZCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUlkID0gKF86IG51bWJlciwgcm93OiBGbGF0Rm9sZGVyUm93KSA9PiByb3cuaWQgPz8gLTE7XG59XG4iXX0=
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZS10by1mb2xkZXItZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVtcGxhdGVzL21vZHVsYXItdGFibGUtdGVtcGxhdGUvZGlhbG9ncy9tb3ZlLXRvLWZvbGRlci1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBNkIsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBV3JHOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBOEVILE1BQU0sT0FBTywyQkFBMkI7SUE4QnRDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0IxQyxnQ0FBZ0M7UUFDdkIsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDcEMsdUJBQXVCO1FBQ2QsV0FBTSxHQUFrQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUMvRCw4RkFBOEY7UUFDckYsb0JBQWUsR0FBa0IsSUFBSSxDQUFDO1FBQy9DLG9HQUFvRztRQUMzRixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFLOUM7OztpREFHeUM7UUFDaEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkM7cUZBQzZFO1FBQ3BFLGlCQUFZLEdBQVcsT0FBTyxDQUFDO1FBRXhDLG1EQUFtRDtRQUN6QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQzNELDJFQUEyRTtRQUNqRSx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUUzRCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUF1RnhDLGNBQVMsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFrQixFQUFFLEVBQUUsQ0FBQyxHQUFHLENB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QkFBMkIsWUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRVQsUUFFSyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTt3R0FJdEMsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfTU9EVUxBUl9MQUJFTFMsIEZvbGRlck5vZGUsIE1vZHVsYXJMYWJlbHMgfSBmcm9tICcuLi9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlLm1vZGVscyc7XG5cbmludGVyZmFjZSBGbGF0Rm9sZGVyUm93IHtcbiAgaWQ6IG51bWJlciB8IG51bGw7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVwdGg6IG51bWJlcjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGhhc0NoaWxkcmVuOiBib29sZWFuO1xuICBleHBhbmRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGb2xkZXItcGlja2VyIGJvZHkgdXNlZCBpbnNpZGUgdGhlIE1vdmUtdG8tRm9sZGVyIGRpYWxvZy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyBkZXNpZ25lZCB0byBiZSB1c2FibGUgdHdvIHdheXM6XG4gKlxuICogIDEuICoqRnJvbSBpbnNpZGUgdGhlIGxpYnJhcnkqKiB2aWEgYERpYWxvZ1NlcnZpY2Uub3Blbih7IGNvbnRlbnQ6IHsgdHlwZTogJ2NvbXBvbmVudCcsIGNvbXBvbmVudDogTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50LCBpbnB1dHM6IHsuLi59IH0gfSlgLlxuICogICAgIFRoZSBvdXRlciBgY3FhLWRpYWxvZ2AgcHJvdmlkZXMgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiwgQ2FuY2VsIGFuZCBcIk1vdmUgaGVyZVwiXG4gKiAgICAgYnV0dG9uczsgdGhlIE1vdmUgYnV0dG9uIHJlYWRzIGBwaWNrZWRGb2xkZXJJZGAgdmlhIGBkaWFsb2dSZWYuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKWAuXG4gKlxuICogIDIuICoqRnJvbSB0aGUgaG9zdC9VSSBsYXllciBkaXJlY3RseSoqIG9uY2UgQVBJIG93bmVyc2hpcCBtb3ZlcyB1cC4gVGhlIGhvc3RcbiAqICAgICByZW5kZXJzIGA8Y3FhLW1vdmUtdG8tZm9sZGVyLWRpYWxvZz5gIGluc2lkZSBpdHMgb3duIG1vZGFsIHNoZWxsIGFuZFxuICogICAgIGxpc3RlbnMgdG8gYChmb2xkZXJQaWNrZWQpYCAoZmlyZXMgb24gZXZlcnkgcGljaykgdG8gZHJpdmUgaXRzIG93biBcIk1vdmUgaGVyZVwiXG4gKiAgICAgYnV0dG9uLiBBbGwgdmlzdWFsIHN0YXRlIGxpdmVzIG9uIGBwaWNrZWRGb2xkZXJJZGAgc28gaG9zdHMgY2FuIGFsc28gdHdvLXdheVxuICogICAgIGJpbmQgaWYgdGhleSBwcmVmZXIuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gUmV1c2FibGUgb3V0bGluZWQgZm9sZGVyIGljb24uIFN0cm9rZSB1c2VzIGN1cnJlbnRDb2xvciBzbyB0aGUgcm93J3MgdGV4dCBjb2xvciBkcml2ZXMgdGhlIGljb24uIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjZm9sZGVySWNvblRwbD5cbiAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAxNyAxNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzPVwiY3FhLXNocmluay0wXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTUuNjM3NSAxMi42Mzc3QzE1LjYzNzUgMTMuMDM1NSAxNS40Nzk0IDEzLjQxNzEgMTUuMTk4MSAxMy42OTg0QzE0LjkxNjggMTMuOTc5NyAxNC41MzUzIDE0LjEzNzcgMTQuMTM3NSAxNC4xMzc3SDIuMTM3NDVDMS43Mzk2MyAxNC4xMzc3IDEuMzU4MSAxMy45Nzk3IDEuMDc2NzkgMTMuNjk4NEMwLjc5NTQ4NiAxMy40MTcxIDAuNjM3NDUxIDEzLjAzNTUgMC42Mzc0NTEgMTIuNjM3N1YyLjEzNzdDMC42Mzc0NTEgMS43Mzk4NyAwLjc5NTQ4NiAxLjM1ODM0IDEuMDc2NzkgMS4wNzcwNEMxLjM1ODEgMC43OTU3MzEgMS43Mzk2MyAwLjYzNzY5NSAyLjEzNzQ1IDAuNjM3Njk1SDUuODg3NDVMNy4zODc0NSAyLjg4NzdIMTQuMTM3NUMxNC41MzUzIDIuODg3NyAxNC45MTY4IDMuMDQ1NzMgMTUuMTk4MSAzLjMyNzA0QzE1LjQ3OTQgMy42MDgzNCAxNS42Mzc1IDMuOTg5ODcgMTUuNjM3NSA0LjM4NzdWMTIuNjM3N1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI3NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJldXNhYmxlIG91dGxpbmVkIGFyY2hpdmUvaW5ib3ggaWNvbiBmb3IgdGhlIFwiVW5vcmdhbmlzZWRcIiBlbnRyeS4gLS0+XG4gICAgPG5nLXRlbXBsYXRlICN1bm9yZ2FuaXNlZEljb25UcGw+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMTcgMTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImNxYS1zaHJpbmstMFwiPlxuICAgICAgICA8cGF0aCBkPVwiTTE0LjY4NzUgNS41VjEyLjVDMTQuNjg3NSAxMy4zIDE0LjAzNzUgMTQgMTMuMTg3NSAxNEgzLjgxMjVDMi45NjI1IDE0IDIuMzEyNSAxMy4zIDIuMzEyNSAxMi41VjUuNU0xNC42ODc1IDUuNUwxMi43ODc1IDEuN0MxMi41Mzc1IDEuMiAxMi4wODc1IDEgMTEuNTg3NSAxSDUuNDEyNUM0LjkxMjUgMSA0LjQ2MjUgMS4yIDQuMjEyNSAxLjdMMi4zMTI1IDUuNU0xNC42ODc1IDUuNUgyLjMxMjVNNi4xODc1IDguNUgxMC44MTI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNzVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRTJFM10gY3FhLXJvdW5kZWQtWzEwcHhdIGNxYS1weS0yIGNxYS13LWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXNjcm9sbGJhci10aGluXCIgW3N0eWxlLmhlaWdodF09XCJwaWNrZXJIZWlnaHRcIj5cbiAgICAgIDwhLS0gVW5vcmdhbmlzZWQgKHJvb3QgLyBubyBmb2xkZXIpIC0tPlxuICAgICAgPGRpdlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weC00IGNxYS1weS0yIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXRleHQtc21cIlxuICAgICAgICBbbmdDbGFzc109XCJpc1BpY2tlZChudWxsKSA/ICdjcWEtYmctaW5kaWdvLTUwIGNxYS10ZXh0LWluZGlnby03MDAnIDogJ2NxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTUwJ1wiXG4gICAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS00MF09XCJpc1Vub3JnYW5pc2VkRGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1ub3QtYWxsb3dlZF09XCJpc1Vub3JnYW5pc2VkRGlzYWJsZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzVW5vcmdhbmlzZWREaXNhYmxlZCB8fCBudWxsXCJcbiAgICAgICAgKGNsaWNrKT1cIiFpc1Vub3JnYW5pc2VkRGlzYWJsZWQgJiYgcGljayhudWxsKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIiFpc1Vub3JnYW5pc2VkRGlzYWJsZWQgJiYgcGljayhudWxsKVwiXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAhaXNVbm9yZ2FuaXNlZERpc2FibGVkICYmIHBpY2sobnVsbClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIGNoZXZyb24tc2xvdCBwbGFjZWhvbGRlciBzbyBhbGwgcm93cyBsaW5lIHVwIC0tPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtYmxvY2sgY3FhLXctNSBjcWEtaC01IGNxYS1zaHJpbmstMFwiPjwvc3Bhbj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInVub3JnYW5pc2VkSWNvblRwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8c3Bhbj57eyBsYWJlbHMubW92ZURpYWxvZ1Jvb3QgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGb2xkZXIgcm93cyAoZmxhdHRlbmVkLCBkZXB0aC1pbmRlbnRlZCwgY29sbGFwc2libGUpIC0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIGZsYXRSb3dzOyB0cmFja0J5OiB0cmFja0J5SWRcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1weS0yIGNxYS1wci00IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXRleHQtc21cIlxuICAgICAgICBbbmdDbGFzc109XCJpc1BpY2tlZChyb3cuaWQpID8gJ2NxYS1iZy1pbmRpZ28tNTAgY3FhLXRleHQtaW5kaWdvLTcwMCcgOiAnY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtNTAnXCJcbiAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTQwXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLW5vdC1hbGxvd2VkXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCIxNiArIHJvdy5kZXB0aCAqIDI0XCJcbiAgICAgICAgKGNsaWNrKT1cIiFyb3cuZGlzYWJsZWQgJiYgcGljayhyb3cuaWQpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiIXJvdy5kaXNhYmxlZCAmJiBwaWNrKHJvdy5pZClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIhcm93LmRpc2FibGVkICYmICRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAhcm93LmRpc2FibGVkICYmIHBpY2socm93LmlkKVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQ2hldnJvbiB0b2dnbGUgZm9yIGV4cGFuZGFibGUgZm9sZGVycyAocGxhY2Vob2xkZXIgb3RoZXJ3aXNlIHNvIGFsaWdubWVudCBzdGF5cykgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInJvdy5oYXNDaGlsZHJlbjsgZWxzZSBjaGV2cm9uUGxhY2Vob2xkZXJcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTUgY3FhLWgtNSBjcWEtc2hyaW5rLTAgY3FhLXJvdW5kZWQgY3FhLXRleHQtbmV1dHJhbC02MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGhvdmVyOmNxYS10ZXh0LW5ldXRyYWwtOTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJvdy5leHBhbmRlZCA/ICdDb2xsYXBzZSAnICsgcm93Lm5hbWUgOiAnRXhwYW5kICcgKyByb3cubmFtZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZGVkKHJvdy5pZCEsICRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jcWEtcm90YXRlLTkwXT1cInJvdy5leHBhbmRlZFwiIHN0eWxlPVwidHJhbnNpdGlvbjogdHJhbnNmb3JtIDEyMG1zIGVhc2U7XCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgM0w5IDdMNSAxMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hldnJvblBsYWNlaG9sZGVyPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy01IGNxYS1oLTUgY3FhLXNocmluay0wXCI+PC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uVHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRydW5jYXRlXCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTW92ZVRvRm9sZGVyRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogRm9sZGVyIHRyZWUgdG8gcGljayBmcm9tLiAqL1xuICBASW5wdXQoKSBmb2xkZXJzOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgLyoqIExhYmVsIG92ZXJyaWRlcy4gKi9cbiAgQElucHV0KCkgbGFiZWxzOiBNb2R1bGFyTGFiZWxzID0geyAuLi5ERUZBVUxUX01PRFVMQVJfTEFCRUxTIH07XG4gIC8qKiBUaGUgZm9sZGVyIHRoZSB0ZXN0cyBjdXJyZW50bHkgbGl2ZSBpbiDigJQgcmVuZGVyZWQgYXMgZGlzYWJsZWQgKGNhbid0IG1vdmUgaW50byBpdHNlbGYpLiAqL1xuICBASW5wdXQoKSBjdXJyZW50Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogQ29udHJvbHMgd2hpY2ggZm9sZGVyIGlzIHZpc3VhbGx5IHNlbGVjdGVkLiBUd28td2F5LWJpbmQgZnJpZW5kbHkgdmlhIGBwaWNrZWRGb2xkZXJJZENoYW5nZWAuICovXG4gIEBJbnB1dCgpIHBpY2tlZEZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZvbGRlciBpZHMgdG8gZXhwYW5kIGJ5IGRlZmF1bHQuIElmIG5vdCBwcm92aWRlZCwgYW5jZXN0b3JzIG9mIGBjdXJyZW50Rm9sZGVySWRgIChvclxuICAgKiAgYHBpY2tlZEZvbGRlcklkYCwgd2hlbiBubyBjdXJyZW50IGNvbnRleHQgZXhpc3RzKSBhcmUgZXhwYW5kZWQuICovXG4gIEBJbnB1dCgpIGluaXRpYWxFeHBhbmRlZElkcz86IG51bWJlcltdO1xuXG4gIC8qKiBEaXNhYmxlcyB0aGUgdG9wLWxldmVsIFwiVW5vcmdhbmlzZWQgLyBubyBmb2xkZXJcIiByb3cuIERlY291cGxlZCBmcm9tIGBjdXJyZW50Rm9sZGVySWRgXG4gICAqICBzbyBjb25zdW1lcnMgdGhhdCByZXVzZSB0aGlzIHBpY2tlciBmb3Igbm9uLW1vdmUgZmxvd3MgKGUuZy4gcGFyZW50LWZvbGRlciBzZWxlY3Rpb25cbiAgICogIGluc2lkZSB0aGUgTmV3IEZvbGRlciBkaWFsb2cpIGNhbiBrZWVwIHRoZSByb290IG9wdGlvbiBjbGlja2FibGUuIFRoZSBtb3ZlIGZsb3dzIHdpcmVcbiAgICogIHRoaXMgdG8gYGN1cnJlbnRGb2xkZXJJZCA9PSBudWxsYC4gKi9cbiAgQElucHV0KCkgcm9vdERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIENTUyBoZWlnaHQgZm9yIHRoZSBzY3JvbGxhYmxlIHBpY2tlciBjb250YWluZXIuIExldHMgZW1iZWRkZXJzIHNocmluayB0aGUgcGlja2VyIHdoZW5cbiAgICogIGl0IHNoYXJlcyBzcGFjZSB3aXRoIG90aGVyIGZpZWxkcyAoZS5nLiBpbnNpZGUgdGhlIE5ldyBGb2xkZXIgZGlhbG9nKS4gKi9cbiAgQElucHV0KCkgcGlja2VySGVpZ2h0OiBzdHJpbmcgPSAnMzYwcHgnO1xuXG4gIC8qKiBGaXJlcyB3aGVuZXZlciB0aGUgdXNlciBwaWNrcyBhIGRlc3RpbmF0aW9uLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyUGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuICAvKiogQ29tcGFuaW9uIG91dHB1dCBmb3IgYmFuYW5hLWluLXRoZS1ib3ggYFsocGlja2VkRm9sZGVySWQpXWAgYmluZGluZy4gKi9cbiAgQE91dHB1dCgpIHBpY2tlZEZvbGRlcklkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuXG4gIHByaXZhdGUgZXhwYW5kZWRJZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWVkRXhwYW5kZWRJZHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEV4cGFuZGVkSWRzJ10gfHwgY2hhbmdlc1snY3VycmVudEZvbGRlcklkJ10gfHwgY2hhbmdlc1sncGlja2VkRm9sZGVySWQnXSB8fCBjaGFuZ2VzWydmb2xkZXJzJ10pIHtcbiAgICAgIHRoaXMuc2VlZEV4cGFuZGVkSWRzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWVkRXhwYW5kZWRJZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbEV4cGFuZGVkSWRzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRJZHMgPSBuZXcgU2V0KHRoaXMuaW5pdGlhbEV4cGFuZGVkSWRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZElkcyA9IG5ldyBTZXQoKTtcbiAgICAvLyBQcmVmZXIgY3VycmVudEZvbGRlcklkICh0aGUgZGlzYWJsZWQgXCJzZWxmXCIgcm93KSBzbyB0aGUgdXNlciBsYW5kcyBvbiBpdDsgZmFsbCBiYWNrXG4gICAgLy8gdG8gcGlja2VkRm9sZGVySWQgc28gbm9uLW1vdmUgZmxvd3MgKGUuZy4gcGFyZW50IHBpY2tlcikgc3RpbGwgb3BlbiB3aXRoIHRoZVxuICAgIC8vIHByZS1zZWxlY3RlZCBub2RlIHZpc2libGUuXG4gICAgY29uc3Qgc2VlZCA9IHRoaXMuY3VycmVudEZvbGRlcklkICE9IG51bGwgPyB0aGlzLmN1cnJlbnRGb2xkZXJJZCA6IHRoaXMucGlja2VkRm9sZGVySWQ7XG4gICAgaWYgKHNlZWQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdHJhaWw6IG51bWJlcltdID0gW107XG4gICAgICB0aGlzLmNvbGxlY3RBbmNlc3RvcnModGhpcy5mb2xkZXJzLCBzZWVkLCB0cmFpbCk7XG4gICAgICB0cmFpbC5mb3JFYWNoKGlkID0+IHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QW5jZXN0b3JzKG5vZGVzOiBGb2xkZXJOb2RlW10sIHRhcmdldElkOiBudW1iZXIsIGFjYzogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgIGFjYy5wdXNoKG4uaWQpO1xuICAgICAgaWYgKG4uaWQgPT09IHRhcmdldElkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuICYmIHRoaXMuY29sbGVjdEFuY2VzdG9ycyhuLmNoaWxkcmVuLCB0YXJnZXRJZCwgYWNjKSkgcmV0dXJuIHRydWU7XG4gICAgICBhY2MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBmbGF0Um93cygpOiBGbGF0Rm9sZGVyUm93W10ge1xuICAgIGNvbnN0IG91dDogRmxhdEZvbGRlclJvd1tdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIShuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkSWRzLmhhcyhuLmlkKTtcbiAgICAgICAgb3V0LnB1c2goe1xuICAgICAgICAgIGlkOiBuLmlkLFxuICAgICAgICAgIG5hbWU6IG4ubmFtZSxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBkaXNhYmxlZDogbi5pZCA9PT0gdGhpcy5jdXJyZW50Rm9sZGVySWQsXG4gICAgICAgICAgaGFzQ2hpbGRyZW4sXG4gICAgICAgICAgZXhwYW5kZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzQ2hpbGRyZW4gJiYgZXhwYW5kZWQpIHdhbGsobi5jaGlsZHJlbiEsIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgMCk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlzUGlja2VkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VkRm9sZGVySWQgPT09IGlkO1xuICB9XG5cbiAgZ2V0IGlzVW5vcmdhbmlzZWREaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb290RGlzYWJsZWQ7XG4gIH1cblxuICBwaWNrKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZWRGb2xkZXJJZCA9IGlkO1xuICAgIHRoaXMuZm9sZGVyUGlja2VkLmVtaXQoaWQpO1xuICAgIHRoaXMucGlja2VkRm9sZGVySWRDaGFuZ2UuZW1pdChpZCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0b2dnbGVFeHBhbmRlZChpZDogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5leHBhbmRlZElkcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkSWRzLmRlbGV0ZShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRJZHMuYWRkKGlkKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0cmFja0J5SWQgPSAoXzogbnVtYmVyLCByb3c6IEZsYXRGb2xkZXJSb3cpID0+IHJvdy5pZCA/PyAtMTtcbn1cbiJdfQ==
@@ -1,11 +1,11 @@
1
1
  import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
2
- import { FormControl, FormGroup } from '@angular/forms';
3
2
  import { DEFAULT_MODULAR_LABELS } from '../modular-table-template.models';
4
3
  import * as i0 from "@angular/core";
5
4
  import * as i1 from "../../../custom-input/custom-input.component";
6
- import * as i2 from "../../../dynamic-select/dynamic-select-field.component";
5
+ import * as i2 from "./move-to-folder-dialog.component";
7
6
  import * as i3 from "@angular/common";
8
7
  export const DEFAULT_FOLDER_COLOR = '#99999E';
8
+ export const FOLDER_NAME_MAX_LENGTH = 20;
9
9
  const PRESET_FOLDER_COLORS = [
10
10
  DEFAULT_FOLDER_COLOR,
11
11
  '#4F46E5',
@@ -20,8 +20,10 @@ const PRESET_FOLDER_COLORS = [
20
20
  * Body of the "New Folder" dialog.
21
21
  *
22
22
  * Uses reusable library components (`cqa-custom-input` for the name field,
23
- * `cqa-dynamic-select` for the parent dropdown) so hosts can drop this dialog
24
- * into their own modal shell without worrying about styling drift.
23
+ * `cqa-move-to-folder-dialog` as an embedded tree picker for the parent folder)
24
+ * so hosts can drop this dialog into their own modal shell without worrying
25
+ * about styling drift. The tree picker handles arbitrarily deep nesting via
26
+ * expand/collapse rather than a flat dropdown of "A › B › C ›…" paths.
25
27
  *
26
28
  * Two integration paths:
27
29
  *
@@ -36,16 +38,19 @@ const PRESET_FOLDER_COLORS = [
36
38
  export class NewFolderDialogComponent {
37
39
  constructor(cdr) {
38
40
  this.cdr = cdr;
39
- // NOTE: These inputs are declared as setters (instead of plain @Input fields)
40
- // because `DialogService.open(...)` assigns the `inputs` map via direct
41
- // property assignment *after* `attachComponent` has already run the
42
- // component's `ngOnInit`. Direct assignment bypasses `ngOnChanges`, so without
43
- // setters the `parentSelectConfig` would be built from a default empty folders
44
- // array and the parent-folder dropdown would render empty / appear broken.
41
+ // NOTE: `folders` and `labels` are declared as setters (instead of plain @Input fields)
42
+ // because `DialogService.open(...)` assigns the `inputs` map via direct property
43
+ // assignment *after* `attachComponent` has already run the component's lifecycle
44
+ // hooks direct assignment bypasses `ngOnChanges`, so setters keep derived state
45
+ // (e.g. `parentPickerLabels`) in sync no matter the assignment order.
45
46
  this._folders = [];
46
47
  this._labels = { ...DEFAULT_MODULAR_LABELS };
47
48
  this.name = '';
48
- this._parentId = null;
49
+ /** Tracks whether the user has interacted with the name field, so we don't surface
50
+ * the "required" error on first paint when the dialog opens with an empty name. */
51
+ this.nameTouched = false;
52
+ this.maxNameLength = FOLDER_NAME_MAX_LENGTH;
53
+ this.parentId = null;
49
54
  this.color = DEFAULT_FOLDER_COLOR;
50
55
  this.presetColors = PRESET_FOLDER_COLORS;
51
56
  this.rainbowBorder = 'conic-gradient(from 0deg, #ef4444, #f59e0b, #eab308, #10b981, #06b6d4, #4f46e5, #8b5cf6, #ec4899, #ef4444)';
@@ -54,79 +59,35 @@ export class NewFolderDialogComponent {
54
59
  this.colorChange = new EventEmitter();
55
60
  this.submitted = new EventEmitter();
56
61
  this.cancelled = new EventEmitter();
57
- /** Reactive form used by cqa-dynamic-select. Untyped to match the project's Angular 13.4 forms API. */
58
- this.parentForm = new FormGroup({ parentId: new FormControl(null) });
59
- this.parentOptions = [];
60
- this.rebuildSelectConfig(); // ensure config exists even before first input set
62
+ /** Labels passed to the embedded tree picker. Re-uses the move-dialog surface but
63
+ * rewrites the root row's label so it reads "(no parent)" instead of "Unorganised"
64
+ * for the create-folder context. */
65
+ this.parentPickerLabels = this.buildParentPickerLabels();
61
66
  }
62
67
  set folders(value) {
63
68
  this._folders = value || [];
64
- this.rebuildOptions();
65
- this.rebuildSelectConfig();
69
+ this.cdr.markForCheck();
66
70
  }
67
71
  get folders() { return this._folders; }
68
72
  set labels(value) {
69
73
  this._labels = value || { ...DEFAULT_MODULAR_LABELS };
70
- this.rebuildSelectConfig();
71
- }
72
- get labels() { return this._labels; }
73
- set parentId(value) {
74
- this._parentId = value ?? null;
75
- this.syncParentControl();
76
- }
77
- get parentId() { return this._parentId; }
78
- ngOnInit() {
79
- // Setters above already rebuilt config once folders/labels were assigned. This
80
- // just ensures the form control matches the current parentId value in case
81
- // ordering of input assignment differs.
82
- this.syncParentControl();
83
- }
84
- rebuildSelectConfig() {
85
- this.parentSelectConfig = {
86
- key: 'parentId',
87
- label: this.labels.newFolderDialogParentLabel,
88
- placeholder: this.labels.newFolderDialogParentNone,
89
- searchable: false,
90
- multiple: false,
91
- closeOnSelect: true,
92
- options: [
93
- // `getOptionValue` in cqa-dynamic-select returns `id ?? value`, so using
94
- // `value: null` (with no id) yields a stable `null` resolved value that
95
- // matches the FormControl's null state.
96
- { value: null, name: this.labels.newFolderDialogParentNone },
97
- ...this.parentOptions.map(o => ({ id: o.id, name: o.label })),
98
- ],
99
- };
100
- }
101
- rebuildOptions() {
102
- const opts = [];
103
- const walk = (nodes, trail) => {
104
- for (const n of nodes || []) {
105
- const label = [...trail, n.name].join(' › ');
106
- opts.push({ id: n.id, label });
107
- if (n.children?.length)
108
- walk(n.children, [...trail, n.name]);
109
- }
110
- };
111
- walk(this.folders, []);
112
- this.parentOptions = opts;
74
+ this.parentPickerLabels = this.buildParentPickerLabels();
113
75
  this.cdr.markForCheck();
114
76
  }
115
- syncParentControl() {
116
- // Keep the reactive form in sync with the `parentId` input without bouncing events.
117
- this.parentForm.get('parentId')?.setValue(this.parentId ?? null, { emitEvent: false });
77
+ get labels() { return this._labels; }
78
+ buildParentPickerLabels() {
79
+ return { ...this._labels, moveDialogRoot: this._labels.newFolderDialogParentNone };
118
80
  }
119
81
  onNameChange(value) {
120
82
  this.name = value;
83
+ this.nameTouched = true;
121
84
  this.nameChange.emit(value);
122
85
  }
123
- onParentSelectionChange(event) {
124
- // cqa-dynamic-select resolves options to `id ?? value`; option ids in the
125
- // parent tree are numeric so we coerce defensively.
126
- const raw = event?.value;
86
+ onParentPicked(id) {
87
+ // The tree picker emits `null` for the "(no parent)" sentinel; numeric otherwise.
127
88
  let next = null;
128
- if (raw != null) {
129
- const coerced = typeof raw === 'number' ? raw : Number(raw);
89
+ if (id != null) {
90
+ const coerced = typeof id === 'number' ? id : Number(id);
130
91
  if (Number.isFinite(coerced))
131
92
  next = coerced;
132
93
  }
@@ -153,9 +114,26 @@ export class NewFolderDialogComponent {
153
114
  if (target)
154
115
  this.onColorChange(target.value);
155
116
  }
156
- /** Returns true when the current state is a valid submission (non-empty, trimmed name). */
117
+ /** Errors surfaced under the name field. Only computed once the user has touched
118
+ * the input so the dialog doesn't open with a "required" error already showing. */
119
+ get nameErrors() {
120
+ if (!this.nameTouched)
121
+ return [];
122
+ const trimmed = (this.name || '').trim();
123
+ const errors = [];
124
+ if (!trimmed) {
125
+ errors.push(this.labels.newFolderDialogNameRequiredError);
126
+ }
127
+ else if (trimmed.length > this.maxNameLength) {
128
+ errors.push(this.labels.newFolderDialogNameMaxLengthError);
129
+ }
130
+ return errors;
131
+ }
132
+ /** Returns true when the current state is a valid submission (non-empty trimmed name
133
+ * within the max length). Used by the host to gate the dialog's Create button. */
157
134
  get isValid() {
158
- return !!(this.name || '').trim();
135
+ const trimmed = (this.name || '').trim();
136
+ return trimmed.length > 0 && trimmed.length <= this.maxNameLength;
159
137
  }
160
138
  submit() {
161
139
  if (!this.isValid)
@@ -176,18 +154,25 @@ NewFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
176
154
  [required]="true"
177
155
  [placeholder]="labels.newFolderDialogNamePlaceholder"
178
156
  [value]="name"
157
+ [errors]="nameErrors"
179
158
  [fullWidth]="true"
180
159
  (valueChange)="onNameChange($event)"
181
160
  (enterPressed)="submit()"
182
161
  ></cqa-custom-input>
183
162
 
184
- <!-- Parent folder -->
185
- <cqa-dynamic-select
186
- class="cqa-block cqa-w-full"
187
- [form]="parentForm"
188
- [config]="parentSelectConfig"
189
- (selectionChange)="onParentSelectionChange($event)"
190
- ></cqa-dynamic-select>
163
+ <!-- Parent folder — tree picker (handles arbitrarily deep nesting via expand/collapse) -->
164
+ <div class="cqa-flex cqa-flex-col cqa-gap-2">
165
+ <label class="cqa-text-sm cqa-font-medium cqa-text-neutral-700">
166
+ {{ labels.newFolderDialogParentLabel }}
167
+ </label>
168
+ <cqa-move-to-folder-dialog
169
+ [folders]="folders"
170
+ [labels]="parentPickerLabels"
171
+ [pickedFolderId]="parentId"
172
+ [pickerHeight]="'240px'"
173
+ (pickedFolderIdChange)="onParentPicked($event)"
174
+ ></cqa-move-to-folder-dialog>
175
+ </div>
191
176
 
192
177
  <!-- Folder color (optional) -->
193
178
  <div class="cqa-flex cqa-flex-col cqa-gap-2">
@@ -246,7 +231,7 @@ NewFolderDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
246
231
  </div>
247
232
  </div>
248
233
  </div>
249
- `, 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.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
234
+ `, 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"] }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
250
235
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewFolderDialogComponent, decorators: [{
251
236
  type: Component,
252
237
  args: [{ selector: 'cqa-new-folder-dialog', template: `
@@ -257,18 +242,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
257
242
  [required]="true"
258
243
  [placeholder]="labels.newFolderDialogNamePlaceholder"
259
244
  [value]="name"
245
+ [errors]="nameErrors"
260
246
  [fullWidth]="true"
261
247
  (valueChange)="onNameChange($event)"
262
248
  (enterPressed)="submit()"
263
249
  ></cqa-custom-input>
264
250
 
265
- <!-- Parent folder -->
266
- <cqa-dynamic-select
267
- class="cqa-block cqa-w-full"
268
- [form]="parentForm"
269
- [config]="parentSelectConfig"
270
- (selectionChange)="onParentSelectionChange($event)"
271
- ></cqa-dynamic-select>
251
+ <!-- Parent folder — tree picker (handles arbitrarily deep nesting via expand/collapse) -->
252
+ <div class="cqa-flex cqa-flex-col cqa-gap-2">
253
+ <label class="cqa-text-sm cqa-font-medium cqa-text-neutral-700">
254
+ {{ labels.newFolderDialogParentLabel }}
255
+ </label>
256
+ <cqa-move-to-folder-dialog
257
+ [folders]="folders"
258
+ [labels]="parentPickerLabels"
259
+ [pickedFolderId]="parentId"
260
+ [pickerHeight]="'240px'"
261
+ (pickedFolderIdChange)="onParentPicked($event)"
262
+ ></cqa-move-to-folder-dialog>
263
+ </div>
272
264
 
273
265
  <!-- Folder color (optional) -->
274
266
  <div class="cqa-flex cqa-flex-col cqa-gap-2">
@@ -349,4 +341,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
349
341
  }], cancelled: [{
350
342
  type: Output
351
343
  }] } });
352
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWZvbGRlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9kaWFsb2dzL25ldy1mb2xkZXItZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sRUFBRSxzQkFBc0IsRUFBNkIsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7QUFPckcsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDO0FBRTlDLE1BQU0sb0JBQW9CLEdBQWE7SUFDckMsb0JBQW9CO0lBQ3BCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFzRkgsTUFBTSxPQUFPLHdCQUF3QjtJQTJEbkMsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUExRDFDLDhFQUE4RTtRQUM5RSx3RUFBd0U7UUFDeEUsb0VBQW9FO1FBQ3BFLCtFQUErRTtRQUMvRSwrRUFBK0U7UUFDL0UsMkVBQTJFO1FBRW5FLGFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBUTVCLFlBQU8sR0FBa0IsRUFBRSxHQUFHLHNCQUFzQixFQUFFLENBQUM7UUFPdEQsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVuQixjQUFTLEdBQWtCLElBQUksQ0FBQztRQU8vQixVQUFLLEdBQVcsb0JBQW9CLENBQUM7UUFFckMsaUJBQVksR0FBYSxvQkFB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TTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfSBmcm9tICcuLi8uLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgREVGQVVMVF9NT0RVTEFSX0xBQkVMUywgRm9sZGVyTm9kZSwgTW9kdWxhckxhYmVscyB9IGZyb20gJy4uL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcblxuaW50ZXJmYWNlIFBhcmVudE9wdGlvbiB7XG4gIGlkOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPTERFUl9DT0xPUiA9ICcjOTk5OTlFJztcblxuY29uc3QgUFJFU0VUX0ZPTERFUl9DT0xPUlM6IHN0cmluZ1tdID0gW1xuICBERUZBVUxUX0ZPTERFUl9DT0xPUixcbiAgJyM0RjQ2RTUnLFxuICAnIzA2QjZENCcsXG4gICcjMTBCOTgxJyxcbiAgJyNGNTlFMEInLFxuICAnI0VGNDQ0NCcsXG4gICcjRUM0ODk5JyxcbiAgJyM4QjVDRjYnLFxuXTtcblxuLyoqXG4gKiBCb2R5IG9mIHRoZSBcIk5ldyBGb2xkZXJcIiBkaWFsb2cuXG4gKlxuICogVXNlcyByZXVzYWJsZSBsaWJyYXJ5IGNvbXBvbmVudHMgKGBjcWEtY3VzdG9tLWlucHV0YCBmb3IgdGhlIG5hbWUgZmllbGQsXG4gKiBgY3FhLWR5bmFtaWMtc2VsZWN0YCBmb3IgdGhlIHBhcmVudCBkcm9wZG93bikgc28gaG9zdHMgY2FuIGRyb3AgdGhpcyBkaWFsb2dcbiAqIGludG8gdGhlaXIgb3duIG1vZGFsIHNoZWxsIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgc3R5bGluZyBkcmlmdC5cbiAqXG4gKiBUd28gaW50ZWdyYXRpb24gcGF0aHM6XG4gKlxuICogIDEuICoqRnJvbSB3aXRoaW4gdGhpcyBsaWJyYXJ5KiogdmlhIGBEaWFsb2dTZXJ2aWNlLm9wZW4oLi4uKWAuIFRoZSBvdXRlclxuICogICAgIGBjcWEtZGlhbG9nYCBzdXBwbGllcyB0aXRsZS9kZXNjcmlwdGlvbi9DYW5jZWwvQ3JlYXRlLWZvbGRlciBidXR0b25zOyB0aGVcbiAqICAgICBDcmVhdGUgYnV0dG9uIHJlYWRzIGBuYW1lYCArIGBwYXJlbnRJZGAgdmlhIGBnZXRDb21wb25lbnRJbnN0YW5jZSgpYC5cbiAqXG4gKiAgMi4gKipIb3N0LWRyaXZlbioqIOKAlCBob3N0IHJlbmRlcnMgYDxjcWEtbmV3LWZvbGRlci1kaWFsb2c+YCBpbnNpZGUgaXRzIG93blxuICogICAgIG1vZGFsIGFuZCBsaXN0ZW5zIHRvIGAoc3VibWl0dGVkKWAgLyBgKGNhbmNlbGxlZClgIC8gYChuYW1lQ2hhbmdlKWAgL1xuICogICAgIGAocGFyZW50SWRDaGFuZ2UpYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLW5ldy1mb2xkZXItZGlhbG9nJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNSBjcWEtdy1mdWxsXCI+XG4gICAgICA8IS0tIEZvbGRlciBuYW1lIC0tPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgW2xhYmVsXT1cImxhYmVscy5uZXdGb2xkZXJEaWFsb2dOYW1lTGFiZWxcIlxuICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbHMubmV3Rm9sZGVyRGlhbG9nTmFtZVBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cIm5hbWVcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25OYW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZW50ZXJQcmVzc2VkKT1cInN1Ym1pdCgpXCJcbiAgICAgID48L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgIDwhLS0gUGFyZW50IGZvbGRlciAtLT5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgY2xhc3M9XCJjcWEtYmxvY2sgY3FhLXctZnVsbFwiXG4gICAgICAgIFtmb3JtXT1cInBhcmVudEZvcm1cIlxuICAgICAgICBbY29uZmlnXT1cInBhcmVudFNlbGVjdENvbmZpZ1wiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25QYXJlbnRTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG5cbiAgICAgIDwhLS0gRm9sZGVyIGNvbG9yIChvcHRpb25hbCkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtbmV1dHJhbC03MDBcIj5cbiAgICAgICAgICB7eyBsYWJlbHMubmV3Rm9sZGVyRGlhbG9nQ29sb3JMYWJlbCB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIuNSBjcWEtZmxleC13cmFwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGMgb2YgcHJlc2V0Q29sb3JzXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctNyBjcWEtaC03IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ib3JkZXItMCBjcWEtcC0wIGNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImNcIlxuICAgICAgICAgICAgW3N0eWxlLmJveFNoYWRvd109XCJpc0NvbG9yKGMpID8gKCcwIDAgMCAycHggI2ZmZmZmZiwgMCAwIDAgNHB4ICcgKyBjKSA6ICcwIDAgMCAxcHggcmdiYSgxNSwgMjMsIDQyLCAwLjA4KSdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29sb3JDaGFuZ2UoYylcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2V0IGZvbGRlciBjb2xvciAnICsgY1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiaXNDb2xvcihjKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiY1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAqbmdJZj1cImlzQ29sb3IoYylcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtbS1hdXRvXCJcbiAgICAgICAgICAgICAgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEybDQuNSA0LjVMMTkgN1wiIHN0cm9rZT1cIiNmZmZmZmZcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy03IGNxYS1oLTcgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJhaW5ib3dCb3JkZXJcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImlzQ3VzdG9tQ29sb3IgPyAoJ0N1c3RvbSBjb2xvciAoJyArIGNvbG9yICsgJyknKSA6ICdQaWNrIGEgY3VzdG9tIGNvbG9yJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiMlwiXG4gICAgICAgICAgICAgIFtzdHlsZS5yaWdodC5weF09XCIyXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvdHRvbS5weF09XCIyXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiMlwiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiaXNDdXN0b21Db2xvciA/IGNvbG9yIDogJyNmZmZmZmYnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc0N1c3RvbUNvbG9yXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA1djE0TTUgMTJoMTRcIiBzdHJva2U9XCIjNTI1MjU4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNDdXN0b21Db2xvclwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSAxMmw0LjUgNC41TDE5IDdcIiBzdHJva2U9XCIjZmZmZmZmXCIgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uQ29sb3JJbnB1dEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLW9wYWNpdHktMCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJvcmRlci0wIGNxYS1wLTBcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGljayBjdXN0b20gZm9sZGVyIGNvbG9yXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmV3Rm9sZGVyRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gTk9URTogVGhlc2UgaW5wdXRzIGFyZSBkZWNsYXJlZCBhcyBzZXR0ZXJzIChpbnN0ZWFkIG9mIHBsYWluIEBJbnB1dCBmaWVsZHMpXG4gIC8vIGJlY2F1c2UgYERpYWxvZ1NlcnZpY2Uub3BlbiguLi4pYCBhc3NpZ25zIHRoZSBgaW5wdXRzYCBtYXAgdmlhIGRpcmVjdFxuICAvLyBwcm9wZXJ0eSBhc3NpZ25tZW50ICphZnRlciogYGF0dGFjaENvbXBvbmVudGAgaGFzIGFscmVhZHkgcnVuIHRoZVxuICAvLyBjb21wb25lbnQncyBgbmdPbkluaXRgLiBEaXJlY3QgYXNzaWdubWVudCBieXBhc3NlcyBgbmdPbkNoYW5nZXNgLCBzbyB3aXRob3V0XG4gIC8vIHNldHRlcnMgdGhlIGBwYXJlbnRTZWxlY3RDb25maWdgIHdvdWxkIGJlIGJ1aWx0IGZyb20gYSBkZWZhdWx0IGVtcHR5IGZvbGRlcnNcbiAgLy8gYXJyYXkgYW5kIHRoZSBwYXJlbnQtZm9sZGVyIGRyb3Bkb3duIHdvdWxkIHJlbmRlciBlbXB0eSAvIGFwcGVhciBicm9rZW4uXG5cbiAgcHJpdmF0ZSBfZm9sZGVyczogRm9sZGVyTm9kZVtdID0gW107XG4gIEBJbnB1dCgpIHNldCBmb2xkZXJzKHZhbHVlOiBGb2xkZXJOb2RlW10pIHtcbiAgICB0aGlzLl9mb2xkZXJzID0gdmFsdWUgfHwgW107XG4gICAgdGhpcy5yZWJ1aWxkT3B0aW9ucygpO1xuICAgIHRoaXMucmVidWlsZFNlbGVjdENvbmZpZygpO1xuICB9XG4gIGdldCBmb2xkZXJzKCk6IEZvbGRlck5vZGVbXSB7IHJldHVybiB0aGlzLl9mb2xkZXJzOyB9XG5cbiAgcHJpdmF0ZSBfbGFiZWxzOiBNb2R1bGFyTGFiZWxzID0geyAuLi5ERUZBVUxUX01PRFVMQVJfTEFCRUxTIH07XG4gIEBJbnB1dCgpIHNldCBsYWJlbHModmFsdWU6IE1vZHVsYXJMYWJlbHMpIHtcbiAgICB0aGlzLl9sYWJlbHMgPSB2YWx1ZSB8fCB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcbiAgICB0aGlzLnJlYnVpbGRTZWxlY3RDb25maWcoKTtcbiAgfVxuICBnZXQgbGFiZWxzKCk6IE1vZHVsYXJMYWJlbHMgeyByZXR1cm4gdGhpcy5fbGFiZWxzOyB9XG5cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfcGFyZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZXQgcGFyZW50SWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9wYXJlbnRJZCA9IHZhbHVlID8/IG51bGw7XG4gICAgdGhpcy5zeW5jUGFyZW50Q29udHJvbCgpO1xuICB9XG4gIGdldCBwYXJlbnRJZCgpOiBudW1iZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudElkOyB9XG5cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZyA9IERFRkFVTFRfRk9MREVSX0NPTE9SO1xuXG4gIHJlYWRvbmx5IHByZXNldENvbG9yczogc3RyaW5nW10gPSBQUkVTRVRfRk9MREVSX0NPTE9SUztcbiAgcmVhZG9ubHkgcmFpbmJvd0JvcmRlcjogc3RyaW5nID1cbiAgICAnY29uaWMtZ3JhZGllbnQoZnJvbSAwZGVnLCAjZWY0NDQ0LCAjZjU5ZTBiLCAjZWFiMzA4LCAjMTBiOTgxLCAjMDZiNmQ0LCAjNGY0NmU1LCAjOGI1Y2Y2LCAjZWM0ODk5LCAjZWY0NDQ0KSc7XG5cbiAgQE91dHB1dCgpIG5hbWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHBhcmVudElkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgY29sb3JDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHBhcmVudElkOiBudW1iZXIgfCBudWxsOyBjb2xvcjogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIFJlYWN0aXZlIGZvcm0gdXNlZCBieSBjcWEtZHluYW1pYy1zZWxlY3QuIFVudHlwZWQgdG8gbWF0Y2ggdGhlIHByb2plY3QncyBBbmd1bGFyIDEzLjQgZm9ybXMgQVBJLiAqL1xuICBwYXJlbnRGb3JtID0gbmV3IEZvcm1Hcm91cCh7IHBhcmVudElkOiBuZXcgRm9ybUNvbnRyb2wobnVsbCkgfSk7XG5cbiAgLyoqXG4gICAqIENvbmZpZyBwYXNzZWQgdG8gYGNxYS1keW5hbWljLXNlbGVjdGAuIFN0b3JlZCBhcyBhIGZpZWxkIChub3QgYSBnZXR0ZXIpIHNvXG4gICAqIHRoZSBvYmplY3QgcmVmZXJlbmNlIGlzIHN0YWJsZSBhY3Jvc3MgY2hhbmdlLWRldGVjdGlvbiBwYXNzZXMg4oCUIGEgZ2V0dGVyXG4gICAqIHJldHVybnMgYSBmcmVzaCBvYmplY3QgZXZlcnkgQ0QgdGljayBhbmQgY2F1c2VzXG4gICAqIGBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yYCArIHJlcGVhdGVkIGBuZ09uQ2hhbmdlc2Agb25cbiAgICogdGhlIGNoaWxkIHNlbGVjdC4gT3RoZXIgY29uc3VtZXJzIGluIHRoaXMgbGliIChlLmcuIGBsb29wLXN0ZXBgKSBmb2xsb3dcbiAgICogdGhlIHNhbWUgcGF0dGVybi5cbiAgICovXG4gIHBhcmVudFNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICBwcml2YXRlIHBhcmVudE9wdGlvbnM6IFBhcmVudE9wdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5yZWJ1aWxkU2VsZWN0Q29uZmlnKCk7IC8vIGVuc3VyZSBjb25maWcgZXhpc3RzIGV2ZW4gYmVmb3JlIGZpcnN0IGlucHV0IHNldFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU2V0dGVycyBhYm92ZSBhbHJlYWR5IHJlYnVpbHQgY29uZmlnIG9uY2UgZm9sZGVycy9sYWJlbHMgd2VyZSBhc3NpZ25lZC4gVGhpc1xuICAgIC8vIGp1c3QgZW5zdXJlcyB0aGUgZm9ybSBjb250cm9sIG1hdGNoZXMgdGhlIGN1cnJlbnQgcGFyZW50SWQgdmFsdWUgaW4gY2FzZVxuICAgIC8vIG9yZGVyaW5nIG9mIGlucHV0IGFzc2lnbm1lbnQgZGlmZmVycy5cbiAgICB0aGlzLnN5bmNQYXJlbnRDb250cm9sKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYnVpbGRTZWxlY3RDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6ICdwYXJlbnRJZCcsXG4gICAgICBsYWJlbDogdGhpcy5sYWJlbHMubmV3Rm9sZGVyRGlhbG9nUGFyZW50TGFiZWwsXG4gICAgICBwbGFjZWhvbGRlcjogdGhpcy5sYWJlbHMubmV3Rm9sZGVyRGlhbG9nUGFyZW50Tm9uZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgY2xvc2VPblNlbGVjdDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgLy8gYGdldE9wdGlvblZhbHVlYCBpbiBjcWEtZHluYW1pYy1zZWxlY3QgcmV0dXJucyBgaWQgPz8gdmFsdWVgLCBzbyB1c2luZ1xuICAgICAgICAvLyBgdmFsdWU6IG51bGxgICh3aXRoIG5vIGlkKSB5aWVsZHMgYSBzdGFibGUgYG51bGxgIHJlc29sdmVkIHZhbHVlIHRoYXRcbiAgICAgICAgLy8gbWF0Y2hlcyB0aGUgRm9ybUNvbnRyb2wncyBudWxsIHN0YXRlLlxuICAgICAgICB7IHZhbHVlOiBudWxsLCBuYW1lOiB0aGlzLmxhYmVscy5uZXdGb2xkZXJEaWFsb2dQYXJlbnROb25lIH0sXG4gICAgICAgIC4uLnRoaXMucGFyZW50T3B0aW9ucy5tYXAobyA9PiAoeyBpZDogby5pZCwgbmFtZTogby5sYWJlbCB9KSksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlYnVpbGRPcHRpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdHM6IFBhcmVudE9wdGlvbltdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCB0cmFpbDogc3RyaW5nW10pOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IFsuLi50cmFpbCwgbi5uYW1lXS5qb2luKCcg4oC6ICcpO1xuICAgICAgICBvcHRzLnB1c2goeyBpZDogbi5pZCwgbGFiZWwgfSk7XG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHdhbGsobi5jaGlsZHJlbiwgWy4uLnRyYWlsLCBuLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsodGhpcy5mb2xkZXJzLCBbXSk7XG4gICAgdGhpcy5wYXJlbnRPcHRpb25zID0gb3B0cztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1BhcmVudENvbnRyb2woKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgcmVhY3RpdmUgZm9ybSBpbiBzeW5jIHdpdGggdGhlIGBwYXJlbnRJZGAgaW5wdXQgd2l0aG91dCBib3VuY2luZyBldmVudHMuXG4gICAgdGhpcy5wYXJlbnRGb3JtLmdldCgncGFyZW50SWQnKT8uc2V0VmFsdWUodGhpcy5wYXJlbnRJZCA/PyBudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICBvbk5hbWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmFtZSA9IHZhbHVlO1xuICAgIHRoaXMubmFtZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyZW50U2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogYW55IH0pOiB2b2lkIHtcbiAgICAvLyBjcWEtZHluYW1pYy1zZWxlY3QgcmVzb2x2ZXMgb3B0aW9ucyB0byBgaWQgPz8gdmFsdWVgOyBvcHRpb24gaWRzIGluIHRoZVxuICAgIC8vIHBhcmVudCB0cmVlIGFyZSBudW1lcmljIHNvIHdlIGNvZXJjZSBkZWZlbnNpdmVseS5cbiAgICBjb25zdCByYXcgPSBldmVudD8udmFsdWU7XG4gICAgbGV0IG5leHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChyYXcgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29lcmNlZCA9IHR5cGVvZiByYXcgPT09ICdudW1iZXInID8gcmF3IDogTnVtYmVyKHJhdyk7XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGNvZXJjZWQpKSBuZXh0ID0gY29lcmNlZDtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnRJZCA9IG5leHQ7XG4gICAgdGhpcy5wYXJlbnRJZENoYW5nZS5lbWl0KG5leHQpO1xuICB9XG5cbiAgaXNDb2xvcihjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuY29sb3IgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IChjIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZ2V0IGlzQ3VzdG9tQ29sb3IoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYyA9ICh0aGlzLmNvbG9yIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAhIWMgJiYgIXRoaXMucHJlc2V0Q29sb3JzLnNvbWUocCA9PiBwLnRvTG93ZXJDYXNlKCkgPT09IGMpO1xuICB9XG5cbiAgb25Db2xvckNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlIHx8IERFRkFVTFRfRk9MREVSX0NPTE9SO1xuICAgIGlmICh0aGlzLmNvbG9yID09PSBuZXh0KSByZXR1cm47XG4gICAgdGhpcy5jb2xvciA9IG5leHQ7XG4gICAgdGhpcy5jb2xvckNoYW5nZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25Db2xvcklucHV0RXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YXJnZXQpIHRoaXMub25Db2xvckNoYW5nZSh0YXJnZXQudmFsdWUpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHN0YXRlIGlzIGEgdmFsaWQgc3VibWlzc2lvbiAobm9uLWVtcHR5LCB0cmltbWVkIG5hbWUpLiAqL1xuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5uYW1lIHx8ICcnKS50cmltKCk7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybjtcbiAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHtcbiAgICAgIG5hbWU6ICh0aGlzLm5hbWUgfHwgJycpLnRyaW0oKSxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgY29sb3I6IHRoaXMuY29sb3IgfHwgREVGQVVMVF9GT0xERVJfQ09MT1IsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWZvbGRlci1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9kaWFsb2dzL25ldy1mb2xkZXItZGlhbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQTZCLE1BQU0sa0NBQWtDLENBQUM7Ozs7O0FBRXJHLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUU5QyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFFekMsTUFBTSxvQkFBb0IsR0FBYTtJQUNyQyxvQkFBb0I7SUFDcEIsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztDQUNWLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBNkZILE1BQU0sT0FBTyx3QkFBd0I7SUFpRG5DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBaEQxQyx3RkFBd0Y7UUFDeEYsaUZBQWlGO1FBQ2pGLGlGQUFpRjtRQUNqRixrRkFBa0Y7UUFDbEYsc0VBQXNFO1FBRTlELGFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBTzVCLFlBQU8sR0FBa0IsRUFBRSxHQUFHLHNCQUFzQixFQUFFLENBQUM7UUFRdEQsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUUzQjs0RkFDb0Y7UUFDNUUsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFbkIsa0JBQWEsR0FBRyxzQkFBc0IsQ0FBQztRQUV2QyxhQUFRLEdBQWtCLElBQUksQ0FBQztR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ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9NT0RVTEFSX0xBQkVMUywgRm9sZGVyTm9kZSwgTW9kdWxhckxhYmVscyB9IGZyb20gJy4uL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRk9MREVSX0NPTE9SID0gJyM5OTk5OUUnO1xuXG5leHBvcnQgY29uc3QgRk9MREVSX05BTUVfTUFYX0xFTkdUSCA9IDIwO1xuXG5jb25zdCBQUkVTRVRfRk9MREVSX0NPTE9SUzogc3RyaW5nW10gPSBbXG4gIERFRkFVTFRfRk9MREVSX0NPTE9SLFxuICAnIzRGNDZFNScsXG4gICcjMDZCNkQ0JyxcbiAgJyMxMEI5ODEnLFxuICAnI0Y1OUUwQicsXG4gICcjRUY0NDQ0JyxcbiAgJyNFQzQ4OTknLFxuICAnIzhCNUNGNicsXG5dO1xuXG4vKipcbiAqIEJvZHkgb2YgdGhlIFwiTmV3IEZvbGRlclwiIGRpYWxvZy5cbiAqXG4gKiBVc2VzIHJldXNhYmxlIGxpYnJhcnkgY29tcG9uZW50cyAoYGNxYS1jdXN0b20taW5wdXRgIGZvciB0aGUgbmFtZSBmaWVsZCxcbiAqIGBjcWEtbW92ZS10by1mb2xkZXItZGlhbG9nYCBhcyBhbiBlbWJlZGRlZCB0cmVlIHBpY2tlciBmb3IgdGhlIHBhcmVudCBmb2xkZXIpXG4gKiBzbyBob3N0cyBjYW4gZHJvcCB0aGlzIGRpYWxvZyBpbnRvIHRoZWlyIG93biBtb2RhbCBzaGVsbCB3aXRob3V0IHdvcnJ5aW5nXG4gKiBhYm91dCBzdHlsaW5nIGRyaWZ0LiBUaGUgdHJlZSBwaWNrZXIgaGFuZGxlcyBhcmJpdHJhcmlseSBkZWVwIG5lc3RpbmcgdmlhXG4gKiBleHBhbmQvY29sbGFwc2UgcmF0aGVyIHRoYW4gYSBmbGF0IGRyb3Bkb3duIG9mIFwiQSDigLogQiDigLogQyDigLrigKZcIiBwYXRocy5cbiAqXG4gKiBUd28gaW50ZWdyYXRpb24gcGF0aHM6XG4gKlxuICogIDEuICoqRnJvbSB3aXRoaW4gdGhpcyBsaWJyYXJ5KiogdmlhIGBEaWFsb2dTZXJ2aWNlLm9wZW4oLi4uKWAuIFRoZSBvdXRlclxuICogICAgIGBjcWEtZGlhbG9nYCBzdXBwbGllcyB0aXRsZS9kZXNjcmlwdGlvbi9DYW5jZWwvQ3JlYXRlLWZvbGRlciBidXR0b25zOyB0aGVcbiAqICAgICBDcmVhdGUgYnV0dG9uIHJlYWRzIGBuYW1lYCArIGBwYXJlbnRJZGAgdmlhIGBnZXRDb21wb25lbnRJbnN0YW5jZSgpYC5cbiAqXG4gKiAgMi4gKipIb3N0LWRyaXZlbioqIOKAlCBob3N0IHJlbmRlcnMgYDxjcWEtbmV3LWZvbGRlci1kaWFsb2c+YCBpbnNpZGUgaXRzIG93blxuICogICAgIG1vZGFsIGFuZCBsaXN0ZW5zIHRvIGAoc3VibWl0dGVkKWAgLyBgKGNhbmNlbGxlZClgIC8gYChuYW1lQ2hhbmdlKWAgL1xuICogICAgIGAocGFyZW50SWRDaGFuZ2UpYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLW5ldy1mb2xkZXItZGlhbG9nJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNSBjcWEtdy1mdWxsXCI+XG4gICAgICA8IS0tIEZvbGRlciBuYW1lIC0tPlxuICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgW2xhYmVsXT1cImxhYmVscy5uZXdGb2xkZXJEaWFsb2dOYW1lTGFiZWxcIlxuICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbHMubmV3Rm9sZGVyRGlhbG9nTmFtZVBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cIm5hbWVcIlxuICAgICAgICBbZXJyb3JzXT1cIm5hbWVFcnJvcnNcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25OYW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZW50ZXJQcmVzc2VkKT1cInN1Ym1pdCgpXCJcbiAgICAgID48L2NxYS1jdXN0b20taW5wdXQ+XG5cbiAgICAgIDwhLS0gUGFyZW50IGZvbGRlciDigJQgdHJlZSBwaWNrZXIgKGhhbmRsZXMgYXJiaXRyYXJpbHkgZGVlcCBuZXN0aW5nIHZpYSBleHBhbmQvY29sbGFwc2UpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LW5ldXRyYWwtNzAwXCI+XG4gICAgICAgICAge3sgbGFiZWxzLm5ld0ZvbGRlckRpYWxvZ1BhcmVudExhYmVsIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxjcWEtbW92ZS10by1mb2xkZXItZGlhbG9nXG4gICAgICAgICAgW2ZvbGRlcnNdPVwiZm9sZGVyc1wiXG4gICAgICAgICAgW2xhYmVsc109XCJwYXJlbnRQaWNrZXJMYWJlbHNcIlxuICAgICAgICAgIFtwaWNrZWRGb2xkZXJJZF09XCJwYXJlbnRJZFwiXG4gICAgICAgICAgW3BpY2tlckhlaWdodF09XCInMjQwcHgnXCJcbiAgICAgICAgICAocGlja2VkRm9sZGVySWRDaGFuZ2UpPVwib25QYXJlbnRQaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgID48L2NxYS1tb3ZlLXRvLWZvbGRlci1kaWFsb2c+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGb2xkZXIgY29sb3IgKG9wdGlvbmFsKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1uZXV0cmFsLTcwMFwiPlxuICAgICAgICAgIHt7IGxhYmVscy5uZXdGb2xkZXJEaWFsb2dDb2xvckxhYmVsIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMi41IGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBwcmVzZXRDb2xvcnNcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy03IGNxYS1oLTcgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJvcmRlci0wIGNxYS1wLTAgY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiY1wiXG4gICAgICAgICAgICBbc3R5bGUuYm94U2hhZG93XT1cImlzQ29sb3IoYykgPyAoJzAgMCAwIDJweCAjZmZmZmZmLCAwIDAgMCA0cHggJyArIGMpIDogJzAgMCAwIDFweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Db2xvckNoYW5nZShjKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZXQgZm9sZGVyIGNvbG9yICcgKyBjXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc0NvbG9yKGMpXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJjXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNDb2xvcihjKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1tLWF1dG9cIlxuICAgICAgICAgICAgICB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTJsNC41IDQuNUwxOSA3XCIgc3Ryb2tlPVwiI2ZmZmZmZlwiIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTcgY3FhLWgtNyBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIlxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwicmFpbmJvd0JvcmRlclwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiaXNDdXN0b21Db2xvciA/ICgnQ3VzdG9tIGNvbG9yICgnICsgY29sb3IgKyAnKScpIDogJ1BpY2sgYSBjdXN0b20gY29sb3InXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIyXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnJpZ2h0LnB4XT1cIjJcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm90dG9tLnB4XT1cIjJcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCIyXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJpc0N1c3RvbUNvbG9yID8gY29sb3IgOiAnI2ZmZmZmZidcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzQ3VzdG9tQ29sb3JcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDV2MTRNNSAxMmgxNFwiIHN0cm9rZT1cIiM1MjUyNThcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0N1c3RvbUNvbG9yXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEybDQuNSA0LjVMMTkgN1wiIHN0cm9rZT1cIiNmZmZmZmZcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY29sb3JcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25Db2xvcklucHV0RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtb3BhY2l0eS0wIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYm9yZGVyLTAgY3FhLXAtMFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJQaWNrIGN1c3RvbSBmb2xkZXIgY29sb3JcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZXdGb2xkZXJEaWFsb2dDb21wb25lbnQge1xuICAvLyBOT1RFOiBgZm9sZGVyc2AgYW5kIGBsYWJlbHNgIGFyZSBkZWNsYXJlZCBhcyBzZXR0ZXJzIChpbnN0ZWFkIG9mIHBsYWluIEBJbnB1dCBmaWVsZHMpXG4gIC8vIGJlY2F1c2UgYERpYWxvZ1NlcnZpY2Uub3BlbiguLi4pYCBhc3NpZ25zIHRoZSBgaW5wdXRzYCBtYXAgdmlhIGRpcmVjdCBwcm9wZXJ0eVxuICAvLyBhc3NpZ25tZW50ICphZnRlciogYGF0dGFjaENvbXBvbmVudGAgaGFzIGFscmVhZHkgcnVuIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGVcbiAgLy8gaG9va3Mg4oCUIGRpcmVjdCBhc3NpZ25tZW50IGJ5cGFzc2VzIGBuZ09uQ2hhbmdlc2AsIHNvIHNldHRlcnMga2VlcCBkZXJpdmVkIHN0YXRlXG4gIC8vIChlLmcuIGBwYXJlbnRQaWNrZXJMYWJlbHNgKSBpbiBzeW5jIG5vIG1hdHRlciB0aGUgYXNzaWdubWVudCBvcmRlci5cblxuICBwcml2YXRlIF9mb2xkZXJzOiBGb2xkZXJOb2RlW10gPSBbXTtcbiAgQElucHV0KCkgc2V0IGZvbGRlcnModmFsdWU6IEZvbGRlck5vZGVbXSkge1xuICAgIHRoaXMuX2ZvbGRlcnMgPSB2YWx1ZSB8fCBbXTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBnZXQgZm9sZGVycygpOiBGb2xkZXJOb2RlW10geyByZXR1cm4gdGhpcy5fZm9sZGVyczsgfVxuXG4gIHByaXZhdGUgX2xhYmVsczogTW9kdWxhckxhYmVscyA9IHsgLi4uREVGQVVMVF9NT0RVTEFSX0xBQkVMUyB9O1xuICBASW5wdXQoKSBzZXQgbGFiZWxzKHZhbHVlOiBNb2R1bGFyTGFiZWxzKSB7XG4gICAgdGhpcy5fbGFiZWxzID0gdmFsdWUgfHwgeyAuLi5ERUZBVUxUX01PRFVMQVJfTEFCRUxTIH07XG4gICAgdGhpcy5wYXJlbnRQaWNrZXJMYWJlbHMgPSB0aGlzLmJ1aWxkUGFyZW50UGlja2VyTGFiZWxzKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGxhYmVscygpOiBNb2R1bGFyTGFiZWxzIHsgcmV0dXJuIHRoaXMuX2xhYmVsczsgfVxuXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBUcmFja3Mgd2hldGhlciB0aGUgdXNlciBoYXMgaW50ZXJhY3RlZCB3aXRoIHRoZSBuYW1lIGZpZWxkLCBzbyB3ZSBkb24ndCBzdXJmYWNlXG4gICAqICB0aGUgXCJyZXF1aXJlZFwiIGVycm9yIG9uIGZpcnN0IHBhaW50IHdoZW4gdGhlIGRpYWxvZyBvcGVucyB3aXRoIGFuIGVtcHR5IG5hbWUuICovXG4gIHByaXZhdGUgbmFtZVRvdWNoZWQgPSBmYWxzZTtcblxuICByZWFkb25seSBtYXhOYW1lTGVuZ3RoID0gRk9MREVSX05BTUVfTUFYX0xFTkdUSDtcblxuICBASW5wdXQoKSBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZyA9IERFRkFVTFRfRk9MREVSX0NPTE9SO1xuXG4gIHJlYWRvbmx5IHByZXNldENvbG9yczogc3RyaW5nW10gPSBQUkVTRVRfRk9MREVSX0NPTE9SUztcbiAgcmVhZG9ubHkgcmFpbmJvd0JvcmRlcjogc3RyaW5nID1cbiAgICAnY29uaWMtZ3JhZGllbnQoZnJvbSAwZGVnLCAjZWY0NDQ0LCAjZjU5ZTBiLCAjZWFiMzA4LCAjMTBiOTgxLCAjMDZiNmQ0LCAjNGY0NmU1LCAjOGI1Y2Y2LCAjZWM0ODk5LCAjZWY0NDQ0KSc7XG5cbiAgQE91dHB1dCgpIG5hbWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHBhcmVudElkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgY29sb3JDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHBhcmVudElkOiBudW1iZXIgfCBudWxsOyBjb2xvcjogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIExhYmVscyBwYXNzZWQgdG8gdGhlIGVtYmVkZGVkIHRyZWUgcGlja2VyLiBSZS11c2VzIHRoZSBtb3ZlLWRpYWxvZyBzdXJmYWNlIGJ1dFxuICAgKiAgcmV3cml0ZXMgdGhlIHJvb3Qgcm93J3MgbGFiZWwgc28gaXQgcmVhZHMgXCIobm8gcGFyZW50KVwiIGluc3RlYWQgb2YgXCJVbm9yZ2FuaXNlZFwiXG4gICAqICBmb3IgdGhlIGNyZWF0ZS1mb2xkZXIgY29udGV4dC4gKi9cbiAgcGFyZW50UGlja2VyTGFiZWxzOiBNb2R1bGFyTGFiZWxzID0gdGhpcy5idWlsZFBhcmVudFBpY2tlckxhYmVscygpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBwcml2YXRlIGJ1aWxkUGFyZW50UGlja2VyTGFiZWxzKCk6IE1vZHVsYXJMYWJlbHMge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX2xhYmVscywgbW92ZURpYWxvZ1Jvb3Q6IHRoaXMuX2xhYmVscy5uZXdGb2xkZXJEaWFsb2dQYXJlbnROb25lIH07XG4gIH1cblxuICBvbk5hbWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmFtZSA9IHZhbHVlO1xuICAgIHRoaXMubmFtZVRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMubmFtZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyZW50UGlja2VkKGlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gVGhlIHRyZWUgcGlja2VyIGVtaXRzIGBudWxsYCBmb3IgdGhlIFwiKG5vIHBhcmVudClcIiBzZW50aW5lbDsgbnVtZXJpYyBvdGhlcndpc2UuXG4gICAgbGV0IG5leHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBjb2VyY2VkID0gdHlwZW9mIGlkID09PSAnbnVtYmVyJyA/IGlkIDogTnVtYmVyKGlkKTtcbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoY29lcmNlZCkpIG5leHQgPSBjb2VyY2VkO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudElkID0gbmV4dDtcbiAgICB0aGlzLnBhcmVudElkQ2hhbmdlLmVtaXQobmV4dCk7XG4gIH1cblxuICBpc0NvbG9yKGM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5jb2xvciB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gKGMgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBnZXQgaXNDdXN0b21Db2xvcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBjID0gKHRoaXMuY29sb3IgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuICEhYyAmJiAhdGhpcy5wcmVzZXRDb2xvcnMuc29tZShwID0+IHAudG9Mb3dlckNhc2UoKSA9PT0gYyk7XG4gIH1cblxuICBvbkNvbG9yQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgfHwgREVGQVVMVF9GT0xERVJfQ09MT1I7XG4gICAgaWYgKHRoaXMuY29sb3IgPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLmNvbG9yID0gbmV4dDtcbiAgICB0aGlzLmNvbG9yQ2hhbmdlLmVtaXQobmV4dCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNvbG9ySW5wdXRFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHRhcmdldCkgdGhpcy5vbkNvbG9yQ2hhbmdlKHRhcmdldC52YWx1ZSk7XG4gIH1cblxuICAvKiogRXJyb3JzIHN1cmZhY2VkIHVuZGVyIHRoZSBuYW1lIGZpZWxkLiBPbmx5IGNvbXB1dGVkIG9uY2UgdGhlIHVzZXIgaGFzIHRvdWNoZWRcbiAgICogIHRoZSBpbnB1dCBzbyB0aGUgZGlhbG9nIGRvZXNuJ3Qgb3BlbiB3aXRoIGEgXCJyZXF1aXJlZFwiIGVycm9yIGFscmVhZHkgc2hvd2luZy4gKi9cbiAgZ2V0IG5hbWVFcnJvcnMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5uYW1lVG91Y2hlZCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHRyaW1tZWQgPSAodGhpcy5uYW1lIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgZXJyb3JzLnB1c2godGhpcy5sYWJlbHMubmV3Rm9sZGVyRGlhbG9nTmFtZVJlcXVpcmVkRXJyb3IpO1xuICAgIH0gZWxzZSBpZiAodHJpbW1lZC5sZW5ndGggPiB0aGlzLm1heE5hbWVMZW5ndGgpIHtcbiAgICAgIGVycm9ycy5wdXNoKHRoaXMubGFiZWxzLm5ld0ZvbGRlckRpYWxvZ05hbWVNYXhMZW5ndGhFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgc3RhdGUgaXMgYSB2YWxpZCBzdWJtaXNzaW9uIChub24tZW1wdHkgdHJpbW1lZCBuYW1lXG4gICAqICB3aXRoaW4gdGhlIG1heCBsZW5ndGgpLiBVc2VkIGJ5IHRoZSBob3N0IHRvIGdhdGUgdGhlIGRpYWxvZydzIENyZWF0ZSBidXR0b24uICovXG4gIGdldCBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSAodGhpcy5uYW1lIHx8ICcnKS50cmltKCk7XG4gICAgcmV0dXJuIHRyaW1tZWQubGVuZ3RoID4gMCAmJiB0cmltbWVkLmxlbmd0aCA8PSB0aGlzLm1heE5hbWVMZW5ndGg7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybjtcbiAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHtcbiAgICAgIG5hbWU6ICh0aGlzLm5hbWUgfHwgJycpLnRyaW0oKSxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgY29sb3I6IHRoaXMuY29sb3IgfHwgREVGQVVMVF9GT0xERVJfQ09MT1IsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==