@tsi-developpement/tsi-shared-ui 1.10.11 → 1.10.13

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,6 +3,7 @@ import { firstValueFrom } from 'rxjs';
3
3
  import { defaultCardHeader } from '../../consts/tsi-consts';
4
4
  import { WorkflowEtatKanbanRequest } from '../../models';
5
5
  import { AppBaseComponent } from '../../tsi-base/components/app-base/app-base.component';
6
+ import { DisplayTypes } from '../../enums/display-types';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "../../services/workflow/workflow-configuration.service";
8
9
  import * as i2 from "../../services/configuration/entity-configuration.service";
@@ -10,7 +11,12 @@ import * as i3 from "../../pipes/localize.pipe";
10
11
  import * as i4 from "../../services/notification/tsi-notification.service";
11
12
  import * as i5 from "@angular/common";
12
13
  import * as i6 from "primeng/paginator";
13
- import * as i7 from "../spinner/spinner.component";
14
+ import * as i7 from "../output-components/tsi-currency-other-display/tsi-currency-other-display.component";
15
+ import * as i8 from "../output-components/tsi-currency-societe-display/tsi-currency-societe-display.component";
16
+ import * as i9 from "../output-components/tsi-decimal-display/tsi-decimal-display.component";
17
+ import * as i10 from "../output-components/tsi-integer-display/tsi-integer-display.component";
18
+ import * as i11 from "../output-components/tsi-rate-display/tsi-rate-display.component";
19
+ import * as i12 from "../spinner/spinner.component";
14
20
  /**
15
21
  * TsiKanbanWorkflowEtatComponent
16
22
  * Description: Displays a Kanban board view for TSI entities using the workflow etat value.
@@ -30,8 +36,17 @@ export class TsiKanbanWorkflowEtatComponent extends AppBaseComponent {
30
36
  this._notificationService = _notificationService;
31
37
  this.buttonClicked = new EventEmitter();
32
38
  this.callSearch = new EventEmitter();
39
+ // Columns whose per-column summary should be displayed in the Kanban header, formatted
40
+ // by their display type (like the table footer). Empty by default → no summaries shown.
41
+ this.summaryColumns = [];
42
+ this.displayTypes = DisplayTypes;
33
43
  this.cards = [];
34
44
  this.cardMapByWorkflowEtat = new Map();
45
+ // Populated only when the page is grouped server-side (one group per workflow etat):
46
+ // true per-column totals and per-column summaries, independent of the current page.
47
+ this.countByWorkflowEtat = new Map();
48
+ this.summaryByWorkflowEtat = new Map();
49
+ this._isGrouped = false;
35
50
  this.draggedCard = null;
36
51
  this.first = 0;
37
52
  this.rows = 10;
@@ -40,7 +55,7 @@ export class TsiKanbanWorkflowEtatComponent extends AppBaseComponent {
40
55
  this.workFlowEtatNomLabels = [];
41
56
  this.workFlowEtatNomLabels = [
42
57
  {
43
- key: 'new',
58
+ key: null,
44
59
  localized: this._localize.transform('shared_tsi_component_grid_kanban_workflowEtat_view_sans_workflow').trim()
45
60
  }
46
61
  ];
@@ -118,13 +133,84 @@ export class TsiKanbanWorkflowEtatComponent extends AppBaseComponent {
118
133
  const match = this.workFlowEtatNomLabels.find(s => s.key === key);
119
134
  return match?.localized ?? key;
120
135
  }
136
+ // True per-column total: the group's unpaged count when grouped server-side,
137
+ // otherwise the number of cards on the current page (legacy client-side grouping).
138
+ getColumnCount(key) {
139
+ if (this._isGrouped) {
140
+ return this.countByWorkflowEtat.get(key) ?? 0;
141
+ }
142
+ return this.cardMapByWorkflowEtat.get(key)?.length ?? 0;
143
+ }
144
+ // Whether per-column summaries should render (grouped data + at least one opted-in column).
145
+ get hasColumnSummaries() {
146
+ return this._isGrouped && (this.summaryColumns?.length ?? 0) > 0;
147
+ }
148
+ // Columns to render: the "sans workflow" (null-key) column is hidden when it has no cards;
149
+ // real workflow-etat columns always show regardless of count.
150
+ get displayedWorkFlowEtatLabels() {
151
+ return this.workFlowEtatNomLabels.filter(l => l.key !== null || this.getColumnCount(l.key) > 0);
152
+ }
153
+ // The SUM for a summarized column within a workflow-etat group (undefined when not grouped or absent).
154
+ getColumnSummaryValue(key, field) {
155
+ if (!this._isGrouped) {
156
+ return undefined;
157
+ }
158
+ const match = this.summaryByWorkflowEtat.get(key)
159
+ ?.find(s => s.proprety?.toLowerCase() === field?.toLowerCase());
160
+ return match?.summary;
161
+ }
121
162
  async handlePageChange(page) {
163
+ if (page?.groups) {
164
+ await this.handleGroupedPage(page);
165
+ return;
166
+ }
122
167
  if (!page?.items)
123
168
  return;
169
+ this._isGrouped = false;
124
170
  this.cards = await this.mapItemsToCards(page.items);
125
171
  this.totalCount = page.totalCount;
126
172
  this.updateCardMap();
127
173
  }
174
+ // Server-side grouped page: one group per workflow etat, each carrying its own accurate
175
+ // (unpaged) total count and summaries. Cards on the current page are mapped and bucketed
176
+ // exactly as in the flat path (via updateCardMap); the true per-column counts/summaries
177
+ // come from the groups, and the single board paginator spans the largest column (same
178
+ // skip/take window applied to every group by the backend).
179
+ async handleGroupedPage(page) {
180
+ const groups = page.groups ?? [];
181
+ const validKeys = this.workFlowEtatNomLabels
182
+ .map(l => l.key)
183
+ .filter((k) => k !== null);
184
+ const counts = new Map();
185
+ const summaries = new Map();
186
+ let maxGroupTotal = 0;
187
+ for (const group of groups) {
188
+ const rawKey = group.key?.trim() || null;
189
+ const bucketKey = rawKey && validKeys.includes(rawKey) ? rawKey : null;
190
+ counts.set(bucketKey, (counts.get(bucketKey) ?? 0) + group.totalCount);
191
+ if (!summaries.has(bucketKey)) {
192
+ summaries.set(bucketKey, group.summaries ?? []);
193
+ }
194
+ maxGroupTotal = Math.max(maxGroupTotal, group.totalCount);
195
+ }
196
+ // Data shrank under a later page (drag-drop, a filter, or another user's change):
197
+ // the current offset is now past the end of every column, so the backend returned an
198
+ // empty window and the board would look empty until the user manually pages back.
199
+ // Clamp to the last valid page and re-fetch once.
200
+ if (this.first > 0 && this.first >= maxGroupTotal) {
201
+ this.first = maxGroupTotal > 0
202
+ ? Math.floor((maxGroupTotal - 1) / this.rows) * this.rows
203
+ : 0;
204
+ this.callSearch.emit({ skipCount: this.first, maxResultCount: this.rows });
205
+ return;
206
+ }
207
+ this._isGrouped = true;
208
+ this.countByWorkflowEtat = counts;
209
+ this.summaryByWorkflowEtat = summaries;
210
+ this.totalCount = maxGroupTotal;
211
+ this.cards = await this.mapItemsToCards(groups.flatMap(g => g.items ?? []));
212
+ this.updateCardMap();
213
+ }
128
214
  async getEntityInfo() {
129
215
  this.entityInfo = await this._entityConfig.getEntityInfoFromCache(this.cardBusinessClass);
130
216
  }
@@ -162,14 +248,13 @@ export class TsiKanbanWorkflowEtatComponent extends AppBaseComponent {
162
248
  map.set(label.key, []);
163
249
  }
164
250
  for (const card of this.cards) {
165
- if (card.status != null && card.status != undefined) {
166
- const group = map.get(card.status);
167
- if (group) {
168
- group.push(card);
169
- }
170
- else {
171
- console.log(`Unmapped card status: ${card.status}`, card);
172
- }
251
+ const key = card.status ?? null;
252
+ const group = map.get(key);
253
+ if (group) {
254
+ group.push(card);
255
+ }
256
+ else {
257
+ console.log(`Unmapped card status: ${card.status}`, card);
173
258
  }
174
259
  }
175
260
  for (const [key, cards] of map.entries()) {
@@ -197,11 +282,11 @@ export class TsiKanbanWorkflowEtatComponent extends AppBaseComponent {
197
282
  }
198
283
  }
199
284
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiKanbanWorkflowEtatComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.WorkflowConfigurationService }, { token: i2.EntityConfigurationService }, { token: i3.LocalizePipe }, { token: i4.TsiNotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
200
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiKanbanWorkflowEtatComponent, selector: "Tsi-kanban-workflow-etat", inputs: { cardBusinessClass: "cardBusinessClass", header: "header", id: "id", page$: "page$", descriminatorValue: "descriminatorValue", page: "page" }, outputs: { buttonClicked: "buttonClicked", callSearch: "callSearch" }, usesInheritance: true, ngImport: i0, template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalCount\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let workflowEtat of workFlowEtatNomLabels; trackBy: trackByWorkflowEtat\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\"\r\n (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, workflowEtat.key)\">\r\n \r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ workflowEtat.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ cardMapByWorkflowEtat.get(workflowEtat.key)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByWorkflowEtat.get(workflowEtat.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getWorkflowEtatClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\"\r\n (dragend)=\"dragEnd()\">\r\n \r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'shared_tsi_component_grid_kanban_workflowEtat_view_workflow_etat' | localize }}:</span>\r\n <span>{{ getLocalizedWorkflowEtat(card.status) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.workflowEtatColor-0{border-left-color:#7269ef}.workflowEtatColor-1{border-left-color:#00c853}.workflowEtatColor-2{border-left-color:#ffab00}.workflowEtatColor-3{border-left-color:#d50000}.workflowEtatColor-4{border-left-color:#ff33a8}.workflowEtatColor-5{border-left-color:#3357ff}.workflowEtatColor-6{border-left-color:#ff8c00}.workflowEtatColor-7{border-left-color:indigo}.workflowEtatColor-8{border-left-color:#33ff57}.workflowEtatColor-9{border-left-color:#ff5733}.workflowEtatColor-10{border-left-color:khaki}[class*=workflowEtatColor-]{border-left-style:solid;border-left-width:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "component", type: i7.SpinnerComponent, selector: "app-spinner" }, { kind: "pipe", type: i3.LocalizePipe, name: "localize" }] }); }
285
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiKanbanWorkflowEtatComponent, selector: "Tsi-kanban-workflow-etat", inputs: { cardBusinessClass: "cardBusinessClass", header: "header", id: "id", page$: "page$", descriminatorValue: "descriminatorValue", summaryColumns: "summaryColumns", page: "page" }, outputs: { buttonClicked: "buttonClicked", callSearch: "callSearch" }, usesInheritance: true, ngImport: i0, template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalCount\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let workflowEtat of displayedWorkFlowEtatLabels; trackBy: trackByWorkflowEtat\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\"\r\n (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, workflowEtat.key)\">\r\n \r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ workflowEtat.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ getColumnCount(workflowEtat.key) }})\r\n </span>\r\n <div class=\"text-xs font-normal text-gray-500\" *ngIf=\"hasColumnSummaries\">\r\n <div *ngFor=\"let sumCol of summaryColumns\" class=\"flex align-items-center gap-1\">\r\n <span>{{ (sumCol.header ?? sumCol.field) | localize }}:</span>\r\n <ng-container [ngSwitch]=\"sumCol.type\">\r\n <Tsi-Currency-Societe-Display *ngSwitchCase=\"displayTypes.CURRENCY_SOCIETE_DISPLAY\"\r\n [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n <Tsi-Integer-Display *ngSwitchCase=\"displayTypes.INTEGER_DISPLAY\"\r\n [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Integer-Display>\r\n <Tsi-Rate-Display *ngSwitchCase=\"displayTypes.RATE_DISPLAY\"\r\n [isFraction]=\"sumCol.isFraction ?? false\" [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Rate-Display>\r\n <Tsi-Decimal-Display *ngSwitchCase=\"displayTypes.DECIMAL_DISPLAY\"\r\n [formatDecimal]=\"sumCol.formatDecimal\" [numOfDecimal]=\"sumCol.numOfDecimal\"\r\n [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Decimal-Display>\r\n <Tsi-Currency-Other-Display *ngSwitchCase=\"displayTypes.CURRENCY_OTHER_DISPLAY\"\r\n [currency]=\"sumCol.currencyOtherCode\" [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Currency-Other-Display>\r\n <span *ngSwitchDefault>{{ getColumnSummaryValue(workflowEtat.key, sumCol.field) }}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByWorkflowEtat.get(workflowEtat.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getWorkflowEtatClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\"\r\n (dragend)=\"dragEnd()\">\r\n \r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'shared_tsi_component_grid_kanban_workflowEtat_view_workflow_etat' | localize }}:</span>\r\n <span>{{ getLocalizedWorkflowEtat(card.status) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.workflowEtatColor-0{border-left-color:#7269ef}.workflowEtatColor-1{border-left-color:#00c853}.workflowEtatColor-2{border-left-color:#ffab00}.workflowEtatColor-3{border-left-color:#d50000}.workflowEtatColor-4{border-left-color:#ff33a8}.workflowEtatColor-5{border-left-color:#3357ff}.workflowEtatColor-6{border-left-color:#ff8c00}.workflowEtatColor-7{border-left-color:indigo}.workflowEtatColor-8{border-left-color:#33ff57}.workflowEtatColor-9{border-left-color:#ff5733}.workflowEtatColor-10{border-left-color:khaki}[class*=workflowEtatColor-]{border-left-style:solid;border-left-width:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i6.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "component", type: i7.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["currency", "inputData"] }, { kind: "component", type: i8.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i9.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i10.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i11.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i12.SpinnerComponent, selector: "app-spinner" }, { kind: "pipe", type: i3.LocalizePipe, name: "localize" }] }); }
201
286
  }
202
287
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiKanbanWorkflowEtatComponent, decorators: [{
203
288
  type: Component,
204
- args: [{ selector: 'Tsi-kanban-workflow-etat', template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalCount\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let workflowEtat of workFlowEtatNomLabels; trackBy: trackByWorkflowEtat\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\"\r\n (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, workflowEtat.key)\">\r\n \r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ workflowEtat.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ cardMapByWorkflowEtat.get(workflowEtat.key)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByWorkflowEtat.get(workflowEtat.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getWorkflowEtatClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\"\r\n (dragend)=\"dragEnd()\">\r\n \r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'shared_tsi_component_grid_kanban_workflowEtat_view_workflow_etat' | localize }}:</span>\r\n <span>{{ getLocalizedWorkflowEtat(card.status) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.workflowEtatColor-0{border-left-color:#7269ef}.workflowEtatColor-1{border-left-color:#00c853}.workflowEtatColor-2{border-left-color:#ffab00}.workflowEtatColor-3{border-left-color:#d50000}.workflowEtatColor-4{border-left-color:#ff33a8}.workflowEtatColor-5{border-left-color:#3357ff}.workflowEtatColor-6{border-left-color:#ff8c00}.workflowEtatColor-7{border-left-color:indigo}.workflowEtatColor-8{border-left-color:#33ff57}.workflowEtatColor-9{border-left-color:#ff5733}.workflowEtatColor-10{border-left-color:khaki}[class*=workflowEtatColor-]{border-left-style:solid;border-left-width:4px}\n"] }]
289
+ args: [{ selector: 'Tsi-kanban-workflow-etat', template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalCount\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let workflowEtat of displayedWorkFlowEtatLabels; trackBy: trackByWorkflowEtat\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\"\r\n (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, workflowEtat.key)\">\r\n \r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ workflowEtat.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ getColumnCount(workflowEtat.key) }})\r\n </span>\r\n <div class=\"text-xs font-normal text-gray-500\" *ngIf=\"hasColumnSummaries\">\r\n <div *ngFor=\"let sumCol of summaryColumns\" class=\"flex align-items-center gap-1\">\r\n <span>{{ (sumCol.header ?? sumCol.field) | localize }}:</span>\r\n <ng-container [ngSwitch]=\"sumCol.type\">\r\n <Tsi-Currency-Societe-Display *ngSwitchCase=\"displayTypes.CURRENCY_SOCIETE_DISPLAY\"\r\n [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n <Tsi-Integer-Display *ngSwitchCase=\"displayTypes.INTEGER_DISPLAY\"\r\n [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Integer-Display>\r\n <Tsi-Rate-Display *ngSwitchCase=\"displayTypes.RATE_DISPLAY\"\r\n [isFraction]=\"sumCol.isFraction ?? false\" [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Rate-Display>\r\n <Tsi-Decimal-Display *ngSwitchCase=\"displayTypes.DECIMAL_DISPLAY\"\r\n [formatDecimal]=\"sumCol.formatDecimal\" [numOfDecimal]=\"sumCol.numOfDecimal\"\r\n [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Decimal-Display>\r\n <Tsi-Currency-Other-Display *ngSwitchCase=\"displayTypes.CURRENCY_OTHER_DISPLAY\"\r\n [currency]=\"sumCol.currencyOtherCode\" [inputData]=\"getColumnSummaryValue(workflowEtat.key, sumCol.field)\">\r\n </Tsi-Currency-Other-Display>\r\n <span *ngSwitchDefault>{{ getColumnSummaryValue(workflowEtat.key, sumCol.field) }}</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByWorkflowEtat.get(workflowEtat.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getWorkflowEtatClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\"\r\n (dragend)=\"dragEnd()\">\r\n \r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'shared_tsi_component_grid_kanban_workflowEtat_view_workflow_etat' | localize }}:</span>\r\n <span>{{ getLocalizedWorkflowEtat(card.status) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.workflowEtatColor-0{border-left-color:#7269ef}.workflowEtatColor-1{border-left-color:#00c853}.workflowEtatColor-2{border-left-color:#ffab00}.workflowEtatColor-3{border-left-color:#d50000}.workflowEtatColor-4{border-left-color:#ff33a8}.workflowEtatColor-5{border-left-color:#3357ff}.workflowEtatColor-6{border-left-color:#ff8c00}.workflowEtatColor-7{border-left-color:indigo}.workflowEtatColor-8{border-left-color:#33ff57}.workflowEtatColor-9{border-left-color:#ff5733}.workflowEtatColor-10{border-left-color:khaki}[class*=workflowEtatColor-]{border-left-style:solid;border-left-width:4px}\n"] }]
205
290
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.WorkflowConfigurationService }, { type: i2.EntityConfigurationService }, { type: i3.LocalizePipe }, { type: i4.TsiNotificationService }], propDecorators: { buttonClicked: [{
206
291
  type: Output
207
292
  }], callSearch: [{
@@ -216,7 +301,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
216
301
  type: Input
217
302
  }], descriminatorValue: [{
218
303
  type: Input
304
+ }], summaryColumns: [{
305
+ type: Input
219
306
  }], page: [{
220
307
  type: Input
221
308
  }] } });
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2kta2FuYmFuLXdvcmtmbG93LWV0YXQvdHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2kta2FuYmFuLXdvcmtmbG93LWV0YXQvdHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxHLE9BQU8sRUFBbUIsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTVELE9BQU8sRUFBa0gseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFNekssT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdURBQXVELENBQUM7Ozs7Ozs7OztBQUl6Rjs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sOEJBQStCLFNBQVEsZ0JBQWdCO0lBWWhFLElBQWEsSUFBSSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBZWpDLFlBQ1ksR0FBc0IsRUFDdEIsNkJBQTJELEVBQzNELGFBQXlDLEVBQ3pDLFNBQXVCLEVB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R0FBRztnQkFDekIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM3SCxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3pCLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRztvQkFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRTtpQkFDdEQsQ0FBQyxDQUFDO2FBQ04sQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFNLEtBQUssRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxzREFBc0QsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQzsrR0FoT1EsOEJBQThCO21HQUE5Qiw4QkFBOEIsc1RDeEIzQyxnbkVBaURBOzs0RkR6QmEsOEJBQThCO2tCQUwxQyxTQUFTOytCQUNJLDBCQUEwQjswT0FNMUIsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVFLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBhZ2luYXRvclN0YXRlIH0gZnJvbSAncHJpbWVuZy9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlZmF1bHRDYXJkSGVhZGVyIH0gZnJvbSAnLi4vLi4vY29uc3RzL3RzaS1jb25zdHMnO1xyXG5pbXBvcnQgeyBCdXR0b25DbGlja1Jlc3VsdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBHZXRXb3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXF1ZXN0LCBUc2lDYXJkLCB1cGRhdGVFbnRpdHlXb3JrZmxvd0luZm9ybWF0aW9uLCB3b3JrZmxvd0V0YXREZXRhaWxsZWRSZXNwb25zZSwgV29ya2Zsb3dFdGF0S2FuYmFuUmVxdWVzdCB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDcnVkQmFzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlL2NydWQtYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL2VudGl0eS1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVN0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvZW50aXR5U3RhdHVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdHNpLWJhc2UvY29tcG9uZW50cy9hcHAtYmFzZS9hcHAtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvd29ya2Zsb3cvd29ya2Zsb3ctY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG4vKipcclxuICogVHNpS2FuYmFuV29ya2Zsb3dFdGF0Q29tcG9uZW50XHJcbiAqIERlc2NyaXB0aW9uOiBEaXNwbGF5cyBhIEthbmJhbiBib2FyZCB2aWV3IGZvciBUU0kgZW50aXRpZXMgdXNpbmcgdGhlIHdvcmtmbG93IGV0YXQgdmFsdWUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnVHNpLWthbmJhbi13b3JrZmxvdy1ldGF0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90c2kta2FuYmFuLXdvcmtmbG93LWV0YXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmw6ICcuL3RzaS1rYW5iYW4td29ya2Zsb3ctZXRhdC5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lLYW5iYW5Xb3JrZmxvd0V0YXRDb21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tSZXN1bHQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgY2FsbFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIEBJbnB1dCgpIGNhcmRCdXNpbmVzc0NsYXNzOiBhbnk7XHJcbiAgICBASW5wdXQoKSBoZWFkZXI6IGFueTtcclxuICAgIEBJbnB1dCgpIGlkOiBhbnk7XHJcbiAgICBASW5wdXQoKSBwYWdlJCE6IEJlaGF2aW9yU3ViamVjdDxhbnk+O1xyXG4gICAgQElucHV0KCkgZGVzY3JpbWluYXRvclZhbHVlPzogc3RyaW5nXHJcblxyXG4gICAgcHJpdmF0ZSBfcGFnZTogYW55O1xyXG4gICAgQElucHV0KCkgc2V0IHBhZ2UodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuX3BhZ2UgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBhZ2UoKSB7IHJldHVybiB0aGlzLl9wYWdlOyB9XHJcblxyXG4gICAgY2FyZHM6IFRzaUNhcmRbXSA9IFtdO1xyXG4gICAgY2FyZE1hcEJ5V29ya2Zsb3dFdGF0OiBNYXA8c3RyaW5nLCBUc2lDYXJkW10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIGRyYWdnZWRDYXJkOiBUc2lDYXJkIHwgbnVsbCA9IG51bGw7XHJcbiAgICBmaXJzdCA9IDA7XHJcbiAgICByb3dzID0gMTA7XHJcbiAgICB0b3RhbENvdW50ID0gMDtcclxuICAgIGlzTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHdvcmtGbG93RXRhdE5vbUxhYmVsczogeyBrZXk6IHN0cmluZzsgbG9jYWxpemVkOiBzdHJpbmcgfVtdID1cclxuICAgICAgICBbXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBfd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZTogV29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9lbnRpdHlDb25maWc6IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2xvY2FsaXplOiBMb2NhbGl6ZVBpcGUsXHJcbiAgICAgICAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy53b3JrRmxvd0V0YXROb21MYWJlbHMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleTogJ25ldycsXHJcbiAgICAgICAgICAgICAgICBsb2NhbGl6ZWQ6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9rYW5iYW5fd29ya2Zsb3dFdGF0X3ZpZXdfc2Fuc193b3JrZmxvdycpLnRyaW0oKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0V29ya2Zsb3dFdGF0KHRoaXMuZGVzY3JpbWluYXRvclZhbHVlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RW50aXR5SW5mbygpO1xyXG5cclxuICAgICAgICB0aGlzLnBhZ2UkLnN1YnNjcmliZShhc3luYyBwYWdlID0+IHtcclxuICAgICAgICAgICAgaWYgKHBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gISFwYWdlLmxvYWRpbmc7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2UocGFnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkcmFnU3RhcnQoXzogRHJhZ0V2ZW50LCBjYXJkOiBUc2lDYXJkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kcmFnZ2VkQ2FyZCA9IGNhcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgZHJhZ0VuZCgpOiB2b2lkIHsgdGhpcy5kcmFnZ2VkQ2FyZCA9IG51bGw7IH1cclxuXHJcbiAgICBhbGxvd0Ryb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XHJcblxyXG4gICAgdHJhY2tCeVdvcmtmbG93RXRhdChpbmRleDogbnVtYmVyLCBzdGF0dXM6IHsga2V5OiBzdHJpbmc7IGxvY2FsaXplZDogc3RyaW5nIH0pIHsgcmV0dXJuIHN0YXR1cy5rZXk7IH1cclxuXHJcbiAgICB0cmFja0J5Q2FyZChpbmRleDogbnVtYmVyLCBjYXJkOiBUc2lDYXJkKSB7IHJldHVybiBjYXJkLnVpZDsgfVxyXG5cclxuICAgIGRyb3AoZXZlbnQ6IERyYWdFdmVudCwgbmV3S2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2VkQ2FyZCkgcmV0dXJuO1xyXG4gICAgICAgIGlmKG5ld0tleSA9PSBudWxsIHx8IG5ld0tleSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKFwic2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9rYW5iYW5fd29ya2Zsb3dFdGF0X3ZpZXdfc2Fuc193b3JrZmxvd19mb3JiaWRkZW5cIilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjYXJkID0gdGhpcy5kcmFnZ2VkQ2FyZDtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1dvcmtmbG93RXRhdCA9IHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzO1xyXG5cclxuICAgICAgICBpZihwcmV2aW91c1dvcmtmbG93RXRhdCA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihcInNoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfa2FuYmFuX3dvcmtmbG93RXRhdF92aWV3X25vX3dvcmtmbG93XCIpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzICE9PSBuZXdLZXkgJiYgdGhpcy5jYXJkQnVzaW5lc3NDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgICAgICAgICAgbGV0IHJlcXVlc3Q6IFdvcmtmbG93RXRhdEthbmJhblJlcXVlc3QgPSBuZXcgV29ya2Zsb3dFdGF0S2FuYmFuUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXF1ZXN0LndvcmtGbG93RXRhdCA9IHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzXHJcbiAgICAgICAgICAgIHJlcXVlc3QuYnVzaW5lc3NDbGFzcyA9IHRoaXMuY2FyZEJ1c2luZXNzQ2xhc3MsXHJcbiAgICAgICAgICAgIHJlcXVlc3QudWlkT2JqZXQgPSB0aGlzLmRyYWdnZWRDYXJkLnVpZDtcclxuICAgICAgICAgICAgcmVxdWVzdC5kaXNjcmltaW5hdG9yQ2xhc3NOYW1lID0gdGhpcy5lbnRpdHlJbmZvPy5kaXNjcmltaW5hdG9yQ2xhc3NOYW1lXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZSA9IHRoaXMuZW50aXR5SW5mbz8uZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICByZXF1ZXN0LmRpc2NyaW1pbmF0b3JWYWx1ZSA9IHRoaXMuZGVzY3JpbWluYXRvclZhbHVlXHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya0Zsb3dFdGF0U3VpdmFudCA9IG5ld0tleTtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS51cGRhdGVXb3JrZmxvd0V0YXRGcm9tS2FuYmFuVmlldyhyZXF1ZXN0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXJkLnN0YXR1cyA9IG5ld0tleTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IoZXJyb3I/LmVycm9yKVxyXG4gICAgICAgICAgICAgICAgICAgIGNhcmQuc3RhdHVzID0gcHJldmlvdXNXb3JrZmxvd0V0YXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2luYXRvclN0YXRlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maXJzdCA9IGV2ZW50LmZpcnN0ID8/IDA7XHJcbiAgICAgICAgdGhpcy5yb3dzID0gZXZlbnQucm93cyA/PyAxMDtcclxuICAgICAgICB0aGlzLmNhbGxTZWFyY2guZW1pdCh7IHNraXBDb3VudDogdGhpcy5maXJzdCwgbWF4UmVzdWx0Q291bnQ6IHRoaXMucm93cyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRXb3JrZmxvd0V0YXRDbGFzcyhjYXJkOiBUc2lDYXJkKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMud29ya0Zsb3dFdGF0Tm9tTGFiZWxzLmZpbmRJbmRleChsID0+IGwua2V5ID09PSBjYXJkLnN0YXR1cyk7XHJcbiAgICAgICAgcmV0dXJuIGB3b3JrZmxvd0V0YXRDb2xvci0ke2luZGV4ID49IDAgPyBpbmRleCA6ICdkZWZhdWx0J31gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldExvY2FsaXplZFdvcmtmbG93RXRhdChrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFrZXkpIHJldHVybiAnJztcclxuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMud29ya0Zsb3dFdGF0Tm9tTGFiZWxzLmZpbmQocyA9PiBzLmtleSA9PT0ga2V5KTtcclxuICAgICAgICByZXR1cm4gbWF0Y2g/LmxvY2FsaXplZCA/PyBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVQYWdlQ2hhbmdlKHBhZ2U6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghcGFnZT8uaXRlbXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jYXJkcyA9IGF3YWl0IHRoaXMubWFwSXRlbXNUb0NhcmRzKHBhZ2UuaXRlbXMpO1xyXG4gICAgICAgIHRoaXMudG90YWxDb3VudCA9IHBhZ2UudG90YWxDb3VudDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEVudGl0eUluZm8oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5lbnRpdHlJbmZvID0gYXdhaXQgdGhpcy5fZW50aXR5Q29uZmlnLmdldEVudGl0eUluZm9Gcm9tQ2FjaGUodGhpcy5jYXJkQnVzaW5lc3NDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb2xLZXlzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHBob3RvOiB0aGlzLmVudGl0eUluZm8/LmNhcmRIZWFkZXJQaG90b0NvbHVtbj8udG9Mb3dlckNhc2UoKSA/PyAnJyxcclxuICAgICAgICAgICAgY29sMTogdGhpcy5lbnRpdHlJbmZvPy5jYXJkVGl0bGVDb2x1bW4/LnRvTG93ZXJDYXNlKCkgPz8gJycsXHJcbiAgICAgICAgICAgIGNvbDI6IHRoaXMuZW50aXR5SW5mbz8uY2FyZFN1YkhlYWRlckNvbHVtbj8udG9Mb3dlckNhc2UoKSA/PyAnJyxcclxuICAgICAgICAgICAgY29sMzogdGhpcy5lbnRpdHlJbmZvPy5jYXJkRGVzY3JpcHRpb25Db2x1bW4/LnRvTG93ZXJDYXNlKCkgPz8gJycsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5lbnRpdHlJbmZvPy5jbGFzc05hbWU/LnRvTG93ZXJDYXNlKCkgPz8gJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgbWFwSXRlbXNUb0NhcmRzKGl0ZW1zOiBhbnlbXSk6IFByb21pc2U8VHNpQ2FyZFtdPiB7XHJcbiAgICAgICAgY29uc3QgeyBjb2wxLCBjb2wyLCBjb2wzLCBwaG90byB9ID0gdGhpcy5nZXRDb2xLZXlzKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSkucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYWNjW2tleS50b0xvd2VyQ2FzZSgpXSA9IGtleTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3dFdGF0VmFsdWUgPSBpdGVtLndvcmtmbG93RXRhdCA/PyBudWxsO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGlkOiBpbmRleCArIDEgKyB0aGlzLmZpcnN0LFxyXG4gICAgICAgICAgICAgICAgdWlkOiBgJHtpdGVtLnVpZH1gLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyVGl0bGU6IGAke2l0ZW1ba2V5c1tjb2wxXV0gPz8gJyd9YCxcclxuICAgICAgICAgICAgICAgIHN1YkhlYWRlclRpdGxlOiBgJHtpdGVtW2tleXNbY29sMl1dID8/ICcnfWAsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7aXRlbVtrZXlzW2NvbDNdXSA/PyAnJ31gLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiB3b3JrZmxvd0V0YXRWYWx1ZSxcclxuICAgICAgICAgICAgICAgIHBob3RvOiBpdGVtW2tleXNbcGhvdG9dXSB8fCBkZWZhdWx0Q2FyZEhlYWRlci5pbWFnZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUNhcmRNYXAoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFRzaUNhcmRbXT4oKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIHRoaXMud29ya0Zsb3dFdGF0Tm9tTGFiZWxzKSB7XHJcbiAgICAgICAgICAgIG1hcC5zZXQobGFiZWwua2V5LCBbXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgdGhpcy5jYXJkcykge1xyXG4gICAgICAgICAgICBpZihjYXJkLnN0YXR1cyAhPSBudWxsICYmIGNhcmQuc3RhdHVzICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBtYXAuZ2V0KGNhcmQuc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIGlmIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnB1c2goY2FyZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbm1hcHBlZCBjYXJkIHN0YXR1czogJHtjYXJkLnN0YXR1c31gLCBjYXJkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjYXJkc10gb2YgbWFwLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBjYXJkcy5zb3J0KChhLCBiKSA9PiAoYS5oZWFkZXJUaXRsZSA/PyAnJykubG9jYWxlQ29tcGFyZShiLmhlYWRlclRpdGxlID8/ICcnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhcmRNYXBCeVdvcmtmbG93RXRhdCA9IG1hcDtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICAgICAgICBcclxuICBwcml2YXRlIGFzeW5jIGdldFdvcmtmbG93RXRhdChkZXNjcmltaW5hdG9yVmFsdWU/OiBzdHJpbmcpIHtcclxuICAgICAgaWYgKCF0aGlzLmNhcmRCdXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFdvcmtmbG93RXRhdEJ5Q2xhc3NOYW1lQW5kRGVzY3JpbWluYXRvcih0aGlzLmNhcmRCdXNpbmVzc0NsYXNzLCBkZXNjcmltaW5hdG9yVmFsdWUpKTtcclxuICAgICAgICB0aGlzLndvcmtGbG93RXRhdE5vbUxhYmVscyA9IFtcclxuICAgICAgICAgICAgeyBrZXk6IG51bGwsIGxvY2FsaXplZDogdGhpcy5fbG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2thbmJhbl93b3JrZmxvd0V0YXRfdmlld19zYW5zX3dvcmtmbG93JykudHJpbSgpIH0sXHJcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLm1hcCgoczogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAga2V5OiBzLmtleSxcclxuICAgICAgICAgICAgICAgIGxvY2FsaXplZDogdGhpcy5fbG9jYWxpemUudHJhbnNmb3JtKHMudmFsdWUpLnRyaW0oKVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignZXJyZXVyIGdldFdvcmtmbG93RXRhdEJ5Q2xhc3NOYW1lQW5kRGVzY3JpbWluYXRvciA6ICcsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImNhcmQgZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgPHAtcGFnaW5hdG9yXHJcbiAgICBbZmlyc3RdPVwiZmlyc3RcIlxyXG4gICAgW3Jvd3NdPVwicm93c1wiXHJcbiAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsQ291bnRcIlxyXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbMSwgMTAsIDI1LCA1MF1cIlxyXG4gICAgKG9uUGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxyXG4gICAgY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZT1cInt7ICdTaG93aW5nJyB8IGxvY2FsaXplIH19IHtmaXJzdH0ge3sndG8nIHwgbG9jYWxpemV9fSB7bGFzdH0ge3sgJ29mJyB8IGxvY2FsaXplIH19IHt0b3RhbFJlY29yZHN9XCI+XHJcbiAgPC9wLXBhZ2luYXRvcj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwia2FuYmFuLWJvYXJkIGZsZXggZ2FwLTQgb3ZlcmZsb3ctYXV0b1wiPlxyXG4gIDxkaXYgKm5nRm9yPVwibGV0IHdvcmtmbG93RXRhdCBvZiB3b3JrRmxvd0V0YXROb21MYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlXb3JrZmxvd0V0YXRcIlxyXG4gICAgICAgY2xhc3M9XCJrYW5iYW4tY29sdW1uIGZsZXggZmxleC1jb2x1bW4gYm9yZGVyLXJvdW5kIHN1cmZhY2UtMCBzaGFkb3ctMlwiXHJcbiAgICAgICAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudClcIlxyXG4gICAgICAgKGRyb3ApPVwiZHJvcCgkZXZlbnQsIHdvcmtmbG93RXRhdC5rZXkpXCI+XHJcbiAgICAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4taGVhZGVyIHAtMyBib3JkZXItYm90dG9tLTEgc3VyZmFjZS1ib3JkZXIgZm9udC1zZW1pYm9sZFwiPlxyXG4gICAgICB7eyB3b3JrZmxvd0V0YXQubG9jYWxpemVkIH19XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW5vcm1hbCB0ZXh0LWdyYXktNTAwXCI+XHJcbiAgICAgICAgKHt7IGNhcmRNYXBCeVdvcmtmbG93RXRhdC5nZXQod29ya2Zsb3dFdGF0LmtleSk/Lmxlbmd0aCB8fCAwIH19KVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWNhcmRzIGZsZXgtMSBvdmVyZmxvdy1hdXRvIHAtM1wiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjYXJkIG9mIGNhcmRNYXBCeVdvcmtmbG93RXRhdC5nZXQod29ya2Zsb3dFdGF0LmtleSk7IHRyYWNrQnk6IHRyYWNrQnlDYXJkXCJcclxuICAgICAgICAgICBjbGFzcz1cImthbmJhbi1jYXJkIHAtMyBib3JkZXItcm91bmQgYmctd2hpdGUgbWItMyBzaGFkb3ctMVwiXHJcbiAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0V29ya2Zsb3dFdGF0Q2xhc3MoY2FyZClcIlxyXG4gICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxyXG4gICAgICAgICAgIChkcmFnc3RhcnQpPVwiZHJhZ1N0YXJ0KCRldmVudCwgY2FyZClcIlxyXG4gICAgICAgICAgIChkcmFnZW5kKT1cImRyYWdFbmQoKVwiPlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGQgbWItMlwiPnt7IGNhcmQuaGVhZGVyVGl0bGUgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG1iLTNcIj57eyBjYXJkLmRlc2NyaXB0aW9uIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTYwMCBtYi0zXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eyAnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9rYW5iYW5fd29ya2Zsb3dFdGF0X3ZpZXdfd29ya2Zsb3dfZXRhdCcgfCBsb2NhbGl6ZSB9fTo8L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj57eyBnZXRMb2NhbGl6ZWRXb3JrZmxvd0V0YXQoY2FyZC5zdGF0dXMpIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJvdmVybGF5XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwic3Bpbm5lci13cmFwcGVyXCI+XHJcbiAgICA8YXBwLXNwaW5uZXI+PC9hcHAtc3Bpbm5lcj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2kta2FuYmFuLXdvcmtmbG93LWV0YXQvdHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2kta2FuYmFuLXdvcmtmbG93LWV0YXQvdHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxHLE9BQU8sRUFBbUIsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTVELE9BQU8sRUFBa0gseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJekssT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFJekYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQUV6RDs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sOEJBQStCLFNBQVEsZ0JBQWdCO0lBaUJoRSxJQUFhLElBQUksQ0FBQyxLQUFpQjtRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksSUFBSSxLQUE2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBcUJ6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RyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdpbmF0b3JTdGF0ZSB9IGZyb20gJ3ByaW1lbmcvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWZhdWx0Q2FyZEhlYWRlciB9IGZyb20gJy4uLy4uL2NvbnN0cy90c2ktY29uc3RzJztcclxuaW1wb3J0IHsgQnV0dG9uQ2xpY2tSZXN1bHQsIEdyaWRDb2x1bW4gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgR2V0V29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVxdWVzdCwgVHNpQ2FyZCwgdXBkYXRlRW50aXR5V29ya2Zsb3dJbmZvcm1hdGlvbiwgd29ya2Zsb3dFdGF0RGV0YWlsbGVkUmVzcG9uc2UsIFdvcmtmbG93RXRhdEthbmJhblJlcXVlc3QgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL2VudGl0eS1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi90c2ktYmFzZS9jb21wb25lbnRzL2FwcC1iYXNlL2FwcC1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFdvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy93b3JrZmxvdy93b3JrZmxvdy1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSUdyb3VwZWRSZXN1bHQsIElQYWdlLCBJU3VtbWFyeUZvclByb3ByZXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYWdpbmF0aW9uL3BhZ2luYXRpb24tYmFzZSc7XHJcbmltcG9ydCB7IERpc3BsYXlUeXBlcyB9IGZyb20gJy4uLy4uL2VudW1zL2Rpc3BsYXktdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIFRzaUthbmJhbldvcmtmbG93RXRhdENvbXBvbmVudFxyXG4gKiBEZXNjcmlwdGlvbjogRGlzcGxheXMgYSBLYW5iYW4gYm9hcmQgdmlldyBmb3IgVFNJIGVudGl0aWVzIHVzaW5nIHRoZSB3b3JrZmxvdyBldGF0IHZhbHVlLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ1RzaS1rYW5iYW4td29ya2Zsb3ctZXRhdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdHNpLWthbmJhbi13b3JrZmxvdy1ldGF0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi90c2kta2FuYmFuLXdvcmtmbG93LWV0YXQuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpS2FuYmFuV29ya2Zsb3dFdGF0Q29tcG9uZW50IGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgQE91dHB1dCgpIGJ1dHRvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrUmVzdWx0PigpO1xyXG4gICAgQE91dHB1dCgpIGNhbGxTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBASW5wdXQoKSBjYXJkQnVzaW5lc3NDbGFzczogYW55O1xyXG4gICAgQElucHV0KCkgaGVhZGVyOiBhbnk7XHJcbiAgICBASW5wdXQoKSBpZDogYW55O1xyXG4gICAgQElucHV0KCkgcGFnZSQhOiBCZWhhdmlvclN1YmplY3Q8SVBhZ2U8YW55PiB8IG51bGw+O1xyXG4gICAgQElucHV0KCkgZGVzY3JpbWluYXRvclZhbHVlPzogc3RyaW5nXHJcbiAgICAvLyBDb2x1bW5zIHdob3NlIHBlci1jb2x1bW4gc3VtbWFyeSBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBLYW5iYW4gaGVhZGVyLCBmb3JtYXR0ZWRcclxuICAgIC8vIGJ5IHRoZWlyIGRpc3BsYXkgdHlwZSAobGlrZSB0aGUgdGFibGUgZm9vdGVyKS4gRW1wdHkgYnkgZGVmYXVsdCDihpIgbm8gc3VtbWFyaWVzIHNob3duLlxyXG4gICAgQElucHV0KCkgc3VtbWFyeUNvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIHJlYWRvbmx5IGRpc3BsYXlUeXBlcyA9IERpc3BsYXlUeXBlcztcclxuXHJcbiAgICBwcml2YXRlIF9wYWdlOiBJUGFnZTxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgc2V0IHBhZ2UodmFsdWU6IElQYWdlPGFueT4pIHtcclxuICAgICAgICB0aGlzLl9wYWdlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGdldCBwYWdlKCk6IElQYWdlPGFueT4gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fcGFnZTsgfVxyXG5cclxuICAgIGNhcmRzOiBUc2lDYXJkW10gPSBbXTtcclxuICAgIGNhcmRNYXBCeVdvcmtmbG93RXRhdDogTWFwPHN0cmluZyB8IG51bGwsIFRzaUNhcmRbXT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgLy8gUG9wdWxhdGVkIG9ubHkgd2hlbiB0aGUgcGFnZSBpcyBncm91cGVkIHNlcnZlci1zaWRlIChvbmUgZ3JvdXAgcGVyIHdvcmtmbG93IGV0YXQpOlxyXG4gICAgLy8gdHJ1ZSBwZXItY29sdW1uIHRvdGFscyBhbmQgcGVyLWNvbHVtbiBzdW1tYXJpZXMsIGluZGVwZW5kZW50IG9mIHRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICBjb3VudEJ5V29ya2Zsb3dFdGF0OiBNYXA8c3RyaW5nIHwgbnVsbCwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgIHN1bW1hcnlCeVdvcmtmbG93RXRhdDogTWFwPHN0cmluZyB8IG51bGwsIElTdW1tYXJ5Rm9yUHJvcHJldHlbXT4gPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIF9pc0dyb3VwZWQgPSBmYWxzZTtcclxuXHJcbiAgICBkcmFnZ2VkQ2FyZDogVHNpQ2FyZCB8IG51bGwgPSBudWxsO1xyXG4gICAgZmlyc3QgPSAwO1xyXG4gICAgcm93cyA9IDEwO1xyXG4gICAgdG90YWxDb3VudCA9IDA7XHJcbiAgICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB3b3JrRmxvd0V0YXROb21MYWJlbHM6IHsga2V5OiBzdHJpbmcgfCBudWxsOyBsb2NhbGl6ZWQ6IHN0cmluZyB9W10gPVxyXG4gICAgICAgIFtcclxuICAgICAgICBdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIF93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2VudGl0eUNvbmZpZzogRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9jYWxpemU6IExvY2FsaXplUGlwZSxcclxuICAgICAgICBwcml2YXRlIF9ub3RpZmljYXRpb25TZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLndvcmtGbG93RXRhdE5vbUxhYmVscyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAga2V5OiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxpemVkOiB0aGlzLl9sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfa2FuYmFuX3dvcmtmbG93RXRhdF92aWV3X3NhbnNfd29ya2Zsb3cnKS50cmltKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdldFdvcmtmbG93RXRhdCh0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSlcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEVudGl0eUluZm8oKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYWdlJC5zdWJzY3JpYmUoYXN5bmMgcGFnZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYWdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICEhcGFnZS5sb2FkaW5nO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKHBhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZHJhZ1N0YXJ0KF86IERyYWdFdmVudCwgY2FyZDogVHNpQ2FyZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZHJhZ2dlZENhcmQgPSBjYXJkO1xyXG4gICAgfVxyXG5cclxuICAgIGRyYWdFbmQoKTogdm9pZCB7IHRoaXMuZHJhZ2dlZENhcmQgPSBudWxsOyB9XHJcblxyXG4gICAgYWxsb3dEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfVxyXG5cclxuICAgIHRyYWNrQnlXb3JrZmxvd0V0YXQoaW5kZXg6IG51bWJlciwgc3RhdHVzOiB7IGtleTogc3RyaW5nIHwgbnVsbDsgbG9jYWxpemVkOiBzdHJpbmcgfSkgeyByZXR1cm4gc3RhdHVzLmtleTsgfVxyXG5cclxuICAgIHRyYWNrQnlDYXJkKGluZGV4OiBudW1iZXIsIGNhcmQ6IFRzaUNhcmQpIHsgcmV0dXJuIGNhcmQudWlkOyB9XHJcblxyXG4gICAgZHJvcChldmVudDogRHJhZ0V2ZW50LCBuZXdLZXk6IHN0cmluZyB8IG51bGwpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2VkQ2FyZCkgcmV0dXJuO1xyXG4gICAgICAgIGlmKG5ld0tleSA9PSBudWxsIHx8IG5ld0tleSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKFwic2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9rYW5iYW5fd29ya2Zsb3dFdGF0X3ZpZXdfc2Fuc193b3JrZmxvd19mb3JiaWRkZW5cIilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjYXJkID0gdGhpcy5kcmFnZ2VkQ2FyZDtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1dvcmtmbG93RXRhdCA9IHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzO1xyXG5cclxuICAgICAgICBpZihwcmV2aW91c1dvcmtmbG93RXRhdCA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihcInNoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfa2FuYmFuX3dvcmtmbG93RXRhdF92aWV3X25vX3dvcmtmbG93XCIpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzICE9PSBuZXdLZXkgJiYgdGhpcy5jYXJkQnVzaW5lc3NDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgICAgICAgICAgbGV0IHJlcXVlc3Q6IFdvcmtmbG93RXRhdEthbmJhblJlcXVlc3QgPSBuZXcgV29ya2Zsb3dFdGF0S2FuYmFuUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICByZXF1ZXN0LndvcmtGbG93RXRhdCA9IHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzXHJcbiAgICAgICAgICAgIHJlcXVlc3QuYnVzaW5lc3NDbGFzcyA9IHRoaXMuY2FyZEJ1c2luZXNzQ2xhc3MsXHJcbiAgICAgICAgICAgIHJlcXVlc3QudWlkT2JqZXQgPSB0aGlzLmRyYWdnZWRDYXJkLnVpZDtcclxuICAgICAgICAgICAgcmVxdWVzdC5kaXNjcmltaW5hdG9yQ2xhc3NOYW1lID0gdGhpcy5lbnRpdHlJbmZvPy5kaXNjcmltaW5hdG9yQ2xhc3NOYW1lXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZSA9IHRoaXMuZW50aXR5SW5mbz8uZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICByZXF1ZXN0LmRpc2NyaW1pbmF0b3JWYWx1ZSA9IHRoaXMuZGVzY3JpbWluYXRvclZhbHVlXHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya0Zsb3dFdGF0U3VpdmFudCA9IG5ld0tleTtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS51cGRhdGVXb3JrZmxvd0V0YXRGcm9tS2FuYmFuVmlldyhyZXF1ZXN0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXJkLnN0YXR1cyA9IG5ld0tleTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IoZXJyb3I/LmVycm9yKVxyXG4gICAgICAgICAgICAgICAgICAgIGNhcmQuc3RhdHVzID0gcHJldmlvdXNXb3JrZmxvd0V0YXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2luYXRvclN0YXRlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maXJzdCA9IGV2ZW50LmZpcnN0ID8/IDA7XHJcbiAgICAgICAgdGhpcy5yb3dzID0gZXZlbnQucm93cyA/PyAxMDtcclxuICAgICAgICB0aGlzLmNhbGxTZWFyY2guZW1pdCh7IHNraXBDb3VudDogdGhpcy5maXJzdCwgbWF4UmVzdWx0Q291bnQ6IHRoaXMucm93cyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRXb3JrZmxvd0V0YXRDbGFzcyhjYXJkOiBUc2lDYXJkKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMud29ya0Zsb3dFdGF0Tm9tTGFiZWxzLmZpbmRJbmRleChsID0+IGwua2V5ID09PSBjYXJkLnN0YXR1cyk7XHJcbiAgICAgICAgcmV0dXJuIGB3b3JrZmxvd0V0YXRDb2xvci0ke2luZGV4ID49IDAgPyBpbmRleCA6ICdkZWZhdWx0J31gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldExvY2FsaXplZFdvcmtmbG93RXRhdChrZXk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICgha2V5KSByZXR1cm4gJyc7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLndvcmtGbG93RXRhdE5vbUxhYmVscy5maW5kKHMgPT4gcy5rZXkgPT09IGtleSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoPy5sb2NhbGl6ZWQgPz8ga2V5O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRydWUgcGVyLWNvbHVtbiB0b3RhbDogdGhlIGdyb3VwJ3MgdW5wYWdlZCBjb3VudCB3aGVuIGdyb3VwZWQgc2VydmVyLXNpZGUsXHJcbiAgICAvLyBvdGhlcndpc2UgdGhlIG51bWJlciBvZiBjYXJkcyBvbiB0aGUgY3VycmVudCBwYWdlIChsZWdhY3kgY2xpZW50LXNpZGUgZ3JvdXBpbmcpLlxyXG4gICAgZ2V0Q29sdW1uQ291bnQoa2V5OiBzdHJpbmcgfCBudWxsKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5faXNHcm91cGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QnlXb3JrZmxvd0V0YXQuZ2V0KGtleSkgPz8gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZE1hcEJ5V29ya2Zsb3dFdGF0LmdldChrZXkpPy5sZW5ndGggPz8gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaGV0aGVyIHBlci1jb2x1bW4gc3VtbWFyaWVzIHNob3VsZCByZW5kZXIgKGdyb3VwZWQgZGF0YSArIGF0IGxlYXN0IG9uZSBvcHRlZC1pbiBjb2x1bW4pLlxyXG4gICAgZ2V0IGhhc0NvbHVtblN1bW1hcmllcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNHcm91cGVkICYmICh0aGlzLnN1bW1hcnlDb2x1bW5zPy5sZW5ndGggPz8gMCkgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbHVtbnMgdG8gcmVuZGVyOiB0aGUgXCJzYW5zIHdvcmtmbG93XCIgKG51bGwta2V5KSBjb2x1bW4gaXMgaGlkZGVuIHdoZW4gaXQgaGFzIG5vIGNhcmRzO1xyXG4gICAgLy8gcmVhbCB3b3JrZmxvdy1ldGF0IGNvbHVtbnMgYWx3YXlzIHNob3cgcmVnYXJkbGVzcyBvZiBjb3VudC5cclxuICAgIGdldCBkaXNwbGF5ZWRXb3JrRmxvd0V0YXRMYWJlbHMoKTogeyBrZXk6IHN0cmluZyB8IG51bGw7IGxvY2FsaXplZDogc3RyaW5nIH1bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ya0Zsb3dFdGF0Tm9tTGFiZWxzLmZpbHRlcihsID0+IGwua2V5ICE9PSBudWxsIHx8IHRoaXMuZ2V0Q29sdW1uQ291bnQobC5rZXkpID4gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIFNVTSBmb3IgYSBzdW1tYXJpemVkIGNvbHVtbiB3aXRoaW4gYSB3b3JrZmxvdy1ldGF0IGdyb3VwICh1bmRlZmluZWQgd2hlbiBub3QgZ3JvdXBlZCBvciBhYnNlbnQpLlxyXG4gICAgZ2V0Q29sdW1uU3VtbWFyeVZhbHVlKGtleTogc3RyaW5nIHwgbnVsbCwgZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0dyb3VwZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLnN1bW1hcnlCeVdvcmtmbG93RXRhdC5nZXQoa2V5KVxyXG4gICAgICAgICAgICA/LmZpbmQocyA9PiBzLnByb3ByZXR5Py50b0xvd2VyQ2FzZSgpID09PSBmaWVsZD8udG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoPy5zdW1tYXJ5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlUGFnZUNoYW5nZShwYWdlOiBJUGFnZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKHBhZ2U/Lmdyb3Vwcykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUdyb3VwZWRQYWdlKHBhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBhZ2U/Lml0ZW1zKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuX2lzR3JvdXBlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FyZHMgPSBhd2FpdCB0aGlzLm1hcEl0ZW1zVG9DYXJkcyhwYWdlLml0ZW1zKTtcclxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSBwYWdlLnRvdGFsQ291bnQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2VydmVyLXNpZGUgZ3JvdXBlZCBwYWdlOiBvbmUgZ3JvdXAgcGVyIHdvcmtmbG93IGV0YXQsIGVhY2ggY2FycnlpbmcgaXRzIG93biBhY2N1cmF0ZVxyXG4gICAgLy8gKHVucGFnZWQpIHRvdGFsIGNvdW50IGFuZCBzdW1tYXJpZXMuIENhcmRzIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIG1hcHBlZCBhbmQgYnVja2V0ZWRcclxuICAgIC8vIGV4YWN0bHkgYXMgaW4gdGhlIGZsYXQgcGF0aCAodmlhIHVwZGF0ZUNhcmRNYXApOyB0aGUgdHJ1ZSBwZXItY29sdW1uIGNvdW50cy9zdW1tYXJpZXNcclxuICAgIC8vIGNvbWUgZnJvbSB0aGUgZ3JvdXBzLCBhbmQgdGhlIHNpbmdsZSBib2FyZCBwYWdpbmF0b3Igc3BhbnMgdGhlIGxhcmdlc3QgY29sdW1uIChzYW1lXHJcbiAgICAvLyBza2lwL3Rha2Ugd2luZG93IGFwcGxpZWQgdG8gZXZlcnkgZ3JvdXAgYnkgdGhlIGJhY2tlbmQpLlxyXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVHcm91cGVkUGFnZShwYWdlOiBJUGFnZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzOiBJR3JvdXBlZFJlc3VsdDxhbnk+W10gPSBwYWdlLmdyb3VwcyA/PyBbXTtcclxuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB0aGlzLndvcmtGbG93RXRhdE5vbUxhYmVsc1xyXG4gICAgICAgICAgICAubWFwKGwgPT4gbC5rZXkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGspOiBrIGlzIHN0cmluZyA9PiBrICE9PSBudWxsKTtcclxuXHJcbiAgICAgICAgY29uc3QgY291bnRzID0gbmV3IE1hcDxzdHJpbmcgfCBudWxsLCBudW1iZXI+KCk7XHJcbiAgICAgICAgY29uc3Qgc3VtbWFyaWVzID0gbmV3IE1hcDxzdHJpbmcgfCBudWxsLCBJU3VtbWFyeUZvclByb3ByZXR5W10+KCk7XHJcbiAgICAgICAgbGV0IG1heEdyb3VwVG90YWwgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xyXG4gICAgICAgICAgICBjb25zdCByYXdLZXkgPSBncm91cC5rZXk/LnRyaW0oKSB8fCBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBidWNrZXRLZXkgPSByYXdLZXkgJiYgdmFsaWRLZXlzLmluY2x1ZGVzKHJhd0tleSkgPyByYXdLZXkgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgY291bnRzLnNldChidWNrZXRLZXksIChjb3VudHMuZ2V0KGJ1Y2tldEtleSkgPz8gMCkgKyBncm91cC50b3RhbENvdW50KTtcclxuICAgICAgICAgICAgaWYgKCFzdW1tYXJpZXMuaGFzKGJ1Y2tldEtleSkpIHtcclxuICAgICAgICAgICAgICAgIHN1bW1hcmllcy5zZXQoYnVja2V0S2V5LCBncm91cC5zdW1tYXJpZXMgPz8gW10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1heEdyb3VwVG90YWwgPSBNYXRoLm1heChtYXhHcm91cFRvdGFsLCBncm91cC50b3RhbENvdW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERhdGEgc2hyYW5rIHVuZGVyIGEgbGF0ZXIgcGFnZSAoZHJhZy1kcm9wLCBhIGZpbHRlciwgb3IgYW5vdGhlciB1c2VyJ3MgY2hhbmdlKTpcclxuICAgICAgICAvLyB0aGUgY3VycmVudCBvZmZzZXQgaXMgbm93IHBhc3QgdGhlIGVuZCBvZiBldmVyeSBjb2x1bW4sIHNvIHRoZSBiYWNrZW5kIHJldHVybmVkIGFuXHJcbiAgICAgICAgLy8gZW1wdHkgd2luZG93IGFuZCB0aGUgYm9hcmQgd291bGQgbG9vayBlbXB0eSB1bnRpbCB0aGUgdXNlciBtYW51YWxseSBwYWdlcyBiYWNrLlxyXG4gICAgICAgIC8vIENsYW1wIHRvIHRoZSBsYXN0IHZhbGlkIHBhZ2UgYW5kIHJlLWZldGNoIG9uY2UuXHJcbiAgICAgICAgaWYgKHRoaXMuZmlyc3QgPiAwICYmIHRoaXMuZmlyc3QgPj0gbWF4R3JvdXBUb3RhbCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0ID0gbWF4R3JvdXBUb3RhbCA+IDBcclxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcigobWF4R3JvdXBUb3RhbCAtIDEpIC8gdGhpcy5yb3dzKSAqIHRoaXMucm93c1xyXG4gICAgICAgICAgICAgICAgOiAwO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxTZWFyY2guZW1pdCh7IHNraXBDb3VudDogdGhpcy5maXJzdCwgbWF4UmVzdWx0Q291bnQ6IHRoaXMucm93cyB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNHcm91cGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvdW50QnlXb3JrZmxvd0V0YXQgPSBjb3VudHM7XHJcbiAgICAgICAgdGhpcy5zdW1tYXJ5QnlXb3JrZmxvd0V0YXQgPSBzdW1tYXJpZXM7XHJcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gbWF4R3JvdXBUb3RhbDtcclxuICAgICAgICB0aGlzLmNhcmRzID0gYXdhaXQgdGhpcy5tYXBJdGVtc1RvQ2FyZHMoZ3JvdXBzLmZsYXRNYXAoZyA9PiBnLml0ZW1zID8/IFtdKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRFbnRpdHlJbmZvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuZW50aXR5SW5mbyA9IGF3YWl0IHRoaXMuX2VudGl0eUNvbmZpZy5nZXRFbnRpdHlJbmZvRnJvbUNhY2hlKHRoaXMuY2FyZEJ1c2luZXNzQ2xhc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sS2V5cygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwaG90bzogdGhpcy5lbnRpdHlJbmZvPy5jYXJkSGVhZGVyUGhvdG9Db2x1bW4/LnRvTG93ZXJDYXNlKCkgPz8gJycsXHJcbiAgICAgICAgICAgIGNvbDE6IHRoaXMuZW50aXR5SW5mbz8uY2FyZFRpdGxlQ29sdW1uPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxyXG4gICAgICAgICAgICBjb2wyOiB0aGlzLmVudGl0eUluZm8/LmNhcmRTdWJIZWFkZXJDb2x1bW4/LnRvTG93ZXJDYXNlKCkgPz8gJycsXHJcbiAgICAgICAgICAgIGNvbDM6IHRoaXMuZW50aXR5SW5mbz8uY2FyZERlc2NyaXB0aW9uQ29sdW1uPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6IHRoaXMuZW50aXR5SW5mbz8uY2xhc3NOYW1lPy50b0xvd2VyQ2FzZSgpID8/ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIG1hcEl0ZW1zVG9DYXJkcyhpdGVtczogYW55W10pOiBQcm9taXNlPFRzaUNhcmRbXT4ge1xyXG4gICAgICAgIGNvbnN0IHsgY29sMSwgY29sMiwgY29sMywgcGhvdG8gfSA9IHRoaXMuZ2V0Q29sS2V5cygpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW0pLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIGFjY1trZXkudG9Mb3dlckNhc2UoKV0gPSBrZXk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93RXRhdFZhbHVlID0gaXRlbS53b3JrZmxvd0V0YXQgPz8gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpZDogaW5kZXggKyAxICsgdGhpcy5maXJzdCxcclxuICAgICAgICAgICAgICAgIHVpZDogYCR7aXRlbS51aWR9YCxcclxuICAgICAgICAgICAgICAgIGhlYWRlclRpdGxlOiBgJHtpdGVtW2tleXNbY29sMV1dID8/ICcnfWAsXHJcbiAgICAgICAgICAgICAgICBzdWJIZWFkZXJUaXRsZTogYCR7aXRlbVtrZXlzW2NvbDJdXSA/PyAnJ31gLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2l0ZW1ba2V5c1tjb2wzXV0gPz8gJyd9YCxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogd29ya2Zsb3dFdGF0VmFsdWUsXHJcbiAgICAgICAgICAgICAgICBwaG90bzogaXRlbVtrZXlzW3Bob3RvXV0gfHwgZGVmYXVsdENhcmRIZWFkZXIuaW1hZ2UsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJkTWFwKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nIHwgbnVsbCwgVHNpQ2FyZFtdPigpO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2YgdGhpcy53b3JrRmxvd0V0YXROb21MYWJlbHMpIHtcclxuICAgICAgICAgICAgbWFwLnNldChsYWJlbC5rZXksIFtdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY2FyZCBvZiB0aGlzLmNhcmRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGNhcmQuc3RhdHVzID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbWFwLmdldChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwLnB1c2goY2FyZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5tYXBwZWQgY2FyZCBzdGF0dXM6ICR7Y2FyZC5zdGF0dXN9YCwgY2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgY2FyZHNdIG9mIG1hcC5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgY2FyZHMuc29ydCgoYSwgYikgPT4gKGEuaGVhZGVyVGl0bGUgPz8gJycpLmxvY2FsZUNvbXBhcmUoYi5oZWFkZXJUaXRsZSA/PyAnJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYXJkTWFwQnlXb3JrZmxvd0V0YXQgPSBtYXA7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRXb3JrZmxvd0V0YXQoZGVzY3JpbWluYXRvclZhbHVlPzogc3RyaW5nKSB7XHJcbiAgICAgIGlmICghdGhpcy5jYXJkQnVzaW5lc3NDbGFzcykge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5nZXRXb3JrZmxvd0V0YXRCeUNsYXNzTmFtZUFuZERlc2NyaW1pbmF0b3IodGhpcy5jYXJkQnVzaW5lc3NDbGFzcywgZGVzY3JpbWluYXRvclZhbHVlKSk7XHJcbiAgICAgICAgdGhpcy53b3JrRmxvd0V0YXROb21MYWJlbHMgPSBbXHJcbiAgICAgICAgICAgIHsga2V5OiBudWxsLCBsb2NhbGl6ZWQ6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9rYW5iYW5fd29ya2Zsb3dFdGF0X3ZpZXdfc2Fuc193b3JrZmxvdycpLnRyaW0oKSB9LFxyXG4gICAgICAgICAgICAuLi5yZXNwb25zZS5tYXAoKHM6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIGtleTogcy5rZXksXHJcbiAgICAgICAgICAgICAgICBsb2NhbGl6ZWQ6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybShzLnZhbHVlKS50cmltKClcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2VycmV1ciBnZXRXb3JrZmxvd0V0YXRCeUNsYXNzTmFtZUFuZERlc2NyaW1pbmF0b3IgOiAnLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxufSIsIjxkaXYgY2xhc3M9XCJjYXJkIGZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gIDxwLXBhZ2luYXRvclxyXG4gICAgW2ZpcnN0XT1cImZpcnN0XCJcclxuICAgIFtyb3dzXT1cInJvd3NcIlxyXG4gICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbENvdW50XCJcclxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEsIDEwLCAyNSwgNTBdXCJcclxuICAgIChvblBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAnU2hvd2luZycgfCBsb2NhbGl6ZSB9fSB7Zmlyc3R9IHt7J3RvJyB8IGxvY2FsaXplfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSB7dG90YWxSZWNvcmRzfVwiPlxyXG4gIDwvcC1wYWdpbmF0b3I+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImthbmJhbi1ib2FyZCBmbGV4IGdhcC00IG92ZXJmbG93LWF1dG9cIj5cclxuICA8ZGl2ICpuZ0Zvcj1cImxldCB3b3JrZmxvd0V0YXQgb2YgZGlzcGxheWVkV29ya0Zsb3dFdGF0TGFiZWxzOyB0cmFja0J5OiB0cmFja0J5V29ya2Zsb3dFdGF0XCJcclxuICAgICAgIGNsYXNzPVwia2FuYmFuLWNvbHVtbiBmbGV4IGZsZXgtY29sdW1uIGJvcmRlci1yb3VuZCBzdXJmYWNlLTAgc2hhZG93LTJcIlxyXG4gICAgICAgKGRyYWdvdmVyKT1cImFsbG93RHJvcCgkZXZlbnQpXCJcclxuICAgICAgIChkcm9wKT1cImRyb3AoJGV2ZW50LCB3b3JrZmxvd0V0YXQua2V5KVwiPlxyXG4gICAgICAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWhlYWRlciBwLTMgYm9yZGVyLWJvdHRvbS0xIHN1cmZhY2UtYm9yZGVyIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAge3sgd29ya2Zsb3dFdGF0LmxvY2FsaXplZCB9fVxyXG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1ub3JtYWwgdGV4dC1ncmF5LTUwMFwiPlxyXG4gICAgICAgICh7eyBnZXRDb2x1bW5Db3VudCh3b3JrZmxvd0V0YXQua2V5KSB9fSlcclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LW5vcm1hbCB0ZXh0LWdyYXktNTAwXCIgKm5nSWY9XCJoYXNDb2x1bW5TdW1tYXJpZXNcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdW1Db2wgb2Ygc3VtbWFyeUNvbHVtbnNcIiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgICA8c3Bhbj57eyAoc3VtQ29sLmhlYWRlciA/PyBzdW1Db2wuZmllbGQpIHwgbG9jYWxpemUgfX06PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwic3VtQ29sLnR5cGVcIj5cclxuICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgKm5nU3dpdGNoQ2FzZT1cImRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVlcIlxyXG4gICAgICAgICAgICAgIFtpbnB1dERhdGFdPVwiZ2V0Q29sdW1uU3VtbWFyeVZhbHVlKHdvcmtmbG93RXRhdC5rZXksIHN1bUNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWVwiXHJcbiAgICAgICAgICAgICAgW2lucHV0RGF0YV09XCJnZXRDb2x1bW5TdW1tYXJ5VmFsdWUod29ya2Zsb3dFdGF0LmtleSwgc3VtQ29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5ICpuZ1N3aXRjaENhc2U9XCJkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZXCJcclxuICAgICAgICAgICAgICBbaXNGcmFjdGlvbl09XCJzdW1Db2wuaXNGcmFjdGlvbiA/PyBmYWxzZVwiIFtpbnB1dERhdGFdPVwiZ2V0Q29sdW1uU3VtbWFyeVZhbHVlKHdvcmtmbG93RXRhdC5rZXksIHN1bUNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSAqbmdTd2l0Y2hDYXNlPVwiZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1hdERlY2ltYWxdPVwic3VtQ29sLmZvcm1hdERlY2ltYWxcIiBbbnVtT2ZEZWNpbWFsXT1cInN1bUNvbC5udW1PZkRlY2ltYWxcIlxyXG4gICAgICAgICAgICAgIFtpbnB1dERhdGFdPVwiZ2V0Q29sdW1uU3VtbWFyeVZhbHVlKHdvcmtmbG93RXRhdC5rZXksIHN1bUNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgKm5nU3dpdGNoQ2FzZT1cImRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZXCJcclxuICAgICAgICAgICAgICBbY3VycmVuY3ldPVwic3VtQ29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJnZXRDb2x1bW5TdW1tYXJ5VmFsdWUod29ya2Zsb3dFdGF0LmtleSwgc3VtQ29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0Pnt7IGdldENvbHVtblN1bW1hcnlWYWx1ZSh3b3JrZmxvd0V0YXQua2V5LCBzdW1Db2wuZmllbGQpIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbi1jYXJkcyBmbGV4LTEgb3ZlcmZsb3ctYXV0byBwLTNcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2FyZCBvZiBjYXJkTWFwQnlXb3JrZmxvd0V0YXQuZ2V0KHdvcmtmbG93RXRhdC5rZXkpOyB0cmFja0J5OiB0cmFja0J5Q2FyZFwiXHJcbiAgICAgICAgICAgY2xhc3M9XCJrYW5iYW4tY2FyZCBwLTMgYm9yZGVyLXJvdW5kIGJnLXdoaXRlIG1iLTMgc2hhZG93LTFcIlxyXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFdvcmtmbG93RXRhdENsYXNzKGNhcmQpXCJcclxuICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcclxuICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydCgkZXZlbnQsIGNhcmQpXCJcclxuICAgICAgICAgICAoZHJhZ2VuZCk9XCJkcmFnRW5kKClcIj5cclxuICAgICAgICAgICBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIG1iLTJcIj57eyBjYXJkLmhlYWRlclRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTYwMCBtYi0zXCI+e3sgY2FyZC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItM1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3sgJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfa2FuYmFuX3dvcmtmbG93RXRhdF92aWV3X3dvcmtmbG93X2V0YXQnIHwgbG9jYWxpemUgfX06PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+e3sgZ2V0TG9jYWxpemVkV29ya2Zsb3dFdGF0KGNhcmQuc3RhdHVzKSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwib3ZlcmxheVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNwaW5uZXItd3JhcHBlclwiPlxyXG4gICAgPGFwcC1zcGlubmVyPjwvYXBwLXNwaW5uZXI+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=